• Home
  • Raw
  • Download

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()
273 if (phydev->drv->phy_id != MARVELL_PHY_ID_88X3310 || in mv3310_power_up()
277 return phy_set_bits_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL, in mv3310_power_up()
281 static int mv3310_reset(struct phy_device *phydev, u32 unit) in mv3310_reset() argument
285 err = phy_modify_mmd(phydev, MDIO_MMD_PCS, unit + MDIO_CTRL1, in mv3310_reset()
290 return phy_read_mmd_poll_timeout(phydev, MDIO_MMD_PCS, in mv3310_reset()
296 static int mv3310_get_edpd(struct phy_device *phydev, u16 *edpd) in mv3310_get_edpd() argument
300 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1); in mv3310_get_edpd()
318 static int mv3310_set_edpd(struct phy_device *phydev, u16 edpd) in mv3310_set_edpd() argument
341 err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1, in mv3310_set_edpd()
344 err = mv3310_reset(phydev, MV_PCS_BASE_T); in mv3310_set_edpd()
351 struct phy_device *phydev = upstream; in mv3310_sfp_insert() local
355 sfp_parse_support(phydev->sfp_bus, id, support); in mv3310_sfp_insert()
356 iface = sfp_select_interface(phydev->sfp_bus, support); in mv3310_sfp_insert()
359 dev_err(&phydev->mdio.dev, "incompatible SFP module inserted\n"); in mv3310_sfp_insert()
371 static int mv3310_probe(struct phy_device *phydev) in mv3310_probe() argument
377 if (!phydev->is_c45 || in mv3310_probe()
378 (phydev->c45_ids.devices_in_package & mmd_mask) != mmd_mask) in mv3310_probe()
381 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_BOOT); in mv3310_probe()
386 dev_warn(&phydev->mdio.dev, in mv3310_probe()
391 priv = devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); in mv3310_probe()
395 dev_set_drvdata(&phydev->mdio.dev, priv); in mv3310_probe()
397 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER0); in mv3310_probe()
403 ret = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MV_PMA_FW_VER1); in mv3310_probe()
409 phydev_info(phydev, "Firmware version %u.%u.%u.%u\n", in mv3310_probe()
414 ret = mv3310_power_down(phydev); in mv3310_probe()
418 ret = mv3310_hwmon_probe(phydev); in mv3310_probe()
422 return phy_sfp_probe(phydev, &mv3310_sfp_ops); in mv3310_probe()
425 static void mv3310_remove(struct phy_device *phydev) in mv3310_remove() argument
427 mv3310_hwmon_config(phydev, false); in mv3310_remove()
430 static int mv3310_suspend(struct phy_device *phydev) in mv3310_suspend() argument
432 return mv3310_power_down(phydev); in mv3310_suspend()
435 static int mv3310_resume(struct phy_device *phydev) in mv3310_resume() argument
439 ret = mv3310_power_up(phydev); in mv3310_resume()
443 return mv3310_hwmon_config(phydev, true); in mv3310_resume()
453 static bool mv3310_has_pma_ngbaset_quirk(struct phy_device *phydev) in mv3310_has_pma_ngbaset_quirk() argument
455 if (!(phydev->c45_ids.devices_in_package & MDIO_DEVS_PMAPMD)) in mv3310_has_pma_ngbaset_quirk()
459 return (phydev->c45_ids.device_ids[MDIO_MMD_PMAPMD] & in mv3310_has_pma_ngbaset_quirk()
463 static int mv3310_config_init(struct phy_device *phydev) in mv3310_config_init() argument
465 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_config_init()
470 if (phydev->interface != PHY_INTERFACE_MODE_SGMII && in mv3310_config_init()
471 phydev->interface != PHY_INTERFACE_MODE_2500BASEX && in mv3310_config_init()
472 phydev->interface != PHY_INTERFACE_MODE_XAUI && in mv3310_config_init()
473 phydev->interface != PHY_INTERFACE_MODE_RXAUI && in mv3310_config_init()
474 phydev->interface != PHY_INTERFACE_MODE_10GBASER) in mv3310_config_init()
477 phydev->mdix_ctrl = ETH_TP_MDI_AUTO; in mv3310_config_init()
480 err = mv3310_power_up(phydev); in mv3310_config_init()
484 val = phy_read_mmd(phydev, MDIO_MMD_VEND2, MV_V2_PORT_CTRL); in mv3310_config_init()
491 return mv3310_set_edpd(phydev, ETHTOOL_PHY_EDPD_DFLT_TX_MSECS); in mv3310_config_init()
494 static int mv3310_get_features(struct phy_device *phydev) in mv3310_get_features() argument
498 ret = genphy_c45_pma_read_abilities(phydev); in mv3310_get_features()
502 if (mv3310_has_pma_ngbaset_quirk(phydev)) { in mv3310_get_features()
503 val = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, in mv3310_get_features()
509 phydev->supported, in mv3310_get_features()
513 phydev->supported, in mv3310_get_features()
520 static int mv3310_config_mdix(struct phy_device *phydev) in mv3310_config_mdix() argument
525 switch (phydev->mdix_ctrl) { in mv3310_config_mdix()
539 err = phy_modify_mmd_changed(phydev, MDIO_MMD_PCS, MV_PCS_CSCR1, in mv3310_config_mdix()
542 err = mv3310_reset(phydev, MV_PCS_BASE_T); in mv3310_config_mdix()
547 static int mv3310_config_aneg(struct phy_device *phydev) in mv3310_config_aneg() argument
553 ret = mv3310_config_mdix(phydev); in mv3310_config_aneg()
557 if (phydev->autoneg == AUTONEG_DISABLE) in mv3310_config_aneg()
558 return genphy_c45_pma_setup_forced(phydev); in mv3310_config_aneg()
560 ret = genphy_c45_an_config_aneg(phydev); in mv3310_config_aneg()
569 reg = linkmode_adv_to_mii_ctrl1000_t(phydev->advertising); in mv3310_config_aneg()
570 ret = phy_modify_mmd_changed(phydev, MDIO_MMD_AN, MV_AN_CTRL1000, in mv3310_config_aneg()
577 return genphy_c45_check_and_restart_aneg(phydev, changed); in mv3310_config_aneg()
580 static int mv3310_aneg_done(struct phy_device *phydev) in mv3310_aneg_done() argument
584 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_aneg_done()
591 return genphy_c45_aneg_done(phydev); in mv3310_aneg_done()
594 static void mv3310_update_interface(struct phy_device *phydev) in mv3310_update_interface() argument
596 struct mv3310_priv *priv = dev_get_drvdata(&phydev->mdio.dev); in mv3310_update_interface()
603 phydev->interface = PHY_INTERFACE_MODE_10GBASER; in mv3310_update_interface()
607 if ((phydev->interface == PHY_INTERFACE_MODE_SGMII || in mv3310_update_interface()
608 phydev->interface == PHY_INTERFACE_MODE_2500BASEX || in mv3310_update_interface()
609 phydev->interface == PHY_INTERFACE_MODE_10GBASER) && in mv3310_update_interface()
610 phydev->link) { in mv3310_update_interface()
614 * setting phydev->interface to communicate this to the MAC. in mv3310_update_interface()
617 switch (phydev->speed) { in mv3310_update_interface()
619 phydev->interface = PHY_INTERFACE_MODE_10GBASER; in mv3310_update_interface()
622 phydev->interface = PHY_INTERFACE_MODE_2500BASEX; in mv3310_update_interface()
627 phydev->interface = PHY_INTERFACE_MODE_SGMII; in mv3310_update_interface()
636 static int mv3310_read_status_10gbaser(struct phy_device *phydev) in mv3310_read_status_10gbaser() argument
638 phydev->link = 1; in mv3310_read_status_10gbaser()
639 phydev->speed = SPEED_10000; in mv3310_read_status_10gbaser()
640 phydev->duplex = DUPLEX_FULL; in mv3310_read_status_10gbaser()
641 phydev->port = PORT_FIBRE; in mv3310_read_status_10gbaser()
646 static int mv3310_read_status_copper(struct phy_device *phydev) in mv3310_read_status_copper() argument
650 val = genphy_c45_read_link(phydev); in mv3310_read_status_copper()
654 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1); in mv3310_read_status_copper()
658 cssr1 = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_CSSR1); in mv3310_read_status_copper()
664 phydev->link = 0; in mv3310_read_status_copper()
675 phydev->speed = SPEED_10000; in mv3310_read_status_copper()
679 phydev->speed = SPEED_5000; in mv3310_read_status_copper()
683 phydev->speed = SPEED_2500; in mv3310_read_status_copper()
687 phydev->speed = SPEED_1000; in mv3310_read_status_copper()
691 phydev->speed = SPEED_100; in mv3310_read_status_copper()
695 phydev->speed = SPEED_10; in mv3310_read_status_copper()
699 phydev->duplex = cssr1 & MV_PCS_CSSR1_DUPLEX_FULL ? in mv3310_read_status_copper()
701 phydev->port = PORT_TP; in mv3310_read_status_copper()
702 phydev->mdix = cssr1 & MV_PCS_CSSR1_MDIX ? in mv3310_read_status_copper()
706 val = genphy_c45_read_lpa(phydev); in mv3310_read_status_copper()
711 val = phy_read_mmd(phydev, MDIO_MMD_AN, MV_AN_STAT1000); in mv3310_read_status_copper()
715 mii_stat1000_mod_linkmode_lpa_t(phydev->lp_advertising, val); in mv3310_read_status_copper()
718 phy_resolve_aneg_pause(phydev); in mv3310_read_status_copper()
724 static int mv3310_read_status(struct phy_device *phydev) in mv3310_read_status() argument
728 phydev->speed = SPEED_UNKNOWN; in mv3310_read_status()
729 phydev->duplex = DUPLEX_UNKNOWN; in mv3310_read_status()
730 linkmode_zero(phydev->lp_advertising); in mv3310_read_status()
731 phydev->link = 0; in mv3310_read_status()
732 phydev->pause = 0; in mv3310_read_status()
733 phydev->asym_pause = 0; in mv3310_read_status()
734 phydev->mdix = ETH_TP_MDI_INVALID; in mv3310_read_status()
736 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MV_PCS_BASE_R + MDIO_STAT1); in mv3310_read_status()
741 err = mv3310_read_status_10gbaser(phydev); in mv3310_read_status()
743 err = mv3310_read_status_copper(phydev); in mv3310_read_status()
747 if (phydev->link) in mv3310_read_status()
748 mv3310_update_interface(phydev); in mv3310_read_status()
753 static int mv3310_get_tunable(struct phy_device *phydev, in mv3310_get_tunable() argument
758 return mv3310_get_edpd(phydev, data); in mv3310_get_tunable()
764 static int mv3310_set_tunable(struct phy_device *phydev, in mv3310_set_tunable() argument
769 return mv3310_set_edpd(phydev, *(u16 *)data); in mv3310_set_tunable()