mirror of
https://github.com/torvalds/linux.git
synced 2026-06-02 03:24:19 +02:00
wifi: iwlwifi: pcie: give up mem read if HW is dead
If the hardware is not responding, as indicated by (currently) five consecutive HW errors during reading, then just give up and fail, rather than attempting forever and forever for this to not return any useful data anyway. Even though we no longer completely deadlock the machine if it takes a long time, we still make it pretty much unusable since we'll eventually hold the RTNL while waiting for this process to finish. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230913145231.345af79f431c.I5ecde6b76b1e3a1572bd59d3cf8f827e767cedeb@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
111ed1eb17
commit
af9d34abf5
|
|
@ -2288,6 +2288,8 @@ static void iwl_trans_pcie_release_nic_access(struct iwl_trans *trans)
|
|||
static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
|
||||
void *buf, int dwords)
|
||||
{
|
||||
#define IWL_MAX_HW_ERRS 5
|
||||
unsigned int num_consec_hw_errors = 0;
|
||||
int offs = 0;
|
||||
u32 *vals = buf;
|
||||
|
||||
|
|
@ -2303,6 +2305,17 @@ static int iwl_trans_pcie_read_mem(struct iwl_trans *trans, u32 addr,
|
|||
while (offs < dwords) {
|
||||
vals[offs] = iwl_read32(trans,
|
||||
HBUS_TARG_MEM_RDAT);
|
||||
|
||||
if (iwl_trans_is_hw_error_value(vals[offs]))
|
||||
num_consec_hw_errors++;
|
||||
else
|
||||
num_consec_hw_errors = 0;
|
||||
|
||||
if (num_consec_hw_errors >= IWL_MAX_HW_ERRS) {
|
||||
iwl_trans_release_nic_access(trans);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
offs++;
|
||||
|
||||
if (time_after(jiffies, end)) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user