diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index e2fb8d21fe..eb2a97713e 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -4466,7 +4466,7 @@ dp_offload_ind_handler(struct htt_soc *soc, uint32_t *msg_word) pdev_id = dp_get_host_pdev_id_for_target_pdev_id(soc->dp_soc, target_pdev_id); dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_OFFLOAD_TX_DATA, soc->dp_soc, - msg_word, HTT_INVALID_PEER, WDI_NO_VAL, + msg_word, HTT_INVALID_VDEV, WDI_NO_VAL, pdev_id); } #else diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index c36673d03d..9d037fe124 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -2218,12 +2218,40 @@ static inline void dp_rx_update_stats(struct dp_soc *soc, * This function is used to deliver rx packet to packet capture */ void dp_rx_deliver_to_pkt_capture(struct dp_soc *soc, struct dp_pdev *pdev, - uint16_t peer_id, uint32_t ppdu_id, + uint16_t peer_id, uint32_t is_offload, qdf_nbuf_t netbuf) { dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_RX_DATA, soc, netbuf, - peer_id, WDI_NO_VAL, pdev->pdev_id); + peer_id, is_offload, pdev->pdev_id); } + +void dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf, + uint32_t is_offload) +{ + uint16_t msdu_len = 0; + uint16_t peer_id, vdev_id; + uint32_t pkt_len = 0; + uint8_t *rx_tlv_hdr; + uint32_t l2_hdr_offset = 0; + struct hal_rx_msdu_metadata msdu_metadata; + + peer_id = QDF_NBUF_CB_RX_PEER_ID(nbuf); + vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf); + rx_tlv_hdr = qdf_nbuf_data(nbuf); + hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, &msdu_metadata); + msdu_len = QDF_NBUF_CB_RX_PKT_LEN(nbuf); + pkt_len = msdu_len + msdu_metadata.l3_hdr_pad + + RX_PKT_TLVS_LEN; + l2_hdr_offset = + hal_rx_msdu_end_l3_hdr_padding_get(soc->hal_soc, rx_tlv_hdr); + + qdf_nbuf_set_pktlen(nbuf, pkt_len); + dp_rx_skip_tlvs(nbuf, msdu_metadata.l3_hdr_pad); + + dp_wdi_event_handler(WDI_EVENT_PKT_CAPTURE_RX_DATA, soc, nbuf, + HTT_INVALID_VDEV, is_offload, 0); +} + #endif /** @@ -2287,6 +2315,7 @@ uint32_t dp_rx_process(struct dp_intr *int_ctx, hal_ring_handle_t hal_ring_hdl, QDF_STATUS status; qdf_nbuf_t ebuf_head; qdf_nbuf_t ebuf_tail; + uint8_t pkt_capture_offload = 0; DP_HIST_INIT(); @@ -2482,6 +2511,10 @@ more_data: QDF_NBUF_CB_RX_VDEV_ID(rx_desc->nbuf) = DP_PEER_METADATA_VDEV_ID_GET(peer_mdata); + /* to indicate whether this msdu is rx offload */ + pkt_capture_offload = + DP_PEER_METADATA_OFFLOAD_GET(peer_mdata); + /* * save msdu flags first, last and continuation msdu in * nbuf->cb, also save mcbc, is_da_valid, is_sa_valid and @@ -2656,7 +2689,10 @@ done: } else { nbuf->next = NULL; - dp_rx_deliver_to_stack_no_peer(soc, nbuf); + dp_rx_deliver_to_pkt_capture_no_peer( + soc, nbuf, pkt_capture_offload); + if (!pkt_capture_offload) + dp_rx_deliver_to_stack_no_peer(soc, nbuf); nbuf = next; continue; } @@ -2899,10 +2935,12 @@ done: if (qdf_likely(deliver_list_head)) { if (qdf_likely(peer)) { dp_rx_deliver_to_pkt_capture(soc, vdev->pdev, peer_id, - 0, deliver_list_head); - dp_rx_deliver_to_stack(soc, vdev, peer, - deliver_list_head, - deliver_list_tail); + pkt_capture_offload, + deliver_list_head); + if (!pkt_capture_offload) + dp_rx_deliver_to_stack(soc, vdev, peer, + deliver_list_head, + deliver_list_tail); } else { nbuf = deliver_list_head; diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 5b17227a07..763df884dd 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -51,6 +51,9 @@ #define DP_PEER_METADATA_PEER_ID_SHIFT 0 #define DP_PEER_METADATA_VDEV_ID_MASK 0x003f0000 #define DP_PEER_METADATA_VDEV_ID_SHIFT 16 +#define DP_PEER_METADATA_OFFLOAD_MASK 0x01000000 +#define DP_PEER_METADATA_OFFLOAD_SHIFT 24 + #define DP_DEFAULT_NOISEFLOOR (-96) @@ -62,6 +65,10 @@ (((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK) \ >> DP_PEER_METADATA_VDEV_ID_SHIFT) +#define DP_PEER_METADATA_OFFLOAD_GET(_peer_metadata) \ + (((_peer_metadata) & DP_PEER_METADATA_OFFLOAD_MASK) \ + >> DP_PEER_METADATA_OFFLOAD_SHIFT) + #define DP_RX_DESC_MAGIC 0xdec0de #define dp_rx_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_RX, params) @@ -1625,14 +1632,22 @@ void dp_rx_link_desc_refill_duplicate_check( * This function is used to deliver rx packet to packet capture */ void dp_rx_deliver_to_pkt_capture(struct dp_soc *soc, struct dp_pdev *pdev, - uint16_t peer_id, uint32_t ppdu_id, + uint16_t peer_id, uint32_t is_offload, qdf_nbuf_t netbuf); +void dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf, + uint32_t is_offload); #else static inline void dp_rx_deliver_to_pkt_capture(struct dp_soc *soc, struct dp_pdev *pdev, - uint16_t peer_id, uint32_t ppdu_id, + uint16_t peer_id, uint32_t is_offload, qdf_nbuf_t netbuf) { } + +static inline void +dp_rx_deliver_to_pkt_capture_no_peer(struct dp_soc *soc, qdf_nbuf_t nbuf, + uint32_t is_offload) +{ +} #endif #endif /* _DP_RX_H */