Lines Matching full:pl

101 #define phylink_printk(level, pl, fmt, ...) \  argument
103 if ((pl)->config->type == PHYLINK_NETDEV) \
104 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
105 else if ((pl)->config->type == PHYLINK_DEV) \
106 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
109 #define phylink_err(pl, fmt, ...) \ argument
110 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
111 #define phylink_warn(pl, fmt, ...) \ argument
112 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
113 #define phylink_info(pl, fmt, ...) \ argument
114 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
116 #define phylink_dbg(pl, fmt, ...) \ argument
118 if ((pl)->config->type == PHYLINK_NETDEV) \
119 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
120 else if ((pl)->config->type == PHYLINK_DEV) \
121 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
124 #define phylink_dbg(pl, fmt, ...) \ argument
125 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
127 #define phylink_dbg(pl, fmt, ...) \ argument
130 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
676 static int phylink_validate_mac_and_pcs(struct phylink *pl, in phylink_validate_mac_and_pcs() argument
685 if (pl->mac_ops->mac_select_pcs) { in phylink_validate_mac_and_pcs()
686 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); in phylink_validate_mac_and_pcs()
697 phylink_err(pl, "interface %s: uninitialised PCS\n", in phylink_validate_mac_and_pcs()
709 phylink_err(pl, "MAC returned PCS which does not support %s\n", in phylink_validate_mac_and_pcs()
729 if (pl->mac_ops->mac_get_caps) in phylink_validate_mac_and_pcs()
730 capabilities = pl->mac_ops->mac_get_caps(pl->config, in phylink_validate_mac_and_pcs()
733 capabilities = pl->config->mac_capabilities; in phylink_validate_mac_and_pcs()
740 static void phylink_validate_one(struct phylink *pl, struct phy_device *phy, in phylink_validate_one() argument
758 if (!phylink_validate_mac_and_pcs(pl, tmp_supported, &tmp_state)) { in phylink_validate_one()
759 phylink_dbg(pl, " interface %u (%s) rate match %s supports %*pbl\n", in phylink_validate_one()
770 static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy, in phylink_validate_mask() argument
780 phylink_validate_one(pl, phy, supported, state, interface, in phylink_validate_mask()
789 static int phylink_validate(struct phylink *pl, unsigned long *supported, in phylink_validate() argument
792 const unsigned long *interfaces = pl->config->supported_interfaces; in phylink_validate()
795 return phylink_validate_mask(pl, NULL, supported, state, in phylink_validate()
801 return phylink_validate_mac_and_pcs(pl, supported, state); in phylink_validate()
804 static int phylink_parse_fixedlink(struct phylink *pl, in phylink_parse_fixedlink() argument
818 pl->link_config.speed = speed; in phylink_parse_fixedlink()
819 pl->link_config.duplex = DUPLEX_HALF; in phylink_parse_fixedlink()
822 pl->link_config.duplex = DUPLEX_FULL; in phylink_parse_fixedlink()
829 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
832 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
839 pl->link_gpio = desc; in phylink_parse_fixedlink()
853 phylink_err(pl, "broken fixed-link?\n"); in phylink_parse_fixedlink()
860 pl->link_config.duplex = prop[1] ? in phylink_parse_fixedlink()
862 pl->link_config.speed = prop[2]; in phylink_parse_fixedlink()
865 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
868 pl->link_config.lp_advertising); in phylink_parse_fixedlink()
872 if (pl->link_config.speed > SPEED_1000 && in phylink_parse_fixedlink()
873 pl->link_config.duplex != DUPLEX_FULL) in phylink_parse_fixedlink()
874 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n", in phylink_parse_fixedlink()
875 pl->link_config.speed); in phylink_parse_fixedlink()
877 linkmode_fill(pl->supported); in phylink_parse_fixedlink()
878 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_fixedlink()
879 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_parse_fixedlink()
881 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex, in phylink_parse_fixedlink()
882 pl->supported, true); in phylink_parse_fixedlink()
887 linkmode_and(pl->supported, pl->supported, mask); in phylink_parse_fixedlink()
889 phylink_set(pl->supported, MII); in phylink_parse_fixedlink()
892 __set_bit(s->bit, pl->supported); in phylink_parse_fixedlink()
893 __set_bit(s->bit, pl->link_config.lp_advertising); in phylink_parse_fixedlink()
895 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n", in phylink_parse_fixedlink()
896 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half", in phylink_parse_fixedlink()
897 pl->link_config.speed); in phylink_parse_fixedlink()
900 linkmode_and(pl->link_config.advertising, pl->link_config.advertising, in phylink_parse_fixedlink()
901 pl->supported); in phylink_parse_fixedlink()
903 pl->link_config.link = 1; in phylink_parse_fixedlink()
904 pl->link_config.an_complete = 1; in phylink_parse_fixedlink()
909 static int phylink_parse_mode(struct phylink *pl, in phylink_parse_mode() argument
916 if (pl->config->default_an_inband) in phylink_parse_mode()
917 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
921 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_parse_mode()
926 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_parse_mode()
927 phylink_err(pl, in phylink_parse_mode()
932 pl->cfg_link_an_mode = MLO_AN_INBAND; in phylink_parse_mode()
935 if (pl->cfg_link_an_mode == MLO_AN_INBAND) { in phylink_parse_mode()
936 linkmode_zero(pl->supported); in phylink_parse_mode()
937 phylink_set(pl->supported, MII); in phylink_parse_mode()
938 phylink_set(pl->supported, Autoneg); in phylink_parse_mode()
939 phylink_set(pl->supported, Asym_Pause); in phylink_parse_mode()
940 phylink_set(pl->supported, Pause); in phylink_parse_mode()
942 switch (pl->link_config.interface) { in phylink_parse_mode()
962 caps = phylink_get_capabilities(pl->link_config.interface, caps, in phylink_parse_mode()
964 phylink_caps_to_linkmodes(pl->supported, caps); in phylink_parse_mode()
968 phylink_err(pl, in phylink_parse_mode()
970 phy_modes(pl->link_config.interface)); in phylink_parse_mode()
974 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_parse_mode()
976 if (phylink_validate(pl, pl->supported, &pl->link_config)) { in phylink_parse_mode()
977 phylink_err(pl, in phylink_parse_mode()
986 static void phylink_apply_manual_flow(struct phylink *pl, in phylink_apply_manual_flow() argument
995 if (!(pl->link_config.pause & MLO_PAUSE_AN)) in phylink_apply_manual_flow()
996 state->pause = pl->link_config.pause; in phylink_apply_manual_flow()
1079 static unsigned int phylink_inband_caps(struct phylink *pl, in phylink_inband_caps() argument
1084 if (!pl->mac_ops->mac_select_pcs) in phylink_inband_caps()
1087 pcs = pl->mac_ops->mac_select_pcs(pl->config, interface); in phylink_inband_caps()
1094 static void phylink_pcs_poll_stop(struct phylink *pl) in phylink_pcs_poll_stop() argument
1096 if (pl->cfg_link_an_mode == MLO_AN_INBAND) in phylink_pcs_poll_stop()
1097 del_timer(&pl->link_poll); in phylink_pcs_poll_stop()
1100 static void phylink_pcs_poll_start(struct phylink *pl) in phylink_pcs_poll_start() argument
1102 if (pl->pcs && pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND) in phylink_pcs_poll_start()
1103 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_pcs_poll_start()
1106 int phylink_pcs_pre_init(struct phylink *pl, struct phylink_pcs *pcs) in phylink_pcs_pre_init() argument
1111 if (pl->config->mac_requires_rxc) in phylink_pcs_pre_init()
1121 static void phylink_mac_config(struct phylink *pl, in phylink_mac_config() argument
1133 phylink_dbg(pl, in phylink_mac_config()
1135 __func__, phylink_an_mode_str(pl->act_link_an_mode), in phylink_mac_config()
1141 pl->mac_ops->mac_config(pl->config, pl->act_link_an_mode, &st); in phylink_mac_config()
1144 static void phylink_pcs_an_restart(struct phylink *pl) in phylink_pcs_an_restart() argument
1146 if (pl->pcs && linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, in phylink_pcs_an_restart()
1147 pl->link_config.advertising) && in phylink_pcs_an_restart()
1148 phy_interface_mode_is_8023z(pl->link_config.interface) && in phylink_pcs_an_restart()
1149 phylink_autoneg_inband(pl->act_link_an_mode)) in phylink_pcs_an_restart()
1150 pl->pcs->ops->pcs_an_restart(pl->pcs); in phylink_pcs_an_restart()
1155 * @pl: a pointer to a &struct phylink returned from phylink_create()
1173 static void phylink_pcs_neg_mode(struct phylink *pl, struct phylink_pcs *pcs, in phylink_pcs_neg_mode() argument
1185 mode = pl->req_link_an_mode; in phylink_pcs_neg_mode()
1187 pl->phy_ib_mode = 0; in phylink_pcs_neg_mode()
1215 pl->pcs_neg_mode = PHYLINK_PCS_NEG_NONE; in phylink_pcs_neg_mode()
1216 pl->act_link_an_mode = mode; in phylink_pcs_neg_mode()
1223 if (pl->phydev) in phylink_pcs_neg_mode()
1224 phy_ib_caps = phy_inband_caps(pl->phydev, interface); in phylink_pcs_neg_mode()
1226 phylink_dbg(pl, "interface %s inband modes: pcs=%02x phy=%02x\n", in phylink_pcs_neg_mode()
1248 pl->phy_ib_mode = LINK_INBAND_DISABLE; in phylink_pcs_neg_mode()
1250 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1260 phylink_warn(pl, in phylink_pcs_neg_mode()
1268 } else if (type == INBAND_CISCO_SGMII || pl->phydev) { in phylink_pcs_neg_mode()
1303 pl->phy_ib_mode = LINK_INBAND_ENABLE; in phylink_pcs_neg_mode()
1305 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1314 pl->phy_ib_mode = LINK_INBAND_DISABLE; in phylink_pcs_neg_mode()
1316 pl->phy_ib_mode = LINK_INBAND_BYPASS; in phylink_pcs_neg_mode()
1319 if (pl->phydev) in phylink_pcs_neg_mode()
1323 phylink_warn(pl, "%s: incompatible in-band capabilities, trying in-band", in phylink_pcs_neg_mode()
1346 pl->pcs_neg_mode = neg_mode; in phylink_pcs_neg_mode()
1347 pl->act_link_an_mode = mode; in phylink_pcs_neg_mode()
1350 static void phylink_major_config(struct phylink *pl, bool restart, in phylink_major_config() argument
1359 phylink_dbg(pl, "major config, requested %s/%s\n", in phylink_major_config()
1360 phylink_an_mode_str(pl->req_link_an_mode), in phylink_major_config()
1363 if (pl->mac_ops->mac_select_pcs) { in phylink_major_config()
1364 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface); in phylink_major_config()
1366 phylink_err(pl, in phylink_major_config()
1372 pcs_changed = pl->pcs != pcs; in phylink_major_config()
1375 phylink_pcs_neg_mode(pl, pcs, state->interface, state->advertising); in phylink_major_config()
1377 phylink_dbg(pl, "major config, active %s/%s/%s\n", in phylink_major_config()
1378 phylink_an_mode_str(pl->act_link_an_mode), in phylink_major_config()
1379 phylink_pcs_mode_str(pl->pcs_neg_mode), in phylink_major_config()
1382 phylink_pcs_poll_stop(pl); in phylink_major_config()
1384 if (pl->mac_ops->mac_prepare) { in phylink_major_config()
1385 err = pl->mac_ops->mac_prepare(pl->config, pl->act_link_an_mode, in phylink_major_config()
1388 phylink_err(pl, "mac_prepare failed: %pe\n", in phylink_major_config()
1398 phylink_pcs_disable(pl->pcs); in phylink_major_config()
1400 if (pl->pcs) in phylink_major_config()
1401 pl->pcs->phylink = NULL; in phylink_major_config()
1403 pcs->phylink = pl; in phylink_major_config()
1405 pl->pcs = pcs; in phylink_major_config()
1408 if (pl->pcs) in phylink_major_config()
1409 phylink_pcs_pre_config(pl->pcs, state->interface); in phylink_major_config()
1411 phylink_mac_config(pl, state); in phylink_major_config()
1413 if (pl->pcs) in phylink_major_config()
1414 phylink_pcs_post_config(pl->pcs, state->interface); in phylink_major_config()
1416 if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed) in phylink_major_config()
1417 phylink_pcs_enable(pl->pcs); in phylink_major_config()
1419 neg_mode = pl->act_link_an_mode; in phylink_major_config()
1420 if (pl->pcs && pl->pcs->neg_mode) in phylink_major_config()
1421 neg_mode = pl->pcs_neg_mode; in phylink_major_config()
1423 err = phylink_pcs_config(pl->pcs, neg_mode, state, in phylink_major_config()
1424 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_major_config()
1426 phylink_err(pl, "pcs_config failed: %pe\n", in phylink_major_config()
1432 phylink_pcs_an_restart(pl); in phylink_major_config()
1434 if (pl->mac_ops->mac_finish) { in phylink_major_config()
1435 err = pl->mac_ops->mac_finish(pl->config, pl->act_link_an_mode, in phylink_major_config()
1438 phylink_err(pl, "mac_finish failed: %pe\n", in phylink_major_config()
1442 if (pl->phydev && pl->phy_ib_mode) { in phylink_major_config()
1443 err = phy_config_inband(pl->phydev, pl->phy_ib_mode); in phylink_major_config()
1445 phylink_err(pl, "phy_config_inband: %pe\n", in phylink_major_config()
1449 if (pl->sfp_bus) { in phylink_major_config()
1452 sfp_upstream_set_signal_rate(pl->sfp_bus, rate_kbd); in phylink_major_config()
1455 phylink_pcs_poll_start(pl); in phylink_major_config()
1464 static int phylink_change_inband_advert(struct phylink *pl) in phylink_change_inband_advert() argument
1469 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_change_inband_advert()
1472 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__, in phylink_change_inband_advert()
1473 phylink_an_mode_str(pl->req_link_an_mode), in phylink_change_inband_advert()
1474 phy_modes(pl->link_config.interface), in phylink_change_inband_advert()
1475 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising, in phylink_change_inband_advert()
1476 pl->link_config.pause); in phylink_change_inband_advert()
1479 phylink_pcs_neg_mode(pl, pl->pcs, pl->link_config.interface, in phylink_change_inband_advert()
1480 pl->link_config.advertising); in phylink_change_inband_advert()
1482 neg_mode = pl->act_link_an_mode; in phylink_change_inband_advert()
1483 if (pl->pcs->neg_mode) in phylink_change_inband_advert()
1484 neg_mode = pl->pcs_neg_mode; in phylink_change_inband_advert()
1490 ret = phylink_pcs_config(pl->pcs, neg_mode, &pl->link_config, in phylink_change_inband_advert()
1491 !!(pl->link_config.pause & MLO_PAUSE_AN)); in phylink_change_inband_advert()
1496 phylink_pcs_an_restart(pl); in phylink_change_inband_advert()
1501 static void phylink_mac_pcs_get_state(struct phylink *pl, in phylink_mac_pcs_get_state() argument
1507 linkmode_copy(state->advertising, pl->link_config.advertising); in phylink_mac_pcs_get_state()
1509 state->interface = pl->link_config.interface; in phylink_mac_pcs_get_state()
1510 state->rate_matching = pl->link_config.rate_matching; in phylink_mac_pcs_get_state()
1514 pcs = pl->pcs; in phylink_mac_pcs_get_state()
1516 autoneg = pl->pcs_neg_mode == PHYLINK_PCS_NEG_INBAND_ENABLED; in phylink_mac_pcs_get_state()
1526 state->speed = pl->link_config.speed; in phylink_mac_pcs_get_state()
1527 state->duplex = pl->link_config.duplex; in phylink_mac_pcs_get_state()
1528 state->pause = pl->link_config.pause; in phylink_mac_pcs_get_state()
1532 pcs->ops->pcs_get_state(pcs, pl->pcs_neg_mode, state); in phylink_mac_pcs_get_state()
1540 static void phylink_get_fixed_state(struct phylink *pl, in phylink_get_fixed_state() argument
1543 *state = pl->link_config; in phylink_get_fixed_state()
1544 if (pl->config->get_fixed_state) in phylink_get_fixed_state()
1545 pl->config->get_fixed_state(pl->config, state); in phylink_get_fixed_state()
1546 else if (pl->link_gpio) in phylink_get_fixed_state()
1547 state->link = !!gpiod_get_value_cansleep(pl->link_gpio); in phylink_get_fixed_state()
1553 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart) in phylink_mac_initial_config() argument
1557 switch (pl->req_link_an_mode) { in phylink_mac_initial_config()
1559 link_state = pl->phy_state; in phylink_mac_initial_config()
1563 phylink_get_fixed_state(pl, &link_state); in phylink_mac_initial_config()
1567 link_state = pl->link_config; in phylink_mac_initial_config()
1578 phylink_apply_manual_flow(pl, &link_state); in phylink_mac_initial_config()
1579 phylink_major_config(pl, force_restart, &link_state); in phylink_mac_initial_config()
1596 static void phylink_deactivate_lpi(struct phylink *pl) in phylink_deactivate_lpi() argument
1598 if (pl->mac_enable_tx_lpi) { in phylink_deactivate_lpi()
1599 pl->mac_enable_tx_lpi = false; in phylink_deactivate_lpi()
1601 phylink_dbg(pl, "disabling LPI\n"); in phylink_deactivate_lpi()
1603 pl->mac_ops->mac_disable_tx_lpi(pl->config); in phylink_deactivate_lpi()
1607 static void phylink_activate_lpi(struct phylink *pl) in phylink_activate_lpi() argument
1611 if (!test_bit(pl->cur_interface, pl->config->lpi_interfaces)) { in phylink_activate_lpi()
1612 phylink_dbg(pl, "MAC does not support LPI with %s\n", in phylink_activate_lpi()
1613 phy_modes(pl->cur_interface)); in phylink_activate_lpi()
1617 phylink_dbg(pl, "LPI timer %uus, tx clock stop %u\n", in phylink_activate_lpi()
1618 pl->mac_tx_lpi_timer, pl->mac_tx_clk_stop); in phylink_activate_lpi()
1620 err = pl->mac_ops->mac_enable_tx_lpi(pl->config, pl->mac_tx_lpi_timer, in phylink_activate_lpi()
1621 pl->mac_tx_clk_stop); in phylink_activate_lpi()
1623 pl->mac_enable_tx_lpi = true; in phylink_activate_lpi()
1625 phylink_err(pl, "%ps() failed: %pe\n", in phylink_activate_lpi()
1626 pl->mac_ops->mac_enable_tx_lpi, ERR_PTR(err)); in phylink_activate_lpi()
1629 static void phylink_link_up(struct phylink *pl, in phylink_link_up() argument
1632 struct net_device *ndev = pl->netdev; in phylink_link_up()
1662 pl->cur_interface = link_state.interface; in phylink_link_up()
1664 neg_mode = pl->act_link_an_mode; in phylink_link_up()
1665 if (pl->pcs && pl->pcs->neg_mode) in phylink_link_up()
1666 neg_mode = pl->pcs_neg_mode; in phylink_link_up()
1668 phylink_pcs_link_up(pl->pcs, neg_mode, pl->cur_interface, speed, in phylink_link_up()
1671 pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->act_link_an_mode, in phylink_link_up()
1672 pl->cur_interface, speed, duplex, in phylink_link_up()
1675 if (pl->mac_supports_eee && pl->phy_enable_tx_lpi) in phylink_link_up()
1676 phylink_activate_lpi(pl); in phylink_link_up()
1681 phylink_info(pl, in phylink_link_up()
1688 static void phylink_link_down(struct phylink *pl) in phylink_link_down() argument
1690 struct net_device *ndev = pl->netdev; in phylink_link_down()
1695 phylink_deactivate_lpi(pl); in phylink_link_down()
1697 pl->mac_ops->mac_link_down(pl->config, pl->act_link_an_mode, in phylink_link_down()
1698 pl->cur_interface); in phylink_link_down()
1699 phylink_info(pl, "Link is Down\n"); in phylink_link_down()
1702 static bool phylink_link_is_up(struct phylink *pl) in phylink_link_is_up() argument
1704 return pl->netdev ? netif_carrier_ok(pl->netdev) : pl->old_link_state; in phylink_link_is_up()
1709 struct phylink *pl = container_of(w, struct phylink, resolve); in phylink_resolve() local
1715 mutex_lock(&pl->state_mutex); in phylink_resolve()
1716 cur_link_state = phylink_link_is_up(pl); in phylink_resolve()
1718 if (pl->phylink_disable_state) { in phylink_resolve()
1719 pl->link_failed = false; in phylink_resolve()
1721 } else if (pl->link_failed) { in phylink_resolve()
1724 } else if (pl->act_link_an_mode == MLO_AN_FIXED) { in phylink_resolve()
1725 phylink_get_fixed_state(pl, &link_state); in phylink_resolve()
1727 } else if (pl->act_link_an_mode == MLO_AN_PHY) { in phylink_resolve()
1728 link_state = pl->phy_state; in phylink_resolve()
1731 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
1742 phylink_mac_pcs_get_state(pl, &link_state); in phylink_resolve()
1748 if (pl->phydev) in phylink_resolve()
1749 link_state.link &= pl->phy_state.link; in phylink_resolve()
1752 if (pl->phydev && pl->phy_state.link) { in phylink_resolve()
1756 if (link_state.interface != pl->phy_state.interface) { in phylink_resolve()
1761 link_state.interface = pl->phy_state.interface; in phylink_resolve()
1766 if (pl->phy_state.rate_matching) { in phylink_resolve()
1768 pl->phy_state.rate_matching; in phylink_resolve()
1769 link_state.speed = pl->phy_state.speed; in phylink_resolve()
1770 link_state.duplex = pl->phy_state.duplex; in phylink_resolve()
1776 link_state.pause = pl->phy_state.pause; in phylink_resolve()
1781 if (pl->act_link_an_mode != MLO_AN_FIXED) in phylink_resolve()
1782 phylink_apply_manual_flow(pl, &link_state); in phylink_resolve()
1785 if (link_state.interface != pl->link_config.interface) { in phylink_resolve()
1790 phylink_link_down(pl); in phylink_resolve()
1793 phylink_major_config(pl, false, &link_state); in phylink_resolve()
1794 pl->link_config.interface = link_state.interface; in phylink_resolve()
1799 pl->old_link_state = link_state.link; in phylink_resolve()
1801 phylink_link_down(pl); in phylink_resolve()
1803 phylink_link_up(pl, link_state); in phylink_resolve()
1806 pl->link_failed = false; in phylink_resolve()
1807 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_resolve()
1809 mutex_unlock(&pl->state_mutex); in phylink_resolve()
1812 static void phylink_run_resolve(struct phylink *pl) in phylink_run_resolve() argument
1814 if (!pl->phylink_disable_state) in phylink_run_resolve()
1815 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve()
1818 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit) in phylink_run_resolve_and_disable() argument
1820 unsigned long state = pl->phylink_disable_state; in phylink_run_resolve_and_disable()
1822 set_bit(bit, &pl->phylink_disable_state); in phylink_run_resolve_and_disable()
1824 queue_work(system_power_efficient_wq, &pl->resolve); in phylink_run_resolve_and_disable()
1825 flush_work(&pl->resolve); in phylink_run_resolve_and_disable()
1829 static void phylink_enable_and_run_resolve(struct phylink *pl, int bit) in phylink_enable_and_run_resolve() argument
1831 clear_bit(bit, &pl->phylink_disable_state); in phylink_enable_and_run_resolve()
1832 phylink_run_resolve(pl); in phylink_enable_and_run_resolve()
1837 struct phylink *pl = container_of(t, struct phylink, link_poll); in phylink_fixed_poll() local
1841 phylink_run_resolve(pl); in phylink_fixed_poll()
1846 static int phylink_register_sfp(struct phylink *pl, in phylink_register_sfp() argument
1857 phylink_err(pl, "unable to attach SFP bus: %pe\n", bus); in phylink_register_sfp()
1861 pl->sfp_bus = bus; in phylink_register_sfp()
1863 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops); in phylink_register_sfp()
1871 * @pl: a pointer to a &struct phylink returned from phylink_create()
1879 int phylink_set_fixed_link(struct phylink *pl, in phylink_set_fixed_link() argument
1885 if (pl->cfg_link_an_mode != MLO_AN_PHY || !state || in phylink_set_fixed_link()
1886 !test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state)) in phylink_set_fixed_link()
1890 pl->supported, true); in phylink_set_fixed_link()
1894 adv = pl->link_config.advertising; in phylink_set_fixed_link()
1899 pl->link_config.speed = state->speed; in phylink_set_fixed_link()
1900 pl->link_config.duplex = state->duplex; in phylink_set_fixed_link()
1901 pl->link_config.link = 1; in phylink_set_fixed_link()
1902 pl->link_config.an_complete = 1; in phylink_set_fixed_link()
1904 pl->cfg_link_an_mode = MLO_AN_FIXED; in phylink_set_fixed_link()
1905 pl->req_link_an_mode = pl->cfg_link_an_mode; in phylink_set_fixed_link()
1932 struct phylink *pl; in phylink_create() local
1942 pl = kzalloc(sizeof(*pl), GFP_KERNEL); in phylink_create()
1943 if (!pl) in phylink_create()
1946 mutex_init(&pl->state_mutex); in phylink_create()
1947 INIT_WORK(&pl->resolve, phylink_resolve); in phylink_create()
1949 pl->config = config; in phylink_create()
1951 pl->netdev = to_net_dev(config->dev); in phylink_create()
1952 netif_carrier_off(pl->netdev); in phylink_create()
1954 pl->dev = config->dev; in phylink_create()
1956 kfree(pl); in phylink_create()
1960 pl->mac_supports_eee_ops = mac_ops->mac_disable_tx_lpi && in phylink_create()
1962 pl->mac_supports_eee = pl->mac_supports_eee_ops && in phylink_create()
1963 pl->config->lpi_capabilities && in phylink_create()
1964 !phy_interface_empty(pl->config->lpi_interfaces); in phylink_create()
1967 pl->eee_cfg.eee_enabled = pl->config->eee_enabled_default; in phylink_create()
1968 pl->eee_cfg.tx_lpi_enabled = pl->eee_cfg.eee_enabled; in phylink_create()
1969 pl->eee_cfg.tx_lpi_timer = pl->config->lpi_timer_default; in phylink_create()
1971 pl->phy_state.interface = iface; in phylink_create()
1972 pl->link_interface = iface; in phylink_create()
1974 pl->link_port = PORT_BNC; in phylink_create()
1976 pl->link_port = PORT_MII; in phylink_create()
1977 pl->link_config.interface = iface; in phylink_create()
1978 pl->link_config.pause = MLO_PAUSE_AN; in phylink_create()
1979 pl->link_config.speed = SPEED_UNKNOWN; in phylink_create()
1980 pl->link_config.duplex = DUPLEX_UNKNOWN; in phylink_create()
1981 pl->pcs_state = PCS_STATE_DOWN; in phylink_create()
1982 pl->mac_ops = mac_ops; in phylink_create()
1983 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state); in phylink_create()
1984 timer_setup(&pl->link_poll, phylink_fixed_poll, 0); in phylink_create()
1986 linkmode_fill(pl->supported); in phylink_create()
1987 linkmode_copy(pl->link_config.advertising, pl->supported); in phylink_create()
1988 phylink_validate(pl, pl->supported, &pl->link_config); in phylink_create()
1990 ret = phylink_parse_mode(pl, fwnode); in phylink_create()
1992 kfree(pl); in phylink_create()
1996 if (pl->cfg_link_an_mode == MLO_AN_FIXED) { in phylink_create()
1997 ret = phylink_parse_fixedlink(pl, fwnode); in phylink_create()
1999 kfree(pl); in phylink_create()
2004 pl->req_link_an_mode = pl->cfg_link_an_mode; in phylink_create()
2006 ret = phylink_register_sfp(pl, fwnode); in phylink_create()
2008 kfree(pl); in phylink_create()
2012 return pl; in phylink_create()
2018 * @pl: a pointer to a &struct phylink returned from phylink_create()
2025 void phylink_destroy(struct phylink *pl) in phylink_destroy() argument
2027 sfp_bus_del_upstream(pl->sfp_bus); in phylink_destroy()
2028 if (pl->link_gpio) in phylink_destroy()
2029 gpiod_put(pl->link_gpio); in phylink_destroy()
2031 cancel_work_sync(&pl->resolve); in phylink_destroy()
2032 kfree(pl); in phylink_destroy()
2038 * @pl: a pointer to a &struct phylink returned from phylink_create()
2045 bool phylink_expects_phy(struct phylink *pl) in phylink_expects_phy() argument
2047 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_expects_phy()
2048 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_expects_phy()
2049 phy_interface_mode_is_8023z(pl->link_config.interface))) in phylink_expects_phy()
2057 struct phylink *pl = phydev->phylink; in phylink_phy_change() local
2062 mutex_lock(&pl->state_mutex); in phylink_phy_change()
2063 pl->phy_state.speed = phydev->speed; in phylink_phy_change()
2064 pl->phy_state.duplex = phydev->duplex; in phylink_phy_change()
2065 pl->phy_state.rate_matching = phydev->rate_matching; in phylink_phy_change()
2066 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_phy_change()
2068 pl->phy_state.pause |= MLO_PAUSE_TX; in phylink_phy_change()
2070 pl->phy_state.pause |= MLO_PAUSE_RX; in phylink_phy_change()
2071 pl->phy_state.interface = phydev->interface; in phylink_phy_change()
2072 pl->phy_state.link = up; in phylink_phy_change()
2074 pl->link_failed = true; in phylink_phy_change()
2077 pl->phy_enable_tx_lpi = phydev->enable_tx_lpi; in phylink_phy_change()
2078 pl->mac_tx_lpi_timer = phydev->eee_cfg.tx_lpi_timer; in phylink_phy_change()
2079 mutex_unlock(&pl->state_mutex); in phylink_phy_change()
2081 phylink_run_resolve(pl); in phylink_phy_change()
2083 phylink_dbg(pl, "phy link %s %s/%s/%s/%s/%s/%slpi\n", in phylink_phy_change()
2089 phylink_pause_to_str(pl->phy_state.pause), in phylink_phy_change()
2093 static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy, in phylink_validate_phy() argument
2108 pl->config->supported_interfaces); in phylink_validate_phy()
2111 phylink_err(pl, "PHY has no common interfaces\n"); in phylink_validate_phy()
2123 phylink_err(pl, "SFP PHY's possible interfaces becomes empty\n"); in phylink_validate_phy()
2128 phylink_dbg(pl, "PHY %s uses interfaces %*pbl, validating %*pbl\n", in phylink_validate_phy()
2134 return phylink_validate_mask(pl, phy, supported, state, in phylink_validate_phy()
2138 phylink_dbg(pl, "PHY %s doesn't supply possible interfaces\n", in phylink_validate_phy()
2163 return phylink_validate(pl, supported, state); in phylink_validate_phy()
2166 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy, in phylink_bringup_phy() argument
2188 ret = phylink_validate_phy(pl, phy, supported, &config); in phylink_bringup_phy()
2190 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %pe\n", in phylink_bringup_phy()
2198 phy->phylink = pl; in phylink_bringup_phy()
2202 phylink_info(pl, in phylink_bringup_phy()
2208 mutex_lock(&pl->state_mutex); in phylink_bringup_phy()
2209 pl->phydev = phy; in phylink_bringup_phy()
2210 pl->phy_state.interface = interface; in phylink_bringup_phy()
2211 pl->phy_state.pause = MLO_PAUSE_NONE; in phylink_bringup_phy()
2212 pl->phy_state.speed = SPEED_UNKNOWN; in phylink_bringup_phy()
2213 pl->phy_state.duplex = DUPLEX_UNKNOWN; in phylink_bringup_phy()
2214 pl->phy_state.rate_matching = RATE_MATCH_NONE; in phylink_bringup_phy()
2215 linkmode_copy(pl->supported, supported); in phylink_bringup_phy()
2216 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_bringup_phy()
2224 if (pl->mac_supports_eee) { in phylink_bringup_phy()
2229 if (pl->eee_cfg.eee_enabled) in phylink_bringup_phy()
2232 phy->eee_cfg.tx_lpi_enabled = pl->eee_cfg.tx_lpi_enabled; in phylink_bringup_phy()
2233 phy->eee_cfg.tx_lpi_timer = pl->eee_cfg.tx_lpi_timer; in phylink_bringup_phy()
2236 linkmode_zero(pl->supported_lpi); in phylink_bringup_phy()
2237 phylink_caps_to_linkmodes(pl->supported_lpi, in phylink_bringup_phy()
2238 pl->config->lpi_capabilities); in phylink_bringup_phy()
2244 pl->supported_lpi); in phylink_bringup_phy()
2245 } else if (pl->mac_supports_eee_ops) { in phylink_bringup_phy()
2250 mutex_unlock(&pl->state_mutex); in phylink_bringup_phy()
2253 phylink_dbg(pl, in phylink_bringup_phy()
2256 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported, in phylink_bringup_phy()
2262 if (pl->config->mac_managed_pm) in phylink_bringup_phy()
2266 pl->mac_tx_clk_stop = phy_eee_tx_clock_stop_capable(phy) > 0; in phylink_bringup_phy()
2268 if (pl->mac_supports_eee_ops) { in phylink_bringup_phy()
2273 pl->config->eee_rx_clk_stop_enable); in phylink_bringup_phy()
2281 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy, in phylink_attach_phy() argument
2286 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_attach_phy()
2287 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_attach_phy()
2288 phy_interface_mode_is_8023z(interface) && !pl->sfp_bus))) in phylink_attach_phy()
2291 if (pl->phydev) in phylink_attach_phy()
2294 if (pl->config->mac_requires_rxc) in phylink_attach_phy()
2297 return phy_attach_direct(pl->netdev, phy, flags, interface); in phylink_attach_phy()
2302 * @pl: a pointer to a &struct phylink returned from phylink_create()
2305 * Connect @phy to the phylink instance specified by @pl by calling
2315 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy) in phylink_connect_phy() argument
2320 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_connect_phy()
2321 pl->link_interface = phy->interface; in phylink_connect_phy()
2322 pl->link_config.interface = pl->link_interface; in phylink_connect_phy()
2325 ret = phylink_attach_phy(pl, phy, pl->link_interface); in phylink_connect_phy()
2329 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface); in phylink_connect_phy()
2339 * @pl: a pointer to a &struct phylink returned from phylink_create()
2344 * specified by @pl. Actions specified in phylink_connect_phy() will be
2349 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn, in phylink_of_phy_connect() argument
2352 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags); in phylink_of_phy_connect()
2358 * @pl: a pointer to a &struct phylink returned from phylink_create()
2363 * by @pl.
2367 int phylink_fwnode_phy_connect(struct phylink *pl, in phylink_fwnode_phy_connect() argument
2376 if (pl->cfg_link_an_mode == MLO_AN_FIXED || in phylink_fwnode_phy_connect()
2377 (pl->cfg_link_an_mode == MLO_AN_INBAND && in phylink_fwnode_phy_connect()
2378 phy_interface_mode_is_8023z(pl->link_interface))) in phylink_fwnode_phy_connect()
2383 if (pl->cfg_link_an_mode == MLO_AN_PHY) in phylink_fwnode_phy_connect()
2395 if (pl->link_interface == PHY_INTERFACE_MODE_NA) { in phylink_fwnode_phy_connect()
2396 pl->link_interface = phy_dev->interface; in phylink_fwnode_phy_connect()
2397 pl->link_config.interface = pl->link_interface; in phylink_fwnode_phy_connect()
2400 if (pl->config->mac_requires_rxc) in phylink_fwnode_phy_connect()
2403 ret = phy_attach_direct(pl->netdev, phy_dev, flags, in phylink_fwnode_phy_connect()
2404 pl->link_interface); in phylink_fwnode_phy_connect()
2409 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface); in phylink_fwnode_phy_connect()
2420 * @pl: a pointer to a &struct phylink returned from phylink_create()
2422 * Disconnect any current PHY from the phylink instance described by @pl.
2424 void phylink_disconnect_phy(struct phylink *pl) in phylink_disconnect_phy() argument
2430 phy = pl->phydev; in phylink_disconnect_phy()
2433 mutex_lock(&pl->state_mutex); in phylink_disconnect_phy()
2434 pl->phydev = NULL; in phylink_disconnect_phy()
2435 pl->phy_enable_tx_lpi = false; in phylink_disconnect_phy()
2436 pl->mac_tx_clk_stop = false; in phylink_disconnect_phy()
2437 mutex_unlock(&pl->state_mutex); in phylink_disconnect_phy()
2439 flush_work(&pl->resolve); in phylink_disconnect_phy()
2446 static void phylink_link_changed(struct phylink *pl, bool up, const char *what) in phylink_link_changed() argument
2449 pl->link_failed = true; in phylink_link_changed()
2450 phylink_run_resolve(pl); in phylink_link_changed()
2451 phylink_dbg(pl, "%s link %s\n", what, up ? "up" : "down"); in phylink_link_changed()
2456 * @pl: a pointer to a &struct phylink returned from phylink_create()
2462 void phylink_mac_change(struct phylink *pl, bool up) in phylink_mac_change() argument
2464 phylink_link_changed(pl, up, "mac"); in phylink_mac_change()
2481 struct phylink *pl = pcs->phylink; in phylink_pcs_change() local
2483 if (pl) in phylink_pcs_change()
2484 phylink_link_changed(pl, up, "pcs"); in phylink_pcs_change()
2490 struct phylink *pl = data; in phylink_link_handler() local
2492 phylink_run_resolve(pl); in phylink_link_handler()
2499 * @pl: a pointer to a &struct phylink returned from phylink_create()
2501 * Start the phylink instance specified by @pl, configuring the MAC for the
2505 void phylink_start(struct phylink *pl) in phylink_start() argument
2511 phylink_info(pl, "configuring for %s/%s link mode\n", in phylink_start()
2512 phylink_an_mode_str(pl->req_link_an_mode), in phylink_start()
2513 phy_modes(pl->link_config.interface)); in phylink_start()
2516 if (pl->netdev) in phylink_start()
2517 netif_carrier_off(pl->netdev); in phylink_start()
2519 pl->pcs_state = PCS_STATE_STARTING; in phylink_start()
2529 phylink_mac_initial_config(pl, true); in phylink_start()
2531 pl->pcs_state = PCS_STATE_STARTED; in phylink_start()
2533 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED); in phylink_start()
2535 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) { in phylink_start()
2536 int irq = gpiod_to_irq(pl->link_gpio); in phylink_start()
2542 "netdev link", pl)) in phylink_start()
2543 pl->link_irq = irq; in phylink_start()
2551 if (pl->cfg_link_an_mode == MLO_AN_FIXED) in phylink_start()
2552 poll |= pl->config->poll_fixed_state; in phylink_start()
2555 mod_timer(&pl->link_poll, jiffies + HZ); in phylink_start()
2556 if (pl->phydev) in phylink_start()
2557 phy_start(pl->phydev); in phylink_start()
2558 if (pl->sfp_bus) in phylink_start()
2559 sfp_upstream_start(pl->sfp_bus); in phylink_start()
2565 * @pl: a pointer to a &struct phylink returned from phylink_create()
2567 * Stop the phylink instance specified by @pl. This should be called from the
2575 void phylink_stop(struct phylink *pl) in phylink_stop() argument
2579 if (pl->sfp_bus) in phylink_stop()
2580 sfp_upstream_stop(pl->sfp_bus); in phylink_stop()
2581 if (pl->phydev) in phylink_stop()
2582 phy_stop(pl->phydev); in phylink_stop()
2583 del_timer_sync(&pl->link_poll); in phylink_stop()
2584 if (pl->link_irq) { in phylink_stop()
2585 free_irq(pl->link_irq, pl); in phylink_stop()
2586 pl->link_irq = 0; in phylink_stop()
2589 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED); in phylink_stop()
2591 pl->pcs_state = PCS_STATE_DOWN; in phylink_stop()
2593 phylink_pcs_disable(pl->pcs); in phylink_stop()
2599 * @pl: a pointer to a &struct phylink returned from phylink_create()
2611 void phylink_suspend(struct phylink *pl, bool mac_wol) in phylink_suspend() argument
2615 if (mac_wol && (!pl->netdev || pl->netdev->ethtool->wol_enabled)) { in phylink_suspend()
2617 mutex_lock(&pl->state_mutex); in phylink_suspend()
2620 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state); in phylink_suspend()
2626 if (pl->netdev) in phylink_suspend()
2627 netif_carrier_off(pl->netdev); in phylink_suspend()
2629 pl->old_link_state = false; in phylink_suspend()
2634 mutex_unlock(&pl->state_mutex); in phylink_suspend()
2636 phylink_stop(pl); in phylink_suspend()
2643 * @pl: a pointer to a &struct phylink returned from phylink_create()
2648 void phylink_resume(struct phylink *pl) in phylink_resume() argument
2652 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) { in phylink_resume()
2661 mutex_lock(&pl->state_mutex); in phylink_resume()
2662 phylink_link_down(pl); in phylink_resume()
2663 mutex_unlock(&pl->state_mutex); in phylink_resume()
2668 phylink_mac_initial_config(pl, true); in phylink_resume()
2671 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_MAC_WOL); in phylink_resume()
2673 phylink_start(pl); in phylink_resume()
2680 * @pl: a pointer to a &struct phylink returned from phylink_create()
2684 * instance specified by @pl. If no PHY is currently attached, report no
2687 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_get_wol() argument
2694 if (pl->phydev) in phylink_ethtool_get_wol()
2695 phy_ethtool_get_wol(pl->phydev, wol); in phylink_ethtool_get_wol()
2701 * @pl: a pointer to a &struct phylink returned from phylink_create()
2705 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
2710 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol) in phylink_ethtool_set_wol() argument
2716 if (pl->phydev) in phylink_ethtool_set_wol()
2717 ret = phy_ethtool_set_wol(pl->phydev, wol); in phylink_ethtool_set_wol()
2723 static phy_interface_t phylink_sfp_select_interface(struct phylink *pl, in phylink_sfp_select_interface() argument
2728 interface = sfp_select_interface(pl->sfp_bus, link_modes); in phylink_sfp_select_interface()
2730 phylink_err(pl, in phylink_sfp_select_interface()
2737 if (!test_bit(interface, pl->config->supported_interfaces)) { in phylink_sfp_select_interface()
2738 phylink_err(pl, in phylink_sfp_select_interface()
2742 pl->config->supported_interfaces); in phylink_sfp_select_interface()
2776 * @pl: a pointer to a &struct phylink returned from phylink_create()
2779 * Read the current link settings for the phylink instance specified by @pl.
2783 int phylink_ethtool_ksettings_get(struct phylink *pl, in phylink_ethtool_ksettings_get() argument
2790 if (pl->phydev) in phylink_ethtool_ksettings_get()
2791 phy_ethtool_ksettings_get(pl->phydev, kset); in phylink_ethtool_ksettings_get()
2793 kset->base.port = pl->link_port; in phylink_ethtool_ksettings_get()
2795 linkmode_copy(kset->link_modes.supported, pl->supported); in phylink_ethtool_ksettings_get()
2797 switch (pl->act_link_an_mode) { in phylink_ethtool_ksettings_get()
2803 phylink_get_fixed_state(pl, &link_state); in phylink_ethtool_ksettings_get()
2811 if (pl->phydev) in phylink_ethtool_ksettings_get()
2814 phylink_mac_pcs_get_state(pl, &link_state); in phylink_ethtool_ksettings_get()
2828 static bool phylink_validate_pcs_inband_autoneg(struct phylink *pl, in phylink_validate_pcs_inband_autoneg() argument
2832 unsigned int inband = phylink_inband_caps(pl, interface); in phylink_validate_pcs_inband_autoneg()
2850 * @pl: a pointer to a &struct phylink returned from phylink_create()
2853 int phylink_ethtool_ksettings_set(struct phylink *pl, in phylink_ethtool_ksettings_set() argument
2862 if (pl->phydev) { in phylink_ethtool_ksettings_set()
2867 pl->supported); in phylink_ethtool_ksettings_set()
2870 * to update the pl->link_config settings: in phylink_ethtool_ksettings_set()
2887 return phy_ethtool_ksettings_set(pl->phydev, &phy_kset); in phylink_ethtool_ksettings_set()
2890 config = pl->link_config; in phylink_ethtool_ksettings_set()
2893 pl->supported); in phylink_ethtool_ksettings_set()
2902 pl->supported, false); in phylink_ethtool_ksettings_set()
2909 if (pl->req_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
2910 if (s->speed != pl->link_config.speed || in phylink_ethtool_ksettings_set()
2911 s->duplex != pl->link_config.duplex) in phylink_ethtool_ksettings_set()
2925 if (pl->req_link_an_mode == MLO_AN_FIXED) { in phylink_ethtool_ksettings_set()
2927 pl->link_config.advertising)) in phylink_ethtool_ksettings_set()
2950 if (pl->sfp_bus) { in phylink_ethtool_ksettings_set()
2951 config.interface = phylink_sfp_select_interface(pl, in phylink_ethtool_ksettings_set()
2957 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
2958 if (phylink_validate(pl, support, &config)) { in phylink_ethtool_ksettings_set()
2959 phylink_err(pl, "validation of %s/%s with support %*pb failed\n", in phylink_ethtool_ksettings_set()
2960 phylink_an_mode_str(pl->req_link_an_mode), in phylink_ethtool_ksettings_set()
2967 linkmode_copy(support, pl->supported); in phylink_ethtool_ksettings_set()
2968 if (phylink_validate(pl, support, &config)) in phylink_ethtool_ksettings_set()
2981 if (!phylink_validate_pcs_inband_autoneg(pl, config.interface, in phylink_ethtool_ksettings_set()
2985 mutex_lock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
2986 pl->link_config.speed = config.speed; in phylink_ethtool_ksettings_set()
2987 pl->link_config.duplex = config.duplex; in phylink_ethtool_ksettings_set()
2989 if (pl->link_config.interface != config.interface) { in phylink_ethtool_ksettings_set()
2992 if (pl->old_link_state) { in phylink_ethtool_ksettings_set()
2993 phylink_link_down(pl); in phylink_ethtool_ksettings_set()
2994 pl->old_link_state = false; in phylink_ethtool_ksettings_set()
2997 &pl->phylink_disable_state)) in phylink_ethtool_ksettings_set()
2998 phylink_major_config(pl, false, &config); in phylink_ethtool_ksettings_set()
2999 pl->link_config.interface = config.interface; in phylink_ethtool_ksettings_set()
3000 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
3001 } else if (!linkmode_equal(pl->link_config.advertising, in phylink_ethtool_ksettings_set()
3003 linkmode_copy(pl->link_config.advertising, config.advertising); in phylink_ethtool_ksettings_set()
3004 phylink_change_inband_advert(pl); in phylink_ethtool_ksettings_set()
3006 mutex_unlock(&pl->state_mutex); in phylink_ethtool_ksettings_set()
3014 * @pl: a pointer to a &struct phylink returned from phylink_create()
3016 * Restart negotiation for the phylink instance specified by @pl. This will
3023 int phylink_ethtool_nway_reset(struct phylink *pl) in phylink_ethtool_nway_reset() argument
3029 if (pl->phydev) in phylink_ethtool_nway_reset()
3030 ret = phy_restart_aneg(pl->phydev); in phylink_ethtool_nway_reset()
3031 phylink_pcs_an_restart(pl); in phylink_ethtool_nway_reset()
3039 * @pl: a pointer to a &struct phylink returned from phylink_create()
3042 void phylink_ethtool_get_pauseparam(struct phylink *pl, in phylink_ethtool_get_pauseparam() argument
3047 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN); in phylink_ethtool_get_pauseparam()
3048 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX); in phylink_ethtool_get_pauseparam()
3049 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX); in phylink_ethtool_get_pauseparam()
3055 * @pl: a pointer to a &struct phylink returned from phylink_create()
3058 int phylink_ethtool_set_pauseparam(struct phylink *pl, in phylink_ethtool_set_pauseparam() argument
3061 struct phylink_link_state *config = &pl->link_config; in phylink_ethtool_set_pauseparam()
3067 if (pl->req_link_an_mode == MLO_AN_FIXED) in phylink_ethtool_set_pauseparam()
3070 if (!phylink_test(pl->supported, Pause) && in phylink_ethtool_set_pauseparam()
3071 !phylink_test(pl->supported, Asym_Pause)) in phylink_ethtool_set_pauseparam()
3074 if (!phylink_test(pl->supported, Asym_Pause) && in phylink_ethtool_set_pauseparam()
3086 mutex_lock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
3112 if (!pl->phydev) in phylink_ethtool_set_pauseparam()
3113 phylink_change_inband_advert(pl); in phylink_ethtool_set_pauseparam()
3115 mutex_unlock(&pl->state_mutex); in phylink_ethtool_set_pauseparam()
3122 if (pl->phydev) in phylink_ethtool_set_pauseparam()
3123 phy_set_asym_pause(pl->phydev, pause->rx_pause, in phylink_ethtool_set_pauseparam()
3131 pl->link_failed = true; in phylink_ethtool_set_pauseparam()
3132 phylink_run_resolve(pl); in phylink_ethtool_set_pauseparam()
3142 * @pl: a pointer to a &struct phylink returned from phylink_create().
3145 * with the phylink instance specified by @pl.
3149 int phylink_get_eee_err(struct phylink *pl) in phylink_get_eee_err() argument
3155 if (pl->phydev) in phylink_get_eee_err()
3156 ret = phy_get_eee_err(pl->phydev); in phylink_get_eee_err()
3164 * @pl: a pointer to a &struct phylink returned from phylink_create()
3169 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable) in phylink_init_eee() argument
3173 if (pl->phydev) in phylink_init_eee()
3174 ret = phy_init_eee(pl->phydev, clk_stop_enable); in phylink_init_eee()
3182 * @pl: a pointer to a &struct phylink returned from phylink_create()
3185 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_keee *eee) in phylink_ethtool_get_eee() argument
3191 if (pl->mac_supports_eee_ops && !pl->mac_supports_eee) in phylink_ethtool_get_eee()
3194 if (pl->phydev) { in phylink_ethtool_get_eee()
3195 ret = phy_ethtool_get_eee(pl->phydev, eee); in phylink_ethtool_get_eee()
3197 if (ret == 0 && pl->mac_supports_eee_ops) in phylink_ethtool_get_eee()
3199 pl->supported_lpi); in phylink_ethtool_get_eee()
3208 * @pl: a pointer to a &struct phylink returned from phylink_create()
3211 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_keee *eee) in phylink_ethtool_set_eee() argument
3213 bool mac_eee = pl->mac_supports_eee; in phylink_ethtool_set_eee()
3218 phylink_dbg(pl, "mac %s phylink EEE%s, adv %*pbl, LPI%s timer %uus\n", in phylink_ethtool_set_eee()
3224 if (pl->mac_supports_eee_ops && !mac_eee) in phylink_ethtool_set_eee()
3227 if (pl->phydev) { in phylink_ethtool_set_eee()
3229 if (pl->mac_supports_eee_ops) in phylink_ethtool_set_eee()
3231 pl->supported_lpi); in phylink_ethtool_set_eee()
3232 ret = phy_ethtool_set_eee(pl->phydev, eee); in phylink_ethtool_set_eee()
3234 eee_to_eeecfg(&pl->eee_cfg, eee); in phylink_ethtool_set_eee()
3267 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, in phylink_phy_read() argument
3270 struct phy_device *phydev = pl->phydev; in phylink_phy_read()
3276 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_read()
3302 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_read()
3306 return mdiobus_read(pl->phydev->mdio.bus, phy_id, reg); in phylink_phy_read()
3309 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, in phylink_phy_write() argument
3312 struct phy_device *phydev = pl->phydev; in phylink_phy_write()
3318 return mdiobus_c45_write(pl->phydev->mdio.bus, prtad, devad, in phylink_phy_write()
3343 return mdiobus_c45_write(pl->phydev->mdio.bus, phy_id, devad, in phylink_phy_write()
3350 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id, in phylink_mii_read() argument
3356 switch (pl->act_link_an_mode) { in phylink_mii_read()
3359 phylink_get_fixed_state(pl, &state); in phylink_mii_read()
3369 phylink_mac_pcs_get_state(pl, &state); in phylink_mii_read()
3378 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id, in phylink_mii_write() argument
3381 switch (pl->act_link_an_mode) { in phylink_mii_write()
3397 * @pl: a pointer to a &struct phylink returned from phylink_create()
3402 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
3413 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd) in phylink_mii_ioctl() argument
3420 if (pl->phydev) { in phylink_mii_ioctl()
3424 mii->phy_id = pl->phydev->mdio.addr; in phylink_mii_ioctl()
3428 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
3436 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
3441 ret = phy_mii_ioctl(pl->phydev, ifr, cmd); in phylink_mii_ioctl()
3451 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num); in phylink_mii_ioctl()
3459 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num, in phylink_mii_ioctl()
3476 * @pl: a pointer to a &struct phylink returned from phylink_create()
3485 int phylink_speed_down(struct phylink *pl, bool sync) in phylink_speed_down() argument
3491 if (!pl->sfp_bus && pl->phydev) in phylink_speed_down()
3492 ret = phy_speed_down(pl->phydev, sync); in phylink_speed_down()
3501 * @pl: a pointer to a &struct phylink returned from phylink_create()
3508 int phylink_speed_up(struct phylink *pl) in phylink_speed_up() argument
3514 if (!pl->sfp_bus && pl->phydev) in phylink_speed_up()
3515 ret = phy_speed_up(pl->phydev); in phylink_speed_up()
3523 struct phylink *pl = upstream; in phylink_sfp_attach() local
3525 pl->netdev->sfp_bus = bus; in phylink_sfp_attach()
3530 struct phylink *pl = upstream; in phylink_sfp_detach() local
3532 pl->netdev->sfp_bus = NULL; in phylink_sfp_detach()
3535 static phy_interface_t phylink_choose_sfp_interface(struct phylink *pl, in phylink_choose_sfp_interface() argument
3551 static void phylink_sfp_set_config(struct phylink *pl, unsigned long *supported, in phylink_sfp_set_config() argument
3557 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n", in phylink_sfp_set_config()
3561 if (!linkmode_equal(pl->supported, supported)) { in phylink_sfp_set_config()
3562 linkmode_copy(pl->supported, supported); in phylink_sfp_set_config()
3566 if (!linkmode_equal(pl->link_config.advertising, state->advertising)) { in phylink_sfp_set_config()
3567 linkmode_copy(pl->link_config.advertising, state->advertising); in phylink_sfp_set_config()
3571 if (pl->req_link_an_mode != mode || in phylink_sfp_set_config()
3572 pl->link_config.interface != state->interface) { in phylink_sfp_set_config()
3573 pl->req_link_an_mode = mode; in phylink_sfp_set_config()
3574 pl->link_config.interface = state->interface; in phylink_sfp_set_config()
3578 phylink_info(pl, "switched to %s/%s link mode\n", in phylink_sfp_set_config()
3584 &pl->phylink_disable_state)) in phylink_sfp_set_config()
3585 phylink_mac_initial_config(pl, false); in phylink_sfp_set_config()
3588 static int phylink_sfp_config_phy(struct phylink *pl, struct phy_device *phy) in phylink_sfp_config_phy() argument
3604 ret = phylink_validate(pl, support, &config); in phylink_sfp_config_phy()
3606 phylink_err(pl, "validation with support %*pb failed: %pe\n", in phylink_sfp_config_phy()
3612 config.interface = phylink_sfp_select_interface(pl, config.advertising); in phylink_sfp_config_phy()
3619 ret = phylink_attach_phy(pl, phy, config.interface); in phylink_sfp_config_phy()
3624 ret = phylink_bringup_phy(pl, phy, config.interface); in phylink_sfp_config_phy()
3630 pl->link_port = pl->sfp_port; in phylink_sfp_config_phy()
3632 phylink_sfp_set_config(pl, support, &config, true); in phylink_sfp_config_phy()
3637 static int phylink_sfp_config_optical(struct phylink *pl) in phylink_sfp_config_optical() argument
3645 phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n", in phylink_sfp_config_optical()
3647 pl->config->supported_interfaces, in phylink_sfp_config_optical()
3649 pl->sfp_interfaces); in phylink_sfp_config_optical()
3654 phy_interface_and(interfaces, pl->config->supported_interfaces, in phylink_sfp_config_optical()
3655 pl->sfp_interfaces); in phylink_sfp_config_optical()
3657 phylink_err(pl, "unsupported SFP module: no common interface modes\n"); in phylink_sfp_config_optical()
3662 linkmode_copy(support, pl->sfp_support); in phylink_sfp_config_optical()
3663 linkmode_copy(config.advertising, pl->sfp_support); in phylink_sfp_config_optical()
3671 ret = phylink_validate_mask(pl, NULL, pl->sfp_support, &config, in phylink_sfp_config_optical()
3674 phylink_err(pl, "unsupported SFP module: validation with support %*pb failed\n", in phylink_sfp_config_optical()
3679 interface = phylink_choose_sfp_interface(pl, interfaces); in phylink_sfp_config_optical()
3681 phylink_err(pl, "failed to select SFP interface\n"); in phylink_sfp_config_optical()
3685 phylink_dbg(pl, "optical SFP: chosen %s interface\n", in phylink_sfp_config_optical()
3688 if (!phylink_validate_pcs_inband_autoneg(pl, interface, in phylink_sfp_config_optical()
3690 phylink_err(pl, "autoneg setting not compatible with PCS"); in phylink_sfp_config_optical()
3697 ret = phylink_validate(pl, support, &config); in phylink_sfp_config_optical()
3699 phylink_err(pl, "validation with support %*pb failed: %pe\n", in phylink_sfp_config_optical()
3705 pl->link_port = pl->sfp_port; in phylink_sfp_config_optical()
3707 phylink_sfp_set_config(pl, pl->sfp_support, &config, false); in phylink_sfp_config_optical()
3715 struct phylink *pl = upstream; in phylink_sfp_module_insert() local
3719 linkmode_zero(pl->sfp_support); in phylink_sfp_module_insert()
3720 phy_interface_zero(pl->sfp_interfaces); in phylink_sfp_module_insert()
3721 sfp_parse_support(pl->sfp_bus, id, pl->sfp_support, pl->sfp_interfaces); in phylink_sfp_module_insert()
3722 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, pl->sfp_support); in phylink_sfp_module_insert()
3725 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id); in phylink_sfp_module_insert()
3726 if (pl->sfp_may_have_phy) in phylink_sfp_module_insert()
3729 return phylink_sfp_config_optical(pl); in phylink_sfp_module_insert()
3734 struct phylink *pl = upstream; in phylink_sfp_module_start() local
3737 if (pl->phydev) { in phylink_sfp_module_start()
3738 phy_start(pl->phydev); in phylink_sfp_module_start()
3745 if (!pl->sfp_may_have_phy) in phylink_sfp_module_start()
3748 return phylink_sfp_config_optical(pl); in phylink_sfp_module_start()
3753 struct phylink *pl = upstream; in phylink_sfp_module_stop() local
3756 if (pl->phydev) in phylink_sfp_module_stop()
3757 phy_stop(pl->phydev); in phylink_sfp_module_stop()
3762 struct phylink *pl = upstream; in phylink_sfp_link_down() local
3766 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_down()
3771 struct phylink *pl = upstream; in phylink_sfp_link_up() local
3775 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_LINK); in phylink_sfp_link_up()
3780 struct phylink *pl = upstream; in phylink_sfp_connect_phy() local
3783 phylink_err(pl, "PHY %s (id 0x%.8lx) has no driver loaded\n", in phylink_sfp_connect_phy()
3785 …phylink_err(pl, "Drivers which handle known common cases: CONFIG_BCM84881_PHY, CONFIG_MARVELL_PHY\… in phylink_sfp_connect_phy()
3800 pl->config->supported_interfaces); in phylink_sfp_connect_phy()
3803 return phylink_sfp_config_phy(pl, phy); in phylink_sfp_connect_phy()