Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: dnet: fix dnet_poll()

A NAPI poll() handler is supposed to return exactly the budget when/if
napi_complete() has not been called.

It is also supposed to return number of frames that were received, so
that netdev_budget can have a meaning.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Eric Dumazet and committed by
David S. Miller
12d80ac4 0c818594

+5 -13
+5 -13
drivers/net/ethernet/dnet.c
··· 398 398 * break out of while loop if there are no more 399 399 * packets waiting 400 400 */ 401 - if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) { 402 - napi_complete(napi); 403 - int_enable = dnet_readl(bp, INTR_ENB); 404 - int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; 405 - dnet_writel(bp, int_enable, INTR_ENB); 406 - return 0; 407 - } 401 + if (!(dnet_readl(bp, RX_FIFO_WCNT) >> 16)) 402 + break; 408 403 409 404 cmd_word = dnet_readl(bp, RX_LEN_FIFO); 410 405 pkt_len = cmd_word & 0xFFFF; ··· 428 433 "size %u.\n", dev->name, pkt_len); 429 434 } 430 435 431 - budget -= npackets; 432 - 433 436 if (npackets < budget) { 434 437 /* We processed all packets available. Tell NAPI it can 435 - * stop polling then re-enable rx interrupts */ 438 + * stop polling then re-enable rx interrupts. 439 + */ 436 440 napi_complete(napi); 437 441 int_enable = dnet_readl(bp, INTR_ENB); 438 442 int_enable |= DNET_INTR_SRC_RX_CMDFIFOAF; 439 443 dnet_writel(bp, int_enable, INTR_ENB); 440 - return 0; 441 444 } 442 445 443 - /* There are still packets waiting */ 444 - return 1; 446 + return npackets; 445 447 } 446 448 447 449 static irqreturn_t dnet_interrupt(int irq, void *dev_id)