qcacld-3.0: wma to target_if migration of roam_stats_event

Currently, wmi_roam_stats_event_id data is extracted and
processing is also done in wma. This is not inline with component
model where target_if takes care of data extraction and handover
the extracted data to corresponding component(connection mgr in
this case). Add changes to support the same.

Change-Id: I5e336b01e1a2183e49b3e6eeb125c7c9fd0fd73c
CRs-Fixed: 3003125
This commit is contained in:
Sai Pavan Akhil Remella
2021-08-16 02:04:47 +05:30
committed by Madan Koyyalamudi
parent b60d36df43
commit b35419136e
10 changed files with 1031 additions and 6 deletions

View File

@@ -326,6 +326,61 @@ QDF_STATUS
wmi_extract_roam_scan_chan_list(wmi_unified_t wmi_handle,
uint8_t *event, uint32_t data_len,
struct cm_roam_scan_ch_resp **data);
/**
* wmi_unified_extract_roam_btm_response() - Extract BTM response
* @wmi: wmi handle
* @evt_buf: Pointer to the event buffer
* @dst: Pointer to destination structure to fill data
* @idx: TLV id
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_unified_extract_roam_btm_response(wmi_unified_t wmi, void *evt_buf,
struct roam_btm_response_data *dst,
uint8_t idx);
/**
* wmi_unified_extract_roam_initial_info() - Extract initial info
* @wmi: wmi handle
* @evt_buf: Pointer to the event buffer
* @dst: Pointer to destination structure to fill data
* @idx: TLV id
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_unified_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
struct roam_initial_data *dst,
uint8_t idx);
/**
* wmi_unified_extract_roam_msg_info() - Extract roam msg info
* @wmi: wmi handle
* @evt_buf: Pointer to the event buffer
* @dst: Pointer to destination structure to fill data
* @idx: TLV id
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_unified_extract_roam_msg_info(wmi_unified_t wmi, void *evt_buf,
struct roam_msg_info *dst, uint8_t idx);
/**
* wmi_extract_roam_stats_event - Extract roam stats event
* @wmi_handle: WMI handle
* @event: Event data received from firmware
* @data_len: Event data length received from firmware
* @stats_info: Extract the event and fill in stats_info
*
* Return: QDF_STATUS
*/
QDF_STATUS
wmi_extract_roam_stats_event(wmi_unified_t wmi_handle,
uint8_t *event, uint32_t data_len,
struct roam_stats_event **stats_info);
#endif /* ROAM_TARGET_IF_CONVERGENCE */
#endif /* WLAN_FEATURE_ROAM_OFFLOAD */

View File

@@ -413,5 +413,53 @@ wmi_extract_roam_scan_chan_list(wmi_unified_t wmi_handle,
wmi_handle, event, data_len, data);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_extract_roam_btm_response(wmi_unified_t wmi, void *evt_buf,
struct roam_btm_response_data *dst,
uint8_t idx)
{
if (wmi->ops->extract_roam_btm_response_stats)
return wmi->ops->extract_roam_btm_response_stats(wmi, evt_buf,
dst, idx);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_extract_roam_initial_info(wmi_unified_t wmi, void *evt_buf,
struct roam_initial_data *dst,
uint8_t idx)
{
if (wmi->ops->extract_roam_initial_info)
return wmi->ops->extract_roam_initial_info(wmi, evt_buf,
dst, idx);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_unified_extract_roam_msg_info(wmi_unified_t wmi, void *evt_buf,
struct roam_msg_info *dst, uint8_t idx)
{
if (wmi->ops->extract_roam_msg_info)
return wmi->ops->extract_roam_msg_info(wmi, evt_buf, dst, idx);
return QDF_STATUS_E_FAILURE;
}
QDF_STATUS
wmi_extract_roam_stats_event(wmi_unified_t wmi_handle,
uint8_t *event, uint32_t data_len,
struct roam_stats_event **stats_info)
{
if (wmi_handle->ops->extract_roam_stats_event)
return wmi_handle->ops->extract_roam_stats_event(wmi_handle,
event,
data_len,
stats_info);
return QDF_STATUS_E_FAILURE;
}
#endif /* ROAM_TARGET_IF_CONVERGENCE */
#endif

View File

@@ -2658,6 +2658,289 @@ extract_roam_scan_chan_list_tlv(wmi_unified_t wmi_handle,
*list = data;
return QDF_STATUS_SUCCESS;
}
/**
* extract_roam_stats_event_tlv() - Extract the roam stats event
* from the wmi_roam_stats_event_id
* @wmi_handle: wmi handle
* @evt_buf: Pointer to the event buffer
* @len: Data length
* @data: Double pointer to roam stats data
*/
static QDF_STATUS
extract_roam_stats_event_tlv(wmi_unified_t wmi_handle, uint8_t *evt_buf,
uint32_t len,
struct roam_stats_event **data)
{
WMI_ROAM_STATS_EVENTID_param_tlvs *param_buf;
wmi_roam_stats_event_fixed_param *fixed_param;
struct roam_stats_event *stats_info;
struct roam_msg_info *roam_msg_info = NULL;
uint8_t vdev_id, i;
uint8_t num_tlv = 0, num_chan = 0, num_ap = 0, num_rpt = 0;
uint32_t rem_len;
QDF_STATUS status;
param_buf = (WMI_ROAM_STATS_EVENTID_param_tlvs *)evt_buf;
if (!param_buf) {
wmi_err_rl("NULL event received from target");
return QDF_STATUS_E_INVAL;
}
fixed_param = param_buf->fixed_param;
if (!fixed_param) {
wmi_err_rl(" NULL fixed param");
return QDF_STATUS_E_INVAL;
}
vdev_id = fixed_param->vdev_id;
if (vdev_id >= WLAN_MAX_VDEVS) {
wmi_err_rl("Invalid vdev_id %d", vdev_id);
return QDF_STATUS_E_INVAL;
}
num_tlv = fixed_param->roam_scan_trigger_count;
if (num_tlv > MAX_ROAM_SCAN_STATS_TLV) {
wmi_err_rl("Limiting roam triggers to 5");
num_tlv = MAX_ROAM_SCAN_STATS_TLV;
}
rem_len = WMI_SVC_MSG_MAX_SIZE - sizeof(*fixed_param);
if (rem_len < num_tlv * sizeof(wmi_roam_trigger_reason)) {
wmi_err_rl("Invalid roam trigger data");
return QDF_STATUS_E_INVAL;
}
rem_len -= num_tlv * sizeof(wmi_roam_trigger_reason);
if (rem_len < num_tlv * sizeof(wmi_roam_scan_info)) {
wmi_err_rl("Invalid roam scan data");
return QDF_STATUS_E_INVAL;
}
rem_len -= num_tlv * sizeof(wmi_roam_scan_info);
if (rem_len < num_tlv * sizeof(wmi_roam_result)) {
wmi_err_rl("Invalid roam result data");
return QDF_STATUS_E_INVAL;
}
rem_len -= num_tlv * sizeof(wmi_roam_result);
if (rem_len < (num_tlv * sizeof(wmi_roam_neighbor_report_info))) {
wmi_err_rl("Invalid roam neighbor report data");
return QDF_STATUS_E_INVAL;
}
rem_len -= num_tlv * sizeof(wmi_roam_neighbor_report_info);
if (rem_len < (param_buf->num_roam_scan_chan_info *
sizeof(wmi_roam_scan_channel_info))) {
wmi_err_rl("Invalid roam chan data num_tlv:%d",
param_buf->num_roam_scan_chan_info);
return QDF_STATUS_E_INVAL;
}
rem_len -= param_buf->num_roam_scan_chan_info *
sizeof(wmi_roam_scan_channel_info);
if (rem_len < (param_buf->num_roam_ap_info *
sizeof(wmi_roam_ap_info))) {
wmi_err_rl("Invalid roam ap data num_tlv:%d",
param_buf->num_roam_ap_info);
return QDF_STATUS_E_INVAL;
}
rem_len -= param_buf->num_roam_ap_info * sizeof(wmi_roam_ap_info);
if (rem_len < (param_buf->num_roam_neighbor_report_chan_info *
sizeof(wmi_roam_neighbor_report_channel_info))) {
wmi_err_rl("Invalid roam neigb rpt chan data num_tlv:%d",
param_buf->num_roam_neighbor_report_chan_info);
return QDF_STATUS_E_INVAL;
}
rem_len -= param_buf->num_roam_neighbor_report_chan_info *
sizeof(wmi_roam_neighbor_report_channel_info);
if (rem_len < param_buf->num_roam_btm_response_info *
sizeof(wmi_roam_btm_response_info)) {
wmi_err_rl("Invalid btm rsp data");
return QDF_STATUS_E_INVAL;
}
rem_len -= param_buf->num_roam_btm_response_info *
sizeof(wmi_roam_btm_response_info);
if (rem_len < param_buf->num_roam_initial_info *
sizeof(wmi_roam_initial_info)) {
wmi_err_rl("Invalid Initial roam info");
return QDF_STATUS_E_INVAL;
}
rem_len -= param_buf->num_roam_initial_info *
sizeof(wmi_roam_initial_info);
if (rem_len < param_buf->num_roam_msg_info *
sizeof(wmi_roam_msg_info)) {
wmi_err_rl("Invalid roam msg info");
return QDF_STATUS_E_INVAL;
}
stats_info = qdf_mem_malloc(sizeof(struct roam_stats_event));
if (!stats_info) {
status = QDF_STATUS_E_NOMEM;
goto err;
}
*data = stats_info;
qdf_mem_set(stats_info, sizeof(struct roam_stats_event), 0);
stats_info->vdev_id = vdev_id;
stats_info->num_roam_msg_info = param_buf->num_roam_msg_info;
stats_info->num_tlv = num_tlv;
for (i = 0; i < num_tlv; i++) {
/*
* Roam Trigger id and that specific roam trigger related
* details.
*/
status = wmi_unified_extract_roam_trigger_stats(wmi_handle,
evt_buf,
&stats_info->trigger[i], i);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Extract roam trigger stats failed vdev %d at %d iteration",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
/* Roam scan related details - Scan channel, scan type .. */
status = wmi_unified_extract_roam_scan_stats(wmi_handle,
evt_buf,
&stats_info->scan[i], i,
num_chan, num_ap);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam scan stats extract failed vdev %d at %d iteration",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
num_chan += stats_info->scan[i].num_chan;
num_ap += stats_info->scan[i].num_ap;
/* Roam result - Success/Failure status, failure reason */
status = wmi_unified_extract_roam_result_stats(wmi_handle,
evt_buf,
&stats_info->result[i], i);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam result stats extract failed vdev %d at %d iteration",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
/* BTM resp info */
status = wmi_unified_extract_roam_btm_response(wmi_handle,
evt_buf,
&stats_info->btm_rsp[i],
i);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam btm rsp stats extract fail vdev %d at %d iteration",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
/* Initial Roam info */
status = wmi_unified_extract_roam_initial_info(wmi_handle,
evt_buf,
&stats_info->roam_init_info[i], i);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Initial roam stats extract fail vdev %d at %d iteration",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
}
if (!num_tlv) {
status = wmi_unified_extract_roam_11kv_stats(wmi_handle,
evt_buf,
&stats_info->data_11kv[0], 0, 0);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_err("Roam 11kv stats extract failed vdev %d",
vdev_id);
status = QDF_STATUS_E_INVAL;
goto err;
}
status = wmi_unified_extract_roam_trigger_stats(wmi_handle,
evt_buf,
&stats_info->trigger[0], 0);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Extract roamtrigger stats failed vdev %d",
vdev_id);
status = QDF_STATUS_E_INVAL;
goto err;
}
status = wmi_unified_extract_roam_scan_stats(wmi_handle,
evt_buf,
&stats_info->scan[0],
0, 0, 0);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam scan stats extract failed vdev %d",
vdev_id);
status = QDF_STATUS_E_INVAL;
goto err;
}
status = wmi_unified_extract_roam_btm_response(wmi_handle,
evt_buf,
&stats_info->btm_rsp[0],
0);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam btm rsp stats extract fail vdev %d",
vdev_id);
status = QDF_STATUS_E_INVAL;
goto err;
}
}
if (param_buf->roam_msg_info && param_buf->num_roam_msg_info) {
roam_msg_info = qdf_mem_malloc(param_buf->num_roam_msg_info *
sizeof(*roam_msg_info));
if (!roam_msg_info) {
status = QDF_STATUS_E_NOMEM;
goto err;
}
stats_info->roam_msg_info = roam_msg_info;
for (i = 0; i < param_buf->num_roam_msg_info; i++) {
status = wmi_unified_extract_roam_msg_info(wmi_handle,
evt_buf,
&roam_msg_info[i], i);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_err("roam msg stats extract fail vdev %d",
vdev_id);
status = QDF_STATUS_E_INVAL;
goto err;
}
if (roam_msg_info[i].present && i < num_tlv) {
/* BTM req/resp or Neighbor report/response info */
status = wmi_unified_extract_roam_11kv_stats(
wmi_handle,
evt_buf,
&stats_info->data_11kv[i],
i, num_rpt);
if (QDF_IS_STATUS_ERROR(status)) {
wmi_debug_rl("Roam 11kv stats extract fail vdev %d iter %d",
vdev_id, i);
status = QDF_STATUS_E_INVAL;
goto err;
}
num_rpt += stats_info->data_11kv[i].num_freq;
}
}
}
return QDF_STATUS_SUCCESS;
err:
if (stats_info) {
if (roam_msg_info)
qdf_mem_free(roam_msg_info);
qdf_mem_free(stats_info);
}
return status;
}
#endif
void wmi_roam_offload_attach_tlv(wmi_unified_t wmi_handle)
@@ -2675,6 +2958,7 @@ void wmi_roam_offload_attach_tlv(wmi_unified_t wmi_handle)
ops->extract_btm_bl_event = extract_btm_blacklist_event;
ops->extract_vdev_disconnect_event = extract_vdev_disconnect_event_tlv;
ops->extract_roam_scan_chan_list = extract_roam_scan_chan_list_tlv;
ops->extract_roam_stats_event = extract_roam_stats_event_tlv;
#endif /* ROAM_TARGET_IF_CONVERGENCE */
ops->send_set_ric_req_cmd = send_set_ric_req_cmd_tlv;
ops->send_process_roam_synch_complete_cmd =