iwlwifi: mvm: differentiate net-detect from sched scan
authorLuciano Coelho <luciano.coelho@intel.com>
Fri, 20 Mar 2015 14:11:28 +0000 (16:11 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Wed, 29 Apr 2015 10:12:48 +0000 (13:12 +0300)
Net-detect scans were using the same type as sched scan, which was
causing the driver to return -EBUSY and prevent the system from
suspending if there was an ongoing scheduled scan.  To avoid this, add
a new type for net-detect and don't stop anything when it is
requested, so that the existing scheduled scan will be resumed when
the system wakes up.

Signed-off-by: Luciano Coelho <luciano.coelho@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/d3.c
drivers/net/wireless/iwlwifi/mvm/mac80211.c
drivers/net/wireless/iwlwifi/mvm/mvm.h
drivers/net/wireless/iwlwifi/mvm/scan.c

index e82a47bde73b3fe3a6162b8d52146736b8c7bc4d..36bf6a87fb263c3829a1db80beac9d82f6a75810 100644 (file)
@@ -981,7 +981,8 @@ iwl_mvm_netdetect_config(struct iwl_mvm *mvm,
        if (ret)
                return ret;
 
-       ret = iwl_mvm_sched_scan_start(mvm, vif, nd_config, &mvm->nd_ies);
+       ret = iwl_mvm_sched_scan_start(mvm, vif, nd_config, &mvm->nd_ies,
+                                      IWL_MVM_SCAN_NETDETECT);
        if (ret)
                return ret;
 
index ff3273afff4fe82fd3b8ec3773ff212e094797a1..c136fe0d151db461f4c94d8898126ddd500c2878 100644 (file)
@@ -2743,7 +2743,7 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
                goto out;
        }
 
-       ret = iwl_mvm_sched_scan_start(mvm, vif, req, ies);
+       ret = iwl_mvm_sched_scan_start(mvm, vif, req, ies, IWL_MVM_SCAN_SCHED);
 
 out:
        mutex_unlock(&mvm->mutex);
index bbe4d983162c81b0242a4e1eb72ecafd7663b0f8..a8f51a824a7532bd7f378b5b9a4300442bbbacda 100644 (file)
@@ -448,14 +448,18 @@ extern const u8 tid_to_mac80211_ac[];
 enum iwl_scan_status {
        IWL_MVM_SCAN_REGULAR            = BIT(0),
        IWL_MVM_SCAN_SCHED              = BIT(1),
+       IWL_MVM_SCAN_NETDETECT          = BIT(2),
 
        IWL_MVM_SCAN_STOPPING_REGULAR   = BIT(8),
        IWL_MVM_SCAN_STOPPING_SCHED     = BIT(9),
+       IWL_MVM_SCAN_STOPPING_NETDETECT = BIT(10),
 
        IWL_MVM_SCAN_REGULAR_MASK       = IWL_MVM_SCAN_REGULAR |
                                          IWL_MVM_SCAN_STOPPING_REGULAR,
        IWL_MVM_SCAN_SCHED_MASK         = IWL_MVM_SCAN_SCHED |
                                          IWL_MVM_SCAN_STOPPING_SCHED,
+       IWL_MVM_SCAN_NETDETECT_MASK     = IWL_MVM_SCAN_NETDETECT |
+                                         IWL_MVM_SCAN_STOPPING_NETDETECT,
 
        IWL_MVM_SCAN_STOPPING_MASK      = 0xff00,
        IWL_MVM_SCAN_MASK               = 0x00ff,
@@ -1179,7 +1183,8 @@ int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
 int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
                             struct ieee80211_vif *vif,
                             struct cfg80211_sched_scan_request *req,
-                            struct ieee80211_scan_ies *ies);
+                            struct ieee80211_scan_ies *ies,
+                            int type);
 int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify);
 int iwl_mvm_rx_scan_offload_results(struct iwl_mvm *mvm,
                                    struct iwl_rx_cmd_buffer *rxb,
index 3fe398ec56fd85e0209ece06dfcd9b8bfce96f01..e39f2d12965f20e2d584f75c637d9fd3bcc7989f 100644 (file)
@@ -1533,6 +1533,13 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)
                if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK)
                        return -EBUSY;
                return iwl_mvm_cancel_scan(mvm);
+       case IWL_MVM_SCAN_NETDETECT:
+               /* No need to stop anything for net-detect since the
+                * firmware is restarted anyway.  This way, any sched
+                * scans that were running will be restarted when we
+                * resume.
+               */
+               return 0;
        default:
                WARN_ON(1);
                break;
@@ -1574,7 +1581,8 @@ int iwl_mvm_reg_scan_start(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
                             struct ieee80211_vif *vif,
                             struct cfg80211_sched_scan_request *req,
-                            struct ieee80211_scan_ies *ies)
+                            struct ieee80211_scan_ies *ies,
+                            int type)
 {
        int ret;
 
@@ -1585,7 +1593,7 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
                return -EBUSY;
        }
 
-       ret = iwl_mvm_check_running_scans(mvm, IWL_MVM_SCAN_SCHED);
+       ret = iwl_mvm_check_running_scans(mvm, type);
        if (ret)
                return ret;