|
@@ -917,6 +917,7 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
|
|
|
struct cfg80211_sched_scan_request *req)
|
|
|
{
|
|
|
struct ieee80211_local *local = sdata->local;
|
|
|
+ struct ieee80211_sched_scan_ies sched_scan_ies;
|
|
|
int ret, i;
|
|
|
|
|
|
mutex_lock(&local->mtx);
|
|
@@ -935,33 +936,28 @@ int ieee80211_request_sched_scan_start(struct ieee80211_sub_if_data *sdata,
|
|
|
if (!local->hw.wiphy->bands[i])
|
|
|
continue;
|
|
|
|
|
|
- local->sched_scan_ies.ie[i] = kzalloc(2 +
|
|
|
- IEEE80211_MAX_SSID_LEN +
|
|
|
- local->scan_ies_len +
|
|
|
- req->ie_len,
|
|
|
- GFP_KERNEL);
|
|
|
- if (!local->sched_scan_ies.ie[i]) {
|
|
|
+ sched_scan_ies.ie[i] = kzalloc(2 + IEEE80211_MAX_SSID_LEN +
|
|
|
+ local->scan_ies_len +
|
|
|
+ req->ie_len,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!sched_scan_ies.ie[i]) {
|
|
|
ret = -ENOMEM;
|
|
|
goto out_free;
|
|
|
}
|
|
|
|
|
|
- local->sched_scan_ies.len[i] =
|
|
|
- ieee80211_build_preq_ies(local,
|
|
|
- local->sched_scan_ies.ie[i],
|
|
|
+ sched_scan_ies.len[i] =
|
|
|
+ ieee80211_build_preq_ies(local, sched_scan_ies.ie[i],
|
|
|
req->ie, req->ie_len, i,
|
|
|
(u32) -1, 0);
|
|
|
}
|
|
|
|
|
|
- ret = drv_sched_scan_start(local, sdata, req,
|
|
|
- &local->sched_scan_ies);
|
|
|
- if (ret == 0) {
|
|
|
+ ret = drv_sched_scan_start(local, sdata, req, &sched_scan_ies);
|
|
|
+ if (ret == 0)
|
|
|
rcu_assign_pointer(local->sched_scan_sdata, sdata);
|
|
|
- goto out;
|
|
|
- }
|
|
|
|
|
|
out_free:
|
|
|
while (i > 0)
|
|
|
- kfree(local->sched_scan_ies.ie[--i]);
|
|
|
+ kfree(sched_scan_ies.ie[--i]);
|
|
|
out:
|
|
|
mutex_unlock(&local->mtx);
|
|
|
return ret;
|
|
@@ -970,7 +966,7 @@ out:
|
|
|
int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata)
|
|
|
{
|
|
|
struct ieee80211_local *local = sdata->local;
|
|
|
- int ret = 0, i;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
mutex_lock(&local->mtx);
|
|
|
|
|
@@ -979,12 +975,9 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata)
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (rcu_access_pointer(local->sched_scan_sdata)) {
|
|
|
- for (i = 0; i < IEEE80211_NUM_BANDS; i++)
|
|
|
- kfree(local->sched_scan_ies.ie[i]);
|
|
|
-
|
|
|
+ if (rcu_access_pointer(local->sched_scan_sdata))
|
|
|
drv_sched_scan_stop(local, sdata);
|
|
|
- }
|
|
|
+
|
|
|
out:
|
|
|
mutex_unlock(&local->mtx);
|
|
|
|
|
@@ -1006,7 +999,6 @@ void ieee80211_sched_scan_stopped_work(struct work_struct *work)
|
|
|
struct ieee80211_local *local =
|
|
|
container_of(work, struct ieee80211_local,
|
|
|
sched_scan_stopped_work);
|
|
|
- int i;
|
|
|
|
|
|
mutex_lock(&local->mtx);
|
|
|
|
|
@@ -1015,9 +1007,6 @@ void ieee80211_sched_scan_stopped_work(struct work_struct *work)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < IEEE80211_NUM_BANDS; i++)
|
|
|
- kfree(local->sched_scan_ies.ie[i]);
|
|
|
-
|
|
|
rcu_assign_pointer(local->sched_scan_sdata, NULL);
|
|
|
|
|
|
mutex_unlock(&local->mtx);
|