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:

committed by
Madan Koyyalamudi

parent
d1ddb7d4fe
commit
1e6fe4c3a2
@@ -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;
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -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,
|
||||
|
@@ -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)
|
||||
|
Reference in New Issue
Block a user