|
|
@@ -2753,8 +2753,31 @@ static int set_rx_intr_params(struct net_device *dev,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int set_adaptive_rx_setting(struct net_device *dev, int adaptive_rx)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ struct port_info *pi = netdev_priv(dev);
|
|
|
+ struct adapter *adap = pi->adapter;
|
|
|
+ struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
|
|
|
+
|
|
|
+ for (i = 0; i < pi->nqsets; i++, q++)
|
|
|
+ q->rspq.adaptive_rx = adaptive_rx;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int get_adaptive_rx_setting(struct net_device *dev)
|
|
|
+{
|
|
|
+ struct port_info *pi = netdev_priv(dev);
|
|
|
+ struct adapter *adap = pi->adapter;
|
|
|
+ struct sge_eth_rxq *q = &adap->sge.ethrxq[pi->first_qset];
|
|
|
+
|
|
|
+ return q->rspq.adaptive_rx;
|
|
|
+}
|
|
|
+
|
|
|
static int set_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
|
|
|
{
|
|
|
+ set_adaptive_rx_setting(dev, c->use_adaptive_rx_coalesce);
|
|
|
return set_rx_intr_params(dev, c->rx_coalesce_usecs,
|
|
|
c->rx_max_coalesced_frames);
|
|
|
}
|
|
|
@@ -2768,6 +2791,7 @@ static int get_coalesce(struct net_device *dev, struct ethtool_coalesce *c)
|
|
|
c->rx_coalesce_usecs = qtimer_val(adap, rq);
|
|
|
c->rx_max_coalesced_frames = (rq->intr_params & QINTR_CNT_EN) ?
|
|
|
adap->sge.counter_val[rq->pktcnt_idx] : 0;
|
|
|
+ c->use_adaptive_rx_coalesce = get_adaptive_rx_setting(dev);
|
|
|
return 0;
|
|
|
}
|
|
|
|