summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--wmi/inc/wmi_unified_api.h10
-rw-r--r--wmi/inc/wmi_unified_param.h34
-rw-r--r--wmi/inc/wmi_unified_priv.h3
-rw-r--r--wmi/src/wmi_unified_api.c11
-rw-r--r--wmi/src/wmi_unified_tlv.c72
5 files changed, 130 insertions, 0 deletions
diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h
index 8c98fe836152..abf82efb19f6 100644
--- a/wmi/inc/wmi_unified_api.h
+++ b/wmi/inc/wmi_unified_api.h
@@ -1454,6 +1454,16 @@ QDF_STATUS wmi_unified_send_sar_limit_cmd(void *wmi_hdl,
QDF_STATUS wmi_unified_get_sar_limit_cmd(void *wmi_hdl);
/**
+ * wmi_unified_send_coex_config_cmd() - send coex config command to firmware
+ * @wmi_hdl: wmi handle
+ * @params: coex config params
+ *
+ * Return: QDF_STATUS_SUCCESS on success or error code on failure
+ */
+QDF_STATUS wmi_unified_send_coex_config_cmd(void *wmi_hdl,
+ struct coex_config_params *params);
+
+/**
* wmi_unified_extract_sar_limit_event() - extract SAR limits from FW event
* @wmi_hdl: wmi handle
* @evt_buf: event buffer received from firmware
diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h
index ea6f7cfbeee0..5f0bc99bd26f 100644
--- a/wmi/inc/wmi_unified_param.h
+++ b/wmi/inc/wmi_unified_param.h
@@ -7286,6 +7286,40 @@ struct sar_limit_event {
};
/**
+ * enum coex_config_type - For identifying coex config type params
+ * COEX_CONFIG_TX_POWER: To set wlan total tx power when bt coex
+ * COEX_CONFIG_HANDOVER_RSSI: To set WLAN RSSI (dBm units)
+ * COEX_CONFIG_BTC_MODE: To set BTC mode
+ * COEX_CONFIG_ANTENNA_ISOLATION: To set solation between BT and WLAN antenna
+ * COEX_CONFIG_BT_LOW_RSSI_THRESHOLD: To set BT low rssi threshold (dbm units)
+ * COEX_CONFIG_BT_INTERFERENCE_LEVEL: To set BT interference level (dbm units)
+ */
+enum coex_config_type {
+ COEX_CONFIG_TX_POWER = 0x01,
+ COEX_CONFIG_HANDOVER_RSSI = 0x02,
+ COEX_CONFIG_BTC_MODE = 0x03,
+ COEX_CONFIG_ANTENNA_ISOLATION = 0x04,
+ COEX_CONFIG_BT_LOW_RSSI_THRESHOLD = 0x05,
+ COEX_CONFIG_BT_INTERFERENCE_LEVEL = 0x06
+};
+
+#define MAX_COEX_CONFIG_TYPE_ARGS 6
+/**
+ * struct coex_config_params - COEX config params
+ * @vdev_id: Virtual device Id
+ * @config_type: Type of config type from enum coex_config_type
+ * @config_value: config type values for enum coex_config_type,
+ * only config type COEX_CONFIG_BT_INTERFERENCE_LEVEL
+ * will use all arguments remaining will use only
+ * 0th argument.
+ */
+struct coex_config_params {
+ uint32_t vdev_id;
+ enum coex_config_type config_type;
+ uint32_t config_value[MAX_COEX_CONFIG_TYPE_ARGS];
+};
+
+/**
* enum rcpi_measurement_type - for identifying type of rcpi measurement
* @RCPI_MEASUREMENT_TYPE_AVG_MGMT: avg rcpi of mgmt frames
* @RCPI_MEASUREMENT_TYPE_AVG_DATA: avg rcpi of data frames
diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h
index 5394bbdfb8ba..0c5989f7d894 100644
--- a/wmi/inc/wmi_unified_priv.h
+++ b/wmi/inc/wmi_unified_priv.h
@@ -1208,6 +1208,9 @@ QDF_STATUS (*send_sar_limit_cmd)(wmi_unified_t wmi_handle,
QDF_STATUS (*get_sar_limit_cmd)(wmi_unified_t wmi_handle);
+QDF_STATUS (*send_coex_config_cmd)(wmi_unified_t wmi_handle,
+ struct coex_config_params *params);
+
QDF_STATUS (*extract_sar_limit_event)(wmi_unified_t wmi_handle,
uint8_t *evt_buf,
struct sar_limit_event *event);
diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c
index 77b2cd165645..c2494eaf5365 100644
--- a/wmi/src/wmi_unified_api.c
+++ b/wmi/src/wmi_unified_api.c
@@ -6406,6 +6406,17 @@ QDF_STATUS wmi_unified_get_sar_limit_cmd(void *wmi_hdl)
return QDF_STATUS_E_FAILURE;
}
+QDF_STATUS wmi_unified_send_coex_config_cmd(void *wmi_hdl,
+ struct coex_config_params *params)
+{
+ 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,
+ params);
+ return QDF_STATUS_E_FAILURE;
+}
+
QDF_STATUS wmi_unified_extract_sar_limit_event(void *wmi_hdl,
uint8_t *evt_buf,
struct sar_limit_event *event)
diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c
index 108a278dfca9..beb295c65cd1 100644
--- a/wmi/src/wmi_unified_tlv.c
+++ b/wmi/src/wmi_unified_tlv.c
@@ -3933,6 +3933,77 @@ QDF_STATUS send_setup_install_key_cmd_tlv(wmi_unified_t wmi_handle,
}
/**
+ * send_coex_config_cmd_tlv() - send coex config command to firmware
+ * @wmi_handle: wmi handle
+ * @params: coex config params
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS send_coex_config_cmd_tlv(wmi_unified_t wmi_handle,
+ struct coex_config_params *params)
+{
+ WMI_COEX_CONFIG_CMD_fixed_param *cmd;
+ wmi_buf_t buf;
+ uint32_t len = sizeof(*cmd);
+ WMI_COEX_CONFIG_TYPE config_type;
+ QDF_STATUS status;
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMI_LOGE("Failed to allocate buffer to coex config params");
+ return QDF_STATUS_E_NOMEM;
+ }
+
+ 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(
+ WMI_COEX_CONFIG_CMD_fixed_param));
+
+ cmd->vdev_id = params->vdev_id;
+ cmd->config_arg1 = params->config_value[0];
+
+ switch (params->config_type) {
+ case COEX_CONFIG_TX_POWER:
+ config_type = WMI_COEX_CONFIG_TX_POWER;
+ break;
+ case COEX_CONFIG_HANDOVER_RSSI:
+ config_type = WMI_COEX_CONFIG_HANDOVER_RSSI;
+ break;
+ case COEX_CONFIG_BTC_MODE:
+ config_type = WMI_COEX_CONFIG_BTC_MODE;
+ break;
+ case COEX_CONFIG_ANTENNA_ISOLATION:
+ config_type = WMI_COEX_CONFIG_ANTENNA_ISOLATION;
+ break;
+ case COEX_CONFIG_BT_LOW_RSSI_THRESHOLD:
+ config_type = WMI_COEX_CONFIG_BT_LOW_RSSI_THRESHOLD;
+ break;
+ case COEX_CONFIG_BT_INTERFERENCE_LEVEL:
+ config_type = WMI_COEX_CONFIG_BT_INTERFERENCE_LEVEL;
+ cmd->config_arg2 = params->config_value[1];
+ cmd->config_arg3 = params->config_value[2];
+ cmd->config_arg4 = params->config_value[3];
+ cmd->config_arg5 = params->config_value[4];
+ cmd->config_arg6 = params->config_value[5];
+ break;
+ default:
+ WMI_LOGE("Unknown coex config type received");
+ wmi_buf_free(buf);
+ return QDF_STATUS_E_FAILURE;
+ }
+ cmd->config_type = config_type;
+
+ status = wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_COEX_CONFIG_CMDID);
+ if (QDF_IS_STATUS_ERROR(status)) {
+ WMI_LOGE("Failed to send WMI_COEX_CONFIG_CMDID");
+ wmi_buf_free(buf);
+ }
+ return status;
+}
+
+/**
* send_sar_limit_cmd_tlv() - send sar limit cmd to fw
* @wmi_handle: wmi handle
* @params: sar limit params
@@ -15190,6 +15261,7 @@ struct wmi_ops tlv_ops = {
send_encrypt_decrypt_send_cmd_tlv,
.send_sar_limit_cmd = send_sar_limit_cmd_tlv,
.get_sar_limit_cmd = get_sar_limit_cmd_tlv,
+ .send_coex_config_cmd = send_coex_config_cmd_tlv,
.extract_sar_limit_event = extract_sar_limit_event_tlv,
.extract_sar2_result_event = extract_sar2_result_event_tlv,
.send_per_roam_config_cmd = send_per_roam_config_cmd_tlv,