diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-06-05 08:28:42 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-06-06 15:31:18 -0400 |
commit | 2eb278e083549f4eb29838037004054b3b55df62 (patch) | |
tree | 803f076e7d7a1ed58e1c9e196bda7c2c2bb24bdf /net/mac80211/scan.c | |
parent | 196ac1c13d4db6c276dbb1c9190c8d7d45a83f1f (diff) |
mac80211: unify SW/offload remain-on-channel
Redesign all the off-channel code, getting rid of
the generic off-channel work concept, replacing
it with a simple remain-on-channel list.
This fixes a number of small issues with the ROC
implementation:
* offloaded remain-on-channel couldn't be queued,
now we can queue it as well, if needed
* in iwlwifi (the only user) offloaded ROC is
mutually exclusive with scanning, use the new
queue to handle that case -- I expect that it
will later depend on a HW flag
The bigger issue though is that there's a bad bug
in the current implementation: if we get a mgmt
TX request while HW roc is active, and this new
request has a wait time, we actually schedule a
software ROC instead since we can't guarantee the
existing offloaded ROC will still be that long.
To fix this, the queuing mechanism was needed.
The queuing mechanism for offloaded ROC isn't yet
optimal, ideally we should add API to have the HW
extend the ROC if needed. We could add that later
but for now use a software implementation.
Overall, this unifies the behaviour between the
offloaded and software-implemented case as much
as possible.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/scan.c')
-rw-r--r-- | net/mac80211/scan.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 169da0742c81..379f178eab5f 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -323,7 +323,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, | |||
323 | ieee80211_mlme_notify_scan_completed(local); | 323 | ieee80211_mlme_notify_scan_completed(local); |
324 | ieee80211_ibss_notify_scan_completed(local); | 324 | ieee80211_ibss_notify_scan_completed(local); |
325 | ieee80211_mesh_notify_scan_completed(local); | 325 | ieee80211_mesh_notify_scan_completed(local); |
326 | ieee80211_queue_work(&local->hw, &local->work_work); | 326 | ieee80211_start_next_roc(local); |
327 | } | 327 | } |
328 | 328 | ||
329 | void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted) | 329 | void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted) |
@@ -376,7 +376,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local) | |||
376 | static bool ieee80211_can_scan(struct ieee80211_local *local, | 376 | static bool ieee80211_can_scan(struct ieee80211_local *local, |
377 | struct ieee80211_sub_if_data *sdata) | 377 | struct ieee80211_sub_if_data *sdata) |
378 | { | 378 | { |
379 | if (!list_empty(&local->work_list)) | 379 | if (!list_empty(&local->roc_list)) |
380 | return false; | 380 | return false; |
381 | 381 | ||
382 | if (sdata->vif.type == NL80211_IFTYPE_STATION && | 382 | if (sdata->vif.type == NL80211_IFTYPE_STATION && |