OSDN Git Service

mlxsw: spectrum_dcb: Convert mlxsw_sp_port_pg_prio_map() to hdroom code
authorPetr Machata <petrm@nvidia.com>
Wed, 16 Sep 2020 06:35:22 +0000 (09:35 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 16 Sep 2020 22:19:30 +0000 (15:19 -0700)
The new hdroom code has certain conventions: iteration over priorities is
done through a variable named `prio', configuration is not pushed unless it
is dirty, but a `force' flag can be used to override this, updated
configuration is written to port. Convert the function
mlxsw_sp_port_pg_prio_map() to use these conventions and rename
appropriately to fit in.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c

index 6d22629..098432c 100644 (file)
@@ -64,24 +64,33 @@ static int mlxsw_sp_port_ets_validate(struct mlxsw_sp_port *mlxsw_sp_port,
        return 0;
 }
 
-static int mlxsw_sp_port_pg_prio_map(struct mlxsw_sp_port *mlxsw_sp_port,
-                                    u8 *prio_tc)
+static int mlxsw_sp_hdroom_configure_priomap(struct mlxsw_sp_port *mlxsw_sp_port,
+                                            const struct mlxsw_sp_hdroom *hdroom, bool force)
 {
        char pptb_pl[MLXSW_REG_PPTB_LEN];
-       int i;
+       bool dirty;
+       int prio;
+       int err;
+
+       dirty = memcmp(&mlxsw_sp_port->hdroom->prios, &hdroom->prios, sizeof(hdroom->prios));
+       if (!dirty && !force)
+               return 0;
 
        mlxsw_reg_pptb_pack(pptb_pl, mlxsw_sp_port->local_port);
-       for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++)
-               mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, i, prio_tc[i]);
+       for (prio = 0; prio < IEEE_8021QAZ_MAX_TCS; prio++)
+               mlxsw_reg_pptb_prio_to_buff_pack(pptb_pl, prio, hdroom->prios.prio[prio].buf_idx);
+
+       err = mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb), pptb_pl);
+       if (err)
+               return err;
 
-       return mlxsw_reg_write(mlxsw_sp_port->mlxsw_sp->core, MLXSW_REG(pptb),
-                              pptb_pl);
+       mlxsw_sp_port->hdroom->prios = hdroom->prios;
+       return 0;
 }
 
 static int mlxsw_sp_port_headroom_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
                                          struct ieee_ets *ets)
 {
-       struct ieee_ets *my_ets = mlxsw_sp_port->dcb.ets;
        struct net_device *dev = mlxsw_sp_port->dev;
        struct mlxsw_sp_hdroom orig_hdroom;
        struct mlxsw_sp_hdroom tmp_hdroom;
@@ -115,7 +124,7 @@ static int mlxsw_sp_port_headroom_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
                return err;
        }
 
-       err = mlxsw_sp_port_pg_prio_map(mlxsw_sp_port, ets->prio_tc);
+       err = mlxsw_sp_hdroom_configure_priomap(mlxsw_sp_port, &hdroom, false);
        if (err) {
                netdev_err(dev, "Failed to set PG-priority mapping\n");
                goto err_port_prio_pg_map;
@@ -130,7 +139,7 @@ static int mlxsw_sp_port_headroom_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
        return 0;
 
 err_configure_buffers:
-       mlxsw_sp_port_pg_prio_map(mlxsw_sp_port, my_ets->prio_tc);
+       mlxsw_sp_hdroom_configure_priomap(mlxsw_sp_port, &tmp_hdroom, false);
 err_port_prio_pg_map:
        mlxsw_sp_hdroom_configure(mlxsw_sp_port, &orig_hdroom);
        return err;