From 4b6f9e082bac19eea3c7bcbfcdb03f80408d58ac Mon Sep 17 00:00:00 2001 From: Rakesh Pillai Date: Fri, 28 Aug 2020 09:19:16 -0700 Subject: [PATCH] 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 --- dp/inc/cdp_txrx_misc.h | 25 +++++++++++++++++++++++++ dp/inc/cdp_txrx_ops.h | 17 +++++++++++++++++ dp/wifi3.0/dp_main.c | 41 +++++++++++++++++++++++++++++++++++++++++ dp/wifi3.0/dp_types.h | 1 + 4 files changed, 84 insertions(+) diff --git a/dp/inc/cdp_txrx_misc.h b/dp/inc/cdp_txrx_misc.h index 1db265f6ff..d152faa877 100644 --- a/dp/inc/cdp_txrx_misc.h +++ b/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_ */ diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 265612778c..f88d5aae8e 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/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); }; /** diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5ae3e77556..43ac1c8bc1 100644 --- a/dp/wifi3.0/dp_main.c +++ b/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 diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 79b4ced68c..49c6856225 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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; };