wifi: mt76: mt7996: set correct beamformee SS capability
authorHoward Hsu <howard-yh.hsu@mediatek.com>
Fri, 16 Aug 2024 09:46:30 +0000 (17:46 +0800)
committerFelix Fietkau <nbd@nbd.name>
Thu, 5 Sep 2024 11:01:55 +0000 (13:01 +0200)
According to IEEE P802.11be/D6.0 Table 9-417n, beamformee SS field stands
for the maximum number of spatial streams that the STA can receive in an
EHT sounding NDP minus 1, and the minimum value of this field is 3.

This value indicates the decoding capability of a beamformee, which is
independent of current antenna settings. Correct the value for mt7996
and mt7992 chipsets based on their HW capability.

Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com>
Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
Link: https://patch.msgid.link/20240816094635.2391-6-shayne.chen@mediatek.com
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mt7996/init.c

index 7e7e42b54c2e74aee5c2526bec6dc2efdf799090..5e96973226bbb5165fbf005854c73e73c8d9c123 100644 (file)
@@ -942,8 +942,12 @@ void mt7996_set_stream_vht_txbf_caps(struct mt7996_phy *phy)
        cap = &phy->mt76->sband_5g.sband.vht_cap.cap;
 
        *cap |= IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
-               IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
-               FIELD_PREP(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, sts - 1);
+               IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
+
+       if (is_mt7996(phy->mt76->dev))
+               *cap |= FIELD_PREP(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, 3);
+       else
+               *cap |= FIELD_PREP(IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK, 4);
 
        *cap &= ~(IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK |
                  IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
@@ -988,9 +992,15 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,
            IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO;
        elem->phy_cap_info[2] |= c;
 
-       c = IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE |
-           IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 |
-           IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4;
+       c = IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE;
+
+       if (is_mt7996(phy->mt76->dev))
+               c |= IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_4 |
+                    IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_4;
+       else
+               c |= IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_UNDER_80MHZ_5 |
+                    IEEE80211_HE_PHY_CAP4_BEAMFORMEE_MAX_STS_ABOVE_80MHZ_5;
+
        elem->phy_cap_info[4] |= c;
 
        /* do not support NG16 due to spec D4.0 changes subcarrier idx */
@@ -1187,7 +1197,8 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
                IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
                IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE;
 
-       val = max_t(u8, sts - 1, 3);
+       /* Set the maximum capability regardless of the antenna configuration. */
+       val = is_mt7992(phy->mt76->dev) ? 4 : 3;
        eht_cap_elem->phy_cap_info[0] |=
                u8_encode_bits(u8_get_bits(val, BIT(0)),
                               IEEE80211_EHT_PHY_CAP0_BEAMFORMEE_SS_80MHZ_MASK);