• Home
  • Raw
  • Download

Lines Matching full:pl

145 static int phylink_validate(struct phylink *pl, unsigned long *supported,  in phylink_validate()  argument
148 pl->ops->validate(pl->netdev, supported, state); in phylink_validate()
153 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
166 pl->link_config.speed = speed; in phylink_parse_fixedlink()
167 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
170 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
175 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
177 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
184 pl->link_gpio = desc; in phylink_parse_fixedlink()
198 netdev_err(pl->netdev, "broken fixed-link?\n"); in phylink_parse_fixedlink()
205 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
207 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
209 pl->link_config.pause |= MLO_PAUSE_SYM; in phylink_parse_fixedlink()
211 pl->link_config.pause |= MLO_PAUSE_ASYM; in phylink_parse_fixedlink()
215 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
216 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
217 netdev_warn(pl->netdev, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
218 pl->link_config.speed); in phylink_parse_fixedlink()
220 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
221 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
222 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
224 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
225 pl->supported, in phylink_parse_fixedlink()
227 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
228 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
229 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
230 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
232 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
234 netdev_warn(pl->netdev, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
235 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
236 pl->link_config.speed); in phylink_parse_fixedlink()
239 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
240 pl->supported); in phylink_parse_fixedlink()
242 pl->link_config.link = 1; in phylink_parse_fixedlink()
243 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
248 static int phylink_parse_mode(struct phylink *pl, struct fwnode_handle *fwnode) in phylink_parse_mode() argument
255 pl->link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
260 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
261 netdev_err(pl->netdev, in phylink_parse_mode()
266 linkmode_zero(pl->supported); in phylink_parse_mode()
267 phylink_set(pl->supported, MII); in phylink_parse_mode()
268 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
269 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
270 phylink_set(pl->supported, Pause); in phylink_parse_mode()
271 pl->link_config.an_enabled = true; in phylink_parse_mode()
272 pl->link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
274 switch (pl->link_config.interface) { in phylink_parse_mode()
276 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
277 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
278 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
279 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
280 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
281 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
285 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
289 phylink_set(pl->supported, 2500baseX_Full); 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()
299 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
300 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
301 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
302 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
303 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
304 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
305 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
309 netdev_err(pl->netdev, in phylink_parse_mode()
311 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
315 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
317 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
318 netdev_err(pl->netdev, in phylink_parse_mode()
327 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
330 netdev_dbg(pl->netdev, in phylink_mac_config()
332 __func__, phylink_an_mode_str(pl->link_an_mode), in phylink_mac_config()
339 pl->ops->mac_config(pl->netdev, pl->link_an_mode, state); in phylink_mac_config()
342 static void phylink_mac_an_restart(struct phylink *pl) in phylink_mac_an_restart() argument
344 if (pl->link_config.an_enabled && in phylink_mac_an_restart()
345 phy_interface_mode_is_8023z(pl->link_config.interface)) in phylink_mac_an_restart()
346 pl->ops->mac_an_restart(pl->netdev); in phylink_mac_an_restart()
349 static int phylink_get_mac_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_mac_state() argument
351 struct net_device *ndev = pl->netdev; in phylink_get_mac_state()
353 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_get_mac_state()
355 state->interface = pl->link_config.interface; in phylink_get_mac_state()
356 state->an_enabled = pl->link_config.an_enabled; in phylink_get_mac_state()
363 return pl->ops->mac_link_state(ndev, state); in phylink_get_mac_state()
369 static void phylink_get_fixed_state(struct phylink *pl, struct phylink_link_state *state) in phylink_get_fixed_state() argument
371 *state = pl->link_config; in phylink_get_fixed_state()
372 if (pl->get_fixed_state) in phylink_get_fixed_state()
373 pl->get_fixed_state(pl->netdev, state); in phylink_get_fixed_state()
374 else if (pl->link_gpio) in phylink_get_fixed_state()
375 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
386 static void phylink_resolve_flow(struct phylink *pl, in phylink_resolve_flow() argument
391 if (pl->link_config.pause & MLO_PAUSE_AN) { in phylink_resolve_flow()
394 if (phylink_test(pl->link_config.advertising, Pause)) in phylink_resolve_flow()
396 if (phylink_test(pl->link_config.advertising, Asym_Pause)) in phylink_resolve_flow()
407 new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK; in phylink_resolve_flow()
430 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
432 struct net_device *ndev = pl->netdev; in phylink_resolve()
434 mutex_lock(&pl->state_mutex); in phylink_resolve()
435 if (pl->phylink_disable_state) { in phylink_resolve()
436 pl->mac_link_dropped = false; in phylink_resolve()
438 } else if (pl->mac_link_dropped) { in phylink_resolve()
441 switch (pl->link_an_mode) { in phylink_resolve()
443 link_state = pl->phy_state; in phylink_resolve()
444 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
445 phylink_mac_config(pl, &link_state); in phylink_resolve()
449 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
450 phylink_mac_config(pl, &link_state); in phylink_resolve()
454 phylink_get_mac_state(pl, &link_state); in phylink_resolve()
455 if (pl->phydev) { in phylink_resolve()
459 pl->phy_state.link; in phylink_resolve()
461 if (pl->phy_state.interface != in phylink_resolve()
463 link_state.interface = pl->phy_state.interface; in phylink_resolve()
471 if (pl->phy_state.link || changed) { in phylink_resolve()
472 link_state.pause |= pl->phy_state.pause; in phylink_resolve()
473 phylink_resolve_flow(pl, &link_state); in phylink_resolve()
475 phylink_mac_config(pl, &link_state); in phylink_resolve()
485 pl->ops->mac_link_down(ndev, pl->link_an_mode, in phylink_resolve()
486 pl->cur_interface); in phylink_resolve()
489 pl->cur_interface = link_state.interface; in phylink_resolve()
490 pl->ops->mac_link_up(ndev, pl->link_an_mode, in phylink_resolve()
491 pl->cur_interface, pl->phydev); in phylink_resolve()
502 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
503 pl->mac_link_dropped = false; in phylink_resolve()
504 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
506 mutex_unlock(&pl->state_mutex); in phylink_resolve()
509 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
511 if (!pl->phylink_disable_state) in phylink_run_resolve()
512 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
515 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
517 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
519 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
521 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
522 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
528 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
532 phylink_run_resolve(pl); in phylink_fixed_poll()
537 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
552 netdev_err(pl->netdev, "unable to parse \"sfp\" node: %d\n", in phylink_register_sfp()
557 pl->sfp_bus = sfp_register_upstream(ref.fwnode, pl->netdev, pl, in phylink_register_sfp()
559 if (!pl->sfp_bus) in phylink_register_sfp()
584 struct phylink *pl; in phylink_create() local
587 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
588 if (!pl) in phylink_create()
591 mutex_init(&pl->state_mutex); in phylink_create()
592 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
593 pl->netdev = ndev; in phylink_create()
594 pl->phy_state.interface = iface; in phylink_create()
595 pl->link_interface = iface; in phylink_create()
597 pl->link_port = PORT_BNC; in phylink_create()
599 pl->link_port = PORT_MII; in phylink_create()
600 pl->link_config.interface = iface; in phylink_create()
601 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
602 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
603 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
604 pl->link_config.an_enabled = true; in phylink_create()
605 pl->ops = ops; in phylink_create()
606 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
607 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
609 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
610 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
611 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
613 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
615 kfree(pl); in phylink_create()
619 if (pl->link_an_mode == MLO_AN_FIXED) { in phylink_create()
620 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
622 kfree(pl); in phylink_create()
627 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
629 kfree(pl); in phylink_create()
633 return pl; in phylink_create()
639 * @pl: a pointer to a &struct phylink returned from phylink_create()
644 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
646 if (pl->sfp_bus) in phylink_destroy()
647 sfp_unregister_upstream(pl->sfp_bus); in phylink_destroy()
648 if (!IS_ERR_OR_NULL(pl->link_gpio)) in phylink_destroy()
649 gpiod_put(pl->link_gpio); in phylink_destroy()
651 cancel_work_sync(&pl->resolve); in phylink_destroy()
652 kfree(pl); in phylink_destroy()
659 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
661 mutex_lock(&pl->state_mutex); in phylink_phy_change()
662 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
663 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
664 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
666 pl->phy_state.pause |= MLO_PAUSE_SYM; in phylink_phy_change()
668 pl->phy_state.pause |= MLO_PAUSE_ASYM; in phylink_phy_change()
669 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
670 pl->phy_state.link = up; in phylink_phy_change()
671 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
673 phylink_run_resolve(pl); in phylink_phy_change()
675 netdev_dbg(pl->netdev, "phy link %s %s/%s/%s\n", up ? "up" : "down", in phylink_phy_change()
681 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy) in phylink_bringup_phy() argument
692 config.interface = pl->link_config.interface; in phylink_bringup_phy()
706 ret = phylink_validate(pl, supported, &config); in phylink_bringup_phy()
710 phy->phylink = pl; in phylink_bringup_phy()
713 netdev_info(pl->netdev, in phylink_bringup_phy()
718 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
719 pl->phydev = phy; in phylink_bringup_phy()
720 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
721 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
726 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
729 netdev_dbg(pl->netdev, in phylink_bringup_phy()
731 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
741 static int __phylink_connect_phy(struct phylink *pl, struct phy_device *phy, in __phylink_connect_phy() argument
746 if (WARN_ON(pl->link_an_mode == MLO_AN_FIXED || in __phylink_connect_phy()
747 (pl->link_an_mode == MLO_AN_INBAND && in __phylink_connect_phy()
751 if (pl->phydev) in __phylink_connect_phy()
754 ret = phy_attach_direct(pl->netdev, phy, 0, interface); in __phylink_connect_phy()
758 ret = phylink_bringup_phy(pl, phy); in __phylink_connect_phy()
767 * @pl: a pointer to a &struct phylink returned from phylink_create()
770 * Connect @phy to the phylink instance specified by @pl by calling
780 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
783 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
784 pl->link_interface = phy->interface; in phylink_connect_phy()
785 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
788 return __phylink_connect_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
794 * @pl: a pointer to a &struct phylink returned from phylink_create()
799 * specified by @pl. Actions specified in phylink_connect_phy() will be
804 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
812 if (pl->link_an_mode == MLO_AN_FIXED || in phylink_of_phy_connect()
813 (pl->link_an_mode == MLO_AN_INBAND && in phylink_of_phy_connect()
814 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_of_phy_connect()
824 if (pl->link_an_mode == MLO_AN_PHY) in phylink_of_phy_connect()
829 phy_dev = of_phy_attach(pl->netdev, phy_node, flags, in phylink_of_phy_connect()
830 pl->link_interface); in phylink_of_phy_connect()
837 ret = phylink_bringup_phy(pl, phy_dev); in phylink_of_phy_connect()
848 * @pl: a pointer to a &struct phylink returned from phylink_create()
850 * Disconnect any current PHY from the phylink instance described by @pl.
852 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
858 phy = pl->phydev; in phylink_disconnect_phy()
861 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
862 pl->phydev = NULL; in phylink_disconnect_phy()
863 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
865 flush_work(&pl->resolve); in phylink_disconnect_phy()
874 * @pl: a pointer to a &struct phylink returned from phylink_create()
880 int phylink_fixed_state_cb(struct phylink *pl, in phylink_fixed_state_cb() argument
887 if (pl->link_an_mode != MLO_AN_FIXED) in phylink_fixed_state_cb()
890 mutex_lock(&pl->state_mutex); in phylink_fixed_state_cb()
891 pl->get_fixed_state = cb; in phylink_fixed_state_cb()
892 mutex_unlock(&pl->state_mutex); in phylink_fixed_state_cb()
900 * @pl: a pointer to a &struct phylink returned from phylink_create()
906 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
909 pl->mac_link_dropped = true; in phylink_mac_change()
910 phylink_run_resolve(pl); in phylink_mac_change()
911 netdev_dbg(pl->netdev, "mac link %s\n", up ? "up" : "down"); in phylink_mac_change()
917 * @pl: a pointer to a &struct phylink returned from phylink_create()
919 * Start the phylink instance specified by @pl, configuring the MAC for the
923 void phylink_start(struct phylink *pl) in phylink_start() argument
927 netdev_info(pl->netdev, "configuring for %s/%s link mode\n", in phylink_start()
928 phylink_an_mode_str(pl->link_an_mode), in phylink_start()
929 phy_modes(pl->link_config.interface)); in phylink_start()
932 netif_carrier_off(pl->netdev); in phylink_start()
938 phylink_resolve_flow(pl, &pl->link_config); in phylink_start()
939 phylink_mac_config(pl, &pl->link_config); in phylink_start()
945 phylink_mac_an_restart(pl); in phylink_start()
947 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
948 phylink_run_resolve(pl); in phylink_start()
950 if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) in phylink_start()
951 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
952 if (pl->sfp_bus) in phylink_start()
953 sfp_upstream_start(pl->sfp_bus); in phylink_start()
954 if (pl->phydev) in phylink_start()
955 phy_start(pl->phydev); in phylink_start()
961 * @pl: a pointer to a &struct phylink returned from phylink_create()
963 * Stop the phylink instance specified by @pl. This should be called from the
968 void phylink_stop(struct phylink *pl) in phylink_stop() argument
972 if (pl->phydev) in phylink_stop()
973 phy_stop(pl->phydev); in phylink_stop()
974 if (pl->sfp_bus) in phylink_stop()
975 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
976 if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) in phylink_stop()
977 del_timer_sync(&pl->link_poll); in phylink_stop()
979 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
985 * @pl: a pointer to a &struct phylink returned from phylink_create()
989 * instance specified by @pl. If no PHY is currently attached, report no
992 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
999 if (pl->phydev) in phylink_ethtool_get_wol()
1000 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1006 * @pl: a pointer to a &struct phylink returned from phylink_create()
1010 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
1015 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
1021 if (pl->phydev) in phylink_ethtool_set_wol()
1022 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1052 * @pl: a pointer to a &struct phylink returned from phylink_create()
1055 * Read the current link settings for the phylink instance specified by @pl.
1059 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
1066 if (pl->phydev) { in phylink_ethtool_ksettings_get()
1067 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1069 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1072 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1074 switch (pl->link_an_mode) { in phylink_ethtool_ksettings_get()
1080 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1088 if (pl->phydev) in phylink_ethtool_ksettings_get()
1091 phylink_get_mac_state(pl, &link_state); in phylink_ethtool_ksettings_get()
1107 * @pl: a pointer to a &struct phylink returned from phylink_create()
1110 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
1123 config = pl->link_config; in phylink_ethtool_ksettings_set()
1127 pl->supported); in phylink_ethtool_ksettings_set()
1137 pl->supported, in phylink_ethtool_ksettings_set()
1145 if (pl->link_an_mode == MLO_AN_FIXED && in phylink_ethtool_ksettings_set()
1146 (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1147 s->duplex != pl->link_config.duplex)) in phylink_ethtool_ksettings_set()
1157 if (pl->link_an_mode == MLO_AN_FIXED) in phylink_ethtool_ksettings_set()
1167 if (phylink_validate(pl, pl->supported, &config)) in phylink_ethtool_ksettings_set()
1180 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1181 ret = phy_ethtool_ksettings_set(pl->phydev, &our_kset); in phylink_ethtool_ksettings_set()
1186 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1188 linkmode_copy(pl->link_config.advertising, our_kset.link_modes.advertising); in phylink_ethtool_ksettings_set()
1189 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1190 pl->link_config.speed = our_kset.base.speed; in phylink_ethtool_ksettings_set()
1191 pl->link_config.duplex = our_kset.base.duplex; in phylink_ethtool_ksettings_set()
1192 pl->link_config.an_enabled = our_kset.base.autoneg != AUTONEG_DISABLE; in phylink_ethtool_ksettings_set()
1194 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_ksettings_set()
1195 phylink_mac_config(pl, &pl->link_config); in phylink_ethtool_ksettings_set()
1196 phylink_mac_an_restart(pl); in phylink_ethtool_ksettings_set()
1198 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1206 * @pl: a pointer to a &struct phylink returned from phylink_create()
1208 * Restart negotiation for the phylink instance specified by @pl. This will
1215 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
1221 if (pl->phydev) in phylink_ethtool_nway_reset()
1222 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1223 phylink_mac_an_restart(pl); in phylink_ethtool_nway_reset()
1231 * @pl: a pointer to a &struct phylink returned from phylink_create()
1234 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
1239 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1240 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1241 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1247 * @pl: a pointer to a &struct phylink returned from phylink_create()
1250 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
1253 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1257 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1258 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1261 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1274 if (!test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) { in phylink_ethtool_set_pauseparam()
1275 switch (pl->link_an_mode) { in phylink_ethtool_set_pauseparam()
1278 netif_carrier_off(pl->netdev); in phylink_ethtool_set_pauseparam()
1279 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
1284 phylink_resolve_flow(pl, config); in phylink_ethtool_set_pauseparam()
1285 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1289 phylink_mac_config(pl, config); in phylink_ethtool_set_pauseparam()
1290 phylink_mac_an_restart(pl); in phylink_ethtool_set_pauseparam()
1302 * @pl: a pointer to a &struct phylink returned from phylink_create().
1305 * with the phylink instance specified by @pl.
1309 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
1315 if (pl->phydev) in phylink_get_eee_err()
1316 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1324 * @pl: a pointer to a &struct phylink returned from phylink_create()
1327 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1333 if (pl->phydev) in phylink_ethtool_get_eee()
1334 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1342 * @pl: a pointer to a &struct phylink returned from phylink_create()
1345 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1351 if (pl->phydev) in phylink_ethtool_set_eee()
1352 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1385 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
1388 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1422 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1425 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
1428 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1466 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
1472 switch (pl->link_an_mode) { in phylink_mii_read()
1475 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
1476 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1486 val = phylink_get_mac_state(pl, &state); in phylink_mii_read()
1490 val = phylink_mii_emul_read(pl->netdev, reg, &state, in phylink_mii_read()
1499 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
1502 switch (pl->link_an_mode) { in phylink_mii_write()
1518 * @pl: a pointer to a &struct phylink returned from phylink_create()
1523 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
1534 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
1541 if (pl->phydev) { in phylink_mii_ioctl()
1545 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
1549 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1557 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1562 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
1572 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
1580 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
1597 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
1607 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1608 port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
1616 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_module_insert()
1619 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1621 netdev_err(pl->netdev, "validation with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1626 iface = sfp_select_interface(pl->sfp_bus, id, config.advertising); in phylink_sfp_module_insert()
1628 netdev_err(pl->netdev, in phylink_sfp_module_insert()
1635 ret = phylink_validate(pl, support, &config); in phylink_sfp_module_insert()
1637 netdev_err(pl->netdev, "validation of %s/%s with support %*pb failed: %d\n", in phylink_sfp_module_insert()
1644 netdev_dbg(pl->netdev, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_module_insert()
1649 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_module_insert()
1652 changed = !bitmap_equal(pl->supported, support, in phylink_sfp_module_insert()
1655 linkmode_copy(pl->supported, support); in phylink_sfp_module_insert()
1656 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_module_insert()
1659 if (pl->link_an_mode != MLO_AN_INBAND || in phylink_sfp_module_insert()
1660 pl->link_config.interface != config.interface) { in phylink_sfp_module_insert()
1661 pl->link_config.interface = config.interface; in phylink_sfp_module_insert()
1662 pl->link_an_mode = MLO_AN_INBAND; in phylink_sfp_module_insert()
1666 netdev_info(pl->netdev, "switched to %s/%s link mode\n", in phylink_sfp_module_insert()
1671 pl->link_port = port; in phylink_sfp_module_insert()
1674 &pl->phylink_disable_state)) in phylink_sfp_module_insert()
1675 phylink_mac_config(pl, &pl->link_config); in phylink_sfp_module_insert()
1682 struct phylink *pl = upstream; in phylink_sfp_link_down() local
1686 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
1691 struct phylink *pl = upstream; in phylink_sfp_link_up() local
1695 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
1696 phylink_run_resolve(pl); in phylink_sfp_link_up()
1701 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
1703 return __phylink_connect_phy(upstream, phy, pl->link_config.interface); in phylink_sfp_connect_phy()