Lines Matching refs:pl
127 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
130 pl->ops->validate(pl->netdev, supported, state); in phylink_validate()
135 static int phylink_parse_fixedlink(struct phylink *pl, struct device_node *np) in phylink_parse_fixedlink() argument
148 pl->link_config.speed = speed; in phylink_parse_fixedlink()
149 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
152 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
157 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
159 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
167 pl->link_gpio = desc; in phylink_parse_fixedlink()
178 netdev_err(pl->netdev, "broken fixed-link?\n"); in phylink_parse_fixedlink()
182 pl->link_config.duplex = be32_to_cpu(fixed_prop[1]) ? in phylink_parse_fixedlink()
184 pl->link_config.speed = be32_to_cpu(fixed_prop[2]); in phylink_parse_fixedlink()
186 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
188 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
192 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
193 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
194 netdev_warn(pl->netdev, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
195 pl->link_config.speed); in phylink_parse_fixedlink()
197 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
198 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
199 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
201 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
202 pl->supported, in phylink_parse_fixedlink()
204 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
205 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
206 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
207 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
209 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
211 netdev_warn(pl->netdev, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
212 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
213 pl->link_config.speed); in phylink_parse_fixedlink()
216 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
217 pl->supported); in phylink_parse_fixedlink()
219 pl->link_config.link = 1; in phylink_parse_fixedlink()
220 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
225 static int phylink_parse_mode(struct phylink *pl, struct device_node *np) in phylink_parse_mode() argument
232 pl->link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
237 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
238 netdev_err(pl->netdev, in phylink_parse_mode()
243 linkmode_zero(pl->supported); in phylink_parse_mode()
244 phylink_set(pl->supported, MII); in phylink_parse_mode()
245 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
246 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
247 phylink_set(pl->supported, Pause); in phylink_parse_mode()
248 pl->link_config.an_enabled = true; in phylink_parse_mode()
250 switch (pl->link_config.interface) { in phylink_parse_mode()
252 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
253 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
254 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
255 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
256 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
257 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
258 pl->link_an_mode = MLO_AN_SGMII; in phylink_parse_mode()
262 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
263 pl->link_an_mode = MLO_AN_8023Z; in phylink_parse_mode()
267 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
268 pl->link_an_mode = MLO_AN_8023Z; in phylink_parse_mode()
272 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
273 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
274 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
275 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
276 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
277 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
278 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
279 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
280 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
281 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
282 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
283 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
284 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
285 pl->link_an_mode = MLO_AN_SGMII; in phylink_parse_mode()
289 netdev_err(pl->netdev, in phylink_parse_mode()
291 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
295 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
297 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
298 netdev_err(pl->netdev, in phylink_parse_mode()
307 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
310 netdev_dbg(pl->netdev, in phylink_mac_config()
312 __func__, phylink_an_mode_str(pl->link_an_mode), in phylink_mac_config()
319 pl->ops->mac_config(pl->netdev, pl->link_an_mode, state); in phylink_mac_config()
322 static void phylink_mac_an_restart(struct phylink *pl) in phylink_mac_an_restart() argument
324 if (pl->link_config.an_enabled && in phylink_mac_an_restart()
325 (pl->link_config.interface == PHY_INTERFACE_MODE_1000BASEX || in phylink_mac_an_restart()
326 pl->link_config.interface == PHY_INTERFACE_MODE_2500BASEX)) in phylink_mac_an_restart()
327 pl->ops->mac_an_restart(pl->netdev); in phylink_mac_an_restart()
330 static int phylink_get_mac_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_mac_state() argument
332 struct net_device *ndev = pl->netdev; in phylink_get_mac_state()
334 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_get_mac_state()
336 state->interface = pl->link_config.interface; in phylink_get_mac_state()
337 state->an_enabled = pl->link_config.an_enabled; in phylink_get_mac_state()
344 return pl->ops->mac_link_state(ndev, state); in phylink_get_mac_state()
350 static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_fixed_state() argument
352 *state = pl->link_config; in phylink_get_fixed_state()
353 if (pl->link_gpio) in phylink_get_fixed_state()
354 state->link = !!gpiod_get_value(pl->link_gpio); in phylink_get_fixed_state()
365 static void phylink_resolve_flow(struct phylink *pl, in phylink_resolve_flow() argument
370 if (pl->link_config.pause & MLO_PAUSE_AN) { in phylink_resolve_flow()
373 if (phylink_test(pl->link_config.advertising, Pause)) in phylink_resolve_flow()
375 if (phylink_test(pl->link_config.advertising, Asym_Pause)) in phylink_resolve_flow()
386 new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK; in phylink_resolve_flow()
409 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
411 struct net_device *ndev = pl->netdev; in phylink_resolve()
413 mutex_lock(&pl->state_mutex); in phylink_resolve()
414 if (pl->phylink_disable_state) { in phylink_resolve()
415 pl->mac_link_dropped = false; in phylink_resolve()
417 } else if (pl->mac_link_dropped) { in phylink_resolve()
420 switch (pl->link_an_mode) { in phylink_resolve()
422 link_state = pl->phy_state; in phylink_resolve()
423 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
424 phylink_mac_config(pl, &link_state); in phylink_resolve()
428 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
429 phylink_mac_config(pl, &link_state); in phylink_resolve()
433 phylink_get_mac_state(pl, &link_state); in phylink_resolve()
434 if (pl->phydev) { in phylink_resolve()
438 pl->phy_state.link; in phylink_resolve()
440 if (pl->phy_state.interface != in phylink_resolve()
442 link_state.interface = pl->phy_state.interface; in phylink_resolve()
450 if (pl->phy_state.link || changed) { in phylink_resolve()
451 link_state.pause |= pl->phy_state.pause; in phylink_resolve()
452 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
454 phylink_mac_config(pl, &link_state); in phylink_resolve()
460 phylink_get_mac_state(pl, &link_state); in phylink_resolve()
468 pl->ops->mac_link_down(ndev, pl->link_an_mode); in phylink_resolve()
471 pl->ops->mac_link_up(ndev, pl->link_an_mode, in phylink_resolve()
472 pl->phydev); in phylink_resolve()
483 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
484 pl->mac_link_dropped = false; in phylink_resolve()
485 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
487 mutex_unlock(&pl->state_mutex); in phylink_resolve()
490 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
492 if (!pl->phylink_disable_state) in phylink_run_resolve()
493 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
496 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
498 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
500 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
502 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
503 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
509 static int phylink_register_sfp(struct phylink *pl, struct device_node *np) in phylink_register_sfp() argument
517 pl->sfp_bus = sfp_register_upstream(sfp_np, pl->netdev, pl, in phylink_register_sfp()
519 if (!pl->sfp_bus) in phylink_register_sfp()
528 struct phylink *pl; in phylink_create() local
531 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
532 if (!pl) in phylink_create()
535 mutex_init(&pl->state_mutex); in phylink_create()
536 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
537 pl->netdev = ndev; in phylink_create()
538 pl->phy_state.interface = iface; in phylink_create()
539 pl->link_interface = iface; in phylink_create()
540 pl->link_port = PORT_MII; in phylink_create()
541 pl->link_config.interface = iface; in phylink_create()
542 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
543 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
544 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
545 pl->link_config.an_enabled = true; in phylink_create()
546 pl->ops = ops; in phylink_create()
547 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
549 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
550 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
551 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
553 ret = phylink_parse_mode(pl, np); in phylink_create()
555 kfree(pl); in phylink_create()
559 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_create()
560 ret = phylink_parse_fixedlink(pl, np); in phylink_create()
562 kfree(pl); in phylink_create()
567 ret = phylink_register_sfp(pl, np); in phylink_create()
569 kfree(pl); in phylink_create()
573 return pl; in phylink_create()
577 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
579 if (pl->sfp_bus) in phylink_destroy()
580 sfp_unregister_upstream(pl->sfp_bus); in phylink_destroy()
581 if (!IS_ERR_OR_NULL(pl->link_gpio)) in phylink_destroy()
582 gpiod_put(pl->link_gpio); in phylink_destroy()
584 cancel_work_sync(&pl->resolve); in phylink_destroy()
585 kfree(pl); in phylink_destroy()
591 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
593 mutex_lock(&pl->state_mutex); in phylink_phy_change()
594 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
595 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
596 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
598 pl->phy_state.pause |= MLO_PAUSE_SYM; in phylink_phy_change()
600 pl->phy_state.pause |= MLO_PAUSE_ASYM; in phylink_phy_change()
601 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
602 pl->phy_state.link = up; in phylink_phy_change()
603 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
605 phylink_run_resolve(pl); in phylink_phy_change()
607 netdev_dbg(pl->netdev, "phy link %s %s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
613 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) in phylink_bringup_phy() argument
624 config.interface = pl->link_config.interface; in phylink_bringup_phy()
638 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
642 phy->phylink = pl; in phylink_bringup_phy()
645 netdev_info(pl->netdev, in phylink_bringup_phy()
650 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
651 pl->netdev->phydev = phy; in phylink_bringup_phy()
652 pl->phydev = phy; in phylink_bringup_phy()
653 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
654 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
659 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
662 netdev_dbg(pl->netdev, in phylink_bringup_phy()
664 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
674 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
678 ret = phy_attach_direct(pl->netdev, phy, 0, pl->link_interface); in phylink_connect_phy()
682 ret = phylink_bringup_phy(pl, phy); in phylink_connect_phy()
690 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn) in phylink_of_phy_connect() argument
697 if (pl->link_an_mode == MLO_AN_FIXED) in phylink_of_phy_connect()
707 if (pl->link_an_mode == MLO_AN_PHY) { in phylink_of_phy_connect()
708 netdev_err(pl->netdev, "unable to find PHY node\n"); in phylink_of_phy_connect()
714 phy_dev = of_phy_attach(pl->netdev, phy_node, 0, pl->link_interface); in phylink_of_phy_connect()
721 ret = phylink_bringup_phy(pl, phy_dev); in phylink_of_phy_connect()
729 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
735 phy = pl->phydev; in phylink_disconnect_phy()
738 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
739 pl->netdev->phydev = NULL; in phylink_disconnect_phy()
740 pl->phydev = NULL; in phylink_disconnect_phy()
741 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
743 flush_work(&pl->resolve); in phylink_disconnect_phy()
750 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
753 pl->mac_link_dropped = true; in phylink_mac_change()
754 phylink_run_resolve(pl); in phylink_mac_change()
755 netdev_dbg(pl->netdev, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
759 void phylink_start(struct phylink *pl) in phylink_start() argument
763 netdev_info(pl->netdev, "configuring for %s/%s link mode\n", in phylink_start()
764 phylink_an_mode_str(pl->link_an_mode), in phylink_start()
765 phy_modes(pl->link_config.interface)); in phylink_start()
768 netif_carrier_off(pl->netdev); in phylink_start()
774 phylink_resolve_flow(pl, &pl->link_config); in phylink_start()
775 phylink_mac_config(pl, &pl->link_config); in phylink_start()
777 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
778 phylink_run_resolve(pl); in phylink_start()
780 if (pl->sfp_bus) in phylink_start()
781 sfp_upstream_start(pl->sfp_bus); in phylink_start()
782 if (pl->phydev) in phylink_start()
783 phy_start(pl->phydev); in phylink_start()
787 void phylink_stop(struct phylink *pl) in phylink_stop() argument
791 if (pl->phydev) in phylink_stop()
792 phy_stop(pl->phydev); in phylink_stop()
793 if (pl->sfp_bus) in phylink_stop()
794 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
796 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
800 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
807 if (pl->phydev) in phylink_ethtool_get_wol()
808 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
812 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
818 if (pl->phydev) in phylink_ethtool_set_wol()
819 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
847 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
854 if (pl->phydev) { in phylink_ethtool_ksettings_get()
855 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
857 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
860 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
862 switch (pl->link_an_mode) { in phylink_ethtool_ksettings_get()
868 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
876 if (pl->phydev) in phylink_ethtool_ksettings_get()
880 phylink_get_mac_state(pl, &link_state); in phylink_ethtool_ksettings_get()
894 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
907 config = pl->link_config; in phylink_ethtool_ksettings_set()
911 pl->supported); in phylink_ethtool_ksettings_set()
921 pl->supported, in phylink_ethtool_ksettings_set()
929 if (pl->link_an_mode == MLO_AN_FIXED && in phylink_ethtool_ksettings_set()
930 (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
931 s->duplex != pl->link_config.duplex)) in phylink_ethtool_ksettings_set()
941 if (pl->link_an_mode == MLO_AN_FIXED) in phylink_ethtool_ksettings_set()
951 if (phylink_validate(pl, pl->supported, &config)) in phylink_ethtool_ksettings_set()
964 if (pl->phydev) { in phylink_ethtool_ksettings_set()
965 ret = phy_ethtool_ksettings_set(pl->phydev, &our_kset); in phylink_ethtool_ksettings_set()
970 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
972 linkmode_copy(pl->link_config.advertising, our_kset.link_modes.advertising); in phylink_ethtool_ksettings_set()
973 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
974 pl->link_config.speed = our_kset.base.speed; in phylink_ethtool_ksettings_set()
975 pl->link_config.duplex = our_kset.base.duplex; in phylink_ethtool_ksettings_set()
976 pl->link_config.an_enabled = our_kset.base.autoneg != AUTONEG_DISABLE; in phylink_ethtool_ksettings_set()
978 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_ksettings_set()
979 phylink_mac_config(pl, &pl->link_config); in phylink_ethtool_ksettings_set()
980 phylink_mac_an_restart(pl); in phylink_ethtool_ksettings_set()
982 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
988 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
994 if (pl->phydev) in phylink_ethtool_nway_reset()
995 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
996 phylink_mac_an_restart(pl); in phylink_ethtool_nway_reset()
1002 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1007 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1008 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1009 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1013 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1016 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1020 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1021 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1024 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1037 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_set_pauseparam()
1038 switch (pl->link_an_mode) { in phylink_ethtool_set_pauseparam()
1041 netif_carrier_off(pl->netdev); in phylink_ethtool_set_pauseparam()
1042 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1047 phylink_resolve_flow(pl, config); in phylink_ethtool_set_pauseparam()
1048 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1053 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1054 phylink_mac_an_restart(pl); in phylink_ethtool_set_pauseparam()
1063 int phylink_ethtool_get_module_info(struct phylink *pl, in phylink_ethtool_get_module_info() argument
1070 if (pl->sfp_bus) in phylink_ethtool_get_module_info()
1071 ret = sfp_get_module_info(pl->sfp_bus, modinfo); in phylink_ethtool_get_module_info()
1077 int phylink_ethtool_get_module_eeprom(struct phylink *pl, in phylink_ethtool_get_module_eeprom() argument
1084 if (pl->sfp_bus) in phylink_ethtool_get_module_eeprom()
1085 ret = sfp_get_module_eeprom(pl->sfp_bus, ee, buf); in phylink_ethtool_get_module_eeprom()
1091 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
1097 if (pl->phydev) in phylink_init_eee()
1098 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1104 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1110 if (pl->phydev) in phylink_get_eee_err()
1111 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1117 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1123 if (pl->phydev) in phylink_ethtool_get_eee()
1124 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1130 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1136 if (pl->phydev) in phylink_ethtool_set_eee()
1137 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1170 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1173 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1207 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1210 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1213 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1251 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1257 switch (pl->link_an_mode) { in phylink_mii_read()
1260 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1261 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1273 val = phylink_get_mac_state(pl, &state); in phylink_mii_read()
1277 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1286 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
1289 switch (pl->link_an_mode) { in phylink_mii_write()
1305 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
1312 if (pl->phydev) { in phylink_mii_ioctl()
1316 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
1319 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1327 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1332 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
1341 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1349 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1368 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
1376 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1377 port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1378 iface = sfp_parse_interface(pl->sfp_bus, id); in phylink_sfp_module_insert()
1399 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_module_insert()
1402 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1404 netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1410 netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_module_insert()
1414 if (mode == MLO_AN_8023Z && pl->phydev) in phylink_sfp_module_insert()
1417 changed = !bitmap_equal(pl->supported, support, in phylink_sfp_module_insert()
1420 linkmode_copy(pl->supported, support); in phylink_sfp_module_insert()
1421 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_module_insert()
1424 if (pl->link_an_mode != mode || in phylink_sfp_module_insert()
1425 pl->link_config.interface != config.interface) { in phylink_sfp_module_insert()
1426 pl->link_config.interface = config.interface; in phylink_sfp_module_insert()
1427 pl->link_an_mode = mode; in phylink_sfp_module_insert()
1431 netdev_info(pl->netdev, "switched to %s/%s link mode\n", in phylink_sfp_module_insert()
1436 pl->link_port = port; in phylink_sfp_module_insert()
1439 &pl->phylink_disable_state)) in phylink_sfp_module_insert()
1440 phylink_mac_config(pl, &pl->link_config); in phylink_sfp_module_insert()
1447 struct phylink *pl = upstream; in phylink_sfp_link_down() local
1451 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
1456 struct phylink *pl = upstream; in phylink_sfp_link_up() local
1460 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
1461 phylink_run_resolve(pl); in phylink_sfp_link_up()