summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2026-09-30 12:19:40 +0300
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>2026-10-11 13:07:49 +0300
commitda900a52d1691e98a7fbecbfbc22350671ba8b3a (patch)
treea699bc00396141e7765f1571bc4d28c286a553e0 /drivers
parentc9de80c7932d8564c874c062083b81bcecedcbe0 (diff)
downloadlinux-next-da900a52d1691e98a7fbecbfbc22350671ba8b3a.tar.gz
linux-next-da900a52d1691e98a7fbecbfbc22350671ba8b3a.zip
wifi: iwlwifi: mld: fake a valid NSS field when needed
We hit a WARNING in mac80211 in sniffer that complains that rx_status->nss is 0. This happens on frames that the firmware doesn't really understand and when that happens, somehow the STBC bit is set. The driver divides the number of antennas by 2 to get the NSS with STBC set because each stream requires 2 antennas. Since NSTS=1, NSS end up being 0. Since we don't have devices with more than 2 antennas, just consider that when we receive STBC traffic, we have one spatial stream. Since this problem has been seen on HE traffic only, don't apply this logic on VHT / HT code paths. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> Reviewed-by: Johannes Berg <johannes.berg@intel.com> Link: https://patch.msgid.link/20260930121740.2589668e377b.Ib41003bd4e10f0fe6d7f4aa1038291be330c3175@changeid Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mld/rx.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mld/rx.c b/drivers/net/wireless/intel/iwlwifi/mld/rx.c
index 5f18aa551af5..8fa438fd7815 100644
--- a/drivers/net/wireless/intel/iwlwifi/mld/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mld/rx.c
@@ -553,7 +553,10 @@ iwl_mld_decode_he_tb_phy_data(struct iwl_mld_rx_phy_data *phy_data,
nsts = le32_get_bits(phy_data->ntfy->sigs.he_tb.tb_rx1,
OFDM_UCODE_TRIG_BASE_RX_NSTS) + 1;
- rx_status->nss = nsts >> !!(rate_n_flags & RATE_MCS_STBC_MSK);
+
+ rx_status->nss = nsts;
+ if (rate_n_flags & RATE_MCS_STBC_MSK)
+ rx_status->nss = 1;
}
static void
@@ -589,7 +592,9 @@ iwl_mld_decode_he_phy_data(struct iwl_mld_rx_phy_data *phy_data,
break;
}
- rx_status->nss = nsts >> !!(rate_n_flags & RATE_MCS_STBC_MSK);
+ rx_status->nss = nsts;
+ if (rate_n_flags & RATE_MCS_STBC_MSK)
+ rx_status->nss = 1;
he->data1 |= cpu_to_le16(IEEE80211_RADIOTAP_HE_DATA1_LDPC_XSYMSEG_KNOWN |
IEEE80211_RADIOTAP_HE_DATA1_DOPPLER_KNOWN);