Lines Matching full:phydev
114 static int mv3310_hwmon_read_temp_reg(struct phy_device *phydev) in mv3310_hwmon_read_temp_reg() argument
116 return phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP); in mv3310_hwmon_read_temp_reg()
119 static int mv2110_hwmon_read_temp_reg(struct phy_device *phydev) in mv2110_hwmon_read_temp_reg() argument
121 return phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_TEMP); in mv2110_hwmon_read_temp_reg()
124 static int mv10g_hwmon_read_temp_reg(struct phy_device *phydev) in mv10g_hwmon_read_temp_reg() argument
126 if (phydev->drv->phy_id == MARVELL_PHY_ID_88X3310) in mv10g_hwmon_read_temp_reg()
127 return mv3310_hwmon_read_temp_reg(phydev); in mv10g_hwmon_read_temp_reg()
129 return mv2110_hwmon_read_temp_reg(phydev); in mv10g_hwmon_read_temp_reg()
135 struct phy_device *phydev = dev_get_drvdata(dev); in mv3310_hwmon_read() local
144 temp = mv10g_hwmon_read_temp_reg(phydev); in mv3310_hwmon_read()
192 static int mv3310_hwmon_config(struct phy_device *phydev, bool enable) in mv3310_hwmon_config() argument
197 if (phydev->drv->phy_id != MARVELL_PHY_ID_88X3310) in mv3310_hwmon_config()
200 ret = phy_write_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP, in mv3310_hwmon_config()
207 return phy_modify_mmd(phydev, MDIO_MMD_VEND2, MV_V2_TEMP_CTRL, in mv3310_hwmon_config()
211 static int mv3310_hwmon_probe(struct phy_device *phydev) in mv3310_hwmon_probe() argument
213 struct device *dev = &phydev->mdio.dev; in mv3310_hwmon_probe()
214 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_hwmon_probe()
230 ret = mv3310_hwmon_config(phydev, true); in mv3310_hwmon_probe()
235 priv->hwmon_name, phydev, in mv3310_hwmon_probe()
241 static inline int mv3310_hwmon_config(struct phy_device *phydev, bool enable) in mv3310_hwmon_config() argument
246 static int mv3310_hwmon_probe(struct phy_device *phydev) in mv3310_hwmon_probe() argument
252 static int mv3310_power_down(struct phy_device *phydev) in mv3310_power_down() argument
254 return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, in mv3310_power_down()
258 static int mv3310_power_up(struct phy_device *phydev) in mv3310_power_up() argument
260 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_power_up()
263 ret = phy_clear_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, in mv3310_power_up()
266 if (phydev->drv->phy_id != MARVELL_PHY_ID_88X3310 || in mv3310_power_up()
270 return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, in mv3310_power_up()
274 static int mv3310_reset(struct phy_device *phydev, u32 unit) in mv3310_reset() argument
278 err = phy_modify_mmd(phydev, MDIO_MMD_PCS, unit + MDIO_CTRL1, in mv3310_reset()
283 return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_PCS, in mv3310_reset()
289 static int mv3310_get_edpd(struct phy_device *phydev, u16 *edpd) in mv3310_get_edpd() argument
293 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1); in mv3310_get_edpd()
311 static int mv3310_set_edpd(struct phy_device *phydev, u16 edpd) in mv3310_set_edpd() argument
334 err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1, in mv3310_set_edpd()
337 err = mv3310_reset(phydev, MV_PCS_BASE_T); in mv3310_set_edpd()
344 struct phy_device *phydev = upstream; in mv3310_sfp_insert() local
348 sfp_parse_support(phydev->sfp_bus, id, support); in mv3310_sfp_insert()
349 iface = sfp_select_interface(phydev->sfp_bus, support); in mv3310_sfp_insert()
352 dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n"); in mv3310_sfp_insert()
364 static int mv3310_probe(struct phy_device *phydev) in mv3310_probe() argument
370 if (!phydev->is_c45 || in mv3310_probe()
371 (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask) in mv3310_probe()
374 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT); in mv3310_probe()
379 dev_warn(&phydev->mdio.dev, in mv3310_probe()
384 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in mv3310_probe()
388 dev_set_drvdata(&phydev->mdio.dev, priv); in mv3310_probe()
390 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER0); in mv3310_probe()
396 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER1); in mv3310_probe()
402 phydev_info(phydev, "Firmware version %u.%u.%u.%u\n", in mv3310_probe()
407 ret = mv3310_power_down(phydev); in mv3310_probe()
411 ret = mv3310_hwmon_probe(phydev); in mv3310_probe()
415 return phy_sfp_probe(phydev, &mv3310_sfp_ops); in mv3310_probe()
418 static void mv3310_remove(struct phy_device *phydev) in mv3310_remove() argument
420 mv3310_hwmon_config(phydev, false); in mv3310_remove()
423 static int mv3310_suspend(struct phy_device *phydev) in mv3310_suspend() argument
425 return mv3310_power_down(phydev); in mv3310_suspend()
428 static int mv3310_resume(struct phy_device *phydev) in mv3310_resume() argument
432 ret = mv3310_power_up(phydev); in mv3310_resume()
436 return mv3310_hwmon_config(phydev, true); in mv3310_resume()
446 static bool mv3310_has_pma_ngbaset_quirk(struct phy_device *phydev) in mv3310_has_pma_ngbaset_quirk() argument
448 if (!(phydev->c45_ids.devices_in_package & MDIO_DEVS_PMAPMD)) in mv3310_has_pma_ngbaset_quirk()
452 return (phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] & in mv3310_has_pma_ngbaset_quirk()
456 static int mv3310_config_init(struct phy_device *phydev) in mv3310_config_init() argument
458 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_config_init()
463 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && in mv3310_config_init()
464 phydev->interface != PHY_INTERFACE_MODE_2500BASEX && in mv3310_config_init()
465 phydev->interface != PHY_INTERFACE_MODE_XAUI && in mv3310_config_init()
466 phydev->interface != PHY_INTERFACE_MODE_RXAUI && in mv3310_config_init()
467 phydev->interface != PHY_INTERFACE_MODE_10GBASER) in mv3310_config_init()
470 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in mv3310_config_init()
473 err = mv3310_power_up(phydev); in mv3310_config_init()
477 val = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL); in mv3310_config_init()
484 return mv3310_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS); in mv3310_config_init()
487 static int mv3310_get_features(struct phy_device *phydev) in mv3310_get_features() argument
491 ret = genphy_c45_pma_read_abilities(phydev); in mv3310_get_features()
495 if (mv3310_has_pma_ngbaset_quirk(phydev)) { in mv3310_get_features()
496 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, in mv3310_get_features()
502 phydev->supported, in mv3310_get_features()
506 phydev->supported, in mv3310_get_features()
513 static int mv3310_config_mdix(struct phy_device *phydev) in mv3310_config_mdix() argument
518 switch (phydev->mdix_ctrl) { in mv3310_config_mdix()
532 err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1, in mv3310_config_mdix()
535 err = mv3310_reset(phydev, MV_PCS_BASE_T); in mv3310_config_mdix()
540 static int mv3310_config_aneg(struct phy_device *phydev) in mv3310_config_aneg() argument
546 ret = mv3310_config_mdix(phydev); in mv3310_config_aneg()
550 if (phydev->autoneg == AUTONEG_DISABLE) in mv3310_config_aneg()
551 return genphy_c45_pma_setup_forced(phydev); in mv3310_config_aneg()
553 ret = genphy_c45_an_config_aneg(phydev); in mv3310_config_aneg()
562 reg = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in mv3310_config_aneg()
563 ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, in mv3310_config_aneg()
570 return genphy_c45_check_and_restart_aneg(phydev, changed); in mv3310_config_aneg()
573 static int mv3310_aneg_done(struct phy_device *phydev) in mv3310_aneg_done() argument
577 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_aneg_done()
584 return genphy_c45_aneg_done(phydev); in mv3310_aneg_done()
587 static void mv3310_update_interface(struct phy_device *phydev) in mv3310_update_interface() argument
589 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_update_interface()
596 phydev->interface = PHY_INTERFACE_MODE_10GBASER; in mv3310_update_interface()
600 if ((phydev->interface == PHY_INTERFACE_MODE_SGMII || in mv3310_update_interface()
601 phydev->interface == PHY_INTERFACE_MODE_2500BASEX || in mv3310_update_interface()
602 phydev->interface == PHY_INTERFACE_MODE_10GBASER) && in mv3310_update_interface()
603 phydev->link) { in mv3310_update_interface()
607 * setting phydev->interface to communicate this to the MAC. in mv3310_update_interface()
610 switch (phydev->speed) { in mv3310_update_interface()
612 phydev->interface = PHY_INTERFACE_MODE_10GBASER; in mv3310_update_interface()
615 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in mv3310_update_interface()
620 phydev->interface = PHY_INTERFACE_MODE_SGMII; in mv3310_update_interface()
629 static int mv3310_read_status_10gbaser(struct phy_device *phydev) in mv3310_read_status_10gbaser() argument
631 phydev->link = 1; in mv3310_read_status_10gbaser()
632 phydev->speed = SPEED_10000; in mv3310_read_status_10gbaser()
633 phydev->duplex = DUPLEX_FULL; in mv3310_read_status_10gbaser()
638 static int mv3310_read_status_copper(struct phy_device *phydev) in mv3310_read_status_copper() argument
642 val = genphy_c45_read_link(phydev); in mv3310_read_status_copper()
646 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1); in mv3310_read_status_copper()
650 cssr1 = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSSR1); in mv3310_read_status_copper()
656 phydev->link = 0; in mv3310_read_status_copper()
667 phydev->speed = SPEED_10000; in mv3310_read_status_copper()
671 phydev->speed = SPEED_5000; in mv3310_read_status_copper()
675 phydev->speed = SPEED_2500; in mv3310_read_status_copper()
679 phydev->speed = SPEED_1000; in mv3310_read_status_copper()
683 phydev->speed = SPEED_100; in mv3310_read_status_copper()
687 phydev->speed = SPEED_10; in mv3310_read_status_copper()
691 phydev->duplex = cssr1 & MV_PCS_CSSR1_DUPLEX_FULL ? in mv3310_read_status_copper()
693 phydev->mdix = cssr1 & MV_PCS_CSSR1_MDIX ? in mv3310_read_status_copper()
697 val = genphy_c45_read_lpa(phydev); in mv3310_read_status_copper()
702 val = phy_read_mmd(phydev, MDIO_MMD_AN, MV_AN_STAT1000); in mv3310_read_status_copper()
706 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val); in mv3310_read_status_copper()
709 phy_resolve_aneg_pause(phydev); in mv3310_read_status_copper()
715 static int mv3310_read_status(struct phy_device *phydev) in mv3310_read_status() argument
719 phydev->speed = SPEED_UNKNOWN; in mv3310_read_status()
720 phydev->duplex = DUPLEX_UNKNOWN; in mv3310_read_status()
721 linkmode_zero(phydev->lp_advertising); in mv3310_read_status()
722 phydev->link = 0; in mv3310_read_status()
723 phydev->pause = 0; in mv3310_read_status()
724 phydev->asym_pause = 0; in mv3310_read_status()
725 phydev->mdix = ETH_TP_MDI_INVALID; in mv3310_read_status()
727 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_read_status()
732 err = mv3310_read_status_10gbaser(phydev); in mv3310_read_status()
734 err = mv3310_read_status_copper(phydev); in mv3310_read_status()
738 if (phydev->link) in mv3310_read_status()
739 mv3310_update_interface(phydev); in mv3310_read_status()
744 static int mv3310_get_tunable(struct phy_device *phydev, in mv3310_get_tunable() argument
749 return mv3310_get_edpd(phydev, data); in mv3310_get_tunable()
755 static int mv3310_set_tunable(struct phy_device *phydev, in mv3310_set_tunable() argument
760 return mv3310_set_edpd(phydev, *(u16 *)data); in mv3310_set_tunable()