소스 검색

qcacmn: Move wow wakeup stats from vdev to psoc level stats

Currently wow wake up stats are maintained on vdev level,
since wow wake up stats are system level stats, stats on
the vdev gets reset on vdev destroy.
To resolve above issue store wow wake up stats to psoc level
stats so that stats are present even after vdev start.

Change-Id: I74aea1baa1d9168de3cb9142a24e73654910a48d
CRs-fixed: 2541661
Ashish Kumar Dhanotiya 5 년 전
부모
커밋
758e340721
2개의 변경된 파일72개의 추가작업 그리고 76개의 파일을 삭제
  1. 2 2
      umac/cp_stats/dispatcher/inc/wlan_cp_stats_mc_defs.h
  2. 70 74
      umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_ucfg_api.c

+ 2 - 2
umac/cp_stats/dispatcher/inc/wlan_cp_stats_mc_defs.h

@@ -196,11 +196,13 @@ struct cca_stats {
  * @is_cp_stats_suspended: is cp stats suspended or not
  * @pending: details of pending requests
  * @wow_unspecified_wake_up_count: number of non-wow related wake ups
+ * @wow_stats: wake_lock stats for vdev
  */
 struct psoc_mc_cp_stats {
 	bool is_cp_stats_suspended;
 	struct pending_stats_requests pending;
 	uint32_t wow_unspecified_wake_up_count;
+	struct wake_lock_stats wow_stats;
 };
 
 /**
@@ -245,14 +247,12 @@ struct summary_stats {
 
 /**
  * struct vdev_mc_cp_stats - vdev specific stats
- * @wow_stats: wake_lock stats for vdev
  * @cca: cca stats
  * @tx_rate_flags: tx rate flags (enum tx_rate_info)
  * @chain_rssi: chain rssi
  * @vdev_summary_stats: vdev's summary stats
  */
 struct vdev_mc_cp_stats {
-	struct wake_lock_stats wow_stats;
 	struct cca_stats cca;
 	uint32_t tx_rate_flags;
 	int8_t chain_rssi[MAX_NUM_CHAINS];

+ 70 - 74
umac/cp_stats/dispatcher/src/wlan_cp_stats_mc_ucfg_api.c

@@ -133,28 +133,25 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
 					uint8_t vdev_id,
 					enum qdf_proto_subtype protocol)
 {
-	struct wlan_objmgr_vdev *vdev;
 	struct wake_lock_stats *stats;
-	struct vdev_mc_cp_stats *vdev_mc_stats;
-	struct vdev_cp_stats *vdev_cp_stats_priv;
+	struct psoc_cp_stats *psoc_cp_stats_priv;
+	struct psoc_mc_cp_stats *psoc_mc_stats;
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_CP_STATS_ID);
-	if (!vdev) {
-		cp_stats_err("vdev numm for vdev_id: %d", vdev_id);
+	psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
+	if (!psoc_cp_stats_priv) {
+		cp_stats_err("psoc cp stats object is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
-	if (!vdev_cp_stats_priv) {
-		cp_stats_err("vdev cp stats object is null");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);
+	wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
+	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
+
+	if (!psoc_mc_stats) {
+		cp_stats_err("psoc mc stats is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
-	vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
-	stats = &vdev_mc_stats->wow_stats;
+	stats = &psoc_mc_stats->wow_stats;
 	switch (protocol) {
 	case QDF_PROTO_ICMP_REQ:
 	case QDF_PROTO_ICMP_RES:
@@ -180,9 +177,8 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_protocol(
 	default:
 		break;
 	}
+	wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
 
-	wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -190,28 +186,25 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
 					struct wlan_objmgr_psoc *psoc,
 					uint8_t vdev_id, uint8_t *dest_mac)
 {
-	struct wlan_objmgr_vdev *vdev;
+	struct psoc_cp_stats *psoc_cp_stats_priv;
+	struct psoc_mc_cp_stats *psoc_mc_stats;
 	struct wake_lock_stats *stats;
-	struct vdev_mc_cp_stats *vdev_mc_stats;
-	struct vdev_cp_stats *vdev_cp_stats_priv;
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_CP_STATS_ID);
-	if (!vdev) {
-		cp_stats_err("vdev numm for vdev_id: %d", vdev_id);
+	psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
+	if (!psoc_cp_stats_priv) {
+		cp_stats_err("psoc cp stats object is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
-	if (!vdev_cp_stats_priv) {
-		cp_stats_err("vdev cp stats object is null");
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);
+	wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
+	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
+	if (!psoc_mc_stats) {
+		cp_stats_err("psoc mc stats is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
-	vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
-	stats = &vdev_mc_stats->wow_stats;
+	stats = &psoc_mc_stats->wow_stats;
+
 	switch (*dest_mac) {
 	case QDF_BCAST_MAC_ADDR:
 		stats->bcast_wake_up_count++;
@@ -226,9 +219,8 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats_by_dst_addr(
 		stats->ucast_wake_up_count++;
 		break;
 	}
+	wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
 
-	wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -238,11 +230,8 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc,
 {
 	struct wake_lock_stats *stats;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
-	struct wlan_objmgr_vdev *vdev = NULL;
 	struct psoc_mc_cp_stats *psoc_mc_stats;
 	struct psoc_cp_stats *psoc_cp_stats_priv;
-	struct vdev_mc_cp_stats *vdev_mc_stats;
-	struct vdev_cp_stats *vdev_cp_stats_priv;
 
 	psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
 	if (!psoc_cp_stats_priv) {
@@ -250,35 +239,21 @@ QDF_STATUS ucfg_mc_cp_stats_inc_wake_lock_stats(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_CP_STATS_ID);
-	if (!vdev) {
-		cp_stats_err("vdev numm for vdev_id: %d", vdev_id);
-		return QDF_STATUS_E_NULL_VALUE;
-	}
+	wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
 
-	vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
-	if (!vdev_cp_stats_priv) {
-		cp_stats_err("vdev cp stats object is null");
-		status = QDF_STATUS_E_NULL_VALUE;
-		goto release_vdev_ref;
+	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
+
+	if (!psoc_mc_stats) {
+		cp_stats_err("psoc mc stats is null");
+		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
-	wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
+	stats = &psoc_mc_stats->wow_stats;
 
-	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
-	vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
-	stats = &vdev_mc_stats->wow_stats;
 	status = tgt_mc_cp_stats_inc_wake_lock_stats(psoc, reason, stats,
 				&psoc_mc_stats->wow_unspecified_wake_up_count);
-	wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
 	wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
 
-release_vdev_ref:
-	if (vdev)
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_CP_STATS_ID);
-
 	return status;
 }
 
@@ -294,18 +269,23 @@ static void vdev_iterator(struct wlan_objmgr_psoc *psoc, void *vdev, void *arg)
 {
 	struct wake_lock_stats *vdev_stats;
 	struct wake_lock_stats *stats = arg;
-	struct vdev_mc_cp_stats *vdev_mc_stats;
-	struct vdev_cp_stats *vdev_cp_stats_priv;
+	struct psoc_cp_stats *psoc_cp_stats_priv;
+	struct psoc_mc_cp_stats *psoc_mc_stats;
 
-	vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
-	if (!vdev_cp_stats_priv) {
-		cp_stats_err("vdev cp stats object is null");
+	psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
+	if (!psoc_cp_stats_priv) {
+		cp_stats_err("psoc cp stats object is null");
 		return;
 	}
 
-	wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
-	vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
-	vdev_stats = &vdev_mc_stats->wow_stats;
+	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
+	if (!psoc_mc_stats) {
+		cp_stats_err("psoc mc stats is null");
+		return;
+	}
+
+	vdev_stats = &psoc_mc_stats->wow_stats;
+
 	stats->ucast_wake_up_count += vdev_stats->ucast_wake_up_count;
 	stats->bcast_wake_up_count += vdev_stats->bcast_wake_up_count;
 	stats->ipv4_mcast_wake_up_count += vdev_stats->ipv4_mcast_wake_up_count;
@@ -326,7 +306,6 @@ static void vdev_iterator(struct wlan_objmgr_psoc *psoc, void *vdev, void *arg)
 			vdev_stats->oem_response_wake_up_count;
 	stats->pwr_save_fail_detected += vdev_stats->pwr_save_fail_detected;
 	stats->scan_11d += vdev_stats->scan_11d;
-	wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
 }
 
 QDF_STATUS ucfg_mc_cp_stats_get_psoc_wake_lock_stats(
@@ -356,19 +335,36 @@ QDF_STATUS ucfg_mc_cp_stats_get_vdev_wake_lock_stats(
 						struct wlan_objmgr_vdev *vdev,
 						struct wake_lock_stats *stats)
 {
-	struct vdev_cp_stats *vdev_cp_stats_priv;
-	struct vdev_mc_cp_stats *vdev_mc_stats;
+	struct wlan_objmgr_psoc *psoc;
+	struct psoc_cp_stats *psoc_cp_stats_priv;
+	struct psoc_mc_cp_stats *psoc_mc_stats;
 
-	vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
-	if (!vdev_cp_stats_priv) {
-		cp_stats_err("vdev cp stats object is null");
+	wlan_vdev_obj_lock(vdev);
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		wlan_vdev_obj_unlock(vdev);
+		cp_stats_err("psoc NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+	wlan_vdev_obj_unlock(vdev);
+
+	psoc_cp_stats_priv = wlan_cp_stats_get_psoc_stats_obj(psoc);
+	if (!psoc_cp_stats_priv) {
+		cp_stats_err("psoc cp stats object is null");
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
-	vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
-	qdf_mem_copy(stats, &vdev_mc_stats->wow_stats, sizeof(*stats));
-	wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
+	wlan_cp_stats_psoc_obj_lock(psoc_cp_stats_priv);
+	psoc_mc_stats = psoc_cp_stats_priv->obj_stats;
+
+	if (!psoc_mc_stats) {
+		cp_stats_err("psoc mc stats is null");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	qdf_mem_copy(stats, &psoc_mc_stats->wow_stats, sizeof(*stats));
+
+	wlan_cp_stats_psoc_obj_unlock(psoc_cp_stats_priv);
 
 	return QDF_STATUS_SUCCESS;
 }