qcacmn: Enable MLO Link Stats Support

1) Enable MLO Link Stats Support
2) Add Stats counter to capture Invalid Link ID
3) Fix the FW Recovery crash while ol_stats
   disable.

Change-Id: I1b5263ae024579c5ec2018f8082f0d03ffdf0030
CRs-Fixed: 3431319
This commit is contained in:
Kenvish Butani
2023-03-13 21:54:59 +05:30
committed by Madan Koyyalamudi
parent d1ddb7d4fe
commit 1e6fe4c3a2
11 changed files with 98 additions and 50 deletions

View File

@@ -1544,6 +1544,7 @@ struct protocol_trace_count {
* @rts_failure: RTS failure count * @rts_failure: RTS failure count
* @bar_cnt: Block ACK Request frame count * @bar_cnt: Block ACK Request frame count
* @ndpa_cnt: NDP announcement 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 * @wme_ac_type_bytes: Wireless Multimedia Type Bytes Count
* @tx_ucast_total: Total tx unicast count * @tx_ucast_total: Total tx unicast count
* @tx_ucast_success: Total tx unicast success count * @tx_ucast_success: Total tx unicast success count
@@ -1668,6 +1669,7 @@ struct cdp_tx_stats {
uint32_t rts_failure; uint32_t rts_failure;
uint32_t bar_cnt; uint32_t bar_cnt;
uint32_t ndpa_cnt; uint32_t ndpa_cnt;
uint32_t inval_link_id_pkt_cnt;
uint64_t wme_ac_type_bytes[WME_AC_MAX]; uint64_t wme_ac_type_bytes[WME_AC_MAX];
struct cdp_pkt_info tx_ucast_total; struct cdp_pkt_info tx_ucast_total;
struct cdp_pkt_info tx_ucast_success; struct cdp_pkt_info tx_ucast_success;
@@ -1760,6 +1762,7 @@ struct cdp_tx_stats {
* @mcast_3addr_drop: * @mcast_3addr_drop:
* @bar_cnt: Block ACK Request frame count * @bar_cnt: Block ACK Request frame count
* @ndpa_cnt: NDP announcement 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 * @wme_ac_type_bytes: Wireless Multimedia type Byte Count
* @rx_total: Total rx count * @rx_total: Total rx count
*/ */
@@ -1853,6 +1856,7 @@ struct cdp_rx_stats {
uint32_t mcast_3addr_drop; uint32_t mcast_3addr_drop;
uint32_t bar_cnt; uint32_t bar_cnt;
uint32_t ndpa_cnt; uint32_t ndpa_cnt;
uint32_t inval_link_id_pkt_cnt;
uint64_t wme_ac_type_bytes[WME_AC_MAX]; uint64_t wme_ac_type_bytes[WME_AC_MAX];
#ifdef IPA_OFFLOAD #ifdef IPA_OFFLOAD
struct cdp_pkt_info rx_total; struct cdp_pkt_info rx_total;

View File

@@ -2015,13 +2015,13 @@ static void dp_mlo_peer_find_hash_detach_wrapper(struct dp_soc *soc)
} }
#endif #endif
#ifdef DP_MLO_LINK_STATS_SUPPORT #ifdef QCA_ENHANCED_STATS_SUPPORT
static uint8_t static uint8_t
dp_get_hw_link_id_be(struct dp_pdev *pdev) dp_get_hw_link_id_be(struct dp_pdev *pdev)
{ {
struct dp_pdev_be *be_pdev = dp_get_be_pdev_from_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 #else
static uint8_t static uint8_t
@@ -2029,7 +2029,7 @@ dp_get_hw_link_id_be(struct dp_pdev *pdev)
{ {
return 0; return 0;
} }
#endif #endif /* QCA_ENHANCED_STATS_SUPPORT */
static struct dp_peer * static struct dp_peer *
dp_mlo_peer_find_hash_find_be(struct dp_soc *soc, dp_mlo_peer_find_hash_find_be(struct dp_soc *soc,

View File

@@ -568,9 +568,9 @@ done:
#ifdef DP_MLO_LINK_STATS_SUPPORT #ifdef DP_MLO_LINK_STATS_SUPPORT
/* MLD Link Peer Statistics support */ /* MLD Link Peer Statistics support */
if (txrx_peer->is_mld_peer && rx_pdev->link_peer_stats) { if (txrx_peer->is_mld_peer && rx_pdev->link_peer_stats) {
link_id = ((dp_rx_get_msdu_hw_link_id(nbuf)) + 1); link_id = dp_rx_get_stats_arr_idx_from_link_id(
if (link_id < 1 || link_id > DP_MAX_MLO_LINKS) nbuf,
link_id = 0; txrx_peer);
} else { } else {
link_id = 0; link_id = 0;
} }

View File

@@ -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); 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 #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); lmac_id = dp_rx_peer_metadata_lmac_id_get_be(peer_mdata);
qdf_nbuf_set_lmac_id(nbuf, lmac_id); 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 static inline void
dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) 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 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); 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 static inline uint16_t
dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) 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); return HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_tlv_hdr);
} }
#else #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 static inline uint16_t
dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) dp_rx_get_peer_id_be(qdf_nbuf_t nbuf)
{ {

View File

@@ -5357,7 +5357,7 @@ dp_get_peer_hw_link_id(struct dp_soc *soc,
struct dp_pdev *pdev) struct dp_pdev *pdev)
{ {
if (wlan_cfg_is_peer_link_stats_enabled(soc->wlan_cfg_ctx)) 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; return 0;
} }

View File

@@ -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 && if (dp_pdev && dp_pdev->link_peer_stats &&
txrx_peer && txrx_peer->is_mld_peer) { 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, soc,
peer_meta_data)) + 1); peer_meta_data);
if (link_id < 1 || link_id > DP_MAX_MLO_LINKS) if (!link_id) {
link_id = 0; DP_PEER_PER_PKT_STATS_INC(
txrx_peer,
rx.inval_link_id_pkt_cnt,
1, link_id);
}
} else { } else {
link_id = 0; link_id = 0;
} }

View File

@@ -6950,6 +6950,10 @@ void dp_print_peer_stats(struct dp_peer *peer,
dp_peer_print_tx_delay_stats(pdev, 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("Node Rx Stats:");
DP_PRINT_STATS("Packets Sent To Stack = %d", DP_PRINT_STATS("Packets Sent To Stack = %d",
peer_stats->rx.to_stack.num); 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)) if (!IS_MLO_DP_LINK_PEER(peer))
dp_peer_print_rx_delay_stats(pdev, 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); dp_peer_print_reo_qref_table(peer);
} }

View File

@@ -4582,8 +4582,8 @@ dp_tx_update_peer_extd_stats(struct hal_tx_completion_status *ts,
} }
#endif #endif
#ifdef WLAN_FEATURE_11BE_MLO #if defined(WLAN_FEATURE_11BE_MLO) && defined(QCA_ENHANCED_STATS_SUPPORT)
static inline int static inline uint8_t
dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc, dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
struct dp_txrx_peer *txrx_peer, 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_offset = soc->link_id_offset;
link_id_bits = soc->link_id_bits; link_id_bits = soc->link_id_bits;
ppdu_id = ts->ppdu_id; ppdu_id = ts->ppdu_id;
hw_link_id = DP_GET_HW_LINK_ID_FRM_PPDU_ID(ppdu_id, link_id_offset, hw_link_id = ((DP_GET_HW_LINK_ID_FRM_PPDU_ID(ppdu_id, link_id_offset,
link_id_bits); 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 #else
static inline int static inline uint8_t
dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc, dp_tx_get_link_id_from_ppdu_id(struct dp_soc *soc,
struct hal_tx_completion_status *ts, struct hal_tx_completion_status *ts,
struct dp_txrx_peer *txrx_peer, 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; 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); 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_connectivity_stats(soc, vdev, tx_desc, ts->status);
dp_tx_update_uplink_delay(soc, vdev, ts); dp_tx_update_uplink_delay(soc, vdev, ts);

View File

@@ -4260,6 +4260,7 @@ typedef void *dp_txrx_ref_handle;
* @protocol_trace_cnt: per-peer protocol counter * @protocol_trace_cnt: per-peer protocol counter
* @release_src_not_tqm: Counter to keep track of release source is not TQM * @release_src_not_tqm: Counter to keep track of release source is not TQM
* in TX completion status processing * in TX completion status processing
* @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id
*/ */
struct dp_peer_per_pkt_tx_stats { struct dp_peer_per_pkt_tx_stats {
struct cdp_pkt_info ucast; 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]; struct protocol_trace_count protocol_trace_cnt[CDP_TRACE_MAX];
#endif #endif
uint32_t release_src_not_tqm; 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 * @protocol_trace_cnt: per-peer protocol counters
* @mcast_3addr_drop: * @mcast_3addr_drop:
* @rx_total: total rx count * @rx_total: total rx count
* @inval_link_id_pkt_cnt: Counter to capture Invalid Link Id
*/ */
struct dp_peer_per_pkt_rx_stats { struct dp_peer_per_pkt_rx_stats {
struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS]; struct cdp_pkt_info rcvd_reo[CDP_MAX_RX_RINGS];
@@ -4491,6 +4494,7 @@ struct dp_peer_per_pkt_rx_stats {
#ifdef IPA_OFFLOAD #ifdef IPA_OFFLOAD
struct cdp_pkt_info rx_total; struct cdp_pkt_info rx_total;
#endif #endif
uint32_t inval_link_id_pkt_cnt;
}; };
/** /**

View File

@@ -1665,8 +1665,8 @@ struct cdp_mon_ops dp_ops_mon_2_0 = {
.get_mon_pdev_rx_stats = dp_pdev_get_rx_mon_stats, .get_mon_pdev_rx_stats = dp_pdev_get_rx_mon_stats,
.txrx_enable_mon_reap_timer = NULL, .txrx_enable_mon_reap_timer = NULL,
#ifdef QCA_ENHANCED_STATS_SUPPORT #ifdef QCA_ENHANCED_STATS_SUPPORT
.txrx_enable_enhanced_stats = dp_enable_enhanced_stats, .txrx_enable_enhanced_stats = dp_enable_enhanced_stats_2_0,
.txrx_disable_enhanced_stats = dp_disable_enhanced_stats, .txrx_disable_enhanced_stats = dp_disable_enhanced_stats_2_0,
#endif /* QCA_ENHANCED_STATS_SUPPORT */ #endif /* QCA_ENHANCED_STATS_SUPPORT */
#ifdef QCA_SUPPORT_LITE_MONITOR #ifdef QCA_SUPPORT_LITE_MONITOR
.txrx_set_lite_mon_config = dp_lite_mon_set_config, .txrx_set_lite_mon_config = dp_lite_mon_set_config,

View File

@@ -2021,6 +2021,9 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id)
if (!pdev || !pdev->monitor_pdev) if (!pdev || !pdev->monitor_pdev)
return QDF_STATUS_E_FAILURE; return QDF_STATUS_E_FAILURE;
if (pdev->pdev_deinit)
return QDF_STATUS_E_FAILURE;
mon_pdev = pdev->monitor_pdev; mon_pdev = pdev->monitor_pdev;
if (mon_pdev->enhanced_stats_en == 1) if (mon_pdev->enhanced_stats_en == 1)