From 8482a0c0fc3b7ba1a28a5a8d839d3b632ce8677f Mon Sep 17 00:00:00 2001 From: Aditya Sathish Date: Thu, 9 May 2019 11:03:42 +0530 Subject: [PATCH] qcacmn: Add support to update vdev stats through CDP Add CDP support to update vdev stats from the higher layers. The CDP API takes a buffer which is then used to update parts the cdp_vdev_stats structure depending on the stats ID that is sent through the API. This change adds support for vdev tx ingress stats only. Extended support can be added as required by adding a new stats ID. Change-Id: I13d6fb946c8a3dbb0b499b7b026d83b080411d15 CRs-Fixed: 2384177 --- dp/inc/cdp_txrx_cmn.h | 12 +++++++ dp/inc/cdp_txrx_host_stats.h | 31 +++++++++++++++++ dp/wifi3.0/dp_main.c | 67 ++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index cb2662f1fde5..6c4f2a18bdc7 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -76,6 +76,18 @@ enum verbose_debug_module { #define dp_info_rl(params...) QDF_TRACE_INFO_RL(QDF_MODULE_ID_DP, params) #define dp_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_DP, params) +/** + * @enum vdev_host_stats_id: + * host stats update from CDP have to set one of the following stats ID + * + * @DP_VDEV_STATS_PKT_CNT_ONLY: update Tx packet count only + * @DP_VDEV_STATS_TX_ME: update Tx ingress stats + */ +enum { + DP_VDEV_STATS_PKT_CNT_ONLY, + DP_VDEV_STATS_TX_ME, +}; + static inline QDF_STATUS cdp_soc_attach_target(ol_txrx_soc_handle soc) { diff --git a/dp/inc/cdp_txrx_host_stats.h b/dp/inc/cdp_txrx_host_stats.h index 22b77517f2ec..69d90e98d361 100644 --- a/dp/inc/cdp_txrx_host_stats.h +++ b/dp/inc/cdp_txrx_host_stats.h @@ -463,6 +463,37 @@ cdp_update_pdev_host_stats(ol_txrx_soc_handle soc, (pdev, data, stats_id); } +/** + * @brief Update vdev host stats + * + * @param soc - soc handle + * @param vdev - the physical device object + * @param data - pdev stats + * @param stats_id - type of stats + * + * @return - void + */ +static inline void +cdp_update_vdev_host_stats(ol_txrx_soc_handle soc, + struct cdp_vdev *vdev, + void *data, + uint16_t stats_id) +{ + if (!soc || !soc->ops) { + QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, + "%s: Invalid Instance", __func__); + QDF_BUG(0); + return; + } + + if (!soc->ops->host_stats_ops || + !soc->ops->host_stats_ops->txrx_update_vdev_stats) + return; + + return soc->ops->host_stats_ops->txrx_update_vdev_stats(vdev, data, + stats_id); +} + /** * @brief Call to get peer stats * diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 47cc523036f8..a013b0b0ffce 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -7501,6 +7501,72 @@ dp_txrx_get_pdev_stats(struct cdp_pdev *pdev_handle) return &pdev->stats; } +/* dp_txrx_update_vdev_me_stats(): Update vdev ME stats sent from CDP + * @vdev_handle: DP vdev handle + * @buf: buffer containing specific stats structure + * + * Returns: void + */ +static void dp_txrx_update_vdev_me_stats(struct cdp_vdev *vdev_handle, + void *buf) +{ + struct dp_vdev *vdev = NULL; + struct cdp_tx_ingress_stats *host_stats = NULL; + + if (!vdev_handle) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid vdev handle"); + return; + } + vdev = (struct dp_vdev *)vdev_handle; + + if (!buf) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Invalid host stats buf"); + return; + } + host_stats = (struct cdp_tx_ingress_stats *)buf; + + DP_STATS_INC_PKT(vdev, tx_i.mcast_en.mcast_pkt, + host_stats->mcast_en.mcast_pkt.num, + host_stats->mcast_en.mcast_pkt.bytes); + DP_STATS_INC(vdev, tx_i.mcast_en.dropped_map_error, + host_stats->mcast_en.dropped_map_error); + DP_STATS_INC(vdev, tx_i.mcast_en.dropped_self_mac, + host_stats->mcast_en.dropped_self_mac); + DP_STATS_INC(vdev, tx_i.mcast_en.dropped_send_fail, + host_stats->mcast_en.dropped_send_fail); + DP_STATS_INC(vdev, tx_i.mcast_en.ucast, + host_stats->mcast_en.ucast); + DP_STATS_INC(vdev, tx_i.mcast_en.fail_seg_alloc, + host_stats->mcast_en.fail_seg_alloc); + DP_STATS_INC(vdev, tx_i.mcast_en.clone_fail, + host_stats->mcast_en.clone_fail); +} + +/* dp_txrx_update_vdev_host_stats(): Update stats sent through CDP + * @vdev_handle: DP vdev handle + * @buf: buffer containing specific stats structure + * @stats_id: stats type + * + * Returns: void + */ +static void dp_txrx_update_vdev_host_stats(struct cdp_vdev *vdev_handle, + void *buf, + uint16_t stats_id) +{ + switch (stats_id) { + case DP_VDEV_STATS_PKT_CNT_ONLY: + break; + case DP_VDEV_STATS_TX_ME: + dp_txrx_update_vdev_me_stats(vdev_handle, buf); + break; + default: + qdf_info("Invalid stats_id %d", stats_id); + break; + } +} + /* dp_txrx_get_peer_stats - will return cdp_peer_stats * @peer_handle: DP_PEER handle * @@ -8806,6 +8872,7 @@ static struct cdp_host_stats_ops dp_ops_host_stats = { .txrx_get_pdev_stats = dp_txrx_get_pdev_stats, .txrx_get_ratekbps = dp_txrx_get_ratekbps, .configure_rate_stats = dp_set_rate_stats_cap, + .txrx_update_vdev_stats = dp_txrx_update_vdev_host_stats, /* TODO */ };