Lines Matching refs: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__); \
169 static int phylink_validate_any(struct phylink *pl, unsigned long *supported, in phylink_validate_any() argument
179 if (test_bit(intf, pl->config->supported_interfaces)) { in phylink_validate_any()
184 pl->mac_ops->validate(pl->config, s, &t); in phylink_validate_any()
196 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
199 if (!phy_interface_empty(pl->config->supported_interfaces)) { in phylink_validate()
201 return phylink_validate_any(pl, supported, state); in phylink_validate()
204 pl->config->supported_interfaces)) in phylink_validate()
208 pl->mac_ops->validate(pl->config, supported, state); in phylink_validate()
213 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
226 pl->link_config.speed = speed; in phylink_parse_fixedlink()
227 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
230 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
237 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
240 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
247 pl->link_gpio = desc; in phylink_parse_fixedlink()
261 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
268 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
270 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
273 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
276 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
280 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
281 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
282 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
283 pl->link_config.speed); in phylink_parse_fixedlink()
285 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
286 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
287 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
289 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
290 pl->supported, true); in phylink_parse_fixedlink()
291 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
292 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
293 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
294 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
295 phylink_set(pl->supported, Autoneg); in phylink_parse_fixedlink()
297 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
298 __set_bit(s->bit, pl->link_config.lp_advertising); in phylink_parse_fixedlink()
300 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
301 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
302 pl->link_config.speed); in phylink_parse_fixedlink()
305 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
306 pl->supported); in phylink_parse_fixedlink()
308 pl->link_config.link = 1; in phylink_parse_fixedlink()
309 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
314 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
321 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
326 pl->config->ovr_an_inband) { in phylink_parse_mode()
327 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
328 phylink_err(pl, in phylink_parse_mode()
333 linkmode_zero(pl->supported); in phylink_parse_mode()
334 phylink_set(pl->supported, MII); in phylink_parse_mode()
335 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
336 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
337 phylink_set(pl->supported, Pause); in phylink_parse_mode()
338 pl->link_config.an_enabled = true; in phylink_parse_mode()
339 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
341 switch (pl->link_config.interface) { in phylink_parse_mode()
344 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
345 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
346 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
347 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
348 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
349 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
353 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
357 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
361 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
365 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
366 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
367 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
372 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
373 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
374 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
375 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
376 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
377 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
378 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
379 phylink_set(pl->supported, 1000baseKX_Full); in phylink_parse_mode()
380 phylink_set(pl->supported, 2500baseT_Full); in phylink_parse_mode()
381 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
382 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
383 phylink_set(pl->supported, 10000baseT_Full); in phylink_parse_mode()
384 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
385 phylink_set(pl->supported, 10000baseKX4_Full); in phylink_parse_mode()
386 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
387 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
388 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
389 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
390 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
394 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
395 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
396 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
397 phylink_set(pl->supported, 40000baseKR4_Full); in phylink_parse_mode()
398 phylink_set(pl->supported, 40000baseCR4_Full); in phylink_parse_mode()
399 phylink_set(pl->supported, 40000baseSR4_Full); in phylink_parse_mode()
400 phylink_set(pl->supported, 40000baseLR4_Full); in phylink_parse_mode()
401 phylink_set(pl->supported, 50000baseCR2_Full); in phylink_parse_mode()
402 phylink_set(pl->supported, 50000baseKR2_Full); in phylink_parse_mode()
403 phylink_set(pl->supported, 50000baseSR2_Full); in phylink_parse_mode()
404 phylink_set(pl->supported, 50000baseKR_Full); in phylink_parse_mode()
405 phylink_set(pl->supported, 50000baseSR_Full); in phylink_parse_mode()
406 phylink_set(pl->supported, 50000baseCR_Full); in phylink_parse_mode()
407 phylink_set(pl->supported, 50000baseLR_ER_FR_Full); in phylink_parse_mode()
408 phylink_set(pl->supported, 50000baseDR_Full); in phylink_parse_mode()
409 phylink_set(pl->supported, 100000baseKR4_Full); in phylink_parse_mode()
410 phylink_set(pl->supported, 100000baseSR4_Full); in phylink_parse_mode()
411 phylink_set(pl->supported, 100000baseCR4_Full); in phylink_parse_mode()
412 phylink_set(pl->supported, 100000baseLR4_ER4_Full); in phylink_parse_mode()
413 phylink_set(pl->supported, 100000baseKR2_Full); in phylink_parse_mode()
414 phylink_set(pl->supported, 100000baseSR2_Full); in phylink_parse_mode()
415 phylink_set(pl->supported, 100000baseCR2_Full); in phylink_parse_mode()
416 phylink_set(pl->supported, 100000baseLR2_ER2_FR2_Full); in phylink_parse_mode()
417 phylink_set(pl->supported, 100000baseDR2_Full); in phylink_parse_mode()
421 phylink_err(pl, in phylink_parse_mode()
423 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
427 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
429 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
430 phylink_err(pl, in phylink_parse_mode()
436 pl->link_config.an_enabled = phylink_test(pl->supported, Autoneg); in phylink_parse_mode()
442 static void phylink_apply_manual_flow(struct phylink *pl, in phylink_apply_manual_flow() argument
450 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
451 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
470 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
473 phylink_dbg(pl, in phylink_mac_config()
475 __func__, phylink_an_mode_str(pl->cur_link_an_mode), in phylink_mac_config()
482 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state); in phylink_mac_config()
485 static void phylink_mac_pcs_an_restart(struct phylink *pl) in phylink_mac_pcs_an_restart() argument
487 if (pl->link_config.an_enabled && in phylink_mac_pcs_an_restart()
488 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_mac_pcs_an_restart()
489 phylink_autoneg_inband(pl->cur_link_an_mode)) { in phylink_mac_pcs_an_restart()
490 if (pl->pcs_ops) in phylink_mac_pcs_an_restart()
491 pl->pcs_ops->pcs_an_restart(pl->pcs); in phylink_mac_pcs_an_restart()
493 pl->mac_ops->mac_an_restart(pl->config); in phylink_mac_pcs_an_restart()
497 static void phylink_major_config(struct phylink *pl, bool restart, in phylink_major_config() argument
502 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); in phylink_major_config()
504 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
505 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, in phylink_major_config()
508 phylink_err(pl, "mac_prepare failed: %pe\n", in phylink_major_config()
514 phylink_mac_config(pl, state); in phylink_major_config()
516 if (pl->pcs_ops) { in phylink_major_config()
517 err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_major_config()
520 !!(pl->link_config.pause & in phylink_major_config()
523 phylink_err(pl, "pcs_config failed: %pe\n", in phylink_major_config()
529 phylink_mac_pcs_an_restart(pl); in phylink_major_config()
531 if (pl->mac_ops->mac_finish) { in phylink_major_config()
532 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode, in phylink_major_config()
535 phylink_err(pl, "mac_finish failed: %pe\n", in phylink_major_config()
546 static int phylink_change_inband_advert(struct phylink *pl) in phylink_change_inband_advert() argument
550 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
553 if (!pl->pcs_ops) { in phylink_change_inband_advert()
555 phylink_mac_config(pl, &pl->link_config); in phylink_change_inband_advert()
556 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
560 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__, in phylink_change_inband_advert()
561 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_change_inband_advert()
562 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
563 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
564 pl->link_config.pause); in phylink_change_inband_advert()
570 ret = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_change_inband_advert()
571 pl->link_config.interface, in phylink_change_inband_advert()
572 pl->link_config.advertising, in phylink_change_inband_advert()
573 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
578 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
583 static void phylink_mac_pcs_get_state(struct phylink *pl, in phylink_mac_pcs_get_state() argument
586 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
588 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
589 state->an_enabled = pl->link_config.an_enabled; in phylink_mac_pcs_get_state()
595 state->speed = pl->link_config.speed; in phylink_mac_pcs_get_state()
596 state->duplex = pl->link_config.duplex; in phylink_mac_pcs_get_state()
597 state->pause = pl->link_config.pause; in phylink_mac_pcs_get_state()
602 if (pl->pcs_ops) in phylink_mac_pcs_get_state()
603 pl->pcs_ops->pcs_get_state(pl->pcs, state); in phylink_mac_pcs_get_state()
604 else if (pl->mac_ops->mac_pcs_get_state) in phylink_mac_pcs_get_state()
605 pl->mac_ops->mac_pcs_get_state(pl->config, state); in phylink_mac_pcs_get_state()
613 static void phylink_get_fixed_state(struct phylink *pl, in phylink_get_fixed_state() argument
616 *state = pl->link_config; in phylink_get_fixed_state()
617 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
618 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
619 else if (pl->link_gpio) in phylink_get_fixed_state()
620 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
625 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart) in phylink_mac_initial_config() argument
629 switch (pl->cur_link_an_mode) { in phylink_mac_initial_config()
631 link_state = pl->phy_state; in phylink_mac_initial_config()
635 phylink_get_fixed_state(pl, &link_state); in phylink_mac_initial_config()
639 link_state = pl->link_config; in phylink_mac_initial_config()
650 phylink_apply_manual_flow(pl, &link_state); in phylink_mac_initial_config()
651 phylink_major_config(pl, force_restart, &link_state); in phylink_mac_initial_config()
668 static void phylink_link_up(struct phylink *pl, in phylink_link_up() argument
671 struct net_device *ndev = pl->netdev; in phylink_link_up()
673 pl->cur_interface = link_state.interface; in phylink_link_up()
675 if (pl->pcs_ops && pl->pcs_ops->pcs_link_up) in phylink_link_up()
676 pl->pcs_ops->pcs_link_up(pl->pcs, pl->cur_link_an_mode, in phylink_link_up()
677 pl->cur_interface, in phylink_link_up()
680 pl->mac_ops->mac_link_up(pl->config, pl->phydev, in phylink_link_up()
681 pl->cur_link_an_mode, pl->cur_interface, in phylink_link_up()
689 phylink_info(pl, in phylink_link_up()
696 static void phylink_link_down(struct phylink *pl) in phylink_link_down() argument
698 struct net_device *ndev = pl->netdev; in phylink_link_down()
702 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode, in phylink_link_down()
703 pl->cur_interface); in phylink_link_down()
704 phylink_info(pl, "Link is Down\n"); in phylink_link_down()
709 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
711 struct net_device *ndev = pl->netdev; in phylink_resolve()
716 mutex_lock(&pl->state_mutex); in phylink_resolve()
717 if (pl->netdev) in phylink_resolve()
720 cur_link_state = pl->old_link_state; in phylink_resolve()
722 if (pl->phylink_disable_state) { in phylink_resolve()
723 pl->mac_link_dropped = false; in phylink_resolve()
725 } else if (pl->mac_link_dropped) { in phylink_resolve()
729 switch (pl->cur_link_an_mode) { in phylink_resolve()
731 link_state = pl->phy_state; in phylink_resolve()
732 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
737 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
742 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
753 phylink_mac_pcs_get_state(pl, in phylink_resolve()
760 if (pl->phydev) in phylink_resolve()
761 link_state.link &= pl->phy_state.link; in phylink_resolve()
764 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
770 pl->phy_state.interface) { in phylink_resolve()
774 link_state.interface = pl->phy_state.interface; in phylink_resolve()
779 link_state.pause = pl->phy_state.pause; in phylink_resolve()
782 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
788 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
793 phylink_link_down(pl); in phylink_resolve()
796 phylink_major_config(pl, false, &link_state); in phylink_resolve()
797 pl->link_config.interface = link_state.interface; in phylink_resolve()
798 } else if (!pl->pcs_ops) { in phylink_resolve()
805 phylink_mac_config(pl, &link_state); in phylink_resolve()
810 pl->old_link_state = link_state.link; in phylink_resolve()
812 phylink_link_down(pl); in phylink_resolve()
814 phylink_link_up(pl, link_state); in phylink_resolve()
817 pl->mac_link_dropped = false; in phylink_resolve()
818 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
820 mutex_unlock(&pl->state_mutex); in phylink_resolve()
823 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
825 if (!pl->phylink_disable_state) in phylink_run_resolve()
826 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
829 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
831 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
833 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
835 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
836 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
842 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
846 phylink_run_resolve(pl); in phylink_fixed_poll()
851 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
863 phylink_err(pl, "unable to attach SFP bus: %d\n", ret); in phylink_register_sfp()
867 pl->sfp_bus = bus; in phylink_register_sfp()
869 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops); in phylink_register_sfp()
896 struct phylink *pl; in phylink_create() local
899 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
900 if (!pl) in phylink_create()
903 mutex_init(&pl->state_mutex); in phylink_create()
904 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
906 pl->config = config; in phylink_create()
908 pl->netdev = to_net_dev(config->dev); in phylink_create()
910 pl->dev = config->dev; in phylink_create()
912 kfree(pl); in phylink_create()
916 pl->phy_state.interface = iface; in phylink_create()
917 pl->link_interface = iface; in phylink_create()
919 pl->link_port = PORT_BNC; in phylink_create()
921 pl->link_port = PORT_MII; in phylink_create()
922 pl->link_config.interface = iface; in phylink_create()
923 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
924 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
925 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
926 pl->link_config.an_enabled = true; in phylink_create()
927 pl->mac_ops = mac_ops; in phylink_create()
928 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
929 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
931 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
932 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
933 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
935 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
937 kfree(pl); in phylink_create()
941 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
942 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
944 kfree(pl); in phylink_create()
949 pl->cur_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
951 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
953 kfree(pl); in phylink_create()
957 return pl; in phylink_create()
975 void phylink_set_pcs(struct phylink *pl, struct phylink_pcs *pcs) in phylink_set_pcs() argument
977 pl->pcs = pcs; in phylink_set_pcs()
978 pl->pcs_ops = pcs->ops; in phylink_set_pcs()
991 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
993 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
994 if (pl->link_gpio) in phylink_destroy()
995 gpiod_put(pl->link_gpio); in phylink_destroy()
997 cancel_work_sync(&pl->resolve); in phylink_destroy()
998 kfree(pl); in phylink_destroy()
1004 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
1009 mutex_lock(&pl->state_mutex); in phylink_phy_change()
1010 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
1011 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
1012 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
1014 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
1016 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
1017 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
1018 pl->phy_state.link = up; in phylink_phy_change()
1019 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
1021 phylink_run_resolve(pl); in phylink_phy_change()
1023 phylink_dbg(pl, "phy link %s %s/%s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
1027 phylink_pause_to_str(pl->phy_state.pause)); in phylink_phy_change()
1030 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, in phylink_bringup_phy() argument
1064 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
1066 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %d\n", in phylink_bringup_phy()
1074 phy->phylink = pl; in phylink_bringup_phy()
1078 phylink_info(pl, in phylink_bringup_phy()
1084 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
1085 pl->phydev = phy; in phylink_bringup_phy()
1086 pl->phy_state.interface = interface; in phylink_bringup_phy()
1087 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
1088 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
1089 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
1090 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
1091 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
1095 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
1098 phylink_dbg(pl, in phylink_bringup_phy()
1100 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
1109 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy, in phylink_attach_phy() argument
1112 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
1113 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
1117 if (pl->phydev) in phylink_attach_phy()
1120 return phy_attach_direct(pl->netdev, phy, 0, interface); in phylink_attach_phy()
1138 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
1143 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
1144 pl->link_interface = phy->interface; in phylink_connect_phy()
1145 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
1148 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
1152 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
1172 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
1175 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags); in phylink_of_phy_connect()
1190 int phylink_fwnode_phy_connect(struct phylink *pl, in phylink_fwnode_phy_connect() argument
1199 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_fwnode_phy_connect()
1200 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_fwnode_phy_connect()
1201 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_fwnode_phy_connect()
1206 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_fwnode_phy_connect()
1217 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_fwnode_phy_connect()
1218 pl->link_interface); in phylink_fwnode_phy_connect()
1224 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_fwnode_phy_connect()
1239 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
1245 phy = pl->phydev; in phylink_disconnect_phy()
1248 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
1249 pl->phydev = NULL; in phylink_disconnect_phy()
1250 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
1252 flush_work(&pl->resolve); in phylink_disconnect_phy()
1267 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
1270 pl->mac_link_dropped = true; in phylink_mac_change()
1271 phylink_run_resolve(pl); in phylink_mac_change()
1272 phylink_dbg(pl, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
1278 struct phylink *pl = data; in phylink_link_handler() local
1280 phylink_run_resolve(pl); in phylink_link_handler()
1293 void phylink_start(struct phylink *pl) in phylink_start() argument
1299 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
1300 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_start()
1301 phy_modes(pl->link_config.interface)); in phylink_start()
1304 if (pl->netdev) in phylink_start()
1305 netif_carrier_off(pl->netdev); in phylink_start()
1315 phylink_mac_initial_config(pl, true); in phylink_start()
1317 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
1318 phylink_run_resolve(pl); in phylink_start()
1320 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
1321 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
1327 "netdev link", pl)) in phylink_start()
1328 pl->link_irq = irq; in phylink_start()
1336 switch (pl->cfg_link_an_mode) { in phylink_start()
1338 poll |= pl->config->poll_fixed_state; in phylink_start()
1341 poll |= pl->config->pcs_poll; in phylink_start()
1342 if (pl->pcs) in phylink_start()
1343 poll |= pl->pcs->poll; in phylink_start()
1347 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1348 if (pl->phydev) in phylink_start()
1349 phy_start(pl->phydev); in phylink_start()
1350 if (pl->sfp_bus) in phylink_start()
1351 sfp_upstream_start(pl->sfp_bus); in phylink_start()
1367 void phylink_stop(struct phylink *pl) in phylink_stop() argument
1371 if (pl->sfp_bus) in phylink_stop()
1372 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
1373 if (pl->phydev) in phylink_stop()
1374 phy_stop(pl->phydev); in phylink_stop()
1375 del_timer_sync(&pl->link_poll); in phylink_stop()
1376 if (pl->link_irq) { in phylink_stop()
1377 free_irq(pl->link_irq, pl); in phylink_stop()
1378 pl->link_irq = 0; in phylink_stop()
1381 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
1399 void phylink_suspend(struct phylink *pl, bool mac_wol) in phylink_suspend() argument
1403 if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) { in phylink_suspend()
1405 mutex_lock(&pl->state_mutex); in phylink_suspend()
1408 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_suspend()
1414 if (pl->netdev) in phylink_suspend()
1415 netif_carrier_off(pl->netdev); in phylink_suspend()
1417 pl->old_link_state = false; in phylink_suspend()
1422 mutex_unlock(&pl->state_mutex); in phylink_suspend()
1424 phylink_stop(pl); in phylink_suspend()
1436 void phylink_resume(struct phylink *pl) in phylink_resume() argument
1440 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) { in phylink_resume()
1449 mutex_lock(&pl->state_mutex); in phylink_resume()
1450 phylink_link_down(pl); in phylink_resume()
1451 mutex_unlock(&pl->state_mutex); in phylink_resume()
1456 phylink_mac_initial_config(pl, true); in phylink_resume()
1459 clear_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_resume()
1460 phylink_run_resolve(pl); in phylink_resume()
1462 phylink_start(pl); in phylink_resume()
1476 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
1483 if (pl->phydev) in phylink_ethtool_get_wol()
1484 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1499 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
1505 if (pl->phydev) in phylink_ethtool_set_wol()
1506 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1543 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1550 if (pl->phydev) in phylink_ethtool_ksettings_get()
1551 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1553 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1555 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1557 switch (pl->cur_link_an_mode) { in phylink_ethtool_ksettings_get()
1563 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1571 if (pl->phydev) in phylink_ethtool_ksettings_get()
1574 phylink_mac_pcs_get_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1593 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1602 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1621 return phy_ethtool_ksettings_set(pl->phydev, kset); in phylink_ethtool_ksettings_set()
1624 config = pl->link_config; in phylink_ethtool_ksettings_set()
1628 pl->supported); in phylink_ethtool_ksettings_set()
1637 pl->supported, false); in phylink_ethtool_ksettings_set()
1644 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1645 if (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1646 s->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
1660 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1662 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
1686 if (pl->sfp_bus) { in phylink_ethtool_ksettings_set()
1687 config.interface = sfp_select_interface(pl->sfp_bus, in phylink_ethtool_ksettings_set()
1690 phylink_err(pl, in phylink_ethtool_ksettings_set()
1698 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1699 if (phylink_validate(pl, support, &config)) { in phylink_ethtool_ksettings_set()
1700 phylink_err(pl, "validation of %s/%s with support %*pb failed\n", in phylink_ethtool_ksettings_set()
1701 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_ethtool_ksettings_set()
1708 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1709 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
1717 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1718 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
1719 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
1720 pl->link_config.an_enabled = config.an_enabled; in phylink_ethtool_ksettings_set()
1722 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
1725 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
1726 phylink_link_down(pl); in phylink_ethtool_ksettings_set()
1727 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
1730 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
1731 phylink_major_config(pl, false, &config); in phylink_ethtool_ksettings_set()
1732 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1733 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1734 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
1736 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1737 phylink_change_inband_advert(pl); in phylink_ethtool_ksettings_set()
1739 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1756 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1762 if (pl->phydev) in phylink_ethtool_nway_reset()
1763 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1764 phylink_mac_pcs_an_restart(pl); in phylink_ethtool_nway_reset()
1775 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1780 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1781 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1782 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1791 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1794 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1800 if (pl->cur_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
1803 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1804 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1807 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1819 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1845 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
1846 phylink_change_inband_advert(pl); in phylink_ethtool_set_pauseparam()
1848 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1855 if (pl->phydev) in phylink_ethtool_set_pauseparam()
1856 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
1864 pl->mac_link_dropped = true; in phylink_ethtool_set_pauseparam()
1865 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1882 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1888 if (pl->phydev) in phylink_get_eee_err()
1889 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1902 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
1906 if (pl->phydev) in phylink_init_eee()
1907 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1918 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1924 if (pl->phydev) in phylink_ethtool_get_eee()
1925 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1936 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1942 if (pl->phydev) in phylink_ethtool_set_eee()
1943 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1975 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1978 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
2012 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
2015 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
2018 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
2056 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
2062 switch (pl->cur_link_an_mode) { in phylink_mii_read()
2065 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
2075 phylink_mac_pcs_get_state(pl, &state); in phylink_mii_read()
2084 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
2087 switch (pl->cur_link_an_mode) { in phylink_mii_write()
2119 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
2126 if (pl->phydev) { in phylink_mii_ioctl()
2130 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
2134 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2142 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2147 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
2157 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2165 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2191 int phylink_speed_down(struct phylink *pl, bool sync) in phylink_speed_down() argument
2197 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
2198 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
2214 int phylink_speed_up(struct phylink *pl) in phylink_speed_up() argument
2220 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
2221 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
2229 struct phylink *pl = upstream; in phylink_sfp_attach() local
2231 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
2236 struct phylink *pl = upstream; in phylink_sfp_detach() local
2238 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
2241 static int phylink_sfp_config(struct phylink *pl, u8 mode, in phylink_sfp_config() argument
2260 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_config()
2263 ret = phylink_validate(pl, support, &config); in phylink_sfp_config()
2265 phylink_err(pl, "validation with support %*pb failed: %d\n", in phylink_sfp_config()
2270 iface = sfp_select_interface(pl->sfp_bus, config.advertising); in phylink_sfp_config()
2272 phylink_err(pl, in phylink_sfp_config()
2280 ret = phylink_validate(pl, support1, &config); in phylink_sfp_config()
2282 phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_config()
2289 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_config()
2293 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_config()
2296 changed = !linkmode_equal(pl->supported, support) || in phylink_sfp_config()
2297 !linkmode_equal(pl->link_config.advertising, in phylink_sfp_config()
2300 linkmode_copy(pl->supported, support); in phylink_sfp_config()
2301 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_config()
2304 if (pl->cur_link_an_mode != mode || in phylink_sfp_config()
2305 pl->link_config.interface != config.interface) { in phylink_sfp_config()
2306 pl->link_config.interface = config.interface; in phylink_sfp_config()
2307 pl->cur_link_an_mode = mode; in phylink_sfp_config()
2311 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_config()
2316 pl->link_port = pl->sfp_port; in phylink_sfp_config()
2319 &pl->phylink_disable_state)) in phylink_sfp_config()
2320 phylink_mac_initial_config(pl, false); in phylink_sfp_config()
2328 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
2329 unsigned long *support = pl->sfp_support; in phylink_sfp_module_insert()
2334 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2335 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2338 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
2339 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
2342 return phylink_sfp_config(pl, MLO_AN_INBAND, support, support); in phylink_sfp_module_insert()
2347 struct phylink *pl = upstream; in phylink_sfp_module_start() local
2350 if (pl->phydev) { in phylink_sfp_module_start()
2351 phy_start(pl->phydev); in phylink_sfp_module_start()
2358 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
2361 return phylink_sfp_config(pl, MLO_AN_INBAND, in phylink_sfp_module_start()
2362 pl->sfp_support, pl->sfp_support); in phylink_sfp_module_start()
2367 struct phylink *pl = upstream; in phylink_sfp_module_stop() local
2370 if (pl->phydev) in phylink_sfp_module_stop()
2371 phy_stop(pl->phydev); in phylink_sfp_module_stop()
2376 struct phylink *pl = upstream; in phylink_sfp_link_down() local
2380 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
2385 struct phylink *pl = upstream; in phylink_sfp_link_up() local
2389 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
2390 phylink_run_resolve(pl); in phylink_sfp_link_up()
2404 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
2424 ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising); in phylink_sfp_connect_phy()
2428 interface = pl->link_config.interface; in phylink_sfp_connect_phy()
2429 ret = phylink_attach_phy(pl, phy, interface); in phylink_sfp_connect_phy()
2433 ret = phylink_bringup_phy(pl, phy, interface); in phylink_sfp_connect_phy()