diff --git a/board/aarch64/microchip-ev23x71a/Config.in b/board/aarch64/microchip-ev23x71a/Config.in index dc3e8254d..83683518d 100644 --- a/board/aarch64/microchip-ev23x71a/Config.in +++ b/board/aarch64/microchip-ev23x71a/Config.in @@ -1,6 +1,7 @@ config BR2_PACKAGE_MICROCHIP_EV23X71A bool "Microchip EV23X71A (Laguna)" depends on BR2_aarch64 + select BR2_PACKAGE_SYMREG help Support for the Microchip EV23X71A evaluation board, based on the LAN969x (Laguna) family of TSN capable switches. 24 GbE diff --git a/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi b/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi index e39f876f8..255fa8ae5 100644 --- a/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi +++ b/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi @@ -13,3 +13,15 @@ }; }; }; + +/* Register access by name for the symreg tool, debugfs only */ +&axi { + symreg@e00c0000 { + compatible = "microchip,sparx5-symreg"; + reg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + reg-names = "cpu", "dev"; + microchip,symreg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + }; +}; diff --git a/board/aarch64/microchip-lan969x/README.md b/board/aarch64/microchip-lan969x/README.md new file mode 100644 index 000000000..acf492f7d --- /dev/null +++ b/board/aarch64/microchip-lan969x/README.md @@ -0,0 +1,72 @@ +# Microchip LAN969x (Laguna) + +Files shared by the boards built on the LAN969x switch family: + +| Board | Package | +|-------------------------------------------------|------------------------------------| +| [Microchip EV23X71A](../microchip-ev23x71a) | `BR2_PACKAGE_MICROCHIP_EV23X71A` | +| [Novarq Tactical 1000](../novarq-tactical-1000) | `BR2_PACKAGE_NOVARQ_TACTICAL_1000` | + +`uboot/` holds the U-Boot config fragment and environment used by the +`*_boot_defconfig` of each board. Kernel device tree and configuration +fixups stay with each board, see its `dts/` directory and `.mk` file. + +A new Laguna board should select `BR2_PACKAGE_SYMREG` in its `Config.in` +and carry the `microchip,sparx5-symreg` node in its `dts/microchip/infix.dtsi`, +copied from one of the boards above, so the tool below works on it too. + +## Debugging + +### Register access by name + +Every Laguna board ships `symreg`, Microchip's tool for reading and +writing switch registers by their datasheet names. It talks to the +`symreg` debugfs driver, which maps the register space the device tree +node describes and exposes it as `/sys/kernel/debug/symreg/mem`. Root +only, since debugfs is. + +``` +symreg --help # options and the register syntax +symreg -m # MAC table +symreg -v # VLAN table +symreg -c 0 # VCAP instance 0 +symreg -s # stream table + +symreg 'DEV2G5[29]*' # all registers of port 29's device block +symreg 'ASM*[29]*' # ingress side of the same port +symreg -a 'DSM*[29]*' # same, with the physical addresses + +symreg REG[idx] # read one register +symreg REG[idx].FIELD # read one field +symreg REG[idx].FIELD 1 # write one field, add -f for wildcards +``` + +Register and field names follow the LAN969x datasheet. Quote the +wildcards or the shell expands them. The dispatcher `symreg` picks the +SoC from `/proc/device-tree/compatible` and runs `symreg_lan969x`, which +can also be called directly. + +The tool reads live hardware, so the useful pattern for an intermittent +fault is a snapshot while the port works, another once it has failed, +and a diff of the two. For the management port, which is switch port 29 +on both boards: + +```bash +for blk in 'DEV2G5[29]*' 'ASM*[29]*' 'DSM*[29]*' 'QSYS*[29]*'; do + symreg "$blk" +done >/tmp/port29-$(date +%s).txt +``` + +Check the PHY as well. The management PHY sits on the GCB MDIO bus and +shares one level triggered interrupt line with the copper PHYs, so a +stale link state can come from a missed PHY interrupt as well as from +the switch. Read it with `mdio` from mdio-tools, see the +[EV23X71A README](../microchip-ev23x71a/README.md#debug-and-analysis), +which also covers the VCAP debugfs and `ethtool` counters; both apply to +either board. + +### Writing registers + +Writes take effect immediately and bypass the driver, which keeps no +record of them. Expect the driver's own view to disagree afterwards, +and reboot before trusting any behaviour again. diff --git a/board/aarch64/novarq-tactical-1000/Config.in b/board/aarch64/novarq-tactical-1000/Config.in index 4c66e6205..440bfc28c 100644 --- a/board/aarch64/novarq-tactical-1000/Config.in +++ b/board/aarch64/novarq-tactical-1000/Config.in @@ -1,6 +1,7 @@ config BR2_PACKAGE_NOVARQ_TACTICAL_1000 bool "Novarq Tactical 1000 (Laguna)" depends on BR2_aarch64 + select BR2_PACKAGE_SYMREG help Support for the Novarq Tactical 1000, based on the LAN969x (Laguna) family of TSN capable switches. 24 GbE copper ports, diff --git a/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi b/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi index e39f876f8..255fa8ae5 100644 --- a/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi +++ b/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi @@ -13,3 +13,15 @@ }; }; }; + +/* Register access by name for the symreg tool, debugfs only */ +&axi { + symreg@e00c0000 { + compatible = "microchip,sparx5-symreg"; + reg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + reg-names = "cpu", "dev"; + microchip,symreg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + }; +}; diff --git a/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical b/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical index c5983fa79..f935e1901 100755 --- a/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical +++ b/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical @@ -114,9 +114,17 @@ if ask "Create aux, primary ${imgsize}, secondary ${imgsize}, cfg ${cfgsize}, an mkfs.ext4 -qF -L aux -m 0 -i 4096 -O ^metadata_csum,^metadata_csum_seed,uninit_bg "${disk}p4" mkfs.ext4 -qF -L cfg -m 0 -i 4096 -O uninit_bg "${disk}p7" mkfs.ext4 -qF -L var -m 0 -i 4096 -O uninit_bg "${disk}p8" + # + # RAUC tracks slot boot state in uboot.env, seed it as prod/provision does. mnt=$(mktemp -d) mount -t ext4 "${disk}p4" "$mnt" echo 1 >"$mnt"/resized + mkenvimage -s 0x4000 -o "$mnt"/uboot.env - < Date: Tue, 19 Sep 2023 18:38:10 +0200 -Subject: [PATCH 01/78] net: phy: marvell10g: Support firmware loading on +Subject: [PATCH 01/85] net: phy: marvell10g: Support firmware loading on 88X3310 When probing, if a device is waiting for firmware to be loaded into @@ -15,7 +15,7 @@ fall back. 1 file changed, 161 insertions(+) diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c -index 8fd42131cdbf..44294519231e 100644 +index 8fd42131cdbf9..44294519231ed 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c @@ -25,6 +25,7 @@ diff --git a/patches/linux/6.18.55/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch b/patches/linux/6.18.55/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch index 713ec69a7..c25a6dee3 100644 --- a/patches/linux/6.18.55/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch +++ b/patches/linux/6.18.55/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch @@ -1,7 +1,7 @@ From 920227e8923cf970730a4bed22bd2aa55dc9387e Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 21 Nov 2023 20:15:24 +0100 -Subject: [PATCH 02/78] net: phy: marvell10g: Fix power-up when strapped to +Subject: [PATCH 02/85] net: phy: marvell10g: Fix power-up when strapped to start powered down On devices which are hardware strapped to start powered down (PDSTATE @@ -12,7 +12,7 @@ affected by this setting. 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c -index 44294519231e..40439db49601 100644 +index 44294519231ed..40439db49601d 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c @@ -322,11 +322,23 @@ static int mv3310_power_down(struct phy_device *phydev) diff --git a/patches/linux/6.18.55/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch b/patches/linux/6.18.55/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch index 370716246..66a1d5363 100644 --- a/patches/linux/6.18.55/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch +++ b/patches/linux/6.18.55/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch @@ -1,7 +1,7 @@ From c473017acbed8a778f07f9f1ce55028e85a9ad62 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 15 Nov 2023 20:58:42 +0100 -Subject: [PATCH 03/78] net: phy: marvell10g: Add LED support for 88X3310 +Subject: [PATCH 03/85] net: phy: marvell10g: Add LED support for 88X3310 Pickup the LEDs from the state in which the hardware reset or bootloader left them, but also support further configuration via @@ -21,7 +21,7 @@ Trigger support: 1 file changed, 422 insertions(+) diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c -index 40439db49601..7ae4744f147b 100644 +index 40439db49601d..7ae4744f147bb 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c @@ -28,6 +28,7 @@ diff --git a/patches/linux/6.18.55/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch b/patches/linux/6.18.55/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch index 09f301669..e00d98e5c 100644 --- a/patches/linux/6.18.55/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch +++ b/patches/linux/6.18.55/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch @@ -1,7 +1,7 @@ From 7ad37cfa715d86cc20f29432f106cedd457e4f26 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Dec 2023 09:51:05 +0100 -Subject: [PATCH 04/78] net: phy: marvell10g: Support LEDs tied to a single +Subject: [PATCH 04/85] net: phy: marvell10g: Support LEDs tied to a single media side In a combo-port setup, i.e. where both the copper and fiber interface @@ -18,7 +18,7 @@ versa for the SFP cage. 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/marvell10g.c b/drivers/net/phy/marvell10g.c -index 7ae4744f147b..5e48355ffcef 100644 +index 7ae4744f147bb..5e48355ffcef4 100644 --- a/drivers/net/phy/marvell10g.c +++ b/drivers/net/phy/marvell10g.c @@ -192,6 +192,9 @@ struct mv3310_chip { diff --git a/patches/linux/6.18.55/0005-net-phy-Do-not-resume-PHY-when-attaching.patch b/patches/linux/6.18.55/0005-net-phy-Do-not-resume-PHY-when-attaching.patch index 4b8eb49ac..ef7f1692d 100644 --- a/patches/linux/6.18.55/0005-net-phy-Do-not-resume-PHY-when-attaching.patch +++ b/patches/linux/6.18.55/0005-net-phy-Do-not-resume-PHY-when-attaching.patch @@ -1,7 +1,7 @@ From 5f95f31c7e48087019db7d673ff32a31f4e06619 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 10:10:19 +0100 -Subject: [PATCH 05/78] net: phy: Do not resume PHY when attaching +Subject: [PATCH 05/85] net: phy: Do not resume PHY when attaching The PHY should not start negotiating with its link-partner until explicitly instructed to do so. @@ -19,7 +19,7 @@ administratively down. 1 file changed, 1 deletion(-) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c -index 26b08e3dbd1d..7597308534a0 100644 +index 26b08e3dbd1de..7597308534a0a 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -1753,7 +1753,6 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, diff --git a/patches/linux/6.18.55/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch b/patches/linux/6.18.55/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch index fa5d143f3..b7900628b 100644 --- a/patches/linux/6.18.55/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch +++ b/patches/linux/6.18.55/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch @@ -1,7 +1,7 @@ From c77bae505246ca5585adfa9219077af6fe98efa7 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 4 Mar 2024 16:47:28 +0100 -Subject: [PATCH 06/78] net: bridge: avoid classifying unknown multicast as +Subject: [PATCH 06/85] net: bridge: avoid classifying unknown multicast as mrouters_only Unknown multicast, MAC/IPv4/IPv6, should always be flooded according to @@ -26,7 +26,7 @@ Signed-off-by: Joachim Wiberg 7 files changed, 57 insertions(+), 14 deletions(-) diff --git a/include/uapi/linux/if_bridge.h b/include/uapi/linux/if_bridge.h -index e52f8207ab27..306fa8a94c81 100644 +index e52f8207ab278..306fa8a94c819 100644 --- a/include/uapi/linux/if_bridge.h +++ b/include/uapi/linux/if_bridge.h @@ -835,6 +835,7 @@ enum br_boolopt_id { @@ -38,7 +38,7 @@ index e52f8207ab27..306fa8a94c81 100644 }; diff --git a/net/bridge/br.c b/net/bridge/br.c -index c37e52e2f29a..0759bc37d6f0 100644 +index c37e52e2f29ad..0759bc37d6f0f 100644 --- a/net/bridge/br.c +++ b/net/bridge/br.c @@ -312,6 +312,9 @@ int br_boolopt_toggle(struct net_bridge *br, enum br_boolopt_id opt, bool on, @@ -61,7 +61,7 @@ index c37e52e2f29a..0759bc37d6f0 100644 /* shouldn't be called with unsupported options */ WARN_ON(1); diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c -index 3055a72959cb..0e5e7821d44c 100644 +index 3055a72959cb6..0e5e7821d44cd 100644 --- a/net/bridge/br_device.c +++ b/net/bridge/br_device.c @@ -89,10 +89,10 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev) @@ -101,7 +101,7 @@ index 3055a72959cb..0e5e7821d44c 100644 br_stp_timer_init(br); br_multicast_init(br); diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c -index dea09096ad0f..f0a613238e0d 100644 +index dea09096ad0fb..f0a613238e0d5 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c @@ -199,15 +199,20 @@ static struct net_bridge_port *maybe_deliver( @@ -140,7 +140,7 @@ index dea09096ad0f..f0a613238e0d 100644 continue; break; diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c -index ac0f56076e93..9af38febff25 100644 +index ac0f56076e93b..9af38febff25d 100644 --- a/net/bridge/br_input.c +++ b/net/bridge/br_input.c @@ -186,9 +186,13 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb @@ -170,7 +170,7 @@ index ac0f56076e93..9af38febff25 100644 br_multicast_flood(mdst, skb, brmctx, local_rcv, false); } diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c -index fda1f89ee22a..db837e27ed8a 100644 +index fda1f89ee22ae..db837e27ed8a2 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -3838,6 +3838,11 @@ static void br_multicast_err_count(const struct net_bridge *br, @@ -206,7 +206,7 @@ index fda1f89ee22a..db837e27ed8a 100644 ipv6_addr_is_all_snoopers(&ipv6_hdr(skb)->daddr)) br_ip6_multicast_mrd_rcv(brmctx, pmctx, skb); diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h -index e4c8bc8576df..b99aa1d6a260 100644 +index e4c8bc8576df6..b99aa1d6a2608 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -491,6 +491,7 @@ enum net_bridge_opts { diff --git a/patches/linux/6.18.55/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch b/patches/linux/6.18.55/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch index fcd288fd8..78a797277 100644 --- a/patches/linux/6.18.55/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch +++ b/patches/linux/6.18.55/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch @@ -1,7 +1,7 @@ From fe3d0113cb67a4e4287329bc1a3b311f9c707cf1 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 5 Mar 2024 06:44:41 +0100 -Subject: [PATCH 07/78] net: bridge: Ignore router ports when forwarding L2 +Subject: [PATCH 07/85] net: bridge: Ignore router ports when forwarding L2 multicast Multicast router ports are either statically configured or learned from @@ -16,7 +16,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h -index b99aa1d6a260..93f3bbc37590 100644 +index b99aa1d6a2608..93f3bbc37590a 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -1088,7 +1088,10 @@ br_multicast_get_first_rport_node(struct net_bridge_mcast *brmctx, diff --git a/patches/linux/6.18.55/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch b/patches/linux/6.18.55/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch index 4151a986e..816289e34 100644 --- a/patches/linux/6.18.55/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch +++ b/patches/linux/6.18.55/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch @@ -1,7 +1,7 @@ From e00f0142f3eef963aef0a046761fda5a2e7712e8 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 4 Apr 2024 16:36:30 +0200 -Subject: [PATCH 08/78] net: bridge: drop delay for applying strict multicast +Subject: [PATCH 08/85] net: bridge: drop delay for applying strict multicast filtering This *local* patch drops the initial delay before applying strict multicast @@ -24,7 +24,7 @@ Signed-off-by: Joachim Wiberg 2 files changed, 8 insertions(+), 38 deletions(-) diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c -index db837e27ed8a..2ccfe3c7b20e 100644 +index db837e27ed8a2..2ccfe3c7b20e3 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -1761,10 +1761,6 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t) @@ -163,7 +163,7 @@ index db837e27ed8a..2ccfe3c7b20e 100644 #endif diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h -index 93f3bbc37590..ec6a85023b5a 100644 +index 93f3bbc37590a..ec6a85023b5ac 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -80,7 +80,6 @@ struct bridge_mcast_own_query { diff --git a/patches/linux/6.18.55/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch b/patches/linux/6.18.55/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch index f4dad3714..7d8c9e6ef 100644 --- a/patches/linux/6.18.55/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch +++ b/patches/linux/6.18.55/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch @@ -1,7 +1,7 @@ From f24cd427adb4d2f1c56c339085bdce4ee1d61844 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 16 May 2024 14:51:54 +0200 -Subject: [PATCH 09/78] net: bridge: Differentiate MDB additions from +Subject: [PATCH 09/85] net: bridge: Differentiate MDB additions from modifications Before this change, the reception of an IGMPv3 report (and analogously @@ -27,7 +27,7 @@ introducing a RTM_SETMDB events to be used in the latter scenario. 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/uapi/linux/rtnetlink.h b/include/uapi/linux/rtnetlink.h -index dab9493c791b..40a3534f0f1d 100644 +index dab9493c791b8..40a3534f0f1d7 100644 --- a/include/uapi/linux/rtnetlink.h +++ b/include/uapi/linux/rtnetlink.h @@ -142,6 +142,8 @@ enum { @@ -40,7 +40,7 @@ index dab9493c791b..40a3534f0f1d 100644 RTM_NEWNSID = 88, #define RTM_NEWNSID RTM_NEWNSID diff --git a/net/bridge/br_mdb.c b/net/bridge/br_mdb.c -index a80ec51fe18d..4cbf3381564d 100644 +index a80ec51fe18d1..4cbf3381564d7 100644 --- a/net/bridge/br_mdb.c +++ b/net/bridge/br_mdb.c @@ -752,7 +752,7 @@ static int br_mdb_replace_group_sg(const struct br_mdb_config *cfg, @@ -62,7 +62,7 @@ index a80ec51fe18d..4cbf3381564d 100644 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto)) br_multicast_star_g_handle_mode(pg, cfg->filter_mode); diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c -index 2ccfe3c7b20e..aad576e4af65 100644 +index 2ccfe3c7b20e3..aad576e4af65d 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -616,7 +616,7 @@ static void br_multicast_fwd_src_handle(struct net_bridge_group_src *src) diff --git a/patches/linux/6.18.55/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch b/patches/linux/6.18.55/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch index 2ad996086..ae5c3fcd6 100644 --- a/patches/linux/6.18.55/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch +++ b/patches/linux/6.18.55/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch @@ -1,7 +1,7 @@ From e47f23a9767fc22465731ab728215afa25579c20 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 24 Nov 2023 23:29:55 +0100 -Subject: [PATCH 10/78] nvmem: layouts: onie-tlv: Let device probe even when +Subject: [PATCH 10/85] nvmem: layouts: onie-tlv: Let device probe even when TLV is invalid Before this change, probing an NVMEM device, expected to contain a @@ -17,7 +17,7 @@ simply refrain from registering any cells in those cases. 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/nvmem/layouts/onie-tlv.c b/drivers/nvmem/layouts/onie-tlv.c -index 8b0f3c1b8a0e..de85690aaa30 100644 +index 8b0f3c1b8a0e9..de85690aaa303 100644 --- a/drivers/nvmem/layouts/onie-tlv.c +++ b/drivers/nvmem/layouts/onie-tlv.c @@ -198,7 +198,7 @@ static int onie_tlv_parse_table(struct nvmem_layout *layout) diff --git a/patches/linux/6.18.55/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch b/patches/linux/6.18.55/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch index ab0ad78fd..cdefcfff4 100644 --- a/patches/linux/6.18.55/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch +++ b/patches/linux/6.18.55/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch @@ -1,7 +1,7 @@ From bd5c4068ec34ff0af11b1f52a3c06d43c8af39b1 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 11 Aug 2024 11:27:35 +0200 -Subject: [PATCH 11/78] net: usb: r8152: add r8153b support for link/activity +Subject: [PATCH 11/85] net: usb: r8152: add r8153b support for link/activity LEDs This patch adds support for the link/activity LEDs on the NanoPi R2S @@ -18,7 +18,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 8 insertions(+) diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c -index 8cf4e81f8f88..1bb93efb96c6 100644 +index 8cf4e81f8f882..1bb93efb96c68 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -41,6 +41,11 @@ diff --git a/patches/linux/6.18.55/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch b/patches/linux/6.18.55/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch index d8140edde..053a8a0db 100644 --- a/patches/linux/6.18.55/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch +++ b/patches/linux/6.18.55/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch @@ -1,7 +1,7 @@ From 7552cf30d52b0798298af29063a44da182e9b6ee Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 10 Aug 2025 18:52:54 +0200 -Subject: [PATCH 12/78] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to +Subject: [PATCH 12/85] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to match case For ref. see: https://wiki.banana-pi.org/File:Bpi-r3_Metal_case.jpg @@ -15,7 +15,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts b/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts -index e7654dc9a1c9..4cc6aff07225 100644 +index e7654dc9a1c9b..4cc6aff072256 100644 --- a/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts +++ b/arch/arm64/boot/dts/mediatek/mt7986a-bananapi-bpi-r3.dts @@ -46,7 +46,7 @@ fan: pwm-fan { diff --git a/patches/linux/6.18.55/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch b/patches/linux/6.18.55/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch index 94951986d..7af898ded 100644 --- a/patches/linux/6.18.55/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch +++ b/patches/linux/6.18.55/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch @@ -1,7 +1,7 @@ From 34593fc729c0656763733bf93719b8c8c9408f91 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 20 Aug 2025 21:38:24 +0200 -Subject: [PATCH 13/78] drm/panel-simple: Add a timing for the Raspberry Pi 7" +Subject: [PATCH 13/85] drm/panel-simple: Add a timing for the Raspberry Pi 7" panel The Raspberry Pi 7" 800x480 panel uses a Toshiba TC358762 DSI @@ -46,7 +46,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c -index 878a5dc7748f..d5da86abea70 100644 +index 878a5dc7748fb..d5da86abea700 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -400,7 +400,8 @@ static int panel_simple_get_modes(struct drm_panel *panel, diff --git a/patches/linux/6.18.55/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch b/patches/linux/6.18.55/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch index adab4e5d7..493e35145 100644 --- a/patches/linux/6.18.55/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch +++ b/patches/linux/6.18.55/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch @@ -1,7 +1,7 @@ From e443789978265aac625d474e2ceeebdf62ce5b8e Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Thu, 21 Aug 2025 11:20:23 +0200 -Subject: [PATCH 14/78] input:touchscreen:edt-ft5x06: Add polled mode +Subject: [PATCH 14/85] input:touchscreen:edt-ft5x06: Add polled mode Not all hardware has interrupts therefore we need to poll the touchscreen. @@ -10,7 +10,7 @@ to poll the touchscreen. 1 file changed, 58 insertions(+), 16 deletions(-) diff --git a/drivers/input/touchscreen/edt-ft5x06.c b/drivers/input/touchscreen/edt-ft5x06.c -index 4efdb467b6c6..6ec1078081d5 100644 +index 4efdb467b6c61..6ec1078081d58 100644 --- a/drivers/input/touchscreen/edt-ft5x06.c +++ b/drivers/input/touchscreen/edt-ft5x06.c @@ -77,6 +77,9 @@ diff --git a/patches/linux/6.18.55/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch b/patches/linux/6.18.55/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch index 72e36b64f..8d3fa5650 100644 --- a/patches/linux/6.18.55/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch +++ b/patches/linux/6.18.55/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch @@ -1,7 +1,7 @@ From dab336b722de649666ef241636207f10745a0f1e Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Mar 2024 10:27:24 +0100 -Subject: [PATCH 15/78] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for +Subject: [PATCH 15/85] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for PPU on 6393X In a multi-chip setup, delays of up to 750ms are observed before the @@ -12,7 +12,7 @@ register 0, bit 15). Therefore, increase the timeout threshold to 1s. 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index e9270c266884..37cd099180d6 100644 +index e9270c266884c..37cd099180d64 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -87,7 +87,7 @@ int mv88e6xxx_write(struct mv88e6xxx_chip *chip, int addr, int reg, u16 val) diff --git a/patches/linux/6.18.55/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch b/patches/linux/6.18.55/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch index 17d51c3c4..1b8659472 100644 --- a/patches/linux/6.18.55/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch +++ b/patches/linux/6.18.55/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch @@ -1,7 +1,7 @@ From fbb87a65e898ae04f9801aa820f586d046ba329c Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 15:52:43 +0100 -Subject: [PATCH 16/78] net: dsa: mv88e6xxx: Improve indirect register access +Subject: [PATCH 16/85] net: dsa: mv88e6xxx: Improve indirect register access perf on 6393 When operating in multi-chip mode, the 6393 family maps a subset of @@ -21,7 +21,7 @@ other accesses use the regular indirect interface. 5 files changed, 119 insertions(+) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 37cd099180d6..e8980609b45d 100644 +index 37cd099180d64..e8980609b45da 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -6554,6 +6554,13 @@ static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip) @@ -39,7 +39,7 @@ index 37cd099180d6..e8980609b45d 100644 chip->info->prod_num, chip->info->name, rev); diff --git a/drivers/net/dsa/mv88e6xxx/global1.h b/drivers/net/dsa/mv88e6xxx/global1.h -index 3dbb7a1b8fe1..5ea956aadecc 100644 +index 3dbb7a1b8fe11..5ea956aadecc9 100644 --- a/drivers/net/dsa/mv88e6xxx/global1.h +++ b/drivers/net/dsa/mv88e6xxx/global1.h @@ -218,6 +218,9 @@ @@ -53,7 +53,7 @@ index 3dbb7a1b8fe1..5ea956aadecc 100644 #define MV88E6XXX_G1_CTL2 0x1c #define MV88E6185_G1_CTL2_CASCADE_PORT_MASK 0xf000 diff --git a/drivers/net/dsa/mv88e6xxx/global2.h b/drivers/net/dsa/mv88e6xxx/global2.h -index 82f9b410de0b..3663645621c9 100644 +index 82f9b410de0b8..3663645621c9d 100644 --- a/drivers/net/dsa/mv88e6xxx/global2.h +++ b/drivers/net/dsa/mv88e6xxx/global2.h @@ -143,6 +143,9 @@ @@ -67,7 +67,7 @@ index 82f9b410de0b..3663645621c9 100644 #define MV88E6XXX_G2_EEPROM_CMD 0x14 #define MV88E6XXX_G2_EEPROM_CMD_BUSY 0x8000 diff --git a/drivers/net/dsa/mv88e6xxx/smi.c b/drivers/net/dsa/mv88e6xxx/smi.c -index a990271b7482..f54bb0e79030 100644 +index a990271b74823..f54bb0e79030c 100644 --- a/drivers/net/dsa/mv88e6xxx/smi.c +++ b/drivers/net/dsa/mv88e6xxx/smi.c @@ -8,6 +8,8 @@ @@ -168,7 +168,7 @@ index a990271b7482..f54bb0e79030 100644 chip->smi_ops = &mv88e6xxx_smi_indirect_ops; else diff --git a/drivers/net/dsa/mv88e6xxx/smi.h b/drivers/net/dsa/mv88e6xxx/smi.h -index c6c71d5757f5..788cf68b7b33 100644 +index c6c71d5757f5d..788cf68b7b334 100644 --- a/drivers/net/dsa/mv88e6xxx/smi.h +++ b/drivers/net/dsa/mv88e6xxx/smi.h @@ -31,6 +31,36 @@ diff --git a/patches/linux/6.18.55/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch b/patches/linux/6.18.55/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch index 54b80314d..a8f62a0d1 100644 --- a/patches/linux/6.18.55/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch +++ b/patches/linux/6.18.55/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch @@ -1,7 +1,7 @@ From 32bf97b633ba31514b0b0756a1c0891bc67254ba Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Mon, 22 Apr 2024 23:18:01 +0200 -Subject: [PATCH 17/78] net: dsa: mv88e6xxx: Honor ports being managed via +Subject: [PATCH 17/85] net: dsa: mv88e6xxx: Honor ports being managed via in-band-status Keep all link parameters in their unforced states when the port is @@ -17,7 +17,7 @@ when in-band-status is being used. 1 file changed, 6 insertions(+) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index e8980609b45d..0a535dc0a48c 100644 +index e8980609b45da..0a535dc0a48c1 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -965,6 +965,9 @@ static void mv88e6xxx_mac_link_down(struct phylink_config *config, diff --git a/patches/linux/6.18.55/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch b/patches/linux/6.18.55/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch index a4c117e94..a5e1c5493 100644 --- a/patches/linux/6.18.55/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch +++ b/patches/linux/6.18.55/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch @@ -1,7 +1,7 @@ From fadc315c8a6f0305edb24d3fbba80aa2e712d2a1 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 24 Apr 2024 22:41:04 +0200 -Subject: [PATCH 18/78] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user +Subject: [PATCH 18/85] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user ports on 6393X For packets with a DA in the IEEE reserved L2 group range, originating @@ -33,7 +33,7 @@ forwarded like any other. 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c -index 66b1b7277281..df19dfa5cc3d 100644 +index 66b1b72772810..df19dfa5cc3d8 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -1434,6 +1434,23 @@ static int mv88e6393x_port_policy_write_all(struct mv88e6xxx_chip *chip, diff --git a/patches/linux/6.18.55/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch b/patches/linux/6.18.55/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch index 088b22c42..f26f2ec4b 100644 --- a/patches/linux/6.18.55/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch +++ b/patches/linux/6.18.55/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch @@ -1,7 +1,7 @@ From 52728881ff09f7e48fb26145d21b1dd83f6643e7 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 10:38:42 +0200 -Subject: [PATCH 19/78] net: dsa: tag_dsa: Use tag priority as initial +Subject: [PATCH 19/85] net: dsa: tag_dsa: Use tag priority as initial skb->priority Use the 3-bit priority field from the DSA tag as the initial packet @@ -23,7 +23,7 @@ implemented, support the setup that is likely to be the most common; a 1 file changed, 7 insertions(+) diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c -index 2a2c4fb61a65..a00ae6bf2971 100644 +index 2a2c4fb61a65c..a00ae6bf29717 100644 --- a/net/dsa/tag_dsa.c +++ b/net/dsa/tag_dsa.c @@ -323,6 +323,13 @@ static struct sk_buff *dsa_rcv_ll(struct sk_buff *skb, struct net_device *dev, diff --git a/patches/linux/6.18.55/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch b/patches/linux/6.18.55/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch index ca0afe350..6c6569062 100644 --- a/patches/linux/6.18.55/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch +++ b/patches/linux/6.18.55/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch @@ -1,7 +1,7 @@ From 5fe097173ea1563a7f1e3b93fa0347699a94e19e Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 16 Jan 2024 16:00:55 +0100 -Subject: [PATCH 20/78] net: dsa: Support MDB memberships whose L2 addresses +Subject: [PATCH 20/85] net: dsa: Support MDB memberships whose L2 addresses overlap Multiple IP multicast groups (32 for v4, 2^80 for v6) map to the same @@ -33,7 +33,7 @@ which previously skipped reference countung on user ports. 1 file changed, 16 deletions(-) diff --git a/net/dsa/switch.c b/net/dsa/switch.c -index 3d2feeea897b..628e8a884dde 100644 +index 3d2feeea897b6..628e8a884dde5 100644 --- a/net/dsa/switch.c +++ b/net/dsa/switch.c @@ -164,14 +164,6 @@ static int dsa_port_do_mdb_add(struct dsa_port *dp, diff --git a/patches/linux/6.18.55/0021-net-dsa-Support-EtherType-based-priority-overrides.patch b/patches/linux/6.18.55/0021-net-dsa-Support-EtherType-based-priority-overrides.patch index 8d18a6a2a..788be1396 100644 --- a/patches/linux/6.18.55/0021-net-dsa-Support-EtherType-based-priority-overrides.patch +++ b/patches/linux/6.18.55/0021-net-dsa-Support-EtherType-based-priority-overrides.patch @@ -1,7 +1,7 @@ From b1f583e91f7d447d2a81feb2753b8a483c3ff24f Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 21 Mar 2024 19:12:15 +0100 -Subject: [PATCH 21/78] net: dsa: Support EtherType based priority overrides +Subject: [PATCH 21/85] net: dsa: Support EtherType based priority overrides --- include/net/dsa.h | 4 ++++ @@ -9,7 +9,7 @@ Subject: [PATCH 21/78] net: dsa: Support EtherType based priority overrides 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/include/net/dsa.h b/include/net/dsa.h -index 5cb456bf4639..c31d4e910f07 100644 +index 5cb456bf46394..c31d4e910f075 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -958,6 +958,10 @@ struct dsa_switch_ops { @@ -24,7 +24,7 @@ index 5cb456bf4639..c31d4e910f07 100644 /* * Suspend and resume diff --git a/net/dsa/user.c b/net/dsa/user.c -index f59d66f0975d..58174ad612d2 100644 +index f59d66f0975d7..58174ad612d21 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -2336,6 +2336,34 @@ dsa_user_dcbnl_add_dscp_prio(struct net_device *dev, struct dcb_app *app) diff --git a/patches/linux/6.18.55/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch b/patches/linux/6.18.55/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch index 363882976..d7b9434f2 100644 --- a/patches/linux/6.18.55/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch +++ b/patches/linux/6.18.55/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch @@ -1,7 +1,7 @@ From ba6e63577971f172e2dcc46071d1b3471d9d1a12 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 22 Mar 2024 16:15:43 +0100 -Subject: [PATCH 22/78] net: dsa: mv88e6xxx: Support EtherType based priority +Subject: [PATCH 22/85] net: dsa: mv88e6xxx: Support EtherType based priority overrides --- @@ -14,7 +14,7 @@ Subject: [PATCH 22/78] net: dsa: mv88e6xxx: Support EtherType based priority 6 files changed, 207 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 0a535dc0a48c..c708f1cce9b3 100644 +index 0a535dc0a48c1..c708f1cce9b30 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -1688,6 +1688,11 @@ static int mv88e6xxx_rmu_setup(struct mv88e6xxx_chip *chip) @@ -117,7 +117,7 @@ index 0a535dc0a48c..c708f1cce9b3 100644 static int mv88e6xxx_register_switch(struct mv88e6xxx_chip *chip) diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h -index e073446ee7d0..5d5e7ab63fca 100644 +index e073446ee7d02..5d5e7ab63fca3 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.h +++ b/drivers/net/dsa/mv88e6xxx/chip.h @@ -301,6 +301,11 @@ struct mv88e6xxx_port { @@ -170,7 +170,7 @@ index e073446ee7d0..5d5e7ab63fca 100644 struct mv88e6xxx_bus_ops { diff --git a/drivers/net/dsa/mv88e6xxx/global2.c b/drivers/net/dsa/mv88e6xxx/global2.c -index 30a6ffa7817b..3f16a7ef3fa2 100644 +index 30a6ffa7817b0..3f16a7ef3fa28 100644 --- a/drivers/net/dsa/mv88e6xxx/global2.c +++ b/drivers/net/dsa/mv88e6xxx/global2.c @@ -315,7 +315,7 @@ int mv88e6xxx_g2_atu_stats_get(struct mv88e6xxx_chip *chip, u16 *stats) @@ -244,7 +244,7 @@ index 30a6ffa7817b..3f16a7ef3fa2 100644 * Offset 0x15: EEPROM Data (for 16-bit data access) * Offset 0x15: EEPROM Addr (for 8-bit data access) diff --git a/drivers/net/dsa/mv88e6xxx/global2.h b/drivers/net/dsa/mv88e6xxx/global2.h -index 3663645621c9..496269c26c50 100644 +index 3663645621c9d..496269c26c508 100644 --- a/drivers/net/dsa/mv88e6xxx/global2.h +++ b/drivers/net/dsa/mv88e6xxx/global2.h @@ -138,6 +138,7 @@ @@ -266,7 +266,7 @@ index 3663645621c9..496269c26c50 100644 int mv88e6xxx_g2_trunk_mask_write(struct mv88e6xxx_chip *chip, int num, bool hash, u16 mask); diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c -index df19dfa5cc3d..e1fee09eae2f 100644 +index df19dfa5cc3d8..e1fee09eae2fc 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -1560,6 +1560,52 @@ int mv88e6351_port_set_ether_type(struct mv88e6xxx_chip *chip, int port, @@ -323,7 +323,7 @@ index df19dfa5cc3d..e1fee09eae2f 100644 * Offset 0x19: Port IEEE Priority Remapping Registers [4-7] */ diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h -index c1d2f99efb1c..d2ba9ed1f23e 100644 +index c1d2f99efb1c6..d2ba9ed1f23ea 100644 --- a/drivers/net/dsa/mv88e6xxx/port.h +++ b/drivers/net/dsa/mv88e6xxx/port.h @@ -286,7 +286,18 @@ diff --git a/patches/linux/6.18.55/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch b/patches/linux/6.18.55/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch index d8fed0a32..94be47f34 100644 --- a/patches/linux/6.18.55/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch +++ b/patches/linux/6.18.55/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch @@ -1,7 +1,7 @@ From b12a958ebe126f89d0bcd2057733a270de63e883 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 11:04:22 +0200 -Subject: [PATCH 23/78] net: dsa: mv88e6xxx: Add mqprio qdisc support +Subject: [PATCH 23/85] net: dsa: mv88e6xxx: Add mqprio qdisc support Add support for attaching mqprio qdisc's to mv88e6xxx ports and use the packet's traffic class as the outgoing priority when no PCP bits @@ -29,7 +29,7 @@ handle the mapping down to the "real" number. 2 files changed, 73 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index c708f1cce9b3..2dd0573e101e 100644 +index c708f1cce9b30..2dd0573e101eb 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -32,6 +32,7 @@ @@ -131,7 +131,7 @@ index c708f1cce9b3..2dd0573e101e 100644 return dsa_register_switch(ds); diff --git a/net/dsa/tag_dsa.c b/net/dsa/tag_dsa.c -index a00ae6bf2971..55c296e0b5b0 100644 +index a00ae6bf29717..55c296e0b5b0e 100644 --- a/net/dsa/tag_dsa.c +++ b/net/dsa/tag_dsa.c @@ -180,8 +180,10 @@ static struct sk_buff *dsa_xmit_ll(struct sk_buff *skb, struct net_device *dev, diff --git a/patches/linux/6.18.55/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch b/patches/linux/6.18.55/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch index 78c8791f8..2c6fd13ec 100644 --- a/patches/linux/6.18.55/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch +++ b/patches/linux/6.18.55/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch @@ -1,7 +1,7 @@ From 5905be94b871ac828acbae66f6a2c21ea0c48dfd Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 29 May 2024 13:20:41 +0200 -Subject: [PATCH 24/78] net: dsa: mv88e6xxx: Use VLAN prio over IP when both +Subject: [PATCH 24/85] net: dsa: mv88e6xxx: Use VLAN prio over IP when both are available Switch the priority sourcing precdence to prefer VLAN PCP over IP @@ -26,7 +26,7 @@ main reasons for choosing the new default: 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 2dd0573e101e..15c80e66aefd 100644 +index 2dd0573e101eb..15c80e66aefd2 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3430,9 +3430,13 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) diff --git a/patches/linux/6.18.55/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch b/patches/linux/6.18.55/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch index f87376948..d016e275a 100644 --- a/patches/linux/6.18.55/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch +++ b/patches/linux/6.18.55/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch @@ -1,7 +1,7 @@ From 508ff078d94e3083fcf905ff59fcb477a3dbe507 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 26 Nov 2024 19:45:59 +0100 -Subject: [PATCH 25/78] [FIX] net: dsa: mv88e6xxx: Trap locally terminated +Subject: [PATCH 25/85] [FIX] net: dsa: mv88e6xxx: Trap locally terminated VLANs Before this change, in a setup like the following, packets assigned to @@ -30,7 +30,7 @@ cause all packets assigned to these VLANs to properly terminated. 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 15c80e66aefd..397ae2b78df8 100644 +index 15c80e66aefd2..397ae2b78df84 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -2619,7 +2619,7 @@ static int mv88e6xxx_port_broadcast_sync(struct mv88e6xxx_chip *chip, int port, @@ -117,7 +117,7 @@ index 15c80e66aefd..397ae2b78df8 100644 return err; diff --git a/include/net/switchdev.h b/include/net/switchdev.h -index 8346b0d29542..764cd3dd4645 100644 +index 8346b0d29542c..764cd3dd46454 100644 --- a/include/net/switchdev.h +++ b/include/net/switchdev.h @@ -104,6 +104,10 @@ struct switchdev_obj_port_vlan { @@ -132,7 +132,7 @@ index 8346b0d29542..764cd3dd4645 100644 #define SWITCHDEV_OBJ_PORT_VLAN(OBJ) \ diff --git a/net/dsa/user.c b/net/dsa/user.c -index 58174ad612d2..c0019d0c1172 100644 +index 58174ad612d21..c0019d0c1172d 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -1796,6 +1796,8 @@ static int dsa_user_vlan_rx_add_vid(struct net_device *dev, __be16 proto, diff --git a/patches/linux/6.18.55/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch b/patches/linux/6.18.55/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch index 00afddfb0..2408b2989 100644 --- a/patches/linux/6.18.55/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch +++ b/patches/linux/6.18.55/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch @@ -1,7 +1,7 @@ From c24a806cd5b1728102098a6e3da24ee19f908884 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 16 Jan 2025 12:35:12 +0100 -Subject: [PATCH 26/78] net: dsa: mv88e6xxx: collapse disabled state into +Subject: [PATCH 26/85] net: dsa: mv88e6xxx: collapse disabled state into blocking This patch changes the behavior of switchcore ports wrt. the port state. @@ -22,7 +22,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 2 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c -index e1fee09eae2f..e28fdd21de38 100644 +index e1fee09eae2fc..e28fdd21de38e 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -793,8 +793,6 @@ int mv88e6xxx_port_set_state(struct mv88e6xxx_chip *chip, int port, u8 state) diff --git a/patches/linux/6.18.55/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch b/patches/linux/6.18.55/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch index d96c4386d..0c444cafd 100644 --- a/patches/linux/6.18.55/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch +++ b/patches/linux/6.18.55/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch @@ -1,7 +1,7 @@ From b1b26dd227ed5099626c1fcb0e843b81d3daae65 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 12 Feb 2025 22:03:14 +0100 -Subject: [PATCH 27/78] net: dsa: mv88e6xxx: Only activate LAG offloading when +Subject: [PATCH 27/85] net: dsa: mv88e6xxx: Only activate LAG offloading when bridged The current port isolation scheme for mv88e6xxx is detailed here: @@ -50,7 +50,7 @@ CPU; egress traffic always relies on software hashing. 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 397ae2b78df8..71458342a274 100644 +index 397ae2b78df84..71458342a274c 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3066,6 +3066,7 @@ static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, diff --git a/patches/linux/6.18.55/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch b/patches/linux/6.18.55/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch index 159a15a7d..2506ba304 100644 --- a/patches/linux/6.18.55/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch +++ b/patches/linux/6.18.55/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch @@ -1,7 +1,7 @@ From 307811da452a9d4b665bc0f06c514d74d8c26ab9 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 14 Jan 2026 18:22:41 +0100 -Subject: [PATCH 28/78] net: dsa: mv88e6xxx: Add LED support for 6393X +Subject: [PATCH 28/85] net: dsa: mv88e6xxx: Add LED support for 6393X Original commit: commit 462277b926140ee2d231317e92afb6cabf640268 @@ -22,7 +22,7 @@ Date: Thu Nov 16 21:59:35 2023 +0100 4 files changed, 450 insertions(+) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 71458342a274..f0a662e9b847 100644 +index 71458342a274c..f0a662e9b8477 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -5669,6 +5669,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = { @@ -34,7 +34,7 @@ index 71458342a274..f0a662e9b847 100644 .port_set_upstream_port = mv88e6393x_port_set_upstream_port, .stats_snapshot = mv88e6390_g1_stats_snapshot, diff --git a/drivers/net/dsa/mv88e6xxx/leds.c b/drivers/net/dsa/mv88e6xxx/leds.c -index ab3bc645da56..7c5904300849 100644 +index ab3bc645da566..7c59043008494 100644 --- a/drivers/net/dsa/mv88e6xxx/leds.c +++ b/drivers/net/dsa/mv88e6xxx/leds.c @@ -102,6 +102,58 @@ struct mv88e6xxx_led_hwconfig { @@ -452,7 +452,7 @@ index ab3bc645da56..7c5904300849 100644 + return ret; +} diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c -index e28fdd21de38..1985b8553611 100644 +index e28fdd21de38e..1985b85536112 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -1604,6 +1604,39 @@ int mv88e6xxx_port_relinquish_ether_type(struct mv88e6xxx_chip *chip, int port) @@ -496,7 +496,7 @@ index e28fdd21de38..1985b8553611 100644 * Offset 0x19: Port IEEE Priority Remapping Registers [4-7] */ diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h -index d2ba9ed1f23e..f4a56671fc4c 100644 +index d2ba9ed1f23ea..f4a56671fc4c2 100644 --- a/drivers/net/dsa/mv88e6xxx/port.h +++ b/drivers/net/dsa/mv88e6xxx/port.h @@ -444,6 +444,9 @@ diff --git a/patches/linux/6.18.55/0029-wifi-brcmfmac-check-connection-state-before-querying.patch b/patches/linux/6.18.55/0029-wifi-brcmfmac-check-connection-state-before-querying.patch index 1e7ccf9bb..5f6bc4368 100644 --- a/patches/linux/6.18.55/0029-wifi-brcmfmac-check-connection-state-before-querying.patch +++ b/patches/linux/6.18.55/0029-wifi-brcmfmac-check-connection-state-before-querying.patch @@ -1,7 +1,7 @@ From 59c469b24ce0aee40cde6aa1ea986cf42dfc150c Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Mon, 19 Jan 2026 13:06:53 +0100 -Subject: [PATCH 29/78] wifi: brcmfmac: check connection state before querying +Subject: [PATCH 29/85] wifi: brcmfmac: check connection state before querying station info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -23,7 +23,7 @@ Signed-off-by: Mattias Walström 1 file changed, 5 insertions(+) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 1fc9ecd86d5d..4189a127f4b3 100644 +index 1fc9ecd86d5d9..4189a127f4b37 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -3156,6 +3156,11 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev, diff --git a/patches/linux/6.18.55/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch b/patches/linux/6.18.55/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch index bb686aac7..57b163e6c 100644 --- a/patches/linux/6.18.55/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch +++ b/patches/linux/6.18.55/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch @@ -1,7 +1,7 @@ From 96510a92c5e05d36dfd1b66e4e7719adc3b6aaf1 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:12:10 +0100 -Subject: [PATCH 30/78] wifi: brcmfmac: suppress log spam for +Subject: [PATCH 30/85] wifi: brcmfmac: suppress log spam for regulatory-restricted channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -20,7 +20,7 @@ Signed-off-by: Mattias Walström 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 4189a127f4b3..88dac288a398 100644 +index 4189a127f4b37..88dac288a3986 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -8133,7 +8133,12 @@ brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct ieee80211_channel *cha diff --git a/patches/linux/6.18.55/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch b/patches/linux/6.18.55/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch index d6eee3ae1..38a772a26 100644 --- a/patches/linux/6.18.55/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch +++ b/patches/linux/6.18.55/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch @@ -1,7 +1,7 @@ From 10cc35ebdae09afe942ce3e054be910b608af6ca Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:18:45 +0100 -Subject: [PATCH 31/78] wifi: brcmfmac: reduce log noise during AP to station +Subject: [PATCH 31/85] wifi: brcmfmac: reduce log noise during AP to station transition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -27,7 +27,7 @@ Signed-off-by: Mattias Walström 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 88dac288a398..0081ceb6c782 100644 +index 88dac288a3986..0081ceb6c7829 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -1030,13 +1030,15 @@ static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc) diff --git a/patches/linux/6.18.55/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch b/patches/linux/6.18.55/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch index 980f7bbfd..1e6f9b4a6 100644 --- a/patches/linux/6.18.55/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch +++ b/patches/linux/6.18.55/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch @@ -1,7 +1,7 @@ From 98a492d3fa5e2472984335bfec5353b293677983 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 17 Feb 2026 21:59:59 +0100 -Subject: [PATCH 32/78] net: phy: air_en8811h: add OF device table for +Subject: [PATCH 32/85] net: phy: air_en8811h: add OF device table for auto-loading mdio_uevent() only emits an OF-style MODALIAS via @@ -20,7 +20,7 @@ rejects drivers that provide an of_match_table. 1 file changed, 6 insertions(+) diff --git a/drivers/net/phy/air_en8811h.c b/drivers/net/phy/air_en8811h.c -index badd65f0ccee..b609465247a2 100644 +index badd65f0ccee2..b609465247a28 100644 --- a/drivers/net/phy/air_en8811h.c +++ b/drivers/net/phy/air_en8811h.c @@ -1184,6 +1184,12 @@ static int en8811h_suspend(struct phy_device *phydev) diff --git a/patches/linux/6.18.55/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch b/patches/linux/6.18.55/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch index d50b355fd..5b905759b 100644 --- a/patches/linux/6.18.55/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch +++ b/patches/linux/6.18.55/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch @@ -1,7 +1,7 @@ From fe79facb35cd0c40ad8ad042680666351196cb22 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 20 Sep 2024 12:05:18 +0100 -Subject: [PATCH 33/78] drm: vc4: dsi: enable video and then retry failed +Subject: [PATCH 33/85] drm: vc4: dsi: enable video and then retry failed transfers The DSI block appears to be able to come up stuck in a condition where @@ -18,7 +18,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index 458e5d987964..439d7a04127d 100644 +index 458e5d9879645..439d7a04127d8 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -286,6 +286,8 @@ diff --git a/patches/linux/6.18.55/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch b/patches/linux/6.18.55/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch index 59d6dc79e..9f6b96b23 100644 --- a/patches/linux/6.18.55/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch +++ b/patches/linux/6.18.55/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch @@ -1,7 +1,7 @@ From bd07a3e59ac1c8f8ebfb54f5dc4e96c925f8381d Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 8 Jun 2022 17:23:47 +0100 -Subject: [PATCH 34/78] drm: vc4: dsi: Clocks should be running before reset +Subject: [PATCH 34/85] drm: vc4: dsi: Clocks should be running before reset The initialisation sequence differs slightly from the documentation in that the clocks are meant to be running before resets and @@ -13,7 +13,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index 439d7a04127d..1eba498d276f 100644 +index 439d7a04127d8..1eba498d276f8 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -926,6 +926,21 @@ static void vc4_dsi_bridge_pre_enable(struct drm_bridge *bridge, diff --git a/patches/linux/6.18.55/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch b/patches/linux/6.18.55/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch index 5dd80c251..04224e308 100644 --- a/patches/linux/6.18.55/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch +++ b/patches/linux/6.18.55/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch @@ -1,7 +1,7 @@ From 95a1f57cf66771a609d4155774264d962a99d297 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 5 Apr 2024 17:51:55 +0100 -Subject: [PATCH 35/78] drm/vc4: Ensure DSI is enabled for FIFO resets +Subject: [PATCH 35/85] drm/vc4: Ensure DSI is enabled for FIFO resets The block must be enabled for the FIFO resets to be actioned, so ensure this is the case. @@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index 1eba498d276f..de963edefb76 100644 +index 1eba498d276f8..de963edefb760 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -400,7 +400,8 @@ diff --git a/patches/linux/6.18.55/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch b/patches/linux/6.18.55/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch index 4418dc762..4b6ec1846 100644 --- a/patches/linux/6.18.55/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch +++ b/patches/linux/6.18.55/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch @@ -1,7 +1,7 @@ From 2f6f4f9db2f1a65c8b445dc44fce4fe3b7e82755 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 26 May 2022 18:56:19 +0100 -Subject: [PATCH 36/78] drm: vc4: Reset DSI AFE on disable +Subject: [PATCH 36/85] drm: vc4: Reset DSI AFE on disable vc4_dsi_bridge_disable wasn't resetting things during shutdown, so add that in. @@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 20 insertions(+) diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index de963edefb76..9756821ebf27 100644 +index de963edefb760..9756821ebf27c 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -360,6 +360,16 @@ diff --git a/patches/linux/6.18.55/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch b/patches/linux/6.18.55/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch index b8ce8fd24..9f407c1bf 100644 --- a/patches/linux/6.18.55/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch +++ b/patches/linux/6.18.55/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch @@ -1,7 +1,7 @@ From 985a117c1a98da834b30c3a698675191341b53e1 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 20 Nov 2024 13:58:08 +0000 -Subject: [PATCH 37/78] drm: vc4: dsi: Handle the different command FIFO widths +Subject: [PATCH 37/85] drm: vc4: dsi: Handle the different command FIFO widths DSI0 and DSI1 have different widths for the command FIFO (24bit vs 32bit), but the driver was assuming the 32bit width of DSI1 @@ -17,7 +17,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 44 insertions(+), 20 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c -index 9756821ebf27..b1cc30b8aa79 100644 +index 9756821ebf27c..b1cc30b8aa797 100644 --- a/drivers/gpu/drm/vc4/vc4_dsi.c +++ b/drivers/gpu/drm/vc4/vc4_dsi.c @@ -44,7 +44,6 @@ diff --git a/patches/linux/6.18.55/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch b/patches/linux/6.18.55/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch index e27586d0a..9cd9dcc70 100644 --- a/patches/linux/6.18.55/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch +++ b/patches/linux/6.18.55/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch @@ -1,7 +1,7 @@ From 3eb94e911cb22e62435f70b33b515e93a5697e5d Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 17:37:00 +0000 -Subject: [PATCH 38/78] drm/bridge: tc358762: Program the DPI mode into the +Subject: [PATCH 38/85] drm/bridge: tc358762: Program the DPI mode into the chip The autodetection of resolution/timing by the TC358762 can lead @@ -16,7 +16,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 15 insertions(+) diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c -index 98df3e667d4a..73b169026e63 100644 +index 98df3e667d4aa..73b169026e63b 100644 --- a/drivers/gpu/drm/bridge/tc358762.c +++ b/drivers/gpu/drm/bridge/tc358762.c @@ -53,6 +53,12 @@ diff --git a/patches/linux/6.18.55/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch b/patches/linux/6.18.55/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch index 32e36366b..d30ca6ace 100644 --- a/patches/linux/6.18.55/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch +++ b/patches/linux/6.18.55/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch @@ -1,7 +1,7 @@ From e4d2f293250646a8109932ce816acfa1434cfc1c Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 18:44:49 +0000 -Subject: [PATCH 39/78] drm/bridge: tc358762: revert move ops to enable +Subject: [PATCH 39/85] drm/bridge: tc358762: revert move ops to enable Reverts 8a4b2fc9c91a ("drm/bridge: tc358762: Split register programming from pre-enable to enable") as we want the config commands sent before video starts. @@ -12,7 +12,7 @@ Signed-off-by: Dave Stevenson 1 file changed, 10 deletions(-) diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c -index 73b169026e63..6164932edfec 100644 +index 73b169026e63b..6164932edfec9 100644 --- a/drivers/gpu/drm/bridge/tc358762.c +++ b/drivers/gpu/drm/bridge/tc358762.c @@ -202,15 +202,6 @@ static void tc358762_pre_enable(struct drm_bridge *bridge, diff --git a/patches/linux/6.18.55/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch b/patches/linux/6.18.55/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch index 702d2e779..aa5324889 100644 --- a/patches/linux/6.18.55/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch +++ b/patches/linux/6.18.55/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch @@ -1,7 +1,7 @@ From 0a1c5fc25afd628b5547348a4a65b1764f53f287 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Sat, 4 Apr 2026 18:04:19 +0200 -Subject: [PATCH 40/78] drm/bridge: tc358762: Set pre_enabled on pre_enable to +Subject: [PATCH 40/85] drm/bridge: tc358762: Set pre_enabled on pre_enable to prevent regulator imbalance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -16,7 +16,7 @@ Signed-off-by: Mattias Walström 1 file changed, 2 insertions(+) diff --git a/drivers/gpu/drm/bridge/tc358762.c b/drivers/gpu/drm/bridge/tc358762.c -index 6164932edfec..8da66b06d6b6 100644 +index 6164932edfec9..8da66b06d6b63 100644 --- a/drivers/gpu/drm/bridge/tc358762.c +++ b/drivers/gpu/drm/bridge/tc358762.c @@ -205,6 +205,8 @@ static void tc358762_pre_enable(struct drm_bridge *bridge, diff --git a/patches/linux/6.18.55/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch b/patches/linux/6.18.55/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch index fd33eebc3..412e8f333 100644 --- a/patches/linux/6.18.55/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch +++ b/patches/linux/6.18.55/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch @@ -1,7 +1,7 @@ From 384c6992b3b1e67d6515d00f20ac03a4deb2d3e9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 5 Apr 2026 11:33:00 +0200 -Subject: [PATCH 41/78] net/pcs: add standalone PCS registration infrastructure +Subject: [PATCH 41/85] net/pcs: add standalone PCS registration infrastructure Add a simple registration mechanism that allows platform PCS drivers to register their phylink_pcs instances, and consumers (e.g. Ethernet MAC @@ -22,7 +22,7 @@ Based on work by Daniel Golle . create mode 100644 include/linux/pcs/pcs-standalone.h diff --git a/drivers/net/pcs/Kconfig b/drivers/net/pcs/Kconfig -index ecbc3530e780..f6b4de7f972c 100644 +index ecbc3530e780c..f6b4de7f972cc 100644 --- a/drivers/net/pcs/Kconfig +++ b/drivers/net/pcs/Kconfig @@ -5,6 +5,10 @@ @@ -37,7 +37,7 @@ index ecbc3530e780..f6b4de7f972c 100644 tristate "Synopsys DesignWare Ethernet XPCS" select PHYLINK diff --git a/drivers/net/pcs/Makefile b/drivers/net/pcs/Makefile -index 4f7920618b90..0cb0057f2b8e 100644 +index 4f7920618b900..0cb0057f2b8e6 100644 --- a/drivers/net/pcs/Makefile +++ b/drivers/net/pcs/Makefile @@ -4,6 +4,7 @@ @@ -50,7 +50,7 @@ index 4f7920618b90..0cb0057f2b8e 100644 obj-$(CONFIG_PCS_MTK_LYNXI) += pcs-mtk-lynxi.o diff --git a/drivers/net/pcs/pcs-standalone.c b/drivers/net/pcs/pcs-standalone.c new file mode 100644 -index 000000000000..f7b46de59636 +index 0000000000000..f7b46de59636c --- /dev/null +++ b/drivers/net/pcs/pcs-standalone.c @@ -0,0 +1,95 @@ @@ -151,7 +151,7 @@ index 000000000000..f7b46de59636 +MODULE_LICENSE("GPL"); diff --git a/include/linux/pcs/pcs-standalone.h b/include/linux/pcs/pcs-standalone.h new file mode 100644 -index 000000000000..520835cdeee8 +index 0000000000000..520835cdeee83 --- /dev/null +++ b/include/linux/pcs/pcs-standalone.h @@ -0,0 +1,26 @@ diff --git a/patches/linux/6.18.55/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch b/patches/linux/6.18.55/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch index ae942d64f..26c76f14b 100644 --- a/patches/linux/6.18.55/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch +++ b/patches/linux/6.18.55/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch @@ -1,7 +1,7 @@ From 93142130e7b12203fb7b8c421bc5c4f3a6c065e7 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:14:23 +0200 -Subject: [PATCH 42/78] net/pcs: add MediaTek MT7988 USXGMII PCS driver +Subject: [PATCH 42/85] net/pcs: add MediaTek MT7988 USXGMII PCS driver Add a PCS driver for the USXGMII subsystem found in the MediaTek MT7988 SoC (usxgmiisys0 at 0x10080000, usxgmiisys1 at 0x10081000). The hardware @@ -27,7 +27,7 @@ Daniel Golle . create mode 100644 drivers/net/pcs/pcs-mtk-usxgmii.c diff --git a/drivers/net/pcs/Kconfig b/drivers/net/pcs/Kconfig -index f6b4de7f972c..563c12d6aa9c 100644 +index f6b4de7f972cc..563c12d6aa9cf 100644 --- a/drivers/net/pcs/Kconfig +++ b/drivers/net/pcs/Kconfig @@ -29,6 +29,16 @@ config PCS_MTK_LYNXI @@ -48,7 +48,7 @@ index f6b4de7f972c..563c12d6aa9c 100644 tristate "Renesas RZ/N1, RZ/N2H, RZ/T2H MII converter" depends on OF diff --git a/drivers/net/pcs/Makefile b/drivers/net/pcs/Makefile -index 0cb0057f2b8e..b876cb2157b1 100644 +index 0cb0057f2b8e6..b876cb2157b15 100644 --- a/drivers/net/pcs/Makefile +++ b/drivers/net/pcs/Makefile @@ -8,4 +8,5 @@ obj-$(CONFIG_PCS_STANDALONE) += pcs-standalone.o @@ -59,7 +59,7 @@ index 0cb0057f2b8e..b876cb2157b1 100644 obj-$(CONFIG_PCS_RZN1_MIIC) += pcs-rzn1-miic.o diff --git a/drivers/net/pcs/pcs-mtk-usxgmii.c b/drivers/net/pcs/pcs-mtk-usxgmii.c new file mode 100644 -index 000000000000..f0e7d418db38 +index 0000000000000..f0e7d418db388 --- /dev/null +++ b/drivers/net/pcs/pcs-mtk-usxgmii.c @@ -0,0 +1,394 @@ diff --git a/patches/linux/6.18.55/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch b/patches/linux/6.18.55/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch index 82352f2fd..16f51b203 100644 --- a/patches/linux/6.18.55/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch +++ b/patches/linux/6.18.55/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch @@ -1,7 +1,7 @@ From 54ba118cc31f35998a57a2b12809037fc675ad61 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:43 +0200 -Subject: [PATCH 43/78] net: ethernet: mediatek: add USXGMII support for MT7988 +Subject: [PATCH 43/85] net: ethernet: mediatek: add USXGMII support for MT7988 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -33,7 +33,7 @@ Daniel Golle . 3 files changed, 139 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mediatek/mtk_eth_path.c b/drivers/net/ethernet/mediatek/mtk_eth_path.c -index b4c01e2878f6..57380776032a 100644 +index b4c01e2878f6f..57380776032a7 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_path.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_path.c @@ -37,6 +37,12 @@ static const char *mtk_eth_path_name(u64 path) @@ -126,7 +126,7 @@ index b4c01e2878f6..57380776032a 100644 +} + diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c -index 3f43e487d887..37ff40b09815 100644 +index 3f43e487d8875..37ff40b098157 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c @@ -22,6 +22,7 @@ @@ -211,7 +211,7 @@ index 3f43e487d887..37ff40b09815 100644 mac_ops = &rt5350_phylink_ops; diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -index 88a9b3b23bea..340ecb824f59 100644 +index 88a9b3b23bea5..340ecb824f59a 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h @@ -567,6 +567,7 @@ diff --git a/patches/linux/6.18.55/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch b/patches/linux/6.18.55/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch index 1d2a19627..45485c302 100644 --- a/patches/linux/6.18.55/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch +++ b/patches/linux/6.18.55/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch @@ -1,7 +1,7 @@ From 262f24d9ace1f68b30a1e6f1728be00300addf2e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:56 +0200 -Subject: [PATCH 44/78] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes +Subject: [PATCH 44/85] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes Add device nodes for the two USXGMII subsystem blocks (usxgmiisys0 at 0x10080000 and usxgmiisys1 at 0x10081000), each referencing its clock, @@ -14,7 +14,7 @@ property, so the Ethernet driver can discover the PCS at probe time. 1 file changed, 20 insertions(+) diff --git a/arch/arm64/boot/dts/mediatek/mt7988a.dtsi b/arch/arm64/boot/dts/mediatek/mt7988a.dtsi -index 366203a72d6d..5ae43390f6c2 100644 +index 366203a72d6d2..5ae43390f6c2c 100644 --- a/arch/arm64/boot/dts/mediatek/mt7988a.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7988a.dtsi @@ -708,6 +708,24 @@ xfi_pll: clock-controller@11f40000 { diff --git a/patches/linux/6.18.55/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch b/patches/linux/6.18.55/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch index 7b74dcb09..b66d8c938 100644 --- a/patches/linux/6.18.55/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch +++ b/patches/linux/6.18.55/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch @@ -1,7 +1,7 @@ From 4ef35eea0eaca6789595196ca8399154ba53f034 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:16:11 +0200 -Subject: [PATCH 45/78] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ +Subject: [PATCH 45/85] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ ports and WPS button Enable the SFP+ cages wired to gmac1 and gmac2. The USXGMII PCS nodes @@ -25,7 +25,7 @@ Signed-off-by: Joachim Wiberg 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dts b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dts -index 4b3796ba82e3..499f0c91c213 100644 +index 4b3796ba82e36..499f0c91c2137 100644 --- a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dts +++ b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dts @@ -27,6 +27,7 @@ &gmac1 { @@ -37,7 +37,7 @@ index 4b3796ba82e3..499f0c91c213 100644 &pca9545 { diff --git a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dtsi b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dtsi -index 0ff69dae45d3..2a904a76f3fe 100644 +index 0ff69dae45d32..2a904a76f3fe3 100644 --- a/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dtsi +++ b/arch/arm64/boot/dts/mediatek/mt7988a-bananapi-bpi-r4.dtsi @@ -3,9 +3,9 @@ diff --git a/patches/linux/6.18.55/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch b/patches/linux/6.18.55/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch index c0c5676a2..40e23464c 100644 --- a/patches/linux/6.18.55/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch +++ b/patches/linux/6.18.55/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch @@ -1,7 +1,7 @@ From 81a4f7212dc829bf60e7c96bcae2317d5545a428 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 7 Apr 2026 07:34:52 +0200 -Subject: [PATCH 46/78] net: phy: sfp: add OEM SFP-10G-T-I quirk +Subject: [PATCH 46/85] net: phy: sfp: add OEM SFP-10G-T-I quirk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -26,7 +26,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 11 insertions(+) diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c -index af43530ffb2c..15a4b67ece2c 100644 +index af43530ffb2c3..15a4b67ece2cb 100644 --- a/drivers/net/phy/sfp.c +++ b/drivers/net/phy/sfp.c @@ -451,6 +451,16 @@ static void sfp_fixup_rollball_cc(struct sfp *sfp) diff --git a/patches/linux/6.18.55/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch b/patches/linux/6.18.55/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch index a42c7ec9c..5d89850e3 100644 --- a/patches/linux/6.18.55/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch +++ b/patches/linux/6.18.55/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch @@ -1,7 +1,7 @@ From d2cf171d24e9d08ad6a3bb43ad6790c4e03b3626 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 17 Apr 2026 09:13:04 +0000 -Subject: [PATCH 47/78] net: dsa: mv88e6xxx: Trap PTP frames on timestamping +Subject: [PATCH 47/85] net: dsa: mv88e6xxx: Trap PTP frames on timestamping ports, on 6393X Similar to the Peridot (6390), the designation of PTP frames as @@ -23,7 +23,7 @@ a port. 7 files changed, 67 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index f0a662e9b847..54bf531fcc35 100644 +index f0a662e9b8477..54bf531fcc35c 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -5700,7 +5700,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = { @@ -36,7 +36,7 @@ index f0a662e9b847..54bf531fcc35 100644 .pcs_ops = &mv88e6393x_pcs_ops, }; diff --git a/drivers/net/dsa/mv88e6xxx/hwtstamp.c b/drivers/net/dsa/mv88e6xxx/hwtstamp.c -index 6e6472a3b75a..446e1c616752 100644 +index 6e6472a3b75ad..446e1c616752d 100644 --- a/drivers/net/dsa/mv88e6xxx/hwtstamp.c +++ b/drivers/net/dsa/mv88e6xxx/hwtstamp.c @@ -13,6 +13,7 @@ @@ -80,7 +80,7 @@ index 6e6472a3b75a..446e1c616752 100644 { const struct mv88e6xxx_ptp_ops *ptp_ops = chip->info->ops->ptp_ops; diff --git a/drivers/net/dsa/mv88e6xxx/hwtstamp.h b/drivers/net/dsa/mv88e6xxx/hwtstamp.h -index c359821d5a6e..c51cd1ab2978 100644 +index c359821d5a6ea..c51cd1ab29788 100644 --- a/drivers/net/dsa/mv88e6xxx/hwtstamp.h +++ b/drivers/net/dsa/mv88e6xxx/hwtstamp.h @@ -129,6 +129,8 @@ int mv88e6xxx_hwtstamp_setup(struct mv88e6xxx_chip *chip); @@ -93,7 +93,7 @@ index c359821d5a6e..c51cd1ab2978 100644 int mv88e6165_global_disable(struct mv88e6xxx_chip *chip); diff --git a/drivers/net/dsa/mv88e6xxx/port.c b/drivers/net/dsa/mv88e6xxx/port.c -index 1985b8553611..843972077576 100644 +index 1985b85536112..843972077576c 100644 --- a/drivers/net/dsa/mv88e6xxx/port.c +++ b/drivers/net/dsa/mv88e6xxx/port.c @@ -1484,6 +1484,16 @@ int mv88e6393x_port_set_upstream_port(struct mv88e6xxx_chip *chip, int port, @@ -114,7 +114,7 @@ index 1985b8553611..843972077576 100644 { u16 ptr; diff --git a/drivers/net/dsa/mv88e6xxx/port.h b/drivers/net/dsa/mv88e6xxx/port.h -index f4a56671fc4c..5f733f84b348 100644 +index f4a56671fc4c2..5f733f84b3481 100644 --- a/drivers/net/dsa/mv88e6xxx/port.h +++ b/drivers/net/dsa/mv88e6xxx/port.h @@ -283,6 +283,8 @@ @@ -136,7 +136,7 @@ index f4a56671fc4c..5f733f84b348 100644 int mv88e6xxx_port_set_message_port(struct mv88e6xxx_chip *chip, int port, bool message_port); diff --git a/drivers/net/dsa/mv88e6xxx/ptp.c b/drivers/net/dsa/mv88e6xxx/ptp.c -index f7603573d3a9..327a9f786437 100644 +index f7603573d3a98..327a9f786437a 100644 --- a/drivers/net/dsa/mv88e6xxx/ptp.c +++ b/drivers/net/dsa/mv88e6xxx/ptp.c @@ -444,6 +444,29 @@ const struct mv88e6xxx_ptp_ops mv88e6390_ptp_ops = { @@ -170,7 +170,7 @@ index f7603573d3a9..327a9f786437 100644 { struct mv88e6xxx_chip *chip = cc_to_chip(cc); diff --git a/drivers/net/dsa/mv88e6xxx/ptp.h b/drivers/net/dsa/mv88e6xxx/ptp.h -index 95bdddb0bf39..54dce1fbf1aa 100644 +index 95bdddb0bf39f..54dce1fbf1aa2 100644 --- a/drivers/net/dsa/mv88e6xxx/ptp.h +++ b/drivers/net/dsa/mv88e6xxx/ptp.h @@ -75,6 +75,7 @@ void mv88e6xxx_ptp_free(struct mv88e6xxx_chip *chip); diff --git a/patches/linux/6.18.55/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch b/patches/linux/6.18.55/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch index fc12fd035..1f5095f3c 100644 --- a/patches/linux/6.18.55/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch +++ b/patches/linux/6.18.55/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch @@ -1,7 +1,7 @@ From b6ad175129b948b44460af7ef7701e244e3a3b55 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 28 Apr 2026 15:30:01 +0200 -Subject: [PATCH 48/78] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 +Subject: [PATCH 48/85] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 wmac Without MODULE_DEVICE_TABLE(of, ...) the OF compatible alias is never @@ -15,7 +15,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 1 insertion(+) diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/soc.c b/drivers/net/wireless/mediatek/mt76/mt7615/soc.c -index 06a0f2a141e8..538ea1dc333b 100644 +index 06a0f2a141e8c..538ea1dc333b0 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7615/soc.c +++ b/drivers/net/wireless/mediatek/mt76/mt7615/soc.c @@ -56,6 +56,7 @@ static const struct of_device_id mt7622_wmac_of_match[] = { diff --git a/patches/linux/6.18.55/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch b/patches/linux/6.18.55/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch index dddc27bc9..db7ed667c 100644 --- a/patches/linux/6.18.55/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch +++ b/patches/linux/6.18.55/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch @@ -1,7 +1,7 @@ From eb6bf2a9d6967617eea9b242603e0352f3856a00 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 22 Apr 2026 10:24:43 +0200 -Subject: [PATCH 49/78] PCI: mediatek-gen3: Fix PERST# control timing during +Subject: [PATCH 49/85] PCI: mediatek-gen3: Fix PERST# control timing during system startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -30,7 +30,7 @@ PERST# control timing during system startup"). 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/drivers/pci/controller/pcie-mediatek-gen3.c b/drivers/pci/controller/pcie-mediatek-gen3.c -index e45c43ccc84c..af84bc63bcad 100644 +index e45c43ccc84c2..af84bc63bcad5 100644 --- a/drivers/pci/controller/pcie-mediatek-gen3.c +++ b/drivers/pci/controller/pcie-mediatek-gen3.c @@ -479,16 +479,35 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie) diff --git a/patches/linux/6.18.55/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch b/patches/linux/6.18.55/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch index 0cb957ef3..83925d02a 100644 --- a/patches/linux/6.18.55/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch +++ b/patches/linux/6.18.55/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch @@ -1,7 +1,7 @@ From ebaca6761deffa22bf18f0dfda287fa0e3210694 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 12 Aug 2026 10:08:53 +0200 -Subject: [PATCH 50/78] net: dsa: mv88e6xxx: Derive LED names from device name +Subject: [PATCH 50/85] net: dsa: mv88e6xxx: Derive LED names from device name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -16,7 +16,7 @@ Signed-off-by: Mattias Walström 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/net/dsa/mv88e6xxx/leds.c b/drivers/net/dsa/mv88e6xxx/leds.c -index 7c5904300849..2c09c37be077 100644 +index 7c59043008494..2c09c37be077b 100644 --- a/drivers/net/dsa/mv88e6xxx/leds.c +++ b/drivers/net/dsa/mv88e6xxx/leds.c @@ -874,8 +874,8 @@ int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port) diff --git a/patches/linux/6.18.55/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch b/patches/linux/6.18.55/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch index 04e64f390..b1eca32d3 100644 --- a/patches/linux/6.18.55/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch +++ b/patches/linux/6.18.55/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch @@ -1,7 +1,7 @@ From 4706c45681cda924ab8eaf9015be7a911c15c183 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 31 Oct 2025 13:18:12 +0100 -Subject: [PATCH 51/78] phy: sparx5-serdes: make it selectable for ARCH_LAN969X +Subject: [PATCH 51/85] phy: sparx5-serdes: make it selectable for ARCH_LAN969X LAN969x uses the SparX-5 SERDES driver, so make it selectable for ARCH_LAN969X. @@ -18,7 +18,7 @@ Signed-off-by: Vinod Koul 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/phy/microchip/Kconfig b/drivers/phy/microchip/Kconfig -index 2f0045e874ac..2e6d1224711e 100644 +index 2f0045e874ac8..2e6d1224711e3 100644 --- a/drivers/phy/microchip/Kconfig +++ b/drivers/phy/microchip/Kconfig @@ -6,7 +6,7 @@ diff --git a/patches/linux/6.18.55/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch b/patches/linux/6.18.55/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch index 2ac52662f..bcd6f677d 100644 --- a/patches/linux/6.18.55/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch +++ b/patches/linux/6.18.55/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch @@ -1,7 +1,7 @@ From 30f7485ae40aaad3d66606c49c196c28d65983ae Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:38 +0200 -Subject: [PATCH 52/78] net: sparx5: fix wrong chip ids for TSN SKUs +Subject: [PATCH 52/85] net: sparx5: fix wrong chip ids for TSN SKUs The TSN SKUs in enum spx5_target_chiptype have incorrect IDs: @@ -30,7 +30,7 @@ Signed-off-by: Jakub Kicinski 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h -index fe7d8bcc0cd9..2f1b50ba8ad3 100644 +index fe7d8bcc0cd99..2f1b50ba8ad34 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h @@ -31,11 +31,11 @@ enum spx5_target_chiptype { diff --git a/patches/linux/6.18.55/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch b/patches/linux/6.18.55/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch index 63e7c6fab..3d389bdf1 100644 --- a/patches/linux/6.18.55/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch +++ b/patches/linux/6.18.55/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch @@ -1,7 +1,7 @@ From 1ac619e910f3911443963cd2359dd89958213313 Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:39 +0200 -Subject: [PATCH 53/78] net: sparx5: configure serdes for 1000BASE-X in +Subject: [PATCH 53/85] net: sparx5: configure serdes for 1000BASE-X in sparx5_port_init() sparx5_port_init() only invokes sparx5_serdes_set() and the associated @@ -28,7 +28,7 @@ Signed-off-by: Jakub Kicinski 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_port.c b/drivers/net/ethernet/microchip/sparx5/sparx5_port.c -index 04bc8fffaf96..62c49893de3c 100644 +index 04bc8fffaf961..62c49893de3c3 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_port.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_port.c @@ -1128,7 +1128,8 @@ int sparx5_port_init(struct sparx5 *sparx5, diff --git a/patches/linux/6.18.55/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch b/patches/linux/6.18.55/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch index 856b42976..cdb28df9e 100644 --- a/patches/linux/6.18.55/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch +++ b/patches/linux/6.18.55/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch @@ -1,7 +1,7 @@ From 7fe972637a8ffbdf55391e7f6927649a50caae9a Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:29 +0200 -Subject: [PATCH 54/78] dt-bindings: mmc: atmel,sama5d2-sdhci: add +Subject: [PATCH 54/85] dt-bindings: mmc: atmel,sama5d2-sdhci: add microchip,lan969x-sdhci The LAN969x SDMMC controller has its own base clock divider and, unlike @@ -15,7 +15,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mmc/atmel,sama5d2-sdhci.yaml b/Documentation/devicetree/bindings/mmc/atmel,sama5d2-sdhci.yaml -index ba75623b7778..860e6736e2eb 100644 +index ba75623b7778b..860e6736e2eb9 100644 --- a/Documentation/devicetree/bindings/mmc/atmel,sama5d2-sdhci.yaml +++ b/Documentation/devicetree/bindings/mmc/atmel,sama5d2-sdhci.yaml @@ -18,6 +18,7 @@ properties: diff --git a/patches/linux/6.18.55/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch b/patches/linux/6.18.55/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch index eabf5693f..ce9477f2e 100644 --- a/patches/linux/6.18.55/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch +++ b/patches/linux/6.18.55/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch @@ -1,7 +1,7 @@ From 7b461e9b726584d2d4cc908a6120138504e52127 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:44 +0200 -Subject: [PATCH 55/78] mmc: sdhci-of-at91: add LAN969x support +Subject: [PATCH 55/85] mmc: sdhci-of-at91: add LAN969x support The LAN969x SDMMC controller is an Atmel SDMMC IP block, but the driver has no compatible for it, so the eMMC on LAN969x boards never probes. @@ -18,7 +18,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c -index 7c4ac65f247d..5dcb88cba0d9 100644 +index 7c4ac65f247d3..5dcb88cba0d9c 100644 --- a/drivers/mmc/host/sdhci-of-at91.c +++ b/drivers/mmc/host/sdhci-of-at91.c @@ -39,6 +39,9 @@ struct sdhci_at91_soc_data { diff --git a/patches/linux/6.18.55/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch b/patches/linux/6.18.55/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch index eb4ceed8e..07b5c0f70 100644 --- a/patches/linux/6.18.55/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch +++ b/patches/linux/6.18.55/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch @@ -1,7 +1,7 @@ From a55cfe74da903a95ff10f6f3659f6e4d26eb5a13 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:37:48 +0200 -Subject: [PATCH 56/78] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC +Subject: [PATCH 56/85] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC hardware reset The controller is reset, and its signaling mode changed, with SDCLK @@ -20,7 +20,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 50 insertions(+) diff --git a/drivers/mmc/host/sdhci-of-at91.c b/drivers/mmc/host/sdhci-of-at91.c -index 5dcb88cba0d9..6a9e4a7fa705 100644 +index 5dcb88cba0d9c..6a9e4a7fa705f 100644 --- a/drivers/mmc/host/sdhci-of-at91.c +++ b/drivers/mmc/host/sdhci-of-at91.c @@ -25,6 +25,7 @@ diff --git a/patches/linux/6.18.55/0057-net-sparx5-lan969x-populate-netdev-of_node.patch b/patches/linux/6.18.55/0057-net-sparx5-lan969x-populate-netdev-of_node.patch index 396a1cb41..25e045038 100644 --- a/patches/linux/6.18.55/0057-net-sparx5-lan969x-populate-netdev-of_node.patch +++ b/patches/linux/6.18.55/0057-net-sparx5-lan969x-populate-netdev-of_node.patch @@ -1,7 +1,7 @@ From 0f61d1e5c4910ed9cd79fb1b3ebccae2d69498d3 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 10 Nov 2025 13:42:53 +0100 -Subject: [PATCH 57/78] net: sparx5/lan969x: populate netdev of_node +Subject: [PATCH 57/85] net: sparx5/lan969x: populate netdev of_node Populate of_node for the port netdevs, to make the individual ports of_nodes available in sysfs. @@ -15,7 +15,7 @@ Signed-off-by: Jakub Kicinski 1 file changed, 2 insertions(+) diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c -index 40b1bfc600a7..582145713cfd 100644 +index 40b1bfc600a79..582145713cfd1 100644 --- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c @@ -395,6 +395,8 @@ static int sparx5_create_port(struct sparx5 *sparx5, diff --git a/patches/linux/6.18.55/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch b/patches/linux/6.18.55/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch index db7c9cedb..10c362cf3 100644 --- a/patches/linux/6.18.55/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch +++ b/patches/linux/6.18.55/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch @@ -1,7 +1,7 @@ From 3bf84f8d8dcbd2c444ba8249ee5789941def7215 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:11 +0100 -Subject: [PATCH 58/78] arm64: dts: microchip: add LAN969x clock header file +Subject: [PATCH 58/85] arm64: dts: microchip: add LAN969x clock header file LAN969x uses hardware clock indexes, so document theses in a header to make them humanly readable. @@ -18,7 +18,7 @@ Signed-off-by: Claudiu Beznea diff --git a/arch/arm64/boot/dts/microchip/clk-lan9691.h b/arch/arm64/boot/dts/microchip/clk-lan9691.h new file mode 100644 -index 000000000000..0f2d7a0f881e +index 0000000000000..0f2d7a0f881ef --- /dev/null +++ b/arch/arm64/boot/dts/microchip/clk-lan9691.h @@ -0,0 +1,24 @@ diff --git a/patches/linux/6.18.55/0059-arm64-dts-microchip-add-LAN969x-support.patch b/patches/linux/6.18.55/0059-arm64-dts-microchip-add-LAN969x-support.patch index 8fa346b04..efed775ed 100644 --- a/patches/linux/6.18.55/0059-arm64-dts-microchip-add-LAN969x-support.patch +++ b/patches/linux/6.18.55/0059-arm64-dts-microchip-add-LAN969x-support.patch @@ -1,7 +1,7 @@ From 2783fbf634082295b24d8573ce91ea33017bb7b8 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:12 +0100 -Subject: [PATCH 59/78] arm64: dts: microchip: add LAN969x support +Subject: [PATCH 59/85] arm64: dts: microchip: add LAN969x support Add support for Microchip LAN969x switch SoC series by adding the SoC DTSI. @@ -18,7 +18,7 @@ Signed-off-by: Claudiu Beznea diff --git a/arch/arm64/boot/dts/microchip/lan9691.dtsi b/arch/arm64/boot/dts/microchip/lan9691.dtsi new file mode 100644 -index 000000000000..235e56bebbdb +index 0000000000000..235e56bebbdbb --- /dev/null +++ b/arch/arm64/boot/dts/microchip/lan9691.dtsi @@ -0,0 +1,488 @@ diff --git a/patches/linux/6.18.55/0060-arm64-dts-microchip-add-EV23X71A-board.patch b/patches/linux/6.18.55/0060-arm64-dts-microchip-add-EV23X71A-board.patch index 84e3ff4d0..53249212e 100644 --- a/patches/linux/6.18.55/0060-arm64-dts-microchip-add-EV23X71A-board.patch +++ b/patches/linux/6.18.55/0060-arm64-dts-microchip-add-EV23X71A-board.patch @@ -1,7 +1,7 @@ From 129276c0d1704ca77d786d6aa300913b28d92e1f Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:14 +0100 -Subject: [PATCH 60/78] arm64: dts: microchip: add EV23X71A board +Subject: [PATCH 60/85] arm64: dts: microchip: add EV23X71A board Microchip EV23X71A is an LAN9696 based evaluation board. @@ -19,7 +19,7 @@ Signed-off-by: Claudiu Beznea create mode 100644 arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts diff --git a/arch/arm64/boot/dts/microchip/Makefile b/arch/arm64/boot/dts/microchip/Makefile -index c6e0313eea0f..09d16fc1ce9a 100644 +index c6e0313eea0f9..09d16fc1ce9ac 100644 --- a/arch/arm64/boot/dts/microchip/Makefile +++ b/arch/arm64/boot/dts/microchip/Makefile @@ -1,4 +1,5 @@ @@ -30,7 +30,7 @@ index c6e0313eea0f..09d16fc1ce9a 100644 dtb-$(CONFIG_ARCH_SPARX5) += sparx5_pcb135.dtb sparx5_pcb135_emmc.dtb diff --git a/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts b/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts new file mode 100644 -index 000000000000..4012ea7d07bb +index 0000000000000..4012ea7d07bbd --- /dev/null +++ b/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts @@ -0,0 +1,756 @@ diff --git a/patches/linux/6.18.55/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch b/patches/linux/6.18.55/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch index 040b0870d..cb56918be 100644 --- a/patches/linux/6.18.55/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch +++ b/patches/linux/6.18.55/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch @@ -1,7 +1,7 @@ From 6f418f0c5d3dd1ca1d431e23d8149413c5aa8f9a Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 15 May 2026 13:59:09 +0200 -Subject: [PATCH 61/78] arm64: dts: microchip: lan969x: add OTP node +Subject: [PATCH 61/85] arm64: dts: microchip: lan969x: add OTP node Add the required OTP on LAN969x. @@ -15,7 +15,7 @@ Signed-off-by: Claudiu Beznea 1 file changed, 5 insertions(+) diff --git a/arch/arm64/boot/dts/microchip/lan9691.dtsi b/arch/arm64/boot/dts/microchip/lan9691.dtsi -index 235e56bebbdb..ed997d87dd09 100644 +index 235e56bebbdbb..ed997d87dd09f 100644 --- a/arch/arm64/boot/dts/microchip/lan9691.dtsi +++ b/arch/arm64/boot/dts/microchip/lan9691.dtsi @@ -100,6 +100,11 @@ usb: usb@300000 { diff --git a/patches/linux/6.18.55/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch b/patches/linux/6.18.55/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch index fcfa1253d..ed293687e 100644 --- a/patches/linux/6.18.55/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch +++ b/patches/linux/6.18.55/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch @@ -1,7 +1,7 @@ From a49eecdbfa8d6daa61c5baa4d2ebf3d006358fcb Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 62/78] arm64: dts: microchip: lan969x: add SDMMC nodes +Subject: [PATCH 62/85] arm64: dts: microchip: lan969x: add SDMMC nodes The SoC has two SDMMC controllers, neither of which is described, so boards with eMMC have no way to enable it. Add both, disabled by @@ -13,7 +13,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 22 insertions(+) diff --git a/arch/arm64/boot/dts/microchip/lan9691.dtsi b/arch/arm64/boot/dts/microchip/lan9691.dtsi -index ed997d87dd09..59a19462a5db 100644 +index ed997d87dd09f..59a19462a5db5 100644 --- a/arch/arm64/boot/dts/microchip/lan9691.dtsi +++ b/arch/arm64/boot/dts/microchip/lan9691.dtsi @@ -396,6 +396,28 @@ clks: clock-controller@e00c00b4 { diff --git a/patches/linux/6.18.55/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch b/patches/linux/6.18.55/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch index 8b2a898d8..340261fed 100644 --- a/patches/linux/6.18.55/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch +++ b/patches/linux/6.18.55/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch @@ -1,7 +1,7 @@ From 8dd67f639beee3bbe5c8992d0314b40ad46bb726 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 63/78] arm64: dts: microchip: ev23x71a: enable eMMC +Subject: [PATCH 63/85] arm64: dts: microchip: ev23x71a: enable eMMC The board has an 8-bit eMMC on SDMMC0, and defines the emmc_sd pinctrl group for it, but nothing enables the controller. @@ -12,7 +12,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 11 insertions(+) diff --git a/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts b/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts -index 4012ea7d07bb..7f12fc5c321f 100644 +index 4012ea7d07bbd..7f12fc5c321fe 100644 --- a/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts +++ b/arch/arm64/boot/dts/microchip/lan9696-ev23x71a.dts @@ -463,6 +463,17 @@ phy27: phy@27 { diff --git a/patches/linux/6.18.55/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch b/patches/linux/6.18.55/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch index 8c224bce4..4ca7f245e 100644 --- a/patches/linux/6.18.55/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch +++ b/patches/linux/6.18.55/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch @@ -1,7 +1,7 @@ From 10d713882efe78b7be0dbda7e469ce7dd1830933 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:42:48 +0200 -Subject: [PATCH 64/78] wifi: brcmfmac: survey the requested interface, not the +Subject: [PATCH 64/85] wifi: brcmfmac: survey the requested interface, not the primary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -28,7 +28,7 @@ Signed-off-by: Mattias Walström 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 0081ceb6c782..8b245460262d 100644 +index 0081ceb6c7829..8b245460262d9 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -8124,11 +8124,11 @@ brcmf_dump_obss(struct brcmf_if *ifp, struct cca_msrmnt_query req, diff --git a/patches/linux/6.18.55/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch b/patches/linux/6.18.55/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch index 6b43d2c04..0e288e9d9 100644 --- a/patches/linux/6.18.55/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch +++ b/patches/linux/6.18.55/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch @@ -1,7 +1,7 @@ From 0d0351b6cb2d86eab7728fcda9a6a89489e5eb0f Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:43:14 +0200 -Subject: [PATCH 65/78] wifi: brcmfmac: honor caller's rtnl lock when stopping +Subject: [PATCH 65/85] wifi: brcmfmac: honor caller's rtnl lock when stopping primary interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -26,7 +26,7 @@ Signed-off-by: Mattias Walström 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -index 048b5d500215..b0c79b50dc9a 100644 +index 048b5d500215e..b0c79b50dc9a2 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -935,9 +935,11 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, diff --git a/patches/linux/6.18.55/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch b/patches/linux/6.18.55/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch index 8badcc793..c0fa0cd66 100644 --- a/patches/linux/6.18.55/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch +++ b/patches/linux/6.18.55/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch @@ -1,7 +1,7 @@ From 438486c55109e46bf0227704a6e28e3ccb4c751b Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:46:25 +0200 -Subject: [PATCH 66/78] wifi: brcmfmac: let cfg_to_ndev() return NULL and +Subject: [PATCH 66/85] wifi: brcmfmac: let cfg_to_ndev() return NULL and harden its callers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -47,7 +47,7 @@ Signed-off-by: Mattias Walström 5 files changed, 78 insertions(+), 20 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c -index 67c0c5a92f99..265f3f5d5307 100644 +index 67c0c5a92f998..265f3f5d53079 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c @@ -141,6 +141,9 @@ static void brcmf_btcoex_boost_wifi(struct brcmf_btcoex_info *btci, @@ -71,7 +71,7 @@ index 67c0c5a92f99..265f3f5d5307 100644 case BRCMF_BTCOEX_DISABLED: brcmf_dbg(INFO, "DHCP session starts\n"); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 8b245460262d..fd8c39254d46 100644 +index 8b245460262d9..fd8c39254d466 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -822,11 +822,18 @@ struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name, @@ -214,7 +214,7 @@ index 8b245460262d..fd8c39254d46 100644 if (err) { bphy_err(drvr, "Country code iovar returned err = %d\n", err); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h -index 273c80f2d483..ee7e9dc17dce 100644 +index 273c80f2d483a..ee7e9dc17dce0 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h @@ -433,7 +433,9 @@ static inline struct brcmf_cfg80211_vif *wdev_to_vif(struct wireless_dev *wdev) @@ -229,7 +229,7 @@ index 273c80f2d483..ee7e9dc17dce 100644 static inline struct brcmf_cfg80211_info *ndev_to_cfg(struct net_device *ndev) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -index b0c79b50dc9a..28e677660865 100644 +index b0c79b50dc9a2..28e6776608658 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -1028,8 +1028,11 @@ static int brcmf_inetaddr_changed(struct notifier_block *nb, @@ -246,7 +246,7 @@ index b0c79b50dc9a..28e677660865 100644 /* retrieve the table from firmware */ ret = brcmf_fil_iovar_data_get(ifp, "arp_hostip", addr_table, diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -index e1752a513c73..5b550e5a4e77 100644 +index e1752a513c733..5b550e5a4e77e 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c @@ -2115,8 +2115,12 @@ static int brcmf_p2p_disable_p2p_if(struct brcmf_cfg80211_vif *vif) diff --git a/patches/linux/6.18.55/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch b/patches/linux/6.18.55/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch index 8adbf256a..571312b11 100644 --- a/patches/linux/6.18.55/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch +++ b/patches/linux/6.18.55/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch @@ -1,7 +1,7 @@ From 0c6d68f2957c4a73c66a2fbe6524cf54c11ad138 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 16:05:17 +0200 -Subject: [PATCH 67/78] wifi: brcmfmac: support deletion and recreation of the +Subject: [PATCH 67/85] wifi: brcmfmac: support deletion and recreation of the primary interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -66,7 +66,7 @@ Signed-off-by: Mattias Walström 2 files changed, 174 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index fd8c39254d46..c17930471845 100644 +index fd8c39254d466..c179304718455 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -124,6 +124,9 @@ struct cca_msrmnt_query { @@ -282,7 +282,7 @@ index fd8c39254d46..c17930471845 100644 case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_AP_VLAN: diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -index 5b550e5a4e77..b1b85da83371 100644 +index 5b550e5a4e77e..b1b85da83371f 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c @@ -1156,6 +1156,8 @@ static s32 brcmf_p2p_af_searching_channel(struct brcmf_p2p_info *p2p) diff --git a/patches/linux/6.18.55/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch b/patches/linux/6.18.55/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch index 4b5aa554c..069f1de17 100644 --- a/patches/linux/6.18.55/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch +++ b/patches/linux/6.18.55/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch @@ -1,7 +1,7 @@ From e0016e70627bbd29ad17dfdcf6890d6692ad2679 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Thu, 10 Sep 2026 08:29:47 +0200 -Subject: [PATCH 68/78] wifi: brcmfmac: report port authorized after offloaded +Subject: [PATCH 68/85] wifi: brcmfmac: report port authorized after offloaded PSK/SAE handshake MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -58,7 +58,7 @@ Signed-off-by: Mattias Walström 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index c17930471845..064daf8c42ec 100644 +index c179304718455..064daf8c42ec9 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -6705,6 +6705,23 @@ brcmf_bss_connect_done(struct brcmf_cfg80211_info *cfg, diff --git a/patches/linux/6.18.55/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch b/patches/linux/6.18.55/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch index b4de3473b..e99708f31 100644 --- a/patches/linux/6.18.55/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch +++ b/patches/linux/6.18.55/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch @@ -1,7 +1,7 @@ From 87bb123eb9add21c4ed4bce67313dcc37b367079 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 9 Jan 2026 13:27:00 +0100 -Subject: [PATCH 69/78] dt-bindings: arm: AT91: document Novarq Tactical 1000 +Subject: [PATCH 69/85] dt-bindings: arm: AT91: document Novarq Tactical 1000 Novarq Tactical 1000 is a Microchip LAN9696 based 24x1G + 4x10G SFP switch. @@ -12,7 +12,7 @@ Signed-off-by: Robert Marko 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.yaml b/Documentation/devicetree/bindings/arm/atmel-at91.yaml -index 3a34b7a2e8d4..49666e92c04a 100644 +index 3a34b7a2e8d4e..49666e92c04a2 100644 --- a/Documentation/devicetree/bindings/arm/atmel-at91.yaml +++ b/Documentation/devicetree/bindings/arm/atmel-at91.yaml @@ -241,6 +241,12 @@ properties: diff --git a/patches/linux/6.18.55/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch b/patches/linux/6.18.55/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch index 783c72ff4..d91e907d3 100644 --- a/patches/linux/6.18.55/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch +++ b/patches/linux/6.18.55/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch @@ -1,7 +1,7 @@ From ded124119dbb2ad94c870b56449f12798043e63f Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Tue, 30 Sep 2025 13:37:49 +0200 -Subject: [PATCH 70/78] arm64: dts: microchip: add Novarq Tactical 1000 +Subject: [PATCH 70/85] arm64: dts: microchip: add Novarq Tactical 1000 Novarq Tactical 1000 is a LAN9696 based switch featuring 24x1G and 4x10G SFP ports. @@ -15,7 +15,7 @@ Signed-off-by: Robert Marko create mode 100644 arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts diff --git a/arch/arm64/boot/dts/microchip/Makefile b/arch/arm64/boot/dts/microchip/Makefile -index 09d16fc1ce9a..0ba970d308ec 100644 +index 09d16fc1ce9ac..0ba970d308ec4 100644 --- a/arch/arm64/boot/dts/microchip/Makefile +++ b/arch/arm64/boot/dts/microchip/Makefile @@ -1,5 +1,6 @@ @@ -27,7 +27,7 @@ index 09d16fc1ce9a..0ba970d308ec 100644 dtb-$(CONFIG_ARCH_SPARX5) += sparx5_pcb135.dtb sparx5_pcb135_emmc.dtb diff --git a/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts new file mode 100644 -index 000000000000..e9fa26e05804 +index 0000000000000..e9fa26e058047 --- /dev/null +++ b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts @@ -0,0 +1,886 @@ diff --git a/patches/linux/6.18.55/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch b/patches/linux/6.18.55/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch index 1a8306c2e..cf24674db 100644 --- a/patches/linux/6.18.55/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch +++ b/patches/linux/6.18.55/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch @@ -1,7 +1,7 @@ From aa86655cabeb7c303f3acbc59a36754d1b5383c5 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Tue, 30 Jun 2026 11:23:47 +0200 -Subject: [PATCH 71/78] arm64: dts: microchip: tactical-1000: add port names +Subject: [PATCH 71/85] arm64: dts: microchip: tactical-1000: add port names Now that driver supports parsing the "label" property, populate port names as they are physically wired up. @@ -13,7 +13,7 @@ Signed-off-by: Robert Marko 1 file changed, 29 insertions(+) diff --git a/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts -index e9fa26e05804..e7e4654af98f 100644 +index e9fa26e058047..e7e4654af98fc 100644 --- a/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts +++ b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts @@ -626,6 +626,7 @@ port0: port@0 { diff --git a/patches/linux/6.18.55/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch b/patches/linux/6.18.55/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch index 7c61c7250..e040a9903 100644 --- a/patches/linux/6.18.55/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch +++ b/patches/linux/6.18.55/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch @@ -1,7 +1,7 @@ From a5fe28d8813c1265151399c88961117e95db9c7d Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 20 Sep 2026 12:22:43 +0200 -Subject: [PATCH 72/78] arm64: dts: microchip: tactical-1000: adapt to 6.18 +Subject: [PATCH 72/85] arm64: dts: microchip: tactical-1000: adapt to 6.18 Novarq develop against 7.3, which has three things 6.18 does not: a QSPI controller node, a tmon that also provides the fan PWM, and hence a SoC @@ -20,7 +20,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 1 insertion(+), 42 deletions(-) diff --git a/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts -index e7e4654af98f..bd6953fc9d4a 100644 +index e7e4654af98fc..bd6953fc9d4a3 100644 --- a/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts +++ b/arch/arm64/boot/dts/microchip/lan9696-tactical-1000.dts @@ -5,7 +5,6 @@ diff --git a/patches/linux/6.18.55/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch b/patches/linux/6.18.55/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch index 5a53d4404..45fbd227b 100644 --- a/patches/linux/6.18.55/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch +++ b/patches/linux/6.18.55/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch @@ -1,7 +1,7 @@ From b390f0eaf27fd05c7a1436f3941964758b7a4fb4 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:13 +0100 -Subject: [PATCH 73/78] dt-bindings: arm: AT91: document EV23X71A board +Subject: [PATCH 73/85] dt-bindings: arm: AT91: document EV23X71A board Microchip EV23X71A board is an LAN9696 based evaluation board. @@ -16,7 +16,7 @@ Signed-off-by: Claudiu Beznea 1 file changed, 6 insertions(+) diff --git a/Documentation/devicetree/bindings/arm/atmel-at91.yaml b/Documentation/devicetree/bindings/arm/atmel-at91.yaml -index 49666e92c04a..b7c37a1cece0 100644 +index 49666e92c04a2..b7c37a1cece03 100644 --- a/Documentation/devicetree/bindings/arm/atmel-at91.yaml +++ b/Documentation/devicetree/bindings/arm/atmel-at91.yaml @@ -241,6 +241,12 @@ properties: diff --git a/patches/linux/6.18.55/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch b/patches/linux/6.18.55/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch index 6395b557c..72b733db2 100644 --- a/patches/linux/6.18.55/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch +++ b/patches/linux/6.18.55/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch @@ -1,7 +1,7 @@ From 8fc86e86edc2464d419084beb306cb95cf5946fc Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:04:21 +0200 -Subject: [PATCH 74/78] net: dsa: Skip DCB default priority init on unsupported +Subject: [PATCH 74/85] net: dsa: Skip DCB default priority init on unsupported switches A driver serving several chip generations has one dsa_switch_ops for @@ -17,7 +17,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/net/dsa/user.c b/net/dsa/user.c -index c0019d0c1172..b881c177628c 100644 +index c0019d0c1172d..b881c177628ce 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -2511,12 +2511,13 @@ static int dsa_user_dcbnl_init(struct net_device *dev) diff --git a/patches/linux/6.18.55/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch b/patches/linux/6.18.55/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch index 9ed0da249..32d797bee 100644 --- a/patches/linux/6.18.55/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch +++ b/patches/linux/6.18.55/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch @@ -1,7 +1,7 @@ From 3d3f7ba164355546fc2188315622356b4f02f681 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 22 Sep 2026 13:51:07 +0200 -Subject: [PATCH 75/78] net: dsa: Generalise the global DCB APP mirroring +Subject: [PATCH 75/85] net: dsa: Generalise the global DCB APP mirroring helper A switch with one classification table for all its ports programs it @@ -19,7 +19,7 @@ Signed-off-by: Joachim Wiberg 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/net/dsa/user.c b/net/dsa/user.c -index b881c177628c..193e54b7d85e 100644 +index b881c177628ce..193e54b7d85ea 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -2243,11 +2243,13 @@ dsa_user_dcbnl_set_default_prio(struct net_device *dev, struct dcb_app *app) diff --git a/patches/linux/6.18.55/0076-net-dsa-Support-the-PCP-APP-selector.patch b/patches/linux/6.18.55/0076-net-dsa-Support-the-PCP-APP-selector.patch index e3d2b348d..a2f0f96ca 100644 --- a/patches/linux/6.18.55/0076-net-dsa-Support-the-PCP-APP-selector.patch +++ b/patches/linux/6.18.55/0076-net-dsa-Support-the-PCP-APP-selector.patch @@ -1,7 +1,7 @@ From 32c1befbedb0f46361960a0d321c743711a87762 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:04:22 +0200 -Subject: [PATCH 76/78] net: dsa: Support the PCP APP selector +Subject: [PATCH 76/85] net: dsa: Support the PCP APP selector Add port_add_pcp_prio, port_del_pcp_prio and port_get_pcp_prio switch ops and route the DCB_APP_SEL_PCP selector to them, mirroring the DSCP @@ -27,7 +27,7 @@ Signed-off-by: Joachim Wiberg 2 files changed, 206 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h -index c31d4e910f07..f271376b7758 100644 +index c31d4e910f075..f271376b77582 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -447,6 +447,10 @@ struct dsa_switch { @@ -55,7 +55,7 @@ index c31d4e910f07..f271376b7758 100644 /* * Suspend and resume diff --git a/net/dsa/user.c b/net/dsa/user.c -index 193e54b7d85e..85b06f3a4337 100644 +index 193e54b7d85ea..85b06f3a43370 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -2342,6 +2342,172 @@ dsa_user_dcbnl_add_dscp_prio(struct net_device *dev, struct dcb_app *app) diff --git a/patches/linux/6.18.55/0077-net-dsa-Support-DCB-priority-rewrite.patch b/patches/linux/6.18.55/0077-net-dsa-Support-DCB-priority-rewrite.patch index 34fa95eea..bdf37fa15 100644 --- a/patches/linux/6.18.55/0077-net-dsa-Support-DCB-priority-rewrite.patch +++ b/patches/linux/6.18.55/0077-net-dsa-Support-DCB-priority-rewrite.patch @@ -1,7 +1,7 @@ From b45635ee810e5edadedbc000b737281b2c517695 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:10:32 +0200 -Subject: [PATCH 77/78] net: dsa: Support DCB priority rewrite +Subject: [PATCH 77/85] net: dsa: Support DCB priority rewrite The DCB rewrite table maps a priority back to the PCP and DEI, or the DSCP, that frames are remarked with on egress. DSA has no @@ -26,7 +26,7 @@ Signed-off-by: Joachim Wiberg 2 files changed, 279 insertions(+), 1 deletion(-) diff --git a/include/net/dsa.h b/include/net/dsa.h -index f271376b7758..3a36904e57f8 100644 +index f271376b77582..3a36904e57f81 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -451,6 +451,12 @@ struct dsa_switch { @@ -60,7 +60,7 @@ index f271376b7758..3a36904e57f8 100644 /* * Suspend and resume diff --git a/net/dsa/user.c b/net/dsa/user.c -index 85b06f3a4337..349bacfebb08 100644 +index 85b06f3a43370..349bacfebb086 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -2665,6 +2665,266 @@ static int __maybe_unused dsa_user_dcbnl_ieee_delapp(struct net_device *dev, diff --git a/patches/linux/6.18.55/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch b/patches/linux/6.18.55/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch index adc56c667..2c1bff959 100644 --- a/patches/linux/6.18.55/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch +++ b/patches/linux/6.18.55/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch @@ -1,7 +1,7 @@ From 621214da6d9ee1c6ebef311b193dab441c53d359 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 22 Sep 2026 13:53:23 +0200 -Subject: [PATCH 78/78] net: dsa: Support the IEEE ETS managed object +Subject: [PATCH 78/85] net: dsa: Support the IEEE ETS managed object A switch port's transmission selection is configured today through the ets queuing discipline, which numbers its bands the other way round @@ -32,7 +32,7 @@ Signed-off-by: Joachim Wiberg 2 files changed, 82 insertions(+) diff --git a/include/net/dsa.h b/include/net/dsa.h -index 3a36904e57f8..fa47901fa9a9 100644 +index 3a36904e57f81..fa47901fa9a98 100644 --- a/include/net/dsa.h +++ b/include/net/dsa.h @@ -849,6 +849,8 @@ static inline bool dsa_port_tree_same(const struct dsa_port *a, @@ -64,7 +64,7 @@ index 3a36904e57f8..fa47901fa9a9 100644 * Suspend and resume */ diff --git a/net/dsa/user.c b/net/dsa/user.c -index 349bacfebb08..e9809fda8d89 100644 +index 349bacfebb086..e9809fda8d89e 100644 --- a/net/dsa/user.c +++ b/net/dsa/user.c @@ -3040,9 +3040,77 @@ static const struct ethtool_ops dsa_user_ethtool_ops = { diff --git a/patches/linux/6.18.55/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch b/patches/linux/6.18.55/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch new file mode 100644 index 000000000..191659467 --- /dev/null +++ b/patches/linux/6.18.55/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch @@ -0,0 +1,174 @@ +From c267da8727c743e80ba14f3f859501e45b27e568 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Wed, 7 Oct 2026 11:42:12 +0200 +Subject: [PATCH 79/85] net: sparx5: fix sleep in atomic context in MAC table + access + +Adding or removing a multicast address on an unbridged switch port +triggers: + + BUG: scheduling while atomic: kworker/u4:5/594/0x00000202 + Workqueue: ipv6_addrconf addrconf_dad_work + Call trace: + __mutex_lock.constprop.0+0x510/0xc50 + mutex_lock+0x50/0x70 + sparx5_mact_learn+0x80/0x110 + sparx5_mc_sync+0x48/0x70 + __hw_addr_sync_dev+0xcc/0x180 + sparx5_set_rx_mode+0x54/0x70 + __dev_set_rx_mode+0x4c/0xb0 + dev_mc_add+0x94/0xc0 + igmp6_group_added+0x10c/0x130 + __ipv6_dev_mc_inc+0x218/0x3f0 + ipv6_dev_mc_inc+0x1c/0x30 + addrconf_dad_work+0xb4/0x570 + +The core calls .ndo_set_rx_mode with netif_addr_lock_bh held. +sparx5_mc_sync() and sparx5_mc_unsync() reach sparx5_mact_learn() and +sparx5_mact_forget() from there, which take sparx5->lock, a mutex, and +then sleep in readx_poll_timeout() waiting for the MAC table command. + +Upstream fixed this in commit b62793a7baee ("net: sparx5: fix sleep +in atomic context in MAC table access") by moving the driver to the +new .ndo_set_rx_mode_async callback. That API is not in 6.18 and +depends on a series of core changes, so it cannot be backported on +its own. + +Do what lan966x does instead, see commit 77bdaf39f3c8 ("net: lan966x: +Fix sleep in atomic context when updating MAC table"): make +sparx5->lock a spinlock and poll for completion with +readx_poll_timeout_atomic(). Nothing under the lock sleeps, and the +MAC table command completes in microseconds. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 24 +++++++++---------- + .../ethernet/microchip/sparx5/sparx5_main.h | 2 +- + 2 files changed, 13 insertions(+), 13 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index f5584244612cd..2a594f0732319 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -50,7 +50,7 @@ static int sparx5_mact_wait_for_completion(struct sparx5 *sparx5) + { + u32 val; + +- return readx_poll_timeout(sparx5_mact_get_status, ++ return readx_poll_timeout_atomic(sparx5_mact_get_status, + sparx5, val, + LRN_COMMON_ACCESS_CTRL_MAC_TABLE_ACCESS_SHOT_GET(val) == 0, + TABLE_UPDATE_SLEEP_US, TABLE_UPDATE_TIMEOUT_US); +@@ -92,7 +92,7 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + addr = pgid - consts->n_ports; + } + +- mutex_lock(&sparx5->lock); ++ spin_lock(&sparx5->lock); + + sparx5_mact_select(sparx5, mac, vid); + +@@ -111,7 +111,7 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + + ret = sparx5_mact_wait_for_completion(sparx5); + +- mutex_unlock(&sparx5->lock); ++ spin_unlock(&sparx5->lock); + + return ret; + } +@@ -164,7 +164,7 @@ bool sparx5_mact_getnext(struct sparx5 *sparx5, + u32 cfg2; + int ret; + +- mutex_lock(&sparx5->lock); ++ spin_lock(&sparx5->lock); + + sparx5_mact_select(sparx5, mac, *vid); + +@@ -183,7 +183,7 @@ bool sparx5_mact_getnext(struct sparx5 *sparx5, + *pcfg2 = cfg2; + } + +- mutex_unlock(&sparx5->lock); ++ spin_unlock(&sparx5->lock); + + return ret == 0; + } +@@ -194,7 +194,7 @@ int sparx5_mact_find(struct sparx5 *sparx5, + int ret; + u32 cfg2; + +- mutex_lock(&sparx5->lock); ++ spin_lock(&sparx5->lock); + + sparx5_mact_select(sparx5, mac, vid); + +@@ -212,7 +212,7 @@ int sparx5_mact_find(struct sparx5 *sparx5, + ret = -ENOENT; + } + +- mutex_unlock(&sparx5->lock); ++ spin_unlock(&sparx5->lock); + + return ret; + } +@@ -222,7 +222,7 @@ int sparx5_mact_forget(struct sparx5 *sparx5, + { + int ret; + +- mutex_lock(&sparx5->lock); ++ spin_lock(&sparx5->lock); + + sparx5_mact_select(sparx5, mac, vid); + +@@ -233,7 +233,7 @@ int sparx5_mact_forget(struct sparx5 *sparx5, + + ret = sparx5_mact_wait_for_completion(sparx5); + +- mutex_unlock(&sparx5->lock); ++ spin_unlock(&sparx5->lock); + + return ret; + } +@@ -440,7 +440,7 @@ void sparx5_mact_pull_work(struct work_struct *work) + vid = 0; + memset(mac, 0, sizeof(mac)); + do { +- mutex_lock(&sparx5->lock); ++ spin_lock(&sparx5->lock); + sparx5_mact_select(sparx5, mac, vid); + spx5_wr(LRN_SCAN_NEXT_CFG_SCAN_NEXT_UNTIL_FOUND_ENA_SET(1), + sparx5, LRN_SCAN_NEXT_CFG); +@@ -451,7 +451,7 @@ void sparx5_mact_pull_work(struct work_struct *work) + ret = sparx5_mact_wait_for_completion(sparx5); + if (ret == 0) + ret = sparx5_mact_get(sparx5, mac, &vid, &cfg2); +- mutex_unlock(&sparx5->lock); ++ spin_unlock(&sparx5->lock); + if (ret == 0) + sparx5_mact_handle_entry(sparx5, mac, vid, cfg2); + } while (ret == 0); +@@ -491,7 +491,7 @@ void sparx5_set_ageing(struct sparx5 *sparx5, int msecs) + + void sparx5_mact_init(struct sparx5 *sparx5) + { +- mutex_init(&sparx5->lock); ++ spin_lock_init(&sparx5->lock); + + /* Flush MAC table */ + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index 2f1b50ba8ad34..09d7002279812 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -373,7 +373,7 @@ struct sparx5 { + u32 features; + void __iomem *regs[NUM_TARGETS]; + int port_count; +- struct mutex lock; /* MAC reg lock */ ++ spinlock_t lock; /* MAC reg lock */ + /* port structures are in net device */ + struct sparx5_port *ports[SPX5_PORTS]; + enum sparx5_core_clockfreq coreclock; diff --git a/patches/linux/6.18.55/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch b/patches/linux/6.18.55/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch new file mode 100644 index 000000000..42871eda3 --- /dev/null +++ b/patches/linux/6.18.55/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch @@ -0,0 +1,389 @@ +From d9a9addcf353ca7b5d7a04acd8ab5f50b690c471 Mon Sep 17 00:00:00 2001 +From: Steen Hegelund +Date: Wed, 21 Jan 2026 10:09:45 +0100 +Subject: [PATCH 80/85] misc: sparx5-symreg; symreg debugfs driver (DBB-1045) + +Expose the switch register space of Microchip Sparx5 family SoCs +through /sys/kernel/debug/symreg/mem, for the symreg tool, which +reads and writes registers by name. The ranges to map come from a +microchip,sparx5-symreg device tree node. + +From Microchip's BSP kernel, branch bsp-6.18-2026, commit 2b5e25cf6767. + +Signed-off-by: Joachim Wiberg +--- + .../bindings/arm/microchip,sparx5-symreg.yaml | 62 ++++ + drivers/misc/Kconfig | 6 + + drivers/misc/Makefile | 1 + + drivers/misc/sparx5_symreg_debugfs.c | 267 ++++++++++++++++++ + 4 files changed, 336 insertions(+) + create mode 100644 Documentation/devicetree/bindings/arm/microchip,sparx5-symreg.yaml + create mode 100644 drivers/misc/sparx5_symreg_debugfs.c + +diff --git a/Documentation/devicetree/bindings/arm/microchip,sparx5-symreg.yaml b/Documentation/devicetree/bindings/arm/microchip,sparx5-symreg.yaml +new file mode 100644 +index 0000000000000..fe6f9e7fcc67c +--- /dev/null ++++ b/Documentation/devicetree/bindings/arm/microchip,sparx5-symreg.yaml +@@ -0,0 +1,62 @@ ++# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) ++%YAML 1.2 ++--- ++$id: http://devicetree.org/schemas/arm/microchip,sparx5-symreg.yaml# ++$schema: http://devicetree.org/meta-schemas/core.yaml# ++ ++title: Microchip Sparx5 Symbolic Register (symreg) Controller ++ ++maintainers: ++ - Steen Hegelund ++ ++description: | ++ Bindings for the Microchip Sparx5 Symbolic Register (symreg) controller, ++ which provides access to symbolic registers for debug and configuration. ++ The number of entries in 'reg', 'reg-names', and 'microchip,symreg' must always be the same. ++ ++properties: ++ compatible: ++ const: microchip,sparx5-symreg ++ ++ reg: ++ minItems: 1 ++ description: | ++ One or more address/size pairs for the register regions. ++ items: ++ description: Register region (address and size). ++ ++ reg-names: ++ description: | ++ Names for the register regions. These can be any useful reference strings, ++ but the number of names must match the number of reg entries. ++ $ref: /schemas/types.yaml#/definitions/string-array ++ ++ microchip,symreg: ++ minItems: 1 ++ $ref: /schemas/types.yaml#/definitions/uint32-array ++ description: | ++ Microchip-specific property for symbolic register regions. ++ The number of items must match the number of reg entries. ++ Individual regions can be larger than the ones listed in the reg property if this is useful ++ items: ++ description: Register region (address and size). ++ ++required: ++ - compatible ++ - reg ++ - reg-names ++ - microchip,symreg ++ ++additionalProperties: false ++ ++examples: ++ - | ++ symreg: symreg_debugfs@e0000000 { ++ compatible = "microchip,sparx5-symreg"; ++ reg = <0xe00c0000 0x800000>, ++ <0xe2010000 0x1410000>; ++ microchip,symreg = <0xe00c0000 0x800000>, ++ <0xe2010000 0x1410000>; ++ reg-names = "cpu", "dev"; ++ status = "okay"; ++ }; +diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig +index b9c11f67315f0..8e164b0fba975 100644 +--- a/drivers/misc/Kconfig ++++ b/drivers/misc/Kconfig +@@ -644,6 +644,12 @@ config MCHP_LAN966X_PCI + - lan966x-miim (MDIO_MSCC_MIIM) + - lan966x-switch (LAN966X_SWITCH) + ++config SPARX5_SYMREG ++ tristate "Microchip Sparx5 Ethernet Switch Symreg Support" ++ depends on DEBUG_FS ++ help ++ This enables the support for symbolic register access on Microchip Ethernet switches ++ + source "drivers/misc/c2port/Kconfig" + source "drivers/misc/eeprom/Kconfig" + source "drivers/misc/cb710/Kconfig" +diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile +index b32a2597d2467..9286bd91a9954 100644 +--- a/drivers/misc/Makefile ++++ b/drivers/misc/Makefile +@@ -75,3 +75,4 @@ obj-$(CONFIG_MCHP_LAN966X_PCI) += lan966x-pci.o + obj-y += keba/ + obj-y += amd-sbi/ + obj-$(CONFIG_MISC_RP1) += rp1/ ++obj-$(CONFIG_SPARX5_SYMREG) += sparx5_symreg_debugfs.o +diff --git a/drivers/misc/sparx5_symreg_debugfs.c b/drivers/misc/sparx5_symreg_debugfs.c +new file mode 100644 +index 0000000000000..17f7bcc6fd682 +--- /dev/null ++++ b/drivers/misc/sparx5_symreg_debugfs.c +@@ -0,0 +1,267 @@ ++// SPDX-License-Identifier: GPL-2.0 OR MIT ++/* Microchip Sparx5 Switch Symreg support ++ * ++ * Copyright (c) 2026 Microchip Technology Inc. and its subsidiaries. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#define IORES_MAX 3 ++#define REGS_CELLS_MAX 9 ++ ++struct sparx5_symreg_io { ++ phys_addr_t start; ++ phys_addr_t size; ++ phys_addr_t end; ++ const char *name; ++}; ++ ++struct sparx5_symreg { ++ struct platform_device *pdev; ++ struct device *dev; ++ struct dentry *debugfs_root; ++ int num_ranges; ++ struct sparx5_symreg_io symreg_io[IORES_MAX]; ++ void __iomem *iomem[IORES_MAX]; ++}; ++ ++#define REG_VALUE_SIZE 4 ++ ++static ssize_t sparx5_symreg_debugfs_write(struct file *filp, ++ const char __user *buf, size_t count, ++ loff_t *pos) ++{ ++ struct sparx5_symreg *sreg = filp->private_data; ++ int iomax = sreg->num_ranges; ++ phys_addr_t reg = *pos; ++ int err = -EINVAL, idx; ++ u8 *buf_dup; ++ u32 val; ++ ++ if (count < REG_VALUE_SIZE) ++ return err; ++ ++ buf_dup = memdup_user(buf, count); ++ if (IS_ERR(buf_dup)) ++ return PTR_ERR(buf_dup); ++ ++ /* LE encoded output */ ++ val = (u32)buf_dup[0] << 0 | ++ (u32)buf_dup[1] << 8 | ++ (u32)buf_dup[2] << 16 | ++ (u32)buf_dup[3] << 24; ++ ++ kfree(buf_dup); ++ ++ pr_debug("%s:%d: %pa: 0x%08x\n", __func__, __LINE__, ®, val); ++ for (idx = 0; idx < iomax; idx++) { ++ pr_debug("%s:%d: [%d]: [%pa, %pa] -> %p\n", __func__, ++ __LINE__, idx, ++ &sreg->symreg_io[idx].start, ++ &sreg->symreg_io[idx].end, ++ sreg->iomem[idx]); ++ if (reg >= sreg->symreg_io[idx].start && ++ reg < sreg->symreg_io[idx].end) { ++ void __iomem *ioreg = sreg->iomem[idx] + ++ (reg - sreg->symreg_io[idx].start); ++ pr_debug("%s:%d: %pa -> 0x%p\n", __func__, __LINE__, ++ ®, ioreg); ++ writel(val, ioreg); ++ return REG_VALUE_SIZE; ++ } ++ } ++ return err; ++} ++ ++static ssize_t sparx5_symreg_debugfs_read(struct file *filp, char __user *buf, ++ size_t count, loff_t *pos) ++{ ++ struct sparx5_symreg *sreg = filp->private_data; ++ int iomax = sreg->num_ranges; ++ u8 tmp[REG_VALUE_SIZE] = { 0 }; ++ int err = -EINVAL, idx; ++ phys_addr_t reg = *pos; ++ u32 val; ++ ++ if (count < REG_VALUE_SIZE) ++ return err; ++ ++ pr_debug("%s:%d: %pa\n", __func__, __LINE__, ®); ++ for (idx = 0; idx < iomax; idx++) { ++ pr_debug("%s:%d: [%d]: [%pa, %pa] -> %p\n", __func__, ++ __LINE__, idx, ++ &sreg->symreg_io[idx].start, ++ &sreg->symreg_io[idx].end, ++ sreg->iomem[idx]); ++ if (reg >= sreg->symreg_io[idx].start && ++ reg < sreg->symreg_io[idx].end) { ++ void __iomem *ioreg = sreg->iomem[idx] + ++ (reg - sreg->symreg_io[idx].start); ++ pr_debug("%s:%d: %pa -> 0x%p\n", __func__, __LINE__, ++ ®, ioreg); ++ val = readl(ioreg); ++ /* LE encoded output */ ++ tmp[3] = val >> 24; ++ tmp[2] = val >> 16; ++ tmp[1] = val >> 8; ++ tmp[0] = val >> 0; ++ err = copy_to_user(buf, tmp, sizeof(tmp)); ++ if (err) { ++ err = -ENOMEM; ++ break; ++ } ++ return sizeof(tmp); ++ } ++ } ++ return err; ++} ++ ++static int sparx5_symreg_read_chip_ranges(struct sparx5_symreg *sreg) ++{ ++ int kdx, ret, addr_cells, size_cells, total_cells, num_ranges; ++ struct device_node *dn = sreg->pdev->dev.of_node; ++ u32 sr[REGS_CELLS_MAX] = { 0 }; ++ u64 addr, size; ++ ++ /* Get cell counts */ ++ addr_cells = of_n_addr_cells(dn); ++ size_cells = of_n_size_cells(dn); ++ ++ /* Get total number of cells in the property */ ++ total_cells = of_property_count_elems_of_size(dn, "microchip,symreg", sizeof(u32)); ++ if (total_cells < 0) { ++ dev_err(sreg->dev, "Failed to get total_cells\n"); ++ return total_cells; ++ } ++ if (total_cells > REGS_CELLS_MAX) { ++ dev_err(sreg->dev, "Array too large\n"); ++ return -ERANGE; ++ } ++ ++ /* Calculate number of ranges */ ++ num_ranges = total_cells / (addr_cells + size_cells); ++ ++ ret = of_property_read_u32_array(dn, "microchip,symreg", sr, total_cells); ++ if (ret) { ++ dev_err(sreg->dev, "Failed to get array elements\n"); ++ return ret; ++ } ++ ++ kdx = 0; ++ for (int idx = 0; idx < num_ranges; idx++) { ++ addr = 0; ++ for (int jdx = 0; jdx < addr_cells; jdx++) ++ addr = (addr << 32) | sr[kdx++]; ++ size = 0; ++ for (int jdx = 0; jdx < size_cells; jdx++) ++ size = (size << 32) | sr[kdx++]; ++ pr_debug("%s:%d: Symreg Range %d: Address: %pa, Size: 0x%llx\n", ++ __func__, __LINE__, ++ idx, &addr, ++ size); ++ sreg->symreg_io[idx].start = addr; ++ sreg->symreg_io[idx].size = size; ++ sreg->symreg_io[idx].end = addr + size - 1; ++ ++ } ++ sreg->num_ranges = num_ranges; ++ return 0; ++} ++ ++static int sparx5_symreg_add_ranges(struct sparx5_symreg *sreg) ++{ ++ unsigned int rescount = sreg->pdev->num_resources; ++ struct resource *res; ++ int err; ++ ++ err = sparx5_symreg_read_chip_ranges(sreg); ++ if (err < 0) ++ return err; ++ ++ if (sreg->num_ranges != rescount) { ++ dev_err(sreg->dev, "Mismatch in ranges\n"); ++ return -EINVAL; ++ } ++ ++ for (int idx = 0; idx < rescount; idx++) { ++ res = platform_get_resource(sreg->pdev, IORESOURCE_MEM, idx); ++ if (!res) { ++ dev_err(sreg->dev, "Invalid resource\n"); ++ return -EINVAL; ++ } ++ sreg->iomem[idx] = ++ devm_ioremap(sreg->dev, res->start, resource_size(res)); ++ if (!sreg->iomem[idx]) { ++ dev_err(sreg->dev, "Unable to get registers: %s\n", ++ sreg->symreg_io[idx].name); ++ return -ENOMEM; ++ } ++ sreg->symreg_io[idx].name = res->name; ++ pr_debug("%s:%d: Symreg Range %d: %s: [%pa,%pa]: %pa -> 0x%p\n", ++ __func__, __LINE__, ++ idx, ++ sreg->symreg_io[idx].name, ++ &sreg->symreg_io[idx].start, ++ &sreg->symreg_io[idx].end, ++ &sreg->symreg_io[idx].size, ++ sreg->iomem[idx]); ++ } ++ ++ return 0; ++} ++ ++static const struct file_operations memfops = { ++ .owner = THIS_MODULE, ++ .open = simple_open, ++ .write = sparx5_symreg_debugfs_write, ++ .read = sparx5_symreg_debugfs_read, ++}; ++ ++static int sparx5_symreg_probe(struct platform_device *pdev) ++{ ++ struct sparx5_symreg *sreg; ++ ++ sreg = devm_kzalloc(&pdev->dev, sizeof(*sreg), GFP_KERNEL); ++ if (!sreg) ++ return -ENOMEM; ++ ++ platform_set_drvdata(pdev, sreg); ++ sreg->pdev = pdev; ++ sreg->dev = &pdev->dev; ++ ++ sreg->debugfs_root = debugfs_create_dir("symreg", NULL); ++ debugfs_create_file("mem", 0644, sreg->debugfs_root, sreg, &memfops); ++ ++ return sparx5_symreg_add_ranges(sreg); ++} ++ ++static void sparx5_symreg_remove(struct platform_device *pdev) ++{ ++ struct sparx5_symreg *sreg = platform_get_drvdata(pdev); ++ ++ debugfs_remove_recursive(sreg->debugfs_root); ++} ++ ++static const struct of_device_id sparx5_symreg_match[] = { ++ { .compatible = "microchip,sparx5-symreg" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, sparx5_symreg_match); ++ ++static struct platform_driver sparx5_symreg_driver = { ++ .probe = sparx5_symreg_probe, ++ .remove = sparx5_symreg_remove, ++ .driver = { ++ .name = "sparx5-symreg", ++ .of_match_table = sparx5_symreg_match, ++ }, ++}; ++ ++module_platform_driver(sparx5_symreg_driver); ++ ++MODULE_DESCRIPTION("Microchip Sparx5 symreg driver"); ++MODULE_AUTHOR("Steen Hegelund "); ++MODULE_LICENSE("Dual MIT/GPL"); diff --git a/patches/linux/6.18.55/0081-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch b/patches/linux/6.18.55/0081-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch new file mode 100644 index 000000000..0fb04d919 --- /dev/null +++ b/patches/linux/6.18.55/0081-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch @@ -0,0 +1,176 @@ +From bde3b99dc6dcd9dbd998f63d358f07c0ec28e6fb Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Wed, 7 Oct 2026 17:30:17 +0200 +Subject: [PATCH 81/85] net: sparx5: fix multicast delivery to the CPU on + standalone ports + +A standalone port stops receiving a multicast group as soon as any +other standalone port leaves it. IPv6 neighbour discovery and mDNS +are the usual victims, so the port looks dead to the LAN until it is +taken down and up again, which re-joins its groups. + +Standalone ports all use pvid NULL_VID, and sparx5_mc_sync() delivers +a group to the CPU with a MAC table entry keyed on that address and +VID. The entry is therefore shared by every standalone port that is +a member of the group, but sparx5_mc_unsync() forgets it on behalf of +a single port, and the flood PGIDs have no CPU copy to fall back on. + +Reference count the shared entries. Learn on the first subscriber, +forget on the last. + +The same applies to a unicast address learned by sparx5_port_add_addr() +when two standalone ports share a MAC address, which is left as is. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 76 ++++++++++++++++++- + .../ethernet/microchip/sparx5/sparx5_main.c | 1 + + .../ethernet/microchip/sparx5/sparx5_main.h | 5 ++ + 3 files changed, 79 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 2a594f0732319..57efab569805c 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -116,21 +116,79 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + return ret; + } + ++/* Standalone ports share pvid, hence the CPU multicast MAC entry too */ ++struct sparx5_mc_cpu_entry { ++ struct list_head list; ++ unsigned char addr[ETH_ALEN]; ++ u16 vid; ++ int refcnt; ++}; ++ ++static struct sparx5_mc_cpu_entry * ++sparx5_mc_cpu_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) ++{ ++ struct sparx5_mc_cpu_entry *e; ++ ++ list_for_each_entry(e, &sparx5->mc_cpu_entries, list) ++ if (e->vid == vid && ether_addr_equal(e->addr, addr)) ++ return e; ++ ++ return NULL; ++} ++ + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) + { + struct sparx5_port *port = netdev_priv(dev); + struct sparx5 *sparx5 = port->sparx5; ++ struct sparx5_mc_cpu_entry *e; ++ int ret = 0; ++ ++ spin_lock(&sparx5->mc_cpu_lock); ++ e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ if (e && --e->refcnt == 0) { ++ list_del(&e->list); ++ kfree(e); ++ ret = sparx5_mact_forget(sparx5, addr, port->pvid); ++ } ++ spin_unlock(&sparx5->mc_cpu_lock); + +- return sparx5_mact_forget(sparx5, addr, port->pvid); ++ return ret; + } + + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) + { + struct sparx5_port *port = netdev_priv(dev); + struct sparx5 *sparx5 = port->sparx5; ++ struct sparx5_mc_cpu_entry *e; ++ int ret = 0; ++ ++ spin_lock(&sparx5->mc_cpu_lock); ++ e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ if (!e) { ++ e = kmalloc(sizeof(*e), GFP_ATOMIC); ++ if (!e) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ ret = sparx5_mact_learn(sparx5, ++ sparx5_get_pgid(sparx5, PGID_CPU), ++ addr, port->pvid); ++ if (ret) { ++ kfree(e); ++ goto out; ++ } + +- return sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr, port->pvid); ++ ether_addr_copy(e->addr, addr); ++ e->vid = port->pvid; ++ e->refcnt = 0; ++ list_add_tail(&e->list, &sparx5->mc_cpu_entries); ++ } ++ e->refcnt++; ++out: ++ spin_unlock(&sparx5->mc_cpu_lock); ++ ++ return ret; + } + + static int sparx5_mact_get(struct sparx5 *sparx5, +@@ -492,6 +550,8 @@ void sparx5_set_ageing(struct sparx5 *sparx5, int msecs) + void sparx5_mact_init(struct sparx5 *sparx5) + { + spin_lock_init(&sparx5->lock); ++ spin_lock_init(&sparx5->mc_cpu_lock); ++ INIT_LIST_HEAD(&sparx5->mc_cpu_entries); + + /* Flush MAC table */ + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | +@@ -503,3 +563,13 @@ void sparx5_mact_init(struct sparx5 *sparx5) + + sparx5_set_ageing(sparx5, BR_DEFAULT_AGEING_TIME / HZ * 1000); + } ++ ++void sparx5_mact_deinit(struct sparx5 *sparx5) ++{ ++ struct sparx5_mc_cpu_entry *e, *tmp; ++ ++ list_for_each_entry_safe(e, tmp, &sparx5->mc_cpu_entries, list) { ++ list_del(&e->list); ++ kfree(e); ++ } ++} +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +index 582145713cfd1..c9a672c3aaf79 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +@@ -1054,6 +1054,7 @@ static void mchp_sparx5_remove(struct platform_device *pdev) + /* Unregister netdevs */ + sparx5_unregister_notifier_blocks(sparx5); + destroy_workqueue(sparx5->mact_queue); ++ sparx5_mact_deinit(sparx5); + } + + static const struct sparx5_regs sparx5_regs = { +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index 09d7002279812..45aadf924747c 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -407,6 +407,10 @@ struct sparx5 { + struct list_head mdb_entries; + /* mdb list mutex */ + struct mutex mdb_lock; ++ /* CPU multicast entries, shared by the standalone ports */ ++ struct list_head mc_cpu_entries; ++ /* mc_cpu_entries lock */ ++ spinlock_t mc_cpu_lock; + struct delayed_work mact_work; + struct workqueue_struct *mact_queue; + /* Board specifics */ +@@ -490,6 +494,7 @@ int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr); + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr); + void sparx5_set_ageing(struct sparx5 *sparx5, int msecs); + void sparx5_mact_init(struct sparx5 *sparx5); ++void sparx5_mact_deinit(struct sparx5 *sparx5); + + /* sparx5_vlan.c */ + void sparx5_pgid_update_mask(struct sparx5_port *port, int pgid, bool enable); diff --git a/patches/linux/6.18.55/0082-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch b/patches/linux/6.18.55/0082-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch new file mode 100644 index 000000000..39f942b27 --- /dev/null +++ b/patches/linux/6.18.55/0082-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch @@ -0,0 +1,98 @@ +From 9c9fcc5fbf9134bde2efc028f6c8d2921dbdce1f Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:48:05 +0200 +Subject: [PATCH 82/85] net: sparx5: fix broadcast to the CPU on bridge ports + without a PVID + +Ports of a bridge created with vlan_default_pvid 0 never deliver +broadcast to the CPU. ARP requests from the ports go unanswered and +the bridge IP address is unreachable, while unicast and forwarding +between the ports work: + + ip link add br0 address $mac type bridge vlan_default_pvid 0 + ip link set eth0 master br0 + ip addr add 10.0.0.1/24 dev br0 + +The driver classifies bridged ports without a PVID to VID 1, to keep +them apart from the standalone ports on VID 0. Broadcast on a VID +only reaches the CPU through a MAC table entry pointing to PGID_BCAST, +which the driver learns when the bridge adds the VLAN and forgets when +the bridge removes it. A new bridge starts with VLAN 1, so the entry +for VID 1 is learned, and setting vlan_default_pvid 0 removes VLAN 1 +again, which forgets the entry the PVID-less ports depend on. + +Learn the VID 1 broadcast entry at probe, like the VID 0 entry for +standalone ports, and keep it when VLAN 1 is removed from the bridge. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + drivers/net/ethernet/microchip/sparx5/sparx5_main.c | 4 ++++ + drivers/net/ethernet/microchip/sparx5/sparx5_main.h | 1 + + .../net/ethernet/microchip/sparx5/sparx5_switchdev.c | 12 +++++++----- + 3 files changed, 12 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +index c9a672c3aaf79..90164a54365d2 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.c +@@ -741,6 +741,10 @@ static int sparx5_start(struct sparx5 *sparx5) + sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), broadcast, + NULL_VID); + ++ /* Flood BC of bridged ports without a PVID, to the ports and CPU */ ++ sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_BCAST), broadcast, ++ UNAWARE_VID); ++ + /* Enable queue limitation watermarks */ + sparx5_qlim_set(sparx5); + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index 45aadf924747c..54103e8b091f7 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -103,6 +103,7 @@ enum sparx5_feature { + + #define IFH_LEN 9 /* 36 bytes */ + #define NULL_VID 0 ++#define UNAWARE_VID 1 /* Bridged ports without a PVID */ + #define SPX5_MACT_PULL_DELAY (2 * HZ) + #define SPX5_STATS_CHECK_DELAY (1 * HZ) + #define SPX5_PRIOS 8 /* Number of priority queues */ +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 391ce604e6611..1c81efd7fbbaa 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -155,8 +155,8 @@ static int sparx5_port_attr_set(struct net_device *dev, const void *ctx, + /* Used PVID 1 when default_pvid is 0, to avoid + * collision with non-bridged ports. + */ +- if (port->pvid == 0) +- port->pvid = 1; ++ if (port->pvid == NULL_VID) ++ port->pvid = UNAWARE_VID; + port->vlan_aware = attr->u.vlan_filtering; + sparx5_vlan_port_apply(port->sparx5, port); + break; +@@ -346,8 +346,8 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + /* Used PVID 1 when default_pvid is 0, to avoid + * collision with non-bridged ports. + */ +- if (fdb_info->vid == 0) +- vid = 1; ++ if (fdb_info->vid == NULL_VID) ++ vid = UNAWARE_VID; + else + vid = fdb_info->vid; + +@@ -679,7 +679,9 @@ static int sparx5_handle_port_vlan_del(struct net_device *dev, + container_of(nb, struct sparx5, + switchdev_blocking_nb); + +- sparx5_mact_forget(sparx5, dev->broadcast, vid); ++ /* Kept for the bridged ports without a PVID */ ++ if (vid != UNAWARE_VID) ++ sparx5_mact_forget(sparx5, dev->broadcast, vid); + return 0; + } + diff --git a/patches/linux/6.18.55/0083-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch b/patches/linux/6.18.55/0083-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch new file mode 100644 index 000000000..cb65ffad2 --- /dev/null +++ b/patches/linux/6.18.55/0083-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch @@ -0,0 +1,156 @@ +From c0c446e79374a598604094798360c82f1e1649e7 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:55:02 +0200 +Subject: [PATCH 83/85] net: sparx5: fix MAC table entry shared by bridge VID 0 + and VID 1 + +The MAC address of a bridge created with vlan_default_pvid 0 is +missing from the MAC table, so unicast to the bridge IP address is +flooded to the ports instead of reaching the CPU: + + ip link add br0 address $mac type bridge vlan_default_pvid 0 + +The bridge notifies its own address as a local FDB entry on VID 0 and +on every VLAN of the bridge, VLAN 1 included until vlan_default_pvid +0 removes it. The driver maps VID 0 to UNAWARE_VID, so both entries +are learned as the same MAC table entry, and the delete of the VLAN 1 +entry forgets it while the VID 0 entry is still in use. Removing +VLAN 1 from a bridge with the default PVID loses the entry the same +way. + +Track the bridge VIDs using a locked MAC table entry and forget it +only when the last one is deleted. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 35 +++++++++++++++++-- + .../microchip/sparx5/sparx5_switchdev.c | 15 ++------ + 2 files changed, 36 insertions(+), 14 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 57efab569805c..53e95aaad5e6a 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -39,8 +39,25 @@ struct sparx5_mact_entry { + #define MAC_ENT_LOCK BIT(2) + u16 vid; + u16 port; ++ u8 refs; /* Bridge VIDs using a locked entry */ ++#define MAC_ENT_REF_VID BIT(0) /* The entry's own VID */ ++#define MAC_ENT_REF_UNAWARE BIT(1) /* Bridge VID 0, see UNAWARE_VID */ + }; + ++/* Bridge VID 0 is mapped to UNAWARE_VID, to keep clear of the standalone ++ * ports on NULL_VID, so it shares the MAC table entry with that VID. ++ */ ++static u16 sparx5_mact_bridge_vid(u16 vid, u8 *ref) ++{ ++ if (vid == NULL_VID) { ++ *ref = MAC_ENT_REF_UNAWARE; ++ return UNAWARE_VID; ++ } ++ ++ *ref = MAC_ENT_REF_VID; ++ return vid; ++} ++ + static int sparx5_mact_get_status(struct sparx5 *sparx5) + { + return spx5_rd(sparx5, LRN_COMMON_ACCESS_CTRL); +@@ -354,6 +371,13 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + struct sparx5_mact_entry *mact_entry; + int ret; + u32 cfg2; ++ u8 ref; ++ ++ vid = sparx5_mact_bridge_vid(vid, &ref); ++ ++ mact_entry = find_mact_entry(sparx5, addr, vid, portno); ++ if (mact_entry && mact_entry->flags & MAC_ENT_LOCK) ++ mact_entry->refs |= ref; + + ret = sparx5_mact_find(sparx5, addr, vid, &cfg2); + if (!ret) +@@ -365,7 +389,6 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + * mact thread to start the frame will reach CPU and the CPU will + * add the entry but without the extern_learn flag. + */ +- mact_entry = find_mact_entry(sparx5, addr, vid, portno); + if (mact_entry) + goto update_hw; + +@@ -386,6 +409,7 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + /* New entry? */ + if (mact_entry->flags == 0) { + mact_entry->flags |= MAC_ENT_LOCK; /* Don't age this */ ++ mact_entry->refs = ref; + sparx5_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, addr, vid, + dev, true); + } +@@ -398,6 +422,9 @@ int sparx5_del_mact_entry(struct sparx5 *sparx5, + u16 vid) + { + struct sparx5_mact_entry *mact_entry, *tmp; ++ u8 ref; ++ ++ vid = sparx5_mact_bridge_vid(vid, &ref); + + /* Delete the entry in SW MAC table not to get the notification when + * SW is pulling again +@@ -405,8 +432,12 @@ int sparx5_del_mact_entry(struct sparx5 *sparx5, + mutex_lock(&sparx5->mact_lock); + list_for_each_entry_safe(mact_entry, tmp, &sparx5->mact_entries, + list) { +- if ((vid == 0 || mact_entry->vid == vid) && ++ if (mact_entry->vid == vid && + ether_addr_equal(addr, mact_entry->mac)) { ++ mact_entry->refs &= ~ref; ++ if (mact_entry->refs) ++ continue; ++ + sparx5_mact_forget(sparx5, addr, mact_entry->vid); + + list_del(&mact_entry->list); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 1c81efd7fbbaa..973d3b0f26e74 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -329,7 +329,6 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + struct sparx5_port *port; + struct sparx5 *sparx5; + bool host_addr; +- u16 vid; + + rtnl_lock(); + if (!sparx5_netdevice_check(dev)) { +@@ -343,26 +342,18 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + + fdb_info = &switchdev_work->fdb_info; + +- /* Used PVID 1 when default_pvid is 0, to avoid +- * collision with non-bridged ports. +- */ +- if (fdb_info->vid == NULL_VID) +- vid = UNAWARE_VID; +- else +- vid = fdb_info->vid; +- + switch (switchdev_work->event) { + case SWITCHDEV_FDB_ADD_TO_DEVICE: + if (host_addr) + sparx5_add_mact_entry(sparx5, dev, + sparx5_get_pgid(sparx5, PGID_CPU), +- fdb_info->addr, vid); ++ fdb_info->addr, fdb_info->vid); + else + sparx5_add_mact_entry(sparx5, port->ndev, port->portno, +- fdb_info->addr, vid); ++ fdb_info->addr, fdb_info->vid); + break; + case SWITCHDEV_FDB_DEL_TO_DEVICE: +- sparx5_del_mact_entry(sparx5, fdb_info->addr, vid); ++ sparx5_del_mact_entry(sparx5, fdb_info->addr, fdb_info->vid); + break; + } + diff --git a/patches/linux/6.18.55/0084-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch b/patches/linux/6.18.55/0084-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch new file mode 100644 index 000000000..96688b0f3 --- /dev/null +++ b/patches/linux/6.18.55/0084-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch @@ -0,0 +1,73 @@ +From 4e84ebd8221db517ac49f3b70b4caff94179ca55 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:55:20 +0200 +Subject: [PATCH 84/85] net: sparx5: fix loss of a bridged port's MAC entry on + link down + +Taking a bridged port down forgets its MAC address on the bridge VID, +and changing the address forgets the old one the same way. When the +bridge uses the address of that port, as it does by default with its +first port, the bridge IP address is unreachable until the port comes +up again: + + ip link set eth0 down # bridge MAC entry gone + ip link set eth0 up # back again + +The driver learns the port address to the CPU on NETDEV_PRE_UP and +forgets it on NETDEV_DOWN and on address change, at the port's current +PVID. For a standalone port that is its own VID, but once bridged the +port shares the VID with the bridge, whose local FDB entries the driver +already tracks. The bridge keeps them when a port goes down and moves +them when its address changes, so the driver must not touch them. + +Leave the MAC table alone on up, down and address change of a bridged +port. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../net/ethernet/microchip/sparx5/sparx5_netdev.c | 15 +++++++++------ + .../ethernet/microchip/sparx5/sparx5_switchdev.c | 4 ++++ + 2 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +index 1d34af78166a3..e12b997a4aec8 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +@@ -193,12 +193,15 @@ static int sparx5_set_mac_address(struct net_device *dev, void *p) + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + +- /* Remove current */ +- sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); +- +- /* Add new */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr->sa_data, port->pvid); ++ /* The bridge keeps the entries of its ports */ ++ if (!test_bit(port->portno, sparx5->bridge_mask)) { ++ /* Remove current */ ++ sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); ++ ++ /* Add new */ ++ sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), ++ addr->sa_data, port->pvid); ++ } + + /* Record the address */ + eth_hw_addr_set(dev, addr->sa_data); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 973d3b0f26e74..a9726944fafd3 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -276,6 +276,10 @@ static int sparx5_port_add_addr(struct net_device *dev, bool up) + struct sparx5 *sparx5 = port->sparx5; + u16 vid = port->pvid; + ++ /* The bridge keeps the entries of its ports */ ++ if (test_bit(port->portno, sparx5->bridge_mask)) ++ return 0; ++ + if (up) + sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), + port->ndev->dev_addr, vid); diff --git a/patches/linux/6.18.55/0085-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch b/patches/linux/6.18.55/0085-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch new file mode 100644 index 000000000..c5a6b06e7 --- /dev/null +++ b/patches/linux/6.18.55/0085-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch @@ -0,0 +1,274 @@ +From 6f9fc144c6b554f93092071f81b3f4ff7c35f998 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Fri, 9 Oct 2026 10:12:29 +0200 +Subject: [PATCH 85/85] net: sparx5: share the CPU MAC entry of standalone + ports with one address + +Taking one port of a LACP aggregate down stops unicast to the aggregate +on the remaining ports, and deleting the aggregate leaves the port whose +address the bond used unreachable until it is taken down and up again: + + ip link add lag0 type bond mode 802.3ad + ip link set e6 master lag0 # bond and both ports now use e6's MAC + ip link set e8 master lag0 + ip link set e6 down # unicast to the bond MAC stops on e8 + ip link del lag0 # e6 keeps its MAC, loses its CPU entry + +The bond sets the address of its first port on every port. A standalone +port learns its address to the CPU on NETDEV_PRE_UP and forgets it on +NETDEV_DOWN and on address change, and with ports sharing an address +the forget of one port removes the entry the others still use. The +multicast entries of standalone ports had the same problem, fixed in +commit "net: sparx5: fix multicast delivery to the CPU on standalone +ports" by sharing them through a reference-counted list. + +Keep the port addresses in that list as well. A standalone port holds +a reference on its address while up, drops it on down, on bridge join +and on address change, and takes it back on bridge leave; the entry is +forgotten with the last reference. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 70 +++++++++++-------- + .../ethernet/microchip/sparx5/sparx5_main.h | 12 ++-- + .../ethernet/microchip/sparx5/sparx5_netdev.c | 9 ++- + .../microchip/sparx5/sparx5_switchdev.c | 12 ++-- + 4 files changed, 60 insertions(+), 43 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 53e95aaad5e6a..61ac0ad7dc056 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -133,54 +133,54 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + return ret; + } + +-/* Standalone ports share pvid, hence the CPU multicast MAC entry too */ +-struct sparx5_mc_cpu_entry { ++/* Standalone ports share pvid, hence their CPU MAC entries too */ ++struct sparx5_cpu_entry { + struct list_head list; + unsigned char addr[ETH_ALEN]; + u16 vid; + int refcnt; + }; + +-static struct sparx5_mc_cpu_entry * +-sparx5_mc_cpu_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) ++static struct sparx5_cpu_entry * ++sparx5_cpu_entry_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) + { +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + +- list_for_each_entry(e, &sparx5->mc_cpu_entries, list) ++ list_for_each_entry(e, &sparx5->cpu_entries, list) + if (e->vid == vid && ether_addr_equal(e->addr, addr)) + return e; + + return NULL; + } + +-int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) ++/* Forget the CPU entry of addr on vid when its last user is gone */ ++int sparx5_cpu_entry_put(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid) + { +- struct sparx5_port *port = netdev_priv(dev); +- struct sparx5 *sparx5 = port->sparx5; +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + int ret = 0; + +- spin_lock(&sparx5->mc_cpu_lock); +- e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ spin_lock(&sparx5->cpu_lock); ++ e = sparx5_cpu_entry_find(sparx5, addr, vid); + if (e && --e->refcnt == 0) { + list_del(&e->list); + kfree(e); +- ret = sparx5_mact_forget(sparx5, addr, port->pvid); ++ ret = sparx5_mact_forget(sparx5, addr, vid); + } +- spin_unlock(&sparx5->mc_cpu_lock); ++ spin_unlock(&sparx5->cpu_lock); + + return ret; + } + +-int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) ++/* Learn addr on vid to the CPU for its first user */ ++int sparx5_cpu_entry_get(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid) + { +- struct sparx5_port *port = netdev_priv(dev); +- struct sparx5 *sparx5 = port->sparx5; +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + int ret = 0; + +- spin_lock(&sparx5->mc_cpu_lock); +- e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ spin_lock(&sparx5->cpu_lock); ++ e = sparx5_cpu_entry_find(sparx5, addr, vid); + if (!e) { + e = kmalloc(sizeof(*e), GFP_ATOMIC); + if (!e) { +@@ -190,24 +190,38 @@ int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) + + ret = sparx5_mact_learn(sparx5, + sparx5_get_pgid(sparx5, PGID_CPU), +- addr, port->pvid); ++ addr, vid); + if (ret) { + kfree(e); + goto out; + } + + ether_addr_copy(e->addr, addr); +- e->vid = port->pvid; ++ e->vid = vid; + e->refcnt = 0; +- list_add_tail(&e->list, &sparx5->mc_cpu_entries); ++ list_add_tail(&e->list, &sparx5->cpu_entries); + } + e->refcnt++; + out: +- spin_unlock(&sparx5->mc_cpu_lock); ++ spin_unlock(&sparx5->cpu_lock); + + return ret; + } + ++int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) ++{ ++ struct sparx5_port *port = netdev_priv(dev); ++ ++ return sparx5_cpu_entry_put(port->sparx5, addr, port->pvid); ++} ++ ++int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) ++{ ++ struct sparx5_port *port = netdev_priv(dev); ++ ++ return sparx5_cpu_entry_get(port->sparx5, addr, port->pvid); ++} ++ + static int sparx5_mact_get(struct sparx5 *sparx5, + unsigned char mac[ETH_ALEN], + u16 *vid, u32 *pcfg2) +@@ -581,8 +595,8 @@ void sparx5_set_ageing(struct sparx5 *sparx5, int msecs) + void sparx5_mact_init(struct sparx5 *sparx5) + { + spin_lock_init(&sparx5->lock); +- spin_lock_init(&sparx5->mc_cpu_lock); +- INIT_LIST_HEAD(&sparx5->mc_cpu_entries); ++ spin_lock_init(&sparx5->cpu_lock); ++ INIT_LIST_HEAD(&sparx5->cpu_entries); + + /* Flush MAC table */ + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | +@@ -597,9 +611,9 @@ void sparx5_mact_init(struct sparx5 *sparx5) + + void sparx5_mact_deinit(struct sparx5 *sparx5) + { +- struct sparx5_mc_cpu_entry *e, *tmp; ++ struct sparx5_cpu_entry *e, *tmp; + +- list_for_each_entry_safe(e, tmp, &sparx5->mc_cpu_entries, list) { ++ list_for_each_entry_safe(e, tmp, &sparx5->cpu_entries, list) { + list_del(&e->list); + kfree(e); + } +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index 54103e8b091f7..a0e1a768e692a 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -408,10 +408,10 @@ struct sparx5 { + struct list_head mdb_entries; + /* mdb list mutex */ + struct mutex mdb_lock; +- /* CPU multicast entries, shared by the standalone ports */ +- struct list_head mc_cpu_entries; +- /* mc_cpu_entries lock */ +- spinlock_t mc_cpu_lock; ++ /* CPU entries, shared by the standalone ports */ ++ struct list_head cpu_entries; ++ /* cpu_entries lock */ ++ spinlock_t cpu_lock; + struct delayed_work mact_work; + struct workqueue_struct *mact_queue; + /* Board specifics */ +@@ -491,6 +491,10 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + int sparx5_del_mact_entry(struct sparx5 *sparx5, + const unsigned char *addr, + u16 vid); ++int sparx5_cpu_entry_get(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid); ++int sparx5_cpu_entry_put(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid); + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr); + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr); + void sparx5_set_ageing(struct sparx5 *sparx5, int msecs); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +index e12b997a4aec8..b6dbbf1e994c2 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +@@ -193,14 +193,13 @@ static int sparx5_set_mac_address(struct net_device *dev, void *p) + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + +- /* The bridge keeps the entries of its ports */ +- if (!test_bit(port->portno, sparx5->bridge_mask)) { ++ /* The bridge keeps the entries of its ports, a port that is down has none */ ++ if (!test_bit(port->portno, sparx5->bridge_mask) && netif_running(dev)) { + /* Remove current */ +- sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); ++ sparx5_cpu_entry_put(sparx5, dev->dev_addr, port->pvid); + + /* Add new */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr->sa_data, port->pvid); ++ sparx5_cpu_entry_get(sparx5, addr->sa_data, port->pvid); + } + + /* Record the address */ +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index a9726944fafd3..15cbc5ba28428 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -199,7 +199,8 @@ static int sparx5_port_bridge_join(struct sparx5_port *port, + goto err_switchdev_offload; + + /* Remove standalone port entry */ +- sparx5_mact_forget(sparx5, ndev->dev_addr, 0); ++ if (netif_running(ndev)) ++ sparx5_cpu_entry_put(sparx5, ndev->dev_addr, NULL_VID); + + /* Port enters in bridge mode therefore don't need to copy to CPU + * frames for multicast in case the bridge is not requesting them +@@ -236,8 +237,8 @@ static void sparx5_port_bridge_leave(struct sparx5_port *port, + port->vid = NULL_VID; + + /* Forward frames to CPU */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- port->ndev->dev_addr, 0); ++ if (netif_running(port->ndev)) ++ sparx5_cpu_entry_get(sparx5, port->ndev->dev_addr, NULL_VID); + + /* Port enters in host more therefore restore mc list */ + __dev_mc_sync(port->ndev, sparx5_mc_sync, sparx5_mc_unsync); +@@ -281,10 +282,9 @@ static int sparx5_port_add_addr(struct net_device *dev, bool up) + return 0; + + if (up) +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- port->ndev->dev_addr, vid); ++ sparx5_cpu_entry_get(sparx5, port->ndev->dev_addr, vid); + else +- sparx5_mact_forget(sparx5, port->ndev->dev_addr, vid); ++ sparx5_cpu_entry_put(sparx5, port->ndev->dev_addr, vid); + + return 0; + } diff --git a/src/confd/src/ptp.c b/src/confd/src/ptp.c index e35e2cc85..51a04ea7d 100644 --- a/src/confd/src/ptp.c +++ b/src/confd/src/ptp.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: BSD-3-Clause */ #include +#include #include #include @@ -107,6 +108,52 @@ static uint16_t instance(struct lyd_node *inst) return (uint16_t)atoi(lydx_get_cattr(inst, "instance-index")); } +/* + * Time stamp with the PTP hardware clock of the interface's own device + * rather than a PHY's. The kernel prefers a PHY that can time stamp, + * which on a switch scatters the ports over one clock per PHY, while the + * switch clock covers every port and drives the TSN schedules. The + * selection survives link down and up, so once per instance is enough. + */ +static void select_device_phc(const char *ifname) +{ + char path[PATH_MAX], dev[PATH_MAX], phc[PATH_MAX]; + struct dirent *ent; + int found = -1; + DIR *dir; + + snprintf(path, sizeof(path), "/sys/class/net/%s/device", ifname); + if (!realpath(path, dev)) + return; + + dir = opendir("/sys/class/ptp"); + if (!dir) + return; + + while ((ent = readdir(dir))) { + int idx; + + if (sscanf(ent->d_name, "ptp%d", &idx) != 1) + continue; + + snprintf(path, sizeof(path), "/sys/class/ptp/%s/device", ent->d_name); + if (!realpath(path, phc) || strcmp(phc, dev)) + continue; + + /* A device with several clocks reports the lowest as its PHC */ + if (found < 0 || idx < found) + found = idx; + } + closedir(dir); + + if (found < 0) + return; + + if (systemf("ethtool --set-hwtimestamp-cfg %s index %d qualifier precise" + " >/dev/null 2>&1", ifname, found)) + WARN("Failed selecting /dev/ptp%d for time stamping on %s", found, ifname); +} + /* * Scan all ports of inst and determine whether to use hardware or software * timestamping. Emits a syslog WARNING when falling back to software due @@ -181,6 +228,10 @@ static int write_instance_conf(struct lyd_node *inst, json_t *root) ts = instance_time_stamping(idx, inst, root); fprintf(fp, "time_stamping %s\n", ts); + /* PHY timestamps arrive over MDIO, later than ptp4l's 10 ms default */ + if (!strcmp(ts, "hardware")) + fprintf(fp, "tx_timestamp_timeout 100\n"); + /* Profile — sets transportSpecific and all protocol-mandatory options */ dot1as = emit_profile_globals(fp, profile, !strcmp(ts, "hardware")); @@ -261,6 +312,9 @@ static int write_instance_conf(struct lyd_node *inst, json_t *root) if (!lydx_is_enabled(port_ds, "port-enable")) continue; + if (!strcmp(ts, "hardware")) + select_device_phc(iface); + fprintf(fp, "[%s]\n", iface); v = lydx_get_cattr(port_ds, "log-announce-interval"); diff --git a/utils/kernel-refresh.sh b/utils/kernel-refresh.sh index c7b2a269b..d3a7d9fa1 100755 --- a/utils/kernel-refresh.sh +++ b/utils/kernel-refresh.sh @@ -7,12 +7,14 @@ usage() Synchronize patches/linux/\$TAG with changes from a kernel GIT tree. Usage: - $0 -k kernel-dir -o old-version [-t kernel-tag] [-p patch-dir] [-d defconfig-dir] + $0 -k kernel-dir [-o old-version] [-t kernel-tag] [-p patch-dir] [-d defconfig-dir] Options: -h This help text -k kernel-dir Path to kernel tree - -o old-version Version to be replaced by new kernel version + -o old-version Version to be replaced by new kernel version. Only + when upgrading: removes patches/linux/\$old-version, + bumps the defconfigs and refreshes linux.hash -t kernel-tag Base tag from which to generate patches. Default: "v" + \$BR2_LINUX_KERNEL_VERSION -p patch-dir Path to kernel patches directory @@ -91,6 +93,12 @@ DEFCONFIG_DIR=$(readlink -f $DEFCONFIG_DIR) git ls-files --error-unmatch $PATCH_DIR 1>/dev/null 2>&1 && git -C $PATCH_DIR rm -f *.patch git -C $KERNEL_DIR format-patch --no-signoff --no-encode-email-headers --no-cover-letter --no-signature -o $PATCH_DIR $KERNEL_TAG..HEAD git -C $PATCH_DIR add *.patch + +# Same version: patches refreshed, nothing more to do +if [ -z "$OLD_VER" ] || [ "$OLD_VER" = "$NEW_VER" ]; then + exit 0 +fi + if [ -d ${PATCHES_BASE}/${OLD_VER} ]; then git rm -rf ${PATCHES_BASE}/${OLD_VER} fi