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)
 {
                }
        }
 
-       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,
        struct ath6kl_vif *vif = netdev_priv(dev);
        u16 interval;
        int ret;
-       u8 i;
 
        if (ar->state != ATH6KL_STATE_ON)
                return -EIO;
 
        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);
                                  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,
        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 |