Lines Matching full:pl
82 #define phylink_printk(level, pl, fmt, ...) \ argument
84 if ((pl)->config->type == PHYLINK_NETDEV) \
85 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
86 else if ((pl)->config->type == PHYLINK_DEV) \
87 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
90 #define phylink_err(pl, fmt, ...) \ argument
91 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
92 #define phylink_warn(pl, fmt, ...) \ argument
93 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
94 #define phylink_info(pl, fmt, ...) \ argument
95 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
97 #define phylink_dbg(pl, fmt, ...) \ argument
99 if ((pl)->config->type == PHYLINK_NETDEV) \
100 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
101 else if ((pl)->config->type == PHYLINK_DEV) \
102 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
105 #define phylink_dbg(pl, fmt, ...) \ argument
106 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
108 #define phylink_dbg(pl, fmt, ...) \ argument
111 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
156 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
159 pl->mac_ops->validate(pl->config, supported, state); in phylink_validate()
164 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
177 pl->link_config.speed = speed; in phylink_parse_fixedlink()
178 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
181 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
187 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
190 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
197 pl->link_gpio = desc; in phylink_parse_fixedlink()
211 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
218 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
220 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
223 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
226 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
230 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
231 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
232 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
233 pl->link_config.speed); in phylink_parse_fixedlink()
235 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
236 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
237 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
239 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
240 pl->supported, true); in phylink_parse_fixedlink()
241 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
242 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
243 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
244 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
245 phylink_set(pl->supported, Autoneg); in phylink_parse_fixedlink()
247 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
248 __set_bit(s->bit, pl->link_config.lp_advertising); in phylink_parse_fixedlink()
250 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
251 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
252 pl->link_config.speed); in phylink_parse_fixedlink()
255 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
256 pl->supported); in phylink_parse_fixedlink()
258 pl->link_config.link = 1; in phylink_parse_fixedlink()
259 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
264 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
271 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
276 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
277 phylink_err(pl, in phylink_parse_mode()
282 linkmode_zero(pl->supported); in phylink_parse_mode()
283 phylink_set(pl->supported, MII); in phylink_parse_mode()
284 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
285 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
286 phylink_set(pl->supported, Pause); in phylink_parse_mode()
287 pl->link_config.an_enabled = true; in phylink_parse_mode()
288 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
290 switch (pl->link_config.interface) { in phylink_parse_mode()
293 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
294 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
295 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
296 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
297 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
298 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
302 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
306 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
312 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
313 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
314 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
315 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
316 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
317 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
318 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
319 phylink_set(pl->supported, 1000baseKX_Full); in phylink_parse_mode()
320 phylink_set(pl->supported, 2500baseT_Full); in phylink_parse_mode()
321 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
322 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
323 phylink_set(pl->supported, 10000baseT_Full); in phylink_parse_mode()
324 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
325 phylink_set(pl->supported, 10000baseKX4_Full); in phylink_parse_mode()
326 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
327 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
328 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
329 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
330 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
334 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
335 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
336 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
337 phylink_set(pl->supported, 40000baseKR4_Full); in phylink_parse_mode()
338 phylink_set(pl->supported, 40000baseCR4_Full); in phylink_parse_mode()
339 phylink_set(pl->supported, 40000baseSR4_Full); in phylink_parse_mode()
340 phylink_set(pl->supported, 40000baseLR4_Full); in phylink_parse_mode()
341 phylink_set(pl->supported, 50000baseCR2_Full); in phylink_parse_mode()
342 phylink_set(pl->supported, 50000baseKR2_Full); in phylink_parse_mode()
343 phylink_set(pl->supported, 50000baseSR2_Full); in phylink_parse_mode()
344 phylink_set(pl->supported, 50000baseKR_Full); in phylink_parse_mode()
345 phylink_set(pl->supported, 50000baseSR_Full); in phylink_parse_mode()
346 phylink_set(pl->supported, 50000baseCR_Full); in phylink_parse_mode()
347 phylink_set(pl->supported, 50000baseLR_ER_FR_Full); in phylink_parse_mode()
348 phylink_set(pl->supported, 50000baseDR_Full); in phylink_parse_mode()
349 phylink_set(pl->supported, 100000baseKR4_Full); in phylink_parse_mode()
350 phylink_set(pl->supported, 100000baseSR4_Full); in phylink_parse_mode()
351 phylink_set(pl->supported, 100000baseCR4_Full); in phylink_parse_mode()
352 phylink_set(pl->supported, 100000baseLR4_ER4_Full); in phylink_parse_mode()
353 phylink_set(pl->supported, 100000baseKR2_Full); in phylink_parse_mode()
354 phylink_set(pl->supported, 100000baseSR2_Full); in phylink_parse_mode()
355 phylink_set(pl->supported, 100000baseCR2_Full); in phylink_parse_mode()
356 phylink_set(pl->supported, 100000baseLR2_ER2_FR2_Full); in phylink_parse_mode()
357 phylink_set(pl->supported, 100000baseDR2_Full); in phylink_parse_mode()
361 phylink_err(pl, in phylink_parse_mode()
363 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
367 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
369 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
370 phylink_err(pl, in phylink_parse_mode()
376 pl->link_config.an_enabled = phylink_test(pl->supported, Autoneg); in phylink_parse_mode()
382 static void phylink_apply_manual_flow(struct phylink *pl, in phylink_apply_manual_flow() argument
390 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
391 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
410 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
413 phylink_dbg(pl, in phylink_mac_config()
415 __func__, phylink_an_mode_str(pl->cur_link_an_mode), in phylink_mac_config()
422 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state); in phylink_mac_config()
425 static void phylink_mac_pcs_an_restart(struct phylink *pl) in phylink_mac_pcs_an_restart() argument
427 if (pl->link_config.an_enabled && in phylink_mac_pcs_an_restart()
428 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_mac_pcs_an_restart()
429 phylink_autoneg_inband(pl->cur_link_an_mode)) { in phylink_mac_pcs_an_restart()
430 if (pl->pcs_ops) in phylink_mac_pcs_an_restart()
431 pl->pcs_ops->pcs_an_restart(pl->pcs); in phylink_mac_pcs_an_restart()
433 pl->mac_ops->mac_an_restart(pl->config); in phylink_mac_pcs_an_restart()
437 static void phylink_major_config(struct phylink *pl, bool restart, in phylink_major_config() argument
442 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); in phylink_major_config()
444 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
445 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, in phylink_major_config()
448 phylink_err(pl, "mac_prepare failed: %pe\n", in phylink_major_config()
454 phylink_mac_config(pl, state); in phylink_major_config()
456 if (pl->pcs_ops) { in phylink_major_config()
457 err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_major_config()
460 !!(pl->link_config.pause & in phylink_major_config()
463 phylink_err(pl, "pcs_config failed: %pe\n", in phylink_major_config()
469 phylink_mac_pcs_an_restart(pl); in phylink_major_config()
471 if (pl->mac_ops->mac_finish) { in phylink_major_config()
472 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode, in phylink_major_config()
475 phylink_err(pl, "mac_finish failed: %pe\n", in phylink_major_config()
486 static int phylink_change_inband_advert(struct phylink *pl) in phylink_change_inband_advert() argument
490 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
493 if (!pl->pcs_ops) { in phylink_change_inband_advert()
495 phylink_mac_config(pl, &pl->link_config); in phylink_change_inband_advert()
496 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
500 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__, in phylink_change_inband_advert()
501 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_change_inband_advert()
502 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
503 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
504 pl->link_config.pause); in phylink_change_inband_advert()
510 ret = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_change_inband_advert()
511 pl->link_config.interface, in phylink_change_inband_advert()
512 pl->link_config.advertising, in phylink_change_inband_advert()
513 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
518 phylink_mac_pcs_an_restart(pl); in phylink_change_inband_advert()
523 static void phylink_mac_pcs_get_state(struct phylink *pl, in phylink_mac_pcs_get_state() argument
526 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
528 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
529 state->an_enabled = pl->link_config.an_enabled; in phylink_mac_pcs_get_state()
536 if (pl->pcs_ops) in phylink_mac_pcs_get_state()
537 pl->pcs_ops->pcs_get_state(pl->pcs, state); in phylink_mac_pcs_get_state()
538 else if (pl->mac_ops->mac_pcs_get_state) in phylink_mac_pcs_get_state()
539 pl->mac_ops->mac_pcs_get_state(pl->config, state); in phylink_mac_pcs_get_state()
547 static void phylink_get_fixed_state(struct phylink *pl, in phylink_get_fixed_state() argument
550 *state = pl->link_config; in phylink_get_fixed_state()
551 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
552 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
553 else if (pl->link_gpio) in phylink_get_fixed_state()
554 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
559 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart) in phylink_mac_initial_config() argument
563 switch (pl->cur_link_an_mode) { in phylink_mac_initial_config()
565 link_state = pl->phy_state; in phylink_mac_initial_config()
569 phylink_get_fixed_state(pl, &link_state); in phylink_mac_initial_config()
573 link_state = pl->link_config; in phylink_mac_initial_config()
584 phylink_apply_manual_flow(pl, &link_state); in phylink_mac_initial_config()
585 phylink_major_config(pl, force_restart, &link_state); in phylink_mac_initial_config()
602 static void phylink_link_up(struct phylink *pl, in phylink_link_up() argument
605 struct net_device *ndev = pl->netdev; in phylink_link_up()
607 pl->cur_interface = link_state.interface; in phylink_link_up()
609 if (pl->pcs_ops && pl->pcs_ops->pcs_link_up) in phylink_link_up()
610 pl->pcs_ops->pcs_link_up(pl->pcs, pl->cur_link_an_mode, in phylink_link_up()
611 pl->cur_interface, in phylink_link_up()
614 pl->mac_ops->mac_link_up(pl->config, pl->phydev, in phylink_link_up()
615 pl->cur_link_an_mode, pl->cur_interface, in phylink_link_up()
623 phylink_info(pl, in phylink_link_up()
630 static void phylink_link_down(struct phylink *pl) in phylink_link_down() argument
632 struct net_device *ndev = pl->netdev; in phylink_link_down()
636 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode, in phylink_link_down()
637 pl->cur_interface); in phylink_link_down()
638 phylink_info(pl, "Link is Down\n"); in phylink_link_down()
643 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
645 struct net_device *ndev = pl->netdev; in phylink_resolve()
650 mutex_lock(&pl->state_mutex); in phylink_resolve()
651 if (pl->netdev) in phylink_resolve()
654 cur_link_state = pl->old_link_state; in phylink_resolve()
656 if (pl->phylink_disable_state) { in phylink_resolve()
657 pl->mac_link_dropped = false; in phylink_resolve()
659 } else if (pl->mac_link_dropped) { in phylink_resolve()
663 switch (pl->cur_link_an_mode) { in phylink_resolve()
665 link_state = pl->phy_state; in phylink_resolve()
666 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
671 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
676 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
687 phylink_mac_pcs_get_state(pl, in phylink_resolve()
693 if (pl->phydev) in phylink_resolve()
694 link_state.link &= pl->phy_state.link; in phylink_resolve()
697 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
703 pl->phy_state.interface) { in phylink_resolve()
707 link_state.interface = pl->phy_state.interface; in phylink_resolve()
711 link_state.pause = pl->phy_state.pause; in phylink_resolve()
714 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
720 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
725 phylink_link_down(pl); in phylink_resolve()
728 phylink_major_config(pl, false, &link_state); in phylink_resolve()
729 pl->link_config.interface = link_state.interface; in phylink_resolve()
730 } else if (!pl->pcs_ops) { in phylink_resolve()
737 phylink_mac_config(pl, &link_state); in phylink_resolve()
742 pl->old_link_state = link_state.link; in phylink_resolve()
744 phylink_link_down(pl); in phylink_resolve()
746 phylink_link_up(pl, link_state); in phylink_resolve()
749 pl->mac_link_dropped = false; in phylink_resolve()
750 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
752 mutex_unlock(&pl->state_mutex); in phylink_resolve()
755 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
757 if (!pl->phylink_disable_state) in phylink_run_resolve()
758 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
761 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
763 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
765 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
767 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
768 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
774 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
778 phylink_run_resolve(pl); in phylink_fixed_poll()
783 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
795 phylink_err(pl, "unable to attach SFP bus: %d\n", ret); in phylink_register_sfp()
799 pl->sfp_bus = bus; in phylink_register_sfp()
801 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops); in phylink_register_sfp()
828 struct phylink *pl; in phylink_create() local
831 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
832 if (!pl) in phylink_create()
835 mutex_init(&pl->state_mutex); in phylink_create()
836 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
838 pl->config = config; in phylink_create()
840 pl->netdev = to_net_dev(config->dev); in phylink_create()
841 netif_carrier_off(pl->netdev); in phylink_create()
843 pl->dev = config->dev; in phylink_create()
845 kfree(pl); in phylink_create()
849 pl->phy_state.interface = iface; in phylink_create()
850 pl->link_interface = iface; in phylink_create()
852 pl->link_port = PORT_BNC; in phylink_create()
854 pl->link_port = PORT_MII; in phylink_create()
855 pl->link_config.interface = iface; in phylink_create()
856 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
857 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
858 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
859 pl->link_config.an_enabled = true; in phylink_create()
860 pl->mac_ops = mac_ops; in phylink_create()
861 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
862 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
864 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
865 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
866 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
868 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
870 kfree(pl); in phylink_create()
874 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
875 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
877 kfree(pl); in phylink_create()
882 pl->cur_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
884 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
886 kfree(pl); in phylink_create()
890 return pl; in phylink_create()
896 * @pl: a pointer to a &struct phylink returned from phylink_create()
908 void phylink_set_pcs(struct phylink *pl, struct phylink_pcs *pcs) in phylink_set_pcs() argument
910 pl->pcs = pcs; in phylink_set_pcs()
911 pl->pcs_ops = pcs->ops; in phylink_set_pcs()
917 * @pl: a pointer to a &struct phylink returned from phylink_create()
924 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
926 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
927 if (pl->link_gpio) in phylink_destroy()
928 gpiod_put(pl->link_gpio); in phylink_destroy()
930 cancel_work_sync(&pl->resolve); in phylink_destroy()
931 kfree(pl); in phylink_destroy()
937 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
942 mutex_lock(&pl->state_mutex); in phylink_phy_change()
943 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
944 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
945 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
947 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
949 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
950 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
951 pl->phy_state.link = up; in phylink_phy_change()
952 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
954 phylink_run_resolve(pl); in phylink_phy_change()
956 phylink_dbg(pl, "phy link %s %s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
962 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, in phylink_bringup_phy() argument
996 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
998 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %d\n", in phylink_bringup_phy()
1006 phy->phylink = pl; in phylink_bringup_phy()
1010 phylink_info(pl, in phylink_bringup_phy()
1016 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
1017 pl->phydev = phy; in phylink_bringup_phy()
1018 pl->phy_state.interface = interface; in phylink_bringup_phy()
1019 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
1020 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
1021 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
1022 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
1023 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
1027 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
1030 phylink_dbg(pl, in phylink_bringup_phy()
1032 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
1041 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy, in phylink_attach_phy() argument
1044 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
1045 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
1049 if (pl->phydev) in phylink_attach_phy()
1052 return phy_attach_direct(pl->netdev, phy, 0, interface); in phylink_attach_phy()
1057 * @pl: a pointer to a &struct phylink returned from phylink_create()
1060 * Connect @phy to the phylink instance specified by @pl by calling
1070 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
1075 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
1076 pl->link_interface = phy->interface; in phylink_connect_phy()
1077 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
1080 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
1084 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
1094 * @pl: a pointer to a &struct phylink returned from phylink_create()
1099 * specified by @pl. Actions specified in phylink_connect_phy() will be
1104 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
1112 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_of_phy_connect()
1113 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_of_phy_connect()
1114 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_of_phy_connect()
1124 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_of_phy_connect()
1135 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_of_phy_connect()
1136 pl->link_interface); in phylink_of_phy_connect()
1140 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_of_phy_connect()
1151 * @pl: a pointer to a &struct phylink returned from phylink_create()
1153 * Disconnect any current PHY from the phylink instance described by @pl.
1155 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
1161 phy = pl->phydev; in phylink_disconnect_phy()
1164 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
1165 pl->phydev = NULL; in phylink_disconnect_phy()
1166 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
1168 flush_work(&pl->resolve); in phylink_disconnect_phy()
1177 * @pl: a pointer to a &struct phylink returned from phylink_create()
1183 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
1186 pl->mac_link_dropped = true; in phylink_mac_change()
1187 phylink_run_resolve(pl); in phylink_mac_change()
1188 phylink_dbg(pl, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
1194 struct phylink *pl = data; in phylink_link_handler() local
1196 phylink_run_resolve(pl); in phylink_link_handler()
1203 * @pl: a pointer to a &struct phylink returned from phylink_create()
1205 * Start the phylink instance specified by @pl, configuring the MAC for the
1209 void phylink_start(struct phylink *pl) in phylink_start() argument
1215 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
1216 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_start()
1217 phy_modes(pl->link_config.interface)); in phylink_start()
1220 if (pl->netdev) in phylink_start()
1221 netif_carrier_off(pl->netdev); in phylink_start()
1231 phylink_mac_initial_config(pl, true); in phylink_start()
1233 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
1234 phylink_run_resolve(pl); in phylink_start()
1236 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
1237 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
1243 "netdev link", pl)) in phylink_start()
1244 pl->link_irq = irq; in phylink_start()
1252 switch (pl->cfg_link_an_mode) { in phylink_start()
1254 poll |= pl->config->poll_fixed_state; in phylink_start()
1257 poll |= pl->config->pcs_poll; in phylink_start()
1258 if (pl->pcs) in phylink_start()
1259 poll |= pl->pcs->poll; in phylink_start()
1263 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1264 if (pl->phydev) in phylink_start()
1265 phy_start(pl->phydev); in phylink_start()
1266 if (pl->sfp_bus) in phylink_start()
1267 sfp_upstream_start(pl->sfp_bus); in phylink_start()
1273 * @pl: a pointer to a &struct phylink returned from phylink_create()
1275 * Stop the phylink instance specified by @pl. This should be called from the
1280 void phylink_stop(struct phylink *pl) in phylink_stop() argument
1284 if (pl->sfp_bus) in phylink_stop()
1285 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
1286 if (pl->phydev) in phylink_stop()
1287 phy_stop(pl->phydev); in phylink_stop()
1288 del_timer_sync(&pl->link_poll); in phylink_stop()
1289 if (pl->link_irq) { in phylink_stop()
1290 free_irq(pl->link_irq, pl); in phylink_stop()
1291 pl->link_irq = 0; in phylink_stop()
1294 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
1300 * @pl: a pointer to a &struct phylink returned from phylink_create()
1304 * instance specified by @pl. If no PHY is currently attached, report no
1307 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
1314 if (pl->phydev) in phylink_ethtool_get_wol()
1315 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1321 * @pl: a pointer to a &struct phylink returned from phylink_create()
1325 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
1330 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
1336 if (pl->phydev) in phylink_ethtool_set_wol()
1337 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1367 * @pl: a pointer to a &struct phylink returned from phylink_create()
1370 * Read the current link settings for the phylink instance specified by @pl.
1374 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1381 if (pl->phydev) { in phylink_ethtool_ksettings_get()
1382 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1384 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1387 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1389 switch (pl->cur_link_an_mode) { in phylink_ethtool_ksettings_get()
1395 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1403 if (pl->phydev) in phylink_ethtool_ksettings_get()
1406 phylink_mac_pcs_get_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1422 * @pl: a pointer to a &struct phylink returned from phylink_create()
1425 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1434 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1436 * to update the pl->link_config settings: in phylink_ethtool_ksettings_set()
1453 return phy_ethtool_ksettings_set(pl->phydev, kset); in phylink_ethtool_ksettings_set()
1456 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1457 config = pl->link_config; in phylink_ethtool_ksettings_set()
1480 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1481 if (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1482 s->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
1496 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1498 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
1514 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
1525 if (pl->sfp_port && pl->sfp_bus) { in phylink_ethtool_ksettings_set()
1526 config.interface = sfp_select_interface(pl->sfp_bus, in phylink_ethtool_ksettings_set()
1529 phylink_err(pl, in phylink_ethtool_ksettings_set()
1537 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1538 if (phylink_validate(pl, support, &config)) { in phylink_ethtool_ksettings_set()
1539 phylink_err(pl, "validation of %s/%s with support %*pb failed\n", in phylink_ethtool_ksettings_set()
1540 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_ethtool_ksettings_set()
1547 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1548 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
1549 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
1550 pl->link_config.an_enabled = config.an_enabled; in phylink_ethtool_ksettings_set()
1552 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
1555 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
1556 phylink_link_down(pl); in phylink_ethtool_ksettings_set()
1557 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
1560 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
1561 phylink_major_config(pl, false, &config); in phylink_ethtool_ksettings_set()
1562 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1563 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1564 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
1566 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1567 phylink_change_inband_advert(pl); in phylink_ethtool_ksettings_set()
1569 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1577 * @pl: a pointer to a &struct phylink returned from phylink_create()
1579 * Restart negotiation for the phylink instance specified by @pl. This will
1586 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1592 if (pl->phydev) in phylink_ethtool_nway_reset()
1593 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1594 phylink_mac_pcs_an_restart(pl); in phylink_ethtool_nway_reset()
1602 * @pl: a pointer to a &struct phylink returned from phylink_create()
1605 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1610 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1611 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1612 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1618 * @pl: a pointer to a &struct phylink returned from phylink_create()
1621 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1624 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1630 if (pl->cur_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
1633 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1634 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1637 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1649 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1675 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
1676 phylink_change_inband_advert(pl); in phylink_ethtool_set_pauseparam()
1678 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1685 if (pl->phydev) in phylink_ethtool_set_pauseparam()
1686 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
1694 pl->mac_link_dropped = true; in phylink_ethtool_set_pauseparam()
1695 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1705 * @pl: a pointer to a &struct phylink returned from phylink_create().
1708 * with the phylink instance specified by @pl.
1712 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1718 if (pl->phydev) in phylink_get_eee_err()
1719 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1727 * @pl: a pointer to a &struct phylink returned from phylink_create()
1732 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
1736 if (pl->phydev) in phylink_init_eee()
1737 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1745 * @pl: a pointer to a &struct phylink returned from phylink_create()
1748 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1754 if (pl->phydev) in phylink_ethtool_get_eee()
1755 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1763 * @pl: a pointer to a &struct phylink returned from phylink_create()
1766 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1772 if (pl->phydev) in phylink_ethtool_set_eee()
1773 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1805 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1808 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1842 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1845 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1848 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1886 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1892 switch (pl->cur_link_an_mode) { in phylink_mii_read()
1895 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1905 phylink_mac_pcs_get_state(pl, &state); in phylink_mii_read()
1914 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
1917 switch (pl->cur_link_an_mode) { in phylink_mii_write()
1933 * @pl: a pointer to a &struct phylink returned from phylink_create()
1938 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
1949 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
1956 if (pl->phydev) { in phylink_mii_ioctl()
1960 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
1964 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1972 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1977 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
1987 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1995 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2012 * @pl: a pointer to a &struct phylink returned from phylink_create()
2021 int phylink_speed_down(struct phylink *pl, bool sync) in phylink_speed_down() argument
2027 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
2028 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
2037 * @pl: a pointer to a &struct phylink returned from phylink_create()
2044 int phylink_speed_up(struct phylink *pl) in phylink_speed_up() argument
2050 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
2051 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
2059 struct phylink *pl = upstream; in phylink_sfp_attach() local
2061 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
2066 struct phylink *pl = upstream; in phylink_sfp_detach() local
2068 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
2071 static int phylink_sfp_config(struct phylink *pl, u8 mode, in phylink_sfp_config() argument
2090 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_config()
2093 ret = phylink_validate(pl, support, &config); in phylink_sfp_config()
2095 phylink_err(pl, "validation with support %*pb failed: %d\n", in phylink_sfp_config()
2100 iface = sfp_select_interface(pl->sfp_bus, config.advertising); in phylink_sfp_config()
2102 phylink_err(pl, in phylink_sfp_config()
2110 ret = phylink_validate(pl, support1, &config); in phylink_sfp_config()
2112 phylink_err(pl, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_config()
2119 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_config()
2123 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_config()
2126 changed = !linkmode_equal(pl->supported, support) || in phylink_sfp_config()
2127 !linkmode_equal(pl->link_config.advertising, in phylink_sfp_config()
2130 linkmode_copy(pl->supported, support); in phylink_sfp_config()
2131 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_config()
2134 if (pl->cur_link_an_mode != mode || in phylink_sfp_config()
2135 pl->link_config.interface != config.interface) { in phylink_sfp_config()
2136 pl->link_config.interface = config.interface; in phylink_sfp_config()
2137 pl->cur_link_an_mode = mode; in phylink_sfp_config()
2141 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_config()
2146 pl->link_port = pl->sfp_port; in phylink_sfp_config()
2149 &pl->phylink_disable_state)) in phylink_sfp_config()
2150 phylink_mac_initial_config(pl, false); in phylink_sfp_config()
2158 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
2159 unsigned long *support = pl->sfp_support; in phylink_sfp_module_insert()
2164 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2165 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2168 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
2169 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
2172 return phylink_sfp_config(pl, MLO_AN_INBAND, support, support); in phylink_sfp_module_insert()
2177 struct phylink *pl = upstream; in phylink_sfp_module_start() local
2180 if (pl->phydev) { in phylink_sfp_module_start()
2181 phy_start(pl->phydev); in phylink_sfp_module_start()
2188 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
2191 return phylink_sfp_config(pl, MLO_AN_INBAND, in phylink_sfp_module_start()
2192 pl->sfp_support, pl->sfp_support); in phylink_sfp_module_start()
2197 struct phylink *pl = upstream; in phylink_sfp_module_stop() local
2200 if (pl->phydev) in phylink_sfp_module_stop()
2201 phy_stop(pl->phydev); in phylink_sfp_module_stop()
2206 struct phylink *pl = upstream; in phylink_sfp_link_down() local
2210 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
2215 struct phylink *pl = upstream; in phylink_sfp_link_up() local
2219 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
2220 phylink_run_resolve(pl); in phylink_sfp_link_up()
2234 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
2254 ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising); in phylink_sfp_connect_phy()
2258 interface = pl->link_config.interface; in phylink_sfp_connect_phy()
2259 ret = phylink_attach_phy(pl, phy, interface); in phylink_sfp_connect_phy()
2263 ret = phylink_bringup_phy(pl, phy, interface); in phylink_sfp_connect_phy()