[PATCH wireless-next v3 2/2] wifi: mac80211_hwsim: Add UHR capabilities to the driver
Karthikeyan Kathirvel
karthikeyan.kathirvel at oss.qualcomm.com
Mon Feb 16 21:39:01 PST 2026
On 2/13/2026 8:06 PM, Pablo MARTIN-GOMEZ wrote:
> 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?
>
Will add it in next version
>> + },
>> + },
>> },
>> {
>> .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
Will add it in next version
>> + },
>> + },
>> },
>> #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
Agree, will remove it
>> + 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
>
Done
> [...]
>
> Best regards,
>
> Pablo MG
>
More information about the ath12k
mailing list