[PATCH net-next v3 06/13] ax88179_178a: EEE setup for AX88179A-based chips
From: Birger Koblitz
Date: Fri Jul 24 2026 - 03:42:27 EST
Add EEE setup for AX88179A-based chips. For these
chips we enable EEE by default. Adapt the ax88179_chk_eee()
EEE status verification function to also support AX88179A-based
chips in order to make sure the initial setup leads to
a correctly identified EEE status.
Signed-off-by: Birger Koblitz <mail@xxxxxxxxxxxxxxxxx>
---
drivers/net/usb/ax88179_178a.c | 60 +++++++++++++++++++++++++++++-------------
1 file changed, 42 insertions(+), 18 deletions(-)
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 136d1d39bf78658758d35372d4a9486e21befd87..8ea16d1231037832e12f74e2c5304ee4b7a54389 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -999,7 +999,17 @@ static int ax88179_set_link_ksettings(struct net_device *net,
static int
ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_keee *data)
{
- int val;
+ struct ax88179_data *ax179_data = dev->driver_priv;
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(mask) = {};
+ int val, ret;
+
+ if (ax179_data->phylink) {
+ ret = phylink_ethtool_get_eee(ax179_data->phylink, data);
+ /* AX88279 MAC does not support 2500Mbit EEE */
+ linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, mask);
+ linkmode_andnot(data->supported, data->supported, mask);
+ return ret;
+ }
/* Get Supported EEE */
val = ax_read_mmd(dev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE);
@@ -1025,9 +1035,14 @@ ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_keee *data)
static int
ax88179_ethtool_set_eee(struct usbnet *dev, struct ethtool_keee *data)
{
- u16 tmp16 = linkmode_to_mii_eee_cap1_t(data->advertised);
+ struct ax88179_data *priv = dev->driver_priv;
+ u16 tmp16;
- return ax_write_mmd(dev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, tmp16);
+ if (priv->phylink)
+ return phylink_ethtool_set_eee(priv->phylink, data);
+
+ tmp16 = linkmode_to_mii_eee_cap2_t(data->advertised);
+ return ax_write_mmd(dev, MDIO_MMD_AN, MDIO_AN_EEE_ADV2, tmp16);
}
static int ax88179_chk_eee(struct usbnet *dev)
@@ -1037,6 +1052,7 @@ static int ax88179_chk_eee(struct usbnet *dev)
mii_ethtool_gset(&dev->mii, &ecmd);
+ priv->eee_active = 0;
if (ecmd.duplex & DUPLEX_FULL) {
int eee_lp, eee_cap, eee_adv;
u32 lp, cap, adv, supported = 0;
@@ -1054,10 +1070,8 @@ static int ax88179_chk_eee(struct usbnet *dev)
return true;
eee_adv = ax_read_mmd(dev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
- if (eee_adv < 0) {
- priv->eee_active = 0;
- return false;
- }
+ if (eee_adv < 0)
+ return true;
adv = mmd_eee_adv_to_ethtool_adv_t(eee_adv);
lp = mmd_eee_adv_to_ethtool_adv_t(eee_lp);
@@ -1065,16 +1079,13 @@ static int ax88179_chk_eee(struct usbnet *dev)
SUPPORTED_1000baseT_Full :
SUPPORTED_100baseT_Full;
- if (!(lp & adv & supported)) {
- priv->eee_active = 0;
- return false;
- }
+ if (!(lp & adv & supported))
+ return true;
priv->eee_active = 1;
return true;
}
- priv->eee_active = 0;
return false;
}
@@ -2667,14 +2678,27 @@ static int ax88179_reset(struct usbnet *dev)
ax179_data->eee_enabled = 0;
ax179_data->eee_active = 0;
- ax88179_eee_config(dev, false);
+ if (ax179_data->chip_version < AX_VERSION_AX88179A) {
+ ax88179_eee_config(dev, false);
- ax88179_ethtool_get_eee(dev, &eee_data);
- linkmode_zero(eee_data.advertised);
- ax88179_ethtool_set_eee(dev, &eee_data);
+ ax88179_ethtool_get_eee(dev, &eee_data);
+ linkmode_zero(eee_data.advertised);
+ ax88179_ethtool_set_eee(dev, &eee_data);
+ } else {
+ ax88179_eee_config(dev, true);
+ ax88179_ethtool_get_eee(dev, &eee_data);
+ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, eee_data.advertised);
+ if (ax179_data->chip_version >= AX_VERSION_AX88279)
+ linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, eee_data.advertised);
+ ax88179_ethtool_set_eee(dev, &eee_data);
+ }
- /* Restart autoneg */
- mii_nway_restart(&dev->mii);
+ if (ax179_data->phylink) {
+ phylink_start(ax179_data->phylink);
+ } else {
+ /* Restart autoneg */
+ mii_nway_restart(&dev->mii);
+ }
usbnet_link_change(dev, 0, 0);
--
2.47.3