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
This commit is contained in:
Chaithanya Garrepalli
2019-07-31 12:33:53 +05:30
committed by nshrivas
parent 37ac32ba18
commit 1f89b97be2
5 changed files with 56 additions and 31 deletions

View File

@@ -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;

View File

@@ -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);

View File

@@ -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;

View File

@@ -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 =
((ppdu_info->com_info.mpdu_fcs_ok_bitmap |
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)) &
HAL_RX_MPDU_FCS_BITMAP_0_31_OFFSET);
FCS_OK_BITMAP_31_0);
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
*/

View File

@@ -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;
};