diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 13e74c8a5c..1008ea3956 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -1335,8 +1335,11 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc, tgtobj->rx.reception_type[i] += srcobj->stats.rx.reception_type[i]; - tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes; - tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num; + if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) { + tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes; + tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num; + tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed; + } tgtobj->tx.ucast.num += srcobj->stats.tx.ucast.num; tgtobj->tx.ucast.bytes += srcobj->stats.tx.ucast.bytes; tgtobj->tx.mcast.num += srcobj->stats.tx.mcast.num; @@ -1354,7 +1357,6 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc, srcobj->stats.tx.nawds_mcast_drop; tgtobj->tx.num_ppdu_cookie_valid += srcobj->stats.tx.num_ppdu_cookie_valid; - tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed; tgtobj->tx.ofdma += srcobj->stats.tx.ofdma; tgtobj->tx.stbc += srcobj->stats.tx.stbc; tgtobj->tx.ldpc += srcobj->stats.tx.ldpc; @@ -1468,14 +1470,16 @@ static inline void dp_update_vdev_stats(struct dp_soc *soc, for (i = 0; i < MAX_RECEPTION_TYPES; i++) \ DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \ \ - DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \ + if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) { \ + DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \ + DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \ + } \ DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \ DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \ DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \ DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \ DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \ DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \ - DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \ DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \ DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \ DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 8b34472fab..51c2a58e6f 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -6587,6 +6587,24 @@ static inline void dp_peer_rx_bufq_resources_init(struct dp_peer *peer) } #endif +#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT +/* + * dp_peer_hw_txrx_stats_init() - Initialize hw_txrx_stats_en in dp_peer + * @soc: Datapath soc handle + * @peer: Datapath peer handle + * + * Return: none + */ +static inline +void dp_peer_hw_txrx_stats_init(struct dp_soc *soc, struct dp_peer *peer) +{ + peer->hw_txrx_stats_en = + wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx); +} +#else +static inline +void dp_peer_hw_txrx_stats_init(struct dp_soc *soc, struct dp_peer *peer) {} +#endif /* * dp_peer_create_wifi3() - attach txrx peer * @soc_hdl: Datapath soc handle @@ -6666,7 +6684,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, dp_set_peer_isolation(peer, false); dp_wds_ext_peer_init(peer); - + dp_peer_hw_txrx_stats_init(soc, peer); dp_peer_update_state(soc, peer, DP_PEER_STATE_INIT); dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); @@ -6716,7 +6734,7 @@ dp_peer_create_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, dp_peer_add_ast(soc, peer, peer_mac_addr, ast_type, 0); qdf_spinlock_create(&peer->peer_info_lock); dp_wds_ext_peer_init(peer); - + dp_peer_hw_txrx_stats_init(soc, peer); dp_peer_rx_bufq_resources_init(peer); qdf_mem_copy( @@ -8235,6 +8253,8 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev) return; } + soc = pdev->soc; + qdf_mem_zero(&pdev->stats.tx, sizeof(pdev->stats.tx)); qdf_mem_zero(&pdev->stats.rx, sizeof(pdev->stats.rx)); qdf_mem_zero(&pdev->stats.tx_i, sizeof(pdev->stats.tx_i)); @@ -8242,7 +8262,6 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev) if (dp_monitor_is_enable_mcopy_mode(pdev)) DP_UPDATE_STATS(pdev, pdev->invalid_peer); - soc = pdev->soc; qdf_spin_lock_bh(&pdev->vdev_list_lock); TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) { @@ -8293,12 +8312,16 @@ static QDF_STATUS dp_vdev_getstats(struct cdp_vdev *vdev_handle, dp_aggregate_vdev_stats(vdev, vdev_stats); - stats->tx_packets = vdev_stats->tx_i.rcvd.num; - stats->tx_bytes = vdev_stats->tx_i.rcvd.bytes; + stats->tx_packets = vdev_stats->tx.comp_pkt.num; + stats->tx_bytes = vdev_stats->tx.comp_pkt.bytes; - stats->tx_errors = vdev_stats->tx.tx_failed + - vdev_stats->tx_i.dropped.dropped_pkt.num; - stats->tx_dropped = stats->tx_errors; + stats->tx_errors = vdev_stats->tx.tx_failed; + stats->tx_dropped = vdev_stats->tx_i.dropped.dropped_pkt.num + + vdev_stats->tx_i.sg.dropped_host.num + + vdev_stats->tx_i.mcast_en.dropped_map_error + + vdev_stats->tx_i.mcast_en.dropped_self_mac + + vdev_stats->tx_i.mcast_en.dropped_send_fail + + vdev_stats->tx.nawds_mcast_drop; stats->rx_packets = vdev_stats->rx.unicast.num + vdev_stats->rx.multicast.num + @@ -8326,12 +8349,17 @@ static void dp_pdev_getstats(struct cdp_pdev *pdev_handle, dp_aggregate_pdev_stats(pdev); - stats->tx_packets = pdev->stats.tx_i.rcvd.num; - stats->tx_bytes = pdev->stats.tx_i.rcvd.bytes; + stats->tx_packets = pdev->stats.tx.comp_pkt.num; + stats->tx_bytes = pdev->stats.tx.comp_pkt.bytes; - stats->tx_errors = pdev->stats.tx.tx_failed + - pdev->stats.tx_i.dropped.dropped_pkt.num; - stats->tx_dropped = stats->tx_errors; + stats->tx_errors = pdev->stats.tx.tx_failed; + stats->tx_dropped = pdev->stats.tx_i.dropped.dropped_pkt.num + + pdev->stats.tx_i.sg.dropped_host.num + + pdev->stats.tx_i.mcast_en.dropped_map_error + + pdev->stats.tx_i.mcast_en.dropped_self_mac + + pdev->stats.tx_i.mcast_en.dropped_send_fail + + pdev->stats.tx.nawds_mcast_drop + + pdev->stats.tso_stats.dropped_host.num; stats->rx_packets = pdev->stats.rx.unicast.num + pdev->stats.rx.multicast.num + diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index a1d4952a2f..e41cb722b3 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4183,6 +4183,50 @@ out: return; } +#if defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) && \ + defined(QCA_ENHANCED_STATS_SUPPORT) +/* + * dp_tx_update_peer_basic_stats(): Update peer basic stats + * @peer: Datapath peer handle + * @length: Length of the packet + * @tx_status: Tx status from TQM/FW + * @update: enhanced flag value present in dp_pdev + * + * Return: none + */ +static inline +void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length, + uint8_t tx_status, bool update) +{ + if ((!peer->hw_txrx_stats_en) || update) { + DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length); + DP_STATS_INCC(peer, tx.tx_failed, 1, + tx_status != HAL_TX_TQM_RR_FRAME_ACKED); + } +} +#elif defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) +static inline +void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length, + uint8_t tx_status, bool update) +{ + if (!peer->hw_txrx_stats_en) { + DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length); + DP_STATS_INCC(peer, tx.tx_failed, 1, + tx_status != HAL_TX_TQM_RR_FRAME_ACKED); + } +} + +#else +static inline +void dp_tx_update_peer_basic_stats(struct dp_peer *peer, uint32_t length, + uint8_t tx_status, bool update) +{ + DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, length); + DP_STATS_INCC(peer, tx.tx_failed, 1, + tx_status != HAL_TX_TQM_RR_FRAME_ACKED); +} +#endif + /** * dp_tx_comp_process_desc_list() - Tx complete software descriptor handler * @soc: core txrx main context @@ -4220,19 +4264,11 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc, if (qdf_likely(desc->flags & DP_TX_DESC_FLAG_SIMPLE)) { struct dp_pdev *pdev = desc->pdev; - if (qdf_likely(peer)) { - /* - * Increment peer statistics - * Minimal statistics update done here - */ - DP_STATS_INC_PKT(peer, tx.comp_pkt, 1, - desc->length); - - if (desc->tx_status != - HAL_TX_TQM_RR_FRAME_ACKED) - DP_STATS_INC(peer, tx.tx_failed, 1); - } - + if (qdf_likely(peer)) + dp_tx_update_peer_basic_stats(peer, + desc->length, + desc->tx_status, + false); qdf_assert(pdev); dp_tx_outstanding_dec(pdev); @@ -4389,6 +4425,7 @@ void dp_tx_process_htt_completion(struct dp_soc *soc, ts.peer_id = HTT_INVALID_PEER; ts.tid = HTT_INVALID_TID; } + ts.release_src = HAL_TX_COMP_RELEASE_SOURCE_FW; ts.ppdu_id = HTT_TX_WBM_COMPLETION_V2_SCH_CMD_ID_GET( htt_desc[1]); @@ -4414,6 +4451,12 @@ void dp_tx_process_htt_completion(struct dp_soc *soc, peer = dp_peer_get_ref_by_id(soc, ts.peer_id, DP_MOD_ID_HTT_COMP); + if (qdf_likely(peer)) + dp_tx_update_peer_basic_stats(peer, + qdf_nbuf_len(tx_desc->nbuf), + tx_status, + pdev->enhanced_stats_en); + dp_tx_comp_process_tx_status(soc, tx_desc, &ts, peer, ring_id); dp_tx_comp_process_desc(soc, tx_desc, &ts, peer); dp_tx_desc_release(tx_desc, tx_desc->pool_id); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 49a26bcc2d..2f9d07c41f 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1017,6 +1017,8 @@ struct dp_soc_stats { uint32_t hp_oos2; /* tx desc freed as part of vdev detach */ uint32_t tx_comp_exception; + /* TQM drops after/during peer delete */ + uint64_t tqm_drop_no_peer; } tx; /* SOC level RX stats */ @@ -3333,7 +3335,8 @@ struct dp_peer { valid:1, /* valid bit */ in_twt:1, /* in TWT session */ delete_in_progress:1, /* Indicate kickout sent */ - sta_self_peer:1; /* Indicate STA self peer */ + sta_self_peer:1, /* Indicate STA self peer */ + hw_txrx_stats_en:1; /*Indicate HW offload vdev stats */ #ifdef WLAN_FEATURE_11BE_MLO uint8_t assoc_link:1, /* first assoc link peer for MLO */ @@ -3418,6 +3421,7 @@ struct dp_peer { struct dp_wds_ext_peer wds_ext; ol_txrx_rx_fp osif_rx; #endif + #ifdef WLAN_SUPPORT_MESH_LATENCY struct dp_peer_mesh_latency_parameter mesh_latency_params[DP_MAX_TIDS]; #endif