[PATCH net-next v2 05/12] ax88179_178a: Add support for 2500 link speed of AX88279

From: Birger Koblitz

Date: Wed Jul 08 2026 - 14:44:23 EST


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 <mail@xxxxxxxxxxxxxxxxx>
---
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