Prechádzať zdrojové kódy

qcacmn: FR65980: Add MLO timestamp support for pktlog

Whenever firmware receives the sync interrupt, it would
update the MLO offset to the scratch registers. Additionally,
firmware also sends a HTT message.

The values from the HTT message are copied into two structures:
1. into the dp_pdev structure, for monitor mode usage
2. into the scn structure for updating the pktlog header
    A new WDI event is introduced for MLO timestamp sync into
    pktlog header. Host sends the WDI event once it receives
    htt msg and the data gets parsed in the pktlog handler and
    eventually pktlog header gets updated with those values.

Whenever pktlog memory is being filled, the latest value from scn
structure is filled into the pktlog header. Upon receiving a new
HTT message, the value in the scn structure is updated and
subsequently into the pktlog records as well. All the 8 bytes
from the HTT message are required to calculate the MLO timestamp
offset. The calculation of MLO timestamp offset is to be taken
care by the PKTLOG parsing script.

Change-Id: If1d40b4a889e58b358f0feae692958bca2b8e1de
CRs-Fixed: 3074184
Adwait Nayak 3 rokov pred
rodič
commit
c96961a186
3 zmenil súbory, kde vykonal 112 pridanie a 0 odobranie
  1. 3 0
      dp/inc/cdp_txrx_stats_struct.h
  2. 67 0
      dp/wifi3.0/dp_htt.c
  3. 42 0
      dp/wifi3.0/dp_types.h

+ 3 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -569,6 +569,9 @@ enum WDI_EVENT {
 	WDI_EVENT_HOST_SW_EVENT,
 #ifdef QCA_WIFI_QCN9224
 	WDI_EVENT_HYBRID_TX,
+#ifdef WLAN_FEATURE_11BE_MLO
+	WDI_EVENT_MLO_TSTMP,
+#endif
 #endif
 	/* End of new event items */
 	WDI_EVENT_LAST

+ 67 - 0
dp/wifi3.0/dp_htt.c

@@ -2567,6 +2567,61 @@ static void dp_htt_mlo_peer_unmap_handler(struct htt_soc *soc,
 	mlo_peer_id = HTT_RX_MLO_PEER_UNMAP_MLO_PEER_ID_GET(*msg_word);
 	dp_rx_mlo_peer_unmap_handler(soc->dp_soc, mlo_peer_id);
 }
+
+static void
+dp_rx_mlo_timestamp_ind_handler(struct dp_soc *soc,
+				uint32_t *msg_word)
+{
+	uint8_t pdev_id;
+	uint8_t target_pdev_id;
+	struct dp_pdev *pdev;
+
+	if (!soc)
+		return;
+
+	target_pdev_id = HTT_T2H_MLO_TIMESTAMP_OFFSET_PDEV_ID_GET(*msg_word);
+	pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc,
+							 target_pdev_id);
+
+	if (pdev_id >= MAX_PDEV_CNT) {
+		dp_htt_debug("%pK: pdev id %d is invalid", soc, pdev_id);
+		return;
+	}
+
+	pdev = (struct dp_pdev *)soc->pdev_list[pdev_id];
+
+	if (!pdev) {
+		dp_err("Invalid pdev");
+		return;
+	}
+	dp_wdi_event_handler(WDI_EVENT_MLO_TSTMP, soc,
+			     msg_word, HTT_INVALID_PEER, WDI_NO_VAL,
+			     pdev_id);
+
+	qdf_spin_lock_bh(&soc->htt_stats.lock);
+	pdev->timestamp.msg_type =
+		HTT_T2H_MLO_TIMESTAMP_OFFSET_MSG_TYPE_GET(*msg_word);
+	pdev->timestamp.pdev_id = pdev_id;
+	pdev->timestamp.chip_id =
+		HTT_T2H_MLO_TIMESTAMP_OFFSET_CHIP_ID_GET(*msg_word);
+	pdev->timestamp.mac_clk_freq =
+		HTT_T2H_MLO_TIMESTAMP_OFFSET_MAC_CLK_FREQ_MHZ_GET(*msg_word);
+	pdev->timestamp.sync_tstmp_lo_us = *(msg_word + 1);
+	pdev->timestamp.sync_tstmp_hi_us = *(msg_word + 2);
+	pdev->timestamp.mlo_offset_lo_us = *(msg_word + 3);
+	pdev->timestamp.mlo_offset_hi_us = *(msg_word + 4);
+	pdev->timestamp.mlo_offset_clks  = *(msg_word + 5);
+	pdev->timestamp.mlo_comp_us =
+	HTT_T2H_MLO_TIMESTAMP_OFFSET_MLO_TIMESTAMP_COMP_US_GET(
+							*(msg_word + 6));
+	pdev->timestamp.mlo_comp_clks =
+	HTT_T2H_MLO_TIMESTAMP_OFFSET_MLO_TIMESTAMP_COMP_CLKS_GET(
+							*(msg_word + 6));
+	pdev->timestamp.mlo_comp_timer =
+	HTT_T2H_MLO_TIMESTAMP_OFFSET_MLO_TIMESTAMP_COMP_PERIOD_US_GET(
+							*(msg_word + 7));
+	qdf_spin_unlock_bh(&soc->htt_stats.lock);
+}
 #else
 static void dp_htt_mlo_peer_map_handler(struct htt_soc *soc,
 					uint32_t *msg_word)
@@ -2579,6 +2634,13 @@ static void dp_htt_mlo_peer_unmap_handler(struct htt_soc *soc,
 {
 	qdf_assert_always(0);
 }
+
+static void
+dp_rx_mlo_timestamp_ind_handler(void *soc_handle,
+				uint32_t *msg_word)
+{
+	qdf_assert_always(0);
+}
 #endif
 
 /*
@@ -2985,6 +3047,11 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
 		dp_htt_mlo_peer_unmap_handler(soc, msg_word);
 		break;
 	}
+	case HTT_T2H_MSG_TYPE_MLO_TIMESTAMP_OFFSET_IND:
+	{
+		dp_rx_mlo_timestamp_ind_handler(soc->dp_soc, msg_word);
+		break;
+	}
 	default:
 		break;
 	};

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

@@ -2488,6 +2488,45 @@ struct dp_soc_srngs_state {
 	TAILQ_ENTRY(dp_soc_srngs_state) list_elem;
 };
 
+#if defined(QCA_WIFI_QCN9224) && defined(WLAN_FEATURE_11BE_MLO)
+/* struct dp_mlo_sync_timestamp - PDEV level data structure for storing
+ * MLO timestamp received via HTT msg.
+ * msg_type: This would be set to HTT_T2H_MSG_TYPE_MLO_TIMESTAMP_OFFSET_IND
+ * pdev_id: pdev_id
+ * chip_id: chip_id
+ * mac_clk_freq: mac clock frequency of the mac HW block in MHz
+ * sync_tstmp_lo_us: lower 32 bits of the WLAN global time stamp (in us) at
+ *                   which last sync interrupt was received
+ * sync_tstmp_hi_us: upper 32 bits of the WLAN global time stamp (in us) at
+ *                   which last sync interrupt was received
+ * mlo_offset_lo_us: lower 32 bits of the MLO time stamp offset in us
+ * mlo_offset_hi_us: upper 32 bits of the MLO time stamp offset in us
+ * mlo_offset_clks:  MLO time stamp offset in clock ticks for sub us
+ * mlo_comp_us:      MLO time stamp compensation applied in us
+ * mlo_comp_clks:    MLO time stamp compensation applied in clock ticks
+ *                   for sub us resolution
+ * mlo_comp_timer:   period of MLO compensation timer at which compensation
+ *                   is applied, in us
+ */
+struct dp_mlo_sync_timestamp {
+	uint32_t msg_type:8,
+		 pdev_id:2,
+		 chip_id:2,
+		 rsvd1:4,
+		 mac_clk_freq:16;
+	uint32_t sync_tstmp_lo_us;
+	uint32_t sync_tstmp_hi_us;
+	uint32_t mlo_offset_lo_us;
+	uint32_t mlo_offset_hi_us;
+	uint32_t mlo_offset_clks;
+	uint32_t mlo_comp_us:16,
+		 mlo_comp_clks:10,
+		 rsvd2:6;
+	uint32_t mlo_comp_timer:22,
+		 rsvd3:10;
+};
+#endif
+
 /* PDEV level structure for data path */
 struct dp_pdev {
 	/**
@@ -2728,6 +2767,9 @@ struct dp_pdev {
 #ifdef WIFI_MONITOR_SUPPORT
 	struct dp_mon_pdev *monitor_pdev;
 #endif
+#if defined(QCA_WIFI_QCN9224) && defined(WLAN_FEATURE_11BE_MLO)
+	struct dp_mlo_sync_timestamp timestamp;
+#endif
 };
 
 struct dp_peer;