static void sfp_sm_probe_phy(struct sfp *sfp) { struct phy_device *phy; int err; msleep(T_PHY_RESET_MS); phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); if (IS_ERR(phy)) { dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); return; } if (!phy) { dev_info(sfp->dev, "no PHY detected\n"); return; } err = sfp_add_phy(sfp->sfp_bus, phy); if (err) { phy_device_remove(phy); phy_device_free(phy); dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); return; } sfp->mod_phy = phy; phy_start(phy); }
static int pfc200_phy_fixup(struct mii_bus *mii, int phyadr) { struct phy_device *phydev; int ret; phydev = mdiobus_scan(mii, phyadr); if (IS_ERR(phydev)) { pr_err("Cannot find phydev %d on mii bus\n", phyadr); return PTR_ERR(phydev); } ret = phy_write(phydev, MII_BMCR, BMCR_ANENABLE | BMCR_HP_MDIX); if (ret) pr_err("Failed to write to phy: %s\n", strerror(-ret)); return ret; }
int mdiobus_detect(struct device_d *dev) { struct mii_bus *mii = to_mii_bus(dev); int i, ret; for (i = 0; i < PHY_MAX_ADDR; i++) { struct phy_device *phydev; phydev = mdiobus_scan(mii, i); if (IS_ERR(phydev)) continue; if (phydev->registered) continue; ret = phy_register_device(phydev); if (ret) dev_err(dev, "failed to register phy: %s\n", strerror(-ret)); dev_info(dev, "registered phy as /dev/%s\n", phydev->cdev.name); } return 0; }