]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/net/dsa/mv88e6xxx/chip.c
net: dsa: mv88e6xxx: add a global2_addr info flag
[linux.git] / drivers / net / dsa / mv88e6xxx / chip.c
index 53b088166c28388d700e80a81df10d828f1edc90..eb4871a66076b8a65095f49bf49a2de46627d5f6 100644 (file)
@@ -926,6 +926,22 @@ 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_pot_setup(struct mv88e6xxx_chip *chip)
+{
+       if (chip->info->ops->pot_clear)
+               return chip->info->ops->pot_clear(chip);
+
+       return 0;
+}
+
+static int mv88e6xxx_rsvd2cpu_setup(struct mv88e6xxx_chip *chip)
+{
+       if (chip->info->ops->mgmt_rsvd2cpu)
+               return chip->info->ops->mgmt_rsvd2cpu(chip);
+
+       return 0;
+}
+
 static int mv88e6xxx_atu_setup(struct mv88e6xxx_chip *chip)
 {
        int err;
@@ -2116,7 +2132,7 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
                goto unlock;
 
        /* Setup Switch Global 2 Registers */
-       if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_GLOBAL2)) {
+       if (chip->info->global2_addr) {
                err = mv88e6xxx_g2_setup(chip);
                if (err)
                        goto unlock;
@@ -2142,16 +2158,13 @@ static int mv88e6xxx_setup(struct dsa_switch *ds)
        if (err)
                goto unlock;
 
-       /* Some generations have the configuration of sending reserved
-        * management frames to the CPU in global2, others in
-        * global1. Hence it does not fit the two setup functions
-        * above.
-        */
-       if (chip->info->ops->mgmt_rsvd2cpu) {
-               err = chip->info->ops->mgmt_rsvd2cpu(chip);
-               if (err)
-                       goto unlock;
-       }
+       err = mv88e6xxx_pot_setup(chip);
+       if (err)
+               goto unlock;
+
+       err = mv88e6xxx_rsvd2cpu_setup(chip);
+       if (err)
+               goto unlock;
 
 unlock:
        mutex_unlock(&chip->reg_lock);
@@ -2385,7 +2398,8 @@ static const struct mv88e6xxx_ops mv88e6085_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .ppu_enable = mv88e6185_g1_ppu_enable,
        .ppu_disable = mv88e6185_g1_ppu_disable,
        .reset = mv88e6185_g1_reset,
@@ -2408,7 +2422,7 @@ static const struct mv88e6xxx_ops mv88e6095_ops = {
        .stats_get_sset_count = mv88e6095_stats_get_sset_count,
        .stats_get_strings = mv88e6095_stats_get_strings,
        .stats_get_stats = mv88e6095_stats_get_stats,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
        .ppu_enable = mv88e6185_g1_ppu_enable,
        .ppu_disable = mv88e6185_g1_ppu_disable,
        .reset = mv88e6185_g1_reset,
@@ -2441,7 +2455,8 @@ static const struct mv88e6xxx_ops mv88e6097_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2467,7 +2482,8 @@ static const struct mv88e6xxx_ops mv88e6123_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2496,7 +2512,7 @@ static const struct mv88e6xxx_ops mv88e6131_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
        .ppu_enable = mv88e6185_g1_ppu_enable,
        .ppu_disable = mv88e6185_g1_ppu_disable,
        .reset = mv88e6185_g1_reset,
@@ -2533,6 +2549,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu =  mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2563,7 +2580,8 @@ static const struct mv88e6xxx_ops mv88e6161_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2587,7 +2605,8 @@ static const struct mv88e6xxx_ops mv88e6165_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2619,7 +2638,8 @@ static const struct mv88e6xxx_ops mv88e6171_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2653,7 +2673,8 @@ static const struct mv88e6xxx_ops mv88e6172_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2686,7 +2707,8 @@ static const struct mv88e6xxx_ops mv88e6175_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2720,7 +2742,8 @@ static const struct mv88e6xxx_ops mv88e6176_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2746,7 +2769,7 @@ static const struct mv88e6xxx_ops mv88e6185_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6185_g2_mgmt_rsvd2cpu,
        .ppu_enable = mv88e6185_g1_ppu_enable,
        .ppu_disable = mv88e6185_g1_ppu_disable,
        .reset = mv88e6185_g1_reset,
@@ -2782,6 +2805,7 @@ static const struct mv88e6xxx_ops mv88e6190_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -2816,6 +2840,7 @@ static const struct mv88e6xxx_ops mv88e6190x_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -2850,6 +2875,7 @@ static const struct mv88e6xxx_ops mv88e6191_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -2884,7 +2910,8 @@ static const struct mv88e6xxx_ops mv88e6240_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -2920,6 +2947,7 @@ static const struct mv88e6xxx_ops mv88e6290_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -2952,14 +2980,15 @@ static const struct mv88e6xxx_ops mv88e6320_ops = {
        .stats_get_stats = mv88e6320_stats_get_stats,
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6185_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6185_g1_vtu_loadpurge,
 };
 
 static const struct mv88e6xxx_ops mv88e6321_ops = {
-       /* MV88E6XXX_FAMILY_6321 */
+       /* MV88E6XXX_FAMILY_6320 */
        .irl_init_all = mv88e6352_g2_irl_init_all,
        .get_eeprom = mv88e6xxx_g2_get_eeprom16,
        .set_eeprom = mv88e6xxx_g2_set_eeprom16,
@@ -3018,6 +3047,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu =  mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -3049,7 +3079,8 @@ static const struct mv88e6xxx_ops mv88e6350_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -3081,7 +3112,8 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -3115,7 +3147,8 @@ static const struct mv88e6xxx_ops mv88e6352_ops = {
        .set_cpu_port = mv88e6095_g1_set_cpu_port,
        .set_egress_port = mv88e6095_g1_set_egress_port,
        .watchdog_ops = &mv88e6097_watchdog_ops,
-       .mgmt_rsvd2cpu = mv88e6095_g2_mgmt_rsvd2cpu,
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6352_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
@@ -3153,6 +3186,7 @@ static const struct mv88e6xxx_ops mv88e6390_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -3189,6 +3223,7 @@ static const struct mv88e6xxx_ops mv88e6390x_ops = {
        .set_egress_port = mv88e6390_g1_set_egress_port,
        .watchdog_ops = &mv88e6390_watchdog_ops,
        .mgmt_rsvd2cpu = mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
        .reset = mv88e6352_g1_reset,
        .vtu_getnext = mv88e6390_g1_vtu_getnext,
        .vtu_loadpurge = mv88e6390_g1_vtu_loadpurge,
@@ -3205,8 +3240,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3223,6 +3260,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
                .atu_move_port_mask = 0xf,
@@ -3240,8 +3278,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3258,8 +3298,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3276,6 +3318,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
                .atu_move_port_mask = 0xf,
@@ -3293,8 +3336,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .atu_move_port_mask = 0x1f,
+               .g2_irqs = 10,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
                .flags = MV88E6XXX_FLAGS_FAMILY_6341,
@@ -3310,8 +3355,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3328,8 +3375,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3346,8 +3395,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3364,8 +3415,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3382,8 +3435,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3400,8 +3455,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3418,6 +3475,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
                .atu_move_port_mask = 0xf,
@@ -3435,9 +3493,11 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .tag_protocol = DSA_TAG_PROTO_DSA,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .pvt = true,
                .atu_move_port_mask = 0x1f,
                .flags = MV88E6XXX_FLAGS_FAMILY_6390,
@@ -3453,8 +3513,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .atu_move_port_mask = 0x1f,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3471,8 +3533,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .atu_move_port_mask = 0x1f,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3489,8 +3553,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3507,8 +3573,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .atu_move_port_mask = 0x1f,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3525,6 +3593,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
                .atu_move_port_mask = 0xf,
@@ -3543,6 +3612,7 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 8,
                .atu_move_port_mask = 0xf,
@@ -3560,8 +3630,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .atu_move_port_mask = 0x1f,
+               .g2_irqs = 10,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
                .flags = MV88E6XXX_FLAGS_FAMILY_6341,
@@ -3577,8 +3649,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3595,8 +3669,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3613,8 +3689,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 4095,
                .port_base_addr = 0x10,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 15000,
                .g1_irqs = 9,
+               .g2_irqs = 10,
                .atu_move_port_mask = 0xf,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_EDSA,
@@ -3630,8 +3708,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .atu_move_port_mask = 0x1f,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3647,8 +3727,10 @@ static const struct mv88e6xxx_info mv88e6xxx_table[] = {
                .max_vid = 8191,
                .port_base_addr = 0x0,
                .global1_addr = 0x1b,
+               .global2_addr = 0x1c,
                .age_time_coeff = 3750,
                .g1_irqs = 9,
+               .g2_irqs = 14,
                .atu_move_port_mask = 0x1f,
                .pvt = true,
                .tag_protocol = DSA_TAG_PROTO_DSA,
@@ -3970,7 +4052,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
                if (err)
                        goto out;
 
-               if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT)) {
+               if (chip->info->g2_irqs > 0) {
                        err = mv88e6xxx_g2_irq_setup(chip);
                        if (err)
                                goto out_g1_irq;
@@ -3990,7 +4072,7 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev)
 out_mdio:
        mv88e6xxx_mdios_unregister(chip);
 out_g2_irq:
-       if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT) && chip->irq > 0)
+       if (chip->info->g2_irqs > 0 && chip->irq > 0)
                mv88e6xxx_g2_irq_free(chip);
 out_g1_irq:
        if (chip->irq > 0) {
@@ -4012,7 +4094,7 @@ static void mv88e6xxx_remove(struct mdio_device *mdiodev)
        mv88e6xxx_mdios_unregister(chip);
 
        if (chip->irq > 0) {
-               if (mv88e6xxx_has(chip, MV88E6XXX_FLAG_G2_INT))
+               if (chip->info->g2_irqs > 0)
                        mv88e6xxx_g2_irq_free(chip);
                mv88e6xxx_g1_irq_free(chip);
        }