@@ -101,6 +101,8 @@ struct port_stats {
u64 rx_trunc1; /* buffer-group 1 truncated packets */
u64 rx_trunc2; /* buffer-group 2 truncated packets */
u64 rx_trunc3; /* buffer-group 3 truncated packets */
+
+ u64 rx_tp_tnl_cong_drops[NCHAN]; /* TP frame drops due to congestion */
};
struct sge_params {
@@ -3040,8 +3040,10 @@ unsigned int t4_get_tp_ch_map(struct adapter *adapter, unsigned int pidx)
*/
void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
{
- u32 bgmap = t4_get_mps_bg_map(adap, idx);
u32 stat_ctl = t4_read_reg(adap, A_MPS_STAT_CTL);
+ u32 bgmap = t4_get_mps_bg_map(adap, idx);
+ u32 val[NCHAN] = { 0 };
+ u8 i;
#define GET_STAT(name) \
t4_read_reg64(adap, \
@@ -3129,6 +3131,11 @@ void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p)
p->rx_trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_MAC_TRUNC_FRAME) : 0;
p->rx_trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_MAC_TRUNC_FRAME) : 0;
+ t4_read_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA, &val[idx], 1,
+ A_TP_MIB_TNL_CNG_DROP_0 + idx);
+
+ for (i = 0; i < NCHAN; i++)
+ p->rx_tp_tnl_cong_drops[i] = val[i];
#undef GET_STAT
#undef GET_STAT_COM
}
@@ -3163,9 +3170,10 @@ void t4_get_port_stats_offset(struct adapter *adap, int idx,
*/
void t4_clr_port_stats(struct adapter *adap, int idx)
{
- unsigned int i;
u32 bgmap = t4_get_mps_bg_map(adap, idx);
u32 port_base_addr;
+ unsigned int i;
+ u32 val = 0;
if (is_t4(adap->params.chip))
port_base_addr = PORT_BASE(idx);
@@ -3187,6 +3195,8 @@ void t4_clr_port_stats(struct adapter *adap, int idx)
A_MPS_STAT_RX_BG_0_MAC_TRUNC_FRAME_L +
i * 8, 0);
}
+ t4_write_indirect(adap, A_TP_MIB_INDEX, A_TP_MIB_DATA,
+ &val, 1, A_TP_MIB_TNL_CNG_DROP_0 + idx);
}
/**
@@ -525,6 +525,8 @@
#define A_TP_PIO_ADDR 0x7e40
#define A_TP_PIO_DATA 0x7e44
+#define A_TP_MIB_INDEX 0x7e50
+#define A_TP_MIB_DATA 0x7e54
#define A_TP_RSS_SECRET_KEY0 0x40
@@ -587,6 +589,8 @@
#define S_RM_OVLAN 9
#define V_RM_OVLAN(x) ((x) << S_RM_OVLAN)
+#define A_TP_MIB_TNL_CNG_DROP_0 0x18
+
/* registers for module MA */
#define A_MA_EDRAM0_BAR 0x77c0
@@ -709,6 +709,9 @@ static int cxgbe_dev_stats_get(struct rte_eth_dev *eth_dev,
ps.rx_ovflow2 + ps.rx_ovflow3 +
ps.rx_trunc0 + ps.rx_trunc1 +
ps.rx_trunc2 + ps.rx_trunc3;
+ for (i = 0; i < NCHAN; i++)
+ eth_stats->imissed += ps.rx_tp_tnl_cong_drops[i];
+
eth_stats->ierrors = ps.rx_symbol_err + ps.rx_fcs_err +
ps.rx_jabber + ps.rx_too_long + ps.rx_runt +
ps.rx_len_err;
@@ -851,6 +854,14 @@ static const struct cxgbe_dev_xstats_name_off cxgbe_dev_port_stats_strings[] = {
{"rx_bg1_truncated_packets", offsetof(struct port_stats, rx_trunc1)},
{"rx_bg2_truncated_packets", offsetof(struct port_stats, rx_trunc2)},
{"rx_bg3_truncated_packets", offsetof(struct port_stats, rx_trunc3)},
+ {"rx_tp_tnl_cong_drops0",
+ offsetof(struct port_stats, rx_tp_tnl_cong_drops[0])},
+ {"rx_tp_tnl_cong_drops1",
+ offsetof(struct port_stats, rx_tp_tnl_cong_drops[1])},
+ {"rx_tp_tnl_cong_drops2",
+ offsetof(struct port_stats, rx_tp_tnl_cong_drops[2])},
+ {"rx_tp_tnl_cong_drops3",
+ offsetof(struct port_stats, rx_tp_tnl_cong_drops[3])},
};
static const struct cxgbe_dev_xstats_name_off