+++ /dev/null
-From 9d692039052888f578de162360a1196fa4cec411 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 22 May 2023 12:50:36 +0200
-Subject: scsi: Add HAS_IOPORT dependencies
-
-From: Niklas Schnelle <schnelle@linux.ibm.com>
-
-[ Upstream commit b58b2ba351b07f546a8c1fb4eb46303231c24e95 ]
-
-In a future patch HAS_IOPORT=n will result in inb()/outb() and friends not
-being declared. We thus need to add HAS_IOPORT as dependency for those
-drivers using them.
-
-Co-developed-by: Arnd Bergmann <arnd@kernel.org>
-Signed-off-by: Arnd Bergmann <arnd@kernel.org>
-Signed-off-by: Niklas Schnelle <schnelle@linux.ibm.com>
-Link: https://lore.kernel.org/r/20230522105049.1467313-32-schnelle@linux.ibm.com
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Stable-dep-of: c7233b3d99db ("scsi: advansys: Drop ISA_DMA_API remnants")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 25 +++++++++++++------------
- drivers/scsi/aic7xxx/Kconfig.aic79xx | 2 +-
- drivers/scsi/aic7xxx/Kconfig.aic7xxx | 2 +-
- drivers/scsi/aic94xx/Kconfig | 2 +-
- drivers/scsi/megaraid/Kconfig.megaraid | 6 +++---
- drivers/scsi/mvsas/Kconfig | 2 +-
- drivers/scsi/pcmcia/Kconfig | 6 +++++-
- drivers/scsi/qla2xxx/Kconfig | 2 +-
- 8 files changed, 26 insertions(+), 21 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 743a72b7421eba..00354c005aeb6b 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -333,7 +333,7 @@ config SGIWD93_SCSI
-
- config BLK_DEV_3W_XXXX_RAID
- tristate "3ware 5/6/7/8xxx ATA-RAID support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- 3ware is the only hardware ATA-Raid product in Linux to date.
- This card is 2,4, or 8 channel master mode support only.
-@@ -380,7 +380,7 @@ config SCSI_3W_SAS
-
- config SCSI_ACARD
- tristate "ACARD SCSI support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- This driver supports the ACARD SCSI host adapter.
- Support Chip <ATP870 ATP876 ATP880 ATP885>
-@@ -472,7 +472,7 @@ config SCSI_DPT_I2O
- config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
-- depends on ISA || EISA || PCI
-+ depends on (ISA || EISA || PCI) && HAS_IOPORT
- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
-@@ -514,7 +514,7 @@ config SCSI_HPTIOP
-
- config SCSI_BUSLOGIC
- tristate "BusLogic SCSI support"
-- depends on PCI && SCSI
-+ depends on SCSI && PCI && HAS_IOPORT
- help
- This is support for BusLogic MultiMaster and FlashPoint SCSI Host
- Adapters. Consult the SCSI-HOWTO, available from
-@@ -529,7 +529,7 @@ config SCSI_BUSLOGIC
-
- config SCSI_FLASHPOINT
- bool "FlashPoint support"
-- depends on SCSI_BUSLOGIC && PCI
-+ depends on SCSI_BUSLOGIC && PCI && HAS_IOPORT
- help
- This option allows you to add FlashPoint support to the
- BusLogic SCSI driver. The FlashPoint SCCB Manager code is
-@@ -643,7 +643,7 @@ config SCSI_SNIC_DEBUG_FS
-
- config SCSI_DMX3191D
- tristate "DMX3191D SCSI support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- select SCSI_SPI_ATTRS
- help
- This is support for Domex DMX3191D SCSI Host Adapters.
-@@ -657,7 +657,7 @@ config SCSI_FDOMAIN
-
- config SCSI_FDOMAIN_PCI
- tristate "Future Domain TMC-3260/AHA-2920A PCI SCSI support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- select SCSI_FDOMAIN
- help
- This is support for Future Domain's PCI SCSI host adapters (TMC-3260)
-@@ -710,7 +710,7 @@ config SCSI_GENERIC_NCR5380
-
- config SCSI_IPS
- tristate "IBM ServeRAID support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- This is support for the IBM ServeRAID hardware RAID controllers.
- See <http://www.developer.ibm.com/welcome/netfinity/serveraid.html>
-@@ -770,7 +770,7 @@ config SCSI_IBMVFC_TRACE
-
- config SCSI_INITIO
- tristate "Initio 9100U(W) support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- This is support for the Initio 91XXU(W) SCSI host adapter. Please
- read the SCSI-HOWTO, available from
-@@ -781,7 +781,7 @@ config SCSI_INITIO
-
- config SCSI_INIA100
- tristate "Initio INI-A100U2W support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- This is support for the Initio INI-A100U2W SCSI host adapter.
- Please read the SCSI-HOWTO, available from
-@@ -793,6 +793,7 @@ config SCSI_INIA100
- config SCSI_PPA
- tristate "IOMEGA parallel port (ppa - older drives)"
- depends on SCSI && PARPORT_PC
-+ depends on HAS_IOPORT
- help
- This driver supports older versions of IOMEGA's parallel port ZIP
- drive (a 100 MB removable media device).
-@@ -1187,7 +1188,7 @@ config SCSI_SIM710
-
- config SCSI_DC395x
- tristate "Tekram DC395(U/UW/F) and DC315(U) SCSI support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- select SCSI_SPI_ATTRS
- help
- This driver supports PCI SCSI host adapters based on the ASIC
-@@ -1219,7 +1220,7 @@ config SCSI_AM53C974
-
- config SCSI_NSP32
- tristate "Workbit NinjaSCSI-32Bi/UDE support"
-- depends on PCI && SCSI && !64BIT
-+ depends on PCI && SCSI && !64BIT && HAS_IOPORT
- help
- This is support for the Workbit NinjaSCSI-32Bi/UDE PCI/Cardbus
- SCSI host adapter. Please read the SCSI-HOWTO, available from
-diff --git a/drivers/scsi/aic7xxx/Kconfig.aic79xx b/drivers/scsi/aic7xxx/Kconfig.aic79xx
-index a47dbd500e9a5a..4bc53eec4c83f7 100644
---- a/drivers/scsi/aic7xxx/Kconfig.aic79xx
-+++ b/drivers/scsi/aic7xxx/Kconfig.aic79xx
-@@ -5,7 +5,7 @@
- #
- config SCSI_AIC79XX
- tristate "Adaptec AIC79xx U320 support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- select SCSI_SPI_ATTRS
- help
- This driver supports all of Adaptec's Ultra 320 PCI-X
-diff --git a/drivers/scsi/aic7xxx/Kconfig.aic7xxx b/drivers/scsi/aic7xxx/Kconfig.aic7xxx
-index 0cfd92ce750af5..f0425145a5f4d8 100644
---- a/drivers/scsi/aic7xxx/Kconfig.aic7xxx
-+++ b/drivers/scsi/aic7xxx/Kconfig.aic7xxx
-@@ -5,7 +5,7 @@
- #
- config SCSI_AIC7XXX
- tristate "Adaptec AIC7xxx Fast -> U160 support"
-- depends on (PCI || EISA) && SCSI
-+ depends on (PCI || EISA) && HAS_IOPORT && SCSI
- select SCSI_SPI_ATTRS
- help
- This driver supports all of Adaptec's Fast through Ultra 160 PCI
-diff --git a/drivers/scsi/aic94xx/Kconfig b/drivers/scsi/aic94xx/Kconfig
-index 71931c371b1cff..aaa8dadc6e1cd0 100644
---- a/drivers/scsi/aic94xx/Kconfig
-+++ b/drivers/scsi/aic94xx/Kconfig
-@@ -8,7 +8,7 @@
-
- config SCSI_AIC94XX
- tristate "Adaptec AIC94xx SAS/SATA support"
-- depends on PCI
-+ depends on PCI && HAS_IOPORT
- select SCSI_SAS_LIBSAS
- select FW_LOADER
- help
-diff --git a/drivers/scsi/megaraid/Kconfig.megaraid b/drivers/scsi/megaraid/Kconfig.megaraid
-index 2adc2afd9f91c9..3f2ce1eb081c4e 100644
---- a/drivers/scsi/megaraid/Kconfig.megaraid
-+++ b/drivers/scsi/megaraid/Kconfig.megaraid
-@@ -1,13 +1,13 @@
- # SPDX-License-Identifier: GPL-2.0-only
- config MEGARAID_NEWGEN
- bool "LSI Logic New Generation RAID Device Drivers"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- LSI Logic RAID Device Drivers
-
- config MEGARAID_MM
- tristate "LSI Logic Management Module (New Driver)"
-- depends on PCI && SCSI && MEGARAID_NEWGEN
-+ depends on PCI && HAS_IOPORT && SCSI && MEGARAID_NEWGEN
- help
- Management Module provides ioctl, sysfs support for LSI Logic
- RAID controllers.
-@@ -67,7 +67,7 @@ config MEGARAID_MAILBOX
-
- config MEGARAID_LEGACY
- tristate "LSI Logic Legacy MegaRAID Driver"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- help
- This driver supports the LSI MegaRAID 418, 428, 438, 466, 762, 490
- and 467 SCSI host adapters. This driver also support the all U320
-diff --git a/drivers/scsi/mvsas/Kconfig b/drivers/scsi/mvsas/Kconfig
-index 79812b80743b9a..5ac7fd593b17e5 100644
---- a/drivers/scsi/mvsas/Kconfig
-+++ b/drivers/scsi/mvsas/Kconfig
-@@ -9,7 +9,7 @@
-
- config SCSI_MVSAS
- tristate "Marvell 88SE64XX/88SE94XX SAS/SATA support"
-- depends on PCI
-+ depends on PCI && HAS_IOPORT
- select SCSI_SAS_LIBSAS
- select FW_LOADER
- help
-diff --git a/drivers/scsi/pcmcia/Kconfig b/drivers/scsi/pcmcia/Kconfig
-index 9696b6b5591f26..449bd85db7bb40 100644
---- a/drivers/scsi/pcmcia/Kconfig
-+++ b/drivers/scsi/pcmcia/Kconfig
-@@ -12,6 +12,7 @@ if SCSI_LOWLEVEL_PCMCIA && SCSI && PCMCIA && m
-
- config PCMCIA_AHA152X
- tristate "Adaptec AHA152X PCMCIA support"
-+ depends on HAS_IOPORT
- select SCSI_SPI_ATTRS
- help
- Say Y here if you intend to attach this type of PCMCIA SCSI host
-@@ -22,6 +23,7 @@ config PCMCIA_AHA152X
-
- config PCMCIA_FDOMAIN
- tristate "Future Domain PCMCIA support"
-+ depends on HAS_IOPORT
- select SCSI_FDOMAIN
- help
- Say Y here if you intend to attach this type of PCMCIA SCSI host
-@@ -32,7 +34,7 @@ config PCMCIA_FDOMAIN
-
- config PCMCIA_NINJA_SCSI
- tristate "NinjaSCSI-3 / NinjaSCSI-32Bi (16bit) PCMCIA support"
-- depends on !64BIT || COMPILE_TEST
-+ depends on (!64BIT || COMPILE_TEST) && HAS_IOPORT
- help
- If you intend to attach this type of PCMCIA SCSI host adapter to
- your computer, say Y here and read
-@@ -66,6 +68,7 @@ config PCMCIA_NINJA_SCSI
-
- config PCMCIA_QLOGIC
- tristate "Qlogic PCMCIA support"
-+ depends on HAS_IOPORT
- help
- Say Y here if you intend to attach this type of PCMCIA SCSI host
- adapter to your computer.
-@@ -75,6 +78,7 @@ config PCMCIA_QLOGIC
-
- config PCMCIA_SYM53C500
- tristate "Symbios 53c500 PCMCIA support"
-+ depends on HAS_IOPORT
- help
- Say Y here if you have a New Media Bus Toaster or other PCMCIA
- SCSI adapter based on the Symbios 53c500 controller.
-diff --git a/drivers/scsi/qla2xxx/Kconfig b/drivers/scsi/qla2xxx/Kconfig
-index 802c373fd6d92a..a584708d3056f5 100644
---- a/drivers/scsi/qla2xxx/Kconfig
-+++ b/drivers/scsi/qla2xxx/Kconfig
-@@ -1,7 +1,7 @@
- # SPDX-License-Identifier: GPL-2.0-only
- config SCSI_QLA_FC
- tristate "QLogic QLA2XXX Fibre Channel Support"
-- depends on PCI && SCSI
-+ depends on PCI && HAS_IOPORT && SCSI
- depends on SCSI_FC_ATTRS
- depends on NVME_FC || !NVME_FC
- select FW_LOADER
---
-2.53.0
-
+++ /dev/null
-From 07e08d5ed66edfe01f469985eb2a0967f8331982 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Apr 2026 17:15:37 +0200
-Subject: scsi: advansys: Drop ISA_DMA_API remnants
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit c7233b3d99db9760daf07c4e95daa9675c6c0cba ]
-
-Support for ISA bus mastering was removed a few years ago, and the VLB
-mode does not use the ISA DMA API, so drop the dependency and the header
-inclusion.
-
-Fixes: 9b4c8eaa68d0 ("advansys: remove ISA support")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Link: https://patch.msgid.link/20260429151623.3899875-1-arnd@kernel.org
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 1 -
- drivers/scsi/advansys.c | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 00354c005aeb6b..52a3252b2569be 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -473,7 +473,6 @@ config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
- depends on (ISA || EISA || PCI) && HAS_IOPORT
-- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
- AdvanSys. It is documented in the kernel source in
-diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
-index 97be0765cb9bd0..d9d4aec5b89c02 100644
---- a/drivers/scsi/advansys.c
-+++ b/drivers/scsi/advansys.c
-@@ -36,7 +36,6 @@
- #include <linux/dmapool.h>
-
- #include <asm/io.h>
--#include <asm/dma.h>
-
- #include <scsi/scsi_cmnd.h>
- #include <scsi/scsi_device.h>
---
-2.53.0
-
+++ /dev/null
-From fec5e921ef8867f970d7afa92ce73f7e53a74b6e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 24 Jun 2022 17:52:24 +0200
-Subject: scsi: BusLogic: Remove bus_to_virt()
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit 9f7c2232e131b1de2ee4abadfce5d8f010e223c6 ]
-
-The BusLogic driver is the last remaining driver that relies on the
-deprecated bus_to_virt() function, which in turn only works on a few
-architectures, and is incompatible with both swiotlb and iommu support.
-
-Before commit 391e2f25601e ("[SCSI] BusLogic: Port driver to 64-bit."), the
-driver had a dependency on x86-32, presumably because of this
-problem. However, the change introduced another bug that made it still
-impossible to use the driver on any 64-bit machine.
-
-This was in turn fixed in commit 56f396146af2 ("scsi: BusLogic: Fix 64-bit
-system enumeration error for Buslogic"), 8 years later, which shows that
-there are not a lot of users.
-
-Maciej is still using the driver on 32-bit hardware, and Khalid mentioned
-that the driver works with the device emulation used in VirtualBox and
-VMware. Both of those only emulate it for Windows 2000 and older operating
-systems that did not ship with the better LSI logic driver.
-
-Do a minimum fix that searches through the list of descriptors to find one
-that matches the bus address. This is clearly as inefficient as was
-indicated in the code comment about the lack of a bus_to_virt()
-replacement. A better fix would likely involve changing out the entire
-descriptor allocation for a simpler one, but that would be much more
-invasive.
-
-Link: https://lore.kernel.org/r/20220624155226.2889613-2-arnd@kernel.org
-Cc: Maciej W. Rozycki <macro@orcam.me.uk>
-Cc: Matt Wang <wwentao@vmware.com>
-Tested-by: Khalid Aziz <khalid@gonehiking.org>
-Reviewed-by: Robin Murphy <robin.murphy@arm.com>
-Reviewed-by: Hannes Reinecke <hare@suse.de>
-Acked-by: Khalid Aziz <khalid@gonehiking.org>
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Stable-dep-of: c7233b3d99db ("scsi: advansys: Drop ISA_DMA_API remnants")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/BusLogic.c | 35 +++++++++++++++++++++++------------
- drivers/scsi/Kconfig | 2 +-
- 2 files changed, 24 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
-index ee90509b5c7603..e52d9a6e94088f 100644
---- a/drivers/scsi/BusLogic.c
-+++ b/drivers/scsi/BusLogic.c
-@@ -2517,12 +2517,26 @@ static int blogic_resultcode(struct blogic_adapter *adapter,
- return (hoststatus << 16) | tgt_status;
- }
-
-+/*
-+ * turn the dma address from an inbox into a ccb pointer
-+ * This is rather inefficient.
-+ */
-+static struct blogic_ccb *
-+blogic_inbox_to_ccb(struct blogic_adapter *adapter, struct blogic_inbox *inbox)
-+{
-+ struct blogic_ccb *ccb;
-+
-+ for (ccb = adapter->all_ccbs; ccb; ccb = ccb->next_all)
-+ if (inbox->ccb == ccb->dma_handle)
-+ break;
-+
-+ return ccb;
-+}
-
- /*
- blogic_scan_inbox scans the Incoming Mailboxes saving any
- Incoming Mailbox entries for completion processing.
- */
--
- static void blogic_scan_inbox(struct blogic_adapter *adapter)
- {
- /*
-@@ -2542,17 +2556,14 @@ static void blogic_scan_inbox(struct blogic_adapter *adapter)
- enum blogic_cmplt_code comp_code;
-
- while ((comp_code = next_inbox->comp_code) != BLOGIC_INBOX_FREE) {
-- /*
-- We are only allowed to do this because we limit our
-- architectures we run on to machines where bus_to_virt(
-- actually works. There *needs* to be a dma_addr_to_virt()
-- in the new PCI DMA mapping interface to replace
-- bus_to_virt() or else this code is going to become very
-- innefficient.
-- */
-- struct blogic_ccb *ccb =
-- (struct blogic_ccb *) bus_to_virt(next_inbox->ccb);
-- if (comp_code != BLOGIC_CMD_NOTFOUND) {
-+ struct blogic_ccb *ccb = blogic_inbox_to_ccb(adapter, next_inbox);
-+ if (!ccb) {
-+ /*
-+ * This should never happen, unless the CCB list is
-+ * corrupted in memory.
-+ */
-+ blogic_warn("Could not find CCB for dma address %x\n", adapter, next_inbox->ccb);
-+ } else if (comp_code != BLOGIC_CMD_NOTFOUND) {
- if (ccb->status == BLOGIC_CCB_ACTIVE ||
- ccb->status == BLOGIC_CCB_RESET) {
- /*
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 43e6f86e08c33d..743a72b7421eba 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -514,7 +514,7 @@ config SCSI_HPTIOP
-
- config SCSI_BUSLOGIC
- tristate "BusLogic SCSI support"
-- depends on PCI && SCSI && VIRT_TO_BUS
-+ depends on PCI && SCSI
- help
- This is support for BusLogic MultiMaster and FlashPoint SCSI Host
- Adapters. Consult the SCSI-HOWTO, available from
---
-2.53.0
-
driver-core-use-read_once-for-dev-driver-in-dev_has_.patch
wifi-rtw88-fix-oob-read-from-firmware-rx-descriptor-.patch
kconfig-fix-potential-null-pointer-dereference-in-co.patch
-scsi-buslogic-remove-bus_to_virt.patch
-scsi-add-has_ioport-dependencies.patch
-scsi-advansys-drop-isa_dma_api-remnants.patch
wifi-ath9k-fix-oob-access-from-firmware-tx-status-qu.patch
arm-dts-am335x-sl50-fix-audio-bitclock-and-frame-mas.patch
watchdog-sp5100_tco-use-efch-mmio-for-newer-hygon-fc.patch
+++ /dev/null
-From 9b424330672fac4e57de52df6466bfa1550dd948 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Jun 2026 23:30:47 +0200
-Subject: dt-bindings: vendor-prefixes: add Gira
-
-From: Lucas Stach <l.stach@pengutronix.de>
-
-[ Upstream commit 61a7e4c2c98c08da6bbf8c30c71da57610930ae7 ]
-
-Add vendor prefix for Gira Giersiepen GmbH & Co. KG
-Link: https://www.gira.de/
-
-Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-Reviewed-by: Alexander Dahl <ada@thorsis.com>
-Acked-by: Conor Dooley <conor.dooley@microchip.com>
-Link: https://patch.msgid.link/20260610213047.500701-1-l.stach@pengutronix.de
-Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-index af9a8d43b2479c..35a4bd5eacb890 100644
---- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
-+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-@@ -573,6 +573,8 @@ patternProperties:
- description: Giantec Semiconductor, Inc.
- "^giantplus,.*":
- description: Giantplus Technology Co., Ltd.
-+ "^gira,.*":
-+ description: Gira Giersiepen GmbH & Co. KG
- "^glinet,.*":
- description: GL Intelligence, Inc.
- "^globalscale,.*":
---
-2.53.0
-
+++ /dev/null
-From eabfafb9eba33f84658f6e70acd5a15581b222fe Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 11 Jun 2026 14:55:38 -0700
-Subject: net: ethernet: oa_tc6: Interrupt is active low, level triggered.
-
-From: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-
-[ Upstream commit b542d13fab0f556660ce5f10179fb3ae66bdb9a4 ]
-
-According OPEN Alliance 10BASET1x MAC-PHY Serial Interface
-specification, interrupt is active low, level triggered.
-
-Code used edge triggered interrupt which has the risk of losing an
-interrupt on instances like when interrupt is disabled. Level
-triggered interrupt won't be deasserted unless handler runs and
-clear the interrupting conditions.
-
-Interrupt handler mechanism is changed to threaded irq from
-interrupt handler and kernel thread waiting on work queue.
-Threaded irq mechanism is best suited for level triggered interrupt
-as it disables the interrupt until handler is run in thread level,
-while giving us an ability to have interrupt context handler to
-signal the threaded irq handler.
-
-Introduced a logic to disable the device interrupt on error. Error
-could be due in data chunk's header and footer or SPI interface itself.
-This will avoid having repeated interrupts, in case the driver couldn't
-recover from the error condition with the available recovery mechanism.
-
-Fixes: 2c6ce5354453 ("net: ethernet: oa_tc6: implement mac-phy interrupt")
-Signed-off-by: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-Link: https://patch.msgid.link/20260611-level-trigger-v5-1-4533a9e85ce2@onsemi.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/oa_tc6.c | 126 ++++++++++++++++++++--------------
- 1 file changed, 76 insertions(+), 50 deletions(-)
-
-diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
-index 91a906a7918a25..f3ac2875adfb7b 100644
---- a/drivers/net/ethernet/oa_tc6.c
-+++ b/drivers/net/ethernet/oa_tc6.c
-@@ -7,6 +7,7 @@
-
- #include <linux/bitfield.h>
- #include <linux/iopoll.h>
-+#include <linux/interrupt.h>
- #include <linux/mdio.h>
- #include <linux/phy.h>
- #include <linux/oa_tc6.h>
-@@ -44,6 +45,8 @@
- #define INT_MASK0_LOSS_OF_FRAME_ERR_MASK BIT(4)
- #define INT_MASK0_RX_BUFFER_OVERFLOW_ERR_MASK BIT(3)
- #define INT_MASK0_TX_PROTOCOL_ERR_MASK BIT(0)
-+#define INT_MASK0_ALL_INTERRUPTS (GENMASK(5, 0) | \
-+ GENMASK(12, 7))
-
- /* PHY Clause 22 registers base address and mask */
- #define OA_TC6_PHY_STD_REG_ADDR_BASE 0xFF00
-@@ -121,14 +124,13 @@ struct oa_tc6 {
- struct sk_buff *ongoing_tx_skb;
- struct sk_buff *waiting_tx_skb;
- struct sk_buff *rx_skb;
-- struct task_struct *spi_thread;
-- wait_queue_head_t spi_wq;
- u16 tx_skb_offset;
- u16 spi_data_tx_buf_offset;
- u16 tx_credits;
- u8 rx_chunks_available;
- bool rx_buf_overflow;
- bool int_flag;
-+ bool disable_traffic;
- };
-
- enum oa_tc6_header_type {
-@@ -669,6 +671,38 @@ static void oa_tc6_cleanup_ongoing_tx_skb(struct oa_tc6 *tc6)
- }
- }
-
-+static void oa_tc6_cleanup_waiting_tx_skb(struct oa_tc6 *tc6)
-+{
-+ if (tc6->waiting_tx_skb) {
-+ tc6->netdev->stats.tx_dropped++;
-+ kfree_skb(tc6->waiting_tx_skb);
-+ tc6->waiting_tx_skb = NULL;
-+ }
-+}
-+
-+static void oa_tc6_free_pending_skbs(struct oa_tc6 *tc6)
-+{
-+ oa_tc6_cleanup_ongoing_tx_skb(tc6);
-+ oa_tc6_cleanup_ongoing_rx_skb(tc6);
-+ oa_tc6_cleanup_waiting_tx_skb(tc6);
-+}
-+
-+/* If the failure is at SPI interface level, masking and clearing
-+ * the interrupt of the device won't work. Since SPI interrupt is
-+ * disabled, it should stop the repeated interrupts.
-+ */
-+static void oa_tc6_disable_traffic(struct oa_tc6 *tc6)
-+{
-+ u32 regval = INT_MASK0_ALL_INTERRUPTS;
-+
-+ tc6->disable_traffic = true;
-+ oa_tc6_free_pending_skbs(tc6);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_INT_MASK0, regval);
-+ oa_tc6_read_register(tc6, OA_TC6_REG_STATUS0, ®val);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_STATUS0, regval);
-+ dev_err(&tc6->spi->dev, "Device interrupt disabled to avoid interrupt storm");
-+}
-+
- static int oa_tc6_process_extended_status(struct oa_tc6 *tc6)
- {
- u32 value;
-@@ -1105,29 +1139,29 @@ static int oa_tc6_try_spi_transfer(struct oa_tc6 *tc6)
- return 0;
- }
-
--static int oa_tc6_spi_thread_handler(void *data)
-+static irqreturn_t oa_tc6_macphy_threaded_irq(int irq, void *data)
- {
- struct oa_tc6 *tc6 = data;
-- int ret;
--
-- while (likely(!kthread_should_stop())) {
-- /* This kthread will be waken up if there is a tx skb or mac-phy
-- * interrupt to perform spi transfer with tx chunks.
-- */
-- wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
-- (tc6->waiting_tx_skb &&
-- tc6->tx_credits) ||
-- kthread_should_stop());
--
-- if (kthread_should_stop())
-- break;
-+ int ret = 0;
-
-- ret = oa_tc6_try_spi_transfer(tc6);
-- if (ret)
-- return ret;
-+ /* It is possible that interrupt woke the thread before it is
-+ * disabled. Until we come up with good recovery mechanism,
-+ * no need to attempt spi transfer, once it fails. Pending skbs
-+ * are already freed.
-+ */
-+ if (!tc6->disable_traffic) {
-+ while (tc6->int_flag ||
-+ (tc6->waiting_tx_skb && tc6->tx_credits)) {
-+ ret = oa_tc6_try_spi_transfer(tc6);
-+ if (ret) {
-+ disable_irq_nosync(tc6->spi->irq);
-+ oa_tc6_disable_traffic(tc6);
-+ break;
-+ }
-+ }
- }
-
-- return 0;
-+ return IRQ_HANDLED;
- }
-
- static int oa_tc6_update_buffer_status_from_register(struct oa_tc6 *tc6)
-@@ -1161,11 +1195,15 @@ static irqreturn_t oa_tc6_macphy_isr(int irq, void *data)
- * the previous rx footer.
- * - extended status event not reported in the previous rx footer.
- */
-- tc6->int_flag = true;
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
--
-- return IRQ_HANDLED;
-+ if (tc6->disable_traffic)
-+ disable_irq_nosync(tc6->spi->irq);
-+ else
-+ tc6->int_flag = true;
-+ /* Wake IRQ thread to perform spi transfer . In case
-+ * disable_traffic is set, threaded irq may run again
-+ * one more time.
-+ */
-+ return IRQ_WAKE_THREAD;
- }
-
- /**
-@@ -1202,7 +1240,7 @@ EXPORT_SYMBOL_GPL(oa_tc6_zero_align_receive_frame_enable);
- */
- netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- {
-- if (tc6->waiting_tx_skb) {
-+ if (tc6->disable_traffic || tc6->waiting_tx_skb) {
- netif_stop_queue(tc6->netdev);
- return NETDEV_TX_BUSY;
- }
-@@ -1217,8 +1255,8 @@ netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- tc6->waiting_tx_skb = skb;
- spin_unlock_bh(&tc6->tx_skb_lock);
-
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
-+ /* Wake the threaded IRQ to perform spi transfer. */
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return NETDEV_TX_OK;
- }
-@@ -1311,24 +1349,15 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- goto phy_exit;
- }
-
-- init_waitqueue_head(&tc6->spi_wq);
--
-- tc6->spi_thread = kthread_run(oa_tc6_spi_thread_handler, tc6,
-- "oa-tc6-spi-thread");
-- if (IS_ERR(tc6->spi_thread)) {
-- dev_err(&tc6->spi->dev, "Failed to create SPI thread\n");
-- goto phy_exit;
-- }
--
-- sched_set_fifo(tc6->spi_thread);
--
-- ret = devm_request_irq(&tc6->spi->dev, tc6->spi->irq, oa_tc6_macphy_isr,
-- IRQF_TRIGGER_FALLING, dev_name(&tc6->spi->dev),
-- tc6);
-+ ret = devm_request_threaded_irq(&tc6->spi->dev, tc6->spi->irq,
-+ oa_tc6_macphy_isr,
-+ oa_tc6_macphy_threaded_irq,
-+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-+ dev_name(&tc6->spi->dev), tc6);
- if (ret) {
- dev_err(&tc6->spi->dev, "Failed to request macphy isr %d\n",
- ret);
-- goto kthread_stop;
-+ goto phy_exit;
- }
-
- /* oa_tc6_sw_reset_macphy() function resets and clears the MAC-PHY reset
-@@ -1338,12 +1367,10 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- * 7.7 and 9.2.8.8 in the OPEN Alliance specification for more details.
- */
- tc6->int_flag = true;
-- wake_up_interruptible(&tc6->spi_wq);
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return tc6;
-
--kthread_stop:
-- kthread_stop(tc6->spi_thread);
- phy_exit:
- oa_tc6_phy_exit(tc6);
- return NULL;
-@@ -1356,11 +1383,10 @@ EXPORT_SYMBOL_GPL(oa_tc6_init);
- */
- void oa_tc6_exit(struct oa_tc6 *tc6)
- {
-+ tc6->disable_traffic = true;
-+ disable_irq(tc6->spi->irq);
- oa_tc6_phy_exit(tc6);
-- kthread_stop(tc6->spi_thread);
-- dev_kfree_skb_any(tc6->ongoing_tx_skb);
-- dev_kfree_skb_any(tc6->waiting_tx_skb);
-- dev_kfree_skb_any(tc6->rx_skb);
-+ oa_tc6_free_pending_skbs(tc6);
- }
- EXPORT_SYMBOL_GPL(oa_tc6_exit);
-
---
-2.53.0
-
+++ /dev/null
-From 92820fe5fd817f87e2e3e0b13bf7b988ca68465b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Apr 2026 17:15:37 +0200
-Subject: scsi: advansys: Drop ISA_DMA_API remnants
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit c7233b3d99db9760daf07c4e95daa9675c6c0cba ]
-
-Support for ISA bus mastering was removed a few years ago, and the VLB
-mode does not use the ISA DMA API, so drop the dependency and the header
-inclusion.
-
-Fixes: 9b4c8eaa68d0 ("advansys: remove ISA support")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Link: https://patch.msgid.link/20260429151623.3899875-1-arnd@kernel.org
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 1 -
- drivers/scsi/advansys.c | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 37c24ffea65cc0..cdcfbec6033bbe 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -476,7 +476,6 @@ config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
- depends on (ISA || EISA || PCI) && HAS_IOPORT
-- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
- AdvanSys. It is documented in the kernel source in
-diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
-index fd4fcb37863dc2..73137430a33de9 100644
---- a/drivers/scsi/advansys.c
-+++ b/drivers/scsi/advansys.c
-@@ -36,7 +36,6 @@
- #include <linux/dmapool.h>
-
- #include <asm/io.h>
--#include <asm/dma.h>
-
- #include <scsi/scsi_cmnd.h>
- #include <scsi/scsi_device.h>
---
-2.53.0
-
wifi-rtw88-fix-oob-read-from-firmware-rx-descriptor-.patch
kconfig-fix-potential-null-pointer-dereference-in-co.patch
soc-xilinx-shutdown-and-free-rx-mailbox-channel.patch
-scsi-advansys-drop-isa_dma_api-remnants.patch
wifi-ath9k-fix-oob-access-from-firmware-tx-status-qu.patch
arm-dts-am335x-sl50-fix-audio-bitclock-and-frame-mas.patch
watchdog-sp5100_tco-use-efch-mmio-for-newer-hygon-fc.patch
powerpc-powernv-fix-preempt-count-leak-in-pnv_kexec_.patch
powerpc-kexec-fix-double-get_cpu-imbalance-in-kexec_.patch
keys-use-acquire-when-reading-state-in-keyring-searc.patch
-dt-bindings-vendor-prefixes-add-gira.patch
tipc-fix-uaf-in-tipc_l2_send_msg.patch
tcp-ipv6-clamp-default-adverting-mss-to-avoid-gso_by.patch
net-airoha-introduce-ndo_select_queue-callback.patch
net-airoha-add-sched-ets-offload-support.patch
net-airoha-fix-always-true-condition-in-ppe1-queue-r.patch
-net-ethernet-oa_tc6-interrupt-is-active-low-level-tr.patch
net-ethernet-oa_tc6-mdiobus-parent-initialized-with-.patch
net-ethernet-oa_tc6-remove-fcs-size-in-rx-frame.patch
dt-bindings-net-updated-interrupt-type-to-be-active-.patch
+++ /dev/null
-From 12ac52145e0d46f39cdae149d61318d35c3b4038 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Jun 2026 23:30:47 +0200
-Subject: dt-bindings: vendor-prefixes: add Gira
-
-From: Lucas Stach <l.stach@pengutronix.de>
-
-[ Upstream commit 61a7e4c2c98c08da6bbf8c30c71da57610930ae7 ]
-
-Add vendor prefix for Gira Giersiepen GmbH & Co. KG
-Link: https://www.gira.de/
-
-Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-Reviewed-by: Alexander Dahl <ada@thorsis.com>
-Acked-by: Conor Dooley <conor.dooley@microchip.com>
-Link: https://patch.msgid.link/20260610213047.500701-1-l.stach@pengutronix.de
-Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-index a9cf85fd6fbec7..363b2fcb1ddad2 100644
---- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
-+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-@@ -632,6 +632,8 @@ patternProperties:
- description: Giantec Semiconductor, Inc.
- "^giantplus,.*":
- description: Giantplus Technology Co., Ltd.
-+ "^gira,.*":
-+ description: Gira Giersiepen GmbH & Co. KG
- "^glinet,.*":
- description: GL Intelligence, Inc.
- "^globalscale,.*":
---
-2.53.0
-
+++ /dev/null
-From a2b0a77e72831120956f7fbccd1aa450c698c78c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 11 Jun 2026 14:55:38 -0700
-Subject: net: ethernet: oa_tc6: Interrupt is active low, level triggered.
-
-From: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-
-[ Upstream commit b542d13fab0f556660ce5f10179fb3ae66bdb9a4 ]
-
-According OPEN Alliance 10BASET1x MAC-PHY Serial Interface
-specification, interrupt is active low, level triggered.
-
-Code used edge triggered interrupt which has the risk of losing an
-interrupt on instances like when interrupt is disabled. Level
-triggered interrupt won't be deasserted unless handler runs and
-clear the interrupting conditions.
-
-Interrupt handler mechanism is changed to threaded irq from
-interrupt handler and kernel thread waiting on work queue.
-Threaded irq mechanism is best suited for level triggered interrupt
-as it disables the interrupt until handler is run in thread level,
-while giving us an ability to have interrupt context handler to
-signal the threaded irq handler.
-
-Introduced a logic to disable the device interrupt on error. Error
-could be due in data chunk's header and footer or SPI interface itself.
-This will avoid having repeated interrupts, in case the driver couldn't
-recover from the error condition with the available recovery mechanism.
-
-Fixes: 2c6ce5354453 ("net: ethernet: oa_tc6: implement mac-phy interrupt")
-Signed-off-by: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-Link: https://patch.msgid.link/20260611-level-trigger-v5-1-4533a9e85ce2@onsemi.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/oa_tc6.c | 126 ++++++++++++++++++++--------------
- 1 file changed, 76 insertions(+), 50 deletions(-)
-
-diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
-index 91a906a7918a25..f3ac2875adfb7b 100644
---- a/drivers/net/ethernet/oa_tc6.c
-+++ b/drivers/net/ethernet/oa_tc6.c
-@@ -7,6 +7,7 @@
-
- #include <linux/bitfield.h>
- #include <linux/iopoll.h>
-+#include <linux/interrupt.h>
- #include <linux/mdio.h>
- #include <linux/phy.h>
- #include <linux/oa_tc6.h>
-@@ -44,6 +45,8 @@
- #define INT_MASK0_LOSS_OF_FRAME_ERR_MASK BIT(4)
- #define INT_MASK0_RX_BUFFER_OVERFLOW_ERR_MASK BIT(3)
- #define INT_MASK0_TX_PROTOCOL_ERR_MASK BIT(0)
-+#define INT_MASK0_ALL_INTERRUPTS (GENMASK(5, 0) | \
-+ GENMASK(12, 7))
-
- /* PHY Clause 22 registers base address and mask */
- #define OA_TC6_PHY_STD_REG_ADDR_BASE 0xFF00
-@@ -121,14 +124,13 @@ struct oa_tc6 {
- struct sk_buff *ongoing_tx_skb;
- struct sk_buff *waiting_tx_skb;
- struct sk_buff *rx_skb;
-- struct task_struct *spi_thread;
-- wait_queue_head_t spi_wq;
- u16 tx_skb_offset;
- u16 spi_data_tx_buf_offset;
- u16 tx_credits;
- u8 rx_chunks_available;
- bool rx_buf_overflow;
- bool int_flag;
-+ bool disable_traffic;
- };
-
- enum oa_tc6_header_type {
-@@ -669,6 +671,38 @@ static void oa_tc6_cleanup_ongoing_tx_skb(struct oa_tc6 *tc6)
- }
- }
-
-+static void oa_tc6_cleanup_waiting_tx_skb(struct oa_tc6 *tc6)
-+{
-+ if (tc6->waiting_tx_skb) {
-+ tc6->netdev->stats.tx_dropped++;
-+ kfree_skb(tc6->waiting_tx_skb);
-+ tc6->waiting_tx_skb = NULL;
-+ }
-+}
-+
-+static void oa_tc6_free_pending_skbs(struct oa_tc6 *tc6)
-+{
-+ oa_tc6_cleanup_ongoing_tx_skb(tc6);
-+ oa_tc6_cleanup_ongoing_rx_skb(tc6);
-+ oa_tc6_cleanup_waiting_tx_skb(tc6);
-+}
-+
-+/* If the failure is at SPI interface level, masking and clearing
-+ * the interrupt of the device won't work. Since SPI interrupt is
-+ * disabled, it should stop the repeated interrupts.
-+ */
-+static void oa_tc6_disable_traffic(struct oa_tc6 *tc6)
-+{
-+ u32 regval = INT_MASK0_ALL_INTERRUPTS;
-+
-+ tc6->disable_traffic = true;
-+ oa_tc6_free_pending_skbs(tc6);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_INT_MASK0, regval);
-+ oa_tc6_read_register(tc6, OA_TC6_REG_STATUS0, ®val);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_STATUS0, regval);
-+ dev_err(&tc6->spi->dev, "Device interrupt disabled to avoid interrupt storm");
-+}
-+
- static int oa_tc6_process_extended_status(struct oa_tc6 *tc6)
- {
- u32 value;
-@@ -1105,29 +1139,29 @@ static int oa_tc6_try_spi_transfer(struct oa_tc6 *tc6)
- return 0;
- }
-
--static int oa_tc6_spi_thread_handler(void *data)
-+static irqreturn_t oa_tc6_macphy_threaded_irq(int irq, void *data)
- {
- struct oa_tc6 *tc6 = data;
-- int ret;
--
-- while (likely(!kthread_should_stop())) {
-- /* This kthread will be waken up if there is a tx skb or mac-phy
-- * interrupt to perform spi transfer with tx chunks.
-- */
-- wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
-- (tc6->waiting_tx_skb &&
-- tc6->tx_credits) ||
-- kthread_should_stop());
--
-- if (kthread_should_stop())
-- break;
-+ int ret = 0;
-
-- ret = oa_tc6_try_spi_transfer(tc6);
-- if (ret)
-- return ret;
-+ /* It is possible that interrupt woke the thread before it is
-+ * disabled. Until we come up with good recovery mechanism,
-+ * no need to attempt spi transfer, once it fails. Pending skbs
-+ * are already freed.
-+ */
-+ if (!tc6->disable_traffic) {
-+ while (tc6->int_flag ||
-+ (tc6->waiting_tx_skb && tc6->tx_credits)) {
-+ ret = oa_tc6_try_spi_transfer(tc6);
-+ if (ret) {
-+ disable_irq_nosync(tc6->spi->irq);
-+ oa_tc6_disable_traffic(tc6);
-+ break;
-+ }
-+ }
- }
-
-- return 0;
-+ return IRQ_HANDLED;
- }
-
- static int oa_tc6_update_buffer_status_from_register(struct oa_tc6 *tc6)
-@@ -1161,11 +1195,15 @@ static irqreturn_t oa_tc6_macphy_isr(int irq, void *data)
- * the previous rx footer.
- * - extended status event not reported in the previous rx footer.
- */
-- tc6->int_flag = true;
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
--
-- return IRQ_HANDLED;
-+ if (tc6->disable_traffic)
-+ disable_irq_nosync(tc6->spi->irq);
-+ else
-+ tc6->int_flag = true;
-+ /* Wake IRQ thread to perform spi transfer . In case
-+ * disable_traffic is set, threaded irq may run again
-+ * one more time.
-+ */
-+ return IRQ_WAKE_THREAD;
- }
-
- /**
-@@ -1202,7 +1240,7 @@ EXPORT_SYMBOL_GPL(oa_tc6_zero_align_receive_frame_enable);
- */
- netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- {
-- if (tc6->waiting_tx_skb) {
-+ if (tc6->disable_traffic || tc6->waiting_tx_skb) {
- netif_stop_queue(tc6->netdev);
- return NETDEV_TX_BUSY;
- }
-@@ -1217,8 +1255,8 @@ netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- tc6->waiting_tx_skb = skb;
- spin_unlock_bh(&tc6->tx_skb_lock);
-
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
-+ /* Wake the threaded IRQ to perform spi transfer. */
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return NETDEV_TX_OK;
- }
-@@ -1311,24 +1349,15 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- goto phy_exit;
- }
-
-- init_waitqueue_head(&tc6->spi_wq);
--
-- tc6->spi_thread = kthread_run(oa_tc6_spi_thread_handler, tc6,
-- "oa-tc6-spi-thread");
-- if (IS_ERR(tc6->spi_thread)) {
-- dev_err(&tc6->spi->dev, "Failed to create SPI thread\n");
-- goto phy_exit;
-- }
--
-- sched_set_fifo(tc6->spi_thread);
--
-- ret = devm_request_irq(&tc6->spi->dev, tc6->spi->irq, oa_tc6_macphy_isr,
-- IRQF_TRIGGER_FALLING, dev_name(&tc6->spi->dev),
-- tc6);
-+ ret = devm_request_threaded_irq(&tc6->spi->dev, tc6->spi->irq,
-+ oa_tc6_macphy_isr,
-+ oa_tc6_macphy_threaded_irq,
-+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-+ dev_name(&tc6->spi->dev), tc6);
- if (ret) {
- dev_err(&tc6->spi->dev, "Failed to request macphy isr %d\n",
- ret);
-- goto kthread_stop;
-+ goto phy_exit;
- }
-
- /* oa_tc6_sw_reset_macphy() function resets and clears the MAC-PHY reset
-@@ -1338,12 +1367,10 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- * 7.7 and 9.2.8.8 in the OPEN Alliance specification for more details.
- */
- tc6->int_flag = true;
-- wake_up_interruptible(&tc6->spi_wq);
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return tc6;
-
--kthread_stop:
-- kthread_stop(tc6->spi_thread);
- phy_exit:
- oa_tc6_phy_exit(tc6);
- return NULL;
-@@ -1356,11 +1383,10 @@ EXPORT_SYMBOL_GPL(oa_tc6_init);
- */
- void oa_tc6_exit(struct oa_tc6 *tc6)
- {
-+ tc6->disable_traffic = true;
-+ disable_irq(tc6->spi->irq);
- oa_tc6_phy_exit(tc6);
-- kthread_stop(tc6->spi_thread);
-- dev_kfree_skb_any(tc6->ongoing_tx_skb);
-- dev_kfree_skb_any(tc6->waiting_tx_skb);
-- dev_kfree_skb_any(tc6->rx_skb);
-+ oa_tc6_free_pending_skbs(tc6);
- }
- EXPORT_SYMBOL_GPL(oa_tc6_exit);
-
---
-2.53.0
-
+++ /dev/null
-From 08b62a3fbfcf9577da04cfae82983de179dddc65 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Apr 2026 17:15:37 +0200
-Subject: scsi: advansys: Drop ISA_DMA_API remnants
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit c7233b3d99db9760daf07c4e95daa9675c6c0cba ]
-
-Support for ISA bus mastering was removed a few years ago, and the VLB
-mode does not use the ISA DMA API, so drop the dependency and the header
-inclusion.
-
-Fixes: 9b4c8eaa68d0 ("advansys: remove ISA support")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Link: https://patch.msgid.link/20260429151623.3899875-1-arnd@kernel.org
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 1 -
- drivers/scsi/advansys.c | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 19d0884479a247..70d6392192b59c 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -476,7 +476,6 @@ config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
- depends on (ISA || EISA || PCI) && HAS_IOPORT
-- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
- AdvanSys. It is documented in the kernel source in
-diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
-index 063e1b5818d342..9a6bd4b12d236c 100644
---- a/drivers/scsi/advansys.c
-+++ b/drivers/scsi/advansys.c
-@@ -36,7 +36,6 @@
- #include <linux/dmapool.h>
-
- #include <asm/io.h>
--#include <asm/dma.h>
-
- #include <scsi/scsi_cmnd.h>
- #include <scsi/scsi_device.h>
---
-2.53.0
-
kconfig-fix-potential-null-pointer-dereference-in-co.patch
soc-xilinx-shutdown-and-free-rx-mailbox-channel.patch
pinctrl-mediatek-eint-drop-base-from-mtk_eint_chip_w.patch
-scsi-advansys-drop-isa_dma_api-remnants.patch
wifi-ath9k-fix-oob-access-from-firmware-tx-status-qu.patch
arm-dts-am335x-sl50-fix-audio-bitclock-and-frame-mas.patch
documentation-rv-replace-stale-website-link.patch
powerpc-powernv-fix-preempt-count-leak-in-pnv_kexec_.patch
powerpc-kexec-fix-double-get_cpu-imbalance-in-kexec_.patch
keys-use-acquire-when-reading-state-in-keyring-searc.patch
-dt-bindings-vendor-prefixes-add-gira.patch
tipc-fix-uaf-in-tipc_l2_send_msg.patch
tcp-ipv6-clamp-default-adverting-mss-to-avoid-gso_by.patch
net-airoha-fix-always-true-condition-in-ppe1-queue-r.patch
-net-ethernet-oa_tc6-interrupt-is-active-low-level-tr.patch
net-ethernet-oa_tc6-mdiobus-parent-initialized-with-.patch
net-ethernet-oa_tc6-remove-fcs-size-in-rx-frame.patch
dt-bindings-net-updated-interrupt-type-to-be-active-.patch
+++ /dev/null
-From 149c09f246680de13a6267da1699c6ae92c7602d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Apr 2026 17:15:37 +0200
-Subject: scsi: advansys: Drop ISA_DMA_API remnants
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit c7233b3d99db9760daf07c4e95daa9675c6c0cba ]
-
-Support for ISA bus mastering was removed a few years ago, and the VLB
-mode does not use the ISA DMA API, so drop the dependency and the header
-inclusion.
-
-Fixes: 9b4c8eaa68d0 ("advansys: remove ISA support")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Link: https://patch.msgid.link/20260429151623.3899875-1-arnd@kernel.org
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 1 -
- drivers/scsi/advansys.c | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 23bce8995a5575..02f41bf250af5f 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -463,7 +463,6 @@ config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
- depends on (ISA || EISA || PCI) && HAS_IOPORT
-- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
- AdvanSys. It is documented in the kernel source in
-diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
-index ab066bb27a5704..920be96f585f00 100644
---- a/drivers/scsi/advansys.c
-+++ b/drivers/scsi/advansys.c
-@@ -36,7 +36,6 @@
- #include <linux/dmapool.h>
-
- #include <asm/io.h>
--#include <asm/dma.h>
-
- #include <scsi/scsi_cmnd.h>
- #include <scsi/scsi_device.h>
---
-2.53.0
-
wifi-rtw89-correct-data-type-for-scan-index-to-avoid.patch
wifi-rtw88-fix-oob-read-from-firmware-rx-descriptor-.patch
kconfig-fix-potential-null-pointer-dereference-in-co.patch
-scsi-advansys-drop-isa_dma_api-remnants.patch
wifi-ath9k-fix-oob-access-from-firmware-tx-status-qu.patch
arm-dts-am335x-sl50-fix-audio-bitclock-and-frame-mas.patch
watchdog-sp5100_tco-use-efch-mmio-for-newer-hygon-fc.patch
+++ /dev/null
-From 26b08f0fcf83bd733238cf556bab64c65ded09a4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 10 Jun 2026 23:30:47 +0200
-Subject: dt-bindings: vendor-prefixes: add Gira
-
-From: Lucas Stach <l.stach@pengutronix.de>
-
-[ Upstream commit 61a7e4c2c98c08da6bbf8c30c71da57610930ae7 ]
-
-Add vendor prefix for Gira Giersiepen GmbH & Co. KG
-Link: https://www.gira.de/
-
-Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-Reviewed-by: Alexander Dahl <ada@thorsis.com>
-Acked-by: Conor Dooley <conor.dooley@microchip.com>
-Link: https://patch.msgid.link/20260610213047.500701-1-l.stach@pengutronix.de
-Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-index ac83310259a914..55ef75d530e6c2 100644
---- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
-+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
-@@ -658,6 +658,8 @@ patternProperties:
- description: Giantec Semiconductor, Inc.
- "^giantplus,.*":
- description: Giantplus Technology Co., Ltd.
-+ "^gira,.*":
-+ description: Gira Giersiepen GmbH & Co. KG
- "^glinet,.*":
- description: GL Intelligence, Inc.
- "^globalscale,.*":
---
-2.53.0
-
+++ /dev/null
-From 67373094ff13ea1e12c8d99590204fef10506165 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 11 Jun 2026 14:55:38 -0700
-Subject: net: ethernet: oa_tc6: Interrupt is active low, level triggered.
-
-From: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-
-[ Upstream commit b542d13fab0f556660ce5f10179fb3ae66bdb9a4 ]
-
-According OPEN Alliance 10BASET1x MAC-PHY Serial Interface
-specification, interrupt is active low, level triggered.
-
-Code used edge triggered interrupt which has the risk of losing an
-interrupt on instances like when interrupt is disabled. Level
-triggered interrupt won't be deasserted unless handler runs and
-clear the interrupting conditions.
-
-Interrupt handler mechanism is changed to threaded irq from
-interrupt handler and kernel thread waiting on work queue.
-Threaded irq mechanism is best suited for level triggered interrupt
-as it disables the interrupt until handler is run in thread level,
-while giving us an ability to have interrupt context handler to
-signal the threaded irq handler.
-
-Introduced a logic to disable the device interrupt on error. Error
-could be due in data chunk's header and footer or SPI interface itself.
-This will avoid having repeated interrupts, in case the driver couldn't
-recover from the error condition with the available recovery mechanism.
-
-Fixes: 2c6ce5354453 ("net: ethernet: oa_tc6: implement mac-phy interrupt")
-Signed-off-by: Selvamani Rajagopal <Selvamani.Rajagopal@onsemi.com>
-Link: https://patch.msgid.link/20260611-level-trigger-v5-1-4533a9e85ce2@onsemi.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/net/ethernet/oa_tc6.c | 126 ++++++++++++++++++++--------------
- 1 file changed, 76 insertions(+), 50 deletions(-)
-
-diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c
-index 91a906a7918a25..f3ac2875adfb7b 100644
---- a/drivers/net/ethernet/oa_tc6.c
-+++ b/drivers/net/ethernet/oa_tc6.c
-@@ -7,6 +7,7 @@
-
- #include <linux/bitfield.h>
- #include <linux/iopoll.h>
-+#include <linux/interrupt.h>
- #include <linux/mdio.h>
- #include <linux/phy.h>
- #include <linux/oa_tc6.h>
-@@ -44,6 +45,8 @@
- #define INT_MASK0_LOSS_OF_FRAME_ERR_MASK BIT(4)
- #define INT_MASK0_RX_BUFFER_OVERFLOW_ERR_MASK BIT(3)
- #define INT_MASK0_TX_PROTOCOL_ERR_MASK BIT(0)
-+#define INT_MASK0_ALL_INTERRUPTS (GENMASK(5, 0) | \
-+ GENMASK(12, 7))
-
- /* PHY Clause 22 registers base address and mask */
- #define OA_TC6_PHY_STD_REG_ADDR_BASE 0xFF00
-@@ -121,14 +124,13 @@ struct oa_tc6 {
- struct sk_buff *ongoing_tx_skb;
- struct sk_buff *waiting_tx_skb;
- struct sk_buff *rx_skb;
-- struct task_struct *spi_thread;
-- wait_queue_head_t spi_wq;
- u16 tx_skb_offset;
- u16 spi_data_tx_buf_offset;
- u16 tx_credits;
- u8 rx_chunks_available;
- bool rx_buf_overflow;
- bool int_flag;
-+ bool disable_traffic;
- };
-
- enum oa_tc6_header_type {
-@@ -669,6 +671,38 @@ static void oa_tc6_cleanup_ongoing_tx_skb(struct oa_tc6 *tc6)
- }
- }
-
-+static void oa_tc6_cleanup_waiting_tx_skb(struct oa_tc6 *tc6)
-+{
-+ if (tc6->waiting_tx_skb) {
-+ tc6->netdev->stats.tx_dropped++;
-+ kfree_skb(tc6->waiting_tx_skb);
-+ tc6->waiting_tx_skb = NULL;
-+ }
-+}
-+
-+static void oa_tc6_free_pending_skbs(struct oa_tc6 *tc6)
-+{
-+ oa_tc6_cleanup_ongoing_tx_skb(tc6);
-+ oa_tc6_cleanup_ongoing_rx_skb(tc6);
-+ oa_tc6_cleanup_waiting_tx_skb(tc6);
-+}
-+
-+/* If the failure is at SPI interface level, masking and clearing
-+ * the interrupt of the device won't work. Since SPI interrupt is
-+ * disabled, it should stop the repeated interrupts.
-+ */
-+static void oa_tc6_disable_traffic(struct oa_tc6 *tc6)
-+{
-+ u32 regval = INT_MASK0_ALL_INTERRUPTS;
-+
-+ tc6->disable_traffic = true;
-+ oa_tc6_free_pending_skbs(tc6);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_INT_MASK0, regval);
-+ oa_tc6_read_register(tc6, OA_TC6_REG_STATUS0, ®val);
-+ oa_tc6_write_register(tc6, OA_TC6_REG_STATUS0, regval);
-+ dev_err(&tc6->spi->dev, "Device interrupt disabled to avoid interrupt storm");
-+}
-+
- static int oa_tc6_process_extended_status(struct oa_tc6 *tc6)
- {
- u32 value;
-@@ -1105,29 +1139,29 @@ static int oa_tc6_try_spi_transfer(struct oa_tc6 *tc6)
- return 0;
- }
-
--static int oa_tc6_spi_thread_handler(void *data)
-+static irqreturn_t oa_tc6_macphy_threaded_irq(int irq, void *data)
- {
- struct oa_tc6 *tc6 = data;
-- int ret;
--
-- while (likely(!kthread_should_stop())) {
-- /* This kthread will be waken up if there is a tx skb or mac-phy
-- * interrupt to perform spi transfer with tx chunks.
-- */
-- wait_event_interruptible(tc6->spi_wq, tc6->int_flag ||
-- (tc6->waiting_tx_skb &&
-- tc6->tx_credits) ||
-- kthread_should_stop());
--
-- if (kthread_should_stop())
-- break;
-+ int ret = 0;
-
-- ret = oa_tc6_try_spi_transfer(tc6);
-- if (ret)
-- return ret;
-+ /* It is possible that interrupt woke the thread before it is
-+ * disabled. Until we come up with good recovery mechanism,
-+ * no need to attempt spi transfer, once it fails. Pending skbs
-+ * are already freed.
-+ */
-+ if (!tc6->disable_traffic) {
-+ while (tc6->int_flag ||
-+ (tc6->waiting_tx_skb && tc6->tx_credits)) {
-+ ret = oa_tc6_try_spi_transfer(tc6);
-+ if (ret) {
-+ disable_irq_nosync(tc6->spi->irq);
-+ oa_tc6_disable_traffic(tc6);
-+ break;
-+ }
-+ }
- }
-
-- return 0;
-+ return IRQ_HANDLED;
- }
-
- static int oa_tc6_update_buffer_status_from_register(struct oa_tc6 *tc6)
-@@ -1161,11 +1195,15 @@ static irqreturn_t oa_tc6_macphy_isr(int irq, void *data)
- * the previous rx footer.
- * - extended status event not reported in the previous rx footer.
- */
-- tc6->int_flag = true;
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
--
-- return IRQ_HANDLED;
-+ if (tc6->disable_traffic)
-+ disable_irq_nosync(tc6->spi->irq);
-+ else
-+ tc6->int_flag = true;
-+ /* Wake IRQ thread to perform spi transfer . In case
-+ * disable_traffic is set, threaded irq may run again
-+ * one more time.
-+ */
-+ return IRQ_WAKE_THREAD;
- }
-
- /**
-@@ -1202,7 +1240,7 @@ EXPORT_SYMBOL_GPL(oa_tc6_zero_align_receive_frame_enable);
- */
- netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- {
-- if (tc6->waiting_tx_skb) {
-+ if (tc6->disable_traffic || tc6->waiting_tx_skb) {
- netif_stop_queue(tc6->netdev);
- return NETDEV_TX_BUSY;
- }
-@@ -1217,8 +1255,8 @@ netdev_tx_t oa_tc6_start_xmit(struct oa_tc6 *tc6, struct sk_buff *skb)
- tc6->waiting_tx_skb = skb;
- spin_unlock_bh(&tc6->tx_skb_lock);
-
-- /* Wake spi kthread to perform spi transfer */
-- wake_up_interruptible(&tc6->spi_wq);
-+ /* Wake the threaded IRQ to perform spi transfer. */
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return NETDEV_TX_OK;
- }
-@@ -1311,24 +1349,15 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- goto phy_exit;
- }
-
-- init_waitqueue_head(&tc6->spi_wq);
--
-- tc6->spi_thread = kthread_run(oa_tc6_spi_thread_handler, tc6,
-- "oa-tc6-spi-thread");
-- if (IS_ERR(tc6->spi_thread)) {
-- dev_err(&tc6->spi->dev, "Failed to create SPI thread\n");
-- goto phy_exit;
-- }
--
-- sched_set_fifo(tc6->spi_thread);
--
-- ret = devm_request_irq(&tc6->spi->dev, tc6->spi->irq, oa_tc6_macphy_isr,
-- IRQF_TRIGGER_FALLING, dev_name(&tc6->spi->dev),
-- tc6);
-+ ret = devm_request_threaded_irq(&tc6->spi->dev, tc6->spi->irq,
-+ oa_tc6_macphy_isr,
-+ oa_tc6_macphy_threaded_irq,
-+ IRQF_TRIGGER_LOW | IRQF_ONESHOT,
-+ dev_name(&tc6->spi->dev), tc6);
- if (ret) {
- dev_err(&tc6->spi->dev, "Failed to request macphy isr %d\n",
- ret);
-- goto kthread_stop;
-+ goto phy_exit;
- }
-
- /* oa_tc6_sw_reset_macphy() function resets and clears the MAC-PHY reset
-@@ -1338,12 +1367,10 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
- * 7.7 and 9.2.8.8 in the OPEN Alliance specification for more details.
- */
- tc6->int_flag = true;
-- wake_up_interruptible(&tc6->spi_wq);
-+ irq_wake_thread(tc6->spi->irq, tc6);
-
- return tc6;
-
--kthread_stop:
-- kthread_stop(tc6->spi_thread);
- phy_exit:
- oa_tc6_phy_exit(tc6);
- return NULL;
-@@ -1356,11 +1383,10 @@ EXPORT_SYMBOL_GPL(oa_tc6_init);
- */
- void oa_tc6_exit(struct oa_tc6 *tc6)
- {
-+ tc6->disable_traffic = true;
-+ disable_irq(tc6->spi->irq);
- oa_tc6_phy_exit(tc6);
-- kthread_stop(tc6->spi_thread);
-- dev_kfree_skb_any(tc6->ongoing_tx_skb);
-- dev_kfree_skb_any(tc6->waiting_tx_skb);
-- dev_kfree_skb_any(tc6->rx_skb);
-+ oa_tc6_free_pending_skbs(tc6);
- }
- EXPORT_SYMBOL_GPL(oa_tc6_exit);
-
---
-2.53.0
-
+++ /dev/null
-From f76e4bc5c6292a323db4fdd0395cf57efad5277f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 12 May 2026 13:09:49 +0100
-Subject: rust: pin-init: internal: init: handle code blocks early
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit df1827babd665ea7039383dbc5c671b66a65c1ec ]
-
-`InitializerKind::Code` is a special case where it does not initialize a
-field, and thus generate no guard and accessors. Handle it earlier and make
-the rest of the code more linear.
-
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/init.rs | 100 ++++++++++++++++-------------
- 1 file changed, 55 insertions(+), 45 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/src/init.rs
-index 487ee0013fafee..0e19169d022ad9 100644
---- a/rust/pin-init/internal/src/init.rs
-+++ b/rust/pin-init/internal/src/init.rs
-@@ -238,6 +238,20 @@ fn init_fields(
- cfgs.retain(|attr| attr.path().is_ident("cfg"));
- cfgs
- };
-+
-+ let ident = match kind {
-+ InitializerKind::Value { ident, .. } => ident,
-+ InitializerKind::Init { ident, .. } => ident,
-+ InitializerKind::Code { block, .. } => {
-+ res.extend(quote! {
-+ #(#attrs)*
-+ #[allow(unused_braces)]
-+ #block
-+ });
-+ continue;
-+ }
-+ };
-+
- let init = match kind {
- InitializerKind::Value { ident, value } => {
- let mut value_ident = ident.clone();
-@@ -290,55 +304,51 @@ fn init_fields(
- }
- }
- }
-- InitializerKind::Code { block: value, .. } => quote! {
-- #(#attrs)*
-- #[allow(unused_braces)]
-- #value
-- },
-+ InitializerKind::Code { .. } => unreachable!(),
- };
-- res.extend(init);
-- if let Some(ident) = kind.ident() {
-- // `mixed_site` ensures that the guard is not accessible to the user-controlled code.
-- let guard = format_ident!("__{ident}_guard", span = Span::mixed_site());
-
-- // NOTE: The reference is derived from the guard so that it only lives as long as the
-- // guard does and cannot escape the scope. If it's created via `&mut (*#slot).#ident`
-- // like the unaligned field guard, it will become effectively `'static`.
-- let accessor = if pinned {
-- let project_ident = format_ident!("__project_{ident}");
-- quote! {
-- // SAFETY: the initialization is pinned.
-- unsafe { #data.#project_ident(#guard.let_binding()) }
-- }
-- } else {
-- quote! {
-- #guard.let_binding()
-- }
-- };
-+ // `mixed_site` ensures that the guard is not accessible to the user-controlled code.
-+ let guard = format_ident!("__{ident}_guard", span = Span::mixed_site());
-
-- res.extend(quote! {
-- #(#cfgs)*
-- // Create the drop guard.
-- //
-- // SAFETY:
-- // - `&raw mut (*slot).#ident` is valid.
-- // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-- // - `(*slot).#ident` has been initialized above.
-- // - We only need the ownership to the pointee back when initialization has
-- // succeeded, where we `forget` the guard.
-- let mut #guard = unsafe {
-- ::pin_init::__internal::DropGuard::new(
-- &raw mut (*slot).#ident
-- )
-- };
-+ // NOTE: The reference is derived from the guard so that it only lives as long as the
-+ // guard does and cannot escape the scope. If it's created via `&mut (*#slot).#ident`
-+ // like the unaligned field guard, it will become effectively `'static`.
-+ let accessor = if pinned {
-+ let project_ident = format_ident!("__project_{ident}");
-+ quote! {
-+ // SAFETY: the initialization is pinned.
-+ unsafe { #data.#project_ident(#guard.let_binding()) }
-+ }
-+ } else {
-+ quote! {
-+ #guard.let_binding()
-+ }
-+ };
-
-- #(#cfgs)*
-- #[allow(unused_variables)]
-- let #ident = #accessor;
-- });
-- guards.push(guard);
-- guard_attrs.push(cfgs);
-- }
-+ res.extend(quote! {
-+ #init
-+
-+ #(#cfgs)*
-+ // Create the drop guard.
-+ //
-+ // SAFETY:
-+ // - `&raw mut (*slot).#ident` is valid.
-+ // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-+ // - `(*slot).#ident` has been initialized above.
-+ // - We only need the ownership to the pointee back when initialization has
-+ // succeeded, where we `forget` the guard.
-+ let mut #guard = unsafe {
-+ ::pin_init::__internal::DropGuard::new(
-+ &raw mut (*slot).#ident
-+ )
-+ };
-+
-+ #(#cfgs)*
-+ #[allow(unused_variables)]
-+ let #ident = #accessor;
-+ });
-+ guards.push(guard);
-+ guard_attrs.push(cfgs);
- }
- quote! {
- #res
---
-2.53.0
-
+++ /dev/null
-From a678f28fb047cb3ba52191615ec0f0f09ad9ce86 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 12 May 2026 13:09:47 +0100
-Subject: rust: pin-init: internal: pin_data: add struct to record field info
-
-From: Mohamad Alsadhan <mo@sdhn.cc>
-
-[ Upstream commit 4b60f38cd2a4b2d3288377f25100f8d67015988a ]
-
-Introduce `FieldInfo` struct to encapsulate field and other relevant data,
-instead of carrying a pair of `(pinned, field)` in all places. This allows
-us to add more information to the struct in the future.
-
-Signed-off-by: Mohamad Alsadhan <mo@sdhn.cc>
-Co-developed-by: Gary Guo <gary@garyguo.net>
-Link: https://patch.msgid.link/20260512-pin-init-sync-v1-2-81963130dfbd@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/pin_data.rs | 53 ++++++++++++++++----------
- 1 file changed, 32 insertions(+), 21 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 93976d4f50a285..7e529fc4d276ef 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -35,6 +35,11 @@ impl Parse for Args {
- }
- }
-
-+struct FieldInfo<'a> {
-+ field: &'a Field,
-+ pinned: bool,
-+}
-+
- pub(crate) fn pin_data(
- args: Args,
- input: Item,
-@@ -73,24 +78,30 @@ pub(crate) fn pin_data(
- replacer.visit_generics_mut(&mut struct_.generics);
- replacer.visit_fields_mut(&mut struct_.fields);
-
-- let fields: Vec<(bool, &Field)> = struct_
-+ let fields: Vec<FieldInfo<'_>> = struct_
- .fields
- .iter_mut()
- .map(|field| {
- let len = field.attrs.len();
- field.attrs.retain(|a| !a.path().is_ident("pin"));
-- (len != field.attrs.len(), &*field)
-+ let pinned = len != field.attrs.len();
-+
-+ FieldInfo {
-+ field: &*field,
-+ pinned,
-+ }
- })
- .collect();
-
-- for (pinned, field) in &fields {
-- if !pinned && is_phantom_pinned(&field.ty) {
-+ for field in &fields {
-+ let ident = field.field.ident.as_ref().unwrap();
-+
-+ if !field.pinned && is_phantom_pinned(&field.field.ty) {
- dcx.warn(
-- field,
-+ field.field,
- format!(
-- "The field `{}` of type `PhantomPinned` only has an effect \
-+ "The field `{ident}` of type `PhantomPinned` only has an effect \
- if it has the `#[pin]` attribute",
-- field.ident.as_ref().unwrap(),
- ),
- );
- }
-@@ -143,7 +154,7 @@ fn is_phantom_pinned(ty: &Type) -> bool {
- fn generate_unpin_impl(
- ident: &Ident,
- generics: &Generics,
-- fields: &[(bool, &Field)],
-+ fields: &[FieldInfo<'_>],
- ) -> TokenStream {
- let (_, ty_generics, _) = generics.split_for_impl();
- let mut generics_with_pin_lt = generics.clone();
-@@ -160,7 +171,7 @@ fn generate_unpin_impl(
- else {
- unreachable!()
- };
-- let pinned_fields = fields.iter().filter_map(|(b, f)| b.then_some(f));
-+ let pinned_fields = fields.iter().filter(|f| f.pinned).map(|f| f.field);
- quote! {
- // This struct will be used for the unpin analysis. It is needed, because only structurally
- // pinned fields are relevant whether the struct should implement `Unpin`.
-@@ -238,7 +249,7 @@ fn generate_projections(
- vis: &Visibility,
- ident: &Ident,
- generics: &Generics,
-- fields: &[(bool, &Field)],
-+ fields: &[FieldInfo<'_>],
- ) -> TokenStream {
- let (impl_generics, ty_generics, _) = generics.split_for_impl();
- let mut generics_with_pin_lt = generics.clone();
-@@ -249,21 +260,21 @@ fn generate_projections(
-
- let (fields_decl, fields_proj): (Vec<_>, Vec<_>) = fields
- .iter()
-- .map(|(pinned, field)| {
-+ .map(|field| {
- let Field {
- vis,
- ident,
- ty,
- attrs,
- ..
-- } = field;
-+ } = &field.field;
-
- let mut no_doc_attrs = attrs.clone();
- no_doc_attrs.retain(|a| !a.path().is_ident("doc"));
- let ident = ident
- .as_ref()
- .expect("only structs with named fields are supported");
-- if *pinned {
-+ if field.pinned {
- (
- quote!(
- #(#attrs)*
-@@ -291,12 +302,12 @@ fn generate_projections(
- .collect();
- let structurally_pinned_fields_docs = fields
- .iter()
-- .filter_map(|(pinned, field)| pinned.then_some(field))
-- .map(|Field { ident, .. }| format!(" - `{}`", ident.as_ref().unwrap()));
-+ .filter(|f| f.pinned)
-+ .map(|f| format!(" - `{}`", f.field.ident.as_ref().unwrap()));
- let not_structurally_pinned_fields_docs = fields
- .iter()
-- .filter_map(|(pinned, field)| (!pinned).then_some(field))
-- .map(|Field { ident, .. }| format!(" - `{}`", ident.as_ref().unwrap()));
-+ .filter(|f| !f.pinned)
-+ .map(|f| format!(" - `{}`", f.field.ident.as_ref().unwrap()));
- let docs = format!(" Pin-projections of [`{ident}`]");
- quote! {
- #[doc = #docs]
-@@ -336,7 +347,7 @@ fn generate_the_pin_data(
- vis: &Visibility,
- struct_name: &Ident,
- generics: &Generics,
-- fields: &[(bool, &Field)],
-+ fields: &[FieldInfo<'_>],
- ) -> TokenStream {
- let (impl_generics, ty_generics, whr) = generics.split_for_impl();
-
-@@ -347,20 +358,20 @@ fn generate_the_pin_data(
- // The functions are `unsafe` to prevent accidentally calling them.
- let field_accessors = fields
- .iter()
-- .map(|(pinned, field)| {
-+ .map(|f| {
- let Field {
- vis,
- ident,
- ty,
- attrs,
- ..
-- } = field;
-+ } = f.field;
-
- let field_name = ident
- .as_ref()
- .expect("only structs with named fields are supported");
- let project_ident = format_ident!("__project_{field_name}");
-- let (init_ty, init_fn, project_ty, project_body, pin_safety) = if *pinned {
-+ let (init_ty, init_fn, project_ty, project_body, pin_safety) = if f.pinned {
- (
- quote!(PinInit),
- quote!(__pinned_init),
---
-2.53.0
-
+++ /dev/null
-From 978a956693152d6a9adb9c35778a64e1dbc578ac Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 12 May 2026 13:09:46 +0100
-Subject: rust: pin-init: internal: pin_data: use closure for `handle_field`
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit 1e648c22abfe448d284314a0d05622a242ba4eac ]
-
-`handle_field` is currently a function, which precludes it from referencing
-things in the scope of the parent function. Given that it's only called
-once, inline its contents to the closure that invokes it instead, so it can
-directly reference `struct_name` without having to pass in as argument.
-
-Link: https://patch.msgid.link/20260512-pin-init-sync-v1-1-81963130dfbd@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/pin_data.rs | 144 ++++++++++++-------------
- 1 file changed, 70 insertions(+), 74 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 3e07b75903cb41..93976d4f50a285 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -334,7 +334,7 @@ fn generate_projections(
-
- fn generate_the_pin_data(
- vis: &Visibility,
-- ident: &Ident,
-+ struct_name: &Ident,
- generics: &Generics,
- fields: &[(bool, &Field)],
- ) -> TokenStream {
-@@ -345,78 +345,74 @@ fn generate_the_pin_data(
- // not structurally pinned, then it can be initialized via `Init`.
- //
- // The functions are `unsafe` to prevent accidentally calling them.
-- fn handle_field(
-- Field {
-- vis,
-- ident,
-- ty,
-- attrs,
-- ..
-- }: &Field,
-- struct_ident: &Ident,
-- pinned: bool,
-- ) -> TokenStream {
-- let ident = ident
-- .as_ref()
-- .expect("only structs with named fields are supported");
-- let project_ident = format_ident!("__project_{ident}");
-- let (init_ty, init_fn, project_ty, project_body, pin_safety) = if pinned {
-- (
-- quote!(PinInit),
-- quote!(__pinned_init),
-- quote!(::core::pin::Pin<&'__slot mut #ty>),
-- // SAFETY: this field is structurally pinned.
-- quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) }),
-- quote!(
-- /// - `slot` will not move until it is dropped, i.e. it will be pinned.
-- ),
-- )
-- } else {
-- (
-- quote!(Init),
-- quote!(__init),
-- quote!(&'__slot mut #ty),
-- quote!(slot),
-- quote!(),
-- )
-- };
-- let slot_safety = format!(
-- " `slot` points at the field `{ident}` inside of `{struct_ident}`, which is pinned.",
-- );
-- quote! {
-- /// # Safety
-- ///
-- /// - `slot` is a valid pointer to uninitialized memory.
-- /// - the caller does not touch `slot` when `Err` is returned, they are only permitted
-- /// to deallocate.
-- #pin_safety
-- #(#attrs)*
-- #vis unsafe fn #ident<E>(
-- self,
-- slot: *mut #ty,
-- init: impl ::pin_init::#init_ty<#ty, E>,
-- ) -> ::core::result::Result<(), E> {
-- // SAFETY: this function has the same safety requirements as the __init function
-- // called below.
-- unsafe { ::pin_init::#init_ty::#init_fn(init, slot) }
-- }
--
-- /// # Safety
-- ///
-- #[doc = #slot_safety]
-- #(#attrs)*
-- #vis unsafe fn #project_ident<'__slot>(
-- self,
-- slot: &'__slot mut #ty,
-- ) -> #project_ty {
-- #project_body
-- }
-- }
-- }
--
- let field_accessors = fields
- .iter()
-- .map(|(pinned, field)| handle_field(field, ident, *pinned))
-+ .map(|(pinned, field)| {
-+ let Field {
-+ vis,
-+ ident,
-+ ty,
-+ attrs,
-+ ..
-+ } = field;
-+
-+ let field_name = ident
-+ .as_ref()
-+ .expect("only structs with named fields are supported");
-+ let project_ident = format_ident!("__project_{field_name}");
-+ let (init_ty, init_fn, project_ty, project_body, pin_safety) = if *pinned {
-+ (
-+ quote!(PinInit),
-+ quote!(__pinned_init),
-+ quote!(::core::pin::Pin<&'__slot mut #ty>),
-+ // SAFETY: this field is structurally pinned.
-+ quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) }),
-+ quote!(
-+ /// - `slot` will not move until it is dropped, i.e. it will be pinned.
-+ ),
-+ )
-+ } else {
-+ (
-+ quote!(Init),
-+ quote!(__init),
-+ quote!(&'__slot mut #ty),
-+ quote!(slot),
-+ quote!(),
-+ )
-+ };
-+ let slot_safety = format!(
-+ " `slot` points at the field `{field_name}` inside of `{struct_name}`, which is pinned.",
-+ );
-+ quote! {
-+ /// # Safety
-+ ///
-+ /// - `slot` is a valid pointer to uninitialized memory.
-+ /// - the caller does not touch `slot` when `Err` is returned, they are only
-+ /// permitted to deallocate.
-+ #pin_safety
-+ #(#attrs)*
-+ #vis unsafe fn #field_name<E>(
-+ self,
-+ slot: *mut #ty,
-+ init: impl ::pin_init::#init_ty<#ty, E>,
-+ ) -> ::core::result::Result<(), E> {
-+ // SAFETY: this function has the same safety requirements as the __init function
-+ // called below.
-+ unsafe { ::pin_init::#init_ty::#init_fn(init, slot) }
-+ }
-+
-+ /// # Safety
-+ ///
-+ #[doc = #slot_safety]
-+ #(#attrs)*
-+ #vis unsafe fn #project_ident<'__slot>(
-+ self,
-+ slot: &'__slot mut #ty,
-+ ) -> #project_ty {
-+ #project_body
-+ }
-+ }
-+ })
- .collect::<TokenStream>();
- quote! {
- // We declare this struct which will host all of the projection function for our type. It
-@@ -426,7 +422,7 @@ fn generate_the_pin_data(
- #whr
- {
- __phantom: ::core::marker::PhantomData<
-- fn(#ident #ty_generics) -> #ident #ty_generics
-+ fn(#struct_name #ty_generics) -> #struct_name #ty_generics
- >,
- }
-
-@@ -450,7 +446,7 @@ fn generate_the_pin_data(
-
- // SAFETY: We have added the correct projection functions above to `__ThePinData` and
- // we also use the least restrictive generics possible.
-- unsafe impl #impl_generics ::pin_init::__internal::HasPinData for #ident #ty_generics
-+ unsafe impl #impl_generics ::pin_init::__internal::HasPinData for #struct_name #ty_generics
- #whr
- {
- type PinData = __ThePinData #ty_generics;
-@@ -464,7 +460,7 @@ fn generate_the_pin_data(
- unsafe impl #impl_generics ::pin_init::__internal::PinData for __ThePinData #ty_generics
- #whr
- {
-- type Datee = #ident #ty_generics;
-+ type Datee = #struct_name #ty_generics;
- }
- }
- }
---
-2.53.0
-
+++ /dev/null
-From 30dbb1fbdb3a094e0f162443771ce8d219210e00 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 12 May 2026 13:09:52 +0100
-Subject: rust: pin-init: internal: project slots instead of references
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit 5483a97dd2dfcaf8540dba0a80b68a400c4c1861 ]
-
-By projecting slots, the `pin_init!` and `init!` code path can be more
-unified. This also reduces the amount of macro-generated code and shifts
-them to the shared infrastructure.
-
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/init.rs | 113 ++++++++-----------------
- rust/pin-init/internal/src/pin_data.rs | 54 +++---------
- rust/pin-init/src/__internal.rs | 77 +++++++++++++++++
- rust/pin-init/src/lib.rs | 12 +--
- 4 files changed, 133 insertions(+), 123 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/src/init.rs
-index 025cc9405470bc..aba32825fef477 100644
---- a/rust/pin-init/internal/src/init.rs
-+++ b/rust/pin-init/internal/src/init.rs
-@@ -1,7 +1,7 @@
- // SPDX-License-Identifier: Apache-2.0 OR MIT
-
- use proc_macro2::{Span, TokenStream};
--use quote::{format_ident, quote, quote_spanned};
-+use quote::{format_ident, quote};
- use syn::{
- braced,
- parse::{End, Parse},
-@@ -252,102 +252,61 @@ fn init_fields(
- }
- };
-
-- let init = match kind {
-- InitializerKind::Value { ident, value } => {
-- let mut value_ident = ident.clone();
-- let value_prep = value.as_ref().map(|value| &value.1).map(|value| {
-- // Setting the span of `value_ident` to `value`'s span improves error messages
-- // when the type of `value` is wrong.
-- value_ident.set_span(value.span());
-- quote!(let #value_ident = #value;)
-- });
-- // Again span for better diagnostics
-- let write = quote_spanned!(ident.span()=> ::core::ptr::write);
-- quote! {
-- #(#attrs)*
-- {
-- #value_prep
-- // SAFETY: TODO
-- unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
-- }
-- }
-- }
-- InitializerKind::Init { ident, value, .. } => {
-- // Again span for better diagnostics
-- let init = format_ident!("init", span = value.span());
-- let value_init = if pinned {
-- quote! {
-- // SAFETY:
-- // - `slot` is valid, because we are inside of an initializer closure, we
-- // return when an error/panic occurs.
-- // - We also use `#data` to require the correct trait (`Init` or `PinInit`)
-- // for `#ident`.
-- unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
-- }
-- } else {
-- quote! {
-- // SAFETY: `slot` is valid, because we are inside of an initializer
-- // closure, we return when an error/panic occurs.
-- unsafe {
-- ::pin_init::Init::__init(
-- #init,
-- &raw mut (*#slot).#ident,
-- )?
-- };
-- }
-- };
-- quote! {
-- #(#attrs)*
-- {
-- let #init = #value;
-- #value_init
-- }
-- }
-- }
-- InitializerKind::Code { .. } => unreachable!(),
-- };
--
-- // `mixed_site` ensures that the guard is not accessible to the user-controlled code.
-- let guard = format_ident!("__{ident}_guard", span = Span::mixed_site());
--
-- let guard_creation = if pinned {
-- let project_ident = format_ident!("__project_{ident}");
-+ let slot = if pinned {
- quote! {
- // SAFETY:
- // - `&raw mut (*slot).#ident` points to the `#ident` field of `slot`.
- // - `&raw mut (*slot).#ident` is valid.
- // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-- // - `(*slot).#ident` has been initialized above.
-- // - We only need the ownership to the pointee back when initialization has
-- // succeeded, where we `forget` the guard.
-- unsafe { #data.#project_ident(&raw mut (*slot).#ident) }
-+ // - `make_field_check` prevents `#ident` from being used twice, therefore
-+ // `(*slot).#ident` is exclusively accessed and has not been initialized.
-+ (unsafe { #data.#ident(&raw mut (*#slot).#ident) })
- }
- } else {
- quote! {
-+ // For `init!()` macro, everything is unpinned.
- // SAFETY:
- // - `&raw mut (*slot).#ident` is valid.
- // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-- // - `(*slot).#ident` has been initialized above.
-- // - We only need the ownership to the pointee back when initialization has
-- // succeeded, where we `forget` the guard.
-- unsafe {
-- ::pin_init::__internal::DropGuard::<::pin_init::__internal::Unpinned, _>::new(
-- &raw mut (*slot).#ident
-+ // - `make_field_check` prevents `#ident` from being used twice, therefore
-+ // `(*slot).#ident` is exclusively accessed and has not been initialized.
-+ (unsafe {
-+ ::pin_init::__internal::Slot::<::pin_init::__internal::Unpinned, _>::new(
-+ &raw mut (*#slot).#ident
- )
-+ })
-+ }
-+ };
-+
-+ // `mixed_site` ensures that the guard is not accessible to the user-controlled code.
-+ let guard = format_ident!("__{ident}_guard", span = Span::mixed_site());
-+
-+ let init = match kind {
-+ InitializerKind::Value { ident, value } => {
-+ let value = value
-+ .as_ref()
-+ .map(|(_, value)| quote!(#value))
-+ .unwrap_or_else(|| quote!(#ident));
-+
-+ quote! {
-+ #(#attrs)*
-+ let mut #guard = #slot.write(#value);
-+
- }
- }
-+ InitializerKind::Init { value, .. } => {
-+ quote! {
-+ #(#attrs)*
-+ let mut #guard = #slot.init(#value)?;
-+ }
-+ }
-+ InitializerKind::Code { .. } => unreachable!(),
- };
-
- res.extend(quote! {
- #init
-
- #(#cfgs)*
-- let mut #guard = #guard_creation;
--
-- #(#cfgs)*
-- // NOTE: The reference is derived from the guard so that it only lives as long as the
-- // guard does and cannot escape the scope. If it's created via `&mut (*#slot).#ident`
-- // like the unaligned field guard, it will become effectively `'static`.
- #[allow(unused_variables)]
- let #ident = #guard.let_binding();
- });
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 86130db2ee9b73..31584152b06216 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -352,10 +352,9 @@ fn generate_the_pin_data(
- let (impl_generics, ty_generics, whr) = generics.split_for_impl();
-
- // For every field, we create an initializing projection function according to its projection
-- // type. If a field is structurally pinned, then it must be initialized via `PinInit`, if it is
-- // not structurally pinned, then it can be initialized via `Init`.
-- //
-- // The functions are `unsafe` to prevent accidentally calling them.
-+ // type. If a field is structurally pinned, we create a `Slot` with `Pinned` which must be
-+ // initialized via `PinInit`; if it is not structurally pinned, then we create a `Slot` with
-+ // `Unpinned` which allows initialization via `Init`.
- let field_accessors = fields
- .iter()
- .map(|f| {
-@@ -370,54 +369,29 @@ fn generate_the_pin_data(
- let field_name = ident
- .as_ref()
- .expect("only structs with named fields are supported");
-- let project_ident = format_ident!("__project_{field_name}");
-- let (init_ty, init_fn, pin_marker, pin_safety) = if f.pinned {
-- (
-- quote!(PinInit),
-- quote!(__pinned_init),
-- quote!(Pinned),
-- quote!(
-- /// - `slot` will not move until it is dropped, i.e. it will be pinned.
-- ),
-- )
-+ let pin_marker = if f.pinned {
-+ quote!(Pinned)
- } else {
-- (quote!(Init), quote!(__init), quote!(Unpinned), quote!())
-+ quote!(Unpinned)
- };
- quote! {
- /// # Safety
- ///
-- /// - `slot` is a valid pointer to uninitialized memory.
-- /// - the caller does not touch `slot` when `Err` is returned, they are only
-- /// permitted to deallocate.
-- #pin_safety
-- #(#attrs)*
-- #vis unsafe fn #field_name<E>(
-- self,
-- slot: *mut #ty,
-- init: impl ::pin_init::#init_ty<#ty, E>,
-- ) -> ::core::result::Result<(), E> {
-- // SAFETY: this function has the same safety requirements as the __init function
-- // called below.
-- unsafe { ::pin_init::#init_ty::#init_fn(init, slot) }
-- }
--
-- /// # Safety
-- ///
-- /// - `slot` points to a `#ident` field of a pinned struct that this `__ThePinData`
-- /// describes.
-- /// - `slot` is valid and properly aligned.
-- /// - `*slot` is initialized, and the ownership is transferred to the returned
-- /// guard.
-+ /// - `slot` points to a `#field_name` field of a pinned struct that this
-+ /// `__ThePinData` describes.
-+ /// - `slot` is a valid, properly aligned and points to uninitialized and
-+ /// exclusively accessed memory.
- #(#attrs)*
-- #vis unsafe fn #project_ident(
-+ #[inline(always)]
-+ #vis unsafe fn #field_name(
- self,
- slot: *mut #ty,
-- ) -> ::pin_init::__internal::DropGuard<::pin_init::__internal::#pin_marker, #ty> {
-+ ) -> ::pin_init::__internal::Slot<::pin_init::__internal::#pin_marker, #ty> {
- // SAFETY:
- // - If `#pin_marker` is `Pinned`, the corresponding field is structurally
- // pinned.
- // - Other safety requirements follows the safety requirement.
-- unsafe { ::pin_init::__internal::DropGuard::new(slot) }
-+ unsafe { ::pin_init::__internal::Slot::new(slot) }
- }
- }
- })
-diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal.rs
-index 855acc67273139..879bc2307f7c0f 100644
---- a/rust/pin-init/src/__internal.rs
-+++ b/rust/pin-init/src/__internal.rs
-@@ -239,6 +239,83 @@ fn stack_init_reuse() {
- pub struct Pinned;
- pub struct Unpinned;
-
-+/// Represent an uninitialized field.
-+///
-+/// # Invariants
-+///
-+/// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed memory.
-+/// - If `P` is `Pinned`, then `ptr` is structurally pinned.
-+pub struct Slot<P, T: ?Sized> {
-+ ptr: *mut T,
-+ _phantom: PhantomData<P>,
-+}
-+
-+impl<P, T: ?Sized> Slot<P, T> {
-+ /// # Safety
-+ ///
-+ /// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed
-+ /// memory.
-+ /// - If `P` is `Pinned`, then `ptr` is structurally pinned.
-+ #[inline(always)]
-+ pub unsafe fn new(ptr: *mut T) -> Self {
-+ // INVARIANT: Per safety requirement.
-+ Self {
-+ ptr,
-+ _phantom: PhantomData,
-+ }
-+ }
-+
-+ /// Initialize the field by value.
-+ #[inline(always)]
-+ pub fn write(self, value: T) -> DropGuard<P, T>
-+ where
-+ T: Sized,
-+ {
-+ // SAFETY: `self.ptr` is a valid and aligned pointer for write.
-+ unsafe { self.ptr.write(value) }
-+ // SAFETY:
-+ // - `self.ptr` is valid and properly aligned per type invariant.
-+ // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
-+ // - If `P` is `Pinned`, `self.ptr` is pinned.
-+ unsafe { DropGuard::new(self.ptr) }
-+ }
-+}
-+
-+impl<T: ?Sized> Slot<Unpinned, T> {
-+ /// Initialize the field.
-+ #[inline(always)]
-+ pub fn init<E>(self, init: impl Init<T, E>) -> Result<DropGuard<Unpinned, T>, E> {
-+ // SAFETY:
-+ // - `self.ptr` is valid and properly aligned.
-+ // - when `Err` is returned, we also propagate the error without touching `slot`;
-+ // also `self` is consumed so it cannot be touched further.
-+ unsafe { init.__init(self.ptr)? };
-+
-+ // SAFETY:
-+ // - `self.ptr` is valid and properly aligned per type invariant.
-+ // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
-+ Ok(unsafe { DropGuard::new(self.ptr) })
-+ }
-+}
-+
-+impl<T: ?Sized> Slot<Pinned, T> {
-+ /// Initialize the field.
-+ #[inline(always)]
-+ pub fn init<E>(self, init: impl PinInit<T, E>) -> Result<DropGuard<Pinned, T>, E> {
-+ // SAFETY:
-+ // - `self.ptr` is valid and properly aligned.
-+ // - when `Err` is returned, we also propagate the error without touching `ptr`;
-+ // also `self` is consumed so it cannot be touched further.
-+ // - the drop guard will not hand out `&mut` (only `Pin<&mut T>`).
-+ unsafe { init.__pinned_init(self.ptr)? };
-+
-+ // SAFETY:
-+ // - `self.ptr` is valid, properly aligned and pinned per type invariant.
-+ // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
-+ Ok(unsafe { DropGuard::new(self.ptr) })
-+ }
-+}
-+
- /// When a value of this type is dropped, it drops a `T`.
- ///
- /// Can be forgotten to prevent the drop.
-diff --git a/rust/pin-init/src/lib.rs b/rust/pin-init/src/lib.rs
-index 64eec095c859c0..06e67de0d69feb 100644
---- a/rust/pin-init/src/lib.rs
-+++ b/rust/pin-init/src/lib.rs
-@@ -873,12 +873,12 @@ pub use pin_init_internal::init;
- #[macro_export]
- macro_rules! assert_pinned {
- ($ty:ty, $field:ident, $field_ty:ty, inline) => {
-- let _ = move |ptr: *mut $field_ty| {
-- // SAFETY: This code is unreachable.
-- let data = unsafe { <$ty as $crate::__internal::HasPinData>::__pin_data() };
-- let init = $crate::__internal::AlwaysFail::<$field_ty>::new();
-- // SAFETY: This code is unreachable.
-- unsafe { data.$field(ptr, init) }.ok();
-+ // SAFETY: This code is unreachable.
-+ let _ = move |ptr: *mut $field_ty| unsafe {
-+ let data = <$ty as $crate::__internal::HasPinData>::__pin_data();
-+ _ = data
-+ .$field(ptr)
-+ .init($crate::__internal::AlwaysFail::<$field_ty>::new());
- };
- };
-
---
-2.53.0
-
+++ /dev/null
-From 44c55d989c24146d2a12dff63a1550012c4c0db7 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 1 May 2026 14:44:45 +0100
-Subject: rust: pin-init: internal: remove `collect_tuple` polyfill after MSRV
- bump
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit faed81945d0bfcced81a2738d9681a265d41079a ]
-
-Tuples implement `FromIterator` since Rust 1.79. Remove the `collect_tuple`
-polyfill now the MSRV is above 1.79.
-
-To avoid over-identing the closure, I move the `Field` destructure from the
-closure parameter to a let binding. This keeps the diff small.
-
-Link: https://patch.msgid.link/20260501134445.3809731-1-gary@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/pin_data.rs | 27 ++++++++------------------
- 1 file changed, 8 insertions(+), 19 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 2971e4f303828c..3e07b75903cb41 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -247,17 +247,17 @@ fn generate_projections(
- let projection = format_ident!("{ident}Projection");
- let this = format_ident!("this");
-
-- let (fields_decl, fields_proj) = collect_tuple(fields.iter().map(
-- |(
-- pinned,
-- Field {
-+ let (fields_decl, fields_proj): (Vec<_>, Vec<_>) = fields
-+ .iter()
-+ .map(|(pinned, field)| {
-+ let Field {
- vis,
- ident,
- ty,
- attrs,
- ..
-- },
-- )| {
-+ } = field;
-+
- let mut no_doc_attrs = attrs.clone();
- no_doc_attrs.retain(|a| !a.path().is_ident("doc"));
- let ident = ident
-@@ -287,8 +287,8 @@ fn generate_projections(
- ),
- )
- }
-- },
-- ));
-+ })
-+ .collect();
- let structurally_pinned_fields_docs = fields
- .iter()
- .filter_map(|(pinned, field)| pinned.then_some(field))
-@@ -496,14 +496,3 @@ impl VisitMut for SelfReplacer {
- // Do not descend into items, since items reset/change what `Self` refers to.
- }
- }
--
--// replace with `.collect()` once MSRV is above 1.79
--fn collect_tuple<A, B>(iter: impl Iterator<Item = (A, B)>) -> (Vec<A>, Vec<B>) {
-- let mut res_a = vec![];
-- let mut res_b = vec![];
-- for (a, b) in iter {
-- res_a.push(a);
-- res_b.push(b);
-- }
-- (res_a, res_b)
--}
---
-2.53.0
-
+++ /dev/null
-From 6f71978b7a77894d2eda9aa9be746d6bb873711e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 28 Apr 2026 14:10:55 +0100
-Subject: rust: pin-init: internal: remove redundant `#[pin]` filtering
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit c64c793d9a162768a78f98f99774b5df6d360d0b ]
-
-The `generate_projections` and `generate_the_pin_data` function already
-receive filtered field lists, they do not need to filter out `#[pin]`
-again.
-
-Reviewed-by: Benno Lossin <lossin@kernel.org>
-Link: https://patch.msgid.link/20260428-pin-init-sync-v1-6-07f9bd3859fb@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/pin_data.rs | 4 ----
- 1 file changed, 4 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 7d871236b49c7e..db32c90b84519b 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -258,8 +258,6 @@ fn generate_projections(
- ..
- },
- )| {
-- let mut attrs = attrs.clone();
-- attrs.retain(|a| !a.path().is_ident("pin"));
- let mut no_doc_attrs = attrs.clone();
- no_doc_attrs.retain(|a| !a.path().is_ident("doc"));
- let ident = ident
-@@ -358,8 +356,6 @@ fn generate_the_pin_data(
- struct_ident: &Ident,
- pinned: bool,
- ) -> TokenStream {
-- let mut attrs = attrs.clone();
-- attrs.retain(|a| !a.path().is_ident("pin"));
- let ident = ident
- .as_ref()
- .expect("only structs with named fields are supported");
---
-2.53.0
-
+++ /dev/null
-From 54db70c2ed9fb176f2f097a04c55b67071dc0db7 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 27 May 2026 18:19:54 +0100
-Subject: rust: pin-init: internal: suppress `non_snake_case` lint in
- `[pin_]init!`
-
-From: Mirko Adzic <adzicmirko97@gmail.com>
-
-[ Upstream commit 5423ef9d4db852835746001d0840231227bb0e39 ]
-
-Allows `non_snake_case` lint on local variables generated in `[pin_]init!`.
-
-Conceptually the identifiers in `[pin_]init!` just references the field
-names, and are not defining them, so the warning should not be generated,
-similar to how constructing a struct with non-snake-case field names do no
-generate these warnings.
-
-Reported-by: Gary Guo <gary@garyguo.net>
-Closes: https://github.com/Rust-for-Linux/pin-init/issues/125
-Closes: https://lore.kernel.org/rust-for-linux/DGTBJBIVFZ2K.2F1ZEFGY0G7NK@garyguo.net/
-Fixes: 42415d163e5d ("rust: pin-init: add references to previously initialized fields")
-Signed-off-by: Mirko Adzic <adzicmirko97@gmail.com>
-[ Reworded commit message - Gary ]
-Link: https://patch.msgid.link/20260527-pin-init-sync-v1-3-e20335ed2501@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/init.rs | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/src/init.rs
-index aba32825fef477..45528ab82f6a82 100644
---- a/rust/pin-init/internal/src/init.rs
-+++ b/rust/pin-init/internal/src/init.rs
-@@ -307,7 +307,9 @@ fn init_fields(
- #init
-
- #(#cfgs)*
-- #[allow(unused_variables)]
-+ // Allow `non_snake_case` since the same warning is going to be reported for the struct
-+ // field.
-+ #[allow(unused_variables, non_snake_case)]
- let #ident = #guard.let_binding();
- });
-
---
-2.53.0
-
+++ /dev/null
-From cde5c6418a785071df4fdb205d440d24bc839726 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 28 Apr 2026 14:10:59 +0100
-Subject: rust: pin-init: internal: turn `PhantomPinned` error into warnings
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit e5cece935531997cd9903c129cc9a2471ed05a4b ]
-
-The `PhantomPinned` detection is just a lint, and is emitted as an error
-because there is no `compile_warning!()` macro, and
-`proc-macro-diagnostics` is not stable.
-
-Use of `#[deprecated = ""]` attribute to approximate custom proc-macro
-warnings. A new line is added before message for visual clarity.
-
-An example warning with this trick looks like this:
-
- warning: use of deprecated function `_::warn`:
- The field `pin` of type `PhantomPinned` only has an effect if it has the `#[pin]` attribute
- --> test.rs:9:5
- |
- 9 | pin: marker::PhantomPinned,
- | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Suggested-by: Benno Lossin <lossin@kernel.org>
-Link: https://github.com/Rust-for-Linux/pin-init/issues/51
-Link: https://patch.msgid.link/20260428-pin-init-sync-v1-10-07f9bd3859fb@garyguo.net
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/diagnostics.rs | 14 ++++++++++++++
- rust/pin-init/internal/src/pin_data.rs | 2 +-
- 2 files changed, 15 insertions(+), 1 deletion(-)
-
-diff --git a/rust/pin-init/internal/src/diagnostics.rs b/rust/pin-init/internal/src/diagnostics.rs
-index 3bdb477c2f2b8c..c7d9b3e624fc8a 100644
---- a/rust/pin-init/internal/src/diagnostics.rs
-+++ b/rust/pin-init/internal/src/diagnostics.rs
-@@ -3,6 +3,7 @@
- use std::fmt::Display;
-
- use proc_macro2::TokenStream;
-+use quote::quote_spanned;
- use syn::{spanned::Spanned, Error};
-
- pub(crate) struct DiagCtxt(TokenStream);
-@@ -15,6 +16,19 @@ impl DiagCtxt {
- ErrorGuaranteed(())
- }
-
-+ pub(crate) fn warn(&mut self, span: impl Spanned, msg: impl Display) {
-+ // Have the message start on a new line for visual clarity.
-+ let msg = format!("\n{}", msg);
-+ self.0.extend(quote_spanned!(span.span() =>
-+ // Approximate using deprecated warning while `proc_macro_diagnostic` is unstable.
-+ const _: () = {
-+ #[deprecated = #msg]
-+ const fn warn() {}
-+ warn();
-+ };
-+ ));
-+ }
-+
- pub(crate) fn with(
- fun: impl FnOnce(&mut DiagCtxt) -> Result<TokenStream, ErrorGuaranteed>,
- ) -> TokenStream {
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index db32c90b84519b..2971e4f303828c 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -85,7 +85,7 @@ pub(crate) fn pin_data(
-
- for (pinned, field) in &fields {
- if !pinned && is_phantom_pinned(&field.ty) {
-- dcx.error(
-+ dcx.warn(
- field,
- format!(
- "The field `{}` of type `PhantomPinned` only has an effect \
---
-2.53.0
-
+++ /dev/null
-From 8b6b3effce45539265a0b96deeaecaa1bebbe6b3 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 12 May 2026 13:09:50 +0100
-Subject: rust: pin-init: internal: use marker on drop guard type for pinned
- fields
-
-From: Gary Guo <gary@garyguo.net>
-
-[ Upstream commit 27693a56e8a697f78db535aad2d5267f286e1f51 ]
-
-Instead of projecting the created reference, simply create drop guards with
-different marker types and have the `let_binding()` method of guards of
-different marker produce different type instead.
-
-This allows more flexible lifetime as this is now controlled by the guard.
-This will be needed when implementing self-referential fields.
-
-Signed-off-by: Gary Guo <gary@garyguo.net>
-Stable-dep-of: 5423ef9d4db8 ("rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!`")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- rust/pin-init/internal/src/init.rs | 47 ++++++++++++++------------
- rust/pin-init/internal/src/pin_data.rs | 35 +++++++++----------
- rust/pin-init/src/__internal.rs | 30 +++++++++++++---
- 3 files changed, 68 insertions(+), 44 deletions(-)
-
-diff --git a/rust/pin-init/internal/src/init.rs b/rust/pin-init/internal/src/init.rs
-index 0e19169d022ad9..025cc9405470bc 100644
---- a/rust/pin-init/internal/src/init.rs
-+++ b/rust/pin-init/internal/src/init.rs
-@@ -310,18 +310,31 @@ fn init_fields(
- // `mixed_site` ensures that the guard is not accessible to the user-controlled code.
- let guard = format_ident!("__{ident}_guard", span = Span::mixed_site());
-
-- // NOTE: The reference is derived from the guard so that it only lives as long as the
-- // guard does and cannot escape the scope. If it's created via `&mut (*#slot).#ident`
-- // like the unaligned field guard, it will become effectively `'static`.
-- let accessor = if pinned {
-+ let guard_creation = if pinned {
- let project_ident = format_ident!("__project_{ident}");
- quote! {
-- // SAFETY: the initialization is pinned.
-- unsafe { #data.#project_ident(#guard.let_binding()) }
-+ // SAFETY:
-+ // - `&raw mut (*slot).#ident` points to the `#ident` field of `slot`.
-+ // - `&raw mut (*slot).#ident` is valid.
-+ // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-+ // - `(*slot).#ident` has been initialized above.
-+ // - We only need the ownership to the pointee back when initialization has
-+ // succeeded, where we `forget` the guard.
-+ unsafe { #data.#project_ident(&raw mut (*slot).#ident) }
- }
- } else {
- quote! {
-- #guard.let_binding()
-+ // SAFETY:
-+ // - `&raw mut (*slot).#ident` is valid.
-+ // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-+ // - `(*slot).#ident` has been initialized above.
-+ // - We only need the ownership to the pointee back when initialization has
-+ // succeeded, where we `forget` the guard.
-+ unsafe {
-+ ::pin_init::__internal::DropGuard::<::pin_init::__internal::Unpinned, _>::new(
-+ &raw mut (*slot).#ident
-+ )
-+ }
- }
- };
-
-@@ -329,24 +342,16 @@ fn init_fields(
- #init
-
- #(#cfgs)*
-- // Create the drop guard.
-- //
-- // SAFETY:
-- // - `&raw mut (*slot).#ident` is valid.
-- // - `make_field_check` checks that `&raw mut (*slot).#ident` is properly aligned.
-- // - `(*slot).#ident` has been initialized above.
-- // - We only need the ownership to the pointee back when initialization has
-- // succeeded, where we `forget` the guard.
-- let mut #guard = unsafe {
-- ::pin_init::__internal::DropGuard::new(
-- &raw mut (*slot).#ident
-- )
-- };
-+ let mut #guard = #guard_creation;
-
- #(#cfgs)*
-+ // NOTE: The reference is derived from the guard so that it only lives as long as the
-+ // guard does and cannot escape the scope. If it's created via `&mut (*#slot).#ident`
-+ // like the unaligned field guard, it will become effectively `'static`.
- #[allow(unused_variables)]
-- let #ident = #accessor;
-+ let #ident = #guard.let_binding();
- });
-+
- guards.push(guard);
- guard_attrs.push(cfgs);
- }
-diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
-index 7e529fc4d276ef..86130db2ee9b73 100644
---- a/rust/pin-init/internal/src/pin_data.rs
-+++ b/rust/pin-init/internal/src/pin_data.rs
-@@ -371,29 +371,18 @@ fn generate_the_pin_data(
- .as_ref()
- .expect("only structs with named fields are supported");
- let project_ident = format_ident!("__project_{field_name}");
-- let (init_ty, init_fn, project_ty, project_body, pin_safety) = if f.pinned {
-+ let (init_ty, init_fn, pin_marker, pin_safety) = if f.pinned {
- (
- quote!(PinInit),
- quote!(__pinned_init),
-- quote!(::core::pin::Pin<&'__slot mut #ty>),
-- // SAFETY: this field is structurally pinned.
-- quote!(unsafe { ::core::pin::Pin::new_unchecked(slot) }),
-+ quote!(Pinned),
- quote!(
- /// - `slot` will not move until it is dropped, i.e. it will be pinned.
- ),
- )
- } else {
-- (
-- quote!(Init),
-- quote!(__init),
-- quote!(&'__slot mut #ty),
-- quote!(slot),
-- quote!(),
-- )
-+ (quote!(Init), quote!(__init), quote!(Unpinned), quote!())
- };
-- let slot_safety = format!(
-- " `slot` points at the field `{field_name}` inside of `{struct_name}`, which is pinned.",
-- );
- quote! {
- /// # Safety
- ///
-@@ -414,13 +403,21 @@ fn generate_the_pin_data(
-
- /// # Safety
- ///
-- #[doc = #slot_safety]
-+ /// - `slot` points to a `#ident` field of a pinned struct that this `__ThePinData`
-+ /// describes.
-+ /// - `slot` is valid and properly aligned.
-+ /// - `*slot` is initialized, and the ownership is transferred to the returned
-+ /// guard.
- #(#attrs)*
-- #vis unsafe fn #project_ident<'__slot>(
-+ #vis unsafe fn #project_ident(
- self,
-- slot: &'__slot mut #ty,
-- ) -> #project_ty {
-- #project_body
-+ slot: *mut #ty,
-+ ) -> ::pin_init::__internal::DropGuard<::pin_init::__internal::#pin_marker, #ty> {
-+ // SAFETY:
-+ // - If `#pin_marker` is `Pinned`, the corresponding field is structurally
-+ // pinned.
-+ // - Other safety requirements follows the safety requirement.
-+ unsafe { ::pin_init::__internal::DropGuard::new(slot) }
- }
- }
- })
-diff --git a/rust/pin-init/src/__internal.rs b/rust/pin-init/src/__internal.rs
-index 5720a621aed74b..855acc67273139 100644
---- a/rust/pin-init/src/__internal.rs
-+++ b/rust/pin-init/src/__internal.rs
-@@ -235,6 +235,10 @@ fn stack_init_reuse() {
- println!("{value:?}");
- }
-
-+// Marker types that determines type of `DropGuard`'s let bindings.
-+pub struct Pinned;
-+pub struct Unpinned;
-+
- /// When a value of this type is dropped, it drops a `T`.
- ///
- /// Can be forgotten to prevent the drop.
-@@ -243,11 +247,13 @@ fn stack_init_reuse() {
- ///
- /// - `ptr` is valid and properly aligned.
- /// - `*ptr` is initialized and owned by this guard.
--pub struct DropGuard<T: ?Sized> {
-+/// - if `P` is `Pinned`, `ptr` is pinned.
-+pub struct DropGuard<P, T: ?Sized> {
- ptr: *mut T,
-+ phantom: PhantomData<P>,
- }
-
--impl<T: ?Sized> DropGuard<T> {
-+impl<P, T: ?Sized> DropGuard<P, T> {
- /// Creates a drop guard and transfer the ownership of the pointer content.
- ///
- /// The ownership is only relinguished if the guard is forgotten via [`core::mem::forget`].
-@@ -256,12 +262,18 @@ impl<T: ?Sized> DropGuard<T> {
- ///
- /// - `ptr` is valid and properly aligned.
- /// - `*ptr` is initialized, and the ownership is transferred to this guard.
-+ /// - if `P` is `Pinned`, `ptr` is pinned.
- #[inline]
- pub unsafe fn new(ptr: *mut T) -> Self {
- // INVARIANT: By safety requirement.
-- Self { ptr }
-+ Self {
-+ ptr,
-+ phantom: PhantomData,
-+ }
- }
-+}
-
-+impl<T: ?Sized> DropGuard<Unpinned, T> {
- /// Create a let binding for accessor use.
- #[inline]
- pub fn let_binding(&mut self) -> &mut T {
-@@ -270,7 +282,17 @@ impl<T: ?Sized> DropGuard<T> {
- }
- }
-
--impl<T: ?Sized> Drop for DropGuard<T> {
-+impl<T: ?Sized> DropGuard<Pinned, T> {
-+ /// Create a let binding for accessor use.
-+ #[inline]
-+ pub fn let_binding(&mut self) -> Pin<&mut T> {
-+ // SAFETY: `self.ptr` is valid, properly aligned, initialized, exclusively accessible and
-+ // pinned per type invariant.
-+ unsafe { Pin::new_unchecked(&mut *self.ptr) }
-+ }
-+}
-+
-+impl<P, T: ?Sized> Drop for DropGuard<P, T> {
- #[inline]
- fn drop(&mut self) {
- // SAFETY: `self.ptr` is valid, properly aligned and `*self.ptr` is owned by this guard.
---
-2.53.0
-
+++ /dev/null
-From 0ab7d2f2122293e0c78b5c93a1b8013d1d893662 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 29 Apr 2026 17:15:37 +0200
-Subject: scsi: advansys: Drop ISA_DMA_API remnants
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit c7233b3d99db9760daf07c4e95daa9675c6c0cba ]
-
-Support for ISA bus mastering was removed a few years ago, and the VLB
-mode does not use the ISA DMA API, so drop the dependency and the header
-inclusion.
-
-Fixes: 9b4c8eaa68d0 ("advansys: remove ISA support")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
-Link: https://patch.msgid.link/20260429151623.3899875-1-arnd@kernel.org
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 1 -
- drivers/scsi/advansys.c | 1 -
- 2 files changed, 2 deletions(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index fc8e8b0bfa3912..c3042393af234f 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -474,7 +474,6 @@ config SCSI_ADVANSYS
- tristate "AdvanSys SCSI support"
- depends on SCSI
- depends on (ISA || EISA || PCI) && HAS_IOPORT
-- depends on ISA_DMA_API || !ISA
- help
- This is a driver for all SCSI host adapters manufactured by
- AdvanSys. It is documented in the kernel source in
-diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
-index fcf059bf41e855..5cdbf2bdb13df4 100644
---- a/drivers/scsi/advansys.c
-+++ b/drivers/scsi/advansys.c
-@@ -36,7 +36,6 @@
- #include <linux/dmapool.h>
-
- #include <asm/io.h>
--#include <asm/dma.h>
-
- #include <scsi/scsi_cmnd.h>
- #include <scsi/scsi_device.h>
---
-2.53.0
-
soc-xilinx-fix-race-condition-in-event-registration.patch
soc-xilinx-shutdown-and-free-rx-mailbox-channel.patch
pinctrl-mediatek-eint-drop-base-from-mtk_eint_chip_w.patch
-scsi-advansys-drop-isa_dma_api-remnants.patch
wifi-ath9k-fix-oob-access-from-firmware-tx-status-qu.patch
wifi-ath11k-cancel-ssr-work-items-during-pci-shutdow.patch
arm-dts-am335x-sl50-fix-audio-bitclock-and-frame-mas.patch
edac-skx_common-skx-fix-ubsan-shift-out-of-bounds-in.patch
arm64-dts-st-fix-sai-addresses-on-stm32mp251.patch
arm-dts-bcm2711-fix-typo-in-gpio-line-names.patch
-rust-pin-init-internal-remove-redundant-pin-filterin.patch
-rust-pin-init-internal-turn-phantompinned-error-into.patch
-rust-pin-init-internal-remove-collect_tuple-polyfill.patch
-rust-pin-init-internal-pin_data-use-closure-for-hand.patch
-rust-pin-init-internal-pin_data-add-struct-to-record.patch
-rust-pin-init-internal-init-handle-code-blocks-early.patch
-rust-pin-init-internal-use-marker-on-drop-guard-type.patch
-rust-pin-init-internal-project-slots-instead-of-refe.patch
-rust-pin-init-internal-suppress-non_snake_case-lint-.patch
rdma-umem-add-ib_umem_is_contiguous-stub-for-config_.patch
rdma-rxe-fix-toctou-heap-overflow-in-get_srq_wqe.patch
rdma-rxe-copy-wqe-to-local-buffer-in-non-srq-receive.patch
powerpc-powernv-fix-preempt-count-leak-in-pnv_kexec_.patch
powerpc-kexec-fix-double-get_cpu-imbalance-in-kexec_.patch
keys-use-acquire-when-reading-state-in-keyring-searc.patch
-dt-bindings-vendor-prefixes-add-gira.patch
tipc-fix-uaf-in-tipc_l2_send_msg.patch
tcp-ipv6-clamp-default-adverting-mss-to-avoid-gso_by.patch
net-airoha-fix-always-true-condition-in-ppe1-queue-r.patch
net-ti-icssg-prueth-fix-af_xdp-fill-ring-alloc-and-w.patch
net-ti-icssg-use-undirected-tx-tag-for-native-xdp-in.patch
net-ti-icssg-use-undirected-tx-tag-for-xdp-zero-copy.patch
-net-ethernet-oa_tc6-interrupt-is-active-low-level-tr.patch
net-ethernet-oa_tc6-mdiobus-parent-initialized-with-.patch
net-ethernet-oa_tc6-remove-fcs-size-in-rx-frame.patch
dt-bindings-net-updated-interrupt-type-to-be-active-.patch