Hi Andrew, On Fri, 4 Oct 2019 03:35:23 +0200, Andrew Lunn <and...@lunn.ch> wrote: > Some of the marvell switches have bits controlling the hash algorithm > the ATU uses for MAC addresses. In some industrial settings, where all > the devices are from the same manufacture, and hence use the same OUI, > the default hashing algorithm is not optimal. Allow the other > algorithms to be selected via devlink. > > Signed-off-by: Andrew Lunn <and...@lunn.ch> > --- > drivers/net/dsa/mv88e6xxx/chip.c | 136 +++++++++++++++++++++++- > drivers/net/dsa/mv88e6xxx/chip.h | 4 + > drivers/net/dsa/mv88e6xxx/global1.h | 3 + > drivers/net/dsa/mv88e6xxx/global1_atu.c | 30 ++++++ > 4 files changed, 172 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/dsa/mv88e6xxx/chip.c > b/drivers/net/dsa/mv88e6xxx/chip.c > index 6787d560e9e3..ebadcdba03df 100644 > --- a/drivers/net/dsa/mv88e6xxx/chip.c > +++ b/drivers/net/dsa/mv88e6xxx/chip.c > @@ -1370,6 +1370,22 @@ static int mv88e6xxx_atu_new(struct mv88e6xxx_chip > *chip, u16 *fid) > return mv88e6xxx_g1_atu_flush(chip, *fid, true); > } > > +static int mv88e6xxx_atu_get_hash(struct mv88e6xxx_chip *chip) > +{ > + if (chip->info->ops->atu_get_hash) > + return chip->info->ops->atu_get_hash(chip); > + > + return -EOPNOTSUPP; > +} > + > +static int mv88e6xxx_atu_set_hash(struct mv88e6xxx_chip *chip, u8 hash) > +{ > + if (chip->info->ops->atu_set_hash) > + return chip->info->ops->atu_set_hash(chip, hash); > + > + return -EOPNOTSUPP; > +} > + > static int mv88e6xxx_port_check_hw_vlan(struct dsa_switch *ds, int port, > u16 vid_begin, u16 vid_end) > { > @@ -2641,6 +2657,83 @@ static int mv88e6390_setup_errata(struct > mv88e6xxx_chip *chip) > return mv88e6xxx_software_reset(chip); > } > > +enum mv88e6xxx_devlink_param_id { > + MV88E6XXX_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX, > + MV88E6XXX_DEVLINK_PARAM_ID_ATU_HASH, > +}; > + > +static int mv88e6xxx_devlink_param_get(struct dsa_switch *ds, u32 id, > + struct devlink_param_gset_ctx *ctx) > +{ > + struct mv88e6xxx_chip *chip = ds->priv; > + int err = 0; > + int hash; > + > + mv88e6xxx_reg_lock(chip); > + > + switch (id) { > + case MV88E6XXX_DEVLINK_PARAM_ID_ATU_HASH: > + hash = mv88e6xxx_atu_get_hash(chip); > + if (hash < 0) { > + err = hash; > + break; > + }
Could you please keep the common construct used in the driver for functions which may fail, that is to say using a pointer to the correct type and only returning error codes, so that we end up with something like this: u8 hash; int err; err = mv88e6xxx_atu_get_hash(chip, &hash); if (err) ... Thanks, Vivien