Message ID | iwlwifi.20200403112332.d08b8dd271ee.I8dfe8a7d3a7ac9f0bc9d93e4a03f8165d8c999d2@changeid (mailing list archive) |
---|---|
State | Deferred |
Delegated to: | Luca Coelho |
Headers | show |
Series | iwlwifi: fixes intended for v5.7 2020-04-03 | expand |
On Fri, 2020-04-03 at 11:29 +0300, Luca Coelho wrote: > From: Mordechay Goodstein <mordechay.goodstein@intel.com> > > There is an issue in the HW DMA engine in the 9000 family of devices > when more than 6 RX queues are used. The issue is that the FW may > hang when IWL_MVM_RXQ_NSSN_SYNC notifications are sent. > > Fix this by limiting the number of RX queues to 6 in the 9000 family > of devices. > > Cc: stable@vger.kernel.org > Signed-off-by: Mordechay Goodstein <mordechay.goodstein@intel.com> > Signed-off-by: Luca Coelho <luciano.coelho@intel.com> > --- As Emmanuel pointed out, we have disabled NSSN in the driver for now, so this doesn't have to go to -fixes and stable. I'll drop it in v2 of this patchset. -- Cheers, Luca.
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h index bba527b339b5..ff5f6b67334a 100644 --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h @@ -316,6 +316,7 @@ static inline void iwl_free_rxb(struct iwl_rx_cmd_buffer *r) #define IWL_MGMT_TID 15 #define IWL_FRAME_LIMIT 64 #define IWL_MAX_RX_HW_QUEUES 16 +#define IWL_9000_MAX_RX_HW_QUEUES 6 /** * enum iwl_wowlan_status - WoWLAN image/device status diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c index e4cbd8daa7c6..e291c60024c2 100644 --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c @@ -1625,11 +1625,15 @@ iwl_pcie_set_interrupt_capa(struct pci_dev *pdev, struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); int max_irqs, num_irqs, i, ret; u16 pci_cmd; + u32 max_rx_queues = IWL_MAX_RX_HW_QUEUES; if (!cfg_trans->mq_rx_supported) goto enable_msi; - max_irqs = min_t(u32, num_online_cpus() + 2, IWL_MAX_RX_HW_QUEUES); + if (cfg_trans->device_family <= IWL_DEVICE_FAMILY_9000) + max_rx_queues = IWL_9000_MAX_RX_HW_QUEUES; + + max_irqs = min_t(u32, num_online_cpus() + 2, max_rx_queues); for (i = 0; i < max_irqs; i++) trans_pcie->msix_entries[i].entry = i;