|
@@ -520,9 +520,9 @@ EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
|
|
*/
|
|
*/
|
|
static bool ieee80211_can_queue_work(struct ieee80211_local *local)
|
|
static bool ieee80211_can_queue_work(struct ieee80211_local *local)
|
|
{
|
|
{
|
|
- if (WARN(local->suspended, "queueing ieee80211 work while "
|
|
|
|
- "going to suspend\n"))
|
|
|
|
- return false;
|
|
|
|
|
|
+ if (WARN(local->suspended && !local->resuming,
|
|
|
|
+ "queueing ieee80211 work while going to suspend\n"))
|
|
|
|
+ return false;
|
|
|
|
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
@@ -1025,13 +1025,9 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|
struct sta_info *sta;
|
|
struct sta_info *sta;
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
int res;
|
|
int res;
|
|
- bool from_suspend = local->suspended;
|
|
|
|
|
|
|
|
- /*
|
|
|
|
- * We're going to start the hardware, at that point
|
|
|
|
- * we are no longer suspended and can RX frames.
|
|
|
|
- */
|
|
|
|
- local->suspended = false;
|
|
|
|
|
|
+ if (local->suspended)
|
|
|
|
+ local->resuming = true;
|
|
|
|
|
|
/* restart hardware */
|
|
/* restart hardware */
|
|
if (local->open_count) {
|
|
if (local->open_count) {
|
|
@@ -1129,11 +1125,14 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|
* If this is for hw restart things are still running.
|
|
* If this is for hw restart things are still running.
|
|
* We may want to change that later, however.
|
|
* We may want to change that later, however.
|
|
*/
|
|
*/
|
|
- if (!from_suspend)
|
|
|
|
|
|
+ if (!local->suspended)
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
#ifdef CONFIG_PM
|
|
#ifdef CONFIG_PM
|
|
|
|
+ /* first set suspended false, then resuming */
|
|
local->suspended = false;
|
|
local->suspended = false;
|
|
|
|
+ mb();
|
|
|
|
+ local->resuming = false;
|
|
|
|
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
list_for_each_entry(sdata, &local->interfaces, list) {
|
|
switch(sdata->vif.type) {
|
|
switch(sdata->vif.type) {
|