Commit c2a1c8c1 authored by Johannes Berg's avatar Johannes Berg

wifi: iwlwifi: pcie: double-check ACK interrupt after timeout

There are evidently cases where the firmware completes the
reset but the interrupt isn't received correctly, so check
for the interrupt again after the timeout, and don't dump
the firmware error log if the right bit is set.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarGregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230614123446.00cc2d9b88c3.I429bfe800f17c624e50c0b0c10dd2cd7d885f199@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 96fb6f47
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
/* /*
* Copyright (C) 2017 Intel Deutschland GmbH * Copyright (C) 2017 Intel Deutschland GmbH
* Copyright (C) 2018-2022 Intel Corporation * Copyright (C) 2018-2023 Intel Corporation
*/ */
#include "iwl-trans.h" #include "iwl-trans.h"
#include "iwl-prph.h" #include "iwl-prph.h"
...@@ -117,8 +117,13 @@ static void iwl_trans_pcie_fw_reset_handshake(struct iwl_trans *trans) ...@@ -117,8 +117,13 @@ static void iwl_trans_pcie_fw_reset_handshake(struct iwl_trans *trans)
trans_pcie->fw_reset_state != FW_RESET_REQUESTED, trans_pcie->fw_reset_state != FW_RESET_REQUESTED,
FW_RESET_TIMEOUT); FW_RESET_TIMEOUT);
if (!ret || trans_pcie->fw_reset_state == FW_RESET_ERROR) { if (!ret || trans_pcie->fw_reset_state == FW_RESET_ERROR) {
IWL_INFO(trans, u32 inta_hw = iwl_read32(trans, CSR_MSIX_HW_INT_CAUSES_AD);
"firmware didn't ACK the reset - continue anyway\n");
IWL_ERR(trans,
"timeout waiting for FW reset ACK (inta_hw=0x%x)\n",
inta_hw);
if (!(inta_hw & MSIX_HW_INT_CAUSES_REG_RESET_DONE))
iwl_trans_fw_error(trans, true); iwl_trans_fw_error(trans, true);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment