From 1f89b97be237a7214d74526204d5275ec245b449 Mon Sep 17 00:00:00 2001 From: Chaithanya Garrepalli Date: Wed, 31 Jul 2019 12:33:53 +0530 Subject: [PATCH] qcacmn: Read 256 fcs_ok bitmap from user ext TLV Read extra bits of fcs okay bit map from RX_PPDU_END_USER_STATS_EXT TLV and use the same to send first fcs okay packet in case of M COPY CRs-Fixed: 2499150 Change-Id: I1a25971ea789dd7fddddb312af8a18a4cccdc178 --- dp/inc/cdp_txrx_cmn_struct.h | 2 +- dp/wifi3.0/dp_rx_mon_status.c | 22 ++++++++------- hal/wifi3.0/hal_api_mon.h | 9 +++---- hal/wifi3.0/hal_generic_api.h | 51 +++++++++++++++++++++++++---------- qdf/inc/qdf_nbuf.h | 3 ++- 5 files changed, 56 insertions(+), 31 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 2b117b155e..598337535f 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -1582,7 +1582,7 @@ struct cdp_rx_stats_ppdu_user { uint16_t he_flags; uint32_t mpdu_cnt_fcs_ok; uint32_t mpdu_cnt_fcs_err; - uint64_t mpdu_fcs_ok_bitmap; + 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; uint32_t retries; diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index a5dbcf3cd6..463bd60514 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -202,8 +202,10 @@ dp_rx_populate_cdp_indication_ppdu_user(struct dp_pdev *pdev, rx_user_status->mpdu_cnt_fcs_ok; rx_stats_peruser->mpdu_cnt_fcs_err = rx_user_status->mpdu_cnt_fcs_err; - rx_stats_peruser->mpdu_fcs_ok_bitmap = - rx_user_status->mpdu_fcs_ok_bitmap; + qdf_mem_copy(&rx_stats_peruser->mpdu_fcs_ok_bitmap, + &rx_user_status->mpdu_fcs_ok_bitmap, + HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * + sizeof(rx_user_status->mpdu_fcs_ok_bitmap[0])); rx_stats_peruser->mpdu_ok_byte_count = rx_user_status->mpdu_ok_byte_count; rx_stats_peruser->mpdu_err_byte_count = @@ -544,18 +546,19 @@ dp_rx_get_fcs_ok_msdu(struct dp_pdev *pdev, { uint16_t mpdu_fcs_ok; qdf_nbuf_t status_nbuf = NULL; - unsigned long int fcs_ok_bitmap; - - /* If fcs_ok_bitmap is zero, no need to procees further */ - if (qdf_unlikely(!ppdu_info->com_info.mpdu_fcs_ok_bitmap)) - return NULL; + unsigned long *fcs_ok_bitmap; /* Obtain fcs_ok passed index from bitmap * this index is used to get fcs passed first msdu payload */ - fcs_ok_bitmap = ppdu_info->com_info.mpdu_fcs_ok_bitmap; - mpdu_fcs_ok = qdf_find_first_bit(&fcs_ok_bitmap, HAL_RX_MAX_MPDU); + fcs_ok_bitmap = + (unsigned long *)&ppdu_info->com_info.mpdu_fcs_ok_bitmap[0]; + mpdu_fcs_ok = qdf_find_first_bit(fcs_ok_bitmap, + HAL_RX_MAX_MPDU); + + if (mpdu_fcs_ok >= HAL_RX_MAX_MPDU) + goto end; /* Get status buffer by indexing mpdu_fcs_ok index * containing first msdu payload with fcs passed @@ -567,6 +570,7 @@ dp_rx_get_fcs_ok_msdu(struct dp_pdev *pdev, */ qdf_nbuf_ref(status_nbuf); +end: /* Free the ppdu status buffer queue */ qdf_nbuf_queue_free(&pdev->rx_ppdu_buf_q); diff --git a/hal/wifi3.0/hal_api_mon.h b/hal/wifi3.0/hal_api_mon.h index 14cd1620fe..72bc4719c9 100644 --- a/hal/wifi3.0/hal_api_mon.h +++ b/hal/wifi3.0/hal_api_mon.h @@ -148,12 +148,9 @@ #define HAL_RX_GET_MSDU_AGGREGATION(rx_desc, rs) #endif -#define HAL_RX_MPDU_FCS_BITMAP_0_31_OFFSET 0x00000000FFFFFFFF -#define HAL_RX_MPDU_FCS_BITMAP_LSB 32 -#define HAL_RX_MPDU_FCS_BITMAP_32_63_OFFSET 0xFFFFFFFF00000000 - /* Max MPDUs per status buffer */ -#define HAL_RX_MAX_MPDU 64 +#define HAL_RX_MAX_MPDU 256 +#define HAL_RX_NUM_WORDS_PER_PPDU_BITMAP (HAL_RX_MAX_MPDU >> 5) /* Max pilot count */ #define HAL_RX_MAX_SU_EVM_COUNT 32 @@ -431,7 +428,7 @@ struct hal_rx_ppdu_common_info { uint32_t ppdu_timestamp; uint32_t mpdu_cnt_fcs_ok; uint32_t mpdu_cnt_fcs_err; - uint64_t mpdu_fcs_ok_bitmap; + uint32_t mpdu_fcs_ok_bitmap[HAL_RX_NUM_WORDS_PER_PPDU_BITMAP]; uint32_t last_ppdu_id; uint32_t mpdu_cnt; uint8_t num_users; diff --git a/hal/wifi3.0/hal_generic_api.h b/hal/wifi3.0/hal_generic_api.h index df22e81fe3..6ac4dee079 100644 --- a/hal/wifi3.0/hal_generic_api.h +++ b/hal/wifi3.0/hal_generic_api.h @@ -297,9 +297,10 @@ hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, ppdu_info->com_info.mpdu_cnt_fcs_ok; mon_rx_user_status->mpdu_cnt_fcs_err = ppdu_info->com_info.mpdu_cnt_fcs_err; - mon_rx_user_status->mpdu_fcs_ok_bitmap = - ppdu_info->com_info.mpdu_fcs_ok_bitmap; - + qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap, + &ppdu_info->com_info.mpdu_fcs_ok_bitmap, + HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * + sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0])); mpdu_ok_byte_count = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_17, MPDU_OK_BYTE_COUNT); @@ -545,18 +546,13 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, ppdu_info->rx_status.rs_flags &= (~IEEE80211_AMPDU_FLAG); - ppdu_info->com_info.mpdu_fcs_ok_bitmap = - (((ppdu_info->com_info.mpdu_fcs_ok_bitmap | - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8, - FCS_OK_BITMAP_63_32)) << - HAL_RX_MPDU_FCS_BITMAP_LSB) & - HAL_RX_MPDU_FCS_BITMAP_32_63_OFFSET); + ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7, + FCS_OK_BITMAP_31_0); - ppdu_info->com_info.mpdu_fcs_ok_bitmap = - ((ppdu_info->com_info.mpdu_fcs_ok_bitmap | - HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7, - FCS_OK_BITMAP_31_0)) & - HAL_RX_MPDU_FCS_BITMAP_0_31_OFFSET); + ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8, + FCS_OK_BITMAP_63_32); if (user_id < HAL_MAX_UL_MU_USERS) { mon_rx_user_status = @@ -573,6 +569,29 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, } case WIFIRX_PPDU_END_USER_STATS_EXT_E: + ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1, + FCS_OK_BITMAP_95_64); + + ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2, + FCS_OK_BITMAP_127_96); + + ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3, + FCS_OK_BITMAP_159_128); + + ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4, + FCS_OK_BITMAP_191_160); + + ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5, + FCS_OK_BITMAP_223_192); + + ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] = + HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6, + FCS_OK_BITMAP_255_224); break; case WIFIRX_PPDU_END_STATUS_DONE_E: @@ -1311,6 +1330,10 @@ hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info; uint16_t mpdu_cnt = com_info->mpdu_cnt; + if (mpdu_cnt >= HAL_RX_MAX_MPDU) { + hal_alert("Number of MPDUs per PPDU exceeded"); + break; + } /* Update first_msdu_payload for every mpdu and increment * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV */ diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index c14abb1511..cc8bf1d353 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -163,6 +163,7 @@ #endif #define MAX_CHAIN 8 +#define QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS 8 /** * struct mon_rx_status - This will have monitor mode rx_status extracted from @@ -375,7 +376,7 @@ struct mon_rx_user_status { uint8_t rs_flags; uint32_t mpdu_cnt_fcs_ok; uint32_t mpdu_cnt_fcs_err; - uint64_t mpdu_fcs_ok_bitmap; + 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; };