Skip to content

Commit 827a686

Browse files
csyuancnbd168
authored andcommitted
wifi: mt76: mt7996: rework capability init
Rework and extract common code of capability init for the preparation of adding EHT capability. Signed-off-by: Shayne Chen <shayne.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 4348254 commit 827a686

File tree

1 file changed

+139
-157
lines changed
  • drivers/net/wireless/mediatek/mt76/mt7996

1 file changed

+139
-157
lines changed

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

Lines changed: 139 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ static const struct ieee80211_iface_combination if_comb[] = {
3737
BIT(NL80211_CHAN_WIDTH_20) |
3838
BIT(NL80211_CHAN_WIDTH_40) |
3939
BIT(NL80211_CHAN_WIDTH_80) |
40-
BIT(NL80211_CHAN_WIDTH_160) |
41-
BIT(NL80211_CHAN_WIDTH_80P80),
40+
BIT(NL80211_CHAN_WIDTH_160),
4241
}
4342
};
4443

@@ -572,11 +571,15 @@ mt7996_gen_ppe_thresh(u8 *he_ppet, int nss)
572571
(0xff >> (8 - (ppet_bits - 1) % 8));
573572
}
574573

575-
static int
574+
static void
576575
mt7996_init_he_caps(struct mt7996_phy *phy, enum nl80211_band band,
577-
struct ieee80211_sband_iftype_data *data)
576+
struct ieee80211_sband_iftype_data *data,
577+
enum nl80211_iftype iftype)
578578
{
579-
int i, idx = 0, nss = hweight8(phy->mt76->antenna_mask);
579+
struct ieee80211_sta_he_cap *he_cap = &data->he_cap;
580+
struct ieee80211_he_cap_elem *he_cap_elem = &he_cap->he_cap_elem;
581+
struct ieee80211_he_mcs_nss_supp *he_mcs = &he_cap->he_mcs_nss_supp;
582+
int i, nss = hweight8(phy->mt76->antenna_mask);
580583
u16 mcs_map = 0;
581584

582585
for (i = 0; i < 8; i++) {
@@ -586,179 +589,158 @@ mt7996_init_he_caps(struct mt7996_phy *phy, enum nl80211_band band,
586589
mcs_map |= (IEEE80211_HE_MCS_NOT_SUPPORTED << (i * 2));
587590
}
588591

589-
for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
590-
struct ieee80211_sta_he_cap *he_cap = &data[idx].he_cap;
591-
struct ieee80211_he_cap_elem *he_cap_elem =
592-
&he_cap->he_cap_elem;
593-
struct ieee80211_he_mcs_nss_supp *he_mcs =
594-
&he_cap->he_mcs_nss_supp;
595-
596-
switch (i) {
597-
case NL80211_IFTYPE_STATION:
598-
case NL80211_IFTYPE_AP:
599-
#ifdef CONFIG_MAC80211_MESH
600-
case NL80211_IFTYPE_MESH_POINT:
601-
#endif
602-
break;
603-
default:
604-
continue;
605-
}
592+
he_cap->has_he = true;
606593

607-
data[idx].types_mask = BIT(i);
608-
he_cap->has_he = true;
594+
he_cap_elem->mac_cap_info[0] = IEEE80211_HE_MAC_CAP0_HTC_HE;
595+
he_cap_elem->mac_cap_info[3] = IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
596+
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
597+
he_cap_elem->mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
609598

610-
he_cap_elem->mac_cap_info[0] =
611-
IEEE80211_HE_MAC_CAP0_HTC_HE;
612-
he_cap_elem->mac_cap_info[3] =
613-
IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
614-
IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3;
615-
he_cap_elem->mac_cap_info[4] =
616-
IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU;
599+
if (band == NL80211_BAND_2GHZ)
600+
he_cap_elem->phy_cap_info[0] =
601+
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
602+
else
603+
he_cap_elem->phy_cap_info[0] =
604+
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
605+
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
606+
607+
he_cap_elem->phy_cap_info[1] = IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
608+
he_cap_elem->phy_cap_info[2] = IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
609+
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ;
610+
611+
switch (iftype) {
612+
case NL80211_IFTYPE_AP:
613+
he_cap_elem->mac_cap_info[0] |= IEEE80211_HE_MAC_CAP0_TWT_RES;
614+
he_cap_elem->mac_cap_info[2] |= IEEE80211_HE_MAC_CAP2_BSR;
615+
he_cap_elem->mac_cap_info[4] |= IEEE80211_HE_MAC_CAP4_BQR;
616+
he_cap_elem->mac_cap_info[5] |=
617+
IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX;
618+
he_cap_elem->phy_cap_info[3] |=
619+
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
620+
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
621+
he_cap_elem->phy_cap_info[6] |=
622+
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
623+
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
624+
he_cap_elem->phy_cap_info[9] |=
625+
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
626+
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
627+
break;
628+
case NL80211_IFTYPE_STATION:
629+
he_cap_elem->mac_cap_info[1] |=
630+
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
617631

618632
if (band == NL80211_BAND_2GHZ)
619-
he_cap_elem->phy_cap_info[0] =
620-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
633+
he_cap_elem->phy_cap_info[0] |=
634+
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G;
621635
else
622-
he_cap_elem->phy_cap_info[0] =
623-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
624-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
625-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
636+
he_cap_elem->phy_cap_info[0] |=
637+
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G;
638+
639+
he_cap_elem->phy_cap_info[1] |=
640+
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
641+
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US;
642+
he_cap_elem->phy_cap_info[3] |=
643+
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
644+
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
645+
he_cap_elem->phy_cap_info[6] |=
646+
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
647+
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
648+
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
649+
he_cap_elem->phy_cap_info[7] |=
650+
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
651+
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
652+
he_cap_elem->phy_cap_info[8] |=
653+
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
654+
IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
655+
IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU |
656+
IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484;
657+
he_cap_elem->phy_cap_info[9] |=
658+
IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
659+
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
660+
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
661+
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
662+
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
663+
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
664+
break;
665+
default:
666+
break;
667+
}
626668

627-
he_cap_elem->phy_cap_info[1] =
628-
IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD;
629-
he_cap_elem->phy_cap_info[2] =
630-
IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
631-
IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ;
669+
he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map);
670+
he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map);
671+
he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map);
672+
he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map);
673+
674+
mt7996_set_stream_he_txbf_caps(phy, he_cap, iftype);
675+
676+
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
677+
if (he_cap_elem->phy_cap_info[6] &
678+
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
679+
mt7996_gen_ppe_thresh(he_cap->ppe_thres, nss);
680+
} else {
681+
he_cap_elem->phy_cap_info[9] |=
682+
u8_encode_bits(IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US,
683+
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_MASK);
684+
}
632685

633-
switch (i) {
634-
case NL80211_IFTYPE_AP:
635-
he_cap_elem->mac_cap_info[0] |=
636-
IEEE80211_HE_MAC_CAP0_TWT_RES;
637-
he_cap_elem->mac_cap_info[2] |=
638-
IEEE80211_HE_MAC_CAP2_BSR;
639-
he_cap_elem->mac_cap_info[4] |=
640-
IEEE80211_HE_MAC_CAP4_BQR;
641-
he_cap_elem->mac_cap_info[5] |=
642-
IEEE80211_HE_MAC_CAP5_OM_CTRL_UL_MU_DATA_DIS_RX;
643-
he_cap_elem->phy_cap_info[3] |=
644-
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
645-
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
646-
he_cap_elem->phy_cap_info[6] |=
647-
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
648-
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
649-
he_cap_elem->phy_cap_info[9] |=
650-
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
651-
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU;
652-
break;
653-
case NL80211_IFTYPE_STATION:
654-
he_cap_elem->mac_cap_info[1] |=
655-
IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US;
656-
657-
if (band == NL80211_BAND_2GHZ)
658-
he_cap_elem->phy_cap_info[0] |=
659-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_2G;
660-
else
661-
he_cap_elem->phy_cap_info[0] |=
662-
IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_RU_MAPPING_IN_5G;
663-
664-
he_cap_elem->phy_cap_info[1] |=
665-
IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
666-
IEEE80211_HE_PHY_CAP1_HE_LTF_AND_GI_FOR_HE_PPDUS_0_8US;
667-
he_cap_elem->phy_cap_info[3] |=
668-
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_TX_QPSK |
669-
IEEE80211_HE_PHY_CAP3_DCM_MAX_CONST_RX_QPSK;
670-
he_cap_elem->phy_cap_info[6] |=
671-
IEEE80211_HE_PHY_CAP6_TRIG_CQI_FB |
672-
IEEE80211_HE_PHY_CAP6_PARTIAL_BW_EXT_RANGE |
673-
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT;
674-
he_cap_elem->phy_cap_info[7] |=
675-
IEEE80211_HE_PHY_CAP7_POWER_BOOST_FACTOR_SUPP |
676-
IEEE80211_HE_PHY_CAP7_HE_SU_MU_PPDU_4XLTF_AND_08_US_GI;
677-
he_cap_elem->phy_cap_info[8] |=
678-
IEEE80211_HE_PHY_CAP8_20MHZ_IN_40MHZ_HE_PPDU_IN_2G |
679-
IEEE80211_HE_PHY_CAP8_20MHZ_IN_160MHZ_HE_PPDU |
680-
IEEE80211_HE_PHY_CAP8_80MHZ_IN_160MHZ_HE_PPDU |
681-
IEEE80211_HE_PHY_CAP8_DCM_MAX_RU_484;
682-
he_cap_elem->phy_cap_info[9] |=
683-
IEEE80211_HE_PHY_CAP9_LONGER_THAN_16_SIGB_OFDM_SYM |
684-
IEEE80211_HE_PHY_CAP9_NON_TRIGGERED_CQI_FEEDBACK |
685-
IEEE80211_HE_PHY_CAP9_TX_1024_QAM_LESS_THAN_242_TONE_RU |
686-
IEEE80211_HE_PHY_CAP9_RX_1024_QAM_LESS_THAN_242_TONE_RU |
687-
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_COMP_SIGB |
688-
IEEE80211_HE_PHY_CAP9_RX_FULL_BW_SU_USING_MU_WITH_NON_COMP_SIGB;
689-
break;
690-
}
686+
if (band == NL80211_BAND_6GHZ) {
687+
u16 cap = IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
688+
IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
691689

692-
he_mcs->rx_mcs_80 = cpu_to_le16(mcs_map);
693-
he_mcs->tx_mcs_80 = cpu_to_le16(mcs_map);
694-
he_mcs->rx_mcs_160 = cpu_to_le16(mcs_map);
695-
he_mcs->tx_mcs_160 = cpu_to_le16(mcs_map);
696-
he_mcs->rx_mcs_80p80 = cpu_to_le16(mcs_map);
697-
he_mcs->tx_mcs_80p80 = cpu_to_le16(mcs_map);
698-
699-
mt7996_set_stream_he_txbf_caps(phy, he_cap, i);
700-
701-
memset(he_cap->ppe_thres, 0, sizeof(he_cap->ppe_thres));
702-
if (he_cap_elem->phy_cap_info[6] &
703-
IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) {
704-
mt7996_gen_ppe_thresh(he_cap->ppe_thres, nss);
705-
} else {
706-
he_cap_elem->phy_cap_info[9] |=
707-
IEEE80211_HE_PHY_CAP9_NOMINAL_PKT_PADDING_16US;
708-
}
690+
cap |= u16_encode_bits(IEEE80211_HT_MPDU_DENSITY_2,
691+
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START) |
692+
u16_encode_bits(IEEE80211_VHT_MAX_AMPDU_1024K,
693+
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP) |
694+
u16_encode_bits(IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454,
695+
IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
709696

710-
if (band == NL80211_BAND_6GHZ) {
711-
u16 cap = IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
712-
IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS;
697+
data->he_6ghz_capa.capa = cpu_to_le16(cap);
698+
}
699+
}
713700

714-
cap |= u16_encode_bits(IEEE80211_HT_MPDU_DENSITY_2,
715-
IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START) |
716-
u16_encode_bits(IEEE80211_VHT_MAX_AMPDU_1024K,
717-
IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP) |
718-
u16_encode_bits(IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454,
719-
IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN);
701+
static void
702+
__mt7996_set_stream_he_caps(struct mt7996_phy *phy,
703+
struct ieee80211_supported_band *sband,
704+
enum nl80211_band band)
705+
{
706+
struct ieee80211_sband_iftype_data *data = phy->iftype[band];
707+
int i, n = 0;
720708

721-
data[idx].he_6ghz_capa.capa = cpu_to_le16(cap);
709+
for (i = 0; i < NUM_NL80211_IFTYPES; i++) {
710+
switch (i) {
711+
case NL80211_IFTYPE_STATION:
712+
case NL80211_IFTYPE_AP:
713+
#ifdef CONFIG_MAC80211_MESH
714+
case NL80211_IFTYPE_MESH_POINT:
715+
#endif
716+
break;
717+
default:
718+
continue;
722719
}
723720

724-
idx++;
721+
data[n].types_mask = BIT(i);
722+
mt7996_init_he_caps(phy, band, &data[n], i);
723+
724+
n++;
725725
}
726726

727-
return idx;
727+
sband->iftype_data = data;
728+
sband->n_iftype_data = n;
728729
}
729730

730731
void mt7996_set_stream_he_caps(struct mt7996_phy *phy)
731732
{
732-
struct ieee80211_sband_iftype_data *data;
733-
struct ieee80211_supported_band *band;
734-
int n;
735-
736-
if (phy->mt76->cap.has_2ghz) {
737-
data = phy->iftype[NL80211_BAND_2GHZ];
738-
n = mt7996_init_he_caps(phy, NL80211_BAND_2GHZ, data);
739-
740-
band = &phy->mt76->sband_2g.sband;
741-
band->iftype_data = data;
742-
band->n_iftype_data = n;
743-
}
744-
745-
if (phy->mt76->cap.has_5ghz) {
746-
data = phy->iftype[NL80211_BAND_5GHZ];
747-
n = mt7996_init_he_caps(phy, NL80211_BAND_5GHZ, data);
748-
749-
band = &phy->mt76->sband_5g.sband;
750-
band->iftype_data = data;
751-
band->n_iftype_data = n;
752-
}
733+
if (phy->mt76->cap.has_2ghz)
734+
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_2g.sband,
735+
NL80211_BAND_2GHZ);
753736

754-
if (phy->mt76->cap.has_6ghz) {
755-
data = phy->iftype[NL80211_BAND_6GHZ];
756-
n = mt7996_init_he_caps(phy, NL80211_BAND_6GHZ, data);
737+
if (phy->mt76->cap.has_5ghz)
738+
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_5g.sband,
739+
NL80211_BAND_5GHZ);
757740

758-
band = &phy->mt76->sband_6g.sband;
759-
band->iftype_data = data;
760-
band->n_iftype_data = n;
761-
}
741+
if (phy->mt76->cap.has_6ghz)
742+
__mt7996_set_stream_he_caps(phy, &phy->mt76->sband_6g.sband,
743+
NL80211_BAND_6GHZ);
762744
}
763745

764746
int mt7996_register_device(struct mt7996_dev *dev)

0 commit comments

Comments
 (0)