net: dsa: mv88e6xxx: introduce invalid_port_mask in mv88e6xxx_info
authorHubert Feurstein <h.feurstein@gmail.com>
Wed, 31 Jul 2019 08:23:48 +0000 (10:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 3 Aug 2019 00:58:53 +0000 (17:58 -0700)
With this it is possible to mark certain chip ports as invalid. This is
required for example for the MV88E6220 (which is in general a MV88E6250
with 7 ports) but the ports 2-4 are not routed to pins.

If a user configures an invalid port, an error is returned.

Signed-off-by: Hubert Feurstein <h.feurstein@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/mv88e6xxx/chip.h

index 390b61651e10394e8be8e8fef6c8d8cf5e83868a..7fd13468b8dad7c11c583fa5f579ebbd290a881b 100644 (file)
@@ -2485,6 +2485,14 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
 
        /* Setup Switch Port Registers */
        for (i = 0; i < mv88e6xxx_num_ports(chip); i++) {
+               /* Prevent the use of an invalid port. */
+               if (mv88e6xxx_is_invalid_port(chip, i) &&
+                   !dsa_is_unused_port(ds, i)) {
+                       dev_err(chip->dev, "port %d is invalid\n", i);
+                       err = -EINVAL;
+                       goto unlock;
+               }
+
                if (dsa_is_unused_port(ds, i)) {
                        err = mv88e6xxx_port_set_state(chip, i,
                                                       BR_STATE_DISABLED);
@@ -4286,6 +4294,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                 */
                .num_ports = 7,
                .num_internal_phys = 2,
+               .invalid_port_mask = BIT(2) | BIT(3) | BIT(4),
                .max_vid = 4095,
                .port_base_addr = 0x08,
                .phy_base_addr = 0x00,
index 2cc508a1cc32a987c46d6a096e032a4343825bc0..359d258d7151ef6bf64073e50d06fbd6b59656ef 100644 (file)
@@ -106,6 +106,11 @@ struct mv88e6xxx_info {
        unsigned int g2_irqs;
        bool pvt;
 
+       /* Mark certain ports as invalid. This is required for example for the
+        * MV88E6220 (which is in general a MV88E6250 with 7 ports) but the
+        * ports 2-4 are not routet to pins.
+        */
+       unsigned int invalid_port_mask;
        /* Multi-chip Addressing Mode.
         * Some chips respond to only 2 registers of its own SMI device address
         * when it is non-zero, and use indirect access to internal registers.
@@ -571,6 +576,11 @@ static inline unsigned int mv88e6xxx_num_gpio(struct mv88e6xxx_chip *chip)
        return chip->info->num_gpio;
 }
 
+static inline bool mv88e6xxx_is_invalid_port(struct mv88e6xxx_chip *chip, int port)
+{
+       return (chip->info->invalid_port_mask & BIT(port)) != 0;
+}
+
 int mv88e6xxx_read(struct mv88e6xxx_chip *chip, int addr, int reg, u16 *val);
 int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val);
 int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg,