Lines Matching refs:pl

76 #define phylink_printk(level, pl, fmt, ...) \  argument
78 if ((pl)->config->type == PHYLINK_NETDEV) \
79 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
80 else if ((pl)->config->type == PHYLINK_DEV) \
81 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
84 #define phylink_err(pl, fmt, ...) \ argument
85 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
86 #define phylink_warn(pl, fmt, ...) \ argument
87 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
88 #define phylink_info(pl, fmt, ...) \ argument
89 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
91 #define phylink_dbg(pl, fmt, ...) \ argument
93 if ((pl)->config->type == PHYLINK_NETDEV) \
94 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
95 else if ((pl)->config->type == PHYLINK_DEV) \
96 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
99 #define phylink_dbg(pl, fmt, ...) \ argument
100 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
102 #define phylink_dbg(pl, fmt, ...) \ argument
105 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
152 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
155 pl->ops->validate(pl->config, supported, state); in phylink_validate()
160 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
173 pl->link_config.speed = speed; in phylink_parse_fixedlink()
174 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
177 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
182 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
184 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
191 pl->link_gpio = desc; in phylink_parse_fixedlink()
205 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
212 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
214 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
216 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
218 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
222 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
223 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
224 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
225 pl->link_config.speed); in phylink_parse_fixedlink()
227 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
228 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
229 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
231 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
232 pl->supported, true); in phylink_parse_fixedlink()
233 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
234 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
235 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
236 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
238 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
240 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
241 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
242 pl->link_config.speed); in phylink_parse_fixedlink()
245 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
246 pl->supported); in phylink_parse_fixedlink()
248 pl->link_config.link = 1; in phylink_parse_fixedlink()
249 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
254 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
261 pl->link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
266 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
267 phylink_err(pl, in phylink_parse_mode()
272 linkmode_zero(pl->supported); in phylink_parse_mode()
273 phylink_set(pl->supported, MII); in phylink_parse_mode()
274 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
275 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
276 phylink_set(pl->supported, Pause); in phylink_parse_mode()
277 pl->link_config.an_enabled = true; in phylink_parse_mode()
278 pl->link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
280 switch (pl->link_config.interface) { in phylink_parse_mode()
282 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
283 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
284 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
285 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
286 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
287 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
291 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
295 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
299 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
300 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
301 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
302 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
303 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
304 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
305 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
306 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
307 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
308 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
309 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
310 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
311 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
315 phylink_err(pl, in phylink_parse_mode()
317 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
321 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
323 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
324 phylink_err(pl, in phylink_parse_mode()
333 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
336 phylink_dbg(pl, in phylink_mac_config()
338 __func__, phylink_an_mode_str(pl->link_an_mode), in phylink_mac_config()
345 pl->ops->mac_config(pl->config, pl->link_an_mode, state); in phylink_mac_config()
348 static void phylink_mac_config_up(struct phylink *pl, in phylink_mac_config_up() argument
352 phylink_mac_config(pl, state); in phylink_mac_config_up()
355 static void phylink_mac_an_restart(struct phylink *pl) in phylink_mac_an_restart() argument
357 if (pl->link_config.an_enabled && in phylink_mac_an_restart()
358 phy_interface_mode_is_8023z(pl->link_config.interface)) in phylink_mac_an_restart()
359 pl->ops->mac_an_restart(pl->config); in phylink_mac_an_restart()
362 static int phylink_get_mac_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_mac_state() argument
365 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_get_mac_state()
367 state->interface = pl->link_config.interface; in phylink_get_mac_state()
368 state->an_enabled = pl->link_config.an_enabled; in phylink_get_mac_state()
375 return pl->ops->mac_link_state(pl->config, state); in phylink_get_mac_state()
381 static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_fixed_state() argument
383 *state = pl->link_config; in phylink_get_fixed_state()
384 if (pl->get_fixed_state) in phylink_get_fixed_state()
385 pl->get_fixed_state(pl->netdev, state); in phylink_get_fixed_state()
386 else if (pl->link_gpio) in phylink_get_fixed_state()
387 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
398 static void phylink_resolve_flow(struct phylink *pl, in phylink_resolve_flow() argument
403 if (pl->link_config.pause & MLO_PAUSE_AN) { in phylink_resolve_flow()
406 if (phylink_test(pl->link_config.advertising, Pause)) in phylink_resolve_flow()
408 if (phylink_test(pl->link_config.advertising, Asym_Pause)) in phylink_resolve_flow()
419 new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK; in phylink_resolve_flow()
440 static void phylink_mac_link_up(struct phylink *pl, in phylink_mac_link_up() argument
443 struct net_device *ndev = pl->netdev; in phylink_mac_link_up()
445 pl->cur_interface = link_state.interface; in phylink_mac_link_up()
446 pl->ops->mac_link_up(pl->config, pl->link_an_mode, in phylink_mac_link_up()
447 pl->phy_state.interface, in phylink_mac_link_up()
448 pl->phydev); in phylink_mac_link_up()
453 phylink_info(pl, in phylink_mac_link_up()
460 static void phylink_mac_link_down(struct phylink *pl) in phylink_mac_link_down() argument
462 struct net_device *ndev = pl->netdev; in phylink_mac_link_down()
466 pl->ops->mac_link_down(pl->config, pl->link_an_mode, in phylink_mac_link_down()
467 pl->cur_interface); in phylink_mac_link_down()
468 phylink_info(pl, "Link is Down\n"); in phylink_mac_link_down()
473 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
475 struct net_device *ndev = pl->netdev; in phylink_resolve()
478 mutex_lock(&pl->state_mutex); in phylink_resolve()
479 if (pl->phylink_disable_state) { in phylink_resolve()
480 pl->mac_link_dropped = false; in phylink_resolve()
482 } else if (pl->mac_link_dropped) { in phylink_resolve()
485 switch (pl->link_an_mode) { in phylink_resolve()
487 link_state = pl->phy_state; in phylink_resolve()
488 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
489 phylink_mac_config_up(pl, &link_state); in phylink_resolve()
493 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
494 phylink_mac_config_up(pl, &link_state); in phylink_resolve()
498 phylink_get_mac_state(pl, &link_state); in phylink_resolve()
502 if (pl->phydev) in phylink_resolve()
503 link_state.link &= pl->phy_state.link; in phylink_resolve()
506 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
507 link_state.interface = pl->phy_state.interface; in phylink_resolve()
511 link_state.pause |= pl->phy_state.pause; in phylink_resolve()
512 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
513 phylink_mac_config(pl, &link_state); in phylink_resolve()
519 if (pl->netdev) in phylink_resolve()
522 link_changed = (link_state.link != pl->old_link_state); in phylink_resolve()
525 pl->old_link_state = link_state.link; in phylink_resolve()
527 phylink_mac_link_down(pl); in phylink_resolve()
529 phylink_mac_link_up(pl, link_state); in phylink_resolve()
531 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
532 pl->mac_link_dropped = false; in phylink_resolve()
533 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
535 mutex_unlock(&pl->state_mutex); in phylink_resolve()
538 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
540 if (!pl->phylink_disable_state) in phylink_run_resolve()
541 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
544 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
546 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
548 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
550 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
551 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
557 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
561 phylink_run_resolve(pl); in phylink_fixed_poll()
566 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
581 phylink_err(pl, "unable to parse \"sfp\" node: %d\n", in phylink_register_sfp()
586 pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl, &sfp_phylink_ops); in phylink_register_sfp()
587 if (!pl->sfp_bus) in phylink_register_sfp()
614 struct phylink *pl; in phylink_create() local
617 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
618 if (!pl) in phylink_create()
621 mutex_init(&pl->state_mutex); in phylink_create()
622 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
624 pl->config = config; in phylink_create()
626 pl->netdev = to_net_dev(config->dev); in phylink_create()
628 pl->dev = config->dev; in phylink_create()
630 kfree(pl); in phylink_create()
634 pl->phy_state.interface = iface; in phylink_create()
635 pl->link_interface = iface; in phylink_create()
637 pl->link_port = PORT_BNC; in phylink_create()
639 pl->link_port = PORT_MII; in phylink_create()
640 pl->link_config.interface = iface; in phylink_create()
641 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
642 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
643 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
644 pl->link_config.an_enabled = true; in phylink_create()
645 pl->ops = ops; in phylink_create()
646 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
647 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
649 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
650 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
651 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
653 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
655 kfree(pl); in phylink_create()
659 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_create()
660 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
662 kfree(pl); in phylink_create()
667 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
669 kfree(pl); in phylink_create()
673 return pl; in phylink_create()
686 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
688 if (pl->sfp_bus) in phylink_destroy()
689 sfp_unregister_upstream(pl->sfp_bus); in phylink_destroy()
690 if (pl->link_gpio) in phylink_destroy()
691 gpiod_put(pl->link_gpio); in phylink_destroy()
693 cancel_work_sync(&pl->resolve); in phylink_destroy()
694 kfree(pl); in phylink_destroy()
701 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
703 mutex_lock(&pl->state_mutex); in phylink_phy_change()
704 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
705 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
706 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
708 pl->phy_state.pause |= MLO_PAUSE_SYM; in phylink_phy_change()
710 pl->phy_state.pause |= MLO_PAUSE_ASYM; in phylink_phy_change()
711 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
712 pl->phy_state.link = up; in phylink_phy_change()
713 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
715 phylink_run_resolve(pl); in phylink_phy_change()
717 phylink_dbg(pl, "phy link %s %s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
723 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) in phylink_bringup_phy() argument
732 config.interface = pl->link_config.interface; in phylink_bringup_phy()
746 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
750 phy->phylink = pl; in phylink_bringup_phy()
753 phylink_info(pl, in phylink_bringup_phy()
758 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
759 pl->phydev = phy; in phylink_bringup_phy()
760 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
761 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
765 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
768 phylink_dbg(pl, in phylink_bringup_phy()
770 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
779 static int __phylink_connect_phy(struct phylink *pl, struct phy_device *phy, in __phylink_connect_phy() argument
784 if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED || in __phylink_connect_phy()
785 (pl->link_an_mode == MLO_AN_INBAND && in __phylink_connect_phy()
789 if (pl->phydev) in __phylink_connect_phy()
792 ret = phy_attach_direct(pl->netdev, phy, 0, interface); in __phylink_connect_phy()
796 ret = phylink_bringup_phy(pl, phy); in __phylink_connect_phy()
818 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
821 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
822 pl->link_interface = phy->interface; in phylink_connect_phy()
823 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
826 return __phylink_connect_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
842 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
850 if (pl->link_an_mode == MLO_AN_FIXED || in phylink_of_phy_connect()
851 (pl->link_an_mode == MLO_AN_INBAND && in phylink_of_phy_connect()
852 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_of_phy_connect()
862 if (pl->link_an_mode == MLO_AN_PHY) in phylink_of_phy_connect()
867 phy_dev = of_phy_attach(pl->netdev, phy_node, flags, in phylink_of_phy_connect()
868 pl->link_interface); in phylink_of_phy_connect()
875 ret = phylink_bringup_phy(pl, phy_dev); in phylink_of_phy_connect()
890 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
896 phy = pl->phydev; in phylink_disconnect_phy()
899 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
900 pl->phydev = NULL; in phylink_disconnect_phy()
901 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
903 flush_work(&pl->resolve); in phylink_disconnect_phy()
918 int phylink_fixed_state_cb(struct phylink *pl, in phylink_fixed_state_cb() argument
925 if (pl->link_an_mode != MLO_AN_FIXED) in phylink_fixed_state_cb()
928 mutex_lock(&pl->state_mutex); in phylink_fixed_state_cb()
929 pl->get_fixed_state = cb; in phylink_fixed_state_cb()
930 mutex_unlock(&pl->state_mutex); in phylink_fixed_state_cb()
944 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
947 pl->mac_link_dropped = true; in phylink_mac_change()
948 phylink_run_resolve(pl); in phylink_mac_change()
949 phylink_dbg(pl, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
955 struct phylink *pl = data; in phylink_link_handler() local
957 phylink_run_resolve(pl); in phylink_link_handler()
970 void phylink_start(struct phylink *pl) in phylink_start() argument
974 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
975 phylink_an_mode_str(pl->link_an_mode), in phylink_start()
976 phy_modes(pl->link_config.interface)); in phylink_start()
979 if (pl->netdev) in phylink_start()
980 netif_carrier_off(pl->netdev); in phylink_start()
986 phylink_resolve_flow(pl, &pl->link_config); in phylink_start()
987 phylink_mac_config(pl, &pl->link_config); in phylink_start()
993 phylink_mac_an_restart(pl); in phylink_start()
995 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
996 phylink_run_resolve(pl); in phylink_start()
998 if (pl->link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
999 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
1005 "netdev link", pl)) in phylink_start()
1006 pl->link_irq = irq; in phylink_start()
1011 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1013 if (pl->link_an_mode == MLO_AN_FIXED && pl->get_fixed_state) in phylink_start()
1014 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1015 if (pl->phydev) in phylink_start()
1016 phy_start(pl->phydev); in phylink_start()
1017 if (pl->sfp_bus) in phylink_start()
1018 sfp_upstream_start(pl->sfp_bus); in phylink_start()
1031 void phylink_stop(struct phylink *pl) in phylink_stop() argument
1035 if (pl->sfp_bus) in phylink_stop()
1036 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
1037 if (pl->phydev) in phylink_stop()
1038 phy_stop(pl->phydev); in phylink_stop()
1039 del_timer_sync(&pl->link_poll); in phylink_stop()
1040 if (pl->link_irq) { in phylink_stop()
1041 free_irq(pl->link_irq, pl); in phylink_stop()
1042 pl->link_irq = 0; in phylink_stop()
1045 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
1058 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
1065 if (pl->phydev) in phylink_ethtool_get_wol()
1066 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1081 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
1087 if (pl->phydev) in phylink_ethtool_set_wol()
1088 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1125 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1132 if (pl->phydev) { in phylink_ethtool_ksettings_get()
1133 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1135 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1138 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1140 switch (pl->link_an_mode) { in phylink_ethtool_ksettings_get()
1146 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1154 if (pl->phydev) in phylink_ethtool_ksettings_get()
1157 phylink_get_mac_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1176 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1190 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1191 config = pl->link_config; in phylink_ethtool_ksettings_set()
1212 if (pl->link_an_mode == MLO_AN_FIXED && in phylink_ethtool_ksettings_set()
1213 (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1214 s->duplex != pl->link_config.duplex)) in phylink_ethtool_ksettings_set()
1224 if (pl->link_an_mode == MLO_AN_FIXED) in phylink_ethtool_ksettings_set()
1234 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
1247 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1248 ret = phy_ethtool_ksettings_set(pl->phydev, &our_kset); in phylink_ethtool_ksettings_set()
1253 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1255 linkmode_copy(pl->link_config.advertising, our_kset.link_modes.advertising); in phylink_ethtool_ksettings_set()
1256 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1257 pl->link_config.speed = our_kset.base.speed; in phylink_ethtool_ksettings_set()
1258 pl->link_config.duplex = our_kset.base.duplex; in phylink_ethtool_ksettings_set()
1259 pl->link_config.an_enabled = our_kset.base.autoneg != AUTONEG_DISABLE; in phylink_ethtool_ksettings_set()
1266 if (pl->link_an_mode == MLO_AN_INBAND && in phylink_ethtool_ksettings_set()
1267 !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_ksettings_set()
1268 phylink_mac_config(pl, &pl->link_config); in phylink_ethtool_ksettings_set()
1269 phylink_mac_an_restart(pl); in phylink_ethtool_ksettings_set()
1271 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1288 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1294 if (pl->phydev) in phylink_ethtool_nway_reset()
1295 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1296 phylink_mac_an_restart(pl); in phylink_ethtool_nway_reset()
1307 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1312 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1313 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1314 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1323 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1326 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1330 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1331 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1334 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1351 if (pl->phydev) { in phylink_ethtool_set_pauseparam()
1352 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
1355 &pl->phylink_disable_state)) { in phylink_ethtool_set_pauseparam()
1356 switch (pl->link_an_mode) { in phylink_ethtool_set_pauseparam()
1359 phylink_resolve_flow(pl, config); in phylink_ethtool_set_pauseparam()
1360 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1364 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1365 phylink_mac_an_restart(pl); in phylink_ethtool_set_pauseparam()
1384 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1390 if (pl->phydev) in phylink_get_eee_err()
1391 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1404 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
1408 if (pl->phydev) in phylink_init_eee()
1409 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1420 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1426 if (pl->phydev) in phylink_ethtool_get_eee()
1427 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1438 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1444 if (pl->phydev) in phylink_ethtool_set_eee()
1445 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1476 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1479 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1513 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1516 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1519 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1557 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1563 switch (pl->link_an_mode) { in phylink_mii_read()
1566 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1576 val = phylink_get_mac_state(pl, &state); in phylink_mii_read()
1588 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
1591 switch (pl->link_an_mode) { in phylink_mii_write()
1623 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
1630 if (pl->phydev) { in phylink_mii_ioctl()
1634 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
1638 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1646 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1651 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
1661 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1669 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1685 struct phylink *pl = upstream; in phylink_sfp_attach() local
1687 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
1692 struct phylink *pl = upstream; in phylink_sfp_detach() local
1694 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
1700 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
1711 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1712 port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1720 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_module_insert()
1723 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1725 phylink_err(pl, "validation with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1732 iface = sfp_select_interface(pl->sfp_bus, id, config.advertising); in phylink_sfp_module_insert()
1734 phylink_err(pl, in phylink_sfp_module_insert()
1741 ret = phylink_validate(pl, support1, &config); in phylink_sfp_module_insert()
1743 phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1750 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_module_insert()
1755 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_module_insert()
1758 changed = !bitmap_equal(pl->supported, support, in phylink_sfp_module_insert()
1761 linkmode_copy(pl->supported, support); in phylink_sfp_module_insert()
1762 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_module_insert()
1765 if (pl->link_an_mode != MLO_AN_INBAND || in phylink_sfp_module_insert()
1766 pl->link_config.interface != config.interface) { in phylink_sfp_module_insert()
1767 pl->link_config.interface = config.interface; in phylink_sfp_module_insert()
1768 pl->link_an_mode = MLO_AN_INBAND; in phylink_sfp_module_insert()
1772 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_module_insert()
1777 pl->link_port = port; in phylink_sfp_module_insert()
1780 &pl->phylink_disable_state)) in phylink_sfp_module_insert()
1781 phylink_mac_config(pl, &pl->link_config); in phylink_sfp_module_insert()
1788 struct phylink *pl = upstream; in phylink_sfp_link_down() local
1792 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
1797 struct phylink *pl = upstream; in phylink_sfp_link_up() local
1801 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
1802 phylink_run_resolve(pl); in phylink_sfp_link_up()
1807 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
1809 return __phylink_connect_phy(upstream, phy, pl->link_config.interface); in phylink_sfp_connect_phy()