aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbhijeet Kolekar <abhijeet.kolekar@intel.com>2009-02-18 18:54:27 -0500
committerJohn W. Linville <linville@tuxdriver.com>2009-02-27 14:52:45 -0500
commite9dde6f6edf9954e2c75d2d738cae0f00e9b0fbc (patch)
tree2af59857d5f05d975c10006277f3011bfb9ab609
parentcade0eb2c7c7b8df60ac54409592c1a23e3220c8 (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.c65
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-scan.c68
-rw-r--r--drivers/net/wireless/iwlwifi/iwl3945-base.c94
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
2680static 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
2738out_unlock:
2739 spin_unlock_irqrestore(&priv->lock, flags);
2740 mutex_unlock(&priv->mutex);
2741
2742 return ret;
2743}
2744
2745static void iwl_mac_update_tkip_key(struct ieee80211_hw *hw, 2680static 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);
345int iwl_scan_cancel(struct iwl_priv *priv); 345int iwl_scan_cancel(struct iwl_priv *priv);
346int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms); 346int iwl_scan_cancel_timeout(struct iwl_priv *priv, unsigned long ms);
347int iwl_scan_initiate(struct iwl_priv *priv); 347int iwl_scan_initiate(struct iwl_priv *priv);
348int iwl_mac_hw_scan(struct ieee80211_hw *hw, struct cfg80211_scan_request *req);
348u16 iwl_fill_probe_req(struct iwl_priv *priv, enum ieee80211_band band, 349u16 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);
350void iwl_setup_rx_scan_handlers(struct iwl_priv *priv); 351void 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}
441EXPORT_SYMBOL(iwl_scan_initiate); 441EXPORT_SYMBOL(iwl_scan_initiate);
442 442
443#define IWL_DELAY_NEXT_SCAN (HZ*2)
444
445int 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
503out_unlock:
504 spin_unlock_irqrestore(&priv->lock, flags);
505 mutex_unlock(&priv->mutex);
506
507 return ret;
508}
509EXPORT_SYMBOL(iwl_mac_hw_scan);
510
443#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) 511#define IWL_SCAN_CHECK_WATCHDOG (7 * HZ)
444 512
445void iwl_bg_scan_check(struct work_struct *data) 513void 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
729static 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
761static int iwl3945_set_mode(struct iwl_priv *priv, int mode) 729static 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
4319static 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
4372out_unlock:
4373 spin_unlock_irqrestore(&priv->lock, flags);
4374 mutex_unlock(&priv->mutex);
4375
4376 return rc;
4377}
4378
4379static int iwl3945_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 4287static 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
5155static int iwl3945_init_drv(struct iwl_priv *priv) 5063static int iwl3945_init_drv(struct iwl_priv *priv)