Francois Romieu [off-list ref] writes:
Eric W. Biederman [off-list ref] :
[...]
quoted
I am a bit curious about TxDescUnavail. Perhaps we had a temporary
memory shortage and that is what was screaming? I don't think we do
anything at all with that state.
You are not alone, the driver completely ignores this bit.
As far as I remember, the TxDescUnavail event mostly pops up when the
driver makes an excessive use of TxPoll requests.
quoted
Perhaps the flaw here is simply not masking TxDescUnavail while we are
in NAPI mode ?
Yes, it is worth trying.
At first blush things seem better, but it isn't sufficient.
I still have a problem with RxFIFOOver set.
r8169 screaming irq status 00000040 mask 0000ffe2 event 0000803f napi 0000001d
The patch I ran is below.
Eric
---
drivers/net/r8169.c | 12 ++++++++++++
1 files changed, 12 insertions(+), 0 deletions(-)
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
index 3b19e0c..e144bc1 100644
--- a/drivers/net/r8169.c
+++ b/drivers/net/r8169.c
@@ -3552,6 +3552,7 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
void __iomem *ioaddr = tp->mmio_addr;
int handled = 0;
int status;
+ int count = 0;
/* loop handling interrupts until we have no new ones or
* we hit a invalid/hotplug case.
@@ -3560,6 +3561,14 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
while (status && status != 0xffff) {
handled = 1;
+ if (count++ > 100) {
+ printk_once("r8169 screaming irq status %08x "
+ "mask %08x event %08x napi %08x\n",
+ status, tp->intr_mask, tp->intr_event,
+ tp->napi_event);
+ break;
+ }
+
/* Handle all of the error cases first. These will reset
* the chip, so just exit the loop.
*/@@ -3609,6 +3618,9 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
RTL_W16(IntrStatus,
(status & RxFIFOOver) ? (status | RxOverflow) : status);
status = RTL_R16(IntrStatus);
+ if (status == 0xffff)
+ break;
+ status &= tp->intr_mask;
}
return IRQ_RETVAL(handled);
--
1.6.2.5