Lines Matching full:pl

84 #define phylink_printk(level, pl, fmt, ...) \  argument
86 if ((pl)->config->type == PHYLINK_NETDEV) \
87 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
88 else if ((pl)->config->type == PHYLINK_DEV) \
89 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
92 #define phylink_err(pl, fmt, ...) \ argument
93 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
94 #define phylink_warn(pl, fmt, ...) \ argument
95 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
96 #define phylink_info(pl, fmt, ...) \ argument
97 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
99 #define phylink_dbg(pl, fmt, ...) \ argument
101 if ((pl)->config->type == PHYLINK_NETDEV) \
102 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
103 else if ((pl)->config->type == PHYLINK_DEV) \
104 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
107 #define phylink_dbg(pl, fmt, ...) \ argument
108 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
110 #define phylink_dbg(pl, fmt, ...) \ argument
113 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
158 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
161 pl->mac_ops->validate(pl->config, supported, state); in phylink_validate()
166 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
179 pl->link_config.speed = speed; in phylink_parse_fixedlink()
180 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
183 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
190 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
193 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
200 pl->link_gpio = desc; in phylink_parse_fixedlink()
214 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
221 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
223 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
226 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
229 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
233 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
234 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
235 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
236 pl->link_config.speed); in phylink_parse_fixedlink()
238 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
239 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
240 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
242 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
243 pl->supported, true); in phylink_parse_fixedlink()
244 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
245 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
246 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
247 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
248 phylink_set(pl->supported, Autoneg); in phylink_parse_fixedlink()
250 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
251 __set_bit(s->bit, pl->link_config.lp_advertising); in phylink_parse_fixedlink()
253 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
254 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
255 pl->link_config.speed); in phylink_parse_fixedlink()
258 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
259 pl->supported); in phylink_parse_fixedlink()
261 pl->link_config.link = 1; in phylink_parse_fixedlink()
262 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
267 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
274 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
279 pl->config->ovr_an_inband) { in phylink_parse_mode()
280 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
281 phylink_err(pl, in phylink_parse_mode()
286 linkmode_zero(pl->supported); in phylink_parse_mode()
287 phylink_set(pl->supported, MII); in phylink_parse_mode()
288 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
289 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
290 phylink_set(pl->supported, Pause); in phylink_parse_mode()
291 pl->link_config.an_enabled = true; in phylink_parse_mode()
292 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
294 switch (pl->link_config.interface) { in phylink_parse_mode()
297 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
298 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
299 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
300 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
301 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
302 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
306 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
310 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
314 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
318 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
319 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
320 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
325 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
326 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
327 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
328 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
329 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
330 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
331 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
332 phylink_set(pl->supported, 1000baseKX_Full); in phylink_parse_mode()
333 phylink_set(pl->supported, 2500baseT_Full); in phylink_parse_mode()
334 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
335 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
336 phylink_set(pl->supported, 10000baseT_Full); in phylink_parse_mode()
337 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
338 phylink_set(pl->supported, 10000baseKX4_Full); in phylink_parse_mode()
339 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
340 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
341 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
342 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
343 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
347 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
348 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
349 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
350 phylink_set(pl->supported, 40000baseKR4_Full); in phylink_parse_mode()
351 phylink_set(pl->supported, 40000baseCR4_Full); in phylink_parse_mode()
352 phylink_set(pl->supported, 40000baseSR4_Full); in phylink_parse_mode()
353 phylink_set(pl->supported, 40000baseLR4_Full); in phylink_parse_mode()
354 phylink_set(pl->supported, 50000baseCR2_Full); in phylink_parse_mode()
355 phylink_set(pl->supported, 50000baseKR2_Full); in phylink_parse_mode()
356 phylink_set(pl->supported, 50000baseSR2_Full); in phylink_parse_mode()
357 phylink_set(pl->supported, 50000baseKR_Full); in phylink_parse_mode()
358 phylink_set(pl->supported, 50000baseSR_Full); in phylink_parse_mode()
359 phylink_set(pl->supported, 50000baseCR_Full); in phylink_parse_mode()
360 phylink_set(pl->supported, 50000baseLR_ER_FR_Full); in phylink_parse_mode()
361 phylink_set(pl->supported, 50000baseDR_Full); in phylink_parse_mode()
362 phylink_set(pl->supported, 100000baseKR4_Full); in phylink_parse_mode()
363 phylink_set(pl->supported, 100000baseSR4_Full); in phylink_parse_mode()
364 phylink_set(pl->supported, 100000baseCR4_Full); in phylink_parse_mode()
365 phylink_set(pl->supported, 100000baseLR4_ER4_Full); in phylink_parse_mode()
366 phylink_set(pl->supported, 100000baseKR2_Full); in phylink_parse_mode()
367 phylink_set(pl->supported, 100000baseSR2_Full); in phylink_parse_mode()
368 phylink_set(pl->supported, 100000baseCR2_Full); in phylink_parse_mode()
369 phylink_set(pl->supported, 100000baseLR2_ER2_FR2_Full); in phylink_parse_mode()
370 phylink_set(pl->supported, 100000baseDR2_Full); in phylink_parse_mode()
374 phylink_err(pl, in phylink_parse_mode()
376 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
380 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
382 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
383 phylink_err(pl, in phylink_parse_mode()
389 pl->link_config.an_enabled = phylink_test(pl->supported, Autoneg); in phylink_parse_mode()
395 static void phylink_apply_manual_flow(struct phylink *pl, in phylink_apply_manual_flow() argument
403 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
404 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
423 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
426 phylink_dbg(pl, in phylink_mac_config()
428 __func__, phylink_an_mode_str(pl->cur_link_an_mode), in phylink_mac_config()
435 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state); in phylink_mac_config()
438 static void phylink_mac_pcs_an_restart(struct phylink *pl) in phylink_mac_pcs_an_restart() argument
440 if (pl->link_config.an_enabled && in phylink_mac_pcs_an_restart()
441 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_mac_pcs_an_restart()
442 phylink_autoneg_inband(pl->cur_link_an_mode)) { in phylink_mac_pcs_an_restart()
443 if (pl->pcs_ops) in phylink_mac_pcs_an_restart()
444 pl->pcs_ops->pcs_an_restart(pl->pcs); in phylink_mac_pcs_an_restart()
446 pl->mac_ops->mac_an_restart(pl->config); in phylink_mac_pcs_an_restart()
450 static void phylink_major_config(struct phylink *pl, bool restart, in phylink_major_config() argument
455 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); in phylink_major_config()
457 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
458 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, in phylink_major_config()
461 phylink_err(pl, "mac_prepare failed: %pe\n", in phylink_major_config()
467 phylink_mac_config(pl, state); in phylink_major_config()
469 if (pl->pcs_ops) { in phylink_major_config()
470 err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_major_config()
473 !!(pl->link_config.pause & in phylink_major_config()
476 phylink_err(pl, "pcs_config failed: %pe\n", in phylink_major_config()
482 phylink_mac_pcs_an_restart(pl); in phylink_major_config()
484 if (pl->mac_ops->mac_finish) { in phylink_major_config()
485 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode, in phylink_major_config()
488 phylink_err(pl, "mac_finish failed: %pe\n", in phylink_major_config()
499 static int phylink_change_inband_advert(struct phylink *pl) in phylink_change_inband_advert() argument
503 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
506 if (!pl->pcs_ops) { in phylink_change_inband_advert()
508 phylink_mac_config(pl, &pl->link_config); in phylink_change_inband_advert()
509 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
513 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__, in phylink_change_inband_advert()
514 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_change_inband_advert()
515 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
516 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
517 pl->link_config.pause); in phylink_change_inband_advert()
523 ret = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_change_inband_advert()
524 pl->link_config.interface, in phylink_change_inband_advert()
525 pl->link_config.advertising, in phylink_change_inband_advert()
526 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
531 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
536 static void phylink_mac_pcs_get_state(struct phylink *pl, in phylink_mac_pcs_get_state() argument
539 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
541 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
542 state->an_enabled = pl->link_config.an_enabled; in phylink_mac_pcs_get_state()
549 if (pl->pcs_ops) in phylink_mac_pcs_get_state()
550 pl->pcs_ops->pcs_get_state(pl->pcs, state); in phylink_mac_pcs_get_state()
551 else if (pl->mac_ops->mac_pcs_get_state) in phylink_mac_pcs_get_state()
552 pl->mac_ops->mac_pcs_get_state(pl->config, state); in phylink_mac_pcs_get_state()
560 static void phylink_get_fixed_state(struct phylink *pl, in phylink_get_fixed_state() argument
563 *state = pl->link_config; in phylink_get_fixed_state()
564 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
565 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
566 else if (pl->link_gpio) in phylink_get_fixed_state()
567 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
572 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart) in phylink_mac_initial_config() argument
576 switch (pl->cur_link_an_mode) { in phylink_mac_initial_config()
578 link_state = pl->phy_state; in phylink_mac_initial_config()
582 phylink_get_fixed_state(pl, &link_state); in phylink_mac_initial_config()
586 link_state = pl->link_config; in phylink_mac_initial_config()
597 phylink_apply_manual_flow(pl, &link_state); in phylink_mac_initial_config()
598 phylink_major_config(pl, force_restart, &link_state); in phylink_mac_initial_config()
615 static void phylink_link_up(struct phylink *pl, in phylink_link_up() argument
618 struct net_device *ndev = pl->netdev; in phylink_link_up()
620 pl->cur_interface = link_state.interface; in phylink_link_up()
622 if (pl->pcs_ops && pl->pcs_ops->pcs_link_up) in phylink_link_up()
623 pl->pcs_ops->pcs_link_up(pl->pcs, pl->cur_link_an_mode, in phylink_link_up()
624 pl->cur_interface, in phylink_link_up()
627 pl->mac_ops->mac_link_up(pl->config, pl->phydev, in phylink_link_up()
628 pl->cur_link_an_mode, pl->cur_interface, in phylink_link_up()
636 phylink_info(pl, in phylink_link_up()
643 static void phylink_link_down(struct phylink *pl) in phylink_link_down() argument
645 struct net_device *ndev = pl->netdev; in phylink_link_down()
649 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode, in phylink_link_down()
650 pl->cur_interface); in phylink_link_down()
651 phylink_info(pl, "Link is Down\n"); in phylink_link_down()
656 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
658 struct net_device *ndev = pl->netdev; in phylink_resolve()
662 mutex_lock(&pl->state_mutex); in phylink_resolve()
663 if (pl->netdev) in phylink_resolve()
666 cur_link_state = pl->old_link_state; in phylink_resolve()
668 if (pl->phylink_disable_state) { in phylink_resolve()
669 pl->mac_link_dropped = false; in phylink_resolve()
671 } else if (pl->mac_link_dropped) { in phylink_resolve()
674 switch (pl->cur_link_an_mode) { in phylink_resolve()
676 link_state = pl->phy_state; in phylink_resolve()
677 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
682 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
687 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
692 if (pl->phydev) in phylink_resolve()
693 link_state.link &= pl->phy_state.link; in phylink_resolve()
696 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
697 link_state.interface = pl->phy_state.interface; in phylink_resolve()
702 link_state.pause = pl->phy_state.pause; in phylink_resolve()
705 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
711 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
716 phylink_link_down(pl); in phylink_resolve()
719 phylink_major_config(pl, false, &link_state); in phylink_resolve()
720 pl->link_config.interface = link_state.interface; in phylink_resolve()
721 } else if (!pl->pcs_ops) { in phylink_resolve()
728 phylink_mac_config(pl, &link_state); in phylink_resolve()
733 pl->old_link_state = link_state.link; in phylink_resolve()
735 phylink_link_down(pl); in phylink_resolve()
737 phylink_link_up(pl, link_state); in phylink_resolve()
739 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
740 pl->mac_link_dropped = false; in phylink_resolve()
741 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
743 mutex_unlock(&pl->state_mutex); in phylink_resolve()
746 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
748 if (!pl->phylink_disable_state) in phylink_run_resolve()
749 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
752 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
754 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
756 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
758 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
759 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
765 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
769 phylink_run_resolve(pl); in phylink_fixed_poll()
774 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
786 phylink_err(pl, "unable to attach SFP bus: %d\n", ret); in phylink_register_sfp()
790 pl->sfp_bus = bus; in phylink_register_sfp()
792 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops); in phylink_register_sfp()
819 struct phylink *pl; in phylink_create() local
822 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
823 if (!pl) in phylink_create()
826 mutex_init(&pl->state_mutex); in phylink_create()
827 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
829 pl->config = config; in phylink_create()
831 pl->netdev = to_net_dev(config->dev); in phylink_create()
833 pl->dev = config->dev; in phylink_create()
835 kfree(pl); in phylink_create()
839 pl->phy_state.interface = iface; in phylink_create()
840 pl->link_interface = iface; in phylink_create()
842 pl->link_port = PORT_BNC; in phylink_create()
844 pl->link_port = PORT_MII; in phylink_create()
845 pl->link_config.interface = iface; in phylink_create()
846 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
847 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
848 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
849 pl->link_config.an_enabled = true; in phylink_create()
850 pl->mac_ops = mac_ops; in phylink_create()
851 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
852 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
854 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
855 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
856 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
858 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
860 kfree(pl); in phylink_create()
864 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
865 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
867 kfree(pl); in phylink_create()
872 pl->cur_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
874 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
876 kfree(pl); in phylink_create()
880 return pl; in phylink_create()
886 * @pl: a pointer to a &struct phylink returned from phylink_create()
898 void phylink_set_pcs(struct phylink *pl, struct phylink_pcs *pcs) in phylink_set_pcs() argument
900 pl->pcs = pcs; in phylink_set_pcs()
901 pl->pcs_ops = pcs->ops; in phylink_set_pcs()
907 * @pl: a pointer to a &struct phylink returned from phylink_create()
914 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
916 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
917 if (pl->link_gpio) in phylink_destroy()
918 gpiod_put(pl->link_gpio); in phylink_destroy()
920 cancel_work_sync(&pl->resolve); in phylink_destroy()
921 kfree(pl); in phylink_destroy()
927 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
932 mutex_lock(&pl->state_mutex); in phylink_phy_change()
933 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
934 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
935 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
937 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
939 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
940 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
941 pl->phy_state.link = up; in phylink_phy_change()
942 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
944 phylink_run_resolve(pl); in phylink_phy_change()
946 phylink_dbg(pl, "phy link %s %s/%s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
950 phylink_pause_to_str(pl->phy_state.pause)); in phylink_phy_change()
953 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, in phylink_bringup_phy() argument
987 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
989 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %d\n", in phylink_bringup_phy()
997 phy->phylink = pl; in phylink_bringup_phy()
1001 phylink_info(pl, in phylink_bringup_phy()
1007 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
1008 pl->phydev = phy; in phylink_bringup_phy()
1009 pl->phy_state.interface = interface; in phylink_bringup_phy()
1010 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
1011 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
1012 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
1013 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
1014 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
1018 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
1021 phylink_dbg(pl, in phylink_bringup_phy()
1023 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
1032 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy, in phylink_attach_phy() argument
1035 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
1036 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
1040 if (pl->phydev) in phylink_attach_phy()
1043 return phy_attach_direct(pl->netdev, phy, 0, interface); in phylink_attach_phy()
1048 * @pl: a pointer to a &struct phylink returned from phylink_create()
1051 * Connect @phy to the phylink instance specified by @pl by calling
1061 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
1066 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
1067 pl->link_interface = phy->interface; in phylink_connect_phy()
1068 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
1071 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
1075 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
1085 * @pl: a pointer to a &struct phylink returned from phylink_create()
1090 * specified by @pl. Actions specified in phylink_connect_phy() will be
1095 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
1098 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags); in phylink_of_phy_connect()
1104 * @pl: a pointer to a &struct phylink returned from phylink_create()
1109 * by @pl.
1113 int phylink_fwnode_phy_connect(struct phylink *pl, in phylink_fwnode_phy_connect() argument
1122 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_fwnode_phy_connect()
1123 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_fwnode_phy_connect()
1124 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_fwnode_phy_connect()
1129 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_fwnode_phy_connect()
1140 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_fwnode_phy_connect()
1141 pl->link_interface); in phylink_fwnode_phy_connect()
1147 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_fwnode_phy_connect()
1158 * @pl: a pointer to a &struct phylink returned from phylink_create()
1160 * Disconnect any current PHY from the phylink instance described by @pl.
1162 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
1168 phy = pl->phydev; in phylink_disconnect_phy()
1171 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
1172 pl->phydev = NULL; in phylink_disconnect_phy()
1173 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
1175 flush_work(&pl->resolve); in phylink_disconnect_phy()
1184 * @pl: a pointer to a &struct phylink returned from phylink_create()
1190 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
1193 pl->mac_link_dropped = true; in phylink_mac_change()
1194 phylink_run_resolve(pl); in phylink_mac_change()
1195 phylink_dbg(pl, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
1201 struct phylink *pl = data; in phylink_link_handler() local
1203 phylink_run_resolve(pl); in phylink_link_handler()
1210 * @pl: a pointer to a &struct phylink returned from phylink_create()
1212 * Start the phylink instance specified by @pl, configuring the MAC for the
1216 void phylink_start(struct phylink *pl) in phylink_start() argument
1222 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
1223 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_start()
1224 phy_modes(pl->link_config.interface)); in phylink_start()
1227 if (pl->netdev) in phylink_start()
1228 netif_carrier_off(pl->netdev); in phylink_start()
1238 phylink_mac_initial_config(pl, true); in phylink_start()
1240 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
1241 phylink_run_resolve(pl); in phylink_start()
1243 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
1244 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
1250 "netdev link", pl)) in phylink_start()
1251 pl->link_irq = irq; in phylink_start()
1259 switch (pl->cfg_link_an_mode) { in phylink_start()
1261 poll |= pl->config->poll_fixed_state; in phylink_start()
1264 poll |= pl->config->pcs_poll; in phylink_start()
1265 if (pl->pcs) in phylink_start()
1266 poll |= pl->pcs->poll; in phylink_start()
1270 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1271 if (pl->phydev) in phylink_start()
1272 phy_start(pl->phydev); in phylink_start()
1273 if (pl->sfp_bus) in phylink_start()
1274 sfp_upstream_start(pl->sfp_bus); in phylink_start()
1280 * @pl: a pointer to a &struct phylink returned from phylink_create()
1282 * Stop the phylink instance specified by @pl. This should be called from the
1290 void phylink_stop(struct phylink *pl) in phylink_stop() argument
1294 if (pl->sfp_bus) in phylink_stop()
1295 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
1296 if (pl->phydev) in phylink_stop()
1297 phy_stop(pl->phydev); in phylink_stop()
1298 del_timer_sync(&pl->link_poll); in phylink_stop()
1299 if (pl->link_irq) { in phylink_stop()
1300 free_irq(pl->link_irq, pl); in phylink_stop()
1301 pl->link_irq = 0; in phylink_stop()
1304 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
1310 * @pl: a pointer to a &struct phylink returned from phylink_create()
1321 void phylink_suspend(struct phylink *pl, bool mac_wol) in phylink_suspend() argument
1325 if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) { in phylink_suspend()
1327 mutex_lock(&pl->state_mutex); in phylink_suspend()
1330 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_suspend()
1336 netif_carrier_off(pl->netdev); in phylink_suspend()
1341 mutex_unlock(&pl->state_mutex); in phylink_suspend()
1343 phylink_stop(pl); in phylink_suspend()
1350 * @pl: a pointer to a &struct phylink returned from phylink_create()
1355 void phylink_resume(struct phylink *pl) in phylink_resume() argument
1359 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) { in phylink_resume()
1368 mutex_lock(&pl->state_mutex); in phylink_resume()
1369 phylink_link_down(pl); in phylink_resume()
1370 mutex_unlock(&pl->state_mutex); in phylink_resume()
1375 phylink_mac_initial_config(pl, true); in phylink_resume()
1378 clear_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_resume()
1379 phylink_run_resolve(pl); in phylink_resume()
1381 phylink_start(pl); in phylink_resume()
1388 * @pl: a pointer to a &struct phylink returned from phylink_create()
1392 * instance specified by @pl. If no PHY is currently attached, report no
1395 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
1402 if (pl->phydev) in phylink_ethtool_get_wol()
1403 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1409 * @pl: a pointer to a &struct phylink returned from phylink_create()
1413 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
1418 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
1424 if (pl->phydev) in phylink_ethtool_set_wol()
1425 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1455 * @pl: a pointer to a &struct phylink returned from phylink_create()
1458 * Read the current link settings for the phylink instance specified by @pl.
1462 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1469 if (pl->phydev) in phylink_ethtool_ksettings_get()
1470 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1472 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1474 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1476 switch (pl->cur_link_an_mode) { in phylink_ethtool_ksettings_get()
1482 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1490 if (pl->phydev) in phylink_ethtool_ksettings_get()
1493 phylink_mac_pcs_get_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1509 * @pl: a pointer to a &struct phylink returned from phylink_create()
1512 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1521 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1523 * to update the pl->link_config settings: in phylink_ethtool_ksettings_set()
1540 return phy_ethtool_ksettings_set(pl->phydev, kset); in phylink_ethtool_ksettings_set()
1543 config = pl->link_config; in phylink_ethtool_ksettings_set()
1547 pl->supported); in phylink_ethtool_ksettings_set()
1556 pl->supported, false); in phylink_ethtool_ksettings_set()
1563 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1564 if (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1565 s->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
1579 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1581 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
1602 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1603 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
1614 if (pl->sfp_port && pl->sfp_bus) { in phylink_ethtool_ksettings_set()
1615 config.interface = sfp_select_interface(pl->sfp_bus, in phylink_ethtool_ksettings_set()
1618 phylink_err(pl, in phylink_ethtool_ksettings_set()
1626 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1627 if (phylink_validate(pl, support, &config)) { in phylink_ethtool_ksettings_set()
1628 phylink_err(pl, "validation of %s/%s with support %*pb failed\n", in phylink_ethtool_ksettings_set()
1629 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_ethtool_ksettings_set()
1636 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1637 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
1638 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
1639 pl->link_config.an_enabled = config.an_enabled; in phylink_ethtool_ksettings_set()
1641 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
1644 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
1645 phylink_link_down(pl); in phylink_ethtool_ksettings_set()
1646 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
1649 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
1650 phylink_major_config(pl, false, &config); in phylink_ethtool_ksettings_set()
1651 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1652 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1653 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
1655 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1656 phylink_change_inband_advert(pl); in phylink_ethtool_ksettings_set()
1658 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1666 * @pl: a pointer to a &struct phylink returned from phylink_create()
1668 * Restart negotiation for the phylink instance specified by @pl. This will
1675 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1681 if (pl->phydev) in phylink_ethtool_nway_reset()
1682 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1683 phylink_mac_pcs_an_restart(pl); in phylink_ethtool_nway_reset()
1691 * @pl: a pointer to a &struct phylink returned from phylink_create()
1694 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1699 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1700 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1701 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1707 * @pl: a pointer to a &struct phylink returned from phylink_create()
1710 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1713 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1719 if (pl->cur_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
1722 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1723 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1726 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1738 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1764 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
1765 phylink_change_inband_advert(pl); in phylink_ethtool_set_pauseparam()
1767 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1774 if (pl->phydev) in phylink_ethtool_set_pauseparam()
1775 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
1783 pl->mac_link_dropped = true; in phylink_ethtool_set_pauseparam()
1784 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1794 * @pl: a pointer to a &struct phylink returned from phylink_create().
1797 * with the phylink instance specified by @pl.
1801 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1807 if (pl->phydev) in phylink_get_eee_err()
1808 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1816 * @pl: a pointer to a &struct phylink returned from phylink_create()
1821 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
1825 if (pl->phydev) in phylink_init_eee()
1826 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1834 * @pl: a pointer to a &struct phylink returned from phylink_create()
1837 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1843 if (pl->phydev) in phylink_ethtool_get_eee()
1844 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1852 * @pl: a pointer to a &struct phylink returned from phylink_create()
1855 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1861 if (pl->phydev) in phylink_ethtool_set_eee()
1862 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1894 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1897 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1931 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1934 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1937 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1975 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1981 switch (pl->cur_link_an_mode) { in phylink_mii_read()
1984 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1994 phylink_mac_pcs_get_state(pl, &state); in phylink_mii_read()
2003 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
2006 switch (pl->cur_link_an_mode) { in phylink_mii_write()
2022 * @pl: a pointer to a &struct phylink returned from phylink_create()
2027 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
2038 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
2045 if (pl->phydev) { in phylink_mii_ioctl()
2049 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
2053 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2061 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2066 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
2076 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2084 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2101 * @pl: a pointer to a &struct phylink returned from phylink_create()
2110 int phylink_speed_down(struct phylink *pl, bool sync) in phylink_speed_down() argument
2116 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
2117 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
2126 * @pl: a pointer to a &struct phylink returned from phylink_create()
2133 int phylink_speed_up(struct phylink *pl) in phylink_speed_up() argument
2139 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
2140 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
2148 struct phylink *pl = upstream; in phylink_sfp_attach() local
2150 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
2155 struct phylink *pl = upstream; in phylink_sfp_detach() local
2157 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
2160 static int phylink_sfp_config(struct phylink *pl, u8 mode, in phylink_sfp_config() argument
2179 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_config()
2182 ret = phylink_validate(pl, support, &config); in phylink_sfp_config()
2184 phylink_err(pl, "validation with support %*pb failed: %d\n", in phylink_sfp_config()
2189 iface = sfp_select_interface(pl->sfp_bus, config.advertising); in phylink_sfp_config()
2191 phylink_err(pl, in phylink_sfp_config()
2199 ret = phylink_validate(pl, support1, &config); in phylink_sfp_config()
2201 phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_config()
2208 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_config()
2212 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_config()
2215 changed = !linkmode_equal(pl->supported, support) || in phylink_sfp_config()
2216 !linkmode_equal(pl->link_config.advertising, in phylink_sfp_config()
2219 linkmode_copy(pl->supported, support); in phylink_sfp_config()
2220 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_config()
2223 if (pl->cur_link_an_mode != mode || in phylink_sfp_config()
2224 pl->link_config.interface != config.interface) { in phylink_sfp_config()
2225 pl->link_config.interface = config.interface; in phylink_sfp_config()
2226 pl->cur_link_an_mode = mode; in phylink_sfp_config()
2230 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_config()
2235 pl->link_port = pl->sfp_port; in phylink_sfp_config()
2238 &pl->phylink_disable_state)) in phylink_sfp_config()
2239 phylink_mac_initial_config(pl, false); in phylink_sfp_config()
2247 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
2248 unsigned long *support = pl->sfp_support; in phylink_sfp_module_insert()
2253 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2254 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2257 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
2258 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
2261 return phylink_sfp_config(pl, MLO_AN_INBAND, support, support); in phylink_sfp_module_insert()
2266 struct phylink *pl = upstream; in phylink_sfp_module_start() local
2269 if (pl->phydev) { in phylink_sfp_module_start()
2270 phy_start(pl->phydev); in phylink_sfp_module_start()
2277 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
2280 return phylink_sfp_config(pl, MLO_AN_INBAND, in phylink_sfp_module_start()
2281 pl->sfp_support, pl->sfp_support); in phylink_sfp_module_start()
2286 struct phylink *pl = upstream; in phylink_sfp_module_stop() local
2289 if (pl->phydev) in phylink_sfp_module_stop()
2290 phy_stop(pl->phydev); in phylink_sfp_module_stop()
2295 struct phylink *pl = upstream; in phylink_sfp_link_down() local
2299 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
2304 struct phylink *pl = upstream; in phylink_sfp_link_up() local
2308 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
2309 phylink_run_resolve(pl); in phylink_sfp_link_up()
2323 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
2343 ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising); in phylink_sfp_connect_phy()
2347 interface = pl->link_config.interface; in phylink_sfp_connect_phy()
2348 ret = phylink_attach_phy(pl, phy, interface); in phylink_sfp_connect_phy()
2352 ret = phylink_bringup_phy(pl, phy, interface); in phylink_sfp_connect_phy()