Explorar el Código

qcacmn: Tx stats changes for BE HW vdev stats

Following peer stats are updated in per packet Tx completion path:
    comp_pkt: Pkt Info for which completions were received
    tx_failed: Total Tx failure

In BE architecture, HW provides the support for basic vdev stats and
hence per packet stats updation of above parameters can be done only
when enhanced stats is enabled or HW vdev offload stats is disabled.

Avoiding per packet stats updation reduces CPU load and improves KPI.

Change-Id: I7090d1a1ce0a882236e3310e3e9517149cbb146b
CRs-Fixed: 3067843
Harsh Kumar Bijlani hace 4 años
padre
commit
66e66d88d7
Se han modificado 4 ficheros con 112 adiciones y 33 borrados
  1. 9 5
      dp/wifi3.0/dp_internal.h
  2. 42 14
      dp/wifi3.0/dp_main.c
  3. 56 13
      dp/wifi3.0/dp_tx.c
  4. 5 1
      dp/wifi3.0/dp_types.h

+ 9 - 5
dp/wifi3.0/dp_internal.h

@@ -1335,8 +1335,11 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc,
 		tgtobj->rx.reception_type[i] +=
 			srcobj->stats.rx.reception_type[i];
 
-	tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes;
-	tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num;
+	if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) {
+		tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes;
+		tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num;
+		tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed;
+	}
 	tgtobj->tx.ucast.num += srcobj->stats.tx.ucast.num;
 	tgtobj->tx.ucast.bytes += srcobj->stats.tx.ucast.bytes;
 	tgtobj->tx.mcast.num += srcobj->stats.tx.mcast.num;
@@ -1354,7 +1357,6 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc,
 		srcobj->stats.tx.nawds_mcast_drop;
 	tgtobj->tx.num_ppdu_cookie_valid +=
 		srcobj->stats.tx.num_ppdu_cookie_valid;
-	tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed;
 	tgtobj->tx.ofdma += srcobj->stats.tx.ofdma;
 	tgtobj->tx.stbc += srcobj->stats.tx.stbc;
 	tgtobj->tx.ldpc += srcobj->stats.tx.ldpc;
@@ -1468,14 +1470,16 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc,
 		for (i = 0; i < MAX_RECEPTION_TYPES; i++) \
 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \
 		\
-		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \
+		if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) { \
+			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \
+			DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \
+		} \
 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \
 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \
 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \
 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \
 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \
 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \
-		DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \
 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \
 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \
 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \

+ 42 - 14
dp/wifi3.0/dp_main.c

@@ -6587,6 +6587,24 @@ static inline void dp_peer_rx_bufq_resources_init(struct dp_peer *peer)
 }
 #endif
 
+#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
+/*
+ * dp_peer_hw_txrx_stats_init() - Initialize hw_txrx_stats_en in dp_peer
+ * @soc: Datapath soc handle
+ * @peer: Datapath peer handle
+ *
+ * Return: none
+ */
+static inline
+void dp_peer_hw_txrx_stats_init(struct dp_soc *soc, struct dp_peer *peer)
+{
+	peer->hw_txrx_stats_en =
+		wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx);
+}
+#else
+static inline
+void dp_peer_hw_txrx_stats_init(struct dp_soc *soc, struct dp_peer *peer) {}
+#endif
 /*
  * dp_peer_create_wifi3() - attach txrx peer
  * @soc_hdl: Datapath soc handle
@@ -6666,7 +6684,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		dp_set_peer_isolation(peer, false);
 
 		dp_wds_ext_peer_init(peer);
-
+		dp_peer_hw_txrx_stats_init(soc, peer);
 		dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT);
 
 		dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
@@ -6716,7 +6734,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	dp_peer_add_ast(soc, peer, peer_mac_addr, ast_type, 0);
 	qdf_spinlock_create(&peer->peer_info_lock);
 	dp_wds_ext_peer_init(peer);
-
+	dp_peer_hw_txrx_stats_init(soc, peer);
 	dp_peer_rx_bufq_resources_init(peer);
 
 	qdf_mem_copy(
@@ -8235,6 +8253,8 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev)
 		return;
 	}
 
+	soc = pdev->soc;
+
 	qdf_mem_zero(&pdev->stats.tx, sizeof(pdev->stats.tx));
 	qdf_mem_zero(&pdev->stats.rx, sizeof(pdev->stats.rx));
 	qdf_mem_zero(&pdev->stats.tx_i, sizeof(pdev->stats.tx_i));
@@ -8242,7 +8262,6 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev)
 	if (dp_monitor_is_enable_mcopy_mode(pdev))
 		DP_UPDATE_STATS(pdev, pdev->invalid_peer);
 
-	soc = pdev->soc;
 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
 	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
 
@@ -8293,12 +8312,16 @@ static QDF_STATUS dp_vdev_getstats(struct cdp_vdev *vdev_handle,
 
 	dp_aggregate_vdev_stats(vdev, vdev_stats);
 
-	stats->tx_packets = vdev_stats->tx_i.rcvd.num;
-	stats->tx_bytes = vdev_stats->tx_i.rcvd.bytes;
+	stats->tx_packets = vdev_stats->tx.comp_pkt.num;
+	stats->tx_bytes = vdev_stats->tx.comp_pkt.bytes;
 
-	stats->tx_errors = vdev_stats->tx.tx_failed +
-		vdev_stats->tx_i.dropped.dropped_pkt.num;
-	stats->tx_dropped = stats->tx_errors;
+	stats->tx_errors = vdev_stats->tx.tx_failed;
+	stats->tx_dropped = vdev_stats->tx_i.dropped.dropped_pkt.num +
+			    vdev_stats->tx_i.sg.dropped_host.num +
+			    vdev_stats->tx_i.mcast_en.dropped_map_error +
+			    vdev_stats->tx_i.mcast_en.dropped_self_mac +
+			    vdev_stats->tx_i.mcast_en.dropped_send_fail +
+			    vdev_stats->tx.nawds_mcast_drop;
 
 	stats->rx_packets = vdev_stats->rx.unicast.num +
 		vdev_stats->rx.multicast.num +
@@ -8326,12 +8349,17 @@ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle,
 
 	dp_aggregate_pdev_stats(pdev);
 
-	stats->tx_packets = pdev->stats.tx_i.rcvd.num;
-	stats->tx_bytes = pdev->stats.tx_i.rcvd.bytes;
-
-	stats->tx_errors = pdev->stats.tx.tx_failed +
-		pdev->stats.tx_i.dropped.dropped_pkt.num;
-	stats->tx_dropped = stats->tx_errors;
+	stats->tx_packets = pdev->stats.tx.comp_pkt.num;
+	stats->tx_bytes = pdev->stats.tx.comp_pkt.bytes;
+
+	stats->tx_errors = pdev->stats.tx.tx_failed;
+	stats->tx_dropped = pdev->stats.tx_i.dropped.dropped_pkt.num +
+			    pdev->stats.tx_i.sg.dropped_host.num +
+			    pdev->stats.tx_i.mcast_en.dropped_map_error +
+			    pdev->stats.tx_i.mcast_en.dropped_self_mac +
+			    pdev->stats.tx_i.mcast_en.dropped_send_fail +
+			    pdev->stats.tx.nawds_mcast_drop +
+			    pdev->stats.tso_stats.dropped_host.num;
 
 	stats->rx_packets = pdev->stats.rx.unicast.num +
 		pdev->stats.rx.multicast.num +

+ 56 - 13
dp/wifi3.0/dp_tx.c

@@ -4183,6 +4183,50 @@ out:
 	return;
 }
 
+#if defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) && \
+	defined(QCA_ENHANCED_STATS_SUPPORT)
+/*
+ * dp_tx_update_peer_basic_stats(): Update peer basic stats
+ * @peer: Datapath peer handle
+ * @length: Length of the packet
+ * @tx_status: Tx status from TQM/FW
+ * @update: enhanced flag value present in dp_pdev
+ *
+ * Return: none
+ */
+static inline
+void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length,
+				   uint8_t tx_status, bool update)
+{
+	if ((!peer->hw_txrx_stats_en) || update) {
+		DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length);
+		DP_STATS_INCC(peer, tx.tx_failed, 1,
+			      tx_status != HAL_TX_TQM_RR_FRAME_ACKED);
+	}
+}
+#elif defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT)
+static inline
+void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length,
+				   uint8_t tx_status, bool update)
+{
+	if (!peer->hw_txrx_stats_en) {
+		DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length);
+		DP_STATS_INCC(peer, tx.tx_failed, 1,
+			      tx_status != HAL_TX_TQM_RR_FRAME_ACKED);
+	}
+}
+
+#else
+static inline
+void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length,
+				   uint8_t tx_status, bool update)
+{
+	DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length);
+	DP_STATS_INCC(peer, tx.tx_failed, 1,
+		      tx_status != HAL_TX_TQM_RR_FRAME_ACKED);
+}
+#endif
+
 /**
  * dp_tx_comp_process_desc_list() - Tx complete software descriptor handler
  * @soc: core txrx main context
@@ -4220,19 +4264,11 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
 		if (qdf_likely(desc->flags & DP_TX_DESC_FLAG_SIMPLE)) {
 			struct dp_pdev *pdev = desc->pdev;
 
-			if (qdf_likely(peer)) {
-				/*
-				 * Increment peer statistics
-				 * Minimal statistics update done here
-				 */
-				DP_STATS_INC_PKT(peer, tx.comp_pkt, 1,
-						 desc->length);
-
-				if (desc->tx_status !=
-						HAL_TX_TQM_RR_FRAME_ACKED)
-					DP_STATS_INC(peer, tx.tx_failed, 1);
-			}
-
+			if (qdf_likely(peer))
+				dp_tx_update_peer_basic_stats(peer,
+							      desc->length,
+							      desc->tx_status,
+							      false);
 			qdf_assert(pdev);
 			dp_tx_outstanding_dec(pdev);
 
@@ -4389,6 +4425,7 @@ void dp_tx_process_htt_completion(struct dp_soc *soc,
 			ts.peer_id = HTT_INVALID_PEER;
 			ts.tid = HTT_INVALID_TID;
 		}
+		ts.release_src = HAL_TX_COMP_RELEASE_SOURCE_FW;
 		ts.ppdu_id =
 			HTT_TX_WBM_COMPLETION_V2_SCH_CMD_ID_GET(
 					htt_desc[1]);
@@ -4414,6 +4451,12 @@ void dp_tx_process_htt_completion(struct dp_soc *soc,
 		peer = dp_peer_get_ref_by_id(soc, ts.peer_id,
 					     DP_MOD_ID_HTT_COMP);
 
+		if (qdf_likely(peer))
+			dp_tx_update_peer_basic_stats(peer,
+						      qdf_nbuf_len(tx_desc->nbuf),
+						      tx_status,
+						      pdev->enhanced_stats_en);
+
 		dp_tx_comp_process_tx_status(soc, tx_desc, &ts, peer, ring_id);
 		dp_tx_comp_process_desc(soc, tx_desc, &ts, peer);
 		dp_tx_desc_release(tx_desc, tx_desc->pool_id);

+ 5 - 1
dp/wifi3.0/dp_types.h

@@ -1017,6 +1017,8 @@ struct dp_soc_stats {
 		uint32_t hp_oos2;
 		/* tx desc freed as part of vdev detach */
 		uint32_t tx_comp_exception;
+		/* TQM drops after/during peer delete */
+		uint64_t tqm_drop_no_peer;
 	} tx;
 
 	/* SOC level RX stats */
@@ -3333,7 +3335,8 @@ struct dp_peer {
 		valid:1, /* valid bit */
 		in_twt:1, /* in TWT session */
 		delete_in_progress:1, /* Indicate kickout sent */
-		sta_self_peer:1; /* Indicate STA self peer */
+		sta_self_peer:1, /* Indicate STA self peer */
+		hw_txrx_stats_en:1; /*Indicate HW offload vdev stats */
 
 #ifdef WLAN_FEATURE_11BE_MLO
 	uint8_t assoc_link:1, /* first assoc link peer for MLO */
@@ -3418,6 +3421,7 @@ struct dp_peer {
 	struct dp_wds_ext_peer wds_ext;
 	ol_txrx_rx_fp osif_rx;
 #endif
+
 #ifdef WLAN_SUPPORT_MESH_LATENCY
 	struct dp_peer_mesh_latency_parameter mesh_latency_params[DP_MAX_TIDS];
 #endif