提交 f72f550c 编写于 作者: E Erik Waling 提交者: David S. Miller

macb: process the RX ring regardless of interrupt status

Suppose that we receive lots of frames, start processing them, but
exhaust our budget so that we return before we had a chance to look
at all of them.

Then, when the network layer calls us again, we will only continue
processing the buffers if the REC bit was set in the mean time, which it
might not be if there was a brief pause in the flow of packets. If this
happens, we'll simply display a warning and call netif_rx_complete()
with potentially lots of unprocessed packets in the RX ring...

Fix this by scanning the ring no matter what flags are set in the
interrupt status register.
Signed-off-by: NErik Waling <erik.waling@konftel.com>
Signed-off-by: NHaavard Skinnemoen <haavard.skinnemoen@atmel.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 ee33c585
...@@ -521,27 +521,10 @@ static int macb_poll(struct napi_struct *napi, int budget) ...@@ -521,27 +521,10 @@ static int macb_poll(struct napi_struct *napi, int budget)
macb_writel(bp, RSR, status); macb_writel(bp, RSR, status);
work_done = 0; work_done = 0;
if (!status) {
/*
* This may happen if an interrupt was pending before
* this function was called last time, and no packets
* have been received since.
*/
napi_complete(napi);
goto out;
}
dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n", dev_dbg(&bp->pdev->dev, "poll: status = %08lx, budget = %d\n",
(unsigned long)status, budget); (unsigned long)status, budget);
if (!(status & MACB_BIT(REC))) {
dev_warn(&bp->pdev->dev,
"No RX buffers complete, status = %02lx\n",
(unsigned long)status);
napi_complete(napi);
goto out;
}
work_done = macb_rx(bp, budget); work_done = macb_rx(bp, budget);
if (work_done < budget) if (work_done < budget)
napi_complete(napi); napi_complete(napi);
...@@ -550,7 +533,6 @@ static int macb_poll(struct napi_struct *napi, int budget) ...@@ -550,7 +533,6 @@ static int macb_poll(struct napi_struct *napi, int budget)
* We've done what we can to clean the buffers. Make sure we * We've done what we can to clean the buffers. Make sure we
* get notified when new packets arrive. * get notified when new packets arrive.
*/ */
out:
macb_writel(bp, IER, MACB_RX_INT_FLAGS); macb_writel(bp, IER, MACB_RX_INT_FLAGS);
/* TODO: Handle errors */ /* TODO: Handle errors */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册