[PATCH] ath11k: fix number of VHT beamformee spatial streams
Jesús Fernández Manzano
jesus.manzano at galgus.net
Tue Jun 21 01:29:40 PDT 2022
Hi Csaba,
It happens the same to me, HE is also affected and not fixed by this
patch because it is treated in a different place in the code than where
the VHT capabilities are set. If this patch is correct and is accepted I
would like to fix the HE part and upstream it too.
Ps: thanks for your work in the OpenWRT forum in the Xiaomi AX3600
thread. Very useful all these months.
Regards,
Jesus
El 20/6/22 a las 19:35, Sipos Csaba escribió:
> Dear Jesus,
>
> I wanted to ask you if you are sure if this is just a VHT issue, and
> HE is not affected? On my IPQ8074 board with 4 antennas for 5GHz, I
> have this IW output:
>
> HE Iftypes: AP
> HE MAC Capabilities (0x000d9a181040):
> +HTC HE Supported
> TWT Responder
> Dynamic BA Fragementation Level: 1
> BSR
> Broadcast TWT
> OM Control
> Maximum A-MPDU Length Exponent: 3
> RX Control Frame to MultiBSS
> A-MSDU in A-MPDU
> OM Control UL MU Data Disable RX
> HE PHY Capabilities: (0x1c604c887fdb839c010c00):
> HE40/HE80/5GHz
> HE160/5GHz
> HE160/HE80+80/5GHz
> LDPC Coding in Payload
> HE SU PPDU with 1x HE-LTF and 0.8us GI
> STBC Tx <= 80MHz
> STBC Rx <= 80MHz
> Full Bandwidth UL MU-MIMO
> DCM Max Constellation Rx: 1
> SU Beamformer
> SU Beamformee
> MU Beamformer
> Beamformee STS <= 80Mhz: 7
> Beamformee STS > 80Mhz: 3
> Sounding Dimensions <= 80Mhz: 3
> Sounding Dimensions > 80Mhz: 3
> Ng = 16 SU Feedback
> Ng = 16 MU Feedback
> Codebook Size SU Feedback
> Codebook Size MU Feedback
> PPE Threshold Present
> HE SU PPDU & HE PPDU 4x HE-LTF 0.8us GI
> Max NC: 3
> STBC Rx > 80MHz
> HE ER SU PPDU 4x HE-LTF 0.8us GI
> TX 1024-QAM
> RX 1024-QAM
> HE RX MCS and NSS set <= 80 MHz
> 1 streams: MCS 0-11
> 2 streams: MCS 0-11
> 3 streams: MCS 0-11
> 4 streams: MCS 0-11
> 5 streams: not supported
> 6 streams: not supported
> 7 streams: not supported
> 8 streams: not supported
> HE TX MCS and NSS set <= 80 MHz
> 1 streams: MCS 0-11
> 2 streams: MCS 0-11
> 3 streams: MCS 0-11
> 4 streams: MCS 0-11
> 5 streams: not supported
> 6 streams: not supported
> 7 streams: not supported
> 8 streams: not supported
> HE RX MCS and NSS set 160 MHz
> 1 streams: MCS 0-11
> 2 streams: MCS 0-11
> 3 streams: not supported
> 4 streams: not supported
> 5 streams: not supported
> 6 streams: not supported
> 7 streams: not supported
> 8 streams: not supported
> HE TX MCS and NSS set 160 MHz
> 1 streams: MCS 0-11
> 2 streams: MCS 0-11
> 3 streams: not supported
> 4 streams: not supported
> 5 streams: not supported
> 6 streams: not supported
> 7 streams: not supported
> 8 streams: not supported
>
> As you can see I have Beamformee STS <= 80Mhz: 7 under HE PHY
> Capabilities, not sure if that is correct.
>
> Using WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1 firmware.
>
> Thanks for your answer!
>
> Regards,
> Csaba
>
> Jesus Fernandez Manzano <jesus.manzano at galgus.net> ezt írta (időpont:
> 2022. jún. 16., Cs, 20:21):
>
> The number of spatial streams used when acting as a beamformee in VHT
> mode are reported by the firmware as 7 (8 sts - 1) both in IPQ6018 and
> IPQ8074 which respectively have 2 and 4 sts each. So the firmware
> should
> report 1 (2 - 1) and 3 (4 - 1).
>
> Fix this by checking that the number of VHT beamformee sts reported by
> the firmware is not greater than the number of receiving antennas - 1.
> The fix is based on the same approach used in this same function for
> sanitizing the number of sounding dimensions reported by the firmware.
>
> Without this change, acting as a beamformee in VHT mode is not working
> properly.
>
> Tested-on: IPQ6018 hw1.0 AHB
> WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
> Tested-on: IPQ8074 hw2.0 AHB
> WLAN.HK.2.5.0.1-01208-QCAHKSWPL_SILICONZ-1
>
> Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax
> devices")
> Signed-off-by: Jesus Fernandez Manzano <jesus.manzano at galgus.net>
> ---
> drivers/net/wireless/ath/ath11k/mac.c | 25 ++++++++++++++++++++-----
> 1 file changed, 20 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath11k/mac.c
> b/drivers/net/wireless/ath/ath11k/mac.c
> index 42d2e8cf8125..7109ca4f166d 100644
> --- a/drivers/net/wireless/ath/ath11k/mac.c
> +++ b/drivers/net/wireless/ath/ath11k/mac.c
> @@ -4950,6 +4950,8 @@ static int ath11k_mac_set_txbf_conf(struct
> ath11k_vif *arvif)
> if (vht_cap & (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)) {
> nsts = vht_cap &
> IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
> nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
> + if (nsts > (ar->num_rx_chains - 1))
> + nsts = ar->num_rx_chains - 1;
> value |= SM(nsts, WMI_TXBF_STS_CAP_OFFSET);
> }
>
> @@ -4990,7 +4992,7 @@ static int ath11k_mac_set_txbf_conf(struct
> ath11k_vif *arvif)
> static void ath11k_set_vht_txbf_cap(struct ath11k *ar, u32 *vht_cap)
> {
> bool subfer, subfee;
> - int sound_dim = 0;
> + int sound_dim = 0, nsts = 0;
>
> subfer = !!(*vht_cap &
> (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE));
> subfee = !!(*vht_cap &
> (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE));
> @@ -5000,6 +5002,11 @@ static void ath11k_set_vht_txbf_cap(struct
> ath11k *ar, u32 *vht_cap)
> subfer = false;
> }
>
> + if (ar->num_rx_chains < 2) {
> + *vht_cap &=
> ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE);
> + subfee = false;
> + }
> +
> /* If SU Beaformer is not set, then disable MU Beamformer
> Capability */
> if (!subfer)
> *vht_cap &=
> ~(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE);
> @@ -5012,7 +5019,9 @@ static void ath11k_set_vht_txbf_cap(struct
> ath11k *ar, u32 *vht_cap)
> sound_dim >>= IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_SHIFT;
> *vht_cap &= ~IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK;
>
> - /* TODO: Need to check invalid STS and Sound_dim values
> set by FW? */
> + nsts = (*vht_cap & IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
> + nsts >>= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
> + *vht_cap &= ~IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
>
> /* Enable Sounding Dimension Field only if SU BF is enabled */
> if (subfer) {
> @@ -5024,9 +5033,15 @@ static void ath11k_set_vht_txbf_cap(struct
> ath11k *ar, u32 *vht_cap)
> *vht_cap |= sound_dim;
> }
>
> - /* Use the STS advertised by FW unless SU Beamformee is
> not supported*/
> - if (!subfee)
> - *vht_cap &= ~(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK);
> + /* Enable Beamformee STS Field only if SU BF is enabled */
> + if (subfee) {
> + if (nsts > (ar->num_rx_chains - 1))
> + nsts = ar->num_rx_chains - 1;
> +
> + nsts <<= IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT;
> + nsts &= IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
> + *vht_cap |= nsts;
> + }
> }
>
> static struct ieee80211_sta_vht_cap
> --
> 2.25.1
>
More information about the ath11k
mailing list