]>
Commit | Line | Data |
---|---|---|
ffc1c2fe SL |
1 | From 4a8f79988f9ef2452a139c0cdb6bb447d30e602a Mon Sep 17 00:00:00 2001 |
2 | From: Sasha Levin <sashal@kernel.org> | |
3 | Date: Tue, 17 Oct 2023 12:16:46 +0300 | |
4 | Subject: wifi: iwlwifi: disable multi rx queue for 9000 | |
5 | ||
6 | From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> | |
7 | ||
8 | [ Upstream commit 29fa9a984b6d1075020f12071a89897fd62ed27f ] | |
9 | ||
10 | Multi rx queue allows to spread the load of the Rx streams on different | |
11 | CPUs. 9000 series required complex synchronization mechanisms from the | |
12 | driver side since the hardware / firmware is not able to provide | |
13 | information about duplicate packets and timeouts inside the reordering | |
14 | buffer. | |
15 | ||
16 | Users have complained that for newer devices, all those synchronization | |
17 | mechanisms have caused spurious packet drops. Those packet drops | |
18 | disappeared if we simplify the code, but unfortunately, we can't have | |
19 | RSS enabled on 9000 series without this complex code. | |
20 | ||
21 | Remove support for RSS on 9000 so that we can make the code much simpler | |
22 | for newer devices and fix the bugs for them. | |
23 | ||
24 | The down side of this patch is a that all the Rx path will be routed to | |
25 | a single CPU, but this has never been an issue, the modern CPUs are just | |
26 | fast enough to cope with all the traffic. | |
27 | ||
28 | Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> | |
29 | Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> | |
30 | Link: https://lore.kernel.org/r/20231017115047.2917eb8b7af9.Iddd7dcf335387ba46fcbbb6067ef4ff9cd3755a7@changeid | |
31 | Signed-off-by: Johannes Berg <johannes.berg@intel.com> | |
32 | Stable-dep-of: e78d78773089 ("wifi: iwlwifi: mvm: include link ID when releasing frames") | |
33 | Signed-off-by: Sasha Levin <sashal@kernel.org> | |
34 | --- | |
35 | drivers/net/wireless/intel/iwlwifi/iwl-trans.h | 2 +- | |
36 | drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 4 +++- | |
37 | drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 11 ++++++++++- | |
38 | 3 files changed, 14 insertions(+), 3 deletions(-) | |
39 | ||
40 | diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |
41 | index 168eda2132fb8..9dcc1506bd0b0 100644 | |
42 | --- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |
43 | +++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h | |
44 | @@ -278,7 +278,7 @@ static inline void iwl_free_rxb(struct iwl_rx_cmd_buffer *r) | |
45 | #define IWL_MGMT_TID 15 | |
46 | #define IWL_FRAME_LIMIT 64 | |
47 | #define IWL_MAX_RX_HW_QUEUES 16 | |
48 | -#define IWL_9000_MAX_RX_HW_QUEUES 6 | |
49 | +#define IWL_9000_MAX_RX_HW_QUEUES 1 | |
50 | ||
51 | /** | |
52 | * enum iwl_wowlan_status - WoWLAN image/device status | |
53 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |
54 | index aaa9840d0d4c5..ee9d14250a261 100644 | |
55 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |
56 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | |
57 | @@ -352,7 +352,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) | |
58 | ieee80211_hw_set(hw, HAS_RATE_CONTROL); | |
59 | } | |
60 | ||
61 | - if (iwl_mvm_has_new_rx_api(mvm)) | |
62 | + /* We want to use the mac80211's reorder buffer for 9000 */ | |
63 | + if (iwl_mvm_has_new_rx_api(mvm) && | |
64 | + mvm->trans->trans_cfg->device_family > IWL_DEVICE_FAMILY_9000) | |
65 | ieee80211_hw_set(hw, SUPPORTS_REORDERING_BUFFER); | |
66 | ||
67 | if (fw_has_capa(&mvm->fw->ucode_capa, | |
68 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |
69 | index bac0228b8c866..92b3e18dbe877 100644 | |
70 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |
71 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | |
72 | @@ -963,6 +963,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm, | |
73 | baid = (reorder & IWL_RX_MPDU_REORDER_BAID_MASK) >> | |
74 | IWL_RX_MPDU_REORDER_BAID_SHIFT; | |
75 | ||
76 | + if (mvm->trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_9000) | |
77 | + return false; | |
78 | + | |
79 | /* | |
80 | * This also covers the case of receiving a Block Ack Request | |
81 | * outside a BA session; we'll pass it to mac80211 and that | |
82 | @@ -2621,9 +2624,15 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi, | |
83 | ||
84 | if (!iwl_mvm_reorder(mvm, napi, queue, sta, skb, desc) && | |
85 | likely(!iwl_mvm_time_sync_frame(mvm, skb, hdr->addr2)) && | |
86 | - likely(!iwl_mvm_mei_filter_scan(mvm, skb))) | |
87 | + likely(!iwl_mvm_mei_filter_scan(mvm, skb))) { | |
88 | + if (mvm->trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_9000 && | |
89 | + (desc->mac_flags2 & IWL_RX_MPDU_MFLG2_AMSDU) && | |
90 | + !(desc->amsdu_info & IWL_RX_MPDU_AMSDU_LAST_SUBFRAME)) | |
91 | + rx_status->flag |= RX_FLAG_AMSDU_MORE; | |
92 | + | |
93 | iwl_mvm_pass_packet_to_mac80211(mvm, napi, skb, queue, sta, | |
94 | link_sta); | |
95 | + } | |
96 | out: | |
97 | rcu_read_unlock(); | |
98 | } | |
99 | -- | |
100 | 2.43.0 | |
101 |