wifi: iwlwifi: add some FW misbehaviour check infrastructure
When the firmware misbehaves (according to the driver), we often either ignore that, or WARN_ON, which is very noisy but doesn't really help. Add a little helper macro IWL_FW_CHECK() that can be used in place of WARN_ON() in conditions, and make it take a message that's printed in this case. We can also add more behaviour to this in the future. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230614123446.2e12ac670cea.Ia0198036b7a626876d836bd41a4b2d2b1e65c5ca@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ed0c34333d
commit
568db7fd27
@ -1,6 +1,6 @@
|
|||||||
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2014, 2018-2019, 2021-2022 Intel Corporation
|
* Copyright (C) 2005-2014, 2018-2019, 2021-2023 Intel Corporation
|
||||||
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
* Copyright (C) 2013-2015 Intel Mobile Communications GmbH
|
||||||
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
* Copyright (C) 2015-2017 Intel Deutschland GmbH
|
||||||
*/
|
*/
|
||||||
@ -327,4 +327,18 @@ void iwl_fwrt_dump_error_logs(struct iwl_fw_runtime *fwrt);
|
|||||||
void iwl_send_dbg_dump_complete_cmd(struct iwl_fw_runtime *fwrt,
|
void iwl_send_dbg_dump_complete_cmd(struct iwl_fw_runtime *fwrt,
|
||||||
u32 timepoint,
|
u32 timepoint,
|
||||||
u32 timepoint_data);
|
u32 timepoint_data);
|
||||||
|
|
||||||
|
#define IWL_FW_CHECK_FAILED(_obj, _fmt, ...) \
|
||||||
|
IWL_ERR_LIMIT(_obj, _fmt, __VA_ARGS__)
|
||||||
|
|
||||||
|
#define IWL_FW_CHECK(_obj, _cond, _fmt, ...) \
|
||||||
|
({ \
|
||||||
|
bool __cond = (_cond); \
|
||||||
|
\
|
||||||
|
if (unlikely(__cond)) \
|
||||||
|
IWL_FW_CHECK_FAILED(_obj, _fmt, __VA_ARGS__); \
|
||||||
|
\
|
||||||
|
unlikely(__cond); \
|
||||||
|
})
|
||||||
|
|
||||||
#endif /* __iwl_fw_dbg_h__ */
|
#endif /* __iwl_fw_dbg_h__ */
|
||||||
|
@ -1601,7 +1601,9 @@ static void iwl_mvm_rx_common(struct iwl_mvm *mvm,
|
|||||||
if (rx_h->cmd_id != WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd))
|
if (rx_h->cmd_id != WIDE_ID(pkt->hdr.group_id, pkt->hdr.cmd))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (unlikely(pkt_len < rx_h->min_size))
|
if (IWL_FW_CHECK(mvm, pkt_len < rx_h->min_size,
|
||||||
|
"unexpected notification 0x%04x size %d, need %d\n",
|
||||||
|
rx_h->cmd_id, pkt_len, rx_h->min_size))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (rx_h->context == RX_HANDLER_SYNC) {
|
if (rx_h->context == RX_HANDLER_SYNC) {
|
||||||
|
@ -985,10 +985,12 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
|||||||
sta_mask = iwl_mvm_sta_fw_id_mask(mvm, sta, -1);
|
sta_mask = iwl_mvm_sta_fw_id_mask(mvm, sta, -1);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
if (WARN(tid != baid_data->tid ||
|
if (IWL_FW_CHECK(mvm,
|
||||||
!(sta_mask & baid_data->sta_mask),
|
tid != baid_data->tid ||
|
||||||
"baid 0x%x is mapped to sta_mask:0x%x tid:%d, but was received for sta_mask:0x%x tid:%d\n",
|
!(sta_mask & baid_data->sta_mask),
|
||||||
baid, baid_data->sta_mask, baid_data->tid, sta_mask, tid))
|
"baid 0x%x is mapped to sta_mask:0x%x tid:%d, but was received for sta_mask:0x%x tid:%d\n",
|
||||||
|
baid, baid_data->sta_mask, baid_data->tid,
|
||||||
|
sta_mask, tid))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
nssn = reorder & IWL_RX_MPDU_REORDER_NSSN_MASK;
|
nssn = reorder & IWL_RX_MPDU_REORDER_NSSN_MASK;
|
||||||
|
@ -2075,7 +2075,8 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
|||||||
u16 tfd_cnt;
|
u16 tfd_cnt;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (unlikely(sizeof(*ba_res) > pkt_len))
|
if (IWL_FW_CHECK(mvm, sizeof(*ba_res) > pkt_len,
|
||||||
|
"short BA notification (%d)\n", pkt_len))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
sta_id = ba_res->sta_id;
|
sta_id = ba_res->sta_id;
|
||||||
@ -2087,7 +2088,13 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
|||||||
(void *)(uintptr_t)ba_res->reduced_txp;
|
(void *)(uintptr_t)ba_res->reduced_txp;
|
||||||
|
|
||||||
tfd_cnt = le16_to_cpu(ba_res->tfd_cnt);
|
tfd_cnt = le16_to_cpu(ba_res->tfd_cnt);
|
||||||
if (!tfd_cnt || struct_size(ba_res, tfd, tfd_cnt) > pkt_len)
|
if (!tfd_cnt)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (IWL_FW_CHECK(mvm,
|
||||||
|
struct_size(ba_res, tfd, tfd_cnt) > pkt_len,
|
||||||
|
"short BA notification (tfds:%d, size:%d)\n",
|
||||||
|
tfd_cnt, pkt_len))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
@ -2145,7 +2152,9 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
|||||||
|
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, sta_id);
|
mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, sta_id);
|
||||||
if (WARN_ON_ONCE(!mvmsta)) {
|
if (IWL_FW_CHECK(mvm, !mvmsta,
|
||||||
|
"invalid STA ID %d in BA notif\n",
|
||||||
|
sta_id)) {
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user