|
@@ -882,6 +882,32 @@ void ath6kl_cfg80211_disconnect_event(struct ath6kl_vif *vif, u8 reason,
|
|
|
vif->sme_state = SME_DISCONNECTED;
|
|
|
}
|
|
|
|
|
|
+static int ath6kl_set_probed_ssids(struct ath6kl *ar,
|
|
|
+ struct ath6kl_vif *vif,
|
|
|
+ struct cfg80211_ssid *ssids, int n_ssids)
|
|
|
+{
|
|
|
+ u8 i;
|
|
|
+
|
|
|
+ if (n_ssids > MAX_PROBED_SSID_INDEX)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ for (i = 0; i < n_ssids; i++) {
|
|
|
+ ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i,
|
|
|
+ ssids[i].ssid_len ?
|
|
|
+ SPECIFIC_SSID_FLAG : ANY_SSID_FLAG,
|
|
|
+ ssids[i].ssid_len,
|
|
|
+ ssids[i].ssid);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Make sure no old entries are left behind */
|
|
|
+ for (i = n_ssids; i < MAX_PROBED_SSID_INDEX; i++) {
|
|
|
+ ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, i,
|
|
|
+ DISABLE_SSID_FLAG, 0, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
|
|
|
struct cfg80211_scan_request *request)
|
|
|
{
|
|
@@ -909,18 +935,10 @@ static int ath6kl_cfg80211_scan(struct wiphy *wiphy, struct net_device *ndev,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (request->n_ssids && request->ssids[0].ssid_len) {
|
|
|
- u8 i;
|
|
|
-
|
|
|
- if (request->n_ssids > (MAX_PROBED_SSID_INDEX - 1))
|
|
|
- request->n_ssids = MAX_PROBED_SSID_INDEX - 1;
|
|
|
-
|
|
|
- for (i = 0; i < request->n_ssids; i++)
|
|
|
- ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
- i + 1, SPECIFIC_SSID_FLAG,
|
|
|
- request->ssids[i].ssid_len,
|
|
|
- request->ssids[i].ssid);
|
|
|
- }
|
|
|
+ ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
|
|
|
+ request->n_ssids);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
|
|
|
/* this also clears IE in fw if it's not set */
|
|
|
ret = ath6kl_wmi_set_appie_cmd(ar->wmi, vif->fw_vif_idx,
|
|
@@ -3100,7 +3118,6 @@ static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,
|
|
|
struct ath6kl_vif *vif = netdev_priv(dev);
|
|
|
u16 interval;
|
|
|
int ret;
|
|
|
- u8 i;
|
|
|
|
|
|
if (ar->state != ATH6KL_STATE_ON)
|
|
|
return -EIO;
|
|
@@ -3110,11 +3127,10 @@ static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,
|
|
|
|
|
|
ath6kl_cfg80211_scan_complete_event(vif, true);
|
|
|
|
|
|
- for (i = 0; i < ar->wiphy->max_sched_scan_ssids; i++) {
|
|
|
- ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
- i, DISABLE_SSID_FLAG,
|
|
|
- 0, NULL);
|
|
|
- }
|
|
|
+ ret = ath6kl_set_probed_ssids(ar, vif, request->ssids,
|
|
|
+ request->n_ssids);
|
|
|
+ if (ret < 0)
|
|
|
+ return ret;
|
|
|
|
|
|
/* fw uses seconds, also make sure that it's >0 */
|
|
|
interval = max_t(u16, 1, request->interval / 1000);
|
|
@@ -3123,15 +3139,6 @@ static int ath6kl_cfg80211_sscan_start(struct wiphy *wiphy,
|
|
|
interval, interval,
|
|
|
vif->bg_scan_period, 0, 0, 0, 3, 0, 0, 0);
|
|
|
|
|
|
- if (request->n_ssids && request->ssids[0].ssid_len) {
|
|
|
- for (i = 0; i < request->n_ssids; i++) {
|
|
|
- ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
- i, SPECIFIC_SSID_FLAG,
|
|
|
- request->ssids[i].ssid_len,
|
|
|
- request->ssids[i].ssid);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
ret = ath6kl_wmi_set_wow_mode_cmd(ar->wmi, vif->fw_vif_idx,
|
|
|
ATH6KL_WOW_MODE_ENABLE,
|
|
|
WOW_FILTER_SSID,
|
|
@@ -3449,7 +3456,7 @@ int ath6kl_cfg80211_init(struct ath6kl *ar)
|
|
|
wiphy->wowlan.pattern_min_len = 1;
|
|
|
wiphy->wowlan.pattern_max_len = WOW_PATTERN_SIZE;
|
|
|
|
|
|
- wiphy->max_sched_scan_ssids = 10;
|
|
|
+ wiphy->max_sched_scan_ssids = MAX_PROBED_SSID_INDEX;
|
|
|
|
|
|
ar->wiphy->flags |= WIPHY_FLAG_SUPPORTS_FW_ROAM |
|
|
|
WIPHY_FLAG_HAVE_AP_SME |
|