aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/macb.c
diff options
context:
space:
mode:
authorErik Waling <erik.waling@konftel.se>2009-04-15 19:32:10 -0400
committerDavid S. Miller <davem@davemloft.net>2009-04-17 04:30:33 -0400
commitee33c58541bae92669fe64a39f695ab533d0de14 (patch)
tree851d392d9a9517e0e0bcc545c76d4729e4391d3b /drivers/net/macb.c
parent2f3889f42ec7c2b0c3049ecdd8e4687b6930779a (diff)
macb: Handle Retry Limit Exceeded errors
When transfering large amounts of data we sometimes experienced that the Retry Limit Exceeded (RLE) bit got set in TSR during transmission attempts. When this happened the driver would stall in a state that prevented any more data from being sent. Signed-off-by: Erik Waling <erik.waling@konftel.com> Signed-off-by: Haavard Skinnemoen <haavard.skinnemoen@atmel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/macb.c')
-rw-r--r--drivers/net/macb.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/net/macb.c b/drivers/net/macb.c
index 46073de290cf..9fcc717f4d1a 100644
--- a/drivers/net/macb.c
+++ b/drivers/net/macb.c
@@ -316,10 +316,11 @@ static void macb_tx(struct macb *bp)
316 dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n", 316 dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",
317 (unsigned long)status); 317 (unsigned long)status);
318 318
319 if (status & MACB_BIT(UND)) { 319 if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
320 int i; 320 int i;
321 printk(KERN_ERR "%s: TX underrun, resetting buffers\n", 321 printk(KERN_ERR "%s: TX %s, resetting buffers\n",
322 bp->dev->name); 322 bp->dev->name, status & MACB_BIT(UND) ?
323 "underrun" : "retry limit exceeded");
323 324
324 /* Transfer ongoing, disable transmitter, to avoid confusion */ 325 /* Transfer ongoing, disable transmitter, to avoid confusion */
325 if (status & MACB_BIT(TGO)) 326 if (status & MACB_BIT(TGO))
@@ -590,7 +591,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
590 } 591 }
591 } 592 }
592 593
593 if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND))) 594 if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) |
595 MACB_BIT(ISR_RLE)))
594 macb_tx(bp); 596 macb_tx(bp);
595 597
596 /* 598 /*