diff options
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r-- | net/mac80211/scan.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 7f80f0a5026e..6d0b89e4aa31 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -34,7 +34,8 @@ void ieee80211_rx_bss_put(struct ieee80211_local *local, | |||
34 | { | 34 | { |
35 | if (!bss) | 35 | if (!bss) |
36 | return; | 36 | return; |
37 | cfg80211_put_bss(container_of((void *)bss, struct cfg80211_bss, priv)); | 37 | cfg80211_put_bss(local->hw.wiphy, |
38 | container_of((void *)bss, struct cfg80211_bss, priv)); | ||
38 | } | 39 | } |
39 | 40 | ||
40 | static bool is_uapsd_supported(struct ieee802_11_elems *elems) | 41 | static bool is_uapsd_supported(struct ieee802_11_elems *elems) |
@@ -79,7 +80,10 @@ ieee80211_bss_info_update(struct ieee80211_local *local, | |||
79 | 80 | ||
80 | bss = (void *)cbss->priv; | 81 | bss = (void *)cbss->priv; |
81 | 82 | ||
82 | bss->device_ts = rx_status->device_timestamp; | 83 | if (beacon) |
84 | bss->device_ts_beacon = rx_status->device_timestamp; | ||
85 | else | ||
86 | bss->device_ts_presp = rx_status->device_timestamp; | ||
83 | 87 | ||
84 | if (elems->parse_error) { | 88 | if (elems->parse_error) { |
85 | if (beacon) | 89 | if (beacon) |
@@ -330,6 +334,9 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local) | |||
330 | 334 | ||
331 | ieee80211_offchannel_stop_vifs(local); | 335 | ieee80211_offchannel_stop_vifs(local); |
332 | 336 | ||
337 | /* ensure nullfunc is transmitted before leaving operating channel */ | ||
338 | drv_flush(local, false); | ||
339 | |||
333 | ieee80211_configure_filter(local); | 340 | ieee80211_configure_filter(local); |
334 | 341 | ||
335 | /* We need to set power level at maximum rate for scanning. */ | 342 | /* We need to set power level at maximum rate for scanning. */ |
@@ -378,6 +385,11 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local, | |||
378 | int i; | 385 | int i; |
379 | struct ieee80211_sub_if_data *sdata; | 386 | struct ieee80211_sub_if_data *sdata; |
380 | enum ieee80211_band band = local->hw.conf.channel->band; | 387 | enum ieee80211_band band = local->hw.conf.channel->band; |
388 | u32 tx_flags; | ||
389 | |||
390 | tx_flags = IEEE80211_TX_INTFL_OFFCHAN_TX_OK; | ||
391 | if (local->scan_req->no_cck) | ||
392 | tx_flags |= IEEE80211_TX_CTL_NO_CCK_RATE; | ||
381 | 393 | ||
382 | sdata = rcu_dereference_protected(local->scan_sdata, | 394 | sdata = rcu_dereference_protected(local->scan_sdata, |
383 | lockdep_is_held(&local->mtx)); | 395 | lockdep_is_held(&local->mtx)); |
@@ -389,9 +401,7 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local, | |||
389 | local->scan_req->ssids[i].ssid_len, | 401 | local->scan_req->ssids[i].ssid_len, |
390 | local->scan_req->ie, local->scan_req->ie_len, | 402 | local->scan_req->ie, local->scan_req->ie_len, |
391 | local->scan_req->rates[band], false, | 403 | local->scan_req->rates[band], false, |
392 | local->scan_req->no_cck ? | 404 | tx_flags, local->hw.conf.channel, true); |
393 | IEEE80211_TX_CTL_NO_CCK_RATE : 0, | ||
394 | local->hw.conf.channel, true); | ||
395 | 405 | ||
396 | /* | 406 | /* |
397 | * After sending probe requests, wait for probe responses | 407 | * After sending probe requests, wait for probe responses |