Lines Matching full:phydev
59 static void phy_link_up(struct phy_device *phydev) in phy_link_up() argument
61 phydev->phy_link_change(phydev, true); in phy_link_up()
62 phy_led_trigger_change_speed(phydev); in phy_link_up()
65 static void phy_link_down(struct phy_device *phydev) in phy_link_down() argument
67 phydev->phy_link_change(phydev, false); in phy_link_down()
68 phy_led_trigger_change_speed(phydev); in phy_link_down()
71 static const char *phy_pause_str(struct phy_device *phydev) in phy_pause_str() argument
75 if (phydev->autoneg == AUTONEG_DISABLE) in phy_pause_str()
79 phydev->advertising); in phy_pause_str()
81 phydev->advertising); in phy_pause_str()
83 if (local_pause && phydev->pause) in phy_pause_str()
86 if (local_asym_pause && phydev->asym_pause) { in phy_pause_str()
89 if (phydev->pause) in phy_pause_str()
99 * @phydev: the phy_device struct
101 void phy_print_status(struct phy_device *phydev) in phy_print_status() argument
103 if (phydev->link) { in phy_print_status()
104 netdev_info(phydev->attached_dev, in phy_print_status()
106 phy_speed_to_str(phydev->speed), in phy_print_status()
107 phy_duplex_to_str(phydev->duplex), in phy_print_status()
108 phydev->downshifted_rate ? "(downshifted) " : "", in phy_print_status()
109 phy_pause_str(phydev)); in phy_print_status()
111 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
118 * @phydev: the phy_device struct
120 * If the @phydev driver has an ack_interrupt function, call it to
125 static int phy_clear_interrupt(struct phy_device *phydev) in phy_clear_interrupt() argument
127 if (phydev->drv->ack_interrupt) in phy_clear_interrupt()
128 return phydev->drv->ack_interrupt(phydev); in phy_clear_interrupt()
135 * @phydev: the phy_device struct
136 * @interrupts: interrupt flags to configure for this @phydev
140 static int phy_config_interrupt(struct phy_device *phydev, bool interrupts) in phy_config_interrupt() argument
142 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
143 if (phydev->drv->config_intr) in phy_config_interrupt()
144 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
151 * @phydev: target phy_device struct
153 * Restart the autonegotiation on @phydev. Returns >= 0 on success or
156 int phy_restart_aneg(struct phy_device *phydev) in phy_restart_aneg() argument
160 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
161 ret = genphy_c45_restart_aneg(phydev); in phy_restart_aneg()
163 ret = genphy_restart_aneg(phydev); in phy_restart_aneg()
171 * @phydev: target phy_device struct
173 * Description: Return the auto-negotiation status from this @phydev
177 int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
179 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
180 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
181 else if (phydev->is_c45) in phy_aneg_done()
182 return genphy_c45_aneg_done(phydev); in phy_aneg_done()
184 return genphy_aneg_done(phydev); in phy_aneg_done()
241 * @phydev: the target phy_device struct
247 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
251 setting = phy_find_valid(phydev->speed, phydev->duplex, in phy_sanitize_settings()
252 phydev->supported); in phy_sanitize_settings()
254 phydev->speed = setting->speed; in phy_sanitize_settings()
255 phydev->duplex = setting->duplex; in phy_sanitize_settings()
258 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
259 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
263 void phy_ethtool_ksettings_get(struct phy_device *phydev, in phy_ethtool_ksettings_get() argument
266 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
267 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
268 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
269 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
271 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
272 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
273 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
274 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
275 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
278 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
279 cmd->base.transceiver = phy_is_internal(phydev) ? in phy_ethtool_ksettings_get()
281 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
282 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
283 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
284 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
285 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
291 * @phydev: the phy_device struct
299 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
308 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
320 mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad, in phy_mii_ioctl()
333 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
337 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
339 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
341 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
343 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
345 phydev->speed = SPEED_1000; in phy_mii_ioctl()
347 phydev->speed = SPEED_100; in phy_mii_ioctl()
348 else phydev->speed = SPEED_10; in phy_mii_ioctl()
351 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
353 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
357 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
362 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
372 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
374 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
377 return phy_init_hw(phydev); in phy_mii_ioctl()
380 return phy_start_aneg(phydev); in phy_mii_ioctl()
385 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) in phy_mii_ioctl()
386 return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr); in phy_mii_ioctl()
403 if (!dev->phydev) in phy_do_ioctl()
406 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
432 * @phydev: the phy_device struct
435 void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies) in phy_queue_state_machine() argument
437 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
445 * @phydev: the phy_device struct
447 static void phy_trigger_machine(struct phy_device *phydev) in phy_trigger_machine() argument
449 phy_queue_state_machine(phydev, 0); in phy_trigger_machine()
452 static void phy_abort_cable_test(struct phy_device *phydev) in phy_abort_cable_test() argument
456 ethnl_cable_test_finished(phydev); in phy_abort_cable_test()
458 err = phy_init_hw(phydev); in phy_abort_cable_test()
460 phydev_err(phydev, "Error while aborting cable test"); in phy_abort_cable_test()
466 * @phydev: the phy_device struct
469 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) in phy_ethtool_get_strings() argument
471 if (!phydev->drv) in phy_ethtool_get_strings()
474 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
475 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
476 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
485 * @phydev: the phy_device struct
487 int phy_ethtool_get_sset_count(struct phy_device *phydev) in phy_ethtool_get_sset_count() argument
491 if (!phydev->drv) in phy_ethtool_get_sset_count()
494 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
495 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
496 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
497 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
498 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
499 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
511 * @phydev: the phy_device struct
515 int phy_ethtool_get_stats(struct phy_device *phydev, in phy_ethtool_get_stats() argument
518 if (!phydev->drv) in phy_ethtool_get_stats()
521 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
522 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
523 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
532 * @phydev: the phy_device struct
535 int phy_start_cable_test(struct phy_device *phydev, in phy_start_cable_test() argument
538 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
541 if (!(phydev->drv && in phy_start_cable_test()
542 phydev->drv->cable_test_start && in phy_start_cable_test()
543 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
549 mutex_lock(&phydev->lock); in phy_start_cable_test()
550 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
557 if (phydev->state < PHY_UP || in phy_start_cable_test()
558 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
565 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF); in phy_start_cable_test()
570 phy_link_down(phydev); in phy_start_cable_test()
573 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
576 phy_link_up(phydev); in phy_start_cable_test()
580 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
582 if (phy_polling_mode(phydev)) in phy_start_cable_test()
583 phy_trigger_machine(phydev); in phy_start_cable_test()
585 mutex_unlock(&phydev->lock); in phy_start_cable_test()
590 ethnl_cable_test_free(phydev); in phy_start_cable_test()
592 mutex_unlock(&phydev->lock); in phy_start_cable_test()
601 * @phydev: the phy_device struct
605 int phy_start_cable_test_tdr(struct phy_device *phydev, in phy_start_cable_test_tdr() argument
609 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
612 if (!(phydev->drv && in phy_start_cable_test_tdr()
613 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
614 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
620 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
621 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
628 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
629 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
636 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_TDR_NTF); in phy_start_cable_test_tdr()
641 phy_link_down(phydev); in phy_start_cable_test_tdr()
644 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
647 phy_link_up(phydev); in phy_start_cable_test_tdr()
651 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
653 if (phy_polling_mode(phydev)) in phy_start_cable_test_tdr()
654 phy_trigger_machine(phydev); in phy_start_cable_test_tdr()
656 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
661 ethnl_cable_test_free(phydev); in phy_start_cable_test_tdr()
663 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
669 static int phy_config_aneg(struct phy_device *phydev) in phy_config_aneg() argument
671 if (phydev->drv->config_aneg) in phy_config_aneg()
672 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
677 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
678 return genphy_c45_config_aneg(phydev); in phy_config_aneg()
680 return genphy_config_aneg(phydev); in phy_config_aneg()
685 * @phydev: the phy_device struct
690 static int phy_check_link_status(struct phy_device *phydev) in phy_check_link_status() argument
694 WARN_ON(!mutex_is_locked(&phydev->lock)); in phy_check_link_status()
699 if (phydev->loopback_enabled) in phy_check_link_status()
702 err = phy_read_status(phydev); in phy_check_link_status()
706 if (phydev->link && phydev->state != PHY_RUNNING) { in phy_check_link_status()
707 phy_check_downshift(phydev); in phy_check_link_status()
708 phydev->state = PHY_RUNNING; in phy_check_link_status()
709 phy_link_up(phydev); in phy_check_link_status()
710 } else if (!phydev->link && phydev->state != PHY_NOLINK) { in phy_check_link_status()
711 phydev->state = PHY_NOLINK; in phy_check_link_status()
712 phy_link_down(phydev); in phy_check_link_status()
720 * @phydev: the phy_device struct
727 static int _phy_start_aneg(struct phy_device *phydev) in _phy_start_aneg() argument
731 lockdep_assert_held(&phydev->lock); in _phy_start_aneg()
733 if (!phydev->drv) in _phy_start_aneg()
736 if (AUTONEG_DISABLE == phydev->autoneg) in _phy_start_aneg()
737 phy_sanitize_settings(phydev); in _phy_start_aneg()
739 err = phy_config_aneg(phydev); in _phy_start_aneg()
743 if (phy_is_started(phydev)) in _phy_start_aneg()
744 err = phy_check_link_status(phydev); in _phy_start_aneg()
751 * @phydev: the phy_device struct
758 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
762 mutex_lock(&phydev->lock); in phy_start_aneg()
763 err = _phy_start_aneg(phydev); in phy_start_aneg()
764 mutex_unlock(&phydev->lock); in phy_start_aneg()
770 static int phy_poll_aneg_done(struct phy_device *phydev) in phy_poll_aneg_done() argument
777 ret = phy_aneg_done(phydev); in phy_poll_aneg_done()
786 int phy_ethtool_ksettings_set(struct phy_device *phydev, in phy_ethtool_ksettings_set() argument
794 if (cmd->base.phy_address != phydev->mdio.addr) in phy_ethtool_ksettings_set()
800 linkmode_and(advertising, advertising, phydev->supported); in phy_ethtool_ksettings_set()
817 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_set()
818 phydev->autoneg = autoneg; in phy_ethtool_ksettings_set()
821 phydev->speed = speed; in phy_ethtool_ksettings_set()
822 phydev->duplex = duplex; in phy_ethtool_ksettings_set()
825 linkmode_copy(phydev->advertising, advertising); in phy_ethtool_ksettings_set()
828 phydev->advertising, autoneg == AUTONEG_ENABLE); in phy_ethtool_ksettings_set()
830 phydev->master_slave_set = cmd->base.master_slave_cfg; in phy_ethtool_ksettings_set()
831 phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; in phy_ethtool_ksettings_set()
834 if (phy_is_started(phydev)) { in phy_ethtool_ksettings_set()
835 phydev->state = PHY_UP; in phy_ethtool_ksettings_set()
836 phy_trigger_machine(phydev); in phy_ethtool_ksettings_set()
838 _phy_start_aneg(phydev); in phy_ethtool_ksettings_set()
841 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_set()
848 * @phydev: the phy_device struct
859 int phy_speed_down(struct phy_device *phydev, bool sync) in phy_speed_down() argument
864 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_down()
867 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_down()
869 ret = phy_speed_down_core(phydev); in phy_speed_down()
873 linkmode_copy(phydev->adv_old, adv_tmp); in phy_speed_down()
875 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_down()
878 ret = phy_config_aneg(phydev); in phy_speed_down()
882 return sync ? phy_poll_aneg_done(phydev) : 0; in phy_speed_down()
888 * @phydev: the phy_device struct
892 int phy_speed_up(struct phy_device *phydev) in phy_speed_up() argument
896 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_up()
899 if (linkmode_empty(phydev->adv_old)) in phy_speed_up()
902 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_up()
903 linkmode_copy(phydev->advertising, phydev->adv_old); in phy_speed_up()
904 linkmode_zero(phydev->adv_old); in phy_speed_up()
906 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_up()
909 return phy_config_aneg(phydev); in phy_speed_up()
915 * @phydev: the phy_device struct
923 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
925 phy_trigger_machine(phydev); in phy_start_machine()
931 * @phydev: target phy_device struct
937 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
939 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
941 mutex_lock(&phydev->lock); in phy_stop_machine()
942 if (phy_is_started(phydev)) in phy_stop_machine()
943 phydev->state = PHY_UP; in phy_stop_machine()
944 mutex_unlock(&phydev->lock); in phy_stop_machine()
949 * @phydev: target phy_device struct
954 * phydev->lock is held.
956 static void phy_error(struct phy_device *phydev) in phy_error() argument
960 mutex_lock(&phydev->lock); in phy_error()
961 phydev->state = PHY_HALTED; in phy_error()
962 mutex_unlock(&phydev->lock); in phy_error()
964 phy_trigger_machine(phydev); in phy_error()
969 * @phydev: target phy_device struct
971 int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
976 err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
981 return phy_clear_interrupt(phydev); in phy_disable_interrupts()
993 struct phy_device *phydev = phy_dat; in phy_interrupt() local
994 struct phy_driver *drv = phydev->drv; in phy_interrupt()
997 return drv->handle_interrupt(phydev); in phy_interrupt()
999 if (drv->did_interrupt && !drv->did_interrupt(phydev)) in phy_interrupt()
1003 phy_trigger_machine(phydev); in phy_interrupt()
1006 if (!drv->did_interrupt && phy_clear_interrupt(phydev)) { in phy_interrupt()
1007 phy_error(phydev); in phy_interrupt()
1016 * @phydev: target phy_device struct
1018 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
1020 int err = phy_clear_interrupt(phydev); in phy_enable_interrupts()
1025 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
1030 * @phydev: target phy_device struct
1036 void phy_request_interrupt(struct phy_device *phydev) in phy_request_interrupt() argument
1040 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1042 phydev_name(phydev), phydev); in phy_request_interrupt()
1044 phydev_warn(phydev, "Error %d requesting IRQ %d, falling back to polling\n", in phy_request_interrupt()
1045 err, phydev->irq); in phy_request_interrupt()
1046 phydev->irq = PHY_POLL; in phy_request_interrupt()
1048 if (phy_enable_interrupts(phydev)) { in phy_request_interrupt()
1049 phydev_warn(phydev, "Can't enable interrupt, falling back to polling\n"); in phy_request_interrupt()
1050 phy_free_interrupt(phydev); in phy_request_interrupt()
1051 phydev->irq = PHY_POLL; in phy_request_interrupt()
1059 * @phydev: target phy_device struct
1064 void phy_free_interrupt(struct phy_device *phydev) in phy_free_interrupt() argument
1066 phy_disable_interrupts(phydev); in phy_free_interrupt()
1067 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1073 * @phydev: target phy_device struct
1075 void phy_stop(struct phy_device *phydev) in phy_stop() argument
1077 struct net_device *dev = phydev->attached_dev; in phy_stop()
1079 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) { in phy_stop()
1081 phy_state_to_str(phydev->state)); in phy_stop()
1085 mutex_lock(&phydev->lock); in phy_stop()
1087 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1088 phy_abort_cable_test(phydev); in phy_stop()
1092 if (phydev->sfp_bus) in phy_stop()
1093 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1095 phydev->state = PHY_HALTED; in phy_stop()
1097 mutex_unlock(&phydev->lock); in phy_stop()
1099 phy_state_machine(&phydev->state_queue.work); in phy_stop()
1100 phy_stop_machine(phydev); in phy_stop()
1111 * @phydev: target phy_device struct
1119 void phy_start(struct phy_device *phydev) in phy_start() argument
1121 mutex_lock(&phydev->lock); in phy_start()
1123 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1125 phy_state_to_str(phydev->state)); in phy_start()
1129 if (phydev->sfp_bus) in phy_start()
1130 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1133 __phy_resume(phydev); in phy_start()
1135 phydev->state = PHY_UP; in phy_start()
1137 phy_start_machine(phydev); in phy_start()
1139 mutex_unlock(&phydev->lock); in phy_start()
1150 struct phy_device *phydev = in phy_state_machine() local
1152 struct net_device *dev = phydev->attached_dev; in phy_state_machine()
1158 mutex_lock(&phydev->lock); in phy_state_machine()
1160 old_state = phydev->state; in phy_state_machine()
1162 switch (phydev->state) { in phy_state_machine()
1172 err = phy_check_link_status(phydev); in phy_state_machine()
1175 err = phydev->drv->cable_test_get_status(phydev, &finished); in phy_state_machine()
1177 phy_abort_cable_test(phydev); in phy_state_machine()
1180 phydev->state = PHY_UP; in phy_state_machine()
1185 ethnl_cable_test_finished(phydev); in phy_state_machine()
1188 phydev->state = PHY_UP; in phy_state_machine()
1192 if (phydev->link) { in phy_state_machine()
1193 phydev->link = 0; in phy_state_machine()
1194 phy_link_down(phydev); in phy_state_machine()
1200 mutex_unlock(&phydev->lock); in phy_state_machine()
1203 err = phy_start_aneg(phydev); in phy_state_machine()
1205 phy_suspend(phydev); in phy_state_machine()
1208 phy_error(phydev); in phy_state_machine()
1210 if (old_state != phydev->state) { in phy_state_machine()
1211 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_state_machine()
1213 phy_state_to_str(phydev->state)); in phy_state_machine()
1214 if (phydev->drv && phydev->drv->link_change_notify) in phy_state_machine()
1215 phydev->drv->link_change_notify(phydev); in phy_state_machine()
1226 mutex_lock(&phydev->lock); in phy_state_machine()
1227 if (phy_polling_mode(phydev) && phy_is_started(phydev)) in phy_state_machine()
1228 phy_queue_state_machine(phydev, PHY_STATE_TIME); in phy_state_machine()
1229 mutex_unlock(&phydev->lock); in phy_state_machine()
1234 * @phydev: phy_device struct with changed link
1239 void phy_mac_interrupt(struct phy_device *phydev) in phy_mac_interrupt() argument
1242 phy_trigger_machine(phydev); in phy_mac_interrupt()
1272 * @phydev: target phy_device struct
1280 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1282 if (!phydev->drv) in phy_init_eee()
1287 if (phydev->duplex == DUPLEX_FULL) { in phy_init_eee()
1296 status = phy_read_status(phydev); in phy_init_eee()
1301 eee_cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_init_eee()
1312 eee_lp = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_init_eee()
1316 eee_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_init_eee()
1324 if (!phy_check_valid(phydev->speed, phydev->duplex, common)) in phy_init_eee()
1331 phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, in phy_init_eee()
1343 * @phydev: target phy_device struct
1348 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1350 if (!phydev->drv) in phy_get_eee_err()
1353 return phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR); in phy_get_eee_err()
1359 * @phydev: target phy_device struct
1365 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1369 if (!phydev->drv) in phy_ethtool_get_eee()
1373 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_get_eee()
1379 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_get_eee()
1386 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_ethtool_get_eee()
1399 * @phydev: target phy_device struct
1404 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1408 if (!phydev->drv) in phy_ethtool_set_eee()
1412 cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_set_eee()
1416 old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_set_eee()
1424 adv &= ~phydev->eee_broken_modes; in phy_ethtool_set_eee()
1428 ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); in phy_ethtool_set_eee()
1435 if (phydev->autoneg == AUTONEG_ENABLE) { in phy_ethtool_set_eee()
1436 ret = phy_restart_aneg(phydev); in phy_ethtool_set_eee()
1449 * @phydev: target phy_device struct
1452 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1454 if (phydev->drv && phydev->drv->set_wol) in phy_ethtool_set_wol()
1455 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1464 * @phydev: target phy_device struct
1467 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1469 if (phydev->drv && phydev->drv->get_wol) in phy_ethtool_get_wol()
1470 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
1477 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings() local
1479 if (!phydev) in phy_ethtool_get_link_ksettings()
1482 phy_ethtool_ksettings_get(phydev, cmd); in phy_ethtool_get_link_ksettings()
1491 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings() local
1493 if (!phydev) in phy_ethtool_set_link_ksettings()
1496 return phy_ethtool_ksettings_set(phydev, cmd); in phy_ethtool_set_link_ksettings()
1506 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset() local
1508 if (!phydev) in phy_ethtool_nway_reset()
1511 if (!phydev->drv) in phy_ethtool_nway_reset()
1514 return phy_restart_aneg(phydev); in phy_ethtool_nway_reset()