diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 1c5d8b71d0..abafd800ee 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -998,6 +998,7 @@ int htt_h2t_rx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, ring_buf_size); dp_mon_rx_packet_length_set(soc->dp_soc, msg_word, htt_tlv_filter); + dp_rx_mon_enable(soc->dp_soc, msg_word, htt_tlv_filter); /* word 2 */ msg_word++; diff --git a/dp/wifi3.0/dp_htt.h b/dp/wifi3.0/dp_htt.h index 07d36615eb..58d8b9f8e1 100644 --- a/dp/wifi3.0/dp_htt.h +++ b/dp/wifi3.0/dp_htt.h @@ -535,6 +535,7 @@ struct dp_tx_mon_wordmask_config { * @mgmt_mpdu_log: enable mgmt mpdu level logging * @ctrl_mpdu_log: enable ctrl mpdu level logging * @data_mpdu_log: enable data mpdu level logging + * @enable: enable tx monitor * * NOTE: Do not change the layout of this structure */ @@ -563,6 +564,7 @@ struct htt_tx_ring_tlv_filter { uint8_t mgmt_mpdu_log:1, ctrl_mpdu_log:1, data_mpdu_log:1; + uint8_t enable:1; }; #endif /* QCA_MONITOR_2_0_SUPPORT */ @@ -605,6 +607,7 @@ struct htt_tx_ring_tlv_filter { * @mgmt_mpdu_log: enable mgmt mpdu level logging * @ctrl_mpdu_log: enable ctrl mpdu level logging * @data_mpdu_log: enable data mpdu level logging + * @enable: enable rx monitor * * NOTE: Do not change the layout of this structure */ @@ -649,10 +652,11 @@ struct htt_rx_ring_tlv_filter { uint16_t rx_pkt_tlv_offset; uint16_t mgmt_dma_length:3, ctrl_dma_length:3, - data_dma_lepngth:3, + data_dma_length:3, mgmt_mpdu_log:1, ctrl_mpdu_log:1, - data_mpdu_log:1; + data_mpdu_log:1, + enable:1; #endif uint8_t rx_mon_global_en; }; 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 4d9f59bd30..0b0af91e3b 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 @@ -969,6 +969,7 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit; #endif mon_ops->rx_packet_length_set = NULL; + mon_ops->rx_mon_enable = NULL; mon_ops->rx_wmask_subscribe = NULL; mon_ops->rx_enable_mpdu_logging = NULL; mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach; 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 e6f9e2c764..c2db3003ce 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 @@ -236,6 +236,7 @@ dp_mon_buffers_replenish(struct dp_soc *dp_soc, (*desc_list)->mon_desc.unmapped = 0; (*desc_list)->mon_desc.buf_addr = mon_desc.buf_addr; (*desc_list)->mon_desc.paddr = mon_desc.paddr; + (*desc_list)->mon_desc.magic = DP_MON_DESC_MAGIC; hal_mon_buff_addr_info_set(dp_soc->hal_soc, mon_ring_entry, @@ -450,11 +451,9 @@ dp_set_bpr_enable_2_0(struct dp_pdev *pdev, int val) static QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) { - QDF_STATUS status; -#ifdef QCA_TXMON_HW_SUPPORT struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); -#endif + QDF_STATUS status; hal_set_low_threshold(soc->rxdma_mon_buf_ring[0].hal_srng, 0); status = htt_srng_setup(soc->htt_handle, 0, @@ -466,17 +465,14 @@ QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc) return status; } -#ifdef QCA_TXMON_HW_SUPPORT hal_set_low_threshold(mon_soc_be->tx_mon_buf_ring.hal_srng, 0); status = htt_srng_setup(soc->htt_handle, 0, mon_soc_be->tx_mon_buf_ring.hal_srng, TX_MONITOR_BUF); - if (status != QDF_STATUS_SUCCESS) { dp_err("Failed to send htt srng setup message for Tx mon buf ring"); return status; } -#endif return status; } @@ -487,10 +483,8 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, int mac_id, int mac_for_pdev) { -#ifdef QCA_TXMON_HW_SUPPORT struct dp_mon_soc *mon_soc = soc->monitor_soc; struct dp_mon_soc_be *mon_soc_be = dp_get_be_mon_soc_from_dp_mon_soc(mon_soc); -#endif QDF_STATUS status; status = htt_srng_setup(soc->htt_handle, mac_for_pdev, @@ -502,7 +496,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, return status; } -#ifdef QCA_TXMON_HW_SUPPORT status = htt_srng_setup(soc->htt_handle, mac_for_pdev, mon_soc_be->tx_mon_dst_ring[mac_id].hal_srng, TX_MONITOR_DST); @@ -511,7 +504,6 @@ QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, dp_mon_err("Failed to send htt srng message for Tx mon dst ring"); return status; } -#endif return status; } @@ -985,10 +977,8 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc) mon_soc->mon_ops->rx_mon_refill_buf_ring = NULL, -#ifdef QCA_TXMON_HW_SUPPORT mon_soc->mon_ops->tx_mon_refill_buf_ring = - dp_tx_mon_refill_buf_ring_2_0, -#endif + NULL, mon_soc->mon_rx_process = dp_rx_mon_process_2_0; } @@ -1106,6 +1096,7 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc) mon_ops->mon_pktlogmod_exit = dp_pktlogmod_exit; #endif mon_ops->rx_packet_length_set = dp_rx_mon_packet_length_set; + mon_ops->rx_mon_enable = dp_rx_mon_enable_set; mon_ops->rx_wmask_subscribe = dp_rx_mon_word_mask_subscribe; mon_ops->rx_enable_mpdu_logging = dp_rx_mon_enable_mpdu_logging; mon_ops->mon_neighbour_peers_detach = dp_neighbour_peers_detach; diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h index 3aa6417537..6166789257 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.h @@ -29,6 +29,7 @@ #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048 #define DP_MON_DATA_BUFFER_SIZE 2048 +#define DP_MON_DESC_MAGIC 0xdeadabcd /** * struct dp_mon_filter_be - Monitor TLV filter @@ -53,6 +54,7 @@ struct dp_mon_filter_be { * @unmapped: used to mark desc an unmapped if the corresponding * nbuf is already unmapped * @cookie: unique desc identifier + * @magic: magic number to validate desc data */ struct dp_mon_desc { uint8_t *buf_addr; @@ -60,6 +62,7 @@ struct dp_mon_desc { uint8_t in_use:1, unmapped:1; uint32_t cookie; + uint32_t magic; }; /** 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 79394f2711..ff5f3118d8 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 @@ -108,14 +108,23 @@ void dp_rx_mon_packet_length_set(uint32_t *msg_word, { if (!msg_word || !tlv_filter) return; -#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */ - HTT_RX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word, - tlv_filter->mgmt_dma_length); - HTT_RX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word, - tlv_filter->ctrl_dma_length); - HTT_RX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, - tlv_filter->data_dma_length); -#endif + + HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word, + tlv_filter->mgmt_dma_length); + HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word, + tlv_filter->ctrl_dma_length); + HTT_RX_RING_SELECTION_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, + tlv_filter->data_dma_length); +} + +void dp_rx_mon_enable_set(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + if (!msg_word || !tlv_filter) + return; + + HTT_RX_RING_SELECTION_CFG_RX_MON_GLOBAL_EN_SET(*msg_word, + tlv_filter->enable); } void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word, @@ -124,19 +133,20 @@ void dp_rx_mon_enable_mpdu_logging(uint32_t *msg_word, if (!msg_word || !tlv_filter) return; -#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */ - if (htt_tlv_filter->mgmt_mpdu_log) - HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, MGMT, - tlv_filter->mgmt_mpdu_log); + if (tlv_filter->mgmt_mpdu_log) { + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 1); + HTT_RX_RING_SELECTION_CFG_DMA_MPDU_MGMT_SET(*msg_word, 1); + } - if (htt_tlv_filter->ctrl_mpdu_log) - HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, CTRL, - tlv_filter->ctrl_mpdu_log); + if (tlv_filter->ctrl_mpdu_log) { + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 2); + HTT_RX_RING_SELECTION_CFG_DMA_MPDU_CTRL_SET(*msg_word, 1); + } - if (htt_tlv_filter->data_mpdu_log) - HTT_RX_MONITOR_CFG_MPDU_LOGGING_SET(*msg_word, DATA, - tlv_filter->data_mpdu_log); -#endif + if (tlv_filter->data_mpdu_log) { + HTT_RX_RING_SELECTION_CFG_PKT_TYPE_ENABLE_MSDU_MPDU_LOGGING_SET(*msg_word, 4); + HTT_RX_RING_SELECTION_CFG_DMA_MPDU_DATA_SET(*msg_word, 1); + } } void @@ -146,21 +156,19 @@ dp_rx_mon_word_mask_subscribe(uint32_t *msg_word, if (!msg_word || !tlv_filter) return; -#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */ - HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WMASK_SET(*msg_word, - tlv_filter->rx_mpdu_start_word_mask); + HTT_RX_RING_SELECTION_CFG_RX_MPDU_START_WORD_MASK_SET(*msg_word, + tlv_filter->rx_mpdu_start_wmask); - msg_word++; - *msg_word = 0; - HTT_RX_RING_SELECTION_CFG_RX_MPDU_END_WMASK_SET(*msg_word, - tlv_filter->rx_mpdu_end_word_mask); - msg_word++; - *msg_word = 0; - HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WMASK_SET(*msg_word, - tlv_filter->rx_msdu_end_word_mask); - HTT_RX_RING_SELECTION_CFG_RX_PACKET_TLV_OFFSET_SET(*msg_word, - tlv_filter->rx_pkt_tlv_offset); +#ifdef QCA_MONITOR_2_0_SUPPORT_WAR /* Yet to get FW support */ + HTT_RX_RING_SELECTION_CFG_RX_MPDU_END_WORD_MASK_SET(*msg_word, + tlv_filter->rx_mpdu_end_wmask); #endif + msg_word++; + *msg_word = 0; + HTT_RX_RING_SELECTION_CFG_RX_MSDU_END_WORD_MASK_SET(*msg_word, + tlv_filter->rx_msdu_end_wmask); + HTT_RX_RING_SELECTION_CFG_ENABLE_RX_PKT_TLV_OFFSET_SET(*msg_word, + tlv_filter->rx_pkt_tlv_offset); } static void @@ -825,16 +833,17 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, target_pdev_id = dp_get_target_pdev_id_for_host_pdev_id(soc->dp_soc, pdev_id); - if (htt_ring_type == HTT_SW_TO_SW_RING || - htt_ring_type == HTT_SW_TO_HW_RING) - HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word, - target_pdev_id); + HTT_TX_MONITOR_CFG_PDEV_ID_SET(*msg_word, + target_pdev_id); HTT_TX_MONITOR_CFG_RING_ID_SET(*msg_word, htt_ring_id); HTT_TX_MONITOR_CFG_STATUS_TLV_SET(*msg_word, !!(srng_params.flags & HAL_SRNG_MSI_SWAP)); + HTT_TX_MONITOR_CFG_TX_MON_GLOBAL_EN_SET(*msg_word, + htt_tlv_filter->enable); + /* word 1 */ msg_word++; *msg_word = 0; @@ -854,11 +863,11 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, DATA, 1); if (htt_tlv_filter->mgmt_dma_length) - HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, + HTT_TX_MONITOR_CFG_CONFIG_LENGTH_MGMT_SET(*msg_word, htt_tlv_filter->mgmt_dma_length); if (htt_tlv_filter->ctrl_dma_length) - HTT_TX_MONITOR_CFG_CONFIG_LENGTH_DATA_SET(*msg_word, + HTT_TX_MONITOR_CFG_CONFIG_LENGTH_CTRL_SET(*msg_word, htt_tlv_filter->ctrl_dma_length); if (htt_tlv_filter->data_dma_length) @@ -872,10 +881,46 @@ int htt_h2t_tx_ring_cfg(struct htt_soc *htt_soc, int pdev_id, HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1); if (htt_tlv_filter->ctrl_filter) - HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1); + HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 2); if (htt_tlv_filter->data_filter) - HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 1); + HTT_TX_MONITOR_CFG_PKT_TYPE_ENABLE_FLAGS_SET(*msg_word, 4); + + if (htt_tlv_filter->mgmt_mpdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_MGMT_SET(*msg_word, 1); + + if (htt_tlv_filter->ctrl_mpdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_CTRL_SET(*msg_word, 1); + + if (htt_tlv_filter->data_mpdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_START_DATA_SET(*msg_word, 1); + + if (htt_tlv_filter->mgmt_msdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_MGMT_SET(*msg_word, 1); + + if (htt_tlv_filter->ctrl_msdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_CTRL_SET(*msg_word, 1); + + if (htt_tlv_filter->data_msdu_start) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_START_DATA_SET(*msg_word, 1); + + if (htt_tlv_filter->mgmt_mpdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_MGMT_SET(*msg_word, 1); + + if (htt_tlv_filter->ctrl_mpdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_CTRL_SET(*msg_word, 1); + + if (htt_tlv_filter->data_mpdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MPDU_END_DATA_SET(*msg_word, 1); + + if (htt_tlv_filter->mgmt_msdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_MGMT_SET(*msg_word, 1); + + if (htt_tlv_filter->ctrl_msdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_CTRL_SET(*msg_word, 1); + + if (htt_tlv_filter->data_msdu_end) + HTT_TX_MONITOR_CFG_FILTER_IN_TX_MSDU_END_DATA_SET(*msg_word, 1); /* word 3 */ msg_word++; @@ -1217,6 +1262,8 @@ static void dp_tx_mon_filter_show_filter(struct dp_mon_filter_be *filter) { struct htt_tx_ring_tlv_filter *tlv_filter = &filter->tx_tlv_filter; + DP_MON_FILTER_PRINT("TX Monitor Filter configuration:"); + DP_MON_FILTER_PRINT("Enable: %d", tlv_filter->enable); DP_MON_FILTER_PRINT("mgmt_filter: %d", tlv_filter->mgmt_filter); DP_MON_FILTER_PRINT("data_filter: %d", tlv_filter->data_filter); DP_MON_FILTER_PRINT("ctrl_filter: %d", tlv_filter->ctrl_filter); @@ -1825,21 +1872,6 @@ dp_rx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, } } -/** - * dp_tx_mon_filter_h2t_setup() - Setup the filter for the Target setup - * @soc: DP soc handle - * @pdev: DP pdev handle - * @srng_type: The srng type for which filter wll be set - * @tlv_filter: tlv filter - */ -static -void dp_tx_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, - struct dp_mon_filter_be *filter) -{ - /* currently all available filter configuration enabled */ - dp_tx_mon_filter_show_filter(filter); -} - static QDF_STATUS dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc, struct dp_pdev *pdev, @@ -1878,10 +1910,40 @@ dp_tx_mon_ht2_ring_cfg(struct dp_soc *soc, return status; } +static inline +void dp_tx_mon_filter_set_all(struct htt_tx_ring_tlv_filter *filter) +{ + qdf_mem_set(&filter->dtlvs, + sizeof(struct dp_tx_mon_downstream_tlv_config), 0xFF); + qdf_mem_set(&filter->utlvs, + sizeof(struct dp_tx_mon_upstream_tlv_config), 0xFF); + qdf_mem_set(&filter->wmask, + sizeof(struct dp_tx_mon_wordmask_config), 0xFF); + + filter->mgmt_filter = 0x1; + filter->data_filter = 0x1; + filter->ctrl_filter = 0x1; + + filter->mgmt_mpdu_end = 1; + filter->mgmt_msdu_end = 1; + filter->mgmt_msdu_start = 1; + filter->mgmt_mpdu_start = 1; + filter->ctrl_mpdu_end = 1; + filter->ctrl_msdu_end = 1; + filter->ctrl_msdu_start = 1; + filter->ctrl_mpdu_start = 1; + filter->data_mpdu_end = 1; + filter->data_msdu_end = 1; + filter->data_msdu_start = 1; + filter->data_mpdu_start = 1; + filter->mgmt_mpdu_log = 1; + filter->ctrl_mpdu_log = 1; + filter->data_mpdu_log = 1; +} + QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev) { struct dp_soc *soc; - struct dp_mon_filter_be filter = {0}; struct dp_mon_filter_be *filter_ptr; struct htt_tx_ring_tlv_filter *tx_tlv_filter; enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; @@ -1909,18 +1971,20 @@ QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev) } if (filter_ptr->tx_valid) { - qdf_mem_set(&(filter), sizeof(filter), 1); - tx_tlv_filter = &filter.tx_tlv_filter; + tx_tlv_filter = &filter_ptr->tx_tlv_filter; + dp_tx_mon_filter_set_all(tx_tlv_filter); tx_tlv_filter->mgmt_dma_length = DEFAULT_DMA_LENGTH; tx_tlv_filter->ctrl_dma_length = DEFAULT_DMA_LENGTH; tx_tlv_filter->data_dma_length = DEFAULT_DMA_LENGTH; + tx_tlv_filter->enable = 1; } else { - qdf_mem_zero(&(filter), sizeof(filter)); + qdf_mem_zero(filter_ptr, sizeof(struct dp_mon_filter_be)); } - dp_tx_mon_filter_h2t_setup(soc, pdev, &filter); + dp_mon_filter_show_filter_be(mode, + filter_ptr); dp_tx_mon_ht2_ring_cfg(soc, pdev, srng_type, - &filter.tx_tlv_filter); + &filter_ptr->tx_tlv_filter); return QDF_STATUS_SUCCESS; } @@ -1943,6 +2007,11 @@ QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev) mode = mon_pdev->current_filter_mode; rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter; dp_rx_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter); + if (filter.rx_tlv_filter.valid) + rx_tlv_filter->enable = 1; + else + rx_tlv_filter->enable = 0; + dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type, &filter.rx_tlv_filter.tlv_filter); dp_mon_filter_show_filter_be(mode, diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h index ac9bb71412..ca3e2ee5f4 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h +++ b/dp/wifi3.0/monitor/2.0/dp_mon_filter_2.0.h @@ -1,6 +1,6 @@ /* * Copyright (c) 2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021,2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -22,6 +22,15 @@ #define DEFAULT_DMA_LENGTH 7 +/** + * dp_rx_mon_enable_set() - Setup rx monitor feature + * @msg_word: msg word + * @htt_tlv_filter: rx ring filter configuration + */ +void +dp_rx_mon_enable_set(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); + /** * dp_rx_mon_packet_length_set() - Setup rx monitor per packet type length * @msg_word: msg word @@ -29,7 +38,7 @@ */ void dp_rx_mon_packet_length_set(uint32_t *msg_word, - struct htt_rx_ring_tlv_filter *tlvi_filter); + struct htt_rx_ring_tlv_filter *tlv_filter); /** * dp_rx_mon_word_mask_subscribe() - Setup rx monitor word mask subscription 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 0be2700c7a..6cb6031e95 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 @@ -74,7 +74,7 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, } while (qdf_likely((tx_mon_dst_ring_desc = - (void *)hal_srng_dst_get_next(hal_soc, mon_dst_srng)) + (void *)hal_srng_dst_peek(hal_soc, mon_dst_srng)) && quota--)) { struct hal_mon_desc hal_mon_tx_desc; struct dp_mon_desc *mon_desc; @@ -82,6 +82,7 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, hal_be_get_mon_dest_status(soc->hal_soc, tx_mon_dst_ring_desc, &hal_mon_tx_desc); + mon_desc = (struct dp_mon_desc *)(uintptr_t)(hal_mon_tx_desc.buf_addr); qdf_assert_always(mon_desc); @@ -92,23 +93,32 @@ dp_tx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx, mon_desc->unmapped = 1; } + if (mon_desc->magic != DP_MON_DESC_MAGIC) { + dp_mon_err("Invalid monitor descriptor"); + qdf_assert_always(mon_desc); + } + status = dp_tx_mon_process_status_tlv(soc, pdev, &hal_mon_tx_desc, mon_desc->paddr); if (status != QDF_STATUS_SUCCESS) { hal_txmon_status_free_buffer(pdev->soc->hal_soc, mon_desc->buf_addr); - qdf_frag_free(mon_desc->buf_addr); } + qdf_frag_free(mon_desc->buf_addr); dp_mon_add_to_free_desc_list(&desc_list, &tail, mon_desc); + work_done++; + hal_srng_dst_get_next(hal_soc, mon_dst_srng); } dp_srng_access_end(int_ctx, soc, mon_dst_srng); if (desc_list) - dp_mon_add_desc_list_to_free_list(soc, &desc_list, - &tail, tx_mon_desc_pool); + dp_mon_buffers_replenish(soc, &mon_soc_be->tx_mon_buf_ring, + tx_mon_desc_pool, + work_done, + &desc_list, &tail); qdf_spin_unlock_bh(&mon_pdev->mon_lock); dp_mon_info("mac_id: %d, work_done:%d", mac_id, work_done); diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index f65608ea30..32e41220ce 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -697,6 +697,8 @@ struct dp_mon_ops { void (*tx_mon_desc_pool_deinit)(struct dp_pdev *pdev); QDF_STATUS (*tx_mon_desc_pool_alloc)(struct dp_pdev *pdev); void (*tx_mon_desc_pool_free)(struct dp_pdev *pdev); + void (*rx_mon_enable)(uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter); void (*rx_packet_length_set)(uint32_t *msg_word, struct htt_rx_ring_tlv_filter *tlv_filter); void (*rx_wmask_subscribe)(uint32_t *msg_word, @@ -3541,6 +3543,27 @@ dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word, monitor_ops->rx_packet_length_set(msg_word, tlv_filter); } +static inline void +dp_rx_mon_enable(struct dp_soc *soc, uint32_t *msg_word, + struct htt_rx_ring_tlv_filter *tlv_filter) +{ + struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_ops *monitor_ops; + + if (!mon_soc) { + dp_mon_debug("mon soc is NULL"); + return; + } + + monitor_ops = mon_soc->mon_ops; + if (!monitor_ops || !monitor_ops->rx_mon_enable) { + dp_mon_debug("callback not registered"); + return; + } + + monitor_ops->rx_mon_enable(msg_word, tlv_filter); +} + #ifdef QCA_ENHANCED_STATS_SUPPORT QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, struct cdp_rx_stats_ppdu_user *ppdu_user); diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index b6dbeb8dcb..984338b946 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -498,10 +498,8 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) return QDF_STATUS_E_FAILURE; } -#ifdef QCA_TXMON_HW_SUPPORT if (mon_ops && mon_ops->tx_mon_filter_update) mon_ops->tx_mon_filter_update(pdev); -#endif if (mon_ops && mon_ops->rx_mon_filter_update) mon_ops->rx_mon_filter_update(pdev); diff --git a/hal/wifi3.0/be/hal_be_api_mon.h b/hal/wifi3.0/be/hal_be_api_mon.h index 95a3569118..c81f2f2a1f 100644 --- a/hal/wifi3.0/be/hal_be_api_mon.h +++ b/hal/wifi3.0/be/hal_be_api_mon.h @@ -52,25 +52,25 @@ #define HAL_MON_PADDR_LO_SET(buff_addr_info, paddr_lo) \ ((*(((unsigned int *) buff_addr_info) + \ (HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET >> 2))) = \ - (paddr_lo << HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \ + ((paddr_lo) << HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB) & \ HAL_MON_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK) #define HAL_MON_PADDR_HI_SET(buff_addr_info, paddr_hi) \ ((*(((unsigned int *) buff_addr_info) + \ (HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_OFFSET >> 2))) = \ - (paddr_hi << HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \ + ((paddr_hi) << HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB) & \ HAL_MON_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK) -#define HAL_MON_VADDR_LO_SET(buff_addr_info, paddr_lo) \ +#define HAL_MON_VADDR_LO_SET(buff_addr_info, vaddr_lo) \ ((*(((unsigned int *) buff_addr_info) + \ (HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_OFFSET >> 2))) = \ - (paddr_lo << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB) & \ + ((vaddr_lo) << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_LSB) & \ HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_31_0_MASK) -#define HAL_MON_VADDR_HI_SET(buff_addr_info, paddr_hi) \ +#define HAL_MON_VADDR_HI_SET(buff_addr_info, vaddr_hi) \ ((*(((unsigned int *) buff_addr_info) + \ (HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_OFFSET >> 2))) = \ - (paddr_hi << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB) & \ + ((vaddr_hi) << HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_LSB) & \ HAL_MON_MON_INGRESS_RING_BUFFER_VIRT_ADDR_63_32_MASK) enum hal_dest_desc_end_reason { @@ -190,33 +190,6 @@ void hal_mon_buff_addr_info_set(hal_soc_handle_t hal_soc_hdl, HAL_MON_VADDR_HI_SET(mon_entry, vaddr_hi); } -/** - * hal_mon_buf_get() - Get monitor descriptor - * @hal_soc_hdl: HAL Soc handle - * @desc: HAL monitor descriptor - * - * Return: none - */ -static inline -void hal_mon_buf_get(hal_soc_handle_t hal_soc_hdl, - void *dst_ring_desc, - struct hal_mon_desc *mon_desc) -{ - struct mon_destination_ring *hal_dst_ring = - (struct mon_destination_ring *)dst_ring_desc; - - mon_desc->buf_addr = - ((u64)hal_dst_ring->stat_buf_virt_addr_31_0 | - ((u64)hal_dst_ring->stat_buf_virt_addr_63_32 << 32)); - mon_desc->ppdu_id = hal_dst_ring->ppdu_id; - mon_desc->end_offset = hal_dst_ring->end_offset; - mon_desc->end_reason = hal_dst_ring->end_reason; - mon_desc->initiator = hal_dst_ring->initiator; - mon_desc->ring_id = hal_dst_ring->ring_id; - mon_desc->empty_descriptor = hal_dst_ring->empty_descriptor; - mon_desc->looping_count = hal_dst_ring->looping_count; -} - /* TX monitor */ #define TX_MON_STATUS_BUF_SIZE 2048 @@ -295,7 +268,8 @@ hal_txmon_status_free_buffer(hal_soc_handle_t hal_soc_hdl, { struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl; - hal_soc->ops->hal_txmon_status_free_buffer(status_frag); + if (hal_soc->ops->hal_txmon_status_free_buffer) + hal_soc->ops->hal_txmon_status_free_buffer(status_frag); } #endif /* QCA_MONITOR_2_0_SUPPORT */ #endif /* _HAL_BE_API_MON_H_ */ diff --git a/hal/wifi3.0/qcn9224/hal_9224.c b/hal/wifi3.0/qcn9224/hal_9224.c index ca0c88f3c2..412d97d99e 100644 --- a/hal/wifi3.0/qcn9224/hal_9224.c +++ b/hal/wifi3.0/qcn9224/hal_9224.c @@ -2326,10 +2326,11 @@ struct hal_hw_srng_config hw_srng_table_9224[] = { HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> HWIO_WBM_R0_PPE_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, }, +#ifdef QCA_MONITOR_2_0_SUPPORT { /* TX_MONITOR_BUF */ .start_ring_id = HAL_SRNG_SW2TXMON_BUF0, .max_rings = 1, - .entry_size = sizeof(struct wbm_buffer_ring) >> 2, + .entry_size = sizeof(struct mon_ingress_ring) >> 2, .lmac_ring = TRUE, .ring_dir = HAL_SRNG_SRC_RING, /* reg_start is not set because LMAC rings are not accessed @@ -2342,7 +2343,7 @@ struct hal_hw_srng_config hw_srng_table_9224[] = { { /* TX_MONITOR_DST */ .start_ring_id = HAL_SRNG_WMAC1_TXMON2SW0, .max_rings = 1, - .entry_size = sizeof(struct sw_monitor_ring) >> 2, + .entry_size = sizeof(struct mon_destination_ring) >> 2, .lmac_ring = TRUE, .ring_dir = HAL_SRNG_DST_RING, /* reg_start is not set because LMAC rings are not accessed @@ -2352,6 +2353,10 @@ struct hal_hw_srng_config hw_srng_table_9224[] = { .reg_size = {}, .max_size = HAL_RXDMA_MAX_RING_SIZE_BE, }, +#else + {}, + {}, +#endif { /* SW2RXDMA */ .start_ring_id = HAL_SRNG_SW2RXDMA_BUF0, .max_rings = 3,