diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index fd03ea79f9..6e6aacdf9a 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1544,6 +1544,7 @@ struct protocol_trace_count { * @rts_failure: RTS failure count * @bar_cnt: Block ACK Request frame count * @ndpa_cnt: NDP announcement frame count + * @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id * @wme_ac_type_bytes: Wireless Multimedia Type Bytes Count * @tx_ucast_total: Total tx unicast count * @tx_ucast_success: Total tx unicast success count @@ -1668,6 +1669,7 @@ struct cdp_tx_stats { uint32_t rts_failure; uint32_t bar_cnt; uint32_t ndpa_cnt; + uint32_t inval_link_id_pkt_cnt; uint64_t wme_ac_type_bytes[WME_AC_MAX]; struct cdp_pkt_info tx_ucast_total; struct cdp_pkt_info tx_ucast_success; @@ -1760,6 +1762,7 @@ struct cdp_tx_stats { * @mcast_3addr_drop: * @bar_cnt: Block ACK Request frame count * @ndpa_cnt: NDP announcement frame count + * @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id * @wme_ac_type_bytes: Wireless Multimedia type Byte Count * @rx_total: Total rx count */ @@ -1853,6 +1856,7 @@ struct cdp_rx_stats { uint32_t mcast_3addr_drop; uint32_t bar_cnt; uint32_t ndpa_cnt; + uint32_t inval_link_id_pkt_cnt; uint64_t wme_ac_type_bytes[WME_AC_MAX]; #ifdef IPA_OFFLOAD struct cdp_pkt_info rx_total; diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 50d7779cd8..066b86cf58 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -2015,13 +2015,13 @@ static void dp_mlo_peer_find_hash_detach_wrapper(struct dp_soc *soc) } #endif -#ifdef DP_MLO_LINK_STATS_SUPPORT +#ifdef QCA_ENHANCED_STATS_SUPPORT static uint8_t dp_get_hw_link_id_be(struct dp_pdev *pdev) { struct dp_pdev_be *be_pdev = dp_get_be_pdev_from_dp_pdev(pdev); - return ((be_pdev->mlo_link_id) + 1); + return be_pdev->mlo_link_id; } #else static uint8_t @@ -2029,7 +2029,7 @@ dp_get_hw_link_id_be(struct dp_pdev *pdev) { return 0; } -#endif +#endif /* QCA_ENHANCED_STATS_SUPPORT */ static struct dp_peer * dp_mlo_peer_find_hash_find_be(struct dp_soc *soc, diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index ec1b8dbd32..09736efe12 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -568,9 +568,9 @@ done: #ifdef DP_MLO_LINK_STATS_SUPPORT /* MLD Link Peer Statistics support */ if (txrx_peer->is_mld_peer && rx_pdev->link_peer_stats) { - link_id = ((dp_rx_get_msdu_hw_link_id(nbuf)) + 1); - if (link_id < 1 || link_id > DP_MAX_MLO_LINKS) - link_id = 0; + link_id = dp_rx_get_stats_arr_idx_from_link_id( + nbuf, + txrx_peer); } else { link_id = 0; } diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index 26594fc7bd..c3b5047b5e 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -231,14 +231,6 @@ dp_rx_peer_metadata_lmac_id_get_be(uint32_t peer_metadata) return HTT_RX_PEER_META_DATA_V1_LMAC_ID_GET(peer_metadata); } -static inline uint8_t -dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata) -{ -#ifdef DP_MLO_LINK_STATS_SUPPORT - return HTT_RX_PEER_META_DATA_V1A_LOGICAL_LINK_ID_GET(peer_metadata); -#endif - return 0; -} #ifdef WLAN_FEATURE_NEAR_FULL_IRQ /** @@ -637,6 +629,19 @@ dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata); qdf_nbuf_set_lmac_id(nbuf, lmac_id); } +#else +static inline void +dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) +{ +} +#endif + +#ifndef CONFIG_NBUF_AP_PLATFORM +static inline uint8_t +dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata) +{ + return 0; +} static inline void dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) @@ -648,29 +653,12 @@ dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) } static inline uint8_t -dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf) +dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, + struct dp_txrx_peer *txrx_peer) { return QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf); } -#else -static inline void -dp_rx_set_msdu_lmac_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) -{ -} -static inline void -dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) -{ -} - -static inline uint8_t -dp_rx_get_msdu_hw_link_id(qdf_nbuf_t nbuf) -{ - return QDF_NBUF_CB_RX_HW_LINK_ID(nbuf); -} -#endif - -#ifndef CONFIG_NBUF_AP_PLATFORM static inline uint16_t dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) { @@ -774,6 +762,41 @@ static inline uint8_t hal_rx_get_l3_pad_bytes_be(qdf_nbuf_t nbuf, return HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_tlv_hdr); } #else +static inline uint8_t +dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata) +{ + uint8_t link_id = 0; + + link_id = (HTT_RX_PEER_META_DATA_V1A_LOGICAL_LINK_ID_GET(peer_metadata) + + 1); + if (link_id > DP_MAX_MLO_LINKS) + link_id = 0; + + return link_id; +} + +static inline void +dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) +{ +} + +static inline uint8_t +dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, + struct dp_txrx_peer *txrx_peer) +{ + uint8_t link_id = 0; + + link_id = (QDF_NBUF_CB_RX_HW_LINK_ID(nbuf) + 1); + if (link_id > DP_MAX_MLO_LINKS) { + link_id = 0; + DP_PEER_PER_PKT_STATS_INC(txrx_peer, + rx.inval_link_id_pkt_cnt, + 1, link_id); + } + + return link_id; +} + static inline uint16_t dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) { diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index bfbdeeaadc..d037f0d7d1 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -5357,7 +5357,7 @@ dp_get_peer_hw_link_id(struct dp_soc *soc, struct dp_pdev *pdev) { if (wlan_cfg_is_peer_link_stats_enabled(soc->wlan_cfg_ctx)) - return soc->arch_ops.get_hw_link_id(pdev); + return ((soc->arch_ops.get_hw_link_id(pdev)) + 1); return 0; } diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index e025e86de4..9c19c2e141 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2422,11 +2422,15 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, if (dp_pdev && dp_pdev->link_peer_stats && txrx_peer && txrx_peer->is_mld_peer) { - link_id = ((dp_rx_peer_mdata_link_id_get( + link_id = dp_rx_peer_mdata_link_id_get( soc, - peer_meta_data)) + 1); - if (link_id < 1 || link_id > DP_MAX_MLO_LINKS) - link_id = 0; + peer_meta_data); + if (!link_id) { + DP_PEER_PER_PKT_STATS_INC( + txrx_peer, + rx.inval_link_id_pkt_cnt, + 1, link_id); + } } else { link_id = 0; } diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 28bdec3c8e..6ab052aac7 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -6950,6 +6950,10 @@ void dp_print_peer_stats(struct dp_peer *peer, dp_peer_print_tx_delay_stats(pdev, peer); } + if (IS_MLO_DP_MLD_PEER(peer)) + DP_PRINT_STATS("TX Invalid Link ID Packet Count = %u", + peer_stats->tx.inval_link_id_pkt_cnt); + DP_PRINT_STATS("Node Rx Stats:"); DP_PRINT_STATS("Packets Sent To Stack = %d", peer_stats->rx.to_stack.num); @@ -7123,6 +7127,10 @@ void dp_print_peer_stats(struct dp_peer *peer, if (!IS_MLO_DP_LINK_PEER(peer)) dp_peer_print_rx_delay_stats(pdev, peer); + if (IS_MLO_DP_MLD_PEER(peer)) + DP_PRINT_STATS("RX Invalid Link ID Packet Count = %u", + peer_stats->rx.inval_link_id_pkt_cnt); + dp_peer_print_reo_qref_table(peer); } diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 7072978d7e..6340038077 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4582,8 +4582,8 @@ dp_tx_update_peer_extd_stats(struct hal_tx_completion_status *ts, } #endif -#ifdef WLAN_FEATURE_11BE_MLO -static inline int +#if defined(WLAN_FEATURE_11BE_MLO) && defined(QCA_ENHANCED_STATS_SUPPORT) +static inline uint8_t dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc, struct hal_tx_completion_status *ts, struct dp_txrx_peer *txrx_peer, @@ -4599,13 +4599,19 @@ dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc, link_id_offset = soc->link_id_offset; link_id_bits = soc->link_id_bits; ppdu_id = ts->ppdu_id; - hw_link_id = DP_GET_HW_LINK_ID_FRM_PPDU_ID(ppdu_id, link_id_offset, - link_id_bits); + hw_link_id = ((DP_GET_HW_LINK_ID_FRM_PPDU_ID(ppdu_id, link_id_offset, + link_id_bits)) + 1); + if (hw_link_id > DP_MAX_MLO_LINKS) { + hw_link_id = 0; + DP_PEER_PER_PKT_STATS_INC( + txrx_peer, + tx.inval_link_id_pkt_cnt, 1, hw_link_id); + } - return (hw_link_id + 1); + return hw_link_id; } #else -static inline int +static inline uint8_t dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc, struct hal_tx_completion_status *ts, struct dp_txrx_peer *txrx_peer, @@ -5319,11 +5325,7 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc, } vdev = txrx_peer->vdev; -#ifdef DP_MLO_LINK_STATS_SUPPORT link_id = dp_tx_get_link_id_from_ppdu_id(soc, ts, txrx_peer, vdev); - if (link_id < 1 || link_id > DP_MAX_MLO_LINKS) - link_id = 0; -#endif dp_tx_update_connectivity_stats(soc, vdev, tx_desc, ts->status); dp_tx_update_uplink_delay(soc, vdev, ts); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 56e2530929..cc2076d1c3 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -4260,6 +4260,7 @@ typedef void *dp_txrx_ref_handle; * @protocol_trace_cnt: per-peer protocol counter * @release_src_not_tqm: Counter to keep track of release source is not TQM * in TX completion status processing + * @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id */ struct dp_peer_per_pkt_tx_stats { struct cdp_pkt_info ucast; @@ -4298,6 +4299,7 @@ struct dp_peer_per_pkt_tx_stats { struct protocol_trace_count protocol_trace_cnt[CDP_TRACE_MAX]; #endif uint32_t release_src_not_tqm; + uint32_t inval_link_id_pkt_cnt; }; /** @@ -4452,6 +4454,7 @@ struct dp_peer_extd_tx_stats { * @protocol_trace_cnt: per-peer protocol counters * @mcast_3addr_drop: * @rx_total: total rx count + * @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id */ struct dp_peer_per_pkt_rx_stats { struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS]; @@ -4491,6 +4494,7 @@ struct dp_peer_per_pkt_rx_stats { #ifdef IPA_OFFLOAD struct cdp_pkt_info rx_total; #endif + uint32_t inval_link_id_pkt_cnt; }; /** diff --git a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c index a544d72180..d3518fc6c7 100644 --- a/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c +++ b/dp/wifi3.0/monitor/2.0/dp_mon_2.0.c @@ -1665,8 +1665,8 @@ struct cdp_mon_ops dp_ops_mon_2_0 = { .get_mon_pdev_rx_stats = dp_pdev_get_rx_mon_stats, .txrx_enable_mon_reap_timer = NULL, #ifdef QCA_ENHANCED_STATS_SUPPORT - .txrx_enable_enhanced_stats = dp_enable_enhanced_stats, - .txrx_disable_enhanced_stats = dp_disable_enhanced_stats, + .txrx_enable_enhanced_stats = dp_enable_enhanced_stats_2_0, + .txrx_disable_enhanced_stats = dp_disable_enhanced_stats_2_0, #endif /* QCA_ENHANCED_STATS_SUPPORT */ #ifdef QCA_SUPPORT_LITE_MONITOR .txrx_set_lite_mon_config = dp_lite_mon_set_config, diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index c32c03a557..b0461efd78 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -2021,6 +2021,9 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) if (!pdev || !pdev->monitor_pdev) return QDF_STATUS_E_FAILURE; + if (pdev->pdev_deinit) + return QDF_STATUS_E_FAILURE; + mon_pdev = pdev->monitor_pdev; if (mon_pdev->enhanced_stats_en == 1)