Browse Source

qca-wifi: CFR: Update RCC specific debug counters

RCC specific debug counters has been moved to DP layer.

Update capture BW from RXTLV instead of VDEV
Capture BW is the bandwidth at which Station operates.

Error handling for pdev referencce count.
Add support to clear CFR ppdu counters
Use same event ENUM for HKV2 and Cypress.

Change-Id: Ic1f5da16c5c1ac5893dce1023eb57f96d78d4cfa
Adwait Nayak 5 years ago
parent
commit
412cc0e7e1

+ 5 - 2
target_if/cfr/inc/target_if_cfr.h

@@ -42,8 +42,11 @@
 
 /* Module IDs using corrlation function */
 #define CORRELATE_DBR_MODULE_ID   0
-#define CORRELATE_TX_EV_MODULE_ID 1 /* HKV2 */
-#define CORRELATE_TXRX_EV_MODULE_ID 1 /* Cypress */
+/*
+ * HKV2 - Tx completion event for one-shot capture
+ * Cypress - Tx completion event for one-shot capture (or) RXTLV event for RCC
+ */
+#define CORRELATE_TX_EV_MODULE_ID 1
 
 /**
  * target_if_cfr_init_pdev() - Inits cfr pdev and registers necessary handlers.

+ 11 - 45
target_if/cfr/src/target_if_cfr_6018.c

@@ -430,14 +430,12 @@ void extract_peer_mac_from_freeze_tlv(void *freeze_tlv, uint8_t *peermac)
 	struct macrx_freeze_capture_channel *freeze =
 		(struct macrx_freeze_capture_channel *)freeze_tlv;
 
-	if (freeze->sw_peer_id_valid) {
-		peermac[0] = freeze->packet_ta_lower_16 & 0x00FF;
-		peermac[1] = (freeze->packet_ta_lower_16 & 0xFF00) >> 8;
-		peermac[2] = freeze->packet_ta_mid_16 & 0x00FF;
-		peermac[3] = (freeze->packet_ta_mid_16 & 0xFF00) >> 8;
-		peermac[4] = freeze->packet_ta_upper_16 & 0x00FF;
-		peermac[5] = (freeze->packet_ta_upper_16 & 0xFF00) >> 8;
-	}
+	peermac[0] = freeze->packet_ta_lower_16 & 0x00FF;
+	peermac[1] = (freeze->packet_ta_lower_16 & 0xFF00) >> 8;
+	peermac[2] = freeze->packet_ta_mid_16 & 0x00FF;
+	peermac[3] = (freeze->packet_ta_mid_16 & 0xFF00) >> 8;
+	peermac[4] = freeze->packet_ta_upper_16 & 0x00FF;
+	peermac[5] = (freeze->packet_ta_upper_16 & 0xFF00) >> 8;
 }
 
 /**
@@ -489,7 +487,7 @@ int correlate_and_relay_enh(struct wlan_objmgr_pdev *pdev, uint32_t cookie,
 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 						     WLAN_UMAC_COMP_CFR);
 
-	if (module_id == CORRELATE_TXRX_EV_MODULE_ID) {
+	if (module_id == CORRELATE_TX_EV_MODULE_ID) {
 		if (lut->tx_recv)
 			pcfr->cfr_dma_aborts++;
 		lut->tx_recv = true;
@@ -590,7 +588,6 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_channel *bss_chan;
 	enum wlan_phymode ch_phymode;
-	enum phy_ch_width ch_width;
 	uint16_t ch_freq;
 	uint32_t ch_cfreq1;
 	uint32_t ch_cfreq2;
@@ -623,32 +620,9 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 
 	cdp_rx_ppdu = (struct cdp_rx_indication_ppdu *)qdf_nbuf_data(nbuf);
 	cfr_info = &cdp_rx_ppdu->cfr_info;
-	if (cfr_info->bb_captured_timeout) {
-		pcfr->bb_captured_timeout_cnt++;
-		pcfr->bb_captured_reason_cnt[cfr_info->bb_captured_reason]++;
-		goto done;
-	}
-
-
-	if (cfr_info->bb_captured_channel) {
-		pcfr->bb_captured_channel_cnt++;
-		pcfr->bb_captured_reason_cnt[cfr_info->bb_captured_reason]++;
-	} else {
-		goto done; /* HW registers have not captured FFT bins */
-	}
 
-	pcfr->chan_capture_status[cfr_info->chan_capture_status]++;
-	if (cfr_info->rx_location_info_valid) {
-		pcfr->rx_loc_info_valid_cnt++;
-	} else {
+	if (!cfr_info->bb_captured_channel)
 		goto done;
-	}
-
-	if (cfr_info->chan_capture_status != CAPTURE_ACTIVE) {
-		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
-		qdf_nbuf_free(nbuf);
-		return;
-	}
 
 	psoc = wlan_pdev_get_psoc(pdev);
 	if (qdf_unlikely(!psoc)) {
@@ -702,7 +676,6 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 	ch_cfreq1 = bss_chan->ch_cfreq1;
 	ch_cfreq2 = bss_chan->ch_cfreq2;
 	ch_phymode = bss_chan->ch_phymode;
-	ch_width = bss_chan->ch_width;
 	rx_chainmask = wlan_vdev_mlme_get_rxchainmask(vdev);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_CFR_ID);
 
@@ -723,7 +696,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 	header->Reserved               = 0;
 
 	meta->status       = 1;
-	meta->capture_bw   = ch_width;
+	meta->capture_bw   = cdp_rx_ppdu->u.bw;
 	meta->phy_mode = ch_phymode;
 	meta->prim20_chan  = ch_freq;
 	meta->center_freq1 = ch_cfreq1;
@@ -754,7 +727,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 		}
 	}
 	status = correlate_and_relay_enh(pdev, cookie, lut,
-					 CORRELATE_TXRX_EV_MODULE_ID);
+					 CORRELATE_TX_EV_MODULE_ID);
 	if (status == STATUS_STREAM_AND_RELEASE) {
 		if (cfr_rx_ops->cfr_info_send)
 			status = cfr_rx_ops->cfr_info_send(pdev,
@@ -1254,7 +1227,7 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen)
 		     HOST_MAX_CHAINS * sizeof(tx_evt_param.chain_phase[0]));
 
 	status = correlate_and_relay_enh(pdev, cookie, lut,
-					 CORRELATE_TXRX_EV_MODULE_ID);
+					 CORRELATE_TX_EV_MODULE_ID);
 	if (status == STATUS_STREAM_AND_RELEASE) {
 		if (cfr_rx_ops->cfr_info_send)
 			status = cfr_rx_ops->cfr_info_send(pdev,
@@ -1626,14 +1599,7 @@ QDF_STATUS cfr_6018_deinit_pdev(struct wlan_objmgr_psoc *psoc,
 	pcfr->flush_timeout_dbr_cnt = 0;
 	pcfr->invalid_dma_length_cnt = 0;
 	pcfr->clear_txrx_event = 0;
-	pcfr->bb_captured_channel_cnt = 0;
-	pcfr->bb_captured_timeout_cnt = 0;
-	pcfr->rx_loc_info_valid_cnt = 0;
 	pcfr->cfr_dma_aborts = 0;
-	qdf_mem_zero(&pcfr->chan_capture_status,
-		     sizeof(uint64_t) * NUM_CHAN_CAPTURE_STATUS);
-	qdf_mem_zero(&pcfr->bb_captured_reason_cnt,
-		     sizeof(uint64_t) * NUM_CHAN_CAPTURE_REASON);
 	qdf_mem_zero(&pcfr->rcc_param, sizeof(struct cfr_rcc_param));
 	qdf_mem_zero(&pcfr->global, (sizeof(struct ta_ra_cfr_cfg) *
 				     MAX_TA_RA_ENTRIES));

+ 8 - 0
umac/cfr/dispatcher/inc/wlan_cfr_ucfg_api.h

@@ -248,6 +248,14 @@ QDF_STATUS ucfg_cfr_get_cfg(struct wlan_objmgr_vdev *vdev);
  */
 QDF_STATUS ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev *vdev);
 
+/**
+ * ucfg_cfr_rcc_clr_dbg_counters() - function to clear CFR PPDU counters
+ * @vdev: pointer to vdev object
+ *
+ * Return: status
+ */
+QDF_STATUS ucfg_cfr_rcc_clr_dbg_counters(struct wlan_objmgr_vdev *vdev);
+
 /**
  * ucfg_cfr_rcc_dump_lut() - function to display lookup table
  * @vdev: pointer to vdev object

+ 0 - 41
umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h

@@ -116,24 +116,6 @@ enum cfr_capture_type {
 	CFR_TYPE_METHOD_MAX,
 };
 
-enum mac_freeze_capture_reason {
-	FREEZE_REASON_TM = 0,
-	FREEZE_REASON_FTM = 1,
-	FREEZE_REASON_ACK_RESP_TO_TM_FTM = 2,
-	FREEZE_REASON_TA_RA_TYPE_FILTER = 3,
-	FREEZE_REASON_NDPA_NDP = 4,
-	FREEZE_REASON_ALL_PACKET = 5,
-	FREEZE_REASON_MAX,
-};
-
-enum chan_capture_status {
-	CAPTURE_IDLE = 0,
-	CAPTURE_BUSY,
-	CAPTURE_ACTIVE,
-	CAPTURE_NO_BUFFER,
-	CAPTURE_MAX,
-};
-
 struct cfr_metadata_version_1 {
 	u_int8_t    peer_addr[QDF_MAC_ADDR_SIZE];
 	u_int8_t    status;
@@ -464,24 +446,6 @@ struct cfr_rcc_param {
  * lut_age_timer: Timer to flush pending TXRX/DBR events in lookup table
  * lut_timer_init: flag to determine if lut_age_timer is initialized or not
  * is_cfr_rcc_capable: Flag to determine if RCC is enabled or not.
- * bb_captured_channel_cnt: No. of PPDUs for which MAC sent Freeze TLV to PHY
- * bb_captured_timeout_cnt: No. of PPDUs for which CFR filter criteria matched
- * but MAC did not send Freeze TLV to PHY as time exceeded freeze tlv delay
- * count threshold
- * rx_loc_info_valid_cnt: No. of PPDUs for which PHY could find a valid buffer
-   in ucode IPC ring
- * chan_capture_status[]: capture status counters
- *	[0] - No. of PPDUs with capture status CAPTURE_IDLE
- *	[1] - No. of PPDUs with capture status CAPTURE_BUSY
- *	[2] - No. of PPDUs with capture status CAPTURE_ACTIVE
- *	[3] - No. of PPDUs with capture status CAPTURE_NO_BUFFER
- * bb_captured_reason_cnt[]: capture reason counters
- *	[0] - No. PPDUs filtered due to freeze_reason_TM
- *	[1] - No. PPDUs filtered due to freeze_reason_FTM
- *	[2] - No. PPDUs filtered due to freeze_reason_ACK_resp_to_TM_FTM
- *	[3] - No. PPDUs filtered due to freeze_reason_TA_RA_TYPE_FILTER
- *	[4] - No. PPDUs filtered due to freeze_reason_NDPA_NDP
- *	[5] - No. PPDUs filtered due to freeze_reason_ALL_PACKET
  * flush_dbr_cnt: No. of un-correlated DBR completions flushed when a newer PPDU
  * is correlated successfully with newer DBR completion
  * invalid_dma_length_cnt: No. of buffers for which CFR DMA header length (or)
@@ -523,11 +487,6 @@ struct pdev_cfr {
 	qdf_timer_t lut_age_timer;
 	uint8_t lut_timer_init;
 	uint8_t is_cfr_rcc_capable;
-	uint64_t bb_captured_channel_cnt;
-	uint64_t bb_captured_timeout_cnt;
-	uint64_t rx_loc_info_valid_cnt;
-	uint64_t chan_capture_status[CAPTURE_MAX];
-	uint64_t bb_captured_reason_cnt[FREEZE_REASON_MAX];
 	uint64_t flush_dbr_cnt;
 	uint64_t invalid_dma_length_cnt;
 	uint64_t flush_timeout_dbr_cnt;

+ 70 - 15
umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c

@@ -726,7 +726,7 @@ static const char *chan_capture_status_to_str(enum chan_capture_status type)
 	case CAPTURE_NO_BUFFER:
 		return "CAPTURE_NO_BUFFER";
 	default:
-		return "NONE";
+		return "INVALID";
 	}
 }
 
@@ -747,7 +747,7 @@ char *mac_freeze_reason_to_str(enum mac_freeze_capture_reason type)
 	case FREEZE_REASON_ALL_PACKET:
 		return "FREEZE_REASON_ALL_PACKET";
 	default:
-		return "NONE";
+		return "INVALID";
 	}
 }
 
@@ -755,19 +755,22 @@ QDF_STATUS ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev *vdev)
 {
 	struct pdev_cfr *pcfr = NULL;
 	struct wlan_objmgr_pdev *pdev = NULL;
-	int counter;
+	struct wlan_objmgr_psoc *psoc = NULL;
+	struct cdp_cfr_rcc_stats *cfr_rcc_stats = NULL;
+	uint8_t stats_cnt;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	status = dev_sanity_check(vdev, &pdev, &pcfr);
 	if (status != QDF_STATUS_SUCCESS)
 		return status;
 
-	cfr_err("bb_captured_channel_cnt = %llu\n",
-		pcfr->bb_captured_channel_cnt);
-	cfr_err("bb_captured_timeout_cnt = %llu\n",
-		pcfr->bb_captured_timeout_cnt);
-	cfr_err("rx_loc_info_valid_cnt = %llu\n",
-		pcfr->rx_loc_info_valid_cnt);
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		cfr_err("psoc is null!");
+		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
 	cfr_err("total_tx_evt_cnt = %llu\n",
 		pcfr->total_tx_evt_cnt);
 	cfr_err("dbr_evt_cnt = %llu\n",
@@ -789,20 +792,72 @@ QDF_STATUS ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev *vdev)
 	cfr_err("cfr_dma_aborts = %llu\n",
 		pcfr->cfr_dma_aborts);
 
+	cfr_rcc_stats = qdf_mem_malloc(sizeof(struct cdp_cfr_rcc_stats));
+	if (!cfr_rcc_stats) {
+		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
+		return QDF_STATUS_E_NOMEM;
+	}
+
+	cdp_get_cfr_dbg_stats(wlan_psoc_get_dp_handle(psoc),
+			      wlan_objmgr_pdev_get_pdev_id(pdev),
+			      cfr_rcc_stats);
+
+	cfr_err("bb_captured_channel_cnt: %llu\n",
+		cfr_rcc_stats->bb_captured_channel_cnt);
+	cfr_err("bb_captured_timeout_cnt: %llu\n",
+		cfr_rcc_stats->bb_captured_timeout_cnt);
+	cfr_err("rx_loc_info_valid_cnt: %llu\n",
+		cfr_rcc_stats->rx_loc_info_valid_cnt);
+
 	cfr_err("Channel capture status:\n");
-	for (counter = 0; counter < CAPTURE_MAX; counter++) {
+	for (stats_cnt = 0; stats_cnt < CAPTURE_MAX; stats_cnt++) {
 		cfr_err("%s = %llu\n",
-			 chan_capture_status_to_str(counter),
-			 pcfr->chan_capture_status[counter]);
+			chan_capture_status_to_str(stats_cnt),
+			cfr_rcc_stats->chan_capture_status[stats_cnt]);
 	}
 
 	cfr_err("Freeze reason:\n");
-	for (counter = 0; counter < FREEZE_REASON_MAX; counter++) {
+	for (stats_cnt = 0; stats_cnt < FREEZE_REASON_MAX; stats_cnt++) {
 		cfr_err("%s = %llu\n",
-			 mac_freeze_reason_to_str(counter),
-			 pcfr->bb_captured_reason_cnt[counter]);
+			mac_freeze_reason_to_str(stats_cnt),
+			cfr_rcc_stats->reason_cnt[stats_cnt]);
 	}
 
+	qdf_mem_free(cfr_rcc_stats);
+	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
+
+	return status;
+}
+
+QDF_STATUS ucfg_cfr_rcc_clr_dbg_counters(struct wlan_objmgr_vdev *vdev)
+{
+	struct pdev_cfr *pcfr = NULL;
+	struct wlan_objmgr_pdev *pdev = NULL;
+	struct wlan_objmgr_psoc *psoc = NULL;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	status = dev_sanity_check(vdev, &pdev, &pcfr);
+	if (status != QDF_STATUS_SUCCESS)
+		return status;
+
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		cfr_err("psoc is null!");
+		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	cdp_cfr_clr_dbg_stats(wlan_psoc_get_dp_handle(psoc),
+			      wlan_objmgr_pdev_get_pdev_id(pdev));
+
+	pcfr->dbr_evt_cnt = 0;
+	pcfr->release_cnt = 0;
+	pcfr->total_tx_evt_cnt = 0;
+	pcfr->rx_tlv_evt_cnt = 0;
+	pcfr->flush_dbr_cnt = 0;
+	pcfr->flush_timeout_dbr_cnt = 0;
+	pcfr->invalid_dma_length_cnt = 0;
+	pcfr->clear_txrx_event = 0;
+	pcfr->cfr_dma_aborts = 0;
 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
 
 	return status;