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);
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
        int ret;
+       bool reset_again;
 
        ret = pm_runtime_get_sync(&fep->pdev->dev);
        if (ret < 0)
        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.
         */
        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();