@@ -50,7 +50,7 @@
#define ICSSG_MAX_RFLOWS 8 /* per slice */
-#define ICSSG_NUM_PA_STATS 4
+#define ICSSG_NUM_PA_STATS 37
#define ICSSG_NUM_MIIG_STATS 60
/* Number of ICSSG related stats */
#define ICSSG_NUM_STATS (ICSSG_NUM_MIIG_STATS + ICSSG_NUM_PA_STATS)
@@ -11,7 +11,6 @@
#define ICSSG_TX_PACKET_OFFSET 0xA0
#define ICSSG_TX_BYTE_OFFSET 0xEC
-#define ICSSG_FW_STATS_BASE 0x0248
static u32 stats_base[] = { 0x54c, /* Slice 0 stats start */
0xb18, /* Slice 1 stats start */
@@ -44,9 +43,8 @@ void emac_update_hardware_stats(struct prueth_emac *emac)
if (prueth->pa_stats) {
for (i = 0; i < ARRAY_SIZE(icssg_all_pa_stats); i++) {
- reg = ICSSG_FW_STATS_BASE +
- icssg_all_pa_stats[i].offset *
- PRUETH_NUM_MACS + slice * sizeof(u32);
+ reg = icssg_all_pa_stats[i].offset +
+ slice * sizeof(u32);
regmap_read(prueth->pa_stats, reg, &val);
emac->pa_stats[i] += val;
}
@@ -155,24 +155,10 @@ static const struct icssg_miig_stats icssg_all_miig_stats[] = {
ICSSG_MIIG_STATS(tx_bytes, true),
};
-/**
- * struct pa_stats_regs - ICSSG Firmware maintained PA Stats register
- * @fw_rx_cnt: Number of valid packets sent by Rx PRU to Host on PSI
- * @fw_tx_cnt: Number of valid packets copied by RTU0 to Tx queues
- * @fw_tx_pre_overflow: Host Egress Q (Pre-emptible) Overflow Counter
- * @fw_tx_exp_overflow: Host Egress Q (Express) Overflow Counter
- */
-struct pa_stats_regs {
- u32 fw_rx_cnt;
- u32 fw_tx_cnt;
- u32 fw_tx_pre_overflow;
- u32 fw_tx_exp_overflow;
-};
-
-#define ICSSG_PA_STATS(field) \
-{ \
- #field, \
- offsetof(struct pa_stats_regs, field), \
+#define ICSSG_PA_STATS(field) \
+{ \
+ #field, \
+ field, \
}
struct icssg_pa_stats {
@@ -181,10 +167,43 @@ struct icssg_pa_stats {
};
static const struct icssg_pa_stats icssg_all_pa_stats[] = {
- ICSSG_PA_STATS(fw_rx_cnt),
- ICSSG_PA_STATS(fw_tx_cnt),
- ICSSG_PA_STATS(fw_tx_pre_overflow),
- ICSSG_PA_STATS(fw_tx_exp_overflow),
+ ICSSG_PA_STATS(FW_RTU_PKT_DROP),
+ ICSSG_PA_STATS(FW_Q0_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q1_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q2_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q3_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q4_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q5_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q6_OVERFLOW),
+ ICSSG_PA_STATS(FW_Q7_OVERFLOW),
+ ICSSG_PA_STATS(FW_DROPPED_PKT),
+ ICSSG_PA_STATS(FW_RX_ERROR),
+ ICSSG_PA_STATS(FW_RX_DS_INVALID),
+ ICSSG_PA_STATS(FW_TX_DROPPED_PACKET),
+ ICSSG_PA_STATS(FW_TX_TS_DROPPED_PACKET),
+ ICSSG_PA_STATS(FW_INF_PORT_DISABLED),
+ ICSSG_PA_STATS(FW_INF_SAV),
+ ICSSG_PA_STATS(FW_INF_SA_BL),
+ ICSSG_PA_STATS(FW_INF_PORT_BLOCKED),
+ ICSSG_PA_STATS(FW_INF_DROP_TAGGED),
+ ICSSG_PA_STATS(FW_INF_DROP_PRIOTAGGED),
+ ICSSG_PA_STATS(FW_INF_DROP_NOTAG),
+ ICSSG_PA_STATS(FW_INF_DROP_NOTMEMBER),
+ ICSSG_PA_STATS(FW_PREEMPT_BAD_FRAG),
+ ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_ERR),
+ ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_TX),
+ ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_OK),
+ ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_RX),
+ ICSSG_PA_STATS(FW_RX_EOF_SHORT_FRMERR),
+ ICSSG_PA_STATS(FW_RX_B0_DROP_EARLY_EOF),
+ ICSSG_PA_STATS(FW_TX_JUMBO_FRM_CUTOFF),
+ ICSSG_PA_STATS(FW_RX_EXP_FRAG_Q_DROP),
+ ICSSG_PA_STATS(FW_RX_FIFO_OVERRUN),
+ ICSSG_PA_STATS(FW_CUT_THR_PKT),
+ ICSSG_PA_STATS(FW_HOST_RX_PKT_CNT),
+ ICSSG_PA_STATS(FW_HOST_TX_PKT_CNT),
+ ICSSG_PA_STATS(FW_HOST_EGRESS_Q_PRE_OVERFLOW),
+ ICSSG_PA_STATS(FW_HOST_EGRESS_Q_EXP_OVERFLOW),
};
#endif /* __NET_TI_ICSSG_STATS_H */
@@ -231,4 +231,109 @@
/* Start of 32 bits PA_STAT counters */
#define PA_STAT_32b_START_OFFSET 0x0080
+/* Diagnostic error counter which increments when RTU drops a locally injected
+ * packet due to port disabled or rule violation.
+ */
+#define FW_RTU_PKT_DROP 0x0088
+
+/* Tx Queue Overflow Counters */
+#define FW_Q0_OVERFLOW 0x0090
+#define FW_Q1_OVERFLOW 0x0098
+#define FW_Q2_OVERFLOW 0x00A0
+#define FW_Q3_OVERFLOW 0x00A8
+#define FW_Q4_OVERFLOW 0x00B0
+#define FW_Q5_OVERFLOW 0x00B8
+#define FW_Q6_OVERFLOW 0x00C0
+#define FW_Q7_OVERFLOW 0x00C8
+
+/* Incremented if a packet is dropped at PRU because of a rule violation */
+#define FW_DROPPED_PKT 0x00F8
+
+/* Incremented if there was a CRC error or Min/Max frame error at PRU0 */
+#define FW_RX_ERROR 0x0100
+
+/* Incremented when RTU detects Data Status invalid condition */
+#define FW_RX_DS_INVALID 0x0108
+
+/* Counter for packets dropped via TX Port */
+#define FW_TX_DROPPED_PACKET 0x0110
+
+/* Counter for packets with TS flag dropped via TX Port */
+#define FW_TX_TS_DROPPED_PACKET 0x0118
+
+/* Incremented when RX frame is dropped due to port being disabled */
+#define FW_INF_PORT_DISABLED 0x0120
+
+/* Incremented when RX frame is dropped due to Source Address violation */
+#define FW_INF_SAV 0x0128
+
+/* Incremented when RX frame is dropped due to Source Address being black
+ * listed
+ */
+#define FW_INF_SA_BL 0x0130
+
+/* Incremented when RX frame is dropped due to port being blocked and frame
+ * is being a special frame
+ */
+#define FW_INF_PORT_BLOCKED 0x0138
+
+/* Incremented when RX frame is dropped for being tagged */
+#define FW_INF_DROP_TAGGED 0x0140
+
+/* Incremented when RX frame is dropped for being priority tagged */
+#define FW_INF_DROP_PRIOTAGGED 0x0148
+
+/* Incremented when RX frame is dropped for being untagged */
+#define FW_INF_DROP_NOTAG 0x0150
+
+/* Incremented when RX frame is dropped for port not being member of VLAN */
+#define FW_INF_DROP_NOTMEMBER 0x0158
+
+/* Bad fragment Error Counter */
+#define FW_PREEMPT_BAD_FRAG 0x0160
+
+/* Fragment assembly Error Counter */
+#define FW_PREEMPT_ASSEMBLY_ERR 0x0168
+
+/* Fragment count in TX */
+#define FW_PREEMPT_FRAG_CNT_TX 0x0170
+
+/* Assembly Completed */
+#define FW_PREEMPT_ASSEMBLY_OK 0x0178
+
+/* Fragments received */
+#define FW_PREEMPT_FRAG_CNT_RX 0x0180
+
+/* Incremented if EOF task is scheduled without seeing RX_B1 */
+#define FW_RX_EOF_SHORT_FRMERR 0x0188
+
+/* Incremented when frame is dropped due to Early EOF received in B0 */
+#define FW_RX_B0_DROP_EARLY_EOF 0x0190
+
+/* Incremented when frame is cut off to prevent packet size > 2000B */
+#define FW_TX_JUMBO_FRM_CUTOFF 0x0198
+
+/* Incremented when express frame is received in the same queue as the previous
+ * fragment
+ */
+#define FW_RX_EXP_FRAG_Q_DROP 0x01A0
+
+/* RX fifo overrun counter */
+#define FW_RX_FIFO_OVERRUN 0x01A8
+
+/* Cut-through packet Counter */
+#define FW_CUT_THR_PKT 0x01B0
+
+/* Number of valid packets sent by Rx PRU to Host on PSI */
+#define FW_HOST_RX_PKT_CNT 0x0248
+
+/* Number of valid packets copied by RTU0 to Tx queues */
+#define FW_HOST_TX_PKT_CNT 0x0250
+
+/* Host Egress Q (Pre-emptible) Overflow Counter */
+#define FW_HOST_EGRESS_Q_PRE_OVERFLOW 0x0258
+
+/* Host Egress Q (Pre-emptible) Overflow Counter */
+#define FW_HOST_EGRESS_Q_EXP_OVERFLOW 0x0260
+
#endif /* __NET_TI_ICSSG_SWITCH_MAP_H */
The ICSSG firmware maintains set of stats called PA_STATS. Currently the driver only dumps 4 stats. Add support for dumping more stats. The offset for different stats are defined as MACROs in icssg_switch_map.h file. All the offsets are for Slice0. Slice1 offsets are slice0 + 4. The offset calculation is taken care while reading the stats in emac_update_hardware_stats(). Signed-off-by: MD Danish Anwar <danishanwar@ti.com> --- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 +- drivers/net/ethernet/ti/icssg/icssg_stats.c | 6 +- drivers/net/ethernet/ti/icssg/icssg_stats.h | 63 +++++++---- .../net/ethernet/ti/icssg/icssg_switch_map.h | 105 ++++++++++++++++++ 4 files changed, 149 insertions(+), 27 deletions(-) base-commit: 0493f7a54e5bcf490f943f7b25ec6e1051832f98