Date: Thu, 27 Feb 2003 21:21:55 -0800 From: Marcel Moolenaar <marcel@xcllnt.net> To: "M. Warner Losh" <imp@bsdimp.com> Cc: kuku@www.kukulies.org, freebsd-current@FreeBSD.ORG Subject: [patch] wi: device timeout [was: Re: wi0: tx failed, retry limit exceeded] Message-ID: <20030228052155.GB1062@athlon.pn.xcllnt.net> In-Reply-To: <20030227.215348.84365408.imp@bsdimp.com> References: <200302261011.h1QABjmT000629@www.kukulies.org> <20030227.215348.84365408.imp@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--PEIAKu/WMn1b1Hv9
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
On Thu, Feb 27, 2003 at 09:53:48PM -0700, M. Warner Losh wrote:
> :
> : Now I'm getting kernel messages
> :
> : wi0: tx failed, retry limit exceeded.
>
> These are bogus and can be ignored. The old driver didn't report
> them.
>
> However, there are, ah, other issues with the latest wi driver. :-(
The attached patch fixes the device timeout problem. I don't claim
it is correct, but may serve as the basis for experimentation (is
it the limit of 10 iterations, is it the fiddling with status bits
or something else).
--
Marcel Moolenaar USPA: A-39004 marcel@xcllnt.net
--PEIAKu/WMn1b1Hv9
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="wi.diff"
Index: if_wi.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/wi/if_wi.c,v
retrieving revision 1.130
diff -u -r1.130 if_wi.c
--- if_wi.c 26 Feb 2003 17:18:35 -0000 1.130
+++ if_wi.c 28 Feb 2003 04:46:46 -0000
@@ -555,10 +555,9 @@
void
wi_intr(void *arg)
{
- int i;
struct wi_softc *sc = arg;
struct ifnet *ifp = &sc->sc_ic.ic_if;
- u_int16_t status, raw_status, last_status;
+ u_int16_t status;
WI_LOCK_DECL();
WI_LOCK(sc);
@@ -570,21 +569,10 @@
return;
}
- /* maximum 10 loops per interrupt */
- last_status = 0;
- for (i = 0; i < 10; i++) {
- /*
- * Only believe a status bit when we enter wi_intr, or when
- * the bit was "off" the last time through the loop. This is
- * my strategy to avoid racing the hardware/firmware if I
- * can re-read the event status register more quickly than
- * it is updated.
- */
- raw_status = CSR_READ_2(sc, WI_EVENT_STAT);
- status = raw_status & ~last_status;
+ do {
+ status = CSR_READ_2(sc, WI_EVENT_STAT);
if ((status & WI_INTRS) == 0)
break;
- last_status = raw_status;
if (status & WI_EV_RX)
wi_rx_intr(sc);
@@ -602,7 +590,7 @@
(sc->sc_flags & WI_FLAGS_OUTRANGE) == 0 &&
_IF_QLEN(&ifp->if_snd) != 0)
wi_start(ifp);
- }
+ } while (1);
WI_UNLOCK(sc);
--PEIAKu/WMn1b1Hv9--
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030228052155.GB1062>
