|
@@ -42,9 +42,55 @@ static void ipoib_get_drvinfo(struct net_device *netdev,
|
|
|
strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
|
|
|
}
|
|
|
|
|
|
+static int ipoib_get_coalesce(struct net_device *dev,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
+{
|
|
|
+ struct ipoib_dev_priv *priv = netdev_priv(dev);
|
|
|
+
|
|
|
+ coal->rx_coalesce_usecs = priv->ethtool.coalesce_usecs;
|
|
|
+ coal->tx_coalesce_usecs = priv->ethtool.coalesce_usecs;
|
|
|
+ coal->rx_max_coalesced_frames = priv->ethtool.max_coalesced_frames;
|
|
|
+ coal->tx_max_coalesced_frames = priv->ethtool.max_coalesced_frames;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int ipoib_set_coalesce(struct net_device *dev,
|
|
|
+ struct ethtool_coalesce *coal)
|
|
|
+{
|
|
|
+ struct ipoib_dev_priv *priv = netdev_priv(dev);
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Since IPoIB uses a single CQ for both rx and tx, we assume
|
|
|
+ * that rx params dictate the configuration. These values are
|
|
|
+ * saved in the private data and returned when ipoib_get_coalesce()
|
|
|
+ * is called.
|
|
|
+ */
|
|
|
+ if (coal->rx_coalesce_usecs > 0xffff ||
|
|
|
+ coal->rx_max_coalesced_frames > 0xffff)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ret = ib_modify_cq(priv->cq, coal->rx_max_coalesced_frames,
|
|
|
+ coal->rx_coalesce_usecs);
|
|
|
+ if (ret && ret != -ENOSYS) {
|
|
|
+ ipoib_warn(priv, "failed modifying CQ (%d)\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ coal->tx_coalesce_usecs = coal->rx_coalesce_usecs;
|
|
|
+ coal->tx_max_coalesced_frames = coal->rx_max_coalesced_frames;
|
|
|
+ priv->ethtool.coalesce_usecs = coal->rx_coalesce_usecs;
|
|
|
+ priv->ethtool.max_coalesced_frames = coal->rx_max_coalesced_frames;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static const struct ethtool_ops ipoib_ethtool_ops = {
|
|
|
.get_drvinfo = ipoib_get_drvinfo,
|
|
|
.get_tso = ethtool_op_get_tso,
|
|
|
+ .get_coalesce = ipoib_get_coalesce,
|
|
|
+ .set_coalesce = ipoib_set_coalesce,
|
|
|
};
|
|
|
|
|
|
void ipoib_set_ethtool_ops(struct net_device *dev)
|