mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 18:56:44 +07:00
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: Juuso Oikarinen <juuso.oikarinen@nokia.com> Reviewed-by: Luciano Coelho <luciano.coelho@nokia.com> Signed-off-by: Luciano Coelho <luciano.coelho@nokia.com>
This commit is contained in:
parent
9987a9da3e
commit
c454f1d9a8
@ -416,6 +416,7 @@ struct wl1271 {
|
||||
|
||||
/* Are we currently scanning */
|
||||
struct wl1271_scan scan;
|
||||
struct work_struct scan_complete_work;
|
||||
|
||||
/* Our association ID */
|
||||
u16 aid;
|
||||
|
@ -634,6 +634,8 @@ static int wl1271_setup(struct wl1271 *wl)
|
||||
|
||||
INIT_WORK(&wl->irq_work, wl1271_irq_work);
|
||||
INIT_WORK(&wl->tx_work, wl1271_tx_work);
|
||||
INIT_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -962,6 +964,8 @@ static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
|
||||
struct wl1271 *wl = hw->priv;
|
||||
int i;
|
||||
|
||||
cancel_work_sync(&wl->scan_complete_work);
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
|
||||
|
||||
|
@ -28,6 +28,23 @@
|
||||
#include "wl1271_scan.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,
|
||||
struct cfg80211_scan_request *req,
|
||||
struct basic_scan_channel_params *channels,
|
||||
@ -218,11 +235,7 @@ void wl1271_scan_stm(struct wl1271 *wl)
|
||||
break;
|
||||
|
||||
case WL1271_SCAN_STATE_DONE:
|
||||
kfree(wl->scan.scanned_ch);
|
||||
wl->scan.scanned_ch = NULL;
|
||||
|
||||
wl->scan.state = WL1271_SCAN_STATE_IDLE;
|
||||
ieee80211_scan_completed(wl->hw, false);
|
||||
ieee80211_queue_work(wl->hw, &wl->scan_complete_work);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -32,6 +32,7 @@ int wl1271_scan_build_probe_req(struct wl1271 *wl,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
const u8 *ie, size_t ie_len, u8 band);
|
||||
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_DEFAULT_TAG 1
|
||||
|
Loading…
Reference in New Issue
Block a user