mlxsw: reg: Fix packing of router interface counters
authorPetr Machata <petrm@nvidia.com>
Wed, 2 Mar 2022 16:31:24 +0000 (18:31 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 3 Mar 2022 10:37:23 +0000 (10:37 +0000)
The function mlxsw_reg_ritr_counter_pack() formats a register to configure
a router interface (RIF) counter. The parameter `egress' determines whether
an ingress or egress counter is to be configured. RITR, the register in
question, has two sets of counter-related fields: one for ingress, one for
egress. When setting values of the fields, the function sets the proper
counter index field, but when setting the counter type, it always sets the
egress field. Thus configuration of ingress counters is broken, and in fact
an attempt to configure an ingress counter mangles a previously configured
egress counter.

This was never discovered, because there is currently no way to enable
ingress counters on a router interface, only the egress one.

Fix in an obvious way.

Signed-off-by: Petr Machata <petrm@nvidia.com>
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlxsw/reg.h

index dce21da..67b1a2f 100644 (file)
@@ -6784,12 +6784,14 @@ static inline void mlxsw_reg_ritr_counter_pack(char *payload, u32 index,
                set_type = MLXSW_REG_RITR_COUNTER_SET_TYPE_BASIC;
        else
                set_type = MLXSW_REG_RITR_COUNTER_SET_TYPE_NO_COUNT;
-       mlxsw_reg_ritr_egress_counter_set_type_set(payload, set_type);
 
-       if (egress)
+       if (egress) {
+               mlxsw_reg_ritr_egress_counter_set_type_set(payload, set_type);
                mlxsw_reg_ritr_egress_counter_index_set(payload, index);
-       else
+       } else {
+               mlxsw_reg_ritr_ingress_counter_set_type_set(payload, set_type);
                mlxsw_reg_ritr_ingress_counter_index_set(payload, index);
+       }
 }
 
 static inline void mlxsw_reg_ritr_rif_pack(char *payload, u16 rif)