|
@@ -1862,6 +1862,8 @@ static int fec_enet_clk_enable(struct net_device *ndev, bool enable)
|
|
|
ret = clk_prepare_enable(fep->clk_ref);
|
|
|
if (ret)
|
|
|
goto failed_clk_ref;
|
|
|
+
|
|
|
+ phy_reset_after_clk_enable(ndev->phydev);
|
|
|
} else {
|
|
|
clk_disable_unprepare(fep->clk_ahb);
|
|
|
clk_disable_unprepare(fep->clk_enet_out);
|
|
@@ -2834,6 +2836,7 @@ fec_enet_open(struct net_device *ndev)
|
|
|
{
|
|
|
struct fec_enet_private *fep = netdev_priv(ndev);
|
|
|
int ret;
|
|
|
+ bool reset_again;
|
|
|
|
|
|
ret = pm_runtime_get_sync(&fep->pdev->dev);
|
|
|
if (ret < 0)
|
|
@@ -2844,6 +2847,17 @@ fec_enet_open(struct net_device *ndev)
|
|
|
if (ret)
|
|
|
goto clk_enable;
|
|
|
|
|
|
+ /* During the first fec_enet_open call the PHY isn't probed at this
|
|
|
+ * point. Therefore the phy_reset_after_clk_enable() call within
|
|
|
+ * fec_enet_clk_enable() fails. As we need this reset in order to be
|
|
|
+ * sure the PHY is working correctly we check if we need to reset again
|
|
|
+ * later when the PHY is probed
|
|
|
+ */
|
|
|
+ if (ndev->phydev && ndev->phydev->drv)
|
|
|
+ reset_again = false;
|
|
|
+ else
|
|
|
+ reset_again = true;
|
|
|
+
|
|
|
/* I should reset the ring buffers here, but I don't yet know
|
|
|
* a simple way to do that.
|
|
|
*/
|
|
@@ -2860,6 +2874,12 @@ fec_enet_open(struct net_device *ndev)
|
|
|
if (ret)
|
|
|
goto err_enet_mii_probe;
|
|
|
|
|
|
+ /* Call phy_reset_after_clk_enable() again if it failed during
|
|
|
+ * phy_reset_after_clk_enable() before because the PHY wasn't probed.
|
|
|
+ */
|
|
|
+ if (reset_again)
|
|
|
+ phy_reset_after_clk_enable(ndev->phydev);
|
|
|
+
|
|
|
if (fep->quirks & FEC_QUIRK_ERR006687)
|
|
|
imx6q_cpuidle_fec_irqs_used();
|
|
|
|