Lines Matching refs:phydev
60 static int mv3310_modify(struct phy_device *phydev, int devad, u16 reg, in mv3310_modify() argument
65 old = phy_read_mmd(phydev, devad, reg); in mv3310_modify()
73 ret = phy_write_mmd(phydev, devad, reg, val); in mv3310_modify()
93 struct phy_device *phydev = dev_get_drvdata(dev); in mv3310_hwmon_read() local
102 temp = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP); in mv3310_hwmon_read()
150 static int mv3310_hwmon_config(struct phy_device *phydev, bool enable) in mv3310_hwmon_config() argument
155 ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP, in mv3310_hwmon_config()
161 ret = mv3310_modify(phydev, MDIO_MMD_VEND2, MV_V2_TEMP_CTRL, in mv3310_hwmon_config()
169 struct phy_device *phydev = data; in mv3310_hwmon_disable() local
171 mv3310_hwmon_config(phydev, false); in mv3310_hwmon_disable()
174 static int mv3310_hwmon_probe(struct phy_device *phydev) in mv3310_hwmon_probe() argument
176 struct device *dev = &phydev->mdio.dev; in mv3310_hwmon_probe()
177 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_hwmon_probe()
193 ret = mv3310_hwmon_config(phydev, true); in mv3310_hwmon_probe()
197 ret = devm_add_action_or_reset(dev, mv3310_hwmon_disable, phydev); in mv3310_hwmon_probe()
202 priv->hwmon_name, phydev, in mv3310_hwmon_probe()
208 static inline int mv3310_hwmon_config(struct phy_device *phydev, bool enable) in mv3310_hwmon_config() argument
213 static int mv3310_hwmon_probe(struct phy_device *phydev) in mv3310_hwmon_probe() argument
219 static int mv3310_probe(struct phy_device *phydev) in mv3310_probe() argument
225 if (!phydev->is_c45 || in mv3310_probe()
226 (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask) in mv3310_probe()
229 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in mv3310_probe()
233 dev_set_drvdata(&phydev->mdio.dev, priv); in mv3310_probe()
235 ret = mv3310_hwmon_probe(phydev); in mv3310_probe()
242 static int mv3310_suspend(struct phy_device *phydev) in mv3310_suspend() argument
247 static int mv3310_resume(struct phy_device *phydev) in mv3310_resume() argument
249 return mv3310_hwmon_config(phydev, true); in mv3310_resume()
252 static int mv3310_config_init(struct phy_device *phydev) in mv3310_config_init() argument
259 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && in mv3310_config_init()
260 phydev->interface != PHY_INTERFACE_MODE_XAUI && in mv3310_config_init()
261 phydev->interface != PHY_INTERFACE_MODE_RXAUI && in mv3310_config_init()
262 phydev->interface != PHY_INTERFACE_MODE_10GKR) in mv3310_config_init()
268 if (phydev->c45_ids.devices_in_package & MDIO_DEVS_AN) { in mv3310_config_init()
269 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1); in mv3310_config_init()
277 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT2); in mv3310_config_init()
295 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_PMA_EXTABLE); in mv3310_config_init()
340 dev_warn(&phydev->mdio.dev, in mv3310_config_init()
344 phydev->supported &= mask; in mv3310_config_init()
345 phydev->advertising &= phydev->supported; in mv3310_config_init()
350 static int mv3310_config_aneg(struct phy_device *phydev) in mv3310_config_aneg() argument
357 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in mv3310_config_aneg()
359 if (phydev->autoneg == AUTONEG_DISABLE) { in mv3310_config_aneg()
360 ret = genphy_c45_pma_setup_forced(phydev); in mv3310_config_aneg()
364 return genphy_c45_an_disable_aneg(phydev); in mv3310_config_aneg()
367 phydev->advertising &= phydev->supported; in mv3310_config_aneg()
368 advertising = phydev->advertising; in mv3310_config_aneg()
370 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_ADVERTISE, in mv3310_config_aneg()
379 ret = mv3310_modify(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, in mv3310_config_aneg()
388 ret = mv3310_modify(phydev, MDIO_MMD_AN, MDIO_AN_10GBT_CTRL, in mv3310_config_aneg()
398 ret = genphy_c45_restart_aneg(phydev); in mv3310_config_aneg()
403 static int mv3310_aneg_done(struct phy_device *phydev) in mv3310_aneg_done() argument
407 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_aneg_done()
414 return genphy_c45_aneg_done(phydev); in mv3310_aneg_done()
417 static void mv3310_update_interface(struct phy_device *phydev) in mv3310_update_interface() argument
419 if ((phydev->interface == PHY_INTERFACE_MODE_SGMII || in mv3310_update_interface()
420 phydev->interface == PHY_INTERFACE_MODE_10GKR) && phydev->link) { in mv3310_update_interface()
427 if (phydev->speed == SPEED_10000) in mv3310_update_interface()
428 phydev->interface = PHY_INTERFACE_MODE_10GKR; in mv3310_update_interface()
429 else if (phydev->speed >= SPEED_10 && in mv3310_update_interface()
430 phydev->speed < SPEED_10000) in mv3310_update_interface()
431 phydev->interface = PHY_INTERFACE_MODE_SGMII; in mv3310_update_interface()
436 static int mv3310_read_10gbr_status(struct phy_device *phydev) in mv3310_read_10gbr_status() argument
438 phydev->link = 1; in mv3310_read_10gbr_status()
439 phydev->speed = SPEED_10000; in mv3310_read_10gbr_status()
440 phydev->duplex = DUPLEX_FULL; in mv3310_read_10gbr_status()
442 mv3310_update_interface(phydev); in mv3310_read_10gbr_status()
447 static int mv3310_read_status(struct phy_device *phydev) in mv3310_read_status() argument
449 u32 mmd_mask = phydev->c45_ids.devices_in_package; in mv3310_read_status()
459 phydev->speed = SPEED_UNKNOWN; in mv3310_read_status()
460 phydev->duplex = DUPLEX_UNKNOWN; in mv3310_read_status()
461 phydev->lp_advertising = 0; in mv3310_read_status()
462 phydev->link = 0; in mv3310_read_status()
463 phydev->pause = 0; in mv3310_read_status()
464 phydev->asym_pause = 0; in mv3310_read_status()
465 phydev->mdix = 0; in mv3310_read_status()
467 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_read_status()
472 return mv3310_read_10gbr_status(phydev); in mv3310_read_status()
474 val = genphy_c45_read_link(phydev, mmd_mask); in mv3310_read_status()
478 phydev->link = val > 0 ? 1 : 0; in mv3310_read_status()
480 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1); in mv3310_read_status()
485 val = genphy_c45_read_lpa(phydev); in mv3310_read_status()
490 val = phy_read_mmd(phydev, MDIO_MMD_AN, MV_AN_STAT1000); in mv3310_read_status()
494 phydev->lp_advertising |= mii_stat1000_to_ethtool_lpa_t(val); in mv3310_read_status()
496 if (phydev->autoneg == AUTONEG_ENABLE) in mv3310_read_status()
497 phy_resolve_aneg_linkmode(phydev); in mv3310_read_status()
500 if (phydev->autoneg != AUTONEG_ENABLE) { in mv3310_read_status()
501 val = genphy_c45_read_pma(phydev); in mv3310_read_status()
506 if (phydev->speed == SPEED_10000) { in mv3310_read_status()
507 val = genphy_c45_read_mdix(phydev); in mv3310_read_status()
511 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_PAIRSWAP); in mv3310_read_status()
517 phydev->mdix = ETH_TP_MDI_X; in mv3310_read_status()
520 phydev->mdix = ETH_TP_MDI; in mv3310_read_status()
523 phydev->mdix = ETH_TP_MDI_INVALID; in mv3310_read_status()
528 mv3310_update_interface(phydev); in mv3310_read_status()