Andrew Morton wrote: > On Tue, 20 Mar 2007 17:23:54 -0600 Zan Lynx <zlynx@xxxxxxx> wrote: > >> On Mon, 2007-03-19 at 20:56 -0800, Andrew Morton wrote: >>> Temporarily at >>> >>> http://userweb.kernel.org/~akpm/2.6.21-rc4-mm1/ >>> >>> Will appear later at >>> >>> ftp://ftp.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.21-rc4/2.6.21-rc4-mm1/ >> First impressions: >> Several of the same bugs as rc3-mm*: >> * Freezes immediately if I touch the wlan0 device after loading >> the new Broadcom wireless driver. The version of the ssb driver in 2.6.21-rc4-mm1 has a bug that causes a kernel oops if the bcm43xx chip contains a USB (dangling) core. This bug has been fixed in Michael Buesch's tree, but apparently not yet in Linville's wireless-dev tree. The patch is as follows: commit 08531ff130bcc8181d9294a66e25010f48eefb97 Author: Michael Buesch <mb@xxxxxxxxx> Date: Wed Mar 7 23:01:08 2007 +0100 ssb: Don't freeze unregistered devices. Signed-off-by: Michael Buesch <mb@xxxxxxxxx> diff --git a/drivers/ssb/core.c b/drivers/ssb/core.c index 2facada..c956edf 100644 --- a/drivers/ssb/core.c +++ b/drivers/ssb/core.c @@ -163,6 +163,8 @@ int ssb_devices_freeze(struct ssb_bus *bus) dev = &(bus->devices[i]); if (!dev->dev->driver) continue; + if (!device_is_registered(dev->dev)) + continue; drv = drv_to_ssb_drv(dev->dev->driver); if (drv && drv->suspend) { err = drv->suspend(dev, state); @@ -185,6 +187,8 @@ int ssb_devices_thaw(struct ssb_bus *bus) dev = &(bus->devices[i]); if (!dev->dev->driver) continue; + if (!device_is_registered(dev->dev)) + continue; drv = drv_to_ssb_drv(dev->dev->driver); if (drv && drv->resume) { err = drv->resume(dev); Larry
commit 08531ff130bcc8181d9294a66e25010f48eefb97 Author: Michael Buesch <mb@xxxxxxxxx> Date: Wed Mar 7 23:01:08 2007 +0100 ssb: Don't freeze unregistered devices. Signed-off-by: Michael Buesch <mb@xxxxxxxxx> diff --git a/drivers/ssb/main.c b/drivers/ssb/main.c index 2facada..c956edf 100644 --- a/drivers/ssb/main.c +++ b/drivers/ssb/main.c @@ -163,6 +163,8 @@ int ssb_devices_freeze(struct ssb_bus *bus) dev = &(bus->devices[i]); if (!dev->dev->driver) continue; + if (!device_is_registered(dev->dev)) + continue; drv = drv_to_ssb_drv(dev->dev->driver); if (drv && drv->suspend) { err = drv->suspend(dev, state); @@ -185,6 +187,8 @@ int ssb_devices_thaw(struct ssb_bus *bus) dev = &(bus->devices[i]); if (!dev->dev->driver) continue; + if (!device_is_registered(dev->dev)) + continue; drv = drv_to_ssb_drv(dev->dev->driver); if (drv && drv->resume) { err = drv->resume(dev);