bool stat_offsets_loaded;
        struct i40e_eth_stats stats;
        struct i40e_eth_stats stats_offsets;
+       struct i40e_veb_tc_stats tc_stats;
+       struct i40e_veb_tc_stats tc_stats_offsets;
 };
 
 /* struct that defines a VSI, associated with a dev */
 
                 FIELD_SIZEOF(struct i40e_pf, stats.priority_xon_tx) + \
                 FIELD_SIZEOF(struct i40e_pf, stats.priority_xon_2_xoff)) \
                 / sizeof(u64))
+#define I40E_VEB_TC_STATS_LEN ( \
+               (FIELD_SIZEOF(struct i40e_veb, tc_stats.tc_rx_packets) + \
+                FIELD_SIZEOF(struct i40e_veb, tc_stats.tc_rx_bytes) + \
+                FIELD_SIZEOF(struct i40e_veb, tc_stats.tc_tx_packets) + \
+                FIELD_SIZEOF(struct i40e_veb, tc_stats.tc_tx_bytes)) \
+                / sizeof(u64))
 #define I40E_VEB_STATS_LEN     ARRAY_SIZE(i40e_gstrings_veb_stats)
+#define I40E_VEB_STATS_TOTAL   (I40E_VEB_STATS_LEN + I40E_VEB_TC_STATS_LEN)
 #define I40E_PF_STATS_LEN(n)   (I40E_GLOBAL_STATS_LEN + \
                                 I40E_PFC_STATS_LEN + \
                                 I40E_VSI_STATS_LEN((n)))
                        int len = I40E_PF_STATS_LEN(netdev);
 
                        if (pf->lan_veb != I40E_NO_VEB)
-                               len += I40E_VEB_STATS_LEN;
+                               len += I40E_VEB_STATS_TOTAL;
                        return len;
                } else {
                        return I40E_VSI_STATS_LEN(netdev);
                                        i40e_gstrings_veb_stats[i].stat_string);
                                p += ETH_GSTRING_LEN;
                        }
+                       for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
+                               snprintf(p, ETH_GSTRING_LEN,
+                                        "veb.tc_%u_tx_packets", i);
+                               p += ETH_GSTRING_LEN;
+                               snprintf(p, ETH_GSTRING_LEN,
+                                        "veb.tc_%u_tx_bytes", i);
+                               p += ETH_GSTRING_LEN;
+                               snprintf(p, ETH_GSTRING_LEN,
+                                        "veb.tc_%u_rx_packets", i);
+                               p += ETH_GSTRING_LEN;
+                               snprintf(p, ETH_GSTRING_LEN,
+                                        "veb.tc_%u_rx_bytes", i);
+                               p += ETH_GSTRING_LEN;
+                       }
                }
                for (i = 0; i < I40E_GLOBAL_STATS_LEN; i++) {
                        snprintf(p, ETH_GSTRING_LEN, "port.%s",
 
        struct i40e_hw *hw = &pf->hw;
        struct i40e_eth_stats *oes;
        struct i40e_eth_stats *es;     /* device's eth stats */
-       int idx = 0;
+       struct i40e_veb_tc_stats *veb_oes;
+       struct i40e_veb_tc_stats *veb_es;
+       int i, idx = 0;
 
        idx = veb->stats_idx;
        es = &veb->stats;
        oes = &veb->stats_offsets;
+       veb_es = &veb->tc_stats;
+       veb_oes = &veb->tc_stats_offsets;
 
        /* Gather up the stats that the hw collects */
        i40e_stat_update32(hw, I40E_GLSW_TDPC(idx),
        i40e_stat_update48(hw, I40E_GLSW_BPTCH(idx), I40E_GLSW_BPTCL(idx),
                           veb->stat_offsets_loaded,
                           &oes->tx_broadcast, &es->tx_broadcast);
+       for (i = 0; i < I40E_MAX_TRAFFIC_CLASS; i++) {
+               i40e_stat_update48(hw, I40E_GLVEBTC_RPCH(i, idx),
+                                  I40E_GLVEBTC_RPCL(i, idx),
+                                  veb->stat_offsets_loaded,
+                                  &veb_oes->tc_rx_packets[i],
+                                  &veb_es->tc_rx_packets[i]);
+               i40e_stat_update48(hw, I40E_GLVEBTC_RBCH(i, idx),
+                                  I40E_GLVEBTC_RBCL(i, idx),
+                                  veb->stat_offsets_loaded,
+                                  &veb_oes->tc_rx_bytes[i],
+                                  &veb_es->tc_rx_bytes[i]);
+               i40e_stat_update48(hw, I40E_GLVEBTC_TPCH(i, idx),
+                                  I40E_GLVEBTC_TPCL(i, idx),
+                                  veb->stat_offsets_loaded,
+                                  &veb_oes->tc_tx_packets[i],
+                                  &veb_es->tc_tx_packets[i]);
+               i40e_stat_update48(hw, I40E_GLVEBTC_TBCH(i, idx),
+                                  I40E_GLVEBTC_TBCL(i, idx),
+                                  veb->stat_offsets_loaded,
+                                  &veb_oes->tc_tx_bytes[i],
+                                  &veb_es->tc_tx_bytes[i]);
+       }
        veb->stat_offsets_loaded = true;
 }
 
 
        u64 tx_errors;                  /* tepc */
 };
 
+/* Statistics collected per VEB per TC */
+struct i40e_veb_tc_stats {
+       u64 tc_rx_packets[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_rx_bytes[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_tx_packets[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_tx_bytes[I40E_MAX_TRAFFIC_CLASS];
+};
+
 #ifdef I40E_FCOE
 /* Statistics collected per function for FCoE */
 struct i40e_fcoe_stats {
 
        u64 tx_errors;                  /* tepc */
 };
 
+/* Statistics collected per VEB per TC */
+struct i40e_veb_tc_stats {
+       u64 tc_rx_packets[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_rx_bytes[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_tx_packets[I40E_MAX_TRAFFIC_CLASS];
+       u64 tc_tx_bytes[I40E_MAX_TRAFFIC_CLASS];
+};
+
 /* Statistics collected by the MAC */
 struct i40e_hw_port_stats {
        /* eth stats collected by the port */