2021-09-06 17:55:14

by Ramon Fontes

[permalink] [raw]
Subject: [PATCH] mac80211_hwsim: enable 6GHz channels

This adds 6 GHz capabilities and reject HT/VHT

Signed-off-by: Ramon Fontes <[email protected]>
---
drivers/net/wireless/mac80211_hwsim.c | 150 +++++++++++++++++++++++---
1 file changed, 137 insertions(+), 13 deletions(-)

diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index ffa894f73..d36770db1 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -2988,6 +2988,118 @@ 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 = 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_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 = 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_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 +3112,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 +3406,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 +3422,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);

--
2.25.1


2021-09-12 07:50:27

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] mac80211_hwsim: enable 6GHz channels

Hi Ramon,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mac80211-next/master]
[also build test WARNING on mac80211/master linux/master linus/master v5.14 next-20210910]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/0day-ci/linux/commits/Ramon-Fontes/mac80211_hwsim-enable-6GHz-channels/20210907-015533
base: https://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git master
config: i386-randconfig-s002-20210912 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
# apt-get install sparse
# sparse version: v0.6.4-dirty
# https://github.com/0day-ci/linux/commit/61f607d25097df8c64fc1a21b0375f69a1a38e94
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Ramon-Fontes/mac80211_hwsim-enable-6GHz-channels/20210907-015533
git checkout 61f607d25097df8c64fc1a21b0375f69a1a38e94
# save the attached .config to linux build tree
make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=i386

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>


sparse warnings: (new ones prefixed by >>)
>> drivers/net/wireless/mac80211_hwsim.c:3000:70: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le16 [usertype] capa @@ got int @@
drivers/net/wireless/mac80211_hwsim.c:3000:70: sparse: expected restricted __le16 [usertype] capa
drivers/net/wireless/mac80211_hwsim.c:3000:70: sparse: got int
drivers/net/wireless/mac80211_hwsim.c:3058:70: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __le16 [usertype] capa @@ got int @@
drivers/net/wireless/mac80211_hwsim.c:3058:70: sparse: expected restricted __le16 [usertype] capa
drivers/net/wireless/mac80211_hwsim.c:3058:70: sparse: got int

vim +3000 drivers/net/wireless/mac80211_hwsim.c

2990
2991 static const struct ieee80211_sband_iftype_data he_capa_6ghz[] = {
2992 {
2993 /* TODO: should we support other types, e.g., P2P?*/
2994 .types_mask = BIT(NL80211_IFTYPE_STATION) |
2995 BIT(NL80211_IFTYPE_AP),
2996 .he_6ghz_capa = {
2997 .capa = IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
2998 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
2999 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
> 3000 IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
3001 IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS,
3002 },
3003 .he_cap = {
3004 .has_he = true,
3005 .he_cap_elem = {
3006 .mac_cap_info[0] =
3007 IEEE80211_HE_MAC_CAP0_HTC_HE,
3008 .mac_cap_info[1] =
3009 IEEE80211_HE_MAC_CAP1_TF_MAC_PAD_DUR_16US |
3010 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
3011 .mac_cap_info[2] =
3012 IEEE80211_HE_MAC_CAP2_BSR |
3013 IEEE80211_HE_MAC_CAP2_MU_CASCADING |
3014 IEEE80211_HE_MAC_CAP2_ACK_EN,
3015 .mac_cap_info[3] =
3016 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
3017 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
3018 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
3019 .phy_cap_info[0] =
3020 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3021 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3022 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
3023 .phy_cap_info[1] =
3024 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
3025 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
3026 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
3027 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
3028 .phy_cap_info[2] =
3029 IEEE80211_HE_PHY_CAP2_NDP_4x_LTF_AND_3_2US |
3030 IEEE80211_HE_PHY_CAP2_STBC_TX_UNDER_80MHZ |
3031 IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ |
3032 IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO |
3033 IEEE80211_HE_PHY_CAP2_UL_MU_PARTIAL_MU_MIMO,
3034
3035 /* Leave all the other PHY capability bytes
3036 * unset, as DCM, beam forming, RU and PPE
3037 * threshold information are not supported
3038 */
3039 },
3040 .he_mcs_nss_supp = {
3041 .rx_mcs_80 = cpu_to_le16(0xfffa),
3042 .tx_mcs_80 = cpu_to_le16(0xfffa),
3043 .rx_mcs_160 = cpu_to_le16(0xfffa),
3044 .tx_mcs_160 = cpu_to_le16(0xfffa),
3045 .rx_mcs_80p80 = cpu_to_le16(0xfffa),
3046 .tx_mcs_80p80 = cpu_to_le16(0xfffa),
3047 },
3048 },
3049 },
3050 #ifdef CONFIG_MAC80211_MESH
3051 {
3052 /* TODO: should we support other types, e.g., IBSS?*/
3053 .types_mask = BIT(NL80211_IFTYPE_MESH_POINT),
3054 .he_6ghz_capa = {
3055 .capa = IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
3056 IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
3057 IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
3058 IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
3059 IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS,
3060 },
3061 .he_cap = {
3062 .has_he = true,
3063 .he_cap_elem = {
3064 .mac_cap_info[0] =
3065 IEEE80211_HE_MAC_CAP0_HTC_HE,
3066 .mac_cap_info[1] =
3067 IEEE80211_HE_MAC_CAP1_MULTI_TID_AGG_RX_QOS_8,
3068 .mac_cap_info[2] =
3069 IEEE80211_HE_MAC_CAP2_ACK_EN,
3070 .mac_cap_info[3] =
3071 IEEE80211_HE_MAC_CAP3_OMI_CONTROL |
3072 IEEE80211_HE_MAC_CAP3_MAX_AMPDU_LEN_EXP_EXT_3,
3073 .mac_cap_info[4] = IEEE80211_HE_MAC_CAP4_AMSDU_IN_AMPDU,
3074 .phy_cap_info[0] =
3075 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G |
3076 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G |
3077 IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G,
3078 .phy_cap_info[1] =
3079 IEEE80211_HE_PHY_CAP1_PREAMBLE_PUNC_RX_MASK |
3080 IEEE80211_HE_PHY_CAP1_DEVICE_CLASS_A |
3081 IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD |
3082 IEEE80211_HE_PHY_CAP1_MIDAMBLE_RX_TX_MAX_NSTS,
3083 .phy_cap_info[2] = 0,
3084
3085 /* Leave all the other PHY capability bytes
3086 * unset, as DCM, beam forming, RU and PPE
3087 * threshold information are not supported
3088 */
3089 },
3090 .he_mcs_nss_supp = {
3091 .rx_mcs_80 = cpu_to_le16(0xfffa),
3092 .tx_mcs_80 = cpu_to_le16(0xfffa),
3093 .rx_mcs_160 = cpu_to_le16(0xfffa),
3094 .tx_mcs_160 = cpu_to_le16(0xfffa),
3095 .rx_mcs_80p80 = cpu_to_le16(0xfffa),
3096 .tx_mcs_80p80 = cpu_to_le16(0xfffa),
3097 },
3098 },
3099 },
3100 #endif
3101 };
3102

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]


Attachments:
(No filename) (6.96 kB)
.config.gz (30.61 kB)
Download all attachments

2021-09-22 14:30:45

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH] mac80211_hwsim: enable 6GHz channels

On Wed, 2021-09-22 at 11:28 -0300, Ramon Fontes wrote:
> This adds 6 GHz capabilities and reject HT/VHT
>

It'd be nice to add a version to the subject, with -vN on the git-send-
email commandline :)

> + .he_6ghz_capa = {
> + .capa = IEEE80211_HE_6GHZ_CAP_MIN_MPDU_START |
> + IEEE80211_HE_6GHZ_CAP_MAX_AMPDU_LEN_EXP |
> + IEEE80211_HE_6GHZ_CAP_MAX_MPDU_LEN |
> + cpu_to_le16(IEEE80211_HE_6GHZ_CAP_TX_ANTPAT_CONS |
> + IEEE80211_HE_6GHZ_CAP_RX_ANTPAT_CONS),

Seems that needs to be around the *entire* initializer, not just parts
thereof?

The indentation could also use some work :)

johannes

2021-09-24 07:51:32

by Kalle Valo

[permalink] [raw]
Subject: Re: [PATCH] mac80211_hwsim: enable 6GHz channels

Johannes Berg <[email protected]> writes:

> On Wed, 2021-09-22 at 11:28 -0300, Ramon Fontes wrote:
>> This adds 6 GHz capabilities and reject HT/VHT
>>
>
> It'd be nice to add a version to the subject, with -vN on the git-send-
> email commandline :)

And don't forge the changelog either:

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches#changelog_missing

One day I'll write a bot to send these wiki links :)

--
https://patchwork.kernel.org/project/linux-wireless/list/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches