diff options
author | Johannes Berg <johannes.berg@intel.com> | 2010-09-13 08:46:33 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-09-14 16:08:03 -0400 |
commit | 3eecce527c7434dfd16517ce08b49632c8a26717 (patch) | |
tree | 7495b3970b2f34d40dc0adbfc8a5a8627a515851 /drivers/net/wireless/iwlwifi/iwl3945-base.c | |
parent | b5be3efc34294cc34e305903df6a388950e8d1f3 (diff) |
iwlwifi: unify scan start checks
Rather than duplicating all the checks and even
in case of errors accepting the scan request
from mac80211, we can push the checks to the
caller and in all error cases reject the scan
request right away (rather than accepting and
then saying it was aborted).
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Acked-by: Wey-Yi W Guy <wey-yi.w.guy@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl3945-base.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 74 |
1 files changed, 10 insertions, 64 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index be1e75e3be55..fc553bacef17 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -2816,7 +2816,7 @@ static void iwl3945_rfkill_poll(struct work_struct *data) | |||
2816 | 2816 | ||
2817 | } | 2817 | } |
2818 | 2818 | ||
2819 | void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | 2819 | int iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) |
2820 | { | 2820 | { |
2821 | struct iwl_host_cmd cmd = { | 2821 | struct iwl_host_cmd cmd = { |
2822 | .id = REPLY_SCAN_CMD, | 2822 | .id = REPLY_SCAN_CMD, |
@@ -2827,55 +2827,16 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
2827 | u8 n_probes = 0; | 2827 | u8 n_probes = 0; |
2828 | enum ieee80211_band band; | 2828 | enum ieee80211_band band; |
2829 | bool is_active = false; | 2829 | bool is_active = false; |
2830 | int ret; | ||
2830 | 2831 | ||
2831 | cancel_delayed_work(&priv->scan_check); | 2832 | lockdep_assert_held(&priv->mutex); |
2832 | |||
2833 | if (!iwl_is_ready(priv)) { | ||
2834 | IWL_WARN(priv, "request scan called when driver not ready.\n"); | ||
2835 | goto done; | ||
2836 | } | ||
2837 | |||
2838 | /* Make sure the scan wasn't canceled before this queued work | ||
2839 | * was given the chance to run... */ | ||
2840 | if (!test_bit(STATUS_SCANNING, &priv->status)) | ||
2841 | goto done; | ||
2842 | |||
2843 | /* This should never be called or scheduled if there is currently | ||
2844 | * a scan active in the hardware. */ | ||
2845 | if (test_bit(STATUS_SCAN_HW, &priv->status)) { | ||
2846 | IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests " | ||
2847 | "Ignoring second request.\n"); | ||
2848 | goto done; | ||
2849 | } | ||
2850 | |||
2851 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { | ||
2852 | IWL_DEBUG_SCAN(priv, "Aborting scan due to device shutdown\n"); | ||
2853 | goto done; | ||
2854 | } | ||
2855 | |||
2856 | if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | ||
2857 | IWL_DEBUG_HC(priv, | ||
2858 | "Scan request while abort pending. Queuing.\n"); | ||
2859 | goto done; | ||
2860 | } | ||
2861 | |||
2862 | if (iwl_is_rfkill(priv)) { | ||
2863 | IWL_DEBUG_HC(priv, "Aborting scan due to RF Kill activation\n"); | ||
2864 | goto done; | ||
2865 | } | ||
2866 | |||
2867 | if (!test_bit(STATUS_READY, &priv->status)) { | ||
2868 | IWL_DEBUG_HC(priv, | ||
2869 | "Scan request while uninitialized. Queuing.\n"); | ||
2870 | goto done; | ||
2871 | } | ||
2872 | 2833 | ||
2873 | if (!priv->scan_cmd) { | 2834 | if (!priv->scan_cmd) { |
2874 | priv->scan_cmd = kmalloc(sizeof(struct iwl3945_scan_cmd) + | 2835 | priv->scan_cmd = kmalloc(sizeof(struct iwl3945_scan_cmd) + |
2875 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); | 2836 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); |
2876 | if (!priv->scan_cmd) { | 2837 | if (!priv->scan_cmd) { |
2877 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); | 2838 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); |
2878 | goto done; | 2839 | return -ENOMEM; |
2879 | } | 2840 | } |
2880 | } | 2841 | } |
2881 | scan = priv->scan_cmd; | 2842 | scan = priv->scan_cmd; |
@@ -2970,7 +2931,7 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
2970 | break; | 2931 | break; |
2971 | default: | 2932 | default: |
2972 | IWL_WARN(priv, "Invalid scan band\n"); | 2933 | IWL_WARN(priv, "Invalid scan band\n"); |
2973 | goto done; | 2934 | return -EIO; |
2974 | } | 2935 | } |
2975 | 2936 | ||
2976 | if (!priv->is_internal_short_scan) { | 2937 | if (!priv->is_internal_short_scan) { |
@@ -3005,7 +2966,7 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
3005 | 2966 | ||
3006 | if (scan->channel_count == 0) { | 2967 | if (scan->channel_count == 0) { |
3007 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); | 2968 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); |
3008 | goto done; | 2969 | return -EIO; |
3009 | } | 2970 | } |
3010 | 2971 | ||
3011 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + | 2972 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + |
@@ -3014,25 +2975,10 @@ void iwl3945_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif) | |||
3014 | scan->len = cpu_to_le16(cmd.len); | 2975 | scan->len = cpu_to_le16(cmd.len); |
3015 | 2976 | ||
3016 | set_bit(STATUS_SCAN_HW, &priv->status); | 2977 | set_bit(STATUS_SCAN_HW, &priv->status); |
3017 | if (iwl_send_cmd_sync(priv, &cmd)) | 2978 | ret = iwl_send_cmd_sync(priv, &cmd); |
3018 | goto done; | 2979 | if (ret) |
3019 | 2980 | clear_bit(STATUS_SCAN_HW, &priv->status); | |
3020 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 2981 | return ret; |
3021 | IWL_SCAN_CHECK_WATCHDOG); | ||
3022 | |||
3023 | return; | ||
3024 | |||
3025 | done: | ||
3026 | /* can not perform scan make sure we clear scanning | ||
3027 | * bits from status so next scan request can be performed. | ||
3028 | * if we dont clear scanning status bit here all next scan | ||
3029 | * will fail | ||
3030 | */ | ||
3031 | clear_bit(STATUS_SCAN_HW, &priv->status); | ||
3032 | clear_bit(STATUS_SCANNING, &priv->status); | ||
3033 | |||
3034 | /* inform mac80211 scan aborted */ | ||
3035 | queue_work(priv->workqueue, &priv->scan_completed); | ||
3036 | } | 2982 | } |
3037 | 2983 | ||
3038 | static void iwl3945_bg_restart(struct work_struct *data) | 2984 | static void iwl3945_bg_restart(struct work_struct *data) |