Lines Matching +full:eee +full:- +full:broken +full:- +full:100 +full:tx

1 // SPDX-License-Identifier: GPL-2.0
4 * technologies such as SFP cages where the PHY is hot-pluggable.
40 * struct phylink - internal data type for phylink
57 u8 link_port; /* The current non-phy ethtool port */
86 if ((pl)->config->type == PHYLINK_NETDEV) \
87 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
88 else if ((pl)->config->type == PHYLINK_DEV) \
89 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
101 if ((pl)->config->type == PHYLINK_NETDEV) \
102 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
103 else if ((pl)->config->type == PHYLINK_DEV) \
104 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
118 * phylink_set_port_modes() - set the port type modes in the ethtool mask
161 pl->mac_ops->validate(pl->config, supported, state); in phylink_validate()
163 return phylink_is_empty_linkmode(supported) ? -EINVAL : 0; in phylink_validate()
175 fixed_node = fwnode_get_named_child_node(fwnode, "fixed-link"); in phylink_parse_fixedlink()
179 pl->link_config.speed = speed; in phylink_parse_fixedlink()
180 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
182 if (fwnode_property_read_bool(fixed_node, "full-duplex")) in phylink_parse_fixedlink()
183 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
185 /* We treat the "pause" and "asym-pause" terminology as in phylink_parse_fixedlink()
190 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
191 if (fwnode_property_read_bool(fixed_node, "asym-pause")) in phylink_parse_fixedlink()
193 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
200 pl->link_gpio = desc; in phylink_parse_fixedlink()
201 else if (desc == ERR_PTR(-EPROBE_DEFER)) in phylink_parse_fixedlink()
202 ret = -EPROBE_DEFER; in phylink_parse_fixedlink()
211 ret = fwnode_property_read_u32_array(fwnode, "fixed-link", in phylink_parse_fixedlink()
214 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
215 return -EINVAL; in phylink_parse_fixedlink()
218 ret = fwnode_property_read_u32_array(fwnode, "fixed-link", in phylink_parse_fixedlink()
221 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
223 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
226 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
229 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
233 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
234 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
236 pl->link_config.speed); in phylink_parse_fixedlink()
238 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_parse_fixedlink()
239 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
240 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
242 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
243 pl->supported, true); in phylink_parse_fixedlink()
244 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
245 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
246 phylink_set(pl->supported, Pause); in phylink_parse_fixedlink()
247 phylink_set(pl->supported, Asym_Pause); in phylink_parse_fixedlink()
248 phylink_set(pl->supported, Autoneg); in phylink_parse_fixedlink()
250 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
251 __set_bit(s->bit, pl->link_config.lp_advertising); in phylink_parse_fixedlink()
254 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
255 pl->link_config.speed); in phylink_parse_fixedlink()
258 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
259 pl->supported); in phylink_parse_fixedlink()
261 pl->link_config.link = 1; in phylink_parse_fixedlink()
262 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
272 dn = fwnode_get_named_child_node(fwnode, "fixed-link"); in phylink_parse_mode()
273 if (dn || fwnode_property_present(fwnode, "fixed-link")) in phylink_parse_mode()
274 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
278 strcmp(managed, "in-band-status") == 0) || in phylink_parse_mode()
279 pl->config->ovr_an_inband) { in phylink_parse_mode()
280 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
282 "can't use both fixed-link and in-band-status\n"); in phylink_parse_mode()
283 return -EINVAL; in phylink_parse_mode()
286 linkmode_zero(pl->supported); in phylink_parse_mode()
287 phylink_set(pl->supported, MII); in phylink_parse_mode()
288 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
289 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
290 phylink_set(pl->supported, Pause); in phylink_parse_mode()
291 pl->link_config.an_enabled = true; in phylink_parse_mode()
292 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
294 switch (pl->link_config.interface) { in phylink_parse_mode()
297 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
298 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
299 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
300 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
301 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
302 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
306 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
310 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
314 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
318 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
319 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
320 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
325 phylink_set(pl->supported, 10baseT_Half); in phylink_parse_mode()
326 phylink_set(pl->supported, 10baseT_Full); in phylink_parse_mode()
327 phylink_set(pl->supported, 100baseT_Half); in phylink_parse_mode()
328 phylink_set(pl->supported, 100baseT_Full); in phylink_parse_mode()
329 phylink_set(pl->supported, 1000baseT_Half); in phylink_parse_mode()
330 phylink_set(pl->supported, 1000baseT_Full); in phylink_parse_mode()
331 phylink_set(pl->supported, 1000baseX_Full); in phylink_parse_mode()
332 phylink_set(pl->supported, 1000baseKX_Full); in phylink_parse_mode()
333 phylink_set(pl->supported, 2500baseT_Full); in phylink_parse_mode()
334 phylink_set(pl->supported, 2500baseX_Full); in phylink_parse_mode()
335 phylink_set(pl->supported, 5000baseT_Full); in phylink_parse_mode()
336 phylink_set(pl->supported, 10000baseT_Full); in phylink_parse_mode()
337 phylink_set(pl->supported, 10000baseKR_Full); in phylink_parse_mode()
338 phylink_set(pl->supported, 10000baseKX4_Full); in phylink_parse_mode()
339 phylink_set(pl->supported, 10000baseCR_Full); in phylink_parse_mode()
340 phylink_set(pl->supported, 10000baseSR_Full); in phylink_parse_mode()
341 phylink_set(pl->supported, 10000baseLR_Full); in phylink_parse_mode()
342 phylink_set(pl->supported, 10000baseLRM_Full); in phylink_parse_mode()
343 phylink_set(pl->supported, 10000baseER_Full); in phylink_parse_mode()
347 phylink_set(pl->supported, 25000baseCR_Full); in phylink_parse_mode()
348 phylink_set(pl->supported, 25000baseKR_Full); in phylink_parse_mode()
349 phylink_set(pl->supported, 25000baseSR_Full); in phylink_parse_mode()
350 phylink_set(pl->supported, 40000baseKR4_Full); in phylink_parse_mode()
351 phylink_set(pl->supported, 40000baseCR4_Full); in phylink_parse_mode()
352 phylink_set(pl->supported, 40000baseSR4_Full); in phylink_parse_mode()
353 phylink_set(pl->supported, 40000baseLR4_Full); in phylink_parse_mode()
354 phylink_set(pl->supported, 50000baseCR2_Full); in phylink_parse_mode()
355 phylink_set(pl->supported, 50000baseKR2_Full); in phylink_parse_mode()
356 phylink_set(pl->supported, 50000baseSR2_Full); in phylink_parse_mode()
357 phylink_set(pl->supported, 50000baseKR_Full); in phylink_parse_mode()
358 phylink_set(pl->supported, 50000baseSR_Full); in phylink_parse_mode()
359 phylink_set(pl->supported, 50000baseCR_Full); in phylink_parse_mode()
360 phylink_set(pl->supported, 50000baseLR_ER_FR_Full); in phylink_parse_mode()
361 phylink_set(pl->supported, 50000baseDR_Full); in phylink_parse_mode()
362 phylink_set(pl->supported, 100000baseKR4_Full); in phylink_parse_mode()
363 phylink_set(pl->supported, 100000baseSR4_Full); in phylink_parse_mode()
364 phylink_set(pl->supported, 100000baseCR4_Full); in phylink_parse_mode()
365 phylink_set(pl->supported, 100000baseLR4_ER4_Full); in phylink_parse_mode()
366 phylink_set(pl->supported, 100000baseKR2_Full); in phylink_parse_mode()
367 phylink_set(pl->supported, 100000baseSR2_Full); in phylink_parse_mode()
368 phylink_set(pl->supported, 100000baseCR2_Full); in phylink_parse_mode()
369 phylink_set(pl->supported, 100000baseLR2_ER2_FR2_Full); in phylink_parse_mode()
370 phylink_set(pl->supported, 100000baseDR2_Full); in phylink_parse_mode()
375 "incorrect link mode %s for in-band status\n", in phylink_parse_mode()
376 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
377 return -EINVAL; in phylink_parse_mode()
380 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
382 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
384 "failed to validate link configuration for in-band status\n"); in phylink_parse_mode()
385 return -EINVAL; in phylink_parse_mode()
389 pl->link_config.an_enabled = phylink_test(pl->supported, Autoneg); in phylink_parse_mode()
399 if (!state->an_enabled) in phylink_apply_manual_flow()
400 state->pause &= ~MLO_PAUSE_AN; in phylink_apply_manual_flow()
403 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
404 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
411 state->pause = MLO_PAUSE_NONE; in phylink_resolve_flow()
412 if (state->duplex == DUPLEX_FULL) { in phylink_resolve_flow()
413 linkmode_resolve_pause(state->advertising, in phylink_resolve_flow()
414 state->lp_advertising, in phylink_resolve_flow()
417 state->pause |= MLO_PAUSE_TX; in phylink_resolve_flow()
419 state->pause |= MLO_PAUSE_RX; in phylink_resolve_flow()
428 __func__, phylink_an_mode_str(pl->cur_link_an_mode), in phylink_mac_config()
429 phy_modes(state->interface), in phylink_mac_config()
430 phy_speed_to_str(state->speed), in phylink_mac_config()
431 phy_duplex_to_str(state->duplex), in phylink_mac_config()
432 __ETHTOOL_LINK_MODE_MASK_NBITS, state->advertising, in phylink_mac_config()
433 state->pause, state->link, state->an_enabled); in phylink_mac_config()
435 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, state); in phylink_mac_config()
440 if (pl->link_config.an_enabled && in phylink_mac_pcs_an_restart()
441 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_mac_pcs_an_restart()
442 phylink_autoneg_inband(pl->cur_link_an_mode)) { in phylink_mac_pcs_an_restart()
443 if (pl->pcs_ops) in phylink_mac_pcs_an_restart()
444 pl->pcs_ops->pcs_an_restart(pl->pcs); in phylink_mac_pcs_an_restart()
446 pl->mac_ops->mac_an_restart(pl->config); in phylink_mac_pcs_an_restart()
455 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface)); in phylink_major_config()
457 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
458 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode, in phylink_major_config()
459 state->interface); in phylink_major_config()
469 if (pl->pcs_ops) { in phylink_major_config()
470 err = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_major_config()
471 state->interface, in phylink_major_config()
472 state->advertising, in phylink_major_config()
473 !!(pl->link_config.pause & in phylink_major_config()
484 if (pl->mac_ops->mac_finish) { in phylink_major_config()
485 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode, in phylink_major_config()
486 state->interface); in phylink_major_config()
503 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
506 if (!pl->pcs_ops) { in phylink_change_inband_advert()
508 phylink_mac_config(pl, &pl->link_config); in phylink_change_inband_advert()
514 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_change_inband_advert()
515 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
516 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
517 pl->link_config.pause); in phylink_change_inband_advert()
519 /* Modern PCS-based method; update the advert at the PCS, and in phylink_change_inband_advert()
523 ret = pl->pcs_ops->pcs_config(pl->pcs, pl->cur_link_an_mode, in phylink_change_inband_advert()
524 pl->link_config.interface, in phylink_change_inband_advert()
525 pl->link_config.advertising, in phylink_change_inband_advert()
526 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
539 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
540 linkmode_zero(state->lp_advertising); in phylink_mac_pcs_get_state()
541 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
542 state->an_enabled = pl->link_config.an_enabled; in phylink_mac_pcs_get_state()
543 state->speed = SPEED_UNKNOWN; in phylink_mac_pcs_get_state()
544 state->duplex = DUPLEX_UNKNOWN; in phylink_mac_pcs_get_state()
545 state->pause = MLO_PAUSE_NONE; in phylink_mac_pcs_get_state()
546 state->an_complete = 0; in phylink_mac_pcs_get_state()
547 state->link = 1; in phylink_mac_pcs_get_state()
549 if (pl->pcs_ops) in phylink_mac_pcs_get_state()
550 pl->pcs_ops->pcs_get_state(pl->pcs, state); in phylink_mac_pcs_get_state()
551 else if (pl->mac_ops->mac_pcs_get_state) in phylink_mac_pcs_get_state()
552 pl->mac_ops->mac_pcs_get_state(pl->config, state); in phylink_mac_pcs_get_state()
554 state->link = 0; in phylink_mac_pcs_get_state()
563 *state = pl->link_config; in phylink_get_fixed_state()
564 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
565 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
566 else if (pl->link_gpio) in phylink_get_fixed_state()
567 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
576 switch (pl->cur_link_an_mode) { in phylink_mac_initial_config()
578 link_state = pl->phy_state; in phylink_mac_initial_config()
586 link_state = pl->link_config; in phylink_mac_initial_config()
605 return "rx/tx"; in phylink_pause_to_str()
607 return "tx"; in phylink_pause_to_str()
618 struct net_device *ndev = pl->netdev; in phylink_link_up()
620 pl->cur_interface = link_state.interface; in phylink_link_up()
622 if (pl->pcs_ops && pl->pcs_ops->pcs_link_up) in phylink_link_up()
623 pl->pcs_ops->pcs_link_up(pl->pcs, pl->cur_link_an_mode, in phylink_link_up()
624 pl->cur_interface, in phylink_link_up()
627 pl->mac_ops->mac_link_up(pl->config, pl->phydev, in phylink_link_up()
628 pl->cur_link_an_mode, pl->cur_interface, in phylink_link_up()
637 "Link is Up - %s/%s - flow control %s\n", in phylink_link_up()
645 struct net_device *ndev = pl->netdev; in phylink_link_down()
649 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode, in phylink_link_down()
650 pl->cur_interface); in phylink_link_down()
658 struct net_device *ndev = pl->netdev; in phylink_resolve()
662 mutex_lock(&pl->state_mutex); in phylink_resolve()
663 if (pl->netdev) in phylink_resolve()
666 cur_link_state = pl->old_link_state; in phylink_resolve()
668 if (pl->phylink_disable_state) { in phylink_resolve()
669 pl->mac_link_dropped = false; in phylink_resolve()
671 } else if (pl->mac_link_dropped) { in phylink_resolve()
674 switch (pl->cur_link_an_mode) { in phylink_resolve()
676 link_state = pl->phy_state; in phylink_resolve()
692 if (pl->phydev) in phylink_resolve()
693 link_state.link &= pl->phy_state.link; in phylink_resolve()
696 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
697 link_state.interface = pl->phy_state.interface; in phylink_resolve()
702 link_state.pause = pl->phy_state.pause; in phylink_resolve()
711 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
720 pl->link_config.interface = link_state.interface; in phylink_resolve()
721 } else if (!pl->pcs_ops) { in phylink_resolve()
733 pl->old_link_state = link_state.link; in phylink_resolve()
739 if (!link_state.link && pl->mac_link_dropped) { in phylink_resolve()
740 pl->mac_link_dropped = false; in phylink_resolve()
741 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
743 mutex_unlock(&pl->state_mutex); in phylink_resolve()
748 if (!pl->phylink_disable_state) in phylink_run_resolve()
749 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
754 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
756 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
758 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
759 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
790 pl->sfp_bus = bus; in phylink_register_sfp()
799 * phylink_create() - create a phylink instance
807 * This will parse in-band modes, fixed-link or SFP configuration.
811 * Returns a pointer to a &struct phylink, or an error-pointer value. Users
824 return ERR_PTR(-ENOMEM); in phylink_create()
826 mutex_init(&pl->state_mutex); in phylink_create()
827 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
829 pl->config = config; in phylink_create()
830 if (config->type == PHYLINK_NETDEV) { in phylink_create()
831 pl->netdev = to_net_dev(config->dev); in phylink_create()
832 } else if (config->type == PHYLINK_DEV) { in phylink_create()
833 pl->dev = config->dev; in phylink_create()
836 return ERR_PTR(-EINVAL); in phylink_create()
839 pl->phy_state.interface = iface; in phylink_create()
840 pl->link_interface = iface; in phylink_create()
842 pl->link_port = PORT_BNC; in phylink_create()
844 pl->link_port = PORT_MII; in phylink_create()
845 pl->link_config.interface = iface; in phylink_create()
846 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
847 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
848 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
849 pl->link_config.an_enabled = true; in phylink_create()
850 pl->mac_ops = mac_ops; in phylink_create()
851 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
852 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
854 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS); in phylink_create()
855 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
856 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
864 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
872 pl->cur_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
885 * phylink_set_pcs() - set the current PCS for phylink to use
900 pl->pcs = pcs; in phylink_set_pcs()
901 pl->pcs_ops = pcs->ops; in phylink_set_pcs()
906 * phylink_destroy() - cleanup and destroy the phylink instance
916 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
917 if (pl->link_gpio) in phylink_destroy()
918 gpiod_put(pl->link_gpio); in phylink_destroy()
920 cancel_work_sync(&pl->resolve); in phylink_destroy()
927 struct phylink *pl = phydev->phylink; in phylink_phy_change()
932 mutex_lock(&pl->state_mutex); in phylink_phy_change()
933 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
934 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
935 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
937 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
939 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
940 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
941 pl->phy_state.link = up; in phylink_phy_change()
942 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
947 phy_modes(phydev->interface), in phylink_phy_change()
948 phy_speed_to_str(phydev->speed), in phylink_phy_change()
949 phy_duplex_to_str(phydev->duplex), in phylink_phy_change()
950 phylink_pause_to_str(pl->phy_state.pause)); in phylink_phy_change()
971 linkmode_copy(supported, phy->supported); in phylink_bringup_phy()
972 linkmode_copy(config.advertising, phy->advertising); in phylink_bringup_phy()
975 * modes, normally 10GBASE-R, SGMII. Some use 2500BASE-X for 2.5G in phylink_bringup_phy()
979 if (phy->is_c45 && in phylink_bringup_phy()
991 __ETHTOOL_LINK_MODE_MASK_NBITS, phy->supported, in phylink_bringup_phy()
997 phy->phylink = pl; in phylink_bringup_phy()
998 phy->phy_link_change = phylink_phy_change; in phylink_bringup_phy()
1003 dev_name(&phy->mdio.dev), phy->drv->name, irq_str); in phylink_bringup_phy()
1006 mutex_lock(&phy->lock); in phylink_bringup_phy()
1007 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
1008 pl->phydev = phy; in phylink_bringup_phy()
1009 pl->phy_state.interface = interface; in phylink_bringup_phy()
1010 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
1011 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
1012 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
1013 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
1014 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
1017 linkmode_copy(phy->advertising, config.advertising); in phylink_bringup_phy()
1018 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
1019 mutex_unlock(&phy->lock); in phylink_bringup_phy()
1023 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
1024 __ETHTOOL_LINK_MODE_MASK_NBITS, phy->advertising); in phylink_bringup_phy()
1035 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
1036 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
1038 return -EINVAL; in phylink_attach_phy()
1040 if (pl->phydev) in phylink_attach_phy()
1041 return -EBUSY; in phylink_attach_phy()
1043 return phy_attach_direct(pl->netdev, phy, 0, interface); in phylink_attach_phy()
1047 * phylink_connect_phy() - connect a PHY to the phylink instance
1066 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
1067 pl->link_interface = phy->interface; in phylink_connect_phy()
1068 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
1071 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
1075 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
1084 * phylink_of_phy_connect() - connect the PHY specified in the DT mode.
1087 * @flags: PHY-specific flags to communicate to the PHY device driver
1103 * phylink_fwnode_phy_connect() - connect the PHY specified in the fwnode.
1106 * @flags: PHY-specific flags to communicate to the PHY device driver
1122 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_fwnode_phy_connect()
1123 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_fwnode_phy_connect()
1124 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_fwnode_phy_connect()
1129 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_fwnode_phy_connect()
1130 return -ENODEV; in phylink_fwnode_phy_connect()
1138 return -ENODEV; in phylink_fwnode_phy_connect()
1140 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_fwnode_phy_connect()
1141 pl->link_interface); in phylink_fwnode_phy_connect()
1147 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_fwnode_phy_connect()
1156 * phylink_disconnect_phy() - disconnect any PHY attached to the phylink
1168 phy = pl->phydev; in phylink_disconnect_phy()
1170 mutex_lock(&phy->lock); in phylink_disconnect_phy()
1171 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
1172 pl->phydev = NULL; in phylink_disconnect_phy()
1173 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
1174 mutex_unlock(&phy->lock); in phylink_disconnect_phy()
1175 flush_work(&pl->resolve); in phylink_disconnect_phy()
1183 * phylink_mac_change() - notify phylink of a change in MAC state
1193 pl->mac_link_dropped = true; in phylink_mac_change()
1209 * phylink_start() - start a phylink instance
1223 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_start()
1224 phy_modes(pl->link_config.interface)); in phylink_start()
1227 if (pl->netdev) in phylink_start()
1228 netif_carrier_off(pl->netdev); in phylink_start()
1231 * a fixed-link to start with the correct parameters, and also in phylink_start()
1240 clear_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_start()
1243 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
1244 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
1251 pl->link_irq = irq; in phylink_start()
1259 switch (pl->cfg_link_an_mode) { in phylink_start()
1261 poll |= pl->config->poll_fixed_state; in phylink_start()
1264 poll |= pl->config->pcs_poll; in phylink_start()
1265 if (pl->pcs) in phylink_start()
1266 poll |= pl->pcs->poll; in phylink_start()
1270 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
1271 if (pl->phydev) in phylink_start()
1272 phy_start(pl->phydev); in phylink_start()
1273 if (pl->sfp_bus) in phylink_start()
1274 sfp_upstream_start(pl->sfp_bus); in phylink_start()
1279 * phylink_stop() - stop a phylink instance
1294 if (pl->sfp_bus) in phylink_stop()
1295 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
1296 if (pl->phydev) in phylink_stop()
1297 phy_stop(pl->phydev); in phylink_stop()
1298 del_timer_sync(&pl->link_poll); in phylink_stop()
1299 if (pl->link_irq) { in phylink_stop()
1300 free_irq(pl->link_irq, pl); in phylink_stop()
1301 pl->link_irq = 0; in phylink_stop()
1309 * phylink_suspend() - handle a network device suspend event
1311 * @mac_wol: true if the MAC needs to receive packets for Wake-on-Lan
1314 * - If Wake-on-Lan is not active, we can bring down the link between
1316 * - If Wake-on-Lan is active, and being handled only by the PHY, we
1318 * - If Wake-on-Lan is active, but being handled by the MAC, the MAC
1325 if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) { in phylink_suspend()
1326 /* Wake-on-Lan enabled, MAC handling */ in phylink_suspend()
1327 mutex_lock(&pl->state_mutex); in phylink_suspend()
1330 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_suspend()
1336 netif_carrier_off(pl->netdev); in phylink_suspend()
1341 mutex_unlock(&pl->state_mutex); in phylink_suspend()
1349 * phylink_resume() - handle a network device resume event
1359 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) { in phylink_resume()
1360 /* Wake-on-Lan enabled, MAC handling */ in phylink_resume()
1365 * resume, which is harmless - the true link state will be in phylink_resume()
1368 mutex_lock(&pl->state_mutex); in phylink_resume()
1370 mutex_unlock(&pl->state_mutex); in phylink_resume()
1372 /* Re-apply the link parameters so that all the settings get in phylink_resume()
1377 /* Re-enable and re-resolve the link parameters */ in phylink_resume()
1378 clear_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_resume()
1387 * phylink_ethtool_get_wol() - get the wake on lan parameters for the PHY
1399 wol->supported = 0; in phylink_ethtool_get_wol()
1400 wol->wolopts = 0; in phylink_ethtool_get_wol()
1402 if (pl->phydev) in phylink_ethtool_get_wol()
1403 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
1408 * phylink_ethtool_set_wol() - set wake on lan parameters
1420 int ret = -EOPNOTSUPP; in phylink_ethtool_set_wol()
1424 if (pl->phydev) in phylink_ethtool_set_wol()
1425 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
1445 phylink_merge_link_mode(kset->link_modes.advertising, state->advertising); in phylink_get_ksettings()
1446 linkmode_copy(kset->link_modes.lp_advertising, state->lp_advertising); in phylink_get_ksettings()
1447 kset->base.speed = state->speed; in phylink_get_ksettings()
1448 kset->base.duplex = state->duplex; in phylink_get_ksettings()
1449 kset->base.autoneg = state->an_enabled ? AUTONEG_ENABLE : in phylink_get_ksettings()
1454 * phylink_ethtool_ksettings_get() - get the current link settings
1469 if (pl->phydev) in phylink_ethtool_ksettings_get()
1470 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
1472 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
1474 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
1476 switch (pl->cur_link_an_mode) { in phylink_ethtool_ksettings_get()
1479 * current link settings - and note that these also in phylink_ethtool_ksettings_get()
1490 if (pl->phydev) in phylink_ethtool_ksettings_get()
1496 * layer via in-band status. Report these as the current in phylink_ethtool_ksettings_get()
1508 * phylink_ethtool_ksettings_set() - set the link settings
1521 if (pl->phydev) { in phylink_ethtool_ksettings_set()
1523 * to update the pl->link_config settings: in phylink_ethtool_ksettings_set()
1524 * - the configuration returned via ksettings_get() will come in phylink_ethtool_ksettings_set()
1526 * - link_config.interface will be updated by the PHY calling in phylink_ethtool_ksettings_set()
1528 * - initial link configuration for PHY mode comes from the in phylink_ethtool_ksettings_set()
1530 * - other configuration changes (e.g. pause modes) are in phylink_ethtool_ksettings_set()
1532 * - if in in-band mode with a PHY, the link configuration in phylink_ethtool_ksettings_set()
1535 * - the only possible use would be link_config.advertising in phylink_ethtool_ksettings_set()
1536 * pause modes when in 1000base-X mode with a PHY, but in in phylink_ethtool_ksettings_set()
1540 return phy_ethtool_ksettings_set(pl->phydev, kset); in phylink_ethtool_ksettings_set()
1543 config = pl->link_config; in phylink_ethtool_ksettings_set()
1546 linkmode_and(config.advertising, kset->link_modes.advertising, in phylink_ethtool_ksettings_set()
1547 pl->supported); in phylink_ethtool_ksettings_set()
1550 switch (kset->base.autoneg) { in phylink_ethtool_ksettings_set()
1555 s = phy_lookup_setting(kset->base.speed, kset->base.duplex, in phylink_ethtool_ksettings_set()
1556 pl->supported, false); in phylink_ethtool_ksettings_set()
1558 return -EINVAL; in phylink_ethtool_ksettings_set()
1563 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1564 if (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
1565 s->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
1566 return -EINVAL; in phylink_ethtool_ksettings_set()
1570 config.speed = s->speed; in phylink_ethtool_ksettings_set()
1571 config.duplex = s->duplex; in phylink_ethtool_ksettings_set()
1579 if (pl->cur_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
1581 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
1582 return -EINVAL; in phylink_ethtool_ksettings_set()
1591 return -EINVAL; in phylink_ethtool_ksettings_set()
1595 * fixed-link cases. All that is left are in-band links. in phylink_ethtool_ksettings_set()
1597 config.an_enabled = kset->base.autoneg == AUTONEG_ENABLE; in phylink_ethtool_ksettings_set()
1602 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1604 return -EINVAL; in phylink_ethtool_ksettings_set()
1608 return -EINVAL; in phylink_ethtool_ksettings_set()
1614 if (pl->sfp_port && pl->sfp_bus) { in phylink_ethtool_ksettings_set()
1615 config.interface = sfp_select_interface(pl->sfp_bus, in phylink_ethtool_ksettings_set()
1622 return -EINVAL; in phylink_ethtool_ksettings_set()
1626 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
1629 phylink_an_mode_str(pl->cur_link_an_mode), in phylink_ethtool_ksettings_set()
1632 return -EINVAL; in phylink_ethtool_ksettings_set()
1636 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1637 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
1638 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
1639 pl->link_config.an_enabled = config.an_enabled; in phylink_ethtool_ksettings_set()
1641 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
1642 /* The interface changed, e.g. 1000base-X <-> 2500base-X */ in phylink_ethtool_ksettings_set()
1644 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
1646 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
1649 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
1651 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
1652 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1653 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
1655 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
1658 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
1665 * phylink_ethtool_nway_reset() - restart negotiation
1681 if (pl->phydev) in phylink_ethtool_nway_reset()
1682 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
1690 * phylink_ethtool_get_pauseparam() - get the current pause parameters
1699 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
1700 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
1701 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
1706 * phylink_ethtool_set_pauseparam() - set the current pause parameters
1713 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
1719 if (pl->cur_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
1720 return -EOPNOTSUPP; in phylink_ethtool_set_pauseparam()
1722 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
1723 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
1724 return -EOPNOTSUPP; in phylink_ethtool_set_pauseparam()
1726 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
1727 !pause->autoneg && pause->rx_pause != pause->tx_pause) in phylink_ethtool_set_pauseparam()
1728 return -EINVAL; in phylink_ethtool_set_pauseparam()
1731 if (pause->autoneg) in phylink_ethtool_set_pauseparam()
1733 if (pause->rx_pause) in phylink_ethtool_set_pauseparam()
1735 if (pause->tx_pause) in phylink_ethtool_set_pauseparam()
1738 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1744 * rx tx Pause AsymDir in phylink_ethtool_set_pauseparam()
1749 * and then use the ethtool rx/tx enablement status to mask the in phylink_ethtool_set_pauseparam()
1750 * rx/tx pause resolution. in phylink_ethtool_set_pauseparam()
1752 linkmode_set_pause(config->advertising, pause->tx_pause, in phylink_ethtool_set_pauseparam()
1753 pause->rx_pause); in phylink_ethtool_set_pauseparam()
1755 manual_changed = (config->pause ^ pause_state) & MLO_PAUSE_AN || in phylink_ethtool_set_pauseparam()
1757 (config->pause ^ pause_state) & MLO_PAUSE_TXRX_MASK); in phylink_ethtool_set_pauseparam()
1759 config->pause = pause_state; in phylink_ethtool_set_pauseparam()
1761 /* Update our in-band advertisement, triggering a renegotiation if in phylink_ethtool_set_pauseparam()
1764 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
1767 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
1774 if (pl->phydev) in phylink_ethtool_set_pauseparam()
1775 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
1776 pause->tx_pause); in phylink_ethtool_set_pauseparam()
1783 pl->mac_link_dropped = true; in phylink_ethtool_set_pauseparam()
1792 * phylink_get_eee_err() - read the energy efficient ethernet error
1807 if (pl->phydev) in phylink_get_eee_err()
1808 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
1815 * phylink_init_eee() - init and check the EEE features
1823 int ret = -EOPNOTSUPP; in phylink_init_eee()
1825 if (pl->phydev) in phylink_init_eee()
1826 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
1833 * phylink_ethtool_get_eee() - read the energy efficient ethernet parameters
1835 * @eee: a pointer to a &struct ethtool_eee for the read parameters
1837 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_get_eee() argument
1839 int ret = -EOPNOTSUPP; in phylink_ethtool_get_eee()
1843 if (pl->phydev) in phylink_ethtool_get_eee()
1844 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
1851 * phylink_ethtool_set_eee() - set the energy efficient ethernet parameters
1853 * @eee: a pointer to a &struct ethtool_eee for the desired parameters
1855 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee) in phylink_ethtool_set_eee() argument
1857 int ret = -EOPNOTSUPP; in phylink_ethtool_set_eee()
1861 if (pl->phydev) in phylink_ethtool_set_eee()
1862 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
1868 /* This emulates MII registers for a fixed-mode phy operating as per the
1877 unsigned long *lpa = state->lp_advertising; in phylink_mii_emul_read()
1880 fs.link = state->link; in phylink_mii_emul_read()
1881 fs.speed = state->speed; in phylink_mii_emul_read()
1882 fs.duplex = state->duplex; in phylink_mii_emul_read()
1888 if (!state->an_complete) in phylink_mii_emul_read()
1897 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
1904 } else if (phydev->is_c45) { in phylink_phy_read()
1910 devad = __ffs(phydev->c45_ids.mmds_present); in phylink_phy_read()
1914 if (!(phydev->c45_ids.mmds_present & MDIO_DEVS_AN)) in phylink_phy_read()
1915 return -EINVAL; in phylink_phy_read()
1923 return -EINVAL; in phylink_phy_read()
1931 return mdiobus_read(pl->phydev->mdio.bus, prtad, devad); in phylink_phy_read()
1937 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
1944 } else if (phydev->is_c45) { in phylink_phy_write()
1950 devad = __ffs(phydev->c45_ids.mmds_present); in phylink_phy_write()
1954 if (!(phydev->c45_ids.mmds_present & MDIO_DEVS_AN)) in phylink_phy_write()
1955 return -EINVAL; in phylink_phy_write()
1963 return -EINVAL; in phylink_phy_write()
1972 return mdiobus_write(phydev->mdio.bus, prtad, devad, val); in phylink_phy_write()
1981 switch (pl->cur_link_an_mode) { in phylink_mii_read()
1990 return -EOPNOTSUPP; in phylink_mii_read()
2006 switch (pl->cur_link_an_mode) { in phylink_mii_write()
2011 return -EOPNOTSUPP; in phylink_mii_write()
2021 * phylink_mii_ioctl() - generic mii ioctl interface
2045 if (pl->phydev) { in phylink_mii_ioctl()
2049 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
2053 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2055 mii->val_out = ret; in phylink_mii_ioctl()
2061 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2062 mii->val_in); in phylink_mii_ioctl()
2066 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
2072 mii->phy_id = 0; in phylink_mii_ioctl()
2076 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
2078 mii->val_out = ret; in phylink_mii_ioctl()
2084 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
2085 mii->val_in); in phylink_mii_ioctl()
2089 ret = -EOPNOTSUPP; in phylink_mii_ioctl()
2099 * phylink_speed_down() - set the non-SFP PHY to lowest speed supported by both
2116 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
2117 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
2124 * phylink_speed_up() - restore the advertised speeds prior to the call to
2139 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
2140 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
2150 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
2157 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
2179 config.an_enabled = pl->link_config.an_enabled; in phylink_sfp_config()
2189 iface = sfp_select_interface(pl->sfp_bus, config.advertising); in phylink_sfp_config()
2194 return -EINVAL; in phylink_sfp_config()
2212 if (phy_interface_mode_is_8023z(iface) && pl->phydev) in phylink_sfp_config()
2213 return -EINVAL; in phylink_sfp_config()
2215 changed = !linkmode_equal(pl->supported, support) || in phylink_sfp_config()
2216 !linkmode_equal(pl->link_config.advertising, in phylink_sfp_config()
2219 linkmode_copy(pl->supported, support); in phylink_sfp_config()
2220 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_sfp_config()
2223 if (pl->cur_link_an_mode != mode || in phylink_sfp_config()
2224 pl->link_config.interface != config.interface) { in phylink_sfp_config()
2225 pl->link_config.interface = config.interface; in phylink_sfp_config()
2226 pl->cur_link_an_mode = mode; in phylink_sfp_config()
2235 pl->link_port = pl->sfp_port; in phylink_sfp_config()
2238 &pl->phylink_disable_state)) in phylink_sfp_config()
2248 unsigned long *support = pl->sfp_support; in phylink_sfp_module_insert()
2253 sfp_parse_support(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2254 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, support); in phylink_sfp_module_insert()
2257 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
2258 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
2269 if (pl->phydev) { in phylink_sfp_module_start()
2270 phy_start(pl->phydev); in phylink_sfp_module_start()
2277 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
2281 pl->sfp_support, pl->sfp_support); in phylink_sfp_module_start()
2289 if (pl->phydev) in phylink_sfp_module_stop()
2290 phy_stop(pl->phydev); in phylink_sfp_module_stop()
2308 clear_bit(PHYLINK_DISABLE_LINK, &pl->phylink_disable_state); in phylink_sfp_link_up()
2317 return phy->is_c45 && in phylink_phy_no_inband()
2318 (phy->c45_ids.device_ids[1] & 0xfffffff0) == 0xae025150; in phylink_phy_no_inband()
2343 ret = phylink_sfp_config(pl, mode, phy->supported, phy->advertising); in phylink_sfp_connect_phy()
2347 interface = pl->link_config.interface; in phylink_sfp_connect_phy()
2379 * phylink_helper_basex_speed() - 1000BaseX/2500BaseX helper
2384 * the interface mode to suit. @state->interface is appropriately
2390 if (phy_interface_mode_is_8023z(state->interface)) { in phylink_helper_basex_speed()
2391 bool want_2500 = state->an_enabled ? in phylink_helper_basex_speed()
2392 phylink_test(state->advertising, 2500baseX_Full) : in phylink_helper_basex_speed()
2393 state->speed == SPEED_2500; in phylink_helper_basex_speed()
2396 phylink_clear(state->advertising, 1000baseX_Full); in phylink_helper_basex_speed()
2397 state->interface = PHY_INTERFACE_MODE_2500BASEX; in phylink_helper_basex_speed()
2399 phylink_clear(state->advertising, 2500baseX_Full); in phylink_helper_basex_speed()
2400 state->interface = PHY_INTERFACE_MODE_1000BASEX; in phylink_helper_basex_speed()
2417 mii_lpa_mod_linkmode_x(state->lp_advertising, config_reg, fd_bit); in phylink_decode_c37_word()
2419 if (linkmode_test_bit(fd_bit, state->advertising) && in phylink_decode_c37_word()
2420 linkmode_test_bit(fd_bit, state->lp_advertising)) { in phylink_decode_c37_word()
2421 state->speed = speed; in phylink_decode_c37_word()
2422 state->duplex = DUPLEX_FULL; in phylink_decode_c37_word()
2425 state->link = false; in phylink_decode_c37_word()
2428 linkmode_resolve_pause(state->advertising, state->lp_advertising, in phylink_decode_c37_word()
2432 state->pause |= MLO_PAUSE_TX; in phylink_decode_c37_word()
2434 state->pause |= MLO_PAUSE_RX; in phylink_decode_c37_word()
2441 state->link = false; in phylink_decode_sgmii_word()
2447 state->speed = SPEED_10; in phylink_decode_sgmii_word()
2450 state->speed = SPEED_100; in phylink_decode_sgmii_word()
2453 state->speed = SPEED_1000; in phylink_decode_sgmii_word()
2456 state->link = false; in phylink_decode_sgmii_word()
2460 state->duplex = DUPLEX_FULL; in phylink_decode_sgmii_word()
2462 state->duplex = DUPLEX_HALF; in phylink_decode_sgmii_word()
2466 * phylink_decode_usxgmii_word() - decode the USXGMII word from a MAC PCS
2468 * @lpa: a 16 bit value which stores the USXGMII auto-negotiation word
2470 * Helper for MAC PCS supporting the USXGMII protocol and the auto-negotiation
2479 state->speed = SPEED_10; in phylink_decode_usxgmii_word()
2482 state->speed = SPEED_100; in phylink_decode_usxgmii_word()
2485 state->speed = SPEED_1000; in phylink_decode_usxgmii_word()
2488 state->speed = SPEED_2500; in phylink_decode_usxgmii_word()
2491 state->speed = SPEED_5000; in phylink_decode_usxgmii_word()
2494 state->speed = SPEED_10000; in phylink_decode_usxgmii_word()
2497 state->link = false; in phylink_decode_usxgmii_word()
2502 state->duplex = DUPLEX_FULL; in phylink_decode_usxgmii_word()
2504 state->duplex = DUPLEX_HALF; in phylink_decode_usxgmii_word()
2509 * phylink_mii_c22_pcs_get_state() - read the MAC PCS state
2525 struct mii_bus *bus = pcs->bus; in phylink_mii_c22_pcs_get_state()
2526 int addr = pcs->addr; in phylink_mii_c22_pcs_get_state()
2532 state->link = false; in phylink_mii_c22_pcs_get_state()
2536 state->link = !!(bmsr & BMSR_LSTATUS); in phylink_mii_c22_pcs_get_state()
2537 state->an_complete = !!(bmsr & BMSR_ANEGCOMPLETE); in phylink_mii_c22_pcs_get_state()
2538 if (!state->link) in phylink_mii_c22_pcs_get_state()
2541 switch (state->interface) { in phylink_mii_c22_pcs_get_state()
2556 state->link = false; in phylink_mii_c22_pcs_get_state()
2563 * phylink_mii_c22_pcs_set_advertisement() - configure the clause 37 PCS
2583 struct mii_bus *bus = pcs->bus; in phylink_mii_c22_pcs_set_advertisement()
2584 int addr = pcs->addr; in phylink_mii_c22_pcs_set_advertisement()
2634 * phylink_mii_c22_pcs_config() - configure clause 22 PCS
2662 ret = mdiobus_modify(pcs->bus, pcs->addr, MII_BMCR, in phylink_mii_c22_pcs_config()
2672 * phylink_mii_c22_pcs_an_restart() - restart 802.3z autonegotiation
2684 struct mii_bus *bus = pcs->bus; in phylink_mii_c22_pcs_an_restart()
2685 int val, addr = pcs->addr; in phylink_mii_c22_pcs_an_restart()
2699 struct mii_bus *bus = pcs->bus; in phylink_mii_c45_pcs_get_state()
2700 int addr = pcs->addr; in phylink_mii_c45_pcs_get_state()
2705 state->link = false; in phylink_mii_c45_pcs_get_state()
2709 state->link = !!(stat & MDIO_STAT1_LSTATUS); in phylink_mii_c45_pcs_get_state()
2710 if (!state->link) in phylink_mii_c45_pcs_get_state()
2713 switch (state->interface) { in phylink_mii_c45_pcs_get_state()
2715 state->speed = SPEED_10000; in phylink_mii_c45_pcs_get_state()
2716 state->duplex = DUPLEX_FULL; in phylink_mii_c45_pcs_get_state()