From 067d7e9f90abcbabc5be5a38c4dedbcdab6c96ce Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 7 Dec 2022 09:26:11 +0100 Subject: [PATCH] kernel: backport b53/bcm_sf2 changes from v5.5 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Rafał Miłecki --- ...b53-Use-dev_-err-info-instead-of-pr_.patch | 4 +- ...-support-BCM4908-s-integrated-switch.patch | 8 +- ...store-PHY-interface-mode-in-port-str.patch | 6 +- ..._sf2-setup-BCM4908-internal-crossbar.patch | 18 +-- ...-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch | 2 +- ...-add-function-finding-RGMII-register.patch | 10 +- ...-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch | 2 +- ...dsa-bcm_sf2-refactor-LED-regs-access.patch | 4 +- ...m_sf2-enable-GPHY-for-switch-probing.patch | 2 +- ...sf2-keep-GPHY-enabled-on-the-BCM4908.patch | 2 +- ...53-Fix-valid-setting-for-MDB-entries.patch | 31 +++++ ...0001-net-dsa-b53-Add-support-for-MDB.patch | 130 ++++++++++++++++++ ...t-dsa-bcm_sf2-Wire-up-MDB-operations.patch | 27 ++++ ...Add-support-for-optional-reset-contr.patch | 81 +++++++++++ ...53-Fix-valid-setting-for-MDB-entries.patch | 30 ++++ ...e-resolved-link-config-via-mac_link_.patch | 2 +- 16 files changed, 329 insertions(+), 30 deletions(-) create mode 100644 target/linux/generic/backport-5.4/702-Revert-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch create mode 100644 target/linux/generic/backport-5.4/703-v5.5-0001-net-dsa-b53-Add-support-for-MDB.patch create mode 100644 target/linux/generic/backport-5.4/703-v5.5-0002-net-dsa-bcm_sf2-Wire-up-MDB-operations.patch create mode 100644 target/linux/generic/backport-5.4/703-v5.5-0003-net-dsa-bcm_sf2-Add-support-for-optional-reset-contr.patch create mode 100644 target/linux/generic/backport-5.4/707-v5.7-0016-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch diff --git a/target/linux/bcm4908/patches-5.4/070-v5.10-0001-net-dsa-b53-Use-dev_-err-info-instead-of-pr_.patch b/target/linux/bcm4908/patches-5.4/070-v5.10-0001-net-dsa-b53-Use-dev_-err-info-instead-of-pr_.patch index be09ab9e7d..0b2ebbe1f8 100644 --- a/target/linux/bcm4908/patches-5.4/070-v5.10-0001-net-dsa-b53-Use-dev_-err-info-instead-of-pr_.patch +++ b/target/linux/bcm4908/patches-5.4/070-v5.10-0001-net-dsa-b53-Use-dev_-err-info-instead-of-pr_.patch @@ -26,7 +26,7 @@ Signed-off-by: David S. Miller #include #include #include -@@ -2475,8 +2473,9 @@ int b53_switch_detect(struct b53_device +@@ -2533,8 +2531,9 @@ int b53_switch_detect(struct b53_device dev->chip_id = id32; break; default: @@ -38,7 +38,7 @@ Signed-off-by: David S. Miller return -ENODEV; } } -@@ -2506,7 +2505,8 @@ int b53_switch_register(struct b53_devic +@@ -2564,7 +2563,8 @@ int b53_switch_register(struct b53_devic if (ret) return ret; diff --git a/target/linux/bcm4908/patches-5.4/071-v5.12-0001-net-dsa-bcm_sf2-support-BCM4908-s-integrated-switch.patch b/target/linux/bcm4908/patches-5.4/071-v5.12-0001-net-dsa-bcm_sf2-support-BCM4908-s-integrated-switch.patch index 766db3e641..bd8bb1e51e 100644 --- a/target/linux/bcm4908/patches-5.4/071-v5.12-0001-net-dsa-bcm_sf2-support-BCM4908-s-integrated-switch.patch +++ b/target/linux/bcm4908/patches-5.4/071-v5.12-0001-net-dsa-bcm_sf2-support-BCM4908-s-integrated-switch.patch @@ -23,7 +23,7 @@ Signed-off-by: Jakub Kicinski --- a/drivers/net/dsa/b53/b53_common.c +++ b/drivers/net/dsa/b53/b53_common.c -@@ -2271,6 +2271,22 @@ static const struct b53_chip_data b53_sw +@@ -2329,6 +2329,22 @@ static const struct b53_chip_data b53_sw .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, }, @@ -68,7 +68,7 @@ Signed-off-by: Jakub Kicinski offset = CORE_STS_OVERRIDE_IMP; else offset = CORE_STS_OVERRIDE_IMP2; -@@ -543,7 +544,8 @@ static void bcm_sf2_sw_mac_config(struct +@@ -555,7 +556,8 @@ static void bcm_sf2_sw_mac_config(struct if (port == core_readl(priv, CORE_IMP0_PRT_ID)) return; @@ -78,7 +78,7 @@ Signed-off-by: Jakub Kicinski offset = CORE_STS_OVERRIDE_GMIIP_PORT(port); else offset = CORE_STS_OVERRIDE_GMIIP2_PORT(port); -@@ -990,6 +992,30 @@ struct bcm_sf2_of_data { +@@ -1005,6 +1007,30 @@ struct bcm_sf2_of_data { unsigned int num_cfp_rules; }; @@ -109,7 +109,7 @@ Signed-off-by: Jakub Kicinski /* Register offsets for the SWITCH_REG_* block */ static const u16 bcm_sf2_7445_reg_offsets[] = { [REG_SWITCH_CNTRL] = 0x00, -@@ -1038,6 +1064,9 @@ static const struct bcm_sf2_of_data bcm_ +@@ -1053,6 +1079,9 @@ static const struct bcm_sf2_of_data bcm_ }; static const struct of_device_id bcm_sf2_of_match[] = { diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0001-net-dsa-bcm_sf2-store-PHY-interface-mode-in-port-str.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0001-net-dsa-bcm_sf2-store-PHY-interface-mode-in-port-str.patch index 69bf2d0d2f..9590327649 100644 --- a/target/linux/bcm4908/patches-5.4/075-v5.13-0001-net-dsa-bcm_sf2-store-PHY-interface-mode-in-port-str.patch +++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0001-net-dsa-bcm_sf2-store-PHY-interface-mode-in-port-str.patch @@ -18,7 +18,7 @@ Signed-off-by: David S. Miller --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -380,8 +380,9 @@ static void bcm_sf2_intr_disable(struct +@@ -392,8 +392,9 @@ static void bcm_sf2_intr_disable(struct static void bcm_sf2_identify_ports(struct bcm_sf2_priv *priv, struct device_node *dn) { @@ -29,7 +29,7 @@ Signed-off-by: David S. Miller unsigned int port_num; priv->moca_port = -1; -@@ -390,19 +391,26 @@ static void bcm_sf2_identify_ports(struc +@@ -402,19 +403,26 @@ static void bcm_sf2_identify_ports(struc if (of_property_read_u32(port, "reg", &port_num)) continue; @@ -62,7 +62,7 @@ Signed-off-by: David S. Miller if (of_property_read_bool(port, "brcm,use-bcm-hdr")) --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h -@@ -43,6 +43,7 @@ struct bcm_sf2_hw_params { +@@ -44,6 +44,7 @@ struct bcm_sf2_hw_params { #define BCM_SF2_REGS_NUM 6 struct bcm_sf2_port_status { diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0002-net-dsa-bcm_sf2-setup-BCM4908-internal-crossbar.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0002-net-dsa-bcm_sf2-setup-BCM4908-internal-crossbar.patch index 09fb5dbd15..21717ffc3c 100644 --- a/target/linux/bcm4908/patches-5.4/075-v5.13-0002-net-dsa-bcm_sf2-setup-BCM4908-internal-crossbar.patch +++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0002-net-dsa-bcm_sf2-setup-BCM4908-internal-crossbar.patch @@ -37,7 +37,7 @@ Signed-off-by: David S. Miller --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -369,6 +369,44 @@ static int bcm_sf2_sw_rst(struct bcm_sf2 +@@ -381,6 +381,44 @@ static int bcm_sf2_sw_rst(struct bcm_sf2 return 0; } @@ -82,7 +82,7 @@ Signed-off-by: David S. Miller static void bcm_sf2_intr_disable(struct bcm_sf2_priv *priv) { intrl2_0_mask_set(priv, 0xffffffff); -@@ -739,6 +777,8 @@ static int bcm_sf2_sw_resume(struct dsa_ +@@ -751,6 +789,8 @@ static int bcm_sf2_sw_resume(struct dsa_ return ret; } @@ -91,7 +91,7 @@ Signed-off-by: David S. Miller ret = bcm_sf2_cfp_resume(ds); if (ret) return ret; -@@ -1001,6 +1041,7 @@ struct bcm_sf2_of_data { +@@ -1016,6 +1056,7 @@ struct bcm_sf2_of_data { const u16 *reg_offsets; unsigned int core_reg_align; unsigned int num_cfp_rules; @@ -99,7 +99,7 @@ Signed-off-by: David S. Miller }; static const u16 bcm_sf2_4908_reg_offsets[] = { -@@ -1025,6 +1066,7 @@ static const struct bcm_sf2_of_data bcm_ +@@ -1040,6 +1081,7 @@ static const struct bcm_sf2_of_data bcm_ .core_reg_align = 0, .reg_offsets = bcm_sf2_4908_reg_offsets, .num_cfp_rules = 0, /* FIXME */ @@ -107,15 +107,15 @@ Signed-off-by: David S. Miller }; /* Register offsets for the SWITCH_REG_* block */ -@@ -1135,6 +1177,7 @@ static int bcm_sf2_sw_probe(struct platf +@@ -1150,6 +1192,7 @@ static int bcm_sf2_sw_probe(struct platf priv->reg_offsets = data->reg_offsets; priv->core_reg_align = data->core_reg_align; priv->num_cfp_rules = data->num_cfp_rules; + priv->num_crossbar_int_ports = data->num_crossbar_int_ports; - /* Auto-detection using standard registers will not work, so - * provide an indication of what kind of device we are for -@@ -1189,6 +1232,8 @@ static int bcm_sf2_sw_probe(struct platf + priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev, + "switch"); +@@ -1209,6 +1252,8 @@ static int bcm_sf2_sw_probe(struct platf return ret; } @@ -126,7 +126,7 @@ Signed-off-by: David S. Miller ret = bcm_sf2_mdio_register(ds); --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h -@@ -70,6 +70,7 @@ struct bcm_sf2_priv { +@@ -73,6 +73,7 @@ struct bcm_sf2_priv { const u16 *reg_offsets; unsigned int core_reg_align; unsigned int num_cfp_rules; diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch index 8b5332cdda..a2aa554a60 100644 --- a/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch +++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0003-net-dsa-bcm_sf2-Fill-in-BCM4908-CFP-entries.patch @@ -14,7 +14,7 @@ Signed-off-by: David S. Miller --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -1065,7 +1065,7 @@ static const struct bcm_sf2_of_data bcm_ +@@ -1080,7 +1080,7 @@ static const struct bcm_sf2_of_data bcm_ .type = BCM4908_DEVICE_ID, .core_reg_align = 0, .reg_offsets = bcm_sf2_4908_reg_offsets, diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch index c6b724215f..162b7ece3b 100644 --- a/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch +++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0004-net-dsa-bcm_sf2-add-function-finding-RGMII-register.patch @@ -57,7 +57,7 @@ Signed-off-by: David S. Miller static void bcm_sf2_imp_setup(struct dsa_switch *ds, int port) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); -@@ -588,6 +613,7 @@ static void bcm_sf2_sw_mac_config(struct +@@ -600,6 +625,7 @@ static void bcm_sf2_sw_mac_config(struct { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); u32 id_mode_dis = 0, port_mode; @@ -65,7 +65,7 @@ Signed-off-by: David S. Miller u32 reg, offset; if (port == core_readl(priv, CORE_IMP0_PRT_ID)) -@@ -617,10 +643,12 @@ static void bcm_sf2_sw_mac_config(struct +@@ -629,10 +655,12 @@ static void bcm_sf2_sw_mac_config(struct goto force_link; } @@ -79,7 +79,7 @@ Signed-off-by: David S. Miller reg &= ~ID_MODE_DIS; reg &= ~(PORT_MODE_MASK << PORT_MODE_SHIFT); reg &= ~(RX_PAUSE_EN | TX_PAUSE_EN); -@@ -635,7 +663,7 @@ static void bcm_sf2_sw_mac_config(struct +@@ -647,7 +675,7 @@ static void bcm_sf2_sw_mac_config(struct reg |= RX_PAUSE_EN; } @@ -88,7 +88,7 @@ Signed-off-by: David S. Miller force_link: /* Force link settings detected from the PHY */ -@@ -666,6 +694,7 @@ static void bcm_sf2_sw_mac_link_set(stru +@@ -678,6 +706,7 @@ static void bcm_sf2_sw_mac_link_set(stru phy_interface_t interface, bool link) { struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); @@ -96,7 +96,7 @@ Signed-off-by: David S. Miller u32 reg; if (!phy_interface_mode_is_rgmii(interface) && -@@ -673,13 +702,15 @@ static void bcm_sf2_sw_mac_link_set(stru +@@ -685,13 +714,15 @@ static void bcm_sf2_sw_mac_link_set(stru interface != PHY_INTERFACE_MODE_REVMII) return; diff --git a/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch b/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch index 81f3ff5d4d..09e00d5a5f 100644 --- a/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch +++ b/target/linux/bcm4908/patches-5.4/075-v5.13-0005-net-dsa-bcm_sf2-fix-BCM4908-RGMII-reg-s.patch @@ -33,7 +33,7 @@ Signed-off-by: David S. Miller break; default: switch (port) { -@@ -1084,9 +1089,7 @@ static const u16 bcm_sf2_4908_reg_offset +@@ -1099,9 +1104,7 @@ static const u16 bcm_sf2_4908_reg_offset [REG_PHY_REVISION] = 0x14, [REG_SPHY_CNTRL] = 0x24, [REG_CROSSBAR] = 0xc8, diff --git a/target/linux/bcm4908/patches-5.4/076-v5.17-net-dsa-bcm_sf2-refactor-LED-regs-access.patch b/target/linux/bcm4908/patches-5.4/076-v5.17-net-dsa-bcm_sf2-refactor-LED-regs-access.patch index 9f67fe71c1..12db03ef0c 100644 --- a/target/linux/bcm4908/patches-5.4/076-v5.17-net-dsa-bcm_sf2-refactor-LED-regs-access.patch +++ b/target/linux/bcm4908/patches-5.4/076-v5.17-net-dsa-bcm_sf2-refactor-LED-regs-access.patch @@ -82,7 +82,7 @@ Signed-off-by: Jakub Kicinski } } -@@ -1090,9 +1127,14 @@ static const u16 bcm_sf2_4908_reg_offset +@@ -1105,9 +1142,14 @@ static const u16 bcm_sf2_4908_reg_offset [REG_SPHY_CNTRL] = 0x24, [REG_CROSSBAR] = 0xc8, [REG_RGMII_11_CNTRL] = 0x014c, @@ -102,7 +102,7 @@ Signed-off-by: Jakub Kicinski static const struct bcm_sf2_of_data bcm_sf2_4908_data = { --- a/drivers/net/dsa/bcm_sf2.h +++ b/drivers/net/dsa/bcm_sf2.h -@@ -203,6 +203,16 @@ SF2_IO_MACRO(acb); +@@ -206,6 +206,16 @@ SF2_IO_MACRO(acb); SWITCH_INTR_L2(0); SWITCH_INTR_L2(1); diff --git a/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch b/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch index ea9089e7ed..d7a4c5b1b8 100644 --- a/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch +++ b/target/linux/bcm4908/patches-5.4/700-net-dsa-bcm_sf2-enable-GPHY-for-switch-probing.patch @@ -29,7 +29,7 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -1368,10 +1368,14 @@ static int bcm_sf2_sw_probe(struct platf +@@ -1388,10 +1388,14 @@ static int bcm_sf2_sw_probe(struct platf rev = reg_readl(priv, REG_PHY_REVISION); priv->hw_params.gphy_rev = rev & PHY_REVISION_MASK; diff --git a/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch b/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch index 2b860f4ed1..7ddbb44d35 100644 --- a/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch +++ b/target/linux/bcm4908/patches-5.4/701-net-dsa-bcm_sf2-keep-GPHY-enabled-on-the-BCM4908.patch @@ -15,7 +15,7 @@ Signed-off-by: Rafał Miłecki --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -1382,6 +1382,12 @@ static int bcm_sf2_sw_probe(struct platf +@@ -1402,6 +1402,12 @@ static int bcm_sf2_sw_probe(struct platf priv->hw_params.core_rev >> 8, priv->hw_params.core_rev & 0xff, priv->irq0, priv->irq1); diff --git a/target/linux/generic/backport-5.4/702-Revert-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch b/target/linux/generic/backport-5.4/702-Revert-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch new file mode 100644 index 0000000000..d9602fab7a --- /dev/null +++ b/target/linux/generic/backport-5.4/702-Revert-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch @@ -0,0 +1,31 @@ +From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= +Date: Wed, 7 Dec 2022 07:57:58 +0100 +Subject: [PATCH] Revert "net: dsa: b53: Fix valid setting for MDB entries" +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This reverts commit 1fae6eb0fc91d3ecb539e03f9e4dcd1c53ada553. + +Upstream commit was a fix for an overlook of setting "ent.is_valid" +twice after 5d65b64a3d97 ("net: dsa: b53: Add support for MDB"). + +Since MDB support was not backported to stable kernels (it's not a bug +fix) there is nothing to fix there. Backporting this commit resulted in +"env.is_valid" not being set at all. + +Signed-off-by: Rafał Miłecki +--- + drivers/net/dsa/b53/b53_common.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1551,6 +1551,7 @@ static int b53_arl_op(struct b53_device + + memset(&ent, 0, sizeof(ent)); + ent.port = port; ++ ent.is_valid = is_valid; + ent.vid = vid; + ent.is_static = true; + memcpy(ent.mac, addr, ETH_ALEN); diff --git a/target/linux/generic/backport-5.4/703-v5.5-0001-net-dsa-b53-Add-support-for-MDB.patch b/target/linux/generic/backport-5.4/703-v5.5-0001-net-dsa-b53-Add-support-for-MDB.patch new file mode 100644 index 0000000000..8349d31900 --- /dev/null +++ b/target/linux/generic/backport-5.4/703-v5.5-0001-net-dsa-b53-Add-support-for-MDB.patch @@ -0,0 +1,130 @@ +From 5d65b64a3d97011796b225ce315b3ce0011551e7 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Thu, 24 Oct 2019 12:45:07 -0700 +Subject: [PATCH] net: dsa: b53: Add support for MDB + +In preparation for supporting IGMP snooping with or without the use of +a bridge, add support within b53_common.c to program the ARL entries for +multicast operations. The key difference is that a multicast ARL entry +is comprised of a bitmask of enabled ports, instead of a port number. + +Signed-off-by: Florian Fainelli +Reviewed-by: Vivien Didelot +Signed-off-by: David S. Miller +--- + drivers/net/dsa/b53/b53_common.c | 62 ++++++++++++++++++++++++++++++-- + drivers/net/dsa/b53/b53_priv.h | 8 ++++- + 2 files changed, 67 insertions(+), 3 deletions(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1549,11 +1549,25 @@ static int b53_arl_op(struct b53_device + break; + } + +- memset(&ent, 0, sizeof(ent)); +- ent.port = port; ++ /* For multicast address, the port is a bitmask and the validity ++ * is determined by having at least one port being still active ++ */ ++ if (!is_multicast_ether_addr(addr)) { ++ ent.port = port; ++ ent.is_valid = is_valid; ++ } else { ++ if (is_valid) ++ ent.port |= BIT(port); ++ else ++ ent.port &= ~BIT(port); ++ ++ ent.is_valid = !!(ent.port); ++ } ++ + ent.is_valid = is_valid; + ent.vid = vid; + ent.is_static = true; ++ ent.is_age = false; + memcpy(ent.mac, addr, ETH_ALEN); + b53_arl_from_entry(&mac_vid, &fwd_entry, &ent); + +@@ -1672,6 +1686,47 @@ int b53_fdb_dump(struct dsa_switch *ds, + } + EXPORT_SYMBOL(b53_fdb_dump); + ++int b53_mdb_prepare(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct b53_device *priv = ds->priv; ++ ++ /* 5325 and 5365 require some more massaging, but could ++ * be supported eventually ++ */ ++ if (is5325(priv) || is5365(priv)) ++ return -EOPNOTSUPP; ++ ++ return 0; ++} ++EXPORT_SYMBOL(b53_mdb_prepare); ++ ++void b53_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct b53_device *priv = ds->priv; ++ int ret; ++ ++ ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, true); ++ if (ret) ++ dev_err(ds->dev, "failed to add MDB entry\n"); ++} ++EXPORT_SYMBOL(b53_mdb_add); ++ ++int b53_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb) ++{ ++ struct b53_device *priv = ds->priv; ++ int ret; ++ ++ ret = b53_arl_op(priv, 0, port, mdb->addr, mdb->vid, false); ++ if (ret) ++ dev_err(ds->dev, "failed to delete MDB entry\n"); ++ ++ return ret; ++} ++EXPORT_SYMBOL(b53_mdb_del); ++ + int b53_br_join(struct dsa_switch *ds, int port, struct net_device *br) + { + struct b53_device *dev = ds->priv; +@@ -2050,6 +2105,9 @@ static const struct dsa_switch_ops b53_s + .port_fdb_del = b53_fdb_del, + .port_mirror_add = b53_mirror_add, + .port_mirror_del = b53_mirror_del, ++ .port_mdb_prepare = b53_mdb_prepare, ++ .port_mdb_add = b53_mdb_add, ++ .port_mdb_del = b53_mdb_del, + }; + + struct b53_chip_data { +--- a/drivers/net/dsa/b53/b53_priv.h ++++ b/drivers/net/dsa/b53/b53_priv.h +@@ -250,7 +250,7 @@ b53_build_op(write48, u64); + b53_build_op(write64, u64); + + struct b53_arl_entry { +- u8 port; ++ u16 port; + u8 mac[ETH_ALEN]; + u16 vid; + u8 is_valid:1; +@@ -351,6 +351,12 @@ int b53_fdb_del(struct dsa_switch *ds, i + const unsigned char *addr, u16 vid); + int b53_fdb_dump(struct dsa_switch *ds, int port, + dsa_fdb_dump_cb_t *cb, void *data); ++int b53_mdb_prepare(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb); ++void b53_mdb_add(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb); ++int b53_mdb_del(struct dsa_switch *ds, int port, ++ const struct switchdev_obj_port_mdb *mdb); + int b53_mirror_add(struct dsa_switch *ds, int port, + struct dsa_mall_mirror_tc_entry *mirror, bool ingress); + enum dsa_tag_protocol b53_get_tag_protocol(struct dsa_switch *ds, int port); diff --git a/target/linux/generic/backport-5.4/703-v5.5-0002-net-dsa-bcm_sf2-Wire-up-MDB-operations.patch b/target/linux/generic/backport-5.4/703-v5.5-0002-net-dsa-bcm_sf2-Wire-up-MDB-operations.patch new file mode 100644 index 0000000000..98c69fc51e --- /dev/null +++ b/target/linux/generic/backport-5.4/703-v5.5-0002-net-dsa-bcm_sf2-Wire-up-MDB-operations.patch @@ -0,0 +1,27 @@ +From 29bb5e8337caf2e3d9802ee6a6804561f125bfcf Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Thu, 24 Oct 2019 12:45:08 -0700 +Subject: [PATCH] net: dsa: bcm_sf2: Wire up MDB operations + +Leverage the recently add b53_mdb_{add,del,prepare} functions since they +work as-is for bcm_sf2. + +Signed-off-by: Florian Fainelli +Reviewed-by: Vivien Didelot +Signed-off-by: David S. Miller +--- + drivers/net/dsa/bcm_sf2.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -981,6 +981,9 @@ static const struct dsa_switch_ops bcm_s + .set_rxnfc = bcm_sf2_set_rxnfc, + .port_mirror_add = b53_mirror_add, + .port_mirror_del = b53_mirror_del, ++ .port_mdb_prepare = b53_mdb_prepare, ++ .port_mdb_add = b53_mdb_add, ++ .port_mdb_del = b53_mdb_del, + }; + + struct bcm_sf2_of_data { diff --git a/target/linux/generic/backport-5.4/703-v5.5-0003-net-dsa-bcm_sf2-Add-support-for-optional-reset-contr.patch b/target/linux/generic/backport-5.4/703-v5.5-0003-net-dsa-bcm_sf2-Add-support-for-optional-reset-contr.patch new file mode 100644 index 0000000000..be62e7f077 --- /dev/null +++ b/target/linux/generic/backport-5.4/703-v5.5-0003-net-dsa-bcm_sf2-Add-support-for-optional-reset-contr.patch @@ -0,0 +1,81 @@ +From eee87e4377a4b86dc2eea0ade162b0dc33f40576 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Mon, 4 Nov 2019 13:51:39 -0800 +Subject: [PATCH] net: dsa: bcm_sf2: Add support for optional reset controller + line + +Grab an optional and exclusive reset controller line for the switch and +manage it during probe/remove functions accordingly. For 7278 devices we +change bcm_sf2_sw_rst() to use the reset controller line since the +WATCHDOG_CTRL register does not reset the switch contrary to stated +documentation. + +Signed-off-by: Florian Fainelli +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +--- + drivers/net/dsa/bcm_sf2.c | 19 +++++++++++++++++++ + drivers/net/dsa/bcm_sf2.h | 3 +++ + 2 files changed, 22 insertions(+) + +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -346,6 +346,18 @@ static int bcm_sf2_sw_rst(struct bcm_sf2 + { + unsigned int timeout = 1000; + u32 reg; ++ int ret; ++ ++ /* The watchdog reset does not work on 7278, we need to hit the ++ * "external" reset line through the reset controller. ++ */ ++ if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev)) { ++ ret = reset_control_assert(priv->rcdev); ++ if (ret) ++ return ret; ++ ++ return reset_control_deassert(priv->rcdev); ++ } + + reg = core_readl(priv, CORE_WATCHDOG_CTRL); + reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET; +@@ -1099,6 +1111,11 @@ static int bcm_sf2_sw_probe(struct platf + priv->core_reg_align = data->core_reg_align; + priv->num_cfp_rules = data->num_cfp_rules; + ++ priv->rcdev = devm_reset_control_get_optional_exclusive(&pdev->dev, ++ "switch"); ++ if (PTR_ERR(priv->rcdev) == -EPROBE_DEFER) ++ return PTR_ERR(priv->rcdev); ++ + /* Auto-detection using standard registers will not work, so + * provide an indication of what kind of device we are for + * b53_common to work with +@@ -1237,6 +1254,8 @@ static int bcm_sf2_sw_remove(struct plat + dsa_unregister_switch(priv->dev->ds); + bcm_sf2_cfp_exit(priv->dev->ds); + bcm_sf2_mdio_unregister(priv); ++ if (priv->type == BCM7278_DEVICE_ID && !IS_ERR(priv->rcdev)) ++ reset_control_assert(priv->rcdev); + + return 0; + } +--- a/drivers/net/dsa/bcm_sf2.h ++++ b/drivers/net/dsa/bcm_sf2.h +@@ -18,6 +18,7 @@ + #include + #include + #include ++#include + + #include + +@@ -64,6 +65,8 @@ struct bcm_sf2_priv { + void __iomem *fcb; + void __iomem *acb; + ++ struct reset_control *rcdev; ++ + /* Register offsets indirection tables */ + u32 type; + const u16 *reg_offsets; diff --git a/target/linux/generic/backport-5.4/707-v5.7-0016-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch b/target/linux/generic/backport-5.4/707-v5.7-0016-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch new file mode 100644 index 0000000000..cb6497f28a --- /dev/null +++ b/target/linux/generic/backport-5.4/707-v5.7-0016-net-dsa-b53-Fix-valid-setting-for-MDB-entries.patch @@ -0,0 +1,30 @@ +From eab167f4851a19c514469dfa81147f77e17b5b20 Mon Sep 17 00:00:00 2001 +From: Florian Fainelli +Date: Mon, 20 Apr 2020 20:26:52 -0700 +Subject: [PATCH] net: dsa: b53: Fix valid setting for MDB entries + +When support for the MDB entries was added, the valid bit was correctly +changed to be assigned depending on the remaining port bitmask, that is, +if there were no more ports added to the entry's port bitmask, the entry +now becomes invalid. There was another assignment a few lines below that +would override this which would invalidate entries even when there were +still multiple ports left in the MDB entry. + +Fixes: 5d65b64a3d97 ("net: dsa: b53: Add support for MDB") +Reviewed-by: Andrew Lunn +Signed-off-by: Florian Fainelli +Signed-off-by: David S. Miller +--- + drivers/net/dsa/b53/b53_common.c | 1 - + 1 file changed, 1 deletion(-) + +--- a/drivers/net/dsa/b53/b53_common.c ++++ b/drivers/net/dsa/b53/b53_common.c +@@ -1564,7 +1564,6 @@ static int b53_arl_op(struct b53_device + ent.is_valid = !!(ent.port); + } + +- ent.is_valid = is_valid; + ent.vid = vid; + ent.is_static = true; + ent.is_age = false; diff --git a/target/linux/mediatek/patches-5.4/0601-net-dsa-propagate-resolved-link-config-via-mac_link_.patch b/target/linux/mediatek/patches-5.4/0601-net-dsa-propagate-resolved-link-config-via-mac_link_.patch index 888d5cb621..22db45aced 100644 --- a/target/linux/mediatek/patches-5.4/0601-net-dsa-propagate-resolved-link-config-via-mac_link_.patch +++ b/target/linux/mediatek/patches-5.4/0601-net-dsa-propagate-resolved-link-config-via-mac_link_.patch @@ -38,7 +38,7 @@ Signed-off-by: David S. Miller const struct switchdev_obj_port_vlan *vlan); --- a/drivers/net/dsa/bcm_sf2.c +++ b/drivers/net/dsa/bcm_sf2.c -@@ -641,7 +641,9 @@ static void bcm_sf2_sw_mac_link_down(str +@@ -653,7 +653,9 @@ static void bcm_sf2_sw_mac_link_down(str static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port, unsigned int mode, phy_interface_t interface, -- 2.30.2