[PATCH net-next v2 04/12] ax88179_178a: Add EEE HW configuration support for AX88179A
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
The AX88179A uses a much simpler HW configuration for EEE via a single EEE configuration register. Add support for this register and replace the EEE enable/disable functions with a single EEE configuration function which enables/disables EEE in the hardware. Signed-off-by: Birger Koblitz <redacted> --- drivers/net/usb/ax88179_178a.c | 71 +++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 39 deletions(-)
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index c483b7b636e37d45455d46e1b0354fd63e0ef100..c2ebc8ae8d4ce72cbd04c2c16b9940416e9f427b 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c@@ -35,6 +35,7 @@ #define AX_RELOAD_EEPROM_EFUSE 0x06 #define AX88179A_WAKEUP_SETTING 0x07 #define AX_FW_MODE 0x08 +#define AX_GPHY_CTL 0x0F #define AX88179A_FLASH_READ 0x21 #define AX88179A_FLASH_WRITE 0x24 #define AX88179A_PHY_CLAUSE45 0x27
@@ -125,6 +126,9 @@ #define AX88179A_VLAN_ID_DATA1 0x2D #define AX_RX_BULKIN_QCTRL 0x2e + +#define AX_GPHY_EEE_CTRL 0x01 + #define AX_CLK_SELECT 0x33 #define AX_CLK_SELECT_BCS 0x01 #define AX_CLK_SELECT_ACS 0x02
@@ -995,46 +999,35 @@ static int ax88179_chk_eee(struct usbnet *dev) return false; } -static void ax88179_disable_eee(struct usbnet *dev) -{ - u16 tmp16; - - tmp16 = GMII_PHY_PGSEL_PAGE3; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PAGE_SELECT, 2, &tmp16); - - tmp16 = 0x3246; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - MII_PHYADDR, 2, &tmp16); - - tmp16 = GMII_PHY_PGSEL_PAGE0; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PAGE_SELECT, 2, &tmp16); -} - -static void ax88179_enable_eee(struct usbnet *dev) +static void ax88179_eee_config(struct usbnet *dev, bool enable) { + struct ax88179_data *priv = dev->driver_priv; u16 tmp16; - tmp16 = GMII_PHY_PGSEL_PAGE3; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PAGE_SELECT, 2, &tmp16); - - tmp16 = 0x3247; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - MII_PHYADDR, 2, &tmp16); - - tmp16 = GMII_PHY_PGSEL_PAGE5; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PAGE_SELECT, 2, &tmp16); - - tmp16 = 0x0680; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - MII_BMSR, 2, &tmp16); + if (priv->chip_version < AX_VERSION_AX88179A) { + tmp16 = GMII_PHY_PGSEL_PAGE3; + ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, + GMII_PHY_PAGE_SELECT, 2, &tmp16); + + tmp16 = enable ? 0x3247 : 0x3246; + ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, + MII_PHYADDR, 2, &tmp16); + if (enable) { + tmp16 = GMII_PHY_PGSEL_PAGE5; + ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, + GMII_PHY_PAGE_SELECT, 2, &tmp16); + + tmp16 = 0x0680; + ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, + MII_BMSR, 2, &tmp16); + } - tmp16 = GMII_PHY_PGSEL_PAGE0; - ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, - GMII_PHY_PAGE_SELECT, 2, &tmp16); + tmp16 = GMII_PHY_PGSEL_PAGE0; + ax88179_write_cmd(dev, AX_ACCESS_PHY, AX88179_PHY_ID, + GMII_PHY_PAGE_SELECT, 2, &tmp16); + } else { + ax88179_write_cmd(dev, AX_GPHY_CTL, AX_GPHY_EEE_CTRL, enable, 0, NULL); + } } static int ax88179_get_eee(struct net_device *net, struct ethtool_keee *edata)
@@ -1056,13 +1049,13 @@ static int ax88179_set_eee(struct net_device *net, struct ethtool_keee *edata) priv->eee_enabled = edata->eee_enabled; if (!priv->eee_enabled) { - ax88179_disable_eee(dev); + ax88179_eee_config(dev, false); } else { priv->eee_enabled = ax88179_chk_eee(dev); if (!priv->eee_enabled) return -EOPNOTSUPP; - ax88179_enable_eee(dev); + ax88179_eee_config(dev, true); } ret = ax88179_ethtool_set_eee(dev, edata);
@@ -2490,7 +2483,7 @@ static int ax88179_reset(struct usbnet *dev) ax179_data->eee_enabled = 0; ax179_data->eee_active = 0; - ax88179_disable_eee(dev); + ax88179_eee_config(dev, false); ax88179_ethtool_get_eee(dev, &eee_data); linkmode_zero(eee_data.advertised);
--
2.47.3