u8 buf_idx;
        /* Value of buf_idx deduced from the DCB ETS configuration. */
        u8 ets_buf_idx;
+       /* Value of buf_idx taken from the dcbnl_setbuffer configuration. */
+       u8 set_buf_idx;
        bool lossy;
 };
 
 struct mlxsw_sp_hdroom_buf {
        u32 thres_cells;
        u32 size_cells;
+       /* Size requirement form dcbnl_setbuffer. */
+       u32 set_size_cells;
        bool lossy;
 };
 
+enum mlxsw_sp_hdroom_mode {
+       MLXSW_SP_HDROOM_MODE_DCB,
+       MLXSW_SP_HDROOM_MODE_TC,
+};
+
 #define MLXSW_SP_PB_COUNT 10
 
 struct mlxsw_sp_hdroom {
+       enum mlxsw_sp_hdroom_mode mode;
+
        struct {
                struct mlxsw_sp_hdroom_prio prio[IEEE_8021Q_MAX_PRIORITIES];
        } prios;
 
 {
        int prio;
 
-       for (prio = 0; prio < IEEE_8021QAZ_MAX_TCS; prio++)
-               hdroom->prios.prio[prio].buf_idx = hdroom->prios.prio[prio].ets_buf_idx;
+       for (prio = 0; prio < IEEE_8021QAZ_MAX_TCS; prio++) {
+               switch (hdroom->mode) {
+               case MLXSW_SP_HDROOM_MODE_DCB:
+                       hdroom->prios.prio[prio].buf_idx = hdroom->prios.prio[prio].ets_buf_idx;
+                       break;
+               case MLXSW_SP_HDROOM_MODE_TC:
+                       hdroom->prios.prio[prio].buf_idx = hdroom->prios.prio[prio].set_buf_idx;
+                       break;
+               }
+       }
 }
 
 void mlxsw_sp_hdroom_bufs_reset_lossiness(struct mlxsw_sp_hdroom *hdroom)
                delay_cells = mlxsw_sp_port_headroom_8x_adjust(mlxsw_sp_port, delay_cells);
 
                buf->thres_cells = thres_cells;
-               buf->size_cells = thres_cells + delay_cells;
+               if (hdroom->mode == MLXSW_SP_HDROOM_MODE_DCB) {
+                       buf->size_cells = thres_cells + delay_cells;
+               } else {
+                       /* Do not allow going below the minimum size, even if
+                        * the user requested it.
+                        */
+                       buf->size_cells = max(buf->set_size_cells, buf->thres_cells);
+               }
        }
 }
 
        int prio;
 
        hdroom.mtu = mlxsw_sp_port->dev->mtu;
+       hdroom.mode = MLXSW_SP_HDROOM_MODE_DCB;
        for (prio = 0; prio < IEEE_8021QAZ_MAX_TCS; prio++)
                hdroom.prios.prio[prio].lossy = true;