diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index 9719beda49e7..a511146b8200 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -940,6 +940,9 @@ QDF_STATUS wmi_unified_send_btcoex_duty_cycle_cmd(void *wmi_hdl, QDF_STATUS wmi_unified_send_coex_ver_cfg_cmd(void *wmi_hdl, coex_ver_cfg_t *param); +QDF_STATUS wmi_unified_send_coex_config_cmd(void *wmi_hdl, + struct coex_config_params *param); + QDF_STATUS wmi_unified_set_atf_cmd_send(void *wmi_hdl, struct set_atf_params *param); diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index 31b226be70de..9eb467b8201a 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -7164,4 +7164,26 @@ enum wmi_host_active_bpf_mode { WMI_HOST_ACTIVE_BPF_ADAPTIVE = (1 << 3) }; +/** + * struct coex_config_params - Coex config command params + * @vdev_id: Virtual AP device identifier + * @config_type: Configuration type - wmi_coex_config_type enum + * @config_arg1: Configuration argument based on config type + * @config_arg2: Configuration argument based on config type + * @config_arg3: Configuration argument based on config type + * @config_arg4: Configuration argument based on config type + * @config_arg5: Configuration argument based on config type + * @config_arg6: Configuration argument based on config type + */ +struct coex_config_params { + uint32_t vdev_id; + uint32_t config_type; + uint32_t config_arg1; + uint32_t config_arg2; + uint32_t config_arg3; + uint32_t config_arg4; + uint32_t config_arg5; + uint32_t config_arg6; +}; + #endif /* _WMI_UNIFIED_PARAM_H_ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 74dc3ba0cfaf..66496ebf24fb 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -1030,6 +1030,10 @@ QDF_STATUS QDF_STATUS (*send_coex_ver_cfg_cmd)(wmi_unified_t wmi_handle, coex_ver_cfg_t *param); +QDF_STATUS +(*send_coex_config_cmd)(wmi_unified_t wmi_handle, + struct coex_config_params *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 7a4c6e660280..5f2fdefac1ab 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -6542,6 +6542,27 @@ QDF_STATUS wmi_unified_send_coex_ver_cfg_cmd(void *wmi_hdl, return QDF_STATUS_E_FAILURE; } +/** + * wmi_unified_send_coex_config_cmd() - send coex ver cfg command + * @wmi_handle: wmi handle + * @param: wmi coex cfg cmd params + * + * Send WMI_COEX_CFG_CMD parameters to fw. + * + * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error + */ +QDF_STATUS wmi_unified_send_coex_config_cmd(void *wmi_hdl, + struct coex_config_params *param) +{ + wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl; + + if (wmi_handle->ops->send_coex_config_cmd) + return wmi_handle->ops->send_coex_config_cmd(wmi_handle, + param); + + return QDF_STATUS_E_FAILURE; +} + /** * wmi_extract_peer_delete_response_event() - * extract vdev id and peer mac addresse from peer delete response event diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 5ffd486a8569..852ed824790e 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -11336,6 +11336,55 @@ send_wmm_update_cmd_tlv(wmi_unified_t wmi_handle, return ret; } +/** + * send_coex_config_cmd_tlv() - send coex config command to fw + * @wmi_handle: wmi handle + * @param: pointer to coex config param + * + * Return: 0 for success or error code + */ +static QDF_STATUS +send_coex_config_cmd_tlv(wmi_unified_t wmi_handle, + struct coex_config_params *param) +{ + WMI_COEX_CONFIG_CMD_fixed_param *cmd; + wmi_buf_t buf; + QDF_STATUS ret; + int32_t len; + + len = sizeof(*cmd); + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + WMI_LOGE("%s: wmi_buf_alloc failed\n", __func__); + return QDF_STATUS_E_FAILURE; + } + + cmd = (WMI_COEX_CONFIG_CMD_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_WMI_COEX_CONFIG_CMD_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + WMITLV_TAG_STRUC_WMI_COEX_CONFIG_CMD_fixed_param)); + + cmd->vdev_id = param->vdev_id; + cmd->config_type = param->config_type; + cmd->config_arg1 = param->config_arg1; + cmd->config_arg2 = param->config_arg2; + cmd->config_arg3 = param->config_arg3; + cmd->config_arg4 = param->config_arg4; + cmd->config_arg5 = param->config_arg5; + cmd->config_arg6 = param->config_arg6; + + ret = wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_COEX_CONFIG_CMDID); + + if (ret != 0) { + WMI_LOGE("Sending COEX CONFIG CMD failed\n"); + wmi_buf_free(buf); + } + + return ret; +} + static void wmi_copy_resource_config(wmi_resource_config *resource_cfg, target_resource_config *tgt_res_cfg) @@ -17449,6 +17498,7 @@ struct wmi_ops tlv_ops = { send_vdev_spectral_enable_cmd_tlv, .send_pdev_qvit_cmd = send_pdev_qvit_cmd_tlv, .send_wmm_update_cmd = send_wmm_update_cmd_tlv, + .send_coex_config_cmd = send_coex_config_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,