Browse Source

Merge "qca-wifi: CFR: Introduction of new flag to enable RCC"

Linux Build Service Account 5 years ago
parent
commit
962957f5b6

+ 2 - 2
target_if/cfr/inc/target_if_cfr_6018.h

@@ -59,8 +59,8 @@
 
 #define CYP_MAX_HEADER_LENGTH_WORDS 16
 
-/* Max(2048, 16016, 10240) */
-#define CYP_MAX_DATA_LENGTH_BYTES 16016
+/* payload_len = Max(2048, 16016, 10240) = 16064 (64-bit alignment) */
+#define CYP_MAX_DATA_LENGTH_BYTES 16064
 
 /* in ms */
 #define LUT_AGE_TIMER 3000

+ 25 - 76
target_if/cfr/src/target_if_cfr_6018.c

@@ -170,60 +170,6 @@ void cfr_free_pending_dbr_events(struct wlan_objmgr_pdev *pdev)
 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
 }
 
-/**
- * cfr_free_all_lut_entries() - Flush all pending DBR and TXRX events.
- * @pdev: objmgr pdev
- *
- * return: none
- */
-void cfr_free_all_lut_entries(struct wlan_objmgr_pdev *pdev)
-{
-	struct pdev_cfr *pcfr;
-	struct look_up_table *lut = NULL;
-	int i = 0;
-	QDF_STATUS retval = 0;
-	qdf_dma_addr_t buf_addr = 0, buf_addr_temp = 0;
-
-	retval = wlan_objmgr_pdev_try_get_ref(pdev, WLAN_CFR_ID);
-	if (retval != QDF_STATUS_SUCCESS) {
-		cfr_err("failed to get pdev reference");
-		return;
-	}
-
-	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
-						     WLAN_UMAC_COMP_CFR);
-	if (!pcfr) {
-		cfr_err("pdev object for CFR is null");
-		wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
-		return;
-	}
-
-	for (i = 0; i < NUM_LUT_ENTRIES; i++) {
-		lut = get_lut_entry(pcfr, i);
-		if (!lut)
-			continue;
-
-		if (lut->dbr_recv && !lut->tx_recv) {
-			target_if_dbr_buf_release(pdev, DBR_MODULE_CFR,
-						  lut->dbr_address,
-						  i, 0);
-			pcfr->flush_all_dbr_cnt++;
-			release_lut_entry_enh(pdev, lut);
-		} else if (lut->tx_recv && !lut->dbr_recv) {
-			buf_addr_temp = (lut->tx_address2 & 0x0f);
-			buf_addr = (lut->tx_address1
-				    | ((uint64_t)buf_addr_temp << 32));
-			target_if_dbr_buf_release(pdev,
-						  DBR_MODULE_CFR,
-						  buf_addr,
-						  i, 0);
-			pcfr->flush_all_txrx_cnt++;
-			release_lut_entry_enh(pdev, lut);
-		}
-	}
-	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
-}
-
 /**
  * dump_freeze_tlv() - Dump freeze TLV sent in enhanced DMA header
  * @freeze_tlv: Freeze TLV sent from MAC to PHY
@@ -544,6 +490,8 @@ int correlate_and_relay_enh(struct wlan_objmgr_pdev *pdev, uint32_t cookie,
 						     WLAN_UMAC_COMP_CFR);
 
 	if (module_id == CORRELATE_TXRX_EV_MODULE_ID) {
+		if (lut->tx_recv)
+			pcfr->cfr_dma_aborts++;
 		lut->tx_recv = true;
 	} else if (module_id == CORRELATE_DBR_MODULE_ID) {
 		pcfr->dbr_evt_cnt++;
@@ -584,8 +532,13 @@ int correlate_and_relay_enh(struct wlan_objmgr_pdev *pdev, uint32_t cookie,
 				pcfr->invalid_dma_length_cnt++;
 				cfr_err("<CORRELATE><%u>:CFR buffers "
 					"received with invalid length "
-					"length : ppdu_id:0x%04x\n",
-					cookie, lut->tx_ppdu_id);
+					"header_length_words = %d "
+					"cfr_payload_length_bytes = %d "
+					"ppdu_id:0x%04x\n",
+					cookie,
+					lut->header_length,
+					lut->payload_length,
+					lut->tx_ppdu_id);
 				/*
 				 * Assert here as length exceeding the allowed
 				 * limit would anyway manifest as random crash
@@ -606,6 +559,7 @@ int correlate_and_relay_enh(struct wlan_objmgr_pdev *pdev, uint32_t cookie,
 			lut->tx_recv = false;
 			lut->tx_ppdu_id = 0;
 			pcfr->clear_txrx_event++;
+			pcfr->cfr_dma_aborts++;
 			status = STATUS_HOLD;
 		}
 	} else {
@@ -739,7 +693,7 @@ void target_if_cfr_rx_tlv_process(struct wlan_objmgr_pdev *pdev, void *nbuf)
 
 	vdev = wlan_objmgr_pdev_get_first_vdev(pdev, WLAN_CFR_ID);
 	if (qdf_unlikely(!vdev)) {
-		cfr_err("vdev is null\n");
+		cfr_debug("vdev is null\n");
 		goto done;
 	}
 
@@ -1253,6 +1207,7 @@ target_if_peer_capture_event(ol_scn_t sc, uint8_t *data, uint32_t datalen)
 	}
 
 	pcfr->tx_evt_cnt++;
+	pcfr->total_tx_evt_cnt++;
 
 	lut->tx_ppdu_id = (tx_evt_param.correlation_info_2 >> 16);
 	lut->tx_address1 = tx_evt_param.correlation_info_1;
@@ -1444,7 +1399,7 @@ static os_timer_func(lut_ageout_timer_task)
 		if (lut->dbr_recv && !lut->tx_recv) {
 			diff = cur_tstamp - lut->dbr_tstamp;
 			if (diff > LUT_AGE_THRESHOLD) {
-				cfr_err("<%d>TXRX event not received for "
+				cfr_debug("<%d>TXRX event not received for "
 					"%llu ms, release lut entry : "
 					"dma_addr = 0x%pK\n", i, diff,
 					(void *)((uintptr_t)lut->dbr_address));
@@ -1457,6 +1412,8 @@ static os_timer_func(lut_ageout_timer_task)
 		}
 	}
 
+	if (pcfr->lut_timer_init)
+		qdf_timer_mod(&pcfr->lut_age_timer, LUT_AGE_TIMER);
 	wlan_objmgr_pdev_release_ref(pdev, WLAN_CFR_ID);
 }
 
@@ -1474,7 +1431,9 @@ QDF_STATUS target_if_cfr_start_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 						     WLAN_UMAC_COMP_CFR);
 
-	qdf_timer_mod(&pcfr->lut_age_timer, LUT_AGE_TIMER);
+	if (pcfr->lut_timer_init)
+		qdf_timer_mod(&pcfr->lut_age_timer, LUT_AGE_TIMER);
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -1492,7 +1451,9 @@ QDF_STATUS target_if_cfr_stop_lut_age_timer(struct wlan_objmgr_pdev *pdev)
 	pcfr = wlan_objmgr_pdev_get_comp_private_obj(pdev,
 						     WLAN_UMAC_COMP_CFR);
 
-	qdf_timer_stop(&pcfr->lut_age_timer);
+	if (pcfr->lut_timer_init)
+		qdf_timer_stop(&pcfr->lut_age_timer);
+
 	return QDF_STATUS_SUCCESS;
 }
 
@@ -1535,6 +1496,7 @@ QDF_STATUS cfr_6018_init_pdev(struct wlan_objmgr_psoc *psoc,
 		return status;
 	}
 
+	pcfr->is_cfr_rcc_capable = 1;
 	pcfr->rcc_param.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
 	pcfr->rcc_param.modified_in_curr_session = MAX_RESET_CFG_ENTRY;
 	pcfr->rcc_param.num_grp_tlvs = MAX_TA_RA_ENTRIES;
@@ -1561,14 +1523,6 @@ QDF_STATUS cfr_6018_init_pdev(struct wlan_objmgr_psoc *psoc,
 		pcfr->lut_timer_init = 1;
 	}
 
-	pcfr->cfr_data_subscriber = (wdi_event_subscribe *)
-		qdf_mem_malloc(sizeof(wdi_event_subscribe));
-	if (!pcfr->cfr_data_subscriber) {
-		cfr_err("Failed to alloc cfr_data_subscriber object\n");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
-
 	return status;
 }
 
@@ -1593,6 +1547,7 @@ QDF_STATUS cfr_6018_deinit_pdev(struct wlan_objmgr_psoc *psoc,
 	}
 
 	if (pcfr->lut_timer_init) {
+		qdf_timer_stop(&pcfr->lut_age_timer);
 		qdf_timer_free(&(pcfr->lut_age_timer));
 		pcfr->lut_timer_init = 0;
 	}
@@ -1600,16 +1555,16 @@ QDF_STATUS cfr_6018_deinit_pdev(struct wlan_objmgr_psoc *psoc,
 	pcfr->tx_evt_cnt = 0;
 	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_all_dbr_cnt = 0;
-	pcfr->flush_all_txrx_cnt = 0;
 	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,
@@ -1628,11 +1583,5 @@ QDF_STATUS cfr_6018_deinit_pdev(struct wlan_objmgr_psoc *psoc,
 	if (status != QDF_STATUS_SUCCESS)
 		cfr_err("Failed to register with dbr");
 
-	if (pcfr->cfr_data_subscriber) {
-		qdf_mem_free(pcfr->cfr_data_subscriber);
-		pcfr->cfr_data_subscriber = NULL;
-	}
-
-
 	return status;
 }

+ 29 - 6
umac/cfr/dispatcher/inc/wlan_cfr_utils_api.h

@@ -444,10 +444,26 @@ struct cfr_rcc_param {
  * pdev_obj: pointer to pdev object
  * is_cfr_capable: flag to determine if cfr is enabled or not
  * cfr_timer_enable: flag to enable/disable timer
+ * cfr_mem_chunk: Region of memory used for storing cfr data
+ * cfr_max_sta_count: Maximum stations supported in one-shot capture mode
+ * num_subbufs: No. of sub-buffers used in relayfs
+ * subbuf_size: Size of sub-buffer used in relayfs
+ * chan_ptr: Channel in relayfs
+ * dir_ptr: Parent directory of relayfs file
+ * lut: lookup table used to store asynchronous DBR and TX/RX events for
+ * correlation
+ * dbr_buf_size: Size of DBR completion buffer
+ * dbr_num_bufs: No. of DBR completions
+ * tx_evt_cnt: No. of TX completion events till CFR stop was issued
+ * total_tx_evt_cnt: No. of Tx completion events since wifi was up
+ * dbr_evt_cnt: No. of WMI DBR completion events
+ * release_cnt: No. of CFR data buffers relayed to userspace
+ * rcc_param: Structure to store CFR config for the current commit session
+ * global: Structure to store accumulated CFR config
  * rx_tlv_evt_cnt: Number of CFR WDI events from datapath
  * 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
- * cfr_data_subscriber: CFR WDI subscriber object
+ * 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
@@ -466,10 +482,17 @@ struct cfr_rcc_param {
  *	[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
- * release_err_cnt: No. of lookup table entries freed due to invalid CFR data
- * length
+ * 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)
+ * data length was invalid
+ * flush_timeout_dbr_cnt: No. of DBR completion flushed out in ageout logic
+ * clear_txrx_event: No. of PPDU status TLVs over-written in LUT
+ * unassoc_pool: Pool of un-associated clients used when capture method is
+ * CFR_CAPTURE_METHOD_PROBE_RESPONSE
  * last_success_tstamp: DBR timestamp which indicates that both DBR and TX/RX
  * events have been received successfully.
+ * cfr_dma_aborts: No. of CFR DMA aborts in ucode
  */
 /*
  * To be extended if we get more capbality info
@@ -490,6 +513,7 @@ struct pdev_cfr {
 	uint32_t dbr_buf_size;
 	uint32_t dbr_num_bufs;
 	uint64_t tx_evt_cnt;
+	uint64_t total_tx_evt_cnt;
 	uint64_t dbr_evt_cnt;
 	uint64_t release_cnt;
 #ifdef WLAN_ENH_CFR_ENABLE
@@ -498,19 +522,18 @@ struct pdev_cfr {
 	uint64_t rx_tlv_evt_cnt;
 	qdf_timer_t lut_age_timer;
 	uint8_t lut_timer_init;
-	void *cfr_data_subscriber;
+	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 flush_all_dbr_cnt;
-	uint64_t flush_all_txrx_cnt;
 	uint64_t invalid_dma_length_cnt;
 	uint64_t flush_timeout_dbr_cnt;
 	uint64_t clear_txrx_event;
 	uint64_t last_success_tstamp;
+	uint64_t cfr_dma_aborts;
 #endif
 	struct unassoc_pool_entry unassoc_pool[MAX_CFR_ENABLED_CLIENTS];
 };

+ 28 - 19
umac/cfr/dispatcher/src/wlan_cfr_ucfg_api.c

@@ -312,7 +312,7 @@ QDF_STATUS dev_sanity_check(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	if (!(*ppcfr)->is_cfr_capable) {
+	if (!(*ppcfr)->is_cfr_rcc_capable) {
 		cfr_err("cfr is not supported on this chip\n");
 		wlan_objmgr_pdev_release_ref(*ppdev, WLAN_CFR_ID);
 		return QDF_STATUS_E_NOSUPPORT;
@@ -800,33 +800,31 @@ QDF_STATUS ucfg_cfr_rcc_dump_dbg_counters(struct wlan_objmgr_vdev *vdev)
 		return status;
 
 	cfr_err("bb_captured_channel_cnt = %llu\n",
-		 pcfr->bb_captured_channel_cnt);
+		pcfr->bb_captured_channel_cnt);
 	cfr_err("bb_captured_timeout_cnt = %llu\n",
-		 pcfr->bb_captured_timeout_cnt);
+		pcfr->bb_captured_timeout_cnt);
 	cfr_err("rx_loc_info_valid_cnt = %llu\n",
-		 pcfr->rx_loc_info_valid_cnt);
-	cfr_err("tx_evt_cnt = %llu\n",
-		 pcfr->tx_evt_cnt);
+		pcfr->rx_loc_info_valid_cnt);
+	cfr_err("total_tx_evt_cnt = %llu\n",
+		pcfr->total_tx_evt_cnt);
 	cfr_err("dbr_evt_cnt = %llu\n",
-		 pcfr->dbr_evt_cnt);
+		pcfr->dbr_evt_cnt);
 	cfr_err("rx_tlv_evt_cnt = %llu\n",
-		 pcfr->rx_tlv_evt_cnt);
+		pcfr->rx_tlv_evt_cnt);
 	cfr_err("release_cnt = %llu\n",
-		 pcfr->release_cnt);
+		pcfr->release_cnt);
 	cfr_err("Error cnt:\n");
 	cfr_err("flush_dbr_cnt = %llu\n",
-		 pcfr->flush_dbr_cnt);
+		pcfr->flush_dbr_cnt);
 	cfr_err("invalid_dma_length_cnt = %llu\n",
-		 pcfr->invalid_dma_length_cnt);
-	cfr_err("flush_all_dbr_cnt = %llu\n",
-		 pcfr->flush_all_dbr_cnt);
-	cfr_err("flush_all_txrx_cnt = %llu\n",
-		 pcfr->flush_all_txrx_cnt);
+		pcfr->invalid_dma_length_cnt);
 	cfr_err("flush_timeout_dbr_cnt = %llu\n",
-		 pcfr->flush_timeout_dbr_cnt);
+		pcfr->flush_timeout_dbr_cnt);
 	cfr_err("PPDU id mismatch for same cookie:\n");
 	cfr_err("clear_txrx_event = %llu\n",
-		 pcfr->clear_txrx_event);
+		pcfr->clear_txrx_event);
+	cfr_err("cfr_dma_aborts = %llu\n",
+		pcfr->cfr_dma_aborts);
 
 	cfr_err("Channel capture status:\n");
 	for (counter = 0; counter < CAPTURE_MAX; counter++) {
@@ -919,6 +917,7 @@ QDF_STATUS ucfg_cfr_committed_rcc_config(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;
 	struct cdp_monitor_filter filter_val = {0};
 
@@ -926,6 +925,12 @@ QDF_STATUS ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev *vdev)
 	if (status != QDF_STATUS_SUCCESS)
 		return status;
 
+	psoc = wlan_pdev_get_psoc(pdev);
+
+	if (!psoc) {
+		cfr_err("psoc is null!");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
 	/*
 	 * If capture mode is valid, then Host:
 	 * Subscribes for PPDU status TLVs in monitor status ring.
@@ -990,11 +995,15 @@ QDF_STATUS ucfg_cfr_committed_rcc_config(struct wlan_objmgr_vdev *vdev)
 			filter_val.fp_ctrl |= FILTER_CTRL_VHT_NDP;
 		}
 
+		if (!cdp_get_cfr_rcc(wlan_psoc_get_dp_handle(psoc),
+				    wlan_objmgr_pdev_get_pdev_id(pdev)))
+			tgt_cfr_start_lut_age_timer(pdev);
 		cfr_set_filter(pdev, 1, &filter_val);
-		tgt_cfr_start_lut_age_timer(pdev);
 	} else {
+		if (cdp_get_cfr_rcc(wlan_psoc_get_dp_handle(psoc),
+				    wlan_objmgr_pdev_get_pdev_id(pdev)))
+			tgt_cfr_stop_lut_age_timer(pdev);
 		cfr_set_filter(pdev, 0, &filter_val);
-		tgt_cfr_stop_lut_age_timer(pdev);
 	}
 
 	/* Trigger wmi to start the TLV processing. */