summaryrefslogtreecommitdiff
path: root/drivers/net/wireless/intel
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-09-30 17:16:54 +0300
commit068339769f3e25ca9140c5a55792c631aa36fdbb (patch)
tree2f8936fbb3e817cc0820b2a554fa8d88dc82623a /drivers/net/wireless/intel
parentd700846514c91fababad31d79e94efee6b23b544 (diff)
downloadlinux-next-068339769f3e25ca9140c5a55792c631aa36fdbb.tar.gz
linux-next-068339769f3e25ca9140c5a55792c631aa36fdbb.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/net/wireless/intel')
-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);