Lines Matching refs:pl
91 #define phylink_printk(level, pl, fmt, ...) \
93 if ((pl)->config->type == PHYLINK_NETDEV) \
94 netdev_printk(level, (pl)->netdev, fmt, ##__VA_ARGS__); \
95 else if ((pl)->config->type == PHYLINK_DEV) \
96 dev_printk(level, (pl)->dev, fmt, ##__VA_ARGS__); \
99 #define phylink_err(pl, fmt, ...) \
100 phylink_printk(KERN_ERR, pl, fmt, ##__VA_ARGS__)
101 #define phylink_warn(pl, fmt, ...) \
102 phylink_printk(KERN_WARNING, pl, fmt, ##__VA_ARGS__)
103 #define phylink_info(pl, fmt, ...) \
104 phylink_printk(KERN_INFO, pl, fmt, ##__VA_ARGS__)
106 #define phylink_dbg(pl, fmt, ...) \
108 if ((pl)->config->type == PHYLINK_NETDEV) \
109 netdev_dbg((pl)->netdev, fmt, ##__VA_ARGS__); \
110 else if ((pl)->config->type == PHYLINK_DEV) \
111 dev_dbg((pl)->dev, fmt, ##__VA_ARGS__); \
114 #define phylink_dbg(pl, fmt, ...) \
115 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__)
117 #define phylink_dbg(pl, fmt, ...) \
120 phylink_printk(KERN_DEBUG, pl, fmt, ##__VA_ARGS__); \
656 static int phylink_validate_mac_and_pcs(struct phylink *pl,
664 if (pl->using_mac_select_pcs) {
665 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
669 pcs = pl->pcs;
678 phylink_err(pl, "interface %s: uninitialised PCS\n",
699 if (pl->mac_ops->validate)
700 pl->mac_ops->validate(pl->config, supported, state);
702 phylink_generic_validate(pl->config, supported, state);
707 static int phylink_validate_mask(struct phylink *pl, unsigned long *supported,
723 if (!phylink_validate_mac_and_pcs(pl, s, &t)) {
736 static int phylink_validate(struct phylink *pl, unsigned long *supported,
739 const unsigned long *interfaces = pl->config->supported_interfaces;
742 return phylink_validate_mask(pl, supported, state, interfaces);
747 return phylink_validate_mac_and_pcs(pl, supported, state);
750 static int phylink_parse_fixedlink(struct phylink *pl,
764 pl->link_config.speed = speed;
765 pl->link_config.duplex = DUPLEX_HALF;
768 pl->link_config.duplex = DUPLEX_FULL;
775 pl->link_config.lp_advertising);
778 pl->link_config.lp_advertising);
785 pl->link_gpio = desc;
799 phylink_err(pl, "broken fixed-link?\n");
806 pl->link_config.duplex = prop[1] ?
808 pl->link_config.speed = prop[2];
811 pl->link_config.lp_advertising);
814 pl->link_config.lp_advertising);
818 if (pl->link_config.speed > SPEED_1000 &&
819 pl->link_config.duplex != DUPLEX_FULL)
820 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n",
821 pl->link_config.speed);
823 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
824 linkmode_copy(pl->link_config.advertising, pl->supported);
825 phylink_validate(pl, pl->supported, &pl->link_config);
827 pause = phylink_test(pl->supported, Pause);
828 asym_pause = phylink_test(pl->supported, Asym_Pause);
829 autoneg = phylink_test(pl->supported, Autoneg);
830 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex,
831 pl->supported, true);
832 linkmode_zero(pl->supported);
833 phylink_set(pl->supported, MII);
836 phylink_set(pl->supported, Pause);
839 phylink_set(pl->supported, Asym_Pause);
842 phylink_set(pl->supported, Autoneg);
845 __set_bit(s->bit, pl->supported);
846 __set_bit(s->bit, pl->link_config.lp_advertising);
848 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n",
849 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half",
850 pl->link_config.speed);
853 linkmode_and(pl->link_config.advertising, pl->link_config.advertising,
854 pl->supported);
856 pl->link_config.link = 1;
857 pl->link_config.an_complete = 1;
862 static int phylink_parse_mode(struct phylink *pl,
870 pl->cfg_link_an_mode = MLO_AN_FIXED;
875 pl->config->ovr_an_inband) {
876 if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
877 phylink_err(pl,
882 linkmode_zero(pl->supported);
883 phylink_set(pl->supported, MII);
884 phylink_set(pl->supported, Autoneg);
885 phylink_set(pl->supported, Asym_Pause);
886 phylink_set(pl->supported, Pause);
887 pl->cfg_link_an_mode = MLO_AN_INBAND;
889 switch (pl->link_config.interface) {
899 phylink_set(pl->supported, 10baseT_Half);
900 phylink_set(pl->supported, 10baseT_Full);
901 phylink_set(pl->supported, 100baseT_Half);
902 phylink_set(pl->supported, 100baseT_Full);
903 phylink_set(pl->supported, 1000baseT_Half);
904 phylink_set(pl->supported, 1000baseT_Full);
908 phylink_set(pl->supported, 1000baseX_Full);
912 phylink_set(pl->supported, 2500baseX_Full);
916 phylink_set(pl->supported, 5000baseT_Full);
920 phylink_set(pl->supported, 25000baseCR_Full);
921 phylink_set(pl->supported, 25000baseKR_Full);
922 phylink_set(pl->supported, 25000baseSR_Full);
927 phylink_set(pl->supported, 10baseT_Half);
928 phylink_set(pl->supported, 10baseT_Full);
929 phylink_set(pl->supported, 100baseT_Half);
930 phylink_set(pl->supported, 100baseT_Full);
931 phylink_set(pl->supported, 1000baseT_Half);
932 phylink_set(pl->supported, 1000baseT_Full);
933 phylink_set(pl->supported, 1000baseX_Full);
934 phylink_set(pl->supported, 1000baseKX_Full);
935 phylink_set(pl->supported, 2500baseT_Full);
936 phylink_set(pl->supported, 2500baseX_Full);
937 phylink_set(pl->supported, 5000baseT_Full);
938 phylink_set(pl->supported, 10000baseT_Full);
939 phylink_set(pl->supported, 10000baseKR_Full);
940 phylink_set(pl->supported, 10000baseKX4_Full);
941 phylink_set(pl->supported, 10000baseCR_Full);
942 phylink_set(pl->supported, 10000baseSR_Full);
943 phylink_set(pl->supported, 10000baseLR_Full);
944 phylink_set(pl->supported, 10000baseLRM_Full);
945 phylink_set(pl->supported, 10000baseER_Full);
949 phylink_set(pl->supported, 25000baseCR_Full);
950 phylink_set(pl->supported, 25000baseKR_Full);
951 phylink_set(pl->supported, 25000baseSR_Full);
952 phylink_set(pl->supported, 40000baseKR4_Full);
953 phylink_set(pl->supported, 40000baseCR4_Full);
954 phylink_set(pl->supported, 40000baseSR4_Full);
955 phylink_set(pl->supported, 40000baseLR4_Full);
956 phylink_set(pl->supported, 50000baseCR2_Full);
957 phylink_set(pl->supported, 50000baseKR2_Full);
958 phylink_set(pl->supported, 50000baseSR2_Full);
959 phylink_set(pl->supported, 50000baseKR_Full);
960 phylink_set(pl->supported, 50000baseSR_Full);
961 phylink_set(pl->supported, 50000baseCR_Full);
962 phylink_set(pl->supported, 50000baseLR_ER_FR_Full);
963 phylink_set(pl->supported, 50000baseDR_Full);
964 phylink_set(pl->supported, 100000baseKR4_Full);
965 phylink_set(pl->supported, 100000baseSR4_Full);
966 phylink_set(pl->supported, 100000baseCR4_Full);
967 phylink_set(pl->supported, 100000baseLR4_ER4_Full);
968 phylink_set(pl->supported, 100000baseKR2_Full);
969 phylink_set(pl->supported, 100000baseSR2_Full);
970 phylink_set(pl->supported, 100000baseCR2_Full);
971 phylink_set(pl->supported, 100000baseLR2_ER2_FR2_Full);
972 phylink_set(pl->supported, 100000baseDR2_Full);
976 phylink_err(pl,
978 phy_modes(pl->link_config.interface));
982 linkmode_copy(pl->link_config.advertising, pl->supported);
984 if (phylink_validate(pl, pl->supported, &pl->link_config)) {
985 phylink_err(pl,
994 static void phylink_apply_manual_flow(struct phylink *pl,
1003 if (!(pl->link_config.pause & MLO_PAUSE_AN))
1004 state->pause = pl->link_config.pause;
1075 static void phylink_pcs_poll_stop(struct phylink *pl)
1077 if (pl->cfg_link_an_mode == MLO_AN_INBAND)
1078 del_timer(&pl->link_poll);
1081 static void phylink_pcs_poll_start(struct phylink *pl)
1083 if (pl->pcs && pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND)
1084 mod_timer(&pl->link_poll, jiffies + HZ);
1087 static void phylink_mac_config(struct phylink *pl,
1099 phylink_dbg(pl,
1101 __func__, phylink_an_mode_str(pl->cur_link_an_mode),
1107 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, &st);
1110 static void phylink_pcs_an_restart(struct phylink *pl)
1112 if (pl->pcs && linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
1113 pl->link_config.advertising) &&
1114 phy_interface_mode_is_8023z(pl->link_config.interface) &&
1115 phylink_autoneg_inband(pl->cur_link_an_mode))
1116 pl->pcs->ops->pcs_an_restart(pl->pcs);
1119 static void phylink_major_config(struct phylink *pl, bool restart,
1128 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface));
1130 pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
1134 if (pl->using_mac_select_pcs) {
1135 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
1137 phylink_err(pl,
1143 pcs_changed = pcs && pl->pcs != pcs;
1146 phylink_pcs_poll_stop(pl);
1148 if (pl->mac_ops->mac_prepare) {
1149 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode,
1152 phylink_err(pl, "mac_prepare failed: %pe\n",
1162 phylink_pcs_disable(pl->pcs);
1164 if (pl->pcs)
1165 pl->pcs->phylink = NULL;
1167 pcs->phylink = pl;
1169 pl->pcs = pcs;
1172 if (pl->pcs)
1173 phylink_pcs_pre_config(pl->pcs, state->interface);
1175 phylink_mac_config(pl, state);
1177 if (pl->pcs)
1178 phylink_pcs_post_config(pl->pcs, state->interface);
1180 if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed)
1181 phylink_pcs_enable(pl->pcs);
1183 neg_mode = pl->cur_link_an_mode;
1184 if (pl->pcs && pl->pcs->neg_mode)
1185 neg_mode = pl->pcs_neg_mode;
1187 err = phylink_pcs_config(pl->pcs, neg_mode, state,
1188 !!(pl->link_config.pause & MLO_PAUSE_AN));
1190 phylink_err(pl, "pcs_config failed: %pe\n",
1196 phylink_pcs_an_restart(pl);
1198 if (pl->mac_ops->mac_finish) {
1199 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode,
1202 phylink_err(pl, "mac_finish failed: %pe\n",
1206 if (pl->sfp_bus) {
1209 sfp_upstream_set_signal_rate(pl->sfp_bus, rate_kbd);
1212 phylink_pcs_poll_start(pl);
1221 static int phylink_change_inband_advert(struct phylink *pl)
1226 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state))
1229 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__,
1230 phylink_an_mode_str(pl->cur_link_an_mode),
1231 phy_modes(pl->link_config.interface),
1232 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising,
1233 pl->link_config.pause);
1236 pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
1237 pl->link_config.interface,
1238 pl->link_config.advertising);
1240 neg_mode = pl->cur_link_an_mode;
1241 if (pl->pcs->neg_mode)
1242 neg_mode = pl->pcs_neg_mode;
1248 ret = phylink_pcs_config(pl->pcs, neg_mode, &pl->link_config,
1249 !!(pl->link_config.pause & MLO_PAUSE_AN));
1254 phylink_pcs_an_restart(pl);
1259 static void phylink_mac_pcs_get_state(struct phylink *pl,
1262 linkmode_copy(state->advertising, pl->link_config.advertising);
1264 state->interface = pl->link_config.interface;
1265 state->rate_matching = pl->link_config.rate_matching;
1272 state->speed = pl->link_config.speed;
1273 state->duplex = pl->link_config.duplex;
1274 state->pause = pl->link_config.pause;
1279 if (pl->pcs)
1280 pl->pcs->ops->pcs_get_state(pl->pcs, state);
1288 static void phylink_get_fixed_state(struct phylink *pl,
1291 *state = pl->link_config;
1292 if (pl->config->get_fixed_state)
1293 pl->config->get_fixed_state(pl->config, state);
1294 else if (pl->link_gpio)
1295 state->link = !!gpiod_get_value_cansleep(pl->link_gpio);
1301 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart)
1305 switch (pl->cur_link_an_mode) {
1307 link_state = pl->phy_state;
1311 phylink_get_fixed_state(pl, &link_state);
1315 link_state = pl->link_config;
1326 phylink_apply_manual_flow(pl, &link_state);
1327 phylink_major_config(pl, force_restart, &link_state);
1344 static void phylink_link_up(struct phylink *pl,
1347 struct net_device *ndev = pl->netdev;
1377 pl->cur_interface = link_state.interface;
1379 neg_mode = pl->cur_link_an_mode;
1380 if (pl->pcs && pl->pcs->neg_mode)
1381 neg_mode = pl->pcs_neg_mode;
1383 phylink_pcs_link_up(pl->pcs, neg_mode, pl->cur_interface, speed,
1386 pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->cur_link_an_mode,
1387 pl->cur_interface, speed, duplex,
1393 phylink_info(pl,
1400 static void phylink_link_down(struct phylink *pl)
1402 struct net_device *ndev = pl->netdev;
1406 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode,
1407 pl->cur_interface);
1408 phylink_info(pl, "Link is Down\n");
1413 struct phylink *pl = container_of(w, struct phylink, resolve);
1415 struct net_device *ndev = pl->netdev;
1420 mutex_lock(&pl->state_mutex);
1421 if (pl->netdev)
1424 cur_link_state = pl->old_link_state;
1426 if (pl->phylink_disable_state) {
1427 pl->mac_link_dropped = false;
1429 } else if (pl->mac_link_dropped) {
1433 switch (pl->cur_link_an_mode) {
1435 link_state = pl->phy_state;
1436 phylink_apply_manual_flow(pl, &link_state);
1441 phylink_get_fixed_state(pl, &link_state);
1446 phylink_mac_pcs_get_state(pl, &link_state);
1457 phylink_mac_pcs_get_state(pl,
1464 if (pl->phydev)
1465 link_state.link &= pl->phy_state.link;
1468 if (pl->phydev && pl->phy_state.link) {
1474 pl->phy_state.interface) {
1478 link_state.interface = pl->phy_state.interface;
1483 if (pl->phy_state.rate_matching) {
1485 pl->phy_state.rate_matching;
1486 link_state.speed = pl->phy_state.speed;
1488 pl->phy_state.duplex;
1494 link_state.pause = pl->phy_state.pause;
1497 phylink_apply_manual_flow(pl, &link_state);
1503 if (link_state.interface != pl->link_config.interface) {
1508 phylink_link_down(pl);
1511 phylink_major_config(pl, false, &link_state);
1512 pl->link_config.interface = link_state.interface;
1517 pl->old_link_state = link_state.link;
1519 phylink_link_down(pl);
1521 phylink_link_up(pl, link_state);
1524 pl->mac_link_dropped = false;
1525 queue_work(system_power_efficient_wq, &pl->resolve);
1527 mutex_unlock(&pl->state_mutex);
1530 static void phylink_run_resolve(struct phylink *pl)
1532 if (!pl->phylink_disable_state)
1533 queue_work(system_power_efficient_wq, &pl->resolve);
1536 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit)
1538 unsigned long state = pl->phylink_disable_state;
1540 set_bit(bit, &pl->phylink_disable_state);
1542 queue_work(system_power_efficient_wq, &pl->resolve);
1543 flush_work(&pl->resolve);
1547 static void phylink_enable_and_run_resolve(struct phylink *pl, int bit)
1549 clear_bit(bit, &pl->phylink_disable_state);
1550 phylink_run_resolve(pl);
1555 struct phylink *pl = container_of(t, struct phylink, link_poll);
1559 phylink_run_resolve(pl);
1564 static int phylink_register_sfp(struct phylink *pl,
1575 phylink_err(pl, "unable to attach SFP bus: %pe\n", bus);
1579 pl->sfp_bus = bus;
1581 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops);
1609 struct phylink *pl;
1624 pl = kzalloc(sizeof(*pl), GFP_KERNEL);
1625 if (!pl)
1628 mutex_init(&pl->state_mutex);
1629 INIT_WORK(&pl->resolve, phylink_resolve);
1631 pl->config = config;
1633 pl->netdev = to_net_dev(config->dev);
1634 netif_carrier_off(pl->netdev);
1636 pl->dev = config->dev;
1638 kfree(pl);
1642 pl->using_mac_select_pcs = using_mac_select_pcs;
1643 pl->phy_state.interface = iface;
1644 pl->link_interface = iface;
1646 pl->link_port = PORT_BNC;
1648 pl->link_port = PORT_MII;
1649 pl->link_config.interface = iface;
1650 pl->link_config.pause = MLO_PAUSE_AN;
1651 pl->link_config.speed = SPEED_UNKNOWN;
1652 pl->link_config.duplex = DUPLEX_UNKNOWN;
1653 pl->pcs_state = PCS_STATE_DOWN;
1654 pl->mac_ops = mac_ops;
1655 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
1656 timer_setup(&pl->link_poll, phylink_fixed_poll, 0);
1658 bitmap_fill(pl->supported, __ETHTOOL_LINK_MODE_MASK_NBITS);
1659 linkmode_copy(pl->link_config.advertising, pl->supported);
1660 phylink_validate(pl, pl->supported, &pl->link_config);
1662 ret = phylink_parse_mode(pl, fwnode);
1664 kfree(pl);
1668 if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
1669 ret = phylink_parse_fixedlink(pl, fwnode);
1671 kfree(pl);
1676 pl->cur_link_an_mode = pl->cfg_link_an_mode;
1678 ret = phylink_register_sfp(pl, fwnode);
1680 kfree(pl);
1684 return pl;
1690 * @pl: a pointer to a &struct phylink returned from phylink_create()
1697 void phylink_destroy(struct phylink *pl)
1699 sfp_bus_del_upstream(pl->sfp_bus);
1700 if (pl->link_gpio)
1701 gpiod_put(pl->link_gpio);
1703 cancel_work_sync(&pl->resolve);
1704 kfree(pl);
1710 * @pl: a pointer to a &struct phylink returned from phylink_create()
1717 bool phylink_expects_phy(struct phylink *pl)
1719 if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
1720 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
1721 phy_interface_mode_is_8023z(pl->link_config.interface)))
1729 struct phylink *pl = phydev->phylink;
1734 mutex_lock(&pl->state_mutex);
1735 pl->phy_state.speed = phydev->speed;
1736 pl->phy_state.duplex = phydev->duplex;
1737 pl->phy_state.rate_matching = phydev->rate_matching;
1738 pl->phy_state.pause = MLO_PAUSE_NONE;
1740 pl->phy_state.pause |= MLO_PAUSE_TX;
1742 pl->phy_state.pause |= MLO_PAUSE_RX;
1743 pl->phy_state.interface = phydev->interface;
1744 pl->phy_state.link = up;
1745 mutex_unlock(&pl->state_mutex);
1747 phylink_run_resolve(pl);
1749 phylink_dbg(pl, "phy link %s %s/%s/%s/%s/%s\n", up ? "up" : "down",
1754 phylink_pause_to_str(pl->phy_state.pause));
1757 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
1802 ret = phylink_validate(pl, supported, &config);
1804 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %pe\n",
1812 phy->phylink = pl;
1816 phylink_info(pl,
1822 mutex_lock(&pl->state_mutex);
1823 pl->phydev = phy;
1824 pl->phy_state.interface = interface;
1825 pl->phy_state.pause = MLO_PAUSE_NONE;
1826 pl->phy_state.speed = SPEED_UNKNOWN;
1827 pl->phy_state.duplex = DUPLEX_UNKNOWN;
1828 pl->phy_state.rate_matching = RATE_MATCH_NONE;
1829 linkmode_copy(pl->supported, supported);
1830 linkmode_copy(pl->link_config.advertising, config.advertising);
1834 mutex_unlock(&pl->state_mutex);
1837 phylink_dbg(pl,
1840 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported,
1846 if (pl->config->mac_managed_pm)
1852 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy,
1855 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED ||
1856 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
1857 phy_interface_mode_is_8023z(interface) && !pl->sfp_bus)))
1860 if (pl->phydev)
1863 return phy_attach_direct(pl->netdev, phy, 0, interface);
1868 * @pl: a pointer to a &struct phylink returned from phylink_create()
1871 * Connect @phy to the phylink instance specified by @pl by calling
1881 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy)
1886 if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
1887 pl->link_interface = phy->interface;
1888 pl->link_config.interface = pl->link_interface;
1891 ret = phylink_attach_phy(pl, phy, pl->link_interface);
1895 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface);
1905 * @pl: a pointer to a &struct phylink returned from phylink_create()
1910 * specified by @pl. Actions specified in phylink_connect_phy() will be
1915 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn,
1918 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags);
1924 * @pl: a pointer to a &struct phylink returned from phylink_create()
1929 * by @pl.
1933 int phylink_fwnode_phy_connect(struct phylink *pl,
1942 if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
1943 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
1944 phy_interface_mode_is_8023z(pl->link_interface)))
1949 if (pl->cfg_link_an_mode == MLO_AN_PHY)
1961 if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
1962 pl->link_interface = phy_dev->interface;
1963 pl->link_config.interface = pl->link_interface;
1966 ret = phy_attach_direct(pl->netdev, phy_dev, flags,
1967 pl->link_interface);
1972 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface);
1983 * @pl: a pointer to a &struct phylink returned from phylink_create()
1985 * Disconnect any current PHY from the phylink instance described by @pl.
1987 void phylink_disconnect_phy(struct phylink *pl)
1993 phy = pl->phydev;
1996 mutex_lock(&pl->state_mutex);
1997 pl->phydev = NULL;
1998 mutex_unlock(&pl->state_mutex);
2000 flush_work(&pl->resolve);
2007 static void phylink_link_changed(struct phylink *pl, bool up, const char *what)
2010 pl->mac_link_dropped = true;
2011 phylink_run_resolve(pl);
2012 phylink_dbg(pl, "%s link %s\n", what, up ? "up" : "down");
2017 * @pl: a pointer to a &struct phylink returned from phylink_create()
2023 void phylink_mac_change(struct phylink *pl, bool up)
2025 phylink_link_changed(pl, up, "mac");
2042 struct phylink *pl = pcs->phylink;
2044 if (pl)
2045 phylink_link_changed(pl, up, "pcs");
2051 struct phylink *pl = data;
2053 phylink_run_resolve(pl);
2060 * @pl: a pointer to a &struct phylink returned from phylink_create()
2062 * Start the phylink instance specified by @pl, configuring the MAC for the
2066 void phylink_start(struct phylink *pl)
2072 phylink_info(pl, "configuring for %s/%s link mode\n",
2073 phylink_an_mode_str(pl->cur_link_an_mode),
2074 phy_modes(pl->link_config.interface));
2077 if (pl->netdev)
2078 netif_carrier_off(pl->netdev);
2080 pl->pcs_state = PCS_STATE_STARTING;
2090 phylink_mac_initial_config(pl, true);
2092 pl->pcs_state = PCS_STATE_STARTED;
2094 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED);
2096 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
2097 int irq = gpiod_to_irq(pl->link_gpio);
2103 "netdev link", pl))
2104 pl->link_irq = irq;
2112 if (pl->cfg_link_an_mode == MLO_AN_FIXED)
2113 poll |= pl->config->poll_fixed_state;
2116 mod_timer(&pl->link_poll, jiffies + HZ);
2117 if (pl->phydev)
2118 phy_start(pl->phydev);
2119 if (pl->sfp_bus)
2120 sfp_upstream_start(pl->sfp_bus);
2126 * @pl: a pointer to a &struct phylink returned from phylink_create()
2128 * Stop the phylink instance specified by @pl. This should be called from the
2136 void phylink_stop(struct phylink *pl)
2140 if (pl->sfp_bus)
2141 sfp_upstream_stop(pl->sfp_bus);
2142 if (pl->phydev)
2143 phy_stop(pl->phydev);
2144 del_timer_sync(&pl->link_poll);
2145 if (pl->link_irq) {
2146 free_irq(pl->link_irq, pl);
2147 pl->link_irq = 0;
2150 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED);
2152 pl->pcs_state = PCS_STATE_DOWN;
2154 phylink_pcs_disable(pl->pcs);
2160 * @pl: a pointer to a &struct phylink returned from phylink_create()
2172 void phylink_suspend(struct phylink *pl, bool mac_wol)
2176 if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) {
2178 mutex_lock(&pl->state_mutex);
2181 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state);
2187 if (pl->netdev)
2188 netif_carrier_off(pl->netdev);
2190 pl->old_link_state = false;
2195 mutex_unlock(&pl->state_mutex);
2197 phylink_stop(pl);
2204 * @pl: a pointer to a &struct phylink returned from phylink_create()
2209 void phylink_resume(struct phylink *pl)
2213 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) {
2222 mutex_lock(&pl->state_mutex);
2223 phylink_link_down(pl);
2224 mutex_unlock(&pl->state_mutex);
2229 phylink_mac_initial_config(pl, true);
2232 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_MAC_WOL);
2234 phylink_start(pl);
2241 * @pl: a pointer to a &struct phylink returned from phylink_create()
2245 * instance specified by @pl. If no PHY is currently attached, report no
2248 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
2255 if (pl->phydev)
2256 phy_ethtool_get_wol(pl->phydev, wol);
2262 * @pl: a pointer to a &struct phylink returned from phylink_create()
2266 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
2271 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
2277 if (pl->phydev)
2278 ret = phy_ethtool_set_wol(pl->phydev, wol);
2311 * @pl: a pointer to a &struct phylink returned from phylink_create()
2314 * Read the current link settings for the phylink instance specified by @pl.
2318 int phylink_ethtool_ksettings_get(struct phylink *pl,
2325 if (pl->phydev)
2326 phy_ethtool_ksettings_get(pl->phydev, kset);
2328 kset->base.port = pl->link_port;
2330 linkmode_copy(kset->link_modes.supported, pl->supported);
2332 switch (pl->cur_link_an_mode) {
2338 phylink_get_fixed_state(pl, &link_state);
2346 if (pl->phydev)
2349 phylink_mac_pcs_get_state(pl, &link_state);
2365 * @pl: a pointer to a &struct phylink returned from phylink_create()
2368 int phylink_ethtool_ksettings_set(struct phylink *pl,
2377 if (pl->phydev) {
2382 pl->supported);
2385 * to update the pl->link_config settings:
2402 return phy_ethtool_ksettings_set(pl->phydev, &phy_kset);
2405 config = pl->link_config;
2408 pl->supported);
2417 pl->supported, false);
2424 if (pl->cur_link_an_mode == MLO_AN_FIXED) {
2425 if (s->speed != pl->link_config.speed ||
2426 s->duplex != pl->link_config.duplex)
2440 if (pl->cur_link_an_mode == MLO_AN_FIXED) {
2442 pl->link_config.advertising))
2465 if (pl->sfp_bus) {
2466 config.interface = sfp_select_interface(pl->sfp_bus,
2469 phylink_err(pl,
2477 linkmode_copy(support, pl->supported);
2478 if (phylink_validate(pl, support, &config)) {
2479 phylink_err(pl, "validation of %s/%s with support %*pb failed\n",
2480 phylink_an_mode_str(pl->cur_link_an_mode),
2487 linkmode_copy(support, pl->supported);
2488 if (phylink_validate(pl, support, &config))
2498 mutex_lock(&pl->state_mutex);
2499 pl->link_config.speed = config.speed;
2500 pl->link_config.duplex = config.duplex;
2502 if (pl->link_config.interface != config.interface) {
2505 if (pl->old_link_state) {
2506 phylink_link_down(pl);
2507 pl->old_link_state = false;
2510 &pl->phylink_disable_state))
2511 phylink_major_config(pl, false, &config);
2512 pl->link_config.interface = config.interface;
2513 linkmode_copy(pl->link_config.advertising, config.advertising);
2514 } else if (!linkmode_equal(pl->link_config.advertising,
2516 linkmode_copy(pl->link_config.advertising, config.advertising);
2517 phylink_change_inband_advert(pl);
2519 mutex_unlock(&pl->state_mutex);
2527 * @pl: a pointer to a &struct phylink returned from phylink_create()
2529 * Restart negotiation for the phylink instance specified by @pl. This will
2536 int phylink_ethtool_nway_reset(struct phylink *pl)
2542 if (pl->phydev)
2543 ret = phy_restart_aneg(pl->phydev);
2544 phylink_pcs_an_restart(pl);
2552 * @pl: a pointer to a &struct phylink returned from phylink_create()
2555 void phylink_ethtool_get_pauseparam(struct phylink *pl,
2560 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN);
2561 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX);
2562 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX);
2568 * @pl: a pointer to a &struct phylink returned from phylink_create()
2571 int phylink_ethtool_set_pauseparam(struct phylink *pl,
2574 struct phylink_link_state *config = &pl->link_config;
2580 if (pl->cur_link_an_mode == MLO_AN_FIXED)
2583 if (!phylink_test(pl->supported, Pause) &&
2584 !phylink_test(pl->supported, Asym_Pause))
2587 if (!phylink_test(pl->supported, Asym_Pause) &&
2599 mutex_lock(&pl->state_mutex);
2625 if (!pl->phydev)
2626 phylink_change_inband_advert(pl);
2628 mutex_unlock(&pl->state_mutex);
2635 if (pl->phydev)
2636 phy_set_asym_pause(pl->phydev, pause->rx_pause,
2644 pl->mac_link_dropped = true;
2645 phylink_run_resolve(pl);
2655 * @pl: a pointer to a &struct phylink returned from phylink_create().
2658 * with the phylink instance specified by @pl.
2662 int phylink_get_eee_err(struct phylink *pl)
2668 if (pl->phydev)
2669 ret = phy_get_eee_err(pl->phydev);
2677 * @pl: a pointer to a &struct phylink returned from phylink_create()
2682 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable)
2686 if (pl->phydev)
2687 ret = phy_init_eee(pl->phydev, clk_stop_enable);
2695 * @pl: a pointer to a &struct phylink returned from phylink_create()
2698 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_eee *eee)
2704 if (pl->phydev)
2705 ret = phy_ethtool_get_eee(pl->phydev, eee);
2713 * @pl: a pointer to a &struct phylink returned from phylink_create()
2716 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_eee *eee)
2722 if (pl->phydev)
2723 ret = phy_ethtool_set_eee(pl->phydev, eee);
2755 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id,
2758 struct phy_device *phydev = pl->phydev;
2764 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad,
2790 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad,
2794 return mdiobus_read(pl->phydev->mdio.bus, phy_id, reg);
2797 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id,
2800 struct phy_device *phydev = pl->phydev;
2806 return mdiobus_c45_write(pl->phydev->mdio.bus, prtad, devad,
2831 return mdiobus_c45_write(pl->phydev->mdio.bus, phy_id, devad,
2838 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id,
2844 switch (pl->cur_link_an_mode) {
2847 phylink_get_fixed_state(pl, &state);
2857 phylink_mac_pcs_get_state(pl, &state);
2866 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id,
2869 switch (pl->cur_link_an_mode) {
2885 * @pl: a pointer to a &struct phylink returned from phylink_create()
2890 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
2901 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd)
2908 if (pl->phydev) {
2912 mii->phy_id = pl->phydev->mdio.addr;
2916 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num);
2924 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num,
2929 ret = phy_mii_ioctl(pl->phydev, ifr, cmd);
2939 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num);
2947 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num,
2964 * @pl: a pointer to a &struct phylink returned from phylink_create()
2973 int phylink_speed_down(struct phylink *pl, bool sync)
2979 if (!pl->sfp_bus && pl->phydev)
2980 ret = phy_speed_down(pl->phydev, sync);
2989 * @pl: a pointer to a &struct phylink returned from phylink_create()
2996 int phylink_speed_up(struct phylink *pl)
3002 if (!pl->sfp_bus && pl->phydev)
3003 ret = phy_speed_up(pl->phydev);
3011 struct phylink *pl = upstream;
3013 pl->netdev->sfp_bus = bus;
3018 struct phylink *pl = upstream;
3020 pl->netdev->sfp_bus = NULL;
3036 static phy_interface_t phylink_choose_sfp_interface(struct phylink *pl,
3052 static void phylink_sfp_set_config(struct phylink *pl, u8 mode,
3058 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n",
3062 if (!linkmode_equal(pl->supported, supported)) {
3063 linkmode_copy(pl->supported, supported);
3067 if (!linkmode_equal(pl->link_config.advertising, state->advertising)) {
3068 linkmode_copy(pl->link_config.advertising, state->advertising);
3072 if (pl->cur_link_an_mode != mode ||
3073 pl->link_config.interface != state->interface) {
3074 pl->cur_link_an_mode = mode;
3075 pl->link_config.interface = state->interface;
3079 phylink_info(pl, "switched to %s/%s link mode\n",
3085 &pl->phylink_disable_state))
3086 phylink_mac_initial_config(pl, false);
3089 static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
3108 ret = phylink_validate(pl, support, &config);
3110 phylink_err(pl, "validation with support %*pb failed: %pe\n",
3116 iface = sfp_select_interface(pl->sfp_bus, config.advertising);
3118 phylink_err(pl,
3126 ret = phylink_validate(pl, support1, &config);
3128 phylink_err(pl,
3137 pl->link_port = pl->sfp_port;
3139 phylink_sfp_set_config(pl, mode, support, &config);
3144 static int phylink_sfp_config_optical(struct phylink *pl)
3152 phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
3154 pl->config->supported_interfaces,
3156 pl->sfp_interfaces);
3161 phy_interface_and(interfaces, pl->config->supported_interfaces,
3162 pl->sfp_interfaces);
3164 phylink_err(pl, "unsupported SFP module: no common interface modes\n");
3169 linkmode_copy(support, pl->sfp_support);
3170 linkmode_copy(config.advertising, pl->sfp_support);
3178 ret = phylink_validate_mask(pl, pl->sfp_support, &config, interfaces);
3180 phylink_err(pl, "unsupported SFP module: validation with support %*pb failed\n",
3185 interface = phylink_choose_sfp_interface(pl, interfaces);
3187 phylink_err(pl, "failed to select SFP interface\n");
3191 phylink_dbg(pl, "optical SFP: chosen %s interface\n",
3197 ret = phylink_validate(pl, support, &config);
3199 phylink_err(pl, "validation with support %*pb failed: %pe\n",
3205 pl->link_port = pl->sfp_port;
3207 phylink_sfp_set_config(pl, MLO_AN_INBAND, pl->sfp_support, &config);
3215 struct phylink *pl = upstream;
3219 linkmode_zero(pl->sfp_support);
3220 phy_interface_zero(pl->sfp_interfaces);
3221 sfp_parse_support(pl->sfp_bus, id, pl->sfp_support, pl->sfp_interfaces);
3222 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, pl->sfp_support);
3225 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id);
3226 if (pl->sfp_may_have_phy)
3229 return phylink_sfp_config_optical(pl);
3234 struct phylink *pl = upstream;
3237 if (pl->phydev) {
3238 phy_start(pl->phydev);
3245 if (!pl->sfp_may_have_phy)
3248 return phylink_sfp_config_optical(pl);
3253 struct phylink *pl = upstream;
3256 if (pl->phydev)
3257 phy_stop(pl->phydev);
3262 struct phylink *pl = upstream;
3266 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK);
3271 struct phylink *pl = upstream;
3275 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_LINK);
3289 struct phylink *pl = upstream;
3310 pl->config->supported_interfaces);
3313 ret = phylink_sfp_config_phy(pl, mode, phy);
3317 interface = pl->link_config.interface;
3318 ret = phylink_attach_phy(pl, phy, interface);
3322 ret = phylink_bringup_phy(pl, phy, interface);