From d3e95e7607af3a615888946ee5abe5cb4318cf4c Mon Sep 17 00:00:00 2001 From: Krunalsinh Padhar Date: Thu, 27 Apr 2023 12:20:53 -0700 Subject: [PATCH] qcacmn: Send rf path WMI command Prepare and Send WMI command to fw to set the rf path. Also, add module ID for rf path switch for qdf log prints. CRs-Fixed: 3568221 Change-Id: I7ef0ffe66eaed837424699641d3e5b8537cd0304 --- qdf/inc/qdf_types.h | 2 + qdf/linux/src/qdf_trace.c | 2 + wmi/inc/wmi_unified_api.h | 27 ++++++++++++ wmi/inc/wmi_unified_param.h | 1 + wmi/inc/wmi_unified_priv.h | 7 ++++ wmi/src/wmi_unified_api.c | 25 +++++++++++ wmi/src/wmi_unified_tlv.c | 83 +++++++++++++++++++++++++++++++++++++ 7 files changed, 147 insertions(+) diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h index 945de9e987..5fb87aebf5 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -466,6 +466,7 @@ typedef bool (*qdf_irqlocked_func_t)(void *); * @QDF_MODULE_ID_ANY: anything * @QDF_MODULE_ID_COHOSTED_BSS : Co-hosted BSS module ID * @QDF_MODULE_ID_TELEMETRY_AGENT: Telemetry Agent Module ID + * @QDF_MODULE_ID_RF_PATH_SWITCH: RF path switch Module ID * @QDF_MODULE_ID_MAX: Max place holder module ID * * New module ID needs to be added in qdf trace along with this enum. @@ -636,6 +637,7 @@ typedef enum { QDF_MODULE_ID_LL_SAP, QDF_MODULE_ID_COHOSTED_BSS, QDF_MODULE_ID_TELEMETRY_AGENT, + QDF_MODULE_ID_RF_PATH_SWITCH, QDF_MODULE_ID_ANY, QDF_MODULE_ID_MAX, } QDF_MODULE_ID; diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 1defebcd01..ba274cfb0b 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -3307,6 +3307,7 @@ struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = { [QDF_MODULE_ID_LL_SAP] = {"LL_SAP"}, [QDF_MODULE_ID_COHOSTED_BSS] = {"COHOSTED_BSS"}, [QDF_MODULE_ID_TELEMETRY_AGENT] = {"TELEMETRY_AGENT"}, + [QDF_MODULE_ID_RF_PATH_SWITCH] = {"Dynamic RF Path Switch"}, [QDF_MODULE_ID_ANY] = {"ANY"}, }; qdf_export_symbol(g_qdf_category_name); @@ -3884,6 +3885,7 @@ static void set_default_trace_levels(struct category_info *cinfo) [QDF_MODULE_ID_LL_SAP] = QDF_TRACE_LEVEL_NONE, [QDF_MODULE_ID_COHOSTED_BSS] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_TELEMETRY_AGENT] = QDF_TRACE_LEVEL_ERROR, + [QDF_MODULE_ID_RF_PATH_SWITCH] = QDF_TRACE_LEVEL_INFO, [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO, }; diff --git a/wmi/inc/wmi_unified_api.h b/wmi/inc/wmi_unified_api.h index caad38ab58..a1e65edca3 100644 --- a/wmi/inc/wmi_unified_api.h +++ b/wmi/inc/wmi_unified_api.h @@ -816,6 +816,20 @@ uint16_t wmi_get_max_msg_len(wmi_unified_t wmi_handle); QDF_STATUS wmi_unified_soc_set_hw_mode_cmd(wmi_unified_t wmi_handle, uint32_t hw_mode_index); +/** + * wmi_unified_soc_set_rf_path_cmd() - WMI_PDEV_SET_RF_PATH_CMDID to FW + * @wmi_handle: wmi handle + * @rf_path_index: RF path index to switch to + * @pdev_id: pdev id + * + * Request RF path change to WLAN firmware + * + * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure + */ +QDF_STATUS wmi_unified_soc_set_rf_path_cmd(wmi_unified_t wmi_handle, + uint32_t rf_path_index, + uint8_t pdev_id); + /** * wmi_unified_extract_hw_mode_resp() - Extract HW mode change response * @wmi: WMI handle @@ -829,6 +843,19 @@ wmi_unified_extract_hw_mode_resp(wmi_unified_t wmi, void *evt_buf, uint32_t *cmd_status); +/** + * wmi_unified_extract_rf_path_resp() - Extract RF path change response + * @wmi: WMI handle + * @evt_buf: Buffer holding event data + * @cmd_status: command status + * + * Return: QDF_STATUS_SUCCESS if success, else returns proper error code. + */ +QDF_STATUS +wmi_unified_extract_rf_path_resp(wmi_unified_t wmi, + void *evt_buf, + uint32_t *cmd_status); + /** * wmi_unified_extract_roam_trigger_stats() - Extract roam trigger related * stats diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index a537dfc79a..b5277bc213 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -5346,6 +5346,7 @@ typedef enum { #ifdef QCA_SUPPORT_PRIMARY_LINK_MIGRATE wmi_peer_ptqm_migration_response_eventid, #endif + wmi_pdev_set_rf_path_resp_eventid, wmi_events_max, } wmi_conv_event_id; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 570bb059da..c3f11284b0 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -581,6 +581,10 @@ QDF_STATUS (*send_pdev_set_hw_mode_cmd)(wmi_unified_t wmi_handle, uint32_t hw_mode_index); +QDF_STATUS +(*send_pdev_set_rf_path_cmd)(wmi_unified_t wmi_handle, + uint32_t hw_mode_index, uint8_t pdev_id); + QDF_STATUS (*send_suspend_cmd)(wmi_unified_t wmi_handle, struct suspend_params *param, uint8_t mac_id); @@ -2859,6 +2863,9 @@ QDF_STATUS (*send_rtt_pasn_deauth_cmd)(wmi_unified_t wmi_handle, QDF_STATUS (*extract_hw_mode_resp_event)(wmi_unified_t wmi_handle, void *evt_buf, uint32_t *cmd_status); +QDF_STATUS (*extract_rf_path_resp)(wmi_unified_t wmi_handle, + void *evt_buf, uint32_t *cmd_status); + #ifdef WLAN_FEATURE_ELNA QDF_STATUS (*send_set_elna_bypass_cmd)(wmi_unified_t wmi_handle, struct set_elna_bypass_request *req); diff --git a/wmi/src/wmi_unified_api.c b/wmi/src/wmi_unified_api.c index b48e6910be..87a95dde45 100644 --- a/wmi/src/wmi_unified_api.c +++ b/wmi/src/wmi_unified_api.c @@ -75,6 +75,19 @@ QDF_STATUS wmi_unified_soc_set_hw_mode_cmd(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_unified_soc_set_rf_path_cmd(wmi_unified_t wmi_handle, + uint32_t rf_path_index, + uint8_t pdev_id) +{ + if (wmi_handle->ops->send_pdev_set_rf_path_cmd) + return wmi_handle->ops->send_pdev_set_rf_path_cmd( + wmi_handle, + rf_path_index, + pdev_id); + + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_unified_vdev_create_send(wmi_unified_t wmi_handle, uint8_t macaddr[QDF_MAC_ADDR_SIZE], struct vdev_create_params *param) @@ -3582,6 +3595,18 @@ QDF_STATUS wmi_unified_extract_hw_mode_resp(wmi_unified_t wmi, return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_unified_extract_rf_path_resp(wmi_unified_t wmi, + void *evt_buf, + uint32_t *cmd_status) +{ + if (wmi->ops->extract_rf_path_resp) + return wmi->ops->extract_rf_path_resp(wmi, + evt_buf, + cmd_status); + + return QDF_STATUS_E_FAILURE; +} + #ifdef FEATURE_ANI_LEVEL_REQUEST QDF_STATUS wmi_unified_ani_level_cmd_send(wmi_unified_t wmi_handle, uint32_t *freqs, diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index 92dca8a3b8..493e23cc56 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -2533,6 +2533,54 @@ static QDF_STATUS send_pdev_set_hw_mode_cmd_tlv(wmi_unified_t wmi_handle, return QDF_STATUS_SUCCESS; } +/** + * send_pdev_set_rf_path_cmd_tlv() - Send WMI_PDEV_SET_RF_PATH_CMDID to FW + * @wmi_handle: wmi handle + * @rf_path_index: the rf path mode to be selected + * @pdev_id: pdev id + * + * Provides notification to the WLAN firmware that host driver is requesting a + * rf path change. + * + * Return: Success if the cmd is sent successfully to the firmware + */ +static QDF_STATUS send_pdev_set_rf_path_cmd_tlv(wmi_unified_t wmi_handle, + uint32_t rf_path_index, + uint8_t pdev_id) +{ + wmi_pdev_set_rf_path_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint32_t len; + + len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) + return QDF_STATUS_E_NOMEM; + + cmd = (wmi_pdev_set_rf_path_cmd_fixed_param *)wmi_buf_data(buf); + WMITLV_SET_HDR(&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_pdev_set_rf_path_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_pdev_set_rf_path_cmd_fixed_param)); + + cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target( + wmi_handle, + pdev_id); + cmd->rf_path = rf_path_index; + wmi_debug("HW mode index:%d", cmd->rf_path); + + wmi_mtrace(WMI_PDEV_SET_RF_PATH_CMDID, NO_SESSION, 0); + if (wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_PDEV_SET_RF_PATH_CMDID)) { + wmi_err("Failed to send WMI_PDEV_SET_RF_PATH_CMDID"); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + /** * send_suspend_cmd_tlv() - WMI suspend function * @wmi_handle: handle to WMI. @@ -18789,6 +18837,37 @@ extract_hw_mode_resp_event_status_tlv(wmi_unified_t wmi_handle, void *evt_buf, return QDF_STATUS_SUCCESS; } +/** + * extract_rf_path_resp_tlv() - Extract RF path change status + * @wmi_handle: wmi handle + * @evt_buf: pointer to event buffer + * @cmd_status: status of RF path change request + * + * Return: QDF_STATUS_SUCCESS on success or proper error code. + */ +static QDF_STATUS +extract_rf_path_resp_tlv(wmi_unified_t wmi_handle, void *evt_buf, + uint32_t *cmd_status) +{ + WMI_PDEV_SET_RF_PATH_RESP_EVENTID_param_tlvs *param_buf; + wmi_pdev_set_rf_path_event_fixed_param *fixed_param; + + param_buf = (WMI_PDEV_SET_RF_PATH_RESP_EVENTID_param_tlvs *)evt_buf; + if (!param_buf) { + wmi_err("Invalid RF path event buffer"); + return QDF_STATUS_E_INVAL; + } + + fixed_param = param_buf->fixed_param; + if (!fixed_param) { + wmi_err("Invalid fixed param"); + return QDF_STATUS_E_INVAL; + } + + *cmd_status = fixed_param->status; + return QDF_STATUS_SUCCESS; +} + #ifdef FEATURE_ANI_LEVEL_REQUEST static QDF_STATUS send_ani_level_cmd_tlv(wmi_unified_t wmi_handle, uint32_t *freqs, @@ -20966,6 +21045,7 @@ struct wmi_ops tlv_ops = { .send_pdev_param_cmd = send_pdev_param_cmd_tlv, .send_multiple_pdev_param_cmd = send_multiple_pdev_param_cmd_tlv, .send_pdev_set_hw_mode_cmd = send_pdev_set_hw_mode_cmd_tlv, + .send_pdev_set_rf_path_cmd = send_pdev_set_rf_path_cmd_tlv, .send_suspend_cmd = send_suspend_cmd_tlv, .send_resume_cmd = send_resume_cmd_tlv, .send_wow_enable_cmd = send_wow_enable_cmd_tlv, @@ -21437,6 +21517,7 @@ struct wmi_ops tlv_ops = { .send_egid_info_cmd = send_egid_info_cmd_tlv, .extract_csa_ie_received_ev_params = extract_csa_ie_received_ev_params_tlv, + .extract_rf_path_resp = extract_rf_path_resp_tlv, }; #ifdef WLAN_FEATURE_11BE_MLO @@ -21966,6 +22047,8 @@ static void populate_tlv_events_id(WMI_EVT_ID *event_ids) event_ids[wmi_peer_ptqm_migration_response_eventid] = WMI_MLO_PRIMARY_LINK_PEER_MIGRATION_EVENTID; #endif + event_ids[wmi_pdev_set_rf_path_resp_eventid] = + WMI_PDEV_SET_RF_PATH_RESP_EVENTID; } #ifdef WLAN_FEATURE_LINK_LAYER_STATS