From 084aff450bd139f1a1fd8c4f50a3f851805e0ddb Mon Sep 17 00:00:00 2001 From: Kiran Venkatappa Date: Wed, 8 Nov 2017 19:32:23 +0530 Subject: [PATCH] qcacmn: Add WMI API to send beacon offload control Beacon offload control WMI command is used to control beacon tx in beacon offload enabled mode. Add WMI API to send this command to FW. Change-Id: I8b340b69ff508aaf80b9a80de044b0189b947a66 CRs-Fixed: 2140255 --- wmi/inc/wmi_unified_api.h | 10 ++++++++ wmi/inc/wmi_unified_param.h | 12 +++++++++ wmi/inc/wmi_unified_priv.h | 3 +++ wmi/src/wmi_unified_api.c | 19 ++++++++++++++ wmi/src/wmi_unified_tlv.c | 51 +++++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+) 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; } /**