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) 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 * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * 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_80MHZ,
CMN_BW_160MHZ, CMN_BW_160MHZ,
CMN_BW_80_80MHZ, CMN_BW_80_80MHZ,
#ifdef WLAN_FEATURE_11BE
CMN_BW_320MHZ,
#endif
CMN_BW_CNT, CMN_BW_CNT,
CMN_BW_IDLE = 0xFF, /*default BW state */ 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 * @mpdu_fcs_ok_bitmap - MPDU with fcs ok bitmap
* @retries - number of retries * @retries - number of retries
* @rx_ratekpbs - rx rate in kbps * @rx_ratekpbs - rx rate in kbps
* @mpdu_retries - retries of mpdu in rx
*/ */
struct cdp_rx_stats_ppdu_user { struct cdp_rx_stats_ppdu_user {
uint16_t peer_id; uint16_t peer_id;
@@ -2285,6 +2286,7 @@ struct cdp_rx_stats_ppdu_user {
uint32_t mpdu_err_byte_count; uint32_t mpdu_err_byte_count;
uint32_t retries; uint32_t retries;
uint32_t rx_ratekbps; 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 * @user: per user stats in MU-user case
* @nf: noise floor * @nf: noise floor
* @per_chain_rssi: rssi per antenna * @per_chain_rssi: rssi per antenna
* @punc_bw: puncered bw
*/ */
struct cdp_rx_indication_ppdu { struct cdp_rx_indication_ppdu {
uint32_t ppdu_id; uint32_t ppdu_id;
@@ -2394,6 +2397,7 @@ struct cdp_rx_indication_ppdu {
#if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE)
struct cdp_rx_ppdu_cfr_info cfr_info; struct cdp_rx_ppdu_cfr_info cfr_info;
#endif #endif
uint8_t punc_bw;
}; };
/** /**

View File

@@ -1424,6 +1424,9 @@ struct cdp_tx_stats {
* <enum 3 3_2_us_sgi > HE * <enum 3 3_2_us_sgi > HE
* @preamble_info: preamble * @preamble_info: preamble
* @to_stack_twt: Total packets sent up the stack in TWT session * @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_rx_stats {
struct cdp_pkt_info to_stack; struct cdp_pkt_info to_stack;
@@ -1505,6 +1508,11 @@ struct cdp_rx_stats {
gi_info:4, gi_info:4,
preamble_info:4; preamble_info:4;
struct cdp_pkt_info to_stack_twt; 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 /* 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, dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done,
uint64_t start_time); 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 #ifdef QCA_SUPPORT_FULL_MON
static QDF_STATUS static QDF_STATUS
dp_config_full_mon_mode(struct cdp_soc_t *soc_handle, 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; dp_vdev_set_monitor_mode_buf_rings;
mon_ops->mon_vdev_set_monitor_mode_rings = mon_ops->mon_vdev_set_monitor_mode_rings =
dp_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 = { 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; dp_vdev_set_monitor_mode_buf_rings_2_0;
mon_ops->mon_vdev_set_monitor_mode_rings = mon_ops->mon_vdev_set_monitor_mode_rings =
dp_vdev_set_monitor_mode_rings_2_0; 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 = { 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, 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 * Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above * 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, mon_soc->rx_mon_ring_fill_level,
&desc_list, &tail); &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); void (*mon_register_intr_ops)(struct dp_soc *soc);
#endif #endif
void (*mon_register_feature_ops)(struct dp_soc *soc); 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 { struct dp_mon_soc {

View File

@@ -404,6 +404,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev,
int ru_size; int ru_size;
bool is_data = false; bool is_data = false;
uint32_t num_users; uint32_t num_users;
struct dp_mon_ops *mon_ops;
num_users = ppdu_info->com_info.num_users; num_users = ppdu_info->com_info.num_users;
for (i = 0; i < num_users; i++) { 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->vdev_id = peer->vdev->vdev_id;
rx_stats_peruser->mu_ul_info_valid = 0; 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); dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
if (cdp_rx_ppdu->u.ppdu_type == HAL_RX_TYPE_MU_OFDMA || if (cdp_rx_ppdu->u.ppdu_type == HAL_RX_TYPE_MU_OFDMA ||
cdp_rx_ppdu->u.ppdu_type == HAL_RX_TYPE_MU_MIMO) { 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; struct dp_ast_entry *ast_entry;
uint32_t ast_index; uint32_t ast_index;
uint32_t i; uint32_t i;
struct dp_mon_ops *mon_ops;
cdp_rx_ppdu->first_data_seq_ctrl = cdp_rx_ppdu->first_data_seq_ctrl =
ppdu_info->rx_status.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); dp_rx_populate_su_evm_details(ppdu_info, cdp_rx_ppdu);
cdp_rx_ppdu->rx_antenna = ppdu_info->rx_status.rx_antenna; 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; cdp_rx_ppdu->nf = ppdu_info->rx_status.chan_noise_floor;
for (i = 0; i < MAX_CHAIN; i++) for (i = 0; i < MAX_CHAIN; i++)
cdp_rx_ppdu->per_chain_rssi[i] = ppdu_info->rx_status.rssi[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; 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, static void dp_rx_stats_update(struct dp_pdev *pdev,
struct cdp_rx_indication_ppdu *ppdu) 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; struct cdp_rx_stats_ppdu_user *ppdu_user;
uint32_t i; uint32_t i;
enum cdp_mu_packet_type mu_pkt_type; enum cdp_mu_packet_type mu_pkt_type;
struct dp_mon_ops *mon_ops;
if (pdev) if (pdev)
soc = pdev->soc; soc = pdev->soc;
@@ -768,25 +840,8 @@ static void dp_rx_stats_update(struct dp_pdev *pdev,
} }
num_msdu = ppdu_user->num_msdu; 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)); DP_STATS_UPD(peer, rx.snr, (ppdu->rssi + pkt_bw_offset));
if (peer->stats.rx.avg_snr == CDP_INVALID_SNR) 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) if (ppdu->tid != HAL_TID_INVALID)
DP_STATS_INC(peer, rx.wme_ac_type[ac], num_msdu); 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_peer_stats_notify(pdev, peer);
DP_STATS_UPD(peer, rx.last_snr, ppdu->rssi); 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) 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 * Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the * any purpose with or without fee is hereby granted, provided that the
@@ -307,6 +308,8 @@
* @start_seq: starting sequence number * @start_seq: starting sequence number
* @ba_bitmap: 256 bit block ack bitmap * @ba_bitmap: 256 bit block ack bitmap
* @add_rtap_ext2: add radiotap extension2 * @add_rtap_ext2: add radiotap extension2
* @mpdu_retry_cnt: Rx mpdu retry count
* @punctured_bw: puntured bw
*/ */
struct mon_rx_status { struct mon_rx_status {
uint64_t tsft; uint64_t tsft;
@@ -394,6 +397,10 @@ struct mon_rx_status {
uint16_t start_seq; uint16_t start_seq;
uint32_t ba_bitmap[8]; uint32_t ba_bitmap[8];
bool add_rtap_ext2; 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_ok_byte_count: mpdu byte count with fcs ok
* @mpdu_err_byte_count: mpdu byte count with fcs err * @mpdu_err_byte_count: mpdu byte count with fcs err
* @sw_peer_id: software peer id * @sw_peer_id: software peer id
* @retry_mpdu: mpdu retry count
*/ */
struct mon_rx_user_status { struct mon_rx_user_status {
uint32_t mcs:4, uint32_t mcs:4,
@@ -459,6 +467,7 @@ struct mon_rx_user_status {
uint32_t mpdu_ok_byte_count; uint32_t mpdu_ok_byte_count;
uint32_t mpdu_err_byte_count; uint32_t mpdu_err_byte_count;
uint16_t sw_peer_id; uint16_t sw_peer_id;
uint32_t retry_mpdu;
}; };
/** /**