*/
 
 #include "bcm-phy-lib.h"
+#include <linux/delay.h>
 #include <linux/module.h>
 #include <linux/phy.h>
 #include <linux/brcmphy.h>
        if (err < 0)
                return err;
 
+       /* The datasheet indicates the PHY needs up to 1us to complete a reset,
+        * build some slack here.
+        */
+       usleep_range(1000, 2000);
+
+       /* The PHY requires 65 MDC clock cycles to complete a write operation
+        * and turnaround the line properly.
+        *
+        * We ignore -EIO here as the MDIO controller (e.g.: mdio-bcm-unimac)
+        * may flag the lack of turn-around as a read failure. This is
+        * particularly true with this combination since the MDIO controller
+        * only used 64 MDC cycles. This is not a critical failure in this
+        * specific case and it has no functional impact otherwise, so we let
+        * that one go through. If there is a genuine bus error, the next read
+        * of MII_BRCM_FET_INTREG will error out.
+        */
+       err = phy_read(phydev, MII_BMCR);
+       if (err < 0 && err != -EIO)
+               return err;
+
        reg = phy_read(phydev, MII_BRCM_FET_INTREG);
        if (reg < 0)
                return reg;