r8152: support setting rx coalesce
authorhayeswang <hayeswang@realtek.com>
Thu, 12 Feb 2015 06:33:48 +0000 (14:33 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Feb 2015 20:08:43 +0000 (15:08 -0500)
Support setting the rx coalesce. Then someone could change the rx
agg timeout value through ethtool.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/r8152.c

index 5a3a689b3a60009961a58853ffeb29fa57df56b5..5065538dd03bd35497365b2d504fa640cfd684ec 100644 (file)
@@ -3713,6 +3713,61 @@ out:
        return ret;
 }
 
+static int rtl8152_get_coalesce(struct net_device *netdev,
+                               struct ethtool_coalesce *coalesce)
+{
+       struct r8152 *tp = netdev_priv(netdev);
+
+       switch (tp->version) {
+       case RTL_VER_01:
+       case RTL_VER_02:
+               return -EOPNOTSUPP;
+       default:
+               break;
+       }
+
+       coalesce->rx_coalesce_usecs = tp->coalesce;
+
+       return 0;
+}
+
+static int rtl8152_set_coalesce(struct net_device *netdev,
+                               struct ethtool_coalesce *coalesce)
+{
+       struct r8152 *tp = netdev_priv(netdev);
+       int ret;
+
+       switch (tp->version) {
+       case RTL_VER_01:
+       case RTL_VER_02:
+               return -EOPNOTSUPP;
+       default:
+               break;
+       }
+
+       if (coalesce->rx_coalesce_usecs > COALESCE_SLOW)
+               return -EINVAL;
+
+       ret = usb_autopm_get_interface(tp->intf);
+       if (ret < 0)
+               return ret;
+
+       mutex_lock(&tp->control);
+
+       if (tp->coalesce != coalesce->rx_coalesce_usecs) {
+               tp->coalesce = coalesce->rx_coalesce_usecs;
+
+               if (netif_running(tp->netdev) && netif_carrier_ok(netdev))
+                       r8153_set_rx_early_timeout(tp);
+       }
+
+       mutex_unlock(&tp->control);
+
+       usb_autopm_put_interface(tp->intf);
+
+       return ret;
+}
+
 static struct ethtool_ops ops = {
        .get_drvinfo = rtl8152_get_drvinfo,
        .get_settings = rtl8152_get_settings,
@@ -3726,6 +3781,8 @@ static struct ethtool_ops ops = {
        .get_strings = rtl8152_get_strings,
        .get_sset_count = rtl8152_get_sset_count,
        .get_ethtool_stats = rtl8152_get_ethtool_stats,
+       .get_coalesce = rtl8152_get_coalesce,
+       .set_coalesce = rtl8152_set_coalesce,
        .get_eee = rtl_ethtool_get_eee,
        .set_eee = rtl_ethtool_set_eee,
 };