diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index de7fe13a5d41..bfb388ae833f 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -1622,4 +1622,14 @@ QDF_STATUS wmi_unified_set_arp_stats_req(void *wmi_hdl, struct set_arp_stats *req_buf); QDF_STATUS wmi_unified_get_arp_stats_req(void *wmi_hdl, struct get_arp_stats *req_buf); + +/** + * wmi_send_bcn_offload_control_cmd - send beacon ofload control cmd to fw + * @wmi_hdl: wmi handle + * @bcn_ctrl_param: pointer to bcn_offload_control param + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS wmi_send_bcn_offload_control_cmd(void *wmi_hdl, + struct bcn_offload_control *bcn_ctrl_param); #endif /* _WMI_UNIFIED_API_H_ */ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index a3ed6861acb5..29761a82cd8a 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -5848,6 +5848,7 @@ typedef enum { wmi_service_extended_nss_support, wmi_service_ack_timeout, wmi_service_widebw_scan, + wmi_service_bcn_offload_start_stop_support, wmi_services_max, } wmi_conv_service_ids; @@ -7951,4 +7952,15 @@ struct wmi_host_ready_ev_param { uint32_t num_total_peer; bool agile_capability; }; + +/** + * struct bcn_offload_control - Beacon offload control params + * @vdev_id: vdev identifer of VAP to control beacon tx + * @bcn_tx_enable: Enable or Disable beacon TX in offload mode + */ +struct bcn_offload_control { + uint32_t vdev_id; + bool bcn_tx_enable; +}; + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 0adf7a3810a0..229c13a2594e 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1071,6 +1071,9 @@ QDF_STATUS (*send_coex_config_cmd)(wmi_unified_t wmi_handle, struct coex_config_params *param); +QDF_STATUS (*send_bcn_offload_control_cmd)(wmi_unified_t wmi_handle, + struct bcn_offload_control *bcn_ctrl_param); + QDF_STATUS (*extract_wds_addr_event)(wmi_unified_t wmi_handle, void *evt_buf, uint16_t len, wds_addr_event_t *wds_ev); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index 22bd20e46515..eab22b104f90 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -6889,3 +6889,22 @@ QDF_STATUS wmi_unified_send_limit_off_chan_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } + +/** + * wmi_send_bcn_offload_control_cmd - send beacon ofload control cmd to fw + * @wmi_hdl: wmi handle + * @bcn_ctrl_param: pointer to bcn_offload_control param + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS wmi_send_bcn_offload_control_cmd(void *wmi_hdl, + struct bcn_offload_control *bcn_ctrl_param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_bcn_offload_control_cmd) + return wmi_handle->ops->send_bcn_offload_control_cmd(wmi_handle, + bcn_ctrl_param); + + return QDF_STATUS_E_FAILURE; +} diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index d4c9e661ce52..4223fbc2e67c 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -16290,6 +16290,54 @@ static QDF_STATUS init_cmd_send_tlv(wmi_unified_t wmi_handle, } +/** + * send_bcn_offload_control_cmd_tlv - send beacon ofload control cmd to fw + * @wmi_handle: wmi handle + * @bcn_ctrl_param: pointer to bcn_offload_control param + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static +QDF_STATUS send_bcn_offload_control_cmd_tlv(wmi_unified_t wmi_handle, + struct bcn_offload_control *bcn_ctrl_param) +{ + wmi_buf_t buf; + wmi_bcn_offload_ctrl_cmd_fixed_param *cmd; + QDF_STATUS ret; + uint32_t len; + + len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + qdf_print("%s: wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + cmd = (wmi_bcn_offload_ctrl_cmd_fixed_param *) wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_bcn_offload_ctrl_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_bcn_offload_ctrl_cmd_fixed_param)); + cmd->vdev_id = bcn_ctrl_param->vdev_id; + if (bcn_ctrl_param->bcn_tx_enable) + cmd->bcn_ctrl_op = WMI_BEACON_CTRL_TX_ENABLE; + else + cmd->bcn_ctrl_op = WMI_BEACON_CTRL_TX_DISABLE; + + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_BCN_OFFLOAD_CTRL_CMDID); + + if (QDF_IS_STATUS_ERROR(ret)) { + WMI_LOGE("WMI_BCN_OFFLOAD_CTRL_CMDID send returned Error %d", + ret); + wmi_buf_free(buf); + } + + return ret; +} + /** * save_service_bitmap_tlv() - save service bitmap * @wmi_handle: wmi handle @@ -19977,6 +20025,7 @@ struct wmi_ops tlv_ops = { send_process_update_edca_param_cmd_tlv, .send_coex_config_cmd = send_coex_config_cmd_tlv, .send_set_country_cmd = send_set_country_cmd_tlv, + .send_bcn_offload_control_cmd = send_bcn_offload_control_cmd_tlv, .get_target_cap_from_service_ready = extract_service_ready_tlv, .extract_hal_reg_cap = extract_hal_reg_cap_tlv, .extract_host_mem_req = extract_host_mem_req_tlv, @@ -20527,6 +20576,8 @@ static void populate_tlv_service(uint32_t *wmi_service) wmi_service[wmi_service_extended_nss_support] = WMI_SERVICE_EXTENDED_NSS_SUPPORT; wmi_service[wmi_service_widebw_scan] = WMI_SERVICE_SCAN_PHYMODE_SUPPORT; + wmi_service[wmi_service_bcn_offload_start_stop_support] = + WMI_SERVICE_BCN_OFFLOAD_START_STOP_SUPPORT; } /**