Browse Source

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
Vijay Raj 1 year ago
parent
commit
9f57a97491

+ 16 - 1
components/cmn_services/logging/inc/wlan_connectivity_logging.h

@@ -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

+ 124 - 0
components/cmn_services/logging/src/wlan_connectivity_logging.c

@@ -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,

+ 6 - 3
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c

@@ -1635,7 +1635,8 @@ static void cm_process_connect_complete(struct wlan_objmgr_psoc *psoc,
 
 #ifdef WLAN_FEATURE_11BE_MLO
 static QDF_STATUS
-cm_update_tid_mapping(struct wlan_objmgr_vdev *vdev)
+cm_update_tid_mapping(struct wlan_objmgr_psoc *psoc,
+		      struct wlan_objmgr_vdev *vdev)
 {
 	struct wlan_t2lm_context *t2lm_ctx;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
@@ -1660,12 +1661,14 @@ cm_update_tid_mapping(struct wlan_objmgr_vdev *vdev)
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("T2LM IE beacon process failed");
 	}
+	wlan_connectivity_t2lm_status_event(psoc, vdev);
 
 	return status;
 }
 #else
 static inline QDF_STATUS
-cm_update_tid_mapping(struct wlan_objmgr_vdev *vdev)
+cm_update_tid_mapping(struct wlan_objmgr_psoc *psoc,
+		      struct wlan_objmgr_vdev *vdev)
 {
 	return QDF_STATUS_SUCCESS;
 }
@@ -1778,7 +1781,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev,
 					     mlme_get_tdls_prohibited(vdev),
 					     vdev);
 		wlan_p2p_status_connect(vdev);
-		cm_update_tid_mapping(vdev);
+		cm_update_tid_mapping(psoc, vdev);
 		cm_update_associated_ch_info(vdev, true);
 	}