]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net: dsa: b53: Fix IMP port setup on BCM5301x
authorRafał Miłecki <rafal@milecki.pl>
Sun, 5 Sep 2021 17:23:28 +0000 (19:23 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 5 Nov 2021 09:19:37 +0000 (10:19 +0100)
BugLink: https://bugs.launchpad.net/bugs/1948873
[ Upstream commit 63f8428b4077de3664eb0b252393c839b0b293ec ]

Broadcom's b53 switches have one IMP (Inband Management Port) that needs
to be programmed using its own designed register. IMP port may be
different than CPU port - especially on devices with multiple CPU ports.

For that reason it's required to explicitly note IMP port index and
check for it when choosing a register to use.

This commit fixes BCM5301x support. Those switches use CPU port 5 while
their IMP port is 8. Before this patch b53 was trying to program port 5
with B53_PORT_OVERRIDE_CTRL instead of B53_GMII_PORT_OVERRIDE_CTRL(5).

It may be possible to also replace "cpu_port" usages with
dsa_is_cpu_port() but that is out of the scope of thix BCM5301x fix.

Fixes: 967dd82ffc52 ("net: dsa: b53: Add support for Broadcom RoboSwitch")
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Kelsey Skunberg <kelsey.skunberg@canonical.com>
drivers/net/dsa/b53/b53_common.c
drivers/net/dsa/b53/b53_priv.h

index 54558f47b633ac21519946710a907eb207b1eac8..d3b37cebcfde8d888712614521f5140df1a0ecad 100644 (file)
@@ -1083,7 +1083,7 @@ static void b53_force_link(struct b53_device *dev, int port, int link)
        u8 reg, val, off;
 
        /* Override the port settings */
-       if (port == dev->cpu_port) {
+       if (port == dev->imp_port) {
                off = B53_PORT_OVERRIDE_CTRL;
                val = PORT_OVERRIDE_EN;
        } else {
@@ -1107,7 +1107,7 @@ static void b53_force_port_config(struct b53_device *dev, int port,
        u8 reg, val, off;
 
        /* Override the port settings */
-       if (port == dev->cpu_port) {
+       if (port == dev->imp_port) {
                off = B53_PORT_OVERRIDE_CTRL;
                val = PORT_OVERRIDE_EN;
        } else {
@@ -1175,7 +1175,7 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
        b53_force_link(dev, port, phydev->link);
 
        if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {
-               if (port == 8)
+               if (port == dev->imp_port)
                        off = B53_RGMII_CTRL_IMP;
                else
                        off = B53_RGMII_CTRL_P(port);
@@ -2238,6 +2238,7 @@ struct b53_chip_data {
        const char *dev_name;
        u16 vlans;
        u16 enabled_ports;
+       u8 imp_port;
        u8 cpu_port;
        u8 vta_regs[3];
        u8 arl_bins;
@@ -2262,6 +2263,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 2,
                .arl_buckets = 1024,
+               .imp_port = 5,
                .cpu_port = B53_CPU_PORT_25,
                .duplex_reg = B53_DUPLEX_STAT_FE,
        },
@@ -2272,6 +2274,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 2,
                .arl_buckets = 1024,
+               .imp_port = 5,
                .cpu_port = B53_CPU_PORT_25,
                .duplex_reg = B53_DUPLEX_STAT_FE,
        },
@@ -2282,6 +2285,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2295,6 +2299,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2308,6 +2313,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS_9798,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2321,6 +2327,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x7f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS_9798,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2335,6 +2342,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .arl_bins = 4,
                .arl_buckets = 1024,
                .vta_regs = B53_VTA_REGS,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .duplex_reg = B53_DUPLEX_STAT_GE,
                .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
@@ -2347,6 +2355,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0xff,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2360,6 +2369,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1ff,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2373,6 +2383,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0, /* pdata must provide them */
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS_63XX,
                .duplex_reg = B53_DUPLEX_STAT_63XX,
@@ -2386,6 +2397,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2399,6 +2411,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1bf,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2412,6 +2425,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1bf,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2425,6 +2439,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2438,6 +2453,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1f,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2451,6 +2467,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1ff,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2464,6 +2481,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x103,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2477,6 +2495,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1ff,
                .arl_bins = 4,
                .arl_buckets = 1024,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2490,6 +2509,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
                .enabled_ports = 0x1ff,
                .arl_bins = 4,
                .arl_buckets = 256,
+               .imp_port = 8,
                .cpu_port = B53_CPU_PORT,
                .vta_regs = B53_VTA_REGS,
                .duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2515,6 +2535,7 @@ static int b53_switch_init(struct b53_device *dev)
                        dev->vta_regs[1] = chip->vta_regs[1];
                        dev->vta_regs[2] = chip->vta_regs[2];
                        dev->jumbo_pm_reg = chip->jumbo_pm_reg;
+                       dev->imp_port = chip->imp_port;
                        dev->cpu_port = chip->cpu_port;
                        dev->num_vlans = chip->vlans;
                        dev->num_arl_bins = chip->arl_bins;
index 7c67409bb186df99359996eb90ab3e2c1f664536..bdb2ade7ad622c6249a96733db1ff3266da40c88 100644 (file)
@@ -122,6 +122,7 @@ struct b53_device {
 
        /* used ports mask */
        u16 enabled_ports;
+       unsigned int imp_port;
        unsigned int cpu_port;
 
        /* connect specific data */