[PATCH net-next v2 06/12] ax88179_178a: EEE setup for AX88179A-based chips
From: Birger Koblitz
Date: Wed Jul 08 2026 - 14:44:15 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 | 42 ++++++++++++++++++++++++++++--------------
1 file changed, 28 insertions(+), 14 deletions(-)
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 7d1d75d570a3de013b5eda11e0ce0eac988eab49..94820dd1e7e4cbbcd2028783288615eef79b16e2 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -972,6 +972,7 @@ static int ax88179_set_link_ksettings(struct net_device *net,
static int
ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_keee *data)
{
+ struct ax88179_data *priv = dev->driver_priv;
int val;
/* Get Supported EEE */
@@ -992,6 +993,13 @@ ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_keee *data)
return val;
mii_eee_cap1_mod_linkmode_t(data->lp_advertised, val);
+ if (priv->chip_version >= AX_VERSION_AX88279) {
+ val = ax_read_mmd(dev, MDIO_MMD_AN, MDIO_AN_EEE_LPABLE2);
+ if (val < 0)
+ return val;
+ mii_eee_cap2_mod_linkmode_adv_t(data->lp_advertised, val);
+ }
+
return 0;
}
@@ -1010,7 +1018,9 @@ static int ax88179_chk_eee(struct usbnet *dev)
mii_ethtool_gset(&dev->mii, &ecmd);
- if (ecmd.duplex & DUPLEX_FULL) {
+ priv->eee_active = 0;
+ if ((priv->chip_version < AX_VERSION_AX88279 && (ecmd.duplex & DUPLEX_FULL)) ||
+ (ecmd.speed == SPEED_1000 && (ecmd.duplex & DUPLEX_FULL))) {
int eee_lp, eee_cap, eee_adv;
u32 lp, cap, adv, supported = 0;
@@ -1027,10 +1037,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);
@@ -1038,16 +1046,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;
}
@@ -2535,11 +2540,20 @@ 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);
--
2.47.3