|
@@ -637,6 +637,18 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
ieee80211_configure_filter(local);
|
|
ieee80211_configure_filter(local);
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
|
|
+ mutex_lock(&local->mtx);
|
|
|
|
+ if (local->hw_roc_dev == sdata->dev &&
|
|
|
|
+ local->hw_roc_channel) {
|
|
|
|
+ /* ignore return value since this is racy */
|
|
|
|
+ drv_cancel_remain_on_channel(local);
|
|
|
|
+ ieee80211_queue_work(&local->hw, &local->hw_roc_done);
|
|
|
|
+ }
|
|
|
|
+ mutex_unlock(&local->mtx);
|
|
|
|
+
|
|
|
|
+ flush_work(&local->hw_roc_start);
|
|
|
|
+ flush_work(&local->hw_roc_done);
|
|
|
|
+
|
|
flush_work(&sdata->work);
|
|
flush_work(&sdata->work);
|
|
/*
|
|
/*
|
|
* When we get here, the interface is marked down.
|
|
* When we get here, the interface is marked down.
|