|
@@ -1021,8 +1021,10 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
|
IEEE80211_P2P_OPPPS_ENABLE_BIT;
|
|
IEEE80211_P2P_OPPPS_ENABLE_BIT;
|
|
|
|
|
|
err = ieee80211_assign_beacon(sdata, ¶ms->beacon);
|
|
err = ieee80211_assign_beacon(sdata, ¶ms->beacon);
|
|
- if (err < 0)
|
|
|
|
|
|
+ if (err < 0) {
|
|
|
|
+ ieee80211_vif_release_channel(sdata);
|
|
return err;
|
|
return err;
|
|
|
|
+ }
|
|
changed |= err;
|
|
changed |= err;
|
|
|
|
|
|
err = drv_start_ap(sdata->local, sdata);
|
|
err = drv_start_ap(sdata->local, sdata);
|
|
@@ -1032,6 +1034,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
|
|
if (old)
|
|
if (old)
|
|
kfree_rcu(old, rcu_head);
|
|
kfree_rcu(old, rcu_head);
|
|
RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
|
|
RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
|
|
|
|
+ ieee80211_vif_release_channel(sdata);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1090,8 +1093,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
|
|
kfree(sdata->u.ap.next_beacon);
|
|
kfree(sdata->u.ap.next_beacon);
|
|
sdata->u.ap.next_beacon = NULL;
|
|
sdata->u.ap.next_beacon = NULL;
|
|
|
|
|
|
- cancel_work_sync(&sdata->u.ap.request_smps_work);
|
|
|
|
-
|
|
|
|
/* turn off carrier for this interface and dependent VLANs */
|
|
/* turn off carrier for this interface and dependent VLANs */
|
|
list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
|
|
list_for_each_entry(vlan, &sdata->u.ap.vlans, u.vlan.list)
|
|
netif_carrier_off(vlan->dev);
|
|
netif_carrier_off(vlan->dev);
|
|
@@ -1103,6 +1104,7 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
|
|
kfree_rcu(old_beacon, rcu_head);
|
|
kfree_rcu(old_beacon, rcu_head);
|
|
if (old_probe_resp)
|
|
if (old_probe_resp)
|
|
kfree_rcu(old_probe_resp, rcu_head);
|
|
kfree_rcu(old_probe_resp, rcu_head);
|
|
|
|
+ sdata->u.ap.driver_smps_mode = IEEE80211_SMPS_OFF;
|
|
|
|
|
|
__sta_info_flush(sdata, true);
|
|
__sta_info_flush(sdata, true);
|
|
ieee80211_free_keys(sdata, true);
|
|
ieee80211_free_keys(sdata, true);
|
|
@@ -2638,6 +2640,24 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
|
INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work);
|
|
INIT_DELAYED_WORK(&roc->work, ieee80211_sw_roc_work);
|
|
INIT_LIST_HEAD(&roc->dependents);
|
|
INIT_LIST_HEAD(&roc->dependents);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * cookie is either the roc cookie (for normal roc)
|
|
|
|
+ * or the SKB (for mgmt TX)
|
|
|
|
+ */
|
|
|
|
+ if (!txskb) {
|
|
|
|
+ /* local->mtx protects this */
|
|
|
|
+ local->roc_cookie_counter++;
|
|
|
|
+ roc->cookie = local->roc_cookie_counter;
|
|
|
|
+ /* wow, you wrapped 64 bits ... more likely a bug */
|
|
|
|
+ if (WARN_ON(roc->cookie == 0)) {
|
|
|
|
+ roc->cookie = 1;
|
|
|
|
+ local->roc_cookie_counter++;
|
|
|
|
+ }
|
|
|
|
+ *cookie = roc->cookie;
|
|
|
|
+ } else {
|
|
|
|
+ *cookie = (unsigned long)txskb;
|
|
|
|
+ }
|
|
|
|
+
|
|
/* if there's one pending or we're scanning, queue this one */
|
|
/* if there's one pending or we're scanning, queue this one */
|
|
if (!list_empty(&local->roc_list) ||
|
|
if (!list_empty(&local->roc_list) ||
|
|
local->scanning || local->radar_detect_enabled)
|
|
local->scanning || local->radar_detect_enabled)
|
|
@@ -2772,24 +2792,6 @@ static int ieee80211_start_roc_work(struct ieee80211_local *local,
|
|
if (!queued)
|
|
if (!queued)
|
|
list_add_tail(&roc->list, &local->roc_list);
|
|
list_add_tail(&roc->list, &local->roc_list);
|
|
|
|
|
|
- /*
|
|
|
|
- * cookie is either the roc cookie (for normal roc)
|
|
|
|
- * or the SKB (for mgmt TX)
|
|
|
|
- */
|
|
|
|
- if (!txskb) {
|
|
|
|
- /* local->mtx protects this */
|
|
|
|
- local->roc_cookie_counter++;
|
|
|
|
- roc->cookie = local->roc_cookie_counter;
|
|
|
|
- /* wow, you wrapped 64 bits ... more likely a bug */
|
|
|
|
- if (WARN_ON(roc->cookie == 0)) {
|
|
|
|
- roc->cookie = 1;
|
|
|
|
- local->roc_cookie_counter++;
|
|
|
|
- }
|
|
|
|
- *cookie = roc->cookie;
|
|
|
|
- } else {
|
|
|
|
- *cookie = (unsigned long)txskb;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|