Commit 0572b771 authored by Emmanuel Grumbach's avatar Emmanuel Grumbach Committed by Johannes Berg
Browse files

wifi: iwlwifi: be less noisy if the NIC is dead in S3



If the NIC is dead upon resume, try to catch the error earlier and exit
earlier. We'll print less error messages and get to the same recovery
path as before: reload the firmware.

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: default avatarMiri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20241028135215.3a18682261e5.I18f336a4537378a4c1a8537d7246cee1fc82b42c@changeid


Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent d1a54ec2
Loading
Loading
Loading
Loading
+8 −3
Original line number Diff line number Diff line
@@ -537,13 +537,18 @@ bool iwl_fwrt_read_err_table(struct iwl_trans *trans, u32 base, u32 *err_id)
		/* cf. struct iwl_error_event_table */
		u32 valid;
		__le32 err_id;
	} err_info;
	} err_info = {};
	int ret;

	if (!base)
		return false;

	iwl_trans_read_mem_bytes(trans, base,
	ret = iwl_trans_read_mem_bytes(trans, base,
				       &err_info, sizeof(err_info));

	if (ret)
		return true;

	if (err_info.valid && err_id)
		*err_id = le32_to_cpu(err_info.err_id);

+7 −6
Original line number Diff line number Diff line
@@ -1075,11 +1075,12 @@ void iwl_trans_debugfs_cleanup(struct iwl_trans *trans);
#endif

#define iwl_trans_read_mem_bytes(trans, addr, buf, bufsize)	\
	do {								      \
	({							\
		if (__builtin_constant_p(bufsize))		\
			BUILD_BUG_ON((bufsize) % sizeof(u32));	\
		iwl_trans_read_mem(trans, addr, buf, (bufsize) / sizeof(u32));\
	} while (0)
		iwl_trans_read_mem(trans, addr, buf,		\
				   (bufsize) / sizeof(u32));	\
	})

int iwl_trans_write_imr_mem(struct iwl_trans *trans, u32 dst_addr,
			    u64 src_addr, u32 byte_cnt);
+13 −5
Original line number Diff line number Diff line
@@ -3107,7 +3107,6 @@ static void iwl_mvm_d3_disconnect_iter(void *data, u8 *mac,
		ieee80211_resume_disconnect(vif);
}


static bool iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
				   struct ieee80211_vif *vif)
{
@@ -3706,22 +3705,31 @@ int iwl_mvm_fast_resume(struct iwl_mvm *mvm)
	iwl_fw_dbg_read_d3_debug_data(&mvm->fwrt);

	if (iwl_mvm_check_rt_status(mvm, NULL)) {
		IWL_ERR(mvm,
			"iwl_mvm_check_rt_status failed, device is gone during suspend\n");
		set_bit(STATUS_FW_ERROR, &mvm->trans->status);
		iwl_mvm_dump_nic_error_log(mvm);
		iwl_dbg_tlv_time_point(&mvm->fwrt,
				       IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
		iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
					false, 0);
		return -ENODEV;
		mvm->trans->state = IWL_TRANS_NO_FW;
		ret = -ENODEV;

		goto out;
	}
	ret = iwl_mvm_d3_notif_wait(mvm, &d3_data);

	if (ret) {
		IWL_ERR(mvm, "Couldn't get the d3 notif %d\n", ret);
		mvm->trans->state = IWL_TRANS_NO_FW;
	}

out:
	clear_bit(IWL_MVM_STATUS_IN_D3, &mvm->status);
	mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
	mvm->fast_resume = false;

	if (ret)
		IWL_ERR(mvm, "Couldn't get the d3 notif %d\n", ret);

	return ret;
}

+2 −0
Original line number Diff line number Diff line
@@ -1643,6 +1643,8 @@ int iwl_trans_pcie_d3_resume(struct iwl_trans *trans,
out:
	if (*status == IWL_D3_STATUS_ALIVE)
		ret = iwl_pcie_d3_handshake(trans, false);
	else
		trans->state = IWL_TRANS_NO_FW;

	return ret;
}