@@ -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
576575mt7996_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
730731void 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
764746int mt7996_register_device (struct mt7996_dev * dev )
0 commit comments