diff options
Diffstat (limited to 'drivers/net/macb.c')
-rw-r--r-- | drivers/net/macb.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c index 4297f6e8c4bc..f69e73e2191e 100644 --- a/drivers/net/macb.c +++ b/drivers/net/macb.c | |||
@@ -515,14 +515,15 @@ static int macb_poll(struct napi_struct *napi, int budget) | |||
515 | (unsigned long)status, budget); | 515 | (unsigned long)status, budget); |
516 | 516 | ||
517 | work_done = macb_rx(bp, budget); | 517 | work_done = macb_rx(bp, budget); |
518 | if (work_done < budget) | 518 | if (work_done < budget) { |
519 | napi_complete(napi); | 519 | napi_complete(napi); |
520 | 520 | ||
521 | /* | 521 | /* |
522 | * We've done what we can to clean the buffers. Make sure we | 522 | * We've done what we can to clean the buffers. Make sure we |
523 | * get notified when new packets arrive. | 523 | * get notified when new packets arrive. |
524 | */ | 524 | */ |
525 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); | 525 | macb_writel(bp, IER, MACB_RX_INT_FLAGS); |
526 | } | ||
526 | 527 | ||
527 | /* TODO: Handle errors */ | 528 | /* TODO: Handle errors */ |
528 | 529 | ||
@@ -550,12 +551,16 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id) | |||
550 | } | 551 | } |
551 | 552 | ||
552 | if (status & MACB_RX_INT_FLAGS) { | 553 | if (status & MACB_RX_INT_FLAGS) { |
554 | /* | ||
555 | * There's no point taking any more interrupts | ||
556 | * until we have processed the buffers. The | ||
557 | * scheduling call may fail if the poll routine | ||
558 | * is already scheduled, so disable interrupts | ||
559 | * now. | ||
560 | */ | ||
561 | macb_writel(bp, IDR, MACB_RX_INT_FLAGS); | ||
562 | |||
553 | if (napi_schedule_prep(&bp->napi)) { | 563 | if (napi_schedule_prep(&bp->napi)) { |
554 | /* | ||
555 | * There's no point taking any more interrupts | ||
556 | * until we have processed the buffers | ||
557 | */ | ||
558 | macb_writel(bp, IDR, MACB_RX_INT_FLAGS); | ||
559 | dev_dbg(&bp->pdev->dev, | 564 | dev_dbg(&bp->pdev->dev, |
560 | "scheduling RX softirq\n"); | 565 | "scheduling RX softirq\n"); |
561 | __napi_schedule(&bp->napi); | 566 | __napi_schedule(&bp->napi); |