diff --git a/core/dp/txrx3.0/dp_fisa_rx.c b/core/dp/txrx3.0/dp_fisa_rx.c index 552e7d672759b..4a1483be52e86 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.c +++ b/core/dp/txrx3.0/dp_fisa_rx.c @@ -1122,6 +1122,65 @@ static bool dp_is_nbuf_bypass_fisa(qdf_nbuf_t nbuf) return false; } +/** + * dp_rx_fisa_flush_by_vdev_ctx_id() - Flush fisa aggregates per vdev and rx + * context id + * @soc: core txrx main context + * @vdev: Handle DP vdev + * @rx_ctx_id: Rx context id + * + * Return: Success on flushing the flows for the vdev and rx ctx id + */ +static +QDF_STATUS dp_rx_fisa_flush_by_vdev_ctx_id(struct dp_soc *soc, + struct dp_vdev *vdev, + uint8_t rx_ctx_id) +{ + struct dp_rx_fst *fisa_hdl = soc->rx_fst; + struct dp_fisa_rx_sw_ft *sw_ft_entry = + (struct dp_fisa_rx_sw_ft *)fisa_hdl->base; + int ft_size = fisa_hdl->max_entries; + int i; + + for (i = 0; i < ft_size; i++) { + if (sw_ft_entry[i].is_populated && + vdev == sw_ft_entry[i].vdev && + sw_ft_entry[i].napi_id == rx_ctx_id) { + dp_fisa_debug("flushing %d %pk vdev %pK napi id:%d", i, + &sw_ft_entry[i], vdev, rx_ctx_id); + dp_rx_fisa_flush_flow_wrap(&sw_ft_entry[i]); + } + } + + return QDF_STATUS_SUCCESS; +} + +/** + * dp_fisa_disallowed_for_vdev() - Check if fisa is allowed on vdev + * @soc: core txrx main context + * @vdev: Handle DP vdev + * @rx_ctx_id: Rx context id + * + * Return: true if fisa is disallowed for vdev else false + */ +static bool dp_fisa_disallowed_for_vdev(struct dp_soc *soc, + struct dp_vdev *vdev, + uint8_t rx_ctx_id) +{ + if (!vdev->fisa_disallowed[rx_ctx_id]) { + if (vdev->fisa_force_flushed[rx_ctx_id]) + vdev->fisa_force_flushed[rx_ctx_id] = 0; + return false; + } + + if (!vdev->fisa_force_flushed[rx_ctx_id]) { + dp_rx_fisa_flush_by_vdev_ctx_id(soc, vdev, rx_ctx_id); + vdev->fisa_force_flushed[rx_ctx_id] = 1; + } + + return true; +} + /** * dp_fisa_rx() - Entry function to FISA to handle aggregation * @soc: core txrx main context @@ -1150,6 +1209,9 @@ QDF_STATUS dp_fisa_rx(struct dp_soc *soc, struct dp_vdev *vdev, if (dp_is_nbuf_bypass_fisa(head_nbuf)) goto deliver_nbuf; + if (dp_fisa_disallowed_for_vdev(soc, vdev, rx_ctx_id)) + goto deliver_nbuf; + if (qdf_atomic_read(&soc->skip_fisa_param.skip_fisa)) { if (!soc->skip_fisa_param.fisa_force_flush[rx_ctx_id]) { dp_rx_fisa_flush_by_ctx_id(soc, rx_ctx_id); @@ -1305,3 +1367,16 @@ QDF_STATUS dp_rx_fisa_flush_by_vdev_id(struct dp_soc *soc, uint8_t vdev_id) return QDF_STATUS_SUCCESS; } + +void dp_set_fisa_disallowed_for_vdev(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, + uint8_t rx_ctx_id, uint8_t val) +{ + struct dp_soc *soc = (struct dp_soc *)cdp_soc; + struct dp_vdev *vdev; + + vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id); + if (qdf_unlikely(!vdev)) + return; + + vdev->fisa_disallowed[rx_ctx_id] = val; +} diff --git a/core/dp/txrx3.0/dp_fisa_rx.h b/core/dp/txrx3.0/dp_fisa_rx.h index c0081f0b166d7..2642c584ae4ab 100644 --- a/core/dp/txrx3.0/dp_fisa_rx.h +++ b/core/dp/txrx3.0/dp_fisa_rx.h @@ -90,6 +90,18 @@ void dp_rx_skip_fisa(struct cdp_soc_t *cdp_soc, uint32_t value) qdf_atomic_set(&soc->skip_fisa_param.skip_fisa, !value); } + +/** + * dp_set_fisa_disallowed_for_vdev() - Set fisa disallowed flag for vdev + * @cdp_soc: core txrx main context + * @vdev_id: Vdev id + * @rx_ctx_id: rx context id + * @val: value to be set + * + * Return: None + */ +void dp_set_fisa_disallowed_for_vdev(struct cdp_soc_t *cdp_soc, uint8_t vdev_id, + uint8_t rx_ctx_id, uint8_t val); #else static QDF_STATUS dp_rx_dump_fisa_stats(struct dp_soc *soc) {