mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 17:43:59 +00:00
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>
This commit is contained in:
parent
2f3889f42e
commit
ee33c58541
@ -316,10 +316,11 @@ static void macb_tx(struct macb *bp)
|
||||
dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",
|
||||
(unsigned long)status);
|
||||
|
||||
if (status & MACB_BIT(UND)) {
|
||||
if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
|
||||
int i;
|
||||
printk(KERN_ERR "%s: TX underrun, resetting buffers\n",
|
||||
bp->dev->name);
|
||||
printk(KERN_ERR "%s: TX %s, resetting buffers\n",
|
||||
bp->dev->name, status & MACB_BIT(UND) ?
|
||||
"underrun" : "retry limit exceeded");
|
||||
|
||||
/* Transfer ongoing, disable transmitter, to avoid confusion */
|
||||
if (status & MACB_BIT(TGO))
|
||||
@ -590,7 +591,8 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
|
||||
}
|
||||
}
|
||||
|
||||
if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND)))
|
||||
if (status & (MACB_BIT(TCOMP) | MACB_BIT(ISR_TUND) |
|
||||
MACB_BIT(ISR_RLE)))
|
||||
macb_tx(bp);
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user