diff options
author | Luciano Coelho <coelho@ti.com> | 2011-03-21 17:16:14 -0400 |
---|---|---|
committer | Luciano Coelho <coelho@ti.com> | 2011-04-19 09:49:12 -0400 |
commit | 4a31c11c7d8c482598754a577a8fb71abb61ffa0 (patch) | |
tree | c43a18ce0e9ee6bc54dc3dcda83b2e6e3ae85438 /drivers/net/wireless/wl12xx | |
parent | 4623ec7d97afaf7a8489036e2c2e71e8349716b4 (diff) |
wl12xx: use a bitmask instead of list of booleans in scanned_ch
We were using an array of booleans to mark the channels we had already
scanned. This was causing a sparse error, because bool is not a type
with defined size. To fix this, use bitmasks instead, which is much
cleaner anyway.
Thanks Johannes Berg for the idea.
Signed-off-by: Luciano Coelho <coelho@ti.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx')
-rw-r--r-- | drivers/net/wireless/wl12xx/main.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/scan.c | 17 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 3 |
3 files changed, 17 insertions, 10 deletions
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index 85cb4daac9a0..9663326c0dfa 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c | |||
@@ -1423,8 +1423,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl) | |||
1423 | 1423 | ||
1424 | if (wl->scan.state != WL1271_SCAN_STATE_IDLE) { | 1424 | if (wl->scan.state != WL1271_SCAN_STATE_IDLE) { |
1425 | wl->scan.state = WL1271_SCAN_STATE_IDLE; | 1425 | wl->scan.state = WL1271_SCAN_STATE_IDLE; |
1426 | kfree(wl->scan.scanned_ch); | 1426 | memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); |
1427 | wl->scan.scanned_ch = NULL; | ||
1428 | wl->scan.req = NULL; | 1427 | wl->scan.req = NULL; |
1429 | ieee80211_scan_completed(wl->hw, true); | 1428 | ieee80211_scan_completed(wl->hw, true); |
1430 | } | 1429 | } |
@@ -3502,6 +3501,10 @@ int wl1271_init_ieee80211(struct wl1271 *wl) | |||
3502 | wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE - | 3501 | wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE - |
3503 | sizeof(struct ieee80211_header); | 3502 | sizeof(struct ieee80211_header); |
3504 | 3503 | ||
3504 | /* make sure all our channels fit in the scanned_ch bitmask */ | ||
3505 | BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) + | ||
3506 | ARRAY_SIZE(wl1271_channels_5ghz) > | ||
3507 | WL1271_MAX_CHANNELS); | ||
3505 | /* | 3508 | /* |
3506 | * We keep local copies of the band structs because we need to | 3509 | * We keep local copies of the band structs because we need to |
3507 | * modify them on a per-device basis. | 3510 | * modify them on a per-device basis. |
diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c index 420653a2859c..5d0544c8f3f5 100644 --- a/drivers/net/wireless/wl12xx/scan.c +++ b/drivers/net/wireless/wl12xx/scan.c | |||
@@ -48,8 +48,7 @@ void wl1271_scan_complete_work(struct work_struct *work) | |||
48 | goto out; | 48 | goto out; |
49 | 49 | ||
50 | wl->scan.state = WL1271_SCAN_STATE_IDLE; | 50 | wl->scan.state = WL1271_SCAN_STATE_IDLE; |
51 | kfree(wl->scan.scanned_ch); | 51 | memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); |
52 | wl->scan.scanned_ch = NULL; | ||
53 | wl->scan.req = NULL; | 52 | wl->scan.req = NULL; |
54 | ieee80211_scan_completed(wl->hw, false); | 53 | ieee80211_scan_completed(wl->hw, false); |
55 | 54 | ||
@@ -87,7 +86,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl, | |||
87 | 86 | ||
88 | flags = req->channels[i]->flags; | 87 | flags = req->channels[i]->flags; |
89 | 88 | ||
90 | if (!wl->scan.scanned_ch[i] && | 89 | if (!test_bit(i, wl->scan.scanned_ch) && |
91 | !(flags & IEEE80211_CHAN_DISABLED) && | 90 | !(flags & IEEE80211_CHAN_DISABLED) && |
92 | ((!!(flags & IEEE80211_CHAN_PASSIVE_SCAN)) == passive) && | 91 | ((!!(flags & IEEE80211_CHAN_PASSIVE_SCAN)) == passive) && |
93 | (req->channels[i]->band == band)) { | 92 | (req->channels[i]->band == band)) { |
@@ -124,7 +123,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl, | |||
124 | memset(&channels[j].bssid_msb, 0xff, 2); | 123 | memset(&channels[j].bssid_msb, 0xff, 2); |
125 | 124 | ||
126 | /* Mark the channels we already used */ | 125 | /* Mark the channels we already used */ |
127 | wl->scan.scanned_ch[i] = true; | 126 | set_bit(i, wl->scan.scanned_ch); |
128 | 127 | ||
129 | j++; | 128 | j++; |
130 | } | 129 | } |
@@ -291,6 +290,12 @@ void wl1271_scan_stm(struct wl1271 *wl) | |||
291 | int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | 290 | int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, |
292 | struct cfg80211_scan_request *req) | 291 | struct cfg80211_scan_request *req) |
293 | { | 292 | { |
293 | /* | ||
294 | * cfg80211 should guarantee that we don't get more channels | ||
295 | * than what we have registered. | ||
296 | */ | ||
297 | BUG_ON(req->n_channels > WL1271_MAX_CHANNELS); | ||
298 | |||
294 | if (wl->scan.state != WL1271_SCAN_STATE_IDLE) | 299 | if (wl->scan.state != WL1271_SCAN_STATE_IDLE) |
295 | return -EBUSY; | 300 | return -EBUSY; |
296 | 301 | ||
@@ -304,10 +309,8 @@ int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | |||
304 | } | 309 | } |
305 | 310 | ||
306 | wl->scan.req = req; | 311 | wl->scan.req = req; |
312 | memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch)); | ||
307 | 313 | ||
308 | wl->scan.scanned_ch = kcalloc(req->n_channels, | ||
309 | sizeof(*wl->scan.scanned_ch), | ||
310 | GFP_KERNEL); | ||
311 | /* we assume failure so that timeout scenarios are handled correctly */ | 314 | /* we assume failure so that timeout scenarios are handled correctly */ |
312 | wl->scan.failed = true; | 315 | wl->scan.failed = true; |
313 | ieee80211_queue_delayed_work(wl->hw, &wl->scan_complete_work, | 316 | ieee80211_queue_delayed_work(wl->hw, &wl->scan_complete_work, |
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h index b04481aadf9c..ba98e1853842 100644 --- a/drivers/net/wireless/wl12xx/wl12xx.h +++ b/drivers/net/wireless/wl12xx/wl12xx.h | |||
@@ -302,9 +302,10 @@ struct wl1271_rx_mem_pool_addr { | |||
302 | u32 addr_extra; | 302 | u32 addr_extra; |
303 | }; | 303 | }; |
304 | 304 | ||
305 | #define WL1271_MAX_CHANNELS 64 | ||
305 | struct wl1271_scan { | 306 | struct wl1271_scan { |
306 | struct cfg80211_scan_request *req; | 307 | struct cfg80211_scan_request *req; |
307 | bool *scanned_ch; | 308 | unsigned long scanned_ch[BITS_TO_LONGS(WL1271_MAX_CHANNELS)]; |
308 | bool failed; | 309 | bool failed; |
309 | u8 state; | 310 | u8 state; |
310 | u8 ssid[IW_ESSID_MAX_SIZE+1]; | 311 | u8 ssid[IW_ESSID_MAX_SIZE+1]; |