diff --git a/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3/etc/product/init.d/S22-macaddr b/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3/etc/product/init.d/S22-macaddr index f44f78b9d..996ea5c43 120000 --- a/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3/etc/product/init.d/S22-macaddr +++ b/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3/etc/product/init.d/S22-macaddr @@ -1 +1 @@ -/usr/libexec/bpi-r3/macaddr \ No newline at end of file +/usr/libexec/infix/macaddr \ No newline at end of file diff --git a/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3mini/etc/product/init.d/S22-macaddr b/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3mini/etc/product/init.d/S22-macaddr index f44f78b9d..996ea5c43 120000 --- a/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3mini/etc/product/init.d/S22-macaddr +++ b/board/aarch64/bananapi-bpi-r3/rootfs/usr/share/product/bananapi,bpi-r3mini/etc/product/init.d/S22-macaddr @@ -1 +1 @@ -/usr/libexec/bpi-r3/macaddr \ No newline at end of file +/usr/libexec/infix/macaddr \ No newline at end of file diff --git a/board/aarch64/microchip-ev23x71a/Config.in b/board/aarch64/microchip-ev23x71a/Config.in index dc3e8254d..83683518d 100644 --- a/board/aarch64/microchip-ev23x71a/Config.in +++ b/board/aarch64/microchip-ev23x71a/Config.in @@ -1,6 +1,7 @@ config BR2_PACKAGE_MICROCHIP_EV23X71A bool "Microchip EV23X71A (Laguna)" depends on BR2_aarch64 + select BR2_PACKAGE_SYMREG help Support for the Microchip EV23X71A evaluation board, based on the LAN969x (Laguna) family of TSN capable switches. 24 GbE diff --git a/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi b/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi index e39f876f8..255fa8ae5 100644 --- a/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi +++ b/board/aarch64/microchip-ev23x71a/dts/microchip/infix.dtsi @@ -13,3 +13,15 @@ }; }; }; + +/* Register access by name for the symreg tool, debugfs only */ +&axi { + symreg@e00c0000 { + compatible = "microchip,sparx5-symreg"; + reg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + reg-names = "cpu", "dev"; + microchip,symreg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + }; +}; diff --git a/board/aarch64/microchip-ev23x71a/rootfs/usr/share/product/microchip,ev23x71a/etc/product/init.d/S22-macaddr b/board/aarch64/microchip-ev23x71a/rootfs/usr/share/product/microchip,ev23x71a/etc/product/init.d/S22-macaddr new file mode 120000 index 000000000..996ea5c43 --- /dev/null +++ b/board/aarch64/microchip-ev23x71a/rootfs/usr/share/product/microchip,ev23x71a/etc/product/init.d/S22-macaddr @@ -0,0 +1 @@ +/usr/libexec/infix/macaddr \ No newline at end of file diff --git a/board/aarch64/microchip-lan969x/README.md b/board/aarch64/microchip-lan969x/README.md new file mode 100644 index 000000000..acf492f7d --- /dev/null +++ b/board/aarch64/microchip-lan969x/README.md @@ -0,0 +1,72 @@ +# Microchip LAN969x (Laguna) + +Files shared by the boards built on the LAN969x switch family: + +| Board | Package | +|-------------------------------------------------|------------------------------------| +| [Microchip EV23X71A](../microchip-ev23x71a) | `BR2_PACKAGE_MICROCHIP_EV23X71A` | +| [Novarq Tactical 1000](../novarq-tactical-1000) | `BR2_PACKAGE_NOVARQ_TACTICAL_1000` | + +`uboot/` holds the U-Boot config fragment and environment used by the +`*_boot_defconfig` of each board. Kernel device tree and configuration +fixups stay with each board, see its `dts/` directory and `.mk` file. + +A new Laguna board should select `BR2_PACKAGE_SYMREG` in its `Config.in` +and carry the `microchip,sparx5-symreg` node in its `dts/microchip/infix.dtsi`, +copied from one of the boards above, so the tool below works on it too. + +## Debugging + +### Register access by name + +Every Laguna board ships `symreg`, Microchip's tool for reading and +writing switch registers by their datasheet names. It talks to the +`symreg` debugfs driver, which maps the register space the device tree +node describes and exposes it as `/sys/kernel/debug/symreg/mem`. Root +only, since debugfs is. + +``` +symreg --help # options and the register syntax +symreg -m # MAC table +symreg -v # VLAN table +symreg -c 0 # VCAP instance 0 +symreg -s # stream table + +symreg 'DEV2G5[29]*' # all registers of port 29's device block +symreg 'ASM*[29]*' # ingress side of the same port +symreg -a 'DSM*[29]*' # same, with the physical addresses + +symreg REG[idx] # read one register +symreg REG[idx].FIELD # read one field +symreg REG[idx].FIELD 1 # write one field, add -f for wildcards +``` + +Register and field names follow the LAN969x datasheet. Quote the +wildcards or the shell expands them. The dispatcher `symreg` picks the +SoC from `/proc/device-tree/compatible` and runs `symreg_lan969x`, which +can also be called directly. + +The tool reads live hardware, so the useful pattern for an intermittent +fault is a snapshot while the port works, another once it has failed, +and a diff of the two. For the management port, which is switch port 29 +on both boards: + +```bash +for blk in 'DEV2G5[29]*' 'ASM*[29]*' 'DSM*[29]*' 'QSYS*[29]*'; do + symreg "$blk" +done >/tmp/port29-$(date +%s).txt +``` + +Check the PHY as well. The management PHY sits on the GCB MDIO bus and +shares one level triggered interrupt line with the copper PHYs, so a +stale link state can come from a missed PHY interrupt as well as from +the switch. Read it with `mdio` from mdio-tools, see the +[EV23X71A README](../microchip-ev23x71a/README.md#debug-and-analysis), +which also covers the VCAP debugfs and `ethtool` counters; both apply to +either board. + +### Writing registers + +Writes take effect immediately and bypass the driver, which keeps no +record of them. Expect the driver's own view to disagree afterwards, +and reboot before trusting any behaviour again. diff --git a/board/aarch64/novarq-tactical-1000/Config.in b/board/aarch64/novarq-tactical-1000/Config.in index 4c66e6205..440bfc28c 100644 --- a/board/aarch64/novarq-tactical-1000/Config.in +++ b/board/aarch64/novarq-tactical-1000/Config.in @@ -1,6 +1,7 @@ config BR2_PACKAGE_NOVARQ_TACTICAL_1000 bool "Novarq Tactical 1000 (Laguna)" depends on BR2_aarch64 + select BR2_PACKAGE_SYMREG help Support for the Novarq Tactical 1000, based on the LAN969x (Laguna) family of TSN capable switches. 24 GbE copper ports, diff --git a/board/aarch64/novarq-tactical-1000/README.md b/board/aarch64/novarq-tactical-1000/README.md index 350304878..9f1b6f699 100644 --- a/board/aarch64/novarq-tactical-1000/README.md +++ b/board/aarch64/novarq-tactical-1000/README.md @@ -104,6 +104,23 @@ Storage][7]. A unit still on the vendor U-Boot netboots as described in [Netboot with a Vendor U-Boot][8]. The first boot grows `var` to fill the eMMC and reboots once by itself. +## Identity + +The board has no MAC address in OTP, so without help every boot gets a +random base MAC and random port addresses, which also change the +link-local addresses the test rig finds the unit by. `provision-tactical` +offers to write a base MAC and a serial number to `vpd.onie` on the `aux` +partition, which the system reads as its product VPD. On a unit already +provisioned, write it by hand and reboot: + +```bash +echo '{"mac-address":"02:00:00:7a:c7:00","serial-number":"tact1","vendor":"Novarq","product-name":"Tactical-1000"}' \ + | onieprom -e | sudo tee /mnt/aux/vpd.onie >/dev/null +``` + +The base MAC becomes the chassis address, `e1` gets base + 1, `e2` base + 2, +and so on, `mgmt` after the last `e` port. See [VPD][9] for the format. + ## Device Tree Cherry-picked from [Novarq's kernel tree][2]. One commit adapts it to @@ -152,3 +169,4 @@ unused. [6]: https://github.com/novarq/tactical-1000/blob/main/docs/boot-modes.md [7]: ../../../doc/netboot.md#installing-to-onboard-storage [8]: ../../../doc/netboot.md#netboot-with-a-vendor-u-boot +[9]: ../../../doc/vpd.md#factory-partition-or-file diff --git a/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi b/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi index e39f876f8..255fa8ae5 100644 --- a/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi +++ b/board/aarch64/novarq-tactical-1000/dts/microchip/infix.dtsi @@ -13,3 +13,15 @@ }; }; }; + +/* Register access by name for the symreg tool, debugfs only */ +&axi { + symreg@e00c0000 { + compatible = "microchip,sparx5-symreg"; + reg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + reg-names = "cpu", "dev"; + microchip,symreg = <0xe00c0000 0x10000>, + <0xe2000000 0x2000000>; + }; +}; diff --git a/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical b/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical index c5983fa79..69f413d6e 100755 --- a/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical +++ b/board/aarch64/novarq-tactical-1000/rootfs/usr/libexec/infix/prod/provision-tactical @@ -114,9 +114,24 @@ if ask "Create aux, primary ${imgsize}, secondary ${imgsize}, cfg ${cfgsize}, an mkfs.ext4 -qF -L aux -m 0 -i 4096 -O ^metadata_csum,^metadata_csum_seed,uninit_bg "${disk}p4" mkfs.ext4 -qF -L cfg -m 0 -i 4096 -O uninit_bg "${disk}p7" mkfs.ext4 -qF -L var -m 0 -i 4096 -O uninit_bg "${disk}p8" + # + # RAUC tracks slot boot state in uboot.env, seed it as prod/provision does. mnt=$(mktemp -d) mount -t ext4 "${disk}p4" "$mnt" echo 1 >"$mnt"/resized + mkenvimage -s 0x4000 -o "$mnt"/uboot.env - <"$mnt"/vpd.onie + fi umount "$mnt" rmdir "$mnt" fi diff --git a/board/aarch64/novarq-tactical-1000/rootfs/usr/share/product/novarq,tactical-1000/etc/product/init.d/S22-macaddr b/board/aarch64/novarq-tactical-1000/rootfs/usr/share/product/novarq,tactical-1000/etc/product/init.d/S22-macaddr new file mode 120000 index 000000000..996ea5c43 --- /dev/null +++ b/board/aarch64/novarq-tactical-1000/rootfs/usr/share/product/novarq,tactical-1000/etc/product/init.d/S22-macaddr @@ -0,0 +1 @@ +/usr/libexec/infix/macaddr \ No newline at end of file diff --git a/board/common/rootfs/etc/bash.bashrc b/board/common/rootfs/etc/bash.bashrc index 8e916c939..a7c56c198 100644 --- a/board/common/rootfs/etc/bash.bashrc +++ b/board/common/rootfs/etc/bash.bashrc @@ -33,21 +33,7 @@ bind "set show-all-if-ambiguous on" export LANG=C.UTF-8 -log() -{ - local fn="/var/log/syslog" - [ -n "$1" ] && fn="/var/log/$1" - less +G -r "$fn" -} - -follow () -{ - local fn="/var/log/syslog" - [ -n "$1" ] && fn="/var/log/$1" - - tail -F -n +1 "$fn" -} - +# log and follow are defined in /etc/profile.d/log.sh _logfile_completions() { local cur=${COMP_WORDS[COMP_CWORD]} diff --git a/board/common/rootfs/etc/profile.d/log.sh b/board/common/rootfs/etc/profile.d/log.sh new file mode 100644 index 000000000..3dada6c13 --- /dev/null +++ b/board/common/rootfs/etc/profile.d/log.sh @@ -0,0 +1,15 @@ +# Page or follow a log file, default syslog. Plain sh, so BusyBox ash +# and bash both get it; the bash completions live in /etc/bash.bashrc. +log() +{ + local fn="/var/log/syslog" + [ -n "$1" ] && fn="/var/log/$1" + less +G -r "$fn" +} + +follow() +{ + local fn="/var/log/syslog" + [ -n "$1" ] && fn="/var/log/$1" + tail -F -n +1 "$fn" +} diff --git a/board/common/rootfs/usr/libexec/infix/init.d/00-probe b/board/common/rootfs/usr/libexec/infix/init.d/00-probe index d41c196de..e24136200 100755 --- a/board/common/rootfs/usr/libexec/infix/init.d/00-probe +++ b/board/common/rootfs/usr/libexec/infix/init.d/00-probe @@ -481,20 +481,22 @@ def probe_dmisystem(out): FACTORY_PART = "/dev/disk/by-partlabel/factory" +AUX_VPD = "/mnt/aux/vpd.onie" -def factory_partition_vpd(): - """Product VPD from an ONIE TLV at the start of the factory partition. +def file_vpd(path): + """Product VPD from an ONIE TLV in a file, or at the start of a partition. Boards without a VPD EEPROM, e.g. SBCs, can be given an identity by - writing a TLV to a partition labelled "factory". Anyone with write - access to the disk can change it, so it is never trusted. + writing a TLV to a partition labelled "factory", or to vpd.onie on + the aux partition. Anyone with write access to the disk can change + it, so it is never trusted. """ - if not os.path.exists(FACTORY_PART): + if not os.path.exists(path): return None try: - with open(FACTORY_PART, "rb", 0) as f: + with open(path, "rb", 0) as f: data = onieprom.from_tlv(f) except Exception: # pylint: disable=broad-except return None @@ -516,9 +518,11 @@ def probe_dtsystem(out): vpds = dtsys.infix_vpds() if not any(vpd["board"] == "product" and vpd["available"] for vpd in vpds): - vpd = factory_partition_vpd() - if vpd: - vpds.append(vpd) + for path in (FACTORY_PART, AUX_VPD): + vpd = file_vpd(path) + if vpd: + vpds.append(vpd) + break model = dtsys.base.str("model") if model: diff --git a/board/aarch64/bananapi-bpi-r3/rootfs/usr/libexec/bpi-r3/macaddr b/board/common/rootfs/usr/libexec/infix/macaddr similarity index 63% rename from board/aarch64/bananapi-bpi-r3/rootfs/usr/libexec/bpi-r3/macaddr rename to board/common/rootfs/usr/libexec/infix/macaddr index 3e5efb239..7654ba8a1 100755 --- a/board/aarch64/bananapi-bpi-r3/rootfs/usr/libexec/bpi-r3/macaddr +++ b/board/common/rootfs/usr/libexec/infix/macaddr @@ -1,18 +1,22 @@ #!/usr/bin/env python3 """Give ports without a hardware MAC address a chassis-derived one. -The BPI-R3 family has no MAC EEPROM, so every port boots with a random -address, and the switch ports inherit that from their conduit. When -the product VPD provides a base MAC, hand each such port a stable -address derived from it: base + 1, base + 2, ... in interface name -order. This mirrors what products with real hardware addresses get -from their device tree. Ports with a permanent address are left alone. - -Runs from /etc/product/init.d, before the DSA conduit is renamed, so -it sorts as eth0 and takes base + 1. +Boards without a MAC EEPROM or OTP boot with a random address on every +port. When the product VPD provides a base MAC, hand each such port a +stable address derived from it: base + 1, base + 2, ... in interface +name order, with numbers compared as numbers so e2 comes before e10. +This mirrors what products with real hardware addresses get from their +device tree. Ports with a permanent address are left alone. + +Runs from /etc/product/init.d on the boards that need it, before a DSA +conduit is renamed, so it sorts as eth0 and takes base + 1. + +With an interface name as argument, prints the address that port gets +and sets nothing, for confd to restore a port's default address. """ import json import os +import re import subprocess import sys @@ -48,9 +52,13 @@ def read(path): return f.read().strip() +def natural(name): + return [int(s) if s.isdigit() else s for s in re.split(r"(\d+)", name)] + + def ports(): """Wired ports whose address the kernel did not get from hardware.""" - for name in sorted(os.listdir(NET)): + for name in sorted(os.listdir(NET), key=natural): path = os.path.join(NET, name) if not os.path.exists(os.path.join(path, "device")): continue @@ -66,12 +74,20 @@ def ports(): def main(): + query = sys.argv[1] if len(sys.argv) > 1 else None + base = vpd_base_mac() if not base: - return 0 + return 1 if query else 0 for offset, name in enumerate(ports(), start=1): mac = mac_add(base, offset) + if query: + if name == query: + print(mac) + return 0 + continue + rc = subprocess.run(["ip", "link", "set", "dev", name, "address", mac], check=False) if rc.returncode: @@ -79,7 +95,7 @@ def main(): continue log(f"{name}: {mac} (chassis + {offset})") - return 0 + return 1 if query else 0 if __name__ == "__main__": diff --git a/configs/aarch64_minimal_defconfig b/configs/aarch64_minimal_defconfig index 186fc77b2..8f642dd17 100644 --- a/configs/aarch64_minimal_defconfig +++ b/configs/aarch64_minimal_defconfig @@ -111,6 +111,7 @@ BR2_PACKAGE_HOST_GENEXT2FS=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FIT_SIGNATURE_SUPPORT=y BR2_PACKAGE_HOST_UBOOT_TOOLS_FDT_ADD_PUBKEY=y +BR2_PACKAGE_ACER_CONNECT_VERO_W6M=y BR2_PACKAGE_ALDER_ALDER=y BR2_PACKAGE_BANANAPI_BPI_R3=y BR2_PACKAGE_BANANAPI_BPI_R4=y @@ -118,6 +119,8 @@ BR2_PACKAGE_BANANAPI_BPI_R64=y BR2_PACKAGE_FRIENDLYARM_NANOPI_R2S=y BR2_PACKAGE_MARVELL_CN9130_CRB=y BR2_PACKAGE_MARVELL_ESPRESSOBIN=y +BR2_PACKAGE_MICROCHIP_EV23X71A=y +BR2_PACKAGE_NOVARQ_TACTICAL_1000=y BR2_PACKAGE_RASPBERRYPI_RPI64=y BR2_PACKAGE_STYX_DCP_SC_28P=y IX_VENDOR_HOME="https://www.kernelkit.org" diff --git a/doc/ChangeLog.md b/doc/ChangeLog.md index e585de412..c372bcb2c 100644 --- a/doc/ChangeLog.md +++ b/doc/ChangeLog.md @@ -11,9 +11,12 @@ All notable changes to the project are documented in this file. - Upgrade Linux kernel to 6.18.56 (LTS) - Boards without a VPD EEPROM can be given a fixed identity, base MAC included, by writing an ONIE TLV to a disk partition labelled `factory`, - see [VPD documentation](vpd.md#factory-partition) -- Banana Pi BPI-R3: ports get stable addresses derived from the chassis - MAC instead of random ones at every boot + or to the file `vpd.onie` on the `aux` partition, see + [VPD documentation](vpd.md#factory-partition-or-file) +- Banana Pi BPI-R3 and the LAN969x boards: ports get stable addresses + derived from the chassis MAC instead of random ones at every boot. A + port's default address, restored when its `custom-phys-address` is + removed, is that derived address on boards without one in hardware - WiFi interfaces get a unique address derived from the chassis MAC, so several APs on one radio, or two devices of the same model, no longer need `custom-phys-address` @@ -67,6 +70,9 @@ All notable changes to the project are documented in this file. - WiFi channel survey is on request: `show hardware survey`, the Scan channels button on the WebUI WiFi page, or the `channel-survey` action. The always-on `survey` container under the radio is gone +- LAN969x boards ship `symreg`, which reads and writes switch registers by + name and dumps the MAC, VLAN and VCAP tables, for debugging the switch + core, see `board/aarch64/microchip-lan969x/README.md` ### Fixes @@ -99,6 +105,35 @@ All notable changes to the project are documented in this file. WPA3 clients - Changing the MAC address of a WiFi access point could leave the access points on that radio down until the WiFi service was restarted +- LAN969x: a port outside any bridge stopped receiving multicast, including + IPv6 neighbour discovery and mDNS, when another port outside a bridge went + down or joined a bridge. The port looked dead on the LAN until it was + taken down and up again, which is how the Tactical 1000 management port + kept dropping out of the test rig +- LAN969x: kernel BUG "scheduling while atomic" when a multicast address was + added to or removed from a port outside any bridge +- LAN969x: the IP address of a bridge was unreachable from its ports, while + forwarding between the ports worked. Broadcast from a bridge port never + reached the CPU, so ARP went unanswered, and the bridge's own MAC address + was missing from the switch MAC table, so unicast to the bridge was + flooded to the ports instead of delivered +- LAN969x: disabling the first port of a bridge, whose MAC address the + bridge uses, cut the bridge IP address off until the port was enabled + again +- LAN969x: taking down one port of a link aggregate stopped unicast to the + aggregate on the remaining ports, and removing the aggregate cut off the + port whose address it had used until that port was disabled and enabled + again +- PTP ports with PHY timestamping, e.g. the copper ports on LAN969x boards, + kept dropping to the faulty state because the transmit timestamp arrived + later than the 10 ms the PTP daemon waited for it +- PTP never worked on the copper ports of the Tactical 1000, whose LAN8804 + PHYs are a LAN8814 variant without a 1588 unit. The kernel took them for + full LAN8814s and waited for PHY timestamps that never came; it now + recognizes the variant and times stamps in the switch core instead +- PTP: the IEEE 802.1AS link delay threshold, above which a port never + leaves the listening state, defaults to 10 us with hardware time stamping + instead of 800 ns, and can be set per port with `mean-link-delay-thresh` [pppoe]: https://www.kernelkit.org/infix/latest/pppoe/ [wds]: https://www.kernelkit.org/infix/latest/wifi/#wds-backhaul-and-repeaters diff --git a/doc/vpd.md b/doc/vpd.md index 6c32b3982..fb8046de3 100644 --- a/doc/vpd.md +++ b/doc/vpd.md @@ -1,28 +1,24 @@ Vital Product Data ================== -Infix can source Vital Product Data (VPD) from EEPROMs containing an -[ONIE TLV][oniespec]. The load bearing information from VPDs, used by -Infix by default, is: +The system can source Vital Product Data (VPD) from EEPROMs containing an +[ONIE TLV][oniespec]. The load bearing information from VPDs is: 1. Base (chassis) MAC address of the system 2. Factory default admin password hash -Additionally, every VPD is listed as a separate _component_ in the -_ietf-hardware_ model, in which Infix exports all available attributes -to the user. This is useful to read out exact hardware revisions of -each board making up a system, figure out if a system belongs to a -particular production batch, etc. - +Every VPD is listed as a separate _component_ in the _ietf-hardware_ YANG +model. Useful to read out exact hardware revisions of each board making up a +system, figure out if a system belongs to a particular production batch, etc. ## Device Tree Bindings -The system finds its VPDs through the `vpds` property of the -`/chosen/infix` node in the device tree (DT), a list of phandles to EEPROMs with an ONIE TLV -layout. Each EEPROM is named with an `infix,board` property, and may -be marked `infix,trusted`: +VPDs are located through the `vpds` property of the `/chosen/infix` node in +the device tree (DT), a list of phandles to EEPROMs with an ONIE TLV layout. +Each EEPROM is named with an `infix,board` property, and may be marked +`infix,trusted`: -``` +```dts / { chosen { infix { @@ -53,8 +49,7 @@ be marked `infix,trusted`: Every VPD is listed in the _ietf-hardware_ model as a component named `vpd-`, e.g., `vpd-product` for the example above. - -## Factory Partition +## Factory Partition or File Boards without a VPD EEPROM, such as single board computers, boot with a random MAC address on every port and the vendor's default address on @@ -62,25 +57,38 @@ every WiFi radio. Two such boards of the same model cannot even talk to each other over WiFi, since both radios claim the same address. Such a board can be given an identity by writing an ONIE TLV to the -start of a disk partition labelled `factory`. The system reads it -when the device tree provides no product VPD. The `onieprom` tool -encodes the JSON form described [below](#json-encoding): +start of a disk partition labelled `factory`, or to the file `vpd.onie` +on the `aux` partition that every disk layout has. The system reads the +partition first, then the file, when the device tree provides no product +VPD. The `onieprom` tool encodes the JSON form described +[below](#json-encoding): ``` echo '{"mac-address":"02:00:00:ba:01:00","serial-number":"banana1","vendor":"Bananapi","product-name":"BPI-R3"}' \ | onieprom -e | dd of=/dev/disk/by-partlabel/factory ``` +On a running system the file form is written to the mounted `aux` +partition and takes effect on the next boot: + +``` +echo '{"mac-address":"02:00:00:ba:01:00","serial-number":"tactical1","vendor":"Novarq","product-name":"Tactical-1000"}' \ + | onieprom -e | sudo tee /mnt/aux/vpd.onie >/dev/null +``` + A VPD read this way is never trusted, so it can only provide identity, -never the factory password. On the Banana Pi BPI-R3 family the base +never the factory password. On boards whose ports have no hardware +address, the Banana Pi BPI-R3 family and the LAN969x boards, the base MAC address it provides is also handed out to the ports at boot: every wired port without a hardware address gets base + 1, base + 2, and so on, in interface name order. + WiFi interfaces derive their addresses from the base MAC as described in [WiFi](wifi.md#multi-ssid-configuration). The image for the Banana Pi BPI-R3 family already carries an empty -`factory` partition for this purpose. +`factory` partition for this purpose. The Tactical 1000 provisioning +script offers to write the file. ## Product VPD @@ -202,7 +210,7 @@ allows for arbitrary binary data. ### Infix Specific Extensions [Kernelkit][kkit]'s IANA enterprise number is `61046`, under which any -extensions required by Infix are stored. The **only** valid extension +extensions required by Infix are stored. The **only** valid extension data that may be stored under this number is documented in _this section_. If other device specific data needs to be stored in a VPD, you must associate that with an enterprise number under our control. diff --git a/package/Config.in b/package/Config.in index f91fb5580..3ee9d715d 100644 --- a/package/Config.in +++ b/package/Config.in @@ -40,6 +40,7 @@ source "$BR2_EXTERNAL_INFIX_PATH/package/python-spy/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/python-libyang/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/python-yangdoc/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/skeleton-init-finit/Config.in" +source "$BR2_EXTERNAL_INFIX_PATH/package/symreg/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/tetris/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/libyang-cpp/Config.in" source "$BR2_EXTERNAL_INFIX_PATH/package/sysrepo-cpp/Config.in" diff --git a/package/symreg/Config.in b/package/symreg/Config.in new file mode 100644 index 000000000..bb3265fcd --- /dev/null +++ b/package/symreg/Config.in @@ -0,0 +1,10 @@ +config BR2_PACKAGE_SYMREG + bool "symreg - Microchip switch registers by name" + depends on BR2_aarch64 + help + Read and write Microchip LAN969x switch registers by symbolic + name, and dump the MAC, VLAN, VCAP and stream tables, through + the symreg debugfs driver. Debug aid, root only. Selected by + the Laguna boards, see board/aarch64/microchip-lan969x/README.md + + https://github.com/microchip-ung/symreg-tool diff --git a/package/symreg/symreg.hash b/package/symreg/symreg.hash new file mode 100644 index 000000000..5889d1fb6 --- /dev/null +++ b/package/symreg/symreg.hash @@ -0,0 +1,3 @@ +# Locally calculated +sha256 0d7eee2dbdd8e79bb91103d06ee057cb477764a046c5d6d8045e978166a70490 symreg-cb96993eeb34558926a8f5851a945ad4cd674690.tar.gz +sha256 d620d728cc1c0efebe173f8840dd957a56d9ff40867c062d0571b4110ea15f1e LICENSE diff --git a/package/symreg/symreg.mk b/package/symreg/symreg.mk new file mode 100644 index 000000000..53b77b5d2 --- /dev/null +++ b/package/symreg/symreg.mk @@ -0,0 +1,11 @@ +SYMREG_VERSION = cb96993eeb34558926a8f5851a945ad4cd674690 +SYMREG_SITE = $(call github,microchip-ung,symreg-tool,$(SYMREG_VERSION)) +SYMREG_LICENSE = MIT +SYMREG_LICENSE_FILES = LICENSE +SYMREG_CONF_OPTS = -DBUILD_LAN969X=ON + +define SYMREG_LINUX_CONFIG_FIXUPS + $(call KCONFIG_ENABLE_OPT,CONFIG_SPARX5_SYMREG) +endef + +$(eval $(cmake-package)) diff --git a/patches/linux/6.18.56/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch b/patches/linux/6.18.56/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch index 63f024651..7f8658ad7 100644 --- a/patches/linux/6.18.56/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch +++ b/patches/linux/6.18.56/0001-net-phy-marvell10g-Support-firmware-loading-on-88X33.patch @@ -1,7 +1,7 @@ From ca34ebe2b40b53b52a5ea6fb00b7bb36eeeabb5f Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 19 Sep 2023 18:38:10 +0200 -Subject: [PATCH 01/86] net: phy: marvell10g: Support firmware loading on +Subject: [PATCH 01/92] net: phy: marvell10g: Support firmware loading on 88X3310 When probing, if a device is waiting for firmware to be loaded into diff --git a/patches/linux/6.18.56/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch b/patches/linux/6.18.56/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch index 9a48713b7..0e138f101 100644 --- a/patches/linux/6.18.56/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch +++ b/patches/linux/6.18.56/0002-net-phy-marvell10g-Fix-power-up-when-strapped-to-sta.patch @@ -1,7 +1,7 @@ From 59532ff26cccf476b4e6f8eeaf2e733c93106a78 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 21 Nov 2023 20:15:24 +0100 -Subject: [PATCH 02/86] net: phy: marvell10g: Fix power-up when strapped to +Subject: [PATCH 02/92] net: phy: marvell10g: Fix power-up when strapped to start powered down On devices which are hardware strapped to start powered down (PDSTATE diff --git a/patches/linux/6.18.56/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch b/patches/linux/6.18.56/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch index 1b45c4c0a..25233b317 100644 --- a/patches/linux/6.18.56/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch +++ b/patches/linux/6.18.56/0003-net-phy-marvell10g-Add-LED-support-for-88X3310.patch @@ -1,7 +1,7 @@ From 2881f5a7008a4b7a214f63960f1d199f55a7a78a Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 15 Nov 2023 20:58:42 +0100 -Subject: [PATCH 03/86] net: phy: marvell10g: Add LED support for 88X3310 +Subject: [PATCH 03/92] net: phy: marvell10g: Add LED support for 88X3310 Pickup the LEDs from the state in which the hardware reset or bootloader left them, but also support further configuration via diff --git a/patches/linux/6.18.56/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch b/patches/linux/6.18.56/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch index 13027abff..91532b6bb 100644 --- a/patches/linux/6.18.56/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch +++ b/patches/linux/6.18.56/0004-net-phy-marvell10g-Support-LEDs-tied-to-a-single-med.patch @@ -1,7 +1,7 @@ From 67a62752bdb5e1e45982289b2eda1f5df4ca6f47 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Dec 2023 09:51:05 +0100 -Subject: [PATCH 04/86] net: phy: marvell10g: Support LEDs tied to a single +Subject: [PATCH 04/92] net: phy: marvell10g: Support LEDs tied to a single media side In a combo-port setup, i.e. where both the copper and fiber interface diff --git a/patches/linux/6.18.56/0005-net-phy-Do-not-resume-PHY-when-attaching.patch b/patches/linux/6.18.56/0005-net-phy-Do-not-resume-PHY-when-attaching.patch index 370ff0d79..0c670dfa0 100644 --- a/patches/linux/6.18.56/0005-net-phy-Do-not-resume-PHY-when-attaching.patch +++ b/patches/linux/6.18.56/0005-net-phy-Do-not-resume-PHY-when-attaching.patch @@ -1,7 +1,7 @@ From a60255d4ba8ea888ecb86e92a2c65334a26f6384 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 10:10:19 +0100 -Subject: [PATCH 05/86] net: phy: Do not resume PHY when attaching +Subject: [PATCH 05/92] net: phy: Do not resume PHY when attaching The PHY should not start negotiating with its link-partner until explicitly instructed to do so. diff --git a/patches/linux/6.18.56/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch b/patches/linux/6.18.56/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch index 722348bd3..14cd8dbe4 100644 --- a/patches/linux/6.18.56/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch +++ b/patches/linux/6.18.56/0006-net-bridge-avoid-classifying-unknown-multicast-as-mr.patch @@ -1,7 +1,7 @@ From 3fc8e2a80589a5a5ae02fac7b3f97f195cb90930 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 4 Mar 2024 16:47:28 +0100 -Subject: [PATCH 06/86] net: bridge: avoid classifying unknown multicast as +Subject: [PATCH 06/92] net: bridge: avoid classifying unknown multicast as mrouters_only Unknown multicast, MAC/IPv4/IPv6, should always be flooded according to diff --git a/patches/linux/6.18.56/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch b/patches/linux/6.18.56/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch index ac60d4c16..b30d5c142 100644 --- a/patches/linux/6.18.56/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch +++ b/patches/linux/6.18.56/0007-net-bridge-Ignore-router-ports-when-forwarding-L2-mu.patch @@ -1,7 +1,7 @@ From 8f5cf3a448d6e7a1d00043debd0bf1fcaf706680 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 5 Mar 2024 06:44:41 +0100 -Subject: [PATCH 07/86] net: bridge: Ignore router ports when forwarding L2 +Subject: [PATCH 07/92] net: bridge: Ignore router ports when forwarding L2 multicast Multicast router ports are either statically configured or learned from diff --git a/patches/linux/6.18.56/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch b/patches/linux/6.18.56/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch index 46e829866..069be0733 100644 --- a/patches/linux/6.18.56/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch +++ b/patches/linux/6.18.56/0008-net-bridge-drop-delay-for-applying-strict-multicast-.patch @@ -1,7 +1,7 @@ From a42722822b7ff8ea8ac5e65a8449bb72b1ef8c05 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 4 Apr 2024 16:36:30 +0200 -Subject: [PATCH 08/86] net: bridge: drop delay for applying strict multicast +Subject: [PATCH 08/92] net: bridge: drop delay for applying strict multicast filtering This *local* patch drops the initial delay before applying strict multicast diff --git a/patches/linux/6.18.56/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch b/patches/linux/6.18.56/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch index 6a3937d3a..ead9a5575 100644 --- a/patches/linux/6.18.56/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch +++ b/patches/linux/6.18.56/0009-net-bridge-Differentiate-MDB-additions-from-modifica.patch @@ -1,7 +1,7 @@ From 2722df35856114c70f9896452d155b660f804ed8 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 16 May 2024 14:51:54 +0200 -Subject: [PATCH 09/86] net: bridge: Differentiate MDB additions from +Subject: [PATCH 09/92] net: bridge: Differentiate MDB additions from modifications Before this change, the reception of an IGMPv3 report (and analogously diff --git a/patches/linux/6.18.56/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch b/patches/linux/6.18.56/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch index 1e5f830a6..1575a9127 100644 --- a/patches/linux/6.18.56/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch +++ b/patches/linux/6.18.56/0010-nvmem-layouts-onie-tlv-Let-device-probe-even-when-TL.patch @@ -1,7 +1,7 @@ From 17f03931f23a3ed1dbe6f77a7e48bfdc11f17140 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 24 Nov 2023 23:29:55 +0100 -Subject: [PATCH 10/86] nvmem: layouts: onie-tlv: Let device probe even when +Subject: [PATCH 10/92] nvmem: layouts: onie-tlv: Let device probe even when TLV is invalid Before this change, probing an NVMEM device, expected to contain a diff --git a/patches/linux/6.18.56/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch b/patches/linux/6.18.56/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch index 55dfcebe6..f010bd3b5 100644 --- a/patches/linux/6.18.56/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch +++ b/patches/linux/6.18.56/0011-net-usb-r8152-add-r8153b-support-for-link-activity-L.patch @@ -1,7 +1,7 @@ From cbc993b90307a45db570d20bce5e651100bafaa7 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 11 Aug 2024 11:27:35 +0200 -Subject: [PATCH 11/86] net: usb: r8152: add r8153b support for link/activity +Subject: [PATCH 11/92] net: usb: r8152: add r8153b support for link/activity LEDs This patch adds support for the link/activity LEDs on the NanoPi R2S diff --git a/patches/linux/6.18.56/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch b/patches/linux/6.18.56/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch index 5726a3f79..f464865a9 100644 --- a/patches/linux/6.18.56/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch +++ b/patches/linux/6.18.56/0012-arm64-dts-mediatek-mt7986a-rename-BPi-R3-ports-to-ma.patch @@ -1,7 +1,7 @@ From 0c1a54359f6989eedad98678e030fc1d8fb44da0 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 10 Aug 2025 18:52:54 +0200 -Subject: [PATCH 12/86] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to +Subject: [PATCH 12/92] arm64: dts: mediatek: mt7986a: rename BPi R3 ports to match case For ref. see: https://wiki.banana-pi.org/File:Bpi-r3_Metal_case.jpg diff --git a/patches/linux/6.18.56/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch b/patches/linux/6.18.56/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch index 1068b1f89..77242c4a6 100644 --- a/patches/linux/6.18.56/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch +++ b/patches/linux/6.18.56/0013-drm-panel-simple-Add-a-timing-for-the-Raspberry-Pi-7.patch @@ -1,7 +1,7 @@ From 2cbb47d51538a83315595715405a328552b9a753 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 20 Aug 2025 21:38:24 +0200 -Subject: [PATCH 13/86] drm/panel-simple: Add a timing for the Raspberry Pi 7" +Subject: [PATCH 13/92] drm/panel-simple: Add a timing for the Raspberry Pi 7" panel The Raspberry Pi 7" 800x480 panel uses a Toshiba TC358762 DSI diff --git a/patches/linux/6.18.56/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch b/patches/linux/6.18.56/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch index 70094938d..bff4434ba 100644 --- a/patches/linux/6.18.56/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch +++ b/patches/linux/6.18.56/0014-input-touchscreen-edt-ft5x06-Add-polled-mode.patch @@ -1,7 +1,7 @@ From fed97704c224902b2d79c81492c5a50ccd97793b Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Thu, 21 Aug 2025 11:20:23 +0200 -Subject: [PATCH 14/86] input:touchscreen:edt-ft5x06: Add polled mode +Subject: [PATCH 14/92] input:touchscreen:edt-ft5x06: Add polled mode Not all hardware has interrupts therefore we need to poll the touchscreen. diff --git a/patches/linux/6.18.56/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch b/patches/linux/6.18.56/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch index 0d8c07724..dd006389c 100644 --- a/patches/linux/6.18.56/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch +++ b/patches/linux/6.18.56/0015-FIX-net-dsa-mv88e6xxx-Fix-timeout-on-waiting-for-PPU.patch @@ -1,7 +1,7 @@ From 11f9f49b62a6eb3a73a523541b3f26f6958e0d49 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 12 Mar 2024 10:27:24 +0100 -Subject: [PATCH 15/86] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for +Subject: [PATCH 15/92] [FIX] net: dsa: mv88e6xxx: Fix timeout on waiting for PPU on 6393X In a multi-chip setup, delays of up to 750ms are observed before the diff --git a/patches/linux/6.18.56/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch b/patches/linux/6.18.56/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch index aef78ec81..7c1d11d9a 100644 --- a/patches/linux/6.18.56/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch +++ b/patches/linux/6.18.56/0016-net-dsa-mv88e6xxx-Improve-indirect-register-access-p.patch @@ -1,7 +1,7 @@ From 6aed16ecedd6e8d3594474b00b4f80a6a75372c1 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 27 Mar 2024 15:52:43 +0100 -Subject: [PATCH 16/86] net: dsa: mv88e6xxx: Improve indirect register access +Subject: [PATCH 16/92] net: dsa: mv88e6xxx: Improve indirect register access perf on 6393 When operating in multi-chip mode, the 6393 family maps a subset of diff --git a/patches/linux/6.18.56/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch b/patches/linux/6.18.56/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch index 914a05225..60299ec54 100644 --- a/patches/linux/6.18.56/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch +++ b/patches/linux/6.18.56/0017-net-dsa-mv88e6xxx-Honor-ports-being-managed-via-in-b.patch @@ -1,7 +1,7 @@ From 627e2902f0b11f9994e5c8c92627791b60069cdb Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Mon, 22 Apr 2024 23:18:01 +0200 -Subject: [PATCH 17/86] net: dsa: mv88e6xxx: Honor ports being managed via +Subject: [PATCH 17/92] net: dsa: mv88e6xxx: Honor ports being managed via in-band-status Keep all link parameters in their unforced states when the port is diff --git a/patches/linux/6.18.56/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch b/patches/linux/6.18.56/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch index 25c027ed6..d7e240b76 100644 --- a/patches/linux/6.18.56/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch +++ b/patches/linux/6.18.56/0018-net-dsa-mv88e6xxx-Limit-rsvd2cpu-policy-to-user-port.patch @@ -1,7 +1,7 @@ From 1ad63ed23d72ed2429bcb7393aac0e82affde9e3 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 24 Apr 2024 22:41:04 +0200 -Subject: [PATCH 18/86] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user +Subject: [PATCH 18/92] net: dsa: mv88e6xxx: Limit rsvd2cpu policy to user ports on 6393X For packets with a DA in the IEEE reserved L2 group range, originating diff --git a/patches/linux/6.18.56/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch b/patches/linux/6.18.56/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch index 51365c7dc..053a4dcef 100644 --- a/patches/linux/6.18.56/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch +++ b/patches/linux/6.18.56/0019-net-dsa-tag_dsa-Use-tag-priority-as-initial-skb-prio.patch @@ -1,7 +1,7 @@ From 29b6583d7463dfddbfbb0e30a70de7707f5c86b0 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 10:38:42 +0200 -Subject: [PATCH 19/86] net: dsa: tag_dsa: Use tag priority as initial +Subject: [PATCH 19/92] net: dsa: tag_dsa: Use tag priority as initial skb->priority Use the 3-bit priority field from the DSA tag as the initial packet diff --git a/patches/linux/6.18.56/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch b/patches/linux/6.18.56/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch index ffeed9746..fd5b37043 100644 --- a/patches/linux/6.18.56/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch +++ b/patches/linux/6.18.56/0020-net-dsa-Support-MDB-memberships-whose-L2-addresses-o.patch @@ -1,7 +1,7 @@ From 6cebfb46fd0a75b04f2481dcbd43cb9442bb1e12 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 16 Jan 2024 16:00:55 +0100 -Subject: [PATCH 20/86] net: dsa: Support MDB memberships whose L2 addresses +Subject: [PATCH 20/92] net: dsa: Support MDB memberships whose L2 addresses overlap Multiple IP multicast groups (32 for v4, 2^80 for v6) map to the same diff --git a/patches/linux/6.18.56/0021-net-dsa-Support-EtherType-based-priority-overrides.patch b/patches/linux/6.18.56/0021-net-dsa-Support-EtherType-based-priority-overrides.patch index c4d543ad5..6370e2f04 100644 --- a/patches/linux/6.18.56/0021-net-dsa-Support-EtherType-based-priority-overrides.patch +++ b/patches/linux/6.18.56/0021-net-dsa-Support-EtherType-based-priority-overrides.patch @@ -1,7 +1,7 @@ From 2b39a3958e00546ff1c6f0cc523970d19355d796 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Thu, 21 Mar 2024 19:12:15 +0100 -Subject: [PATCH 21/86] net: dsa: Support EtherType based priority overrides +Subject: [PATCH 21/92] net: dsa: Support EtherType based priority overrides --- include/net/dsa.h | 4 ++++ diff --git a/patches/linux/6.18.56/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch b/patches/linux/6.18.56/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch index fa0860976..2d66f6b88 100644 --- a/patches/linux/6.18.56/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch +++ b/patches/linux/6.18.56/0022-net-dsa-mv88e6xxx-Support-EtherType-based-priority-o.patch @@ -1,7 +1,7 @@ From 3769055203bee35077c685d850f0debbac52459e Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 22 Mar 2024 16:15:43 +0100 -Subject: [PATCH 22/86] net: dsa: mv88e6xxx: Support EtherType based priority +Subject: [PATCH 22/92] net: dsa: mv88e6xxx: Support EtherType based priority overrides --- diff --git a/patches/linux/6.18.56/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch b/patches/linux/6.18.56/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch index ade6f51f6..4cc9b8d55 100644 --- a/patches/linux/6.18.56/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch +++ b/patches/linux/6.18.56/0023-net-dsa-mv88e6xxx-Add-mqprio-qdisc-support.patch @@ -1,7 +1,7 @@ From bf8849ce4ee5e95f33c435914a5d7c8e6e16e416 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 28 May 2024 11:04:22 +0200 -Subject: [PATCH 23/86] net: dsa: mv88e6xxx: Add mqprio qdisc support +Subject: [PATCH 23/92] net: dsa: mv88e6xxx: Add mqprio qdisc support Add support for attaching mqprio qdisc's to mv88e6xxx ports and use the packet's traffic class as the outgoing priority when no PCP bits diff --git a/patches/linux/6.18.56/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch b/patches/linux/6.18.56/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch index 11cf8db9d..9fd672802 100644 --- a/patches/linux/6.18.56/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch +++ b/patches/linux/6.18.56/0024-net-dsa-mv88e6xxx-Use-VLAN-prio-over-IP-when-both-ar.patch @@ -1,7 +1,7 @@ From 73b39094d7cdd592ec6fb18164590678789ab37a Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 29 May 2024 13:20:41 +0200 -Subject: [PATCH 24/86] net: dsa: mv88e6xxx: Use VLAN prio over IP when both +Subject: [PATCH 24/92] net: dsa: mv88e6xxx: Use VLAN prio over IP when both are available Switch the priority sourcing precdence to prefer VLAN PCP over IP diff --git a/patches/linux/6.18.56/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch b/patches/linux/6.18.56/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch index a8da9951c..100bf22ef 100644 --- a/patches/linux/6.18.56/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch +++ b/patches/linux/6.18.56/0025-FIX-net-dsa-mv88e6xxx-Trap-locally-terminated-VLANs.patch @@ -1,7 +1,7 @@ From 320983cf57f27f4138a4736388ad384ea9754d37 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Tue, 26 Nov 2024 19:45:59 +0100 -Subject: [PATCH 25/86] [FIX] net: dsa: mv88e6xxx: Trap locally terminated +Subject: [PATCH 25/92] [FIX] net: dsa: mv88e6xxx: Trap locally terminated VLANs Before this change, in a setup like the following, packets assigned to diff --git a/patches/linux/6.18.56/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch b/patches/linux/6.18.56/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch index e3cd5c084..471f02133 100644 --- a/patches/linux/6.18.56/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch +++ b/patches/linux/6.18.56/0026-net-dsa-mv88e6xxx-collapse-disabled-state-into-block.patch @@ -1,7 +1,7 @@ From 95d919b20d95e7d33432d450e2caafa42105d645 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Thu, 16 Jan 2025 12:35:12 +0100 -Subject: [PATCH 26/86] net: dsa: mv88e6xxx: collapse disabled state into +Subject: [PATCH 26/92] net: dsa: mv88e6xxx: collapse disabled state into blocking This patch changes the behavior of switchcore ports wrt. the port state. diff --git a/patches/linux/6.18.56/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch b/patches/linux/6.18.56/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch index ec77c2f60..4a23e3548 100644 --- a/patches/linux/6.18.56/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch +++ b/patches/linux/6.18.56/0027-net-dsa-mv88e6xxx-Only-activate-LAG-offloading-when-.patch @@ -1,7 +1,7 @@ From 4a67cefaa3e4d69034afee21162133191863e841 Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Wed, 12 Feb 2025 22:03:14 +0100 -Subject: [PATCH 27/86] net: dsa: mv88e6xxx: Only activate LAG offloading when +Subject: [PATCH 27/92] net: dsa: mv88e6xxx: Only activate LAG offloading when bridged The current port isolation scheme for mv88e6xxx is detailed here: diff --git a/patches/linux/6.18.56/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch b/patches/linux/6.18.56/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch index ba7c735f1..990404a65 100644 --- a/patches/linux/6.18.56/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch +++ b/patches/linux/6.18.56/0028-net-dsa-mv88e6xxx-Add-LED-support-for-6393X.patch @@ -1,7 +1,7 @@ From de1f05b6ee9af9d4f7deb7cde43e28d81e1b7f7f Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 14 Jan 2026 18:22:41 +0100 -Subject: [PATCH 28/86] net: dsa: mv88e6xxx: Add LED support for 6393X +Subject: [PATCH 28/92] net: dsa: mv88e6xxx: Add LED support for 6393X Original commit: commit 462277b926140ee2d231317e92afb6cabf640268 diff --git a/patches/linux/6.18.56/0029-wifi-brcmfmac-check-connection-state-before-querying.patch b/patches/linux/6.18.56/0029-wifi-brcmfmac-check-connection-state-before-querying.patch index 61a591407..45edb1c2e 100644 --- a/patches/linux/6.18.56/0029-wifi-brcmfmac-check-connection-state-before-querying.patch +++ b/patches/linux/6.18.56/0029-wifi-brcmfmac-check-connection-state-before-querying.patch @@ -1,7 +1,7 @@ From 5ba4ebc2cbcc3efdb8c68e64de2e3e1d36f700ca Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Mon, 19 Jan 2026 13:06:53 +0100 -Subject: [PATCH 29/86] wifi: brcmfmac: check connection state before querying +Subject: [PATCH 29/92] wifi: brcmfmac: check connection state before querying station info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch b/patches/linux/6.18.56/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch index 2749a592e..ac739ed73 100644 --- a/patches/linux/6.18.56/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch +++ b/patches/linux/6.18.56/0030-wifi-brcmfmac-suppress-log-spam-for-regulatory-restr.patch @@ -1,7 +1,7 @@ From e714d2bb8736f8befb0e223b4de054981125010e Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:12:10 +0100 -Subject: [PATCH 30/86] wifi: brcmfmac: suppress log spam for +Subject: [PATCH 30/92] wifi: brcmfmac: suppress log spam for regulatory-restricted channels MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch b/patches/linux/6.18.56/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch index 30aecd068..ba3ca82af 100644 --- a/patches/linux/6.18.56/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch +++ b/patches/linux/6.18.56/0031-wifi-brcmfmac-reduce-log-noise-during-AP-to-station-.patch @@ -1,7 +1,7 @@ From 09696680be45dbeb24e8a722c3d4030b7737e11a Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 20 Jan 2026 20:18:45 +0100 -Subject: [PATCH 31/86] wifi: brcmfmac: reduce log noise during AP to station +Subject: [PATCH 31/92] wifi: brcmfmac: reduce log noise during AP to station transition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch b/patches/linux/6.18.56/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch index 145a6655e..b6054e82b 100644 --- a/patches/linux/6.18.56/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch +++ b/patches/linux/6.18.56/0032-net-phy-air_en8811h-add-OF-device-table-for-auto-loa.patch @@ -1,7 +1,7 @@ From 28322c174df66701c2f4283bf338a3032a8121bc Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 17 Feb 2026 21:59:59 +0100 -Subject: [PATCH 32/86] net: phy: air_en8811h: add OF device table for +Subject: [PATCH 32/92] net: phy: air_en8811h: add OF device table for auto-loading mdio_uevent() only emits an OF-style MODALIAS via diff --git a/patches/linux/6.18.56/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch b/patches/linux/6.18.56/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch index d2717e199..1752cd41a 100644 --- a/patches/linux/6.18.56/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch +++ b/patches/linux/6.18.56/0033-drm-vc4-dsi-enable-video-and-then-retry-failed-trans.patch @@ -1,7 +1,7 @@ From 53aba25643ef8e41021eab9b61242f3151fa3a56 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 20 Sep 2024 12:05:18 +0100 -Subject: [PATCH 33/86] drm: vc4: dsi: enable video and then retry failed +Subject: [PATCH 33/92] drm: vc4: dsi: enable video and then retry failed transfers The DSI block appears to be able to come up stuck in a condition where diff --git a/patches/linux/6.18.56/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch b/patches/linux/6.18.56/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch index 128b97ca5..fbb8c6c07 100644 --- a/patches/linux/6.18.56/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch +++ b/patches/linux/6.18.56/0034-drm-vc4-dsi-Clocks-should-be-running-before-reset.patch @@ -1,7 +1,7 @@ From b145fb6117a42c835d69cee8d01b7679396541e6 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 8 Jun 2022 17:23:47 +0100 -Subject: [PATCH 34/86] drm: vc4: dsi: Clocks should be running before reset +Subject: [PATCH 34/92] drm: vc4: dsi: Clocks should be running before reset The initialisation sequence differs slightly from the documentation in that the clocks are meant to be running before resets and diff --git a/patches/linux/6.18.56/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch b/patches/linux/6.18.56/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch index d1130efce..cd6cc1d0b 100644 --- a/patches/linux/6.18.56/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch +++ b/patches/linux/6.18.56/0035-drm-vc4-Ensure-DSI-is-enabled-for-FIFO-resets.patch @@ -1,7 +1,7 @@ From 394a21d586f7f13a5cb822ed95ef986dfb17ca87 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Fri, 5 Apr 2024 17:51:55 +0100 -Subject: [PATCH 35/86] drm/vc4: Ensure DSI is enabled for FIFO resets +Subject: [PATCH 35/92] drm/vc4: Ensure DSI is enabled for FIFO resets The block must be enabled for the FIFO resets to be actioned, so ensure this is the case. diff --git a/patches/linux/6.18.56/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch b/patches/linux/6.18.56/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch index de5adcbf3..de24a1337 100644 --- a/patches/linux/6.18.56/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch +++ b/patches/linux/6.18.56/0036-drm-vc4-Reset-DSI-AFE-on-disable.patch @@ -1,7 +1,7 @@ From 5b807e23d91f3d90697f74d484276e574670aa2c Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Thu, 26 May 2022 18:56:19 +0100 -Subject: [PATCH 36/86] drm: vc4: Reset DSI AFE on disable +Subject: [PATCH 36/92] drm: vc4: Reset DSI AFE on disable vc4_dsi_bridge_disable wasn't resetting things during shutdown, so add that in. diff --git a/patches/linux/6.18.56/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch b/patches/linux/6.18.56/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch index 742c69a38..0373a9dee 100644 --- a/patches/linux/6.18.56/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch +++ b/patches/linux/6.18.56/0037-drm-vc4-dsi-Handle-the-different-command-FIFO-widths.patch @@ -1,7 +1,7 @@ From 1610998f5338234b29c335d18ffeb00c2dcec73a Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Wed, 20 Nov 2024 13:58:08 +0000 -Subject: [PATCH 37/86] drm: vc4: dsi: Handle the different command FIFO widths +Subject: [PATCH 37/92] drm: vc4: dsi: Handle the different command FIFO widths DSI0 and DSI1 have different widths for the command FIFO (24bit vs 32bit), but the driver was assuming the 32bit width of DSI1 diff --git a/patches/linux/6.18.56/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch b/patches/linux/6.18.56/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch index fc94b38fc..21a30a22c 100644 --- a/patches/linux/6.18.56/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch +++ b/patches/linux/6.18.56/0038-drm-bridge-tc358762-Program-the-DPI-mode-into-the-ch.patch @@ -1,7 +1,7 @@ From 0c2f36c6efa65abc8d2c5179903c3fb5afac9874 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 17:37:00 +0000 -Subject: [PATCH 38/86] drm/bridge: tc358762: Program the DPI mode into the +Subject: [PATCH 38/92] drm/bridge: tc358762: Program the DPI mode into the chip The autodetection of resolution/timing by the TC358762 can lead diff --git a/patches/linux/6.18.56/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch b/patches/linux/6.18.56/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch index 168a87fe3..f7150fe0b 100644 --- a/patches/linux/6.18.56/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch +++ b/patches/linux/6.18.56/0039-drm-bridge-tc358762-revert-move-ops-to-enable.patch @@ -1,7 +1,7 @@ From 91f9e48ff0405e6b8ec9d046b7f37d96f99483c5 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Tue, 9 Jan 2024 18:44:49 +0000 -Subject: [PATCH 39/86] drm/bridge: tc358762: revert move ops to enable +Subject: [PATCH 39/92] drm/bridge: tc358762: revert move ops to enable Reverts 8a4b2fc9c91a ("drm/bridge: tc358762: Split register programming from pre-enable to enable") as we want the config commands sent before video starts. diff --git a/patches/linux/6.18.56/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch b/patches/linux/6.18.56/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch index a4d092208..e7cafb120 100644 --- a/patches/linux/6.18.56/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch +++ b/patches/linux/6.18.56/0040-drm-bridge-tc358762-Set-pre_enabled-on-pre_enable-to.patch @@ -1,7 +1,7 @@ From 18d15d554c004a795771c8adb8abb6ef54f22985 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Sat, 4 Apr 2026 18:04:19 +0200 -Subject: [PATCH 40/86] drm/bridge: tc358762: Set pre_enabled on pre_enable to +Subject: [PATCH 40/92] drm/bridge: tc358762: Set pre_enabled on pre_enable to prevent regulator imbalance MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch b/patches/linux/6.18.56/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch index acc2764e2..004276e03 100644 --- a/patches/linux/6.18.56/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch +++ b/patches/linux/6.18.56/0041-net-pcs-add-standalone-PCS-registration-infrastructu.patch @@ -1,7 +1,7 @@ From a2fc20fe20ad386cff232905d1858f9af21ecaf2 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 5 Apr 2026 11:33:00 +0200 -Subject: [PATCH 41/86] net/pcs: add standalone PCS registration infrastructure +Subject: [PATCH 41/92] net/pcs: add standalone PCS registration infrastructure Add a simple registration mechanism that allows platform PCS drivers to register their phylink_pcs instances, and consumers (e.g. Ethernet MAC diff --git a/patches/linux/6.18.56/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch b/patches/linux/6.18.56/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch index 07a19f206..95390fb93 100644 --- a/patches/linux/6.18.56/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch +++ b/patches/linux/6.18.56/0042-net-pcs-add-MediaTek-MT7988-USXGMII-PCS-driver.patch @@ -1,7 +1,7 @@ From 6c0e1262a95027d0ef8fb263353e5a4382529437 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:14:23 +0200 -Subject: [PATCH 42/86] net/pcs: add MediaTek MT7988 USXGMII PCS driver +Subject: [PATCH 42/92] net/pcs: add MediaTek MT7988 USXGMII PCS driver Add a PCS driver for the USXGMII subsystem found in the MediaTek MT7988 SoC (usxgmiisys0 at 0x10080000, usxgmiisys1 at 0x10081000). The hardware diff --git a/patches/linux/6.18.56/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch b/patches/linux/6.18.56/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch index 50c0ae6e6..f18ebdc61 100644 --- a/patches/linux/6.18.56/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch +++ b/patches/linux/6.18.56/0043-net-ethernet-mediatek-add-USXGMII-support-for-MT7988.patch @@ -1,7 +1,7 @@ From 7a3a934b66b5a38e732f6c28f76c45b43cea4e15 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:43 +0200 -Subject: [PATCH 43/86] net: ethernet: mediatek: add USXGMII support for MT7988 +Subject: [PATCH 43/92] net: ethernet: mediatek: add USXGMII support for MT7988 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit diff --git a/patches/linux/6.18.56/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch b/patches/linux/6.18.56/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch index 366630365..f7d8be995 100644 --- a/patches/linux/6.18.56/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch +++ b/patches/linux/6.18.56/0044-arm64-dts-mediatek-mt7988a-add-USXGMII-PCS-nodes.patch @@ -1,7 +1,7 @@ From d320f311c3e132191b319db4d7f7e3e3f5ed58df Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:15:56 +0200 -Subject: [PATCH 44/86] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes +Subject: [PATCH 44/92] arm64: dts: mediatek: mt7988a: add USXGMII PCS nodes Add device nodes for the two USXGMII subsystem blocks (usxgmiisys0 at 0x10080000 and usxgmiisys1 at 0x10081000), each referencing its clock, diff --git a/patches/linux/6.18.56/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch b/patches/linux/6.18.56/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch index 51a2e9c26..a7678217c 100644 --- a/patches/linux/6.18.56/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch +++ b/patches/linux/6.18.56/0045-arm64-dts-mediatek-bananapi-bpi-r4-enable-SFP-ports-.patch @@ -1,7 +1,7 @@ From d83185ab2d0bc45de5c33b6fc50006e166f39417 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Mon, 6 Apr 2026 14:16:11 +0200 -Subject: [PATCH 45/86] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ +Subject: [PATCH 45/92] arm64: dts: mediatek: bananapi-bpi-r4: enable SFP+ ports and WPS button Enable the SFP+ cages wired to gmac1 and gmac2. The USXGMII PCS nodes diff --git a/patches/linux/6.18.56/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch b/patches/linux/6.18.56/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch index 59cc38f06..135b18fff 100644 --- a/patches/linux/6.18.56/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch +++ b/patches/linux/6.18.56/0046-net-phy-sfp-add-OEM-SFP-10G-T-I-quirk.patch @@ -1,7 +1,7 @@ From fa401f49e78eeefa6ef1752733c87b1d67655125 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 7 Apr 2026 07:34:52 +0200 -Subject: [PATCH 46/86] net: phy: sfp: add OEM SFP-10G-T-I quirk +Subject: [PATCH 46/92] 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 diff --git a/patches/linux/6.18.56/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch b/patches/linux/6.18.56/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch index 169a5b9e4..67e06fadd 100644 --- a/patches/linux/6.18.56/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch +++ b/patches/linux/6.18.56/0047-net-dsa-mv88e6xxx-Trap-PTP-frames-on-timestamping-po.patch @@ -1,7 +1,7 @@ From 79c898ca16e60f10eafaf89110b5d2c24bd9ac2c Mon Sep 17 00:00:00 2001 From: Tobias Waldekranz Date: Fri, 17 Apr 2026 09:13:04 +0000 -Subject: [PATCH 47/86] net: dsa: mv88e6xxx: Trap PTP frames on timestamping +Subject: [PATCH 47/92] net: dsa: mv88e6xxx: Trap PTP frames on timestamping ports, on 6393X Similar to the Peridot (6390), the designation of PTP frames as diff --git a/patches/linux/6.18.56/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch b/patches/linux/6.18.56/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch index 7feb07b15..6485eb5ad 100644 --- a/patches/linux/6.18.56/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch +++ b/patches/linux/6.18.56/0048-wifi-mt76-mt7615-add-MODULE_DEVICE_TABLE-for-mt7622-.patch @@ -1,7 +1,7 @@ From 0f8cdee2b15e4d5c36520e274ebc74371ec8de68 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 28 Apr 2026 15:30:01 +0200 -Subject: [PATCH 48/86] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 +Subject: [PATCH 48/92] wifi: mt76: mt7615: add MODULE_DEVICE_TABLE for mt7622 wmac Without MODULE_DEVICE_TABLE(of, ...) the OF compatible alias is never diff --git a/patches/linux/6.18.56/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch b/patches/linux/6.18.56/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch index 46fa15d0d..fdb86bd9a 100644 --- a/patches/linux/6.18.56/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch +++ b/patches/linux/6.18.56/0049-PCI-mediatek-gen3-Fix-PERST-control-timing-during-sy.patch @@ -1,7 +1,7 @@ From 5f9aa8845b841fcada5fa58f92ceaa9bb9fabcb4 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 22 Apr 2026 10:24:43 +0200 -Subject: [PATCH 49/86] PCI: mediatek-gen3: Fix PERST# control timing during +Subject: [PATCH 49/92] PCI: mediatek-gen3: Fix PERST# control timing during system startup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch b/patches/linux/6.18.56/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch index cf0df843b..e4367dd35 100644 --- a/patches/linux/6.18.56/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch +++ b/patches/linux/6.18.56/0050-net-dsa-mv88e6xxx-Derive-LED-names-from-device-name.patch @@ -1,7 +1,7 @@ From 024fb8fd29a48bb85f355b5a4a558c8ab6875b3c Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 12 Aug 2026 10:08:53 +0200 -Subject: [PATCH 50/86] net: dsa: mv88e6xxx: Derive LED names from device name +Subject: [PATCH 50/92] net: dsa: mv88e6xxx: Derive LED names from device name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit diff --git a/patches/linux/6.18.56/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch b/patches/linux/6.18.56/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch index 449a6df46..96aeafef1 100644 --- a/patches/linux/6.18.56/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch +++ b/patches/linux/6.18.56/0051-phy-sparx5-serdes-make-it-selectable-for-ARCH_LAN969.patch @@ -1,7 +1,7 @@ From f42698c6d686cabca0fced226a63e09c438fbc78 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 31 Oct 2025 13:18:12 +0100 -Subject: [PATCH 51/86] phy: sparx5-serdes: make it selectable for ARCH_LAN969X +Subject: [PATCH 51/92] phy: sparx5-serdes: make it selectable for ARCH_LAN969X LAN969x uses the SparX-5 SERDES driver, so make it selectable for ARCH_LAN969X. diff --git a/patches/linux/6.18.56/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch b/patches/linux/6.18.56/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch index 745d75541..d54bc3dee 100644 --- a/patches/linux/6.18.56/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch +++ b/patches/linux/6.18.56/0052-net-sparx5-fix-wrong-chip-ids-for-TSN-SKUs.patch @@ -1,7 +1,7 @@ From da55a0660bc7a764abd39b28d1b588d58cfafcf7 Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:38 +0200 -Subject: [PATCH 52/86] net: sparx5: fix wrong chip ids for TSN SKUs +Subject: [PATCH 52/92] net: sparx5: fix wrong chip ids for TSN SKUs The TSN SKUs in enum spx5_target_chiptype have incorrect IDs: diff --git a/patches/linux/6.18.56/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch b/patches/linux/6.18.56/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch index 0d8dfbf32..0db2ef4b9 100644 --- a/patches/linux/6.18.56/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch +++ b/patches/linux/6.18.56/0053-net-sparx5-configure-serdes-for-1000BASE-X-in-sparx5.patch @@ -1,7 +1,7 @@ From 13292f9168073d35dfa05f2c3e8402e18bf3f9ce Mon Sep 17 00:00:00 2001 From: Daniel Machon Date: Wed, 6 May 2026 09:25:39 +0200 -Subject: [PATCH 53/86] net: sparx5: configure serdes for 1000BASE-X in +Subject: [PATCH 53/92] net: sparx5: configure serdes for 1000BASE-X in sparx5_port_init() sparx5_port_init() only invokes sparx5_serdes_set() and the associated diff --git a/patches/linux/6.18.56/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch b/patches/linux/6.18.56/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch index bd6b3e02a..93ddb82d4 100644 --- a/patches/linux/6.18.56/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch +++ b/patches/linux/6.18.56/0054-dt-bindings-mmc-atmel-sama5d2-sdhci-add-microchip-la.patch @@ -1,7 +1,7 @@ From 704c64713d2d2d34a22e0d2f8066996bc62d9120 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:29 +0200 -Subject: [PATCH 54/86] dt-bindings: mmc: atmel,sama5d2-sdhci: add +Subject: [PATCH 54/92] dt-bindings: mmc: atmel,sama5d2-sdhci: add microchip,lan969x-sdhci The LAN969x SDMMC controller has its own base clock divider and, unlike diff --git a/patches/linux/6.18.56/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch b/patches/linux/6.18.56/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch index fb62bbd5c..e6a0eb835 100644 --- a/patches/linux/6.18.56/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch +++ b/patches/linux/6.18.56/0055-mmc-sdhci-of-at91-add-LAN969x-support.patch @@ -1,7 +1,7 @@ From ae98994e45aaa55ecff09321aa65601561aefab4 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:35:44 +0200 -Subject: [PATCH 55/86] mmc: sdhci-of-at91: add LAN969x support +Subject: [PATCH 55/92] mmc: sdhci-of-at91: add LAN969x support The LAN969x SDMMC controller is an Atmel SDMMC IP block, but the driver has no compatible for it, so the eMMC on LAN969x boards never probes. diff --git a/patches/linux/6.18.56/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch b/patches/linux/6.18.56/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch index 36f60a3d2..9e00a29ae 100644 --- a/patches/linux/6.18.56/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch +++ b/patches/linux/6.18.56/0056-mmc-sdhci-of-at91-stop-SDCLK-on-reset-and-add-eMMC-h.patch @@ -1,7 +1,7 @@ From 4a50546ae4abb37070703d1ce20149b65fdd1a51 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:37:48 +0200 -Subject: [PATCH 56/86] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC +Subject: [PATCH 56/92] mmc: sdhci-of-at91: stop SDCLK on reset and add eMMC hardware reset The controller is reset, and its signaling mode changed, with SDCLK diff --git a/patches/linux/6.18.56/0057-net-sparx5-lan969x-populate-netdev-of_node.patch b/patches/linux/6.18.56/0057-net-sparx5-lan969x-populate-netdev-of_node.patch index 3b692f39f..52052a768 100644 --- a/patches/linux/6.18.56/0057-net-sparx5-lan969x-populate-netdev-of_node.patch +++ b/patches/linux/6.18.56/0057-net-sparx5-lan969x-populate-netdev-of_node.patch @@ -1,7 +1,7 @@ From ba2f77ed48aae661eed6cb213162a612f4792931 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 10 Nov 2025 13:42:53 +0100 -Subject: [PATCH 57/86] net: sparx5/lan969x: populate netdev of_node +Subject: [PATCH 57/92] net: sparx5/lan969x: populate netdev of_node Populate of_node for the port netdevs, to make the individual ports of_nodes available in sysfs. diff --git a/patches/linux/6.18.56/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch b/patches/linux/6.18.56/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch index d0fa8eb3c..43725799c 100644 --- a/patches/linux/6.18.56/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch +++ b/patches/linux/6.18.56/0058-arm64-dts-microchip-add-LAN969x-clock-header-file.patch @@ -1,7 +1,7 @@ From b8f745bf145aed656a87edcf2cee16caef2950e2 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:11 +0100 -Subject: [PATCH 58/86] arm64: dts: microchip: add LAN969x clock header file +Subject: [PATCH 58/92] arm64: dts: microchip: add LAN969x clock header file LAN969x uses hardware clock indexes, so document theses in a header to make them humanly readable. diff --git a/patches/linux/6.18.56/0059-arm64-dts-microchip-add-LAN969x-support.patch b/patches/linux/6.18.56/0059-arm64-dts-microchip-add-LAN969x-support.patch index 835c902c4..ce9b55592 100644 --- a/patches/linux/6.18.56/0059-arm64-dts-microchip-add-LAN969x-support.patch +++ b/patches/linux/6.18.56/0059-arm64-dts-microchip-add-LAN969x-support.patch @@ -1,7 +1,7 @@ From c3fc7872ff9176197161d2695a4d3fbbe2d90f90 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:12 +0100 -Subject: [PATCH 59/86] arm64: dts: microchip: add LAN969x support +Subject: [PATCH 59/92] arm64: dts: microchip: add LAN969x support Add support for Microchip LAN969x switch SoC series by adding the SoC DTSI. diff --git a/patches/linux/6.18.56/0060-arm64-dts-microchip-add-EV23X71A-board.patch b/patches/linux/6.18.56/0060-arm64-dts-microchip-add-EV23X71A-board.patch index cf54bc54f..09cac845f 100644 --- a/patches/linux/6.18.56/0060-arm64-dts-microchip-add-EV23X71A-board.patch +++ b/patches/linux/6.18.56/0060-arm64-dts-microchip-add-EV23X71A-board.patch @@ -1,7 +1,7 @@ From b10c04d81bb96ab0b09484ee2a2373482b56f26d Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:14 +0100 -Subject: [PATCH 60/86] arm64: dts: microchip: add EV23X71A board +Subject: [PATCH 60/92] arm64: dts: microchip: add EV23X71A board Microchip EV23X71A is an LAN9696 based evaluation board. diff --git a/patches/linux/6.18.56/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch b/patches/linux/6.18.56/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch index 1a593defe..632f9a0cf 100644 --- a/patches/linux/6.18.56/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch +++ b/patches/linux/6.18.56/0061-arm64-dts-microchip-lan969x-add-OTP-node.patch @@ -1,7 +1,7 @@ From c6af26aff045284fc98aae066d46385e74ab82c8 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 15 May 2026 13:59:09 +0200 -Subject: [PATCH 61/86] arm64: dts: microchip: lan969x: add OTP node +Subject: [PATCH 61/92] arm64: dts: microchip: lan969x: add OTP node Add the required OTP on LAN969x. diff --git a/patches/linux/6.18.56/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch b/patches/linux/6.18.56/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch index 5a143e36d..631d0020a 100644 --- a/patches/linux/6.18.56/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch +++ b/patches/linux/6.18.56/0062-arm64-dts-microchip-lan969x-add-SDMMC-nodes.patch @@ -1,7 +1,7 @@ From 7df6f654874cc48a7bea2d8d2d78fe8e9c1c90c7 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 62/86] arm64: dts: microchip: lan969x: add SDMMC nodes +Subject: [PATCH 62/92] arm64: dts: microchip: lan969x: add SDMMC nodes The SoC has two SDMMC controllers, neither of which is described, so boards with eMMC have no way to enable it. Add both, disabled by diff --git a/patches/linux/6.18.56/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch b/patches/linux/6.18.56/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch index 7e5db38be..136ffd8af 100644 --- a/patches/linux/6.18.56/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch +++ b/patches/linux/6.18.56/0063-arm64-dts-microchip-ev23x71a-enable-eMMC.patch @@ -1,7 +1,7 @@ From b41259b09f91a140bc0350d7f473d9fee3fbe8b3 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 19 Aug 2026 11:38:37 +0200 -Subject: [PATCH 63/86] arm64: dts: microchip: ev23x71a: enable eMMC +Subject: [PATCH 63/92] arm64: dts: microchip: ev23x71a: enable eMMC The board has an 8-bit eMMC on SDMMC0, and defines the emmc_sd pinctrl group for it, but nothing enables the controller. diff --git a/patches/linux/6.18.56/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch b/patches/linux/6.18.56/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch index bd1609210..e4c54a812 100644 --- a/patches/linux/6.18.56/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch +++ b/patches/linux/6.18.56/0064-wifi-brcmfmac-survey-the-requested-interface-not-the.patch @@ -1,7 +1,7 @@ From 54b38afac5c46299c8a7ebe594b35774d134389b Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:42:48 +0200 -Subject: [PATCH 64/86] wifi: brcmfmac: survey the requested interface, not the +Subject: [PATCH 64/92] wifi: brcmfmac: survey the requested interface, not the primary MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch b/patches/linux/6.18.56/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch index a4b45e637..5addd4a45 100644 --- a/patches/linux/6.18.56/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch +++ b/patches/linux/6.18.56/0065-wifi-brcmfmac-honor-caller-s-rtnl-lock-when-stopping.patch @@ -1,7 +1,7 @@ From b2c521013e15b485455469fa4a263de2cf04dd02 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:43:14 +0200 -Subject: [PATCH 65/86] wifi: brcmfmac: honor caller's rtnl lock when stopping +Subject: [PATCH 65/92] wifi: brcmfmac: honor caller's rtnl lock when stopping primary interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch b/patches/linux/6.18.56/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch index 30f45c859..21c3b487a 100644 --- a/patches/linux/6.18.56/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch +++ b/patches/linux/6.18.56/0066-wifi-brcmfmac-let-cfg_to_ndev-return-NULL-and-harden.patch @@ -1,7 +1,7 @@ From 0e082428a5013b6d35567cf122119af2772f909f Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 15:46:25 +0200 -Subject: [PATCH 66/86] wifi: brcmfmac: let cfg_to_ndev() return NULL and +Subject: [PATCH 66/92] wifi: brcmfmac: let cfg_to_ndev() return NULL and harden its callers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch b/patches/linux/6.18.56/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch index c31f3cb56..26bd08a20 100644 --- a/patches/linux/6.18.56/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch +++ b/patches/linux/6.18.56/0067-wifi-brcmfmac-support-deletion-and-recreation-of-the.patch @@ -1,7 +1,7 @@ From 102750f26d8cbf5d58936b4c9c6da801433c4314 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Tue, 30 Jun 2026 16:05:17 +0200 -Subject: [PATCH 67/86] wifi: brcmfmac: support deletion and recreation of the +Subject: [PATCH 67/92] wifi: brcmfmac: support deletion and recreation of the primary interface MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch b/patches/linux/6.18.56/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch index cf1ee0196..87c6e4e3c 100644 --- a/patches/linux/6.18.56/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch +++ b/patches/linux/6.18.56/0068-wifi-brcmfmac-report-port-authorized-after-offloaded.patch @@ -1,7 +1,7 @@ From b965ae0c551ae3e2df6937933b6bdd1c42753a43 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Thu, 10 Sep 2026 08:29:47 +0200 -Subject: [PATCH 68/86] wifi: brcmfmac: report port authorized after offloaded +Subject: [PATCH 68/92] wifi: brcmfmac: report port authorized after offloaded PSK/SAE handshake MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch b/patches/linux/6.18.56/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch index e1668444d..cec6d0f80 100644 --- a/patches/linux/6.18.56/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch +++ b/patches/linux/6.18.56/0069-dt-bindings-arm-AT91-document-Novarq-Tactical-1000.patch @@ -1,7 +1,7 @@ From f5f7599f8af9db56b09f26d22b20ee75defe1717 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Fri, 9 Jan 2026 13:27:00 +0100 -Subject: [PATCH 69/86] dt-bindings: arm: AT91: document Novarq Tactical 1000 +Subject: [PATCH 69/92] dt-bindings: arm: AT91: document Novarq Tactical 1000 Novarq Tactical 1000 is a Microchip LAN9696 based 24x1G + 4x10G SFP switch. diff --git a/patches/linux/6.18.56/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch b/patches/linux/6.18.56/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch index e6e34024e..611a43a04 100644 --- a/patches/linux/6.18.56/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch +++ b/patches/linux/6.18.56/0070-arm64-dts-microchip-add-Novarq-Tactical-1000.patch @@ -1,7 +1,7 @@ From 8b4b41c449758451c7dbcdd9092b9bd0e0a2b082 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Tue, 30 Sep 2025 13:37:49 +0200 -Subject: [PATCH 70/86] arm64: dts: microchip: add Novarq Tactical 1000 +Subject: [PATCH 70/92] arm64: dts: microchip: add Novarq Tactical 1000 Novarq Tactical 1000 is a LAN9696 based switch featuring 24x1G and 4x10G SFP ports. diff --git a/patches/linux/6.18.56/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch b/patches/linux/6.18.56/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch index bbef8699f..675772ed3 100644 --- a/patches/linux/6.18.56/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch +++ b/patches/linux/6.18.56/0071-arm64-dts-microchip-tactical-1000-add-port-names.patch @@ -1,7 +1,7 @@ From f973058544e1b44fd551db6a230659dbce67313e Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Tue, 30 Jun 2026 11:23:47 +0200 -Subject: [PATCH 71/86] arm64: dts: microchip: tactical-1000: add port names +Subject: [PATCH 71/92] arm64: dts: microchip: tactical-1000: add port names Now that driver supports parsing the "label" property, populate port names as they are physically wired up. diff --git a/patches/linux/6.18.56/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch b/patches/linux/6.18.56/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch index 5c5071bfd..879f882df 100644 --- a/patches/linux/6.18.56/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch +++ b/patches/linux/6.18.56/0072-arm64-dts-microchip-tactical-1000-adapt-to-6.18.patch @@ -1,7 +1,7 @@ From d49813a338d7c9b9d69e38e1fcc1c937c588a071 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sun, 20 Sep 2026 12:22:43 +0200 -Subject: [PATCH 72/86] arm64: dts: microchip: tactical-1000: adapt to 6.18 +Subject: [PATCH 72/92] arm64: dts: microchip: tactical-1000: adapt to 6.18 Novarq develop against 7.3, which has three things 6.18 does not: a QSPI controller node, a tmon that also provides the fan PWM, and hence a SoC diff --git a/patches/linux/6.18.56/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch b/patches/linux/6.18.56/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch index 66b1c907b..eeec77223 100644 --- a/patches/linux/6.18.56/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch +++ b/patches/linux/6.18.56/0073-dt-bindings-arm-AT91-document-EV23X71A-board.patch @@ -1,7 +1,7 @@ From b5afb74688659804bbed4bca3928c98975daf2c8 Mon Sep 17 00:00:00 2001 From: Robert Marko Date: Mon, 2 Mar 2026 12:20:13 +0100 -Subject: [PATCH 73/86] dt-bindings: arm: AT91: document EV23X71A board +Subject: [PATCH 73/92] dt-bindings: arm: AT91: document EV23X71A board Microchip EV23X71A board is an LAN9696 based evaluation board. diff --git a/patches/linux/6.18.56/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch b/patches/linux/6.18.56/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch index e696bec02..b3bf9179d 100644 --- a/patches/linux/6.18.56/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch +++ b/patches/linux/6.18.56/0074-net-dsa-Skip-DCB-default-priority-init-on-unsupporte.patch @@ -1,7 +1,7 @@ From 45fd43a305c595ea24b0de5cf090affeffc4029f Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:04:21 +0200 -Subject: [PATCH 74/86] net: dsa: Skip DCB default priority init on unsupported +Subject: [PATCH 74/92] net: dsa: Skip DCB default priority init on unsupported switches A driver serving several chip generations has one dsa_switch_ops for diff --git a/patches/linux/6.18.56/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch b/patches/linux/6.18.56/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch index 33b956935..b94c2d277 100644 --- a/patches/linux/6.18.56/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch +++ b/patches/linux/6.18.56/0075-net-dsa-Generalise-the-global-DCB-APP-mirroring-help.patch @@ -1,7 +1,7 @@ From cb31150945889f02373febe89f618afee36c6e62 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 22 Sep 2026 13:51:07 +0200 -Subject: [PATCH 75/86] net: dsa: Generalise the global DCB APP mirroring +Subject: [PATCH 75/92] net: dsa: Generalise the global DCB APP mirroring helper A switch with one classification table for all its ports programs it diff --git a/patches/linux/6.18.56/0076-net-dsa-Support-the-PCP-APP-selector.patch b/patches/linux/6.18.56/0076-net-dsa-Support-the-PCP-APP-selector.patch index 605823822..e3c5da87b 100644 --- a/patches/linux/6.18.56/0076-net-dsa-Support-the-PCP-APP-selector.patch +++ b/patches/linux/6.18.56/0076-net-dsa-Support-the-PCP-APP-selector.patch @@ -1,7 +1,7 @@ From e1a8005d2fc1813b71e65c79e700da5635e639e0 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:04:22 +0200 -Subject: [PATCH 76/86] net: dsa: Support the PCP APP selector +Subject: [PATCH 76/92] net: dsa: Support the PCP APP selector Add port_add_pcp_prio, port_del_pcp_prio and port_get_pcp_prio switch ops and route the DCB_APP_SEL_PCP selector to them, mirroring the DSCP diff --git a/patches/linux/6.18.56/0077-net-dsa-Support-DCB-priority-rewrite.patch b/patches/linux/6.18.56/0077-net-dsa-Support-DCB-priority-rewrite.patch index e3760a847..0ed2fbe69 100644 --- a/patches/linux/6.18.56/0077-net-dsa-Support-DCB-priority-rewrite.patch +++ b/patches/linux/6.18.56/0077-net-dsa-Support-DCB-priority-rewrite.patch @@ -1,7 +1,7 @@ From fb3ca7803ea876f7d96514696615143835bc78f9 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 9 Sep 2026 17:10:32 +0200 -Subject: [PATCH 77/86] net: dsa: Support DCB priority rewrite +Subject: [PATCH 77/92] net: dsa: Support DCB priority rewrite The DCB rewrite table maps a priority back to the PCP and DEI, or the DSCP, that frames are remarked with on egress. DSA has no diff --git a/patches/linux/6.18.56/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch b/patches/linux/6.18.56/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch index a6cd10f78..c77b2c07a 100644 --- a/patches/linux/6.18.56/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch +++ b/patches/linux/6.18.56/0078-net-dsa-Support-the-IEEE-ETS-managed-object.patch @@ -1,7 +1,7 @@ From 46e44f7a4aba62dc94958e01638e8e93ea62e59b Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Tue, 22 Sep 2026 13:53:23 +0200 -Subject: [PATCH 78/86] net: dsa: Support the IEEE ETS managed object +Subject: [PATCH 78/92] net: dsa: Support the IEEE ETS managed object A switch port's transmission selection is configured today through the ets queuing discipline, which numbers its bands the other way round diff --git a/patches/linux/6.18.56/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch b/patches/linux/6.18.56/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch index 1de8c4805..dc28f2a49 100644 --- a/patches/linux/6.18.56/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch +++ b/patches/linux/6.18.56/0079-net-sparx5-fix-sleep-in-atomic-context-in-MAC-table-.patch @@ -1,7 +1,7 @@ From 308c9dbab764bef06cceb03e412b491ea57234b5 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Wed, 7 Oct 2026 11:42:12 +0200 -Subject: [PATCH 79/86] net: sparx5: fix sleep in atomic context in MAC table +Subject: [PATCH 79/92] net: sparx5: fix sleep in atomic context in MAC table access Adding or removing a multicast address on an unbridged switch port diff --git a/patches/linux/6.18.56/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch b/patches/linux/6.18.56/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch index 91e66a5b8..d48aaa095 100644 --- a/patches/linux/6.18.56/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch +++ b/patches/linux/6.18.56/0080-misc-sparx5-symreg-symreg-debugfs-driver-DBB-1045.patch @@ -1,7 +1,7 @@ From c6f8b6a050e69c951ce0ce56467b6e9fd9a638f1 Mon Sep 17 00:00:00 2001 From: Steen Hegelund Date: Wed, 21 Jan 2026 10:09:45 +0100 -Subject: [PATCH 80/86] misc: sparx5-symreg; symreg debugfs driver (DBB-1045) +Subject: [PATCH 80/92] misc: sparx5-symreg; symreg debugfs driver (DBB-1045) Expose the switch register space of Microchip Sparx5 family SoCs through /sys/kernel/debug/symreg/mem, for the symreg tool, which diff --git a/patches/linux/6.18.56/0081-net-ethernet-mtk_wed-map-WO-memory-regions-without-r.patch b/patches/linux/6.18.56/0081-net-ethernet-mtk_wed-map-WO-memory-regions-without-r.patch index 4119c93b2..14f409c45 100644 --- a/patches/linux/6.18.56/0081-net-ethernet-mtk_wed-map-WO-memory-regions-without-r.patch +++ b/patches/linux/6.18.56/0081-net-ethernet-mtk_wed-map-WO-memory-regions-without-r.patch @@ -1,7 +1,7 @@ From e0e6e024e5e5866ff61b68bf9790fd24e542d7e2 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Mon, 5 Oct 2026 14:37:56 +0200 -Subject: [PATCH 81/86] net: ethernet: mtk_wed: map WO memory regions without +Subject: [PATCH 81/92] net: ethernet: mtk_wed: map WO memory regions without requesting them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0082-wifi-mt76-wed-fix-kernel-panic-on-non-DBDC-MT7986.patch b/patches/linux/6.18.56/0082-wifi-mt76-wed-fix-kernel-panic-on-non-DBDC-MT7986.patch index e9b8b07da..04c44b920 100644 --- a/patches/linux/6.18.56/0082-wifi-mt76-wed-fix-kernel-panic-on-non-DBDC-MT7986.patch +++ b/patches/linux/6.18.56/0082-wifi-mt76-wed-fix-kernel-panic-on-non-DBDC-MT7986.patch @@ -1,7 +1,7 @@ From 8c40b743cd6f8117c177291988ffe1980e9595cd Mon Sep 17 00:00:00 2001 From: Zhi-Jun You Date: Wed, 15 Jul 2026 23:21:12 +0800 -Subject: [PATCH 82/86] wifi: mt76: wed: fix kernel panic on non-DBDC MT7986 +Subject: [PATCH 82/92] wifi: mt76: wed: fix kernel panic on non-DBDC MT7986 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit diff --git a/patches/linux/6.18.56/0083-wifi-mt76-mt7915-set-up-WPDMA-RX-ring-0-for-WED-on-a.patch b/patches/linux/6.18.56/0083-wifi-mt76-mt7915-set-up-WPDMA-RX-ring-0-for-WED-on-a.patch index e91a7477f..8572c10fc 100644 --- a/patches/linux/6.18.56/0083-wifi-mt76-mt7915-set-up-WPDMA-RX-ring-0-for-WED-on-a.patch +++ b/patches/linux/6.18.56/0083-wifi-mt76-mt7915-set-up-WPDMA-RX-ring-0-for-WED-on-a.patch @@ -1,7 +1,7 @@ From 9b5a788cc9a12f1b23ad0e84dfaa78008a399b49 Mon Sep 17 00:00:00 2001 From: Mattias Walström Date: Wed, 7 Oct 2026 22:20:00 +0200 -Subject: [PATCH 83/86] wifi: mt76: mt7915: set up WPDMA RX ring 0 for WED on a +Subject: [PATCH 83/92] wifi: mt76: mt7915: set up WPDMA RX ring 0 for WED on a band1-only device MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 diff --git a/patches/linux/6.18.56/0084-wifi-mt76-mt7915-add-WDS-support-when-WED-is-enabled.patch b/patches/linux/6.18.56/0084-wifi-mt76-mt7915-add-WDS-support-when-WED-is-enabled.patch index e390eb26d..c03e93d04 100644 --- a/patches/linux/6.18.56/0084-wifi-mt76-mt7915-add-WDS-support-when-WED-is-enabled.patch +++ b/patches/linux/6.18.56/0084-wifi-mt76-mt7915-add-WDS-support-when-WED-is-enabled.patch @@ -1,7 +1,7 @@ From a39e22f32c005cb7096e66789000b2a9209444d0 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Mon, 20 Oct 2025 15:59:12 +0200 -Subject: [PATCH 84/86] wifi: mt76: mt7915: add WDS support when WED is enabled +Subject: [PATCH 84/92] wifi: mt76: mt7915: add WDS support when WED is enabled The current WED only supports 256 wcid, whereas mt7986 can support up to 512 entries, so firmware provides a rule to get sta_info by DA when wcid diff --git a/patches/linux/6.18.56/0085-net-ethernet-mtk_wed-increase-WED-v2-WDMA-RESV_BUFF-.patch b/patches/linux/6.18.56/0085-net-ethernet-mtk_wed-increase-WED-v2-WDMA-RESV_BUFF-.patch index cceaca7b9..797f605a9 100644 --- a/patches/linux/6.18.56/0085-net-ethernet-mtk_wed-increase-WED-v2-WDMA-RESV_BUFF-.patch +++ b/patches/linux/6.18.56/0085-net-ethernet-mtk_wed-increase-WED-v2-WDMA-RESV_BUFF-.patch @@ -1,7 +1,7 @@ From 3d86eb80be2c4367e3293e783d26b6b452840287 Mon Sep 17 00:00:00 2001 From: Shiji Yang Date: Wed, 19 Aug 2026 21:07:07 +0800 -Subject: [PATCH 85/86] net: ethernet: mtk_wed: increase WED v2 WDMA RESV_BUFF +Subject: [PATCH 85/92] net: ethernet: mtk_wed: increase WED v2 WDMA RESV_BUFF to 0x80 Change WDMA RESV_BUFF from 0x40 to 0x80 to avoid CDM TX FIFO overflow. diff --git a/patches/linux/6.18.56/0086-wifi-mt76-mt7915-publish-wcid-before-MCU-add-command.patch b/patches/linux/6.18.56/0086-wifi-mt76-mt7915-publish-wcid-before-MCU-add-command.patch index 6a67d8d83..3f87fa782 100644 --- a/patches/linux/6.18.56/0086-wifi-mt76-mt7915-publish-wcid-before-MCU-add-command.patch +++ b/patches/linux/6.18.56/0086-wifi-mt76-mt7915-publish-wcid-before-MCU-add-command.patch @@ -1,7 +1,7 @@ From 57ac316f70b79c0e2709e6221aca6b9026f8ce1c Mon Sep 17 00:00:00 2001 From: Ryan Leung Date: Fri, 21 Aug 2026 09:00:01 +0000 -Subject: [PATCH 86/86] wifi: mt76: mt7915: publish wcid before MCU add +Subject: [PATCH 86/92] wifi: mt76: mt7915: publish wcid before MCU add commands mt7915_add_interface() enables the BSS/STA in firmware via diff --git a/patches/linux/6.18.56/0087-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch b/patches/linux/6.18.56/0087-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch new file mode 100644 index 000000000..a31ce1091 --- /dev/null +++ b/patches/linux/6.18.56/0087-net-sparx5-fix-multicast-delivery-to-the-CPU-on-stan.patch @@ -0,0 +1,156 @@ +From f3602976d1b9b1b5a741c1116a5ed1066872212c Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Wed, 7 Oct 2026 17:30:17 +0200 +Subject: [PATCH 87/92] net: sparx5: fix multicast delivery to the CPU on + standalone ports + +A standalone port stops receiving a multicast group as soon as any +other standalone port leaves it. IPv6 neighbour discovery and mDNS +are the usual victims, so the port looks dead to the LAN until it is +taken down and up again, which re-joins its groups. + +Standalone ports all use pvid NULL_VID, and sparx5_mc_sync() delivers +a group to the CPU with a MAC table entry keyed on that address and +VID. The entry is therefore shared by every standalone port that is +a member of the group, but sparx5_mc_unsync() forgets it on behalf of +a single port, and the flood PGIDs have no CPU copy to fall back on. + +Reference count the shared entries. Learn on the first subscriber, +forget on the last. + +The same applies to a unicast address learned by sparx5_port_add_addr() +when two standalone ports share a MAC address, which is left as is. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 73 ++++++++++++++++++- + .../ethernet/microchip/sparx5/sparx5_main.h | 4 + + 2 files changed, 74 insertions(+), 3 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 30acb21277974..6f8d41a879b56 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -116,21 +116,79 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + return ret; + } + ++/* Standalone ports share pvid, hence the CPU multicast MAC entry too */ ++struct sparx5_mc_cpu_entry { ++ struct list_head list; ++ unsigned char addr[ETH_ALEN]; ++ u16 vid; ++ int refcnt; ++}; ++ ++static struct sparx5_mc_cpu_entry * ++sparx5_mc_cpu_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) ++{ ++ struct sparx5_mc_cpu_entry *e; ++ ++ list_for_each_entry(e, &sparx5->mc_cpu_entries, list) ++ if (e->vid == vid && ether_addr_equal(e->addr, addr)) ++ return e; ++ ++ return NULL; ++} ++ + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) + { + struct sparx5_port *port = netdev_priv(dev); + struct sparx5 *sparx5 = port->sparx5; ++ struct sparx5_mc_cpu_entry *e; ++ int ret = 0; ++ ++ spin_lock(&sparx5->mc_cpu_lock); ++ e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ if (e && --e->refcnt == 0) { ++ list_del(&e->list); ++ kfree(e); ++ ret = sparx5_mact_forget(sparx5, addr, port->pvid); ++ } ++ spin_unlock(&sparx5->mc_cpu_lock); + +- return sparx5_mact_forget(sparx5, addr, port->pvid); ++ return ret; + } + + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) + { + struct sparx5_port *port = netdev_priv(dev); + struct sparx5 *sparx5 = port->sparx5; ++ struct sparx5_mc_cpu_entry *e; ++ int ret = 0; ++ ++ spin_lock(&sparx5->mc_cpu_lock); ++ e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ if (!e) { ++ e = kmalloc(sizeof(*e), GFP_ATOMIC); ++ if (!e) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ ++ ret = sparx5_mact_learn(sparx5, ++ sparx5_get_pgid(sparx5, PGID_CPU), ++ addr, port->pvid); ++ if (ret) { ++ kfree(e); ++ goto out; ++ } ++ ++ ether_addr_copy(e->addr, addr); ++ e->vid = port->pvid; ++ e->refcnt = 0; ++ list_add_tail(&e->list, &sparx5->mc_cpu_entries); ++ } ++ e->refcnt++; ++out: ++ spin_unlock(&sparx5->mc_cpu_lock); + +- return sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr, port->pvid); ++ return ret; + } + + static int sparx5_mact_get(struct sparx5 *sparx5, +@@ -494,6 +552,8 @@ int sparx5_mact_init(struct sparx5 *sparx5) + char queue_name[32]; + + spin_lock_init(&sparx5->lock); ++ spin_lock_init(&sparx5->mc_cpu_lock); ++ INIT_LIST_HEAD(&sparx5->mc_cpu_entries); + + /* Flush MAC table */ + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | +@@ -529,7 +589,14 @@ int sparx5_mact_init(struct sparx5 *sparx5) + + void sparx5_mact_deinit(struct sparx5 *sparx5) + { ++ struct sparx5_mc_cpu_entry *e, *tmp; ++ + cancel_delayed_work_sync(&sparx5->mact_work); + destroy_workqueue(sparx5->mact_queue); + mutex_destroy(&sparx5->mact_lock); ++ ++ list_for_each_entry_safe(e, tmp, &sparx5->mc_cpu_entries, list) { ++ list_del(&e->list); ++ kfree(e); ++ } + } +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index 317c4ca0d29b2..c6fc9ee6be42b 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -408,6 +408,10 @@ struct sparx5 { + struct list_head mdb_entries; + /* mdb list mutex */ + struct mutex mdb_lock; ++ /* CPU multicast entries, shared by the standalone ports */ ++ struct list_head mc_cpu_entries; ++ /* mc_cpu_entries lock */ ++ spinlock_t mc_cpu_lock; + struct delayed_work mact_work; + struct workqueue_struct *mact_queue; + /* Board specifics */ diff --git a/patches/linux/6.18.56/0088-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch b/patches/linux/6.18.56/0088-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch new file mode 100644 index 000000000..ed38c8f1f --- /dev/null +++ b/patches/linux/6.18.56/0088-net-sparx5-fix-broadcast-to-the-CPU-on-bridge-ports-.patch @@ -0,0 +1,99 @@ +From 1dee287024abcffa206501a9c27d2b58c17c12d1 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:48:05 +0200 +Subject: [PATCH 88/92] net: sparx5: fix broadcast to the CPU on bridge ports + without a PVID + +Ports of a bridge created with vlan_default_pvid 0 never deliver +broadcast to the CPU. ARP requests from the ports go unanswered and +the bridge IP address is unreachable, while unicast and forwarding +between the ports work: + + ip link add br0 address $mac type bridge vlan_default_pvid 0 + ip link set eth0 master br0 + ip addr add 10.0.0.1/24 dev br0 + +The driver classifies bridged ports without a PVID to VID 1, to keep +them apart from the standalone ports on VID 0. Broadcast on a VID +only reaches the CPU through a MAC table entry pointing to PGID_BCAST, +which the driver learns when the bridge adds the VLAN and forgets when +the bridge removes it. A new bridge starts with VLAN 1, so the entry +for VID 1 is learned, and setting vlan_default_pvid 0 removes VLAN 1 +again, which forgets the entry the PVID-less ports depend on. + +Learn the VID 1 broadcast entry at probe, like the VID 0 entry for +standalone ports, and keep it when VLAN 1 is removed from the bridge. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../net/ethernet/microchip/sparx5/sparx5_mactable.c | 5 +++++ + drivers/net/ethernet/microchip/sparx5/sparx5_main.h | 1 + + .../net/ethernet/microchip/sparx5/sparx5_switchdev.c | 12 +++++++----- + 3 files changed, 13 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 6f8d41a879b56..58b9436b1dd48 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -570,6 +570,11 @@ int sparx5_mact_init(struct sparx5 *sparx5) + (unsigned char[]){0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + NULL_VID); + ++ /* Flood BC of bridged ports without a PVID, to the ports and CPU */ ++ sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_BCAST), ++ (unsigned char[]){0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, ++ UNAWARE_VID); ++ + mutex_init(&sparx5->mdb_lock); + INIT_LIST_HEAD(&sparx5->mdb_entries); + mutex_init(&sparx5->mact_lock); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index c6fc9ee6be42b..ce89fd005a558 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -103,6 +103,7 @@ enum sparx5_feature { + + #define IFH_LEN 9 /* 36 bytes */ + #define NULL_VID 0 ++#define UNAWARE_VID 1 /* Bridged ports without a PVID */ + #define SPX5_MACT_PULL_DELAY (2 * HZ) + #define SPX5_STATS_CHECK_DELAY (1 * HZ) + #define SPX5_PRIOS 8 /* Number of priority queues */ +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 391ce604e6611..1c81efd7fbbaa 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -155,8 +155,8 @@ static int sparx5_port_attr_set(struct net_device *dev, const void *ctx, + /* Used PVID 1 when default_pvid is 0, to avoid + * collision with non-bridged ports. + */ +- if (port->pvid == 0) +- port->pvid = 1; ++ if (port->pvid == NULL_VID) ++ port->pvid = UNAWARE_VID; + port->vlan_aware = attr->u.vlan_filtering; + sparx5_vlan_port_apply(port->sparx5, port); + break; +@@ -346,8 +346,8 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + /* Used PVID 1 when default_pvid is 0, to avoid + * collision with non-bridged ports. + */ +- if (fdb_info->vid == 0) +- vid = 1; ++ if (fdb_info->vid == NULL_VID) ++ vid = UNAWARE_VID; + else + vid = fdb_info->vid; + +@@ -679,7 +679,9 @@ static int sparx5_handle_port_vlan_del(struct net_device *dev, + container_of(nb, struct sparx5, + switchdev_blocking_nb); + +- sparx5_mact_forget(sparx5, dev->broadcast, vid); ++ /* Kept for the bridged ports without a PVID */ ++ if (vid != UNAWARE_VID) ++ sparx5_mact_forget(sparx5, dev->broadcast, vid); + return 0; + } + diff --git a/patches/linux/6.18.56/0089-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch b/patches/linux/6.18.56/0089-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch new file mode 100644 index 000000000..c34b43254 --- /dev/null +++ b/patches/linux/6.18.56/0089-net-sparx5-fix-MAC-table-entry-shared-by-bridge-VID-.patch @@ -0,0 +1,156 @@ +From ebe3a4f6446a13bd7d09f89105a4e5f70607c8ad Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:55:02 +0200 +Subject: [PATCH 89/92] net: sparx5: fix MAC table entry shared by bridge VID 0 + and VID 1 + +The MAC address of a bridge created with vlan_default_pvid 0 is +missing from the MAC table, so unicast to the bridge IP address is +flooded to the ports instead of reaching the CPU: + + ip link add br0 address $mac type bridge vlan_default_pvid 0 + +The bridge notifies its own address as a local FDB entry on VID 0 and +on every VLAN of the bridge, VLAN 1 included until vlan_default_pvid +0 removes it. The driver maps VID 0 to UNAWARE_VID, so both entries +are learned as the same MAC table entry, and the delete of the VLAN 1 +entry forgets it while the VID 0 entry is still in use. Removing +VLAN 1 from a bridge with the default PVID loses the entry the same +way. + +Track the bridge VIDs using a locked MAC table entry and forget it +only when the last one is deleted. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 35 +++++++++++++++++-- + .../microchip/sparx5/sparx5_switchdev.c | 15 ++------ + 2 files changed, 36 insertions(+), 14 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 58b9436b1dd48..2c0d957ff52f5 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -39,8 +39,25 @@ struct sparx5_mact_entry { + #define MAC_ENT_LOCK BIT(2) + u16 vid; + u16 port; ++ u8 refs; /* Bridge VIDs using a locked entry */ ++#define MAC_ENT_REF_VID BIT(0) /* The entry's own VID */ ++#define MAC_ENT_REF_UNAWARE BIT(1) /* Bridge VID 0, see UNAWARE_VID */ + }; + ++/* Bridge VID 0 is mapped to UNAWARE_VID, to keep clear of the standalone ++ * ports on NULL_VID, so it shares the MAC table entry with that VID. ++ */ ++static u16 sparx5_mact_bridge_vid(u16 vid, u8 *ref) ++{ ++ if (vid == NULL_VID) { ++ *ref = MAC_ENT_REF_UNAWARE; ++ return UNAWARE_VID; ++ } ++ ++ *ref = MAC_ENT_REF_VID; ++ return vid; ++} ++ + static int sparx5_mact_get_status(struct sparx5 *sparx5) + { + return spx5_rd(sparx5, LRN_COMMON_ACCESS_CTRL); +@@ -354,6 +371,13 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + struct sparx5_mact_entry *mact_entry; + int ret; + u32 cfg2; ++ u8 ref; ++ ++ vid = sparx5_mact_bridge_vid(vid, &ref); ++ ++ mact_entry = find_mact_entry(sparx5, addr, vid, portno); ++ if (mact_entry && mact_entry->flags & MAC_ENT_LOCK) ++ mact_entry->refs |= ref; + + ret = sparx5_mact_find(sparx5, addr, vid, &cfg2); + if (!ret) +@@ -365,7 +389,6 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + * mact thread to start the frame will reach CPU and the CPU will + * add the entry but without the extern_learn flag. + */ +- mact_entry = find_mact_entry(sparx5, addr, vid, portno); + if (mact_entry) + goto update_hw; + +@@ -386,6 +409,7 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + /* New entry? */ + if (mact_entry->flags == 0) { + mact_entry->flags |= MAC_ENT_LOCK; /* Don't age this */ ++ mact_entry->refs = ref; + sparx5_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, addr, vid, + dev, true); + } +@@ -398,6 +422,9 @@ int sparx5_del_mact_entry(struct sparx5 *sparx5, + u16 vid) + { + struct sparx5_mact_entry *mact_entry, *tmp; ++ u8 ref; ++ ++ vid = sparx5_mact_bridge_vid(vid, &ref); + + /* Delete the entry in SW MAC table not to get the notification when + * SW is pulling again +@@ -405,8 +432,12 @@ int sparx5_del_mact_entry(struct sparx5 *sparx5, + mutex_lock(&sparx5->mact_lock); + list_for_each_entry_safe(mact_entry, tmp, &sparx5->mact_entries, + list) { +- if ((vid == 0 || mact_entry->vid == vid) && ++ if (mact_entry->vid == vid && + ether_addr_equal(addr, mact_entry->mac)) { ++ mact_entry->refs &= ~ref; ++ if (mact_entry->refs) ++ continue; ++ + sparx5_mact_forget(sparx5, addr, mact_entry->vid); + + list_del(&mact_entry->list); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 1c81efd7fbbaa..973d3b0f26e74 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -329,7 +329,6 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + struct sparx5_port *port; + struct sparx5 *sparx5; + bool host_addr; +- u16 vid; + + rtnl_lock(); + if (!sparx5_netdevice_check(dev)) { +@@ -343,26 +342,18 @@ static void sparx5_switchdev_bridge_fdb_event_work(struct work_struct *work) + + fdb_info = &switchdev_work->fdb_info; + +- /* Used PVID 1 when default_pvid is 0, to avoid +- * collision with non-bridged ports. +- */ +- if (fdb_info->vid == NULL_VID) +- vid = UNAWARE_VID; +- else +- vid = fdb_info->vid; +- + switch (switchdev_work->event) { + case SWITCHDEV_FDB_ADD_TO_DEVICE: + if (host_addr) + sparx5_add_mact_entry(sparx5, dev, + sparx5_get_pgid(sparx5, PGID_CPU), +- fdb_info->addr, vid); ++ fdb_info->addr, fdb_info->vid); + else + sparx5_add_mact_entry(sparx5, port->ndev, port->portno, +- fdb_info->addr, vid); ++ fdb_info->addr, fdb_info->vid); + break; + case SWITCHDEV_FDB_DEL_TO_DEVICE: +- sparx5_del_mact_entry(sparx5, fdb_info->addr, vid); ++ sparx5_del_mact_entry(sparx5, fdb_info->addr, fdb_info->vid); + break; + } + diff --git a/patches/linux/6.18.56/0090-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch b/patches/linux/6.18.56/0090-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch new file mode 100644 index 000000000..21a2cf07b --- /dev/null +++ b/patches/linux/6.18.56/0090-net-sparx5-fix-loss-of-a-bridged-port-s-MAC-entry-on.patch @@ -0,0 +1,73 @@ +From e656985802b0e6da7659b00bf443d4369022c3d7 Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Thu, 8 Oct 2026 13:55:20 +0200 +Subject: [PATCH 90/92] net: sparx5: fix loss of a bridged port's MAC entry on + link down + +Taking a bridged port down forgets its MAC address on the bridge VID, +and changing the address forgets the old one the same way. When the +bridge uses the address of that port, as it does by default with its +first port, the bridge IP address is unreachable until the port comes +up again: + + ip link set eth0 down # bridge MAC entry gone + ip link set eth0 up # back again + +The driver learns the port address to the CPU on NETDEV_PRE_UP and +forgets it on NETDEV_DOWN and on address change, at the port's current +PVID. For a standalone port that is its own VID, but once bridged the +port shares the VID with the bridge, whose local FDB entries the driver +already tracks. The bridge keeps them when a port goes down and moves +them when its address changes, so the driver must not touch them. + +Leave the MAC table alone on up, down and address change of a bridged +port. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../net/ethernet/microchip/sparx5/sparx5_netdev.c | 15 +++++++++------ + .../ethernet/microchip/sparx5/sparx5_switchdev.c | 4 ++++ + 2 files changed, 13 insertions(+), 6 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +index ae84ab7378823..1d597c5a20574 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +@@ -193,12 +193,15 @@ static int sparx5_set_mac_address(struct net_device *dev, void *p) + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + +- /* Remove current */ +- sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); +- +- /* Add new */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr->sa_data, port->pvid); ++ /* The bridge keeps the entries of its ports */ ++ if (!test_bit(port->portno, sparx5->bridge_mask)) { ++ /* Remove current */ ++ sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); ++ ++ /* Add new */ ++ sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), ++ addr->sa_data, port->pvid); ++ } + + /* Record the address */ + eth_hw_addr_set(dev, addr->sa_data); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index 973d3b0f26e74..a9726944fafd3 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -276,6 +276,10 @@ static int sparx5_port_add_addr(struct net_device *dev, bool up) + struct sparx5 *sparx5 = port->sparx5; + u16 vid = port->pvid; + ++ /* The bridge keeps the entries of its ports */ ++ if (test_bit(port->portno, sparx5->bridge_mask)) ++ return 0; ++ + if (up) + sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), + port->ndev->dev_addr, vid); diff --git a/patches/linux/6.18.56/0091-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch b/patches/linux/6.18.56/0091-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch new file mode 100644 index 000000000..1d12948ca --- /dev/null +++ b/patches/linux/6.18.56/0091-net-sparx5-share-the-CPU-MAC-entry-of-standalone-por.patch @@ -0,0 +1,278 @@ +From 9c51c71b0e174f2c4c806d34aa9c7b9d8bb0b86f Mon Sep 17 00:00:00 2001 +From: Joachim Wiberg +Date: Fri, 9 Oct 2026 10:12:29 +0200 +Subject: [PATCH 91/92] net: sparx5: share the CPU MAC entry of standalone + ports with one address + +Taking one port of a LACP aggregate down stops unicast to the aggregate +on the remaining ports, and deleting the aggregate leaves the port whose +address the bond used unreachable until it is taken down and up again: + + ip link add lag0 type bond mode 802.3ad + ip link set e6 master lag0 # bond and both ports now use e6's MAC + ip link set e8 master lag0 + ip link set e6 down # unicast to the bond MAC stops on e8 + ip link del lag0 # e6 keeps its MAC, loses its CPU entry + +The bond sets the address of its first port on every port. A standalone +port learns its address to the CPU on NETDEV_PRE_UP and forgets it on +NETDEV_DOWN and on address change, and with ports sharing an address +the forget of one port removes the entry the others still use. The +multicast entries of standalone ports had the same problem, fixed in +commit "net: sparx5: fix multicast delivery to the CPU on standalone +ports" by sharing them through a reference-counted list. + +Keep the port addresses in that list as well. A standalone port holds +a reference on its address while up, drops it on down, on bridge join +and on address change, and takes it back on bridge leave; the entry is +forgotten with the last reference. + +Fixes: d6fce5141929 ("net: sparx5: add switching support") +Signed-off-by: Joachim Wiberg +--- + .../microchip/sparx5/sparx5_mactable.c | 70 +++++++++++-------- + .../ethernet/microchip/sparx5/sparx5_main.h | 12 ++-- + .../ethernet/microchip/sparx5/sparx5_netdev.c | 9 ++- + .../microchip/sparx5/sparx5_switchdev.c | 12 ++-- + 4 files changed, 60 insertions(+), 43 deletions(-) + +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +index 2c0d957ff52f5..cf222736eff97 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_mactable.c +@@ -133,54 +133,54 @@ int sparx5_mact_learn(struct sparx5 *sparx5, int pgid, + return ret; + } + +-/* Standalone ports share pvid, hence the CPU multicast MAC entry too */ +-struct sparx5_mc_cpu_entry { ++/* Standalone ports share pvid, hence their CPU MAC entries too */ ++struct sparx5_cpu_entry { + struct list_head list; + unsigned char addr[ETH_ALEN]; + u16 vid; + int refcnt; + }; + +-static struct sparx5_mc_cpu_entry * +-sparx5_mc_cpu_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) ++static struct sparx5_cpu_entry * ++sparx5_cpu_entry_find(struct sparx5 *sparx5, const unsigned char *addr, u16 vid) + { +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + +- list_for_each_entry(e, &sparx5->mc_cpu_entries, list) ++ list_for_each_entry(e, &sparx5->cpu_entries, list) + if (e->vid == vid && ether_addr_equal(e->addr, addr)) + return e; + + return NULL; + } + +-int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) ++/* Forget the CPU entry of addr on vid when its last user is gone */ ++int sparx5_cpu_entry_put(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid) + { +- struct sparx5_port *port = netdev_priv(dev); +- struct sparx5 *sparx5 = port->sparx5; +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + int ret = 0; + +- spin_lock(&sparx5->mc_cpu_lock); +- e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ spin_lock(&sparx5->cpu_lock); ++ e = sparx5_cpu_entry_find(sparx5, addr, vid); + if (e && --e->refcnt == 0) { + list_del(&e->list); + kfree(e); +- ret = sparx5_mact_forget(sparx5, addr, port->pvid); ++ ret = sparx5_mact_forget(sparx5, addr, vid); + } +- spin_unlock(&sparx5->mc_cpu_lock); ++ spin_unlock(&sparx5->cpu_lock); + + return ret; + } + +-int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) ++/* Learn addr on vid to the CPU for its first user */ ++int sparx5_cpu_entry_get(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid) + { +- struct sparx5_port *port = netdev_priv(dev); +- struct sparx5 *sparx5 = port->sparx5; +- struct sparx5_mc_cpu_entry *e; ++ struct sparx5_cpu_entry *e; + int ret = 0; + +- spin_lock(&sparx5->mc_cpu_lock); +- e = sparx5_mc_cpu_find(sparx5, addr, port->pvid); ++ spin_lock(&sparx5->cpu_lock); ++ e = sparx5_cpu_entry_find(sparx5, addr, vid); + if (!e) { + e = kmalloc(sizeof(*e), GFP_ATOMIC); + if (!e) { +@@ -190,24 +190,38 @@ int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) + + ret = sparx5_mact_learn(sparx5, + sparx5_get_pgid(sparx5, PGID_CPU), +- addr, port->pvid); ++ addr, vid); + if (ret) { + kfree(e); + goto out; + } + + ether_addr_copy(e->addr, addr); +- e->vid = port->pvid; ++ e->vid = vid; + e->refcnt = 0; +- list_add_tail(&e->list, &sparx5->mc_cpu_entries); ++ list_add_tail(&e->list, &sparx5->cpu_entries); + } + e->refcnt++; + out: +- spin_unlock(&sparx5->mc_cpu_lock); ++ spin_unlock(&sparx5->cpu_lock); + + return ret; + } + ++int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr) ++{ ++ struct sparx5_port *port = netdev_priv(dev); ++ ++ return sparx5_cpu_entry_put(port->sparx5, addr, port->pvid); ++} ++ ++int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr) ++{ ++ struct sparx5_port *port = netdev_priv(dev); ++ ++ return sparx5_cpu_entry_get(port->sparx5, addr, port->pvid); ++} ++ + static int sparx5_mact_get(struct sparx5 *sparx5, + unsigned char mac[ETH_ALEN], + u16 *vid, u32 *pcfg2) +@@ -583,8 +597,8 @@ int sparx5_mact_init(struct sparx5 *sparx5) + char queue_name[32]; + + spin_lock_init(&sparx5->lock); +- spin_lock_init(&sparx5->mc_cpu_lock); +- INIT_LIST_HEAD(&sparx5->mc_cpu_entries); ++ spin_lock_init(&sparx5->cpu_lock); ++ INIT_LIST_HEAD(&sparx5->cpu_entries); + + /* Flush MAC table */ + spx5_wr(LRN_COMMON_ACCESS_CTRL_CPU_ACCESS_CMD_SET(MAC_CMD_CLEAR_ALL) | +@@ -625,13 +639,13 @@ int sparx5_mact_init(struct sparx5 *sparx5) + + void sparx5_mact_deinit(struct sparx5 *sparx5) + { +- struct sparx5_mc_cpu_entry *e, *tmp; ++ struct sparx5_cpu_entry *e, *tmp; + + cancel_delayed_work_sync(&sparx5->mact_work); + destroy_workqueue(sparx5->mact_queue); + mutex_destroy(&sparx5->mact_lock); + +- list_for_each_entry_safe(e, tmp, &sparx5->mc_cpu_entries, list) { ++ list_for_each_entry_safe(e, tmp, &sparx5->cpu_entries, list) { + list_del(&e->list); + kfree(e); + } +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +index ce89fd005a558..9d2a96eccfb28 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_main.h ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_main.h +@@ -409,10 +409,10 @@ struct sparx5 { + struct list_head mdb_entries; + /* mdb list mutex */ + struct mutex mdb_lock; +- /* CPU multicast entries, shared by the standalone ports */ +- struct list_head mc_cpu_entries; +- /* mc_cpu_entries lock */ +- spinlock_t mc_cpu_lock; ++ /* CPU entries, shared by the standalone ports */ ++ struct list_head cpu_entries; ++ /* cpu_entries lock */ ++ spinlock_t cpu_lock; + struct delayed_work mact_work; + struct workqueue_struct *mact_queue; + /* Board specifics */ +@@ -491,6 +491,10 @@ int sparx5_add_mact_entry(struct sparx5 *sparx5, + int sparx5_del_mact_entry(struct sparx5 *sparx5, + const unsigned char *addr, + u16 vid); ++int sparx5_cpu_entry_get(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid); ++int sparx5_cpu_entry_put(struct sparx5 *sparx5, const unsigned char *addr, ++ u16 vid); + int sparx5_mc_sync(struct net_device *dev, const unsigned char *addr); + int sparx5_mc_unsync(struct net_device *dev, const unsigned char *addr); + void sparx5_set_ageing(struct sparx5 *sparx5, int msecs); +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +index 1d597c5a20574..963957bef6b02 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_netdev.c +@@ -193,14 +193,13 @@ static int sparx5_set_mac_address(struct net_device *dev, void *p) + if (!is_valid_ether_addr(addr->sa_data)) + return -EADDRNOTAVAIL; + +- /* The bridge keeps the entries of its ports */ +- if (!test_bit(port->portno, sparx5->bridge_mask)) { ++ /* The bridge keeps the entries of its ports, a port that is down has none */ ++ if (!test_bit(port->portno, sparx5->bridge_mask) && netif_running(dev)) { + /* Remove current */ +- sparx5_mact_forget(sparx5, dev->dev_addr, port->pvid); ++ sparx5_cpu_entry_put(sparx5, dev->dev_addr, port->pvid); + + /* Add new */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- addr->sa_data, port->pvid); ++ sparx5_cpu_entry_get(sparx5, addr->sa_data, port->pvid); + } + + /* Record the address */ +diff --git a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +index a9726944fafd3..15cbc5ba28428 100644 +--- a/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c ++++ b/drivers/net/ethernet/microchip/sparx5/sparx5_switchdev.c +@@ -199,7 +199,8 @@ static int sparx5_port_bridge_join(struct sparx5_port *port, + goto err_switchdev_offload; + + /* Remove standalone port entry */ +- sparx5_mact_forget(sparx5, ndev->dev_addr, 0); ++ if (netif_running(ndev)) ++ sparx5_cpu_entry_put(sparx5, ndev->dev_addr, NULL_VID); + + /* Port enters in bridge mode therefore don't need to copy to CPU + * frames for multicast in case the bridge is not requesting them +@@ -236,8 +237,8 @@ static void sparx5_port_bridge_leave(struct sparx5_port *port, + port->vid = NULL_VID; + + /* Forward frames to CPU */ +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- port->ndev->dev_addr, 0); ++ if (netif_running(port->ndev)) ++ sparx5_cpu_entry_get(sparx5, port->ndev->dev_addr, NULL_VID); + + /* Port enters in host more therefore restore mc list */ + __dev_mc_sync(port->ndev, sparx5_mc_sync, sparx5_mc_unsync); +@@ -281,10 +282,9 @@ static int sparx5_port_add_addr(struct net_device *dev, bool up) + return 0; + + if (up) +- sparx5_mact_learn(sparx5, sparx5_get_pgid(sparx5, PGID_CPU), +- port->ndev->dev_addr, vid); ++ sparx5_cpu_entry_get(sparx5, port->ndev->dev_addr, vid); + else +- sparx5_mact_forget(sparx5, port->ndev->dev_addr, vid); ++ sparx5_cpu_entry_put(sparx5, port->ndev->dev_addr, vid); + + return 0; + } diff --git a/patches/linux/6.18.56/0092-net-phy-micrel-Add-support-for-non-PTP-SKUs-for-lan8.patch b/patches/linux/6.18.56/0092-net-phy-micrel-Add-support-for-non-PTP-SKUs-for-lan8.patch new file mode 100644 index 000000000..3b286d12b --- /dev/null +++ b/patches/linux/6.18.56/0092-net-phy-micrel-Add-support-for-non-PTP-SKUs-for-lan8.patch @@ -0,0 +1,121 @@ +From f40bce1fdae5974d73508ec73b97771e2111bcbe Mon Sep 17 00:00:00 2001 +From: Horatiu Vultur +Date: Tue, 21 Oct 2025 09:07:26 +0200 +Subject: [PATCH 92/92] net: phy: micrel: Add support for non PTP SKUs for + lan8814 + +The lan8814 has 4 different SKUs and for 2 of these SKUs the PTP is +disabled. All these SKUs have the same value in the register 2 and 3. +Meaning that we can't differentiate them based on device id, therefore +check the SKU register and based on this allow or not to create a PTP +device. + +Signed-off-by: Horatiu Vultur +Reviewed-by: Andrew Lunn +Link: https://patch.msgid.link/20251021070726.3690685-1-horatiu.vultur@microchip.com +Signed-off-by: Paolo Abeni + +(cherry picked from commit 61b7ade9ba8c3b16867e25411b5f7cf1abe35879) +Signed-off-by: Joachim Wiberg +--- + drivers/net/phy/micrel.c | 38 ++++++++++++++++++++++++++++++++++++++ + 1 file changed, 38 insertions(+) + +diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c +index d79004dcb768b..2007c9d03fb86 100644 +--- a/drivers/net/phy/micrel.c ++++ b/drivers/net/phy/micrel.c +@@ -101,6 +101,8 @@ + #define LAN8814_CABLE_DIAG_VCT_DATA_MASK GENMASK(7, 0) + #define LAN8814_PAIR_BIT_SHIFT 12 + ++#define LAN8814_SKUS 0xB ++ + #define LAN8814_WIRE_PAIR_MASK 0xF + + /* Lan8814 general Interrupt control/status reg in GPHY specific block. */ +@@ -367,6 +369,9 @@ + + #define LAN8842_REV_8832 0x8832 + ++#define LAN8814_REV_LAN8814 0x8814 ++#define LAN8814_REV_LAN8818 0x8818 ++ + struct kszphy_hw_stat { + const char *string; + u8 reg; +@@ -449,6 +454,7 @@ struct kszphy_priv { + bool rmii_ref_clk_sel; + bool rmii_ref_clk_sel_val; + bool clk_enable; ++ bool is_ptp_available; + u64 stats[ARRAY_SIZE(kszphy_hw_stats)]; + struct kszphy_phy_stats phy_stats; + }; +@@ -4159,6 +4165,17 @@ static int lan8804_config_intr(struct phy_device *phydev) + return 0; + } + ++/* Check if the PHY has 1588 support. There are multiple skus of the PHY and ++ * some of them support PTP while others don't support it. This function will ++ * return true is the sku supports it, otherwise will return false. ++ */ ++static bool lan8814_has_ptp(struct phy_device *phydev) ++{ ++ struct kszphy_priv *priv = phydev->priv; ++ ++ return priv->is_ptp_available; ++} ++ + static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) + { + int ret = IRQ_NONE; +@@ -4175,6 +4192,9 @@ static irqreturn_t lan8814_handle_interrupt(struct phy_device *phydev) + ret = IRQ_HANDLED; + } + ++ if (!lan8814_has_ptp(phydev)) ++ return ret; ++ + while (true) { + irq_status = lanphy_read_page_reg(phydev, LAN8814_PAGE_PORT_REGS, + PTP_TSU_INT_STS); +@@ -4236,6 +4256,9 @@ static void lan8814_ptp_init(struct phy_device *phydev) + !IS_ENABLED(CONFIG_NETWORK_PHY_TIMESTAMPING)) + return; + ++ if (!lan8814_has_ptp(phydev)) ++ return; ++ + lanphy_write_page_reg(phydev, LAN8814_PAGE_PORT_REGS, + TSU_HARD_RESET, TSU_HARD_RESET_); + +@@ -4365,6 +4388,9 @@ static int __lan8814_ptp_probe_once(struct phy_device *phydev, char *pin_name, + + static int lan8814_ptp_probe_once(struct phy_device *phydev) + { ++ if (!lan8814_has_ptp(phydev)) ++ return 0; ++ + return __lan8814_ptp_probe_once(phydev, "lan8814_ptp_pin", + LAN8814_PTP_GPIO_NUM); + } +@@ -4480,6 +4506,18 @@ static int lan8814_probe(struct phy_device *phydev) + devm_phy_package_join(&phydev->mdio.dev, phydev, + addr, sizeof(struct lan8814_shared_priv)); + ++ /* There are lan8814 SKUs that don't support PTP. Make sure that for ++ * those skus no PTP device is created. Here we check if the SKU ++ * supports PTP. ++ */ ++ err = lanphy_read_page_reg(phydev, LAN8814_PAGE_COMMON_REGS, ++ LAN8814_SKUS); ++ if (err < 0) ++ return err; ++ ++ priv->is_ptp_available = err == LAN8814_REV_LAN8814 || ++ err == LAN8814_REV_LAN8818; ++ + if (phy_package_probe_once(phydev)) { + err = lan8814_release_coma_mode(phydev); + if (err) diff --git a/src/confd/src/interfaces.c b/src/confd/src/interfaces.c index f84ec4edf..2062e97a3 100644 --- a/src/confd/src/interfaces.c +++ b/src/confd/src/interfaces.c @@ -520,18 +520,32 @@ static bool netdag_must_del(struct lyd_node *dif, struct lyd_node *cif) static int eth_gen_del(struct lyd_node *dif, FILE *ip) { const char *ifname = lydx_get_cattr(dif, "name"); - char mac[18]; + char mac[18] = ""; FILE *pp; fprintf(ip, "link set dev %s down", ifname); pp = cni_popen("ip -d -j link show dev %s | jq -rM .[].permaddr", ifname); if (pp) { - if (fgets(mac, sizeof(mac), pp) && !strstr(mac, "null")) - fprintf(ip, " address %s", mac); + if (!fgets(mac, sizeof(mac), pp) || strstr(mac, "null")) + mac[0] = 0; pclose(pp); } + /* No permanent address, the port got a chassis-derived one at boot */ + if (!mac[0]) { + pp = cni_popen("/usr/libexec/infix/macaddr %s", ifname); + if (pp) { + if (!fgets(mac, sizeof(mac), pp)) + mac[0] = 0; + pclose(pp); + } + } + + mac[strcspn(mac, "\n")] = 0; + if (mac[0]) + fprintf(ip, " address %s", mac); + fputc('\n', ip); fprintf(ip, "addr flush dev %s\n", ifname); diff --git a/src/confd/src/ptp.c b/src/confd/src/ptp.c index e35e2cc85..1e03659ac 100644 --- a/src/confd/src/ptp.c +++ b/src/confd/src/ptp.c @@ -37,10 +37,9 @@ static const char *instance_type_to_clock_type(const char *type) * * ieee802-dot1as sets the full gPTP option set as required by the standard: * transportSpecific, network_transport, delay_mechanism, multicast MACs, - * gmCapable, follow_up_info, assume_two_step, path_trace_enabled, - * and the tighter neighborPropDelayThresh. + * gmCapable, follow_up_info, assume_two_step, path_trace_enabled. */ -static bool emit_profile_globals(FILE *fp, const char *profile, bool hw_ts) +static bool emit_profile_globals(FILE *fp, const char *profile) { bool dot1as = profile && !strcmp(profile, "ieee802-dot1as"); @@ -54,22 +53,35 @@ static bool emit_profile_globals(FILE *fp, const char *profile, bool hw_ts) fprintf(fp, "follow_up_info 1\n"); fprintf(fp, "assume_two_step 1\n"); fprintf(fp, "path_trace_enabled 1\n"); - /* - * 802.1AS P2P gate: if meanLinkDelay exceeds this threshold the - * port stays asCapable=false and never leaves LISTENING. 800 ns - * is the 802.1AS default and is appropriate only for hardware - * timestamping — software timestamps (QEMU, tap interfaces) can - * easily produce peer delays in the microsecond range, which - * would keep both ports stuck in LISTENING indefinitely. - */ - if (hw_ts) - fprintf(fp, "neighborPropDelayThresh 800\n"); } else { fprintf(fp, "transportSpecific 0\n"); } return dot1as; } +/* + * 802.1AS gate: a port whose measured link delay exceeds the threshold + * never becomes asCapable and stays in LISTENING. A switch core time + * stamps behind the PHY, so the delay it sees includes the PHY latency, + * 1.5 us on a LAN8814 at 1 Gbit/s and more at 100 Mbit/s, which the + * 800 ns of the automotive profile leaves no room for. Software time + * stamps are slower still, they get ptp4l's own default of 20 ms. + */ +#define PTP_LINK_DELAY_THRESH_NS 10000 + +static void emit_link_delay_thresh(FILE *fp, struct lyd_node *port_ds, bool hw_ts) +{ + const char *v = lydx_get_cattr(port_ds, "mean-link-delay-thresh"); + long long ns = PTP_LINK_DELAY_THRESH_NS; + + if (v) + ns = (strtoll(v, NULL, 10) + 32768) / 65536; /* ns * 2^16 */ + else if (!hw_ts) + return; + + fprintf(fp, "neighborPropDelayThresh %lld\n", ns); +} + /* * Return true if ifname has hardware TX timestamping capability according * to the probed data in system.json (confd->root). If the interface is @@ -181,8 +193,12 @@ static int write_instance_conf(struct lyd_node *inst, json_t *root) ts = instance_time_stamping(idx, inst, root); fprintf(fp, "time_stamping %s\n", ts); + /* PHY timestamps arrive over MDIO, later than ptp4l's 10 ms default */ + if (!strcmp(ts, "hardware")) + fprintf(fp, "tx_timestamp_timeout 100\n"); + /* Profile — sets transportSpecific and all protocol-mandatory options */ - dot1as = emit_profile_globals(fp, profile, !strcmp(ts, "hardware")); + dot1as = emit_profile_globals(fp, profile); /* domainNumber */ v = lydx_get_cattr(default_ds, "domain-number"); @@ -303,6 +319,9 @@ static int write_instance_conf(struct lyd_node *inst, json_t *root) if (v && strcmp(v, "0")) fprintf(fp, "delayAsymmetry %s\n", v); + if (dot1as) + emit_link_delay_thresh(fp, port_ds, !strcmp(ts, "hardware")); + if (lydx_is_enabled(port_ds, "time-transmitter-only")) fprintf(fp, "masterOnly 1\n"); diff --git a/utils/kernel-refresh.sh b/utils/kernel-refresh.sh index c7b2a269b..d3a7d9fa1 100755 --- a/utils/kernel-refresh.sh +++ b/utils/kernel-refresh.sh @@ -7,12 +7,14 @@ usage() Synchronize patches/linux/\$TAG with changes from a kernel GIT tree. Usage: - $0 -k kernel-dir -o old-version [-t kernel-tag] [-p patch-dir] [-d defconfig-dir] + $0 -k kernel-dir [-o old-version] [-t kernel-tag] [-p patch-dir] [-d defconfig-dir] Options: -h This help text -k kernel-dir Path to kernel tree - -o old-version Version to be replaced by new kernel version + -o old-version Version to be replaced by new kernel version. Only + when upgrading: removes patches/linux/\$old-version, + bumps the defconfigs and refreshes linux.hash -t kernel-tag Base tag from which to generate patches. Default: "v" + \$BR2_LINUX_KERNEL_VERSION -p patch-dir Path to kernel patches directory @@ -91,6 +93,12 @@ DEFCONFIG_DIR=$(readlink -f $DEFCONFIG_DIR) git ls-files --error-unmatch $PATCH_DIR 1>/dev/null 2>&1 && git -C $PATCH_DIR rm -f *.patch git -C $KERNEL_DIR format-patch --no-signoff --no-encode-email-headers --no-cover-letter --no-signature -o $PATCH_DIR $KERNEL_TAG..HEAD git -C $PATCH_DIR add *.patch + +# Same version: patches refreshed, nothing more to do +if [ -z "$OLD_VER" ] || [ "$OLD_VER" = "$NEW_VER" ]; then + exit 0 +fi + if [ -d ${PATCHES_BASE}/${OLD_VER} ]; then git rm -rf ${PATCHES_BASE}/${OLD_VER} fi