aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/chelsio
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/chelsio')
-rw-r--r--drivers/net/chelsio/common.h1
-rw-r--r--drivers/net/chelsio/cxgb2.c9
-rw-r--r--drivers/net/chelsio/sge.c29
-rw-r--r--drivers/net/chelsio/sge.h2
4 files changed, 21 insertions, 20 deletions
diff --git a/drivers/net/chelsio/common.h b/drivers/net/chelsio/common.h
index 8ba702c8b560..b5de4452cf24 100644
--- a/drivers/net/chelsio/common.h
+++ b/drivers/net/chelsio/common.h
@@ -278,6 +278,7 @@ struct adapter {
278 struct peespi *espi; 278 struct peespi *espi;
279 struct petp *tp; 279 struct petp *tp;
280 280
281 struct napi_struct napi;
281 struct port_info port[MAX_NPORTS]; 282 struct port_info port[MAX_NPORTS];
282 struct delayed_work stats_update_task; 283 struct delayed_work stats_update_task;
283 struct timer_list stats_update_timer; 284 struct timer_list stats_update_timer;
diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c
index 231ce43b97cf..593736c7550d 100644
--- a/drivers/net/chelsio/cxgb2.c
+++ b/drivers/net/chelsio/cxgb2.c
@@ -255,8 +255,11 @@ static int cxgb_open(struct net_device *dev)
255 struct adapter *adapter = dev->priv; 255 struct adapter *adapter = dev->priv;
256 int other_ports = adapter->open_device_map & PORT_MASK; 256 int other_ports = adapter->open_device_map & PORT_MASK;
257 257
258 if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) 258 napi_enable(&adapter->napi);
259 if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) {
260 napi_disable(&adapter->napi);
259 return err; 261 return err;
262 }
260 263
261 __set_bit(dev->if_port, &adapter->open_device_map); 264 __set_bit(dev->if_port, &adapter->open_device_map);
262 link_start(&adapter->port[dev->if_port]); 265 link_start(&adapter->port[dev->if_port]);
@@ -274,6 +277,7 @@ static int cxgb_close(struct net_device *dev)
274 struct cmac *mac = p->mac; 277 struct cmac *mac = p->mac;
275 278
276 netif_stop_queue(dev); 279 netif_stop_queue(dev);
280 napi_disable(&adapter->napi);
277 mac->ops->disable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX); 281 mac->ops->disable(mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
278 netif_carrier_off(dev); 282 netif_carrier_off(dev);
279 283
@@ -1113,8 +1117,7 @@ static int __devinit init_one(struct pci_dev *pdev,
1113 netdev->poll_controller = t1_netpoll; 1117 netdev->poll_controller = t1_netpoll;
1114#endif 1118#endif
1115#ifdef CONFIG_CHELSIO_T1_NAPI 1119#ifdef CONFIG_CHELSIO_T1_NAPI
1116 netdev->weight = 64; 1120 netif_napi_add(netdev, &adapter->napi, t1_poll, 64);
1117 netdev->poll = t1_poll;
1118#endif 1121#endif
1119 1122
1120 SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops); 1123 SET_ETHTOOL_OPS(netdev, &t1_ethtool_ops);
diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c
index e4f874a70fe5..ffa7e649a6ef 100644
--- a/drivers/net/chelsio/sge.c
+++ b/drivers/net/chelsio/sge.c
@@ -1620,23 +1620,20 @@ static int process_pure_responses(struct adapter *adapter)
1620 * or protection from interrupts as data interrupts are off at this point and 1620 * or protection from interrupts as data interrupts are off at this point and
1621 * other adapter interrupts do not interfere. 1621 * other adapter interrupts do not interfere.
1622 */ 1622 */
1623int t1_poll(struct net_device *dev, int *budget) 1623int t1_poll(struct napi_struct *napi, int budget)
1624{ 1624{
1625 struct adapter *adapter = dev->priv; 1625 struct adapter *adapter = container_of(napi, struct adapter, napi);
1626 struct net_device *dev = adapter->port[0].dev;
1626 int work_done; 1627 int work_done;
1627 1628
1628 work_done = process_responses(adapter, min(*budget, dev->quota)); 1629 work_done = process_responses(adapter, budget);
1629 *budget -= work_done;
1630 dev->quota -= work_done;
1631
1632 if (unlikely(responses_pending(adapter)))
1633 return 1;
1634
1635 netif_rx_complete(dev);
1636 writel(adapter->sge->respQ.cidx, adapter->regs + A_SG_SLEEPING);
1637
1638 return 0;
1639 1630
1631 if (likely(!responses_pending(adapter))) {
1632 netif_rx_complete(dev, napi);
1633 writel(adapter->sge->respQ.cidx,
1634 adapter->regs + A_SG_SLEEPING);
1635 }
1636 return work_done;
1640} 1637}
1641 1638
1642/* 1639/*
@@ -1653,13 +1650,13 @@ irqreturn_t t1_interrupt(int irq, void *data)
1653 1650
1654 writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE); 1651 writel(F_PL_INTR_SGE_DATA, adapter->regs + A_PL_CAUSE);
1655 1652
1656 if (__netif_rx_schedule_prep(dev)) { 1653 if (napi_schedule_prep(&adapter->napi)) {
1657 if (process_pure_responses(adapter)) 1654 if (process_pure_responses(adapter))
1658 __netif_rx_schedule(dev); 1655 __netif_rx_schedule(dev, &adapter->napi);
1659 else { 1656 else {
1660 /* no data, no NAPI needed */ 1657 /* no data, no NAPI needed */
1661 writel(sge->respQ.cidx, adapter->regs + A_SG_SLEEPING); 1658 writel(sge->respQ.cidx, adapter->regs + A_SG_SLEEPING);
1662 netif_poll_enable(dev); /* undo schedule_prep */ 1659 napi_enable(&adapter->napi); /* undo schedule_prep */
1663 } 1660 }
1664 } 1661 }
1665 return IRQ_HANDLED; 1662 return IRQ_HANDLED;
diff --git a/drivers/net/chelsio/sge.h b/drivers/net/chelsio/sge.h
index d132a0ef2a22..713d9c55f24d 100644
--- a/drivers/net/chelsio/sge.h
+++ b/drivers/net/chelsio/sge.h
@@ -77,7 +77,7 @@ int t1_sge_configure(struct sge *, struct sge_params *);
77int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); 77int t1_sge_set_coalesce_params(struct sge *, struct sge_params *);
78void t1_sge_destroy(struct sge *); 78void t1_sge_destroy(struct sge *);
79irqreturn_t t1_interrupt(int irq, void *cookie); 79irqreturn_t t1_interrupt(int irq, void *cookie);
80int t1_poll(struct net_device *, int *); 80int t1_poll(struct napi_struct *, int);
81 81
82int t1_start_xmit(struct sk_buff *skb, struct net_device *dev); 82int t1_start_xmit(struct sk_buff *skb, struct net_device *dev);
83void t1_set_vlan_accel(struct adapter *adapter, int on_off); 83void t1_set_vlan_accel(struct adapter *adapter, int on_off);