better fix for the USB in_interrupt() woes.

This commit is contained in:
solomon 2002-08-21 20:22:21 +00:00
parent 9a444e5f23
commit 4095efb054
4 changed files with 21 additions and 23 deletions

View file

@ -41,6 +41,7 @@
* Intersil Corporation as part of PRISM(R) chipset product development.
*
* --------------------------------------------------------------------
- A fix for the promisc/allmulti stuff on USB devices
-pre4
- Hotplug support for PCI/PLX/USB widgets
- A compile fix for 2.2.x (x < 18) kernels and PCI adapters

19
FAQ
View file

@ -179,17 +179,17 @@ Q: My PC crashes when the USB device is plugged in at boot!
Q: What's with these "Called from within soft interrupt context" messages?
This is the result of a workaround to avoid a kernel oops in
the USB driver code. You can ignore them.
the USB driver code. You can ignore them.
Q: Why doesn't promiscious mode or monitor mode work under USB?
As of 0.1.15-pre5, a different workaround is in place.
Thanks to a quirk in the networking subsystem of Linux, we
can't use synchronous device calls to set the promiscious mode
status. Unfortunately, the only call that it affects is the
one to turn on promiscious mode. :)
Q: Why doesn't promiscuous mode or monitor mode work under USB?
Monitor mode, on the other hand, is enabled as of 0.1.14-pre6.
That said, it's likely to be quite unreliable, especially under
Promiscuous mode works just fine, as of 0.1.15-pre5.
Monitor mode also works, as of 0.1.14-pre6.
Both modes are likely to be quite unreliable, especially under
higher loads thanks to fundamental bandwidth limitations of the
USB interface.
@ -204,6 +204,9 @@ Q: How come the /proc/net/wireless info isn't updated when in monitor mode?
mode, you're not associated, so this information is by defintion
irrelevant.
And regardless, the hardware doesn't update the registers we poll to get
this information while in monitor mode.
Q: What do the various monitor mode options do?
enable=[true/false] Turn it on and off. required.

View file

@ -1,7 +1,7 @@
WLAN_VERSION=0
WLAN_PATCHLEVEL=1
WLAN_SUBLEVEL=15
WLAN_EXTRAVERSION=-pre4
WLAN_EXTRAVERSION=-pre5
LINUX_SRC=/usr/src/linux
WLAN_TARGET_ARCH=
PCMCIA_SRC=

View file

@ -2220,13 +2220,7 @@ int hfa384x_drvr_getconfig(hfa384x_t *hw, UINT16 rid, void *buf, UINT16 len)
int result = 0;
DBFENTER;
if (in_interrupt()) {
WLAN_LOG_ERROR0("Called from within soft interrupt context.\n");
result = -EOPNOTSUPP;
} else {
result = hfa384x_dorrid(hw, DOWAIT, rid, buf, len, NULL, NULL);
}
result = hfa384x_dorrid(hw, DOWAIT, rid, buf, len, NULL, NULL);
DBFEXIT;
return result;
@ -2833,12 +2827,7 @@ int hfa384x_drvr_setconfig(hfa384x_t *hw, UINT16 rid, void *buf, UINT16 len)
int result = 0;
DBFENTER;
if (in_interrupt()) {
WLAN_LOG_ERROR0("Called from within soft interrupt context.\n");
result = -EOPNOTSUPP;
} else {
result = hfa384x_dowrid(hw, DOWAIT, rid, buf, len, NULL, NULL);
}
result = hfa384x_dowrid(hw, DOWAIT, rid, buf, len, NULL, NULL);
DBFEXIT;
return result;
@ -4641,7 +4630,12 @@ hfa384x_usbctlx_submit_wait(
break;
default:
WLAN_LOG_DEBUG0(3,"Sleeping...\n");
wait_event_interruptible(hw->waitq, ctlx->wanna_wakeup);
if (in_interrupt()) {
while(!ctlx->wanna_wakeup)
udelay(1000);
} else {
wait_event_interruptible(hw->waitq, ctlx->wanna_wakeup);
}
break;
}