瀏覽代碼

qcacmn: Add CDP API to get peer wlanstats ctx

Peer wlanstats context was accessed directly from
PPDU cookie, with this approach the cookie pointer
may become stale if peer goes for deletion

Hence access the wlanstats context using CDP API
with stats context protection

CRs-Fixed: 2740261
Change-Id: I54c785325f8852ad422f05527b98ebca6e4d6cf0
phadiman 4 年之前
父節點
當前提交
3df84438dd
共有 6 個文件被更改,包括 60 次插入6 次删除
  1. 26 0
      dp/inc/cdp_txrx_cmn.h
  2. 2 2
      dp/inc/cdp_txrx_cmn_struct.h
  3. 3 0
      dp/inc/cdp_txrx_ops.h
  4. 1 2
      dp/wifi3.0/dp_htt.c
  5. 28 0
      dp/wifi3.0/dp_main.c
  6. 0 2
      dp/wifi3.0/dp_rx_mon_status.c

+ 26 - 0
dp/inc/cdp_txrx_cmn.h

@@ -2482,6 +2482,32 @@ cdp_peer_flush_rate_stats(ol_txrx_soc_handle soc, uint8_t pdev_id,
 	soc->ops->cmn_drv_ops->txrx_peer_flush_rate_stats(soc, pdev_id, buf);
 }
 
+/**
+ * cdp_peer_get_wlanstats_ctx() - get wlanstats context
+ * @soc: opaque soc handle
+ * @vdev_id: id of vdev handle
+ * @mac: peer mac address
+ */
+static inline void
+*cdp_peer_get_wlanstats_ctx(ol_txrx_soc_handle soc, uint8_t vdev_id,
+			  uint8_t *mac_addr)
+{
+	if (!soc || !soc->ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		QDF_BUG(0);
+		return NULL;
+	}
+
+	if (!soc->ops->cmn_drv_ops ||
+	    !soc->ops->cmn_drv_ops->txrx_peer_get_wlan_stats_ctx)
+		return NULL;
+
+	return soc->ops->cmn_drv_ops->txrx_peer_get_wlan_stats_ctx(soc,
+								   vdev_id,
+								   mac_addr);
+}
+
 /**
  * cdp_flush_rate_stats_request() - request flush rate statistics
  * @soc: opaque soc handle

+ 2 - 2
dp/inc/cdp_txrx_cmn_struct.h

@@ -1604,6 +1604,7 @@ struct cdp_delayed_tx_completion_ppdu_user {
  * @ppdu_cookie: 16-bit ppdu_cookie
  * @sa_is_training: smart antenna training packets indication
  * @rssi_chain: rssi chain per bandwidth
+ * @usr_ack_rssi: overall per user ack rssi
  * @sa_tx_antenna: antenna in which packet is transmitted
  * @sa_max_rates: smart antenna tx feedback info max rates
  * @sa_goodput: smart antenna tx feedback info goodput
@@ -1672,10 +1673,10 @@ struct cdp_tx_completion_ppdu_user {
 	/*ack rssi for separate chains*/
 	uint32_t ack_rssi[CDP_RSSI_CHAIN_LEN];
 	bool ack_rssi_valid;
+	uint32_t usr_ack_rssi;
 	uint32_t user_pos;
 	uint32_t mu_group_id;
 	uint32_t rix;
-	struct cdp_stats_cookie *cookie;
 	uint8_t is_ppdu_cookie_valid;
 	uint16_t ppdu_cookie;
 	uint8_t sa_is_training;
@@ -2159,7 +2160,6 @@ struct cdp_rx_indication_ppdu {
 	uint8_t fcs_error_mpdus;
 	uint16_t frame_ctrl;
 	int8_t rssi_chain[SS_COUNT][MAX_BW];
-	struct cdp_stats_cookie *cookie;
 	struct cdp_rx_su_evm_info evm_info;
 	uint32_t rx_antenna;
 	uint8_t num_users;

+ 3 - 0
dp/inc/cdp_txrx_ops.h

@@ -524,6 +524,9 @@ struct cdp_cmn_ops {
 	QDF_STATUS (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc,
 						 uint8_t pdev_id,
 						 void *buf);
+	void* (*txrx_peer_get_wlan_stats_ctx)(struct cdp_soc_t *soc,
+					      uint8_t vdev_id,
+					      uint8_t *mac_addr);
 
 	QDF_STATUS (*txrx_flush_rate_stats_request)(struct cdp_soc_t *soc,
 						    uint8_t pdev_id);

+ 1 - 2
dp/wifi3.0/dp_htt.c

@@ -2678,6 +2678,7 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
 	if (qdf_likely(ppdu_user_desc->completion_status ==
 			HTT_PPDU_STATS_USER_STATUS_OK)) {
 		ppdu_desc->ack_rssi = dp_stats_buf->ack_rssi;
+		ppdu_user_desc->usr_ack_rssi = dp_stats_buf->ack_rssi;
 		ppdu_user_desc->ack_rssi_valid = 1;
 	} else {
 		ppdu_user_desc->ack_rssi_valid = 0;
@@ -3514,8 +3515,6 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
 		if (!peer)
 			continue;
 
-		ppdu_desc->user[i].cookie = (void *)peer->wlanstats_ctx;
-
 		/*
 		 * different frame like DATA, BAR or CTRL has different
 		 * tlv bitmap expected. Apart from ACK_BA_STATUS TLV, we

+ 28 - 0
dp/wifi3.0/dp_main.c

@@ -9820,6 +9820,33 @@ dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl,
 }
 #endif
 
+static void *dp_peer_get_wlan_stats_ctx(struct cdp_soc_t *soc_hdl,
+					uint8_t vdev_id,
+					uint8_t *mac_addr)
+{
+	struct dp_soc *soc = (struct dp_soc *)soc_hdl;
+	struct dp_peer *peer;
+	void *wlanstats_ctx = NULL;
+
+	if (mac_addr) {
+		peer = dp_peer_find_hash_find(soc, mac_addr,
+					      0, vdev_id);
+		if (!peer)
+			return NULL;
+
+		if (peer->delete_in_progress) {
+			dp_peer_unref_delete(peer);
+			return NULL;
+		}
+
+		wlanstats_ctx = peer->wlanstats_ctx;
+
+		dp_peer_unref_delete(peer);
+	}
+
+	return wlanstats_ctx;
+}
+
 #if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
 static QDF_STATUS dp_peer_flush_rate_stats(struct cdp_soc_t *soc,
 					   uint8_t pdev_id,
@@ -10128,6 +10155,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 	.get_rate_stats_ctx = dp_soc_get_rate_stats_ctx,
 	.txrx_peer_flush_rate_stats = dp_peer_flush_rate_stats,
 	.txrx_flush_rate_stats_request = dp_flush_rate_stats_req,
+	.txrx_peer_get_wlan_stats_ctx = dp_peer_get_wlan_stats_ctx,
 
 	.set_pdev_pcp_tid_map = dp_set_pdev_pcp_tid_map_wifi3,
 	.set_vdev_pcp_tid_map = dp_set_vdev_pcp_tid_map_wifi3,

+ 0 - 2
dp/wifi3.0/dp_rx_mon_status.c

@@ -538,8 +538,6 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
 		if (!peer)
 			peer = pdev->invalid_peer;
 
-		ppdu->cookie = (void *)peer->wlanstats_ctx;
-
 		if (ppdu_type == HAL_RX_TYPE_SU) {
 			mcs = ppdu->u.mcs;
 			nss = ppdu->u.nss;