aboutsummaryrefslogtreecommitdiffstats
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
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>
-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 /*