Przeglądaj źródła

qcacmn: Event Based Mechanism to Reduce Delay

Event based mechanism to reduce delay by removing sleep
while getting response from firmware

Change-Id: I9d553764127efaf06794f41c81cf646cf9dc695e
CRs-Fixed: 3233643
Amrit Sahai 3 lat temu
rodzic
commit
9c5c78e17e
3 zmienionych plików z 31 dodań i 3 usunięć
  1. 11 3
      dp/wifi3.0/dp_main.c
  2. 17 0
      dp/wifi3.0/dp_stats.c
  3. 3 0
      dp/wifi3.0/dp_types.h

+ 11 - 3
dp/wifi3.0/dp_main.c

@@ -5749,6 +5749,7 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force)
 	dp_rx_pdev_desc_pool_deinit(pdev);
 	dp_pdev_bkp_stats_detach(pdev);
 	qdf_event_destroy(&pdev->fw_peer_stats_event);
+	qdf_event_destroy(&pdev->fw_stats_event);
 	if (pdev->sojourn_buf)
 		qdf_nbuf_free(pdev->sojourn_buf);
 
@@ -10950,23 +10951,29 @@ dp_txrx_stats_publish(struct cdp_soc_t *soc, uint8_t pdev_id,
 	if (!pdev)
 		return TXRX_STATS_LEVEL_OFF;
 
+	if (pdev->pending_fw_response)
+		return TXRX_STATS_LEVEL_OFF;
+
 	dp_aggregate_pdev_stats(pdev);
+
+	pdev->pending_fw_response = true;
 	req.stats = (enum cdp_stats)HTT_DBG_EXT_STATS_PDEV_TX;
 	req.cookie_val = DBG_STATS_COOKIE_DP_STATS;
+	pdev->fw_stats_tlv_bitmap_rcvd = 0;
 	dp_h2t_ext_stats_msg_send(pdev, req.stats, req.param0,
 				req.param1, req.param2, req.param3, 0,
 				req.cookie_val, 0);
 
-	msleep(DP_MAX_SLEEP_TIME);
-
 	req.stats = (enum cdp_stats)HTT_DBG_EXT_STATS_PDEV_RX;
 	req.cookie_val = DBG_STATS_COOKIE_DP_STATS;
 	dp_h2t_ext_stats_msg_send(pdev, req.stats, req.param0,
 				req.param1, req.param2, req.param3, 0,
 				req.cookie_val, 0);
 
-	msleep(DP_MAX_SLEEP_TIME);
+	qdf_event_reset(&pdev->fw_stats_event);
+	qdf_wait_single_event(&pdev->fw_stats_event, DP_MAX_SLEEP_TIME);
 	qdf_mem_copy(buf, &pdev->stats, sizeof(struct cdp_pdev_stats));
+	pdev->pending_fw_response = false;
 
 	return TXRX_STATS_LEVEL;
 }
@@ -15897,6 +15904,7 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc,
 	qdf_mem_zero(sojourn_buf, sizeof(struct cdp_tx_sojourn_stats));
 
 	qdf_event_create(&pdev->fw_peer_stats_event);
+	qdf_event_create(&pdev->fw_stats_event);
 
 	pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx);
 

+ 17 - 0
dp/wifi3.0/dp_stats.c

@@ -32,6 +32,16 @@
 #endif
 
 #define DP_MAX_STRING_LEN 500
+#define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\
+	((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\
+	((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\
+	((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\
+	((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG))
 
 #define DP_HTT_HW_INTR_NAME_LEN  HTT_STATS_MAX_HW_INTR_NAME_LEN
 #define DP_HTT_HW_MODULE_NAME_LEN  HTT_STATS_MAX_HW_MODULE_NAME_LEN
@@ -4713,7 +4723,9 @@ void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag
 	void *dest_ptr = NULL;
 	uint32_t size = 0;
 	uint32_t size_expected = 0;
+	uint64_t val = 1;
 
+	pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
 	switch (tag_type) {
 	case HTT_STATS_TX_PDEV_CMN_TAG:
 		dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
@@ -4786,6 +4798,11 @@ void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag
 
 	if (dest_ptr)
 		qdf_mem_copy(dest_ptr, tag_buf, size_expected);
+
+	if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
+	      == DP_HTT_TX_RX_EXPECTED_TLVS) {
+		qdf_event_set(&pdev->fw_stats_event);
+	}
 }
 
 #ifdef VDEV_PEER_PROTOCOL_COUNT

+ 3 - 0
dp/wifi3.0/dp_types.h

@@ -2944,6 +2944,7 @@ struct dp_pdev {
 
 	/* qdf_event for fw_peer_stats */
 	qdf_event_t fw_peer_stats_event;
+	qdf_event_t fw_stats_event;
 
 	/* User configured max number of tx buffers */
 	uint32_t num_tx_allowed;
@@ -3026,6 +3027,8 @@ struct dp_pdev {
 	ol_txrx_pktdump_cb dp_tx_packetdump_cb;
 	ol_txrx_pktdump_cb dp_rx_packetdump_cb;
 #endif
+	uint64_t fw_stats_tlv_bitmap_rcvd;
+	bool pending_fw_response;
 };
 
 struct dp_peer;