Skip to content

Commit f533f9d

Browse files
haogrootfrank-w
authored andcommitted
wifi: mt76: mt7996: fix HE and EHT beamforming capabilities
Fix HE and EHT beamforming capabilities for different bands and interface types. Fixes: 98686cd ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices") Fixes: 348533e ("wifi: mt76: mt7996: add EHT capability init") Signed-off-by: Howard Hsu <howard-yh.hsu@mediatek.com> Signed-off-by: Shayne Chen <shayne.chen@mediatek.com>
1 parent 5e50f1c commit f533f9d

1 file changed

Lines changed: 43 additions & 22 deletions

File tree

  • drivers/net/wireless/mediatek/mt76/mt7996

drivers/net/wireless/mediatek/mt76/mt7996/init.c

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,15 +1037,18 @@ mt7996_set_stream_he_txbf_caps(struct mt7996_phy *phy,
10371037
return;
10381038

10391039
elem->phy_cap_info[3] |= IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER;
1040-
if (vif == NL80211_IFTYPE_AP)
1041-
elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
10421040

10431041
c = FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK,
10441042
sts - 1) |
10451043
FIELD_PREP(IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_ABOVE_80MHZ_MASK,
10461044
sts - 1);
10471045
elem->phy_cap_info[5] |= c;
10481046

1047+
if (vif != NL80211_IFTYPE_AP)
1048+
return;
1049+
1050+
elem->phy_cap_info[4] |= IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER;
1051+
10491052
c = IEEE80211_HE_PHY_CAP6_TRIG_SU_BEAMFORMING_FB |
10501053
IEEE80211_HE_PHY_CAP6_TRIG_MU_BEAMFORMING_PARTIAL_BW_FB;
10511054
elem->phy_cap_info[6] |= c;
@@ -1205,7 +1208,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
12051208
IEEE80211_EHT_MAC_CAP0_OM_CONTROL;
12061209

12071210
eht_cap_elem->phy_cap_info[0] =
1208-
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ |
12091211
IEEE80211_EHT_PHY_CAP0_NDP_4_EHT_LFT_32_GI |
12101212
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMER |
12111213
IEEE80211_EHT_PHY_CAP0_SU_BEAMFORMEE;
@@ -1219,30 +1221,36 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
12191221
u8_encode_bits(u8_get_bits(val, GENMASK(2, 1)),
12201222
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_80MHZ_MASK) |
12211223
u8_encode_bits(val,
1222-
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK) |
1223-
u8_encode_bits(val,
1224-
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK);
1224+
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_160MHZ_MASK);
12251225

12261226
eht_cap_elem->phy_cap_info[2] =
12271227
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_80MHZ_MASK) |
1228-
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK) |
1229-
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK);
1228+
u8_encode_bits(sts - 1, IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_160MHZ_MASK);
1229+
1230+
if (band == NL80211_BAND_6GHZ) {
1231+
eht_cap_elem->phy_cap_info[0] |=
1232+
IEEE80211_EHT_PHY_CAP0_320MHZ_IN_6GHZ;
1233+
1234+
eht_cap_elem->phy_cap_info[1] |=
1235+
u8_encode_bits(val,
1236+
IEEE80211_EHT_PHY_CAP1_BEAMFORMEE_SS_320MHZ_MASK);
1237+
1238+
eht_cap_elem->phy_cap_info[2] |=
1239+
u8_encode_bits(sts - 1,
1240+
IEEE80211_EHT_PHY_CAP2_SOUNDING_DIM_320MHZ_MASK);
1241+
}
12301242

12311243
eht_cap_elem->phy_cap_info[3] =
12321244
IEEE80211_EHT_PHY_CAP3_NG_16_SU_FEEDBACK |
12331245
IEEE80211_EHT_PHY_CAP3_NG_16_MU_FEEDBACK |
12341246
IEEE80211_EHT_PHY_CAP3_CODEBOOK_4_2_SU_FDBK |
1235-
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK |
1236-
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
1237-
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK |
1238-
IEEE80211_EHT_PHY_CAP3_TRIG_CQI_FDBK;
1247+
IEEE80211_EHT_PHY_CAP3_CODEBOOK_7_5_MU_FDBK;
12391248

12401249
eht_cap_elem->phy_cap_info[4] =
12411250
u8_encode_bits(min_t(int, sts - 1, 2),
12421251
IEEE80211_EHT_PHY_CAP4_MAX_NC_MASK);
12431252

12441253
eht_cap_elem->phy_cap_info[5] =
1245-
IEEE80211_EHT_PHY_CAP5_NON_TRIG_CQI_FEEDBACK |
12461254
u8_encode_bits(IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_16US,
12471255
IEEE80211_EHT_PHY_CAP5_COMMON_NOMINAL_PKT_PAD_MASK) |
12481256
u8_encode_bits(u8_get_bits(0x11, GENMASK(1, 0)),
@@ -1256,14 +1264,6 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
12561264
IEEE80211_EHT_PHY_CAP6_MAX_NUM_SUPP_EHT_LTF_MASK) |
12571265
u8_encode_bits(val, IEEE80211_EHT_PHY_CAP6_MCS15_SUPP_MASK);
12581266

1259-
eht_cap_elem->phy_cap_info[7] =
1260-
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
1261-
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
1262-
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
1263-
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
1264-
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ |
1265-
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
1266-
12671267
val = u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_RX) |
12681268
u8_encode_bits(nss, IEEE80211_EHT_MCS_NSS_TX);
12691269
#define SET_EHT_MAX_NSS(_bw, _val) do { \
@@ -1274,8 +1274,29 @@ mt7996_init_eht_caps(struct mt7996_phy *phy, enum nl80211_band band,
12741274

12751275
SET_EHT_MAX_NSS(80, val);
12761276
SET_EHT_MAX_NSS(160, val);
1277-
SET_EHT_MAX_NSS(320, val);
1277+
if (band == NL80211_BAND_6GHZ)
1278+
SET_EHT_MAX_NSS(320, val);
12781279
#undef SET_EHT_MAX_NSS
1280+
1281+
if (iftype != NL80211_IFTYPE_AP)
1282+
return;
1283+
1284+
eht_cap_elem->phy_cap_info[3] |=
1285+
IEEE80211_EHT_PHY_CAP3_TRIG_SU_BF_FDBK |
1286+
IEEE80211_EHT_PHY_CAP3_TRIG_MU_BF_PART_BW_FDBK;
1287+
1288+
eht_cap_elem->phy_cap_info[7] =
1289+
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_80MHZ |
1290+
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_160MHZ |
1291+
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_80MHZ |
1292+
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_160MHZ;
1293+
1294+
if (band != NL80211_BAND_6GHZ)
1295+
return;
1296+
1297+
eht_cap_elem->phy_cap_info[7] |=
1298+
IEEE80211_EHT_PHY_CAP7_NON_OFDMA_UL_MU_MIMO_320MHZ |
1299+
IEEE80211_EHT_PHY_CAP7_MU_BEAMFORMER_320MHZ;
12791300
}
12801301

12811302
static void

0 commit comments

Comments
 (0)