Selaa lähdekoodia

qcacmn: Add support for undecoded frame error stats

Display phyrx aborted undecoded frame count and the aborted
reason statistics as part of pdev rx mon stats.

Change-Id: Ia86074e62af3179855734b47801715abd1899fe1
CRs-Fixed: 3123540
Basamma Yakkanahalli 3 vuotta sitten
vanhempi
sitoutus
70f4513196
3 muutettua tiedostoa jossa 133 lisäystä ja 1 poistoa
  1. 80 0
      dp/inc/cdp_txrx_mon_struct.h
  2. 41 0
      dp/wifi3.0/monitor/dp_mon.c
  3. 12 1
      dp/wifi3.0/monitor/dp_rx_mon.c

+ 80 - 0
dp/inc/cdp_txrx_mon_struct.h

@@ -214,6 +214,80 @@ enum {
 	CDP_MON_PPDU_END,
 };
 
+#ifdef QCA_UNDECODED_METADATA_SUPPORT
+/**
+ * enum cdp_mon_phyrx_abort_reason_code: Phy err code to store the reason
+ * why PHY generated an abort request.
+ */
+enum cdp_mon_phyrx_abort_reason_code {
+	CDP_PHYRX_ERR_PHY_OFF = 0,
+	CDP_PHYRX_ERR_SYNTH_OFF,
+	CDP_PHYRX_ERR_OFDMA_TIMING,
+	CDP_PHYRX_ERR_OFDMA_SIGNAL_PARITY,
+	CDP_PHYRX_ERR_OFDMA_RATE_ILLEGAL,
+	CDP_PHYRX_ERR_OFDMA_LENGTH_ILLEGAL,
+	CDP_PHYRX_ERR_OFDMA_RESTART,
+	CDP_PHYRX_ERR_OFDMA_SERVICE,
+	CDP_PHYRX_ERR_PPDU_OFDMA_POWER_DROP,
+	CDP_PHYRX_ERR_CCK_BLOKKER,
+	CDP_PHYRX_ERR_CCK_TIMING = 10,
+	CDP_PHYRX_ERR_CCK_HEADER_CRC,
+	CDP_PHYRX_ERR_CCK_RATE_ILLEGAL,
+	CDP_PHYRX_ERR_CCK_LENGTH_ILLEGAL,
+	CDP_PHYRX_ERR_CCK_RESTART,
+	CDP_PHYRX_ERR_CCK_SERVICE,
+	CDP_PHYRX_ERR_CCK_POWER_DROP,
+	CDP_PHYRX_ERR_HT_CRC_ERR,
+	CDP_PHYRX_ERR_HT_LENGTH_ILLEGAL,
+	CDP_PHYRX_ERR_HT_RATE_ILLEGAL,
+	CDP_PHYRX_ERR_HT_ZLF = 20,
+	CDP_PHYRX_ERR_FALSE_RADAR_EXT,
+	CDP_PHYRX_ERR_GREEN_FIELD,
+	CDP_PHYRX_ERR_BW_GT_DYN_BW,
+	CDP_PHYRX_ERR_HT_LSIG_RATE_MISMATCH,
+	CDP_PHYRX_ERR_VHT_CRC_ERROR,
+	CDP_PHYRX_ERR_VHT_SIGA_UNSUPPORTED,
+	CDP_PHYRX_ERR_VHT_LSIG_LEN_INVALID,
+	CDP_PHYRX_ERR_VHT_NDP_OR_ZLF,
+	CDP_PHYRX_ERR_VHT_NSYM_LT_ZERO,
+	CDP_PHYRX_ERR_VHT_RX_EXTRA_SYMBOL_MISMATCH = 30,
+	CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID0,
+	CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID1TO62,
+	CDP_PHYRX_ERR_VHT_RX_SKIP_GROUP_ID63,
+	CDP_PHYRX_ERR_OFDM_LDPC_DECODER_DISABLED,
+	CDP_PHYRX_ERR_DEFER_NAP,
+	CDP_PHYRX_ERR_FDOMAIN_TIMEOUT,
+	CDP_PHYRX_ERR_LSIG_REL_CHECK,
+	CDP_PHYRX_ERR_BT_COLLISION,
+	CDP_PHYRX_ERR_UNSUPPORTED_MU_FEEDBACK,
+	CDP_PHYRX_ERR_PPDU_TX_INTERRUPT_RX = 40,
+	CDP_PHYRX_ERR_UNSUPPORTED_CBF,
+	CDP_PHYRX_ERR_OTHER,
+	CDP_PHYRX_ERR_HE_SIGA_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_SIGA_CRC_ERROR,
+	CDP_PHYRX_ERR_HE_SIGB_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_SIGB_CRC_ERROR,
+	CDP_PHYRX_ERR_HE_MU_MODE_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_NDP_OR_ZLF,
+	CDP_PHYRX_ERR_HE_NSYM_LT_ZERO,
+	CDP_PHYRX_ERR_HE_RU_PARAMS_UNSUPPORTED = 50,
+	CDP_PHYRX_ERR_HE_NUM_USERS_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_SOUNDING_PARAMS_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_EXT_SU_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_TRIG_UNSUPPORTED,
+	CDP_PHYRX_ERR_HE_LSIG_LEN_INVALID = 55,
+	CDP_PHYRX_ERR_HE_LSIG_RATE_MISMATCH,
+	CDP_PHYRX_ERR_OFDMA_SIGNAL_RELIABILITY,
+	CDP_PHYRX_ERR_HT_NSYM_LT_ZERO,
+	CDP_PHYRX_ERR_VHT_LSIG_RATE_MISMATCH,
+	CDP_PHYRX_ERR_VHT_PAID_GID_MISMATCH = 60,
+	CDP_PHYRX_ERR_VHT_UNSUPPORTED_BW,
+	CDP_PHYRX_ERR_VHT_GI_DISAM_MISMATCH,
+	CDP_PHYRX_ERR_RX_WDG_TIMEOUT = 63,
+	CDP_PHYRX_ERR_MAX
+};
+#endif
+
 #define MAX_PPDU_ID_HIST 128
 
 /**
@@ -242,6 +316,8 @@ enum {
  * @dest_ppdu_drop: Number of ppdu dropped from monitor destination ring
  * @mon_link_desc_invalid: msdu link desc invalid count
  * @mon_rx_desc_invalid: rx_desc invalid count
+ * @rx_undecoded_count: Received undecoded frame count
+ * @rx_undecoded_error: Rx undecoded errors
  */
 struct cdp_pdev_mon_stats {
 #ifndef REMOVE_MON_DBG_STATS
@@ -273,5 +349,9 @@ struct cdp_pdev_mon_stats {
 	uint32_t mon_link_desc_invalid;
 	uint32_t mon_rx_desc_invalid;
 	uint32_t mon_nbuf_sanity_err;
+#ifdef QCA_UNDECODED_METADATA_SUPPORT
+	uint32_t rx_undecoded_count;
+	uint32_t rx_undecoded_error[CDP_PHYRX_ERR_MAX];
+#endif
 };
 #endif

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

@@ -42,6 +42,11 @@
 #include "dp_rx_mon_feature.h"
 #endif /* WLAN_RX_PKT_CAPTURE_ENH */
 
+#ifdef QCA_UNDECODED_METADATA_SUPPORT
+#define MAX_STRING_LEN_PER_FIELD 6
+#define DP_UNDECODED_ERR_LENGTH (MAX_STRING_LEN_PER_FIELD * CDP_PHYRX_ERR_MAX)
+#endif
+
 #ifdef QCA_MCOPY_SUPPORT
 static inline void
 dp_pdev_disable_mcopy_code(struct dp_pdev *pdev)
@@ -767,6 +772,40 @@ QDF_STATUS dp_pdev_get_rx_mon_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
 	return QDF_STATUS_SUCCESS;
 }
 
+#ifdef QCA_UNDECODED_METADATA_SUPPORT
+/**
+ * dp_pdev_get_undecoded_capture_stats() - Get undecoded metadata captured
+ * monitor pdev stats
+ * @mon_pdev: Monitor PDEV handle
+ * @rx_mon_stats: Monitor pdev status/destination ring stats
+ *
+ * Return: None
+ */
+static inline void
+dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev,
+				    struct cdp_pdev_mon_stats *rx_mon_stats)
+{
+	char undecoded_error[DP_UNDECODED_ERR_LENGTH];
+	uint8_t index = 0, i;
+
+	DP_PRINT_STATS("Rx Undecoded Frame count:%d",
+		       rx_mon_stats->rx_undecoded_count);
+	index = 0;
+	for (i = 0; i < (CDP_PHYRX_ERR_MAX); i++) {
+		index += qdf_snprint(&undecoded_error[index],
+				DP_UNDECODED_ERR_LENGTH - index,
+				" %d", rx_mon_stats->rx_undecoded_error[i]);
+	}
+	DP_PRINT_STATS("Undecoded Error (0-63):%s", undecoded_error);
+}
+#else
+static inline void
+dp_pdev_get_undecoded_capture_stats(struct dp_mon_pdev *mon_pdev,
+				    struct cdp_pdev_mon_stats *rx_mon_stats)
+{
+}
+#endif
+
 void
 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
 {
@@ -848,6 +887,8 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
 	qdf_mem_free(dest_ring_ppdu_ids);
 	DP_PRINT_STATS("mon_rx_dest_stuck = %d",
 		       rx_mon_stats->mon_rx_dest_stuck);
+
+	dp_pdev_get_undecoded_capture_stats(mon_pdev, rx_mon_stats);
 }
 
 #ifdef QCA_SUPPORT_BPR

+ 12 - 1
dp/wifi3.0/monitor/dp_rx_mon.c

@@ -1222,6 +1222,8 @@ dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
 {
 	qdf_nbuf_t ppdu_nbuf;
 	struct cdp_rx_indication_ppdu *cdp_rx_ppdu;
+	uint8_t abort_reason = 0;
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
 
 	 /* Return if RX_ABORT not set */
 	if (ppdu_info->rx_status.phyrx_abort == 0)
@@ -1240,8 +1242,17 @@ dp_rx_handle_ppdu_undecoded_metadata(struct dp_soc *soc, struct dp_pdev *pdev,
 				ppdu_info, cdp_rx_ppdu);
 
 		if (!qdf_nbuf_put_tail(ppdu_nbuf,
-				       sizeof(struct cdp_rx_indication_ppdu)))
+				       sizeof(struct cdp_rx_indication_ppdu))) {
 			return;
+		}
+
+		mon_pdev->rx_mon_stats.rx_undecoded_count++;
+		abort_reason = cdp_rx_ppdu->phyrx_abort_reason;
+		if (abort_reason < CDP_PHYRX_ERR_MAX) {
+			mon_pdev->rx_mon_stats.rx_undecoded_error[abort_reason] += 1;
+		} else {
+			mon_pdev->rx_mon_stats.rx_undecoded_error[CDP_PHYRX_ERR_OTHER] += 1;
+		}
 
 		dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC_UNDECODED_METADATA,
 				     soc, ppdu_nbuf, HTT_INVALID_PEER,