提交 26d2f875 编写于 作者: R Rafał Miłecki 提交者: Zheng Zengkai

net: dsa: b53: Fix IMP port setup on BCM5301x

stable inclusion
from stable-5.10.68
commit eb635e008cb1d9845e19ac5910c82ff77e660306
bugzilla: 182671 https://gitee.com/openeuler/kernel/issues/I4EWUH

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=eb635e008cb1d9845e19ac5910c82ff77e660306

--------------------------------

[ Upstream commit 63f8428b ]

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: 967dd82f ("net: dsa: b53: Add support for Broadcom RoboSwitch")
Signed-off-by: NRafał Miłecki <rafal@milecki.pl>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
Signed-off-by: NSasha Levin <sashal@kernel.org>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Acked-by: NWeilong Chen <chenweilong@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 6f4126b2
...@@ -1083,7 +1083,7 @@ static void b53_force_link(struct b53_device *dev, int port, int link) ...@@ -1083,7 +1083,7 @@ static void b53_force_link(struct b53_device *dev, int port, int link)
u8 reg, val, off; u8 reg, val, off;
/* Override the port settings */ /* Override the port settings */
if (port == dev->cpu_port) { if (port == dev->imp_port) {
off = B53_PORT_OVERRIDE_CTRL; off = B53_PORT_OVERRIDE_CTRL;
val = PORT_OVERRIDE_EN; val = PORT_OVERRIDE_EN;
} else { } else {
...@@ -1107,7 +1107,7 @@ static void b53_force_port_config(struct b53_device *dev, int port, ...@@ -1107,7 +1107,7 @@ static void b53_force_port_config(struct b53_device *dev, int port,
u8 reg, val, off; u8 reg, val, off;
/* Override the port settings */ /* Override the port settings */
if (port == dev->cpu_port) { if (port == dev->imp_port) {
off = B53_PORT_OVERRIDE_CTRL; off = B53_PORT_OVERRIDE_CTRL;
val = PORT_OVERRIDE_EN; val = PORT_OVERRIDE_EN;
} else { } else {
...@@ -1175,7 +1175,7 @@ static void b53_adjust_link(struct dsa_switch *ds, int port, ...@@ -1175,7 +1175,7 @@ static void b53_adjust_link(struct dsa_switch *ds, int port,
b53_force_link(dev, port, phydev->link); b53_force_link(dev, port, phydev->link);
if (is531x5(dev) && phy_interface_is_rgmii(phydev)) { if (is531x5(dev) && phy_interface_is_rgmii(phydev)) {
if (port == 8) if (port == dev->imp_port)
off = B53_RGMII_CTRL_IMP; off = B53_RGMII_CTRL_IMP;
else else
off = B53_RGMII_CTRL_P(port); off = B53_RGMII_CTRL_P(port);
...@@ -2238,6 +2238,7 @@ struct b53_chip_data { ...@@ -2238,6 +2238,7 @@ struct b53_chip_data {
const char *dev_name; const char *dev_name;
u16 vlans; u16 vlans;
u16 enabled_ports; u16 enabled_ports;
u8 imp_port;
u8 cpu_port; u8 cpu_port;
u8 vta_regs[3]; u8 vta_regs[3];
u8 arl_bins; u8 arl_bins;
...@@ -2262,6 +2263,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2262,6 +2263,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 2, .arl_bins = 2,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 5,
.cpu_port = B53_CPU_PORT_25, .cpu_port = B53_CPU_PORT_25,
.duplex_reg = B53_DUPLEX_STAT_FE, .duplex_reg = B53_DUPLEX_STAT_FE,
}, },
...@@ -2272,6 +2274,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2272,6 +2274,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 2, .arl_bins = 2,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 5,
.cpu_port = B53_CPU_PORT_25, .cpu_port = B53_CPU_PORT_25,
.duplex_reg = B53_DUPLEX_STAT_FE, .duplex_reg = B53_DUPLEX_STAT_FE,
}, },
...@@ -2282,6 +2285,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2282,6 +2285,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2295,6 +2299,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2295,6 +2299,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2308,6 +2313,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2308,6 +2313,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_9798, .vta_regs = B53_VTA_REGS_9798,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2321,6 +2327,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2321,6 +2327,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x7f, .enabled_ports = 0x7f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_9798, .vta_regs = B53_VTA_REGS_9798,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2335,6 +2342,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2335,6 +2342,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
.jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_pm_reg = B53_JUMBO_PORT_MASK,
...@@ -2347,6 +2355,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2347,6 +2355,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0xff, .enabled_ports = 0xff,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2360,6 +2369,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2360,6 +2369,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2373,6 +2383,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2373,6 +2383,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0, /* pdata must provide them */ .enabled_ports = 0, /* pdata must provide them */
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_63XX, .vta_regs = B53_VTA_REGS_63XX,
.duplex_reg = B53_DUPLEX_STAT_63XX, .duplex_reg = B53_DUPLEX_STAT_63XX,
...@@ -2386,6 +2397,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2386,6 +2397,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2399,6 +2411,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2399,6 +2411,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1bf, .enabled_ports = 0x1bf,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2412,6 +2425,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2412,6 +2425,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1bf, .enabled_ports = 0x1bf,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2425,6 +2439,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2425,6 +2439,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2438,6 +2453,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2438,6 +2453,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2451,6 +2467,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2451,6 +2467,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2464,6 +2481,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2464,6 +2481,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x103, .enabled_ports = 0x103,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2477,6 +2495,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2477,6 +2495,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 1024, .arl_buckets = 1024,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2490,6 +2509,7 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2490,6 +2509,7 @@ static const struct b53_chip_data b53_switch_chips[] = {
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_bins = 4, .arl_bins = 4,
.arl_buckets = 256, .arl_buckets = 256,
.imp_port = 8,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2515,6 +2535,7 @@ static int b53_switch_init(struct b53_device *dev) ...@@ -2515,6 +2535,7 @@ static int b53_switch_init(struct b53_device *dev)
dev->vta_regs[1] = chip->vta_regs[1]; dev->vta_regs[1] = chip->vta_regs[1];
dev->vta_regs[2] = chip->vta_regs[2]; dev->vta_regs[2] = chip->vta_regs[2];
dev->jumbo_pm_reg = chip->jumbo_pm_reg; dev->jumbo_pm_reg = chip->jumbo_pm_reg;
dev->imp_port = chip->imp_port;
dev->cpu_port = chip->cpu_port; dev->cpu_port = chip->cpu_port;
dev->num_vlans = chip->vlans; dev->num_vlans = chip->vlans;
dev->num_arl_bins = chip->arl_bins; dev->num_arl_bins = chip->arl_bins;
......
...@@ -122,6 +122,7 @@ struct b53_device { ...@@ -122,6 +122,7 @@ struct b53_device {
/* used ports mask */ /* used ports mask */
u16 enabled_ports; u16 enabled_ports;
unsigned int imp_port;
unsigned int cpu_port; unsigned int cpu_port;
/* connect specific data */ /* connect specific data */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册