diff options
Diffstat (limited to 'drivers/net/chelsio/sge.c')
-rw-r--r-- | drivers/net/chelsio/sge.c | 29 |
1 files changed, 13 insertions, 16 deletions
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; |