lkml.org 
[lkml]   [2009]   [Aug]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    SubjectRe: [PATCH 2.6.30-rc4] r8169: avoid losing MSI interrupts
    From
    Date
    Francois Romieu <romieu@fr.zoreil.com> writes:

    > Eric W. Biederman <ebiederm@xmission.com> :
    > [...]
    >> 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.
    >
    >> 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


    \
     
     \ /
      Last update: 2009-08-26 05:49    [W:7.679 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site