|
@@ -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,
|
|
@@ -174,7 +154,7 @@ static int mv88e6xxx_g2_trunk_mapping_write(struct mv88e6xxx_chip *chip, int id,
|
|
|
return mv88e6xxx_g2_update(chip, MV88E6XXX_G2_TRUNK_MAPPING, val);
|
|
|
}
|
|
|
|
|
|
-static int mv88e6xxx_g2_clear_trunk(struct mv88e6xxx_chip *chip)
|
|
|
+int mv88e6xxx_g2_trunk_clear(struct mv88e6xxx_chip *chip)
|
|
|
{
|
|
|
const u16 port_mask = BIT(mv88e6xxx_num_ports(chip)) - 1;
|
|
|
int i, err;
|
|
@@ -1138,31 +1118,3 @@ void mv88e6xxx_g2_irq_mdio_free(struct mv88e6xxx_chip *chip,
|
|
|
for (phy = 0; phy < chip->info->num_internal_phys; phy++)
|
|
|
irq_dispose_mapping(bus->irq[phy]);
|
|
|
}
|
|
|
-
|
|
|
-int mv88e6xxx_g2_setup(struct mv88e6xxx_chip *chip)
|
|
|
-{
|
|
|
- u16 reg;
|
|
|
- int err;
|
|
|
-
|
|
|
- /* Ignore removed tag data on doubly tagged packets, disable
|
|
|
- * flow control messages, force flow control priority to the
|
|
|
- * highest, and send all special multicast frames to the CPU
|
|
|
- * port at the highest priority.
|
|
|
- */
|
|
|
- reg = MV88E6XXX_G2_SWITCH_MGMT_FORCE_FLOW_CTL_PRI | (0x7 << 4);
|
|
|
- err = mv88e6xxx_g2_write(chip, MV88E6XXX_G2_SWITCH_MGMT, reg);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- /* Program the DSA routing table. */
|
|
|
- err = mv88e6xxx_g2_set_device_mapping(chip);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- /* Clear all trunk masks and mapping. */
|
|
|
- err = mv88e6xxx_g2_clear_trunk(chip);
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|