diff options
author | Abhijeet Kolekar <abhijeet.kolekar@intel.com> | 2009-02-18 18:54:27 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-02-27 14:52:45 -0500 |
commit | e9dde6f6edf9954e2c75d2d738cae0f00e9b0fbc (patch) | |
tree | 2af59857d5f05d975c10006277f3011bfb9ab609 | |
parent | cade0eb2c7c7b8df60ac54409592c1a23e3220c8 (diff) |
iwl3945: use iwl_mac_hw_scan callback
3945 can use iwl_mac_hw_scan callback instead of
iwl3945_mac_hw_scan callback.
Signed-off-by: Abhijeet Kolekar <abhijeet.kolekar@intel.com>
Acked-by: Samuel Ortiz <samuel.ortiz@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 65 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 68 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 94 |
4 files changed, 70 insertions, 158 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index ad310050e298..e6168672a534 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2677,71 +2677,6 @@ static void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2677 | 2677 | ||
2678 | } | 2678 | } |
2679 | 2679 | ||
2680 | static int iwl_mac_hw_scan(struct ieee80211_hw *hw, | ||
2681 | struct cfg80211_scan_request *req) | ||
2682 | { | ||
2683 | unsigned long flags; | ||
2684 | struct iwl_priv *priv = hw->priv; | ||
2685 | int ret; | ||
2686 | u8 *ssid = NULL; | ||
2687 | size_t ssid_len = 0; | ||
2688 | |||
2689 | if (req->n_ssids) { | ||
2690 | ssid = req->ssids[0].ssid; | ||
2691 | ssid_len = req->ssids[0].ssid_len; | ||
2692 | } | ||
2693 | |||
2694 | IWL_DEBUG_MAC80211(priv, "enter\n"); | ||
2695 | |||
2696 | mutex_lock(&priv->mutex); | ||
2697 | spin_lock_irqsave(&priv->lock, flags); | ||
2698 | |||
2699 | if (!iwl_is_ready_rf(priv)) { | ||
2700 | ret = -EIO; | ||
2701 | IWL_DEBUG_MAC80211(priv, "leave - not ready or exit pending\n"); | ||
2702 | goto out_unlock; | ||
2703 | } | ||
2704 | |||
2705 | /* We don't schedule scan within next_scan_jiffies period. | ||
2706 | * Avoid scanning during possible EAPOL exchange, return | ||
2707 | * success immediately. | ||
2708 | */ | ||
2709 | if (priv->next_scan_jiffies && | ||
2710 | time_after(priv->next_scan_jiffies, jiffies)) { | ||
2711 | IWL_DEBUG_SCAN(priv, "scan rejected: within next scan period\n"); | ||
2712 | queue_work(priv->workqueue, &priv->scan_completed); | ||
2713 | ret = 0; | ||
2714 | goto out_unlock; | ||
2715 | } | ||
2716 | |||
2717 | /* if we just finished scan ask for delay */ | ||
2718 | if (iwl_is_associated(priv) && priv->last_scan_jiffies && | ||
2719 | time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) { | ||
2720 | IWL_DEBUG_SCAN(priv, "scan rejected: within previous scan period\n"); | ||
2721 | queue_work(priv->workqueue, &priv->scan_completed); | ||
2722 | ret = 0; | ||
2723 | goto out_unlock; | ||
2724 | } | ||
2725 | |||
2726 | if (ssid_len) { | ||
2727 | priv->one_direct_scan = 1; | ||
2728 | priv->direct_ssid_len = ssid_len; | ||
2729 | memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len); | ||
2730 | } else { | ||
2731 | priv->one_direct_scan = 0; | ||
2732 | } | ||
2733 | |||
2734 | ret = iwl_scan_initiate(priv); | ||
2735 | |||
2736 | IWL_DEBUG_MAC80211(priv, "leave\n"); | ||
2737 | |||
2738 | out_unlock: | ||
2739 | spin_unlock_irqrestore(&priv->lock, flags); | ||
2740 | mutex_unlock(&priv->mutex); | ||
2741 | |||
2742 | return ret; | ||
2743 | } | ||
2744 | |||
2745 | static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw, | 2680 | static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw, |
2746 | struct ieee80211_key_conf *keyconf, const u8 *addr, | 2681 | struct ieee80211_key_conf *keyconf, const u8 *addr, |
2747 | u32 iv32, u16 *phase1key) | 2682 | u32 iv32, u16 *phase1key) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 10ee20c8b53d..f3aa07c99c6e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -345,6 +345,7 @@ void iwl_init_scan_params(struct iwl_priv *priv); | |||
345 | int iwl_scan_cancel(struct iwl_priv *priv); | 345 | int iwl_scan_cancel(struct iwl_priv *priv); |
346 | int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms); | 346 | int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms); |
347 | int iwl_scan_initiate(struct iwl_priv *priv); | 347 | int iwl_scan_initiate(struct iwl_priv *priv); |
348 | int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req); | ||
348 | u16 iwl_fill_probe_req(struct iwl_priv *priv, enum ieee80211_band band, | 349 | u16 iwl_fill_probe_req(struct iwl_priv *priv, enum ieee80211_band band, |
349 | struct ieee80211_mgmt *frame, int left); | 350 | struct ieee80211_mgmt *frame, int left); |
350 | void iwl_setup_rx_scan_handlers(struct iwl_priv *priv); | 351 | void iwl_setup_rx_scan_handlers(struct iwl_priv *priv); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 1ec2b20eb37c..23644cf884f1 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -440,6 +440,74 @@ int iwl_scan_initiate(struct iwl_priv *priv) | |||
440 | } | 440 | } |
441 | EXPORT_SYMBOL(iwl_scan_initiate); | 441 | EXPORT_SYMBOL(iwl_scan_initiate); |
442 | 442 | ||
443 | #define IWL_DELAY_NEXT_SCAN (HZ*2) | ||
444 | |||
445 | int iwl_mac_hw_scan(struct ieee80211_hw *hw, | ||
446 | struct cfg80211_scan_request *req) | ||
447 | { | ||
448 | unsigned long flags; | ||
449 | struct iwl_priv *priv = hw->priv; | ||
450 | int ret; | ||
451 | u8 *ssid = NULL; | ||
452 | size_t ssid_len = 0; | ||
453 | |||
454 | if (req->n_ssids) { | ||
455 | ssid = req->ssids[0].ssid; | ||
456 | ssid_len = req->ssids[0].ssid_len; | ||
457 | } | ||
458 | |||
459 | IWL_DEBUG_MAC80211(priv, "enter\n"); | ||
460 | |||
461 | mutex_lock(&priv->mutex); | ||
462 | spin_lock_irqsave(&priv->lock, flags); | ||
463 | |||
464 | if (!iwl_is_ready_rf(priv)) { | ||
465 | ret = -EIO; | ||
466 | IWL_DEBUG_MAC80211(priv, "leave - not ready or exit pending\n"); | ||
467 | goto out_unlock; | ||
468 | } | ||
469 | |||
470 | /* We don't schedule scan within next_scan_jiffies period. | ||
471 | * Avoid scanning during possible EAPOL exchange, return | ||
472 | * success immediately. | ||
473 | */ | ||
474 | if (priv->next_scan_jiffies && | ||
475 | time_after(priv->next_scan_jiffies, jiffies)) { | ||
476 | IWL_DEBUG_SCAN(priv, "scan rejected: within next scan period\n"); | ||
477 | queue_work(priv->workqueue, &priv->scan_completed); | ||
478 | ret = 0; | ||
479 | goto out_unlock; | ||
480 | } | ||
481 | |||
482 | /* if we just finished scan ask for delay */ | ||
483 | if (iwl_is_associated(priv) && priv->last_scan_jiffies && | ||
484 | time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) { | ||
485 | IWL_DEBUG_SCAN(priv, "scan rejected: within previous scan period\n"); | ||
486 | queue_work(priv->workqueue, &priv->scan_completed); | ||
487 | ret = 0; | ||
488 | goto out_unlock; | ||
489 | } | ||
490 | |||
491 | if (ssid_len) { | ||
492 | priv->one_direct_scan = 1; | ||
493 | priv->direct_ssid_len = ssid_len; | ||
494 | memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len); | ||
495 | } else { | ||
496 | priv->one_direct_scan = 0; | ||
497 | } | ||
498 | |||
499 | ret = iwl_scan_initiate(priv); | ||
500 | |||
501 | IWL_DEBUG_MAC80211(priv, "leave\n"); | ||
502 | |||
503 | out_unlock: | ||
504 | spin_unlock_irqrestore(&priv->lock, flags); | ||
505 | mutex_unlock(&priv->mutex); | ||
506 | |||
507 | return ret; | ||
508 | } | ||
509 | EXPORT_SYMBOL(iwl_mac_hw_scan); | ||
510 | |||
443 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) | 511 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) |
444 | 512 | ||
445 | void iwl_bg_scan_check(struct work_struct *data) | 513 | void iwl_bg_scan_check(struct work_struct *data) |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 2ad4d760ad2d..6d816ebd7cea 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -726,38 +726,6 @@ static void iwl3945_setup_rxon_timing(struct iwl_priv *priv) | |||
726 | le16_to_cpu(priv->rxon_timing.atim_window)); | 726 | le16_to_cpu(priv->rxon_timing.atim_window)); |
727 | } | 727 | } |
728 | 728 | ||
729 | static int iwl3945_scan_initiate(struct iwl_priv *priv) | ||
730 | { | ||
731 | if (!iwl_is_ready_rf(priv)) { | ||
732 | IWL_DEBUG_SCAN(priv, "Aborting scan due to not ready.\n"); | ||
733 | return -EIO; | ||
734 | } | ||
735 | |||
736 | if (test_bit(STATUS_SCANNING, &priv->status)) { | ||
737 | IWL_DEBUG_SCAN(priv, "Scan already in progress.\n"); | ||
738 | return -EAGAIN; | ||
739 | } | ||
740 | |||
741 | if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | ||
742 | IWL_DEBUG_SCAN(priv, "Scan request while abort pending. " | ||
743 | "Queuing.\n"); | ||
744 | return -EAGAIN; | ||
745 | } | ||
746 | |||
747 | IWL_DEBUG_INFO(priv, "Starting scan...\n"); | ||
748 | if (priv->cfg->sku & IWL_SKU_G) | ||
749 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
750 | if (priv->cfg->sku & IWL_SKU_A) | ||
751 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
752 | set_bit(STATUS_SCANNING, &priv->status); | ||
753 | priv->scan_start = jiffies; | ||
754 | priv->scan_pass_start = priv->scan_start; | ||
755 | |||
756 | queue_work(priv->workqueue, &priv->request_scan); | ||
757 | |||
758 | return 0; | ||
759 | } | ||
760 | |||
761 | static int iwl3945_set_mode(struct iwl_priv *priv, int mode) | 729 | static int iwl3945_set_mode(struct iwl_priv *priv, int mode) |
762 | { | 730 | { |
763 | if (mode == NL80211_IFTYPE_ADHOC) { | 731 | if (mode == NL80211_IFTYPE_ADHOC) { |
@@ -4316,66 +4284,6 @@ static void iwl3945_bss_info_changed(struct ieee80211_hw *hw, | |||
4316 | 4284 | ||
4317 | } | 4285 | } |
4318 | 4286 | ||
4319 | static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, | ||
4320 | struct cfg80211_scan_request *req) | ||
4321 | { | ||
4322 | int rc = 0; | ||
4323 | unsigned long flags; | ||
4324 | struct iwl_priv *priv = hw->priv; | ||
4325 | size_t len = 0; | ||
4326 | u8 *ssid = NULL; | ||
4327 | DECLARE_SSID_BUF(ssid_buf); | ||
4328 | |||
4329 | IWL_DEBUG_MAC80211(priv, "enter\n"); | ||
4330 | |||
4331 | if (req->n_ssids) { | ||
4332 | ssid = req->ssids[0].ssid; | ||
4333 | len = req->ssids[0].ssid_len; | ||
4334 | } | ||
4335 | |||
4336 | mutex_lock(&priv->mutex); | ||
4337 | spin_lock_irqsave(&priv->lock, flags); | ||
4338 | |||
4339 | if (!iwl_is_ready_rf(priv)) { | ||
4340 | rc = -EIO; | ||
4341 | IWL_DEBUG_MAC80211(priv, "leave - not ready or exit pending\n"); | ||
4342 | goto out_unlock; | ||
4343 | } | ||
4344 | |||
4345 | /* we don't schedule scan within next_scan_jiffies period */ | ||
4346 | if (priv->next_scan_jiffies && | ||
4347 | time_after(priv->next_scan_jiffies, jiffies)) { | ||
4348 | rc = -EAGAIN; | ||
4349 | goto out_unlock; | ||
4350 | } | ||
4351 | /* if we just finished scan ask for delay for a broadcast scan */ | ||
4352 | if ((len == 0) && priv->last_scan_jiffies && | ||
4353 | time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, | ||
4354 | jiffies)) { | ||
4355 | rc = -EAGAIN; | ||
4356 | goto out_unlock; | ||
4357 | } | ||
4358 | if (len) { | ||
4359 | IWL_DEBUG_SCAN(priv, "direct scan for %s [%zd]\n ", | ||
4360 | print_ssid(ssid_buf, ssid, len), len); | ||
4361 | |||
4362 | priv->one_direct_scan = 1; | ||
4363 | priv->direct_ssid_len = len; | ||
4364 | memcpy(priv->direct_ssid, ssid, len); | ||
4365 | } else | ||
4366 | priv->one_direct_scan = 0; | ||
4367 | |||
4368 | rc = iwl3945_scan_initiate(priv); | ||
4369 | |||
4370 | IWL_DEBUG_MAC80211(priv, "leave\n"); | ||
4371 | |||
4372 | out_unlock: | ||
4373 | spin_unlock_irqrestore(&priv->lock, flags); | ||
4374 | mutex_unlock(&priv->mutex); | ||
4375 | |||
4376 | return rc; | ||
4377 | } | ||
4378 | |||
4379 | static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, | 4287 | static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, |
4380 | struct ieee80211_vif *vif, | 4288 | struct ieee80211_vif *vif, |
4381 | struct ieee80211_sta *sta, | 4289 | struct ieee80211_sta *sta, |
@@ -5149,7 +5057,7 @@ static struct ieee80211_ops iwl3945_hw_ops = { | |||
5149 | .conf_tx = iwl3945_mac_conf_tx, | 5057 | .conf_tx = iwl3945_mac_conf_tx, |
5150 | .reset_tsf = iwl3945_mac_reset_tsf, | 5058 | .reset_tsf = iwl3945_mac_reset_tsf, |
5151 | .bss_info_changed = iwl3945_bss_info_changed, | 5059 | .bss_info_changed = iwl3945_bss_info_changed, |
5152 | .hw_scan = iwl3945_mac_hw_scan | 5060 | .hw_scan = iwl_mac_hw_scan |
5153 | }; | 5061 | }; |
5154 | 5062 | ||
5155 | static int iwl3945_init_drv(struct iwl_priv *priv) | 5063 | static int iwl3945_init_drv(struct iwl_priv *priv) |