Przeglądaj źródła

qcacmn: Add support trap protocol tagged packets for trigger

Add support to trap protocol tagged packets for the unique
metadata to send it as trigger to standby application

Change-Id: I76644477d1df2a0851472283623c1dc3dbe19b8b
CRs-Fixed: 3608436
Surya Prakash Raajen 1 rok temu
rodzic
commit
06a7a53dde
3 zmienionych plików z 27 dodań i 0 usunięć
  1. 3 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 4 0
      dp/inc/cdp_txrx_ops.h
  3. 20 0
      dp/wifi3.0/dp_rx_err.c

+ 3 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -69,6 +69,9 @@
 /* Invalid vdev_stats_id */
 #define CDP_INVALID_VDEV_STATS_ID 0xFF
 
+/* METADATA used for wakeup triggers, specifically for Standby modes */
+#define CDP_STANDBY_METADATA 5588
+
 /* Options for Dump Statistics */
 #define CDP_HDD_STATS               0
 #define CDP_TXRX_PATH_STATS         1

+ 4 - 0
dp/inc/cdp_txrx_ops.h

@@ -1674,6 +1674,10 @@ struct ol_if_ops {
 	int (*dp_rx_get_pending)(ol_txrx_soc_handle soc);
 	void (*dp_rx_sched_refill_thread)(ol_txrx_soc_handle soc);
 	/* TODO: Add any other control path calls required to OL_IF/WMA layer */
+#ifdef WLAN_SUPPORT_RX_FLOW_TAG
+	void (*send_wakeup_trigger)(struct cdp_ctrl_objmgr_psoc *soc,
+				    uint8_t vdev_id);
+#endif
 #ifdef QCA_SUPPORT_WDS_EXTENDED
 	void (*rx_wds_ext_peer_learn)(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 				      uint16_t peer_id, uint8_t vdev_id,

+ 20 - 0
dp/wifi3.0/dp_rx_err.c

@@ -1567,6 +1567,22 @@ fail:
 	return;
 }
 
+#ifdef WLAN_SUPPORT_RX_FLOW_TAG
+static void dp_rx_peek_trapped_packet(struct dp_soc *soc,
+				      struct dp_vdev *vdev)
+{
+	if (soc->cdp_soc.ol_ops->send_wakeup_trigger)
+		soc->cdp_soc.ol_ops->send_wakeup_trigger(soc->ctrl_psoc,
+				vdev->vdev_id);
+}
+#else
+static void dp_rx_peek_trapped_packet(struct dp_soc *soc,
+				      struct dp_vdev *vdev)
+{
+	return;
+}
+#endif
+
 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) && \
 	defined(WLAN_MCAST_MLO)
 static bool dp_rx_igmp_handler(struct dp_soc *soc,
@@ -1684,6 +1700,10 @@ dp_rx_err_route_hdl(struct dp_soc *soc, qdf_nbuf_t nbuf,
 		qdf_nbuf_pull_head(nbuf, (msdu_metadata.l3_hdr_pad +
 				   soc->rx_pkt_tlv_size));
 
+	if (hal_rx_msdu_cce_metadata_get(soc->hal_soc, rx_tlv_hdr) ==
+			CDP_STANDBY_METADATA)
+		dp_rx_peek_trapped_packet(soc, vdev);
+
 	QDF_NBUF_CB_RX_PEER_ID(nbuf) = txrx_peer->peer_id;
 	if (dp_rx_igmp_handler(soc, vdev, txrx_peer, nbuf, link_id))
 		return;