Commit c454f1d9 authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by Luciano Coelho

wl1271: Move scan complete invocation into work function

The current scan implementation can jam, if the scan request ends up
containing no work. This can especially happen if there is a scan request
with only 11a band channels for HW that does not support 11a.
Signed-off-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Reviewed-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
Signed-off-by: default avatarLuciano Coelho <luciano.coelho@nokia.com>
parent 9987a9da
...@@ -416,6 +416,7 @@ struct wl1271 { ...@@ -416,6 +416,7 @@ struct wl1271 {
/* Are we currently scanning */ /* Are we currently scanning */
struct wl1271_scan scan; struct wl1271_scan scan;
struct work_struct scan_complete_work;
/* Our association ID */ /* Our association ID */
u16 aid; u16 aid;
......
...@@ -634,6 +634,8 @@ static int wl1271_setup(struct wl1271 *wl) ...@@ -634,6 +634,8 @@ static int wl1271_setup(struct wl1271 *wl)
INIT_WORK(&wl->irq_work, wl1271_irq_work); INIT_WORK(&wl->irq_work, wl1271_irq_work);
INIT_WORK(&wl->tx_work, wl1271_tx_work); INIT_WORK(&wl->tx_work, wl1271_tx_work);
INIT_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
return 0; return 0;
} }
...@@ -962,6 +964,8 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw, ...@@ -962,6 +964,8 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
struct wl1271 *wl = hw->priv; struct wl1271 *wl = hw->priv;
int i; int i;
cancel_work_sync(&wl->scan_complete_work);
mutex_lock(&wl->mutex); mutex_lock(&wl->mutex);
wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface"); wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
......
...@@ -28,6 +28,23 @@ ...@@ -28,6 +28,23 @@
#include "wl1271_scan.h" #include "wl1271_scan.h"
#include "wl1271_acx.h" #include "wl1271_acx.h"
void wl1271_scan_complete_work(struct work_struct *work)
{
struct wl1271 *wl =
container_of(work, struct wl1271, scan_complete_work);
wl1271_debug(DEBUG_SCAN, "Scanning complete");
mutex_lock(&wl->mutex);
wl->scan.state = WL1271_SCAN_STATE_IDLE;
kfree(wl->scan.scanned_ch);
wl->scan.scanned_ch = NULL;
mutex_unlock(&wl->mutex);
ieee80211_scan_completed(wl->hw, false);
}
static int wl1271_get_scan_channels(struct wl1271 *wl, static int wl1271_get_scan_channels(struct wl1271 *wl,
struct cfg80211_scan_request *req, struct cfg80211_scan_request *req,
struct basic_scan_channel_params *channels, struct basic_scan_channel_params *channels,
...@@ -218,11 +235,7 @@ void wl1271_scan_stm(struct wl1271 *wl) ...@@ -218,11 +235,7 @@ void wl1271_scan_stm(struct wl1271 *wl)
break; break;
case WL1271_SCAN_STATE_DONE: case WL1271_SCAN_STATE_DONE:
kfree(wl->scan.scanned_ch); ieee80211_queue_work(wl->hw, &wl->scan_complete_work);
wl->scan.scanned_ch = NULL;
wl->scan.state = WL1271_SCAN_STATE_IDLE;
ieee80211_scan_completed(wl->hw, false);
break; break;
default: default:
......
...@@ -32,6 +32,7 @@ int wl1271_scan_build_probe_req(struct wl1271 *wl, ...@@ -32,6 +32,7 @@ int wl1271_scan_build_probe_req(struct wl1271 *wl,
const u8 *ssid, size_t ssid_len, const u8 *ssid, size_t ssid_len,
const u8 *ie, size_t ie_len, u8 band); const u8 *ie, size_t ie_len, u8 band);
void wl1271_scan_stm(struct wl1271 *wl); void wl1271_scan_stm(struct wl1271 *wl);
void wl1271_scan_complete_work(struct work_struct *work);
#define WL1271_SCAN_MAX_CHANNELS 24 #define WL1271_SCAN_MAX_CHANNELS 24
#define WL1271_SCAN_DEFAULT_TAG 1 #define WL1271_SCAN_DEFAULT_TAG 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