aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_ethtool.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
index d10b4ec68d28..40e858492f90 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
@@ -49,6 +49,25 @@ static u32 ipoib_get_rx_csum(struct net_device *dev)
49 !test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags); 49 !test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
50} 50}
51 51
52static int ipoib_set_tso(struct net_device *dev, u32 data)
53{
54 struct ipoib_dev_priv *priv = netdev_priv(dev);
55
56 if (data) {
57 if (!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) &&
58 (dev->features & NETIF_F_SG) &&
59 (priv->hca_caps & IB_DEVICE_UD_TSO)) {
60 dev->features |= NETIF_F_TSO;
61 } else {
62 ipoib_warn(priv, "can't set TSO on\n");
63 return -EOPNOTSUPP;
64 }
65 } else
66 dev->features &= ~NETIF_F_TSO;
67
68 return 0;
69}
70
52static int ipoib_get_coalesce(struct net_device *dev, 71static int ipoib_get_coalesce(struct net_device *dev,
53 struct ethtool_coalesce *coal) 72 struct ethtool_coalesce *coal)
54{ 73{
@@ -131,6 +150,7 @@ static void ipoib_get_ethtool_stats(struct net_device *dev,
131static const struct ethtool_ops ipoib_ethtool_ops = { 150static const struct ethtool_ops ipoib_ethtool_ops = {
132 .get_drvinfo = ipoib_get_drvinfo, 151 .get_drvinfo = ipoib_get_drvinfo,
133 .get_rx_csum = ipoib_get_rx_csum, 152 .get_rx_csum = ipoib_get_rx_csum,
153 .set_tso = ipoib_set_tso,
134 .get_coalesce = ipoib_get_coalesce, 154 .get_coalesce = ipoib_get_coalesce,
135 .set_coalesce = ipoib_set_coalesce, 155 .set_coalesce = ipoib_set_coalesce,
136 .get_flags = ethtool_op_get_flags, 156 .get_flags = ethtool_op_get_flags,