qcacmn: [WMI]FR47702 TWT stats, add WMI support for TWT Stats Event
Add WMI support for WMI_TWT_SESSION_STATS_EVENTID. This event contains stats for a given TWT session. Change-Id: Ieca2b6845fd2ec32ccdfb1021611bed07379d365 CRs-Fixed: 2609951
This commit is contained in:
@@ -4633,6 +4633,7 @@ typedef enum {
|
||||
wmi_twt_del_dialog_complete_event_id,
|
||||
wmi_twt_pause_dialog_complete_event_id,
|
||||
wmi_twt_resume_dialog_complete_event_id,
|
||||
wmi_twt_session_stats_event_id,
|
||||
#endif
|
||||
wmi_apf_get_vdev_work_memory_resp_event_id,
|
||||
wmi_roam_scan_stats_event_id,
|
||||
|
@@ -2187,6 +2187,20 @@ QDF_STATUS (*extract_twt_btwt_remove_sta_comp_event)(wmi_unified_t wmi_handle,
|
||||
struct wmi_twt_btwt_remove_sta_complete_event_param *params);
|
||||
#endif
|
||||
|
||||
QDF_STATUS(*extract_twt_session_stats_event)
|
||||
(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params
|
||||
);
|
||||
QDF_STATUS(*extract_twt_session_stats_data)
|
||||
(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params,
|
||||
struct wmi_host_twt_session_stats_info *session,
|
||||
uint32_t idx
|
||||
);
|
||||
#endif
|
||||
|
||||
#ifdef QCA_SUPPORT_CP_STATS
|
||||
|
@@ -246,6 +246,38 @@ QDF_STATUS wmi_extract_twt_btwt_remove_sta_comp_event(
|
||||
struct wmi_twt_btwt_remove_sta_complete_event_param *params);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* wmi_extract_twt_session_stats_event() - Extract WMI event params for TWT
|
||||
* session stats event
|
||||
* @wmi_handle: wmi handle
|
||||
* @evt_buf: Pointer event buffer
|
||||
* @params: Parameters to extract
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
|
||||
*/
|
||||
QDF_STATUS wmi_extract_twt_session_stats_event(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params);
|
||||
|
||||
/**
|
||||
* wmi_extract_twt_session_stats_data() - Extract one TWT session from TWT
|
||||
* session stats event
|
||||
* @wmi_handle: wmi handle
|
||||
* @evt_buf: Pointer event buffer
|
||||
* @params: Parameters to extract
|
||||
* @session: Session struct to save one TWT session
|
||||
* @idx: TWT session index
|
||||
*
|
||||
* Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
|
||||
*/
|
||||
QDF_STATUS wmi_extract_twt_session_stats_data(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params,
|
||||
struct wmi_host_twt_session_stats_info *session,
|
||||
uint32_t idx);
|
||||
|
||||
#ifdef WLAN_SUPPORT_TWT
|
||||
void wmi_twt_attach_tlv(struct wmi_unified *wmi_handle);
|
||||
#else
|
||||
|
@@ -124,6 +124,53 @@ struct wmi_twt_disable_complete_event {
|
||||
uint32_t pdev_id;
|
||||
};
|
||||
|
||||
/* TWT event types
|
||||
* refer to wmi_unified.h enum wmi_twt_session_stats_type
|
||||
*/
|
||||
enum host_twt_session_stats_type {
|
||||
HOST_TWT_SESSION_SETUP = 1,
|
||||
HOST_TWT_SESSION_TEARDOWN = 2,
|
||||
HOST_TWT_SESSION_UPDATE = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct wmi_host_twt_session_stats_info:
|
||||
* @vdev_id: id of VDEV for twt session
|
||||
* @peer_mac: MAC address of node
|
||||
* @event_type: TWT event types
|
||||
* @flow_id: TWT flow_id
|
||||
* @bcast: broadcast TWT
|
||||
* @trig: trigger
|
||||
* @announ: TWT announcement
|
||||
* @dialog_id: Dialog_id of current session
|
||||
* @wake_dura_us: wake duration in us
|
||||
* @wake_intvl_us: wake time interval in us
|
||||
* @sp_offset_us: Time until initial TWT SP occurs
|
||||
*/
|
||||
struct wmi_host_twt_session_stats_info {
|
||||
uint32_t vdev_id;
|
||||
uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
|
||||
uint32_t event_type;
|
||||
uint32_t flow_id:16,
|
||||
bcast:1,
|
||||
trig:1,
|
||||
announ:1;
|
||||
uint32_t dialog_id;
|
||||
uint32_t wake_dura_us;
|
||||
uint32_t wake_intvl_us;
|
||||
uint32_t sp_offset_us;
|
||||
};
|
||||
|
||||
/** struct wmi_twt_session_stats_event:
|
||||
* @pdev_id: pdev_id for identifying the MAC.
|
||||
* @num_sessions: number of TWT sessions
|
||||
* @twt_sessions: received TWT sessions
|
||||
*/
|
||||
struct wmi_twt_session_stats_event_param {
|
||||
uint32_t pdev_id;
|
||||
uint32_t num_sessions;
|
||||
};
|
||||
|
||||
/* from IEEE 802.11ah section 9.4.2.200 */
|
||||
enum WMI_HOST_TWT_COMMAND {
|
||||
WMI_HOST_TWT_COMMAND_REQUEST_TWT = 0,
|
||||
|
@@ -14950,6 +14950,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
|
||||
WMI_TWT_PAUSE_DIALOG_COMPLETE_EVENTID;
|
||||
event_ids[wmi_twt_resume_dialog_complete_event_id] =
|
||||
WMI_TWT_RESUME_DIALOG_COMPLETE_EVENTID;
|
||||
event_ids[wmi_twt_session_stats_event_id] =
|
||||
WMI_TWT_SESSION_STATS_EVENTID;
|
||||
#endif
|
||||
event_ids[wmi_apf_get_vdev_work_memory_resp_event_id] =
|
||||
WMI_BPF_GET_VDEV_WORK_MEMORY_RESP_EVENTID;
|
||||
|
@@ -223,3 +223,29 @@ QDF_STATUS wmi_extract_twt_btwt_remove_sta_comp_event(
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
#endif
|
||||
|
||||
QDF_STATUS wmi_extract_twt_session_stats_event(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params)
|
||||
{
|
||||
if (wmi_handle->ops->extract_twt_session_stats_event)
|
||||
return wmi_handle->ops->extract_twt_session_stats_event(
|
||||
wmi_handle, evt_buf, params);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
QDF_STATUS wmi_extract_twt_session_stats_data(
|
||||
wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param *params,
|
||||
struct wmi_host_twt_session_stats_info *session,
|
||||
uint32_t idx)
|
||||
{
|
||||
if (wmi_handle->ops->extract_twt_session_stats_data)
|
||||
return wmi_handle->ops->extract_twt_session_stats_data(
|
||||
wmi_handle, evt_buf, params, session, idx);
|
||||
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
@@ -666,6 +666,89 @@ wmi_twt_attach_bcast_twt_tlv(struct wmi_ops *ops)
|
||||
}
|
||||
#endif
|
||||
|
||||
static QDF_STATUS
|
||||
extract_twt_session_stats_event_tlv(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param
|
||||
*params)
|
||||
{
|
||||
WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
|
||||
wmi_pdev_twt_session_stats_event_fixed_param *ev;
|
||||
|
||||
param_buf =
|
||||
(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
|
||||
if (!param_buf) {
|
||||
WMI_LOGE("evt_buf is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
ev = param_buf->fixed_param;
|
||||
params->pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
|
||||
wmi_handle,
|
||||
ev->pdev_id);
|
||||
params->num_sessions = param_buf->num_twt_sessions;
|
||||
|
||||
WMI_LOGD("pdev_id=%d, num of TWT sessions=%d",
|
||||
params->pdev_id, params->num_sessions);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static QDF_STATUS
|
||||
extract_twt_session_stats_event_data(wmi_unified_t wmi_handle,
|
||||
uint8_t *evt_buf,
|
||||
struct wmi_twt_session_stats_event_param
|
||||
*params,
|
||||
struct wmi_host_twt_session_stats_info
|
||||
*session,
|
||||
uint32_t idx)
|
||||
{
|
||||
WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *param_buf;
|
||||
wmi_twt_session_stats_info *twt_session;
|
||||
uint32_t flags;
|
||||
wmi_mac_addr *m1;
|
||||
uint8_t *m2;
|
||||
|
||||
param_buf =
|
||||
(WMI_TWT_SESSION_STATS_EVENTID_param_tlvs *)evt_buf;
|
||||
if (!param_buf) {
|
||||
WMI_LOGE("evt_buf is NULL");
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
if (idx >= param_buf->num_twt_sessions) {
|
||||
WMI_LOGE("wrong idx, idx=%d, num_sessions=%d",
|
||||
idx, param_buf->num_twt_sessions);
|
||||
return QDF_STATUS_E_INVAL;
|
||||
}
|
||||
|
||||
twt_session = ¶m_buf->twt_sessions[idx];
|
||||
|
||||
session->vdev_id = twt_session->vdev_id;
|
||||
m1 = &twt_session->peer_mac;
|
||||
m2 = session->peer_mac;
|
||||
WMI_MAC_ADDR_TO_CHAR_ARRAY(m1, m2);
|
||||
session->event_type = twt_session->event_type;
|
||||
flags = twt_session->flow_id_flags;
|
||||
session->flow_id = WMI_TWT_SESSION_FLAG_FLOW_ID_GET(flags);
|
||||
session->bcast = WMI_TWT_SESSION_FLAG_BCAST_TWT_GET(flags);
|
||||
session->trig = WMI_TWT_SESSION_FLAG_TRIGGER_TWT_GET(flags);
|
||||
session->announ = WMI_TWT_SESSION_FLAG_ANNOUN_TWT_GET(flags);
|
||||
session->dialog_id = twt_session->dialog_id;
|
||||
session->wake_dura_us = twt_session->wake_dura_us;
|
||||
session->wake_intvl_us = twt_session->wake_intvl_us;
|
||||
session->sp_offset_us = twt_session->sp_offset_us;
|
||||
WMI_LOGD("type=%d,id=%d,bcast=%d,trig=%d",
|
||||
session->event_type, session->flow_id,
|
||||
session->bcast, session->trig);
|
||||
WMI_LOGD("announ=%d,diagid=%d,wake_dur=%ul",
|
||||
session->announ, session->dialog_id, session->wake_dura_us);
|
||||
WMI_LOGD("wake_int=%ul,offset=%ul",
|
||||
session->wake_intvl_us, session->sp_offset_us);
|
||||
|
||||
return QDF_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
|
||||
{
|
||||
struct wmi_ops *ops = wmi_handle->ops;
|
||||
@@ -689,6 +772,10 @@ void wmi_twt_attach_tlv(wmi_unified_t wmi_handle)
|
||||
extract_twt_pause_dialog_comp_event_tlv;
|
||||
ops->extract_twt_resume_dialog_comp_event =
|
||||
extract_twt_resume_dialog_comp_event_tlv;
|
||||
ops->extract_twt_session_stats_event =
|
||||
extract_twt_session_stats_event_tlv;
|
||||
ops->extract_twt_session_stats_data =
|
||||
extract_twt_session_stats_event_data;
|
||||
|
||||
wmi_twt_attach_bcast_twt_tlv(ops);
|
||||
}
|
||||
|
Reference in New Issue
Block a user