|
@@ -2337,7 +2337,12 @@ static int mv88e6xxx_port_enable(struct dsa_switch *ds, int port,
|
|
int err;
|
|
int err;
|
|
|
|
|
|
mutex_lock(&chip->reg_lock);
|
|
mutex_lock(&chip->reg_lock);
|
|
|
|
+
|
|
err = mv88e6xxx_serdes_power(chip, port, true);
|
|
err = mv88e6xxx_serdes_power(chip, port, true);
|
|
|
|
+
|
|
|
|
+ if (!err && chip->info->ops->serdes_irq_setup)
|
|
|
|
+ err = chip->info->ops->serdes_irq_setup(chip, port);
|
|
|
|
+
|
|
mutex_unlock(&chip->reg_lock);
|
|
mutex_unlock(&chip->reg_lock);
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -2349,8 +2354,13 @@ static void mv88e6xxx_port_disable(struct dsa_switch *ds, int port,
|
|
struct mv88e6xxx_chip *chip = ds->priv;
|
|
struct mv88e6xxx_chip *chip = ds->priv;
|
|
|
|
|
|
mutex_lock(&chip->reg_lock);
|
|
mutex_lock(&chip->reg_lock);
|
|
|
|
+
|
|
|
|
+ if (chip->info->ops->serdes_irq_free)
|
|
|
|
+ chip->info->ops->serdes_irq_free(chip, port);
|
|
|
|
+
|
|
if (mv88e6xxx_serdes_power(chip, port, false))
|
|
if (mv88e6xxx_serdes_power(chip, port, false))
|
|
dev_err(chip->dev, "failed to power off SERDES\n");
|
|
dev_err(chip->dev, "failed to power off SERDES\n");
|
|
|
|
+
|
|
mutex_unlock(&chip->reg_lock);
|
|
mutex_unlock(&chip->reg_lock);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -3225,6 +3235,8 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.phylink_validate = mv88e6390_phylink_validate,
|
|
.phylink_validate = mv88e6390_phylink_validate,
|
|
};
|
|
};
|
|
@@ -3265,6 +3277,8 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390x_serdes_power,
|
|
.serdes_power = mv88e6390x_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.phylink_validate = mv88e6390x_phylink_validate,
|
|
.phylink_validate = mv88e6390x_phylink_validate,
|
|
};
|
|
};
|
|
@@ -3305,6 +3319,8 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
.phylink_validate = mv88e6390_phylink_validate,
|
|
.phylink_validate = mv88e6390_phylink_validate,
|
|
@@ -3393,6 +3409,8 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
@@ -3694,6 +3712,8 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
.serdes_power = mv88e6390_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
@@ -3739,6 +3759,8 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_getnext = mv88e6390_g1_vtu_getnext,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
|
|
.serdes_power = mv88e6390x_serdes_power,
|
|
.serdes_power = mv88e6390x_serdes_power,
|
|
|
|
+ .serdes_irq_setup = mv88e6390_serdes_irq_setup,
|
|
|
|
+ .serdes_irq_free = mv88e6390_serdes_irq_free,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.gpio_ops = &mv88e6352_gpio_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.avb_ops = &mv88e6390_avb_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|
|
.ptp_ops = &mv88e6352_ptp_ops,
|