aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorRaja Mani <rmani@qca.qualcomm.com>2012-03-28 09:20:35 -0400
committerKalle Valo <kvalo@qca.qualcomm.com>2012-03-28 09:33:38 -0400
commit5b35dff0bbdcddb537d4c83097b39343a8f9300f (patch)
treed01cb0b95ff60afbb024df09c12b30db48ad0c13 /drivers/net/wireless
parent9cbee358687edf0359e29ac683ec25835134f059 (diff)
ath6kl: Store scan request info in-advance before sending SCAN request
In current code, Scan request info is recorded in vif->scan_req after sending SCAN request to the firmware in ath6kl_cfg80211_scan(). In some corner cases, firmware sends SCAN_COMPLETE event immediately when it receives SCAN request, which internally executes scan complete event handler ath6kl_cfg80211_scan_complete_event() first. So, Scan completion handler will a get a chance to executed even before storing scan request info in ath6kl_cfg80211_scan(). Scan completion handler never report SCAN_COMPLETE event to cfg80211 if scan request info(vif->scan_req) is NULL. This leads to scan failure issue ("Device or resource busy error") during next SCAN request from the user space. This patch ensures that scan request info is stored before sending SCAN request. Signed-off-by: Raja Mani <rmani@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/ath/ath6kl/cfg80211.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index df95e0d9d708..dd07ae560785 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -941,6 +941,8 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
941 if (test_bit(CONNECTED, &vif->flags)) 941 if (test_bit(CONNECTED, &vif->flags))
942 force_fg_scan = 1; 942 force_fg_scan = 1;
943 943
944 vif->scan_req = request;
945
944 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX, 946 if (test_bit(ATH6KL_FW_CAPABILITY_STA_P2PDEV_DUPLEX,
945 ar->fw_capabilities)) { 947 ar->fw_capabilities)) {
946 /* 948 /*
@@ -963,10 +965,10 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
963 ATH6KL_FG_SCAN_INTERVAL, 965 ATH6KL_FG_SCAN_INTERVAL,
964 n_channels, channels); 966 n_channels, channels);
965 } 967 }
966 if (ret) 968 if (ret) {
967 ath6kl_err("wmi_startscan_cmd failed\n"); 969 ath6kl_err("wmi_startscan_cmd failed\n");
968 else 970 vif->scan_req = NULL;
969 vif->scan_req = request; 971 }
970 972
971 kfree(channels); 973 kfree(channels);
972 974