summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2019-03-05 10:31:11 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2019-05-31 06:46:13 -0700
commit0ea8b7cf9436b526c833f2677c5caed04af6b9d4 (patch)
treecd1f3db94fc7e7ed3cf600d5e488c6ea3eab6c48
parentbd3d8f4cb956980c5fa08b043919a5e056cf8a41 (diff)
downloadlinux-stable-0ea8b7cf9436b526c833f2677c5caed04af6b9d4.tar.gz
linux-stable-0ea8b7cf9436b526c833f2677c5caed04af6b9d4.tar.bz2
linux-stable-0ea8b7cf9436b526c833f2677c5caed04af6b9d4.zip
iwlwifi: pcie: don't crash on invalid RX interrupt
[ Upstream commit 30f24eabab8cd801064c5c37589d803cb4341929 ] If for some reason the device gives us an RX interrupt before we're ready for it, perhaps during device power-on with misconfigured IRQ causes mapping or so, we can crash trying to access the queues. Prevent that by checking that we actually have RXQs and that they were properly allocated. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/rx.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
index b2905f01b7df..6dcd5374d9b4 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
@@ -1388,10 +1388,15 @@ out_err:
static void iwl_pcie_rx_handle(struct iwl_trans *trans, int queue)
{
struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
- struct iwl_rxq *rxq = &trans_pcie->rxq[queue];
+ struct iwl_rxq *rxq;
u32 r, i, count = 0;
bool emergency = false;
+ if (WARN_ON_ONCE(!trans_pcie->rxq || !trans_pcie->rxq[queue].bd))
+ return;
+
+ rxq = &trans_pcie->rxq[queue];
+
restart:
spin_lock(&rxq->lock);
/* uCode's read index (stored in shared DRAM) indicates the last Rx