|
@@ -2555,10 +2555,10 @@ static int b43_rng_read(struct hwrng *rng, u32 * data)
|
|
|
return (sizeof(u16));
|
|
|
}
|
|
|
|
|
|
-static void b43_rng_exit(struct b43_wl *wl)
|
|
|
+static void b43_rng_exit(struct b43_wl *wl, bool suspended)
|
|
|
{
|
|
|
if (wl->rng_initialized)
|
|
|
- hwrng_unregister(&wl->rng);
|
|
|
+ __hwrng_unregister(&wl->rng, suspended);
|
|
|
}
|
|
|
|
|
|
static int b43_rng_init(struct b43_wl *wl)
|
|
@@ -3418,8 +3418,10 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
|
|
|
macctl |= B43_MACCTL_PSM_JMP0;
|
|
|
b43_write32(dev, B43_MMIO_MACCTL, macctl);
|
|
|
|
|
|
- b43_leds_exit(dev);
|
|
|
- b43_rng_exit(dev->wl);
|
|
|
+ if (!dev->suspend_in_progress) {
|
|
|
+ b43_leds_exit(dev);
|
|
|
+ b43_rng_exit(dev->wl, false);
|
|
|
+ }
|
|
|
b43_dma_free(dev);
|
|
|
b43_chip_exit(dev);
|
|
|
b43_radio_turn_off(dev, 1);
|
|
@@ -3535,11 +3537,13 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
|
|
|
ssb_bus_powerup(bus, 1); /* Enable dynamic PCTL */
|
|
|
b43_upload_card_macaddress(dev);
|
|
|
b43_security_init(dev);
|
|
|
- b43_rng_init(wl);
|
|
|
+ if (!dev->suspend_in_progress)
|
|
|
+ b43_rng_init(wl);
|
|
|
|
|
|
b43_set_status(dev, B43_STAT_INITIALIZED);
|
|
|
|
|
|
- b43_leds_init(dev);
|
|
|
+ if (!dev->suspend_in_progress)
|
|
|
+ b43_leds_init(dev);
|
|
|
out:
|
|
|
return err;
|
|
|
|
|
@@ -4136,6 +4140,7 @@ static int b43_suspend(struct ssb_device *dev, pm_message_t state)
|
|
|
b43dbg(wl, "Suspending...\n");
|
|
|
|
|
|
mutex_lock(&wl->mutex);
|
|
|
+ wldev->suspend_in_progress = true;
|
|
|
wldev->suspend_init_status = b43_status(wldev);
|
|
|
if (wldev->suspend_init_status >= B43_STAT_STARTED)
|
|
|
b43_wireless_core_stop(wldev);
|
|
@@ -4167,15 +4172,17 @@ static int b43_resume(struct ssb_device *dev)
|
|
|
if (wldev->suspend_init_status >= B43_STAT_STARTED) {
|
|
|
err = b43_wireless_core_start(wldev);
|
|
|
if (err) {
|
|
|
+ b43_leds_exit(wldev);
|
|
|
+ b43_rng_exit(wldev->wl, true);
|
|
|
b43_wireless_core_exit(wldev);
|
|
|
b43err(wl, "Resume failed at core start\n");
|
|
|
goto out;
|
|
|
}
|
|
|
}
|
|
|
- mutex_unlock(&wl->mutex);
|
|
|
-
|
|
|
b43dbg(wl, "Device resumed.\n");
|
|
|
- out:
|
|
|
+ out:
|
|
|
+ wldev->suspend_in_progress = false;
|
|
|
+ mutex_unlock(&wl->mutex);
|
|
|
return err;
|
|
|
}
|
|
|
|