Lines Matching full:phydev
59 static void phy_process_state_change(struct phy_device *phydev, in phy_process_state_change() argument
62 if (old_state != phydev->state) { in phy_process_state_change()
63 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_process_state_change()
65 phy_state_to_str(phydev->state)); in phy_process_state_change()
66 if (phydev->drv && phydev->drv->link_change_notify) in phy_process_state_change()
67 phydev->drv->link_change_notify(phydev); in phy_process_state_change()
71 static void phy_link_up(struct phy_device *phydev) in phy_link_up() argument
73 phydev->phy_link_change(phydev, true); in phy_link_up()
74 phy_led_trigger_change_speed(phydev); in phy_link_up()
77 static void phy_link_down(struct phy_device *phydev) in phy_link_down() argument
79 phydev->phy_link_change(phydev, false); in phy_link_down()
80 phy_led_trigger_change_speed(phydev); in phy_link_down()
83 static const char *phy_pause_str(struct phy_device *phydev) in phy_pause_str() argument
87 if (phydev->autoneg == AUTONEG_DISABLE) in phy_pause_str()
91 phydev->advertising); in phy_pause_str()
93 phydev->advertising); in phy_pause_str()
95 if (local_pause && phydev->pause) in phy_pause_str()
98 if (local_asym_pause && phydev->asym_pause) { in phy_pause_str()
101 if (phydev->pause) in phy_pause_str()
111 * @phydev: the phy_device struct
113 void phy_print_status(struct phy_device *phydev) in phy_print_status() argument
115 if (phydev->link) { in phy_print_status()
116 netdev_info(phydev->attached_dev, in phy_print_status()
118 phy_speed_to_str(phydev->speed), in phy_print_status()
119 phy_duplex_to_str(phydev->duplex), in phy_print_status()
120 phydev->downshifted_rate ? "(downshifted) " : "", in phy_print_status()
121 phy_pause_str(phydev)); in phy_print_status()
123 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
130 * @phydev: the phy_device struct
132 * If the @phydev driver has an ack_interrupt function, call it to
137 static int phy_clear_interrupt(struct phy_device *phydev) in phy_clear_interrupt() argument
141 if (phydev->drv->ack_interrupt) { in phy_clear_interrupt()
142 mutex_lock(&phydev->lock); in phy_clear_interrupt()
143 ret = phydev->drv->ack_interrupt(phydev); in phy_clear_interrupt()
144 mutex_unlock(&phydev->lock); in phy_clear_interrupt()
152 * @phydev: the phy_device struct
153 * @interrupts: interrupt flags to configure for this @phydev
157 static int phy_config_interrupt(struct phy_device *phydev, bool interrupts) in phy_config_interrupt() argument
159 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
160 if (phydev->drv->config_intr) in phy_config_interrupt()
161 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
168 * @phydev: target phy_device struct
170 * Restart the autonegotiation on @phydev. Returns >= 0 on success or
173 int phy_restart_aneg(struct phy_device *phydev) in phy_restart_aneg() argument
177 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
178 ret = genphy_c45_restart_aneg(phydev); in phy_restart_aneg()
180 ret = genphy_restart_aneg(phydev); in phy_restart_aneg()
188 * @phydev: target phy_device struct
190 * Description: Return the auto-negotiation status from this @phydev
194 int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
196 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
197 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
198 else if (phydev->is_c45) in phy_aneg_done()
199 return genphy_c45_aneg_done(phydev); in phy_aneg_done()
201 return genphy_aneg_done(phydev); in phy_aneg_done()
258 * @phydev: the target phy_device struct
264 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
268 setting = phy_find_valid(phydev->speed, phydev->duplex, in phy_sanitize_settings()
269 phydev->supported); in phy_sanitize_settings()
271 phydev->speed = setting->speed; in phy_sanitize_settings()
272 phydev->duplex = setting->duplex; in phy_sanitize_settings()
275 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
276 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
280 void phy_ethtool_ksettings_get(struct phy_device *phydev, in phy_ethtool_ksettings_get() argument
283 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
284 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
285 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
286 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
288 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
289 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
290 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
291 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
292 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
295 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
296 cmd->base.transceiver = phy_is_internal(phydev) ? in phy_ethtool_ksettings_get()
298 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
299 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
300 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
301 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
302 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
308 * @phydev: the phy_device struct
316 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
325 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
337 mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad, in phy_mii_ioctl()
350 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
354 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
356 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
358 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
360 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
362 phydev->speed = SPEED_1000; in phy_mii_ioctl()
364 phydev->speed = SPEED_100; in phy_mii_ioctl()
365 else phydev->speed = SPEED_10; in phy_mii_ioctl()
368 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
370 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
374 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
379 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
389 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
391 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
394 return phy_init_hw(phydev); in phy_mii_ioctl()
397 return phy_start_aneg(phydev); in phy_mii_ioctl()
402 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) in phy_mii_ioctl()
403 return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr); in phy_mii_ioctl()
420 if (!dev->phydev) in phy_do_ioctl()
423 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
449 * @phydev: the phy_device struct
452 void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies) in phy_queue_state_machine() argument
454 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
462 * @phydev: the phy_device struct
464 static void phy_trigger_machine(struct phy_device *phydev) in phy_trigger_machine() argument
466 phy_queue_state_machine(phydev, 0); in phy_trigger_machine()
469 static void phy_abort_cable_test(struct phy_device *phydev) in phy_abort_cable_test() argument
473 ethnl_cable_test_finished(phydev); in phy_abort_cable_test()
475 err = phy_init_hw(phydev); in phy_abort_cable_test()
477 phydev_err(phydev, "Error while aborting cable test"); in phy_abort_cable_test()
483 * @phydev: the phy_device struct
486 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) in phy_ethtool_get_strings() argument
488 if (!phydev->drv) in phy_ethtool_get_strings()
491 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
492 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
493 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
502 * @phydev: the phy_device struct
504 int phy_ethtool_get_sset_count(struct phy_device *phydev) in phy_ethtool_get_sset_count() argument
508 if (!phydev->drv) in phy_ethtool_get_sset_count()
511 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
512 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
513 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
514 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
515 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
516 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
528 * @phydev: the phy_device struct
532 int phy_ethtool_get_stats(struct phy_device *phydev, in phy_ethtool_get_stats() argument
535 if (!phydev->drv) in phy_ethtool_get_stats()
538 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
539 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
540 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
549 * @phydev: the phy_device struct
552 int phy_start_cable_test(struct phy_device *phydev, in phy_start_cable_test() argument
555 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
558 if (!(phydev->drv && in phy_start_cable_test()
559 phydev->drv->cable_test_start && in phy_start_cable_test()
560 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
566 mutex_lock(&phydev->lock); in phy_start_cable_test()
567 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
574 if (phydev->state < PHY_UP || in phy_start_cable_test()
575 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
582 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF); in phy_start_cable_test()
587 phy_link_down(phydev); in phy_start_cable_test()
590 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
593 phy_link_up(phydev); in phy_start_cable_test()
597 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
599 if (phy_polling_mode(phydev)) in phy_start_cable_test()
600 phy_trigger_machine(phydev); in phy_start_cable_test()
602 mutex_unlock(&phydev->lock); in phy_start_cable_test()
607 ethnl_cable_test_free(phydev); in phy_start_cable_test()
609 mutex_unlock(&phydev->lock); in phy_start_cable_test()
618 * @phydev: the phy_device struct
622 int phy_start_cable_test_tdr(struct phy_device *phydev, in phy_start_cable_test_tdr() argument
626 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
629 if (!(phydev->drv && in phy_start_cable_test_tdr()
630 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
631 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
637 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
638 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
645 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
646 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
653 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_TDR_NTF); in phy_start_cable_test_tdr()
658 phy_link_down(phydev); in phy_start_cable_test_tdr()
661 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
664 phy_link_up(phydev); in phy_start_cable_test_tdr()
668 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
670 if (phy_polling_mode(phydev)) in phy_start_cable_test_tdr()
671 phy_trigger_machine(phydev); in phy_start_cable_test_tdr()
673 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
678 ethnl_cable_test_free(phydev); in phy_start_cable_test_tdr()
680 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
686 static int phy_config_aneg(struct phy_device *phydev) in phy_config_aneg() argument
688 if (phydev->drv->config_aneg) in phy_config_aneg()
689 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
694 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
695 return genphy_c45_config_aneg(phydev); in phy_config_aneg()
697 return genphy_config_aneg(phydev); in phy_config_aneg()
702 * @phydev: the phy_device struct
707 static int phy_check_link_status(struct phy_device *phydev) in phy_check_link_status() argument
711 WARN_ON(!mutex_is_locked(&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()
737 * @phydev: the phy_device struct
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()
768 * @phydev: the phy_device struct
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()
865 * @phydev: the phy_device struct
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()
905 * @phydev: the phy_device struct
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()
932 * @phydev: the phy_device struct
940 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
942 phy_trigger_machine(phydev); in phy_start_machine()
948 * @phydev: target phy_device struct
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()
966 * @phydev: target phy_device struct
971 * phydev->lock is held.
973 static 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()
986 * @phydev: target phy_device struct
988 int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
993 err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
998 return phy_clear_interrupt(phydev); in phy_disable_interrupts()
1003 * @phydev: target phy_device struct
1005 static int phy_did_interrupt(struct phy_device *phydev) in phy_did_interrupt() argument
1009 mutex_lock(&phydev->lock); in phy_did_interrupt()
1010 ret = phydev->drv->did_interrupt(phydev); in phy_did_interrupt()
1011 mutex_unlock(&phydev->lock); in phy_did_interrupt()
1018 * @phydev: target phy_device struct
1020 static irqreturn_t phy_handle_interrupt(struct phy_device *phydev) in phy_handle_interrupt() argument
1024 mutex_lock(&phydev->lock); in phy_handle_interrupt()
1025 ret = phydev->drv->handle_interrupt(phydev); in phy_handle_interrupt()
1026 mutex_unlock(&phydev->lock); in phy_handle_interrupt()
1040 struct phy_device *phydev = phy_dat; in phy_interrupt() local
1041 struct phy_driver *drv = phydev->drv; in phy_interrupt()
1044 return phy_handle_interrupt(phydev); in phy_interrupt()
1046 if (drv->did_interrupt && !phy_did_interrupt(phydev)) in phy_interrupt()
1050 phy_trigger_machine(phydev); in phy_interrupt()
1053 if (!drv->did_interrupt && phy_clear_interrupt(phydev)) { in phy_interrupt()
1054 phy_error(phydev); in phy_interrupt()
1063 * @phydev: target phy_device struct
1065 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
1067 int err = phy_clear_interrupt(phydev); in phy_enable_interrupts()
1072 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
1077 * @phydev: target phy_device struct
1083 void phy_request_interrupt(struct phy_device *phydev) in phy_request_interrupt() argument
1087 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1089 phydev_name(phydev), phydev); in phy_request_interrupt()
1091 phydev_warn(phydev, "Error %d requesting IRQ %d, falling back to polling\n", in phy_request_interrupt()
1092 err, phydev->irq); in phy_request_interrupt()
1093 phydev->irq = PHY_POLL; in phy_request_interrupt()
1095 if (phy_enable_interrupts(phydev)) { in phy_request_interrupt()
1096 phydev_warn(phydev, "Can't enable interrupt, falling back to polling\n"); in phy_request_interrupt()
1097 phy_free_interrupt(phydev); in phy_request_interrupt()
1098 phydev->irq = PHY_POLL; in phy_request_interrupt()
1106 * @phydev: target phy_device struct
1111 void phy_free_interrupt(struct phy_device *phydev) in phy_free_interrupt() argument
1113 phy_disable_interrupts(phydev); in phy_free_interrupt()
1114 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1120 * @phydev: target phy_device struct
1122 void phy_stop(struct phy_device *phydev) in phy_stop() argument
1124 struct net_device *dev = phydev->attached_dev; in phy_stop()
1127 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) { in phy_stop()
1129 phy_state_to_str(phydev->state)); in phy_stop()
1133 mutex_lock(&phydev->lock); in phy_stop()
1134 old_state = phydev->state; in phy_stop()
1136 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1137 phy_abort_cable_test(phydev); in phy_stop()
1141 if (phydev->sfp_bus) in phy_stop()
1142 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1144 phydev->state = PHY_HALTED; in phy_stop()
1145 phy_process_state_change(phydev, old_state); in phy_stop()
1147 mutex_unlock(&phydev->lock); in phy_stop()
1149 phy_state_machine(&phydev->state_queue.work); in phy_stop()
1150 phy_stop_machine(phydev); in phy_stop()
1161 * @phydev: target phy_device struct
1169 void phy_start(struct phy_device *phydev) in phy_start() argument
1171 mutex_lock(&phydev->lock); in phy_start()
1173 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1175 phy_state_to_str(phydev->state)); in phy_start()
1179 if (phydev->sfp_bus) in phy_start()
1180 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1183 __phy_resume(phydev); in phy_start()
1185 phydev->state = PHY_UP; in phy_start()
1187 phy_start_machine(phydev); in phy_start()
1189 mutex_unlock(&phydev->lock); in phy_start()
1200 struct phy_device *phydev = in phy_state_machine() local
1202 struct net_device *dev = phydev->attached_dev; in phy_state_machine()
1208 mutex_lock(&phydev->lock); in phy_state_machine()
1210 old_state = phydev->state; in phy_state_machine()
1212 switch (phydev->state) { in phy_state_machine()
1222 err = phy_check_link_status(phydev); in phy_state_machine()
1225 err = phydev->drv->cable_test_get_status(phydev, &finished); in phy_state_machine()
1227 phy_abort_cable_test(phydev); in phy_state_machine()
1230 phydev->state = PHY_UP; in phy_state_machine()
1235 ethnl_cable_test_finished(phydev); in phy_state_machine()
1238 phydev->state = PHY_UP; in phy_state_machine()
1242 if (phydev->link) { in phy_state_machine()
1243 phydev->link = 0; in phy_state_machine()
1244 phy_link_down(phydev); in phy_state_machine()
1250 mutex_unlock(&phydev->lock); in phy_state_machine()
1253 err = phy_start_aneg(phydev); in phy_state_machine()
1255 phy_suspend(phydev); in phy_state_machine()
1258 phy_error(phydev); in phy_state_machine()
1260 phy_process_state_change(phydev, old_state); in phy_state_machine()
1270 mutex_lock(&phydev->lock); in phy_state_machine()
1271 if (phy_polling_mode(phydev) && phy_is_started(phydev)) in phy_state_machine()
1272 phy_queue_state_machine(phydev, PHY_STATE_TIME); in phy_state_machine()
1273 mutex_unlock(&phydev->lock); in phy_state_machine()
1278 * @phydev: phy_device struct with changed link
1283 void phy_mac_interrupt(struct phy_device *phydev) in phy_mac_interrupt() argument
1286 phy_trigger_machine(phydev); in phy_mac_interrupt()
1316 * @phydev: target phy_device struct
1324 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1326 if (!phydev->drv) in phy_init_eee()
1331 if (phydev->duplex == DUPLEX_FULL) { in phy_init_eee()
1340 status = phy_read_status(phydev); in phy_init_eee()
1345 eee_cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_init_eee()
1356 eee_lp = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_init_eee()
1360 eee_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_init_eee()
1368 if (!phy_check_valid(phydev->speed, phydev->duplex, common)) in phy_init_eee()
1375 phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, in phy_init_eee()
1387 * @phydev: target phy_device struct
1392 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1394 if (!phydev->drv) in phy_get_eee_err()
1397 return phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR); in phy_get_eee_err()
1403 * @phydev: target phy_device struct
1409 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1413 if (!phydev->drv) in phy_ethtool_get_eee()
1417 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_get_eee()
1423 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_get_eee()
1430 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_ethtool_get_eee()
1443 * @phydev: target phy_device struct
1448 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1452 if (!phydev->drv) in phy_ethtool_set_eee()
1456 cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_set_eee()
1460 old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_set_eee()
1468 adv &= ~phydev->eee_broken_modes; in phy_ethtool_set_eee()
1472 ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); in phy_ethtool_set_eee()
1479 if (phydev->autoneg == AUTONEG_ENABLE) { in phy_ethtool_set_eee()
1480 ret = phy_restart_aneg(phydev); in phy_ethtool_set_eee()
1493 * @phydev: target phy_device struct
1496 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1498 if (phydev->drv && phydev->drv->set_wol) in phy_ethtool_set_wol()
1499 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1508 * @phydev: target phy_device struct
1511 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1513 if (phydev->drv && phydev->drv->get_wol) in phy_ethtool_get_wol()
1514 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
1521 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings() local
1523 if (!phydev) in phy_ethtool_get_link_ksettings()
1526 phy_ethtool_ksettings_get(phydev, cmd); in phy_ethtool_get_link_ksettings()
1535 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings() local
1537 if (!phydev) in phy_ethtool_set_link_ksettings()
1540 return phy_ethtool_ksettings_set(phydev, cmd); in phy_ethtool_set_link_ksettings()
1550 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset() local
1552 if (!phydev) in phy_ethtool_nway_reset()
1555 if (!phydev->drv) in phy_ethtool_nway_reset()
1558 return phy_restart_aneg(phydev); in phy_ethtool_nway_reset()