diff options
author | Juuso Oikarinen <juuso.oikarinen@nokia.com> | 2010-05-24 04:18:20 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-06-02 16:13:37 -0400 |
commit | 4fb26fa9ae043810eb99c22364d23ffc3b271b8d (patch) | |
tree | bc296f706100f561f530ef2eddc60852f5ad2501 /drivers/net/wireless/wl12xx | |
parent | 5da54f94992b35fd58ad5b569abe8ca04048f8f1 (diff) |
wl1271: Fix scan parameter handling for 5GHz
The 5GHz bands were scanned without the proper IE's in place, preventing
proper 5GHz scanning. This patches fixes the problem by storing a pointer
to the scan request (with the IE's) for all iterations of scan.
Signed-off-by: Juuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/wl12xx')
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_cmd.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_cmd.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_event.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_main.c | 10 |
5 files changed, 16 insertions, 15 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271.h b/drivers/net/wireless/wl12xx/wl1271.h index 4984f46626d2..1b52ce6a84d7 100644 --- a/drivers/net/wireless/wl12xx/wl1271.h +++ b/drivers/net/wireless/wl12xx/wl1271.h | |||
@@ -299,6 +299,7 @@ struct wl1271_rx_mem_pool_addr { | |||
299 | }; | 299 | }; |
300 | 300 | ||
301 | struct wl1271_scan { | 301 | struct wl1271_scan { |
302 | struct cfg80211_scan_request *req; | ||
302 | u8 state; | 303 | u8 state; |
303 | u8 ssid[IW_ESSID_MAX_SIZE+1]; | 304 | u8 ssid[IW_ESSID_MAX_SIZE+1]; |
304 | size_t ssid_len; | 305 | size_t ssid_len; |
diff --git a/drivers/net/wireless/wl12xx/wl1271_cmd.c b/drivers/net/wireless/wl12xx/wl1271_cmd.c index dcad42ccc9d4..530678e45a13 100644 --- a/drivers/net/wireless/wl12xx/wl1271_cmd.c +++ b/drivers/net/wireless/wl12xx/wl1271_cmd.c | |||
@@ -568,7 +568,7 @@ out: | |||
568 | } | 568 | } |
569 | 569 | ||
570 | int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | 570 | int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, |
571 | const u8 *ie, size_t ie_len, u8 active_scan, | 571 | struct cfg80211_scan_request *req, u8 active_scan, |
572 | u8 high_prio, u8 band, u8 probe_requests) | 572 | u8 high_prio, u8 band, u8 probe_requests) |
573 | { | 573 | { |
574 | 574 | ||
@@ -649,7 +649,7 @@ int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | |||
649 | } | 649 | } |
650 | 650 | ||
651 | ret = wl1271_cmd_build_probe_req(wl, ssid, ssid_len, | 651 | ret = wl1271_cmd_build_probe_req(wl, ssid, ssid_len, |
652 | ie, ie_len, ieee_band); | 652 | req->ie, req->ie_len, ieee_band); |
653 | if (ret < 0) { | 653 | if (ret < 0) { |
654 | wl1271_error("PROBE request template failed"); | 654 | wl1271_error("PROBE request template failed"); |
655 | goto out; | 655 | goto out; |
@@ -685,7 +685,9 @@ int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | |||
685 | memcpy(wl->scan.ssid, ssid, ssid_len); | 685 | memcpy(wl->scan.ssid, ssid, ssid_len); |
686 | } else | 686 | } else |
687 | wl->scan.ssid_len = 0; | 687 | wl->scan.ssid_len = 0; |
688 | } | 688 | wl->scan.req = req; |
689 | } else | ||
690 | wl->scan.req = NULL; | ||
689 | } | 691 | } |
690 | 692 | ||
691 | ret = wl1271_cmd_send(wl, CMD_SCAN, params, sizeof(*params), 0); | 693 | ret = wl1271_cmd_send(wl, CMD_SCAN, params, sizeof(*params), 0); |
diff --git a/drivers/net/wireless/wl12xx/wl1271_cmd.h b/drivers/net/wireless/wl12xx/wl1271_cmd.h index 4ff966f6354b..68001dffe716 100644 --- a/drivers/net/wireless/wl12xx/wl1271_cmd.h +++ b/drivers/net/wireless/wl12xx/wl1271_cmd.h | |||
@@ -42,7 +42,7 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, u8 ps_mode, bool send); | |||
42 | int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer, | 42 | int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer, |
43 | size_t len); | 43 | size_t len); |
44 | int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, | 44 | int wl1271_cmd_scan(struct wl1271 *wl, const u8 *ssid, size_t ssid_len, |
45 | const u8 *ie, size_t ie_len, u8 active_scan, | 45 | struct cfg80211_scan_request *req, u8 active_scan, |
46 | u8 high_prio, u8 band, u8 probe_requests); | 46 | u8 high_prio, u8 band, u8 probe_requests); |
47 | int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, | 47 | int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, |
48 | void *buf, size_t buf_len, int index, u32 rates); | 48 | void *buf, size_t buf_len, int index, u32 rates); |
diff --git a/drivers/net/wireless/wl12xx/wl1271_event.c b/drivers/net/wireless/wl12xx/wl1271_event.c index cf37aa6eb137..ca52cdec7a8f 100644 --- a/drivers/net/wireless/wl12xx/wl1271_event.c +++ b/drivers/net/wireless/wl12xx/wl1271_event.c | |||
@@ -43,11 +43,11 @@ static int wl1271_event_scan_complete(struct wl1271 *wl, | |||
43 | clear_bit(WL1271_FLAG_SCANNING, &wl->flags); | 43 | clear_bit(WL1271_FLAG_SCANNING, &wl->flags); |
44 | /* FIXME: ie missing! */ | 44 | /* FIXME: ie missing! */ |
45 | wl1271_cmd_scan(wl, wl->scan.ssid, wl->scan.ssid_len, | 45 | wl1271_cmd_scan(wl, wl->scan.ssid, wl->scan.ssid_len, |
46 | NULL, 0, | 46 | wl->scan.req, |
47 | wl->scan.active, | 47 | wl->scan.active, |
48 | wl->scan.high_prio, | 48 | wl->scan.high_prio, |
49 | WL1271_SCAN_BAND_5_GHZ, | 49 | WL1271_SCAN_BAND_5_GHZ, |
50 | wl->scan.probe_requests); | 50 | wl->scan.probe_requests); |
51 | } else { | 51 | } else { |
52 | mutex_unlock(&wl->mutex); | 52 | mutex_unlock(&wl->mutex); |
53 | ieee80211_scan_completed(wl->hw, false); | 53 | ieee80211_scan_completed(wl->hw, false); |
diff --git a/drivers/net/wireless/wl12xx/wl1271_main.c b/drivers/net/wireless/wl12xx/wl1271_main.c index 7bf655d55152..7a14da506d78 100644 --- a/drivers/net/wireless/wl12xx/wl1271_main.c +++ b/drivers/net/wireless/wl12xx/wl1271_main.c | |||
@@ -1634,13 +1634,11 @@ static int wl1271_op_hw_scan(struct ieee80211_hw *hw, | |||
1634 | goto out; | 1634 | goto out; |
1635 | 1635 | ||
1636 | if (wl1271_11a_enabled()) | 1636 | if (wl1271_11a_enabled()) |
1637 | ret = wl1271_cmd_scan(hw->priv, ssid, len, | 1637 | ret = wl1271_cmd_scan(hw->priv, ssid, len, req, |
1638 | req->ie, req->ie_len, 1, 0, | 1638 | 1, 0, WL1271_SCAN_BAND_DUAL, 3); |
1639 | WL1271_SCAN_BAND_DUAL, 3); | ||
1640 | else | 1639 | else |
1641 | ret = wl1271_cmd_scan(hw->priv, ssid, len, | 1640 | ret = wl1271_cmd_scan(hw->priv, ssid, len, req, |
1642 | req->ie, req->ie_len, 1, 0, | 1641 | 1, 0, WL1271_SCAN_BAND_2_4_GHZ, 3); |
1643 | WL1271_SCAN_BAND_2_4_GHZ, 3); | ||
1644 | 1642 | ||
1645 | wl1271_ps_elp_sleep(wl); | 1643 | wl1271_ps_elp_sleep(wl); |
1646 | 1644 | ||