From 7962020d775349f805b232259f386b3e8f688c68 Mon Sep 17 00:00:00 2001 From: Aasir Rasheed Date: Tue, 14 Mar 2023 10:38:15 +0530 Subject: [PATCH] qcacmn: Add WMI params for MLO link state query New TLVs for MLO link state information is introduced for get link info command. Add WMI changes to add these TLV in get link info command Change-Id: Ib8d12a727ac6f59257dcce69174271330a065c77 CRs-Fixed: 3431076 --- wmi/inc/wmi_unified_11be_api.h | 20 +++++++ wmi/inc/wmi_unified_param.h | 14 +++++ wmi/inc/wmi_unified_priv.h | 10 ++++ wmi/src/wmi_unified_11be_api.c | 21 +++++++ wmi/src/wmi_unified_11be_tlv.c | 101 +++++++++++++++++++++++++++++++++ wmi/src/wmi_unified_tlv.c | 2 + 6 files changed, 168 insertions(+) diff --git a/wmi/inc/wmi_unified_11be_api.h b/wmi/inc/wmi_unified_11be_api.h index aaf8e31f2c..8b459e20cb 100644 --- a/wmi/inc/wmi_unified_11be_api.h +++ b/wmi/inc/wmi_unified_11be_api.h @@ -142,6 +142,14 @@ QDF_STATUS wmi_send_mlo_peer_tid_to_link_map_cmd( QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd( wmi_unified_t wmi, struct wmi_host_tid_to_link_map_ap_params *params); +/** + * wmi_send_mlo_link_state_request_cmd - send mlo link status command + * @wmi: wmi handle + * @params: Pointer to link state params + */ +QDF_STATUS wmi_send_mlo_link_state_request_cmd( + wmi_unified_t wmi, + struct wmi_host_link_state_params *params); /** * wmi_extract_mlo_vdev_tid_to_link_map_event() - extract mlo t2lm info for vdev @@ -174,6 +182,18 @@ wmi_extract_mlo_vdev_bcast_tid_to_link_map_event( wmi_unified_t wmi, void *evt_buf, struct mlo_bcast_t2lm_info *bcast); + +/** + * wmi_extract_mlo_link_state_info_event - extract mlo link status info + * @wmi: wmi handle + * @evt_buf: pointer to event buffer + * @params: pointer to host struct to get mlo link state + */ +QDF_STATUS wmi_extract_mlo_link_state_info_event( + wmi_unified_t wmi, + void *evt_buf, + struct ml_link_state_info_event *params); + #endif /* WLAN_FEATURE_11BE */ #endif /*_WMI_UNIFIED_11BE_API_H_*/ diff --git a/wmi/inc/wmi_unified_param.h b/wmi/inc/wmi_unified_param.h index ddebc5de2c..2465429eed 100644 --- a/wmi/inc/wmi_unified_param.h +++ b/wmi/inc/wmi_unified_param.h @@ -1191,6 +1191,17 @@ struct wmi_host_tid_to_link_map_resp { enum wlan_t2lm_status status; uint8_t mapping_switch_tsf; }; + +/** + * struct wmi_host_link_state_params - MLO link state params + * @vdev_id: Vdev id + * @mld_mac: mld mac address + */ +struct wmi_host_link_state_params { + uint8_t vdev_id; + uint8_t mld_mac[QDF_MAC_ADDR_SIZE]; +}; + #endif /* WLAN_FEATURE_11BE */ #ifdef WLAN_FEATURE_11BE_MLO @@ -5279,6 +5290,9 @@ typedef enum { wmi_vdev_standalone_sound_complete_eventid, #endif wmi_csa_ie_received_event_id, +#ifdef WLAN_FEATURE_11BE_MLO + wmi_mlo_link_state_info_eventid, +#endif wmi_events_max, } wmi_conv_event_id; diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index e16529e078..c7a1b5a271 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -3165,6 +3165,11 @@ QDF_STATUS QDF_STATUS (*extract_quiet_offload_event)( wmi_unified_t wmi_handle, void *evt_buf, struct vdev_sta_quiet_event *quiet_event); + +QDF_STATUS (*extract_mlo_link_state_event)( + struct wmi_unified *wmi_handle, + void *buf, + struct ml_link_state_info_event *params); #endif #ifdef WLAN_SUPPORT_PPEDS @@ -3187,6 +3192,10 @@ QDF_STATUS (*send_mlo_vdev_tid_to_link_map)( wmi_unified_t wmi_handle, struct wmi_host_tid_to_link_map_ap_params *params); +QDF_STATUS (*send_mlo_link_state_request)( + wmi_unified_t wmi_handle, + struct wmi_host_link_state_params *params); + QDF_STATUS (*extract_mlo_vdev_tid_to_link_map_event)( struct wmi_unified *wmi_handle, uint8_t *buf, @@ -3196,6 +3205,7 @@ QDF_STATUS (*extract_mlo_vdev_bcast_tid_to_link_map_event)( struct wmi_unified *wmi_handle, void *buf, struct mlo_bcast_t2lm_info *bcast_info); + #endif /* WLAN_FEATURE_11BE */ QDF_STATUS diff --git a/wmi/src/wmi_unified_11be_api.c b/wmi/src/wmi_unified_11be_api.c index e11c918579..622169bc56 100644 --- a/wmi/src/wmi_unified_11be_api.c +++ b/wmi/src/wmi_unified_11be_api.c @@ -81,6 +81,15 @@ QDF_STATUS wmi_send_mlo_vdev_tid_to_link_map_cmd( return QDF_STATUS_E_FAILURE; } +QDF_STATUS wmi_send_mlo_link_state_request_cmd( + wmi_unified_t wmi, + struct wmi_host_link_state_params *params) +{ + if (wmi->ops->send_mlo_link_state_request) + return wmi->ops->send_mlo_link_state_request(wmi, params); + return QDF_STATUS_E_FAILURE; +} + QDF_STATUS wmi_extract_mlo_vdev_tid_to_link_map_event( wmi_unified_t wmi, void *evt_buf, @@ -108,6 +117,18 @@ wmi_extract_mlo_vdev_bcast_tid_to_link_map_event( } return QDF_STATUS_E_FAILURE; } + +QDF_STATUS wmi_extract_mlo_link_state_info_event( + wmi_unified_t wmi, + void *evt_buf, + struct ml_link_state_info_event *params) +{ + if (wmi->ops->extract_mlo_link_state_event) + return wmi->ops->extract_mlo_link_state_event( + wmi, evt_buf, params); + return QDF_STATUS_E_FAILURE; +} + #endif /* WLAN_FEATURE_11BE */ QDF_STATUS diff --git a/wmi/src/wmi_unified_11be_tlv.c b/wmi/src/wmi_unified_11be_tlv.c index 548d9e9620..011302a50c 100644 --- a/wmi/src/wmi_unified_11be_tlv.c +++ b/wmi/src/wmi_unified_11be_tlv.c @@ -1026,6 +1026,103 @@ static uint8_t *populate_link_control_tlv( } #endif +static QDF_STATUS +send_link_state_request_cmd_tlv(wmi_unified_t wmi_handle, + struct wmi_host_link_state_params *params) +{ + wmi_mlo_vdev_get_link_info_cmd_fixed_param *cmd; + wmi_buf_t buf; + uint8_t *buf_ptr; + QDF_STATUS ret = QDF_STATUS_SUCCESS; + uint32_t buf_len = 0; + + buf_len = sizeof(wmi_mlo_vdev_get_link_info_cmd_fixed_param); + + buf = wmi_buf_alloc(wmi_handle, buf_len); + if (!buf) { + wmi_err("wmi buf alloc failed for vdev id %d while link state cmd send: ", + params->vdev_id); + return QDF_STATUS_E_NOMEM; + } + + buf_ptr = (uint8_t *)wmi_buf_data(buf); + cmd = (wmi_mlo_vdev_get_link_info_cmd_fixed_param *)buf_ptr; + + WMITLV_SET_HDR( + &cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_mlo_vdev_get_link_info_cmd_fixed_param, + WMITLV_GET_STRUCT_TLVLEN( + wmi_mlo_vdev_get_link_info_cmd_fixed_param)); + + cmd->vdev_id = params->vdev_id; + WMI_CHAR_ARRAY_TO_MAC_ADDR(params->mld_mac, &cmd->mld_macaddr); + buf_ptr += sizeof(wmi_mlo_vdev_get_link_info_cmd_fixed_param); + wmi_mtrace(WMI_MLO_VDEV_GET_LINK_INFO_CMDID, cmd->vdev_id, 0); + ret = wmi_unified_cmd_send(wmi_handle, buf, buf_len, + WMI_MLO_VDEV_GET_LINK_INFO_CMDID); + if (ret) { + wmi_err("Failed to send ml link state command to FW: %d vdev id %d", + ret, cmd->vdev_id); + wmi_buf_free(buf); + } + return ret; +} + +static QDF_STATUS +extract_mlo_link_state_event_tlv(struct wmi_unified *wmi_handle, + void *buf, + struct ml_link_state_info_event *params) +{ + WMI_MLO_VDEV_LINK_INFO_EVENTID_param_tlvs *param_buf; + wmi_mlo_vdev_link_info_event_fixed_param *ev; + wmi_mlo_vdev_link_info *link_info = NULL; + int num_info = 0; + uint8_t *mld_addr; + uint32_t num_link_info = 0; + + param_buf = (WMI_MLO_VDEV_LINK_INFO_EVENTID_param_tlvs *)buf; + + if (!param_buf) { + wmi_err_rl("Param_buf is NULL"); + return QDF_STATUS_E_FAILURE; + } + + ev = (wmi_mlo_vdev_link_info_event_fixed_param *) + param_buf->fixed_param; + link_info = (wmi_mlo_vdev_link_info *)param_buf->mlo_vdev_link_info; + + num_link_info = param_buf->num_mlo_vdev_link_info; + params->status = ev->status; + params->vdev_id = ev->vdev_id; + params->hw_mode_index = ev->hw_mode_index; + params->num_mlo_vdev_link_info = num_link_info; + mld_addr = params->mldaddr.bytes; + WMI_MAC_ADDR_TO_CHAR_ARRAY(&ev->mld_macaddr, mld_addr); + + if (params->num_mlo_vdev_link_info > WLAN_MLO_MAX_VDEVS) { + wmi_err_rl("Invalid number of vdev link info"); + return QDF_STATUS_E_FAILURE; + } + + for (num_info = 0; num_info < num_link_info; num_info++) { + params->link_info[num_info].vdev_id = + WMI_MLO_VDEV_LINK_INFO_GET_VDEVID(link_info->link_info); + + params->link_info[num_info].link_id = + WMI_MLO_VDEV_LINK_INFO_GET_LINKID(link_info->link_info); + + params->link_info[num_info].link_status = + WMI_MLO_VDEV_LINK_INFO_GET_LINK_STATUS(link_info->link_info); + + params->link_info[num_info].chan_freq = + link_info->chan_freq; + + link_info++; + } + + return QDF_STATUS_SUCCESS; +} + static QDF_STATUS send_mlo_peer_tid_to_link_map_cmd_tlv( wmi_unified_t wmi_handle, struct wmi_host_tid_to_link_map_params *params, @@ -1684,10 +1781,14 @@ void wmi_11be_attach_tlv(wmi_unified_t wmi_handle) send_mlo_peer_tid_to_link_map_cmd_tlv; ops->send_mlo_vdev_tid_to_link_map = send_mlo_vdev_tid_to_link_map_cmd_tlv; + ops->send_mlo_link_state_request = + send_link_state_request_cmd_tlv; ops->extract_mlo_vdev_tid_to_link_map_event = extract_mlo_vdev_tid_to_link_map_event_tlv; ops->extract_mlo_vdev_bcast_tid_to_link_map_event = extract_mlo_vdev_bcast_tid_to_link_map_event_tlv; + ops->extract_mlo_link_state_event = + extract_mlo_link_state_event_tlv; #endif /* WLAN_FEATURE_11BE */ ops->extract_mgmt_rx_ml_cu_params = extract_mgmt_rx_ml_cu_params_tlv; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index a24308747b..85dfe7d957 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -21079,6 +21079,8 @@ static void populate_tlv_events_id_mlo(WMI_EVT_ID *event_ids) WMI_MLO_AP_VDEV_TID_TO_LINK_MAP_EVENTID; event_ids[wmi_mlo_link_removal_eventid] = WMI_MLO_LINK_REMOVAL_EVENTID; + event_ids[wmi_mlo_link_state_info_eventid] = + WMI_MLO_VDEV_LINK_INFO_EVENTID; } #else /* WLAN_FEATURE_11BE_MLO */ static inline void populate_tlv_events_id_mlo(WMI_EVT_ID *event_ids)