Subject: Re: Problems with ath(4) and interrupt sharing
To: None <port-i386@netbsd.org>
From: Joerg Sonnenberger <joerg@britannica.bec.de>
List: port-i386
Date: 11/19/2007 12:28:55
On Fri, Nov 16, 2007 at 06:32:18PM -0800, Brian Buhrow wrote:
> 	In looking at the ath driver source code, I find I have a couple of
> questions in ath_intr() in src/sys/dev/ic/ath.c
> Here's the snippet, with my questions below that.
> 
> 
>     810      if ((ifp->if_flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP))
>  {
>     811           DPRINTF(sc, ATH_DEBUG_ANY, "%s: if_flags 0x%x\n",
>     812                __func__, ifp->if_flags);
>     813           ath_hal_getisr(ah, &status);  /* clear ISR */
>     814           ath_hal_intrset(ah, 0);       /* disable further intr's */
>     815           return 1; /* XXX */
>     816      }
> 
> My questions are:
> 
> 1.  Does the call to ath_hal_intrset() disable the device from generating
> interupts, or does it disable the interrupts from being acted upon,
> regardless of which device on that interrupt generated them?

It stops the device from generating further interrupts. You haven't
quoted the check for pending interrupts directly above this and the
logic is that (a) if there's no pending interrupt it won't reach above
block and (b) if it reaches the above block and the interface is not
running, it stops further interrupts.

Do you see interrupt storms, e.g. vmstat -i gives interrupt rates >
1k/s? Otherwise this shouldn't be the problem.

Joerg