The AX179A-based chips support pause parameter configuration.
Make it available through ethtool ops.
Signed-off-by: Birger Koblitz <redacted>
---
drivers/net/usb/ax88179_178a.c | 48 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+)
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index 5f3a6d85cc4054e43e085531fcd715a990d87c6a..925b66f8b8fff10578056bb13e15dc4ba0f88ecc 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -973,6 +973,52 @@ static int ax88179_set_link_ksettings(struct net_device *net,
return mii_ethtool_set_link_ksettings(&dev->mii, cmd);
}
+static void ax88179a_get_pauseparam(struct net_device *net, struct ethtool_pauseparam *pause)
+{
+ struct usbnet *dev = netdev_priv(net);
+ struct ax88179_data *data;
+
+ data = dev->driver_priv;
+ pause->autoneg = data->pause_autoneg;
+ pause->tx_pause = data->pause_tx;
+ pause->rx_pause = data->pause_rx;
+}
+
+static int ax88179a_set_pauseparam(struct net_device *net, struct ethtool_pauseparam *pause)
+{
+ struct usbnet *dev = netdev_priv(net);
+ struct ax88179_data *data;
+ u16 old, new, bmcr;
+ u8 cap = 0;
+
+ data = dev->driver_priv;
+
+ if (data->chip_version < AX_VERSION_AX88179A)
+ return -EOPNOTSUPP;
+
+ bmcr = ax88179_mdio_read(net, dev->mii.phy_id, MII_BMCR);
+ if (pause->autoneg && !(bmcr & BMCR_ANENABLE))
+ return -EINVAL;
+
+ data->pause_autoneg = pause->autoneg;
+ data->pause_tx = pause->tx_pause;
+ data->pause_rx = pause->rx_pause;
+
+ if (pause->rx_pause)
+ cap |= FLOW_CTRL_RX;
+
+ if (pause->tx_pause)
+ cap |= FLOW_CTRL_TX;
+
+ old = ax88179_mdio_read(net, dev->mii.phy_id, MII_ADVERTISE);
+ new = (old & ~(ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM)) |
+ mii_advertise_flowctrl(cap);
+ if (old != new)
+ ax88179_mdio_write(net, dev->mii.phy_id, MII_ADVERTISE, new);
+
+ return mii_nway_restart(&dev->mii);
+}
+
static int
ax88179_ethtool_get_eee(struct usbnet *dev, struct ethtool_keee *data)
{@@ -1144,6 +1190,8 @@ static const struct ethtool_ops ax88179_ethtool_ops = {
.nway_reset = usbnet_nway_reset,
.get_link_ksettings = ax88179_get_link_ksettings,
.set_link_ksettings = ax88179_set_link_ksettings,
+ .get_pauseparam = ax88179a_get_pauseparam,
+ .set_pauseparam = ax88179a_set_pauseparam,
.get_ts_info = ethtool_op_get_ts_info,
};
--
2.47.3