return 0;
 }
 
-static void tg3_mdio_config(struct tg3 *tp)
+static void tg3_mdio_config_5785(struct tg3 *tp)
 {
        u32 val;
 
        tw32_f(MAC_MI_MODE, tp->mi_mode);
        udelay(80);
 
-       if (tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED)
-               tg3_mdio_config(tp);
+       if ((tp->tg3_flags3 & TG3_FLG3_MDIOBUS_INITED) &&
+           GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785)
+               tg3_mdio_config_5785(tp);
 }
 
 static void tg3_mdio_stop(struct tg3 *tp)
        if (i) {
                printk(KERN_WARNING "%s: mdiobus_reg failed (0x%x)\n",
                        tp->dev->name, i);
+               mdiobus_free(tp->mdio_bus);
                return i;
        }
 
-       tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED;
-
        phydev = tp->mdio_bus->phy_map[PHY_ADDR];
 
-       switch (phydev->phy_id) {
+       if (!phydev || !phydev->drv) {
+               printk(KERN_WARNING "%s: No PHY devices\n", tp->dev->name);
+               mdiobus_unregister(tp->mdio_bus);
+               mdiobus_free(tp->mdio_bus);
+               return -ENODEV;
+       }
+
+       switch (phydev->drv->phy_id & phydev->drv->phy_id_mask) {
        case TG3_PHY_ID_BCM50610:
                phydev->interface = PHY_INTERFACE_MODE_RGMII;
                if (tp->tg3_flags3 & TG3_FLG3_RGMII_STD_IBND_DISABLE)
                break;
        }
 
-       tg3_mdio_config(tp);
+       tp->tg3_flags3 |= TG3_FLG3_MDIOBUS_INITED;
+
+       if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5785)
+               tg3_mdio_config_5785(tp);
 
        return 0;
 }
                return PTR_ERR(phydev);
        }
 
-       tp->tg3_flags3 |= TG3_FLG3_PHY_CONNECTED;
-
        /* Mask with MAC supported features. */
-       phydev->supported &= (PHY_GBIT_FEATURES |
-                             SUPPORTED_Pause |
-                             SUPPORTED_Asym_Pause);
+       switch (phydev->interface) {
+       case PHY_INTERFACE_MODE_GMII:
+       case PHY_INTERFACE_MODE_RGMII:
+               phydev->supported &= (PHY_GBIT_FEATURES |
+                                     SUPPORTED_Pause |
+                                     SUPPORTED_Asym_Pause);
+               break;
+       case PHY_INTERFACE_MODE_MII:
+               phydev->supported &= (PHY_BASIC_FEATURES |
+                                     SUPPORTED_Pause |
+                                     SUPPORTED_Asym_Pause);
+               break;
+       default:
+               phy_disconnect(tp->mdio_bus->phy_map[PHY_ADDR]);
+               return -EINVAL;
+       }
+
+       tp->tg3_flags3 |= TG3_FLG3_PHY_CONNECTED;
 
        phydev->advertising = phydev->supported;