]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
iwlwifi: mvm: move rt status check to the start of the resume flow
authorShahar S Matityahu <shahar.s.matityahu@intel.com>
Wed, 4 Jul 2018 14:12:49 +0000 (17:12 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Mon, 8 Oct 2018 07:46:03 +0000 (10:46 +0300)
Move the rt status checking to the start of the resume flow in order
to avoid sending D0I3_END_CMD to the FW.  Also, collect dump if an
assert was encountered.

Signed-off-by: Shahar S Matityahu <shahar.s.matityahu@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/d3.c

index fb981270f224f9d10b5b8a29813f1b361077ade4..843f3b41b72ee15c851f2138f40f4f52f8c84f82 100644 (file)
@@ -1638,32 +1638,10 @@ out_free_resp:
 }
 
 static struct iwl_wowlan_status *
-iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
+iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm)
 {
-       u32 base = mvm->error_event_table[0];
-       struct error_table_start {
-               /* cf. struct iwl_error_event_table */
-               u32 valid;
-               u32 error_id;
-       } err_info;
        int ret;
 
-       iwl_trans_read_mem_bytes(mvm->trans, base,
-                                &err_info, sizeof(err_info));
-
-       if (err_info.valid) {
-               IWL_INFO(mvm, "error table is valid (%d) with error (%d)\n",
-                        err_info.valid, err_info.error_id);
-               if (err_info.error_id == RF_KILL_INDICATOR_FOR_WOWLAN) {
-                       struct cfg80211_wowlan_wakeup wakeup = {
-                               .rfkill_release = true,
-                       };
-                       ieee80211_report_wowlan_wakeup(vif, &wakeup,
-                                                      GFP_KERNEL);
-               }
-               return ERR_PTR(-EIO);
-       }
-
        /* only for tracing for now */
        ret = iwl_mvm_send_cmd_pdu(mvm, OFFLOADS_QUERY_CMD, 0, 0, NULL);
        if (ret)
@@ -1682,7 +1660,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
        bool keep;
        struct iwl_mvm_sta *mvm_ap_sta;
 
-       fw_status = iwl_mvm_get_wakeup_status(mvm, vif);
+       fw_status = iwl_mvm_get_wakeup_status(mvm);
        if (IS_ERR_OR_NULL(fw_status))
                goto out_unlock;
 
@@ -1807,7 +1785,7 @@ static void iwl_mvm_query_netdetect_reasons(struct iwl_mvm *mvm,
        u32 reasons = 0;
        int i, j, n_matches, ret;
 
-       fw_status = iwl_mvm_get_wakeup_status(mvm, vif);
+       fw_status = iwl_mvm_get_wakeup_status(mvm);
        if (!IS_ERR_OR_NULL(fw_status)) {
                reasons = le32_to_cpu(fw_status->wakeup_reasons);
                kfree(fw_status);
@@ -1920,6 +1898,29 @@ static void iwl_mvm_d3_disconnect_iter(void *data, u8 *mac,
                ieee80211_resume_disconnect(vif);
 }
 
+static int iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
+                                  struct ieee80211_vif *vif)
+{
+       u32 base = mvm->error_event_table[0];
+       struct error_table_start {
+               /* cf. struct iwl_error_event_table */
+               u32 valid;
+               u32 error_id;
+       } err_info;
+
+       iwl_trans_read_mem_bytes(mvm->trans, base,
+                                &err_info, sizeof(err_info));
+
+       if (err_info.valid &&
+           err_info.error_id == RF_KILL_INDICATOR_FOR_WOWLAN) {
+               struct cfg80211_wowlan_wakeup wakeup = {
+                       .rfkill_release = true,
+               };
+               ieee80211_report_wowlan_wakeup(vif, &wakeup, GFP_KERNEL);
+       }
+       return err_info.valid;
+}
+
 static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
 {
        struct ieee80211_vif *vif = NULL;
@@ -1951,6 +1952,15 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
        /* query SRAM first in case we want event logging */
        iwl_mvm_read_d3_sram(mvm);
 
+       if (iwl_mvm_check_rt_status(mvm, vif)) {
+               set_bit(STATUS_FW_ERROR, &mvm->trans->status);
+               iwl_mvm_dump_nic_error_log(mvm);
+               iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
+                                       NULL, 0);
+               ret = 1;
+               goto err;
+       }
+
        if (d0i3_first) {
                ret = iwl_mvm_send_cmd_pdu(mvm, D0I3_END_CMD, 0, 0, NULL);
                if (ret < 0) {