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
diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h
index 2b117b1..5983375 100644
--- a/dp/inc/cdp_txrx_cmn_struct.h
+++ b/dp/inc/cdp_txrx_cmn_struct.h
@@ -1582,7 +1582,7 @@
 	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 a5dbcf3..463bd60 100644
--- a/dp/wifi3.0/dp_rx_mon_status.c
+++ b/dp/wifi3.0/dp_rx_mon_status.c
@@ -202,8 +202,10 @@
 			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 @@
 {
 	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 @@
 	 */
 	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 14cd162..72bc471 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 @@
 	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 df22e81..6ac4dee 100644
--- a/hal/wifi3.0/hal_generic_api.h
+++ b/hal/wifi3.0/hal_generic_api.h
@@ -297,9 +297,10 @@
 		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 @@
 			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 @@
 	}
 
 	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 @@
 		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 c14abb1..cc8bf1d 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 @@
 	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;
 };