Commit 4a31c11c authored by Luciano Coelho's avatar Luciano Coelho

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: default avatarLuciano Coelho <coelho@ti.com>
parent 4623ec7d
...@@ -1423,8 +1423,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl) ...@@ -1423,8 +1423,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl)
if (wl->scan.state != WL1271_SCAN_STATE_IDLE) { if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
wl->scan.state = WL1271_SCAN_STATE_IDLE; wl->scan.state = WL1271_SCAN_STATE_IDLE;
kfree(wl->scan.scanned_ch); memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
wl->scan.scanned_ch = NULL;
wl->scan.req = NULL; wl->scan.req = NULL;
ieee80211_scan_completed(wl->hw, true); ieee80211_scan_completed(wl->hw, true);
} }
...@@ -3502,6 +3501,10 @@ int wl1271_init_ieee80211(struct wl1271 *wl) ...@@ -3502,6 +3501,10 @@ int wl1271_init_ieee80211(struct wl1271 *wl)
wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE - wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
sizeof(struct ieee80211_header); sizeof(struct ieee80211_header);
/* make sure all our channels fit in the scanned_ch bitmask */
BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
ARRAY_SIZE(wl1271_channels_5ghz) >
WL1271_MAX_CHANNELS);
/* /*
* We keep local copies of the band structs because we need to * We keep local copies of the band structs because we need to
* modify them on a per-device basis. * modify them on a per-device basis.
......
...@@ -48,8 +48,7 @@ void wl1271_scan_complete_work(struct work_struct *work) ...@@ -48,8 +48,7 @@ void wl1271_scan_complete_work(struct work_struct *work)
goto out; goto out;
wl->scan.state = WL1271_SCAN_STATE_IDLE; wl->scan.state = WL1271_SCAN_STATE_IDLE;
kfree(wl->scan.scanned_ch); memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
wl->scan.scanned_ch = NULL;
wl->scan.req = NULL; wl->scan.req = NULL;
ieee80211_scan_completed(wl->hw, false); ieee80211_scan_completed(wl->hw, false);
...@@ -87,7 +86,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl, ...@@ -87,7 +86,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl,
flags = req->channels[i]->flags; flags = req->channels[i]->flags;
if (!wl->scan.scanned_ch[i] && if (!test_bit(i, wl->scan.scanned_ch) &&
!(flags & IEEE80211_CHAN_DISABLED) && !(flags & IEEE80211_CHAN_DISABLED) &&
((!!(flags & IEEE80211_CHAN_PASSIVE_SCAN)) == passive) && ((!!(flags & IEEE80211_CHAN_PASSIVE_SCAN)) == passive) &&
(req->channels[i]->band == band)) { (req->channels[i]->band == band)) {
...@@ -124,7 +123,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl, ...@@ -124,7 +123,7 @@ static int wl1271_get_scan_channels(struct wl1271 *wl,
memset(&channels[j].bssid_msb, 0xff, 2); memset(&channels[j].bssid_msb, 0xff, 2);
/* Mark the channels we already used */ /* Mark the channels we already used */
wl->scan.scanned_ch[i] = true; set_bit(i, wl->scan.scanned_ch);
j++; j++;
} }
...@@ -291,6 +290,12 @@ void wl1271_scan_stm(struct wl1271 *wl) ...@@ -291,6 +290,12 @@ void wl1271_scan_stm(struct wl1271 *wl)
int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
struct cfg80211_scan_request *req) struct cfg80211_scan_request *req)
{ {
/*
* cfg80211 should guarantee that we don't get more channels
* than what we have registered.
*/
BUG_ON(req->n_channels > WL1271_MAX_CHANNELS);
if (wl->scan.state != WL1271_SCAN_STATE_IDLE) if (wl->scan.state != WL1271_SCAN_STATE_IDLE)
return -EBUSY; return -EBUSY;
...@@ -304,10 +309,8 @@ int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, ...@@ -304,10 +309,8 @@ int wl1271_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len,
} }
wl->scan.req = req; wl->scan.req = req;
memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
wl->scan.scanned_ch = kcalloc(req->n_channels,
sizeof(*wl->scan.scanned_ch),
GFP_KERNEL);
/* we assume failure so that timeout scenarios are handled correctly */ /* we assume failure so that timeout scenarios are handled correctly */
wl->scan.failed = true; wl->scan.failed = true;
ieee80211_queue_delayed_work(wl->hw, &wl->scan_complete_work, ieee80211_queue_delayed_work(wl->hw, &wl->scan_complete_work,
......
...@@ -302,9 +302,10 @@ struct wl1271_rx_mem_pool_addr { ...@@ -302,9 +302,10 @@ struct wl1271_rx_mem_pool_addr {
u32 addr_extra; u32 addr_extra;
}; };
#define WL1271_MAX_CHANNELS 64
struct wl1271_scan { struct wl1271_scan {
struct cfg80211_scan_request *req; struct cfg80211_scan_request *req;
bool *scanned_ch; unsigned long scanned_ch[BITS_TO_LONGS(WL1271_MAX_CHANNELS)];
bool failed; bool failed;
u8 state; u8 state;
u8 ssid[IW_ESSID_MAX_SIZE+1]; u8 ssid[IW_ESSID_MAX_SIZE+1];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment