aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-scan.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-scan.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c506
1 files changed, 28 insertions, 478 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index de0446d4bfe9..f4b897804a80 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -69,9 +69,8 @@ int iwl_scan_cancel(struct iwl_priv *priv)
69 } 69 }
70 70
71 if (test_bit(STATUS_SCANNING, &priv->status)) { 71 if (test_bit(STATUS_SCANNING, &priv->status)) {
72 if (!test_bit(STATUS_SCAN_ABORTING, &priv->status)) { 72 if (!test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) {
73 IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n"); 73 IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n");
74 set_bit(STATUS_SCAN_ABORTING, &priv->status);
75 queue_work(priv->workqueue, &priv->abort_scan); 74 queue_work(priv->workqueue, &priv->abort_scan);
76 75
77 } else 76 } else
@@ -201,9 +200,6 @@ static void iwl_rx_scan_results_notif(struct iwl_priv *priv,
201 le32_to_cpu(notif->statistics[0]), 200 le32_to_cpu(notif->statistics[0]),
202 le32_to_cpu(notif->tsf_low) - priv->scan_start_tsf); 201 le32_to_cpu(notif->tsf_low) - priv->scan_start_tsf);
203#endif 202#endif
204
205 if (!priv->is_internal_short_scan)
206 priv->next_scan_jiffies = 0;
207} 203}
208 204
209/* Service SCAN_COMPLETE_NOTIFICATION (0x84) */ 205/* Service SCAN_COMPLETE_NOTIFICATION (0x84) */
@@ -223,49 +219,24 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv,
223 /* The HW is no longer scanning */ 219 /* The HW is no longer scanning */
224 clear_bit(STATUS_SCAN_HW, &priv->status); 220 clear_bit(STATUS_SCAN_HW, &priv->status);
225 221
226 IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n", 222 IWL_DEBUG_INFO(priv, "Scan on %sGHz took %dms\n",
227 (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? 223 (priv->scan_band == IEEE80211_BAND_2GHZ) ? "2.4" : "5.2",
228 "2.4" : "5.2",
229 jiffies_to_msecs(elapsed_jiffies 224 jiffies_to_msecs(elapsed_jiffies
230 (priv->scan_pass_start, jiffies))); 225 (priv->scan_start, jiffies)));
231
232 /* Remove this scanned band from the list of pending
233 * bands to scan, band G precedes A in order of scanning
234 * as seen in iwl_bg_request_scan */
235 if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ))
236 priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ);
237 else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ))
238 priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ);
239 226
240 /* If a request to abort was given, or the scan did not succeed 227 /*
228 * If a request to abort was given, or the scan did not succeed
241 * then we reset the scan state machine and terminate, 229 * then we reset the scan state machine and terminate,
242 * re-queuing another scan if one has been requested */ 230 * re-queuing another scan if one has been requested
243 if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { 231 */
232 if (test_and_clear_bit(STATUS_SCAN_ABORTING, &priv->status))
244 IWL_DEBUG_INFO(priv, "Aborted scan completed.\n"); 233 IWL_DEBUG_INFO(priv, "Aborted scan completed.\n");
245 clear_bit(STATUS_SCAN_ABORTING, &priv->status);
246 } else {
247 /* If there are more bands on this scan pass reschedule */
248 if (priv->scan_bands)
249 goto reschedule;
250 }
251
252 if (!priv->is_internal_short_scan)
253 priv->next_scan_jiffies = 0;
254 234
255 IWL_DEBUG_INFO(priv, "Setting scan to off\n"); 235 IWL_DEBUG_INFO(priv, "Setting scan to off\n");
256 236
257 clear_bit(STATUS_SCANNING, &priv->status); 237 clear_bit(STATUS_SCANNING, &priv->status);
258 238
259 IWL_DEBUG_INFO(priv, "Scan took %dms\n",
260 jiffies_to_msecs(elapsed_jiffies(priv->scan_start, jiffies)));
261
262 queue_work(priv->workqueue, &priv->scan_completed); 239 queue_work(priv->workqueue, &priv->scan_completed);
263
264 return;
265
266reschedule:
267 priv->scan_pass_start = jiffies;
268 queue_work(priv->workqueue, &priv->request_scan);
269} 240}
270 241
271void iwl_setup_rx_scan_handlers(struct iwl_priv *priv) 242void iwl_setup_rx_scan_handlers(struct iwl_priv *priv)
@@ -314,150 +285,6 @@ u16 iwl_get_passive_dwell_time(struct iwl_priv *priv,
314} 285}
315EXPORT_SYMBOL(iwl_get_passive_dwell_time); 286EXPORT_SYMBOL(iwl_get_passive_dwell_time);
316 287
317static int iwl_get_single_channel_for_scan(struct iwl_priv *priv,
318 enum ieee80211_band band,
319 struct iwl_scan_channel *scan_ch)
320{
321 const struct ieee80211_supported_band *sband;
322 const struct iwl_channel_info *ch_info;
323 u16 passive_dwell = 0;
324 u16 active_dwell = 0;
325 int i, added = 0;
326 u16 channel = 0;
327
328 sband = iwl_get_hw_mode(priv, band);
329 if (!sband) {
330 IWL_ERR(priv, "invalid band\n");
331 return added;
332 }
333
334 active_dwell = iwl_get_active_dwell_time(priv, band, 0);
335 passive_dwell = iwl_get_passive_dwell_time(priv, band);
336
337 if (passive_dwell <= active_dwell)
338 passive_dwell = active_dwell + 1;
339
340 /* only scan single channel, good enough to reset the RF */
341 /* pick the first valid not in-use channel */
342 if (band == IEEE80211_BAND_5GHZ) {
343 for (i = 14; i < priv->channel_count; i++) {
344 if (priv->channel_info[i].channel !=
345 le16_to_cpu(priv->staging_rxon.channel)) {
346 channel = priv->channel_info[i].channel;
347 ch_info = iwl_get_channel_info(priv,
348 band, channel);
349 if (is_channel_valid(ch_info))
350 break;
351 }
352 }
353 } else {
354 for (i = 0; i < 14; i++) {
355 if (priv->channel_info[i].channel !=
356 le16_to_cpu(priv->staging_rxon.channel)) {
357 channel =
358 priv->channel_info[i].channel;
359 ch_info = iwl_get_channel_info(priv,
360 band, channel);
361 if (is_channel_valid(ch_info))
362 break;
363 }
364 }
365 }
366 if (channel) {
367 scan_ch->channel = cpu_to_le16(channel);
368 scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
369 scan_ch->active_dwell = cpu_to_le16(active_dwell);
370 scan_ch->passive_dwell = cpu_to_le16(passive_dwell);
371 /* Set txpower levels to defaults */
372 scan_ch->dsp_atten = 110;
373 if (band == IEEE80211_BAND_5GHZ)
374 scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
375 else
376 scan_ch->tx_gain = ((1 << 5) | (5 << 3));
377 added++;
378 } else
379 IWL_ERR(priv, "no valid channel found\n");
380 return added;
381}
382
383static int iwl_get_channels_for_scan(struct iwl_priv *priv,
384 enum ieee80211_band band,
385 u8 is_active, u8 n_probes,
386 struct iwl_scan_channel *scan_ch)
387{
388 struct ieee80211_channel *chan;
389 const struct ieee80211_supported_band *sband;
390 const struct iwl_channel_info *ch_info;
391 u16 passive_dwell = 0;
392 u16 active_dwell = 0;
393 int added, i;
394 u16 channel;
395
396 sband = iwl_get_hw_mode(priv, band);
397 if (!sband)
398 return 0;
399
400 active_dwell = iwl_get_active_dwell_time(priv, band, n_probes);
401 passive_dwell = iwl_get_passive_dwell_time(priv, band);
402
403 if (passive_dwell <= active_dwell)
404 passive_dwell = active_dwell + 1;
405
406 for (i = 0, added = 0; i < priv->scan_request->n_channels; i++) {
407 chan = priv->scan_request->channels[i];
408
409 if (chan->band != band)
410 continue;
411
412 channel = ieee80211_frequency_to_channel(chan->center_freq);
413 scan_ch->channel = cpu_to_le16(channel);
414
415 ch_info = iwl_get_channel_info(priv, band, channel);
416 if (!is_channel_valid(ch_info)) {
417 IWL_DEBUG_SCAN(priv, "Channel %d is INVALID for this band.\n",
418 channel);
419 continue;
420 }
421
422 if (!is_active || is_channel_passive(ch_info) ||
423 (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN))
424 scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
425 else
426 scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE;
427
428 if (n_probes)
429 scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes);
430
431 scan_ch->active_dwell = cpu_to_le16(active_dwell);
432 scan_ch->passive_dwell = cpu_to_le16(passive_dwell);
433
434 /* Set txpower levels to defaults */
435 scan_ch->dsp_atten = 110;
436
437 /* NOTE: if we were doing 6Mb OFDM for scans we'd use
438 * power level:
439 * scan_ch->tx_gain = ((1 << 5) | (2 << 3)) | 3;
440 */
441 if (band == IEEE80211_BAND_5GHZ)
442 scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3;
443 else
444 scan_ch->tx_gain = ((1 << 5) | (5 << 3));
445
446 IWL_DEBUG_SCAN(priv, "Scanning ch=%d prob=0x%X [%s %d]\n",
447 channel, le32_to_cpu(scan_ch->type),
448 (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ?
449 "ACTIVE" : "PASSIVE",
450 (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ?
451 active_dwell : passive_dwell);
452
453 scan_ch++;
454 added++;
455 }
456
457 IWL_DEBUG_SCAN(priv, "total channels to scan %d\n", added);
458 return added;
459}
460
461void iwl_init_scan_params(struct iwl_priv *priv) 288void iwl_init_scan_params(struct iwl_priv *priv)
462{ 289{
463 u8 ant_idx = fls(priv->hw_params.valid_tx_ant) - 1; 290 u8 ant_idx = fls(priv->hw_params.valid_tx_ant) - 1;
@@ -476,26 +303,27 @@ static int iwl_scan_initiate(struct iwl_priv *priv)
476 set_bit(STATUS_SCANNING, &priv->status); 303 set_bit(STATUS_SCANNING, &priv->status);
477 priv->is_internal_short_scan = false; 304 priv->is_internal_short_scan = false;
478 priv->scan_start = jiffies; 305 priv->scan_start = jiffies;
479 priv->scan_pass_start = priv->scan_start;
480 306
481 queue_work(priv->workqueue, &priv->request_scan); 307 if (WARN_ON(!priv->cfg->ops->utils->request_scan))
308 return -EOPNOTSUPP;
309
310 priv->cfg->ops->utils->request_scan(priv);
482 311
483 return 0; 312 return 0;
484} 313}
485 314
486#define IWL_DELAY_NEXT_SCAN (HZ*2)
487
488int iwl_mac_hw_scan(struct ieee80211_hw *hw, 315int iwl_mac_hw_scan(struct ieee80211_hw *hw,
489 struct cfg80211_scan_request *req) 316 struct cfg80211_scan_request *req)
490{ 317{
491 unsigned long flags;
492 struct iwl_priv *priv = hw->priv; 318 struct iwl_priv *priv = hw->priv;
493 int ret, i; 319 int ret;
494 320
495 IWL_DEBUG_MAC80211(priv, "enter\n"); 321 IWL_DEBUG_MAC80211(priv, "enter\n");
496 322
323 if (req->n_channels == 0)
324 return -EINVAL;
325
497 mutex_lock(&priv->mutex); 326 mutex_lock(&priv->mutex);
498 spin_lock_irqsave(&priv->lock, flags);
499 327
500 if (!iwl_is_ready_rf(priv)) { 328 if (!iwl_is_ready_rf(priv)) {
501 ret = -EIO; 329 ret = -EIO;
@@ -515,22 +343,8 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
515 goto out_unlock; 343 goto out_unlock;
516 } 344 }
517 345
518 /* We don't schedule scan within next_scan_jiffies period. 346 /* mac80211 will only ask for one band at a time */
519 * Avoid scanning during possible EAPOL exchange, return 347 priv->scan_band = req->channels[0]->band;
520 * success immediately.
521 */
522 if (priv->next_scan_jiffies &&
523 time_after(priv->next_scan_jiffies, jiffies)) {
524 IWL_DEBUG_SCAN(priv, "scan rejected: within next scan period\n");
525 queue_work(priv->workqueue, &priv->scan_completed);
526 ret = 0;
527 goto out_unlock;
528 }
529
530 priv->scan_bands = 0;
531 for (i = 0; i < req->n_channels; i++)
532 priv->scan_bands |= BIT(req->channels[i]->band);
533
534 priv->scan_request = req; 348 priv->scan_request = req;
535 349
536 ret = iwl_scan_initiate(priv); 350 ret = iwl_scan_initiate(priv);
@@ -538,7 +352,6 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
538 IWL_DEBUG_MAC80211(priv, "leave\n"); 352 IWL_DEBUG_MAC80211(priv, "leave\n");
539 353
540out_unlock: 354out_unlock:
541 spin_unlock_irqrestore(&priv->lock, flags);
542 mutex_unlock(&priv->mutex); 355 mutex_unlock(&priv->mutex);
543 356
544 return ret; 357 return ret;
@@ -576,22 +389,20 @@ static void iwl_bg_start_internal_scan(struct work_struct *work)
576 goto unlock; 389 goto unlock;
577 } 390 }
578 391
579 priv->scan_bands = 0; 392 priv->scan_band = priv->band;
580 if (priv->band == IEEE80211_BAND_5GHZ)
581 priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ);
582 else
583 priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ);
584 393
585 IWL_DEBUG_SCAN(priv, "Start internal short scan...\n"); 394 IWL_DEBUG_SCAN(priv, "Start internal short scan...\n");
586 set_bit(STATUS_SCANNING, &priv->status); 395 set_bit(STATUS_SCANNING, &priv->status);
587 priv->is_internal_short_scan = true; 396 priv->is_internal_short_scan = true;
588 queue_work(priv->workqueue, &priv->request_scan); 397
398 if (WARN_ON(!priv->cfg->ops->utils->request_scan))
399 goto unlock;
400
401 priv->cfg->ops->utils->request_scan(priv);
589 unlock: 402 unlock:
590 mutex_unlock(&priv->mutex); 403 mutex_unlock(&priv->mutex);
591} 404}
592 405
593#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ)
594
595void iwl_bg_scan_check(struct work_struct *data) 406void iwl_bg_scan_check(struct work_struct *data)
596{ 407{
597 struct iwl_priv *priv = 408 struct iwl_priv *priv =
@@ -653,275 +464,15 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
653 if (WARN_ON(left < ie_len)) 464 if (WARN_ON(left < ie_len))
654 return len; 465 return len;
655 466
656 if (ies) 467 if (ies && ie_len) {
657 memcpy(pos, ies, ie_len); 468 memcpy(pos, ies, ie_len);
658 len += ie_len; 469 len += ie_len;
659 left -= ie_len; 470 }
660 471
661 return (u16)len; 472 return (u16)len;
662} 473}
663EXPORT_SYMBOL(iwl_fill_probe_req); 474EXPORT_SYMBOL(iwl_fill_probe_req);
664 475
665static void iwl_bg_request_scan(struct work_struct *data)
666{
667 struct iwl_priv *priv =
668 container_of(data, struct iwl_priv, request_scan);
669 struct iwl_host_cmd cmd = {
670 .id = REPLY_SCAN_CMD,
671 .len = sizeof(struct iwl_scan_cmd),
672 .flags = CMD_SIZE_HUGE,
673 };
674 struct iwl_scan_cmd *scan;
675 struct ieee80211_conf *conf = NULL;
676 u32 rate_flags = 0;
677 u16 cmd_len;
678 u16 rx_chain = 0;
679 enum ieee80211_band band;
680 u8 n_probes = 0;
681 u8 rx_ant = priv->hw_params.valid_rx_ant;
682 u8 rate;
683 bool is_active = false;
684 int chan_mod;
685 u8 active_chains;
686
687 conf = ieee80211_get_hw_conf(priv->hw);
688
689 mutex_lock(&priv->mutex);
690
691 cancel_delayed_work(&priv->scan_check);
692
693 if (!iwl_is_ready(priv)) {
694 IWL_WARN(priv, "request scan called when driver not ready.\n");
695 goto done;
696 }
697
698 /* Make sure the scan wasn't canceled before this queued work
699 * was given the chance to run... */
700 if (!test_bit(STATUS_SCANNING, &priv->status))
701 goto done;
702
703 /* This should never be called or scheduled if there is currently
704 * a scan active in the hardware. */
705 if (test_bit(STATUS_SCAN_HW, &priv->status)) {
706 IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests in parallel. "
707 "Ignoring second request.\n");
708 goto done;
709 }
710
711 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
712 IWL_DEBUG_SCAN(priv, "Aborting scan due to device shutdown\n");
713 goto done;
714 }
715
716 if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
717 IWL_DEBUG_HC(priv, "Scan request while abort pending. Queuing.\n");
718 goto done;
719 }
720
721 if (iwl_is_rfkill(priv)) {
722 IWL_DEBUG_HC(priv, "Aborting scan due to RF Kill activation\n");
723 goto done;
724 }
725
726 if (!test_bit(STATUS_READY, &priv->status)) {
727 IWL_DEBUG_HC(priv, "Scan request while uninitialized. Queuing.\n");
728 goto done;
729 }
730
731 if (!priv->scan_bands) {
732 IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n");
733 goto done;
734 }
735
736 if (!priv->scan) {
737 priv->scan = kmalloc(sizeof(struct iwl_scan_cmd) +
738 IWL_MAX_SCAN_SIZE, GFP_KERNEL);
739 if (!priv->scan) {
740 IWL_DEBUG_SCAN(priv,
741 "fail to allocate memory for scan\n");
742 goto done;
743 }
744 }
745 scan = priv->scan;
746 memset(scan, 0, sizeof(struct iwl_scan_cmd) + IWL_MAX_SCAN_SIZE);
747
748 scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH;
749 scan->quiet_time = IWL_ACTIVE_QUIET_TIME;
750
751 if (iwl_is_associated(priv)) {
752 u16 interval = 0;
753 u32 extra;
754 u32 suspend_time = 100;
755 u32 scan_suspend_time = 100;
756 unsigned long flags;
757
758 IWL_DEBUG_INFO(priv, "Scanning while associated...\n");
759 spin_lock_irqsave(&priv->lock, flags);
760 interval = priv->beacon_int;
761 spin_unlock_irqrestore(&priv->lock, flags);
762
763 scan->suspend_time = 0;
764 scan->max_out_time = cpu_to_le32(200 * 1024);
765 if (!interval)
766 interval = suspend_time;
767
768 extra = (suspend_time / interval) << 22;
769 scan_suspend_time = (extra |
770 ((suspend_time % interval) * 1024));
771 scan->suspend_time = cpu_to_le32(scan_suspend_time);
772 IWL_DEBUG_SCAN(priv, "suspend_time 0x%X beacon interval %d\n",
773 scan_suspend_time, interval);
774 }
775
776 if (priv->is_internal_short_scan) {
777 IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n");
778 } else if (priv->scan_request->n_ssids) {
779 int i, p = 0;
780 IWL_DEBUG_SCAN(priv, "Kicking off active scan\n");
781 for (i = 0; i < priv->scan_request->n_ssids; i++) {
782 /* always does wildcard anyway */
783 if (!priv->scan_request->ssids[i].ssid_len)
784 continue;
785 scan->direct_scan[p].id = WLAN_EID_SSID;
786 scan->direct_scan[p].len =
787 priv->scan_request->ssids[i].ssid_len;
788 memcpy(scan->direct_scan[p].ssid,
789 priv->scan_request->ssids[i].ssid,
790 priv->scan_request->ssids[i].ssid_len);
791 n_probes++;
792 p++;
793 }
794 is_active = true;
795 } else
796 IWL_DEBUG_SCAN(priv, "Start passive scan.\n");
797
798 scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK;
799 scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id;
800 scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
801
802
803 if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) {
804 band = IEEE80211_BAND_2GHZ;
805 scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
806 chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK)
807 >> RXON_FLG_CHANNEL_MODE_POS;
808 if (chan_mod == CHANNEL_MODE_PURE_40) {
809 rate = IWL_RATE_6M_PLCP;
810 } else {
811 rate = IWL_RATE_1M_PLCP;
812 rate_flags = RATE_MCS_CCK_MSK;
813 }
814 scan->good_CRC_th = 0;
815 } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) {
816 band = IEEE80211_BAND_5GHZ;
817 rate = IWL_RATE_6M_PLCP;
818 /*
819 * If active scaning is requested but a certain channel
820 * is marked passive, we can do active scanning if we
821 * detect transmissions.
822 */
823 scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0;
824
825 /* Force use of chains B and C (0x6) for scan Rx
826 * Avoid A (0x1) for the device has off-channel reception
827 * on A-band.
828 */
829 if (priv->cfg->off_channel_workaround)
830 rx_ant = ANT_BC;
831 } else {
832 IWL_WARN(priv, "Invalid scan band count\n");
833 goto done;
834 }
835
836 priv->scan_tx_ant[band] =
837 iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]);
838 rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
839 scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags);
840
841 /* In power save mode use one chain, otherwise use all chains */
842 if (test_bit(STATUS_POWER_PMI, &priv->status)) {
843 /* rx_ant has been set to all valid chains previously */
844 active_chains = rx_ant &
845 ((u8)(priv->chain_noise_data.active_chains));
846 if (!active_chains)
847 active_chains = rx_ant;
848
849 IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n",
850 priv->chain_noise_data.active_chains);
851
852 rx_ant = first_antenna(active_chains);
853 }
854 /* MIMO is not used here, but value is required */
855 rx_chain |= priv->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS;
856 rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
857 rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
858 rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
859 scan->rx_chain = cpu_to_le16(rx_chain);
860 if (!priv->is_internal_short_scan) {
861 cmd_len = iwl_fill_probe_req(priv,
862 (struct ieee80211_mgmt *)scan->data,
863 priv->scan_request->ie,
864 priv->scan_request->ie_len,
865 IWL_MAX_SCAN_SIZE - sizeof(*scan));
866 } else {
867 cmd_len = iwl_fill_probe_req(priv,
868 (struct ieee80211_mgmt *)scan->data,
869 NULL, 0,
870 IWL_MAX_SCAN_SIZE - sizeof(*scan));
871
872 }
873 scan->tx_cmd.len = cpu_to_le16(cmd_len);
874 if (iwl_is_monitor_mode(priv))
875 scan->filter_flags = RXON_FILTER_PROMISC_MSK;
876
877 scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK |
878 RXON_FILTER_BCON_AWARE_MSK);
879
880 if (priv->is_internal_short_scan) {
881 scan->channel_count =
882 iwl_get_single_channel_for_scan(priv, band,
883 (void *)&scan->data[le16_to_cpu(
884 scan->tx_cmd.len)]);
885 } else {
886 scan->channel_count =
887 iwl_get_channels_for_scan(priv, band,
888 is_active, n_probes,
889 (void *)&scan->data[le16_to_cpu(
890 scan->tx_cmd.len)]);
891 }
892 if (scan->channel_count == 0) {
893 IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count);
894 goto done;
895 }
896
897 cmd.len += le16_to_cpu(scan->tx_cmd.len) +
898 scan->channel_count * sizeof(struct iwl_scan_channel);
899 cmd.data = scan;
900 scan->len = cpu_to_le16(cmd.len);
901
902 set_bit(STATUS_SCAN_HW, &priv->status);
903 if (iwl_send_cmd_sync(priv, &cmd))
904 goto done;
905
906 queue_delayed_work(priv->workqueue, &priv->scan_check,
907 IWL_SCAN_CHECK_WATCHDOG);
908
909 mutex_unlock(&priv->mutex);
910 return;
911
912 done:
913 /* Cannot perform scan. Make sure we clear scanning
914 * bits from status so next scan request can be performed.
915 * If we don't clear scanning status bit here all next scan
916 * will fail
917 */
918 clear_bit(STATUS_SCAN_HW, &priv->status);
919 clear_bit(STATUS_SCANNING, &priv->status);
920 /* inform mac80211 scan aborted */
921 queue_work(priv->workqueue, &priv->scan_completed);
922 mutex_unlock(&priv->mutex);
923}
924
925void iwl_bg_abort_scan(struct work_struct *work) 476void iwl_bg_abort_scan(struct work_struct *work)
926{ 477{
927 struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); 478 struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);
@@ -969,7 +520,6 @@ EXPORT_SYMBOL(iwl_bg_scan_completed);
969void iwl_setup_scan_deferred_work(struct iwl_priv *priv) 520void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
970{ 521{
971 INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); 522 INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
972 INIT_WORK(&priv->request_scan, iwl_bg_request_scan);
973 INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); 523 INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan);
974 INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan); 524 INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);
975 INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); 525 INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);