diff --git a/dp/inc/cdp_txrx_misc.h b/dp/inc/cdp_txrx_misc.h index 1db265f6ffe0..d152faa877f5 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 265612778cbb..f88d5aae8e8a 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 5ae3e77556dc..43ac1c8bc1f7 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 79b4ced68c70..49c6856225f6 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; };