Sfoglia il codice sorgente

qcacmn: Add debug counter for monitor mode

Add debug count for count MPDU received based on preamble type,
reception type, UL/DL and user for max 4 user for MU monitor
mode

Change-Id: I87f1553e1f2f8276501366a825d629cf051d8a80
CRs-Fixed: 3326272
Kai Chen 2 anni fa
parent
commit
83521665e6

+ 24 - 0
dp/inc/cdp_txrx_mon_struct.h

@@ -71,6 +71,10 @@ enum cdp_lite_mon_direction {
 	CDP_LITE_MON_DIRECTION_TX = 2,
 };
 #endif
+
+/* MU max user to sniff */
+#define CDP_MU_SNIF_USER_MAX 4
+
 /* Same as MAX_20MHZ_SEGMENTS */
 #define CDP_MAX_20MHZ_SEGS 16
 /* Same as MAX_ANTENNA_EIGHT */
@@ -130,6 +134,9 @@ enum {
 	CDP_PKT_TYPE_HT,
 	CDP_PKT_TYPE_VHT,
 	CDP_PKT_TYPE_HE,
+	CDP_PKT_TYPE_EHT,
+	CDP_PKT_TYPE_NO_SUP,
+	CDP_PKT_TYPE_MAX,
 };
 
 enum {
@@ -144,6 +151,13 @@ enum {
 	CDP_RX_TYPE_MU_MIMO,
 	CDP_RX_TYPE_MU_OFDMA,
 	CDP_RX_TYPE_MU_OFDMA_MIMO,
+	CDP_RX_TYPE_MAX,
+};
+
+enum {
+	CDP_MU_TYPE_DL = 0,
+	CDP_MU_TYPE_UL,
+	CDP_MU_TYPE_MAX,
 };
 
 /*
@@ -360,6 +374,10 @@ enum cdp_mon_phyrx_abort_reason_code {
  * @status_ppdu_compl: status ring matching start and end count on PPDU
  * @status_ppdu_start_mis: status ring missing start TLV count on PPDU
  * @status_ppdu_end_mis: status ring missing end TLV count on PPDU
+ * @mpdu_cnt_fcs_ok: MPDU ok count per pkt and reception type DL-UL and user
+ * @mpdu_cnt_fcs_err: MPDU err count per pkt and reception type DL-UL and user
+ * @end_user_stats_cnt: PPDU end user TLV count
+ * @start_user_info_cnt: PPDU start user info TLV count
  * @status_ppdu_done: status ring PPDU done TLV count
  * @dest_ppdu_done: destination ring PPDU count
  * @dest_mpdu_done: destination ring MPDU count
@@ -404,6 +422,12 @@ struct cdp_pdev_mon_stats {
 	uint32_t status_ppdu_start_mis;
 	uint32_t status_ppdu_end_mis;
 #endif
+	uint32_t mpdu_cnt_fcs_ok[CDP_PKT_TYPE_MAX][CDP_RX_TYPE_MAX]
+				[CDP_MU_TYPE_MAX][CDP_MU_SNIF_USER_MAX];
+	uint32_t mpdu_cnt_fcs_err[CDP_PKT_TYPE_MAX][CDP_RX_TYPE_MAX]
+				 [CDP_MU_TYPE_MAX][CDP_MU_SNIF_USER_MAX];
+	uint32_t end_user_stats_cnt;
+	uint32_t start_user_info_cnt;
 	uint32_t status_ppdu_done;
 	uint32_t dest_ppdu_done;
 	uint32_t dest_mpdu_done;

+ 101 - 1
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -1520,6 +1520,96 @@ void dp_rx_mon_update_peer_id(struct dp_pdev *pdev,
 }
 #endif
 
+/*
+ * HAL_RX_PKT_TYPE_11A     0 -> CDP_PKT_TYPE_OFDM
+ * HAL_RX_PKT_TYPE_11B     1 -> CDP_PKT_TYPE_CCK
+ * HAL_RX_PKT_TYPE_11N     2 -> CDP_PKT_TYPE_HT
+ * HAL_RX_PKT_TYPE_11AC    3 -> CDP_PKT_TYPE_VHT
+ * HAL_RX_PKT_TYPE_11AX    4 -> CDP_PKT_TYPE_HE
+ * HAL_RX_PKT_TYPE_11BE    6 -> CDP_PKT_TYPE_EHT
+ */
+
+static uint32_t const cdp_preamble_type_map[] = {
+	CDP_PKT_TYPE_OFDM,
+	CDP_PKT_TYPE_CCK,
+	CDP_PKT_TYPE_HT,
+	CDP_PKT_TYPE_VHT,
+	CDP_PKT_TYPE_HE,
+	CDP_PKT_TYPE_NO_SUP,
+#ifdef WLAN_FEATURE_11BE
+	CDP_PKT_TYPE_EHT,
+#endif
+	CDP_PKT_TYPE_MAX,
+};
+
+/*
+ * HAL_RX_RECEPTION_TYPE_SU       -> CDP_RX_TYPE_SU
+ * HAL_RX_RECEPTION_TYPE_MU_MIMO  -> CDP_RX_TYPE_MU_MIMO
+ * HAL_RX_RECEPTION_TYPE_OFDMA    -> CDP_RX_TYPE_MU_OFDMA
+ * HAL_RX_RECEPTION_TYPE_MU_OFDMA -> CDP_RX_TYPE_MU_OFDMA_MIMO
+ */
+static uint32_t const cdp_reception_type_map[] = {
+	CDP_RX_TYPE_SU,
+	CDP_RX_TYPE_MU_MIMO,
+	CDP_RX_TYPE_MU_OFDMA,
+	CDP_RX_TYPE_MU_OFDMA_MIMO,
+};
+
+static uint32_t const cdp_mu_dl_up_map[] = {
+	CDP_MU_TYPE_DL,
+	CDP_MU_TYPE_UL,
+};
+
+static inline void
+dp_rx_mu_stats_update(
+	struct hal_rx_ppdu_info *ppdu_info,
+	struct cdp_pdev_mon_stats *rx_mon_sts,
+	uint32_t preamble_type,
+	uint32_t  recept_type,
+	uint32_t  mu_dl_ul,
+	uint32_t i
+)
+{
+	struct mon_rx_user_status *rx_user_status;
+
+	rx_user_status =  &ppdu_info->rx_user_status[i];
+	rx_mon_sts->mpdu_cnt_fcs_ok[preamble_type][recept_type][mu_dl_ul][i]
+			+= rx_user_status->mpdu_cnt_fcs_ok;
+	rx_mon_sts->mpdu_cnt_fcs_err[preamble_type][recept_type][mu_dl_ul][i]
+			+= rx_user_status->mpdu_cnt_fcs_err;
+}
+
+static inline void
+dp_rx_mu_stats(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info)
+{
+	struct dp_mon_pdev *mon_pdev;
+	struct cdp_pdev_mon_stats *rx_mon_stats;
+	struct mon_rx_status *rx_status;
+	uint32_t preamble_type, reception_type, mu_dl_ul, num_users, i;
+
+	mon_pdev = pdev->monitor_pdev;
+	rx_mon_stats = &mon_pdev->rx_mon_stats;
+	rx_status = &ppdu_info->rx_status;
+
+	num_users = ppdu_info->com_info.num_users;
+
+	if (rx_status->preamble_type < CDP_PKT_TYPE_MAX)
+		preamble_type = cdp_preamble_type_map[rx_status->preamble_type];
+	else
+		preamble_type = CDP_PKT_TYPE_NO_SUP;
+
+	reception_type = cdp_reception_type_map[rx_status->reception_type];
+	mu_dl_ul = cdp_mu_dl_up_map[rx_status->mu_dl_ul];
+
+	for (i = 0; i < num_users; i++) {
+		if (i >= CDP_MU_SNIF_USER_MAX)
+			return;
+
+		dp_rx_mu_stats_update(ppdu_info, rx_mon_stats, preamble_type,
+				      reception_type, mu_dl_ul, i);
+	}
+}
+
 static inline uint32_t
 dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 			   uint32_t mac_id, uint32_t quota)
@@ -1639,8 +1729,18 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 
 		ppdu_info = dp_rx_mon_process_status_tlv(pdev);
 
-		if (ppdu_info)
+		if (ppdu_info) {
+			mon_pdev->rx_mon_stats.start_user_info_cnt +=
+				ppdu_info->start_user_info_cnt;
+			ppdu_info->start_user_info_cnt = 0;
+
+			mon_pdev->rx_mon_stats.end_user_stats_cnt +=
+				ppdu_info->end_user_stats_cnt;
+			ppdu_info->end_user_stats_cnt = 0;
+
 			dp_rx_mon_update_peer_id(pdev, ppdu_info);
+			dp_rx_mu_stats(pdev, ppdu_info);
+		}
 
 		/* Call enhanced stats update API */
 		if (mon_pdev->enhanced_stats_en && ppdu_info)

+ 127 - 0
dp/wifi3.0/monitor/dp_mon.c

@@ -819,6 +819,124 @@ dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev,
 }
 #endif
 
+static const char *
+dp_preamble_type_str[] = {
+	"preamble OFDMA     ",
+	"preamble CCK       ",
+	"preamble HT        ",
+	"preamble VHT       ",
+	"preamble HE        ",
+	"preamble EHT       ",
+	"preamble NO SUPPORT",
+};
+
+static const char *
+dp_reception_type_str[] = {
+	"reception su        ",
+	"reception mu_mimo   ",
+	"reception ofdma     ",
+	"reception ofdma mimo",
+};
+
+static const char *
+dp_mu_dl_ul_str[] = {
+	"MU DL",
+	"MU UL",
+};
+
+static inline void
+dp_print_pdev_mpdu_fcs_ok_cnt(struct cdp_pdev_mon_stats *rx_mon_sts,
+			      uint32_t pkt_t, uint32_t rx_t,
+			      uint32_t dl_ul, uint32_t user)
+{
+	DP_PRINT_STATS("%s, %s, %s, user=%d, mpdu_fcs_ok=%d",
+		       dp_preamble_type_str[pkt_t],
+		       dp_reception_type_str[rx_t],
+		       dp_mu_dl_ul_str[dl_ul],
+		       user,
+		       rx_mon_sts->mpdu_cnt_fcs_ok[pkt_t][rx_t][dl_ul][user]);
+}
+
+static inline void
+dp_print_pdev_mpdu_fcs_err_cnt(struct cdp_pdev_mon_stats *rx_mon_sts,
+			       uint32_t pkt_t, uint32_t rx_t,
+			       uint32_t dl_ul, uint32_t user)
+{
+	DP_PRINT_STATS("%s, %s, %s, user=%d, mpdu_fcs_err=%d",
+		       dp_preamble_type_str[pkt_t],
+		       dp_reception_type_str[rx_t],
+		       dp_mu_dl_ul_str[dl_ul],
+		       user,
+		       rx_mon_sts->mpdu_cnt_fcs_err[pkt_t][rx_t][dl_ul][user]);
+}
+
+static inline void
+dp_print_pdev_mpdu_cnt(struct cdp_pdev_mon_stats *rx_mon_sts,
+		       uint32_t pkt_t, uint32_t rx_t,
+		       uint32_t dl_ul, uint32_t user)
+{
+	if (rx_mon_sts->mpdu_cnt_fcs_ok[pkt_t][rx_t][dl_ul][user])
+		dp_print_pdev_mpdu_fcs_ok_cnt(rx_mon_sts, pkt_t, rx_t,
+					      dl_ul, user);
+
+	if (rx_mon_sts->mpdu_cnt_fcs_err[pkt_t][rx_t][dl_ul][user])
+		dp_print_pdev_mpdu_fcs_err_cnt(rx_mon_sts, pkt_t, rx_t,
+					       dl_ul, user);
+}
+
+static inline void
+dp_print_pdev_mpdu_user(struct cdp_pdev_mon_stats *rx_mon_sts,
+			uint32_t pkt_t, uint32_t rx_t,
+			uint32_t dl_ul)
+{
+	uint32_t user;
+
+	for (user = 0; user < CDP_MU_SNIF_USER_MAX; user++)
+		dp_print_pdev_mpdu_cnt(rx_mon_sts, pkt_t, rx_t,
+				       dl_ul, user);
+}
+
+static inline void
+dp_print_pdev_mpdu_dl_ul(struct cdp_pdev_mon_stats *rx_mon_sts,
+			 uint32_t pkt_t, uint32_t rx_t)
+{
+	uint32_t dl_ul;
+
+	for (dl_ul = CDP_MU_TYPE_DL; dl_ul < CDP_MU_TYPE_MAX; dl_ul++)
+		dp_print_pdev_mpdu_user(rx_mon_sts, pkt_t, rx_t,
+					dl_ul);
+}
+
+static inline void
+dp_print_pdev_mpdu_rx_type(struct cdp_pdev_mon_stats *rx_mon_sts,
+			   uint32_t pkt_t)
+{
+	uint32_t rx_t;
+
+	for (rx_t = CDP_RX_TYPE_SU; rx_t < CDP_RX_TYPE_MAX; rx_t++)
+		dp_print_pdev_mpdu_dl_ul(rx_mon_sts, pkt_t, rx_t);
+}
+
+static inline void
+dp_print_pdev_mpdu_pkt_type(struct cdp_pdev_mon_stats *rx_mon_sts)
+{
+	uint32_t pkt_t;
+
+	for (pkt_t = CDP_PKT_TYPE_OFDM; pkt_t < CDP_PKT_TYPE_MAX; pkt_t++)
+		dp_print_pdev_mpdu_rx_type(rx_mon_sts, pkt_t);
+}
+
+static inline void
+dp_print_pdev_mpdu_stats(struct dp_pdev *pdev)
+{
+	struct cdp_pdev_mon_stats *rx_mon_stats;
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+
+	rx_mon_stats = &mon_pdev->rx_mon_stats;
+	DP_PRINT_STATS("Monitor MPDU Count");
+	dp_print_pdev_mpdu_pkt_type(rx_mon_stats);
+}
+
 void
 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
 {
@@ -842,6 +960,12 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
 		       rx_mon_stats->status_ppdu_start_mis);
 	DP_PRINT_STATS("status_ppdu_end_mis_cnt = %d",
 		       rx_mon_stats->status_ppdu_end_mis);
+
+	DP_PRINT_STATS("start_user_info_cnt = %d",
+		       rx_mon_stats->start_user_info_cnt);
+	DP_PRINT_STATS("end_user_stats_cnt = %d",
+		       rx_mon_stats->end_user_stats_cnt);
+
 	DP_PRINT_STATS("status_ppdu_done_cnt = %d",
 		       rx_mon_stats->status_ppdu_done);
 	DP_PRINT_STATS("dest_ppdu_done_cnt = %d",
@@ -907,6 +1031,9 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
 
 	dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats);
 	dp_mon_rx_print_advanced_stats(pdev->soc, pdev);
+
+	dp_print_pdev_mpdu_stats(pdev);
+
 }
 
 #ifdef QCA_SUPPORT_BPR

+ 16 - 0
hal/wifi3.0/be/hal_be_api_mon.h

@@ -1682,18 +1682,31 @@ hal_rx_parse_receive_user_info(struct hal_soc *hal_soc, uint8_t *tlv,
 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
 		break;
 	case HAL_RECEPTION_TYPE_DL_MU_MIMO:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL;
+		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
+		break;
 	case HAL_RECEPTION_TYPE_UL_MU_MIMO:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL;
 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
 		break;
 	case HAL_RECEPTION_TYPE_DL_MU_OFMA:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL;
+		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
+		break;
 	case HAL_RECEPTION_TYPE_UL_MU_OFDMA:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL;
 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
 		break;
 	case HAL_RECEPTION_TYPE_DL_MU_OFDMA_MIMO:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_DL;
+		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA_MIMO;
 	case HAL_RECEPTION_TYPE_UL_MU_OFDMA_MIMO:
+		ppdu_info->rx_status.mu_dl_ul = HAL_RX_TYPE_UL;
 		ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA_MIMO;
 	}
 
+	ppdu_info->start_user_info_cnt++;
+
 	ppdu_info->rx_status.is_stbc = rx_usr_info->stbc;
 	ppdu_info->rx_status.ldpc = rx_usr_info->ldpc;
 	ppdu_info->rx_status.dcm = rx_usr_info->sta_dcm;
@@ -2067,6 +2080,9 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
 		ppdu_info->rx_status.preamble_type =
 			HAL_RX_GET_64(rx_tlv, RX_PPDU_END_USER_STATS,
 				      HT_CONTROL_FIELD_PKT_TYPE);
+
+		ppdu_info->end_user_stats_cnt++;
+
 		switch (ppdu_info->rx_status.preamble_type) {
 		case HAL_RX_PKT_TYPE_11N:
 			ppdu_info->rx_status.ht_flags = 1;

+ 9 - 0
hal/wifi3.0/hal_api_mon.h

@@ -603,6 +603,11 @@ enum {
 	HAL_RX_TYPE_MU_OFDMA_MIMO,
 };
 
+enum {
+	HAL_RX_TYPE_DL,
+	HAL_RX_TYPE_UL,
+};
+
 /*
  * enum
  * @HAL_RECEPTION_TYPE_SU: Basic SU reception
@@ -1294,6 +1299,10 @@ struct hal_rx_ppdu_info {
 	uint8_t rx_hdr_rcvd[HAL_MAX_UL_MU_USERS];
 	/* Per user BAR and NDPA bit flag */
 	struct hal_rx_user_ctrl_frm_info ctrl_frm_info[HAL_MAX_UL_MU_USERS];
+	/* PPDU end user stats count */
+	uint8_t end_user_stats_cnt;
+	/* PPDU start user info count */
+	uint8_t start_user_info_cnt;
 };
 
 static inline uint32_t

+ 3 - 1
qdf/inc/qdf_nbuf.h

@@ -291,6 +291,7 @@ typedef __qdf_nbuf_queue_t qdf_nbuf_queue_t;
  * @reception_type: PPDU reception type
  * @ltf_size: ltf size
  * @tx_status: packet tx status
+ * @mu_dl_ul: MU down or up link, 0 downlink, 1 uplink
  * @rx_antenna: rx antenna
  * @vht_flag_values6: VHT flag value6
  * @he_mu_other_flags: HE MU other flag
@@ -407,7 +408,8 @@ struct mon_rx_status {
 		 add_rtap_ext2 : 1,
 		 reception_type : 4,
 		 ltf_size : 2,
-		 tx_status : 4;
+		 tx_status : 4,
+		 mu_dl_ul : 1;
 	uint32_t rx_antenna : 24;
 	uint16_t vht_flag_values6;
 	uint16_t he_mu_other_flags;