diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2009-02-10 15:25:55 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-02-13 13:45:49 -0500 |
commit | 2a5193119269062608582418deba7af82844159a (patch) | |
tree | 1f2fe8cffbeb7530dce7fa708310f6fb29ab0dd8 /drivers/net/wireless | |
parent | 849b7967818995a32c3017542e33eb3155944368 (diff) |
cfg80211/nl80211: scanning (and mac80211 update to use it)
This patch adds basic scan capability to cfg80211/nl80211 and
changes mac80211 to use it. The BSS list that cfg80211 maintains
is made driver-accessible with a private area in each BSS struct,
but mac80211 doesn't yet use it. That's another large project.
Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-core.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-scan.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 17 |
4 files changed, 25 insertions, 7 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index c196abc6db7a..539960da7e13 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2678,11 +2678,19 @@ static void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
2678 | 2678 | ||
2679 | } | 2679 | } |
2680 | 2680 | ||
2681 | static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len) | 2681 | static int iwl_mac_hw_scan(struct ieee80211_hw *hw, |
2682 | struct cfg80211_scan_request *req) | ||
2682 | { | 2683 | { |
2683 | unsigned long flags; | 2684 | unsigned long flags; |
2684 | struct iwl_priv *priv = hw->priv; | 2685 | struct iwl_priv *priv = hw->priv; |
2685 | int ret; | 2686 | int ret; |
2687 | u8 *ssid = NULL; | ||
2688 | size_t ssid_len = 0; | ||
2689 | |||
2690 | if (req->n_ssids) { | ||
2691 | ssid = req->ssids[0].ssid; | ||
2692 | ssid_len = req->ssids[0].ssid_len; | ||
2693 | } | ||
2686 | 2694 | ||
2687 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 2695 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
2688 | 2696 | ||
@@ -2718,7 +2726,7 @@ static int iwl_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t ssid_len) | |||
2718 | 2726 | ||
2719 | if (ssid_len) { | 2727 | if (ssid_len) { |
2720 | priv->one_direct_scan = 1; | 2728 | priv->one_direct_scan = 1; |
2721 | priv->direct_ssid_len = min_t(u8, ssid_len, IW_ESSID_MAX_SIZE); | 2729 | priv->direct_ssid_len = ssid_len; |
2722 | memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len); | 2730 | memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len); |
2723 | } else { | 2731 | } else { |
2724 | priv->one_direct_scan = 0; | 2732 | priv->one_direct_scan = 0; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index e18c3f326f71..260bf903cb71 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -1271,6 +1271,7 @@ int iwl_setup_mac(struct iwl_priv *priv) | |||
1271 | BIT(NL80211_IFTYPE_ADHOC); | 1271 | BIT(NL80211_IFTYPE_ADHOC); |
1272 | 1272 | ||
1273 | hw->wiphy->custom_regulatory = true; | 1273 | hw->wiphy->custom_regulatory = true; |
1274 | hw->wiphy->max_scan_ssids = 1; | ||
1274 | 1275 | ||
1275 | /* Default value; 4 EDCA QOS priorities */ | 1276 | /* Default value; 4 EDCA QOS priorities */ |
1276 | hw->queues = 4; | 1277 | hw->queues = 4; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index 22bad3ce7d6a..1ec2b20eb37c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -860,7 +860,7 @@ void iwl_bg_scan_completed(struct work_struct *work) | |||
860 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 860 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
861 | return; | 861 | return; |
862 | 862 | ||
863 | ieee80211_scan_completed(priv->hw); | 863 | ieee80211_scan_completed(priv->hw, false); |
864 | 864 | ||
865 | /* Since setting the TXPOWER may have been deferred while | 865 | /* Since setting the TXPOWER may have been deferred while |
866 | * performing the scan, fire one off */ | 866 | * performing the scan, fire one off */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 42cc2884971c..0cd8cb96a5ef 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -4442,15 +4442,23 @@ static void iwl3945_bss_info_changed(struct ieee80211_hw *hw, | |||
4442 | 4442 | ||
4443 | } | 4443 | } |
4444 | 4444 | ||
4445 | static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | 4445 | static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, |
4446 | struct cfg80211_scan_request *req) | ||
4446 | { | 4447 | { |
4447 | int rc = 0; | 4448 | int rc = 0; |
4448 | unsigned long flags; | 4449 | unsigned long flags; |
4449 | struct iwl_priv *priv = hw->priv; | 4450 | struct iwl_priv *priv = hw->priv; |
4451 | size_t len = 0; | ||
4452 | u8 *ssid = NULL; | ||
4450 | DECLARE_SSID_BUF(ssid_buf); | 4453 | DECLARE_SSID_BUF(ssid_buf); |
4451 | 4454 | ||
4452 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 4455 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
4453 | 4456 | ||
4457 | if (req->n_ssids) { | ||
4458 | ssid = req->ssids[0].ssid; | ||
4459 | len = req->ssids[0].ssid_len; | ||
4460 | } | ||
4461 | |||
4454 | mutex_lock(&priv->mutex); | 4462 | mutex_lock(&priv->mutex); |
4455 | spin_lock_irqsave(&priv->lock, flags); | 4463 | spin_lock_irqsave(&priv->lock, flags); |
4456 | 4464 | ||
@@ -4478,9 +4486,8 @@ static int iwl3945_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len) | |||
4478 | print_ssid(ssid_buf, ssid, len), len); | 4486 | print_ssid(ssid_buf, ssid, len), len); |
4479 | 4487 | ||
4480 | priv->one_direct_scan = 1; | 4488 | priv->one_direct_scan = 1; |
4481 | priv->direct_ssid_len = (u8) | 4489 | priv->direct_ssid_len = len; |
4482 | min((u8) len, (u8) IW_ESSID_MAX_SIZE); | 4490 | memcpy(priv->direct_ssid, ssid, len); |
4483 | memcpy(priv->direct_ssid, ssid, priv->direct_ssid_len); | ||
4484 | } else | 4491 | } else |
4485 | priv->one_direct_scan = 0; | 4492 | priv->one_direct_scan = 0; |
4486 | 4493 | ||
@@ -5412,6 +5419,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
5412 | 5419 | ||
5413 | hw->wiphy->custom_regulatory = true; | 5420 | hw->wiphy->custom_regulatory = true; |
5414 | 5421 | ||
5422 | hw->wiphy->max_scan_ssids = 1; | ||
5423 | |||
5415 | /* 4 EDCA QOS priorities */ | 5424 | /* 4 EDCA QOS priorities */ |
5416 | hw->queues = 4; | 5425 | hw->queues = 4; |
5417 | 5426 | ||