]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
mac80211_hwsim: enable 6GHz channels
authorRamon Fontes <ramonreisfontes@gmail.com>
Thu, 23 Sep 2021 18:28:05 +0000 (15:28 -0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 24 Sep 2021 11:10:21 +0000 (13:10 +0200)
Advertise 6 GHz channels with HE (and without HT/VHT) capabilities.

Signed-off-by: Ramon Fontes <ramonreisfontes@gmail.com>
Link: https://lore.kernel.org/r/20210923182805.27122-1-ramonreisfontes@gmail.com
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/mac80211_hwsim.c

index ffa894f7312a47a0bfd4277fb3c5a02130fe86dd..2d09e998d643d2355fec993250597b6dadb639d0 100644 (file)
@@ -2802,7 +2802,6 @@ out_err:
 
 static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
        {
-               /* TODO: should we support other types, e.g., P2P?*/
                .types_mask = BIT(NL80211_IFTYPE_STATION) |
                              BIT(NL80211_IFTYPE_AP),
                .he_cap = {
@@ -2850,7 +2849,6 @@ static const struct ieee80211_sband_iftype_data he_capa_2ghz[] = {
        },
 #ifdef CONFIG_MAC80211_MESH
        {
-               /* TODO: should we support other types, e.g., IBSS?*/
                .types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
                .he_cap = {
                        .has_he = true,
@@ -2988,6 +2986,122 @@ static const struct ieee80211_sband_iftype_data he_capa_5ghz[] = {
 #endif
 };
 
+static const struct ieee80211_sband_iftype_data he_capa_6ghz[] = {
+       {
+               /* TODO: should we support other types, e.g., P2P?*/
+               .types_mask = BIT(NL80211_IFTYPE_STATION) |
+                             BIT(NL80211_IFTYPE_AP),
+               .he_6ghz_capa = {
+                       .capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
+                                           IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
+                                           IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
+                                           IEEE80211_HE_6GHZ_CAP_SM_PS |
+                                           IEEE80211_HE_6GHZ_CAP_RD_RESPONDER |
+                                           IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
+                                           IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS),
+               },
+               .he_cap = {
+                       .has_he = true,
+                       .he_cap_elem = {
+                               .mac_cap_info[0] =
+                                       IEEE80211_HE_MAC_CAP0_HTC_HE,
+                               .mac_cap_info[1] =
+                                       IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
+                                       IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
+                               .mac_cap_info[2] =
+                                       IEEE80211_HE_MAC_CAP2_BSR |
+                                       IEEE80211_HE_MAC_CAP2_MU_CASCADING |
+                                       IEEE80211_HE_MAC_CAP2_ACK_EN,
+                               .mac_cap_info[3] =
+                                       IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
+                                       IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
+                               .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
+                               .phy_cap_info[0] =
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
+                               .phy_cap_info[1] =
+                                       IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
+                                       IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
+                                       IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
+                                       IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
+                               .phy_cap_info[2] =
+                                       IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
+                                       IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
+                                       IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
+                                       IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
+                                       IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
+
+                               /* Leave all the other PHY capability bytes
+                                * unset, as DCM, beam forming, RU and PPE
+                                * threshold information are not supported
+                                */
+                       },
+                       .he_mcs_nss_supp = {
+                               .rx_mcs_80 = cpu_to_le16(0xfffa),
+                               .tx_mcs_80 = cpu_to_le16(0xfffa),
+                               .rx_mcs_160 = cpu_to_le16(0xfffa),
+                               .tx_mcs_160 = cpu_to_le16(0xfffa),
+                               .rx_mcs_80p80 = cpu_to_le16(0xfffa),
+                               .tx_mcs_80p80 = cpu_to_le16(0xfffa),
+                       },
+               },
+       },
+#ifdef CONFIG_MAC80211_MESH
+       {
+               /* TODO: should we support other types, e.g., IBSS?*/
+               .types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
+               .he_6ghz_capa = {
+                       .capa = cpu_to_le16(IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
+                                           IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
+                                           IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
+                                           IEEE80211_HE_6GHZ_CAP_SM_PS |
+                                           IEEE80211_HE_6GHZ_CAP_RD_RESPONDER |
+                                           IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
+                                           IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS),
+               },
+               .he_cap = {
+                       .has_he = true,
+                       .he_cap_elem = {
+                               .mac_cap_info[0] =
+                                       IEEE80211_HE_MAC_CAP0_HTC_HE,
+                               .mac_cap_info[1] =
+                                       IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
+                               .mac_cap_info[2] =
+                                       IEEE80211_HE_MAC_CAP2_ACK_EN,
+                               .mac_cap_info[3] =
+                                       IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
+                                       IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
+                               .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
+                               .phy_cap_info[0] =
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
+                                       IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
+                               .phy_cap_info[1] =
+                                       IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
+                                       IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
+                                       IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
+                                       IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
+                               .phy_cap_info[2] = 0,
+
+                               /* Leave all the other PHY capability bytes
+                                * unset, as DCM, beam forming, RU and PPE
+                                * threshold information are not supported
+                                */
+                       },
+                       .he_mcs_nss_supp = {
+                               .rx_mcs_80 = cpu_to_le16(0xfffa),
+                               .tx_mcs_80 = cpu_to_le16(0xfffa),
+                               .rx_mcs_160 = cpu_to_le16(0xfffa),
+                               .tx_mcs_160 = cpu_to_le16(0xfffa),
+                               .rx_mcs_80p80 = cpu_to_le16(0xfffa),
+                               .tx_mcs_80p80 = cpu_to_le16(0xfffa),
+                       },
+               },
+       },
+#endif
+};
+
 static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)
 {
        u16 n_iftype_data;
@@ -3000,6 +3114,10 @@ static void mac80211_hwsim_he_capab(struct ieee80211_supported_band *sband)
                n_iftype_data = ARRAY_SIZE(he_capa_5ghz);
                sband->iftype_data =
                        (struct ieee80211_sband_iftype_data *)he_capa_5ghz;
+       } else if (sband->band == NL80211_BAND_6GHZ) {
+               n_iftype_data = ARRAY_SIZE(he_capa_6ghz);
+               sband->iftype_data =
+                       (struct ieee80211_sband_iftype_data *)he_capa_6ghz;
        } else {
                return;
        }
@@ -3290,6 +3408,12 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
                        sband->vht_cap.vht_mcs.tx_mcs_map =
                                sband->vht_cap.vht_mcs.rx_mcs_map;
                        break;
+               case NL80211_BAND_6GHZ:
+                       sband->channels = data->channels_6ghz;
+                       sband->n_channels = ARRAY_SIZE(hwsim_channels_6ghz);
+                       sband->bitrates = data->rates + 4;
+                       sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4;
+                       break;
                case NL80211_BAND_S1GHZ:
                        memcpy(&sband->s1g_cap, &hwsim_s1g_cap,
                               sizeof(sband->s1g_cap));
@@ -3300,19 +3424,21 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
                        continue;
                }
 
-               sband->ht_cap.ht_supported = true;
-               sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
-                                   IEEE80211_HT_CAP_GRN_FLD |
-                                   IEEE80211_HT_CAP_SGI_20 |
-                                   IEEE80211_HT_CAP_SGI_40 |
-                                   IEEE80211_HT_CAP_DSSSCCK40;
-               sband->ht_cap.ampdu_factor = 0x3;
-               sband->ht_cap.ampdu_density = 0x6;
-               memset(&sband->ht_cap.mcs, 0,
-                      sizeof(sband->ht_cap.mcs));
-               sband->ht_cap.mcs.rx_mask[0] = 0xff;
-               sband->ht_cap.mcs.rx_mask[1] = 0xff;
-               sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
+               if (band != NL80211_BAND_6GHZ){
+                       sband->ht_cap.ht_supported = true;
+                       sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
+                                           IEEE80211_HT_CAP_GRN_FLD |
+                                           IEEE80211_HT_CAP_SGI_20 |
+                                           IEEE80211_HT_CAP_SGI_40 |
+                                           IEEE80211_HT_CAP_DSSSCCK40;
+                       sband->ht_cap.ampdu_factor = 0x3;
+                       sband->ht_cap.ampdu_density = 0x6;
+                       memset(&sband->ht_cap.mcs, 0,
+                              sizeof(sband->ht_cap.mcs));
+                       sband->ht_cap.mcs.rx_mask[0] = 0xff;
+                       sband->ht_cap.mcs.rx_mask[1] = 0xff;
+                       sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
+               }
 
                mac80211_hwsim_he_capab(sband);