iwlwifi: mvm: Fix a few EBS error handling bugs
authorHaim Dreyfuss <haim.dreyfuss@intel.com>
Tue, 13 Jan 2015 09:54:51 +0000 (11:54 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 1 Feb 2015 13:57:23 +0000 (15:57 +0200)
Last EBS status wasn't set to success in the initialization, which
caused the first scan to be without EBS. Fix that.

When EBS is not enabled by the driver, the FW still sends ebs_status success,
which can override EBS failure state. Consider only EBS failures, to avoid
such override. Last_ebs_success is set back to true upon disconnection.

Last_ebs_success wasn't set in umac scan abort flow, fix that too.

Signed-off-by: Haim Dreyfuss <haim.dreyfuss@intel.com>
Signed-off-by: David Spinadel <david.spinadel@intel.com>
Reviewed-by: Alexander Bondar <alexander.bondar@intel.com>
Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/ops.c
drivers/net/wireless/iwlwifi/mvm/scan.c

index b6181efa99216355c01671d85ab75715c5709271..2dffc3600ed3faac6cf2777cc7a1f862c29e7b24 100644 (file)
@@ -568,6 +568,9 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
        if (!mvm->scan_cmd)
                goto out_free;
 
+       /* Set EBS as successful as long as not stated otherwise by the FW. */
+       mvm->last_ebs_successful = true;
+
        err = iwl_mvm_mac_setup_register(mvm);
        if (err)
                goto out_free;
index 3bd5f34d32855fa413bdddd9db0cf600ebf8261e..4169e3d7c1092179cfa6388ddece3458d4bc4200 100644 (file)
@@ -704,7 +704,8 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
                iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
        }
 
-       mvm->last_ebs_successful = !ebs_status;
+       if (ebs_status)
+               mvm->last_ebs_successful = false;
 
        return 0;
 }
@@ -2025,7 +2026,9 @@ int iwl_mvm_rx_umac_scan_complete_notif(struct iwl_mvm *mvm,
                       notif->ebs_status == IWL_SCAN_EBS_SUCCESS ?
                                "success" : "failed");
 
-       mvm->last_ebs_successful = !notif->ebs_status;
+       if (notif->ebs_status)
+               mvm->last_ebs_successful = false;
+
        mvm->scan_uid[uid_idx] = 0;
 
        if (!sched) {
@@ -2058,10 +2061,14 @@ static bool iwl_scan_umac_done_check(struct iwl_notif_wait_data *notif_wait,
 
        /*
         * Clear scan uid of scans that was aborted from above and completed
-        * in FW so the RX handler does nothing.
+        * in FW so the RX handler does nothing. Set last_ebs_successful here if
+        * needed.
         */
        scan_done->mvm->scan_uid[uid_idx] = 0;
 
+       if (notif->ebs_status)
+               scan_done->mvm->last_ebs_successful = false;
+
        return !iwl_mvm_find_scan_type(scan_done->mvm, scan_done->type);
 }