diff options
| -rw-r--r-- | drivers/net/wireless/wl12xx/scan.c | 31 | ||||
| -rw-r--r-- | drivers/net/wireless/wl12xx/scan.h | 3 |
2 files changed, 23 insertions, 11 deletions
diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c index f223e0ed0c41..8ccbb911776a 100644 --- a/drivers/net/wireless/wl12xx/scan.c +++ b/drivers/net/wireless/wl12xx/scan.c | |||
| @@ -337,10 +337,12 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl, | |||
| 337 | i++) { | 337 | i++) { |
| 338 | flags = req->channels[i]->flags; | 338 | flags = req->channels[i]->flags; |
| 339 | 339 | ||
| 340 | if (!(flags & IEEE80211_CHAN_DISABLED) && | 340 | if ((req->channels[i]->band == band) && |
| 341 | (!!(flags & IEEE80211_CHAN_PASSIVE_SCAN) == passive) && | 341 | !(flags & IEEE80211_CHAN_DISABLED) && |
| 342 | (!!(flags & IEEE80211_CHAN_RADAR) == radar) && | 342 | (!!(flags & IEEE80211_CHAN_RADAR) == radar) && |
| 343 | (req->channels[i]->band == band)) { | 343 | /* if radar is set, we ignore the passive flag */ |
| 344 | (radar || | ||
| 345 | !!(flags & IEEE80211_CHAN_PASSIVE_SCAN) == passive)) { | ||
| 344 | wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ", | 346 | wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ", |
| 345 | req->channels[i]->band, | 347 | req->channels[i]->band, |
| 346 | req->channels[i]->center_freq); | 348 | req->channels[i]->center_freq); |
| @@ -350,6 +352,8 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl, | |||
| 350 | wl1271_debug(DEBUG_SCAN, "max_power %d", | 352 | wl1271_debug(DEBUG_SCAN, "max_power %d", |
| 351 | req->channels[i]->max_power); | 353 | req->channels[i]->max_power); |
| 352 | 354 | ||
| 355 | if (flags & IEEE80211_CHAN_RADAR) | ||
| 356 | channels[j].flags |= SCAN_CHANNEL_FLAGS_DFS; | ||
| 353 | if (flags & IEEE80211_CHAN_PASSIVE_SCAN) { | 357 | if (flags & IEEE80211_CHAN_PASSIVE_SCAN) { |
| 354 | channels[j].passive_duration = | 358 | channels[j].passive_duration = |
| 355 | cpu_to_le16(c->dwell_time_passive); | 359 | cpu_to_le16(c->dwell_time_passive); |
| @@ -359,7 +363,7 @@ wl1271_scan_get_sched_scan_channels(struct wl1271 *wl, | |||
| 359 | channels[j].max_duration = | 363 | channels[j].max_duration = |
| 360 | cpu_to_le16(c->max_dwell_time_active); | 364 | cpu_to_le16(c->max_dwell_time_active); |
| 361 | } | 365 | } |
| 362 | channels[j].tx_power_att = req->channels[j]->max_power; | 366 | channels[j].tx_power_att = req->channels[i]->max_power; |
| 363 | channels[j].channel = req->channels[i]->hw_value; | 367 | channels[j].channel = req->channels[i]->hw_value; |
| 364 | 368 | ||
| 365 | j++; | 369 | j++; |
| @@ -386,7 +390,11 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl, | |||
| 386 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, | 390 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, |
| 387 | IEEE80211_BAND_2GHZ, | 391 | IEEE80211_BAND_2GHZ, |
| 388 | false, false, idx); | 392 | false, false, idx); |
| 389 | idx += cfg->active[0]; | 393 | /* |
| 394 | * 5GHz channels always start at position 14, not immediately | ||
| 395 | * after the last 2.4GHz channel | ||
| 396 | */ | ||
| 397 | idx = 14; | ||
| 390 | 398 | ||
| 391 | cfg->passive[1] = | 399 | cfg->passive[1] = |
| 392 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, | 400 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, |
| @@ -394,22 +402,23 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl, | |||
| 394 | false, true, idx); | 402 | false, true, idx); |
| 395 | idx += cfg->passive[1]; | 403 | idx += cfg->passive[1]; |
| 396 | 404 | ||
| 397 | cfg->active[1] = | 405 | cfg->dfs = |
| 398 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, | 406 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, |
| 399 | IEEE80211_BAND_5GHZ, | 407 | IEEE80211_BAND_5GHZ, |
| 400 | false, false, 14); | 408 | true, true, idx); |
| 401 | idx += cfg->active[1]; | 409 | idx += cfg->dfs; |
| 402 | 410 | ||
| 403 | cfg->dfs = | 411 | cfg->active[1] = |
| 404 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, | 412 | wl1271_scan_get_sched_scan_channels(wl, req, cfg->channels, |
| 405 | IEEE80211_BAND_5GHZ, | 413 | IEEE80211_BAND_5GHZ, |
| 406 | true, false, idx); | 414 | false, false, idx); |
| 407 | idx += cfg->dfs; | 415 | idx += cfg->active[1]; |
| 408 | 416 | ||
| 409 | wl1271_debug(DEBUG_SCAN, " 2.4GHz: active %d passive %d", | 417 | wl1271_debug(DEBUG_SCAN, " 2.4GHz: active %d passive %d", |
| 410 | cfg->active[0], cfg->passive[0]); | 418 | cfg->active[0], cfg->passive[0]); |
| 411 | wl1271_debug(DEBUG_SCAN, " 5GHz: active %d passive %d", | 419 | wl1271_debug(DEBUG_SCAN, " 5GHz: active %d passive %d", |
| 412 | cfg->active[1], cfg->passive[1]); | 420 | cfg->active[1], cfg->passive[1]); |
| 421 | wl1271_debug(DEBUG_SCAN, " DFS: %d", cfg->dfs); | ||
| 413 | 422 | ||
| 414 | return idx; | 423 | return idx; |
| 415 | } | 424 | } |
diff --git a/drivers/net/wireless/wl12xx/scan.h b/drivers/net/wireless/wl12xx/scan.h index c83319579ca3..a0b6c5d67b07 100644 --- a/drivers/net/wireless/wl12xx/scan.h +++ b/drivers/net/wireless/wl12xx/scan.h | |||
| @@ -137,6 +137,9 @@ enum { | |||
| 137 | SCAN_BSS_TYPE_ANY, | 137 | SCAN_BSS_TYPE_ANY, |
| 138 | }; | 138 | }; |
| 139 | 139 | ||
| 140 | #define SCAN_CHANNEL_FLAGS_DFS BIT(0) | ||
| 141 | #define SCAN_CHANNEL_FLAGS_DFS_ENABLED BIT(1) | ||
| 142 | |||
| 140 | struct conn_scan_ch_params { | 143 | struct conn_scan_ch_params { |
| 141 | __le16 min_duration; | 144 | __le16 min_duration; |
| 142 | __le16 max_duration; | 145 | __le16 max_duration; |
