Lines Matching refs:pl
96 #define phylink_printk(level, pl, fmt, ...) \ argument
98 if ((pl)->config->type == PHYLINK_NETDEV) \
99 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
100 else if ((pl)->config->type == PHYLINK_DEV) \
101 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
104 #define phylink_err(pl, fmt, ...) \ argument
105 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
106 #define phylink_warn(pl, fmt, ...) \ argument
107 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
108 #define phylink_info(pl, fmt, ...) \ argument
109 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
111 #define phylink_dbg(pl, fmt, ...) \ argument
113 if ((pl)->config->type == PHYLINK_NETDEV) \
114 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
115 else if ((pl)->config->type == PHYLINK_DEV) \
116 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
119 #define phylink_dbg(pl, fmt, ...) \ argument
120 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
122 #define phylink_dbg(pl, fmt, ...) \ argument
125 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
508 static int phylink_validate_mac_and_pcs(struct phylink *pl, in phylink_validate_mac_and_pcs() argument
517 if (pl->mac_ops->mac_select_pcs) { in phylink_validate_mac_and_pcs()
518 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); in phylink_validate_mac_and_pcs()
529 phylink_err(pl, "interface %s: uninitialised PCS\n", in phylink_validate_mac_and_pcs()
541 phylink_err(pl, "MAC returned PCS which does not support %s\n", in phylink_validate_mac_and_pcs()
561 if (pl->mac_ops->mac_get_caps) in phylink_validate_mac_and_pcs()
562 capabilities = pl->mac_ops->mac_get_caps(pl->config, in phylink_validate_mac_and_pcs()
565 capabilities = pl->config->mac_capabilities; in phylink_validate_mac_and_pcs()
572 static void phylink_validate_one(struct phylink *pl, struct phy_device *phy, in phylink_validate_one() argument
590 if (!phylink_validate_mac_and_pcs(pl, tmp_supported, &tmp_state)) { in phylink_validate_one()
591 phylink_dbg(pl, " interface %u (%s) rate match %s supports %*pbl\n", in phylink_validate_one()
602 static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy, in phylink_validate_mask() argument
612 phylink_validate_one(pl, phy, supported, state, interface, in phylink_validate_mask()
621 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
624 const unsigned long *interfaces = pl->config->supported_interfaces; in phylink_validate()
627 return phylink_validate_mask(pl, NULL, supported, state, in phylink_validate()
633 return phylink_validate_mac_and_pcs(pl, supported, state); in phylink_validate()
649 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
664 pl->link_config.speed = speed; in phylink_parse_fixedlink()
665 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
668 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
675 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
678 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
685 pl->link_gpio = desc; in phylink_parse_fixedlink()
699 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
706 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
708 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
711 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
714 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
718 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
719 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
720 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
721 pl->link_config.speed); in phylink_parse_fixedlink()
723 linkmode_zero(pl->supported); in phylink_parse_fixedlink()
724 phylink_fill_fixedlink_supported(pl->supported); in phylink_parse_fixedlink()
726 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
727 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
729 c = phy_caps_lookup(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
730 pl->supported, true); in phylink_parse_fixedlink()
732 linkmode_and(match, pl->supported, c->linkmodes); in phylink_parse_fixedlink()
737 linkmode_and(pl->supported, pl->supported, mask); in phylink_parse_fixedlink()
739 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
742 linkmode_or(pl->supported, pl->supported, match); in phylink_parse_fixedlink()
743 linkmode_or(pl->link_config.lp_advertising, in phylink_parse_fixedlink()
744 pl->link_config.lp_advertising, match); in phylink_parse_fixedlink()
746 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
747 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
748 pl->link_config.speed); in phylink_parse_fixedlink()
751 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
752 pl->supported); in phylink_parse_fixedlink()
754 pl->link_config.link = 1; in phylink_parse_fixedlink()
755 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
760 static int phylink_parse_mode(struct phylink *pl, in phylink_parse_mode() argument
767 if (pl->config->default_an_inband) in phylink_parse_mode()
768 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
772 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
777 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
778 phylink_err(pl, in phylink_parse_mode()
783 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
786 if (pl->cfg_link_an_mode == MLO_AN_INBAND) { in phylink_parse_mode()
787 linkmode_zero(pl->supported); in phylink_parse_mode()
788 phylink_set(pl->supported, MII); in phylink_parse_mode()
789 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
790 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
791 phylink_set(pl->supported, Pause); in phylink_parse_mode()
793 switch (pl->link_config.interface) { in phylink_parse_mode()
816 caps = phylink_get_capabilities(pl->link_config.interface, caps, in phylink_parse_mode()
818 phylink_caps_to_linkmodes(pl->supported, caps); in phylink_parse_mode()
822 phylink_err(pl, in phylink_parse_mode()
824 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
828 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
830 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
831 phylink_err(pl, in phylink_parse_mode()
840 static void phylink_apply_manual_flow(struct phylink *pl, in phylink_apply_manual_flow() argument
849 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
850 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
945 static unsigned int phylink_inband_caps(struct phylink *pl, in phylink_inband_caps() argument
950 if (!pl->mac_ops->mac_select_pcs) in phylink_inband_caps()
953 pcs = pl->mac_ops->mac_select_pcs(pl->config, interface); in phylink_inband_caps()
960 static void phylink_pcs_poll_stop(struct phylink *pl) in phylink_pcs_poll_stop() argument
962 if (pl->cfg_link_an_mode == MLO_AN_INBAND) in phylink_pcs_poll_stop()
963 timer_delete(&pl->link_poll); in phylink_pcs_poll_stop()
966 static void phylink_pcs_poll_start(struct phylink *pl) in phylink_pcs_poll_start() argument
968 if (pl->pcs && pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND) in phylink_pcs_poll_start()
969 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_pcs_poll_start()
972 int phylink_pcs_pre_init(struct phylink *pl, struct phylink_pcs *pcs) in phylink_pcs_pre_init() argument
977 if (pl->config->mac_requires_rxc) in phylink_pcs_pre_init()
987 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
999 phylink_dbg(pl, in phylink_mac_config()
1001 __func__, phylink_an_mode_str(pl->act_link_an_mode), in phylink_mac_config()
1007 pl->mac_ops->mac_config(pl->config, pl->act_link_an_mode, &st); in phylink_mac_config()
1010 static void phylink_pcs_an_restart(struct phylink *pl) in phylink_pcs_an_restart() argument
1012 if (pl->pcs && linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, in phylink_pcs_an_restart()
1013 pl->link_config.advertising) && in phylink_pcs_an_restart()
1014 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_pcs_an_restart()
1015 phylink_autoneg_inband(pl->act_link_an_mode)) in phylink_pcs_an_restart()
1016 pl->pcs->ops->pcs_an_restart(pl->pcs); in phylink_pcs_an_restart()
1039 static void phylink_pcs_neg_mode(struct phylink *pl, struct phylink_pcs *pcs, in phylink_pcs_neg_mode() argument
1051 mode = pl->req_link_an_mode; in phylink_pcs_neg_mode()
1053 pl->phy_ib_mode = 0; in phylink_pcs_neg_mode()
1081 pl->pcs_neg_mode = PHYLINK_PCS_NEG_NONE; in phylink_pcs_neg_mode()
1082 pl->act_link_an_mode = mode; in phylink_pcs_neg_mode()
1089 if (pl->phydev) in phylink_pcs_neg_mode()
1090 phy_ib_caps = phy_inband_caps(pl->phydev, interface); in phylink_pcs_neg_mode()
1092 phylink_dbg(pl, "interface %s inband modes: pcs=%02x phy=%02x\n", in phylink_pcs_neg_mode()
1114 pl->phy_ib_mode = LINK_INBAND_DISABLE; in phylink_pcs_neg_mode()
1116 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1126 phylink_warn(pl, in phylink_pcs_neg_mode()
1134 } else if (type == INBAND_CISCO_SGMII || pl->phydev) { in phylink_pcs_neg_mode()
1169 pl->phy_ib_mode = LINK_INBAND_ENABLE; in phylink_pcs_neg_mode()
1171 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1180 pl->phy_ib_mode = LINK_INBAND_DISABLE; in phylink_pcs_neg_mode()
1182 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1185 if (pl->phydev) in phylink_pcs_neg_mode()
1189 phylink_warn(pl, "%s: incompatible in-band capabilities, trying in-band", in phylink_pcs_neg_mode()
1212 pl->pcs_neg_mode = neg_mode; in phylink_pcs_neg_mode()
1213 pl->act_link_an_mode = mode; in phylink_pcs_neg_mode()
1216 static void phylink_major_config(struct phylink *pl, bool restart, in phylink_major_config() argument
1224 phylink_dbg(pl, "major config, requested %s/%s\n", in phylink_major_config()
1225 phylink_an_mode_str(pl->req_link_an_mode), in phylink_major_config()
1228 pl->major_config_failed = false; in phylink_major_config()
1230 if (pl->mac_ops->mac_select_pcs) { in phylink_major_config()
1231 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); in phylink_major_config()
1233 phylink_err(pl, in phylink_major_config()
1237 pl->major_config_failed = true; in phylink_major_config()
1241 pcs_changed = pl->pcs != pcs; in phylink_major_config()
1244 phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising); in phylink_major_config()
1246 phylink_dbg(pl, "major config, active %s/%s/%s\n", in phylink_major_config()
1247 phylink_an_mode_str(pl->act_link_an_mode), in phylink_major_config()
1248 phylink_pcs_mode_str(pl->pcs_neg_mode), in phylink_major_config()
1251 phylink_pcs_poll_stop(pl); in phylink_major_config()
1253 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
1254 err = pl->mac_ops->mac_prepare(pl->config, pl->act_link_an_mode, in phylink_major_config()
1257 phylink_err(pl, "mac_prepare failed: %pe\n", in phylink_major_config()
1259 pl->major_config_failed = true; in phylink_major_config()
1268 phylink_pcs_disable(pl->pcs); in phylink_major_config()
1270 if (pl->pcs) in phylink_major_config()
1271 pl->pcs->phylink = NULL; in phylink_major_config()
1273 pcs->phylink = pl; in phylink_major_config()
1275 pl->pcs = pcs; in phylink_major_config()
1278 if (pl->pcs) in phylink_major_config()
1279 phylink_pcs_pre_config(pl->pcs, state->interface); in phylink_major_config()
1281 phylink_mac_config(pl, state); in phylink_major_config()
1283 if (pl->pcs) { in phylink_major_config()
1284 err = phylink_pcs_post_config(pl->pcs, state->interface); in phylink_major_config()
1286 phylink_err(pl, "pcs_post_config failed: %pe\n", in phylink_major_config()
1289 pl->major_config_failed = true; in phylink_major_config()
1293 if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed) in phylink_major_config()
1294 phylink_pcs_enable(pl->pcs); in phylink_major_config()
1296 err = phylink_pcs_config(pl->pcs, pl->pcs_neg_mode, state, in phylink_major_config()
1297 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_major_config()
1299 phylink_err(pl, "pcs_config failed: %pe\n", ERR_PTR(err)); in phylink_major_config()
1300 pl->major_config_failed = true; in phylink_major_config()
1306 phylink_pcs_an_restart(pl); in phylink_major_config()
1308 if (pl->mac_ops->mac_finish) { in phylink_major_config()
1309 err = pl->mac_ops->mac_finish(pl->config, pl->act_link_an_mode, in phylink_major_config()
1312 phylink_err(pl, "mac_finish failed: %pe\n", in phylink_major_config()
1315 pl->major_config_failed = true; in phylink_major_config()
1319 if (pl->phydev && pl->phy_ib_mode) { in phylink_major_config()
1320 err = phy_config_inband(pl->phydev, pl->phy_ib_mode); in phylink_major_config()
1322 phylink_err(pl, "phy_config_inband: %pe\n", in phylink_major_config()
1325 pl->major_config_failed = true; in phylink_major_config()
1329 if (pl->sfp_bus) { in phylink_major_config()
1332 sfp_upstream_set_signal_rate(pl->sfp_bus, rate_kbd); in phylink_major_config()
1335 phylink_pcs_poll_start(pl); in phylink_major_config()
1344 static int phylink_change_inband_advert(struct phylink *pl) in phylink_change_inband_advert() argument
1348 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
1351 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__, in phylink_change_inband_advert()
1352 phylink_an_mode_str(pl->req_link_an_mode), in phylink_change_inband_advert()
1353 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
1354 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
1355 pl->link_config.pause); in phylink_change_inband_advert()
1358 phylink_pcs_neg_mode(pl, pl->pcs, pl->link_config.interface, in phylink_change_inband_advert()
1359 pl->link_config.advertising); in phylink_change_inband_advert()
1365 ret = phylink_pcs_config(pl->pcs, pl->pcs_neg_mode, &pl->link_config, in phylink_change_inband_advert()
1366 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
1371 phylink_pcs_an_restart(pl); in phylink_change_inband_advert()
1376 static void phylink_mac_pcs_get_state(struct phylink *pl, in phylink_mac_pcs_get_state() argument
1382 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
1384 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
1385 state->rate_matching = pl->link_config.rate_matching; in phylink_mac_pcs_get_state()
1389 autoneg = pl->pcs_neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED; in phylink_mac_pcs_get_state()
1395 state->speed = pl->link_config.speed; in phylink_mac_pcs_get_state()
1396 state->duplex = pl->link_config.duplex; in phylink_mac_pcs_get_state()
1397 state->pause = pl->link_config.pause; in phylink_mac_pcs_get_state()
1400 pcs = pl->pcs; in phylink_mac_pcs_get_state()
1402 pcs->ops->pcs_get_state(pcs, pl->pcs_neg_mode, state); in phylink_mac_pcs_get_state()
1410 static void phylink_get_fixed_state(struct phylink *pl, in phylink_get_fixed_state() argument
1413 *state = pl->link_config; in phylink_get_fixed_state()
1414 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
1415 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
1416 else if (pl->link_gpio) in phylink_get_fixed_state()
1417 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
1423 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart) in phylink_mac_initial_config() argument
1427 switch (pl->req_link_an_mode) { in phylink_mac_initial_config()
1429 link_state = pl->phy_state; in phylink_mac_initial_config()
1433 phylink_get_fixed_state(pl, &link_state); in phylink_mac_initial_config()
1437 link_state = pl->link_config; in phylink_mac_initial_config()
1448 phylink_apply_manual_flow(pl, &link_state); in phylink_mac_initial_config()
1449 phylink_major_config(pl, force_restart, &link_state); in phylink_mac_initial_config()
1466 static void phylink_deactivate_lpi(struct phylink *pl) in phylink_deactivate_lpi() argument
1468 if (pl->mac_enable_tx_lpi) { in phylink_deactivate_lpi()
1469 pl->mac_enable_tx_lpi = false; in phylink_deactivate_lpi()
1471 phylink_dbg(pl, "disabling LPI\n"); in phylink_deactivate_lpi()
1473 pl->mac_ops->mac_disable_tx_lpi(pl->config); in phylink_deactivate_lpi()
1475 phylink_pcs_disable_eee(pl->pcs); in phylink_deactivate_lpi()
1479 static void phylink_activate_lpi(struct phylink *pl) in phylink_activate_lpi() argument
1483 if (!test_bit(pl->cur_interface, pl->config->lpi_interfaces)) { in phylink_activate_lpi()
1484 phylink_dbg(pl, "MAC does not support LPI with %s\n", in phylink_activate_lpi()
1485 phy_modes(pl->cur_interface)); in phylink_activate_lpi()
1489 phylink_dbg(pl, "LPI timer %uus, tx clock stop %u\n", in phylink_activate_lpi()
1490 pl->mac_tx_lpi_timer, pl->mac_tx_clk_stop); in phylink_activate_lpi()
1492 phylink_pcs_enable_eee(pl->pcs); in phylink_activate_lpi()
1494 err = pl->mac_ops->mac_enable_tx_lpi(pl->config, pl->mac_tx_lpi_timer, in phylink_activate_lpi()
1495 pl->mac_tx_clk_stop); in phylink_activate_lpi()
1497 phylink_pcs_disable_eee(pl->pcs); in phylink_activate_lpi()
1498 phylink_err(pl, "%ps() failed: %pe\n", in phylink_activate_lpi()
1499 pl->mac_ops->mac_enable_tx_lpi, ERR_PTR(err)); in phylink_activate_lpi()
1503 pl->mac_enable_tx_lpi = true; in phylink_activate_lpi()
1506 static void phylink_link_up(struct phylink *pl, in phylink_link_up() argument
1509 struct net_device *ndev = pl->netdev; in phylink_link_up()
1538 pl->cur_interface = link_state.interface; in phylink_link_up()
1540 phylink_pcs_link_up(pl->pcs, pl->pcs_neg_mode, pl->cur_interface, speed, in phylink_link_up()
1543 pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->act_link_an_mode, in phylink_link_up()
1544 pl->cur_interface, speed, duplex, in phylink_link_up()
1547 if (pl->mac_supports_eee && pl->phy_enable_tx_lpi) in phylink_link_up()
1548 phylink_activate_lpi(pl); in phylink_link_up()
1553 phylink_info(pl, in phylink_link_up()
1560 static void phylink_link_down(struct phylink *pl) in phylink_link_down() argument
1562 struct net_device *ndev = pl->netdev; in phylink_link_down()
1567 phylink_deactivate_lpi(pl); in phylink_link_down()
1569 pl->mac_ops->mac_link_down(pl->config, pl->act_link_an_mode, in phylink_link_down()
1570 pl->cur_interface); in phylink_link_down()
1571 phylink_info(pl, "Link is Down\n"); in phylink_link_down()
1574 static bool phylink_link_is_up(struct phylink *pl) in phylink_link_is_up() argument
1576 return pl->netdev ? netif_carrier_ok(pl->netdev) : pl->old_link_state; in phylink_link_is_up()
1581 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
1587 mutex_lock(&pl->state_mutex); in phylink_resolve()
1588 cur_link_state = phylink_link_is_up(pl); in phylink_resolve()
1590 if (pl->phylink_disable_state) { in phylink_resolve()
1591 pl->link_failed = false; in phylink_resolve()
1593 } else if (pl->link_failed) { in phylink_resolve()
1596 } else if (pl->act_link_an_mode == MLO_AN_FIXED) { in phylink_resolve()
1597 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
1599 } else if (pl->act_link_an_mode == MLO_AN_PHY) { in phylink_resolve()
1600 link_state = pl->phy_state; in phylink_resolve()
1603 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
1614 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
1620 if (pl->phydev) in phylink_resolve()
1621 link_state.link &= pl->phy_state.link; in phylink_resolve()
1624 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
1628 if (link_state.interface != pl->phy_state.interface) { in phylink_resolve()
1633 link_state.interface = pl->phy_state.interface; in phylink_resolve()
1638 if (pl->phy_state.rate_matching) { in phylink_resolve()
1640 pl->phy_state.rate_matching; in phylink_resolve()
1641 link_state.speed = pl->phy_state.speed; in phylink_resolve()
1642 link_state.duplex = pl->phy_state.duplex; in phylink_resolve()
1648 link_state.pause = pl->phy_state.pause; in phylink_resolve()
1653 if (pl->act_link_an_mode != MLO_AN_FIXED) in phylink_resolve()
1654 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
1657 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
1662 phylink_link_down(pl); in phylink_resolve()
1665 phylink_major_config(pl, false, &link_state); in phylink_resolve()
1666 pl->link_config.interface = link_state.interface; in phylink_resolve()
1673 if (pl->major_config_failed) in phylink_resolve()
1677 pl->old_link_state = link_state.link; in phylink_resolve()
1679 phylink_link_down(pl); in phylink_resolve()
1681 phylink_link_up(pl, link_state); in phylink_resolve()
1684 pl->link_failed = false; in phylink_resolve()
1685 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
1687 mutex_unlock(&pl->state_mutex); in phylink_resolve()
1690 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
1692 if (!pl->phylink_disable_state) in phylink_run_resolve()
1693 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
1696 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
1698 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
1700 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
1702 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
1703 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
1707 static void phylink_enable_and_run_resolve(struct phylink *pl, int bit) in phylink_enable_and_run_resolve() argument
1709 clear_bit(bit, &pl->phylink_disable_state); in phylink_enable_and_run_resolve()
1710 phylink_run_resolve(pl); in phylink_enable_and_run_resolve()
1715 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
1719 phylink_run_resolve(pl); in phylink_fixed_poll()
1724 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
1735 phylink_err(pl, "unable to attach SFP bus: %pe\n", bus); in phylink_register_sfp()
1739 pl->sfp_bus = bus; in phylink_register_sfp()
1741 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops); in phylink_register_sfp()
1757 int phylink_set_fixed_link(struct phylink *pl, in phylink_set_fixed_link() argument
1763 if (pl->cfg_link_an_mode != MLO_AN_PHY || !state || in phylink_set_fixed_link()
1764 !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_set_fixed_link()
1768 pl->supported, true); in phylink_set_fixed_link()
1772 adv = pl->link_config.advertising; in phylink_set_fixed_link()
1773 linkmode_and(adv, pl->supported, c->linkmodes); in phylink_set_fixed_link()
1776 pl->link_config.speed = state->speed; in phylink_set_fixed_link()
1777 pl->link_config.duplex = state->duplex; in phylink_set_fixed_link()
1778 pl->link_config.link = 1; in phylink_set_fixed_link()
1779 pl->link_config.an_complete = 1; in phylink_set_fixed_link()
1781 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_set_fixed_link()
1782 pl->req_link_an_mode = pl->cfg_link_an_mode; in phylink_set_fixed_link()
1809 struct phylink *pl; in phylink_create() local
1819 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
1820 if (!pl) in phylink_create()
1823 mutex_init(&pl->state_mutex); in phylink_create()
1824 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
1826 pl->config = config; in phylink_create()
1828 pl->netdev = to_net_dev(config->dev); in phylink_create()
1829 netif_carrier_off(pl->netdev); in phylink_create()
1831 pl->dev = config->dev; in phylink_create()
1833 kfree(pl); in phylink_create()
1837 pl->mac_supports_eee_ops = phylink_mac_implements_lpi(mac_ops); in phylink_create()
1838 pl->mac_supports_eee = pl->mac_supports_eee_ops && in phylink_create()
1839 pl->config->lpi_capabilities && in phylink_create()
1840 !phy_interface_empty(pl->config->lpi_interfaces); in phylink_create()
1843 pl->eee_cfg.eee_enabled = pl->config->eee_enabled_default; in phylink_create()
1844 pl->eee_cfg.tx_lpi_enabled = pl->eee_cfg.eee_enabled; in phylink_create()
1845 pl->eee_cfg.tx_lpi_timer = pl->config->lpi_timer_default; in phylink_create()
1847 pl->phy_state.interface = iface; in phylink_create()
1848 pl->link_interface = iface; in phylink_create()
1850 pl->link_port = PORT_BNC; in phylink_create()
1852 pl->link_port = PORT_MII; in phylink_create()
1853 pl->link_config.interface = iface; in phylink_create()
1854 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
1855 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
1856 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
1857 pl->pcs_state = PCS_STATE_DOWN; in phylink_create()
1858 pl->mac_ops = mac_ops; in phylink_create()
1859 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
1860 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
1862 linkmode_fill(pl->supported); in phylink_create()
1863 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
1864 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
1866 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
1868 kfree(pl); in phylink_create()
1872 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
1873 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
1875 kfree(pl); in phylink_create()
1880 pl->req_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
1882 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
1884 kfree(pl); in phylink_create()
1888 return pl; in phylink_create()
1901 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
1903 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
1904 if (pl->link_gpio) in phylink_destroy()
1905 gpiod_put(pl->link_gpio); in phylink_destroy()
1907 cancel_work_sync(&pl->resolve); in phylink_destroy()
1908 kfree(pl); in phylink_destroy()
1921 bool phylink_expects_phy(struct phylink *pl) in phylink_expects_phy() argument
1923 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_expects_phy()
1924 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_expects_phy()
1925 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_expects_phy()
1933 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
1938 mutex_lock(&pl->state_mutex); in phylink_phy_change()
1939 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
1940 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
1941 pl->phy_state.rate_matching = phydev->rate_matching; in phylink_phy_change()
1942 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
1944 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
1946 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
1947 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
1948 pl->phy_state.link = up; in phylink_phy_change()
1950 pl->link_failed = true; in phylink_phy_change()
1953 pl->phy_enable_tx_lpi = phydev->enable_tx_lpi; in phylink_phy_change()
1954 pl->mac_tx_lpi_timer = phydev->eee_cfg.tx_lpi_timer; in phylink_phy_change()
1955 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
1957 phylink_run_resolve(pl); in phylink_phy_change()
1959 phylink_dbg(pl, "phy link %s %s/%s/%s/%s/%s/%slpi\n", in phylink_phy_change()
1965 phylink_pause_to_str(pl->phy_state.pause), in phylink_phy_change()
1969 static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy, in phylink_validate_phy() argument
1984 pl->config->supported_interfaces); in phylink_validate_phy()
1987 phylink_err(pl, "PHY has no common interfaces\n"); in phylink_validate_phy()
1999 phylink_err(pl, "SFP PHY's possible interfaces becomes empty\n"); in phylink_validate_phy()
2004 phylink_dbg(pl, "PHY %s uses interfaces %*pbl, validating %*pbl\n", in phylink_validate_phy()
2010 return phylink_validate_mask(pl, phy, supported, state, in phylink_validate_phy()
2014 phylink_dbg(pl, "PHY %s doesn't supply possible interfaces\n", in phylink_validate_phy()
2039 return phylink_validate(pl, supported, state); in phylink_validate_phy()
2042 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, in phylink_bringup_phy() argument
2064 ret = phylink_validate_phy(pl, phy, supported, &config); in phylink_bringup_phy()
2066 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %pe\n", in phylink_bringup_phy()
2074 phy->phylink = pl; in phylink_bringup_phy()
2078 phylink_info(pl, in phylink_bringup_phy()
2084 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
2085 pl->phydev = phy; in phylink_bringup_phy()
2086 pl->phy_state.interface = interface; in phylink_bringup_phy()
2087 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
2088 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
2089 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
2090 pl->phy_state.rate_matching = RATE_MATCH_NONE; in phylink_bringup_phy()
2091 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
2092 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
2100 if (pl->mac_supports_eee) { in phylink_bringup_phy()
2105 if (pl->eee_cfg.eee_enabled) in phylink_bringup_phy()
2108 phy->eee_cfg.tx_lpi_enabled = pl->eee_cfg.tx_lpi_enabled; in phylink_bringup_phy()
2109 phy->eee_cfg.tx_lpi_timer = pl->eee_cfg.tx_lpi_timer; in phylink_bringup_phy()
2112 linkmode_zero(pl->supported_lpi); in phylink_bringup_phy()
2113 phylink_caps_to_linkmodes(pl->supported_lpi, in phylink_bringup_phy()
2114 pl->config->lpi_capabilities); in phylink_bringup_phy()
2120 pl->supported_lpi); in phylink_bringup_phy()
2121 } else if (pl->mac_supports_eee_ops) { in phylink_bringup_phy()
2126 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
2129 phylink_dbg(pl, in phylink_bringup_phy()
2132 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
2138 if (pl->config->mac_managed_pm) in phylink_bringup_phy()
2142 pl->mac_tx_clk_stop = phy_eee_tx_clock_stop_capable(phy) > 0; in phylink_bringup_phy()
2144 if (pl->mac_supports_eee_ops) { in phylink_bringup_phy()
2149 pl->config->eee_rx_clk_stop_enable); in phylink_bringup_phy()
2157 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy, in phylink_attach_phy() argument
2162 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
2163 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
2164 phy_interface_mode_is_8023z(interface) && !pl->sfp_bus))) in phylink_attach_phy()
2167 if (pl->phydev) in phylink_attach_phy()
2170 if (pl->config->mac_requires_rxc) in phylink_attach_phy()
2173 return phy_attach_direct(pl->netdev, phy, flags, interface); in phylink_attach_phy()
2191 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
2196 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
2197 pl->link_interface = phy->interface; in phylink_connect_phy()
2198 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
2201 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
2205 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
2225 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
2228 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags); in phylink_of_phy_connect()
2243 int phylink_fwnode_phy_connect(struct phylink *pl, in phylink_fwnode_phy_connect() argument
2252 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_fwnode_phy_connect()
2253 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_fwnode_phy_connect()
2254 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_fwnode_phy_connect()
2259 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_fwnode_phy_connect()
2271 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_fwnode_phy_connect()
2272 pl->link_interface = phy_dev->interface; in phylink_fwnode_phy_connect()
2273 pl->link_config.interface = pl->link_interface; in phylink_fwnode_phy_connect()
2276 if (pl->config->mac_requires_rxc) in phylink_fwnode_phy_connect()
2279 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_fwnode_phy_connect()
2280 pl->link_interface); in phylink_fwnode_phy_connect()
2285 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_fwnode_phy_connect()
2300 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
2306 phy = pl->phydev; in phylink_disconnect_phy()
2309 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
2310 pl->phydev = NULL; in phylink_disconnect_phy()
2311 pl->phy_enable_tx_lpi = false; in phylink_disconnect_phy()
2312 pl->mac_tx_clk_stop = false; in phylink_disconnect_phy()
2313 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
2315 flush_work(&pl->resolve); in phylink_disconnect_phy()
2322 static void phylink_link_changed(struct phylink *pl, bool up, const char *what) in phylink_link_changed() argument
2325 pl->link_failed = true; in phylink_link_changed()
2326 phylink_run_resolve(pl); in phylink_link_changed()
2327 phylink_dbg(pl, "%s link %s\n", what, up ? "up" : "down"); in phylink_link_changed()
2338 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
2340 phylink_link_changed(pl, up, "mac"); in phylink_mac_change()
2357 struct phylink *pl = pcs->phylink; in phylink_pcs_change() local
2359 if (pl) in phylink_pcs_change()
2360 phylink_link_changed(pl, up, "pcs"); in phylink_pcs_change()
2366 struct phylink *pl = data; in phylink_link_handler() local
2368 phylink_run_resolve(pl); in phylink_link_handler()
2381 void phylink_start(struct phylink *pl) in phylink_start() argument
2387 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
2388 phylink_an_mode_str(pl->req_link_an_mode), in phylink_start()
2389 phy_modes(pl->link_config.interface)); in phylink_start()
2392 if (pl->netdev) in phylink_start()
2393 netif_carrier_off(pl->netdev); in phylink_start()
2395 pl->pcs_state = PCS_STATE_STARTING; in phylink_start()
2405 phylink_mac_initial_config(pl, true); in phylink_start()
2407 pl->pcs_state = PCS_STATE_STARTED; in phylink_start()
2409 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED); in phylink_start()
2411 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
2412 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
2418 "netdev link", pl)) in phylink_start()
2419 pl->link_irq = irq; in phylink_start()
2427 if (pl->cfg_link_an_mode == MLO_AN_FIXED) in phylink_start()
2428 poll |= pl->config->poll_fixed_state; in phylink_start()
2431 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
2432 if (pl->phydev) in phylink_start()
2433 phy_start(pl->phydev); in phylink_start()
2434 if (pl->sfp_bus) in phylink_start()
2435 sfp_upstream_start(pl->sfp_bus); in phylink_start()
2451 void phylink_stop(struct phylink *pl) in phylink_stop() argument
2455 if (pl->sfp_bus) in phylink_stop()
2456 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
2457 if (pl->phydev) in phylink_stop()
2458 phy_stop(pl->phydev); in phylink_stop()
2459 timer_delete_sync(&pl->link_poll); in phylink_stop()
2460 if (pl->link_irq) { in phylink_stop()
2461 free_irq(pl->link_irq, pl); in phylink_stop()
2462 pl->link_irq = 0; in phylink_stop()
2465 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
2467 pl->pcs_state = PCS_STATE_DOWN; in phylink_stop()
2469 phylink_pcs_disable(pl->pcs); in phylink_stop()
2481 void phylink_rx_clk_stop_block(struct phylink *pl) in phylink_rx_clk_stop_block() argument
2485 if (pl->mac_rx_clk_stop_blocked == U8_MAX) { in phylink_rx_clk_stop_block()
2486 phylink_warn(pl, "%s called too many times - ignoring\n", in phylink_rx_clk_stop_block()
2495 if (pl->mac_rx_clk_stop_blocked++ == 0 && in phylink_rx_clk_stop_block()
2496 pl->mac_supports_eee_ops && pl->phydev && in phylink_rx_clk_stop_block()
2497 pl->config->eee_rx_clk_stop_enable) in phylink_rx_clk_stop_block()
2498 phy_eee_rx_clock_stop(pl->phydev, false); in phylink_rx_clk_stop_block()
2510 void phylink_rx_clk_stop_unblock(struct phylink *pl) in phylink_rx_clk_stop_unblock() argument
2514 if (pl->mac_rx_clk_stop_blocked == 0) { in phylink_rx_clk_stop_unblock()
2515 phylink_warn(pl, "%s called too many times - ignoring\n", in phylink_rx_clk_stop_unblock()
2524 if (--pl->mac_rx_clk_stop_blocked == 0 && in phylink_rx_clk_stop_unblock()
2525 pl->mac_supports_eee_ops && pl->phydev && in phylink_rx_clk_stop_unblock()
2526 pl->config->eee_rx_clk_stop_enable) in phylink_rx_clk_stop_unblock()
2527 phy_eee_rx_clock_stop(pl->phydev, true); in phylink_rx_clk_stop_unblock()
2545 void phylink_suspend(struct phylink *pl, bool mac_wol) in phylink_suspend() argument
2549 if (mac_wol && (!pl->netdev || pl->netdev->ethtool->wol_enabled)) { in phylink_suspend()
2551 mutex_lock(&pl->state_mutex); in phylink_suspend()
2554 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_suspend()
2556 pl->suspend_link_up = phylink_link_is_up(pl); in phylink_suspend()
2557 if (pl->suspend_link_up) { in phylink_suspend()
2562 if (pl->netdev) in phylink_suspend()
2563 netif_carrier_off(pl->netdev); in phylink_suspend()
2564 pl->old_link_state = false; in phylink_suspend()
2570 mutex_unlock(&pl->state_mutex); in phylink_suspend()
2572 phylink_stop(pl); in phylink_suspend()
2585 void phylink_prepare_resume(struct phylink *pl) in phylink_prepare_resume() argument
2587 struct phy_device *phydev = pl->phydev; in phylink_prepare_resume()
2597 if (pl->config->mac_requires_rxc && phydev && phydev->suspended) in phylink_prepare_resume()
2609 void phylink_resume(struct phylink *pl) in phylink_resume() argument
2613 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) { in phylink_resume()
2616 if (pl->suspend_link_up) { in phylink_resume()
2624 mutex_lock(&pl->state_mutex); in phylink_resume()
2625 phylink_link_down(pl); in phylink_resume()
2626 mutex_unlock(&pl->state_mutex); in phylink_resume()
2632 phylink_mac_initial_config(pl, true); in phylink_resume()
2635 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_MAC_WOL); in phylink_resume()
2637 phylink_start(pl); in phylink_resume()
2651 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
2658 if (pl->phydev) in phylink_ethtool_get_wol()
2659 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
2674 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
2680 if (pl->phydev) in phylink_ethtool_set_wol()
2681 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
2687 static phy_interface_t phylink_sfp_select_interface(struct phylink *pl, in phylink_sfp_select_interface() argument
2692 interface = sfp_select_interface(pl->sfp_bus, link_modes); in phylink_sfp_select_interface()
2694 phylink_err(pl, in phylink_sfp_select_interface()
2701 if (!test_bit(interface, pl->config->supported_interfaces)) { in phylink_sfp_select_interface()
2702 phylink_err(pl, in phylink_sfp_select_interface()
2706 pl->config->supported_interfaces); in phylink_sfp_select_interface()
2713 static phy_interface_t phylink_sfp_select_interface_speed(struct phylink *pl, in phylink_sfp_select_interface_speed() argument
2723 if (!test_bit(interface, pl->sfp_interfaces)) in phylink_sfp_select_interface_speed()
2740 phylink_err(pl, "selection of interface failed, speed %u\n", in phylink_sfp_select_interface_speed()
2780 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
2787 if (pl->phydev) in phylink_ethtool_ksettings_get()
2788 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
2790 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
2792 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
2794 switch (pl->act_link_an_mode) { in phylink_ethtool_ksettings_get()
2800 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
2808 if (pl->phydev) in phylink_ethtool_ksettings_get()
2811 phylink_mac_pcs_get_state(pl, &link_state); in phylink_ethtool_ksettings_get()
2825 static bool phylink_validate_pcs_inband_autoneg(struct phylink *pl, in phylink_validate_pcs_inband_autoneg() argument
2829 unsigned int inband = phylink_inband_caps(pl, interface); in phylink_validate_pcs_inband_autoneg()
2850 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
2859 if (pl->phydev) { in phylink_ethtool_ksettings_set()
2864 pl->supported); in phylink_ethtool_ksettings_set()
2884 return phy_ethtool_ksettings_set(pl->phydev, &phy_kset); in phylink_ethtool_ksettings_set()
2887 config = pl->link_config; in phylink_ethtool_ksettings_set()
2890 pl->supported); in phylink_ethtool_ksettings_set()
2899 pl->supported, false); in phylink_ethtool_ksettings_set()
2906 if (pl->req_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
2907 if (c->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
2908 c->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
2922 if (pl->req_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
2924 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
2947 if (pl->sfp_bus) { in phylink_ethtool_ksettings_set()
2950 phylink_sfp_select_interface(pl, in phylink_ethtool_ksettings_set()
2954 phylink_sfp_select_interface_speed(pl, in phylink_ethtool_ksettings_set()
2960 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
2961 if (phylink_validate(pl, support, &config)) { in phylink_ethtool_ksettings_set()
2962 phylink_err(pl, "validation of %s/%s with support %*pb failed\n", in phylink_ethtool_ksettings_set()
2963 phylink_an_mode_str(pl->req_link_an_mode), in phylink_ethtool_ksettings_set()
2970 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
2971 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
2984 if (!phylink_validate_pcs_inband_autoneg(pl, config.interface, in phylink_ethtool_ksettings_set()
2988 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
2989 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
2990 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
2992 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
2995 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
2996 phylink_link_down(pl); in phylink_ethtool_ksettings_set()
2997 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
3000 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
3001 phylink_major_config(pl, false, &config); in phylink_ethtool_ksettings_set()
3002 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
3003 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
3004 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
3006 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
3007 phylink_change_inband_advert(pl); in phylink_ethtool_ksettings_set()
3009 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
3026 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
3032 if (pl->phydev) in phylink_ethtool_nway_reset()
3033 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
3034 phylink_pcs_an_restart(pl); in phylink_ethtool_nway_reset()
3045 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
3050 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
3051 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
3052 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
3061 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
3064 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
3070 if (pl->req_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
3073 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
3074 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
3077 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
3089 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
3115 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
3116 phylink_change_inband_advert(pl); in phylink_ethtool_set_pauseparam()
3118 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
3125 if (pl->phydev) in phylink_ethtool_set_pauseparam()
3126 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
3134 pl->link_failed = true; in phylink_ethtool_set_pauseparam()
3135 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
3152 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
3158 if (pl->phydev) in phylink_get_eee_err()
3159 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
3170 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_keee *eee) in phylink_ethtool_get_eee() argument
3176 if (pl->mac_supports_eee_ops && !pl->mac_supports_eee) in phylink_ethtool_get_eee()
3179 if (pl->phydev) { in phylink_ethtool_get_eee()
3180 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
3182 if (ret == 0 && pl->mac_supports_eee_ops) in phylink_ethtool_get_eee()
3184 pl->supported_lpi); in phylink_ethtool_get_eee()
3196 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_keee *eee) in phylink_ethtool_set_eee() argument
3198 bool mac_eee = pl->mac_supports_eee; in phylink_ethtool_set_eee()
3203 phylink_dbg(pl, "mac %s phylink EEE%s, adv %*pbl, LPI%s timer %uus\n", in phylink_ethtool_set_eee()
3209 if (pl->mac_supports_eee_ops && !mac_eee) in phylink_ethtool_set_eee()
3212 if (pl->phydev) { in phylink_ethtool_set_eee()
3214 if (pl->mac_supports_eee_ops) in phylink_ethtool_set_eee()
3216 pl->supported_lpi); in phylink_ethtool_set_eee()
3217 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
3219 eee_to_eeecfg(&pl->eee_cfg, eee); in phylink_ethtool_set_eee()
3252 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
3255 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
3261 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_read()
3287 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_read()
3291 return mdiobus_read(pl->phydev->mdio.bus, phy_id, reg); in phylink_phy_read()
3294 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
3297 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
3303 return mdiobus_c45_write(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_write()
3328 return mdiobus_c45_write(pl->phydev->mdio.bus, phy_id, devad, in phylink_phy_write()
3335 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
3341 switch (pl->act_link_an_mode) { in phylink_mii_read()
3344 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
3354 phylink_mac_pcs_get_state(pl, &state); in phylink_mii_read()
3363 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
3366 switch (pl->act_link_an_mode) { in phylink_mii_write()
3398 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
3405 if (pl->phydev) { in phylink_mii_ioctl()
3409 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
3413 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
3421 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
3426 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
3436 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
3444 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
3470 int phylink_speed_down(struct phylink *pl, bool sync) in phylink_speed_down() argument
3476 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
3477 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
3493 int phylink_speed_up(struct phylink *pl) in phylink_speed_up() argument
3499 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
3500 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
3508 struct phylink *pl = upstream; in phylink_sfp_attach() local
3510 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
3515 struct phylink *pl = upstream; in phylink_sfp_detach() local
3517 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
3520 static phy_interface_t phylink_choose_sfp_interface(struct phylink *pl, in phylink_choose_sfp_interface() argument
3536 static void phylink_sfp_set_config(struct phylink *pl, unsigned long *supported, in phylink_sfp_set_config() argument
3542 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_set_config()
3546 if (!linkmode_equal(pl->supported, supported)) { in phylink_sfp_set_config()
3547 linkmode_copy(pl->supported, supported); in phylink_sfp_set_config()
3551 if (!linkmode_equal(pl->link_config.advertising, state->advertising)) { in phylink_sfp_set_config()
3552 linkmode_copy(pl->link_config.advertising, state->advertising); in phylink_sfp_set_config()
3556 if (pl->req_link_an_mode != mode || in phylink_sfp_set_config()
3557 pl->link_config.interface != state->interface) { in phylink_sfp_set_config()
3558 pl->req_link_an_mode = mode; in phylink_sfp_set_config()
3559 pl->link_config.interface = state->interface; in phylink_sfp_set_config()
3563 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_set_config()
3569 &pl->phylink_disable_state)) in phylink_sfp_set_config()
3570 phylink_mac_initial_config(pl, false); in phylink_sfp_set_config()
3573 static int phylink_sfp_config_phy(struct phylink *pl, struct phy_device *phy) in phylink_sfp_config_phy() argument
3580 phy_interface_zero(pl->sfp_interfaces); in phylink_sfp_config_phy()
3591 ret = phylink_validate(pl, support, &config); in phylink_sfp_config_phy()
3593 phylink_err(pl, "validation with support %*pb failed: %pe\n", in phylink_sfp_config_phy()
3599 config.interface = phylink_sfp_select_interface(pl, config.advertising); in phylink_sfp_config_phy()
3606 ret = phylink_attach_phy(pl, phy, config.interface); in phylink_sfp_config_phy()
3611 ret = phylink_bringup_phy(pl, phy, config.interface); in phylink_sfp_config_phy()
3617 pl->link_port = pl->sfp_port; in phylink_sfp_config_phy()
3619 phylink_sfp_set_config(pl, support, &config, true); in phylink_sfp_config_phy()
3624 static int phylink_sfp_config_optical(struct phylink *pl) in phylink_sfp_config_optical() argument
3631 phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n", in phylink_sfp_config_optical()
3633 pl->config->supported_interfaces, in phylink_sfp_config_optical()
3635 pl->sfp_interfaces); in phylink_sfp_config_optical()
3640 phy_interface_and(pl->sfp_interfaces, pl->config->supported_interfaces, in phylink_sfp_config_optical()
3641 pl->sfp_interfaces); in phylink_sfp_config_optical()
3642 if (phy_interface_empty(pl->sfp_interfaces)) { in phylink_sfp_config_optical()
3643 phylink_err(pl, "unsupported SFP module: no common interface modes\n"); in phylink_sfp_config_optical()
3648 linkmode_copy(support, pl->sfp_support); in phylink_sfp_config_optical()
3649 linkmode_copy(config.advertising, pl->sfp_support); in phylink_sfp_config_optical()
3657 ret = phylink_validate_mask(pl, NULL, pl->sfp_support, &config, in phylink_sfp_config_optical()
3658 pl->sfp_interfaces); in phylink_sfp_config_optical()
3660 phylink_err(pl, "unsupported SFP module: validation with support %*pb failed\n", in phylink_sfp_config_optical()
3665 interface = phylink_choose_sfp_interface(pl, pl->sfp_interfaces); in phylink_sfp_config_optical()
3667 phylink_err(pl, "failed to select SFP interface\n"); in phylink_sfp_config_optical()
3671 phylink_dbg(pl, "optical SFP: chosen %s interface\n", in phylink_sfp_config_optical()
3674 if (!phylink_validate_pcs_inband_autoneg(pl, interface, in phylink_sfp_config_optical()
3676 phylink_err(pl, "autoneg setting not compatible with PCS"); in phylink_sfp_config_optical()
3683 ret = phylink_validate(pl, support, &config); in phylink_sfp_config_optical()
3685 phylink_err(pl, "validation with support %*pb failed: %pe\n", in phylink_sfp_config_optical()
3691 pl->link_port = pl->sfp_port; in phylink_sfp_config_optical()
3693 phylink_sfp_set_config(pl, pl->sfp_support, &config, false); in phylink_sfp_config_optical()
3701 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
3705 linkmode_zero(pl->sfp_support); in phylink_sfp_module_insert()
3706 phy_interface_zero(pl->sfp_interfaces); in phylink_sfp_module_insert()
3707 sfp_parse_support(pl->sfp_bus, id, pl->sfp_support, pl->sfp_interfaces); in phylink_sfp_module_insert()
3708 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, pl->sfp_support); in phylink_sfp_module_insert()
3711 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
3712 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
3715 return phylink_sfp_config_optical(pl); in phylink_sfp_module_insert()
3720 struct phylink *pl = upstream; in phylink_sfp_module_remove() local
3722 phy_interface_zero(pl->sfp_interfaces); in phylink_sfp_module_remove()
3727 struct phylink *pl = upstream; in phylink_sfp_module_start() local
3730 if (pl->phydev) { in phylink_sfp_module_start()
3731 phy_start(pl->phydev); in phylink_sfp_module_start()
3738 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
3741 return phylink_sfp_config_optical(pl); in phylink_sfp_module_start()
3746 struct phylink *pl = upstream; in phylink_sfp_module_stop() local
3749 if (pl->phydev) in phylink_sfp_module_stop()
3750 phy_stop(pl->phydev); in phylink_sfp_module_stop()
3755 struct phylink *pl = upstream; in phylink_sfp_link_down() local
3759 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
3764 struct phylink *pl = upstream; in phylink_sfp_link_up() local
3768 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_up()
3773 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
3776 phylink_err(pl, "PHY %s (id 0x%.8lx) has no driver loaded\n", in phylink_sfp_connect_phy()
3778 …phylink_err(pl, "Drivers which handle known common cases: CONFIG_BCM84881_PHY, CONFIG_MARVELL_PHY\… in phylink_sfp_connect_phy()
3793 pl->config->supported_interfaces); in phylink_sfp_connect_phy()
3796 return phylink_sfp_config_phy(pl, phy); in phylink_sfp_connect_phy()