Re: prism 2.5 timeout in wi_cmd 0x010b
Marko Zec <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.mobile,gmane.os.freebsd.devel.net |
|---|---|
| Message-ID | <[email protected]> |
Hi Lorenzo, can you try the attached patch, it does seem to help on my ThinkPad X30, which has an internal mini-PCI Prism2.5 card with the same firmware. Cheers, Marko On Saturday 10 January 2004 03:43, Lorenzo Vicisano wrote: > Hi, > > This is the context: > > - Stable as of Jan 9 (FreeBSD 4.9-STABLE #14: Fri Jan 9 15:04:16 > PST 2004) The problem was present since Dec 22.. at least. > > - Linksys PCI WMP11/Prism: > > wi0: <Intersil Prism2.5> mem 0xf8a02000-0xf8a02fff irq 5 at device > 11.0 on pci2 wi0: 802.11 address: 00:06:25:09:a7:8f > wi0: using RF:PRISM2.5 MAC:ISL3874A(Mini-PCI) > wi0: Intersil Firmware: Primary 1.01.00, Station 1.04.02 > > acting as a client. The AP is a DLink 614+ (I've tried various > versions of the firmware). > > - High volume of transmitted traffic (ftp-ed a few MBs within the > WLAN). Either towards the AP or towards other clients (E.g. > AN350). > > And this is the symptom: > > wi0: timeout in wi_cmd 0x010b; event status 0x0000 > wi0: xmit failed > > after this the NIC is dead. > Sometimes the box freezes for a few seconds, sometimes it doesn't. > Most of the times the NIC doesn't resume unless it brought up/down > (ifconfig down/up). > > More messages (after the NIC stops working): > > wi0: watchdog timeout > wi0: timeout in wi_cmd 0x0002; event status 0x0000 > wi0: wi_cmd: busy bit won't clear. > wi0: wi_cmd: busy bit won't clear. > wi0: wi_cmd: busy bit won't clear. > wi0: init failed > wi0: watchdog timeout > > Complete log attached. I'm able to reproduce this consistently ;( > I can do some debugging and provide more info, if needed. > > thanks, > Lorenzo _______________________________________________ [email protected] mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-mobile To unsubscribe, send any mail to "[email protected]"
wi.diff
(text/x-diff, 471 B)
--- if_wi.c.orig Wed Jan 7 15:55:18 2004
+++ if_wi.c Wed Jan 7 16:38:37 2004
@@ -1016,9 +1016,11 @@ wi_cmd(sc, cmd, val0, val1, val2)
* set in the event status register.
*/
s = CSR_READ_2(sc, WI_EVENT_STAT);
+ DELAY(1);
if (s & WI_EV_CMD) {
/* Ack the event and read result code. */
s = CSR_READ_2(sc, WI_STATUS);
+ DELAY(1);
CSR_WRITE_2(sc, WI_EVENT_ACK, WI_EV_CMD);
#ifdef foo
if ((s & WI_CMD_CODE_MASK) != (cmd & WI_CMD_CODE_MASK))