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
129 if (phydev->drv->ack_interrupt) { in phy_clear_interrupt()
130 mutex_lock(&phydev->lock); in phy_clear_interrupt()
131 ret = phydev->drv->ack_interrupt(phydev); in phy_clear_interrupt()
132 mutex_unlock(&phydev->lock); in phy_clear_interrupt()
140 * @phydev: the phy_device struct
141 * @interrupts: interrupt flags to configure for this @phydev
145 static int phy_config_interrupt(struct phy_device *phydev, bool interrupts) in phy_config_interrupt() argument
147 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
148 if (phydev->drv->config_intr) in phy_config_interrupt()
149 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
156 * @phydev: target phy_device struct
158 * Restart the autonegotiation on @phydev. Returns >= 0 on success or
161 int phy_restart_aneg(struct phy_device *phydev) in phy_restart_aneg() argument
165 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
166 ret = genphy_c45_restart_aneg(phydev); in phy_restart_aneg()
168 ret = genphy_restart_aneg(phydev); in phy_restart_aneg()
176 * @phydev: target phy_device struct
178 * Description: Return the auto-negotiation status from this @phydev
182 int phy_aneg_done(struct phy_device *phydev) in phy_aneg_done() argument
184 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
185 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
186 else if (phydev->is_c45) in phy_aneg_done()
187 return genphy_c45_aneg_done(phydev); in phy_aneg_done()
189 return genphy_aneg_done(phydev); in phy_aneg_done()
246 * @phydev: the target phy_device struct
252 static void phy_sanitize_settings(struct phy_device *phydev) in phy_sanitize_settings() argument
256 setting = phy_find_valid(phydev->speed, phydev->duplex, in phy_sanitize_settings()
257 phydev->supported); in phy_sanitize_settings()
259 phydev->speed = setting->speed; in phy_sanitize_settings()
260 phydev->duplex = setting->duplex; in phy_sanitize_settings()
263 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
264 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
268 void phy_ethtool_ksettings_get(struct phy_device *phydev, in phy_ethtool_ksettings_get() argument
271 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
272 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
273 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
274 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
276 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
277 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
278 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
279 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
280 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
283 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
284 cmd->base.transceiver = phy_is_internal(phydev) ? in phy_ethtool_ksettings_get()
286 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
287 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
288 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
289 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
290 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
296 * @phydev: the phy_device struct
304 int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd) in phy_mii_ioctl() argument
313 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
325 mii_data->val_out = mdiobus_read(phydev->mdio.bus, prtad, in phy_mii_ioctl()
338 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
342 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
344 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
346 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
348 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
350 phydev->speed = SPEED_1000; in phy_mii_ioctl()
352 phydev->speed = SPEED_100; in phy_mii_ioctl()
353 else phydev->speed = SPEED_10; in phy_mii_ioctl()
356 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
358 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
362 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
367 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
377 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
379 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
382 return phy_init_hw(phydev); in phy_mii_ioctl()
385 return phy_start_aneg(phydev); in phy_mii_ioctl()
390 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) in phy_mii_ioctl()
391 return phydev->mii_ts->hwtstamp(phydev->mii_ts, ifr); in phy_mii_ioctl()
408 if (!dev->phydev) in phy_do_ioctl()
411 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
437 * @phydev: the phy_device struct
440 void phy_queue_state_machine(struct phy_device *phydev, unsigned long jiffies) in phy_queue_state_machine() argument
442 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
450 * @phydev: the phy_device struct
452 static void phy_trigger_machine(struct phy_device *phydev) in phy_trigger_machine() argument
454 phy_queue_state_machine(phydev, 0); in phy_trigger_machine()
457 static void phy_abort_cable_test(struct phy_device *phydev) in phy_abort_cable_test() argument
461 ethnl_cable_test_finished(phydev); in phy_abort_cable_test()
463 err = phy_init_hw(phydev); in phy_abort_cable_test()
465 phydev_err(phydev, "Error while aborting cable test"); in phy_abort_cable_test()
471 * @phydev: the phy_device struct
474 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data) in phy_ethtool_get_strings() argument
476 if (!phydev->drv) in phy_ethtool_get_strings()
479 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
480 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
481 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
490 * @phydev: the phy_device struct
492 int phy_ethtool_get_sset_count(struct phy_device *phydev) in phy_ethtool_get_sset_count() argument
496 if (!phydev->drv) in phy_ethtool_get_sset_count()
499 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
500 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
501 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
502 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
503 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
504 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
516 * @phydev: the phy_device struct
520 int phy_ethtool_get_stats(struct phy_device *phydev, in phy_ethtool_get_stats() argument
523 if (!phydev->drv) in phy_ethtool_get_stats()
526 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
527 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
528 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
537 * @phydev: the phy_device struct
540 int phy_start_cable_test(struct phy_device *phydev, in phy_start_cable_test() argument
543 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
546 if (!(phydev->drv && in phy_start_cable_test()
547 phydev->drv->cable_test_start && in phy_start_cable_test()
548 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
554 mutex_lock(&phydev->lock); in phy_start_cable_test()
555 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
562 if (phydev->state < PHY_UP || in phy_start_cable_test()
563 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
570 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_NTF); in phy_start_cable_test()
575 phy_link_down(phydev); in phy_start_cable_test()
578 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
581 phy_link_up(phydev); in phy_start_cable_test()
585 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
587 if (phy_polling_mode(phydev)) in phy_start_cable_test()
588 phy_trigger_machine(phydev); in phy_start_cable_test()
590 mutex_unlock(&phydev->lock); in phy_start_cable_test()
595 ethnl_cable_test_free(phydev); in phy_start_cable_test()
597 mutex_unlock(&phydev->lock); in phy_start_cable_test()
606 * @phydev: the phy_device struct
610 int phy_start_cable_test_tdr(struct phy_device *phydev, in phy_start_cable_test_tdr() argument
614 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
617 if (!(phydev->drv && in phy_start_cable_test_tdr()
618 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
619 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
625 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
626 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
633 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
634 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
641 err = ethnl_cable_test_alloc(phydev, ETHTOOL_MSG_CABLE_TEST_TDR_NTF); in phy_start_cable_test_tdr()
646 phy_link_down(phydev); in phy_start_cable_test_tdr()
649 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
652 phy_link_up(phydev); in phy_start_cable_test_tdr()
656 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
658 if (phy_polling_mode(phydev)) in phy_start_cable_test_tdr()
659 phy_trigger_machine(phydev); in phy_start_cable_test_tdr()
661 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
666 ethnl_cable_test_free(phydev); in phy_start_cable_test_tdr()
668 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
674 static int phy_config_aneg(struct phy_device *phydev) in phy_config_aneg() argument
676 if (phydev->drv->config_aneg) in phy_config_aneg()
677 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
682 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
683 return genphy_c45_config_aneg(phydev); in phy_config_aneg()
685 return genphy_config_aneg(phydev); in phy_config_aneg()
690 * @phydev: the phy_device struct
695 static int phy_check_link_status(struct phy_device *phydev) in phy_check_link_status() argument
699 WARN_ON(!mutex_is_locked(&phydev->lock)); in phy_check_link_status()
704 if (phydev->loopback_enabled) in phy_check_link_status()
707 err = phy_read_status(phydev); in phy_check_link_status()
711 if (phydev->link && phydev->state != PHY_RUNNING) { in phy_check_link_status()
712 phy_check_downshift(phydev); in phy_check_link_status()
713 phydev->state = PHY_RUNNING; in phy_check_link_status()
714 phy_link_up(phydev); in phy_check_link_status()
715 } else if (!phydev->link && phydev->state != PHY_NOLINK) { in phy_check_link_status()
716 phydev->state = PHY_NOLINK; in phy_check_link_status()
717 phy_link_down(phydev); in phy_check_link_status()
725 * @phydev: the phy_device struct
732 static int _phy_start_aneg(struct phy_device *phydev) in _phy_start_aneg() argument
736 lockdep_assert_held(&phydev->lock); in _phy_start_aneg()
738 if (!phydev->drv) in _phy_start_aneg()
741 if (AUTONEG_DISABLE == phydev->autoneg) in _phy_start_aneg()
742 phy_sanitize_settings(phydev); in _phy_start_aneg()
744 err = phy_config_aneg(phydev); in _phy_start_aneg()
748 if (phy_is_started(phydev)) in _phy_start_aneg()
749 err = phy_check_link_status(phydev); in _phy_start_aneg()
756 * @phydev: the phy_device struct
763 int phy_start_aneg(struct phy_device *phydev) in phy_start_aneg() argument
767 mutex_lock(&phydev->lock); in phy_start_aneg()
768 err = _phy_start_aneg(phydev); in phy_start_aneg()
769 mutex_unlock(&phydev->lock); in phy_start_aneg()
775 static int phy_poll_aneg_done(struct phy_device *phydev) in phy_poll_aneg_done() argument
782 ret = phy_aneg_done(phydev); in phy_poll_aneg_done()
791 int phy_ethtool_ksettings_set(struct phy_device *phydev, in phy_ethtool_ksettings_set() argument
799 if (cmd->base.phy_address != phydev->mdio.addr) in phy_ethtool_ksettings_set()
805 linkmode_and(advertising, advertising, phydev->supported); in phy_ethtool_ksettings_set()
822 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_set()
823 phydev->autoneg = autoneg; in phy_ethtool_ksettings_set()
826 phydev->speed = speed; in phy_ethtool_ksettings_set()
827 phydev->duplex = duplex; in phy_ethtool_ksettings_set()
830 linkmode_copy(phydev->advertising, advertising); in phy_ethtool_ksettings_set()
833 phydev->advertising, autoneg == AUTONEG_ENABLE); in phy_ethtool_ksettings_set()
835 phydev->master_slave_set = cmd->base.master_slave_cfg; in phy_ethtool_ksettings_set()
836 phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; in phy_ethtool_ksettings_set()
839 if (phy_is_started(phydev)) { in phy_ethtool_ksettings_set()
840 phydev->state = PHY_UP; in phy_ethtool_ksettings_set()
841 phy_trigger_machine(phydev); in phy_ethtool_ksettings_set()
843 _phy_start_aneg(phydev); in phy_ethtool_ksettings_set()
846 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_set()
853 * @phydev: the phy_device struct
864 int phy_speed_down(struct phy_device *phydev, bool sync) in phy_speed_down() argument
869 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_down()
872 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_down()
874 ret = phy_speed_down_core(phydev); in phy_speed_down()
878 linkmode_copy(phydev->adv_old, adv_tmp); in phy_speed_down()
880 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_down()
883 ret = phy_config_aneg(phydev); in phy_speed_down()
887 return sync ? phy_poll_aneg_done(phydev) : 0; in phy_speed_down()
893 * @phydev: the phy_device struct
897 int phy_speed_up(struct phy_device *phydev) in phy_speed_up() argument
901 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_up()
904 if (linkmode_empty(phydev->adv_old)) in phy_speed_up()
907 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_up()
908 linkmode_copy(phydev->advertising, phydev->adv_old); in phy_speed_up()
909 linkmode_zero(phydev->adv_old); in phy_speed_up()
911 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_up()
914 return phy_config_aneg(phydev); in phy_speed_up()
920 * @phydev: the phy_device struct
928 void phy_start_machine(struct phy_device *phydev) in phy_start_machine() argument
930 phy_trigger_machine(phydev); in phy_start_machine()
936 * @phydev: target phy_device struct
942 void phy_stop_machine(struct phy_device *phydev) in phy_stop_machine() argument
944 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
946 mutex_lock(&phydev->lock); in phy_stop_machine()
947 if (phy_is_started(phydev)) in phy_stop_machine()
948 phydev->state = PHY_UP; in phy_stop_machine()
949 mutex_unlock(&phydev->lock); in phy_stop_machine()
954 * @phydev: target phy_device struct
959 * phydev->lock is held.
961 static void phy_error(struct phy_device *phydev) in phy_error() argument
965 mutex_lock(&phydev->lock); in phy_error()
966 phydev->state = PHY_HALTED; in phy_error()
967 mutex_unlock(&phydev->lock); in phy_error()
969 phy_trigger_machine(phydev); in phy_error()
974 * @phydev: target phy_device struct
976 int phy_disable_interrupts(struct phy_device *phydev) in phy_disable_interrupts() argument
981 err = phy_config_interrupt(phydev, PHY_INTERRUPT_DISABLED); in phy_disable_interrupts()
986 return phy_clear_interrupt(phydev); in phy_disable_interrupts()
991 * @phydev: target phy_device struct
993 static int phy_did_interrupt(struct phy_device *phydev) in phy_did_interrupt() argument
997 mutex_lock(&phydev->lock); in phy_did_interrupt()
998 ret = phydev->drv->did_interrupt(phydev); in phy_did_interrupt()
999 mutex_unlock(&phydev->lock); in phy_did_interrupt()
1006 * @phydev: target phy_device struct
1008 static irqreturn_t phy_handle_interrupt(struct phy_device *phydev) in phy_handle_interrupt() argument
1012 mutex_lock(&phydev->lock); in phy_handle_interrupt()
1013 ret = phydev->drv->handle_interrupt(phydev); in phy_handle_interrupt()
1014 mutex_unlock(&phydev->lock); in phy_handle_interrupt()
1028 struct phy_device *phydev = phy_dat; in phy_interrupt() local
1029 struct phy_driver *drv = phydev->drv; in phy_interrupt()
1032 return phy_handle_interrupt(phydev); in phy_interrupt()
1034 if (drv->did_interrupt && !phy_did_interrupt(phydev)) in phy_interrupt()
1038 phy_trigger_machine(phydev); in phy_interrupt()
1041 if (!drv->did_interrupt && phy_clear_interrupt(phydev)) { in phy_interrupt()
1042 phy_error(phydev); in phy_interrupt()
1051 * @phydev: target phy_device struct
1053 static int phy_enable_interrupts(struct phy_device *phydev) in phy_enable_interrupts() argument
1055 int err = phy_clear_interrupt(phydev); in phy_enable_interrupts()
1060 return phy_config_interrupt(phydev, PHY_INTERRUPT_ENABLED); in phy_enable_interrupts()
1065 * @phydev: target phy_device struct
1071 void phy_request_interrupt(struct phy_device *phydev) in phy_request_interrupt() argument
1075 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1077 phydev_name(phydev), phydev); in phy_request_interrupt()
1079 phydev_warn(phydev, "Error %d requesting IRQ %d, falling back to polling\n", in phy_request_interrupt()
1080 err, phydev->irq); in phy_request_interrupt()
1081 phydev->irq = PHY_POLL; in phy_request_interrupt()
1083 if (phy_enable_interrupts(phydev)) { in phy_request_interrupt()
1084 phydev_warn(phydev, "Can't enable interrupt, falling back to polling\n"); in phy_request_interrupt()
1085 phy_free_interrupt(phydev); in phy_request_interrupt()
1086 phydev->irq = PHY_POLL; in phy_request_interrupt()
1094 * @phydev: target phy_device struct
1099 void phy_free_interrupt(struct phy_device *phydev) in phy_free_interrupt() argument
1101 phy_disable_interrupts(phydev); in phy_free_interrupt()
1102 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1108 * @phydev: target phy_device struct
1110 void phy_stop(struct phy_device *phydev) in phy_stop() argument
1112 struct net_device *dev = phydev->attached_dev; in phy_stop()
1114 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN) { in phy_stop()
1116 phy_state_to_str(phydev->state)); in phy_stop()
1120 mutex_lock(&phydev->lock); in phy_stop()
1122 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1123 phy_abort_cable_test(phydev); in phy_stop()
1127 if (phydev->sfp_bus) in phy_stop()
1128 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1130 phydev->state = PHY_HALTED; in phy_stop()
1132 mutex_unlock(&phydev->lock); in phy_stop()
1134 phy_state_machine(&phydev->state_queue.work); in phy_stop()
1135 phy_stop_machine(phydev); in phy_stop()
1146 * @phydev: target phy_device struct
1154 void phy_start(struct phy_device *phydev) in phy_start() argument
1156 mutex_lock(&phydev->lock); in phy_start()
1158 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1160 phy_state_to_str(phydev->state)); in phy_start()
1164 if (phydev->sfp_bus) in phy_start()
1165 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1168 __phy_resume(phydev); in phy_start()
1170 phydev->state = PHY_UP; in phy_start()
1172 phy_start_machine(phydev); in phy_start()
1174 mutex_unlock(&phydev->lock); in phy_start()
1185 struct phy_device *phydev = in phy_state_machine() local
1187 struct net_device *dev = phydev->attached_dev; in phy_state_machine()
1193 mutex_lock(&phydev->lock); in phy_state_machine()
1195 old_state = phydev->state; in phy_state_machine()
1197 switch (phydev->state) { in phy_state_machine()
1207 err = phy_check_link_status(phydev); in phy_state_machine()
1210 err = phydev->drv->cable_test_get_status(phydev, &finished); in phy_state_machine()
1212 phy_abort_cable_test(phydev); in phy_state_machine()
1215 phydev->state = PHY_UP; in phy_state_machine()
1220 ethnl_cable_test_finished(phydev); in phy_state_machine()
1223 phydev->state = PHY_UP; in phy_state_machine()
1227 if (phydev->link) { in phy_state_machine()
1228 phydev->link = 0; in phy_state_machine()
1229 phy_link_down(phydev); in phy_state_machine()
1235 mutex_unlock(&phydev->lock); in phy_state_machine()
1238 err = phy_start_aneg(phydev); in phy_state_machine()
1240 phy_suspend(phydev); in phy_state_machine()
1243 phy_error(phydev); in phy_state_machine()
1245 if (old_state != phydev->state) { in phy_state_machine()
1246 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_state_machine()
1248 phy_state_to_str(phydev->state)); in phy_state_machine()
1249 if (phydev->drv && phydev->drv->link_change_notify) in phy_state_machine()
1250 phydev->drv->link_change_notify(phydev); in phy_state_machine()
1261 mutex_lock(&phydev->lock); in phy_state_machine()
1262 if (phy_polling_mode(phydev) && phy_is_started(phydev)) in phy_state_machine()
1263 phy_queue_state_machine(phydev, PHY_STATE_TIME); in phy_state_machine()
1264 mutex_unlock(&phydev->lock); in phy_state_machine()
1269 * @phydev: phy_device struct with changed link
1274 void phy_mac_interrupt(struct phy_device *phydev) in phy_mac_interrupt() argument
1277 phy_trigger_machine(phydev); in phy_mac_interrupt()
1307 * @phydev: target phy_device struct
1315 int phy_init_eee(struct phy_device *phydev, bool clk_stop_enable) in phy_init_eee() argument
1317 if (!phydev->drv) in phy_init_eee()
1322 if (phydev->duplex == DUPLEX_FULL) { in phy_init_eee()
1331 status = phy_read_status(phydev); in phy_init_eee()
1336 eee_cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_init_eee()
1347 eee_lp = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_init_eee()
1351 eee_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_init_eee()
1359 if (!phy_check_valid(phydev->speed, phydev->duplex, common)) in phy_init_eee()
1366 phy_set_bits_mmd(phydev, MDIO_MMD_PCS, MDIO_CTRL1, in phy_init_eee()
1378 * @phydev: target phy_device struct
1383 int phy_get_eee_err(struct phy_device *phydev) in phy_get_eee_err() argument
1385 if (!phydev->drv) in phy_get_eee_err()
1388 return phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_WK_ERR); in phy_get_eee_err()
1394 * @phydev: target phy_device struct
1400 int phy_ethtool_get_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_get_eee() argument
1404 if (!phydev->drv) in phy_ethtool_get_eee()
1408 val = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_get_eee()
1414 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_get_eee()
1421 val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE); in phy_ethtool_get_eee()
1434 * @phydev: target phy_device struct
1439 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data) in phy_ethtool_set_eee() argument
1443 if (!phydev->drv) in phy_ethtool_set_eee()
1447 cap = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); in phy_ethtool_set_eee()
1451 old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV); in phy_ethtool_set_eee()
1459 adv &= ~phydev->eee_broken_modes; in phy_ethtool_set_eee()
1463 ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); in phy_ethtool_set_eee()
1470 if (phydev->autoneg == AUTONEG_ENABLE) { in phy_ethtool_set_eee()
1471 ret = phy_restart_aneg(phydev); in phy_ethtool_set_eee()
1484 * @phydev: target phy_device struct
1487 int phy_ethtool_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_set_wol() argument
1489 if (phydev->drv && phydev->drv->set_wol) in phy_ethtool_set_wol()
1490 return phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1499 * @phydev: target phy_device struct
1502 void phy_ethtool_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) in phy_ethtool_get_wol() argument
1504 if (phydev->drv && phydev->drv->get_wol) in phy_ethtool_get_wol()
1505 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
1512 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings() local
1514 if (!phydev) in phy_ethtool_get_link_ksettings()
1517 phy_ethtool_ksettings_get(phydev, cmd); in phy_ethtool_get_link_ksettings()
1526 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings() local
1528 if (!phydev) in phy_ethtool_set_link_ksettings()
1531 return phy_ethtool_ksettings_set(phydev, cmd); in phy_ethtool_set_link_ksettings()
1541 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset() local
1543 if (!phydev) in phy_ethtool_nway_reset()
1546 if (!phydev->drv) in phy_ethtool_nway_reset()
1549 return phy_restart_aneg(phydev); in phy_ethtool_nway_reset()