|
@@ -527,56 +527,18 @@ int mv88e6xxx_update(struct mv88e6xxx_chip *chip, int addr, int reg, u16 update)
|
|
|
|
|
|
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
|
|
static int mv88e6xxx_ppu_disable(struct mv88e6xxx_chip *chip)
|
|
{
|
|
{
|
|
- u16 val;
|
|
|
|
- int i, err;
|
|
|
|
-
|
|
|
|
- err = mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, &val);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL,
|
|
|
|
- val & ~GLOBAL_CONTROL_PPU_ENABLE);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < 16; i++) {
|
|
|
|
- err = mv88e6xxx_g1_read(chip, GLOBAL_STATUS, &val);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- usleep_range(1000, 2000);
|
|
|
|
- if ((val & GLOBAL_STATUS_PPU_MASK) != GLOBAL_STATUS_PPU_POLLING)
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!chip->info->ops->ppu_disable)
|
|
|
|
+ return 0;
|
|
|
|
|
|
- return -ETIMEDOUT;
|
|
|
|
|
|
+ return chip->info->ops->ppu_disable(chip);
|
|
}
|
|
}
|
|
|
|
|
|
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
|
|
static int mv88e6xxx_ppu_enable(struct mv88e6xxx_chip *chip)
|
|
{
|
|
{
|
|
- u16 val;
|
|
|
|
- int i, err;
|
|
|
|
-
|
|
|
|
- err = mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, &val);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL,
|
|
|
|
- val | GLOBAL_CONTROL_PPU_ENABLE);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- for (i = 0; i < 16; i++) {
|
|
|
|
- err = mv88e6xxx_g1_read(chip, GLOBAL_STATUS, &val);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- usleep_range(1000, 2000);
|
|
|
|
- if ((val & GLOBAL_STATUS_PPU_MASK) == GLOBAL_STATUS_PPU_POLLING)
|
|
|
|
- return 0;
|
|
|
|
- }
|
|
|
|
|
|
+ if (!chip->info->ops->ppu_enable)
|
|
|
|
+ return 0;
|
|
|
|
|
|
- return -ETIMEDOUT;
|
|
|
|
|
|
+ return chip->info->ops->ppu_enable(chip);
|
|
}
|
|
}
|
|
|
|
|
|
static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
|
|
static void mv88e6xxx_ppu_reenable_work(struct work_struct *ugly)
|
|
@@ -2356,17 +2318,32 @@ static void mv88e6xxx_port_bridge_leave(struct dsa_switch *ds, int port)
|
|
mutex_unlock(&chip->reg_lock);
|
|
mutex_unlock(&chip->reg_lock);
|
|
}
|
|
}
|
|
|
|
|
|
-static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
|
|
|
|
+static int mv88e6xxx_software_reset(struct mv88e6xxx_chip *chip)
|
|
|
|
+{
|
|
|
|
+ if (chip->info->ops->reset)
|
|
|
|
+ return chip->info->ops->reset(chip);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void mv88e6xxx_hardware_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;
|
|
struct gpio_desc *gpiod = chip->reset;
|
|
- unsigned long timeout;
|
|
|
|
- u16 reg;
|
|
|
|
- int err;
|
|
|
|
- int i;
|
|
|
|
|
|
|
|
- /* Set all ports to the disabled state. */
|
|
|
|
|
|
+ /* If there is a GPIO connected to the reset pin, toggle it */
|
|
|
|
+ if (gpiod) {
|
|
|
|
+ gpiod_set_value_cansleep(gpiod, 1);
|
|
|
|
+ usleep_range(10000, 20000);
|
|
|
|
+ gpiod_set_value_cansleep(gpiod, 0);
|
|
|
|
+ usleep_range(10000, 20000);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int mv88e6xxx_disable_ports(struct mv88e6xxx_chip *chip)
|
|
|
|
+{
|
|
|
|
+ int i, err;
|
|
|
|
+
|
|
|
|
+ /* Set all ports to the Disabled state */
|
|
for (i = 0; i < mv88e6xxx_num_ports(chip); i++) {
|
|
for (i = 0; i < mv88e6xxx_num_ports(chip); i++) {
|
|
err = mv88e6xxx_port_set_state(chip, i,
|
|
err = mv88e6xxx_port_set_state(chip, i,
|
|
PORT_CONTROL_STATE_DISABLED);
|
|
PORT_CONTROL_STATE_DISABLED);
|
|
@@ -2374,45 +2351,25 @@ static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
return err;
|
|
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);
|
|
usleep_range(2000, 4000);
|
|
|
|
|
|
- /* If there is a gpio connected to the reset pin, toggle it */
|
|
|
|
- if (gpiod) {
|
|
|
|
- gpiod_set_value_cansleep(gpiod, 1);
|
|
|
|
- usleep_range(10000, 20000);
|
|
|
|
- gpiod_set_value_cansleep(gpiod, 0);
|
|
|
|
- usleep_range(10000, 20000);
|
|
|
|
- }
|
|
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
|
|
- /* Reset the switch. Keep the PPU active if requested. The PPU
|
|
|
|
- * needs to be active to support indirect phy register access
|
|
|
|
- * through global registers 0x18 and 0x19.
|
|
|
|
- */
|
|
|
|
- if (ppu_active)
|
|
|
|
- err = mv88e6xxx_g1_write(chip, 0x04, 0xc000);
|
|
|
|
- else
|
|
|
|
- err = mv88e6xxx_g1_write(chip, 0x04, 0xc400);
|
|
|
|
|
|
+static int mv88e6xxx_switch_reset(struct mv88e6xxx_chip *chip)
|
|
|
|
+{
|
|
|
|
+ int err;
|
|
|
|
+
|
|
|
|
+ err = mv88e6xxx_disable_ports(chip);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
- /* Wait up to one second for reset to complete. */
|
|
|
|
- timeout = jiffies + 1 * HZ;
|
|
|
|
- while (time_before(jiffies, timeout)) {
|
|
|
|
- err = mv88e6xxx_g1_read(chip, 0x00, ®);
|
|
|
|
- if (err)
|
|
|
|
- return err;
|
|
|
|
|
|
+ mv88e6xxx_hardware_reset(chip);
|
|
|
|
|
|
- if ((reg & is_reset) == is_reset)
|
|
|
|
- break;
|
|
|
|
- usleep_range(1000, 2000);
|
|
|
|
- }
|
|
|
|
- if (time_after(jiffies, timeout))
|
|
|
|
- err = -ETIMEDOUT;
|
|
|
|
- else
|
|
|
|
- err = 0;
|
|
|
|
-
|
|
|
|
- return err;
|
|
|
|
|
|
+ return mv88e6xxx_software_reset(chip);
|
|
}
|
|
}
|
|
|
|
|
|
static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
|
|
static int mv88e6xxx_serdes_power_on(struct mv88e6xxx_chip *chip)
|
|
@@ -2749,22 +2706,12 @@ static int mv88e6xxx_g1_setup(struct mv88e6xxx_chip *chip)
|
|
{
|
|
{
|
|
struct dsa_switch *ds = chip->ds;
|
|
struct dsa_switch *ds = chip->ds;
|
|
u32 upstream_port = dsa_upstream_port(ds);
|
|
u32 upstream_port = dsa_upstream_port(ds);
|
|
- u16 reg;
|
|
|
|
int err;
|
|
int err;
|
|
|
|
|
|
/* Enable the PHY Polling Unit if present, don't discard any packets,
|
|
/* Enable the PHY Polling Unit if present, don't discard any packets,
|
|
* and mask all interrupt sources.
|
|
* and mask all interrupt sources.
|
|
*/
|
|
*/
|
|
- err = mv88e6xxx_g1_read(chip, GLOBAL_CONTROL, ®);
|
|
|
|
- if (err < 0)
|
|
|
|
- return err;
|
|
|
|
-
|
|
|
|
- reg &= ~GLOBAL_CONTROL_PPU_ENABLE;
|
|
|
|
- if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU) ||
|
|
|
|
- mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU_ACTIVE))
|
|
|
|
- reg |= GLOBAL_CONTROL_PPU_ENABLE;
|
|
|
|
-
|
|
|
|
- err = mv88e6xxx_g1_write(chip, GLOBAL_CONTROL, reg);
|
|
|
|
|
|
+ err = mv88e6xxx_ppu_enable(chip);
|
|
if (err)
|
|
if (err)
|
|
return err;
|
|
return err;
|
|
|
|
|
|
@@ -3226,6 +3173,9 @@ static const struct mv88e6xxx_ops mv88e6085_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .ppu_enable = mv88e6185_g1_ppu_enable,
|
|
|
|
+ .ppu_disable = mv88e6185_g1_ppu_disable,
|
|
|
|
+ .reset = mv88e6185_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6095_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6095_ops = {
|
|
@@ -3243,6 +3193,9 @@ static const struct mv88e6xxx_ops mv88e6095_ops = {
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
.stats_get_strings = mv88e6095_stats_get_strings,
|
|
.stats_get_stats = mv88e6095_stats_get_stats,
|
|
.stats_get_stats = mv88e6095_stats_get_stats,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .ppu_enable = mv88e6185_g1_ppu_enable,
|
|
|
|
+ .ppu_disable = mv88e6185_g1_ppu_disable,
|
|
|
|
+ .reset = mv88e6185_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6097_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6097_ops = {
|
|
@@ -3267,6 +3220,7 @@ static const struct mv88e6xxx_ops mv88e6097_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6123_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6123_ops = {
|
|
@@ -3286,6 +3240,7 @@ static const struct mv88e6xxx_ops mv88e6123_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6131_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6131_ops = {
|
|
@@ -3310,6 +3265,9 @@ static const struct mv88e6xxx_ops mv88e6131_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .ppu_enable = mv88e6185_g1_ppu_enable,
|
|
|
|
+ .ppu_disable = mv88e6185_g1_ppu_disable,
|
|
|
|
+ .reset = mv88e6185_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6161_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6161_ops = {
|
|
@@ -3334,6 +3292,7 @@ static const struct mv88e6xxx_ops mv88e6161_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6165_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6165_ops = {
|
|
@@ -3351,6 +3310,7 @@ static const struct mv88e6xxx_ops mv88e6165_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6171_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6171_ops = {
|
|
@@ -3376,6 +3336,7 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6172_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6172_ops = {
|
|
@@ -3403,6 +3364,7 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6175_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6175_ops = {
|
|
@@ -3428,6 +3390,7 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6176_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6176_ops = {
|
|
@@ -3455,6 +3418,7 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6185_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6185_ops = {
|
|
@@ -3475,6 +3439,9 @@ static const struct mv88e6xxx_ops mv88e6185_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .ppu_enable = mv88e6185_g1_ppu_enable,
|
|
|
|
+ .ppu_disable = mv88e6185_g1_ppu_disable,
|
|
|
|
+ .reset = mv88e6185_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6190_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6190_ops = {
|
|
@@ -3499,6 +3466,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
|
@@ -3523,6 +3491,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6191_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6191_ops = {
|
|
@@ -3547,6 +3516,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6240_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6240_ops = {
|
|
@@ -3574,6 +3544,7 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|
@@ -3598,6 +3569,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|
@@ -3624,6 +3596,7 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|
@@ -3649,6 +3622,7 @@ static const struct mv88e6xxx_ops mv88e6321_ops = {
|
|
.stats_get_stats = mv88e6320_stats_get_stats,
|
|
.stats_get_stats = mv88e6320_stats_get_stats,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6350_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6350_ops = {
|
|
@@ -3674,6 +3648,7 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6351_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6351_ops = {
|
|
@@ -3699,6 +3674,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6352_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6352_ops = {
|
|
@@ -3726,6 +3702,7 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6095_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6095_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6390_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6390_ops = {
|
|
@@ -3752,6 +3729,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
|
@@ -3778,6 +3756,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct mv88e6xxx_ops mv88e6391_ops = {
|
|
static const struct mv88e6xxx_ops mv88e6391_ops = {
|
|
@@ -3802,6 +3781,7 @@ static const struct mv88e6xxx_ops mv88e6391_ops = {
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_cpu_port = mv88e6390_g1_set_cpu_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.g1_set_egress_port = mv88e6390_g1_set_egress_port,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
.mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
|
|
|
|
+ .reset = mv88e6352_g1_reset,
|
|
};
|
|
};
|
|
|
|
|
|
static int mv88e6xxx_verify_madatory_ops(struct mv88e6xxx_chip *chip,
|
|
static int mv88e6xxx_verify_madatory_ops(struct mv88e6xxx_chip *chip,
|
|
@@ -4241,13 +4221,13 @@ static struct mv88e6xxx_chip *mv88e6xxx_alloc_chip(struct device *dev)
|
|
|
|
|
|
static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip)
|
|
static void mv88e6xxx_phy_init(struct mv88e6xxx_chip *chip)
|
|
{
|
|
{
|
|
- if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
|
|
|
|
|
|
+ if (chip->info->ops->ppu_enable && chip->info->ops->ppu_disable)
|
|
mv88e6xxx_ppu_state_init(chip);
|
|
mv88e6xxx_ppu_state_init(chip);
|
|
}
|
|
}
|
|
|
|
|
|
static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
|
|
static void mv88e6xxx_phy_destroy(struct mv88e6xxx_chip *chip)
|
|
{
|
|
{
|
|
- if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_PPU))
|
|
|
|
|
|
+ if (chip->info->ops->ppu_enable && chip->info->ops->ppu_disable)
|
|
mv88e6xxx_ppu_state_destroy(chip);
|
|
mv88e6xxx_ppu_state_destroy(chip);
|
|
}
|
|
}
|
|
|
|
|