diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c index c7f2f86d07..3d06e89a5b 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_1.0.c @@ -1271,6 +1271,7 @@ struct dp_mon_ops monitor_ops_1_0 = { .mon_filter_reset_tx_mon_mode = NULL, .rx_mon_filter_update = dp_mon_filter_update_1_0, .tx_mon_filter_update = NULL, + .set_mon_mode_buf_rings_tx = NULL, .rx_mon_desc_pool_init = dp_rx_pdev_mon_desc_pool_init, .rx_mon_desc_pool_deinit = dp_rx_pdev_mon_desc_pool_deinit, .rx_mon_desc_pool_alloc = dp_rx_pdev_mon_desc_pool_alloc, diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index 33dea68d56..a2baaf78cb 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1497,6 +1497,7 @@ struct dp_mon_ops monitor_ops_2_0 = { .mon_filter_reset_tx_mon_mode = dp_mon_filter_reset_tx_mon_mode_2_0, .tx_mon_filter_update = dp_tx_mon_filter_update_2_0, .rx_mon_filter_update = dp_rx_mon_filter_update_2_0, + .set_mon_mode_buf_rings_tx = dp_vdev_set_monitor_mode_buf_rings_tx_2_0, .tx_mon_filter_alloc = dp_mon_filter_alloc_2_0, .tx_mon_filter_dealloc = dp_mon_filter_dealloc_2_0, .mon_rings_alloc = dp_pdev_mon_rings_alloc_2_0, diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c index 1eb5119f5b..eccea12440 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.c @@ -1601,6 +1601,7 @@ static void dp_rx_mon_filter_show_filter(struct dp_mon_filter_be *filter) struct htt_rx_ring_tlv_filter *rx_tlv_filter = &filter->rx_tlv_filter.tlv_filter; + DP_MON_FILTER_PRINT("Enable: %d", rx_tlv_filter->enable); DP_MON_FILTER_PRINT("mpdu_start: %d", rx_tlv_filter->mpdu_start); DP_MON_FILTER_PRINT("msdu_start: %d", rx_tlv_filter->msdu_start); DP_MON_FILTER_PRINT("packet: %d", rx_tlv_filter->packet); @@ -2081,6 +2082,8 @@ dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev_be, struct dp_mon_pdev *mon_pdev = pdev_be->pdev.monitor_pdev; struct dp_mon_pdev_be *mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + struct htt_rx_ring_tlv_filter *rx_tlv_filter = + &filter->rx_tlv_filter.tlv_filter; srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : @@ -2091,6 +2094,7 @@ dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev_be, dp_mon_filter_set_cbf_cmn(&pdev_be->pdev, &filter->rx_tlv_filter); + rx_tlv_filter->attention = 0; dp_mon_filter_show_rx_filter_be(mode, filter); mon_pdev_be->filter_be[mode][srng_type] = *filter; } else /* reset the filter */ @@ -2107,7 +2111,6 @@ dp_mon_filter_set_reset_rx_pkt_log_cbf_dest_2_0(struct dp_pdev_be *pdev, void dp_mon_filter_setup_rx_pkt_log_cbf_2_0(struct dp_pdev *pdev) { struct dp_mon_filter_be filter = {0}; - struct dp_soc *soc; enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; @@ -2120,12 +2123,6 @@ void dp_mon_filter_setup_rx_pkt_log_cbf_2_0(struct dp_pdev *pdev) return; } - soc = pdev->soc; - if (!soc) { - dp_mon_filter_err("Soc Context is null"); - return; - } - mon_pdev = pdev->monitor_pdev; if (!mon_pdev) { dp_mon_filter_err("Monitor pdev context is null"); @@ -2155,7 +2152,6 @@ void dp_mon_filter_setup_rx_pkt_log_cbf_2_0(struct dp_pdev *pdev) void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev) { struct dp_mon_filter_be filter = {0}; - struct dp_soc *soc; enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF; @@ -2169,12 +2165,6 @@ void dp_mon_filter_reset_rx_pktlog_cbf_2_0(struct dp_pdev *pdev) return; } - soc = pdev->soc; - if (!soc) { - dp_mon_filter_err("Soc Context is null"); - return; - } - mon_pdev = pdev->monitor_pdev; if (!mon_pdev) { dp_mon_filter_err("Monitor pdev context is null"); @@ -2235,6 +2225,29 @@ void dp_mon_filter_setup_pktlog_hybrid_2_0(struct dp_pdev *pdev) tlv_filter->utlvs.received_response_info_p2 = 1; tlv_filter->utlvs.response_end_status = 1; + tlv_filter->mgmt_filter = 0x1; + tlv_filter->data_filter = 0x1; + tlv_filter->ctrl_filter = 0x1; + + tlv_filter->mgmt_mpdu_end = 1; + tlv_filter->mgmt_msdu_end = 1; + tlv_filter->mgmt_msdu_start = 1; + tlv_filter->mgmt_mpdu_start = 1; + tlv_filter->ctrl_mpdu_end = 1; + tlv_filter->ctrl_msdu_end = 1; + tlv_filter->ctrl_msdu_start = 1; + tlv_filter->ctrl_mpdu_start = 1; + tlv_filter->data_mpdu_end = 1; + tlv_filter->data_msdu_end = 1; + tlv_filter->data_msdu_start = 1; + tlv_filter->data_mpdu_start = 1; + tlv_filter->mgmt_mpdu_log = 1; + tlv_filter->ctrl_mpdu_log = 1; + tlv_filter->data_mpdu_log = 1; + + tlv_filter->mgmt_dma_length = mon_pdev_be->tx_mon_filter_length; + tlv_filter->ctrl_dma_length = mon_pdev_be->tx_mon_filter_length; + tlv_filter->data_dma_length = mon_pdev_be->tx_mon_filter_length; dp_mon_filter_show_tx_filter_be(mode, &filter); mon_pdev_be->filter_be[mode][srng_type] = filter; } diff --git a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c index d049c99c86..8e71361892 100644 --- a/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c @@ -519,6 +519,9 @@ dp_rx_mon_process_ppdu_info(struct dp_pdev *pdev, pdev->soc, ppdu_info); + dp_rx_mon_process_dest_pktlog(pdev->soc, + pdev->pdev_id, + mpdu); /* Deliver MPDU to osif layer */ status = dp_rx_mon_deliver_mpdu(mon_pdev, mpdu, diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c index 9f3285b99e..5ea4abf4f1 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.c @@ -258,6 +258,10 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, continue; } + dp_tx_process_pktlog_be(soc, pdev, + status_frag, + end_offset); + dp_tx_mon_process_status_tlv(soc, pdev, &hal_mon_tx_desc, status_frag, diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h index 2a9ad83895..33fa2f4fdc 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_2.0.h @@ -115,6 +115,21 @@ dp_tx_mon_status_free_packet_buf(struct dp_pdev *pdev, uint32_t end_offset, struct dp_tx_mon_desc_list *mon_desc_list_ref); +/** + * dp_tx_process_pktlog_be() - process pktlog + * @soc: dp soc handle + * @pdev: dp pdev handle + * @status_frag: frag pointer which needs to be added to nbuf + * @end_offset: Offset in frag to be added to nbuf_frags + * + * Return: + * * 0 - OK to runtime suspend the device + * * -EINVAL - invalid argument + * * -ENOMEM - out of memory + */ +QDF_STATUS +dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, + void *status_frag, uint32_t end_offset); /* * dp_tx_mon_process_status_tlv() - API to processed TLV * invoked from interrupt handler diff --git a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c index 10e174a12d..dd3d7decbd 100644 --- a/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_tx_mon_status_2.0.c @@ -1399,6 +1399,40 @@ dp_tx_mon_update_ppdu_info_status(struct dp_pdev *pdev, return status; } +QDF_STATUS +dp_tx_process_pktlog_be(struct dp_soc *soc, struct dp_pdev *pdev, + qdf_frag_t status_frag, uint32_t end_offset) +{ + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + qdf_nbuf_t nbuf = NULL; + enum WDI_EVENT pktlog_mode = WDI_NO_VAL; + int frag_bytes; + + if (!mon_pdev->pktlog_hybrid_mode) + return QDF_STATUS_E_INVAL; + + nbuf = qdf_nbuf_alloc(soc->osdev, MAX_DUMMY_FRM_BODY, 0, 4, FALSE); + if (!nbuf) + return QDF_STATUS_E_NOMEM; + + qdf_nbuf_add_rx_frag(status_frag, nbuf, 0, + (end_offset + 1), + 0, true); + + if (mon_pdev->pktlog_hybrid_mode) + pktlog_mode = WDI_EVENT_HYBRID_TX; + + frag_bytes = qdf_nbuf_get_frag_len(nbuf, 0); + if (pktlog_mode != WDI_NO_VAL) { + dp_wdi_event_handler(pktlog_mode, soc, + nbuf, HTT_INVALID_PEER, + WDI_NO_VAL, pdev->pdev_id); + } + qdf_nbuf_free(nbuf); + + return QDF_STATUS_SUCCESS; +} + /* * dp_tx_mon_process_tlv_2_0() - API to parse PPDU worth information * @pdev_handle: DP_PDEV handle diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 69413cf91b..6d6b550a57 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1101,6 +1101,10 @@ dp_set_hybrid_pktlog_enable(struct dp_pdev *pdev, struct dp_mon_pdev *mon_pdev, struct dp_soc *soc) { + struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; + struct dp_mon_ops *mon_ops = NULL; + uint16_t num_buffers; + if (mon_pdev->mvdev) { /* Nothing needs to be done if monitor mode is * enabled @@ -1109,10 +1113,23 @@ dp_set_hybrid_pktlog_enable(struct dp_pdev *pdev, return false; } + mon_ops = dp_mon_ops_get(pdev->soc); + if (!mon_ops) { + dp_mon_filter_err("Mon ops uninitialized"); + return QDF_STATUS_E_FAILURE; + } + if (!mon_pdev->pktlog_hybrid_mode) { mon_pdev->pktlog_hybrid_mode = true; + soc_cfg_ctx = soc->wlan_cfg_ctx; + num_buffers = + wlan_cfg_get_dp_soc_tx_mon_buf_ring_size(soc_cfg_ctx); + + if (mon_ops && mon_ops->set_mon_mode_buf_rings_tx) + mon_ops->set_mon_mode_buf_rings_tx(pdev, num_buffers); + dp_mon_filter_setup_pktlog_hybrid(pdev); - if (dp_mon_filter_update(pdev) != + if (dp_tx_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("Set hybrid filters failed"); dp_mon_filter_reset_pktlog_hybrid(pdev); @@ -1174,13 +1191,11 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, if (enable) { switch (event) { case WDI_EVENT_RX_DESC: - if (mon_pdev->mvdev) { - /* Nothing needs to be done if monitor mode is - * enabled - */ - mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_FULL; + /* Nothing needs to be done if monitor mode is + * enabled + */ + if (mon_pdev->mvdev) return 0; - } if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL) break; @@ -1201,13 +1216,11 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, break; case WDI_EVENT_LITE_RX: - if (mon_pdev->mvdev) { - /* Nothing needs to be done if monitor mode is - * enabled - */ - mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_LITE; + /* Nothing needs to be done if monitor mode is + * enabled + */ + if (mon_pdev->mvdev) return 0; - } if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE) break; @@ -1243,14 +1256,11 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, break; case WDI_EVENT_RX_CBF: - if (mon_pdev->mvdev) { - /* Nothing needs to be done if monitor mode is - * enabled - */ - dp_mon_info("Mon mode, CBF setting filters"); - mon_pdev->rx_pktlog_cbf = true; + /* Nothing needs to be done if monitor mode is + * enabled + */ + if (mon_pdev->mvdev) return 0; - } if (mon_pdev->rx_pktlog_cbf) break; @@ -1292,14 +1302,11 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, switch (event) { case WDI_EVENT_RX_DESC: case WDI_EVENT_LITE_RX: - if (mon_pdev->mvdev) { - /* Nothing needs to be done if monitor mode is - * enabled - */ - mon_pdev->rx_pktlog_mode = - DP_RX_PKTLOG_DISABLED; + /* Nothing needs to be done if monitor mode is + * enabled + */ + if (mon_pdev->mvdev) return 0; - } if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_DISABLED) break; diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index c61d418c3c..0a746552a0 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -763,6 +763,8 @@ struct dp_mon_ops { #endif QDF_STATUS (*rx_mon_filter_update)(struct dp_pdev *pdev); QDF_STATUS (*tx_mon_filter_update)(struct dp_pdev *pdev); + QDF_STATUS (*set_mon_mode_buf_rings_tx)(struct dp_pdev *pdev, + uint16_t num_buf); QDF_STATUS (*tx_mon_filter_alloc)(struct dp_pdev *pdev); void (*tx_mon_filter_dealloc)(struct dp_pdev *pdev);