OSDN Git Service

net: dsa: mv88e6xxx: move device mapping setup
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>
Fri, 27 Apr 2018 01:56:45 +0000 (21:56 -0400)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Apr 2018 00:36:49 +0000 (20:36 -0400)
Move the Device Mapping setup out of the specific Global 2 code,
into the top level device setup function.

Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/mv88e6xxx/chip.c
drivers/net/dsa/mv88e6xxx/global2.c
drivers/net/dsa/mv88e6xxx/global2.h

index 02ff413..d1ca4d6 100644 (file)
@@ -1026,6 +1026,29 @@ static void mv88e6xxx_port_stp_state_set(struct dsa_switch *ds, int port,
                dev_err(ds->dev, "p%d: failed to update state\n", port);
 }
 
+static int mv88e6xxx_devmap_setup(struct mv88e6xxx_chip *chip)
+{
+       int target, port;
+       int err;
+
+       if (!chip->info->global2_addr)
+               return 0;
+
+       /* Initialize the routing port to the 32 possible target devices */
+       for (target = 0; target < 32; target++) {
+               port = 0x1f;
+               if (target < DSA_MAX_SWITCHES)
+                       if (chip->ds->rtable[target] != DSA_RTABLE_NONE)
+                               port = chip->ds->rtable[target];
+
+               err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
+               if (err)
+                       return err;
+       }
+
+       return 0;
+}
+
 static int mv88e6xxx_trunk_setup(struct mv88e6xxx_chip *chip)
 {
        /* Clear all trunk masks and mapping */
@@ -2252,6 +2275,10 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
        if (err)
                goto unlock;
 
+       err = mv88e6xxx_devmap_setup(chip);
+       if (err)
+               goto unlock;
+
        /* Setup PTP Hardware Clock and timestamping */
        if (chip->info->ptp_support) {
                err = mv88e6xxx_ptp_setup(chip);
index 3f24763..96e74d8 100644 (file)
@@ -119,37 +119,17 @@ int mv88e6352_g2_mgmt_rsvd2cpu(struct mv88e6xxx_chip *chip)
 
 /* Offset 0x06: Device Mapping Table register */
 
-static int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
-                                            int target, int port)
+int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
+                                     int port)
 {
-       u16 val = (target << 8) | (port & 0xf);
+       u16 val = (target << 8) | (port & 0x1f);
+       /* Modern chips use 5 bits to define a device mapping port,
+        * but bit 4 is reserved on older chips, so it is safe to use.
+        */
 
        return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_DEVICE_MAPPING, val);
 }
 
-static int mv88e6xxx_g2_set_device_mapping(struct mv88e6xxx_chip *chip)
-{
-       int target, port;
-       int err;
-
-       /* Initialize the routing port to the 32 possible target devices */
-       for (target = 0; target < 32; ++target) {
-               port = 0xf;
-
-               if (target < DSA_MAX_SWITCHES) {
-                       port = chip->ds->rtable[target];
-                       if (port == DSA_RTABLE_NONE)
-                               port = 0xf;
-               }
-
-               err = mv88e6xxx_g2_device_mapping_write(chip, target, port);
-               if (err)
-                       break;
-       }
-
-       return err;
-}
-
 /* Offset 0x07: Trunk Mask Table register */
 
 static int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num,
@@ -1154,10 +1134,5 @@ int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
        if (err)
                return err;
 
-       /* Program the DSA routing table. */
-       err = mv88e6xxx_g2_set_device_mapping(chip);
-       if (err)
-               return err;
-
        return 0;
 }
index 7bd4ab3..46913a2 100644 (file)
@@ -60,7 +60,8 @@
 #define MV88E6XXX_G2_DEVICE_MAPPING            0x06
 #define MV88E6XXX_G2_DEVICE_MAPPING_UPDATE     0x8000
 #define MV88E6XXX_G2_DEVICE_MAPPING_DEV_MASK   0x1f00
-#define MV88E6XXX_G2_DEVICE_MAPPING_PORT_MASK  0x000f
+#define MV88E6352_G2_DEVICE_MAPPING_PORT_MASK  0x000f
+#define MV88E6390_G2_DEVICE_MAPPING_PORT_MASK  0x001f
 
 /* Offset 0x07: Trunk Mask Table Register */
 #define MV88E6XXX_G2_TRUNK_MASK                        0x07
@@ -329,6 +330,9 @@ int mv88e6xxx_g2_pot_clear(struct mv88e6xxx_chip *chip);
 
 int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip);
 
+int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip, int target,
+                                     int port);
+
 extern const struct mv88e6xxx_irq_ops mv88e6097_watchdog_ops;
 extern const struct mv88e6xxx_irq_ops mv88e6390_watchdog_ops;
 
@@ -502,6 +506,12 @@ static inline int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip)
        return -EOPNOTSUPP;
 }
 
+static inline int mv88e6xxx_g2_device_mapping_write(struct mv88e6xxx_chip *chip,
+                                                   int target, int port)
+{
+       return -EOPNOTSUPP;
+}
+
 #endif /* CONFIG_NET_DSA_MV88E6XXX_GLOBAL2 */
 
 #endif /* _MV88E6XXX_GLOBAL2_H */