diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index cb0094027..745b8ff8d 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -33,6 +33,11 @@ All notable changes to the project are documented in this file. - The CLI `configure` command takes an optional path to start in a sub-context directly, e.g., `configure system authentication` +### Fixes + +- Fix #1619: Raspberry Pi kernel panic when configure Wi-Fi + + [v26.08.0][] - 2026-09-01 ------------------------- diff --git a/patches/linux/6.18.50/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch b/patches/linux/6.18.50/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch index 2773092a5..0bef05776 100644 --- a/patches/linux/6.18.50/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch +++ b/patches/linux/6.18.50/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch @@ -1,8 +1,9 @@ From ab4c4fd9f9bbea804925171894fb1a2fac257bd4 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 19 Sep 2023 18:38:10 +0200 -Subject: [PATCH 01/64] net: phy: marvell10g: Support firmware loading on +Subject: [PATCH 01/68] net: phy: marvell10g: Support firmware loading on 88X3310 +Organization: Wires When probing, if a device is waiting for firmware to be loaded into its RAM, ask userspace for the binary and load it over XMDIO. @@ -15,7 +16,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.50/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch b/patches/linux/6.18.50/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch index b4c4c3b68..1fce5c7f3 100644 --- a/patches/linux/6.18.50/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch +++ b/patches/linux/6.18.50/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch @@ -1,8 +1,9 @@ From 5b85944a8ee47aa04762b2dd60087b82fbfdc020 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 21 Nov 2023 20:15:24 +0100 -Subject: [PATCH 02/64] net: phy: marvell10g: Fix power-up when strapped to +Subject: [PATCH 02/68] net: phy: marvell10g: Fix power-up when strapped to start powered down +Organization: Wires On devices which are hardware strapped to start powered down (PDSTATE == 1), make sure that we clear the power-down bit on all units @@ -12,7 +13,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.50/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch b/patches/linux/6.18.50/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch index 660ce7dfc..4adc30fee 100644 --- a/patches/linux/6.18.50/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch +++ b/patches/linux/6.18.50/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch @@ -1,7 +1,8 @@ From 41f5a774cf4f3c26d0ea8f4e8eb0dcff53fdfa7a Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 15 Nov 2023 20:58:42 +0100 -Subject: [PATCH 03/64] net: phy: marvell10g: Add LED support for 88X3310 +Subject: [PATCH 03/68] net: phy: marvell10g: Add LED support for 88X3310 +Organization: Wires Pickup the LEDs from the state in which the hardware reset or bootloader left them, but also support further configuration via @@ -21,7 +22,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.50/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch b/patches/linux/6.18.50/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch index a4baadb8e..91a291c75 100644 --- a/patches/linux/6.18.50/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch +++ b/patches/linux/6.18.50/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch @@ -1,8 +1,9 @@ From d60bcf1484f593235e3a38d776082bb0400d5df8 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Dec 2023 09:51:05 +0100 -Subject: [PATCH 04/64] net: phy: marvell10g: Support LEDs tied to a single +Subject: [PATCH 04/68] net: phy: marvell10g: Support LEDs tied to a single media side +Organization: Wires In a combo-port setup, i.e. where both the copper and fiber interface are available to the user, the LEDs may be physically located either @@ -18,7 +19,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.50/0005-net-phy-Do-not-resume-PHY-when-attaching.patch b/patches/linux/6.18.50/0005-net-phy-Do-not-resume-PHY-when-attaching.patch index 697d40569..9f3272acc 100644 --- a/patches/linux/6.18.50/0005-net-phy-Do-not-resume-PHY-when-attaching.patch +++ b/patches/linux/6.18.50/0005-net-phy-Do-not-resume-PHY-when-attaching.patch @@ -1,7 +1,8 @@ From 83ca5882b57f1fa246351f876e125fe1afc4ff21 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 10:10:19 +0100 -Subject: [PATCH 05/64] net: phy: Do not resume PHY when attaching +Subject: [PATCH 05/68] net: phy: Do not resume PHY when attaching +Organization: Wires The PHY should not start negotiating with its link-partner until explicitly instructed to do so. @@ -19,7 +20,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.50/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch b/patches/linux/6.18.50/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch index 9cd248e53..49495f633 100644 --- a/patches/linux/6.18.50/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch +++ b/patches/linux/6.18.50/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch @@ -1,8 +1,9 @@ From 1154680e2ba1750138ffe65bef4457e3b59b943b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 4 Mar 2024 16:47:28 +0100 -Subject: [PATCH 06/64] net: bridge: avoid classifying unknown multicast as +Subject: [PATCH 06/68] net: bridge: avoid classifying unknown multicast as mrouters_only +Organization: Wires Unknown multicast, MAC/IPv4/IPv6, should always be flooded according to the per-port mcast_flood setting, as well as to detected and configured @@ -26,7 +27,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 +39,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 +62,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 525d4eccd194..6278dfc9612f 100644 +index 525d4eccd194a..6278dfc9612f5 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 +102,7 @@ index 525d4eccd194..6278dfc9612f 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 +141,7 @@ index dea09096ad0f..f0a613238e0d 100644 continue; break; diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c -index 2cbae0f9ae1f..0c539bf4bebe 100644 +index 2cbae0f9ae1f0..0c539bf4bebec 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 +171,7 @@ index 2cbae0f9ae1f..0c539bf4bebe 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 c2a5af45df20..6fb2791714f0 100644 +index c2a5af45df204..6fb2791714f07 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -3837,6 +3837,11 @@ static void br_multicast_err_count(const struct net_bridge *br, @@ -206,7 +207,7 @@ index c2a5af45df20..6fb2791714f0 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 2b451f3f72a6..2b8fc60022fb 100644 +index 2b451f3f72a6a..2b8fc60022fb8 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -489,6 +489,7 @@ enum net_bridge_opts { diff --git a/patches/linux/6.18.50/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch b/patches/linux/6.18.50/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch index 22d404f4d..f53e1e0c1 100644 --- a/patches/linux/6.18.50/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch +++ b/patches/linux/6.18.50/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch @@ -1,8 +1,9 @@ From 533e5ece92d5d40a54bdad9a523844f34f939fc8 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 5 Mar 2024 06:44:41 +0100 -Subject: [PATCH 07/64] net: bridge: Ignore router ports when forwarding L2 +Subject: [PATCH 07/68] net: bridge: Ignore router ports when forwarding L2 multicast +Organization: Wires Multicast router ports are either statically configured or learned from control protocol traffic (IGMP/MLD/PIM). These protocols regulate IP @@ -16,7 +17,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 2b8fc60022fb..d8ab2557cd79 100644 +index 2b8fc60022fb8..d8ab2557cd798 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h @@ -1097,7 +1097,10 @@ br_multicast_get_first_rport_node(struct net_bridge_mcast *brmctx, diff --git a/patches/linux/6.18.50/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch b/patches/linux/6.18.50/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch index e7d721d81..aab494967 100644 --- a/patches/linux/6.18.50/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch +++ b/patches/linux/6.18.50/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch @@ -1,8 +1,9 @@ From e04ddb66fd53160f10f0ab7607c32cf6f006acdf Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 4 Apr 2024 16:36:30 +0200 -Subject: [PATCH 08/64] net: bridge: drop delay for applying strict multicast +Subject: [PATCH 08/68] net: bridge: drop delay for applying strict multicast filtering +Organization: Wires This *local* patch drops the initial delay before applying strict multicast filtering, introduced in [1] and recently updated in [2]. @@ -24,7 +25,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 6fb2791714f0..36826beae7f8 100644 +index 6fb2791714f07..36826beae7f84 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c @@ -1760,10 +1760,6 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t) @@ -163,7 +164,7 @@ index 6fb2791714f0..36826beae7f8 100644 #endif diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h -index d8ab2557cd79..68ddec76d820 100644 +index d8ab2557cd798..68ddec76d820f 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.50/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch b/patches/linux/6.18.50/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch index 0e24e610d..436045ab5 100644 --- a/patches/linux/6.18.50/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch +++ b/patches/linux/6.18.50/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch @@ -1,8 +1,9 @@ From 352da9ff291b218f8f81372c2f6b15c368fda210 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 16 May 2024 14:51:54 +0200 -Subject: [PATCH 09/64] net: bridge: Differentiate MDB additions from +Subject: [PATCH 09/68] net: bridge: Differentiate MDB additions from modifications +Organization: Wires Before this change, the reception of an IGMPv3 report (and analogously for MLDv2) that adds a new group, would trigger two MDB RTM_NEWMDB @@ -27,7 +28,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 +41,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 400eb872b403..cd7a2cd0911a 100644 +index 400eb872b4032..cd7a2cd0911ad 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 +63,7 @@ index 400eb872b403..cd7a2cd0911a 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 36826beae7f8..40db57508d64 100644 +index 36826beae7f84..40db57508d648 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.50/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch b/patches/linux/6.18.50/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch index 25b31ef95..c15e8ffae 100644 --- a/patches/linux/6.18.50/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch +++ b/patches/linux/6.18.50/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch @@ -1,8 +1,9 @@ From d48f8b23e3ced1490ecf49e0970ccec9c0fceb34 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 24 Nov 2023 23:29:55 +0100 -Subject: [PATCH 10/64] nvmem: layouts: onie-tlv: Let device probe even when +Subject: [PATCH 10/68] nvmem: layouts: onie-tlv: Let device probe even when TLV is invalid +Organization: Wires Before this change, probing an NVMEM device, expected to contain a valid TLV, would fail if it had not been provisioned yet. But an @@ -17,7 +18,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.50/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch b/patches/linux/6.18.50/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch index 747088a25..b119dfcd8 100644 --- a/patches/linux/6.18.50/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch +++ b/patches/linux/6.18.50/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch @@ -1,8 +1,9 @@ From 3363e334550d7db65f91df18d76346b4ef85566e Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 11 Aug 2024 11:27:35 +0200 -Subject: [PATCH 11/64] net: usb: r8152: add r8153b support for link/activity +Subject: [PATCH 11/68] net: usb: r8152: add r8153b support for link/activity LEDs +Organization: Wires This patch adds support for the link/activity LEDs on the NanoPi R2S and OrangePi R1 Plus. @@ -18,7 +19,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.50/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch b/patches/linux/6.18.50/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch index 053cf67eb..1e2904ce9 100644 --- a/patches/linux/6.18.50/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch +++ b/patches/linux/6.18.50/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch @@ -1,8 +1,9 @@ From fac6a9ea1fd4864e820d56ee1376ff743c2578e8 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 10 Aug 2025 18:52:54 +0200 -Subject: [PATCH 12/64] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to +Subject: [PATCH 12/68] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to match case +Organization: Wires For ref. see: https://wiki.banana-pi.org/File:Bpi-r3_Metal_case.jpg @@ -15,7 +16,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.50/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch b/patches/linux/6.18.50/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch index 6b7b6ed82..5e6633769 100644 --- a/patches/linux/6.18.50/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch +++ b/patches/linux/6.18.50/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch @@ -1,8 +1,9 @@ From f3b85550d0df5511f32bdc284dad9f31b5ac72d3 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 20 Aug 2025 21:38:24 +0200 -Subject: [PATCH 13/64] drm/panel-simple: Add a timing for the Raspberry Pi 7" +Subject: [PATCH 13/68] drm/panel-simple: Add a timing for the Raspberry Pi 7" panel +Organization: Wires The Raspberry Pi 7" 800x480 panel uses a Toshiba TC358762 DSI to DPI bridge chip, so there is a requirement for the timings @@ -46,7 +47,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 ef1c4b9299ee..c3512eb819e1 100644 +index ef1c4b9299ee4..c3512eb819e13 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.50/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch b/patches/linux/6.18.50/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch index 9b196bf1c..514712997 100644 --- a/patches/linux/6.18.50/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch +++ b/patches/linux/6.18.50/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch @@ -1,7 +1,8 @@ From 4d0c53b5030426e90d010f9afbdfc221eb210a90 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Thu, 21 Aug 2025 11:20:23 +0200 -Subject: [PATCH 14/64] input:touchscreen:edt-ft5x06: Add polled mode +Subject: [PATCH 14/68] input:touchscreen:edt-ft5x06: Add polled mode +Organization: Wires Not all hardware has interrupts therefore we need to poll the touchscreen. @@ -10,7 +11,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.50/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch b/patches/linux/6.18.50/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch index 004f93acd..52205dbd5 100644 --- a/patches/linux/6.18.50/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch +++ b/patches/linux/6.18.50/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch @@ -1,8 +1,9 @@ From 4768de2516f6dea2989164aa6eb62f603df94b91 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Mar 2024 10:27:24 +0100 -Subject: [PATCH 15/64] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for +Subject: [PATCH 15/68] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for PPU on 6393X +Organization: Wires In a multi-chip setup, delays of up to 750ms are observed before the device (6393X) signals completion of PPU initialization (Global 1, @@ -12,7 +13,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 09002c853b78..22f4fe642578 100644 +index 09002c853b78e..22f4fe642578c 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.50/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch b/patches/linux/6.18.50/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch index db198c12a..b087528fe 100644 --- a/patches/linux/6.18.50/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch +++ b/patches/linux/6.18.50/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch @@ -1,8 +1,9 @@ From 4cd66c828a4330fe034b9cadbf07235af9e24190 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 15:52:43 +0100 -Subject: [PATCH 16/64] net: dsa: mv88e6xxx: Improve indirect register access +Subject: [PATCH 16/68] net: dsa: mv88e6xxx: Improve indirect register access perf on 6393 +Organization: Wires When operating in multi-chip mode, the 6393 family maps a subset of commonly used global registers to the outermost address space (in @@ -21,7 +22,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 22f4fe642578..c51588e74aed 100644 +index 22f4fe642578c..c51588e74aedb 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -6543,6 +6543,13 @@ static int mv88e6xxx_detect(struct mv88e6xxx_chip *chip) @@ -39,7 +40,7 @@ index 22f4fe642578..c51588e74aed 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 +54,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 +68,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 +169,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.50/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch b/patches/linux/6.18.50/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch index 91998de31..5797b4c71 100644 --- a/patches/linux/6.18.50/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch +++ b/patches/linux/6.18.50/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch @@ -1,8 +1,9 @@ From 226758760cb3ffd20b717da59c08e9830f3183fe Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Mon, 22 Apr 2024 23:18:01 +0200 -Subject: [PATCH 17/64] net: dsa: mv88e6xxx: Honor ports being managed via +Subject: [PATCH 17/68] net: dsa: mv88e6xxx: Honor ports being managed via in-band-status +Organization: Wires Keep all link parameters in their unforced states when the port is declared as being managed via in-band-status, and let the MAC @@ -17,7 +18,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 c51588e74aed..de230df48545 100644 +index c51588e74aedb..de230df48545d 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.50/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch b/patches/linux/6.18.50/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch index 0c29ee490..ffafb0a43 100644 --- a/patches/linux/6.18.50/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch +++ b/patches/linux/6.18.50/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch @@ -1,8 +1,9 @@ From 8e0f889fb712a8793b1af4084a99da2426f1ea57 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 24 Apr 2024 22:41:04 +0200 -Subject: [PATCH 18/64] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user +Subject: [PATCH 18/68] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user ports on 6393X +Organization: Wires For packets with a DA in the IEEE reserved L2 group range, originating from a CPU, forward it as normal, rather than classifying it as @@ -33,7 +34,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.50/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch b/patches/linux/6.18.50/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch index 4313e29a7..86ffaf8d6 100644 --- a/patches/linux/6.18.50/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch +++ b/patches/linux/6.18.50/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch @@ -1,8 +1,9 @@ From 3d7b4c64b3596c1e1ace773003ce5ae07a7dccf2 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 10:38:42 +0200 -Subject: [PATCH 19/64] net: dsa: tag_dsa: Use tag priority as initial +Subject: [PATCH 19/68] net: dsa: tag_dsa: Use tag priority as initial skb->priority +Organization: Wires Use the 3-bit priority field from the DSA tag as the initial packet priority on ingress to the CPU. @@ -23,7 +24,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.50/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch b/patches/linux/6.18.50/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch index 481458e06..f93c8ceb4 100644 --- a/patches/linux/6.18.50/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch +++ b/patches/linux/6.18.50/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch @@ -1,8 +1,9 @@ From 84c8a0c195f4c657c0bdf5a8b90fc416f8e6f71b Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 16 Jan 2024 16:00:55 +0100 -Subject: [PATCH 20/64] net: dsa: Support MDB memberships whose L2 addresses +Subject: [PATCH 20/68] net: dsa: Support MDB memberships whose L2 addresses overlap +Organization: Wires Multiple IP multicast groups (32 for v4, 2^80 for v6) map to the same L2 address. This means that switchdev drivers may receive multiple MDB @@ -33,7 +34,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.50/0021-net-dsa-Support-EtherType-based-priority-overrides.patch b/patches/linux/6.18.50/0021-net-dsa-Support-EtherType-based-priority-overrides.patch index 5daaad802..aa1022dfa 100644 --- a/patches/linux/6.18.50/0021-net-dsa-Support-EtherType-based-priority-overrides.patch +++ b/patches/linux/6.18.50/0021-net-dsa-Support-EtherType-based-priority-overrides.patch @@ -1,7 +1,8 @@ From 4bfe4e4f8ac17af3736c59fb00a245d8d96cc7b0 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 21 Mar 2024 19:12:15 +0100 -Subject: [PATCH 21/64] net: dsa: Support EtherType based priority overrides +Subject: [PATCH 21/68] net: dsa: Support EtherType based priority overrides +Organization: Wires --- include/net/dsa.h | 4 ++++ @@ -9,7 +10,7 @@ Subject: [PATCH 21/64] 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 +25,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.50/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch b/patches/linux/6.18.50/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch index a3b2db987..d7919d869 100644 --- a/patches/linux/6.18.50/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch +++ b/patches/linux/6.18.50/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch @@ -1,8 +1,9 @@ From f3279894c040bd270405e73ee8969355e2c70f2f Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 22 Mar 2024 16:15:43 +0100 -Subject: [PATCH 22/64] net: dsa: mv88e6xxx: Support EtherType based priority +Subject: [PATCH 22/68] net: dsa: mv88e6xxx: Support EtherType based priority overrides +Organization: Wires --- drivers/net/dsa/mv88e6xxx/chip.c | 64 +++++++++++++++++++++++++++++ @@ -14,7 +15,7 @@ Subject: [PATCH 22/64] 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 de230df48545..c99aef8afa5d 100644 +index de230df48545d..c99aef8afa5d0 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 +118,7 @@ index de230df48545..c99aef8afa5d 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 +171,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 +245,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 +267,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 +324,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.50/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch b/patches/linux/6.18.50/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch index 8a0afe4dd..999971d5e 100644 --- a/patches/linux/6.18.50/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch +++ b/patches/linux/6.18.50/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch @@ -1,7 +1,8 @@ From cc7391ffa57c25ef73c4cfebcd7ef87170c61886 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 11:04:22 +0200 -Subject: [PATCH 23/64] net: dsa: mv88e6xxx: Add mqprio qdisc support +Subject: [PATCH 23/68] net: dsa: mv88e6xxx: Add mqprio qdisc support +Organization: Wires 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 +30,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 c99aef8afa5d..2c533aeb7374 100644 +index c99aef8afa5d0..2c533aeb7374d 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -32,6 +32,7 @@ @@ -131,7 +132,7 @@ index c99aef8afa5d..2c533aeb7374 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.50/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch b/patches/linux/6.18.50/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch index 843c05570..17729de1b 100644 --- a/patches/linux/6.18.50/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch +++ b/patches/linux/6.18.50/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch @@ -1,8 +1,9 @@ From bc2e084985e3bd0a2c064179e254e01d117ea381 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 29 May 2024 13:20:41 +0200 -Subject: [PATCH 24/64] net: dsa: mv88e6xxx: Use VLAN prio over IP when both +Subject: [PATCH 24/68] net: dsa: mv88e6xxx: Use VLAN prio over IP when both are available +Organization: Wires Switch the priority sourcing precdence to prefer VLAN PCP over IP DSCP, when both are available. @@ -26,7 +27,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 2c533aeb7374..969f772fcb27 100644 +index 2c533aeb7374d..969f772fcb273 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3422,9 +3422,13 @@ static int mv88e6xxx_setup_port(struct mv88e6xxx_chip *chip, int port) diff --git a/patches/linux/6.18.50/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch b/patches/linux/6.18.50/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch index 2851a74bb..ff7c713a7 100644 --- a/patches/linux/6.18.50/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch +++ b/patches/linux/6.18.50/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch @@ -1,8 +1,9 @@ From 0599525c7f49624553cc2afc7f6850491b2379f5 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 26 Nov 2024 19:45:59 +0100 -Subject: [PATCH 25/64] [FIX] net: dsa: mv88e6xxx: Trap locally terminated +Subject: [PATCH 25/68] [FIX] net: dsa: mv88e6xxx: Trap locally terminated VLANs +Organization: Wires Before this change, in a setup like the following, packets assigned to VLAN 10 were forwarded between the switch ports, even though the @@ -30,7 +31,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 969f772fcb27..161ce87a8871 100644 +index 969f772fcb273..161ce87a88716 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -2611,7 +2611,7 @@ static int mv88e6xxx_port_broadcast_sync(struct mv88e6xxx_chip *chip, int port, @@ -117,7 +118,7 @@ index 969f772fcb27..161ce87a8871 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 +133,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.50/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch b/patches/linux/6.18.50/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch index 894e37ed1..612c4f84b 100644 --- a/patches/linux/6.18.50/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch +++ b/patches/linux/6.18.50/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch @@ -1,8 +1,9 @@ From f914df344aa93c2c14b5b052247b97068560d771 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 16 Jan 2025 12:35:12 +0100 -Subject: [PATCH 26/64] net: dsa: mv88e6xxx: collapse disabled state into +Subject: [PATCH 26/68] net: dsa: mv88e6xxx: collapse disabled state into blocking +Organization: Wires This patch changes the behavior of switchcore ports wrt. the port state. Instead of disabling the port, the driver now treats the disabled state @@ -22,7 +23,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.50/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch b/patches/linux/6.18.50/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch index 62a59b46e..366d92707 100644 --- a/patches/linux/6.18.50/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch +++ b/patches/linux/6.18.50/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch @@ -1,8 +1,9 @@ From aee64687880cea930b07802d30035efc34730b1f Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 12 Feb 2025 22:03:14 +0100 -Subject: [PATCH 27/64] net: dsa: mv88e6xxx: Only activate LAG offloading when +Subject: [PATCH 27/68] net: dsa: mv88e6xxx: Only activate LAG offloading when bridged +Organization: Wires The current port isolation scheme for mv88e6xxx is detailed here: https://lore.kernel.org/netdev/20220203101657.990241-1-tobias@waldekranz.com/ @@ -50,7 +51,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 161ce87a8871..d379799c0a16 100644 +index 161ce87a88716..d379799c0a168 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -3058,6 +3058,7 @@ static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port, diff --git a/patches/linux/6.18.50/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch b/patches/linux/6.18.50/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch index 8eb67bccf..61c679fdb 100644 --- a/patches/linux/6.18.50/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch +++ b/patches/linux/6.18.50/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch @@ -1,7 +1,8 @@ From b7be45a81649548337072b6548c2303fe8aadff5 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 14 Jan 2026 18:22:41 +0100 -Subject: [PATCH 28/64] net: dsa: mv88e6xxx: Add LED support for 6393X +Subject: [PATCH 28/68] net: dsa: mv88e6xxx: Add LED support for 6393X +Organization: Wires Original commit: commit 462277b926140ee2d231317e92afb6cabf640268 @@ -22,7 +23,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 d379799c0a16..7bc3169839d3 100644 +index d379799c0a168..7bc3169839d3b 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -5658,6 +5658,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = { @@ -34,7 +35,7 @@ index d379799c0a16..7bc3169839d3 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 +453,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 +497,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.50/0030-wifi-brcmfmac-check-connection-state-before-querying.patch b/patches/linux/6.18.50/0029-wifi-brcmfmac-check-connection-state-before-querying.patch similarity index 85% rename from patches/linux/6.18.50/0030-wifi-brcmfmac-check-connection-state-before-querying.patch rename to patches/linux/6.18.50/0029-wifi-brcmfmac-check-connection-state-before-querying.patch index 9c899b2a8..1b2cab6fd 100644 --- a/patches/linux/6.18.50/0030-wifi-brcmfmac-check-connection-state-before-querying.patch +++ b/patches/linux/6.18.50/0029-wifi-brcmfmac-check-connection-state-before-querying.patch @@ -1,11 +1,12 @@ -From 50ca20cac50957c2d0b1b5dd2e57d1e9fc37e8cc Mon Sep 17 00:00:00 2001 +From 7969ae3c4e9d88e632399cdb9b4ad8c0ac81a6d5 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Mon, 19 Jan 2026 13:06:53 +0100 -Subject: [PATCH 30/64] wifi: brcmfmac: check connection state before querying +Subject: [PATCH 29/68] wifi: brcmfmac: check connection state before querying station info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires In station mode, brcmf_cfg80211_get_station() queries the firmware for station info even when not connected to an AP. This results in error @@ -23,10 +24,10 @@ 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 6108db81875a..39fa120366e9 100644 +index 1fc9ecd86d5d9..4189a127f4b37 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -3303,6 +3303,11 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev, +@@ -3156,6 +3156,11 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev, if (brcmf_is_ibssmode(ifp->vif)) return brcmf_cfg80211_get_station_ibss(ifp, sinfo); diff --git a/patches/linux/6.18.50/0029-wifi-brcmfmac-support-deletion-and-recreation-of-pri.patch b/patches/linux/6.18.50/0029-wifi-brcmfmac-support-deletion-and-recreation-of-pri.patch deleted file mode 100644 index 3b084917d..000000000 --- a/patches/linux/6.18.50/0029-wifi-brcmfmac-support-deletion-and-recreation-of-pri.patch +++ /dev/null @@ -1,408 +0,0 @@ -From 63dead64726c2eae845afa9064530b8a9a449c7a Mon Sep 17 00:00:00 2001 -From: Mattias Walström -Date: Thu, 15 Jan 2026 22:47:37 +0100 -Subject: [PATCH 29/64] wifi: brcmfmac: support deletion and recreation of - primary interface -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -The Broadcom FullMAC firmware does not allow the primary interface -(bsscfgidx 0) to be deleted - it always exists in firmware. However, -userspace may want to delete and recreate the primary interface with -a different name or configuration. - -Add support for this by: - -1. Allow deletion of primary interface by removing local driver - structures while keeping firmware interface. Send BRCMF_C_DOWN to - clear firmware state before removing local structures. - -2. Add brcmf_cfg80211_add_primary_iface() to recreate the primary - interface by rebuilding local structures and reinitializing the - firmware interface with BRCMF_C_UP and brcmf_config_dongle(). - -3. When deleting primary interface while secondary interfaces exist, - bring dongle back UP since BRCMF_C_DOWN affects the entire dongle. - -4. Fix brcmf_cfg80211_dump_survey() to use the correct interface - (the one being surveyed) rather than always using the primary. - Also ensure BRCMF_C_UP is called before channel operations. - -5. Make cfg_to_ndev() return NULL when primary interface is deleted, - and add NULL checks in callers. - -6. Fix rtnl locking in brcmf_del_if() to avoid deadlock when called - with rtnl already held. - -Signed-off-by: Mattias Walström ---- - .../broadcom/brcm80211/brcmfmac/cfg80211.c | 180 ++++++++++++++++-- - .../broadcom/brcm80211/brcmfmac/cfg80211.h | 4 +- - .../broadcom/brcm80211/brcmfmac/core.c | 6 +- - .../broadcom/brcm80211/brcmfmac/p2p.c | 16 +- - 4 files changed, 186 insertions(+), 20 deletions(-) - -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -index 1fc9ecd86d5d..6108db81875a 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 { - u32 time_req; - }; - -+/* Forward declaration */ -+static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg); -+ - static bool check_vif_up(struct brcmf_cfg80211_vif *vif) - { - if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) { -@@ -822,11 +825,18 @@ struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name, - enum nl80211_iftype type) - { - struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); -+ struct net_device *ndev = cfg_to_ndev(cfg); - struct brcmf_pub *drvr = cfg->pub; - struct brcmf_cfg80211_vif *vif; -+ struct brcmf_if *ifp; - int err; - -+ if (!ndev) { -+ bphy_err(drvr, "primary interface not available\n"); -+ return ERR_PTR(-ENODEV); -+ } -+ ifp = netdev_priv(ndev); -+ - if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP) - return ERR_PTR(-EINVAL); - -@@ -868,6 +878,13 @@ struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name, - goto fail; - } - -+ /* -+ * Bring the firmware interface UP. When firmware reuses a bsscfgidx -+ * from a previously deleted interface, it may retain stale state that -+ * affects channel operations. Bringing it UP ensures proper init. -+ */ -+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); -+ - strscpy(ifp->ndev->name, name, sizeof(ifp->ndev->name)); - err = brcmf_net_attach(ifp, true); - if (err) { -@@ -974,6 +991,85 @@ static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) - return 0; - } - -+/** -+ * brcmf_cfg80211_add_primary_iface() - recreate the primary interface -+ * -+ * @wiphy: wiphy device of new interface. -+ * @name: name of the new interface. -+ * @type: interface type (STATION or AP). -+ * -+ * The primary interface (bsscfgidx 0) cannot be created in firmware -+ * as it always exists. This function recreates the local driver -+ * structures after a previous deletion. -+ * -+ * Return: pointer to new wdev on success, ERR_PTR(-errno) on failure -+ */ -+static struct wireless_dev *brcmf_cfg80211_add_primary_iface(struct wiphy *wiphy, -+ const char *name, -+ enum nl80211_iftype type) -+{ -+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); -+ struct brcmf_pub *drvr = cfg->pub; -+ struct brcmf_cfg80211_vif *vif; -+ struct brcmf_if *ifp; -+ int err; -+ -+ brcmf_dbg(INFO, "Recreating primary interface \"%s\" at bsscfgidx 0\n", name); -+ -+ /* Create the interface structure for bsscfgidx 0 */ -+ ifp = brcmf_add_if(drvr, 0, 0, false, name, drvr->mac); -+ if (IS_ERR(ifp)) -+ return ERR_CAST(ifp); -+ -+ brcmf_proto_add_if(drvr, ifp); -+ -+ /* Allocate and set up the vif */ -+ vif = brcmf_alloc_vif(cfg, type); -+ if (IS_ERR(vif)) { -+ err = PTR_ERR(vif); -+ goto fail_ifp; -+ } -+ -+ vif->ifp = ifp; -+ vif->wdev.netdev = ifp->ndev; -+ ifp->ndev->ieee80211_ptr = &vif->wdev; -+ SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); -+ ifp->vif = vif; -+ -+ err = brcmf_net_attach(ifp, true); -+ if (err) { -+ bphy_err(drvr, "Registering netdevice failed\n"); -+ goto fail_vif; -+ } -+ -+ /* -+ * Bring the firmware interface UP. Since we're reusing bsscfgidx 0 -+ * which the firmware never truly deletes, bringing it UP ensures -+ * proper initialization for channel operations. -+ */ -+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); -+ -+ /* -+ * Initialize the firmware interface. This would normally happen -+ * on ndo_open via brcmf_cfg80211_up, but operations like channel -+ * survey may occur before the interface is opened. We call -+ * brcmf_config_dongle directly since dongle_up was reset when -+ * the primary interface was deleted. -+ */ -+ set_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state); -+ err = brcmf_config_dongle(cfg); -+ if (err) -+ bphy_err(drvr, "dongle configuration failed: %d\n", err); -+ -+ return &vif->wdev; -+ -+fail_vif: -+ brcmf_free_vif(vif); -+fail_ifp: -+ brcmf_remove_interface(ifp, true); -+ return ERR_PTR(err); -+} -+ - static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, - const char *name, - unsigned char name_assign_type, -@@ -1001,7 +1097,11 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, - return brcmf_mon_add_vif(wiphy, name); - case NL80211_IFTYPE_STATION: - case NL80211_IFTYPE_AP: -- wdev = brcmf_apsta_add_vif(wiphy, name, params, type); -+ /* Check if primary interface slot is available for recreation */ -+ if (!drvr->iflist[0]) -+ wdev = brcmf_cfg80211_add_primary_iface(wiphy, name, type); -+ else -+ wdev = brcmf_apsta_add_vif(wiphy, name, params, type); - break; - case NL80211_IFTYPE_P2P_CLIENT: - case NL80211_IFTYPE_P2P_GO: -@@ -1270,6 +1370,9 @@ static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy, - int ret; - int err; - -+ /* Bring interface DOWN to clear firmware state before removal */ -+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1); -+ - brcmf_cfg80211_arm_vif_event(cfg, ifp->vif); - - err = brcmf_fil_bsscfg_data_set(ifp, "interface_remove", NULL, 0); -@@ -1294,14 +1397,56 @@ static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy, - return err; - } - -+static int brcmf_cfg80211_del_primary_iface(struct wiphy *wiphy, -+ struct wireless_dev *wdev) -+{ -+ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); -+ struct net_device *ndev = wdev->netdev; -+ struct brcmf_if *ifp = netdev_priv(ndev); -+ struct brcmf_pub *drvr = cfg->pub; -+ struct brcmf_if *other_ifp; -+ int i; -+ -+ /* -+ * The primary interface (bsscfgidx 0) cannot be removed from -+ * firmware, but we can remove the local interface structures -+ * to allow recreation via add_virtual_intf. -+ * -+ * Bring interface DOWN to clear firmware state before removing -+ * local structures, ensuring clean state when recreated. -+ */ -+ brcmf_abort_scanning(cfg); -+ brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1); -+ -+ brcmf_remove_interface(ifp, true); -+ -+ /* -+ * BRCMF_C_DOWN affects the entire dongle. If other interfaces -+ * still exist, bring the dongle back UP so they remain functional. -+ */ -+ for (i = 0; i < BRCMF_MAX_IFS; i++) { -+ other_ifp = drvr->iflist[i]; -+ if (other_ifp) { -+ brcmf_fil_cmd_int_set(other_ifp, BRCMF_C_UP, 1); -+ break; -+ } -+ } -+ -+ /* -+ * Reset dongle_up so that when the interface is recreated, -+ * brcmf_config_dongle() will reinitialize the firmware. -+ */ -+ cfg->dongle_up = false; -+ -+ return 0; -+} -+ - static - int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) - { - struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); - struct net_device *ndev = wdev->netdev; -- -- if (ndev && ndev == cfg_to_ndev(cfg)) -- return -ENOTSUPP; -+ bool is_primary = ndev && ndev == cfg_to_ndev(cfg); - - /* vif event pending in firmware */ - if (brcmf_cfg80211_vif_event_armed(cfg)) -@@ -1326,6 +1471,8 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) - return brcmf_mon_del_vif(wiphy, wdev); - case NL80211_IFTYPE_STATION: - case NL80211_IFTYPE_AP: -+ if (is_primary) -+ return brcmf_cfg80211_del_primary_iface(wiphy, wdev); - return brcmf_cfg80211_del_apsta_iface(wiphy, wdev); - case NL80211_IFTYPE_P2P_CLIENT: - case NL80211_IFTYPE_P2P_GO: -@@ -7790,6 +7937,9 @@ static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) - return err; - - ndev = cfg_to_ndev(cfg); -+ if (!ndev) -+ return -ENODEV; -+ - wdev = ndev->ieee80211_ptr; - ifp = netdev_priv(ndev); - -@@ -8114,11 +8264,11 @@ brcmf_dump_obss(struct brcmf_if *ifp, struct cca_msrmnt_query req, - } - - static s32 --brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct ieee80211_channel *chan) -+brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, -+ struct ieee80211_channel *chan) - { - u16 chspec = 0; - int err = 0; -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); - - if (chan->flags & IEEE80211_CHAN_DISABLED) - return -EINVAL; -@@ -8144,7 +8294,7 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, - int idx, struct survey_info *info) - { - struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); -+ struct brcmf_if *ifp = netdev_priv(ndev); - struct brcmf_dump_survey survey = {}; - struct ieee80211_supported_band *band; - enum nl80211_band band_id; -@@ -8175,21 +8325,21 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, - if (band_id == NUM_NL80211_BANDS) - return -ENOENT; - -- /* Setting current channel to the requested channel */ -- info->filled = 0; -- if (brcmf_set_channel(cfg, info->channel)) -- return 0; -- - /* Disable mpc */ - brcmf_set_mpc(ifp, 0); - -- /* Set interface up, explicitly. */ -+ /* Set interface up before channel operations */ - err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); - if (err) { -- brcmf_err("set interface up failed, err = %d\n", err); -+ brcmf_err("BRCMF_C_UP failed in survey, err = %d\n", err); - goto exit; - } - -+ /* Setting current channel to the requested channel */ -+ info->filled = 0; -+ if (brcmf_set_channel(cfg, ifp, info->channel)) -+ return 0; -+ - /* Get noise value */ - err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise); - if (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 ---- 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) - static inline - struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg) - { -- return brcmf_get_ifp(cfg->pub, 0)->ndev; -+ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); -+ -+ return ifp ? ifp->ndev : NULL; - } - - 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 169e62b9d773..7d8ec55571dd 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c -@@ -933,9 +933,11 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, - if (ifp->ndev) { - if (bsscfgidx == 0) { - if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { -- rtnl_lock(); -+ if (!locked) -+ rtnl_lock(); - brcmf_netdev_stop(ifp->ndev); -- rtnl_unlock(); -+ if (!locked) -+ rtnl_unlock(); - } - } else { - netif_stop_queue(ifp->ndev); -diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -index e1752a513c73..2dc0fbba271d 100644 ---- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/p2p.c -@@ -2222,8 +2222,13 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p, - static int brcmf_p2p_get_conn_idx(struct brcmf_cfg80211_info *cfg) - { - int i; -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); -+ struct net_device *ndev = cfg_to_ndev(cfg); -+ struct brcmf_if *ifp; -+ -+ if (!ndev) -+ return -ENODEV; - -+ ifp = netdev_priv(ndev); - if (!ifp) - return -ENODEV; - -@@ -2255,14 +2260,21 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, - struct vif_params *params) - { - struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); -- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); -+ struct net_device *ndev = cfg_to_ndev(cfg); - struct brcmf_pub *drvr = cfg->pub; - struct brcmf_cfg80211_vif *vif; - enum brcmf_fil_p2p_if_types iftype; -+ struct brcmf_if *ifp; - int err = 0; - int connidx; - u8 *p2p_intf_addr; - -+ if (!ndev) { -+ bphy_err(drvr, "primary interface not available\n"); -+ return ERR_PTR(-ENODEV); -+ } -+ ifp = netdev_priv(ndev); -+ - if (brcmf_cfg80211_vif_event_armed(cfg)) - return ERR_PTR(-EBUSY); - diff --git a/patches/linux/6.18.50/0031-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch b/patches/linux/6.18.50/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch similarity index 82% rename from patches/linux/6.18.50/0031-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch rename to patches/linux/6.18.50/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch index 7070d8094..7acf2e42c 100644 --- a/patches/linux/6.18.50/0031-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch +++ b/patches/linux/6.18.50/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch @@ -1,11 +1,12 @@ -From 2059339011cab48250cee30059465a0a441d191d Mon Sep 17 00:00:00 2001 +From 7c82e2317cdebadd66ec0c6f611eecc42377f722 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:12:10 +0100 -Subject: [PATCH 31/64] wifi: brcmfmac: suppress log spam for +Subject: [PATCH 30/68] wifi: brcmfmac: suppress log spam for regulatory-restricted channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires When scanning, the driver attempts to set each channel and logs an error if the firmware rejects it. For regulatory-restricted channels, @@ -20,10 +21,10 @@ 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 39fa120366e9..acdb947ba51b 100644 +index 4189a127f4b37..88dac288a3986 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -8283,7 +8283,12 @@ brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, +@@ -8133,7 +8133,12 @@ brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct ieee80211_channel *cha if (chspec != INVCHANSPEC) { err = brcmf_fil_iovar_int_set(ifp, "chanspec", chspec); if (err) { diff --git a/patches/linux/6.18.50/0032-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch b/patches/linux/6.18.50/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch similarity index 87% rename from patches/linux/6.18.50/0032-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch rename to patches/linux/6.18.50/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch index 351e3e4f3..f51e9289e 100644 --- a/patches/linux/6.18.50/0032-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch +++ b/patches/linux/6.18.50/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch @@ -1,11 +1,12 @@ -From fc13a680b3159e31ef857f039fea4b7c88bff846 Mon Sep 17 00:00:00 2001 +From f73a05dd864d5ea5518fd54b4a7e2b4c1426cb37 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:18:45 +0100 -Subject: [PATCH 32/64] wifi: brcmfmac: reduce log noise during AP to station +Subject: [PATCH 31/68] wifi: brcmfmac: reduce log noise during AP to station transition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires When transitioning from AP mode to station mode (e.g., hostapd stopping and wpa_supplicant starting), several non-fatal errors can occur: @@ -27,10 +28,10 @@ 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 acdb947ba51b..48963f388ea3 100644 +index 88dac288a3986..0081ceb6c7829 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c -@@ -1130,13 +1130,15 @@ static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc) +@@ -1030,13 +1030,15 @@ static void brcmf_scan_config_mpc(struct brcmf_if *ifp, int mpc) void brcmf_set_mpc(struct brcmf_if *ifp, int mpc) { @@ -48,7 +49,7 @@ index acdb947ba51b..48963f388ea3 100644 return; } brcmf_dbg(INFO, "MPC : %d\n", mpc); -@@ -5558,8 +5560,11 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev, +@@ -5411,8 +5413,11 @@ static int brcmf_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *ndev, memset(&join_params, 0, sizeof(join_params)); err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SET_SSID, &join_params, sizeof(join_params)); diff --git a/patches/linux/6.18.50/0033-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch b/patches/linux/6.18.50/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch similarity index 87% rename from patches/linux/6.18.50/0033-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch rename to patches/linux/6.18.50/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch index 5cfe18911..d1e909fd4 100644 --- a/patches/linux/6.18.50/0033-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch +++ b/patches/linux/6.18.50/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch @@ -1,8 +1,9 @@ -From 46a5c5ddc5aa19ff43d8007f527f89818b22bd62 Mon Sep 17 00:00:00 2001 +From 3d87daccd57c1b0f0612202cc1cafda8b54acf46 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 17 Feb 2026 21:59:59 +0100 -Subject: [PATCH 33/64] net: phy: air_en8811h: add OF device table for +Subject: [PATCH 32/68] net: phy: air_en8811h: add OF device table for auto-loading +Organization: Wires mdio_uevent() only emits an OF-style MODALIAS via of_device_uevent_modalias(), never the mdio: binary format that @@ -20,7 +21,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.50/0034-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch b/patches/linux/6.18.50/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch similarity index 95% rename from patches/linux/6.18.50/0034-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch rename to patches/linux/6.18.50/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch index ed02569c9..0a6a1891f 100644 --- a/patches/linux/6.18.50/0034-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch +++ b/patches/linux/6.18.50/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch @@ -1,8 +1,9 @@ -From c5b264c92f60ebf903892b385d4941bc73fb4887 Mon Sep 17 00:00:00 2001 +From 0eeba9b26eba82d61efb4ee5bbbc7e95d82e4bf9 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 20 Sep 2024 12:05:18 +0100 -Subject: [PATCH 34/64] drm: vc4: dsi: enable video and then retry failed +Subject: [PATCH 33/68] drm: vc4: dsi: enable video and then retry failed transfers +Organization: Wires The DSI block appears to be able to come up stuck in a condition where it leaves the lanes in HS mode or just jabbering. This stops LP @@ -18,7 +19,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.50/0035-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch b/patches/linux/6.18.50/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch similarity index 90% rename from patches/linux/6.18.50/0035-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch rename to patches/linux/6.18.50/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch index 6049c4212..837211624 100644 --- a/patches/linux/6.18.50/0035-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch +++ b/patches/linux/6.18.50/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch @@ -1,7 +1,8 @@ -From 98436d7299b0713498dfaa8090941c2e07300df5 Mon Sep 17 00:00:00 2001 +From 86d7387c2b593b9864de91fb797477238c787e9b Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 8 Jun 2022 17:23:47 +0100 -Subject: [PATCH 35/64] drm: vc4: dsi: Clocks should be running before reset +Subject: [PATCH 34/68] drm: vc4: dsi: Clocks should be running before reset +Organization: Wires The initialisation sequence differs slightly from the documentation in that the clocks are meant to be running before resets and @@ -13,7 +14,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.50/0036-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch b/patches/linux/6.18.50/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch similarity index 90% rename from patches/linux/6.18.50/0036-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch rename to patches/linux/6.18.50/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch index 8d60cb9ae..3d476948c 100644 --- a/patches/linux/6.18.50/0036-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch +++ b/patches/linux/6.18.50/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch @@ -1,7 +1,8 @@ -From 5e5575eef5c01e7eedb1b1fec835811e13c18a4e Mon Sep 17 00:00:00 2001 +From 238b6a2057f44a156f65e08a187a41f583b53816 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 5 Apr 2024 17:51:55 +0100 -Subject: [PATCH 36/64] drm/vc4: Ensure DSI is enabled for FIFO resets +Subject: [PATCH 35/68] drm/vc4: Ensure DSI is enabled for FIFO resets +Organization: Wires The block must be enabled for the FIFO resets to be actioned, so ensure this is the case. @@ -12,7 +13,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.50/0037-drm-vc4-Reset-DSI-AFE-on-disable.patch b/patches/linux/6.18.50/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch similarity index 90% rename from patches/linux/6.18.50/0037-drm-vc4-Reset-DSI-AFE-on-disable.patch rename to patches/linux/6.18.50/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch index c2574e06e..2ae851639 100644 --- a/patches/linux/6.18.50/0037-drm-vc4-Reset-DSI-AFE-on-disable.patch +++ b/patches/linux/6.18.50/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch @@ -1,7 +1,8 @@ -From b1a508a2583b92c17023ad11344a5335bd44a151 Mon Sep 17 00:00:00 2001 +From c0f09cad8287acf33d4d1d09b7abb2bfee8c4848 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 26 May 2022 18:56:19 +0100 -Subject: [PATCH 37/64] drm: vc4: Reset DSI AFE on disable +Subject: [PATCH 36/68] drm: vc4: Reset DSI AFE on disable +Organization: Wires vc4_dsi_bridge_disable wasn't resetting things during shutdown, so add that in. @@ -12,7 +13,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.50/0038-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch b/patches/linux/6.18.50/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch similarity index 96% rename from patches/linux/6.18.50/0038-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch rename to patches/linux/6.18.50/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch index 1ae0ff52e..338d95f93 100644 --- a/patches/linux/6.18.50/0038-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch +++ b/patches/linux/6.18.50/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch @@ -1,7 +1,8 @@ -From 2598db6e86ab67196a3577569db625c3a6ca3916 Mon Sep 17 00:00:00 2001 +From 8fd7cd10da6acd90f6387019d3fed5d3b08e651e Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 20 Nov 2024 13:58:08 +0000 -Subject: [PATCH 38/64] drm: vc4: dsi: Handle the different command FIFO widths +Subject: [PATCH 37/68] drm: vc4: dsi: Handle the different command FIFO widths +Organization: Wires 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 +18,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.50/0039-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch b/patches/linux/6.18.50/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch similarity index 90% rename from patches/linux/6.18.50/0039-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch rename to patches/linux/6.18.50/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch index 45127be64..08c9106fc 100644 --- a/patches/linux/6.18.50/0039-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch +++ b/patches/linux/6.18.50/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch @@ -1,8 +1,9 @@ -From f1cd2ed60fe47e6a12fe22ffad8fc237f2b6e48a Mon Sep 17 00:00:00 2001 +From 47cd1b491e52ca2f18093b40701b327453440b0e Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 17:37:00 +0000 -Subject: [PATCH 39/64] drm/bridge: tc358762: Program the DPI mode into the +Subject: [PATCH 38/68] drm/bridge: tc358762: Program the DPI mode into the chip +Organization: Wires The autodetection of resolution/timing by the TC358762 can lead to the display being shifted by a pixel or two. @@ -16,7 +17,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.50/0040-drm-bridge-tc358762-revert-move-ops-to-enable.patch b/patches/linux/6.18.50/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch similarity index 88% rename from patches/linux/6.18.50/0040-drm-bridge-tc358762-revert-move-ops-to-enable.patch rename to patches/linux/6.18.50/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch index 6201ac929..df6fc02f8 100644 --- a/patches/linux/6.18.50/0040-drm-bridge-tc358762-revert-move-ops-to-enable.patch +++ b/patches/linux/6.18.50/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch @@ -1,7 +1,8 @@ -From 2cd8a6bda213c6dddc94e19dfa44cc483a4140ed Mon Sep 17 00:00:00 2001 +From 8a7211f4705ed188242ce7394507e9f470aa7369 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 18:44:49 +0000 -Subject: [PATCH 40/64] drm/bridge: tc358762: revert move ops to enable +Subject: [PATCH 39/68] drm/bridge: tc358762: revert move ops to enable +Organization: Wires 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 +13,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.50/0041-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch b/patches/linux/6.18.50/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch similarity index 83% rename from patches/linux/6.18.50/0041-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch rename to patches/linux/6.18.50/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch index ecbb9c0cc..6d9212bf0 100644 --- a/patches/linux/6.18.50/0041-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch +++ b/patches/linux/6.18.50/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch @@ -1,11 +1,12 @@ -From aa00816710a8e9067d9d41759bbcb54a78e43cbf Mon Sep 17 00:00:00 2001 +From ec113c4c65385894dbe8afab9b7a50a457719652 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Sat, 4 Apr 2026 18:04:19 +0200 -Subject: [PATCH 41/64] drm/bridge: tc358762: Set pre_enabled on pre_enable to +Subject: [PATCH 40/68] drm/bridge: tc358762: Set pre_enabled on pre_enable to prevent regulator imbalance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires The RPi cherry-pick moved tc358762_init() to pre_enable but dropped the pre_enabled = true assignment. Without it, post_disable always bails out early and never disables the regulator. @@ -16,7 +17,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.50/0042-net-pcs-add-standalone-PCS-registration-infrastructu.patch b/patches/linux/6.18.50/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch similarity index 94% rename from patches/linux/6.18.50/0042-net-pcs-add-standalone-PCS-registration-infrastructu.patch rename to patches/linux/6.18.50/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch index a097d7ae8..b4a04bc21 100644 --- a/patches/linux/6.18.50/0042-net-pcs-add-standalone-PCS-registration-infrastructu.patch +++ b/patches/linux/6.18.50/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch @@ -1,7 +1,8 @@ -From 88fd06d2d8050e06cf4380abb1e171b305366d7f Mon Sep 17 00:00:00 2001 +From f8a14e32e41fc37f2f3834096dd1fcf0af6810c9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 5 Apr 2026 11:33:00 +0200 -Subject: [PATCH 42/64] net/pcs: add standalone PCS registration infrastructure +Subject: [PATCH 41/68] net/pcs: add standalone PCS registration infrastructure +Organization: Wires Add a simple registration mechanism that allows platform PCS drivers to register their phylink_pcs instances, and consumers (e.g. Ethernet MAC @@ -22,7 +23,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 +38,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 +51,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 +152,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.50/0043-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch b/patches/linux/6.18.50/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch similarity index 98% rename from patches/linux/6.18.50/0043-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch rename to patches/linux/6.18.50/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch index b1d6553c0..c2effa9b8 100644 --- a/patches/linux/6.18.50/0043-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch +++ b/patches/linux/6.18.50/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch @@ -1,7 +1,8 @@ -From 4d16377c5ec8533487c773771baae7495972f35a Mon Sep 17 00:00:00 2001 +From 371ad1d3dbcfb9787d8105e329fe2e23acbee8f9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:14:23 +0200 -Subject: [PATCH 43/64] net/pcs: add MediaTek MT7988 USXGMII PCS driver +Subject: [PATCH 42/68] net/pcs: add MediaTek MT7988 USXGMII PCS driver +Organization: Wires Add a PCS driver for the USXGMII subsystem found in the MediaTek MT7988 SoC (usxgmiisys0 at 0x10080000, usxgmiisys1 at 0x10081000). The hardware @@ -27,7 +28,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 +49,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 +60,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.50/0044-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch b/patches/linux/6.18.50/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch similarity index 97% rename from patches/linux/6.18.50/0044-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch rename to patches/linux/6.18.50/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch index f2eabb421..68c7e206c 100644 --- a/patches/linux/6.18.50/0044-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch +++ b/patches/linux/6.18.50/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch @@ -1,10 +1,11 @@ -From 0046d8e5efef0c67fa4ff621738233ad9d5f5781 Mon Sep 17 00:00:00 2001 +From 5aab8748e187310e2e64e2385c4ad37ad5fdfc83 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:43 +0200 -Subject: [PATCH 44/64] net: ethernet: mediatek: add USXGMII support for MT7988 +Subject: [PATCH 43/68] net: ethernet: mediatek: add USXGMII support for MT7988 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires Add support for the USXGMII path used by gmac1 and gmac2 on the MT7988 SoC (BananaPi BPI-R4). Changes: @@ -33,7 +34,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 +127,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 98cf11a706e1..243503c58c7b 100644 +index 98cf11a706e14..243503c58c7b9 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 +212,7 @@ index 98cf11a706e1..243503c58c7b 100644 of_fwnode_handle(mac->of_node), phy_mode, &mtk_phylink_ops); diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.h b/drivers/net/ethernet/mediatek/mtk_eth_soc.h -index 0168e2fbc619..2b27ef392b76 100644 +index 0168e2fbc6197..2b27ef392b76f 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.50/0045-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch b/patches/linux/6.18.50/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch similarity index 90% rename from patches/linux/6.18.50/0045-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch rename to patches/linux/6.18.50/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch index 0a3052557..6abc9cff1 100644 --- a/patches/linux/6.18.50/0045-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch +++ b/patches/linux/6.18.50/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch @@ -1,7 +1,8 @@ -From 008957bdef3b9869266b79deebbed77cc7a1ed44 Mon Sep 17 00:00:00 2001 +From a9ac41d7f38ba5fa368d88e2b6a6e70a43a2a924 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:56 +0200 -Subject: [PATCH 45/64] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes +Subject: [PATCH 44/68] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes +Organization: Wires Add device nodes for the two USXGMII subsystem blocks (usxgmiisys0 at 0x10080000 and usxgmiisys1 at 0x10081000), each referencing its clock, @@ -14,7 +15,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.50/0046-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch b/patches/linux/6.18.50/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch similarity index 91% rename from patches/linux/6.18.50/0046-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch rename to patches/linux/6.18.50/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch index d8961d861..ba6884aab 100644 --- a/patches/linux/6.18.50/0046-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch +++ b/patches/linux/6.18.50/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch @@ -1,8 +1,9 @@ -From 27408662a339b936a0f139907169a8249213cc0c Mon Sep 17 00:00:00 2001 +From 6d086f73fc85a8a4a71785ef59b18fa18b014128 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:16:11 +0200 -Subject: [PATCH 46/64] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ +Subject: [PATCH 45/68] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ ports and WPS button +Organization: Wires Enable the SFP+ cages wired to gmac1 and gmac2. The USXGMII PCS nodes and xfi_tphy SerDes are wired up in mt7988a.dtsi; only status = "okay" @@ -25,7 +26,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 +38,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.50/0047-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch b/patches/linux/6.18.50/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch similarity index 92% rename from patches/linux/6.18.50/0047-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch rename to patches/linux/6.18.50/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch index 3b9f92c57..ad4a248c1 100644 --- a/patches/linux/6.18.50/0047-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch +++ b/patches/linux/6.18.50/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch @@ -1,10 +1,11 @@ -From 263bd1600da551046baef49a268030ac178aa0cc Mon Sep 17 00:00:00 2001 +From f070bf23a758d0dbcdcdef26842e2cd0511ef26b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 7 Apr 2026 07:34:52 +0200 -Subject: [PATCH 47/64] net: phy: sfp: add OEM SFP-10G-T-I quirk +Subject: [PATCH 46/68] 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 +Organization: Wires The industrial-temperature variant of the OEM SFP-10G-T copper module reports vendor PN "SFP-10G-T-I". Unlike the base "SFP-10G-T" which is a @@ -26,7 +27,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 9683f9c2cd88..62b7f430f7f6 100644 +index 9683f9c2cd882..62b7f430f7f62 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.50/0048-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch b/patches/linux/6.18.50/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch similarity index 94% rename from patches/linux/6.18.50/0048-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch rename to patches/linux/6.18.50/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch index bd6d77d55..5acd73f7b 100644 --- a/patches/linux/6.18.50/0048-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch +++ b/patches/linux/6.18.50/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch @@ -1,8 +1,9 @@ -From 4488bf1724bf0261794e9543865e38ecd0373c22 Mon Sep 17 00:00:00 2001 +From 6427d0795351cb5a35df87a5555a5b2d13b254d4 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 17 Apr 2026 09:13:04 +0000 -Subject: [PATCH 48/64] net: dsa: mv88e6xxx: Trap PTP frames on timestamping +Subject: [PATCH 47/68] net: dsa: mv88e6xxx: Trap PTP frames on timestamping ports, on 6393X +Organization: Wires Similar to the Peridot (6390), the designation of PTP frames as management (and the destination port) must be explicitly @@ -23,7 +24,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 7bc3169839d3..1d1edf84b224 100644 +index 7bc3169839d3b..1d1edf84b224e 100644 --- a/drivers/net/dsa/mv88e6xxx/chip.c +++ b/drivers/net/dsa/mv88e6xxx/chip.c @@ -5689,7 +5689,7 @@ static const struct mv88e6xxx_ops mv88e6393x_ops = { @@ -36,7 +37,7 @@ index 7bc3169839d3..1d1edf84b224 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 +81,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 +94,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 +115,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 +137,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 +171,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.50/0049-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch b/patches/linux/6.18.50/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch similarity index 83% rename from patches/linux/6.18.50/0049-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch rename to patches/linux/6.18.50/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch index ad456a5db..6e7693080 100644 --- a/patches/linux/6.18.50/0049-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch +++ b/patches/linux/6.18.50/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch @@ -1,8 +1,9 @@ -From 1a8d837391a670c1c3d9c1f871339e9d8d9ede42 Mon Sep 17 00:00:00 2001 +From 387ced0c3af09556861c1adafe3504fb10a05294 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 28 Apr 2026 15:30:01 +0200 -Subject: [PATCH 49/64] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 +Subject: [PATCH 48/68] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 wmac +Organization: Wires Without MODULE_DEVICE_TABLE(of, ...) the OF compatible alias is never exported to modules.alias, so udev cannot autoload mt7615e when the @@ -15,7 +16,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.50/0050-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch b/patches/linux/6.18.50/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch similarity index 93% rename from patches/linux/6.18.50/0050-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch rename to patches/linux/6.18.50/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch index 0291ff362..c01f34797 100644 --- a/patches/linux/6.18.50/0050-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch +++ b/patches/linux/6.18.50/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch @@ -1,11 +1,12 @@ -From 3fa31d2d09ac80fbeaf4ed2f6562eb2b7051ed26 Mon Sep 17 00:00:00 2001 +From 84f465a8602148ac2b8785116046579f3ea6c830 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 22 Apr 2026 10:24:43 +0200 -Subject: [PATCH 50/64] PCI: mediatek-gen3: Fix PERST# control timing during +Subject: [PATCH 49/68] PCI: mediatek-gen3: Fix PERST# control timing during system startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires Some of MediaTek's chips (mt7986 amongst them) stop generating REFCLK if the PCIE_PHY_RSTB signal of the PCIe controller is asserted. @@ -30,7 +31,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.50/0051-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch b/patches/linux/6.18.50/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch similarity index 86% rename from patches/linux/6.18.50/0051-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch rename to patches/linux/6.18.50/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch index bad39541a..10d404015 100644 --- a/patches/linux/6.18.50/0051-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch +++ b/patches/linux/6.18.50/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch @@ -1,10 +1,11 @@ -From 1541893ebe93251871cccab8e0ef4c16d3a9748a Mon Sep 17 00:00:00 2001 +From 538f2c1f1f8d3aa34ba87310e3714cc6c17f2284 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 12 Aug 2026 10:08:53 +0200 -Subject: [PATCH 51/64] net: dsa: mv88e6xxx: Derive LED names from device name +Subject: [PATCH 50/68] net: dsa: mv88e6xxx: Derive LED names from device name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit +Organization: Wires LED devices were named ":0:0", e.g. "mv88e6390:01:00:port:lednum". Since chip->info->name is the model name, two @@ -16,7 +17,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.50/0052-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch b/patches/linux/6.18.50/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch similarity index 85% rename from patches/linux/6.18.50/0052-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch rename to patches/linux/6.18.50/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch index 51af93612..3409e0f0d 100644 --- a/patches/linux/6.18.50/0052-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch +++ b/patches/linux/6.18.50/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch @@ -1,7 +1,8 @@ -From b371b4f0df3e2daf786817552716e3173769ec10 Mon Sep 17 00:00:00 2001 +From bf94d0414fcf8c2c7df9a84f852d64005b589bc9 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 31 Oct 2025 13:18:12 +0100 -Subject: [PATCH 52/64] phy: sparx5-serdes: make it selectable for ARCH_LAN969X +Subject: [PATCH 51/68] phy: sparx5-serdes: make it selectable for ARCH_LAN969X +Organization: Wires LAN969x uses the SparX-5 SERDES driver, so make it selectable for ARCH_LAN969X. @@ -18,7 +19,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.50/0053-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch b/patches/linux/6.18.50/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch similarity index 93% rename from patches/linux/6.18.50/0053-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch rename to patches/linux/6.18.50/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch index 74d254385..fc37223fd 100644 --- a/patches/linux/6.18.50/0053-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch +++ b/patches/linux/6.18.50/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch @@ -1,7 +1,8 @@ -From 798c5ce19c015b549fb328df8fb9811d148f103d Mon Sep 17 00:00:00 2001 +From b1197798a5edda49e4fd89eed911b3261d5c6e9b Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:38 +0200 -Subject: [PATCH 53/64] net: sparx5: fix wrong chip ids for TSN SKUs +Subject: [PATCH 52/68] net: sparx5: fix wrong chip ids for TSN SKUs +Organization: Wires The TSN SKUs in enum spx5_target_chiptype have incorrect IDs: @@ -30,7 +31,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.50/0054-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch b/patches/linux/6.18.50/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch similarity index 90% rename from patches/linux/6.18.50/0054-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch rename to patches/linux/6.18.50/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch index 994d5a23c..e492e5665 100644 --- a/patches/linux/6.18.50/0054-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch +++ b/patches/linux/6.18.50/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch @@ -1,8 +1,9 @@ -From 021b6dff1dd7bda04b695ebdf79da8f7851692f1 Mon Sep 17 00:00:00 2001 +From 46ce5c4000492dd36176faa00def6dfe18d7a7ae Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:39 +0200 -Subject: [PATCH 54/64] net: sparx5: configure serdes for 1000BASE-X in +Subject: [PATCH 53/68] net: sparx5: configure serdes for 1000BASE-X in sparx5_port_init() +Organization: Wires sparx5_port_init() only invokes sparx5_serdes_set() and the associated shadow-device enable and low-speed device switch for SGMII and QSGMII. @@ -28,7 +29,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.50/0055-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch b/patches/linux/6.18.50/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch similarity index 84% rename from patches/linux/6.18.50/0055-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch rename to patches/linux/6.18.50/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch index 03b129512..0bf9bd94b 100644 --- a/patches/linux/6.18.50/0055-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch +++ b/patches/linux/6.18.50/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch @@ -1,8 +1,9 @@ -From ab65867303ba77a2f12e5b988729aab4d4a11626 Mon Sep 17 00:00:00 2001 +From ba3cc46c269e8008a99509b6168e425af988b95c Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:29 +0200 -Subject: [PATCH 55/64] dt-bindings: mmc: atmel,sama5d2-sdhci: add +Subject: [PATCH 54/68] dt-bindings: mmc: atmel,sama5d2-sdhci: add microchip,lan969x-sdhci +Organization: Wires The LAN969x SDMMC controller has its own base clock divider and, unlike the SAMA5D2 and SAM9X60 variants, supports HS200 and caps SDR104 at @@ -15,7 +16,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.50/0056-mmc-sdhci-of-at91-add-LAN969x-support.patch b/patches/linux/6.18.50/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch similarity index 95% rename from patches/linux/6.18.50/0056-mmc-sdhci-of-at91-add-LAN969x-support.patch rename to patches/linux/6.18.50/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch index 402336838..f8a1f0e34 100644 --- a/patches/linux/6.18.50/0056-mmc-sdhci-of-at91-add-LAN969x-support.patch +++ b/patches/linux/6.18.50/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch @@ -1,7 +1,8 @@ -From 4df757874426d0ce50c0206d8b8683ad50fbf343 Mon Sep 17 00:00:00 2001 +From 3135f6b06fb3691e507bac54d3cf6cea5cdd6931 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:44 +0200 -Subject: [PATCH 56/64] mmc: sdhci-of-at91: add LAN969x support +Subject: [PATCH 55/68] mmc: sdhci-of-at91: add LAN969x support +Organization: Wires 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 +19,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.50/0057-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch b/patches/linux/6.18.50/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch similarity index 95% rename from patches/linux/6.18.50/0057-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch rename to patches/linux/6.18.50/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch index 0265a088d..1f63c39a0 100644 --- a/patches/linux/6.18.50/0057-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch +++ b/patches/linux/6.18.50/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch @@ -1,8 +1,9 @@ -From 06126f8d68e0cbc5d4e5fd540f29c9384922be2f Mon Sep 17 00:00:00 2001 +From bf9c66c10516f87348b75f5ef6c62cd667068984 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:37:48 +0200 -Subject: [PATCH 57/64] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC +Subject: [PATCH 56/68] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC hardware reset +Organization: Wires The controller is reset, and its signaling mode changed, with SDCLK still running. Both require the clock to be stopped, otherwise the @@ -20,7 +21,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.50/0058-net-sparx5-lan969x-populate-netdev-of_node.patch b/patches/linux/6.18.50/0057-net-sparx5-lan969x-populate-netdev-of_node.patch similarity index 83% rename from patches/linux/6.18.50/0058-net-sparx5-lan969x-populate-netdev-of_node.patch rename to patches/linux/6.18.50/0057-net-sparx5-lan969x-populate-netdev-of_node.patch index 2f462d8d5..2519760d1 100644 --- a/patches/linux/6.18.50/0058-net-sparx5-lan969x-populate-netdev-of_node.patch +++ b/patches/linux/6.18.50/0057-net-sparx5-lan969x-populate-netdev-of_node.patch @@ -1,7 +1,8 @@ -From 334c95b4986609f9867ace94a4a6660ac6828cbb Mon Sep 17 00:00:00 2001 +From b0aea35c3a89e74ce6b82dbe7cef314146c77ddd Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 10 Nov 2025 13:42:53 +0100 -Subject: [PATCH 58/64] net: sparx5/lan969x: populate netdev of_node +Subject: [PATCH 57/68] net: sparx5/lan969x: populate netdev of_node +Organization: Wires Populate of_node for the port netdevs, to make the individual ports of_nodes available in sysfs. @@ -15,7 +16,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.50/0059-arm64-dts-microchip-add-LAN969x-clock-header-file.patch b/patches/linux/6.18.50/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch similarity index 88% rename from patches/linux/6.18.50/0059-arm64-dts-microchip-add-LAN969x-clock-header-file.patch rename to patches/linux/6.18.50/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch index 7ccd80f0b..f8eb637f8 100644 --- a/patches/linux/6.18.50/0059-arm64-dts-microchip-add-LAN969x-clock-header-file.patch +++ b/patches/linux/6.18.50/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch @@ -1,7 +1,8 @@ -From 43fa83304cfe52086abfde2e0ee3a75477d3b01c Mon Sep 17 00:00:00 2001 +From dffa6321e3149993d869d26e5b2e9b64e0ebc856 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:11 +0100 -Subject: [PATCH 59/64] arm64: dts: microchip: add LAN969x clock header file +Subject: [PATCH 58/68] arm64: dts: microchip: add LAN969x clock header file +Organization: Wires LAN969x uses hardware clock indexes, so document theses in a header to make them humanly readable. @@ -18,7 +19,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.50/0060-arm64-dts-microchip-add-LAN969x-support.patch b/patches/linux/6.18.50/0059-arm64-dts-microchip-add-LAN969x-support.patch similarity index 98% rename from patches/linux/6.18.50/0060-arm64-dts-microchip-add-LAN969x-support.patch rename to patches/linux/6.18.50/0059-arm64-dts-microchip-add-LAN969x-support.patch index 0a7640ad5..5028a65a8 100644 --- a/patches/linux/6.18.50/0060-arm64-dts-microchip-add-LAN969x-support.patch +++ b/patches/linux/6.18.50/0059-arm64-dts-microchip-add-LAN969x-support.patch @@ -1,7 +1,8 @@ -From 1218a1d7d9dc1c752c762f887b4b9450339577b0 Mon Sep 17 00:00:00 2001 +From 6389d0639a49ac4ab5c4d8b95293872a2d009deb Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:12 +0100 -Subject: [PATCH 60/64] arm64: dts: microchip: add LAN969x support +Subject: [PATCH 59/68] arm64: dts: microchip: add LAN969x support +Organization: Wires Add support for Microchip LAN969x switch SoC series by adding the SoC DTSI. @@ -18,7 +19,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.50/0061-arm64-dts-microchip-add-EV23X71A-board.patch b/patches/linux/6.18.50/0060-arm64-dts-microchip-add-EV23X71A-board.patch similarity index 98% rename from patches/linux/6.18.50/0061-arm64-dts-microchip-add-EV23X71A-board.patch rename to patches/linux/6.18.50/0060-arm64-dts-microchip-add-EV23X71A-board.patch index f1e534cae..f74e225ab 100644 --- a/patches/linux/6.18.50/0061-arm64-dts-microchip-add-EV23X71A-board.patch +++ b/patches/linux/6.18.50/0060-arm64-dts-microchip-add-EV23X71A-board.patch @@ -1,7 +1,8 @@ -From c778997a66da97062480255f6e983576b22fc468 Mon Sep 17 00:00:00 2001 +From ce071f61ae3a75466da141c08bc597ae72b73b6d Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:14 +0100 -Subject: [PATCH 61/64] arm64: dts: microchip: add EV23X71A board +Subject: [PATCH 60/68] arm64: dts: microchip: add EV23X71A board +Organization: Wires Microchip EV23X71A is an LAN9696 based evaluation board. @@ -19,7 +20,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 +31,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.50/0062-arm64-dts-microchip-lan969x-add-OTP-node.patch b/patches/linux/6.18.50/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch similarity index 84% rename from patches/linux/6.18.50/0062-arm64-dts-microchip-lan969x-add-OTP-node.patch rename to patches/linux/6.18.50/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch index 433151f7b..b2ca5a388 100644 --- a/patches/linux/6.18.50/0062-arm64-dts-microchip-lan969x-add-OTP-node.patch +++ b/patches/linux/6.18.50/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch @@ -1,7 +1,8 @@ -From 5554086a30185fd71bc9c0ccaf87581cd9eeba31 Mon Sep 17 00:00:00 2001 +From 59d4c72da9634b82dd76e75bc74696db36e34b80 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 15 May 2026 13:59:09 +0200 -Subject: [PATCH 62/64] arm64: dts: microchip: lan969x: add OTP node +Subject: [PATCH 61/68] arm64: dts: microchip: lan969x: add OTP node +Organization: Wires Add the required OTP on LAN969x. @@ -15,7 +16,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.50/0063-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch b/patches/linux/6.18.50/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch similarity index 89% rename from patches/linux/6.18.50/0063-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch rename to patches/linux/6.18.50/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch index f9d7f739a..c32ae7d09 100644 --- a/patches/linux/6.18.50/0063-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch +++ b/patches/linux/6.18.50/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch @@ -1,7 +1,8 @@ -From f9d194d8e641b4fb3439707dbda2b86e1e6f4642 Mon Sep 17 00:00:00 2001 +From 104d3cd8659023f8e5cc6fff38d4b2fbaf2d846f Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 63/64] arm64: dts: microchip: lan969x: add SDMMC nodes +Subject: [PATCH 62/68] arm64: dts: microchip: lan969x: add SDMMC nodes +Organization: Wires 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 +14,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.50/0064-arm64-dts-microchip-ev23x71a-enable-eMMC.patch b/patches/linux/6.18.50/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch similarity index 82% rename from patches/linux/6.18.50/0064-arm64-dts-microchip-ev23x71a-enable-eMMC.patch rename to patches/linux/6.18.50/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch index b6c6b5394..1612e98d8 100644 --- a/patches/linux/6.18.50/0064-arm64-dts-microchip-ev23x71a-enable-eMMC.patch +++ b/patches/linux/6.18.50/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch @@ -1,7 +1,8 @@ -From 98f9ca3ae5aa4155becd96872e01dc7bb0a13f80 Mon Sep 17 00:00:00 2001 +From 0484e99311a7568491a88110e13967fbfb3a9c85 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 64/64] arm64: dts: microchip: ev23x71a: enable eMMC +Subject: [PATCH 63/68] arm64: dts: microchip: ev23x71a: enable eMMC +Organization: Wires 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 +13,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.50/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch b/patches/linux/6.18.50/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch new file mode 100644 index 000000000..e32f07536 --- /dev/null +++ b/patches/linux/6.18.50/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch @@ -0,0 +1,87 @@ +From bfde245c25f2c8997c9c2d2a64fc33dbca194e64 Mon Sep 17 00:00:00 2001 +From: Mattias Walström +Date: Tue, 30 Jun 2026 15:42:48 +0200 +Subject: [PATCH 64/68] wifi: brcmfmac: survey the requested interface, not the + primary +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +brcmf_cfg80211_dump_survey() and its helper brcmf_set_channel() always +operated on the primary interface (cfg_to_ndev()), ignoring the netdev +that cfg80211 passed in. A survey requested on a secondary interface +therefore programmed the chanspec on, and read PHY noise from, the wrong +interface. + +Use the interface that the survey was requested on. Pass the brcmf_if +down to brcmf_set_channel() instead of having it look up the primary. + +While here, bring the interface up before the channel is set rather than +after: setting the chanspec on a down interface can fail. The set_channel +failure path now exits through the common 'exit' label so that mpc, which +is disabled just above, is re-enabled instead of being left off. + +Fixes: 6c04deae1438 ("brcmfmac: Add dump_survey cfg80211 ops for HostApd AutoChannelSelection") +Signed-off-by: Mattias Walström +--- + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 20 ++++++++++--------- + 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 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, + } + + static s32 +-brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct ieee80211_channel *chan) ++brcmf_set_channel(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, ++ struct ieee80211_channel *chan) + { + u16 chspec = 0; + int err = 0; +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); + + if (chan->flags & IEEE80211_CHAN_DISABLED) + return -EINVAL; +@@ -8159,7 +8159,7 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, + int idx, struct survey_info *info) + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); ++ struct brcmf_if *ifp = netdev_priv(ndev); + struct brcmf_dump_survey survey = {}; + struct ieee80211_supported_band *band; + enum nl80211_band band_id; +@@ -8190,21 +8190,23 @@ brcmf_cfg80211_dump_survey(struct wiphy *wiphy, struct net_device *ndev, + if (band_id == NUM_NL80211_BANDS) + return -ENOENT; + +- /* Setting current channel to the requested channel */ +- info->filled = 0; +- if (brcmf_set_channel(cfg, info->channel)) +- return 0; +- + /* Disable mpc */ + brcmf_set_mpc(ifp, 0); + +- /* Set interface up, explicitly. */ ++ /* Set interface up before any channel operations. */ + err = brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); + if (err) { + brcmf_err("set interface up failed, err = %d\n", err); + goto exit; + } + ++ /* Setting current channel to the requested channel */ ++ info->filled = 0; ++ if (brcmf_set_channel(cfg, ifp, info->channel)) { ++ err = 0; ++ goto exit; ++ } ++ + /* Get noise value */ + err = brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PHY_NOISE, &noise); + if (err) { diff --git a/patches/linux/6.18.50/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch b/patches/linux/6.18.50/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch new file mode 100644 index 000000000..cffb50f3c --- /dev/null +++ b/patches/linux/6.18.50/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch @@ -0,0 +1,46 @@ +From 2e63b78b74c93858c3697af5926da08662ab0ca5 Mon Sep 17 00:00:00 2001 +From: Mattias Walström +Date: Tue, 30 Jun 2026 15:43:14 +0200 +Subject: [PATCH 65/68] wifi: brcmfmac: honor caller's rtnl lock when stopping + primary interface +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +brcmf_del_if() already takes a 'locked' flag that tells it whether the +caller holds the rtnl lock, and it passes that flag down to +brcmf_net_detach(). The bsscfgidx 0 path, however, unconditionally took +rtnl_lock() around brcmf_netdev_stop(), which deadlocks if a caller +removes the primary interface while already holding rtnl (for example +from a cfg80211 op, which all run under rtnl). + +Today the primary-interface path is only reached from the detach path +with locked=false, so this is not yet hit in practice. A subsequent +change lets userspace remove the primary interface from a cfg80211 op, +which does hold rtnl. Make the primary stop path respect 'locked' like +the rest of the function so that path is safe. + +Signed-off-by: Mattias Walström +--- + drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 6 ++++-- + 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 169e62b9d7731..7d8ec55571dde 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +@@ -933,9 +933,11 @@ static void brcmf_del_if(struct brcmf_pub *drvr, s32 bsscfgidx, + if (ifp->ndev) { + if (bsscfgidx == 0) { + if (ifp->ndev->netdev_ops == &brcmf_netdev_ops_pri) { +- rtnl_lock(); ++ if (!locked) ++ rtnl_lock(); + brcmf_netdev_stop(ifp->ndev); +- rtnl_unlock(); ++ if (!locked) ++ rtnl_unlock(); + } + } else { + netif_stop_queue(ifp->ndev); diff --git a/patches/linux/6.18.50/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch b/patches/linux/6.18.50/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch new file mode 100644 index 000000000..ac2fe73d5 --- /dev/null +++ b/patches/linux/6.18.50/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch @@ -0,0 +1,318 @@ +From b8d4475e9f5e03472f10cd1ac7b787f216acd14c Mon Sep 17 00:00:00 2001 +From: Mattias Walström +Date: Tue, 30 Jun 2026 15:46:25 +0200 +Subject: [PATCH 66/68] wifi: brcmfmac: let cfg_to_ndev() return NULL and + harden its callers +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +cfg_to_ndev() dereferenced the result of brcmf_get_ifp(cfg->pub, 0) +unconditionally, even though brcmf_get_ifp() can return NULL. Make the +helper return NULL in that case. + +A later change allows the primary interface (bsscfgidx 0) to be removed +while the wiphy stays registered, so cfg_to_ndev() can legitimately +return NULL during the lifetime of the device. Audit every caller, and +the direct brcmf_get_ifp(drvr, 0) users that can run after probe, and +add the missing NULL checks: + + - brcmf_apsta_add_vif(), brcmf_cfg80211_set_wiphy_params() and + brcmf_cfg80211_set_tx_power() return -ENODEV. + - brcmf_cfg80211_suspend() / _resume() return 0 so a missing primary + interface does not abort system sleep. + - brcmf_config_dongle() takes the interface being brought up instead + of looking up the primary one, so a secondary interface can still be + opened while the primary is absent. + - The p2p helpers (get_conn_idx, add_vif, disable/release_p2p_if) + return -ENODEV. + - brcmf_cfg80211_reg_notifier() uses brcmf_get_ifp(drvr, 0) directly + and bails out, since the country iovar has nothing to be issued on. + - brcmf_btcoex_set_mode() and brcmf_btcoex_boost_wifi(), reached from + the crit_proto ops and the btcoex work, bail out likewise. + - brcmf_inetaddr_changed() bails out when it falls back to the primary + interface for firmware without arp_version, as its IPv6 twin already + does. + +The remaining users only compare against cfg_to_ndev() and are already +NULL-safe. No functional change while the primary interface is present. + +Signed-off-by: Mattias Walström +--- + .../broadcom/brcm80211/brcmfmac/btcoex.c | 6 ++ + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 55 ++++++++++++++----- + .../broadcom/brcm80211/brcmfmac/cfg80211.h | 4 +- + .../broadcom/brcm80211/brcmfmac/core.c | 5 +- + .../broadcom/brcm80211/brcmfmac/p2p.c | 28 ++++++++-- + 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 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, + { + struct brcmf_if *ifp = brcmf_get_ifp(btci->cfg->pub, 0); + ++ if (!ifp) ++ return; ++ + if (trump_sco && !btci->saved_regs_part2) { + /* this should reduce eSCO agressive + * retransmit w/o breaking it +@@ -454,6 +457,9 @@ int brcmf_btcoex_set_mode(struct brcmf_cfg80211_vif *vif, + struct brcmf_btcoex_info *btci = cfg->btcoex; + struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); + ++ if (!ifp) ++ return -ENODEV; ++ + switch (mode) { + 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 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, + enum nl80211_iftype type) + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); ++ struct net_device *ndev = cfg_to_ndev(cfg); + struct brcmf_pub *drvr = cfg->pub; + struct brcmf_cfg80211_vif *vif; ++ struct brcmf_if *ifp; + int err; + ++ if (!ndev) { ++ bphy_err(drvr, "primary interface not available\n"); ++ return ERR_PTR(-ENODEV); ++ } ++ ifp = netdev_priv(ndev); ++ + if (type != NL80211_IFTYPE_STATION && type != NL80211_IFTYPE_AP) + return ERR_PTR(-EINVAL); + +@@ -1644,10 +1651,13 @@ static s32 brcmf_cfg80211_set_wiphy_params(struct wiphy *wiphy, int radio_idx, + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); + struct net_device *ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(ndev); ++ struct brcmf_if *ifp; + s32 err = 0; + + brcmf_dbg(TRACE, "Enter\n"); ++ if (!ndev) ++ return -ENODEV; ++ ifp = netdev_priv(ndev); + if (!check_vif_up(ifp->vif)) + return -EIO; + +@@ -2653,13 +2663,18 @@ brcmf_cfg80211_set_tx_power(struct wiphy *wiphy, struct wireless_dev *wdev, + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); + struct net_device *ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(ndev); + struct brcmf_pub *drvr = cfg->pub; ++ struct brcmf_if *ifp; + s32 err; + s32 disable; + u32 qdbm = 127; + + brcmf_dbg(TRACE, "Enter %d %d\n", type, mbm); ++ if (!ndev) { ++ bphy_err(drvr, "primary interface not available\n"); ++ return -ENODEV; ++ } ++ ifp = netdev_priv(ndev); + if (!check_vif_up(ifp->vif)) + return -EIO; + +@@ -4173,10 +4188,15 @@ static s32 brcmf_cfg80211_resume(struct wiphy *wiphy) + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); + struct net_device *ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(ndev); ++ struct brcmf_if *ifp; + + brcmf_dbg(TRACE, "Enter\n"); + ++ /* Nothing to restore if the primary interface has been removed. */ ++ if (!ndev) ++ return 0; ++ ifp = netdev_priv(ndev); ++ + if (cfg->wowl.active) { + brcmf_report_wowl_wakeind(wiphy, ifp); + brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0); +@@ -4276,11 +4296,16 @@ static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy, + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); + struct net_device *ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(ndev); + struct brcmf_cfg80211_vif *vif; ++ struct brcmf_if *ifp; + + brcmf_dbg(TRACE, "Enter\n"); + ++ /* Nothing to configure if the primary interface has been removed. */ ++ if (!ndev) ++ return 0; ++ ifp = netdev_priv(ndev); ++ + /* if the primary net_device is not READY there is nothing + * we can do but pray resume goes smoothly. + */ +@@ -7787,22 +7812,18 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp) + return 0; + } + +-static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg) ++static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg, ++ struct brcmf_if *ifp) + { + struct brcmf_pub *drvr = cfg->pub; +- struct net_device *ndev; +- struct wireless_dev *wdev; +- struct brcmf_if *ifp; ++ struct net_device *ndev = ifp->ndev; ++ struct wireless_dev *wdev = ndev->ieee80211_ptr; + s32 power_mode; + s32 err = 0; + + if (cfg->dongle_up) + return err; + +- ndev = cfg_to_ndev(cfg); +- wdev = ndev->ieee80211_ptr; +- ifp = netdev_priv(ndev); +- + /* make sure RF is ready for work */ + brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 0); + +@@ -7842,7 +7863,7 @@ static s32 __brcmf_cfg80211_up(struct brcmf_if *ifp) + { + set_bit(BRCMF_VIF_STATUS_READY, &ifp->vif->sme_state); + +- return brcmf_config_dongle(ifp->drvr->config); ++ return brcmf_config_dongle(ifp->drvr->config, ifp); + } + + static s32 __brcmf_cfg80211_down(struct brcmf_if *ifp) +@@ -8277,6 +8298,12 @@ static void brcmf_cfg80211_reg_notifier(struct wiphy *wiphy, + brcmf_dbg(TRACE, "Enter: initiator=%d, alpha=%c%c\n", req->initiator, + req->alpha2[0], req->alpha2[1]); + ++ /* The country iovar is issued on the primary interface. */ ++ if (!ifp) { ++ bphy_err(drvr, "primary interface not available\n"); ++ return; ++ } ++ + err = brcmf_fil_iovar_data_get(ifp, "country", &ccreq, sizeof(ccreq)); + 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 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) + static inline + struct net_device *cfg_to_ndev(struct brcmf_cfg80211_info *cfg) + { +- return brcmf_get_ifp(cfg->pub, 0)->ndev; ++ struct brcmf_if *ifp = brcmf_get_ifp(cfg->pub, 0); ++ ++ return ifp ? ifp->ndev : NULL; + } + + 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 7d8ec55571dde..a429748c36140 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +@@ -1026,8 +1026,11 @@ static int brcmf_inetaddr_changed(struct notifier_block *nb, + ret = brcmf_fil_iovar_int_get(ifp, "arp_version", &val); + if (ret) + val = 1; +- if (val == 1) ++ if (val == 1) { + ifp = drvr->iflist[0]; ++ if (!ifp) ++ return NOTIFY_DONE; ++ } + + /* 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 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) + { + struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev); + struct net_device *pri_ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(pri_ndev); + const u8 *addr = vif->wdev.netdev->dev_addr; ++ struct brcmf_if *ifp; ++ ++ if (!pri_ndev) ++ return -ENODEV; ++ ifp = netdev_priv(pri_ndev); + + return brcmf_fil_iovar_data_set(ifp, "p2p_ifdis", addr, ETH_ALEN); + } +@@ -2125,8 +2129,12 @@ static int brcmf_p2p_release_p2p_if(struct brcmf_cfg80211_vif *vif) + { + struct brcmf_cfg80211_info *cfg = wdev_to_cfg(&vif->wdev); + struct net_device *pri_ndev = cfg_to_ndev(cfg); +- struct brcmf_if *ifp = netdev_priv(pri_ndev); + const u8 *addr = vif->wdev.netdev->dev_addr; ++ struct brcmf_if *ifp; ++ ++ if (!pri_ndev) ++ return -ENODEV; ++ ifp = netdev_priv(pri_ndev); + + return brcmf_fil_iovar_data_set(ifp, "p2p_ifdel", addr, ETH_ALEN); + } +@@ -2222,8 +2230,13 @@ static struct wireless_dev *brcmf_p2p_create_p2pdev(struct brcmf_p2p_info *p2p, + static int brcmf_p2p_get_conn_idx(struct brcmf_cfg80211_info *cfg) + { + int i; +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); ++ struct net_device *ndev = cfg_to_ndev(cfg); ++ struct brcmf_if *ifp; ++ ++ if (!ndev) ++ return -ENODEV; + ++ ifp = netdev_priv(ndev); + if (!ifp) + return -ENODEV; + +@@ -2255,14 +2268,21 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, + struct vif_params *params) + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); +- struct brcmf_if *ifp = netdev_priv(cfg_to_ndev(cfg)); ++ struct net_device *ndev = cfg_to_ndev(cfg); + struct brcmf_pub *drvr = cfg->pub; + struct brcmf_cfg80211_vif *vif; + enum brcmf_fil_p2p_if_types iftype; ++ struct brcmf_if *ifp; + int err = 0; + int connidx; + u8 *p2p_intf_addr; + ++ if (!ndev) { ++ bphy_err(drvr, "primary interface not available\n"); ++ return ERR_PTR(-ENODEV); ++ } ++ ifp = netdev_priv(ndev); ++ + if (brcmf_cfg80211_vif_event_armed(cfg)) + return ERR_PTR(-EBUSY); + diff --git a/patches/linux/6.18.50/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch b/patches/linux/6.18.50/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch new file mode 100644 index 000000000..312443e8f --- /dev/null +++ b/patches/linux/6.18.50/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch @@ -0,0 +1,334 @@ +From e85456d54cda76b47d11eb0d34e2d2464281edca Mon Sep 17 00:00:00 2001 +From: Mattias Walström +Date: Tue, 30 Jun 2026 16:05:17 +0200 +Subject: [PATCH 67/68] wifi: brcmfmac: support deletion and recreation of the + primary interface +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +The Broadcom FullMAC firmware never deletes the primary interface +(bsscfgidx 0); it always exists. brcmfmac therefore rejected any attempt +to delete it with -ENOTSUPP. Userspace, however, may want to remove the +primary interface and recreate it with a different name or type. + +Allow this by operating only on the local driver structures while +leaving the firmware interface in place: + + - brcmf_cfg80211_del_primary_iface() tears down the local structures + for bsscfgidx 0. It aborts any scan and cancels the escan timeout + worker so nothing can run against the freed interface, then removes + the netdev, which runs the usual brcmf_netdev_stop() teardown. If no + other interface remains it also sends BRCMF_C_DOWN to clear firmware + state and clears dongle_up so the firmware is reconfigured on + recreation; with other interfaces present neither is done, since + BRCMF_C_DOWN is dongle-wide and would tear down their BSS or + association. + + - brcmf_cfg80211_add_primary_iface() rebuilds the local structures for + bsscfgidx 0, registers the netdev, brings the firmware interface up, + programs the MAC address (the one requested with the add, else the + device address; the firmware keeps whatever it was last given) and + runs brcmf_config_dongle() directly, since operations such as + channel survey can occur before the interface is opened. + + - The add/del dispatchers pick these paths for bsscfgidx 0: add uses + the recreate path when iflist[0] is empty, del uses the primary path + whenever the target is the primary netdev, whatever its current + iftype. + +brcmf_apsta_add_vif() now also brings the firmware interface up after +creation, because firmware may reuse a bsscfgidx from a previously +deleted interface and retain stale state affecting channel operations. + +Removal of a *secondary* interface deliberately does not send +BRCMF_C_DOWN: that command is dongle-wide and would disrupt the other +interfaces that remain up. + +The p2p code caches the primary vif in bss_idx[P2PAPI_BSSCFG_PRIMARY] +and brcmf_cfg80211_connect() compares against it to tell a regular +connection from a p2p one. Deleting the primary interface is refused +with -EBUSY while any p2p interface exists, the cached pointer is +cleared on deletion so it cannot dangle, and it is refreshed when the +primary interface is recreated. The action frame helpers that are +reachable from any interface (a GAS frame sent on a secondary AP goes +through brcmf_p2p_send_action_frame()) check the cached pointer before +using it. + +Depends on the preceding cfg_to_ndev() NULL hardening and the +brcmf_del_if() rtnl-locking fix, since the primary interface can now be +absent and is removed from a cfg80211 op that holds rtnl. + +Signed-off-by: Mattias Walström +--- + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 165 +++++++++++++++++- + .../broadcom/brcm80211/brcmfmac/p2p.c | 16 +- + 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 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 { + u32 time_req; + }; + ++static s32 brcmf_config_dongle(struct brcmf_cfg80211_info *cfg, ++ struct brcmf_if *ifp); ++ + static bool check_vif_up(struct brcmf_cfg80211_vif *vif) + { + if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state)) { +@@ -875,6 +878,13 @@ struct wireless_dev *brcmf_apsta_add_vif(struct wiphy *wiphy, const char *name, + goto fail; + } + ++ /* ++ * Bring the firmware interface up. When firmware reuses a bsscfgidx ++ * from a previously deleted interface it may retain stale state that ++ * affects channel operations; bringing it up ensures proper init. ++ */ ++ brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); ++ + strscpy(ifp->ndev->name, name, sizeof(ifp->ndev->name)); + err = brcmf_net_attach(ifp, true); + if (err) { +@@ -981,6 +991,94 @@ static int brcmf_mon_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev) + return 0; + } + ++/** ++ * brcmf_cfg80211_add_primary_iface() - recreate the primary interface ++ * ++ * @wiphy: wiphy device of new interface. ++ * @name: name of the new interface. ++ * @type: interface type (STATION or AP). ++ * @params: interface parameters, only the MAC address is used. ++ * ++ * The primary interface (bsscfgidx 0) always exists in firmware and cannot ++ * be created there. This rebuilds the local driver structures after the ++ * primary interface was removed by brcmf_cfg80211_del_primary_iface(). ++ * ++ * Return: pointer to new wdev on success, ERR_PTR(-errno) on failure. ++ */ ++static struct wireless_dev *brcmf_cfg80211_add_primary_iface(struct wiphy *wiphy, ++ const char *name, ++ enum nl80211_iftype type, ++ struct vif_params *params) ++{ ++ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); ++ struct brcmf_pub *drvr = cfg->pub; ++ struct brcmf_cfg80211_vif *vif; ++ u8 *mac = drvr->mac; ++ struct brcmf_if *ifp; ++ int err; ++ ++ brcmf_dbg(INFO, "Recreating primary interface \"%s\" at bsscfgidx 0\n", ++ name); ++ ++ if (params && !is_zero_ether_addr(params->macaddr)) ++ mac = params->macaddr; ++ ++ ifp = brcmf_add_if(drvr, 0, 0, false, name, mac); ++ if (IS_ERR(ifp)) ++ return ERR_CAST(ifp); ++ ++ brcmf_proto_add_if(drvr, ifp); ++ ++ vif = brcmf_alloc_vif(cfg, type); ++ if (IS_ERR(vif)) { ++ err = PTR_ERR(vif); ++ goto fail_if; ++ } ++ ++ vif->ifp = ifp; ++ vif->wdev.netdev = ifp->ndev; ++ ifp->ndev->ieee80211_ptr = &vif->wdev; ++ SET_NETDEV_DEV(ifp->ndev, wiphy_dev(cfg->wiphy)); ++ ifp->vif = vif; ++ ++ err = brcmf_net_attach(ifp, true); ++ if (err) { ++ bphy_err(drvr, "Registering netdevice failed\n"); ++ /* ++ * brcmf_net_attach() failure leaves iflist[0] cleared and the ++ * netdev unregistered, so brcmf_remove_interface() would not ++ * find it. Free the netdev and the vif directly instead. ++ */ ++ free_netdev(ifp->ndev); ++ brcmf_free_vif(vif); ++ return ERR_PTR(err); ++ } ++ ++ /* The p2p code and brcmf_cfg80211_connect() key off this vif. */ ++ cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = vif; ++ ++ /* ++ * Bringing bsscfgidx 0 up and (re)configuring the dongle would ++ * normally happen on ndo_open via brcmf_cfg80211_up(). Operations ++ * such as channel survey may run before the interface is opened, and ++ * dongle_up was cleared if the primary interface was the last one ++ * removed, so configure the dongle here. The firmware keeps the ++ * address it was last given, so program the one this netdev uses. ++ */ ++ brcmf_fil_cmd_int_set(ifp, BRCMF_C_UP, 1); ++ brcmf_c_set_cur_etheraddr(ifp, ifp->mac_addr); ++ set_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state); ++ err = brcmf_config_dongle(cfg, ifp); ++ if (err) ++ bphy_err(drvr, "dongle configuration failed: %d\n", err); ++ ++ return &vif->wdev; ++ ++fail_if: ++ brcmf_remove_interface(ifp, true); ++ return ERR_PTR(err); ++} ++ + static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, + const char *name, + unsigned char name_assign_type, +@@ -1008,7 +1106,12 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, + return brcmf_mon_add_vif(wiphy, name); + case NL80211_IFTYPE_STATION: + case NL80211_IFTYPE_AP: +- wdev = brcmf_apsta_add_vif(wiphy, name, params, type); ++ /* Recreate the primary interface if its slot is free. */ ++ if (!drvr->iflist[0]) ++ wdev = brcmf_cfg80211_add_primary_iface(wiphy, name, ++ type, params); ++ else ++ wdev = brcmf_apsta_add_vif(wiphy, name, params, type); + break; + case NL80211_IFTYPE_P2P_CLIENT: + case NL80211_IFTYPE_P2P_GO: +@@ -1303,14 +1406,64 @@ static int brcmf_cfg80211_del_apsta_iface(struct wiphy *wiphy, + return err; + } + ++static int brcmf_cfg80211_del_primary_iface(struct wiphy *wiphy, ++ struct wireless_dev *wdev) ++{ ++ struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); ++ struct net_device *ndev = wdev->netdev; ++ struct brcmf_if *ifp = netdev_priv(ndev); ++ struct brcmf_pub *drvr = cfg->pub; ++ bool last = true; ++ int i; ++ ++ /* ++ * The p2p code operates through the primary interface, so refuse ++ * to remove it while any p2p interface exists. ++ */ ++ for (i = P2PAPI_BSSCFG_DEVICE; i < P2PAPI_BSSCFG_MAX; i++) { ++ if (cfg->p2p.bss_idx[i].vif) { ++ bphy_err(drvr, "p2p interface(s) still present\n"); ++ return -EBUSY; ++ } ++ } ++ ++ for (i = 1; i < BRCMF_MAX_IFS; i++) { ++ if (drvr->iflist[i]) { ++ last = false; ++ break; ++ } ++ } ++ ++ /* ++ * The primary interface (bsscfgidx 0) cannot be removed from ++ * firmware, but the local interface structures can be torn down so ++ * it can be recreated later via add_virtual_intf(). Make sure the ++ * escan timeout worker cannot run against the freed interface. ++ * ++ * BRCMF_C_DOWN clears leftover firmware state, but it affects the ++ * whole dongle, so only send it when no other interface remains, and ++ * then let brcmf_config_dongle() reinitialise the firmware when the ++ * primary interface is recreated. ++ */ ++ brcmf_abort_scanning(cfg); ++ cancel_work_sync(&cfg->escan_timeout_work); ++ if (last) { ++ brcmf_fil_cmd_int_set(ifp, BRCMF_C_DOWN, 1); ++ cfg->dongle_up = false; ++ } ++ ++ cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif = NULL; ++ brcmf_remove_interface(ifp, true); ++ ++ return 0; ++} ++ + static + int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) + { + struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); + struct net_device *ndev = wdev->netdev; +- +- if (ndev && ndev == cfg_to_ndev(cfg)) +- return -ENOTSUPP; ++ bool is_primary = ndev && ndev == cfg_to_ndev(cfg); + + /* vif event pending in firmware */ + if (brcmf_cfg80211_vif_event_armed(cfg)) +@@ -1325,6 +1478,10 @@ int brcmf_cfg80211_del_iface(struct wiphy *wiphy, struct wireless_dev *wdev) + brcmf_fil_iovar_int_set(netdev_priv(ndev), "mpc", 1); + } + ++ /* The primary interface is handled the same whatever its type. */ ++ if (is_primary) ++ return brcmf_cfg80211_del_primary_iface(wiphy, wdev); ++ + switch (wdev->iftype) { + 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 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) + brcmf_dbg(TRACE, "Enter\n"); + + pri_vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; ++ if (!pri_vif) ++ return P2P_INVALID_CHANNEL; + + reinit_completion(&afx_hdl->act_frm_scan); + set_bit(BRCMF_P2P_STATUS_FINDING_COMMON_CHANNEL, &p2p->status); +@@ -1299,9 +1301,15 @@ static void + brcmf_p2p_stop_wait_next_action_frame(struct brcmf_cfg80211_info *cfg) + { + struct brcmf_p2p_info *p2p = &cfg->p2p; +- struct brcmf_if *ifp = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->ifp; ++ struct brcmf_cfg80211_vif *pri_vif; ++ struct brcmf_if *ifp; + s32 err; + ++ pri_vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; ++ if (!pri_vif) ++ return; ++ ifp = pri_vif->ifp; ++ + if (test_bit(BRCMF_P2P_STATUS_SENDING_ACT_FRAME, &p2p->status) && + (test_bit(BRCMF_P2P_STATUS_ACTION_TX_COMPLETED, &p2p->status) || + test_bit(BRCMF_P2P_STATUS_ACTION_TX_NOACK, &p2p->status))) { +@@ -1716,6 +1724,7 @@ bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp, + struct brcmf_config_af_params config_af_params; + struct afx_hdl *afx_hdl = &p2p->afx_hdl; + struct brcmf_pub *drvr = cfg->pub; ++ struct brcmf_cfg80211_vif *pri_vif; + u16 action_frame_len; + bool ack = false; + u8 category; +@@ -1792,8 +1801,9 @@ bool brcmf_p2p_send_action_frame(struct brcmf_if *ifp, + /* if connecting on primary iface, sleep for a while before sending + * af tx for VSDB + */ +- if (test_bit(BRCMF_VIF_STATUS_CONNECTING, +- &p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif->sme_state)) ++ pri_vif = p2p->bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; ++ if (pri_vif && ++ test_bit(BRCMF_VIF_STATUS_CONNECTING, &pri_vif->sme_state)) + msleep(50); + + /* if scan is ongoing, abort current scan. */ diff --git a/patches/linux/6.18.50/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch b/patches/linux/6.18.50/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch new file mode 100644 index 000000000..4d9bce272 --- /dev/null +++ b/patches/linux/6.18.50/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch @@ -0,0 +1,118 @@ +From 25f707b19284d50ca1c2b4712f01336630aecb61 Mon Sep 17 00:00:00 2001 +From: Mattias Walström +Date: Thu, 10 Sep 2026 08:29:47 +0200 +Subject: [PATCH 68/68] wifi: brcmfmac: report port authorized after offloaded + PSK/SAE handshake +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Organization: Wires + +When the 4-way handshake is offloaded to firmware (BRCMF_PROFILE_FWSUP_PSK +or _SAE), brcmf_is_linkup() only declares the link up once the firmware +has signalled BRCMF_E_PSK_SUP with BRCMF_E_STATUS_FWSUP_COMPLETED, so by +the time the successful connection is reported the controlled port is +already open. The driver never told cfg80211 about that, however: +cfg80211_port_authorized() was only called for FT-802.1X roams. + +The offload support predates the NL80211_CMD_PORT_AUTHORIZED event and +its requirement that offloading drivers send it after NL80211_CMD_CONNECT +or NL80211_CMD_ROAM (commit 503c1fb98ba3 ("cfg80211/nl80211: add a port +authorized event")), and was not updated when that contract appeared. + +wpa_supplicant, when the driver advertises +NL80211_EXT_FEATURE_4WAY_HANDSHAKE_STA_PSK, hands the PSK to the driver +and after the connect event waits for NL80211_CMD_PORT_AUTHORIZED before +entering COMPLETED ("ASSOC INFO: wait for driver port authorized +indication"). Since no EAPOL frames reach the host either, the +supplicant sits in ASSOCIATED until its authentication timer fires: + + wifi0: Associated with 12:13:37:13:37:09 + wifi0: Authentication with 12:13:37:13:37:09 timed out. + wifi0: CTRL-EVENT-DISCONNECTED bssid=12:13:37:13:37:09 reason=3 + locally_generated=1 + +while the driver trace shows the firmware finished the handshake: + + brcmf_fweh_event_worker event SET_SSID (0:0) ifidx 0 bsscfg 0 ... + brcmf_fweh_event_worker event PSK_SUP (46:46) ifidx 0 bsscfg 0 ... + brcmf_notify_connect_status Linkup + brcmf_bss_connect_done Report connect result - connection succeeded + +Report the port as authorized in the link-up path of +brcmf_notify_connect_status(), right after the connect result, and also +when BRCMF_E_PSK_SUP completes on an already connected interface, which +is the firmware having redone the handshake after a roam; the report in +brcmf_bss_roaming_done() only covered FT-802.1X. The connect result and +the port authorized notification go through the same wdev event queue, +so ordering is preserved. + +Seen with BCM4345/6 (43455) firmware 7.45.241 on a Raspberry Pi 4 and +wpa_supplicant 2.12; disabling the offload with +brcmfmac.feature_disable=0x2000 makes the same setup connect, which +confirms the missing notification is the only problem. + +Fixes: b8a64f0e96c2 ("brcmfmac: support 4-way handshake offloading for WPA/WPA2-PSK") +Signed-off-by: Mattias Walström +--- + .../broadcom/brcm80211/brcmfmac/cfg80211.c | 32 ++++++++++++++++++- + 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 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, + return 0; + } + ++/* With the 4-way handshake offloaded to firmware no EAPOL frames reach the ++ * host, so once the firmware supplicant has completed the port has to be ++ * reported authorized explicitly or the supplicant keeps waiting for it. ++ */ ++static void brcmf_report_port_authorized(struct brcmf_if *ifp) ++{ ++ struct brcmf_cfg80211_profile *profile = &ifp->vif->profile; ++ ++ if (profile->use_fwsup != BRCMF_PROFILE_FWSUP_PSK && ++ profile->use_fwsup != BRCMF_PROFILE_FWSUP_SAE) ++ return; ++ ++ cfg80211_port_authorized(ifp->ndev, profile->bssid, NULL, 0, ++ GFP_KERNEL); ++ brcmf_dbg(CONN, "Report port authorized\n"); ++} ++ + static s32 + brcmf_notify_connect_status_ap(struct brcmf_cfg80211_info *cfg, + struct net_device *ndev, +@@ -6781,8 +6798,13 @@ brcmf_notify_connect_status(struct brcmf_if *ifp, + &ifp->vif->sme_state); + set_bit(BRCMF_VIF_STATUS_CONNECTED, + &ifp->vif->sme_state); +- } else ++ } else { ++ /* For offloaded PSK/SAE brcmf_is_linkup() only fires ++ * once the firmware supplicant has completed. ++ */ + brcmf_bss_connect_done(cfg, ndev, e, true); ++ brcmf_report_port_authorized(ifp); ++ } + brcmf_net_setcarrier(ifp, true); + } else if (brcmf_is_linkdown(ifp->vif, e)) { + brcmf_dbg(CONN, "Linkdown\n"); +@@ -6814,6 +6836,14 @@ brcmf_notify_connect_status(struct brcmf_if *ifp, + &ifp->vif->sme_state); + else + brcmf_bss_connect_done(cfg, ndev, e, false); ++ } else if (e->event_code == BRCMF_E_PSK_SUP && ++ e->status == BRCMF_E_STATUS_FWSUP_COMPLETED && ++ test_bit(BRCMF_VIF_STATUS_CONNECTED, &ifp->vif->sme_state)) { ++ /* Handshake completed after a roam: brcmf_is_linkup() has ++ * recorded EAP_SUCCESS without a matching ASSOC_SUCCESS. ++ */ ++ clear_bit(BRCMF_VIF_STATUS_EAP_SUCCESS, &ifp->vif->sme_state); ++ brcmf_report_port_authorized(ifp); + } + + return err;