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.c524
1 files changed, 30 insertions, 494 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index 741e65ec8301..d12fd5553846 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 226
232 /* Remove this scanned band from the list of pending 227 /*
233 * bands to scan, band G precedes A in order of scanning 228 * If a request to abort was given, or the scan did not succeed
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
240 /* 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,28 @@ 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 ieee80211_vif *vif,
317 struct cfg80211_scan_request *req)
490{ 318{
491 unsigned long flags;
492 struct iwl_priv *priv = hw->priv; 319 struct iwl_priv *priv = hw->priv;
493 int ret, i; 320 int ret;
494 321
495 IWL_DEBUG_MAC80211(priv, "enter\n"); 322 IWL_DEBUG_MAC80211(priv, "enter\n");
496 323
324 if (req->n_channels == 0)
325 return -EINVAL;
326
497 mutex_lock(&priv->mutex); 327 mutex_lock(&priv->mutex);
498 spin_lock_irqsave(&priv->lock, flags);
499 328
500 if (!iwl_is_ready_rf(priv)) { 329 if (!iwl_is_ready_rf(priv)) {
501 ret = -EIO; 330 ret = -EIO;
@@ -515,22 +344,8 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
515 goto out_unlock; 344 goto out_unlock;
516 } 345 }
517 346
518 /* We don't schedule scan within next_scan_jiffies period. 347 /* mac80211 will only ask for one band at a time */
519 * Avoid scanning during possible EAPOL exchange, return 348 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; 349 priv->scan_request = req;
535 350
536 ret = iwl_scan_initiate(priv); 351 ret = iwl_scan_initiate(priv);
@@ -538,7 +353,6 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
538 IWL_DEBUG_MAC80211(priv, "leave\n"); 353 IWL_DEBUG_MAC80211(priv, "leave\n");
539 354
540out_unlock: 355out_unlock:
541 spin_unlock_irqrestore(&priv->lock, flags);
542 mutex_unlock(&priv->mutex); 356 mutex_unlock(&priv->mutex);
543 357
544 return ret; 358 return ret;
@@ -576,22 +390,19 @@ static void iwl_bg_start_internal_scan(struct work_struct *work)
576 goto unlock; 390 goto unlock;
577 } 391 }
578 392
579 priv->scan_bands = 0; 393 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 394
585 IWL_DEBUG_SCAN(priv, "Start internal short scan...\n"); 395 IWL_DEBUG_SCAN(priv, "Start internal short scan...\n");
586 set_bit(STATUS_SCANNING, &priv->status); 396 set_bit(STATUS_SCANNING, &priv->status);
587 priv->is_internal_short_scan = true; 397 priv->is_internal_short_scan = true;
588 queue_work(priv->workqueue, &priv->request_scan); 398
399 if (WARN_ON(!priv->cfg->ops->utils->request_scan))
400 goto unlock;
401
402 priv->cfg->ops->utils->request_scan(priv);
589 unlock: 403 unlock:
590 mutex_unlock(&priv->mutex); 404 mutex_unlock(&priv->mutex);
591} 405}
592EXPORT_SYMBOL(iwl_internal_short_hw_scan);
593
594#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ)
595 406
596void iwl_bg_scan_check(struct work_struct *data) 407void iwl_bg_scan_check(struct work_struct *data)
597{ 408{
@@ -654,289 +465,15 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame,
654 if (WARN_ON(left < ie_len)) 465 if (WARN_ON(left < ie_len))
655 return len; 466 return len;
656 467
657 if (ies) 468 if (ies && ie_len) {
658 memcpy(pos, ies, ie_len); 469 memcpy(pos, ies, ie_len);
659 len += ie_len; 470 len += ie_len;
660 left -= ie_len; 471 }
661 472
662 return (u16)len; 473 return (u16)len;
663} 474}
664EXPORT_SYMBOL(iwl_fill_probe_req); 475EXPORT_SYMBOL(iwl_fill_probe_req);
665 476
666static void iwl_bg_request_scan(struct work_struct *data)
667{
668 struct iwl_priv *priv =
669 container_of(data, struct iwl_priv, request_scan);
670 struct iwl_host_cmd cmd = {
671 .id = REPLY_SCAN_CMD,
672 .len = sizeof(struct iwl_scan_cmd),
673 .flags = CMD_SIZE_HUGE,
674 };
675 struct iwl_scan_cmd *scan;
676 struct ieee80211_conf *conf = NULL;
677 int ret = 0;
678 u32 rate_flags = 0;
679 u16 cmd_len;
680 u16 rx_chain = 0;
681 enum ieee80211_band band;
682 u8 n_probes = 0;
683 u8 rx_ant = priv->hw_params.valid_rx_ant;
684 u8 rate;
685 bool is_active = false;
686 int chan_mod;
687 u8 active_chains;
688
689 conf = ieee80211_get_hw_conf(priv->hw);
690
691 mutex_lock(&priv->mutex);
692
693 cancel_delayed_work(&priv->scan_check);
694
695 if (!iwl_is_ready(priv)) {
696 IWL_WARN(priv, "request scan called when driver not ready.\n");
697 goto done;
698 }
699
700 /* Make sure the scan wasn't canceled before this queued work
701 * was given the chance to run... */
702 if (!test_bit(STATUS_SCANNING, &priv->status))
703 goto done;
704
705 /* This should never be called or scheduled if there is currently
706 * a scan active in the hardware. */
707 if (test_bit(STATUS_SCAN_HW, &priv->status)) {
708 IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests in parallel. "
709 "Ignoring second request.\n");
710 ret = -EIO;
711 goto done;
712 }
713
714 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) {
715 IWL_DEBUG_SCAN(priv, "Aborting scan due to device shutdown\n");
716 goto done;
717 }
718
719 if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
720 IWL_DEBUG_HC(priv, "Scan request while abort pending. Queuing.\n");
721 goto done;
722 }
723
724 if (iwl_is_rfkill(priv)) {
725 IWL_DEBUG_HC(priv, "Aborting scan due to RF Kill activation\n");
726 goto done;
727 }
728
729 if (!test_bit(STATUS_READY, &priv->status)) {
730 IWL_DEBUG_HC(priv, "Scan request while uninitialized. Queuing.\n");
731 goto done;
732 }
733
734 if (!priv->scan_bands) {
735 IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n");
736 goto done;
737 }
738
739 if (!priv->scan) {
740 priv->scan = kmalloc(sizeof(struct iwl_scan_cmd) +
741 IWL_MAX_SCAN_SIZE, GFP_KERNEL);
742 if (!priv->scan) {
743 ret = -ENOMEM;
744 goto done;
745 }
746 }
747 scan = priv->scan;
748 memset(scan, 0, sizeof(struct iwl_scan_cmd) + IWL_MAX_SCAN_SIZE);
749
750 scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH;
751 scan->quiet_time = IWL_ACTIVE_QUIET_TIME;
752
753 if (iwl_is_associated(priv)) {
754 u16 interval = 0;
755 u32 extra;
756 u32 suspend_time = 100;
757 u32 scan_suspend_time = 100;
758 unsigned long flags;
759
760 IWL_DEBUG_INFO(priv, "Scanning while associated...\n");
761 spin_lock_irqsave(&priv->lock, flags);
762 interval = priv->beacon_int;
763 spin_unlock_irqrestore(&priv->lock, flags);
764
765 scan->suspend_time = 0;
766 scan->max_out_time = cpu_to_le32(200 * 1024);
767 if (!interval)
768 interval = suspend_time;
769
770 extra = (suspend_time / interval) << 22;
771 scan_suspend_time = (extra |
772 ((suspend_time % interval) * 1024));
773 scan->suspend_time = cpu_to_le32(scan_suspend_time);
774 IWL_DEBUG_SCAN(priv, "suspend_time 0x%X beacon interval %d\n",
775 scan_suspend_time, interval);
776 }
777
778 if (priv->is_internal_short_scan) {
779 IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n");
780 } else if (priv->scan_request->n_ssids) {
781 int i, p = 0;
782 IWL_DEBUG_SCAN(priv, "Kicking off active scan\n");
783 for (i = 0; i < priv->scan_request->n_ssids; i++) {
784 /* always does wildcard anyway */
785 if (!priv->scan_request->ssids[i].ssid_len)
786 continue;
787 scan->direct_scan[p].id = WLAN_EID_SSID;
788 scan->direct_scan[p].len =
789 priv->scan_request->ssids[i].ssid_len;
790 memcpy(scan->direct_scan[p].ssid,
791 priv->scan_request->ssids[i].ssid,
792 priv->scan_request->ssids[i].ssid_len);
793 n_probes++;
794 p++;
795 }
796 is_active = true;
797 } else
798 IWL_DEBUG_SCAN(priv, "Start passive scan.\n");
799
800 scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK;
801 scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id;
802 scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
803
804
805 if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) {
806 band = IEEE80211_BAND_2GHZ;
807 scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK;
808 chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK)
809 >> RXON_FLG_CHANNEL_MODE_POS;
810 if (chan_mod == CHANNEL_MODE_PURE_40) {
811 rate = IWL_RATE_6M_PLCP;
812 } else {
813 rate = IWL_RATE_1M_PLCP;
814 rate_flags = RATE_MCS_CCK_MSK;
815 }
816 scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED;
817 } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) {
818 band = IEEE80211_BAND_5GHZ;
819 rate = IWL_RATE_6M_PLCP;
820 /*
821 * If active scanning is requested but a certain channel is
822 * marked passive, we can do active scanning if we detect
823 * transmissions.
824 *
825 * There is an issue with some firmware versions that triggers
826 * a sysassert on a "good CRC threshold" of zero (== disabled),
827 * on a radar channel even though this means that we should NOT
828 * send probes.
829 *
830 * The "good CRC threshold" is the number of frames that we
831 * need to receive during our dwell time on a channel before
832 * sending out probes -- setting this to a huge value will
833 * mean we never reach it, but at the same time work around
834 * the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER
835 * here instead of IWL_GOOD_CRC_TH_DISABLED.
836 */
837 scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
838 IWL_GOOD_CRC_TH_NEVER;
839
840 /* Force use of chains B and C (0x6) for scan Rx for 4965
841 * Avoid A (0x1) because of its off-channel reception on A-band.
842 */
843 if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) == CSR_HW_REV_TYPE_4965)
844 rx_ant = ANT_BC;
845 } else {
846 IWL_WARN(priv, "Invalid scan band count\n");
847 goto done;
848 }
849
850 priv->scan_tx_ant[band] =
851 iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]);
852 rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]);
853 scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags);
854
855 /* In power save mode use one chain, otherwise use all chains */
856 if (test_bit(STATUS_POWER_PMI, &priv->status)) {
857 /* rx_ant has been set to all valid chains previously */
858 active_chains = rx_ant &
859 ((u8)(priv->chain_noise_data.active_chains));
860 if (!active_chains)
861 active_chains = rx_ant;
862
863 IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n",
864 priv->chain_noise_data.active_chains);
865
866 rx_ant = first_antenna(active_chains);
867 }
868 /* MIMO is not used here, but value is required */
869 rx_chain |= priv->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS;
870 rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS;
871 rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS;
872 rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS;
873 scan->rx_chain = cpu_to_le16(rx_chain);
874 if (!priv->is_internal_short_scan) {
875 cmd_len = iwl_fill_probe_req(priv,
876 (struct ieee80211_mgmt *)scan->data,
877 priv->scan_request->ie,
878 priv->scan_request->ie_len,
879 IWL_MAX_SCAN_SIZE - sizeof(*scan));
880 } else {
881 cmd_len = iwl_fill_probe_req(priv,
882 (struct ieee80211_mgmt *)scan->data,
883 NULL, 0,
884 IWL_MAX_SCAN_SIZE - sizeof(*scan));
885
886 }
887 scan->tx_cmd.len = cpu_to_le16(cmd_len);
888 if (iwl_is_monitor_mode(priv))
889 scan->filter_flags = RXON_FILTER_PROMISC_MSK;
890
891 scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK |
892 RXON_FILTER_BCON_AWARE_MSK);
893
894 if (priv->is_internal_short_scan) {
895 scan->channel_count =
896 iwl_get_single_channel_for_scan(priv, band,
897 (void *)&scan->data[le16_to_cpu(
898 scan->tx_cmd.len)]);
899 } else {
900 scan->channel_count =
901 iwl_get_channels_for_scan(priv, band,
902 is_active, n_probes,
903 (void *)&scan->data[le16_to_cpu(
904 scan->tx_cmd.len)]);
905 }
906 if (scan->channel_count == 0) {
907 IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count);
908 goto done;
909 }
910
911 cmd.len += le16_to_cpu(scan->tx_cmd.len) +
912 scan->channel_count * sizeof(struct iwl_scan_channel);
913 cmd.data = scan;
914 scan->len = cpu_to_le16(cmd.len);
915
916 set_bit(STATUS_SCAN_HW, &priv->status);
917 ret = iwl_send_cmd_sync(priv, &cmd);
918 if (ret)
919 goto done;
920
921 queue_delayed_work(priv->workqueue, &priv->scan_check,
922 IWL_SCAN_CHECK_WATCHDOG);
923
924 mutex_unlock(&priv->mutex);
925 return;
926
927 done:
928 /* Cannot perform scan. Make sure we clear scanning
929 * bits from status so next scan request can be performed.
930 * If we don't clear scanning status bit here all next scan
931 * will fail
932 */
933 clear_bit(STATUS_SCAN_HW, &priv->status);
934 clear_bit(STATUS_SCANNING, &priv->status);
935 /* inform mac80211 scan aborted */
936 queue_work(priv->workqueue, &priv->scan_completed);
937 mutex_unlock(&priv->mutex);
938}
939
940void iwl_bg_abort_scan(struct work_struct *work) 477void iwl_bg_abort_scan(struct work_struct *work)
941{ 478{
942 struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); 479 struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan);
@@ -984,7 +521,6 @@ EXPORT_SYMBOL(iwl_bg_scan_completed);
984void iwl_setup_scan_deferred_work(struct iwl_priv *priv) 521void iwl_setup_scan_deferred_work(struct iwl_priv *priv)
985{ 522{
986 INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); 523 INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
987 INIT_WORK(&priv->request_scan, iwl_bg_request_scan);
988 INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); 524 INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan);
989 INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan); 525 INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan);
990 INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); 526 INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check);