diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c index 2d2787c388..7b9f0c5c8b 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.c @@ -27,204 +27,6 @@ #include #include -/** - * dp_mon_filter_mode_type_to_str - * Monitor Filter mode to string - */ -int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = { -#ifdef QCA_ENHANCED_STATS_SUPPORT - "DP MON FILTER ENHACHED STATS MODE", -#endif /* QCA_ENHANCED_STATS_SUPPORT */ -#ifdef QCA_MCOPY_SUPPORT - "DP MON FILTER MCOPY MODE", -#endif /* QCA_MCOPY_SUPPORT */ -#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) - "DP MON FILTER SMART MONITOR MODE", -#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ - "DP_MON FILTER MONITOR MODE", -#ifdef WLAN_RX_PKT_CAPTURE_ENH - "DP MON FILTER RX CAPTURE MODE", -#endif /* WLAN_RX_PKT_CAPTURE_ENH */ -#ifdef WDI_EVENT_ENABLE - "DP MON FILTER PKT LOG FULL MODE", - "DP MON FILTER PKT LOG LITE MODE", - "DP MON FILTER PKT LOG CBF MODE", -#ifdef QCA_WIFI_QCN9224 - "DP MON FILTER PKT LOG HYBRID MODE", -#endif -#endif /* WDI_EVENT_ENABLE */ -}; - -void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev, - enum dp_mon_filter_mode mode, - struct dp_mon_filter *filter) -{ - struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; - - DP_MON_FILTER_PRINT("[%s]: Valid: %d", - dp_mon_filter_mode_type_to_str[mode], - filter->valid); - DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start); - DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start); - DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet); - DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end); - DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end); - DP_MON_FILTER_PRINT("packet_header: %d", - tlv_filter->packet_header); - DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention); - DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start); - DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end); - DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d", - tlv_filter->ppdu_end_user_stats); - DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d", - tlv_filter->ppdu_end_user_stats_ext); - DP_MON_FILTER_PRINT("ppdu_end_status_done: %d", - tlv_filter->ppdu_end_status_done); - DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu); - DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp); - DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md); - DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo); - DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter); - DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter); - DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter); - DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter); - DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter); - DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter); - DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter); - DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter); - DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter); -} - -/** - * dp_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_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, - enum dp_mon_filter_srng_type srng_type, - struct dp_mon_filter *filter) -{ - int32_t current_mode = 0; - struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; - struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - - /* - * Loop through all the modes. - */ - for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE; - current_mode++) { - struct dp_mon_filter *mon_filter = - &mon_pdev->filter[current_mode][srng_type]; - uint32_t src_filter = 0, dst_filter = 0; - - /* - * Check if the correct mode is enabled or not. - */ - if (!mon_filter->valid) - continue; - - filter->valid = true; - - /* - * Set the super bit fields - */ - src_filter = - DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter); - - /* - * Set the filter management filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_FP_MGMT); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter); - - /* - * Set the monitor other management filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MO_MGMT); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter); - - /* - * Set the filter pass control filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_FP_CTRL); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter); - - /* - * Set the monitor other control filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MO_CTRL); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter); - - /* - * Set the filter pass data filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_FP_DATA); - dst_filter = DP_MON_FILTER_GET(tlv_filter, - FILTER_FP_DATA); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, - FILTER_FP_DATA, dst_filter); - - /* - * Set the monitor other data filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MO_DATA); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter); - - /* - * Set the monitor direct data filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MD_DATA); - dst_filter = DP_MON_FILTER_GET(tlv_filter, - FILTER_MD_DATA); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, - FILTER_MD_DATA, dst_filter); - - /* - * Set the monitor direct management filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MD_MGMT); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter); - - /* - * Set the monitor direct management filter. - */ - src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, - FILTER_MD_CTRL); - dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL); - dst_filter |= src_filter; - DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter); - } - - dp_mon_filter_show_filter(mon_pdev, 0, filter); -} - #if defined(QCA_MCOPY_SUPPORT) || defined(ATH_SUPPORT_NAC_RSSI) \ || defined(ATH_SUPPORT_NAC) || defined(WLAN_RX_PKT_CAPTURE_ENH) /** diff --git a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h index b1e0847415..8573e063d1 100644 --- a/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h +++ b/dp/wifi3.0/monitor/1.0/dp_mon_filter_1.0.h @@ -17,50 +17,6 @@ #ifndef _DP_MON_FILTER_1_0_H_ #define _DP_MON_FILTER_1_0_H_ -/** - * Accessor Macros to access the software - * defined HTT filter htt_rx_ring_tlv_filter. - */ -#define DP_MON_FILTER_TLV_OFFSET 0x00000000 -#define DP_MON_FILTER_TLV_MASK 0xffffffff -#define DP_MON_FILTER_TLV_LSB 0 - -#define DP_MON_FILTER_FP_MGMT_OFFSET 0x00000004 -#define DP_MON_FILTER_FP_MGMT_MASK 0x0000ffff -#define DP_MON_FILTER_FP_MGMT_LSB 0 - -#define DP_MON_FILTER_MO_MGMT_OFFSET 0x00000004 -#define DP_MON_FILTER_MO_MGMT_MASK 0xffff0000 -#define DP_MON_FILTER_MO_MGMT_LSB 16 - -#define DP_MON_FILTER_FP_CTRL_OFFSET 0x00000008 -#define DP_MON_FILTER_FP_CTRL_MASK 0x0000ffff -#define DP_MON_FILTER_FP_CTRL_LSB 0 - -#define DP_MON_FILTER_MO_CTRL_OFFSET 0x00000008 -#define DP_MON_FILTER_MO_CTRL_MASK 0xffff0000 -#define DP_MON_FILTER_MO_CTRL_LSB 16 - -#define DP_MON_FILTER_FP_DATA_OFFSET 0x0000000c -#define DP_MON_FILTER_FP_DATA_MASK 0x0000ffff -#define DP_MON_FILTER_FP_DATA_LSB 0 - -#define DP_MON_FILTER_MO_DATA_OFFSET 0x0000000c -#define DP_MON_FILTER_MO_DATA_MASK 0xffff0000 -#define DP_MON_FILTER_MO_DATA_LSB 16 - -#define DP_MON_FILTER_MD_DATA_OFFSET 0x00000010 -#define DP_MON_FILTER_MD_DATA_MASK 0x0000ffff -#define DP_MON_FILTER_MD_DATA_LSB 0 - -#define DP_MON_FILTER_MD_MGMT_OFFSET 0x00000010 -#define DP_MON_FILTER_MD_MGMT_MASK 0xffff0000 -#define DP_MON_FILTER_MD_MGMT_LSB 16 - -#define DP_MON_FILTER_MD_CTRL_OFFSET 0x00000014 -#define DP_MON_FILTER_MD_CTRL_MASK 0x0000ffff -#define DP_MON_FILTER_MD_CTRL_LSB 0 - #ifdef QCA_ENHANCED_STATS_SUPPORT /** * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter 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 6b4519b1c2..680bc9571f 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 @@ -1062,7 +1062,6 @@ void dp_mon_filter_reset_tx_mon_mode_2_0(struct dp_pdev *pdev) struct dp_mon_soc *mon_soc; struct dp_mon_pdev_be *mon_pdev_be; struct dp_mon_soc_be *mon_soc_be = NULL; - struct dp_mon_pdev_be *mon_pdev_be = NULL; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -1089,11 +1088,12 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev) { struct dp_mon_filter_be filter = {0}; struct dp_mon_filter *rx_tlv_filter; - struct dp_soc *soc = NULL; - //enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; - //enum dp_mon_filter_srng_type srng_type = - // DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_soc *soc; + enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; + enum dp_mon_filter_srng_type srng_type = + DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; struct dp_mon_pdev *mon_pdev; + struct dp_mon_pdev_be *mon_pdev_be; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -1107,16 +1107,59 @@ void dp_mon_filter_setup_rx_mon_mode_2_0(struct dp_pdev *pdev) } mon_pdev = pdev->monitor_pdev; + if (!mon_pdev) { + dp_mon_filter_err("mon_pdev Context is null"); + return; + } + mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + rx_tlv_filter = &filter.rx_tlv_filter; rx_tlv_filter->valid = true; - /* Update for RxMon: Enabled the filter */ + dp_mon_filter_set_status_cmn(mon_pdev, rx_tlv_filter); + dp_mon_filter_show_filter(mon_pdev, mode, rx_tlv_filter); - /* Update for Rxmon: Store the above filter */ + /* Store the above filter */ + mon_pdev_be->filter_be[mode][srng_type] = filter; } void dp_mon_filter_reset_rx_mon_mode_2_0(struct dp_pdev *pdev) { + struct dp_mon_filter_be filter = {0}; + struct dp_mon_filter *rx_tlv_filter; + struct dp_soc *soc = NULL; + + enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; + enum dp_mon_filter_srng_type srng_type = + DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; + struct dp_mon_pdev *mon_pdev; + struct dp_mon_pdev_be *mon_pdev_be; + + if (!pdev) { + dp_mon_filter_err("pdev Context is null"); + 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("mon_pdev Context is null"); + return; + } + mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + + rx_tlv_filter = &filter.rx_tlv_filter; + rx_tlv_filter->valid = true; + + qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter)); + /* Store the above filter */ + srng_type = DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; + mon_pdev_be->filter_be[mode][srng_type] = filter; } void dp_mon_filter_show_filter_be(struct dp_mon_pdev_be *mon_pdev, @@ -1670,7 +1713,31 @@ QDF_STATUS dp_tx_mon_filter_update_2_0(struct dp_pdev *pdev) QDF_STATUS dp_rx_mon_filter_update_2_0(struct dp_pdev *pdev) { - /* set filters */ - /* call htt_h2t_rx_ring_cfg */ + struct dp_soc *soc = pdev->soc; + struct dp_mon_filter_be filter = {0}; + struct dp_mon_filter_be *filter_ptr; + struct htt_rx_ring_tlv_filter *rx_tlv_filter; + enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; + enum dp_mon_filter_srng_type srng_type = + DP_MON_FILTER_SRNG_TYPE_RXMON_DEST; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_mon_pdev_be *mon_pdev_be = + dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev); + + if (!pdev) { + dp_mon_filter_err("pdev Context is null"); + return QDF_STATUS_E_FAILURE; + } + + filter_ptr = &mon_pdev_be->filter_be[mode][srng_type]; + if (!filter_ptr) { + dp_mon_filter_err("Filter not allocated"); + return QDF_STATUS_E_FAILURE; + } + + rx_tlv_filter = &filter.rx_tlv_filter.tlv_filter; + dp_mon_filter_h2t_setup(soc, pdev, srng_type, &filter.rx_tlv_filter); + dp_mon_ht2_rx_ring_cfg(soc, pdev, srng_type, + &filter.rx_tlv_filter.tlv_filter); return QDF_STATUS_SUCCESS; } diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 00f1978971..c156d49e15 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -23,6 +23,204 @@ #include #include +/** + * dp_mon_filter_mode_type_to_str + * Monitor Filter mode to string + */ +int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = { +#ifdef QCA_ENHANCED_STATS_SUPPORT + "DP MON FILTER ENHACHED STATS MODE", +#endif /* QCA_ENHANCED_STATS_SUPPORT */ +#ifdef QCA_MCOPY_SUPPORT + "DP MON FILTER MCOPY MODE", +#endif /* QCA_MCOPY_SUPPORT */ +#if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) + "DP MON FILTER SMART MONITOR MODE", +#endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ + "DP_MON FILTER MONITOR MODE", +#ifdef WLAN_RX_PKT_CAPTURE_ENH + "DP MON FILTER RX CAPTURE MODE", +#endif /* WLAN_RX_PKT_CAPTURE_ENH */ +#ifdef WDI_EVENT_ENABLE + "DP MON FILTER PKT LOG FULL MODE", + "DP MON FILTER PKT LOG LITE MODE", + "DP MON FILTER PKT LOG CBF MODE", +#ifdef QCA_WIFI_QCN9224 + "DP MON FILTER PKT LOG HYBRID MODE", +#endif +#endif /* WDI_EVENT_ENABLE */ +}; + +void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev, + enum dp_mon_filter_mode mode, + struct dp_mon_filter *filter) +{ + struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; + + DP_MON_FILTER_PRINT("[%s]: Valid: %d", + dp_mon_filter_mode_type_to_str[mode], + filter->valid); + DP_MON_FILTER_PRINT("mpdu_start: %d", tlv_filter->mpdu_start); + DP_MON_FILTER_PRINT("msdu_start: %d", tlv_filter->msdu_start); + DP_MON_FILTER_PRINT("packet: %d", tlv_filter->packet); + DP_MON_FILTER_PRINT("msdu_end: %d", tlv_filter->msdu_end); + DP_MON_FILTER_PRINT("mpdu_end: %d", tlv_filter->mpdu_end); + DP_MON_FILTER_PRINT("packet_header: %d", + tlv_filter->packet_header); + DP_MON_FILTER_PRINT("attention: %d", tlv_filter->attention); + DP_MON_FILTER_PRINT("ppdu_start: %d", tlv_filter->ppdu_start); + DP_MON_FILTER_PRINT("ppdu_end: %d", tlv_filter->ppdu_end); + DP_MON_FILTER_PRINT("ppdu_end_user_stats: %d", + tlv_filter->ppdu_end_user_stats); + DP_MON_FILTER_PRINT("ppdu_end_user_stats_ext: %d", + tlv_filter->ppdu_end_user_stats_ext); + DP_MON_FILTER_PRINT("ppdu_end_status_done: %d", + tlv_filter->ppdu_end_status_done); + DP_MON_FILTER_PRINT("header_per_msdu: %d", tlv_filter->header_per_msdu); + DP_MON_FILTER_PRINT("enable_fp: %d", tlv_filter->enable_fp); + DP_MON_FILTER_PRINT("enable_md: %d", tlv_filter->enable_md); + DP_MON_FILTER_PRINT("enable_mo: %d", tlv_filter->enable_mo); + DP_MON_FILTER_PRINT("fp_mgmt_filter: 0x%x", tlv_filter->fp_mgmt_filter); + DP_MON_FILTER_PRINT("mo_mgmt_filter: 0x%x", tlv_filter->mo_mgmt_filter); + DP_MON_FILTER_PRINT("fp_ctrl_filter: 0x%x", tlv_filter->fp_ctrl_filter); + DP_MON_FILTER_PRINT("mo_ctrl_filter: 0x%x", tlv_filter->mo_ctrl_filter); + DP_MON_FILTER_PRINT("fp_data_filter: 0x%x", tlv_filter->fp_data_filter); + DP_MON_FILTER_PRINT("mo_data_filter: 0x%x", tlv_filter->mo_data_filter); + DP_MON_FILTER_PRINT("md_data_filter: 0x%x", tlv_filter->md_data_filter); + DP_MON_FILTER_PRINT("md_mgmt_filter: 0x%x", tlv_filter->md_mgmt_filter); + DP_MON_FILTER_PRINT("md_ctrl_filter: 0x%x", tlv_filter->md_ctrl_filter); +} + +/** + * dp_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 + */ +void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, + enum dp_mon_filter_srng_type srng_type, + struct dp_mon_filter *filter) +{ + int32_t current_mode = 0; + struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + /* + * Loop through all the modes. + */ + for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE; + current_mode++) { + struct dp_mon_filter *mon_filter = + &mon_pdev->filter[current_mode][srng_type]; + uint32_t src_filter = 0, dst_filter = 0; + + /* + * Check if the correct mode is enabled or not. + */ + if (!mon_filter->valid) + continue; + + filter->valid = true; + + /* + * Set the super bit fields + */ + src_filter = + DP_MON_FILTER_GET(&mon_filter->tlv_filter, FILTER_TLV); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_TLV); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_TLV, dst_filter); + + /* + * Set the filter management filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_FP_MGMT); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_MGMT); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_FP_MGMT, dst_filter); + + /* + * Set the monitor other management filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MO_MGMT); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_MGMT); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_MO_MGMT, dst_filter); + + /* + * Set the filter pass control filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_FP_CTRL); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_FP_CTRL); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_FP_CTRL, dst_filter); + + /* + * Set the monitor other control filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MO_CTRL); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_CTRL); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_MO_CTRL, dst_filter); + + /* + * Set the filter pass data filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_FP_DATA); + dst_filter = DP_MON_FILTER_GET(tlv_filter, + FILTER_FP_DATA); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, + FILTER_FP_DATA, dst_filter); + + /* + * Set the monitor other data filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MO_DATA); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MO_DATA); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_MO_DATA, dst_filter); + + /* + * Set the monitor direct data filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MD_DATA); + dst_filter = DP_MON_FILTER_GET(tlv_filter, + FILTER_MD_DATA); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, + FILTER_MD_DATA, dst_filter); + + /* + * Set the monitor direct management filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MD_MGMT); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_MGMT); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_MD_MGMT, dst_filter); + + /* + * Set the monitor direct management filter. + */ + src_filter = DP_MON_FILTER_GET(&mon_filter->tlv_filter, + FILTER_MD_CTRL); + dst_filter = DP_MON_FILTER_GET(tlv_filter, FILTER_MD_CTRL); + dst_filter |= src_filter; + DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter); + } + + dp_mon_filter_show_filter(mon_pdev, 0, filter); +} + QDF_STATUS dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc, struct dp_pdev *pdev, @@ -88,6 +286,11 @@ dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc, ring_buf_size = RX_DATA_BUFFER_SIZE; break; + case DP_MON_FILTER_SRNG_TYPE_RXMON_DEST: + hal_ring_hdl = + soc->rxdma_mon_dst_ring[lmac_id].hal_srng; + hal_ring_type = RXDMA_MONITOR_DST; + ring_buf_size = RX_DATA_BUFFER_SIZE; default: return QDF_STATUS_E_FAILURE; } diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index 2ecda9b67e..9f8cb9ea8b 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -20,6 +20,50 @@ #ifndef _DP_MON_FILTER_H_ #define _DP_MON_FILTER_H_ +/** + * Accessor Macros to access the software + * defined HTT filter htt_rx_ring_tlv_filter. + */ +#define DP_MON_FILTER_TLV_OFFSET 0x00000000 +#define DP_MON_FILTER_TLV_MASK 0xffffffff +#define DP_MON_FILTER_TLV_LSB 0 + +#define DP_MON_FILTER_FP_MGMT_OFFSET 0x00000004 +#define DP_MON_FILTER_FP_MGMT_MASK 0x0000ffff +#define DP_MON_FILTER_FP_MGMT_LSB 0 + +#define DP_MON_FILTER_MO_MGMT_OFFSET 0x00000004 +#define DP_MON_FILTER_MO_MGMT_MASK 0xffff0000 +#define DP_MON_FILTER_MO_MGMT_LSB 16 + +#define DP_MON_FILTER_FP_CTRL_OFFSET 0x00000008 +#define DP_MON_FILTER_FP_CTRL_MASK 0x0000ffff +#define DP_MON_FILTER_FP_CTRL_LSB 0 + +#define DP_MON_FILTER_MO_CTRL_OFFSET 0x00000008 +#define DP_MON_FILTER_MO_CTRL_MASK 0xffff0000 +#define DP_MON_FILTER_MO_CTRL_LSB 16 + +#define DP_MON_FILTER_FP_DATA_OFFSET 0x0000000c +#define DP_MON_FILTER_FP_DATA_MASK 0x0000ffff +#define DP_MON_FILTER_FP_DATA_LSB 0 + +#define DP_MON_FILTER_MO_DATA_OFFSET 0x0000000c +#define DP_MON_FILTER_MO_DATA_MASK 0xffff0000 +#define DP_MON_FILTER_MO_DATA_LSB 16 + +#define DP_MON_FILTER_MD_DATA_OFFSET 0x00000010 +#define DP_MON_FILTER_MD_DATA_MASK 0x0000ffff +#define DP_MON_FILTER_MD_DATA_LSB 0 + +#define DP_MON_FILTER_MD_MGMT_OFFSET 0x00000010 +#define DP_MON_FILTER_MD_MGMT_MASK 0xffff0000 +#define DP_MON_FILTER_MD_MGMT_LSB 16 + +#define DP_MON_FILTER_MD_CTRL_OFFSET 0x00000014 +#define DP_MON_FILTER_MD_CTRL_MASK 0x0000ffff +#define DP_MON_FILTER_MD_CTRL_LSB 0 + #define DP_MON_FILTER_GET(src, field) \ ((*((uint32_t *)((uint8_t *)(src) + DP_MON_ ## field ## _OFFSET)) & \ (DP_MON_ ## field ## _MASK)) >> DP_MON_ ## field ## _LSB) \ @@ -381,4 +425,27 @@ void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev); */ struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev); +/* + * dp_mon_filter_h2t_setup () - Setup filter + * @soc: Dp soc handle + * @pdev: pdev handle + * @srng_type: srng type + * @filter: filter + */ +void dp_mon_filter_h2t_setup(struct dp_soc *soc, struct dp_pdev *pdev, + enum dp_mon_filter_srng_type srng_type, + struct dp_mon_filter *filter); + +/** + * dp_mon_ht2_rx_ring_cfg () - Configure filter to HW + * @soc: Dp soc handle + * @pdev: Dp pdev handle + * @srng_type: SRNG type + * @tlv_filter: filter + */ +QDF_STATUS +dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc, + struct dp_pdev *pdev, + enum dp_mon_filter_srng_type srng_type, + struct htt_rx_ring_tlv_filter *tlv_filter); #endif /* #ifndef _DP_MON_FILTER_H_ */