[PATCH net-next v2 05/12] ax88179_178a: Add support for 2500 link speed of AX88279
From: Birger Koblitz <hidden>
Date: 2026-07-08 18:40:12
Also in:
linux-usb, lkml
Subsystem:
networking drivers, the rest, usb networking drivers · Maintainers:
Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Tha AX88279 support a link speed of 2500Mbit/s. Add support for configuring this link speed in the ethtool link status getter/setter functions. Signed-off-by: Birger Koblitz <redacted> --- drivers/net/usb/ax88179_178a.c | 52 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+)
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index c2ebc8ae8d4ce72cbd04c2c16b9940416e9f427b..7d1d75d570a3de013b5eda11e0ce0eac988eab49 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c@@ -904,9 +904,36 @@ static int ax88179_get_link_ksettings(struct net_device *net, struct ethtool_link_ksettings *cmd) { struct usbnet *dev = netdev_priv(net); + struct ax88179_data *data; + int v; + + data = dev->driver_priv; mii_ethtool_get_link_ksettings(&dev->mii, cmd); + if (data->chip_version >= AX_VERSION_AX88279) { + linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.supported); + + v = ax88179_mdio_read(dev->net, dev->mii.phy_id, MII_ADVERTISE); + if (v >= 0 && v & AX_ADVERTISE_2500) + linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.advertising); + + v = ax_read_mmd(dev, MDIO_MMD_AN, MDIO_AN_10GBT_STAT); + if (data->speed == ETHER_LINK_2500) { + cmd->base.speed = SPEED_2500; + /* MDIO_AN_10GBT_STAT_LP2_5G is broken, but we can deduce that + * the link-partner advertised 2500M if remotely AN succceded + * for link speed > 1000M and we locally have a link speed of + * 2500M + */ + if (v >= 0 && v & MDIO_AN_10GBT_STAT_REMOK) + linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.lp_advertising); + } + } + return 0; }
@@ -914,6 +941,31 @@ static int ax88179_set_link_ksettings(struct net_device *net, const struct ethtool_link_ksettings *cmd) { struct usbnet *dev = netdev_priv(net); + struct ax88179_data *data; + int v; + + data = dev->driver_priv; + + /* mii_ethtool_set_link_ksettings handles unknown bits in MII_ADVERTISE + * transparently, so for the 2.5GBit link speed of the AX_VERSION_AX88279 + * we just set up AX_ADVERTISE_2500 before calling mii_ethtool_set_link_ksettings + * at least for speeds < 2500 + */ + if (data->chip_version == AX_VERSION_AX88279) { + v = ax88179_mdio_read(net, dev->mii.phy_id, MII_ADVERTISE); + if (v < 0) + return v; + + if (linkmode_test_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, + cmd->link_modes.advertising)) + v |= AX_ADVERTISE_2500; + else + v &= ~AX_ADVERTISE_2500; + ax88179_mdio_write(net, dev->mii.phy_id, MII_ADVERTISE, v); + if (cmd->base.speed == SPEED_2500) + return mii_nway_restart(&dev->mii); + } + return mii_ethtool_set_link_ksettings(&dev->mii, cmd); }
--
2.47.3