Lines Matching refs:phydev
60 static void phy_link_up(struct phy_device *phydev) in phy_link_up() argument
62 phydev->phy_link_change(phydev, true); in phy_link_up()
63 phy_led_trigger_change_speed(phydev); in phy_link_up()
66 static void phy_link_down(struct phy_device *phydev) in phy_link_down() argument
68 phydev->phy_link_change(phydev, false); in phy_link_down()
69 phy_led_trigger_change_speed(phydev); in phy_link_down()
72 static const char *phy_pause_str(struct phy_device *phydev) in phy_pause_str() argument
76 if (phydev->autoneg == AUTONEG_DISABLE) in phy_pause_str()
80 phydev->advertising); in phy_pause_str()
82 phydev->advertising); in phy_pause_str()
84 if (local_pause && phydev->pause) in phy_pause_str()
87 if (local_asym_pause && phydev->asym_pause) { in phy_pause_str()
90 if (phydev->pause) in phy_pause_str()
102 void phy_print_status(struct phy_device *phydev) in phy_print_status() argument
104 if (phydev->link) { in phy_print_status()
105 netdev_info(phydev->attached_dev, in phy_print_status()
107 phy_speed_to_str(phydev->speed), in phy_print_status()
108 phy_duplex_to_str(phydev->duplex), in phy_print_status()
109 phydev->downshifted_rate ? "(downshifted) " : "", in phy_print_status()
110 phy_pause_str(phydev)); in phy_print_status()
112 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
129 int phy_get_rate_matching(struct phy_device *phydev, in phy_get_rate_matching() argument
134 if (phydev->drv->get_rate_matching) { in phy_get_rate_matching()
135 mutex_lock(&phydev->lock); in phy_get_rate_matching()
136 ret = phydev->drv->get_rate_matching(phydev, iface); in phy_get_rate_matching()
137 mutex_unlock(&phydev->lock); in phy_get_rate_matching()
151 static int phy_config_interrupt(struct phy_device *phydev, bool interrupts) in phy_config_interrupt() argument
153 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
154 if (phydev->drv->config_intr) in phy_config_interrupt()
155 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
167 int phy_restart_aneg(struct phy_device *phydev) in phy_restart_aneg() argument
171 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
172 ret = genphy_c45_restart_aneg(phydev); in phy_restart_aneg()
174 ret = genphy_restart_aneg(phydev); in phy_restart_aneg()
188 int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
190 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
191 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
192 else if (phydev->is_c45) in phy_aneg_done()
193 return genphy_c45_aneg_done(phydev); in phy_aneg_done()
195 return genphy_aneg_done(phydev); in phy_aneg_done()
258 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
262 setting = phy_find_valid(phydev->speed, phydev->duplex, in phy_sanitize_settings()
263 phydev->supported); in phy_sanitize_settings()
265 phydev->speed = setting->speed; in phy_sanitize_settings()
266 phydev->duplex = setting->duplex; in phy_sanitize_settings()
269 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
270 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
274 void phy_ethtool_ksettings_get(struct phy_device *phydev, in phy_ethtool_ksettings_get() argument
277 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
278 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
279 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
280 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
282 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
283 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
284 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
285 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
286 cmd->base.rate_matching = phydev->rate_matching; in phy_ethtool_ksettings_get()
287 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
290 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
291 cmd->base.transceiver = phy_is_internal(phydev) ? in phy_ethtool_ksettings_get()
293 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
294 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
295 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
296 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
297 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
311 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
320 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
328 phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
332 phydev->mdio.bus, mii_data->phy_id, in phy_mii_ioctl()
345 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
349 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
351 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
353 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
355 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
357 phydev->speed = SPEED_1000; in phy_mii_ioctl()
359 phydev->speed = SPEED_100; in phy_mii_ioctl()
360 else phydev->speed = SPEED_10; in phy_mii_ioctl()
362 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
364 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
368 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
373 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
384 mdiobus_c45_write(phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
387 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
389 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
392 return phy_init_hw(phydev); in phy_mii_ioctl()
395 return phy_start_aneg(phydev); in phy_mii_ioctl()
400 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) in phy_mii_ioctl()
401 return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr); in phy_mii_ioctl()
418 if (!dev->phydev) in phy_do_ioctl()
421 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
450 void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies) in phy_queue_state_machine() argument
452 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
462 void phy_trigger_machine(struct phy_device *phydev) in phy_trigger_machine() argument
464 phy_queue_state_machine(phydev, 0); in phy_trigger_machine()
468 static void phy_abort_cable_test(struct phy_device *phydev) in phy_abort_cable_test() argument
472 ethnl_cable_test_finished(phydev); in phy_abort_cable_test()
474 err = phy_init_hw(phydev); in phy_abort_cable_test()
476 phydev_err(phydev, "Error while aborting cable test"); in phy_abort_cable_test()
485 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) in phy_ethtool_get_strings() argument
487 if (!phydev->drv) in phy_ethtool_get_strings()
490 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
491 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
492 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
503 int phy_ethtool_get_sset_count(struct phy_device *phydev) in phy_ethtool_get_sset_count() argument
507 if (!phydev->drv) in phy_ethtool_get_sset_count()
510 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
511 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
512 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
513 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
514 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
515 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
531 int phy_ethtool_get_stats(struct phy_device *phydev, in phy_ethtool_get_stats() argument
534 if (!phydev->drv) in phy_ethtool_get_stats()
537 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
538 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
539 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
551 int phy_start_cable_test(struct phy_device *phydev, in phy_start_cable_test() argument
554 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
557 if (!(phydev->drv && in phy_start_cable_test()
558 phydev->drv->cable_test_start && in phy_start_cable_test()
559 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
565 mutex_lock(&phydev->lock); in phy_start_cable_test()
566 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
573 if (phydev->state < PHY_UP || in phy_start_cable_test()
574 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
581 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF); in phy_start_cable_test()
586 phy_link_down(phydev); in phy_start_cable_test()
589 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
592 phy_link_up(phydev); in phy_start_cable_test()
596 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
598 if (phy_polling_mode(phydev)) in phy_start_cable_test()
599 phy_trigger_machine(phydev); in phy_start_cable_test()
601 mutex_unlock(&phydev->lock); in phy_start_cable_test()
606 ethnl_cable_test_free(phydev); in phy_start_cable_test()
608 mutex_unlock(&phydev->lock); in phy_start_cable_test()
621 int phy_start_cable_test_tdr(struct phy_device *phydev, in phy_start_cable_test_tdr() argument
625 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
628 if (!(phydev->drv && in phy_start_cable_test_tdr()
629 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
630 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
636 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
637 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
644 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
645 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
652 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_TDR_NTF); in phy_start_cable_test_tdr()
657 phy_link_down(phydev); in phy_start_cable_test_tdr()
660 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
663 phy_link_up(phydev); in phy_start_cable_test_tdr()
667 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
669 if (phy_polling_mode(phydev)) in phy_start_cable_test_tdr()
670 phy_trigger_machine(phydev); in phy_start_cable_test_tdr()
672 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
677 ethnl_cable_test_free(phydev); in phy_start_cable_test_tdr()
679 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
685 int phy_config_aneg(struct phy_device *phydev) in phy_config_aneg() argument
687 if (phydev->drv->config_aneg) in phy_config_aneg()
688 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
693 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
694 return genphy_c45_config_aneg(phydev); in phy_config_aneg()
696 return genphy_config_aneg(phydev); in phy_config_aneg()
707 static int phy_check_link_status(struct phy_device *phydev) in phy_check_link_status() argument
711 lockdep_assert_held(&phydev->lock); in phy_check_link_status()
716 if (phydev->loopback_enabled) in phy_check_link_status()
719 err = phy_read_status(phydev); in phy_check_link_status()
723 if (phydev->link && phydev->state != PHY_RUNNING) { in phy_check_link_status()
724 phy_check_downshift(phydev); in phy_check_link_status()
725 phydev->state = PHY_RUNNING; in phy_check_link_status()
726 phy_link_up(phydev); in phy_check_link_status()
727 } else if (!phydev->link && phydev->state != PHY_NOLINK) { in phy_check_link_status()
728 phydev->state = PHY_NOLINK; in phy_check_link_status()
729 phy_link_down(phydev); in phy_check_link_status()
744 static int _phy_start_aneg(struct phy_device *phydev) in _phy_start_aneg() argument
748 lockdep_assert_held(&phydev->lock); in _phy_start_aneg()
750 if (!phydev->drv) in _phy_start_aneg()
753 if (AUTONEG_DISABLE == phydev->autoneg) in _phy_start_aneg()
754 phy_sanitize_settings(phydev); in _phy_start_aneg()
756 err = phy_config_aneg(phydev); in _phy_start_aneg()
760 if (phy_is_started(phydev)) in _phy_start_aneg()
761 err = phy_check_link_status(phydev); in _phy_start_aneg()
775 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
779 mutex_lock(&phydev->lock); in phy_start_aneg()
780 err = _phy_start_aneg(phydev); in phy_start_aneg()
781 mutex_unlock(&phydev->lock); in phy_start_aneg()
787 static int phy_poll_aneg_done(struct phy_device *phydev) in phy_poll_aneg_done() argument
794 ret = phy_aneg_done(phydev); in phy_poll_aneg_done()
803 int phy_ethtool_ksettings_set(struct phy_device *phydev, in phy_ethtool_ksettings_set() argument
811 if (cmd->base.phy_address != phydev->mdio.addr) in phy_ethtool_ksettings_set()
817 linkmode_and(advertising, advertising, phydev->supported); in phy_ethtool_ksettings_set()
834 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_set()
835 phydev->autoneg = autoneg; in phy_ethtool_ksettings_set()
838 phydev->speed = speed; in phy_ethtool_ksettings_set()
839 phydev->duplex = duplex; in phy_ethtool_ksettings_set()
842 linkmode_copy(phydev->advertising, advertising); in phy_ethtool_ksettings_set()
845 phydev->advertising, autoneg == AUTONEG_ENABLE); in phy_ethtool_ksettings_set()
847 phydev->master_slave_set = cmd->base.master_slave_cfg; in phy_ethtool_ksettings_set()
848 phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; in phy_ethtool_ksettings_set()
851 if (phy_is_started(phydev)) { in phy_ethtool_ksettings_set()
852 phydev->state = PHY_UP; in phy_ethtool_ksettings_set()
853 phy_trigger_machine(phydev); in phy_ethtool_ksettings_set()
855 _phy_start_aneg(phydev); in phy_ethtool_ksettings_set()
858 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_set()
876 int phy_speed_down(struct phy_device *phydev, bool sync) in phy_speed_down() argument
881 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_down()
884 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_down()
886 ret = phy_speed_down_core(phydev); in phy_speed_down()
890 linkmode_copy(phydev->adv_old, adv_tmp); in phy_speed_down()
892 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_down()
895 ret = phy_config_aneg(phydev); in phy_speed_down()
899 return sync ? phy_poll_aneg_done(phydev) : 0; in phy_speed_down()
909 int phy_speed_up(struct phy_device *phydev) in phy_speed_up() argument
913 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_up()
916 if (linkmode_empty(phydev->adv_old)) in phy_speed_up()
919 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_up()
920 linkmode_copy(phydev->advertising, phydev->adv_old); in phy_speed_up()
921 linkmode_zero(phydev->adv_old); in phy_speed_up()
923 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_up()
926 return phy_config_aneg(phydev); in phy_speed_up()
940 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
942 phy_trigger_machine(phydev); in phy_start_machine()
954 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
956 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
958 mutex_lock(&phydev->lock); in phy_stop_machine()
959 if (phy_is_started(phydev)) in phy_stop_machine()
960 phydev->state = PHY_UP; in phy_stop_machine()
961 mutex_unlock(&phydev->lock); in phy_stop_machine()
973 void phy_error(struct phy_device *phydev) in phy_error() argument
977 mutex_lock(&phydev->lock); in phy_error()
978 phydev->state = PHY_HALTED; in phy_error()
979 mutex_unlock(&phydev->lock); in phy_error()
981 phy_trigger_machine(phydev); in phy_error()
989 int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
992 return phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
1004 struct phy_device *phydev = phy_dat; in phy_interrupt() local
1005 struct phy_driver *drv = phydev->drv; in phy_interrupt()
1011 if (IS_ENABLED(CONFIG_PM_SLEEP) && phydev->irq_suspended) { in phy_interrupt()
1012 struct net_device *netdev = phydev->attached_dev; in phy_interrupt()
1025 phydev->irq_rerun = 1; in phy_interrupt()
1030 mutex_lock(&phydev->lock); in phy_interrupt()
1031 ret = drv->handle_interrupt(phydev); in phy_interrupt()
1032 mutex_unlock(&phydev->lock); in phy_interrupt()
1041 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
1043 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
1054 void phy_request_interrupt(struct phy_device *phydev) in phy_request_interrupt() argument
1058 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1060 phydev_name(phydev), phydev); in phy_request_interrupt()
1062 phydev_warn(phydev, "Error %d requesting IRQ %d, falling back to polling\n", in phy_request_interrupt()
1063 err, phydev->irq); in phy_request_interrupt()
1064 phydev->irq = PHY_POLL; in phy_request_interrupt()
1066 if (phy_enable_interrupts(phydev)) { in phy_request_interrupt()
1067 phydev_warn(phydev, "Can't enable interrupt, falling back to polling\n"); in phy_request_interrupt()
1068 phy_free_interrupt(phydev); in phy_request_interrupt()
1069 phydev->irq = PHY_POLL; in phy_request_interrupt()
1082 void phy_free_interrupt(struct phy_device *phydev) in phy_free_interrupt() argument
1084 phy_disable_interrupts(phydev); in phy_free_interrupt()
1085 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1093 void phy_stop(struct phy_device *phydev) in phy_stop() argument
1095 struct net_device *dev = phydev->attached_dev; in phy_stop()
1097 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) { in phy_stop()
1099 phy_state_to_str(phydev->state)); in phy_stop()
1103 mutex_lock(&phydev->lock); in phy_stop()
1105 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1106 phy_abort_cable_test(phydev); in phy_stop()
1110 if (phydev->sfp_bus) in phy_stop()
1111 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1113 phydev->state = PHY_HALTED; in phy_stop()
1115 mutex_unlock(&phydev->lock); in phy_stop()
1117 phy_state_machine(&phydev->state_queue.work); in phy_stop()
1118 phy_stop_machine(phydev); in phy_stop()
1137 void phy_start(struct phy_device *phydev) in phy_start() argument
1139 mutex_lock(&phydev->lock); in phy_start()
1141 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1143 phy_state_to_str(phydev->state)); in phy_start()
1147 if (phydev->sfp_bus) in phy_start()
1148 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1151 __phy_resume(phydev); in phy_start()
1153 phydev->state = PHY_UP; in phy_start()
1155 phy_start_machine(phydev); in phy_start()
1157 mutex_unlock(&phydev->lock); in phy_start()
1168 struct phy_device *phydev = in phy_state_machine() local
1170 struct net_device *dev = phydev->attached_dev; in phy_state_machine()
1176 mutex_lock(&phydev->lock); in phy_state_machine()
1178 old_state = phydev->state; in phy_state_machine()
1180 switch (phydev->state) { in phy_state_machine()
1190 err = phy_check_link_status(phydev); in phy_state_machine()
1193 err = phydev->drv->cable_test_get_status(phydev, &finished); in phy_state_machine()
1195 phy_abort_cable_test(phydev); in phy_state_machine()
1198 phydev->state = PHY_UP; in phy_state_machine()
1203 ethnl_cable_test_finished(phydev); in phy_state_machine()
1206 phydev->state = PHY_UP; in phy_state_machine()
1210 if (phydev->link) { in phy_state_machine()
1211 phydev->link = 0; in phy_state_machine()
1212 phy_link_down(phydev); in phy_state_machine()
1218 mutex_unlock(&phydev->lock); in phy_state_machine()
1221 err = phy_start_aneg(phydev); in phy_state_machine()
1223 phy_suspend(phydev); in phy_state_machine()
1229 phy_error(phydev); in phy_state_machine()
1231 if (old_state != phydev->state) { in phy_state_machine()
1232 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_state_machine()
1234 phy_state_to_str(phydev->state)); in phy_state_machine()
1235 if (phydev->drv && phydev->drv->link_change_notify) in phy_state_machine()
1236 phydev->drv->link_change_notify(phydev); in phy_state_machine()
1247 mutex_lock(&phydev->lock); in phy_state_machine()
1248 if (phy_polling_mode(phydev) && phy_is_started(phydev)) in phy_state_machine()
1249 phy_queue_state_machine(phydev, PHY_STATE_TIME); in phy_state_machine()
1250 mutex_unlock(&phydev->lock); in phy_state_machine()
1260 void phy_mac_interrupt(struct phy_device *phydev) in phy_mac_interrupt() argument
1263 phy_trigger_machine(phydev); in phy_mac_interrupt()
1301 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1303 if (!phydev->drv) in phy_init_eee()
1308 if (phydev->duplex == DUPLEX_FULL) { in phy_init_eee()
1317 status = phy_read_status(phydev); in phy_init_eee()
1322 eee_cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_init_eee()
1333 eee_lp = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_init_eee()
1337 eee_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_init_eee()
1345 if (!phy_check_valid(phydev->speed, phydev->duplex, common)) in phy_init_eee()
1352 phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, in phy_init_eee()
1369 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1371 if (!phydev->drv) in phy_get_eee_err()
1374 return phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR); in phy_get_eee_err()
1386 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1390 if (!phydev->drv) in phy_ethtool_get_eee()
1394 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_get_eee()
1400 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_get_eee()
1407 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_ethtool_get_eee()
1425 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1429 if (!phydev->drv) in phy_ethtool_set_eee()
1433 cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_set_eee()
1437 old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_set_eee()
1445 adv &= ~phydev->eee_broken_modes; in phy_ethtool_set_eee()
1449 ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); in phy_ethtool_set_eee()
1456 if (phydev->autoneg == AUTONEG_ENABLE) { in phy_ethtool_set_eee()
1457 ret = phy_restart_aneg(phydev); in phy_ethtool_set_eee()
1473 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1475 if (phydev->drv && phydev->drv->set_wol) in phy_ethtool_set_wol()
1476 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1488 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1490 if (phydev->drv && phydev->drv->get_wol) in phy_ethtool_get_wol()
1491 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
1498 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings() local
1500 if (!phydev) in phy_ethtool_get_link_ksettings()
1503 phy_ethtool_ksettings_get(phydev, cmd); in phy_ethtool_get_link_ksettings()
1512 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings() local
1514 if (!phydev) in phy_ethtool_set_link_ksettings()
1517 return phy_ethtool_ksettings_set(phydev, cmd); in phy_ethtool_set_link_ksettings()
1527 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset() local
1529 if (!phydev) in phy_ethtool_nway_reset()
1532 if (!phydev->drv) in phy_ethtool_nway_reset()
1535 return phy_restart_aneg(phydev); in phy_ethtool_nway_reset()