err = mlxsw_sp_port_get_stats_raw(dev,
                                                  MLXSW_REG_PPCNT_TC_CONG_CNT,
                                                  i, ppcnt_pl);
-               if (!err)
-                       xstats->wred_drop[i] =
-                               mlxsw_reg_ppcnt_wred_discard_get(ppcnt_pl);
+               if (err)
+                       goto tc_cnt;
+
+               xstats->wred_drop[i] =
+                       mlxsw_reg_ppcnt_wred_discard_get(ppcnt_pl);
+               xstats->tc_ecn[i] = mlxsw_reg_ppcnt_ecn_marked_tc_get(ppcnt_pl);
 
+tc_cnt:
                err = mlxsw_sp_port_get_stats_raw(dev, MLXSW_REG_PPCNT_TC_CNT,
                                                  i, ppcnt_pl);
                if (err)
 
 /* No need an internal lock; At worse - miss a single periodic iteration */
 struct mlxsw_sp_port_xstats {
        u64 ecn;
+       u64 tc_ecn[TC_MAX_QUEUE];
        u64 wred_drop[TC_MAX_QUEUE];
        u64 tail_drop[TC_MAX_QUEUE];
        u64 backlog[TC_MAX_QUEUE];
 
                                               mlxsw_sp_qdisc->prio_bitmap,
                                               &stats_base->tx_packets,
                                               &stats_base->tx_bytes);
+       red_base->prob_mark = xstats->tc_ecn[tclass_num];
        red_base->prob_drop = xstats->wred_drop[tclass_num];
        red_base->pdrop = mlxsw_sp_xstats_tail_drop(xstats, tclass_num);
 
        int tclass_num = mlxsw_sp_qdisc->tclass_num;
        struct mlxsw_sp_port_xstats *xstats;
        struct red_stats *res = xstats_ptr;
-       int early_drops, pdrops;
+       int early_drops, marks, pdrops;
 
        xstats = &mlxsw_sp_port->periodic_hw_stats.xstats;
 
        early_drops = xstats->wred_drop[tclass_num] - xstats_base->prob_drop;
+       marks = xstats->tc_ecn[tclass_num] - xstats_base->prob_mark;
        pdrops = mlxsw_sp_xstats_tail_drop(xstats, tclass_num) -
                 xstats_base->pdrop;
 
        res->pdrop += pdrops;
        res->prob_drop += early_drops;
+       res->prob_mark += marks;
 
        xstats_base->pdrop += pdrops;
        xstats_base->prob_drop += early_drops;
+       xstats_base->prob_mark += marks;
        return 0;
 }
 
        stats_base = &mlxsw_sp_qdisc->stats_base;
 
        mlxsw_sp_qdisc_get_tc_stats(mlxsw_sp_port, mlxsw_sp_qdisc, stats_ptr);
-       overlimits = xstats->wred_drop[tclass_num] - stats_base->overlimits;
+       overlimits = xstats->wred_drop[tclass_num] +
+                    xstats->tc_ecn[tclass_num] - stats_base->overlimits;
 
        stats_ptr->qstats->overlimits += overlimits;
        stats_base->overlimits += overlimits;