diff --git a/target_if/twt/src/target_if_twt.c b/target_if/twt/src/target_if_twt.c index 0325c29b37..992afa4ff7 100644 --- a/target_if/twt/src/target_if_twt.c +++ b/target_if/twt/src/target_if_twt.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -230,6 +230,11 @@ target_if_twt_fill_tgt_caps(struct wlan_objmgr_psoc *psoc, else caps->twt_stats_enabled = false; + if (wmi_service_enabled(wmi_handle, wmi_service_restricted_twt)) + caps->restricted_twt_support = true; + else + caps->restricted_twt_support = false; + target_if_debug("req:%d res:%d legacy_bcast_twt_support:%d", caps->twt_requestor, caps->twt_responder, @@ -241,6 +246,8 @@ target_if_twt_fill_tgt_caps(struct wlan_objmgr_psoc *psoc, caps->twt_nudge_enabled, caps->all_twt_enabled, caps->twt_stats_enabled); + target_if_debug("restricted_twt_support:%d", + caps->restricted_twt_support); return QDF_STATUS_SUCCESS; } diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index 554739c7b1..7f446765d7 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -250,6 +250,9 @@ /* Delete all vdev peer support */ #define WLAN_VDEV_DELETE_ALL_PEER_SUPPORT 0x00000040 +/* Restricted TWT */ +#define WLAN_SOC_F_RESTRICTED_TWT 0x00000080 + /* PSOC op flags */ /* Invalid VHT cap */ diff --git a/umac/twt/core/src/wlan_twt_common.c b/umac/twt/core/src/wlan_twt_common.c index f032957bbb..5d52d8f9fe 100644 --- a/umac/twt/core/src/wlan_twt_common.c +++ b/umac/twt/core/src/wlan_twt_common.c @@ -179,6 +179,28 @@ wlan_twt_tgt_caps_get_ack_supported(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_twt_tgt_caps_get_restricted_support(struct wlan_objmgr_psoc *psoc, + bool *val) +{ + struct twt_psoc_priv_obj *twt_psoc; + + if (!psoc) { + twt_err("null psoc"); + return QDF_STATUS_E_FAILURE; + } + + twt_psoc = wlan_objmgr_psoc_get_comp_private_obj(psoc, + WLAN_UMAC_COMP_TWT); + if (!twt_psoc) { + twt_err("null twt psoc priv obj"); + return QDF_STATUS_E_FAILURE; + } + + *val = twt_psoc->twt_caps.restricted_twt_support; + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_twt_requestor_disable(struct wlan_objmgr_psoc *psoc, struct twt_disable_param *req, diff --git a/umac/twt/core/src/wlan_twt_common.h b/umac/twt/core/src/wlan_twt_common.h index 4c3ababc36..e12d1b802d 100644 --- a/umac/twt/core/src/wlan_twt_common.h +++ b/umac/twt/core/src/wlan_twt_common.h @@ -209,3 +209,15 @@ wlan_twt_enable_event_handler(struct wlan_objmgr_psoc *psoc, QDF_STATUS wlan_twt_disable_event_handler(struct wlan_objmgr_psoc *psoc, struct twt_disable_complete_event_param *event); + +/** + * wlan_twt_tgt_caps_get_restricted_support() - Get tgt restricted-twt + * support caps + * @psoc: psoc handle + * @val: pointer to get caps enabled/disabled + * + * return: QDF_STATUS + */ +QDF_STATUS +wlan_twt_tgt_caps_get_restricted_support(struct wlan_objmgr_psoc *psoc, + bool *val); diff --git a/umac/twt/core/src/wlan_twt_priv.h b/umac/twt/core/src/wlan_twt_priv.h index d4c9d24c8e..22a5d67aef 100644 --- a/umac/twt/core/src/wlan_twt_priv.h +++ b/umac/twt/core/src/wlan_twt_priv.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -41,6 +41,7 @@ * @all_twt_enabled: all twt enabled * @twt_stats_enabled: twt stats enabled * @twt_ack_supported: twt ack supported + * @restricted_twt_support: Restricted TWT supported */ struct twt_tgt_caps { bool twt_requestor; @@ -52,6 +53,7 @@ struct twt_tgt_caps { bool all_twt_enabled; bool twt_stats_enabled; bool twt_ack_supported; + bool restricted_twt_support; }; /** diff --git a/umac/twt/dispatcher/inc/wlan_twt_public_structs.h b/umac/twt/dispatcher/inc/wlan_twt_public_structs.h index 22b9bd19dc..d66c479442 100644 --- a/umac/twt/dispatcher/inc/wlan_twt_public_structs.h +++ b/umac/twt/dispatcher/inc/wlan_twt_public_structs.h @@ -152,6 +152,7 @@ enum TWT_OPERATION { * @b_twt_enable: Enable or disable broadcast TWT. * @b_twt_legacy_mbss_enable: Enable or disable legacy MBSSID TWT. * @b_twt_ax_mbss_enable: Enable or disable 11AX MBSSID TWT. + * @r_twt_enable: Restricted TWT enable or disable. */ struct twt_enable_param { uint32_t pdev_id; @@ -177,6 +178,7 @@ struct twt_enable_param { uint32_t b_twt_enable:1, b_twt_legacy_mbss_enable:1, b_twt_ax_mbss_enable:1; + bool r_twt_enable; }; /** @@ -457,6 +459,9 @@ enum HOST_TWT_COMMAND { * @b_twt_persistence: Countdown VAL frames to param update/teardown * @wake_time_tsf: Absolute TSF value to start first TWT service period * @announce_timeout_us: Timeout value before sending QoS NULL frame. + * @link_id_bitmap: MLD links to which R-TWT element applies + * @r_twt_dl_tid_bitmap: DL TIDs for R-TWT scheduling + * @r_twt_ul_tid_bitmap: UL TIDs for R-TWT scheduling */ struct twt_add_dialog_param { uint32_t vdev_id; @@ -482,6 +487,9 @@ struct twt_add_dialog_param { b_twt_recommendation:3; uint64_t wake_time_tsf; uint32_t announce_timeout_us; + uint32_t link_id_bitmap; + uint32_t r_twt_dl_tid_bitmap; + uint32_t r_twt_ul_tid_bitmap; }; /** diff --git a/umac/twt/dispatcher/inc/wlan_twt_ucfg_api.h b/umac/twt/dispatcher/inc/wlan_twt_ucfg_api.h index 689216a590..4531482a0a 100644 --- a/umac/twt/dispatcher/inc/wlan_twt_ucfg_api.h +++ b/umac/twt/dispatcher/inc/wlan_twt_ucfg_api.h @@ -302,4 +302,15 @@ QDF_STATUS ucfg_twt_get_peer_capabilities(struct wlan_objmgr_psoc *psoc, struct qdf_mac_addr *peer_mac, uint8_t *peer_cap); + +/** + * ucfg_twt_get_restricted_twt_supported() - Get tgt restricted-twt + * support caps + * @psoc: psoc handle + * @val: pointer to get caps enabled/disabled + * + * return: QDF_STATUS + */ +QDF_STATUS ucfg_twt_get_restricted_twt_supported(struct wlan_objmgr_psoc *psoc, + bool *val); #endif /* _WLAN_TWT_UCFG_API_H_ */ diff --git a/umac/twt/dispatcher/src/wlan_twt_ucfg_api.c b/umac/twt/dispatcher/src/wlan_twt_ucfg_api.c index efc8d406ab..14fc8d7205 100644 --- a/umac/twt/dispatcher/src/wlan_twt_ucfg_api.c +++ b/umac/twt/dispatcher/src/wlan_twt_ucfg_api.c @@ -105,3 +105,9 @@ ucfg_twt_get_peer_capabilities(struct wlan_objmgr_psoc *psoc, { return wlan_twt_get_peer_capabilities(psoc, peer_mac, peer_cap); } + +QDF_STATUS ucfg_twt_get_restricted_twt_supported(struct wlan_objmgr_psoc *psoc, + bool *val) +{ + return wlan_twt_tgt_caps_get_restricted_support(psoc, val); +} diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 45596072b9..896ec9a166 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -6126,6 +6126,7 @@ typedef enum { wmi_service_twt_nudge, wmi_service_all_twt, wmi_service_twt_statistics, + wmi_service_restricted_twt, #endif wmi_service_wapi_concurrency_supported, wmi_service_sap_connected_d3_wow, diff --git a/wmi/inc/wmi_unified_twt_param.h b/wmi/inc/wmi_unified_twt_param.h index 7ed267e110..9e5d830bed 100644 --- a/wmi/inc/wmi_unified_twt_param.h +++ b/wmi/inc/wmi_unified_twt_param.h @@ -90,6 +90,7 @@ enum WMI_TWT_OPERATION { * @b_twt_enable: Enable or disable broadcast TWT. * @b_twt_legacy_mbss_enable: Enable or disable legacy MBSSID TWT. * @b_twt_ax_mbss_enable: Enable or disable 11AX MBSSID TWT. + * @r_twt_enable: Enable or disable restricted TWT. */ struct wmi_twt_enable_param { uint32_t pdev_id; @@ -115,6 +116,7 @@ struct wmi_twt_enable_param { uint32_t b_twt_enable:1, b_twt_legacy_mbss_enable:1, b_twt_ax_mbss_enable:1; + bool r_twt_enable; }; /* status code of enabling TWT @@ -291,6 +293,10 @@ enum WMI_HOST_TWT_COMMAND { * @b_twt_persistence: Countdown VAL frames to param update/teardown * @wake_time_tsf: Absolute TSF value to start first TWT service period * @announce_timeout_us: Timeout value before sending QoS NULL frame. + * @link_id_bitmap: MLD links to which R-TWT element applies + * @r_twt_dl_tid_bitmap: DL TIDs for R-TWT scheduling + * @r_twt_ul_tid_bitmap: UL TIDs for R-TWT scheduling + * */ struct wmi_twt_add_dialog_param { uint32_t vdev_id; @@ -316,6 +322,9 @@ struct wmi_twt_add_dialog_param { b_twt_recommendation:3; uint64_t wake_time_tsf; uint32_t announce_timeout_us; + uint32_t link_id_bitmap; + uint32_t r_twt_dl_tid_bitmap; + uint32_t r_twt_ul_tid_bitmap; }; /* enum - status code of Get stats TWT dialog diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index bf0bb8b336..53c8fae309 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -21783,6 +21783,7 @@ static void populate_tlv_service(uint32_t *wmi_service) WMI_SERVICE_TWT_ALL_DIALOG_ID; wmi_service[wmi_service_twt_statistics] = WMI_SERVICE_TWT_STATS; + wmi_service[wmi_service_restricted_twt] = WMI_SERVICE_RESTRICTED_TWT; #endif wmi_service[wmi_service_spectral_scan_disabled] = WMI_SERVICE_SPECTRAL_SCAN_DISABLED; diff --git a/wmi/src/wmi_unified_twt_tlv.c b/wmi/src/wmi_unified_twt_tlv.c index 5c1036df0e..7571defc7b 100644 --- a/wmi/src/wmi_unified_twt_tlv.c +++ b/wmi/src/wmi_unified_twt_tlv.c @@ -1,6 +1,6 @@ /* * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -66,6 +66,7 @@ static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle, cmd->remove_sta_slot_interval = params->remove_sta_slot_interval; TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable); + TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable); TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags, params->b_twt_legacy_mbss_enable); TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags, @@ -198,6 +199,9 @@ send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle, cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF); cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32); cmd->announce_timeout_us = params->announce_timeout_us; + cmd->link_id_bitmap = params->link_id_bitmap; + cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap; + cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap; TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd); TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast); TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger); @@ -1255,6 +1259,7 @@ static QDF_STATUS send_twt_enable_cmd_tlv(wmi_unified_t wmi_handle, cmd->remove_sta_slot_interval = params->remove_sta_slot_interval; TWT_EN_DIS_FLAGS_SET_BTWT(cmd->flags, params->b_twt_enable); + TWT_EN_DIS_FLAGS_SET_B_R_TWT(cmd->flags, params->r_twt_enable); TWT_EN_DIS_FLAGS_SET_L_MBSSID(cmd->flags, params->b_twt_legacy_mbss_enable); TWT_EN_DIS_FLAGS_SET_AX_MBSSID(cmd->flags, @@ -1365,6 +1370,9 @@ send_twt_add_dialog_cmd_tlv(wmi_unified_t wmi_handle, cmd->sp_start_tsf_lo = (uint32_t)(params->wake_time_tsf & 0xFFFFFFFF); cmd->sp_start_tsf_hi = (uint32_t)(params->wake_time_tsf >> 32); cmd->announce_timeout_us = params->announce_timeout_us; + cmd->link_id_bitmap = params->link_id_bitmap; + cmd->r_twt_dl_tid_bitmap = params->r_twt_dl_tid_bitmap; + cmd->r_twt_ul_tid_bitmap = params->r_twt_ul_tid_bitmap; TWT_FLAGS_SET_CMD(cmd->flags, params->twt_cmd); TWT_FLAGS_SET_BROADCAST(cmd->flags, params->flag_bcast); TWT_FLAGS_SET_TRIGGER(cmd->flags, params->flag_trigger);