|
@@ -2356,17 +2356,11 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
|
|
|
mutex_unlock(&chip->reg_lock);
|
|
|
}
|
|
|
|
|
|
-static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
|
+static int mv88e6xxx_disable_ports(struct mv88e6xxx_chip *chip)
|
|
|
{
|
|
|
- bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
|
|
|
- u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
|
|
|
- struct gpio_desc *gpiod = chip->reset;
|
|
|
- unsigned long timeout;
|
|
|
- u16 reg;
|
|
|
- int err;
|
|
|
- int i;
|
|
|
+ int i, err;
|
|
|
|
|
|
- /* Set all ports to the disabled state. */
|
|
|
+ /* Set all ports to the Disabled state */
|
|
|
for (i = 0; i < mv88e6xxx_num_ports(chip); i++) {
|
|
|
err = mv88e6xxx_port_set_state(chip, i,
|
|
|
PORT_CONTROL_STATE_DISABLED);
|
|
@@ -2374,9 +2368,27 @@ static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
- /* Wait for transmit queues to drain. */
|
|
|
+ /* Wait for transmit queues to drain,
|
|
|
+ * i.e. 2ms for a maximum frame to be transmitted at 10 Mbps.
|
|
|
+ */
|
|
|
usleep_range(2000, 4000);
|
|
|
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
|
+{
|
|
|
+ bool ppu_active = mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE);
|
|
|
+ u16 is_reset = (ppu_active ? 0x8800 : 0xc800);
|
|
|
+ struct gpio_desc *gpiod = chip->reset;
|
|
|
+ unsigned long timeout;
|
|
|
+ u16 reg;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = mv88e6xxx_disable_ports(chip);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+
|
|
|
/* If there is a gpio connected to the reset pin, toggle it */
|
|
|
if (gpiod) {
|
|
|
gpiod_set_value_cansleep(gpiod, 1);
|