From 6c990c0cbfaa4ad3dbbb4b2338744df09531dd07 Mon Sep 17 00:00:00 2001 From: Mainak Sen Date: Sun, 22 Nov 2020 13:35:57 +0530 Subject: [PATCH] qca-wifi: WMI support for Tx Mode Select When MSCS feature is enabled, Host sends WMI command to FW to enable Tx Mode switch Change-Id: Ida559f8972ef8de609578c0e9aa3016116e8a46a --- tools/linux/cfg80211_ven_cmd.h | 4 ++++ wmi/inc/wmi_unified_ap_api.h | 11 ++++++++++ wmi/src/wmi_unified_ap_api.c | 21 ++++++++++++++++++ wmi/src/wmi_unified_ap_tlv.c | 39 ++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) diff --git a/tools/linux/cfg80211_ven_cmd.h b/tools/linux/cfg80211_ven_cmd.h index 17ae2529e0..7ec3321b65 100644 --- a/tools/linux/cfg80211_ven_cmd.h +++ b/tools/linux/cfg80211_ven_cmd.h @@ -1254,6 +1254,8 @@ enum _ol_ath_param_t { OL_ATH_PARAM_NSS_WIFI_OFFLOAD_STATUS = 463, /* enable EMA */ OL_ATH_PARAM_ENABLE_EMA = 464, + /* enable Tx Mode Sselect */ + OL_ATH_PARAM_ENABLE_TX_MODE_SELECT = 465, }; #ifdef CONFIG_SUPPORT_LIBROXML @@ -3245,6 +3247,8 @@ struct vendor_commands radio_vendor_cmds[] = { OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_NSS_WIFI_OFFLOAD_STATUS, GET_PARAM, 0}, {"enable_ema", OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_ENABLE_EMA, SET_PARAM, 1}, + {"dur_based_tx_mode_sselect", + OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_ENABLE_TX_MODE_SELECT, SET_PARAM, 1}, }; #endif #endif diff --git a/wmi/inc/wmi_unified_ap_api.h b/wmi/inc/wmi_unified_ap_api.h index 3cff7309cd..a115fe4c55 100644 --- a/wmi/inc/wmi_unified_ap_api.h +++ b/wmi/inc/wmi_unified_ap_api.h @@ -773,4 +773,15 @@ QDF_STATUS wmi_unified_peer_vlan_config_send(wmi_unified_t wmi_handle, QDF_STATUS wmi_extract_muedca_params_handler(wmi_unified_t wmi_handle, void *evt_buf, struct muedca_params *muedca_param_list); +/** + * wmi_unified_set_radio_tx_mode_select_cmd_send() - WMI ant switch tbl cmd function + * @wmi_handle: handle to WMI. + * @param: pointer to hold tx mode selection param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_set_radio_tx_mode_select_cmd_send( + wmi_unified_t wmi_handle, + struct wmi_pdev_enable_tx_mode_selection *tx_mode_select_param); + #endif /* _WMI_UNIFIED_AP_API_H_ */ diff --git a/wmi/src/wmi_unified_ap_api.c b/wmi/src/wmi_unified_ap_api.c index e4ace4085b..1b0dc55c36 100644 --- a/wmi/src/wmi_unified_ap_api.c +++ b/wmi/src/wmi_unified_ap_api.c @@ -611,3 +611,24 @@ QDF_STATUS wmi_extract_muedca_params_handler( return QDF_STATUS_E_FAILURE; } + +/** + * wmi_unified_set_radio_tx_mode_select_cmd_send() - WMI ant switch tbl cmd function + * @wmi_handle: wmi handle + * @param: pointer to hold tx mode selection param + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_set_radio_tx_mode_select_cmd_send( + wmi_unified_t wmi_hdl, + struct wmi_pdev_enable_tx_mode_selection + *tx_mode_select_param) +{ + wmi_unified_t wmi_handle = wmi_hdl; + + if (wmi_handle->ops->set_radio_tx_mode_select_cmd) + return wmi_handle->ops->set_radio_tx_mode_select_cmd( + wmi_handle, tx_mode_select_param); + return QDF_STATUS_E_FAILURE; +} + diff --git a/wmi/src/wmi_unified_ap_tlv.c b/wmi/src/wmi_unified_ap_tlv.c index 002e9f3a58..e35e0aab09 100644 --- a/wmi/src/wmi_unified_ap_tlv.c +++ b/wmi/src/wmi_unified_ap_tlv.c @@ -2589,6 +2589,44 @@ static QDF_STATUS send_multisoc_tbtt_sync_cmd_tlv(wmi_unified_t wmi, return QDF_STATUS_SUCCESS; } +/** + * set_radio_tx_mode_select_cmd_tlv - set radio tx mode select command + * @wmi: wmi handle + * @param: Tx mode select param + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +static QDF_STATUS +set_radio_tx_mode_select_cmd_tlv(wmi_unified_t wmi, + struct wmi_pdev_enable_tx_mode_selection *param) +{ + wmi_pdev_enable_duration_based_tx_mode_selection_cmd_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + cmd = (wmi_pdev_enable_duration_based_tx_mode_selection_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_pdev_enable_duration_based_tx_mode_selection_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN(wmi_pdev_enable_duration_based_tx_mode_selection_cmd_fixed_param)); + cmd->pdev_id = wmi->ops->convert_pdev_id_host_to_target( + wmi, param->pdev_id); + cmd->duration_based_tx_mode_selection = param->enable_tx_mode_selection; + wmi_mtrace(WMI_PDEV_ENABLE_DURATION_BASED_TX_MODE_SELECTION_CMDID, cmd->pdev_id, 0); + if (wmi_unified_cmd_send(wmi, buf, len, + WMI_PDEV_ENABLE_DURATION_BASED_TX_MODE_SELECTION_CMDID)) { + wmi_err("%s: Failed to send WMI_PDEV_ENABLE_DURATION_BASED_TX_MODE_SELECTION_CMDID", + __func__); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + void wmi_ap_attach_tlv(wmi_unified_t wmi_handle) { struct wmi_ops *ops = wmi_handle->ops; @@ -2661,4 +2699,5 @@ void wmi_ap_attach_tlv(wmi_unified_t wmi_handle) ops->extract_multi_vdev_restart_resp_event = extract_multi_vdev_restart_resp_event_tlv; ops->multisoc_tbtt_sync_cmd = send_multisoc_tbtt_sync_cmd_tlv; + ops->set_radio_tx_mode_select_cmd = set_radio_tx_mode_select_cmd_tlv; }