int t3_vsc8211_phy_prep(struct cphy *phy, struct adapter *adapter, int phy_addr, const struct mdio_ops *mdio_ops) { int err; unsigned int val; cphy_init(phy, adapter, phy_addr, &vsc8211_ops, mdio_ops, SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_TP | SUPPORTED_IRQ, "10/100/1000BASE-T"); msleep(20); /* PHY needs ~10ms to start responding to MDIO */ err = mdio_read(phy, 0, VSC8211_EXT_CTRL, &val); if (err) return err; if (val & VSC_CTRL_MEDIA_MODE_HI) { /* copper interface, just need to configure the LEDs */ return mdio_write(phy, 0, VSC8211_LED_CTRL, 0x100); } phy->caps = SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_FIBRE | SUPPORTED_IRQ; phy->desc = "1000BASE-X"; phy->ops = &vsc8211_fiber_ops; err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 1); if (err) return err; err = mdio_write(phy, 0, VSC8211_SIGDET_CTRL, 1); if (err) return err; err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 0); if (err) return err; err = mdio_write(phy, 0, VSC8211_EXT_CTRL, val | VSC_CTRL_CLAUSE37_VIEW); if (err) return err; err = vsc8211_reset(phy, 0); if (err) return err; udelay(5); /* delay after reset before next SMI */ return 0; }
int t3_vsc8211_phy_prep(pinfo_t *pinfo, int phy_addr, const struct mdio_ops *mdio_ops) { struct cphy *phy = &pinfo->phy; int err; unsigned int val; cphy_init(&pinfo->phy, pinfo->adapter, pinfo, phy_addr, &vsc8211_ops, mdio_ops, SUPPORTED_10baseT_Full | SUPPORTED_100baseT_Full | SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_TP | SUPPORTED_IRQ, "10/100/1000BASE-T"); msleep(20); /* PHY needs ~10ms to start responding to MDIO */ /* Disable Link Speed Auto-Downshift */ if ((err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 1)) != 0 || (err = mdio_read(phy, 0, VSC8211_EXT_CTRL_3, &val)) != 0 || (err = mdio_write(phy, 0, VSC8211_EXT_CTRL_3, (val & ~(F_LNKSPEEDDSENABLE)) )) != 0 || (err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 0)) != 0 ) return err; err = mdio_read(phy, 0, VSC8211_EXT_CTRL, &val); if (err) return err; if (val & VSC_CTRL_MEDIA_MODE_HI) { /* copper interface, just need to configure the LEDs */ return mdio_write(phy, 0, VSC8211_LED_CTRL, 0x100); } phy->caps = SUPPORTED_1000baseT_Full | SUPPORTED_Autoneg | SUPPORTED_MII | SUPPORTED_FIBRE | SUPPORTED_IRQ; phy->desc = "1000BASE-X"; phy->ops = &vsc8211_fiber_ops; if ((err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 1)) != 0 || (err = mdio_write(phy, 0, VSC8211_SIGDET_CTRL, 1)) != 0 || (err = mdio_write(phy, 0, VSC8211_EXT_PAGE_AXS, 0)) != 0 || (err = mdio_write(phy, 0, VSC8211_EXT_CTRL, val | VSC_CTRL_CLAUSE37_VIEW)) != 0 || (err = vsc8211_reset(phy, 0)) != 0) return err; udelay(5); /* delay after reset before next SMI */ return 0; }