Browse Source

qcacld-3.0: Add support to control fisa per vdev at runtime

Add support to enable or disable fisa aggregation per
vdev at runtime.

Change-Id: I4f19e09631de921b3e006fbe026ea728e95e3f83
CRs-Fixed: 2739427
Yeshwanth Sriram Guntuka 4 years ago
parent
commit
84e341f395
2 changed files with 87 additions and 0 deletions
  1. 75 0
      core/dp/txrx3.0/dp_fisa_rx.c
  2. 12 0
      core/dp/txrx3.0/dp_fisa_rx.h

+ 75 - 0
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;
+}

+ 12 - 0
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)
 {