diff --git a/wmi/inc/wmi_unified_ap_api.h b/wmi/inc/wmi_unified_ap_api.h index fca365d658..bea4a204bc 100644 --- a/wmi/inc/wmi_unified_ap_api.h +++ b/wmi/inc/wmi_unified_ap_api.h @@ -65,6 +65,9 @@ QDF_STATUS wmi_unified_vdev_config_ratemask_cmd_send(void *wmi_hdl, QDF_STATUS wmi_unified_set_quiet_mode_cmd_send(void *wmi_hdl, struct set_quiet_mode_params *param); +QDF_STATUS wmi_unified_set_bcn_offload_quiet_mode_cmd_send(void *wmi_hdl, + struct set_bcn_offload_quiet_mode_params *param); + QDF_STATUS wmi_unified_nf_dbr_dbm_info_get_cmd_send(void *wmi_hdl, uint8_t mac_id); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index d827352dc4..13ba3a40a7 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -3347,6 +3347,22 @@ struct set_quiet_mode_params { uint16_t offset; }; +/** + * struct set_bcn_offload_quiet_mode_params - Set quiet mode params + * @vdev_id: Vdev ID + * @period: Quite period + * @duration: Quite duration + * @next_start: Next quiet start + * @flag: 0 - disable, 1 - enable and continuous, 3 - enable and single shot + */ +struct set_bcn_offload_quiet_mode_params { + uint32_t vdev_id; + uint32_t period; + uint32_t duration; + uint32_t next_start; + uint32_t flag; +}; + /** * struct set_beacon_filter_params - Set beacon filter params * @vdev_id: VDEV id diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index b21596af82..470e118f65 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1151,6 +1151,9 @@ QDF_STATUS (*send_pdev_set_regdomain_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*send_set_quiet_mode_cmd)(wmi_unified_t wmi_handle, struct set_quiet_mode_params *param); +QDF_STATUS (*send_set_bcn_offload_quiet_mode_cmd)(wmi_unified_t wmi_handle, + struct set_bcn_offload_quiet_mode_params *param); + QDF_STATUS (*send_set_beacon_filter_cmd)(wmi_unified_t wmi_handle, struct set_beacon_filter_params *param); diff --git a/wmi/src/wmi_unified_ap_api.c b/wmi/src/wmi_unified_ap_api.c index 0b80c3a61f..6ebced24d4 100644 --- a/wmi/src/wmi_unified_ap_api.c +++ b/wmi/src/wmi_unified_ap_api.c @@ -284,6 +284,26 @@ QDF_STATUS wmi_unified_set_quiet_mode_cmd_send(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_set_bcn_offload_quiet_mode_cmd_send - WMI set quiet mode + * function in beacon offload case + * @param wmi_handle : handle to WMI. + * @param param : pointer to hold quiet mode param in bcn offload + * + * @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_set_bcn_offload_quiet_mode_cmd_send(void *wmi_hdl, + struct set_bcn_offload_quiet_mode_params *param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t)wmi_hdl; + + if (wmi_handle->ops->send_set_bcn_offload_quiet_mode_cmd) + return wmi_handle->ops->send_set_bcn_offload_quiet_mode_cmd( + wmi_handle, param); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_send_bcn_offload_control_cmd - send beacon ofload control cmd to fw * @wmi_hdl: wmi handle diff --git a/wmi/src/wmi_unified_ap_tlv.c b/wmi/src/wmi_unified_ap_tlv.c index cf1ad18af0..225f1f9354 100644 --- a/wmi/src/wmi_unified_ap_tlv.c +++ b/wmi/src/wmi_unified_ap_tlv.c @@ -794,6 +794,55 @@ send_set_quiet_mode_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +/** + * send_set_bcn_offload_quiet_mode_cmd_tlv() - send set quiet mode command to fw + * @wmi_handle: wmi handle + * @param: pointer to quiet mode params in bcn offload mode + * + * Return: 0 for success or error code + */ +static QDF_STATUS +send_set_bcn_offload_quiet_mode_cmd_tlv(wmi_unified_t wmi_handle, + struct set_bcn_offload_quiet_mode_params *param) +{ + wmi_vdev_bcn_offload_quiet_config_cmd_fixed_param *quiet_cmd; + wmi_buf_t buf; + QDF_STATUS ret; + int32_t len; + + len = sizeof(*quiet_cmd); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s: wmi_buf_alloc failed", __func__); + return QDF_STATUS_E_FAILURE; + } + + quiet_cmd = (wmi_vdev_bcn_offload_quiet_config_cmd_fixed_param *) + wmi_buf_data(buf); + WMITLV_SET_HDR(&quiet_cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_bcn_offload_quiet_config_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_vdev_bcn_offload_quiet_config_cmd_fixed_param)); + quiet_cmd = (wmi_vdev_bcn_offload_quiet_config_cmd_fixed_param *) + wmi_buf_data(buf); + quiet_cmd->vdev_id = param->vdev_id; + quiet_cmd->period = param->period; + quiet_cmd->duration = param->duration; + quiet_cmd->next_start = param->next_start; + quiet_cmd->flags = param->flag; + + wmi_mtrace(WMI_VDEV_BCN_OFFLOAD_QUIET_CONFIG_CMDID, NO_SESSION, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_VDEV_BCN_OFFLOAD_QUIET_CONFIG_CMDID); + + if (ret != 0) { + WMI_LOGE("Sending set quiet cmd failed"); + wmi_buf_free(buf); + } + + return ret; +} + /** * send_bcn_offload_control_cmd_tlv - send beacon ofload control cmd to fw * @wmi_handle: wmi handle @@ -2578,6 +2627,8 @@ void wmi_ap_attach_tlv(wmi_unified_t wmi_handle) ops->send_set_ht_ie_cmd = send_set_ht_ie_cmd_tlv; ops->send_set_vht_ie_cmd = send_set_vht_ie_cmd_tlv; ops->send_set_quiet_mode_cmd = send_set_quiet_mode_cmd_tlv; + ops->send_set_bcn_offload_quiet_mode_cmd = + send_set_bcn_offload_quiet_mode_cmd_tlv; ops->send_bcn_offload_control_cmd = send_bcn_offload_control_cmd_tlv; ops->extract_tbttoffset_update_params = extract_tbttoffset_update_params_tlv;