Lines Matching refs:pl

141 static int phylink_validate(struct phylink *pl, unsigned long *supported,  in phylink_validate()  argument
144 pl->ops->validate(pl->netdev, supported, state); in phylink_validate()
149 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
162 pl->link_config.speed = speed; in phylink_parse_fixedlink()
163 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
166 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
171 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
173 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
180 pl->link_gpio = desc; in phylink_parse_fixedlink()
194 netdev_err(pl->netdev, "broken fixed-link?\n"); in phylink_parse_fixedlink()
201 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
203 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
205 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
207 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
211 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
212 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
213 netdev_warn(pl->netdev, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
214 pl->link_config.speed); in phylink_parse_fixedlink()
216 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
217 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
218 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
220 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
221 pl->supported, in phylink_parse_fixedlink()
223 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
224 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
226 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
228 netdev_warn(pl->netdev, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
229 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
230 pl->link_config.speed); in phylink_parse_fixedlink()
233 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
234 pl->supported); in phylink_parse_fixedlink()
236 pl->link_config.link = 1; in phylink_parse_fixedlink()
237 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
242 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
249 pl->link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
254 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
255 netdev_err(pl->netdev, in phylink_parse_mode()
260 linkmode_zero(pl->supported); in phylink_parse_mode()
261 phylink_set(pl->supported, MII); in phylink_parse_mode()
262 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
263 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
264 phylink_set(pl->supported, Pause); in phylink_parse_mode()
265 pl->link_config.an_enabled = true; in phylink_parse_mode()
266 pl->link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
268 switch (pl->link_config.interface) { in phylink_parse_mode()
270 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
271 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
272 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
273 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
274 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
275 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
279 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
283 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
287 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
288 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
289 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
290 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
291 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
292 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
293 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
294 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
295 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
296 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
297 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
298 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
299 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
303 netdev_err(pl->netdev, in phylink_parse_mode()
305 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
309 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
311 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
312 netdev_err(pl->netdev, in phylink_parse_mode()
321 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
324 netdev_dbg(pl->netdev, in phylink_mac_config()
326 __func__, phylink_an_mode_str(pl->link_an_mode), in phylink_mac_config()
333 pl->ops->mac_config(pl->netdev, pl->link_an_mode, state); in phylink_mac_config()
336 static void phylink_mac_an_restart(struct phylink *pl) in phylink_mac_an_restart() argument
338 if (pl->link_config.an_enabled && in phylink_mac_an_restart()
339 phy_interface_mode_is_8023z(pl->link_config.interface)) in phylink_mac_an_restart()
340 pl->ops->mac_an_restart(pl->netdev); in phylink_mac_an_restart()
343 static int phylink_get_mac_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_mac_state() argument
345 struct net_device *ndev = pl->netdev; in phylink_get_mac_state()
347 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_get_mac_state()
349 state->interface = pl->link_config.interface; in phylink_get_mac_state()
350 state->an_enabled = pl->link_config.an_enabled; in phylink_get_mac_state()
353 return pl->ops->mac_link_state(ndev, state); in phylink_get_mac_state()
359 static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_fixed_state() argument
361 *state = pl->link_config; in phylink_get_fixed_state()
362 if (pl->get_fixed_state) in phylink_get_fixed_state()
363 pl->get_fixed_state(pl->netdev, state); in phylink_get_fixed_state()
364 else if (pl->link_gpio) in phylink_get_fixed_state()
365 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
376 static void phylink_resolve_flow(struct phylink *pl, in phylink_resolve_flow() argument
381 if (pl->link_config.pause & MLO_PAUSE_AN) { in phylink_resolve_flow()
384 if (phylink_test(pl->link_config.advertising, Pause)) in phylink_resolve_flow()
386 if (phylink_test(pl->link_config.advertising, Asym_Pause)) in phylink_resolve_flow()
397 new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK; in phylink_resolve_flow()
420 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
422 struct net_device *ndev = pl->netdev; in phylink_resolve()
424 mutex_lock(&pl->state_mutex); in phylink_resolve()
425 if (pl->phylink_disable_state) { in phylink_resolve()
426 pl->mac_link_dropped = false; in phylink_resolve()
428 } else if (pl->mac_link_dropped) { in phylink_resolve()
431 switch (pl->link_an_mode) { in phylink_resolve()
433 link_state = pl->phy_state; in phylink_resolve()
434 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
435 phylink_mac_config(pl, &link_state); in phylink_resolve()
439 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
440 phylink_mac_config(pl, &link_state); in phylink_resolve()
444 phylink_get_mac_state(pl, &link_state); in phylink_resolve()
445 if (pl->phydev) { in phylink_resolve()
449 pl->phy_state.link; in phylink_resolve()
451 if (pl->phy_state.interface != in phylink_resolve()
453 link_state.interface = pl->phy_state.interface; in phylink_resolve()
461 if (pl->phy_state.link || changed) { in phylink_resolve()
462 link_state.pause |= pl->phy_state.pause; in phylink_resolve()
463 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
465 phylink_mac_config(pl, &link_state); in phylink_resolve()
475 pl->ops->mac_link_down(ndev, pl->link_an_mode, in phylink_resolve()
476 pl->phy_state.interface); in phylink_resolve()
479 pl->ops->mac_link_up(ndev, pl->link_an_mode, in phylink_resolve()
480 pl->phy_state.interface, in phylink_resolve()
481 pl->phydev); in phylink_resolve()
492 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
493 pl->mac_link_dropped = false; in phylink_resolve()
494 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
496 mutex_unlock(&pl->state_mutex); in phylink_resolve()
499 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
501 if (!pl->phylink_disable_state) in phylink_run_resolve()
502 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
507 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
511 phylink_run_resolve(pl); in phylink_fixed_poll()
516 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
531 netdev_err(pl->netdev, "unable to parse \"sfp\" node: %d\n", in phylink_register_sfp()
536 pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl->netdev, pl, in phylink_register_sfp()
538 if (!pl->sfp_bus) in phylink_register_sfp()
563 struct phylink *pl; in phylink_create() local
566 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
567 if (!pl) in phylink_create()
570 mutex_init(&pl->state_mutex); in phylink_create()
571 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
572 pl->netdev = ndev; in phylink_create()
573 pl->phy_state.interface = iface; in phylink_create()
574 pl->link_interface = iface; in phylink_create()
576 pl->link_port = PORT_BNC; in phylink_create()
578 pl->link_port = PORT_MII; in phylink_create()
579 pl->link_config.interface = iface; in phylink_create()
580 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
581 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
582 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
583 pl->link_config.an_enabled = true; in phylink_create()
584 pl->ops = ops; in phylink_create()
585 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
586 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
588 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
589 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
590 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
592 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
594 kfree(pl); in phylink_create()
598 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_create()
599 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
601 kfree(pl); in phylink_create()
606 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
608 kfree(pl); in phylink_create()
612 return pl; in phylink_create()
623 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
625 if (pl->sfp_bus) in phylink_destroy()
626 sfp_unregister_upstream(pl->sfp_bus); in phylink_destroy()
627 if (!IS_ERR_OR_NULL(pl->link_gpio)) in phylink_destroy()
628 gpiod_put(pl->link_gpio); in phylink_destroy()
630 cancel_work_sync(&pl->resolve); in phylink_destroy()
631 kfree(pl); in phylink_destroy()
638 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
640 mutex_lock(&pl->state_mutex); in phylink_phy_change()
641 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
642 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
643 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
645 pl->phy_state.pause |= MLO_PAUSE_SYM; in phylink_phy_change()
647 pl->phy_state.pause |= MLO_PAUSE_ASYM; in phylink_phy_change()
648 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
649 pl->phy_state.link = up; in phylink_phy_change()
650 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
652 phylink_run_resolve(pl); in phylink_phy_change()
654 netdev_dbg(pl->netdev, "phy link %s %s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
660 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) in phylink_bringup_phy() argument
671 config.interface = pl->link_config.interface; in phylink_bringup_phy()
685 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
689 phy->phylink = pl; in phylink_bringup_phy()
692 netdev_info(pl->netdev, in phylink_bringup_phy()
697 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
698 pl->phydev = phy; in phylink_bringup_phy()
699 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
700 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
705 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
708 netdev_dbg(pl->netdev, in phylink_bringup_phy()
710 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
720 static int __phylink_connect_phy(struct phylink *pl, struct phy_device *phy, in __phylink_connect_phy() argument
725 if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED || in __phylink_connect_phy()
726 (pl->link_an_mode == MLO_AN_INBAND && in __phylink_connect_phy()
730 if (pl->phydev) in __phylink_connect_phy()
733 ret = phy_attach_direct(pl->netdev, phy, 0, interface); in __phylink_connect_phy()
737 ret = phylink_bringup_phy(pl, phy); in __phylink_connect_phy()
759 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
762 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
763 pl->link_interface = phy->interface; in phylink_connect_phy()
764 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
767 return __phylink_connect_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
783 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
791 if (pl->link_an_mode == MLO_AN_FIXED || in phylink_of_phy_connect()
792 (pl->link_an_mode == MLO_AN_INBAND && in phylink_of_phy_connect()
793 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_of_phy_connect()
803 if (pl->link_an_mode == MLO_AN_PHY) in phylink_of_phy_connect()
808 phy_dev = of_phy_attach(pl->netdev, phy_node, flags, in phylink_of_phy_connect()
809 pl->link_interface); in phylink_of_phy_connect()
816 ret = phylink_bringup_phy(pl, phy_dev); in phylink_of_phy_connect()
831 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
837 phy = pl->phydev; in phylink_disconnect_phy()
840 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
841 pl->phydev = NULL; in phylink_disconnect_phy()
842 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
844 flush_work(&pl->resolve); in phylink_disconnect_phy()
859 int phylink_fixed_state_cb(struct phylink *pl, in phylink_fixed_state_cb() argument
866 if (pl->link_an_mode != MLO_AN_FIXED) in phylink_fixed_state_cb()
869 mutex_lock(&pl->state_mutex); in phylink_fixed_state_cb()
870 pl->get_fixed_state = cb; in phylink_fixed_state_cb()
871 mutex_unlock(&pl->state_mutex); in phylink_fixed_state_cb()
885 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
888 pl->mac_link_dropped = true; in phylink_mac_change()
889 phylink_run_resolve(pl); in phylink_mac_change()
890 netdev_dbg(pl->netdev, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
902 void phylink_start(struct phylink *pl) in phylink_start() argument
906 netdev_info(pl->netdev, "configuring for %s/%s link mode\n", in phylink_start()
907 phylink_an_mode_str(pl->link_an_mode), in phylink_start()
908 phy_modes(pl->link_config.interface)); in phylink_start()
914 phylink_resolve_flow(pl, &pl->link_config); in phylink_start()
915 phylink_mac_config(pl, &pl->link_config); in phylink_start()
921 phylink_mac_an_restart(pl); in phylink_start()
923 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
924 phylink_run_resolve(pl); in phylink_start()
926 if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) in phylink_start()
927 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
928 if (pl->sfp_bus) in phylink_start()
929 sfp_upstream_start(pl->sfp_bus); in phylink_start()
930 if (pl->phydev) in phylink_start()
931 phy_start(pl->phydev); in phylink_start()
944 void phylink_stop(struct phylink *pl) in phylink_stop() argument
948 if (pl->phydev) in phylink_stop()
949 phy_stop(pl->phydev); in phylink_stop()
950 if (pl->sfp_bus) in phylink_stop()
951 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
952 if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) in phylink_stop()
953 del_timer_sync(&pl->link_poll); in phylink_stop()
955 set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_stop()
956 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_stop()
957 flush_work(&pl->resolve); in phylink_stop()
970 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
977 if (pl->phydev) in phylink_ethtool_get_wol()
978 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
993 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
999 if (pl->phydev) in phylink_ethtool_set_wol()
1000 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1037 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1044 if (pl->phydev) { in phylink_ethtool_ksettings_get()
1045 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1047 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1050 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1052 switch (pl->link_an_mode) { in phylink_ethtool_ksettings_get()
1058 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1066 if (pl->phydev) in phylink_ethtool_ksettings_get()
1069 phylink_get_mac_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1088 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1101 config = pl->link_config; in phylink_ethtool_ksettings_set()
1105 pl->supported); in phylink_ethtool_ksettings_set()
1115 pl->supported, in phylink_ethtool_ksettings_set()
1123 if (pl->link_an_mode == MLO_AN_FIXED && in phylink_ethtool_ksettings_set()
1124 (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1125 s->duplex != pl->link_config.duplex)) in phylink_ethtool_ksettings_set()
1135 if (pl->link_an_mode == MLO_AN_FIXED) in phylink_ethtool_ksettings_set()
1145 if (phylink_validate(pl, pl->supported, &config)) in phylink_ethtool_ksettings_set()
1158 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1159 ret = phy_ethtool_ksettings_set(pl->phydev, &our_kset); in phylink_ethtool_ksettings_set()
1164 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1166 linkmode_copy(pl->link_config.advertising, our_kset.link_modes.advertising); in phylink_ethtool_ksettings_set()
1167 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1168 pl->link_config.speed = our_kset.base.speed; in phylink_ethtool_ksettings_set()
1169 pl->link_config.duplex = our_kset.base.duplex; in phylink_ethtool_ksettings_set()
1170 pl->link_config.an_enabled = our_kset.base.autoneg != AUTONEG_DISABLE; in phylink_ethtool_ksettings_set()
1172 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_ksettings_set()
1173 phylink_mac_config(pl, &pl->link_config); in phylink_ethtool_ksettings_set()
1174 phylink_mac_an_restart(pl); in phylink_ethtool_ksettings_set()
1176 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1193 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1199 if (pl->phydev) in phylink_ethtool_nway_reset()
1200 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1201 phylink_mac_an_restart(pl); in phylink_ethtool_nway_reset()
1212 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1217 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1218 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1219 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1228 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1231 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1235 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1236 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1239 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1252 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_set_pauseparam()
1253 switch (pl->link_an_mode) { in phylink_ethtool_set_pauseparam()
1256 netif_carrier_off(pl->netdev); in phylink_ethtool_set_pauseparam()
1257 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1262 phylink_resolve_flow(pl, config); in phylink_ethtool_set_pauseparam()
1263 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1267 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1268 phylink_mac_an_restart(pl); in phylink_ethtool_set_pauseparam()
1287 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1293 if (pl->phydev) in phylink_get_eee_err()
1294 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1305 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1311 if (pl->phydev) in phylink_ethtool_get_eee()
1312 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1323 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1329 if (pl->phydev) in phylink_ethtool_set_eee()
1330 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1363 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1366 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1400 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1403 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1406 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1444 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1450 switch (pl->link_an_mode) { in phylink_mii_read()
1453 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1454 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1464 val = phylink_get_mac_state(pl, &state); in phylink_mii_read()
1468 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1477 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
1480 switch (pl->link_an_mode) { in phylink_mii_write()
1512 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
1519 if (pl->phydev) { in phylink_mii_ioctl()
1523 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
1527 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1535 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1540 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
1550 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1558 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1575 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
1585 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1586 port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1594 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_module_insert()
1597 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1599 netdev_err(pl->netdev, "validation with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1604 iface = sfp_select_interface(pl->sfp_bus, id, config.advertising); in phylink_sfp_module_insert()
1606 netdev_err(pl->netdev, in phylink_sfp_module_insert()
1613 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1615 netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1622 netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_module_insert()
1627 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_module_insert()
1630 changed = !bitmap_equal(pl->supported, support, in phylink_sfp_module_insert()
1633 linkmode_copy(pl->supported, support); in phylink_sfp_module_insert()
1634 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_module_insert()
1637 if (pl->link_an_mode != MLO_AN_INBAND || in phylink_sfp_module_insert()
1638 pl->link_config.interface != config.interface) { in phylink_sfp_module_insert()
1639 pl->link_config.interface = config.interface; in phylink_sfp_module_insert()
1640 pl->link_an_mode = MLO_AN_INBAND; in phylink_sfp_module_insert()
1644 netdev_info(pl->netdev, "switched to %s/%s link mode\n", in phylink_sfp_module_insert()
1649 pl->link_port = port; in phylink_sfp_module_insert()
1652 &pl->phylink_disable_state)) in phylink_sfp_module_insert()
1653 phylink_mac_config(pl, &pl->link_config); in phylink_sfp_module_insert()
1660 struct phylink *pl = upstream; in phylink_sfp_link_down() local
1664 set_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_down()
1665 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_sfp_link_down()
1666 flush_work(&pl->resolve); in phylink_sfp_link_down()
1671 struct phylink *pl = upstream; in phylink_sfp_link_up() local
1675 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
1676 phylink_run_resolve(pl); in phylink_sfp_link_up()
1681 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
1683 return __phylink_connect_phy(upstream, phy, pl->link_config.interface); in phylink_sfp_connect_phy()