diff options
| author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2026-09-30 12:19:40 +0300 |
|---|---|---|
| committer | Miri Korenblit <miriam.rachel.korenblit@intel.com> | 2026-09-30 17:16:54 +0300 |
| commit | 068339769f3e25ca9140c5a55792c631aa36fdbb (patch) | |
| tree | 2f8936fbb3e817cc0820b2a554fa8d88dc82623a /drivers/net/wireless/intel | |
| parent | d700846514c91fababad31d79e94efee6b23b544 (diff) | |
| download | linux-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.c | 9 |
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); |
