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__); \
650 static int phylink_validate_mac_and_pcs(struct phylink *pl,
659 if (pl->using_mac_select_pcs) {
660 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
664 pcs = pl->pcs;
673 phylink_err(pl, "interface %s: uninitialised PCS\n",
694 if (pl->mac_ops->mac_get_caps)
695 capabilities = pl->mac_ops->mac_get_caps(pl->config,
698 capabilities = pl->config->mac_capabilities;
705 static void phylink_validate_one(struct phylink *pl, struct phy_device *phy,
723 if (!phylink_validate_mac_and_pcs(pl, tmp_supported, &tmp_state)) {
724 phylink_dbg(pl, " interface %u (%s) rate match %s supports %*pbl\n",
735 static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy,
745 phylink_validate_one(pl, phy, supported, state, interface,
754 static int phylink_validate(struct phylink *pl, unsigned long *supported,
757 const unsigned long *interfaces = pl->config->supported_interfaces;
760 return phylink_validate_mask(pl, NULL, supported, state,
766 return phylink_validate_mac_and_pcs(pl, supported, state);
769 static int phylink_parse_fixedlink(struct phylink *pl,
783 pl->link_config.speed = speed;
784 pl->link_config.duplex = DUPLEX_HALF;
787 pl->link_config.duplex = DUPLEX_FULL;
794 pl->link_config.lp_advertising);
797 pl->link_config.lp_advertising);
804 pl->link_gpio = desc;
818 phylink_err(pl, "broken fixed-link?\n");
825 pl->link_config.duplex = prop[1] ?
827 pl->link_config.speed = prop[2];
830 pl->link_config.lp_advertising);
833 pl->link_config.lp_advertising);
837 if (pl->link_config.speed > SPEED_1000 &&
838 pl->link_config.duplex != DUPLEX_FULL)
839 phylink_warn(pl, "fixed link specifies half duplex for %dMbps link?\n",
840 pl->link_config.speed);
842 linkmode_fill(pl->supported);
843 linkmode_copy(pl->link_config.advertising, pl->supported);
844 phylink_validate(pl, pl->supported, &pl->link_config);
846 pause = phylink_test(pl->supported, Pause);
847 asym_pause = phylink_test(pl->supported, Asym_Pause);
848 autoneg = phylink_test(pl->supported, Autoneg);
849 s = phy_lookup_setting(pl->link_config.speed, pl->link_config.duplex,
850 pl->supported, true);
851 linkmode_zero(pl->supported);
852 phylink_set(pl->supported, MII);
855 phylink_set(pl->supported, Pause);
858 phylink_set(pl->supported, Asym_Pause);
861 phylink_set(pl->supported, Autoneg);
864 __set_bit(s->bit, pl->supported);
865 __set_bit(s->bit, pl->link_config.lp_advertising);
867 phylink_warn(pl, "fixed link %s duplex %dMbps not recognised\n",
868 pl->link_config.duplex == DUPLEX_FULL ? "full" : "half",
869 pl->link_config.speed);
872 linkmode_and(pl->link_config.advertising, pl->link_config.advertising,
873 pl->supported);
875 pl->link_config.link = 1;
876 pl->link_config.an_complete = 1;
881 static int phylink_parse_mode(struct phylink *pl,
890 pl->cfg_link_an_mode = MLO_AN_FIXED;
895 pl->config->ovr_an_inband) {
896 if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
897 phylink_err(pl,
902 linkmode_zero(pl->supported);
903 phylink_set(pl->supported, MII);
904 phylink_set(pl->supported, Autoneg);
905 phylink_set(pl->supported, Asym_Pause);
906 phylink_set(pl->supported, Pause);
907 pl->cfg_link_an_mode = MLO_AN_INBAND;
909 switch (pl->link_config.interface) {
928 caps = phylink_get_capabilities(pl->link_config.interface, caps,
930 phylink_caps_to_linkmodes(pl->supported, caps);
934 phylink_err(pl,
936 phy_modes(pl->link_config.interface));
940 linkmode_copy(pl->link_config.advertising, pl->supported);
942 if (phylink_validate(pl, pl->supported, &pl->link_config)) {
943 phylink_err(pl,
952 static void phylink_apply_manual_flow(struct phylink *pl,
961 if (!(pl->link_config.pause & MLO_PAUSE_AN))
962 state->pause = pl->link_config.pause;
1033 static void phylink_pcs_poll_stop(struct phylink *pl)
1035 if (pl->cfg_link_an_mode == MLO_AN_INBAND)
1036 del_timer(&pl->link_poll);
1039 static void phylink_pcs_poll_start(struct phylink *pl)
1041 if (pl->pcs && pl->pcs->poll && pl->cfg_link_an_mode == MLO_AN_INBAND)
1042 mod_timer(&pl->link_poll, jiffies + HZ);
1045 static void phylink_mac_config(struct phylink *pl,
1057 phylink_dbg(pl,
1059 __func__, phylink_an_mode_str(pl->cur_link_an_mode),
1065 pl->mac_ops->mac_config(pl->config, pl->cur_link_an_mode, &st);
1068 static void phylink_pcs_an_restart(struct phylink *pl)
1070 if (pl->pcs && linkmode_test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
1071 pl->link_config.advertising) &&
1072 phy_interface_mode_is_8023z(pl->link_config.interface) &&
1073 phylink_autoneg_inband(pl->cur_link_an_mode))
1074 pl->pcs->ops->pcs_an_restart(pl->pcs);
1143 static void phylink_major_config(struct phylink *pl, bool restart,
1152 phylink_dbg(pl, "major config %s\n", phy_modes(state->interface));
1154 pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
1158 if (pl->using_mac_select_pcs) {
1159 pcs = pl->mac_ops->mac_select_pcs(pl->config, state->interface);
1161 phylink_err(pl,
1167 pcs_changed = pcs && pl->pcs != pcs;
1170 phylink_pcs_poll_stop(pl);
1172 if (pl->mac_ops->mac_prepare) {
1173 err = pl->mac_ops->mac_prepare(pl->config, pl->cur_link_an_mode,
1176 phylink_err(pl, "mac_prepare failed: %pe\n",
1186 phylink_pcs_disable(pl->pcs);
1188 if (pl->pcs)
1189 pl->pcs->phylink = NULL;
1191 pcs->phylink = pl;
1193 pl->pcs = pcs;
1196 if (pl->pcs)
1197 phylink_pcs_pre_config(pl->pcs, state->interface);
1199 phylink_mac_config(pl, state);
1201 if (pl->pcs)
1202 phylink_pcs_post_config(pl->pcs, state->interface);
1204 if (pl->pcs_state == PCS_STATE_STARTING || pcs_changed)
1205 phylink_pcs_enable(pl->pcs);
1207 neg_mode = pl->cur_link_an_mode;
1208 if (pl->pcs && pl->pcs->neg_mode)
1209 neg_mode = pl->pcs_neg_mode;
1211 err = phylink_pcs_config(pl->pcs, neg_mode, state,
1212 !!(pl->link_config.pause & MLO_PAUSE_AN));
1214 phylink_err(pl, "pcs_config failed: %pe\n",
1220 phylink_pcs_an_restart(pl);
1222 if (pl->mac_ops->mac_finish) {
1223 err = pl->mac_ops->mac_finish(pl->config, pl->cur_link_an_mode,
1226 phylink_err(pl, "mac_finish failed: %pe\n",
1230 if (pl->sfp_bus) {
1233 sfp_upstream_set_signal_rate(pl->sfp_bus, rate_kbd);
1236 phylink_pcs_poll_start(pl);
1245 static int phylink_change_inband_advert(struct phylink *pl)
1250 if (test_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state))
1253 phylink_dbg(pl, "%s: mode=%s/%s adv=%*pb pause=%02x\n", __func__,
1254 phylink_an_mode_str(pl->cur_link_an_mode),
1255 phy_modes(pl->link_config.interface),
1256 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->link_config.advertising,
1257 pl->link_config.pause);
1260 pl->pcs_neg_mode = phylink_pcs_neg_mode(pl->cur_link_an_mode,
1261 pl->link_config.interface,
1262 pl->link_config.advertising);
1264 neg_mode = pl->cur_link_an_mode;
1265 if (pl->pcs->neg_mode)
1266 neg_mode = pl->pcs_neg_mode;
1272 ret = phylink_pcs_config(pl->pcs, neg_mode, &pl->link_config,
1273 !!(pl->link_config.pause & MLO_PAUSE_AN));
1278 phylink_pcs_an_restart(pl);
1283 static void phylink_mac_pcs_get_state(struct phylink *pl,
1286 linkmode_copy(state->advertising, pl->link_config.advertising);
1288 state->interface = pl->link_config.interface;
1289 state->rate_matching = pl->link_config.rate_matching;
1296 state->speed = pl->link_config.speed;
1297 state->duplex = pl->link_config.duplex;
1298 state->pause = pl->link_config.pause;
1303 if (pl->pcs)
1304 pl->pcs->ops->pcs_get_state(pl->pcs, state);
1312 static void phylink_get_fixed_state(struct phylink *pl,
1315 *state = pl->link_config;
1316 if (pl->config->get_fixed_state)
1317 pl->config->get_fixed_state(pl->config, state);
1318 else if (pl->link_gpio)
1319 state->link = !!gpiod_get_value_cansleep(pl->link_gpio);
1325 static void phylink_mac_initial_config(struct phylink *pl, bool force_restart)
1329 switch (pl->cur_link_an_mode) {
1331 link_state = pl->phy_state;
1335 phylink_get_fixed_state(pl, &link_state);
1339 link_state = pl->link_config;
1350 phylink_apply_manual_flow(pl, &link_state);
1351 phylink_major_config(pl, force_restart, &link_state);
1368 static void phylink_link_up(struct phylink *pl,
1371 struct net_device *ndev = pl->netdev;
1401 pl->cur_interface = link_state.interface;
1403 neg_mode = pl->cur_link_an_mode;
1404 if (pl->pcs && pl->pcs->neg_mode)
1405 neg_mode = pl->pcs_neg_mode;
1407 phylink_pcs_link_up(pl->pcs, neg_mode, pl->cur_interface, speed,
1410 pl->mac_ops->mac_link_up(pl->config, pl->phydev, pl->cur_link_an_mode,
1411 pl->cur_interface, speed, duplex,
1417 phylink_info(pl,
1424 static void phylink_link_down(struct phylink *pl)
1426 struct net_device *ndev = pl->netdev;
1430 pl->mac_ops->mac_link_down(pl->config, pl->cur_link_an_mode,
1431 pl->cur_interface);
1432 phylink_info(pl, "Link is Down\n");
1437 struct phylink *pl = container_of(w, struct phylink, resolve);
1439 struct net_device *ndev = pl->netdev;
1444 mutex_lock(&pl->state_mutex);
1445 if (pl->netdev)
1448 cur_link_state = pl->old_link_state;
1450 if (pl->phylink_disable_state) {
1451 pl->mac_link_dropped = false;
1453 } else if (pl->mac_link_dropped) {
1457 switch (pl->cur_link_an_mode) {
1459 link_state = pl->phy_state;
1460 phylink_apply_manual_flow(pl, &link_state);
1465 phylink_get_fixed_state(pl, &link_state);
1470 phylink_mac_pcs_get_state(pl, &link_state);
1481 phylink_mac_pcs_get_state(pl,
1488 if (pl->phydev)
1489 link_state.link &= pl->phy_state.link;
1492 if (pl->phydev && pl->phy_state.link) {
1498 pl->phy_state.interface) {
1502 link_state.interface = pl->phy_state.interface;
1507 if (pl->phy_state.rate_matching) {
1509 pl->phy_state.rate_matching;
1510 link_state.speed = pl->phy_state.speed;
1512 pl->phy_state.duplex;
1518 link_state.pause = pl->phy_state.pause;
1521 phylink_apply_manual_flow(pl, &link_state);
1527 if (link_state.interface != pl->link_config.interface) {
1532 phylink_link_down(pl);
1535 phylink_major_config(pl, false, &link_state);
1536 pl->link_config.interface = link_state.interface;
1541 pl->old_link_state = link_state.link;
1543 phylink_link_down(pl);
1545 phylink_link_up(pl, link_state);
1548 pl->mac_link_dropped = false;
1549 queue_work(system_power_efficient_wq, &pl->resolve);
1551 mutex_unlock(&pl->state_mutex);
1554 static void phylink_run_resolve(struct phylink *pl)
1556 if (!pl->phylink_disable_state)
1557 queue_work(system_power_efficient_wq, &pl->resolve);
1560 static void phylink_run_resolve_and_disable(struct phylink *pl, int bit)
1562 unsigned long state = pl->phylink_disable_state;
1564 set_bit(bit, &pl->phylink_disable_state);
1566 queue_work(system_power_efficient_wq, &pl->resolve);
1567 flush_work(&pl->resolve);
1571 static void phylink_enable_and_run_resolve(struct phylink *pl, int bit)
1573 clear_bit(bit, &pl->phylink_disable_state);
1574 phylink_run_resolve(pl);
1579 struct phylink *pl = container_of(t, struct phylink, link_poll);
1583 phylink_run_resolve(pl);
1588 static int phylink_register_sfp(struct phylink *pl,
1599 phylink_err(pl, "unable to attach SFP bus: %pe\n", bus);
1603 pl->sfp_bus = bus;
1605 ret = sfp_bus_add_upstream(bus, pl, &sfp_phylink_ops);
1633 struct phylink *pl;
1648 pl = kzalloc(sizeof(*pl), GFP_KERNEL);
1649 if (!pl)
1652 mutex_init(&pl->state_mutex);
1653 INIT_WORK(&pl->resolve, phylink_resolve);
1655 pl->config = config;
1657 pl->netdev = to_net_dev(config->dev);
1658 netif_carrier_off(pl->netdev);
1660 pl->dev = config->dev;
1662 kfree(pl);
1666 pl->using_mac_select_pcs = using_mac_select_pcs;
1667 pl->phy_state.interface = iface;
1668 pl->link_interface = iface;
1670 pl->link_port = PORT_BNC;
1672 pl->link_port = PORT_MII;
1673 pl->link_config.interface = iface;
1674 pl->link_config.pause = MLO_PAUSE_AN;
1675 pl->link_config.speed = SPEED_UNKNOWN;
1676 pl->link_config.duplex = DUPLEX_UNKNOWN;
1677 pl->pcs_state = PCS_STATE_DOWN;
1678 pl->mac_ops = mac_ops;
1679 __set_bit(PHYLINK_DISABLE_STOPPED, &pl->phylink_disable_state);
1680 timer_setup(&pl->link_poll, phylink_fixed_poll, 0);
1682 linkmode_fill(pl->supported);
1683 linkmode_copy(pl->link_config.advertising, pl->supported);
1684 phylink_validate(pl, pl->supported, &pl->link_config);
1686 ret = phylink_parse_mode(pl, fwnode);
1688 kfree(pl);
1692 if (pl->cfg_link_an_mode == MLO_AN_FIXED) {
1693 ret = phylink_parse_fixedlink(pl, fwnode);
1695 kfree(pl);
1700 pl->cur_link_an_mode = pl->cfg_link_an_mode;
1702 ret = phylink_register_sfp(pl, fwnode);
1704 kfree(pl);
1708 return pl;
1714 * @pl: a pointer to a &struct phylink returned from phylink_create()
1721 void phylink_destroy(struct phylink *pl)
1723 sfp_bus_del_upstream(pl->sfp_bus);
1724 if (pl->link_gpio)
1725 gpiod_put(pl->link_gpio);
1727 cancel_work_sync(&pl->resolve);
1728 kfree(pl);
1734 * @pl: a pointer to a &struct phylink returned from phylink_create()
1741 bool phylink_expects_phy(struct phylink *pl)
1743 if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
1744 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
1745 phy_interface_mode_is_8023z(pl->link_config.interface)))
1753 struct phylink *pl = phydev->phylink;
1758 mutex_lock(&pl->state_mutex);
1759 pl->phy_state.speed = phydev->speed;
1760 pl->phy_state.duplex = phydev->duplex;
1761 pl->phy_state.rate_matching = phydev->rate_matching;
1762 pl->phy_state.pause = MLO_PAUSE_NONE;
1764 pl->phy_state.pause |= MLO_PAUSE_TX;
1766 pl->phy_state.pause |= MLO_PAUSE_RX;
1767 pl->phy_state.interface = phydev->interface;
1768 pl->phy_state.link = up;
1769 mutex_unlock(&pl->state_mutex);
1771 phylink_run_resolve(pl);
1773 phylink_dbg(pl, "phy link %s %s/%s/%s/%s/%s\n", up ? "up" : "down",
1778 phylink_pause_to_str(pl->phy_state.pause));
1781 static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
1796 pl->config->supported_interfaces);
1799 phylink_err(pl, "PHY has no common interfaces\n");
1811 phylink_err(pl, "SFP PHY's possible interfaces becomes empty\n");
1816 phylink_dbg(pl, "PHY %s uses interfaces %*pbl, validating %*pbl\n",
1822 return phylink_validate_mask(pl, phy, supported, state,
1848 return phylink_validate(pl, supported, state);
1851 static int phylink_bringup_phy(struct phylink *pl, struct phy_device *phy,
1873 ret = phylink_validate_phy(pl, phy, supported, &config);
1875 phylink_warn(pl, "validation of %s with support %*pb and advertisement %*pb failed: %pe\n",
1883 phy->phylink = pl;
1887 phylink_info(pl,
1893 mutex_lock(&pl->state_mutex);
1894 pl->phydev = phy;
1895 pl->phy_state.interface = interface;
1896 pl->phy_state.pause = MLO_PAUSE_NONE;
1897 pl->phy_state.speed = SPEED_UNKNOWN;
1898 pl->phy_state.duplex = DUPLEX_UNKNOWN;
1899 pl->phy_state.rate_matching = RATE_MATCH_NONE;
1900 linkmode_copy(pl->supported, supported);
1901 linkmode_copy(pl->link_config.advertising, config.advertising);
1905 mutex_unlock(&pl->state_mutex);
1908 phylink_dbg(pl,
1911 __ETHTOOL_LINK_MODE_MASK_NBITS, pl->supported,
1917 if (pl->config->mac_managed_pm)
1923 static int phylink_attach_phy(struct phylink *pl, struct phy_device *phy,
1926 if (WARN_ON(pl->cfg_link_an_mode == MLO_AN_FIXED ||
1927 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
1928 phy_interface_mode_is_8023z(interface) && !pl->sfp_bus)))
1931 if (pl->phydev)
1934 return phy_attach_direct(pl->netdev, phy, 0, interface);
1939 * @pl: a pointer to a &struct phylink returned from phylink_create()
1942 * Connect @phy to the phylink instance specified by @pl by calling
1952 int phylink_connect_phy(struct phylink *pl, struct phy_device *phy)
1957 if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
1958 pl->link_interface = phy->interface;
1959 pl->link_config.interface = pl->link_interface;
1962 ret = phylink_attach_phy(pl, phy, pl->link_interface);
1966 ret = phylink_bringup_phy(pl, phy, pl->link_config.interface);
1976 * @pl: a pointer to a &struct phylink returned from phylink_create()
1981 * specified by @pl. Actions specified in phylink_connect_phy() will be
1986 int phylink_of_phy_connect(struct phylink *pl, struct device_node *dn,
1989 return phylink_fwnode_phy_connect(pl, of_fwnode_handle(dn), flags);
1995 * @pl: a pointer to a &struct phylink returned from phylink_create()
2000 * by @pl.
2004 int phylink_fwnode_phy_connect(struct phylink *pl,
2013 if (pl->cfg_link_an_mode == MLO_AN_FIXED ||
2014 (pl->cfg_link_an_mode == MLO_AN_INBAND &&
2015 phy_interface_mode_is_8023z(pl->link_interface)))
2020 if (pl->cfg_link_an_mode == MLO_AN_PHY)
2032 if (pl->link_interface == PHY_INTERFACE_MODE_NA) {
2033 pl->link_interface = phy_dev->interface;
2034 pl->link_config.interface = pl->link_interface;
2037 ret = phy_attach_direct(pl->netdev, phy_dev, flags,
2038 pl->link_interface);
2043 ret = phylink_bringup_phy(pl, phy_dev, pl->link_config.interface);
2054 * @pl: a pointer to a &struct phylink returned from phylink_create()
2056 * Disconnect any current PHY from the phylink instance described by @pl.
2058 void phylink_disconnect_phy(struct phylink *pl)
2064 phy = pl->phydev;
2067 mutex_lock(&pl->state_mutex);
2068 pl->phydev = NULL;
2069 mutex_unlock(&pl->state_mutex);
2071 flush_work(&pl->resolve);
2078 static void phylink_link_changed(struct phylink *pl, bool up, const char *what)
2081 pl->mac_link_dropped = true;
2082 phylink_run_resolve(pl);
2083 phylink_dbg(pl, "%s link %s\n", what, up ? "up" : "down");
2088 * @pl: a pointer to a &struct phylink returned from phylink_create()
2094 void phylink_mac_change(struct phylink *pl, bool up)
2096 phylink_link_changed(pl, up, "mac");
2113 struct phylink *pl = pcs->phylink;
2115 if (pl)
2116 phylink_link_changed(pl, up, "pcs");
2122 struct phylink *pl = data;
2124 phylink_run_resolve(pl);
2131 * @pl: a pointer to a &struct phylink returned from phylink_create()
2133 * Start the phylink instance specified by @pl, configuring the MAC for the
2137 void phylink_start(struct phylink *pl)
2143 phylink_info(pl, "configuring for %s/%s link mode\n",
2144 phylink_an_mode_str(pl->cur_link_an_mode),
2145 phy_modes(pl->link_config.interface));
2148 if (pl->netdev)
2149 netif_carrier_off(pl->netdev);
2151 pl->pcs_state = PCS_STATE_STARTING;
2161 phylink_mac_initial_config(pl, true);
2163 pl->pcs_state = PCS_STATE_STARTED;
2165 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_STOPPED);
2167 if (pl->cfg_link_an_mode == MLO_AN_FIXED && pl->link_gpio) {
2168 int irq = gpiod_to_irq(pl->link_gpio);
2174 "netdev link", pl))
2175 pl->link_irq = irq;
2183 if (pl->cfg_link_an_mode == MLO_AN_FIXED)
2184 poll |= pl->config->poll_fixed_state;
2187 mod_timer(&pl->link_poll, jiffies + HZ);
2188 if (pl->phydev)
2189 phy_start(pl->phydev);
2190 if (pl->sfp_bus)
2191 sfp_upstream_start(pl->sfp_bus);
2197 * @pl: a pointer to a &struct phylink returned from phylink_create()
2199 * Stop the phylink instance specified by @pl. This should be called from the
2207 void phylink_stop(struct phylink *pl)
2211 if (pl->sfp_bus)
2212 sfp_upstream_stop(pl->sfp_bus);
2213 if (pl->phydev)
2214 phy_stop(pl->phydev);
2215 del_timer_sync(&pl->link_poll);
2216 if (pl->link_irq) {
2217 free_irq(pl->link_irq, pl);
2218 pl->link_irq = 0;
2221 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_STOPPED);
2223 pl->pcs_state = PCS_STATE_DOWN;
2225 phylink_pcs_disable(pl->pcs);
2231 * @pl: a pointer to a &struct phylink returned from phylink_create()
2243 void phylink_suspend(struct phylink *pl, bool mac_wol)
2247 if (mac_wol && (!pl->netdev || pl->netdev->wol_enabled)) {
2249 mutex_lock(&pl->state_mutex);
2252 __set_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state);
2258 if (pl->netdev)
2259 netif_carrier_off(pl->netdev);
2261 pl->old_link_state = false;
2266 mutex_unlock(&pl->state_mutex);
2268 phylink_stop(pl);
2275 * @pl: a pointer to a &struct phylink returned from phylink_create()
2280 void phylink_resume(struct phylink *pl)
2284 if (test_bit(PHYLINK_DISABLE_MAC_WOL, &pl->phylink_disable_state)) {
2293 mutex_lock(&pl->state_mutex);
2294 phylink_link_down(pl);
2295 mutex_unlock(&pl->state_mutex);
2300 phylink_mac_initial_config(pl, true);
2303 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_MAC_WOL);
2305 phylink_start(pl);
2312 * @pl: a pointer to a &struct phylink returned from phylink_create()
2316 * instance specified by @pl. If no PHY is currently attached, report no
2319 void phylink_ethtool_get_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
2326 if (pl->phydev)
2327 phy_ethtool_get_wol(pl->phydev, wol);
2333 * @pl: a pointer to a &struct phylink returned from phylink_create()
2337 * instance specified by @pl. If no PHY is attached, returns %EOPNOTSUPP
2342 int phylink_ethtool_set_wol(struct phylink *pl, struct ethtool_wolinfo *wol)
2348 if (pl->phydev)
2349 ret = phy_ethtool_set_wol(pl->phydev, wol);
2382 * @pl: a pointer to a &struct phylink returned from phylink_create()
2385 * Read the current link settings for the phylink instance specified by @pl.
2389 int phylink_ethtool_ksettings_get(struct phylink *pl,
2396 if (pl->phydev)
2397 phy_ethtool_ksettings_get(pl->phydev, kset);
2399 kset->base.port = pl->link_port;
2401 linkmode_copy(kset->link_modes.supported, pl->supported);
2403 switch (pl->cur_link_an_mode) {
2409 phylink_get_fixed_state(pl, &link_state);
2417 if (pl->phydev)
2420 phylink_mac_pcs_get_state(pl, &link_state);
2436 * @pl: a pointer to a &struct phylink returned from phylink_create()
2439 int phylink_ethtool_ksettings_set(struct phylink *pl,
2448 if (pl->phydev) {
2453 pl->supported);
2456 * to update the pl->link_config settings:
2473 return phy_ethtool_ksettings_set(pl->phydev, &phy_kset);
2476 config = pl->link_config;
2479 pl->supported);
2488 pl->supported, false);
2495 if (pl->cur_link_an_mode == MLO_AN_FIXED) {
2496 if (s->speed != pl->link_config.speed ||
2497 s->duplex != pl->link_config.duplex)
2511 if (pl->cur_link_an_mode == MLO_AN_FIXED) {
2513 pl->link_config.advertising))
2536 if (pl->sfp_bus) {
2537 config.interface = sfp_select_interface(pl->sfp_bus,
2540 phylink_err(pl,
2548 linkmode_copy(support, pl->supported);
2549 if (phylink_validate(pl, support, &config)) {
2550 phylink_err(pl, "validation of %s/%s with support %*pb failed\n",
2551 phylink_an_mode_str(pl->cur_link_an_mode),
2558 linkmode_copy(support, pl->supported);
2559 if (phylink_validate(pl, support, &config))
2569 mutex_lock(&pl->state_mutex);
2570 pl->link_config.speed = config.speed;
2571 pl->link_config.duplex = config.duplex;
2573 if (pl->link_config.interface != config.interface) {
2576 if (pl->old_link_state) {
2577 phylink_link_down(pl);
2578 pl->old_link_state = false;
2581 &pl->phylink_disable_state))
2582 phylink_major_config(pl, false, &config);
2583 pl->link_config.interface = config.interface;
2584 linkmode_copy(pl->link_config.advertising, config.advertising);
2585 } else if (!linkmode_equal(pl->link_config.advertising,
2587 linkmode_copy(pl->link_config.advertising, config.advertising);
2588 phylink_change_inband_advert(pl);
2590 mutex_unlock(&pl->state_mutex);
2598 * @pl: a pointer to a &struct phylink returned from phylink_create()
2600 * Restart negotiation for the phylink instance specified by @pl. This will
2607 int phylink_ethtool_nway_reset(struct phylink *pl)
2613 if (pl->phydev)
2614 ret = phy_restart_aneg(pl->phydev);
2615 phylink_pcs_an_restart(pl);
2623 * @pl: a pointer to a &struct phylink returned from phylink_create()
2626 void phylink_ethtool_get_pauseparam(struct phylink *pl,
2631 pause->autoneg = !!(pl->link_config.pause & MLO_PAUSE_AN);
2632 pause->rx_pause = !!(pl->link_config.pause & MLO_PAUSE_RX);
2633 pause->tx_pause = !!(pl->link_config.pause & MLO_PAUSE_TX);
2639 * @pl: a pointer to a &struct phylink returned from phylink_create()
2642 int phylink_ethtool_set_pauseparam(struct phylink *pl,
2645 struct phylink_link_state *config = &pl->link_config;
2651 if (pl->cur_link_an_mode == MLO_AN_FIXED)
2654 if (!phylink_test(pl->supported, Pause) &&
2655 !phylink_test(pl->supported, Asym_Pause))
2658 if (!phylink_test(pl->supported, Asym_Pause) &&
2670 mutex_lock(&pl->state_mutex);
2696 if (!pl->phydev)
2697 phylink_change_inband_advert(pl);
2699 mutex_unlock(&pl->state_mutex);
2706 if (pl->phydev)
2707 phy_set_asym_pause(pl->phydev, pause->rx_pause,
2715 pl->mac_link_dropped = true;
2716 phylink_run_resolve(pl);
2726 * @pl: a pointer to a &struct phylink returned from phylink_create().
2729 * with the phylink instance specified by @pl.
2733 int phylink_get_eee_err(struct phylink *pl)
2739 if (pl->phydev)
2740 ret = phy_get_eee_err(pl->phydev);
2748 * @pl: a pointer to a &struct phylink returned from phylink_create()
2753 int phylink_init_eee(struct phylink *pl, bool clk_stop_enable)
2757 if (pl->phydev)
2758 ret = phy_init_eee(pl->phydev, clk_stop_enable);
2766 * @pl: a pointer to a &struct phylink returned from phylink_create()
2769 int phylink_ethtool_get_eee(struct phylink *pl, struct ethtool_keee *eee)
2775 if (pl->phydev)
2776 ret = phy_ethtool_get_eee(pl->phydev, eee);
2784 * @pl: a pointer to a &struct phylink returned from phylink_create()
2787 int phylink_ethtool_set_eee(struct phylink *pl, struct ethtool_keee *eee)
2793 if (pl->phydev)
2794 ret = phy_ethtool_set_eee(pl->phydev, eee);
2826 static int phylink_phy_read(struct phylink *pl, unsigned int phy_id,
2829 struct phy_device *phydev = pl->phydev;
2835 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad,
2861 return mdiobus_c45_read(pl->phydev->mdio.bus, prtad, devad,
2865 return mdiobus_read(pl->phydev->mdio.bus, phy_id, reg);
2868 static int phylink_phy_write(struct phylink *pl, unsigned int phy_id,
2871 struct phy_device *phydev = pl->phydev;
2877 return mdiobus_c45_write(pl->phydev->mdio.bus, prtad, devad,
2902 return mdiobus_c45_write(pl->phydev->mdio.bus, phy_id, devad,
2909 static int phylink_mii_read(struct phylink *pl, unsigned int phy_id,
2915 switch (pl->cur_link_an_mode) {
2918 phylink_get_fixed_state(pl, &state);
2928 phylink_mac_pcs_get_state(pl, &state);
2937 static int phylink_mii_write(struct phylink *pl, unsigned int phy_id,
2940 switch (pl->cur_link_an_mode) {
2956 * @pl: a pointer to a &struct phylink returned from phylink_create()
2961 * specified by @pl. If no PHY is attached, emulate the presence of the PHY.
2972 int phylink_mii_ioctl(struct phylink *pl, struct ifreq *ifr, int cmd)
2979 if (pl->phydev) {
2983 mii->phy_id = pl->phydev->mdio.addr;
2987 ret = phylink_phy_read(pl, mii->phy_id, mii->reg_num);
2995 ret = phylink_phy_write(pl, mii->phy_id, mii->reg_num,
3000 ret = phy_mii_ioctl(pl->phydev, ifr, cmd);
3010 ret = phylink_mii_read(pl, mii->phy_id, mii->reg_num);
3018 ret = phylink_mii_write(pl, mii->phy_id, mii->reg_num,
3035 * @pl: a pointer to a &struct phylink returned from phylink_create()
3044 int phylink_speed_down(struct phylink *pl, bool sync)
3050 if (!pl->sfp_bus && pl->phydev)
3051 ret = phy_speed_down(pl->phydev, sync);
3060 * @pl: a pointer to a &struct phylink returned from phylink_create()
3067 int phylink_speed_up(struct phylink *pl)
3073 if (!pl->sfp_bus && pl->phydev)
3074 ret = phy_speed_up(pl->phydev);
3082 struct phylink *pl = upstream;
3084 pl->netdev->sfp_bus = bus;
3089 struct phylink *pl = upstream;
3091 pl->netdev->sfp_bus = NULL;
3094 static phy_interface_t phylink_choose_sfp_interface(struct phylink *pl,
3110 static void phylink_sfp_set_config(struct phylink *pl, u8 mode,
3116 phylink_dbg(pl, "requesting link mode %s/%s with support %*pb\n",
3120 if (!linkmode_equal(pl->supported, supported)) {
3121 linkmode_copy(pl->supported, supported);
3125 if (!linkmode_equal(pl->link_config.advertising, state->advertising)) {
3126 linkmode_copy(pl->link_config.advertising, state->advertising);
3130 if (pl->cur_link_an_mode != mode ||
3131 pl->link_config.interface != state->interface) {
3132 pl->cur_link_an_mode = mode;
3133 pl->link_config.interface = state->interface;
3137 phylink_info(pl, "switched to %s/%s link mode\n",
3143 &pl->phylink_disable_state))
3144 phylink_mac_initial_config(pl, false);
3147 static int phylink_sfp_config_phy(struct phylink *pl, u8 mode,
3166 ret = phylink_validate(pl, support, &config);
3168 phylink_err(pl, "validation with support %*pb failed: %pe\n",
3174 iface = sfp_select_interface(pl->sfp_bus, config.advertising);
3176 phylink_err(pl,
3184 ret = phylink_validate(pl, support1, &config);
3186 phylink_err(pl,
3195 pl->link_port = pl->sfp_port;
3197 phylink_sfp_set_config(pl, mode, support, &config);
3202 static int phylink_sfp_config_optical(struct phylink *pl)
3210 phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
3212 pl->config->supported_interfaces,
3214 pl->sfp_interfaces);
3219 phy_interface_and(interfaces, pl->config->supported_interfaces,
3220 pl->sfp_interfaces);
3222 phylink_err(pl, "unsupported SFP module: no common interface modes\n");
3227 linkmode_copy(support, pl->sfp_support);
3228 linkmode_copy(config.advertising, pl->sfp_support);
3236 ret = phylink_validate_mask(pl, NULL, pl->sfp_support, &config,
3239 phylink_err(pl, "unsupported SFP module: validation with support %*pb failed\n",
3244 interface = phylink_choose_sfp_interface(pl, interfaces);
3246 phylink_err(pl, "failed to select SFP interface\n");
3250 phylink_dbg(pl, "optical SFP: chosen %s interface\n",
3256 ret = phylink_validate(pl, support, &config);
3258 phylink_err(pl, "validation with support %*pb failed: %pe\n",
3264 pl->link_port = pl->sfp_port;
3266 phylink_sfp_set_config(pl, MLO_AN_INBAND, pl->sfp_support, &config);
3274 struct phylink *pl = upstream;
3278 linkmode_zero(pl->sfp_support);
3279 phy_interface_zero(pl->sfp_interfaces);
3280 sfp_parse_support(pl->sfp_bus, id, pl->sfp_support, pl->sfp_interfaces);
3281 pl->sfp_port = sfp_parse_port(pl->sfp_bus, id, pl->sfp_support);
3284 pl->sfp_may_have_phy = sfp_may_have_phy(pl->sfp_bus, id);
3285 if (pl->sfp_may_have_phy)
3288 return phylink_sfp_config_optical(pl);
3293 struct phylink *pl = upstream;
3296 if (pl->phydev) {
3297 phy_start(pl->phydev);
3304 if (!pl->sfp_may_have_phy)
3307 return phylink_sfp_config_optical(pl);
3312 struct phylink *pl = upstream;
3315 if (pl->phydev)
3316 phy_stop(pl->phydev);
3321 struct phylink *pl = upstream;
3325 phylink_run_resolve_and_disable(pl, PHYLINK_DISABLE_LINK);
3330 struct phylink *pl = upstream;
3334 phylink_enable_and_run_resolve(pl, PHYLINK_DISABLE_LINK);
3348 struct phylink *pl = upstream;
3369 pl->config->supported_interfaces);
3372 ret = phylink_sfp_config_phy(pl, mode, phy);
3376 interface = pl->link_config.interface;
3377 ret = phylink_attach_phy(pl, phy, interface);
3381 ret = phylink_bringup_phy(pl, phy, interface);