qcacmn: rx stats update for WKK

Add function pointer to update stats for LI and WKK
Add new fields in structure cdp rx stats

CRs-Fixed: 3071271
Change-Id: I6a1d7afbdfe47d171335d55bf66d210d785f5a03
This commit is contained in:
aloksing
2021-10-26 13:55:46 +05:30
committed by Madan Koyyalamudi
parent b093d034a4
commit b726e009e7
9 changed files with 208 additions and 18 deletions

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -30,6 +31,9 @@ enum CMN_BW_TYPES {
CMN_BW_80MHZ,
CMN_BW_160MHZ,
CMN_BW_80_80MHZ,
#ifdef WLAN_FEATURE_11BE
CMN_BW_320MHZ,
#endif
CMN_BW_CNT,
CMN_BW_IDLE = 0xFF, /*default BW state */
};

View File

@@ -2248,6 +2248,7 @@ struct cdp_tx_completion_msdu {
* @mpdu_fcs_ok_bitmap - MPDU with fcs ok bitmap
* @retries - number of retries
* @rx_ratekpbs - rx rate in kbps
* @mpdu_retries - retries of mpdu in rx
*/
struct cdp_rx_stats_ppdu_user {
uint16_t peer_id;
@@ -2285,6 +2286,7 @@ struct cdp_rx_stats_ppdu_user {
uint32_t mpdu_err_byte_count;
uint32_t retries;
uint32_t rx_ratekbps;
uint32_t mpdu_retries;
};
/**
@@ -2334,6 +2336,7 @@ struct cdp_rx_stats_ppdu_user {
* @user: per user stats in MU-user case
* @nf: noise floor
* @per_chain_rssi: rssi per antenna
* @punc_bw: puncered bw
*/
struct cdp_rx_indication_ppdu {
uint32_t ppdu_id;
@@ -2394,6 +2397,7 @@ struct cdp_rx_indication_ppdu {
#if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
struct cdp_rx_ppdu_cfr_info cfr_info;
#endif
uint8_t punc_bw;
};
/**

View File

@@ -1424,6 +1424,9 @@ struct cdp_tx_stats {
* <enum 3 3_2_us_sgi > HE
* @preamble_info: preamble
* @to_stack_twt: Total packets sent up the stack in TWT session
* @mpdu_retry_cnt: retries of mpdu in rx
* @su_be_ppdu_cnt: SU Rx packet count for BE
* @rx_mu_be: MU rx packet count for BE
*/
struct cdp_rx_stats {
struct cdp_pkt_info to_stack;
@@ -1505,6 +1508,11 @@ struct cdp_rx_stats {
gi_info:4,
preamble_info:4;
struct cdp_pkt_info to_stack_twt;
uint32_t mpdu_retry_cnt;
#ifdef WLAN_FEATURE_11BE
struct cdp_pkt_type su_be_ppdu_cnt;
struct cdp_pkt_type rx_mu_be[TXRX_TYPE_MU_MAX];
#endif
};
/* struct cdp_tx_ingress_stats - Tx ingress Stats

View File

@@ -53,6 +53,15 @@ extern enum timer_yield_status
dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done,
uint64_t start_time);
#ifdef QCA_ENHANCED_STATS_SUPPORT
void
dp_mon_populate_ppdu_info_1_0(struct hal_rx_ppdu_info *hal_ppdu_info,
struct cdp_rx_indication_ppdu *ppdu)
{
ppdu->punc_bw = 0;
}
#endif
#ifdef QCA_SUPPORT_FULL_MON
static QDF_STATUS
dp_config_full_mon_mode(struct cdp_soc_t *soc_handle,
@@ -945,6 +954,11 @@ dp_mon_register_feature_ops_1_0(struct dp_soc *soc)
dp_vdev_set_monitor_mode_buf_rings;
mon_ops->mon_vdev_set_monitor_mode_rings =
dp_vdev_set_monitor_mode_rings;
#ifdef QCA_ENHANCED_STATS_SUPPORT
mon_ops->mon_rx_stats_update = NULL;
mon_ops->mon_rx_populate_ppdu_usr_info = NULL;
mon_ops->mon_rx_populate_ppdu_info = dp_mon_populate_ppdu_info_1_0;
#endif
}
struct dp_mon_ops monitor_ops_1_0 = {

View File

@@ -926,6 +926,12 @@ dp_mon_register_feature_ops_2_0(struct dp_soc *soc)
dp_vdev_set_monitor_mode_buf_rings_2_0;
mon_ops->mon_vdev_set_monitor_mode_rings =
dp_vdev_set_monitor_mode_rings_2_0;
#ifdef QCA_ENHANCED_STATS_SUPPORT
mon_ops->mon_rx_stats_update = dp_mon_rx_stats_update_2_0;
mon_ops->mon_rx_populate_ppdu_usr_info =
dp_mon_populate_ppdu_usr_info_2_0;
mon_ops->mon_rx_populate_ppdu_info = dp_mon_populate_ppdu_info_2_0;
#endif
}
struct dp_mon_ops monitor_ops_2_0 = {

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2021, The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -198,3 +199,78 @@ dp_rx_mon_buffers_alloc(struct dp_soc *soc)
mon_soc->rx_mon_ring_fill_level,
&desc_list, &tail);
}
#ifdef QCA_ENHANCED_STATS_SUPPORT
void
dp_mon_populate_ppdu_usr_info_2_0(struct mon_rx_user_status *rx_user_status,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
ppdu_user->mpdu_retries = rx_user_status->retry_mpdu;
}
#ifdef WLAN_FEATURE_11BE
void dp_mon_rx_stats_update_2_0(struct dp_peer *peer,
struct cdp_rx_indication_ppdu *ppdu,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
uint8_t mcs, preamble, ppdu_type;
preamble = ppdu->u.preamble;
ppdu_type = ppdu->u.ppdu_type;
if (ppdu_type == HAL_RX_TYPE_SU)
mcs = ppdu->u.mcs;
else
mcs = ppdu_user->mcs;
DP_STATS_INC(peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries);
DP_STATS_INCC(peer,
rx.su_be_ppdu_cnt.mcs_count[MAX_MCS - 1], 1,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_SU)));
DP_STATS_INCC(peer,
rx.su_be_ppdu_cnt.mcs_count[mcs], 1,
((mcs < (MAX_MCS - 1)) && (preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_SU)));
DP_STATS_INCC(peer,
rx.rx_mu_be[TXRX_TYPE_MU_OFDMA].ppdu.mcs_count[MAX_MCS - 1],
1, ((mcs >= (MAX_MCS - 1)) &&
(preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_MU_OFDMA)));
DP_STATS_INCC(peer,
rx.rx_mu_be[TXRX_TYPE_MU_OFDMA].ppdu.mcs_count[mcs],
1, ((mcs < (MAX_MCS - 1)) &&
(preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_MU_OFDMA)));
DP_STATS_INCC(peer,
rx.rx_mu_be[TXRX_TYPE_MU_MIMO].ppdu.mcs_count[MAX_MCS - 1],
1, ((mcs >= (MAX_MCS - 1)) &&
(preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_MU_MIMO)));
DP_STATS_INCC(peer,
rx.rx_mu_be[TXRX_TYPE_MU_MIMO].ppdu.mcs_count[mc],
1, ((mcs < (MAX_MCS - 1)) &&
(preamble == DOT11_BE) &&
(ppdu_type == HAL_RX_TYPE_MU_MIMO)));
}
void
dp_mon_populate_ppdu_info_2_0(struct hal_rx_ppdu_info *hal_ppdu_info,
struct cdp_rx_indication_ppdu *ppdu)
{
ppdu->punc_bw = hal_ppdu_info->rx_status.punctured_bw;
}
#else
void dp_mon_rx_stats_update_2_0(struct dp_peer *peer,
struct cdp_rx_indication_ppdu *ppdu,
struct cdp_rx_stats_ppdu_user *ppdu_user)
{
DP_STATS_INC(peer, rx.mpdu_retry_cnt, ppdu_user->mpdu_retries);
}
void
dp_mon_populate_ppdu_info_2_0(struct hal_rx_ppdu_info *hal_ppdu_info,
struct cdp_rx_indication_ppdu *ppdu)
{
ppdu->punc_bw = 0;
}
#endif

View File

@@ -568,6 +568,15 @@ struct dp_mon_ops {
void (*mon_register_intr_ops)(struct dp_soc *soc);
#endif
void (*mon_register_feature_ops)(struct dp_soc *soc);
#ifdef QCA_ENHANCED_STATS_SUPPORT
void (*mon_rx_stats_update)(struct dp_peer *peer,
struct cdp_rx_indication_ppdu *ppdu,
struct cdp_rx_stats_ppdu_user *ppdu_user);
void (*mon_rx_populate_ppdu_usr_info)(struct mon_rx_user_status *rx_user_status,
struct cdp_rx_stats_ppdu_user *ppdu_user);
void (*mon_rx_populate_ppdu_info)(struct hal_rx_ppdu_info *hal_ppdu_info,
struct cdp_rx_indication_ppdu *ppdu);
#endif
};
struct dp_mon_soc {

View File

@@ -404,6 +404,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
int ru_size;
bool is_data = false;
uint32_t num_users;
struct dp_mon_ops *mon_ops;
num_users = ppdu_info->com_info.num_users;
for (i = 0; i < num_users; i++) {
@@ -493,6 +494,11 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
rx_stats_peruser->vdev_id = peer->vdev->vdev_id;
rx_stats_peruser->mu_ul_info_valid = 0;
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_rx_populate_ppdu_usr_info)
mon_ops->mon_rx_populate_ppdu_usr_info(rx_user_status,
rx_stats_peruser);
dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
if (cdp_rx_ppdu->u.ppdu_type == HAL_RX_TYPE_MU_OFDMA ||
cdp_rx_ppdu->u.ppdu_type == HAL_RX_TYPE_MU_MIMO) {
@@ -546,6 +552,7 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev,
struct dp_ast_entry *ast_entry;
uint32_t ast_index;
uint32_t i;
struct dp_mon_ops *mon_ops;
cdp_rx_ppdu->first_data_seq_ctrl =
ppdu_info->rx_status.first_data_seq_ctrl;
@@ -635,6 +642,11 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev,
dp_rx_populate_su_evm_details(ppdu_info, cdp_rx_ppdu);
cdp_rx_ppdu->rx_antenna = ppdu_info->rx_status.rx_antenna;
mon_ops = dp_mon_ops_get(pdev->soc);
if (mon_ops && mon_ops->mon_rx_populate_ppdu_info)
mon_ops->mon_rx_populate_ppdu_info(ppdu_info,
cdp_rx_ppdu);
cdp_rx_ppdu->nf = ppdu_info->rx_status.chan_noise_floor;
for (i = 0; i < MAX_CHAIN; i++)
cdp_rx_ppdu->per_chain_rssi[i] = ppdu_info->rx_status.rssi[i];
@@ -724,6 +736,65 @@ static inline void dp_rx_rate_stats_update(struct dp_peer *peer,
peer->vdev->stats.rx.last_rx_rate = ratekbps;
}
#ifdef WLAN_FEATURE_11BE
static inline uint8_t dp_get_bw_offset_frm_bw(struct dp_soc *soc,
enum CMN_BW_TYPES bw)
{
uint8_t pkt_bw_offset;
switch (bw) {
case CMN_BW_20MHZ:
pkt_bw_offset = PKT_BW_GAIN_20MHZ;
break;
case CMN_BW_40MHZ:
pkt_bw_offset = PKT_BW_GAIN_40MHZ;
break;
case CMN_BW_80MHZ:
pkt_bw_offset = PKT_BW_GAIN_80MHZ;
break;
case CMN_BW_160MHZ:
pkt_bw_offset = PKT_BW_GAIN_160MHZ;
break;
case CMN_BW_320MHZ:
pkt_bw_offset = PKT_BW_GAIN_320MHZ;
break;
default:
pkt_bw_offset = 0;
dp_rx_mon_status_debug("%pK: Invalid BW index = %d",
soc, bw);
}
return pkt_bw_offset;
}
#else
static inline uint8_t dp_get_bw_offset_frm_bw(struct dp_soc *soc,
enum CMN_BW_TYPES bw)
{
uint8_t pkt_bw_offset;
switch (bw) {
case CMN_BW_20MHZ:
pkt_bw_offset = PKT_BW_GAIN_20MHZ;
break;
case CMN_BW_40MHZ:
pkt_bw_offset = PKT_BW_GAIN_40MHZ;
break;
case CMN_BW_80MHZ:
pkt_bw_offset = PKT_BW_GAIN_80MHZ;
break;
case CMN_BW_160MHZ:
pkt_bw_offset = PKT_BW_GAIN_160MHZ;
break;
default:
pkt_bw_offset = 0;
dp_rx_mon_status_debug("%pK: Invalid BW index = %d",
soc, bw);
}
return pkt_bw_offset;
}
#endif
static void dp_rx_stats_update(struct dp_pdev *pdev,
struct cdp_rx_indication_ppdu *ppdu)
{
@@ -735,6 +806,7 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
struct cdp_rx_stats_ppdu_user *ppdu_user;
uint32_t i;
enum cdp_mu_packet_type mu_pkt_type;
struct dp_mon_ops *mon_ops;
if (pdev)
soc = pdev->soc;
@@ -768,25 +840,8 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
}
num_msdu = ppdu_user->num_msdu;
switch (ppdu->u.bw) {
case CMN_BW_20MHZ:
pkt_bw_offset = PKT_BW_GAIN_20MHZ;
break;
case CMN_BW_40MHZ:
pkt_bw_offset = PKT_BW_GAIN_40MHZ;
break;
case CMN_BW_80MHZ:
pkt_bw_offset = PKT_BW_GAIN_80MHZ;
break;
case CMN_BW_160MHZ:
pkt_bw_offset = PKT_BW_GAIN_160MHZ;
break;
default:
pkt_bw_offset = 0;
dp_rx_mon_status_debug("%pK: Invalid BW index = %d",
soc, ppdu->u.bw);
}
pkt_bw_offset = dp_get_bw_offset_frm_bw(soc, ppdu->u.bw);
DP_STATS_UPD(peer, rx.snr, (ppdu->rssi + pkt_bw_offset));
if (peer->stats.rx.avg_snr == CDP_INVALID_SNR)
@@ -907,6 +962,11 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
if (ppdu->tid != HAL_TID_INVALID)
DP_STATS_INC(peer, rx.wme_ac_type[ac], num_msdu);
mon_ops = dp_mon_ops_get(soc);
if (mon_ops && mon_ops->mon_rx_stats_update)
mon_ops->mon_rx_stats_update(peer, ppdu, ppdu_user);
dp_peer_stats_notify(pdev, peer);
DP_STATS_UPD(peer, rx.last_snr, ppdu->rssi);

View File

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
* Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -307,6 +308,8 @@
* @start_seq: starting sequence number
* @ba_bitmap: 256 bit block ack bitmap
* @add_rtap_ext2: add radiotap extension2
* @mpdu_retry_cnt: Rx mpdu retry count
* @punctured_bw: puntured bw
*/
struct mon_rx_status {
uint64_t tsft;
@@ -394,6 +397,10 @@ struct mon_rx_status {
uint16_t start_seq;
uint32_t ba_bitmap[8];
bool add_rtap_ext2;
uint32_t mpdu_retry_cnt;
#ifdef WLAN_FEATURE_11BE
uint8_t punctured_bw;
#endif
};
/**
@@ -428,6 +435,7 @@ struct mon_rx_status {
* @mpdu_ok_byte_count: mpdu byte count with fcs ok
* @mpdu_err_byte_count: mpdu byte count with fcs err
* @sw_peer_id: software peer id
* @retry_mpdu: mpdu retry count
*/
struct mon_rx_user_status {
uint32_t mcs:4,
@@ -459,6 +467,7 @@ struct mon_rx_user_status {
uint32_t mpdu_ok_byte_count;
uint32_t mpdu_err_byte_count;
uint16_t sw_peer_id;
uint32_t retry_mpdu;
};
/**