ソースを参照

qcacmn: Add CDP API to save low latency connection count

The 11g and 11a connections are latency critical and
hence the tx coalescing cannot be applied on traffic
running for these connections.

Add a CDP API to save the number of low latency
connection in the dtapath vdev handle. The Software
latency manager can use this information to decide
and skip the tx register write coalescing for packet
transmission on low latency connections.

Change-Id: Iff51867447e9d4537a3637cb65d94e184e4249ef
CRs-Fixed: 2769025
Rakesh Pillai 4 年 前
コミット
4b6f9e082b
4 ファイル変更84 行追加0 行削除
  1. 25 0
      dp/inc/cdp_txrx_misc.h
  2. 17 0
      dp/inc/cdp_txrx_ops.h
  3. 41 0
      dp/wifi3.0/dp_main.c
  4. 1 0
      dp/wifi3.0/dp_types.h

+ 25 - 0
dp/inc/cdp_txrx_misc.h

@@ -794,4 +794,29 @@ cdp_request_rx_hw_stats(ol_txrx_soc_handle soc, uint8_t vdev_id)
 
 	return QDF_STATUS_SUCCESS;
 }
+
+/**
+ * cdp_vdev_inform_ll_conn() - Inform DP about the low latency connection
+ * @soc: soc handle
+ * @vdev_id: vdev id
+ * @action: Action to be performed (Add/Delete)
+ *
+ * Returns: QDF_STATUS
+ */
+static inline QDF_STATUS
+cdp_vdev_inform_ll_conn(ol_txrx_soc_handle soc, uint8_t vdev_id,
+			enum vdev_ll_conn_actions action)
+{
+	if (!soc || !soc->ops || !soc->ops->misc_ops) {
+		QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Invalid Instance:", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (soc->ops->misc_ops->vdev_inform_ll_conn)
+		return soc->ops->misc_ops->vdev_inform_ll_conn(soc, vdev_id,
+							       action);
+
+	return QDF_STATUS_SUCCESS;
+}
 #endif /* _CDP_TXRX_MISC_H_ */

+ 17 - 0
dp/inc/cdp_txrx_ops.h

@@ -82,6 +82,17 @@ enum vdev_peer_protocol_tx_rx {
 	CDP_VDEV_PEER_PROTOCOL_IS_RX
 };
 
+/**
+ * enum vdev_ll_conn_actions - Actions to informvdev about
+ *			       low latency connection.
+ * @CDP_VDEV_LL_CONN_ADD: Add Low latency connection
+ * @CDP_VDEV_LL_CONN_DEL: Delete Low latency connection
+ */
+enum vdev_ll_conn_actions {
+	CDP_VDEV_LL_CONN_ADD,
+	CDP_VDEV_LL_CONN_DEL
+};
+
 /******************************************************************************
  *
  * Control Interface (A Interface)
@@ -1153,6 +1164,9 @@ struct ol_if_ops {
  * @pdev_reset_driver_del_ack: reset driver delayed ack enabled flag
  * @vdev_set_driver_del_ack_enable: set driver delayed ack enabled flag
  *
+ * @vdev_inform_ll_conn: inform DP to add/delete a latency critical connection
+ *			 for this particular vdev.
+ *
  * Function pointers for miscellaneous soc/pdev/vdev related operations.
  */
 struct cdp_misc_ops {
@@ -1234,6 +1248,9 @@ struct cdp_misc_ops {
 					     struct cdp_txrx_ext_stats *req);
 	QDF_STATUS (*request_rx_hw_stats)(struct cdp_soc_t *soc_hdl,
 					  uint8_t vdev_id);
+	QDF_STATUS (*vdev_inform_ll_conn)(struct cdp_soc_t *soc_hdl,
+					  uint8_t vdev_id,
+					  enum vdev_ll_conn_actions action);
 };
 
 /**

+ 41 - 0
dp/wifi3.0/dp_main.c

@@ -9800,6 +9800,46 @@ dp_vdev_set_dp_ext_handle(ol_txrx_soc_handle soc_hdl, uint8_t vdev_id,
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * dp_vdev_inform_ll_conn() - Inform vdev to add/delete a latency critical
+ *			      connection for this vdev
+ * @soc_hdl: CDP soc handle
+ * @vdev_id: vdev ID
+ * @action: Add/Delete action
+ *
+ * Returns: QDF_STATUS.
+ */
+static QDF_STATUS
+dp_vdev_inform_ll_conn(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+		       enum vdev_ll_conn_actions action)
+{
+	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
+	struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id,
+						     DP_MOD_ID_CDP);
+
+	if (!vdev) {
+		dp_err("LL connection action for invalid vdev %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	switch (action) {
+	case CDP_VDEV_LL_CONN_ADD:
+		vdev->num_latency_critical_conn++;
+		break;
+
+	case CDP_VDEV_LL_CONN_DEL:
+		vdev->num_latency_critical_conn--;
+		break;
+
+	default:
+		dp_err("LL connection action invalid %d", action);
+		break;
+	}
+
+	dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP);
+	return QDF_STATUS_SUCCESS;
+}
+
 /**
  * dp_soc_get_dp_txrx_handle() - get context for external-dp from dp soc
  * @soc_handle: datapath soc handle
@@ -11168,6 +11208,7 @@ static struct cdp_misc_ops dp_ops_misc = {
 	.txrx_ext_stats_request = dp_txrx_ext_stats_request,
 	.request_rx_hw_stats = dp_request_rx_hw_stats,
 #endif /* WLAN_FEATURE_STATS_EXT */
+	.vdev_inform_ll_conn = dp_vdev_inform_ll_conn,
 };
 #endif
 

+ 1 - 0
dp/wifi3.0/dp_types.h

@@ -2387,6 +2387,7 @@ struct dp_vdev {
 	 */
 	qdf_atomic_t ref_cnt;
 	qdf_atomic_t mod_refs[DP_MOD_ID_MAX];
+	uint8_t num_latency_critical_conn;
 };