diff options
Diffstat (limited to 'drivers/net/chelsio')
-rw-r--r-- | drivers/net/chelsio/common.h | 1 | ||||
-rw-r--r-- | drivers/net/chelsio/cxgb2.c | 9 | ||||
-rw-r--r-- | drivers/net/chelsio/sge.c | 29 | ||||
-rw-r--r-- | drivers/net/chelsio/sge.h | 2 |
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 | */ |
1623 | int t1_poll(struct net_device *dev, int *budget) | 1623 | int 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 *); | |||
77 | int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); | 77 | int t1_sge_set_coalesce_params(struct sge *, struct sge_params *); |
78 | void t1_sge_destroy(struct sge *); | 78 | void t1_sge_destroy(struct sge *); |
79 | irqreturn_t t1_interrupt(int irq, void *cookie); | 79 | irqreturn_t t1_interrupt(int irq, void *cookie); |
80 | int t1_poll(struct net_device *, int *); | 80 | int t1_poll(struct napi_struct *, int); |
81 | 81 | ||
82 | int t1_start_xmit(struct sk_buff *skb, struct net_device *dev); | 82 | int t1_start_xmit(struct sk_buff *skb, struct net_device *dev); |
83 | void t1_set_vlan_accel(struct adapter *adapter, int on_off); | 83 | void t1_set_vlan_accel(struct adapter *adapter, int on_off); |