diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/scan.c')
-rw-r--r-- | drivers/net/wireless/wl12xx/scan.c | 66 |
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 */ | ||
478 | static int | ||
479 | wl12xx_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; | ||
516 | out: | ||
517 | kfree(cmd); | ||
518 | return ret; | ||
519 | } | ||
520 | |||
476 | int wl1271_scan_sched_scan_config(struct wl1271 *wl, | 521 | int 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)) { |