Quellcode durchsuchen

qcacmn: Convey vdev_stats_id to FW in wmi_vdev_create_cmd

In BE architecture, HW provides basic vdev stats support for upto
48 vdevs. For each vdev, there is vdev_stats_id which represents the
id of this vdev on HW. This vdev_stats_id is assigned by host and
is conveyed to FW at the time of vdev creation in wmi_vdev_create_cmd.
FW uses this vdev_stats_id to fetch the stats from HW.

Add logic to convey vdev_stats_id to FW at the time of vdev create.

Change-Id: I91782c73a7f3f94175a0c28ab4adda2d894856db
CRs-Fixed: 3069992
Harsh Kumar Bijlani vor 3 Jahren
Ursprung
Commit
d7aada5bea

+ 81 - 1
umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c

@@ -35,6 +35,78 @@
 #include <wlan_dfs_utils_api.h>
 #include <wlan_vdev_mgr_ucfg_api.h>
 #include <qdf_module.h>
+#include <cdp_txrx_ctrl.h>
+
+#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
+/**
+ * vdev_mgr_alloc_vdev_stats_id() - Allocate vdev stats id for vdev
+ * @vdev - pointer to vdev
+ * @param - pointer to vdev create params
+ *
+ * Return: none
+ */
+static void vdev_mgr_alloc_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
+					 struct vdev_create_params *param)
+{
+	struct wlan_objmgr_psoc *psoc;
+	uint8_t vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
+
+	if ((param->type == WLAN_VDEV_MLME_TYPE_MONITOR) ||
+	    (param->subtype == WLAN_VDEV_MLME_SUBTYPE_SMART_MONITOR) ||
+	    (param->special_vdev_mode)) {
+		param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
+		return;
+	}
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc || !wlan_psoc_get_dp_handle(psoc)) {
+		mlme_err("PSOC or PSOC DP Handle is NULL");
+		param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
+		return;
+	}
+
+	/* Get vdev_stats_id from dp_soc via cdp call */
+	cdp_vdev_alloc_vdev_stats_id(wlan_psoc_get_dp_handle(psoc),
+				     &vdev_stats_id);
+
+	param->vdev_stats_id = vdev_stats_id;
+}
+
+/**
+ * vdev_mgr_reset_vdev_stats_id() -Reset vdev stats id
+ * @vdev - pointer to vdev
+ * @vdev_stats_id - Value of vdev_stats_id
+ *
+ * Return: none
+ */
+static void vdev_mgr_reset_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
+					 uint8_t vdev_stats_id)
+{
+	struct wlan_objmgr_psoc *psoc;
+
+	if (vdev_stats_id == CDP_INVALID_VDEV_STATS_ID)
+		return;
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc || !wlan_psoc_get_dp_handle(psoc)) {
+		mlme_err("PSOC or PSOC DP Handle is NULL");
+		return;
+	}
+
+	cdp_vdev_reset_vdev_stats_id(wlan_psoc_get_dp_handle(psoc),
+				     vdev_stats_id);
+}
+#else
+static void vdev_mgr_alloc_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
+					 struct vdev_create_params *param)
+{
+	/* Assign Invalid vdev_stats_id */
+	param->vdev_stats_id = CDP_INVALID_VDEV_STATS_ID;
+}
+
+static void vdev_mgr_reset_vdev_stats_id(struct wlan_objmgr_vdev *vdev,
+					 uint8_t vdev_stats_id)
+{}
+#endif /* QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT */
 
 static QDF_STATUS vdev_mgr_create_param_update(
 					struct vdev_mlme_obj *mlme_obj,
@@ -66,6 +138,10 @@ static QDF_STATUS vdev_mgr_create_param_update(
 	param->mbssid_flags = mbss->mbssid_flags;
 	param->vdevid_trans = mbss->vdevid_trans;
 	param->special_vdev_mode = mlme_obj->mgmt.generic.special_vdev_mode;
+
+	vdev_mgr_alloc_vdev_stats_id(vdev, param);
+	param->vdev_stats_id_valid =
+	((param->vdev_stats_id != CDP_INVALID_VDEV_STATS_ID) ? true : false);
 #ifdef WLAN_FEATURE_11BE_MLO
 	WLAN_ADDR_COPY(param->mlo_mac, wlan_vdev_mlme_get_mldaddr(vdev));
 #endif
@@ -90,7 +166,11 @@ QDF_STATUS vdev_mgr_create_send(struct vdev_mlme_obj *mlme_obj)
 	}
 
 	status = tgt_vdev_mgr_create_send(mlme_obj, &param);
-
+	if (QDF_IS_STATUS_ERROR(status)) {
+		/* Reset the vdev_stats_id */
+		vdev_mgr_reset_vdev_stats_id(mlme_obj->vdev,
+					     param.vdev_stats_id);
+	}
 	return status;
 }
 

+ 4 - 0
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h

@@ -614,6 +614,8 @@ struct vdev_set_params {
 /**
  * struct vdev_create_params - vdev create cmd parameter
  * @vdev_id: interface id
+ * @vdev_stats_id_valid: flag to indicate valid stats id
+ * @vdev_stats_id: stats_id for stats collection
  * @type: interface type
  * @subtype: interface subtype
  * @nss_2g: NSS for 2G
@@ -625,6 +627,8 @@ struct vdev_set_params {
  */
 struct vdev_create_params {
 	uint8_t vdev_id;
+	bool vdev_stats_id_valid;
+	uint8_t vdev_stats_id;
 	uint32_t type;
 	uint32_t subtype;
 	uint8_t nss_2g;

+ 1 - 0
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c

@@ -103,6 +103,7 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 
 	vdev_info.vdev_mac_addr = wlan_vdev_mlme_get_macaddr(vdev);
 	vdev_info.vdev_id = vdev_id;
+	vdev_info.vdev_stats_id = param->vdev_stats_id;
 	vdev_info.op_mode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
 	vdev_info.subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
 	wlan_vdev_mgr_fill_mlo_params(&vdev_info, param);

+ 4 - 0
wmi/src/wmi_unified_tlv.c

@@ -814,6 +814,10 @@ static QDF_STATUS send_vdev_create_cmd_tlv(wmi_unified_t wmi_handle,
 	cmd->flags |= (param->special_vdev_mode ? VDEV_FLAGS_SCAN_MODE_VAP : 0);
 	cmd->vdevid_trans = param->vdevid_trans;
 	cmd->num_cfg_txrx_streams = num_bands;
+#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
+	cmd->vdev_stats_id_valid = param->vdev_stats_id_valid;
+	cmd->vdev_stats_id = param->vdev_stats_id;
+#endif
 	copy_vdev_create_pdev_id(wmi_handle, cmd, param);
 	WMI_CHAR_ARRAY_TO_MAC_ADDR(macaddr, &cmd->vdev_macaddr);
 	wmi_debug("ID = %d[pdev:%d] VAP Addr = "QDF_MAC_ADDR_FMT,