Lines Matching +full:link +full:- +full:trigger +full:- +full:order +full:- +full:stop
1 // SPDX-License-Identifier: GPL-2.0+
39 #include "phylib-internal.h"
40 #include "phy-caps.h"
67 if (old_state != phydev->state) { in phy_process_state_change()
68 phydev_dbg(phydev, "PHY state change %s -> %s\n", in phy_process_state_change()
70 phy_state_to_str(phydev->state)); in phy_process_state_change()
71 if (phydev->drv && phydev->drv->link_change_notify) in phy_process_state_change()
72 phydev->drv->link_change_notify(phydev); in phy_process_state_change()
78 phydev->phy_link_change(phydev, true); in phy_link_up()
84 phydev->phy_link_change(phydev, false); in phy_link_down()
86 WRITE_ONCE(phydev->link_down_events, phydev->link_down_events + 1); in phy_link_down()
93 if (phydev->autoneg == AUTONEG_DISABLE) in phy_pause_str()
97 phydev->advertising); in phy_pause_str()
99 phydev->advertising); in phy_pause_str()
101 if (local_pause && phydev->pause) in phy_pause_str()
104 if (local_asym_pause && phydev->asym_pause) { in phy_pause_str()
107 if (phydev->pause) in phy_pause_str()
116 * phy_print_status - Convenience function to print out the current phy status
121 if (phydev->link) { in phy_print_status()
122 netdev_info(phydev->attached_dev, in phy_print_status()
123 "Link is Up - %s/%s %s- flow control %s\n", in phy_print_status()
124 phy_speed_to_str(phydev->speed), in phy_print_status()
125 phy_duplex_to_str(phydev->duplex), in phy_print_status()
126 phydev->downshifted_rate ? "(downshifted) " : "", in phy_print_status()
129 netdev_info(phydev->attached_dev, "Link is Down\n"); in phy_print_status()
135 * phy_get_rate_matching - determine if rate matching is supported
151 if (phydev->drv->get_rate_matching) { in phy_get_rate_matching()
152 mutex_lock(&phydev->lock); in phy_get_rate_matching()
153 ret = phydev->drv->get_rate_matching(phydev, iface); in phy_get_rate_matching()
154 mutex_unlock(&phydev->lock); in phy_get_rate_matching()
162 * phy_config_interrupt - configure the PHY device for the requested interrupts
170 phydev->interrupts = interrupts ? 1 : 0; in phy_config_interrupt()
171 if (phydev->drv->config_intr) in phy_config_interrupt()
172 return phydev->drv->config_intr(phydev); in phy_config_interrupt()
178 * phy_restart_aneg - restart auto-negotiation
188 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_restart_aneg()
198 * phy_aneg_done - return auto-negotiation status
201 * Description: Return the auto-negotiation status from this @phydev
202 * Returns > 0 on success or < 0 on error. 0 means that auto-negotiation
207 if (phydev->drv && phydev->drv->aneg_done) in phy_aneg_done()
208 return phydev->drv->aneg_done(phydev); in phy_aneg_done()
209 else if (phydev->is_c45) in phy_aneg_done()
217 * phy_supported_speeds - return all speeds currently supported by a phy device
230 return phy_caps_speeds(speeds, size, phy->supported); in phy_supported_speeds()
234 * phy_check_valid - check if there is a valid PHY setting which matches
249 * phy_sanitize_settings - make sure the PHY is set to supported speed and duplex
253 * duplexes. Drop down by one in this order: 1000/FULL,
260 c = phy_caps_lookup(phydev->speed, phydev->duplex, phydev->supported, in phy_sanitize_settings()
264 phydev->speed = c->speed; in phy_sanitize_settings()
265 phydev->duplex = c->duplex; in phy_sanitize_settings()
268 phydev->speed = SPEED_UNKNOWN; in phy_sanitize_settings()
269 phydev->duplex = DUPLEX_UNKNOWN; in phy_sanitize_settings()
276 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_get()
277 linkmode_copy(cmd->link_modes.supported, phydev->supported); in phy_ethtool_ksettings_get()
278 linkmode_copy(cmd->link_modes.advertising, phydev->advertising); in phy_ethtool_ksettings_get()
279 linkmode_copy(cmd->link_modes.lp_advertising, phydev->lp_advertising); in phy_ethtool_ksettings_get()
281 cmd->base.speed = phydev->speed; in phy_ethtool_ksettings_get()
282 cmd->base.duplex = phydev->duplex; in phy_ethtool_ksettings_get()
283 cmd->base.master_slave_cfg = phydev->master_slave_get; in phy_ethtool_ksettings_get()
284 cmd->base.master_slave_state = phydev->master_slave_state; in phy_ethtool_ksettings_get()
285 cmd->base.rate_matching = phydev->rate_matching; in phy_ethtool_ksettings_get()
286 if (phydev->interface == PHY_INTERFACE_MODE_MOCA) in phy_ethtool_ksettings_get()
287 cmd->base.port = PORT_BNC; in phy_ethtool_ksettings_get()
289 cmd->base.port = phydev->port; in phy_ethtool_ksettings_get()
290 cmd->base.transceiver = phydev->is_internal ? in phy_ethtool_ksettings_get()
292 cmd->base.phy_address = phydev->mdio.addr; in phy_ethtool_ksettings_get()
293 cmd->base.autoneg = phydev->autoneg; in phy_ethtool_ksettings_get()
294 cmd->base.eth_tp_mdix_ctrl = phydev->mdix_ctrl; in phy_ethtool_ksettings_get()
295 cmd->base.eth_tp_mdix = phydev->mdix; in phy_ethtool_ksettings_get()
296 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_get()
301 * phy_mii_ioctl - generic PHY MII ioctl interface
315 u16 val = mii_data->val_in; in phy_mii_ioctl()
323 mii_data->phy_id = phydev->mdio.addr; in phy_mii_ioctl()
327 if (mdio_phy_id_is_c45(mii_data->phy_id)) { in phy_mii_ioctl()
328 prtad = mdio_phy_id_prtad(mii_data->phy_id); in phy_mii_ioctl()
329 devad = mdio_phy_id_devad(mii_data->phy_id); in phy_mii_ioctl()
330 ret = mdiobus_c45_read(phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
331 mii_data->reg_num); in phy_mii_ioctl()
334 ret = mdiobus_read(phydev->mdio.bus, mii_data->phy_id, in phy_mii_ioctl()
335 mii_data->reg_num); in phy_mii_ioctl()
341 mii_data->val_out = ret; in phy_mii_ioctl()
346 if (mdio_phy_id_is_c45(mii_data->phy_id)) { in phy_mii_ioctl()
347 prtad = mdio_phy_id_prtad(mii_data->phy_id); in phy_mii_ioctl()
348 devad = mdio_phy_id_devad(mii_data->phy_id); in phy_mii_ioctl()
350 prtad = mii_data->phy_id; in phy_mii_ioctl()
351 devad = mii_data->reg_num; in phy_mii_ioctl()
353 if (prtad == phydev->mdio.addr) { in phy_mii_ioctl()
357 if (phydev->autoneg == AUTONEG_ENABLE) in phy_mii_ioctl()
359 phydev->autoneg = AUTONEG_DISABLE; in phy_mii_ioctl()
361 phydev->duplex = DUPLEX_FULL; in phy_mii_ioctl()
363 phydev->duplex = DUPLEX_HALF; in phy_mii_ioctl()
365 phydev->speed = SPEED_1000; in phy_mii_ioctl()
367 phydev->speed = SPEED_100; in phy_mii_ioctl()
368 else phydev->speed = SPEED_10; in phy_mii_ioctl()
370 if (phydev->autoneg == AUTONEG_DISABLE) in phy_mii_ioctl()
372 phydev->autoneg = AUTONEG_ENABLE; in phy_mii_ioctl()
376 mii_adv_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
381 mii_ctrl1000_mod_linkmode_adv_t(phydev->advertising, in phy_mii_ioctl()
391 if (mdio_phy_id_is_c45(mii_data->phy_id)) in phy_mii_ioctl()
392 mdiobus_c45_write(phydev->mdio.bus, prtad, devad, in phy_mii_ioctl()
393 mii_data->reg_num, val); in phy_mii_ioctl()
395 mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phy_mii_ioctl()
397 if (prtad == phydev->mdio.addr && in phy_mii_ioctl()
408 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) { in phy_mii_ioctl()
409 if (copy_from_user(&cfg, ifr->ifr_data, sizeof(cfg))) in phy_mii_ioctl()
410 return -EFAULT; in phy_mii_ioctl()
413 ret = phydev->mii_ts->hwtstamp(phydev->mii_ts, &kernel_cfg, &extack); in phy_mii_ioctl()
418 if (copy_to_user(ifr->ifr_data, &cfg, sizeof(cfg))) in phy_mii_ioctl()
419 return -EFAULT; in phy_mii_ioctl()
426 return -EOPNOTSUPP; in phy_mii_ioctl()
432 * phy_do_ioctl - generic ndo_eth_ioctl implementation
439 if (!dev->phydev) in phy_do_ioctl()
440 return -ENODEV; in phy_do_ioctl()
442 return phy_mii_ioctl(dev->phydev, ifr, cmd); in phy_do_ioctl()
447 * phy_do_ioctl_running - generic ndo_eth_ioctl implementation but test first
459 return -ENODEV; in phy_do_ioctl_running()
466 * __phy_hwtstamp_get - Get hardware timestamping configuration from PHY
477 return -ENODEV; in __phy_hwtstamp_get()
479 return -EOPNOTSUPP; in __phy_hwtstamp_get()
483 * __phy_hwtstamp_set - Modify PHY hardware timestamping configuration
494 return -ENODEV; in __phy_hwtstamp_set()
496 if (phydev->mii_ts && phydev->mii_ts->hwtstamp) in __phy_hwtstamp_set()
497 return phydev->mii_ts->hwtstamp(phydev->mii_ts, config, extack); in __phy_hwtstamp_set()
499 return -EOPNOTSUPP; in __phy_hwtstamp_set()
503 * phy_queue_state_machine - Trigger the state machine to run soon
511 mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, in phy_queue_state_machine()
516 * phy_trigger_machine - Trigger the state machine to run now
538 * phy_ethtool_get_strings - Get the statistic counter names
545 if (!phydev->drv) in phy_ethtool_get_strings()
546 return -EIO; in phy_ethtool_get_strings()
548 mutex_lock(&phydev->lock); in phy_ethtool_get_strings()
549 phydev->drv->get_strings(phydev, data); in phy_ethtool_get_strings()
550 mutex_unlock(&phydev->lock); in phy_ethtool_get_strings()
557 * phy_ethtool_get_sset_count - Get the number of statistic counters
565 if (!phydev->drv) in phy_ethtool_get_sset_count()
566 return -EIO; in phy_ethtool_get_sset_count()
568 if (phydev->drv->get_sset_count && in phy_ethtool_get_sset_count()
569 phydev->drv->get_strings && in phy_ethtool_get_sset_count()
570 phydev->drv->get_stats) { in phy_ethtool_get_sset_count()
571 mutex_lock(&phydev->lock); in phy_ethtool_get_sset_count()
572 ret = phydev->drv->get_sset_count(phydev); in phy_ethtool_get_sset_count()
573 mutex_unlock(&phydev->lock); in phy_ethtool_get_sset_count()
578 return -EOPNOTSUPP; in phy_ethtool_get_sset_count()
583 * phy_ethtool_get_stats - Get the statistic counters
592 if (!phydev->drv) in phy_ethtool_get_stats()
593 return -EIO; in phy_ethtool_get_stats()
595 mutex_lock(&phydev->lock); in phy_ethtool_get_stats()
596 phydev->drv->get_stats(phydev, stats, data); in phy_ethtool_get_stats()
597 mutex_unlock(&phydev->lock); in phy_ethtool_get_stats()
604 * __phy_ethtool_get_phy_stats - Retrieve standardized PHY statistics
609 * Fetches PHY statistics using a kernel-defined interface for consistent
617 if (!phydev->drv || !phydev->drv->get_phy_stats) in __phy_ethtool_get_phy_stats()
620 mutex_lock(&phydev->lock); in __phy_ethtool_get_phy_stats()
621 phydev->drv->get_phy_stats(phydev, phy_stats, phydev_stats); in __phy_ethtool_get_phy_stats()
622 mutex_unlock(&phydev->lock); in __phy_ethtool_get_phy_stats()
626 * __phy_ethtool_get_link_ext_stats - Retrieve extended link statistics for a PHY
628 * @link_stats: Pointer to the structure to store extended link statistics
630 * Populates the ethtool_link_ext_stats structure with link down event counts
631 * and additional driver-specific link statistics, if available.
636 link_stats->link_down_events = READ_ONCE(phydev->link_down_events); in __phy_ethtool_get_link_ext_stats()
638 if (!phydev->drv || !phydev->drv->get_link_stats) in __phy_ethtool_get_link_ext_stats()
641 mutex_lock(&phydev->lock); in __phy_ethtool_get_link_ext_stats()
642 phydev->drv->get_link_stats(phydev, link_stats); in __phy_ethtool_get_link_ext_stats()
643 mutex_unlock(&phydev->lock); in __phy_ethtool_get_link_ext_stats()
647 * phy_ethtool_get_plca_cfg - Get PLCA RS configuration
659 if (!phydev->drv) { in phy_ethtool_get_plca_cfg()
660 ret = -EIO; in phy_ethtool_get_plca_cfg()
664 if (!phydev->drv->get_plca_cfg) { in phy_ethtool_get_plca_cfg()
665 ret = -EOPNOTSUPP; in phy_ethtool_get_plca_cfg()
669 mutex_lock(&phydev->lock); in phy_ethtool_get_plca_cfg()
670 ret = phydev->drv->get_plca_cfg(phydev, plca_cfg); in phy_ethtool_get_plca_cfg()
672 mutex_unlock(&phydev->lock); in phy_ethtool_get_plca_cfg()
678 * plca_check_valid - Check PLCA configuration before enabling
694 phydev->advertising)) { in plca_check_valid()
695 ret = -EOPNOTSUPP; in plca_check_valid()
697 "Point to Multi-Point mode is not enabled"); in plca_check_valid()
698 } else if (plca_cfg->node_id >= 255) { in plca_check_valid()
700 ret = -EINVAL; in plca_check_valid()
707 * phy_ethtool_set_plca_cfg - Set PLCA RS configuration
722 if (!phydev->drv) { in phy_ethtool_set_plca_cfg()
723 ret = -EIO; in phy_ethtool_set_plca_cfg()
727 if (!phydev->drv->set_plca_cfg || in phy_ethtool_set_plca_cfg()
728 !phydev->drv->get_plca_cfg) { in phy_ethtool_set_plca_cfg()
729 ret = -EOPNOTSUPP; in phy_ethtool_set_plca_cfg()
735 ret = -ENOMEM; in phy_ethtool_set_plca_cfg()
739 mutex_lock(&phydev->lock); in phy_ethtool_set_plca_cfg()
741 ret = phydev->drv->get_plca_cfg(phydev, curr_plca_cfg); in phy_ethtool_set_plca_cfg()
745 if (curr_plca_cfg->enabled < 0 && plca_cfg->enabled >= 0) { in phy_ethtool_set_plca_cfg()
748 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
752 if (curr_plca_cfg->node_id < 0 && plca_cfg->node_id >= 0) { in phy_ethtool_set_plca_cfg()
755 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
759 if (curr_plca_cfg->node_cnt < 0 && plca_cfg->node_cnt >= 0) { in phy_ethtool_set_plca_cfg()
762 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
766 if (curr_plca_cfg->to_tmr < 0 && plca_cfg->to_tmr >= 0) { in phy_ethtool_set_plca_cfg()
769 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
773 if (curr_plca_cfg->burst_cnt < 0 && plca_cfg->burst_cnt >= 0) { in phy_ethtool_set_plca_cfg()
776 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
780 if (curr_plca_cfg->burst_tmr < 0 && plca_cfg->burst_tmr >= 0) { in phy_ethtool_set_plca_cfg()
783 ret = -EINVAL; in phy_ethtool_set_plca_cfg()
788 if (plca_cfg->enabled > 0) { in phy_ethtool_set_plca_cfg()
790 if (plca_cfg->node_id >= 0) in phy_ethtool_set_plca_cfg()
791 curr_plca_cfg->node_id = plca_cfg->node_id; in phy_ethtool_set_plca_cfg()
798 ret = phydev->drv->set_plca_cfg(phydev, plca_cfg); in phy_ethtool_set_plca_cfg()
802 mutex_unlock(&phydev->lock); in phy_ethtool_set_plca_cfg()
808 * phy_ethtool_get_plca_status - Get PLCA RS status information
820 if (!phydev->drv) { in phy_ethtool_get_plca_status()
821 ret = -EIO; in phy_ethtool_get_plca_status()
825 if (!phydev->drv->get_plca_status) { in phy_ethtool_get_plca_status()
826 ret = -EOPNOTSUPP; in phy_ethtool_get_plca_status()
830 mutex_lock(&phydev->lock); in phy_ethtool_get_plca_status()
831 ret = phydev->drv->get_plca_status(phydev, plca_st); in phy_ethtool_get_plca_status()
833 mutex_unlock(&phydev->lock); in phy_ethtool_get_plca_status()
839 * phy_start_cable_test - Start a cable test
847 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test()
848 int err = -ENOMEM; in phy_start_cable_test()
850 if (!(phydev->drv && in phy_start_cable_test()
851 phydev->drv->cable_test_start && in phy_start_cable_test()
852 phydev->drv->cable_test_get_status)) { in phy_start_cable_test()
855 return -EOPNOTSUPP; in phy_start_cable_test()
858 mutex_lock(&phydev->lock); in phy_start_cable_test()
859 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test()
862 err = -EBUSY; in phy_start_cable_test()
866 if (phydev->state < PHY_UP || in phy_start_cable_test()
867 phydev->state > PHY_CABLETEST) { in phy_start_cable_test()
870 err = -EBUSY; in phy_start_cable_test()
882 err = phydev->drv->cable_test_start(phydev); in phy_start_cable_test()
889 phydev->state = PHY_CABLETEST; in phy_start_cable_test()
894 mutex_unlock(&phydev->lock); in phy_start_cable_test()
901 mutex_unlock(&phydev->lock); in phy_start_cable_test()
908 * phy_start_cable_test_tdr - Start a raw TDR cable test
918 struct net_device *dev = phydev->attached_dev; in phy_start_cable_test_tdr()
919 int err = -ENOMEM; in phy_start_cable_test_tdr()
921 if (!(phydev->drv && in phy_start_cable_test_tdr()
922 phydev->drv->cable_test_tdr_start && in phy_start_cable_test_tdr()
923 phydev->drv->cable_test_get_status)) { in phy_start_cable_test_tdr()
926 return -EOPNOTSUPP; in phy_start_cable_test_tdr()
929 mutex_lock(&phydev->lock); in phy_start_cable_test_tdr()
930 if (phydev->state == PHY_CABLETEST) { in phy_start_cable_test_tdr()
933 err = -EBUSY; in phy_start_cable_test_tdr()
937 if (phydev->state < PHY_UP || in phy_start_cable_test_tdr()
938 phydev->state > PHY_CABLETEST) { in phy_start_cable_test_tdr()
941 err = -EBUSY; in phy_start_cable_test_tdr()
953 err = phydev->drv->cable_test_tdr_start(phydev, config); in phy_start_cable_test_tdr()
960 phydev->state = PHY_CABLETEST; in phy_start_cable_test_tdr()
965 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
972 mutex_unlock(&phydev->lock); in phy_start_cable_test_tdr()
980 if (phydev->drv->config_aneg) in phy_config_aneg()
981 return phydev->drv->config_aneg(phydev); in phy_config_aneg()
986 if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0))) in phy_config_aneg()
994 * phy_check_link_status - check link status and set state accordingly
997 * Description: Check for link and whether autoneg was triggered / is running
1004 lockdep_assert_held(&phydev->lock); in phy_check_link_status()
1007 * report that Link is Down when loopback is enabled. in phy_check_link_status()
1009 if (phydev->loopback_enabled) in phy_check_link_status()
1016 if (phydev->link && phydev->state != PHY_RUNNING) { in phy_check_link_status()
1018 phydev->state = PHY_RUNNING; in phy_check_link_status()
1020 phydev->eee_active = err > 0; in phy_check_link_status()
1021 phydev->enable_tx_lpi = phydev->eee_cfg.tx_lpi_enabled && in phy_check_link_status()
1022 phydev->eee_active; in phy_check_link_status()
1025 } else if (!phydev->link && phydev->state != PHY_NOLINK) { in phy_check_link_status()
1026 phydev->state = PHY_NOLINK; in phy_check_link_status()
1027 phydev->eee_active = false; in phy_check_link_status()
1028 phydev->enable_tx_lpi = false; in phy_check_link_status()
1036 * phy_inband_caps - query which in-band signalling modes are supported
1040 * Returns zero if it is unknown what in-band signalling is supported by the
1049 if (phydev->drv && phydev->drv->inband_caps) in phy_inband_caps()
1050 return phydev->drv->inband_caps(phydev, interface); in phy_inband_caps()
1057 * phy_config_inband - configure the desired PHY in-band mode
1059 * @modes: in-band modes to configure
1061 * Description: disables, enables or enables-with-bypass in-band signalling
1073 return -EINVAL; in phy_config_inband()
1075 mutex_lock(&phydev->lock); in phy_config_inband()
1076 if (!phydev->drv) in phy_config_inband()
1077 err = -EIO; in phy_config_inband()
1078 else if (!phydev->drv->config_inband) in phy_config_inband()
1079 err = -EOPNOTSUPP; in phy_config_inband()
1081 err = phydev->drv->config_inband(phydev, modes); in phy_config_inband()
1082 mutex_unlock(&phydev->lock); in phy_config_inband()
1089 * _phy_start_aneg - start auto-negotiation for this PHY device
1095 * reflect the beginning of Auto-negotiation or forcing.
1101 lockdep_assert_held(&phydev->lock); in _phy_start_aneg()
1103 if (!phydev->drv) in _phy_start_aneg()
1104 return -EIO; in _phy_start_aneg()
1106 if (AUTONEG_DISABLE == phydev->autoneg) in _phy_start_aneg()
1121 * phy_start_aneg - start auto-negotiation for this PHY device
1127 * reflect the beginning of Auto-negotiation or forcing.
1133 mutex_lock(&phydev->lock); in phy_start_aneg()
1135 mutex_unlock(&phydev->lock); in phy_start_aneg()
1149 } while (!ret && --retries); in phy_poll_aneg_done()
1152 return -ETIMEDOUT; in phy_poll_aneg_done()
1161 u8 autoneg = cmd->base.autoneg; in phy_ethtool_ksettings_set()
1162 u8 duplex = cmd->base.duplex; in phy_ethtool_ksettings_set()
1163 u32 speed = cmd->base.speed; in phy_ethtool_ksettings_set()
1165 if (cmd->base.phy_address != phydev->mdio.addr) in phy_ethtool_ksettings_set()
1166 return -EINVAL; in phy_ethtool_ksettings_set()
1168 linkmode_copy(advertising, cmd->link_modes.advertising); in phy_ethtool_ksettings_set()
1171 linkmode_and(advertising, advertising, phydev->supported); in phy_ethtool_ksettings_set()
1175 return -EINVAL; in phy_ethtool_ksettings_set()
1180 phydev->supported))) in phy_ethtool_ksettings_set()
1181 return -EINVAL; in phy_ethtool_ksettings_set()
1189 return -EINVAL; in phy_ethtool_ksettings_set()
1191 mutex_lock(&phydev->lock); in phy_ethtool_ksettings_set()
1192 phydev->autoneg = autoneg; in phy_ethtool_ksettings_set()
1195 phydev->speed = speed; in phy_ethtool_ksettings_set()
1196 phydev->duplex = duplex; in phy_ethtool_ksettings_set()
1199 linkmode_copy(phydev->advertising, advertising); in phy_ethtool_ksettings_set()
1202 phydev->advertising, autoneg == AUTONEG_ENABLE); in phy_ethtool_ksettings_set()
1204 phydev->master_slave_set = cmd->base.master_slave_cfg; in phy_ethtool_ksettings_set()
1205 phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; in phy_ethtool_ksettings_set()
1209 phydev->state = PHY_UP; in phy_ethtool_ksettings_set()
1215 mutex_unlock(&phydev->lock); in phy_ethtool_ksettings_set()
1221 * phy_speed_down - set speed to lowest speed supported by both link partners
1238 mutex_lock(&phydev->lock); in phy_speed_down()
1240 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_down()
1243 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_down()
1249 linkmode_copy(phydev->adv_old, adv_tmp); in phy_speed_down()
1251 if (linkmode_equal(phydev->advertising, adv_tmp)) { in phy_speed_down()
1262 mutex_unlock(&phydev->lock); in phy_speed_down()
1269 * phy_speed_up - (re)set advertised speeds to all supported speeds
1279 mutex_lock(&phydev->lock); in phy_speed_up()
1281 if (phydev->autoneg != AUTONEG_ENABLE) in phy_speed_up()
1284 if (linkmode_empty(phydev->adv_old)) in phy_speed_up()
1287 linkmode_copy(adv_tmp, phydev->advertising); in phy_speed_up()
1288 linkmode_copy(phydev->advertising, phydev->adv_old); in phy_speed_up()
1289 linkmode_zero(phydev->adv_old); in phy_speed_up()
1291 if (linkmode_equal(phydev->advertising, adv_tmp)) in phy_speed_up()
1296 mutex_unlock(&phydev->lock); in phy_speed_up()
1303 * phy_start_machine - start PHY state machine tracking
1319 * phy_stop_machine - stop the PHY state machine tracking
1328 cancel_delayed_work_sync(&phydev->state_queue); in phy_stop_machine()
1330 mutex_lock(&phydev->lock); in phy_stop_machine()
1332 phydev->state = PHY_UP; in phy_stop_machine()
1333 mutex_unlock(&phydev->lock); in phy_stop_machine()
1338 /* phydev->lock must be held for the state change to be safe */ in phy_process_error()
1339 if (!mutex_is_locked(&phydev->lock)) in phy_process_error()
1340 phydev_err(phydev, "PHY-device data unsafe context\n"); in phy_process_error()
1342 phydev->state = PHY_ERROR; in phy_process_error()
1355 * phy_error - enter ERROR state for this PHY device
1359 * or write error, and tells the controller the link is down.
1360 * Must be called with phydev->lock held.
1370 * phy_disable_interrupts - Disable the PHY interrupts from the PHY side
1380 * phy_interrupt - PHY interrupt handler
1394 if (IS_ENABLED(CONFIG_PM_SLEEP) && phydev->irq_suspended) { in phy_interrupt()
1395 struct net_device *netdev = phydev->attached_dev; in phy_interrupt()
1398 struct device *parent = netdev->dev.parent; in phy_interrupt()
1400 if (netdev->ethtool->wol_enabled) in phy_interrupt()
1402 else if (device_may_wakeup(&netdev->dev)) in phy_interrupt()
1403 pm_wakeup_dev_event(&netdev->dev, 0, true); in phy_interrupt()
1408 phydev->irq_rerun = 1; in phy_interrupt()
1413 mutex_lock(&phydev->lock); in phy_interrupt()
1414 ret = phydev->drv->handle_interrupt(phydev); in phy_interrupt()
1415 mutex_unlock(&phydev->lock); in phy_interrupt()
1421 * phy_enable_interrupts - Enable the interrupts from the PHY side
1430 * phy_update_stats - Update PHY device statistics if supported.
1440 if (!phydev->drv->update_stats) in phy_update_stats()
1443 return phydev->drv->update_stats(phydev); in phy_update_stats()
1447 * phy_request_interrupt - request and enable interrupt for a PHY device
1458 err = request_threaded_irq(phydev->irq, NULL, phy_interrupt, in phy_request_interrupt()
1463 err, phydev->irq); in phy_request_interrupt()
1464 phydev->irq = PHY_POLL; in phy_request_interrupt()
1469 phydev->irq = PHY_POLL; in phy_request_interrupt()
1476 * phy_free_interrupt - disable and free interrupt for a PHY device
1485 free_irq(phydev->irq, phydev); in phy_free_interrupt()
1490 * phy_get_next_update_time - Determine the next PHY update time
1501 if (phydev->drv && phydev->drv->get_next_update_time) in phy_get_next_update_time()
1502 return phydev->drv->get_next_update_time(phydev); in phy_get_next_update_time()
1516 struct net_device *dev = phydev->attached_dev; in _phy_state_machine()
1517 enum phy_state old_state = phydev->state; in _phy_state_machine()
1522 switch (phydev->state) { in _phy_state_machine()
1538 err = phydev->drv->cable_test_get_status(phydev, &finished); in _phy_state_machine()
1543 phydev->state = PHY_UP; in _phy_state_machine()
1551 phydev->state = PHY_UP; in _phy_state_machine()
1556 if (phydev->link) { in _phy_state_machine()
1557 phydev->link = 0; in _phy_state_machine()
1569 if (err == -ENODEV) in _phy_state_machine()
1577 /* Only re-schedule a PHY state machine change if we are polling the in _phy_state_machine()
1601 * phy_state_machine - Handle the state machine
1611 mutex_lock(&phydev->lock); in phy_state_machine()
1613 mutex_unlock(&phydev->lock); in phy_state_machine()
1619 * phy_stop - Bring down the PHY link, and stop checking the status
1624 struct net_device *dev = phydev->attached_dev; in phy_stop()
1628 if (!phy_is_started(phydev) && phydev->state != PHY_DOWN && in phy_stop()
1629 phydev->state != PHY_ERROR) { in phy_stop()
1631 phy_state_to_str(phydev->state)); in phy_stop()
1635 mutex_lock(&phydev->lock); in phy_stop()
1636 old_state = phydev->state; in phy_stop()
1638 if (phydev->state == PHY_CABLETEST) { in phy_stop()
1643 if (phydev->sfp_bus) in phy_stop()
1644 sfp_upstream_stop(phydev->sfp_bus); in phy_stop()
1646 phydev->state = PHY_HALTED; in phy_stop()
1650 mutex_unlock(&phydev->lock); in phy_stop()
1663 * phy_start - start or restart a PHY device
1667 * handle PHY-related work. Used during startup to start the
1674 mutex_lock(&phydev->lock); in phy_start()
1676 if (phydev->state != PHY_READY && phydev->state != PHY_HALTED) { in phy_start()
1678 phy_state_to_str(phydev->state)); in phy_start()
1682 if (phydev->sfp_bus) in phy_start()
1683 sfp_upstream_start(phydev->sfp_bus); in phy_start()
1685 /* if phy was suspended, bring the physical link up again */ in phy_start()
1688 phydev->state = PHY_UP; in phy_start()
1692 mutex_unlock(&phydev->lock); in phy_start()
1697 * phy_mac_interrupt - MAC says the link has changed
1698 * @phydev: phy_device struct with changed link
1700 * The MAC layer is able to indicate there has been a change in the PHY link
1701 * status. Trigger the state machine and work a work queue.
1705 /* Trigger a state machine change */ in phy_mac_interrupt()
1711 * phy_loopback - Configure loopback mode of PHY
1716 * Configure loopback mode of PHY and signal link down and link up if speed is
1726 if (!phydev->drv) in phy_loopback()
1727 return -EIO; in phy_loopback()
1729 mutex_lock(&phydev->lock); in phy_loopback()
1731 if (enable && phydev->loopback_enabled) { in phy_loopback()
1732 ret = -EBUSY; in phy_loopback()
1736 if (!enable && !phydev->loopback_enabled) { in phy_loopback()
1737 ret = -EINVAL; in phy_loopback()
1743 * Link up is signaled with a defined speed. If speed changes, in phy_loopback()
1744 * then first link down and after that link up needs to be in phy_loopback()
1747 if (phydev->link && phydev->state == PHY_RUNNING) { in phy_loopback()
1748 /* link is up and signaled */ in phy_loopback()
1749 if (speed && phydev->speed != speed) { in phy_loopback()
1750 /* signal link down and up for new speed */ in phy_loopback()
1751 phydev->link = false; in phy_loopback()
1752 phydev->state = PHY_NOLINK; in phy_loopback()
1758 /* link is not signaled */ in phy_loopback()
1760 /* signal link up for new speed */ in phy_loopback()
1766 if (phydev->drv->set_loopback) in phy_loopback()
1767 ret = phydev->drv->set_loopback(phydev, enable, speed); in phy_loopback()
1773 /* try to restore link if enabling loopback fails */ in phy_loopback()
1774 if (phydev->drv->set_loopback) in phy_loopback()
1775 phydev->drv->set_loopback(phydev, false, 0); in phy_loopback()
1784 phydev->link = true; in phy_loopback()
1785 phydev->state = PHY_RUNNING; in phy_loopback()
1789 phydev->loopback_enabled = enable; in phy_loopback()
1792 mutex_unlock(&phydev->lock); in phy_loopback()
1798 * phy_eee_tx_clock_stop_capable() - indicate whether the MAC can stop tx clock
1802 * state. Returns 1 if the MAC may stop the transmit clock, 0 if the MAC must
1803 * not stop the transmit clock, or negative error.
1818 * phy_eee_rx_clock_stop() - configure PHY receive clock in LPI
1829 /* Configure the PHY to stop receiving xMII in phy_eee_rx_clock_stop()
1839 * phy_init_eee - init and check the EEE feature
1841 * @clk_stop_enable: PHY may stop the clock during LPI
1843 * Description: it checks if the Energy-Efficient Ethernet (EEE)
1845 * and it programs the MMD register 3.0 setting the "Clock stop enable"
1852 if (!phydev->drv) in phy_init_eee()
1853 return -EIO; in phy_init_eee()
1859 return -EPROTONOSUPPORT; in phy_init_eee()
1869 * phy_get_eee_err - report the EEE wake error count
1879 if (!phydev->drv) in phy_get_eee_err()
1880 return -EIO; in phy_get_eee_err()
1882 mutex_lock(&phydev->lock); in phy_get_eee_err()
1884 mutex_unlock(&phydev->lock); in phy_get_eee_err()
1891 * phy_ethtool_get_eee - get EEE supported and status
1902 if (!phydev->drv) in phy_ethtool_get_eee()
1903 return -EIO; in phy_ethtool_get_eee()
1905 mutex_lock(&phydev->lock); in phy_ethtool_get_eee()
1907 eeecfg_to_eee(data, &phydev->eee_cfg); in phy_ethtool_get_eee()
1908 mutex_unlock(&phydev->lock); in phy_ethtool_get_eee()
1915 * phy_ethtool_set_eee_noneg - Adjusts MAC LPI configuration without PHY
1923 * informed of the new LPI settings by cycling the link down and up, which
1933 if (!phydev->link) in phy_ethtool_set_eee_noneg()
1936 enable_tx_lpi = phydev->eee_cfg.tx_lpi_enabled && phydev->eee_active; in phy_ethtool_set_eee_noneg()
1938 if (phydev->enable_tx_lpi != enable_tx_lpi || in phy_ethtool_set_eee_noneg()
1939 phydev->eee_cfg.tx_lpi_timer != old_cfg->tx_lpi_timer) { in phy_ethtool_set_eee_noneg()
1940 phydev->enable_tx_lpi = false; in phy_ethtool_set_eee_noneg()
1941 phydev->link = false; in phy_ethtool_set_eee_noneg()
1943 phydev->enable_tx_lpi = enable_tx_lpi; in phy_ethtool_set_eee_noneg()
1944 phydev->link = true; in phy_ethtool_set_eee_noneg()
1950 * phy_ethtool_set_eee - set EEE supported and status
1961 if (!phydev->drv) in phy_ethtool_set_eee()
1962 return -EIO; in phy_ethtool_set_eee()
1964 mutex_lock(&phydev->lock); in phy_ethtool_set_eee()
1966 old_cfg = phydev->eee_cfg; in phy_ethtool_set_eee()
1967 eee_to_eeecfg(&phydev->eee_cfg, data); in phy_ethtool_set_eee()
1973 phydev->eee_cfg = old_cfg; in phy_ethtool_set_eee()
1975 mutex_unlock(&phydev->lock); in phy_ethtool_set_eee()
1982 * phy_ethtool_set_wol - Configure Wake On LAN
1991 if (phydev->drv && phydev->drv->set_wol) { in phy_ethtool_set_wol()
1992 mutex_lock(&phydev->lock); in phy_ethtool_set_wol()
1993 ret = phydev->drv->set_wol(phydev, wol); in phy_ethtool_set_wol()
1994 mutex_unlock(&phydev->lock); in phy_ethtool_set_wol()
1999 return -EOPNOTSUPP; in phy_ethtool_set_wol()
2004 * phy_ethtool_get_wol - Get the current Wake On LAN configuration
2011 if (phydev->drv && phydev->drv->get_wol) { in phy_ethtool_get_wol()
2012 mutex_lock(&phydev->lock); in phy_ethtool_get_wol()
2013 phydev->drv->get_wol(phydev, wol); in phy_ethtool_get_wol()
2014 mutex_unlock(&phydev->lock); in phy_ethtool_get_wol()
2022 struct phy_device *phydev = ndev->phydev; in phy_ethtool_get_link_ksettings()
2025 return -ENODEV; in phy_ethtool_get_link_ksettings()
2036 struct phy_device *phydev = ndev->phydev; in phy_ethtool_set_link_ksettings()
2039 return -ENODEV; in phy_ethtool_set_link_ksettings()
2046 * phy_ethtool_nway_reset - Restart auto negotiation
2051 struct phy_device *phydev = ndev->phydev; in phy_ethtool_nway_reset()
2055 return -ENODEV; in phy_ethtool_nway_reset()
2057 if (!phydev->drv) in phy_ethtool_nway_reset()
2058 return -EIO; in phy_ethtool_nway_reset()
2060 mutex_lock(&phydev->lock); in phy_ethtool_nway_reset()
2062 mutex_unlock(&phydev->lock); in phy_ethtool_nway_reset()