r8169: add support for pause ethtool ops
authorHeiner Kallweit <hkallweit1@gmail.com>
Wed, 14 Apr 2021 06:23:15 +0000 (08:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Apr 2021 20:04:28 +0000 (13:04 -0700)
This adds support for the [g|s]et_pauseparam ethtool ops. It considers
that the chip doesn't support pause frame use in jumbo mode.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/realtek/r8169_main.c

index 85031b4..9856773 100644 (file)
@@ -1910,6 +1910,32 @@ static void rtl8169_get_ringparam(struct net_device *dev,
        data->tx_pending = NUM_TX_DESC;
 }
 
+static void rtl8169_get_pauseparam(struct net_device *dev,
+                                  struct ethtool_pauseparam *data)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+       bool tx_pause, rx_pause;
+
+       phy_get_pause(tp->phydev, &tx_pause, &rx_pause);
+
+       data->autoneg = tp->phydev->autoneg;
+       data->tx_pause = tx_pause ? 1 : 0;
+       data->rx_pause = rx_pause ? 1 : 0;
+}
+
+static int rtl8169_set_pauseparam(struct net_device *dev,
+                                 struct ethtool_pauseparam *data)
+{
+       struct rtl8169_private *tp = netdev_priv(dev);
+
+       if (dev->mtu > ETH_DATA_LEN)
+               return -EOPNOTSUPP;
+
+       phy_set_asym_pause(tp->phydev, data->rx_pause, data->tx_pause);
+
+       return 0;
+}
+
 static const struct ethtool_ops rtl8169_ethtool_ops = {
        .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
                                     ETHTOOL_COALESCE_MAX_FRAMES,
@@ -1931,6 +1957,8 @@ static const struct ethtool_ops rtl8169_ethtool_ops = {
        .get_link_ksettings     = phy_ethtool_get_link_ksettings,
        .set_link_ksettings     = phy_ethtool_set_link_ksettings,
        .get_ringparam          = rtl8169_get_ringparam,
+       .get_pauseparam         = rtl8169_get_pauseparam,
+       .set_pauseparam         = rtl8169_set_pauseparam,
 };
 
 static void rtl_enable_eee(struct rtl8169_private *tp)