qcacld-3.0: Introduce support for T2LM status for logging

Add support for T2LM status event for connectivity
logging.

For T2LM status event, band, tid_ul and tid_dl are
the parameter used for connectivity logging.

Change-Id: Ifdb763185af88617b90ea761e7d10cc35c628808
CRs-Fixed: 3609648
This commit is contained in:
Vijay Raj
2023-09-07 12:54:21 -07:00
committed by Rahul Choudhary
parent b12c496b67
commit 9f57a97491
3 changed files with 146 additions and 4 deletions

View File

@@ -1251,7 +1251,21 @@ wlan_connectivity_t2lm_req_resp_event(struct wlan_objmgr_vdev *vdev,
enum qdf_dp_tx_rx_status tx_status,
qdf_freq_t freq,
bool is_rx, uint8_t subtype);
/**
* wlan_connectivity_t2lm_status_event() - Fill and send T2LM data
* @psoc: Pointer to global psoc object
* @vdev: vdev pointer
*
* Return: None
*/
void wlan_connectivity_t2lm_status_event(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev);
#else
static inline void
wlan_connectivity_mlo_reconfig_event(struct wlan_objmgr_vdev *vdev)
{
}
static inline void
wlan_connectivity_mlo_setup_event(struct wlan_objmgr_vdev *vdev)
{
@@ -1267,7 +1281,8 @@ wlan_connectivity_t2lm_req_resp_event(struct wlan_objmgr_vdev *vdev,
{}
static inline void
wlan_connectivity_mlo_reconfig_event(struct wlan_objmgr_vdev *vdev)
wlan_connectivity_t2lm_status_event(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev)
{
}
#endif

View File

@@ -546,6 +546,130 @@ wlan_connectivity_mlo_setup_event(struct wlan_objmgr_vdev *vdev)
WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_MLO_SETUP);
}
#define IS_LINK_SET(link_bitmap, link_id) ((link_bitmap) & (BIT(link_id)))
static QDF_STATUS
wlan_popluatate_tid_link_id_bitmap(struct wlan_objmgr_vdev *vdev,
struct mlo_link_info *link_info,
struct wlan_diag_mlo_t2lm_status *buf,
uint8_t bss_link)
{
uint8_t link_id;
struct wlan_t2lm_info t2lm[WLAN_T2LM_MAX_DIRECTION] = {0};
uint8_t dir, i;
uint16_t freq;
QDF_STATUS status;
link_id = link_info->link_id;
for (dir = 0; dir < WLAN_T2LM_MAX_DIRECTION; dir++)
t2lm[dir].direction = WLAN_T2LM_INVALID_DIRECTION;
status = wlan_get_t2lm_mapping_status(vdev, t2lm);
if (QDF_IS_STATUS_ERROR(status)) {
logging_err("Unable to get t2lm_mapping");
return QDF_STATUS_E_FAILURE;
}
freq = link_info->link_chan_info->ch_freq;
buf->mlo_cmn_info[bss_link].band =
wlan_convert_freq_to_diag_band(freq);
buf->mlo_cmn_info[bss_link].vdev_id = wlan_vdev_get_id(vdev);
for (dir = 0; dir < WLAN_T2LM_MAX_DIRECTION; dir++) {
for (i = 0; i < T2LM_MAX_NUM_TIDS; i++) {
switch (t2lm[dir].direction) {
case WLAN_T2LM_DL_DIRECTION:
if (
IS_LINK_SET(
t2lm[dir].ieee_link_map_tid[i], link_id))
buf->mlo_cmn_info[bss_link].tid_dl |=
BIT(i);
break;
case WLAN_T2LM_UL_DIRECTION:
if (
IS_LINK_SET(
t2lm[dir].ieee_link_map_tid[i], link_id))
buf->mlo_cmn_info[bss_link].tid_ul |=
BIT(i);
break;
case WLAN_T2LM_BIDI_DIRECTION:
if (
IS_LINK_SET(
t2lm[dir].ieee_link_map_tid[i], link_id)) {
buf->mlo_cmn_info[bss_link].tid_dl |=
BIT(i);
buf->mlo_cmn_info[bss_link].tid_ul |=
BIT(i);
}
break;
default:
logging_debug("Invalid direction %d",
t2lm[dir].direction);
break;
}
}
}
return QDF_STATUS_SUCCESS;
}
void
wlan_connectivity_t2lm_status_event(struct wlan_objmgr_psoc *psoc,
struct wlan_objmgr_vdev *vdev)
{
uint8_t i = 0;
QDF_STATUS status;
struct mlo_link_info *link_info;
WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event,
struct wlan_diag_mlo_t2lm_status);
if (!mlo_is_mld_sta(vdev))
return;
wlan_diag_event.diag_cmn.timestamp_us = qdf_get_time_of_the_day_us();
wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
wlan_diag_event.version = DIAG_MLO_T2LM_STATUS_VERSION;
if (!vdev->mlo_dev_ctx) {
logging_err("MLO dev ctx not found");
return;
}
link_info = mlo_mgr_get_ap_link(vdev);
if (!link_info) {
logging_err("link_info invalid");
return;
}
for (i = 0; i < WLAN_MAX_ML_BSS_LINKS && i < MAX_BANDS; i++) {
if (qdf_is_macaddr_zero(&link_info->ap_link_addr) ||
link_info->vdev_id == WLAN_INVALID_VDEV_ID)
continue;
vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
psoc,
link_info->vdev_id,
WLAN_MLO_MGR_ID);
if (!vdev)
continue;
status =
wlan_popluatate_tid_link_id_bitmap(vdev,
link_info,
&wlan_diag_event,
i);
wlan_objmgr_vdev_release_ref(vdev, WLAN_MLO_MGR_ID);
if (QDF_IS_STATUS_ERROR(status))
goto out;
link_info++;
}
out:
WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event,
EVENT_WLAN_MLO_T2LM_STATUS);
}
#else
static QDF_STATUS
wlan_populate_link_addr(struct wlan_objmgr_vdev *vdev,