From c182e1e3e9d082504326700095429b07cdc38780 Mon Sep 17 00:00:00 2001 From: Devender Kumar Date: Wed, 28 Jul 2021 15:14:28 +0530 Subject: [PATCH] qcacmn: Use sw_peer_id instead of ast_index to get peer In order to support flow overide feature, AST table has to be split between RxPCU and DDR. With this split, RX monitor cannot make use of ast_index to fetch peer as it is not from DDR. So make use of sw_peer_id to fetch peer. This sw_peer_id is derived from RX_MPDU_STAT_START_TLV Change-Id: Ib2a003a2640fded3287c318d2ad59fd3127af9b6 CRs-fixed: 3004363 --- dp/wifi3.0/dp_htt.c | 8 ++ dp/wifi3.0/monitor/dp_rx_mon_status.c | 103 ++++++++++---------------- hal/wifi3.0/li/hal_li_generic_api.h | 3 + hal/wifi3.0/qca5018/hal_5018_rx.h | 6 +- hal/wifi3.0/qca6290/hal_6290_rx.h | 3 + hal/wifi3.0/qca6390/hal_6390_rx.h | 3 + hal/wifi3.0/qca6490/hal_6490_rx.h | 5 +- hal/wifi3.0/qca6750/hal_6750_rx.h | 3 + hal/wifi3.0/qca8074v1/hal_8074v1_rx.h | 3 + hal/wifi3.0/qca8074v2/hal_8074v2_rx.h | 3 + hal/wifi3.0/qcn6122/hal_qcn6122_rx.h | 3 + hal/wifi3.0/qcn9000/hal_9000_rx.h | 5 +- hal/wifi3.0/wcn7850/hal_7850_rx.h | 3 + qdf/inc/qdf_nbuf.h | 2 + 14 files changed, 86 insertions(+), 67 deletions(-) diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index d0bdf68680..4436425827 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -2709,6 +2709,14 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt) "HTT_T2H_MSG_TYPE_PEER_MAP msg for peer id %d vdev id %d n", peer_id, vdev_id); + QDF_TRACE(QDF_MODULE_ID_TXRX, + QDF_TRACE_LEVEL_INFO, + "ast_idx[0] %d ast_idx[1] %d ast_idx[2] %d ast_idx[3] %d n", + ast_flow_info.ast_idx[0], + ast_flow_info.ast_idx[1], + ast_flow_info.ast_idx[2], + ast_flow_info.ast_idx[3]); + dp_rx_peer_map_handler(soc->dp_soc, peer_id, hw_peer_id, vdev_id, peer_mac_addr, ast_hash, diff --git a/dp/wifi3.0/monitor/dp_rx_mon_status.c b/dp/wifi3.0/monitor/dp_rx_mon_status.c index 9b334423f7..347a62f341 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon_status.c +++ b/dp/wifi3.0/monitor/dp_rx_mon_status.c @@ -274,8 +274,6 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, { struct dp_peer *peer; struct dp_soc *soc = pdev->soc; - struct dp_ast_entry *ast_entry; - uint32_t ast_index; int i; struct mon_rx_user_status *rx_user_status; struct mon_rx_user_info *rx_user_info; @@ -283,6 +281,7 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, int ru_size; bool is_data = false; uint32_t num_users; + uint16_t sw_peer_id; num_users = ppdu_info->com_info.num_users; for (i = 0; i < num_users; i++) { @@ -293,20 +292,11 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, rx_user_info = &ppdu_info->rx_user_info[i]; rx_stats_peruser = &cdp_rx_ppdu->user[i]; - ast_index = rx_user_status->ast_index; - if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) { - rx_stats_peruser->peer_id = HTT_INVALID_PEER; - continue; - } + sw_peer_id = rx_user_status->sw_peer_id; - ast_entry = soc->ast_table[ast_index]; - if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) { - rx_stats_peruser->peer_id = HTT_INVALID_PEER; - continue; - } - - peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id, + peer = dp_peer_get_ref_by_id(soc, sw_peer_id, DP_MOD_ID_RX_PPDU_STATS); + if (!peer) { rx_stats_peruser->peer_id = HTT_INVALID_PEER; continue; @@ -422,9 +412,10 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, { struct dp_peer *peer; struct dp_soc *soc = pdev->soc; - struct dp_ast_entry *ast_entry; - uint32_t ast_index; uint32_t i; + struct mon_rx_user_status *rx_user_status; + uint32_t num_users = ppdu_info->com_info.num_users; + uint16_t sw_peer_id; cdp_rx_ppdu->first_data_seq_ctrl = ppdu_info->rx_status.first_data_seq_ctrl; @@ -450,22 +441,14 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_pdev *pdev, cdp_rx_ppdu->is_ampdu = 0; cdp_rx_ppdu->tid = ppdu_info->rx_status.tid; + qdf_assert_always(num_users <= CDP_MU_MAX_USERS); + rx_user_status = &ppdu_info->rx_user_status[num_users - 1]; - ast_index = ppdu_info->rx_status.ast_index; - if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) { - cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; - cdp_rx_ppdu->num_users = 0; - goto end; - } + sw_peer_id = rx_user_status->sw_peer_id; - ast_entry = soc->ast_table[ast_index]; - if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) { - cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; - cdp_rx_ppdu->num_users = 0; - goto end; - } - peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id, + peer = dp_peer_get_ref_by_id(soc, sw_peer_id, DP_MOD_ID_RX_PPDU_STATS); + if (!peer) { cdp_rx_ppdu->peer_id = HTT_INVALID_PEER; cdp_rx_ppdu->num_users = 0; @@ -1167,12 +1150,11 @@ dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev, { struct dp_peer *peer; struct dp_soc *soc = pdev->soc; - struct dp_ast_entry *ast_entry; struct mon_rx_user_status *rx_user_status; struct cdp_rx_stats_ppdu_user *rx_stats_peruser; uint32_t num_users; + uint16_t sw_peer_id; int user_id; - uint32_t ast_index; qdf_spin_lock_bh(&soc->ast_lock); @@ -1185,21 +1167,12 @@ dp_rx_mon_handle_cfr_mu_info(struct dp_pdev *pdev, rx_user_status = &ppdu_info->rx_user_status[user_id]; rx_stats_peruser = &cdp_rx_ppdu->user[user_id]; - ast_index = rx_user_status->ast_index; - if (ast_index >= wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) { - rx_stats_peruser->peer_id = HTT_INVALID_PEER; - continue; - } + sw_peer_id = rx_user_status->sw_peer_id; - ast_entry = soc->ast_table[ast_index]; - if (!ast_entry || ast_entry->peer_id == HTT_INVALID_PEER) { - rx_stats_peruser->peer_id = HTT_INVALID_PEER; - continue; - } - - peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id, + peer = dp_peer_get_ref_by_id(soc, sw_peer_id, DP_MOD_ID_RX_PPDU_STATS); + if (!peer) { rx_stats_peruser->peer_id = HTT_INVALID_PEER; continue; @@ -1610,29 +1583,31 @@ dp_rx_process_peer_based_pktlog(struct dp_soc *soc, qdf_nbuf_t status_nbuf, uint32_t pdev_id) { struct dp_peer *peer; - struct dp_ast_entry *ast_entry; - uint32_t ast_index; + struct mon_rx_user_status *rx_user_status; + uint32_t num_users = ppdu_info->com_info.num_users; + uint16_t sw_peer_id; - ast_index = ppdu_info->rx_status.ast_index; - if (ast_index < wlan_cfg_get_max_ast_idx(soc->wlan_cfg_ctx)) { - ast_entry = soc->ast_table[ast_index]; - if (ast_entry) { - peer = dp_peer_get_ref_by_id(soc, ast_entry->peer_id, - DP_MOD_ID_RX_PPDU_STATS); - if (peer) { - if ((peer->peer_id != HTT_INVALID_PEER) && - (peer->peer_based_pktlog_filter)) { - dp_wdi_event_handler( - WDI_EVENT_RX_DESC, soc, - status_nbuf, - peer->peer_id, - WDI_NO_VAL, pdev_id); - } - dp_peer_unref_delete(peer, - DP_MOD_ID_RX_PPDU_STATS); - } - } + qdf_assert_always(num_users <= CDP_MU_MAX_USERS); + rx_user_status = &ppdu_info->rx_user_status[num_users - 1]; + + sw_peer_id = rx_user_status->sw_peer_id; + + peer = dp_peer_get_ref_by_id(soc, sw_peer_id, + DP_MOD_ID_RX_PPDU_STATS); + + if (!peer) + return; + + if ((peer->peer_id != HTT_INVALID_PEER) && + (peer->peer_based_pktlog_filter)) { + dp_wdi_event_handler( + WDI_EVENT_RX_DESC, soc, + status_nbuf, + peer->peer_id, + WDI_NO_VAL, pdev_id); } + dp_peer_unref_delete(peer, + DP_MOD_ID_RX_PPDU_STATS); } #if defined(HTT_UL_OFDMA_USER_INFO_V0_W0_VALID_M) diff --git a/hal/wifi3.0/li/hal_li_generic_api.h b/hal/wifi3.0/li/hal_li_generic_api.h index 18c85a66b1..e093755d01 100644 --- a/hal/wifi3.0/li/hal_li_generic_api.h +++ b/hal/wifi3.0/li/hal_li_generic_api.h @@ -1524,6 +1524,9 @@ hal_rx_status_get_tlv_info_generic_li(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->sw_frame_group_id = HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start); + ppdu_info->rx_user_status[user_id].sw_peer_id = + HAL_RX_GET_SW_PEER_ID(rx_mpdu_start); + if (ppdu_info->sw_frame_group_id == HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { ppdu_info->rx_status.frame_control_info_valid = diff --git a/hal/wifi3.0/qca5018/hal_5018_rx.h b/hal/wifi3.0/qca5018/hal_5018_rx.h index 8fc28d032b..47927ea397 100644 --- a/hal/wifi3.0/qca5018/hal_5018_rx.h +++ b/hal/wifi3.0/qca5018/hal_5018_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021 The Linux Foundation. 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 @@ -52,6 +52,10 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID) + +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ (reg_val) &= \ diff --git a/hal/wifi3.0/qca6290/hal_6290_rx.h b/hal/wifi3.0/qca6290/hal_6290_rx.h index 1bbcf837cc..8c5e0b81ad 100644 --- a/hal/wifi3.0/qca6290/hal_6290_rx.h +++ b/hal/wifi3.0/qca6290/hal_6290_rx.h @@ -270,6 +270,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ (reg_val) &= \ diff --git a/hal/wifi3.0/qca6390/hal_6390_rx.h b/hal/wifi3.0/qca6390/hal_6390_rx.h index 3201f6cc1b..15b631bd52 100644 --- a/hal/wifi3.0/qca6390/hal_6390_rx.h +++ b/hal/wifi3.0/qca6390/hal_6390_rx.h @@ -276,6 +276,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/qca6490/hal_6490_rx.h b/hal/wifi3.0/qca6490/hal_6490_rx.h index 8859e95eb0..828a036692 100644 --- a/hal/wifi3.0/qca6490/hal_6490_rx.h +++ b/hal/wifi3.0/qca6490/hal_6490_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2019-2021 The Linux Foundation. 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 @@ -279,6 +279,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/qca6750/hal_6750_rx.h b/hal/wifi3.0/qca6750/hal_6750_rx.h index 2563993227..414af34d93 100644 --- a/hal/wifi3.0/qca6750/hal_6750_rx.h +++ b/hal/wifi3.0/qca6750/hal_6750_rx.h @@ -279,6 +279,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h b/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h index 65aea86961..6c38ab628f 100644 --- a/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h +++ b/hal/wifi3.0/qca8074v1/hal_8074v1_rx.h @@ -259,6 +259,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h index 29cbfce7c1..80fdd0ae80 100644 --- a/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h +++ b/hal/wifi3.0/qca8074v2/hal_8074v2_rx.h @@ -268,6 +268,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_1, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/qcn6122/hal_qcn6122_rx.h b/hal/wifi3.0/qcn6122/hal_qcn6122_rx.h index a94fdbc9e4..632c4e0766 100644 --- a/hal/wifi3.0/qcn6122/hal_qcn6122_rx.h +++ b/hal/wifi3.0/qcn6122/hal_qcn6122_rx.h @@ -59,6 +59,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ (reg_val) &= \ diff --git a/hal/wifi3.0/qcn9000/hal_9000_rx.h b/hal/wifi3.0/qcn9000/hal_9000_rx.h index 3e6a166d46..a2acfae0bd 100644 --- a/hal/wifi3.0/qcn9000/hal_9000_rx.h +++ b/hal/wifi3.0/qcn9000/hal_9000_rx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2021 The Linux Foundation. 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 @@ -57,6 +57,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_9, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_10, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/hal/wifi3.0/wcn7850/hal_7850_rx.h b/hal/wifi3.0/wcn7850/hal_7850_rx.h index 12e07ed60f..83e31378c5 100644 --- a/hal/wifi3.0/wcn7850/hal_7850_rx.h +++ b/hal/wifi3.0/wcn7850/hal_7850_rx.h @@ -60,6 +60,9 @@ #define HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start) \ HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_FRAME_GROUP_ID) +#define HAL_RX_GET_SW_PEER_ID(rx_mpdu_start) \ + HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO, SW_PEER_ID) + #define HAL_REO_R0_CONFIG(soc, reg_val, reo_params) \ do { \ reg_val &= \ diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 8e1d270338..64d19ec873 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -403,6 +403,7 @@ struct mon_rx_status { * @mpdu_fcs_ok_bitmap: mpdu with fcs ok bitmap * @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 */ struct mon_rx_user_status { uint32_t mcs:4, @@ -433,6 +434,7 @@ struct mon_rx_user_status { uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS]; uint32_t mpdu_ok_byte_count; uint32_t mpdu_err_byte_count; + uint16_t sw_peer_id; }; /**