aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wl12xx/scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/wl12xx/scan.c')
-rw-r--r--drivers/net/wireless/wl12xx/scan.c66
1 files changed, 59 insertions, 7 deletions
diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c
index 7229eaa89018..af4ad2353f59 100644
--- a/drivers/net/wireless/wl12xx/scan.c
+++ b/drivers/net/wireless/wl12xx/scan.c
@@ -473,6 +473,51 @@ wl1271_scan_sched_scan_channels(struct wl1271 *wl,
473 cfg->passive[2] || cfg->active[2]; 473 cfg->passive[2] || cfg->active[2];
474} 474}
475 475
476/* Returns 0 if no wildcard is used, 1 if wildcard is used or a
477 * negative value on error */
478static int
479wl12xx_scan_sched_scan_ssid_list(struct wl1271 *wl,
480 struct cfg80211_sched_scan_request *req)
481{
482 struct wl1271_cmd_sched_scan_ssid_list *cmd = NULL;
483 struct cfg80211_ssid *ssid = req->ssids;
484 int ret, wildcard = 0;
485
486 wl1271_debug(DEBUG_CMD, "cmd sched scan ssid list");
487
488 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
489 if (!cmd)
490 return -ENOMEM;
491
492 while ((cmd->n_ssids < req->n_ssids) && ssid) {
493 if (ssid->ssid_len == 0) {
494 wildcard = 1;
495 cmd->ssids[cmd->n_ssids].type = SCAN_SSID_TYPE_PUBLIC;
496 } else {
497 cmd->ssids[cmd->n_ssids].type = SCAN_SSID_TYPE_HIDDEN;
498 }
499 cmd->ssids[cmd->n_ssids].len = ssid->ssid_len;
500 memcpy(cmd->ssids[cmd->n_ssids].ssid, ssid->ssid,
501 ssid->ssid_len);
502 ssid++;
503 cmd->n_ssids++;
504 }
505
506 wl1271_dump(DEBUG_SCAN, "SSID_LIST: ", cmd, sizeof(*cmd));
507
508 ret = wl1271_cmd_send(wl, CMD_CONNECTION_SCAN_SSID_CFG, cmd,
509 sizeof(*cmd), 0);
510 if (ret < 0) {
511 wl1271_error("cmd sched scan ssid list failed");
512 goto out;
513 }
514
515 ret = wildcard;
516out:
517 kfree(cmd);
518 return ret;
519}
520
476int wl1271_scan_sched_scan_config(struct wl1271 *wl, 521int wl1271_scan_sched_scan_config(struct wl1271 *wl,
477 struct cfg80211_sched_scan_request *req, 522 struct cfg80211_sched_scan_request *req,
478 struct ieee80211_sched_scan_ies *ies) 523 struct ieee80211_sched_scan_ies *ies)
@@ -504,14 +549,21 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
504 for (i = 0; i < SCAN_MAX_CYCLE_INTERVALS; i++) 549 for (i = 0; i < SCAN_MAX_CYCLE_INTERVALS; i++)
505 cfg->intervals[i] = cpu_to_le32(req->interval); 550 cfg->intervals[i] = cpu_to_le32(req->interval);
506 551
507 if (!force_passive && req->ssids[0].ssid_len && req->ssids[0].ssid) { 552 cfg->ssid_len = 0;
508 cfg->filter_type = SCAN_SSID_FILTER_SPECIFIC; 553 if (req->n_ssids == 0) {
509 cfg->ssid_len = req->ssids[0].ssid_len; 554 wl1271_debug(DEBUG_SCAN, "using SCAN_SSID_FILTER_ANY");
510 memcpy(cfg->ssid, req->ssids[0].ssid,
511 req->ssids[0].ssid_len);
512 } else {
513 cfg->filter_type = SCAN_SSID_FILTER_ANY; 555 cfg->filter_type = SCAN_SSID_FILTER_ANY;
514 cfg->ssid_len = 0; 556 } else {
557 ret = wl12xx_scan_sched_scan_ssid_list(wl, req);
558 if (ret < 0)
559 goto out;
560 if (ret) {
561 wl1271_debug(DEBUG_SCAN, "using SCAN_SSID_FILTER_DISABLED");
562 cfg->filter_type = SCAN_SSID_FILTER_DISABLED;
563 } else {
564 wl1271_debug(DEBUG_SCAN, "using SCAN_SSID_FILTER_LIST");
565 cfg->filter_type = SCAN_SSID_FILTER_LIST;
566 }
515 } 567 }
516 568
517 if (!wl1271_scan_sched_scan_channels(wl, req, cfg)) { 569 if (!wl1271_scan_sched_scan_channels(wl, req, cfg)) {