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