diff --git a/dp/inc/cdp_txrx_ctrl.h b/dp/inc/cdp_txrx_ctrl.h index ff1960d3c6..c6f0a3faf5 100644 --- a/dp/inc/cdp_txrx_ctrl.h +++ b/dp/inc/cdp_txrx_ctrl.h @@ -97,6 +97,35 @@ cdp_update_filter_neighbour_peers(ol_txrx_soc_handle soc, } #endif /* ATH_SUPPORT_NAC || ATH_SUPPORT_NAC_RSSI*/ +/** + * @brief update the monitor buffer and status filter + * @details + * This defines interface function to set/reset monitor filter + * in case of special vap (scan radio) + * + * @param soc - the pointer to soc object + * @param vdev_id - id of the pointer to vdev + * @param cmd - add/del entry into peer table + * @return - QDF_STATUS + */ +static inline QDF_STATUS +cdp_update_mon_mac_filter(ol_txrx_soc_handle soc, + uint8_t vdev_id, uint32_t cmd) +{ + if (!soc || !soc->ops) { + dp_cdp_debug("Invalid Instance:"); + QDF_BUG(0); + return QDF_STATUS_E_FAILURE; + } + + if (!soc->ops->ctrl_ops || + !soc->ops->ctrl_ops->txrx_update_mon_mac_filter) + return QDF_STATUS_E_FAILURE; + + return soc->ops->ctrl_ops->txrx_update_mon_mac_filter + (soc, vdev_id, cmd); +} + #ifdef WLAN_SUPPORT_MSCS /** * @brief record the MSCS data and send it to the Data path diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 10203297f4..ae66ff60fe 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -932,6 +932,9 @@ struct cdp_ctrl_ops { uint32_t *mask, uint32_t *mask_cont); #endif + QDF_STATUS (*txrx_update_mon_mac_filter)(struct cdp_soc_t *soc, + uint8_t vdev_id, + uint32_t cmd); }; struct cdp_me_ops { diff --git a/dp/wifi3.0/dp_htt.h b/dp/wifi3.0/dp_htt.h index e38c8f0acd..bebef93c30 100644 --- a/dp/wifi3.0/dp_htt.h +++ b/dp/wifi3.0/dp_htt.h @@ -629,6 +629,7 @@ struct htt_tx_ring_tlv_filter { * @fpmo_data_filter: FPMO mode data filter * @fpmo_mgmt_filter: FPMO mode mgmt filter * @fpmo_ctrl_filter: FPMO mode ctrl filter + * @enable_mon_mac_filter: enable/disable mac based filter on scan radio * * NOTE: Do not change the layout of this structure */ @@ -693,6 +694,7 @@ struct htt_rx_ring_tlv_filter { u_int16_t fpmo_mgmt_filter; u_int16_t fpmo_ctrl_filter; #endif + bool enable_mon_mac_filter; }; /** 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 766782098d..66c87eb293 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 @@ -1170,6 +1170,8 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc) mon_ops->mon_filter_reset_smart_monitor = dp_mon_filter_reset_smart_monitor_1_0; #endif + mon_ops->mon_filter_set_reset_mon_mac_filter = + dp_mon_set_reset_mon_mac_filter_1_0; #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_filter_setup_rx_enh_capture = dp_mon_filter_setup_rx_enh_capture_1_0; 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 b3fa0ad24c..2e7eeacb2b 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 @@ -661,6 +661,67 @@ void dp_mon_filter_reset_mon_mode_1_0(struct dp_pdev *pdev) mon_pdev->filter[mode][srng_type] = filter; } +static void dp_mon_set_reset_mon_filter(struct dp_mon_filter *filter, bool val) +{ + if (val) { + dp_mon_filter_debug("Set monitor filter settings"); + filter->tlv_filter.enable_mon_mac_filter = 1; + filter->tlv_filter.enable_md = 1; + filter->tlv_filter.md_mgmt_filter = FILTER_MGMT_ALL; + filter->tlv_filter.md_ctrl_filter = FILTER_CTRL_ALL; + filter->tlv_filter.md_data_filter = 0; + } else { + dp_mon_filter_debug("Reset monitor filter settings"); + filter->tlv_filter.enable_mon_mac_filter = 0; + filter->tlv_filter.enable_md = 0; + filter->tlv_filter.md_mgmt_filter = 0; + filter->tlv_filter.md_ctrl_filter = 0; + filter->tlv_filter.md_data_filter = 0; + } +} + +/** + * dp_mon_set_reset_mon_mac_filter_1_0() - Set/Reset monitor buffer and status + * filter + * @pdev: DP pdev handle + * @val: Set or reset the filter + * + * Return: void + */ +void dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev *pdev, bool val) +{ + struct dp_mon_filter filter = {0}; + 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_mon_pdev *mon_pdev; + + if (!pdev) { + dp_mon_filter_err("pdev Context is null"); + return; + } + + mon_pdev = pdev->monitor_pdev; + + /* Set monitor buffer filter */ + dp_mon_filter_debug("Updating monitor buffer filter"); + filter.valid = true; + dp_mon_set_reset_mon_filter(&filter, val); + dp_mon_filter_set_reset_mon_dest(pdev, &filter); + + /* Set status cmn filter */ + dp_mon_filter_debug("Updating monitor status cmn filter"); + qdf_mem_zero(&(filter), sizeof(struct dp_mon_filter)); + filter.valid = true; + dp_mon_filter_set_status_cmn(mon_pdev, &filter); + dp_mon_set_reset_mon_filter(&filter, val); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + + /* Store the above filter */ + srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + mon_pdev->filter[mode][srng_type] = filter; +} + #ifdef WDI_EVENT_ENABLE void dp_mon_filter_setup_rx_pkt_log_full_1_0(struct dp_pdev *pdev) { 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 2b03ebaa23..f39ecf09e3 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 @@ -109,6 +109,13 @@ static inline void dp_mon_filter_reset_smart_monitor_1_0(struct dp_pdev *pdev) } #endif +/** + * dp_mon_set_reset_mon_mac_filter_1_0() - Set/Reset the monitor mode filter + * @pdev: DP pdev handle + * @val: Indicate set/reset filter + */ +void dp_mon_set_reset_mon_mac_filter_1_0(struct dp_pdev *pdev, bool val); + #ifdef WLAN_RX_PKT_CAPTURE_ENH /** * dp_mon_filter_setup_rx_enh_capture() - Setup the Rx capture mode filters diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index 8e47c4e4e2..230ab4dc39 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -1479,6 +1479,54 @@ fail0: } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +/* + * dp_update_mon_mac_filter() - Set/reset monitor mac filter + * @soc_hdl: cdp soc handle + * @vdev_id: id of virtual device object + * @cmd: Add/Del command + * + * Return: 0 for success. nonzero for failure. + */ +static QDF_STATUS dp_update_mon_mac_filter(struct cdp_soc_t *soc_hdl, + uint8_t vdev_id, uint32_t cmd) +{ + struct dp_soc *soc = (struct dp_soc *)soc_hdl; + struct dp_pdev *pdev; + struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, + DP_MOD_ID_CDP); + struct dp_mon_pdev *mon_pdev; + QDF_STATUS status = QDF_STATUS_E_FAILURE; + + if (!vdev) + return status; + + pdev = vdev->pdev; + if (!pdev) { + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); + return status; + } + + mon_pdev = pdev->monitor_pdev; + if (cmd == DP_NAC_PARAM_ADD) { + /* first neighbour added */ + dp_mon_filter_set_reset_mon_mac_filter(pdev, true); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) { + dp_cdp_err("%pK: Mon mac filter set failed", soc); + dp_mon_filter_set_reset_mon_mac_filter(pdev, false); + } + } else if (cmd == DP_NAC_PARAM_DEL) { + /* last neighbour deleted */ + dp_mon_filter_set_reset_mon_mac_filter(pdev, false); + status = dp_mon_filter_update(pdev); + if (status != QDF_STATUS_SUCCESS) + dp_cdp_err("%pK: Mon mac filter reset failed", soc); + } + + dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); + return status; +} + #ifdef ATH_SUPPORT_NAC_RSSI /** * dp_vdev_get_neighbour_rssi(): Store RSSI for configured NAC @@ -5798,6 +5846,11 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) dp_cfr_filter_register_1_0(ops); #endif + if (target_type == TARGET_TYPE_QCN9000) + ops->ctrl_ops->txrx_update_mon_mac_filter = + dp_update_mon_mac_filter; + else + ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; case TARGET_TYPE_QCN9224: case TARGET_TYPE_QCA5332: @@ -5817,6 +5870,7 @@ void dp_mon_cdp_ops_register(struct dp_soc *soc) dp_cfr_filter_register_2_0(ops); #endif #endif /* QCA_MONITOR_2_0_SUPPORT */ + ops->ctrl_ops->txrx_update_mon_mac_filter = NULL; break; default: dp_mon_err("%s: Unknown tgt type %d", __func__, target_type); @@ -6129,6 +6183,7 @@ void dp_mon_feature_ops_deregister(struct dp_soc *soc) #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) mon_ops->mon_filter_setup_smart_monitor = NULL; #endif + mon_ops->mon_filter_set_reset_mon_mac_filter = NULL; #ifdef WLAN_RX_PKT_CAPTURE_ENH mon_ops->mon_filter_setup_rx_enh_capture = NULL; #endif diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index 4fd55580b0..91753d65d0 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -738,6 +738,8 @@ struct dp_mon_ops { void (*mon_filter_setup_smart_monitor)(struct dp_pdev *pdev); void (*mon_filter_reset_smart_monitor)(struct dp_pdev *pdev); #endif + void (*mon_filter_set_reset_mon_mac_filter)(struct dp_pdev *pdev, + bool val); #ifdef WLAN_RX_PKT_CAPTURE_ENH void (*mon_filter_setup_rx_enh_capture)(struct dp_pdev *pdev); void (*mon_filter_reset_rx_enh_capture)(struct dp_pdev *pdev); diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index 93a6de5694..2f7ca1b0d2 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -434,6 +434,15 @@ void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev) } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +void dp_mon_filter_set_reset_mon_mac_filter(struct dp_pdev *pdev, bool val) +{ + struct dp_mon_ops *mon_ops = NULL; + + mon_ops = dp_mon_ops_get(pdev->soc); + if (mon_ops && mon_ops->mon_filter_set_reset_mon_mac_filter) + mon_ops->mon_filter_set_reset_mon_mac_filter(pdev, val); +} + #ifdef WLAN_RX_PKT_CAPTURE_ENH void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) { diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index d5052457ef..967f654efd 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -267,6 +267,13 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev); void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev); #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ +/** + * dp_mon_filter_set_reset_mon_mac_filter() - Setup the monitor mac filter + * @pdev: DP pdev handle + * @val: indicating set/reset + */ +void dp_mon_filter_set_reset_mon_mac_filter(struct dp_pdev *pdev, bool val); + #ifdef WLAN_RX_PKT_CAPTURE_ENH /** * dp_mon_filter_setup_rx_enh_capture() - Setup the Rx capture mode filters