[PATCH wireless-next v3 2/2] wifi: mac80211_hwsim: Add UHR capabilities to the driver
Pablo MARTIN-GOMEZ
pmartin-gomez at freebox.fr
Fri Feb 13 06:36:48 PST 2026
Hello,
On 12/02/2026 19:01, Karthikeyan Kathirvel wrote:
> Add UHR capabilities for bringing up the interface in UHR mode.
> This is required to validate UHR test cases.
>
> Signed-off-by: Karthikeyan Kathirvel <karthikeyan.kathirvel at oss.qualcomm.com>
> ---
> drivers/net/wireless/virtual/mac80211_hwsim.c | 285 ++++++++++++++++++
> 1 file changed, 285 insertions(+)
>
> diff --git a/drivers/net/wireless/virtual/mac80211_hwsim.c b/drivers/net/wireless/virtual/mac80211_hwsim.c
> index 4d9f5f87e814..5a576bbb7688 100644
> --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
> +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
> @@ -4478,6 +4478,49 @@ static const struct ieee80211_sband_iftype_data sband_capa_2ghz[] = {
> },
> /* PPE threshold information is not supported */
> },
> + .uhr_cap = {
> + .has_uhr = true,
> + .mac = {
> + .mac_cap[0] =
> + IEEE80211_UHR_MAC_CAP0_DPS_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_ASSIST_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_AP_STATIC_HCM_SUPP |
> + IEEE80211_UHR_MAC_CAP0_NPCA_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ENH_BSR_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ADD_MAP_TID_SUPP |
> + IEEE80211_UHR_MAC_CAP0_EOTSP_SUPP,
> + .mac_cap[1] =
> + IEEE80211_UHR_MAC_CAP1_DSO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PEDCA_SUPP |
> + IEEE80211_UHR_MAC_CAP1_UL_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_P2P_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_AP_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DUO_SUPP,
> + .mac_cap[2] =
> + IEEE80211_UHR_MAC_CAP2_OMC_UL_MU_DIS_RX_SUPP |
> + IEEE80211_UHR_MAC_CAP2_AOM_SUPP |
> + IEEE80211_UHR_MAC_CAP2_IFCS_LOC_SUPP |
> + IEEE80211_UHR_MAC_CAP2_UHR_TRS_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXSPG_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXOP_RET_IN_TXSPG |
> + IEEE80211_UHR_MAC_CAP2_UHR_OM_PU_TO_LOW,
> + .mac_cap[3] =
> + IEEE80211_UHR_MAC_CAP3_UHR_OM_PU_TO_HIGH |
> + IEEE80211_UHR_MAC_CAP3_PARAM_UPD_ADV_NOTIF_INTV |
> + IEEE80211_UHR_MAC_CAP3_UPD_IND_TIM_INTV_LOW,
> + .mac_cap[4] =
> + IEEE80211_UHR_MAC_CAP4_UPD_IND_TIM_INTV_HIGH |
> + IEEE80211_UHR_MAC_CAP4_BOUNDED_ESS |
> + IEEE80211_UHR_MAC_CAP4_BTM_ASSURANCE |
> + IEEE80211_UHR_MAC_CAP4_CO_BF_SUPP,
> + },
> + .phy = {
> + .cap =
> + IEEE80211_UHR_PHY_CAP_ELR_RX |
> + IEEE80211_UHR_PHY_CAP_ELR_TX,
`IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_LE80` and `IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_LE80` are for 80MHz and lower, it should include 20/40 MHz of 2.4 GHz, no?
> + },
> + },
> },
> {
> .types_mask = BIT(NL80211_IFTYPE_AP) |
> @@ -4586,6 +4629,50 @@ static const struct ieee80211_sband_iftype_data sband_capa_2ghz[] = {
> },
> /* PPE threshold information is not supported */
> },
> + .uhr_cap = {
> + .has_uhr = true,
> + .mac = {
> + .mac_cap[0] =
> + IEEE80211_UHR_MAC_CAP0_DPS_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_ASSIST_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_AP_STATIC_HCM_SUPP |
> + IEEE80211_UHR_MAC_CAP0_NPCA_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ENH_BSR_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ADD_MAP_TID_SUPP |
> + IEEE80211_UHR_MAC_CAP0_EOTSP_SUPP,
> + .mac_cap[1] =
> + IEEE80211_UHR_MAC_CAP1_DSO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PEDCA_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DBE_SUPP |
> + IEEE80211_UHR_MAC_CAP1_UL_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_P2P_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_AP_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DUO_SUPP,
> + .mac_cap[2] =
> + IEEE80211_UHR_MAC_CAP2_OMC_UL_MU_DIS_RX_SUPP |
> + IEEE80211_UHR_MAC_CAP2_AOM_SUPP |
> + IEEE80211_UHR_MAC_CAP2_IFCS_LOC_SUPP |
> + IEEE80211_UHR_MAC_CAP2_UHR_TRS_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXSPG_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXOP_RET_IN_TXSPG |
> + IEEE80211_UHR_MAC_CAP2_UHR_OM_PU_TO_LOW,
> + .mac_cap[3] =
> + IEEE80211_UHR_MAC_CAP3_UHR_OM_PU_TO_HIGH |
> + IEEE80211_UHR_MAC_CAP3_PARAM_UPD_ADV_NOTIF_INTV |
> + IEEE80211_UHR_MAC_CAP3_UPD_IND_TIM_INTV_LOW,
> + .mac_cap[4] =
> + IEEE80211_UHR_MAC_CAP4_UPD_IND_TIM_INTV_HIGH |
> + IEEE80211_UHR_MAC_CAP4_BOUNDED_ESS |
> + IEEE80211_UHR_MAC_CAP4_BTM_ASSURANCE |
> + IEEE80211_UHR_MAC_CAP4_CO_BF_SUPP,
> + },
> + .phy = {
> + .cap =
> + IEEE80211_UHR_PHY_CAP_ELR_RX |
> + IEEE80211_UHR_PHY_CAP_ELR_TX,
Same
> + },
> + },
> },
> #ifdef CONFIG_MAC80211_MESH
> {
> @@ -4755,6 +4842,55 @@ static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
> },
> /* PPE threshold information is not supported */
> },
> + .uhr_cap = {
> + .has_uhr = true,
> + .mac = {
> + .mac_cap[0] =
> + IEEE80211_UHR_MAC_CAP0_DPS_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_ASSIST_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_AP_STATIC_HCM_SUPP |
> + IEEE80211_UHR_MAC_CAP0_NPCA_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ENH_BSR_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ADD_MAP_TID_SUPP |
> + IEEE80211_UHR_MAC_CAP0_EOTSP_SUPP,
> + .mac_cap[1] =
> + IEEE80211_UHR_MAC_CAP1_DSO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PEDCA_SUPP |
> + IEEE80211_UHR_MAC_CAP1_UL_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_P2P_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_AP_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DUO_SUPP,
> + .mac_cap[2] =
> + IEEE80211_UHR_MAC_CAP2_OMC_UL_MU_DIS_RX_SUPP |
> + IEEE80211_UHR_MAC_CAP2_AOM_SUPP |
> + IEEE80211_UHR_MAC_CAP2_IFCS_LOC_SUPP |
> + IEEE80211_UHR_MAC_CAP2_UHR_TRS_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXSPG_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXOP_RET_IN_TXSPG |
> + IEEE80211_UHR_MAC_CAP2_UHR_OM_PU_TO_LOW,
> + .mac_cap[3] =
> + IEEE80211_UHR_MAC_CAP3_UHR_OM_PU_TO_HIGH |
> + IEEE80211_UHR_MAC_CAP3_PARAM_UPD_ADV_NOTIF_INTV |
> + IEEE80211_UHR_MAC_CAP3_UPD_IND_TIM_INTV_LOW,
> + .mac_cap[4] =
> + IEEE80211_UHR_MAC_CAP4_UPD_IND_TIM_INTV_HIGH |
> + IEEE80211_UHR_MAC_CAP4_BOUNDED_ESS |
> + IEEE80211_UHR_MAC_CAP4_BTM_ASSURANCE |
> + IEEE80211_UHR_MAC_CAP4_CO_BF_SUPP,
> + },
> + .phy = {
> + .cap =
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_LE80 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_LE80 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_160 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_160 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_320 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_320 |
I'm not aware of an operating class that allows 320 MHz on 5 GHz (or
even a non standard use of it),
`IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_320` and
`IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_320` should be dropped
> + IEEE80211_UHR_PHY_CAP_ELR_RX |
> + IEEE80211_UHR_PHY_CAP_ELR_TX,
> + },
> + },
> },
> {
> .types_mask = BIT(NL80211_IFTYPE_AP) |
> @@ -4880,6 +5016,56 @@ static const struct ieee80211_sband_iftype_data sband_capa_5ghz[] = {
> },
> /* PPE threshold information is not supported */
> },
> + .uhr_cap = {
> + .has_uhr = true,
> + .mac = {
> + .mac_cap[0] =
> + IEEE80211_UHR_MAC_CAP0_DPS_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_ASSIST_SUPP |
> + IEEE80211_UHR_MAC_CAP0_DPS_AP_STATIC_HCM_SUPP |
> + IEEE80211_UHR_MAC_CAP0_NPCA_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ENH_BSR_SUPP |
> + IEEE80211_UHR_MAC_CAP0_ADD_MAP_TID_SUPP |
> + IEEE80211_UHR_MAC_CAP0_EOTSP_SUPP,
> + .mac_cap[1] =
> + IEEE80211_UHR_MAC_CAP1_DSO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PEDCA_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DBE_SUPP |
> + IEEE80211_UHR_MAC_CAP1_UL_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_P2P_LLI_SUPP |
> + IEEE80211_UHR_MAC_CAP1_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_AP_PUO_SUPP |
> + IEEE80211_UHR_MAC_CAP1_DUO_SUPP,
> + .mac_cap[2] =
> + IEEE80211_UHR_MAC_CAP2_OMC_UL_MU_DIS_RX_SUPP |
> + IEEE80211_UHR_MAC_CAP2_AOM_SUPP |
> + IEEE80211_UHR_MAC_CAP2_IFCS_LOC_SUPP |
> + IEEE80211_UHR_MAC_CAP2_UHR_TRS_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXSPG_SUPP |
> + IEEE80211_UHR_MAC_CAP2_TXOP_RET_IN_TXSPG |
> + IEEE80211_UHR_MAC_CAP2_UHR_OM_PU_TO_LOW,
> + .mac_cap[3] =
> + IEEE80211_UHR_MAC_CAP3_UHR_OM_PU_TO_HIGH |
> + IEEE80211_UHR_MAC_CAP3_PARAM_UPD_ADV_NOTIF_INTV |
> + IEEE80211_UHR_MAC_CAP3_UPD_IND_TIM_INTV_LOW,
> + .mac_cap[4] =
> + IEEE80211_UHR_MAC_CAP4_UPD_IND_TIM_INTV_HIGH |
> + IEEE80211_UHR_MAC_CAP4_BOUNDED_ESS |
> + IEEE80211_UHR_MAC_CAP4_BTM_ASSURANCE |
> + IEEE80211_UHR_MAC_CAP4_CO_BF_SUPP,
> + },
> + .phy = {
> + .cap =
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_LE80 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_LE80 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_160 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_160 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_SND_NDP_320 |
> + IEEE80211_UHR_PHY_CAP_MAX_NSS_RX_DL_MU_320 |
Same
[...]
Best regards,
Pablo MG
More information about the ath12k
mailing list