|
@@ -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;
|
|
|
+}
|