Lines Matching refs:phydev
64 static void phy_process_state_change(struct phy_device *phydev, in phy_process_state_change() argument
67 if (old_state != phydev->state) { in phy_process_state_change()
68 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_process_state_change()
70 phy_state_to_str(phydev->state)); in phy_process_state_change()
71 if (phydev->drv && phydev->drv->link_change_notify) in phy_process_state_change()
72 phydev->drv->link_change_notify(phydev); in phy_process_state_change()
76 static void phy_link_up(struct phy_device *phydev) in phy_link_up() argument
78 phydev->phy_link_change(phydev, true); in phy_link_up()
79 phy_led_trigger_change_speed(phydev); in phy_link_up()
82 static void phy_link_down(struct phy_device *phydev) in phy_link_down() argument
84 phydev->phy_link_change(phydev, false); in phy_link_down()
85 phy_led_trigger_change_speed(phydev); in phy_link_down()
86 WRITE_ONCE(phydev->link_down_events, phydev->link_down_events + 1); in phy_link_down()
89 static const char *phy_pause_str(struct phy_device *phydev) in phy_pause_str() argument
93 if (phydev->autoneg == AUTONEG_DISABLE) in phy_pause_str()
97 phydev->advertising); in phy_pause_str()
99 phydev->advertising); in phy_pause_str()
101 if (local_pause && phydev->pause) in phy_pause_str()
104 if (local_asym_pause && phydev->asym_pause) { in phy_pause_str()
107 if (phydev->pause) in phy_pause_str()
119 void phy_print_status(struct phy_device *phydev) in phy_print_status() argument
121 if (phydev->link) { in phy_print_status()
122 netdev_info(phydev->attached_dev, in phy_print_status()
124 phy_speed_to_str(phydev->speed), in phy_print_status()
125 phy_duplex_to_str(phydev->duplex), in phy_print_status()
126 phydev->downshifted_rate ? "(downshifted) " : "", in phy_print_status()
127 phy_pause_str(phydev)); in phy_print_status()
129 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
146 int phy_get_rate_matching(struct phy_device *phydev, in phy_get_rate_matching() argument
151 if (phydev->drv->get_rate_matching) { in phy_get_rate_matching()
152 mutex_lock(&phydev->lock); in phy_get_rate_matching()
153 ret = phydev->drv->get_rate_matching(phydev, iface); in phy_get_rate_matching()
154 mutex_unlock(&phydev->lock); in phy_get_rate_matching()
168 static int phy_config_interrupt(struct phy_device *phydev, bool interrupts) in phy_config_interrupt() argument
170 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
171 if (phydev->drv->config_intr) in phy_config_interrupt()
172 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
184 int phy_restart_aneg(struct phy_device *phydev) in phy_restart_aneg() argument
188 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
189 ret = genphy_c45_restart_aneg(phydev); in phy_restart_aneg()
191 ret = genphy_restart_aneg(phydev); in phy_restart_aneg()
205 int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
207 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
208 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
209 else if (phydev->is_c45) in phy_aneg_done()
210 return genphy_c45_aneg_done(phydev); in phy_aneg_done()
212 return genphy_aneg_done(phydev); in phy_aneg_done()
256 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
260 c = phy_caps_lookup(phydev->speed, phydev->duplex, phydev->supported, in phy_sanitize_settings()
264 phydev->speed = c->speed; in phy_sanitize_settings()
265 phydev->duplex = c->duplex; in phy_sanitize_settings()
268 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
269 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
273 void phy_ethtool_ksettings_get(struct phy_device *phydev, in phy_ethtool_ksettings_get() argument
276 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
277 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
278 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
279 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
281 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
282 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
283 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
284 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
285 cmd->base.rate_matching = phydev->rate_matching; in phy_ethtool_ksettings_get()
286 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
289 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
290 cmd->base.transceiver = phydev->is_internal ? in phy_ethtool_ksettings_get()
292 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
293 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
294 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
295 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
296 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
310 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
323 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
330 ret = mdiobus_c45_read(phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
334 ret = mdiobus_read(phydev->mdio.bus, mii_data->phy_id, in phy_mii_ioctl()
353 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
357 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
359 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
361 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
363 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
365 phydev->speed = SPEED_1000; in phy_mii_ioctl()
367 phydev->speed = SPEED_100; in phy_mii_ioctl()
368 else phydev->speed = SPEED_10; in phy_mii_ioctl()
370 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
372 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
376 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
381 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
392 mdiobus_c45_write(phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
395 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
397 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
400 return phy_init_hw(phydev); in phy_mii_ioctl()
403 return phy_start_aneg(phydev); in phy_mii_ioctl()
408 if (phydev->mii_ts && phydev->mii_ts->hwtstamp_set) { in phy_mii_ioctl()
413 ret = phydev->mii_ts->hwtstamp_set(phydev->mii_ts, in phy_mii_ioctl()
441 if (!dev->phydev) in phy_do_ioctl()
444 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
475 int __phy_hwtstamp_get(struct phy_device *phydev, in __phy_hwtstamp_get() argument
478 if (!phydev) in __phy_hwtstamp_get()
481 if (phydev->mii_ts && phydev->mii_ts->hwtstamp_get) in __phy_hwtstamp_get()
482 return phydev->mii_ts->hwtstamp_get(phydev->mii_ts, config); in __phy_hwtstamp_get()
494 int __phy_hwtstamp_set(struct phy_device *phydev, in __phy_hwtstamp_set() argument
498 if (!phydev) in __phy_hwtstamp_set()
501 if (phydev->mii_ts && phydev->mii_ts->hwtstamp_set) in __phy_hwtstamp_set()
502 return phydev->mii_ts->hwtstamp_set(phydev->mii_ts, config, in __phy_hwtstamp_set()
514 static void phy_queue_state_machine(struct phy_device *phydev, in phy_queue_state_machine() argument
517 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
526 void phy_trigger_machine(struct phy_device *phydev) in phy_trigger_machine() argument
528 phy_queue_state_machine(phydev, 0); in phy_trigger_machine()
532 static void phy_abort_cable_test(struct phy_device *phydev) in phy_abort_cable_test() argument
536 ethnl_cable_test_finished(phydev); in phy_abort_cable_test()
538 err = phy_init_hw(phydev); in phy_abort_cable_test()
540 phydev_err(phydev, "Error while aborting cable test"); in phy_abort_cable_test()
549 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) in phy_ethtool_get_strings() argument
551 if (!phydev->drv) in phy_ethtool_get_strings()
554 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
555 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
556 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
567 int phy_ethtool_get_sset_count(struct phy_device *phydev) in phy_ethtool_get_sset_count() argument
571 if (!phydev->drv) in phy_ethtool_get_sset_count()
574 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
575 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
576 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
577 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
578 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
579 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
595 int phy_ethtool_get_stats(struct phy_device *phydev, in phy_ethtool_get_stats() argument
598 if (!phydev->drv) in phy_ethtool_get_stats()
601 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
602 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
603 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
619 void __phy_ethtool_get_phy_stats(struct phy_device *phydev, in __phy_ethtool_get_phy_stats() argument
623 if (!phydev->drv || !phydev->drv->get_phy_stats) in __phy_ethtool_get_phy_stats()
626 mutex_lock(&phydev->lock); in __phy_ethtool_get_phy_stats()
627 phydev->drv->get_phy_stats(phydev, phy_stats, phydev_stats); in __phy_ethtool_get_phy_stats()
628 mutex_unlock(&phydev->lock); in __phy_ethtool_get_phy_stats()
639 void __phy_ethtool_get_link_ext_stats(struct phy_device *phydev, in __phy_ethtool_get_link_ext_stats() argument
642 link_stats->link_down_events = READ_ONCE(phydev->link_down_events); in __phy_ethtool_get_link_ext_stats()
644 if (!phydev->drv || !phydev->drv->get_link_stats) in __phy_ethtool_get_link_ext_stats()
647 mutex_lock(&phydev->lock); in __phy_ethtool_get_link_ext_stats()
648 phydev->drv->get_link_stats(phydev, link_stats); in __phy_ethtool_get_link_ext_stats()
649 mutex_unlock(&phydev->lock); in __phy_ethtool_get_link_ext_stats()
660 int phy_ethtool_get_plca_cfg(struct phy_device *phydev, in phy_ethtool_get_plca_cfg() argument
665 if (!phydev->drv) { in phy_ethtool_get_plca_cfg()
670 if (!phydev->drv->get_plca_cfg) { in phy_ethtool_get_plca_cfg()
675 mutex_lock(&phydev->lock); in phy_ethtool_get_plca_cfg()
676 ret = phydev->drv->get_plca_cfg(phydev, plca_cfg); in phy_ethtool_get_plca_cfg()
678 mutex_unlock(&phydev->lock); in phy_ethtool_get_plca_cfg()
693 static int plca_check_valid(struct phy_device *phydev, in plca_check_valid() argument
700 phydev->advertising)) { in plca_check_valid()
721 int phy_ethtool_set_plca_cfg(struct phy_device *phydev, in phy_ethtool_set_plca_cfg() argument
728 if (!phydev->drv) { in phy_ethtool_set_plca_cfg()
733 if (!phydev->drv->set_plca_cfg || in phy_ethtool_set_plca_cfg()
734 !phydev->drv->get_plca_cfg) { in phy_ethtool_set_plca_cfg()
745 mutex_lock(&phydev->lock); in phy_ethtool_set_plca_cfg()
747 ret = phydev->drv->get_plca_cfg(phydev, curr_plca_cfg); in phy_ethtool_set_plca_cfg()
799 ret = plca_check_valid(phydev, curr_plca_cfg, extack); in phy_ethtool_set_plca_cfg()
804 ret = phydev->drv->set_plca_cfg(phydev, plca_cfg); in phy_ethtool_set_plca_cfg()
808 mutex_unlock(&phydev->lock); in phy_ethtool_set_plca_cfg()
821 int phy_ethtool_get_plca_status(struct phy_device *phydev, in phy_ethtool_get_plca_status() argument
826 if (!phydev->drv) { in phy_ethtool_get_plca_status()
831 if (!phydev->drv->get_plca_status) { in phy_ethtool_get_plca_status()
836 mutex_lock(&phydev->lock); in phy_ethtool_get_plca_status()
837 ret = phydev->drv->get_plca_status(phydev, plca_st); in phy_ethtool_get_plca_status()
839 mutex_unlock(&phydev->lock); in phy_ethtool_get_plca_status()
850 int phy_start_cable_test(struct phy_device *phydev, in phy_start_cable_test() argument
853 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
856 if (!(phydev->drv && in phy_start_cable_test()
857 phydev->drv->cable_test_start && in phy_start_cable_test()
858 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
864 mutex_lock(&phydev->lock); in phy_start_cable_test()
865 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
872 if (phydev->state < PHY_UP || in phy_start_cable_test()
873 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
880 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF); in phy_start_cable_test()
885 phy_link_down(phydev); in phy_start_cable_test()
888 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
891 phy_link_up(phydev); in phy_start_cable_test()
895 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
897 if (phy_polling_mode(phydev)) in phy_start_cable_test()
898 phy_trigger_machine(phydev); in phy_start_cable_test()
900 mutex_unlock(&phydev->lock); in phy_start_cable_test()
905 ethnl_cable_test_free(phydev); in phy_start_cable_test()
907 mutex_unlock(&phydev->lock); in phy_start_cable_test()
920 int phy_start_cable_test_tdr(struct phy_device *phydev, in phy_start_cable_test_tdr() argument
924 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
927 if (!(phydev->drv && in phy_start_cable_test_tdr()
928 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
929 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
935 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
936 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
943 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
944 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
951 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_TDR_NTF); in phy_start_cable_test_tdr()
956 phy_link_down(phydev); in phy_start_cable_test_tdr()
959 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
962 phy_link_up(phydev); in phy_start_cable_test_tdr()
966 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
968 if (phy_polling_mode(phydev)) in phy_start_cable_test_tdr()
969 phy_trigger_machine(phydev); in phy_start_cable_test_tdr()
971 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
976 ethnl_cable_test_free(phydev); in phy_start_cable_test_tdr()
978 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
984 int phy_config_aneg(struct phy_device *phydev) in phy_config_aneg() argument
986 if (phydev->drv->config_aneg) in phy_config_aneg()
987 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
992 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
993 return genphy_c45_config_aneg(phydev); in phy_config_aneg()
995 return genphy_config_aneg(phydev); in phy_config_aneg()
1006 static int phy_check_link_status(struct phy_device *phydev) in phy_check_link_status() argument
1010 lockdep_assert_held(&phydev->lock); in phy_check_link_status()
1015 if (phydev->loopback_enabled) in phy_check_link_status()
1018 err = phy_read_status(phydev); in phy_check_link_status()
1022 if (phydev->link && phydev->state != PHY_RUNNING) { in phy_check_link_status()
1023 phy_check_downshift(phydev); in phy_check_link_status()
1024 phydev->state = PHY_RUNNING; in phy_check_link_status()
1025 err = genphy_c45_eee_is_active(phydev, NULL); in phy_check_link_status()
1026 phydev->eee_active = err > 0; in phy_check_link_status()
1027 phydev->enable_tx_lpi = phydev->eee_cfg.tx_lpi_enabled && in phy_check_link_status()
1028 phydev->eee_active; in phy_check_link_status()
1030 phy_link_up(phydev); in phy_check_link_status()
1031 } else if (!phydev->link && phydev->state != PHY_NOLINK) { in phy_check_link_status()
1032 phydev->state = PHY_NOLINK; in phy_check_link_status()
1033 phydev->eee_active = false; in phy_check_link_status()
1034 phydev->enable_tx_lpi = false; in phy_check_link_status()
1035 phy_link_down(phydev); in phy_check_link_status()
1052 unsigned int phy_inband_caps(struct phy_device *phydev, in phy_inband_caps() argument
1055 if (phydev->drv && phydev->drv->inband_caps) in phy_inband_caps()
1056 return phydev->drv->inband_caps(phydev, interface); in phy_inband_caps()
1072 int phy_config_inband(struct phy_device *phydev, unsigned int modes) in phy_config_inband() argument
1074 lockdep_assert_held(&phydev->lock); in phy_config_inband()
1081 if (!phydev->drv) in phy_config_inband()
1083 else if (!phydev->drv->config_inband) in phy_config_inband()
1086 return phydev->drv->config_inband(phydev, modes); in phy_config_inband()
1099 int _phy_start_aneg(struct phy_device *phydev) in _phy_start_aneg() argument
1103 lockdep_assert_held(&phydev->lock); in _phy_start_aneg()
1105 if (!phydev->drv) in _phy_start_aneg()
1108 if (AUTONEG_DISABLE == phydev->autoneg) in _phy_start_aneg()
1109 phy_sanitize_settings(phydev); in _phy_start_aneg()
1111 err = phy_config_aneg(phydev); in _phy_start_aneg()
1115 if (phy_is_started(phydev)) in _phy_start_aneg()
1116 err = phy_check_link_status(phydev); in _phy_start_aneg()
1131 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
1135 mutex_lock(&phydev->lock); in phy_start_aneg()
1136 err = _phy_start_aneg(phydev); in phy_start_aneg()
1137 mutex_unlock(&phydev->lock); in phy_start_aneg()
1143 static int phy_poll_aneg_done(struct phy_device *phydev) in phy_poll_aneg_done() argument
1150 ret = phy_aneg_done(phydev); in phy_poll_aneg_done()
1159 int phy_ethtool_ksettings_set(struct phy_device *phydev, in phy_ethtool_ksettings_set() argument
1167 if (cmd->base.phy_address != phydev->mdio.addr) in phy_ethtool_ksettings_set()
1173 linkmode_and(advertising, advertising, phydev->supported); in phy_ethtool_ksettings_set()
1182 phydev->supported))) in phy_ethtool_ksettings_set()
1193 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_set()
1194 phydev->autoneg = autoneg; in phy_ethtool_ksettings_set()
1197 phydev->speed = speed; in phy_ethtool_ksettings_set()
1198 phydev->duplex = duplex; in phy_ethtool_ksettings_set()
1201 linkmode_copy(phydev->advertising, advertising); in phy_ethtool_ksettings_set()
1204 phydev->advertising, autoneg == AUTONEG_ENABLE); in phy_ethtool_ksettings_set()
1206 phydev->master_slave_set = cmd->base.master_slave_cfg; in phy_ethtool_ksettings_set()
1207 phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; in phy_ethtool_ksettings_set()
1210 if (phy_is_started(phydev)) { in phy_ethtool_ksettings_set()
1211 phydev->state = PHY_UP; in phy_ethtool_ksettings_set()
1212 phy_trigger_machine(phydev); in phy_ethtool_ksettings_set()
1214 _phy_start_aneg(phydev); in phy_ethtool_ksettings_set()
1217 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_set()
1235 int phy_speed_down(struct phy_device *phydev, bool sync) in phy_speed_down() argument
1240 mutex_lock(&phydev->lock); in phy_speed_down()
1242 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_down()
1245 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_down()
1247 ret = phy_speed_down_core(phydev); in phy_speed_down()
1251 linkmode_copy(phydev->adv_old, adv_tmp); in phy_speed_down()
1253 if (linkmode_equal(phydev->advertising, adv_tmp)) { in phy_speed_down()
1258 ret = phy_config_aneg(phydev); in phy_speed_down()
1262 ret = sync ? phy_poll_aneg_done(phydev) : 0; in phy_speed_down()
1264 mutex_unlock(&phydev->lock); in phy_speed_down()
1276 int phy_speed_up(struct phy_device *phydev) in phy_speed_up() argument
1281 mutex_lock(&phydev->lock); in phy_speed_up()
1283 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_up()
1286 if (linkmode_empty(phydev->adv_old)) in phy_speed_up()
1289 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_up()
1290 linkmode_copy(phydev->advertising, phydev->adv_old); in phy_speed_up()
1291 linkmode_zero(phydev->adv_old); in phy_speed_up()
1293 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_up()
1296 ret = phy_config_aneg(phydev); in phy_speed_up()
1298 mutex_unlock(&phydev->lock); in phy_speed_up()
1314 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
1316 phy_trigger_machine(phydev); in phy_start_machine()
1328 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
1330 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
1332 mutex_lock(&phydev->lock); in phy_stop_machine()
1333 if (phy_is_started(phydev)) in phy_stop_machine()
1334 phydev->state = PHY_UP; in phy_stop_machine()
1335 mutex_unlock(&phydev->lock); in phy_stop_machine()
1338 static void phy_process_error(struct phy_device *phydev) in phy_process_error() argument
1341 if (!mutex_is_locked(&phydev->lock)) in phy_process_error()
1342 phydev_err(phydev, "PHY-device data unsafe context\n"); in phy_process_error()
1344 phydev->state = PHY_ERROR; in phy_process_error()
1346 phy_trigger_machine(phydev); in phy_process_error()
1349 static void phy_error_precise(struct phy_device *phydev, in phy_error_precise() argument
1353 phy_process_error(phydev); in phy_error_precise()
1364 void phy_error(struct phy_device *phydev) in phy_error() argument
1367 phy_process_error(phydev); in phy_error()
1375 int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
1378 return phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
1390 struct phy_device *phydev = phy_dat; in phy_interrupt() local
1396 if (IS_ENABLED(CONFIG_PM_SLEEP) && phydev->irq_suspended) { in phy_interrupt()
1397 struct net_device *netdev = phydev->attached_dev; in phy_interrupt()
1410 phydev->irq_rerun = 1; in phy_interrupt()
1415 mutex_lock(&phydev->lock); in phy_interrupt()
1416 ret = phydev->drv->handle_interrupt(phydev); in phy_interrupt()
1417 mutex_unlock(&phydev->lock); in phy_interrupt()
1426 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
1428 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
1440 static int phy_update_stats(struct phy_device *phydev) in phy_update_stats() argument
1442 if (!phydev->drv->update_stats) in phy_update_stats()
1445 return phydev->drv->update_stats(phydev); in phy_update_stats()
1456 void phy_request_interrupt(struct phy_device *phydev) in phy_request_interrupt() argument
1460 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1462 phydev_name(phydev), phydev); in phy_request_interrupt()
1464 phydev_warn(phydev, "Error %d requesting IRQ %d, falling back to polling\n", in phy_request_interrupt()
1465 err, phydev->irq); in phy_request_interrupt()
1466 phydev->irq = PHY_POLL; in phy_request_interrupt()
1468 if (phy_enable_interrupts(phydev)) { in phy_request_interrupt()
1469 phydev_warn(phydev, "Can't enable interrupt, falling back to polling\n"); in phy_request_interrupt()
1470 phy_free_interrupt(phydev); in phy_request_interrupt()
1471 phydev->irq = PHY_POLL; in phy_request_interrupt()
1484 void phy_free_interrupt(struct phy_device *phydev) in phy_free_interrupt() argument
1486 phy_disable_interrupts(phydev); in phy_free_interrupt()
1487 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1501 static unsigned int phy_get_next_update_time(struct phy_device *phydev) in phy_get_next_update_time() argument
1503 if (phydev->drv && phydev->drv->get_next_update_time) in phy_get_next_update_time()
1504 return phydev->drv->get_next_update_time(phydev); in phy_get_next_update_time()
1515 static enum phy_state_work _phy_state_machine(struct phy_device *phydev) in _phy_state_machine() argument
1518 struct net_device *dev = phydev->attached_dev; in _phy_state_machine()
1519 enum phy_state old_state = phydev->state; in _phy_state_machine()
1524 switch (phydev->state) { in _phy_state_machine()
1533 err = phy_check_link_status(phydev); in _phy_state_machine()
1537 err = phy_update_stats(phydev); in _phy_state_machine()
1540 err = phydev->drv->cable_test_get_status(phydev, &finished); in _phy_state_machine()
1542 phy_abort_cable_test(phydev); in _phy_state_machine()
1545 phydev->state = PHY_UP; in _phy_state_machine()
1550 ethnl_cable_test_finished(phydev); in _phy_state_machine()
1553 phydev->state = PHY_UP; in _phy_state_machine()
1557 if (phydev->link) { in _phy_state_machine()
1558 if (phydev->autoneg == AUTONEG_ENABLE) { in _phy_state_machine()
1559 phydev->speed = SPEED_UNKNOWN; in _phy_state_machine()
1560 phydev->duplex = DUPLEX_UNKNOWN; in _phy_state_machine()
1562 if (phydev->master_slave_state != in _phy_state_machine()
1564 phydev->master_slave_state = in _phy_state_machine()
1566 phydev->mdix = ETH_TP_MDI_INVALID; in _phy_state_machine()
1567 linkmode_zero(phydev->lp_advertising); in _phy_state_machine()
1571 if (phydev->link) { in _phy_state_machine()
1572 phydev->link = 0; in _phy_state_machine()
1573 phydev->eee_active = false; in _phy_state_machine()
1574 phydev->enable_tx_lpi = false; in _phy_state_machine()
1575 phy_link_down(phydev); in _phy_state_machine()
1582 err = _phy_start_aneg(phydev); in _phy_state_machine()
1590 phy_error_precise(phydev, func, err); in _phy_state_machine()
1592 phy_process_state_change(phydev, old_state); in _phy_state_machine()
1602 if (phy_polling_mode(phydev) && phy_is_started(phydev)) in _phy_state_machine()
1603 phy_queue_state_machine(phydev, in _phy_state_machine()
1604 phy_get_next_update_time(phydev)); in _phy_state_machine()
1610 static void _phy_state_machine_post_work(struct phy_device *phydev, in _phy_state_machine_post_work() argument
1614 phy_suspend(phydev); in _phy_state_machine_post_work()
1624 struct phy_device *phydev = in phy_state_machine() local
1628 mutex_lock(&phydev->lock); in phy_state_machine()
1629 state_work = _phy_state_machine(phydev); in phy_state_machine()
1630 mutex_unlock(&phydev->lock); in phy_state_machine()
1632 _phy_state_machine_post_work(phydev, state_work); in phy_state_machine()
1639 void phy_stop(struct phy_device *phydev) in phy_stop() argument
1641 struct net_device *dev = phydev->attached_dev; in phy_stop()
1645 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN && in phy_stop()
1646 phydev->state != PHY_ERROR) { in phy_stop()
1648 phy_state_to_str(phydev->state)); in phy_stop()
1652 mutex_lock(&phydev->lock); in phy_stop()
1653 old_state = phydev->state; in phy_stop()
1655 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1656 phy_abort_cable_test(phydev); in phy_stop()
1660 if (phydev->sfp_bus) in phy_stop()
1661 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1663 phydev->state = PHY_HALTED; in phy_stop()
1664 phy_process_state_change(phydev, old_state); in phy_stop()
1666 state_work = _phy_state_machine(phydev); in phy_stop()
1667 mutex_unlock(&phydev->lock); in phy_stop()
1669 _phy_state_machine_post_work(phydev, state_work); in phy_stop()
1670 phy_stop_machine(phydev); in phy_stop()
1689 void phy_start(struct phy_device *phydev) in phy_start() argument
1691 mutex_lock(&phydev->lock); in phy_start()
1693 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1695 phy_state_to_str(phydev->state)); in phy_start()
1699 if (phydev->sfp_bus) in phy_start()
1700 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1703 __phy_resume(phydev); in phy_start()
1705 phydev->state = PHY_UP; in phy_start()
1707 phy_start_machine(phydev); in phy_start()
1709 mutex_unlock(&phydev->lock); in phy_start()
1720 void phy_mac_interrupt(struct phy_device *phydev) in phy_mac_interrupt() argument
1723 phy_trigger_machine(phydev); in phy_mac_interrupt()
1738 int phy_loopback(struct phy_device *phydev, bool enable, int speed) in phy_loopback() argument
1743 if (!phydev->drv) in phy_loopback()
1746 mutex_lock(&phydev->lock); in phy_loopback()
1748 if (enable && phydev->loopback_enabled) { in phy_loopback()
1753 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1764 if (phydev->link && phydev->state == PHY_RUNNING) { in phy_loopback()
1766 if (speed && phydev->speed != speed) { in phy_loopback()
1768 phydev->link = false; in phy_loopback()
1769 phydev->state = PHY_NOLINK; in phy_loopback()
1770 phy_link_down(phydev); in phy_loopback()
1783 if (phydev->drv->set_loopback) in phy_loopback()
1784 ret = phydev->drv->set_loopback(phydev, enable, speed); in phy_loopback()
1786 ret = genphy_loopback(phydev, enable, speed); in phy_loopback()
1791 if (phydev->drv->set_loopback) in phy_loopback()
1792 phydev->drv->set_loopback(phydev, false, 0); in phy_loopback()
1794 genphy_loopback(phydev, false, 0); in phy_loopback()
1801 phydev->link = true; in phy_loopback()
1802 phydev->state = PHY_RUNNING; in phy_loopback()
1803 phy_link_up(phydev); in phy_loopback()
1806 phydev->loopback_enabled = enable; in phy_loopback()
1809 mutex_unlock(&phydev->lock); in phy_loopback()
1822 int phy_eee_tx_clock_stop_capable(struct phy_device *phydev) in phy_eee_tx_clock_stop_capable() argument
1826 stat1 = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_STAT1); in phy_eee_tx_clock_stop_capable()
1844 int phy_eee_rx_clock_stop(struct phy_device *phydev, bool clk_stop_enable) in phy_eee_rx_clock_stop() argument
1849 return phy_modify_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, in phy_eee_rx_clock_stop()
1865 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1869 if (!phydev->drv) in phy_init_eee()
1872 ret = genphy_c45_eee_is_active(phydev, NULL); in phy_init_eee()
1879 ret = phy_eee_rx_clock_stop(phydev, true); in phy_init_eee()
1892 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1896 if (!phydev->drv) in phy_get_eee_err()
1899 mutex_lock(&phydev->lock); in phy_get_eee_err()
1900 ret = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR); in phy_get_eee_err()
1901 mutex_unlock(&phydev->lock); in phy_get_eee_err()
1915 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_keee *data) in phy_ethtool_get_eee() argument
1919 if (!phydev->drv) in phy_ethtool_get_eee()
1922 mutex_lock(&phydev->lock); in phy_ethtool_get_eee()
1923 ret = genphy_c45_ethtool_get_eee(phydev, data); in phy_ethtool_get_eee()
1924 eeecfg_to_eee(data, &phydev->eee_cfg); in phy_ethtool_get_eee()
1925 mutex_unlock(&phydev->lock); in phy_ethtool_get_eee()
1945 static void phy_ethtool_set_eee_noneg(struct phy_device *phydev, in phy_ethtool_set_eee_noneg() argument
1950 if (!phydev->link) in phy_ethtool_set_eee_noneg()
1953 enable_tx_lpi = phydev->eee_cfg.tx_lpi_enabled && phydev->eee_active; in phy_ethtool_set_eee_noneg()
1955 if (phydev->enable_tx_lpi != enable_tx_lpi || in phy_ethtool_set_eee_noneg()
1956 phydev->eee_cfg.tx_lpi_timer != old_cfg->tx_lpi_timer) { in phy_ethtool_set_eee_noneg()
1957 phydev->enable_tx_lpi = false; in phy_ethtool_set_eee_noneg()
1958 phydev->link = false; in phy_ethtool_set_eee_noneg()
1959 phy_link_down(phydev); in phy_ethtool_set_eee_noneg()
1960 phydev->enable_tx_lpi = enable_tx_lpi; in phy_ethtool_set_eee_noneg()
1961 phydev->link = true; in phy_ethtool_set_eee_noneg()
1962 phy_link_up(phydev); in phy_ethtool_set_eee_noneg()
1973 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_keee *data) in phy_ethtool_set_eee() argument
1978 if (!phydev->drv) in phy_ethtool_set_eee()
1981 mutex_lock(&phydev->lock); in phy_ethtool_set_eee()
1983 old_cfg = phydev->eee_cfg; in phy_ethtool_set_eee()
1984 eee_to_eeecfg(&phydev->eee_cfg, data); in phy_ethtool_set_eee()
1986 ret = genphy_c45_ethtool_set_eee(phydev, data); in phy_ethtool_set_eee()
1988 phy_ethtool_set_eee_noneg(phydev, &old_cfg); in phy_ethtool_set_eee()
1990 phydev->eee_cfg = old_cfg; in phy_ethtool_set_eee()
1992 mutex_unlock(&phydev->lock); in phy_ethtool_set_eee()
2004 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
2008 if (phydev->drv && phydev->drv->set_wol) { in phy_ethtool_set_wol()
2009 mutex_lock(&phydev->lock); in phy_ethtool_set_wol()
2010 ret = phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
2011 mutex_unlock(&phydev->lock); in phy_ethtool_set_wol()
2026 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
2028 if (phydev->drv && phydev->drv->get_wol) { in phy_ethtool_get_wol()
2029 mutex_lock(&phydev->lock); in phy_ethtool_get_wol()
2030 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
2031 mutex_unlock(&phydev->lock); in phy_ethtool_get_wol()
2039 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings() local
2041 if (!phydev) in phy_ethtool_get_link_ksettings()
2044 phy_ethtool_ksettings_get(phydev, cmd); in phy_ethtool_get_link_ksettings()
2053 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings() local
2055 if (!phydev) in phy_ethtool_set_link_ksettings()
2058 return phy_ethtool_ksettings_set(phydev, cmd); in phy_ethtool_set_link_ksettings()
2068 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset() local
2071 if (!phydev) in phy_ethtool_nway_reset()
2074 if (!phydev->drv) in phy_ethtool_nway_reset()
2077 mutex_lock(&phydev->lock); in phy_ethtool_nway_reset()
2078 ret = phy_restart_aneg(phydev); in phy_ethtool_nway_reset()
2079 mutex_unlock(&phydev->lock); in phy_ethtool_nway_reset()