Skip to contentSkip to conversation

Linux 6.12.55

DISCUSSION Greg Kroah-Hartman 1 participant 2 messages Oct 23, 2025 Stable branch

lore
Share & tools
lore

Greg Kroah-Hartman

author maintainer
#0 lore raw

I'm announcing the release of the 6.12.55 kernel.

All users of the 6.12 kernel series must upgrade.

The updated 6.12.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.12.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary

thanks,

greg k-h

------------

 Documentation/arch/arm64/silicon-errata.rst          |    2 
 Documentation/networking/seg6-sysctl.rst             |    3 
 Makefile                                             |    2 
 arch/Kconfig                                         |    1 
 arch/arm64/Kconfig                                   |    1 
 arch/arm64/include/asm/cputype.h                     |    2 
 arch/arm64/kernel/cpu_errata.c                       |    1 
 arch/riscv/kernel/probes/kprobes.c                   |   13 -
 arch/x86/kernel/cpu/resctrl/monitor.c                |   44 ++-
 drivers/accel/qaic/qaic.h                            |    2 
 drivers/accel/qaic/qaic_control.c                    |    2 
 drivers/accel/qaic/qaic_data.c                       |   12 -
 drivers/accel/qaic/qaic_debugfs.c                    |    5 
 drivers/accel/qaic/qaic_drv.c                        |    3 
 drivers/base/power/runtime.c                         |   44 +++
 drivers/cdx/cdx_msi.c                                |    5 
 drivers/cpufreq/cppc_cpufreq.c                       |   14 +
 drivers/dma/idxd/init.c                              |    2 
 drivers/gpu/drm/amd/amdgpu/Makefile                  |    3 
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c     |    5 
 drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c        |   48 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c              |    2 
 drivers/gpu/drm/amd/amdgpu/cyan_skillfish_reg_init.c |   56 ++++
 drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c                |    7 
 drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c                |    7 
 drivers/gpu/drm/amd/amdgpu/mes_v12_0.c               |    7 
 drivers/gpu/drm/amd/amdgpu/nv.h                      |    1 
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c  |    3 
 drivers/gpu/drm/bridge/lontium-lt9211.c              |    3 
 drivers/gpu/drm/drm_draw.c                           |    2 
 drivers/gpu/drm/drm_draw_internal.h                  |    2 
 drivers/gpu/drm/exynos/exynos7_drm_decon.c           |   98 ++------
 drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c            |    9 
 drivers/gpu/drm/msm/adreno/a6xx_gmu.c                |   28 +-
 drivers/gpu/drm/msm/adreno/a6xx_gmu.h                |    6 
 drivers/gpu/drm/panthor/panthor_fw.c                 |    1 
 drivers/gpu/drm/rockchip/rockchip_drm_vop2.c         |    2 
 drivers/gpu/drm/scheduler/sched_main.c               |   13 -
 drivers/gpu/drm/xe/xe_guc_submit.c                   |   13 +
 drivers/hid/hid-input.c                              |    5 
 drivers/hid/hid-multitouch.c                         |   28 +-
 drivers/iio/imu/inv_icm42600/inv_icm42600_core.c     |   35 +-
 drivers/md/md-linear.c                               |    1 
 drivers/md/raid0.c                                   |   16 +
 drivers/md/raid1.c                                   |   37 ++-
 drivers/md/raid10.c                                  |   55 ++++
 drivers/md/raid5.c                                   |    2 
 drivers/media/platform/nxp/imx8-isi/imx8-isi-core.h  |    2 
 drivers/media/platform/nxp/imx8-isi/imx8-isi-hw.c    |    2 
 drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c   |  225 +++++++------------
 drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c  |    2 
 drivers/net/can/m_can/m_can.c                        |   84 ++++---
 drivers/net/can/m_can/m_can.h                        |    1 
 drivers/net/can/m_can/m_can_platform.c               |    2 
 drivers/net/can/usb/gs_usb.c                         |   23 -
 drivers/net/ethernet/amd/xgbe/xgbe-drv.c             |    1 
 drivers/net/ethernet/amd/xgbe/xgbe-mdio.c            |    1 
 drivers/net/ethernet/broadcom/tg3.c                  |    5 
 drivers/net/ethernet/dlink/dl2k.c                    |   23 +
 drivers/net/ethernet/intel/ixgbevf/defines.h         |    6 
 drivers/net/ethernet/intel/ixgbevf/ipsec.c           |   10 
 drivers/net/ethernet/intel/ixgbevf/ixgbevf.h         |   13 +
 drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c    |   46 +++
 drivers/net/ethernet/intel/ixgbevf/mbx.h             |    8 
 drivers/net/ethernet/intel/ixgbevf/vf.c              |  194 +++++++++++++---
 drivers/net/ethernet/intel/ixgbevf/vf.h              |    5 
 drivers/net/ethernet/realtek/r8169_main.c            |    5 
 drivers/net/netdevsim/netdev.c                       |    7 
 drivers/net/usb/lan78xx.c                            |   38 ++-
 drivers/net/usb/r8152.c                              |    7 
 drivers/net/wireless/realtek/rtw89/core.c            |   39 +--
 drivers/net/wireless/realtek/rtw89/core.h            |    6 
 drivers/net/wireless/realtek/rtw89/mac80211.c        |    2 
 drivers/net/wireless/realtek/rtw89/pci.c             |    2 
 drivers/nvme/host/multipath.c                        |    6 
 drivers/nvme/host/tcp.c                              |    3 
 drivers/phy/cadence/cdns-dphy.c                      |  131 ++++++++---
 drivers/usb/gadget/function/f_acm.c                  |   42 +--
 drivers/usb/gadget/function/f_ecm.c                  |   48 +---
 drivers/usb/gadget/function/f_ncm.c                  |   78 ++----
 drivers/usb/gadget/function/f_rndis.c                |   85 ++-----
 drivers/usb/gadget/udc/core.c                        |    3 
 fs/btrfs/extent_io.c                                 |    2 
 fs/btrfs/free-space-tree.c                           |   15 -
 fs/btrfs/ioctl.c                                     |    2 
 fs/btrfs/relocation.c                                |   13 -
 fs/btrfs/zoned.c                                     |    2 
 fs/dax.c                                             |    2 
 fs/dcache.c                                          |   12 -
 fs/ext4/ext4_jbd2.c                                  |   11 
 fs/ext4/inode.c                                      |    8 
 fs/f2fs/data.c                                       |    2 
 fs/hfsplus/unicode.c                                 |   24 ++
 fs/jbd2/transaction.c                                |   13 -
 fs/nfsd/blocklayout.c                                |   33 +-
 fs/nfsd/blocklayoutxdr.c                             |  171 ++++++++------
 fs/nfsd/blocklayoutxdr.h                             |    8 
 fs/nfsd/flexfilelayout.c                             |    8 
 fs/nfsd/flexfilelayoutxdr.c                          |    3 
 fs/nfsd/nfs4layouts.c                                |    1 
 fs/nfsd/nfs4proc.c                                   |   36 +--
 fs/nfsd/nfs4xdr.c                                    |   25 --
 fs/nfsd/nfsd.h                                       |    1 
 fs/nfsd/pnfs.h                                       |    1 
 fs/nfsd/xdr4.h                                       |   39 +++
 fs/smb/client/inode.c                                |    6 
 fs/smb/client/misc.c                                 |   17 +
 fs/smb/client/smb2ops.c                              |    8 
 fs/smb/server/mgmt/user_session.c                    |    7 
 fs/smb/server/smb2pdu.c                              |    9 
 fs/smb/server/transport_ipc.c                        |   12 +
 fs/xfs/libxfs/xfs_log_format.h                       |   30 ++
 fs/xfs/libxfs/xfs_ondisk.h                           |    2 
 fs/xfs/scrub/reap.c                                  |    9 
 fs/xfs/xfs_log.c                                     |    8 
 fs/xfs/xfs_log_priv.h                                |    4 
 fs/xfs/xfs_log_recover.c                             |   34 ++
 include/linux/mm.h                                   |    2 
 include/linux/pci.h                                  |   14 +
 include/linux/pm_runtime.h                           |    4 
 include/linux/usb/gadget.h                           |   25 ++
 include/net/dst.h                                    |   32 ++
 include/net/inet6_hashtables.h                       |    2 
 include/net/inet_connection_sock.h                   |    3 
 include/net/inet_hashtables.h                        |    2 
 include/net/ip.h                                     |   11 
 include/net/ip_tunnels.h                             |   15 +
 include/net/route.h                                  |    2 
 io_uring/rw.c                                        |    2 
 kernel/events/core.c                                 |    8 
 kernel/padata.c                                      |    6 
 kernel/sched/fair.c                                  |   26 +-
 mm/slub.c                                            |    9 
 net/core/dst.c                                       |    4 
 net/core/sock.c                                      |   14 -
 net/ipv4/icmp.c                                      |   24 +-
 net/ipv4/igmp.c                                      |    2 
 net/ipv4/ip_fragment.c                               |    2 
 net/ipv4/ip_output.c                                 |   19 +
 net/ipv4/ip_tunnel.c                                 |   14 -
 net/ipv4/ip_vti.c                                    |    4 
 net/ipv4/netfilter.c                                 |    4 
 net/ipv4/route.c                                     |    8 
 net/ipv4/tcp_fastopen.c                              |    4 
 net/ipv4/tcp_input.c                                 |    3 
 net/ipv4/tcp_ipv4.c                                  |   12 -
 net/ipv4/tcp_metrics.c                               |    8 
 net/ipv4/tcp_output.c                                |   19 +
 net/ipv4/xfrm4_output.c                              |    2 
 net/ipv6/ip6_tunnel.c                                |    3 
 net/ipv6/tcp_ipv6.c                                  |   22 -
 net/mptcp/ctrl.c                                     |    9 
 net/tls/tls_main.c                                   |    7 
 net/tls/tls_sw.c                                     |   31 ++
 rust/bindings/bindings_helper.h                      |    1 
 sound/firewire/amdtp-stream.h                        |    2 
 sound/soc/amd/acp/acp-sdw-sof-mach.c                 |    2 
 sound/soc/codecs/idt821034.c                         |   12 -
 sound/soc/codecs/nau8821.c                           |   53 +++-
 sound/usb/card.c                                     |   10 
 tools/testing/selftests/bpf/prog_tests/arg_parsing.c |   12 -
 161 files changed, 1901 insertions(+), 955 deletions(-)

Adrian Hunter (3):
perf/core: Fix address filter match with backing files perf/core: Fix MMAP event path names with backing files perf/core: Fix MMAP2 event device with backing files

Akhil P Oommen (1):
drm/msm/a6xx: Fix PDC sleep sequence

Al Viro (1):
d_alloc_parallel(): set DCACHE_PAR_LOOKUP earlier

Alex Deucher (3):
drm/amdgpu: add ip offset support for cyan skillfish drm/amdgpu: add support for cyan skillfish without IP discovery drm/amdgpu: fix handling of harvesting for ip_discovery firmware

Alexey Simakov (1):
tg3: prevent use of uninitialized remote_adv and local_adv variables

Alok Tiwari (1):
drm/rockchip: vop2: use correct destination rectangle height check

Amit Chaudhary (1):
nvme-multipath: Skip nr_active increments in RETRY disposition

Andrii Nakryiko (1):
selftests/bpf: make arg_parsing.c more robust to crashes

Babu Moger (2):
x86/resctrl: Refactor resctrl_arch_rmid_read()
x86/resctrl: Fix miscount of bandwidth event when reactivating previously unavailable RMID

Bence Csókás (1):
PM: runtime: Add new devm functions

Benjamin Tissoires (1):
HID: multitouch: fix sticky fingers

Boris Burkov (1):
btrfs: fix incorrect readahead expansion length

Breno Leitao (1):
netdevsim: set the carrier when the device goes up

Celeste Liu (2):
can: gs_usb: gs_make_candev(): populate net_device->dev_port
can: gs_usb: increase max interface to U8_MAX

Christoph Hellwig (2):
xfs: rename the old_crc variable in xlog_recover_process
xfs: fix log CRC mismatches between i386 and other architectures

Christophe Leroy (1):
ASoC: codecs: Fix gain setting ranges for Renesas IDT821034 codec

Chuck Lever (1):
NFSD: Define a proc_layoutcommit for the FlexFiles layout type

Conor Dooley (1):
rust: cfi: only 64-bit arm and x86 support CFI_CLANG

Cristian Ciocaltea (3):
ASoC: nau8821: Cancel jdet_work before handling jack ejection
ASoC: nau8821: Generalize helper to clear IRQ status
ASoC: nau8821: Add DMI quirk to bypass jack debounce circuit

Darrick J. Wong (1):
xfs: use deferred intent items for reaping crosslinked blocks

Deepanshu Kartikey (1):
ext4: detect invalid INLINE_DATA + EXTENTS flag combination

Devarsh Thakkar (2):
phy: cadence: cdns-dphy: Fix PLL lock and O_CMN_READY polling
phy: cadence: cdns-dphy: Update calibration wait time for startup state machine

Dmitry Safonov (1):
net/ip6_tunnel: Prevent perpetual tunnel growth

Dmitry Torokhov (1):
HID: hid-input: only ignore 0 battery events for digitizers

Eric Dumazet (5):
tcp: fix tcp_tso_should_defer() vs large RTT
tcp: convert to dev_net_rcu()
tcp: cache RTAX_QUICKACK metric in a hot cache line
net: dst: add four helpers to annotate data-races around dst->dev
ipv4: adopt dst_dev, skb_dst_dev and skb_dst_dev_net[_rcu]

Eugene Korenevsky (1):
cifs: parse_dfs_referrals: prevent oob on malformed input

Fabian Vogt (1):
riscv: kprobes: Fix probe address validation

Fedor Pchelkin (1):
wifi: rtw89: avoid possible TX wait initialization race

Filipe Manana (2):
btrfs: fix clearing of BTRFS_FS_RELOC_RUNNING if relocation already running
btrfs: do not assert we found block group item when creating free space tree

Francesco Valla (1):
drm/draw: fix color truncation in drm_draw_fill24

Greg Kroah-Hartman (1):

      Linux 6.12.55

Guenter Roeck (1):
dmaengine: Add missing cleanup on module unload

Gui-Dong Han (1):
drm/amdgpu: use atomic functions with memory barriers for vm fault info

Guoniu Zhou (1):
media: nxp: imx8-isi: m2m: Fix streaming cleanup on release

Hao Ge (1):

      slab: reset slab->obj_ext when freeing and it is OBJEXTS_ALLOC_FAIL

I Viswanath (1):

      net: usb: lan78xx: fix use of improperly initialized dev->chipid in lan78xx_reset

Jaegeuk Kim (1):
f2fs: fix wrong block mapping for multi-devices

Jakub Acs (1):
mm/ksm: fix flag-dropping behavior in ksm_madvise

Jan Kara (1):
vfs: Don't leak disconnected dentries on umount

Jedrzej Jagielski (2):
ixgbevf: fix getting link speed data for E610 devices
ixgbevf: fix mailbox API compatibility by negotiating supported features

Jeffrey Hugo (1):
accel/qaic: Fix bootlog initialization ordering

Jens Axboe (1):
Revert "io_uring/rw: drop -EOPNOTSUPP check in __io_complete_rw_common()"

Jiaming Zhang (1):
ALSA: usb-audio: Fix NULL pointer deference in try_to_register_card

Jiri Slaby (SUSE) (1):
irqdomain: cdx: Switch to of_fwnode_handle()

John Garry (3):
md/raid0: Handle bio_split() errors
md/raid1: Handle bio_split() errors
md/raid10: Handle bio_split() errors

Jonathan Kim (1):
drm/amdgpu: fix gfx12 mes packet status return check

Kaustabh Chakraborty (3):
drm/exynos: exynos7_drm_decon: fix uninitialized crtc reference in functions drm/exynos: exynos7_drm_decon: properly clear channels during bind drm/exynos: exynos7_drm_decon: remove ctx->suspended

Ketil Johnsen (1):
drm/panthor: Ensure MCU is disabled on suspend

Kuen-Han Tsai (6):
usb: gadget: Store endpoint pointer in usb_request
usb: gadget: Introduce free_usb_request helper
usb: gadget: f_ncm: Refactor bind path to use __free()
usb: gadget: f_acm: Refactor bind path to use __free()
usb: gadget: f_ecm: Refactor bind path to use __free()
usb: gadget: f_rndis: Refactor bind path to use __free()

Kuniyuki Iwashima (2):
mptcp: Call dst_release() in mptcp_active_enable().
mptcp: Use __sk_dst_get() and dst_dev_rcu() in mptcp_active_enable().

Laurent Pinchart (1):
media: nxp: imx8-isi: Drop unused argument to mxc_isi_channel_chain()

Li Qiang (1):
ASoC: amd/sdw_utils: avoid NULL deref when devm_kasprintf() fails

Linmao Li (1):
r8169: fix packet truncation after S4 resume on RTL8168H/RTL8111H

Marc Kleine-Budde (4):
can: m_can: m_can_plat_remove(): add missing pm_runtime_disable()
can: m_can: m_can_handle_state_errors(): fix CAN state transition to Error Active
can: m_can: m_can_chip_config(): bring up interface in correct state
can: m_can: fix CAN state in system PM

Marek Vasut (1):
drm/bridge: lt9211: Drop check for last nibble of version register

Mario Limonciello (1):
drm/amd: Check whether secure display TA loaded successfully

Marios Makassikis (1):
ksmbd: fix recursive locking in RPC handle list access

Mark Rutland (2):
arm64: cputype: Add Neoverse-V3AE definitions
arm64: errata: Apply workarounds for Neoverse-V3AE

Matthieu Baerts (NGI0) (1):
mptcp: reset blackhole on success with non-loopback ifaces

Miaoqian Lin (1):
cdx: Fix device node reference leak in cdx_msi_domain_init

Miquel Sabaté Solà (2):
btrfs: fix memory leak on duplicated memory in the qgroup assign ioctl
btrfs: fix memory leaks when rejecting a non SINGLE data profile without an RST

Nicolas Dichtel (1):
doc: fix seg6_flowlabel path

Oleksij Rempel (1):
net: usb: lan78xx: Add error handling to lan78xx_init_mac_address

Piotr Kwapulinski (2):
PCI: Add PCI_VDEVICE_SUB helper macro
ixgbevf: Add support for Intel(R) E610 device

Pranjal Ramajor Asha Kanojiya (1):
accel/qaic: Synchronize access to DBC request queue head & tail pointer

Rafael J. Wysocki (1):
cpufreq: CPPC: Avoid using CPUFREQ_ETERNAL as transition delay

Raju Rangoju (1):
amd-xgbe: Avoid spurious link down messages during interface toggle

Randy Dunlap (1):
ALSA: firewire: amdtp-stream: fix enum kernel-doc warnings

Sabrina Dubroca (5):
tls: trim encrypted message to match the plaintext on short splice
tls: wait for async encrypt in case of error during latter iterations of sendmsg
tls: always set record_type in tls_process_cmsg
tls: wait for pending async decryptions if tls_strp_msg_hold fails
tls: don't rely on tx_work during send()

Sean Nyekjaer (4):
can: m_can: add deinit callback
can: m_can: call deinit/init callback when going into suspend/resume
iio: imu: inv_icm42600: Simplify pm_runtime setup
iio: imu: inv_icm42600: Avoid configuring if already pm_runtime suspended

Sergey Bashirov (6):
nfsd: Use correct error code when decoding extents
nfsd: Drop dprintk in blocklayout xdr functions
NFSD: Rework encoding and decoding of nfsd4_deviceid
NFSD: Minor cleanup in layoutcommit processing
NFSD: Implement large extent array support in pNFS
NFSD: Fix last write offset handling in layoutcommit

Sharath Chandra Vurukala (1):

      net: Add locking to protect skb->dev access in ip_output

Shuhao Fu (1):
smb: client: Fix refcount leak for cifs_sb_tlink

Shuicheng Lin (1):
drm/xe/guc: Check GuC running state before deregistering exec queue

Thadeu Lima de Souza Cascardo (1):
HID: multitouch: fix name of Stylus input devices

Timur Kristóf (1):
drm/amd/powerplay: Fix CIK shutdown temperature

Tomi Valkeinen (1):
phy: cdns-dphy: Store hs_clk_rate and return it

Tvrtko Ursulin (1):
drm/sched: Fix potential double free in drm_sched_job_add_resv_dependencies

Viacheslav Dubeyko (1):
hfsplus: fix slab-out-of-bounds read in hfsplus_strcasecmp()

Vincent Guittot (1):
sched/fair: Fix pelt lost idle time detection

Wilfred Mallawa (1):
nvme/tcp: handle tls partially sent records in write_space()

Xiao Liang (1):
padata: Reset next CPU when reorder sequence wraps around

Xing Guo (1):
selftests: arg_parsing: Ensure data is flushed to disk before reading.

Yeounsu Moon (1):
net: dlink: handle dma_map_single() failure properly

Yi Cong (1):
r8152: add error handling in rtl8152_driver_init

Youssef Samir (1):

      accel/qaic: Treat remaining == 0 as error in find_and_map_user_pages()

Yu Kuai (1):
md: fix mssing blktrace bio split events

Yuezhang Mo (1):
dax: skip read lock assertion for read-only filesystems

Zhang Yi (2):
jbd2: ensure that all ongoing I/O complete before freeing blocks
ext4: wait for ongoing I/O to complete before freeing blocks

Zhanjun Dong (1):
drm/i915/guc: Skip communication warning on reset in progress

author maintainer
#1 lore raw
Documentation/arch/arm64/silicon-errata.rst +2 -0
index b42fea07c5ce..b6dacd012539 100644
@@ -198,6 +198,8 @@ stable kernels.
 +----------------+-----------------+-----------------+-----------------------------+
 | ARM            | Neoverse-V3     | #3312417        | ARM64_ERRATUM_3194386       |
 +----------------+-----------------+-----------------+-----------------------------+
+| ARM            | Neoverse-V3AE   | #3312417        | ARM64_ERRATUM_3194386       |
++----------------+-----------------+-----------------+-----------------------------+
 | ARM            | MMU-500         | #841119,826419  | N/A                         |
 +----------------+-----------------+-----------------+-----------------------------+
 | ARM            | MMU-600         | #1076982,1209401| N/A                         |
Documentation/networking/seg6-sysctl.rst +3 -0
index 07c20e470baf..1b6af4779be1 100644
@@ -25,6 +25,9 @@ seg6_require_hmac - INTEGER
 
 	Default is 0.
 
+/proc/sys/net/ipv6/seg6_* variables:
+====================================
+
 seg6_flowlabel - INTEGER
 	Controls the behaviour of computing the flowlabel of outer
 	IPv6 header in case of SR T.encaps
Makefile +1 -1
index 0c6deb33c239..d4c679b2d4bc 100644
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 6
 PATCHLEVEL = 12
-SUBLEVEL = 54
+SUBLEVEL = 55
 EXTRAVERSION =
 NAME = Baby Opossum Posse
 
arch/Kconfig +1 -0
index bd9f095d69fa..593452b43dd4 100644
@@ -861,6 +861,7 @@ config HAVE_CFI_ICALL_NORMALIZE_INTEGERS_RUSTC
 	def_bool y
 	depends on HAVE_CFI_ICALL_NORMALIZE_INTEGERS_CLANG
 	depends on RUSTC_VERSION >= 107900
+	depends on ARM64 || X86_64
 	# With GCOV/KASAN we need this fix: https://github.com/rust-lang/rust/pull/129373
 	depends on (RUSTC_LLVM_VERSION >= 190103 && RUSTC_VERSION >= 108200) || \
 		(!GCOV_KERNEL && !KASAN_GENERIC && !KASAN_SW_TAGS)
arch/arm64/Kconfig +1 -0
index 7887d18cce3e..40ae4dd961b1 100644
@@ -1111,6 +1111,7 @@ config ARM64_ERRATUM_3194386
 	  * ARM Neoverse-V1 erratum 3324341
 	  * ARM Neoverse V2 erratum 3324336
 	  * ARM Neoverse-V3 erratum 3312417
+	  * ARM Neoverse-V3AE erratum 3312417
 
 	  On affected cores "MSR SSBS, #0" instructions may not affect
 	  subsequent speculative instructions, which may permit unexepected
arch/arm64/include/asm/cputype.h +2 -0
index d92a0203e5a9..c279a0a9b366 100644
@@ -93,6 +93,7 @@
 #define ARM_CPU_PART_NEOVERSE_V2	0xD4F
 #define ARM_CPU_PART_CORTEX_A720	0xD81
 #define ARM_CPU_PART_CORTEX_X4		0xD82
+#define ARM_CPU_PART_NEOVERSE_V3AE	0xD83
 #define ARM_CPU_PART_NEOVERSE_V3	0xD84
 #define ARM_CPU_PART_CORTEX_X925	0xD85
 #define ARM_CPU_PART_CORTEX_A725	0xD87
@@ -180,6 +181,7 @@
 #define MIDR_NEOVERSE_V2 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V2)
 #define MIDR_CORTEX_A720 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A720)
 #define MIDR_CORTEX_X4 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X4)
+#define MIDR_NEOVERSE_V3AE	MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V3AE)
 #define MIDR_NEOVERSE_V3 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_NEOVERSE_V3)
 #define MIDR_CORTEX_X925 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_X925)
 #define MIDR_CORTEX_A725 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A725)
arch/arm64/kernel/cpu_errata.c +1 -0
index a78f247029ae..3f675ae57d09 100644
@@ -455,6 +455,7 @@ static const struct midr_range erratum_spec_ssbs_list[] = {
 	MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V1),
 	MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2),
 	MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V3),
+	MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V3AE),
 	{}
 };
 #endif
arch/riscv/kernel/probes/kprobes.c +9 -4
index d2dacea1aedd..0daba93c1a81 100644
@@ -49,10 +49,15 @@ static void __kprobes arch_simulate_insn(struct kprobe *p, struct pt_regs *regs)
 	post_kprobe_handler(p, kcb, regs);
 }
 
-static bool __kprobes arch_check_kprobe(struct kprobe *p)
+static bool __kprobes arch_check_kprobe(unsigned long addr)
 {
-	unsigned long tmp  = (unsigned long)p->addr - p->offset;
-	unsigned long addr = (unsigned long)p->addr;
+	unsigned long tmp, offset;
+
+	/* start iterating at the closest preceding symbol */
+	if (!kallsyms_lookup_size_offset(addr, NULL, &offset))
+		return false;
+
+	tmp = addr - offset;
 
 	while (tmp <= addr) {
 		if (tmp == addr)
@@ -71,7 +76,7 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
 	if ((unsigned long)insn & 0x1)
 		return -EILSEQ;
 
-	if (!arch_check_kprobe(p))
+	if (!arch_check_kprobe((unsigned long)p->addr))
 		return -EILSEQ;
 
 	/* copy instruction */
arch/x86/kernel/cpu/resctrl/monitor.c +29 -15

66 lines not on this page · raw message

drivers/accel/qaic/qaic.h +2 -0
index 02561b6cecc6..2d7b3af09e28 100644
@@ -91,6 +91,8 @@ struct dma_bridge_chan {
 	 * response queue's head and tail pointer of this DBC.
 	 */
 	void __iomem		*dbc_base;
+	/* Synchronizes access to Request queue's head and tail pointer */
+	struct mutex		req_lock;
 	/* Head of list where each node is a memory handle queued in request queue */
 	struct list_head	xfer_list;
 	/* Synchronizes DBC readers during cleanup */
drivers/accel/qaic/qaic_control.c +1 -1
index d8bdab69f800..b86a8e48e731 100644
@@ -407,7 +407,7 @@ static int find_and_map_user_pages(struct qaic_device *qdev,
 		return -EINVAL;
 	remaining = in_trans->size - resources->xferred_dma_size;
 	if (remaining == 0)
-		return 0;
+		return -EINVAL;
 
 	if (check_add_overflow(xfer_start_addr, remaining, &end))
 		return -EINVAL;
drivers/accel/qaic/qaic_data.c +10 -2
index 43aba57b48f0..265eeb4e156f 100644
@@ -1357,13 +1357,17 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
 		goto release_ch_rcu;
 	}
 
+	ret = mutex_lock_interruptible(&dbc->req_lock);
+	if (ret)
+		goto release_ch_rcu;
+
 	head = readl(dbc->dbc_base + REQHP_OFF);
 	tail = readl(dbc->dbc_base + REQTP_OFF);
 
 	if (head == U32_MAX || tail == U32_MAX) {
 		/* PCI link error */
 		ret = -ENODEV;
-		goto release_ch_rcu;
+		goto unlock_req_lock;
 	}
 
 	queue_level = head <= tail ? tail - head : dbc->nelem - (head - tail);
@@ -1371,11 +1375,12 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
 	ret = send_bo_list_to_device(qdev, file_priv, exec, args->hdr.count, is_partial, dbc,
 				     head, &tail);
 	if (ret)
-		goto release_ch_rcu;
+		goto unlock_req_lock;
 
 	/* Finalize commit to hardware */
 	submit_ts = ktime_get_ns();
 	writel(tail, dbc->dbc_base + REQTP_OFF);
+	mutex_unlock(&dbc->req_lock);
 
 	update_profiling_data(file_priv, exec, args->hdr.count, is_partial, received_ts,
 			      submit_ts, queue_level);
@@ -1383,6 +1388,9 @@ static int __qaic_execute_bo_ioctl(struct drm_device *dev, void *data, struct dr
 	if (datapath_polling)
 		schedule_work(&dbc->poll_work);
 
+unlock_req_lock:
+	if (ret)
+		mutex_unlock(&dbc->req_lock);
 release_ch_rcu:
 	srcu_read_unlock(&dbc->ch_lock, rcu_id);
 unlock_dev_srcu:
drivers/accel/qaic/qaic_debugfs.c +3 -2
index 20b653d99e52..5ed49daaf541 100644
@@ -251,6 +251,9 @@ static int qaic_bootlog_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_d
 	if (ret)
 		goto destroy_workqueue;
 
+	dev_set_drvdata(&mhi_dev->dev, qdev);
+	qdev->bootlog_ch = mhi_dev;
+
 	for (i = 0; i < BOOTLOG_POOL_SIZE; i++) {
 		msg = devm_kzalloc(&qdev->pdev->dev, sizeof(*msg), GFP_KERNEL);
 		if (!msg) {
@@ -266,8 +269,6 @@ static int qaic_bootlog_mhi_probe(struct mhi_device *mhi_dev, const struct mhi_d
 			goto mhi_unprepare;
 	}
 
-	dev_set_drvdata(&mhi_dev->dev, qdev);
-	qdev->bootlog_ch = mhi_dev;
 	return 0;
 
 mhi_unprepare:
drivers/accel/qaic/qaic_drv.c +3 -0
index 10e711c96a67..cb606c4bb851 100644
@@ -422,6 +422,9 @@ static struct qaic_device *create_qdev(struct pci_dev *pdev, const struct pci_de
 			return NULL;
 		init_waitqueue_head(&qdev->dbc[i].dbc_release);
 		INIT_LIST_HEAD(&qdev->dbc[i].bo_lists);
+		ret = drmm_mutex_init(drm, &qdev->dbc[i].req_lock);
+		if (ret)
+			return NULL;
 	}
 
 	return qdev;
drivers/base/power/runtime.c +44 -0

56 lines not on this page · raw message

drivers/cdx/cdx_msi.c +3 -2
index e55f1716cfcb..d7bade143998 100644
@@ -165,7 +165,7 @@ struct irq_domain *cdx_msi_domain_init(struct device *dev)
 	struct device_node *parent_node;
 	struct irq_domain *parent;
 
-	fwnode_handle = of_node_to_fwnode(np);
+	fwnode_handle = of_fwnode_handle(np);
 
 	parent_node = of_parse_phandle(np, "msi-map", 1);
 	if (!parent_node) {
@@ -173,7 +173,8 @@ struct irq_domain *cdx_msi_domain_init(struct device *dev)
 		return NULL;
 	}
 
-	parent = irq_find_matching_fwnode(of_node_to_fwnode(parent_node), DOMAIN_BUS_NEXUS);
+	parent = irq_find_matching_fwnode(of_fwnode_handle(parent_node), DOMAIN_BUS_NEXUS);
+	of_node_put(parent_node);
 	if (!parent || !msi_get_domain_info(parent)) {
 		dev_err(dev, "unable to locate ITS domain\n");
 		return NULL;
drivers/cpufreq/cppc_cpufreq.c +12 -2
index 8d5279c21e6c..1abedcae50b2 100644
@@ -339,6 +339,16 @@ static int cppc_verify_policy(struct cpufreq_policy_data *policy)
 	return 0;
 }
 
+static unsigned int __cppc_cpufreq_get_transition_delay_us(unsigned int cpu)
+{
+	unsigned int transition_latency_ns = cppc_get_transition_latency(cpu);
+
+	if (transition_latency_ns == CPUFREQ_ETERNAL)
+		return CPUFREQ_DEFAULT_TRANSITION_LATENCY_NS / NSEC_PER_USEC;
+
+	return transition_latency_ns / NSEC_PER_USEC;
+}
+
 /*
  * The PCC subspace describes the rate at which platform can accept commands
  * on the shared PCC channel (including READs which do not count towards freq
@@ -361,12 +371,12 @@ static unsigned int cppc_cpufreq_get_transition_delay_us(unsigned int cpu)
 			return 10000;
 		}
 	}
-	return cppc_get_transition_latency(cpu) / NSEC_PER_USEC;
+	return __cppc_cpufreq_get_transition_delay_us(cpu);
 }
 #else
 static unsigned int cppc_cpufreq_get_transition_delay_us(unsigned int cpu)
 {
-	return cppc_get_transition_latency(cpu) / NSEC_PER_USEC;
+	return __cppc_cpufreq_get_transition_delay_us(cpu);
 }
 #endif
 
drivers/dma/idxd/init.c +2 -0
index 74a83203181d..e55136bb525e 100644
@@ -923,6 +923,8 @@ static void idxd_remove(struct pci_dev *pdev)
 	idxd_cleanup_interrupts(idxd);
 	if (device_pasid_enabled(idxd))
 		idxd_disable_system_pasid(idxd);
+	if (device_user_pasid_enabled(idxd))
+		idxd_disable_sva(idxd->pdev);
 	pci_iounmap(pdev, idxd->reg_base);
 	put_device(idxd_confdev(idxd));
 	pci_disable_device(pdev);
drivers/gpu/drm/amd/amdgpu/Makefile +2 -1
index c7b18c52825d..784651269ec5 100644
@@ -83,7 +83,8 @@ amdgpu-y += \
 	vega20_reg_init.o nbio_v7_4.o nbio_v2_3.o nv.o arct_reg_init.o mxgpu_nv.o \
 	nbio_v7_2.o hdp_v4_0.o hdp_v5_0.o aldebaran_reg_init.o aldebaran.o soc21.o soc24.o \
 	sienna_cichlid.o smu_v13_0_10.o nbio_v4_3.o hdp_v6_0.o nbio_v7_7.o hdp_v5_2.o lsdma_v6_0.o \
-	nbio_v7_9.o aqua_vanjaram.o nbio_v7_11.o lsdma_v7_0.o hdp_v7_0.o nbif_v6_3_1.o
+	nbio_v7_9.o aqua_vanjaram.o nbio_v7_11.o lsdma_v7_0.o hdp_v7_0.o nbif_v6_3_1.o \
+	cyan_skillfish_reg_init.o
 
 # add DF block
 amdgpu-y += \
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +2 -3
index 1465b3adacb0..d349a4816e53 100644
@@ -2353,10 +2353,9 @@ void amdgpu_amdkfd_gpuvm_unmap_gtt_bo_from_kernel(struct kgd_mem *mem)
 int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct amdgpu_device *adev,
 					  struct kfd_vm_fault_info *mem)
 {
-	if (atomic_read(&adev->gmc.vm_fault_info_updated) == 1) {
+	if (atomic_read_acquire(&adev->gmc.vm_fault_info_updated) == 1) {
 		*mem = *adev->gmc.vm_fault_info;
-		mb(); /* make sure read happened */
-		atomic_set(&adev->gmc.vm_fault_info_updated, 0);
+		atomic_set_release(&adev->gmc.vm_fault_info_updated, 0);
 	}
 	return 0;
 }
drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +47 -1

105 lines not on this page · raw message

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +1 -1
index 8553ac4c0ad3..a8358d1d1acb 100644
@@ -2171,7 +2171,7 @@ static int psp_securedisplay_initialize(struct psp_context *psp)
 	}
 
 	ret = psp_ta_load(psp, &psp->securedisplay_context.context);
-	if (!ret) {
+	if (!ret && !psp->securedisplay_context.context.resp_status) {
 		psp->securedisplay_context.context.initialized = true;
 		mutex_init(&psp->securedisplay_context.mutex);
 	} else
drivers/gpu/drm/amd/amdgpu/cyan_skillfish_reg_init.c new file +56 -0

56 lines not on this page · raw message

drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +3 -4
index 994432fb57ea..8e2f73125650 100644
@@ -1055,7 +1055,7 @@ static int gmc_v7_0_sw_init(void *handle)
 					GFP_KERNEL);
 	if (!adev->gmc.vm_fault_info)
 		return -ENOMEM;
-	atomic_set(&adev->gmc.vm_fault_info_updated, 0);
+	atomic_set_release(&adev->gmc.vm_fault_info_updated, 0);
 
 	return 0;
 }
@@ -1287,7 +1287,7 @@ static int gmc_v7_0_process_interrupt(struct amdgpu_device *adev,
 	vmid = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
 			     VMID);
 	if (amdgpu_amdkfd_is_kfd_vmid(adev, vmid)
-		&& !atomic_read(&adev->gmc.vm_fault_info_updated)) {
+		&& !atomic_read_acquire(&adev->gmc.vm_fault_info_updated)) {
 		struct kfd_vm_fault_info *info = adev->gmc.vm_fault_info;
 		u32 protections = REG_GET_FIELD(status,
 					VM_CONTEXT1_PROTECTION_FAULT_STATUS,
@@ -1303,8 +1303,7 @@ static int gmc_v7_0_process_interrupt(struct amdgpu_device *adev,
 		info->prot_read = protections & 0x8 ? true : false;
 		info->prot_write = protections & 0x10 ? true : false;
 		info->prot_exec = protections & 0x20 ? true : false;
-		mb();
-		atomic_set(&adev->gmc.vm_fault_info_updated, 1);
+		atomic_set_release(&adev->gmc.vm_fault_info_updated, 1);
 	}
 
 	return 0;
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +3 -4
index 86488c052f82..5248832c04ad 100644
@@ -1168,7 +1168,7 @@ static int gmc_v8_0_sw_init(void *handle)
 					GFP_KERNEL);
 	if (!adev->gmc.vm_fault_info)
 		return -ENOMEM;
-	atomic_set(&adev->gmc.vm_fault_info_updated, 0);
+	atomic_set_release(&adev->gmc.vm_fault_info_updated, 0);
 
 	return 0;
 }
@@ -1468,7 +1468,7 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
 	vmid = REG_GET_FIELD(status, VM_CONTEXT1_PROTECTION_FAULT_STATUS,
 			     VMID);
 	if (amdgpu_amdkfd_is_kfd_vmid(adev, vmid)
-		&& !atomic_read(&adev->gmc.vm_fault_info_updated)) {
+		&& !atomic_read_acquire(&adev->gmc.vm_fault_info_updated)) {
 		struct kfd_vm_fault_info *info = adev->gmc.vm_fault_info;
 		u32 protections = REG_GET_FIELD(status,
 					VM_CONTEXT1_PROTECTION_FAULT_STATUS,
@@ -1484,8 +1484,7 @@ static int gmc_v8_0_process_interrupt(struct amdgpu_device *adev,
 		info->prot_read = protections & 0x8 ? true : false;
 		info->prot_write = protections & 0x10 ? true : false;
 		info->prot_exec = protections & 0x20 ? true : false;
-		mb();
-		atomic_set(&adev->gmc.vm_fault_info_updated, 1);
+		atomic_set_release(&adev->gmc.vm_fault_info_updated, 1);
 	}
 
 	return 0;
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c +6 -1
index e3f4f5fbbd6e..19cbf80fa321 100644
@@ -224,7 +224,12 @@ static int mes_v12_0_submit_pkt_and_poll_completion(struct amdgpu_mes *mes,
 			pipe, x_pkt->header.opcode);
 
 	r = amdgpu_fence_wait_polling(ring, seq, timeout);
-	if (r < 1 || !*status_ptr) {
+
+	/*
+	 * status_ptr[31:0] == 0 (fail) or status_ptr[63:0] == 1 (success).
+	 * If status_ptr[31:0] == 0 then status_ptr[63:32] will have debug error information.
+	 */
+	if (r < 1 || !(lower_32_bits(*status_ptr))) {
 
 		if (misc_op_str)
 			dev_err(adev->dev, "MES(%d) failed to respond to msg=%s (%s)\n",
drivers/gpu/drm/amd/amdgpu/nv.h +1 -0
index 83e9782aef39..8f4817404f10 100644
@@ -31,5 +31,6 @@ extern const struct amdgpu_ip_block_version nv_common_ip_block;
 void nv_grbm_select(struct amdgpu_device *adev,
 		    u32 me, u32 pipe, u32 queue, u32 vmid);
 void nv_set_virt_ops(struct amdgpu_device *adev);
+int cyan_skillfish_reg_base_init(struct amdgpu_device *adev);
 
 #endif
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +1 -2
index 632a25957477..3018e294673a 100644
@@ -5444,8 +5444,7 @@ static int smu7_get_thermal_temperature_range(struct pp_hwmgr *hwmgr,
 		thermal_data->max = table_info->cac_dtp_table->usSoftwareShutdownTemp *
 			PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
 	else if (hwmgr->pp_table_version == PP_TABLE_V0)
-		thermal_data->max = data->thermal_temp_setting.temperature_shutdown *
-			PP_TEMPERATURE_UNITS_PER_CENTIGRADES;
+		thermal_data->max = data->thermal_temp_setting.temperature_shutdown;
 
 	thermal_data->sw_ctf_threshold = thermal_data->max;
 
drivers/gpu/drm/bridge/lontium-lt9211.c +1 -2
index c8881796fba4..4014375f06ea 100644
@@ -120,8 +120,7 @@ static int lt9211_read_chipid(struct lt9211 *ctx)
 	}
 
 	/* Test for known Chip ID. */
-	if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE ||
-	    chipid[2] != REG_CHIPID2_VALUE) {
+	if (chipid[0] != REG_CHIPID0_VALUE || chipid[1] != REG_CHIPID1_VALUE) {
 		dev_err(ctx->dev, "Unknown Chip ID: 0x%02x 0x%02x 0x%02x\n",
 			chipid[0], chipid[1], chipid[2]);
 		return -EINVAL;
drivers/gpu/drm/drm_draw.c +1 -1
index d41f8ae1c148..b61ebc5bdd5c 100644
@@ -125,7 +125,7 @@ EXPORT_SYMBOL(drm_draw_fill16);
 
 void drm_draw_fill24(struct iosys_map *dmap, unsigned int dpitch,
 		     unsigned int height, unsigned int width,
-		     u16 color)
+		     u32 color)
 {
 	unsigned int y, x;
 
drivers/gpu/drm/drm_draw_internal.h +1 -1
index f121ee7339dc..20cb404e23ea 100644
@@ -47,7 +47,7 @@ void drm_draw_fill16(struct iosys_map *dmap, unsigned int dpitch,
 
 void drm_draw_fill24(struct iosys_map *dmap, unsigned int dpitch,
 		     unsigned int height, unsigned int width,
-		     u16 color);
+		     u32 color);
 
 void drm_draw_fill32(struct iosys_map *dmap, unsigned int dpitch,
 		     unsigned int height, unsigned int width,
drivers/gpu/drm/exynos/exynos7_drm_decon.c +34 -64

217 lines not on this page · raw message

drivers/gpu/drm/i915/gt/uc/intel_guc_ct.c +8 -1
index 0d5197c0824a..5cf3a516ccfb 100644
@@ -1324,9 +1324,16 @@ static int ct_receive(struct intel_guc_ct *ct)
 
 static void ct_try_receive_message(struct intel_guc_ct *ct)
 {
+	struct intel_guc *guc = ct_to_guc(ct);
 	int ret;
 
-	if (GEM_WARN_ON(!ct->enabled))
+	if (!ct->enabled) {
+		GEM_WARN_ON(!guc_to_gt(guc)->uc.reset_in_progress);
+		return;
+	}
+
+	/* When interrupt disabled, message handling is not expected */
+	if (!guc->interrupts.enabled)
 		return;
 
 	ret = ct_receive(ct);
drivers/gpu/drm/msm/adreno/a6xx_gmu.c +17 -11
index 67fa528f546d..8609fa38058e 100644
@@ -236,6 +236,8 @@ static int a6xx_gmu_start(struct a6xx_gmu *gmu)
 	if (ret)
 		DRM_DEV_ERROR(gmu->dev, "GMU firmware initialization timed out\n");
 
+	set_bit(GMU_STATUS_FW_START, &gmu->status);
+
 	return ret;
 }
 
@@ -482,6 +484,9 @@ static int a6xx_rpmh_start(struct a6xx_gmu *gmu)
 	int ret;
 	u32 val;
 
+	if (!test_and_clear_bit(GMU_STATUS_PDC_SLEEP, &gmu->status))
+		return 0;
+
 	gmu_write(gmu, REG_A6XX_GMU_RSCC_CONTROL_REQ, BIT(1));
 
 	ret = gmu_poll_timeout(gmu, REG_A6XX_GMU_RSCC_CONTROL_ACK, val,
@@ -509,6 +514,9 @@ static void a6xx_rpmh_stop(struct a6xx_gmu *gmu)
 	int ret;
 	u32 val;
 
+	if (test_and_clear_bit(GMU_STATUS_FW_START, &gmu->status))
+		return;
+
 	gmu_write(gmu, REG_A6XX_GMU_RSCC_CONTROL_REQ, 1);
 
 	ret = gmu_poll_timeout_rscc(gmu, REG_A6XX_GPU_RSCC_RSC_STATUS0_DRV0,
@@ -517,6 +525,8 @@ static void a6xx_rpmh_stop(struct a6xx_gmu *gmu)
 		DRM_DEV_ERROR(gmu->dev, "Unable to power off the GPU RSC\n");
 
 	gmu_write(gmu, REG_A6XX_GMU_RSCC_CONTROL_REQ, 0);
+
+	set_bit(GMU_STATUS_PDC_SLEEP, &gmu->status);
 }
 
 static inline void pdc_write(void __iomem *ptr, u32 offset, u32 value)
@@ -645,8 +655,6 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu)
 	/* ensure no writes happen before the uCode is fully written */
 	wmb();
 
-	a6xx_rpmh_stop(gmu);
-
 err:
 	if (!IS_ERR_OR_NULL(pdcptr))
 		iounmap(pdcptr);
@@ -799,19 +807,15 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state)
 	else
 		gmu_write(gmu, REG_A6XX_GMU_GENERAL_7, 1);
 
-	if (state == GMU_WARM_BOOT) {
-		ret = a6xx_rpmh_start(gmu);
-		if (ret)
-			return ret;
-	} else {
+	ret = a6xx_rpmh_start(gmu);
+	if (ret)
+		return ret;
+
+	if (state == GMU_COLD_BOOT) {
 		if (WARN(!adreno_gpu->fw[ADRENO_FW_GMU],
 			"GMU firmware is not loaded\n"))
 			return -ENOENT;
 
-		ret = a6xx_rpmh_start(gmu);
-		if (ret)
-			return ret;
-
 		ret = a6xx_gmu_fw_load(gmu);
 		if (ret)
 			return ret;
@@ -980,6 +984,8 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu)
 
 	/* Reset GPU core blocks */
 	a6xx_gpu_sw_reset(gpu, true);
+
+	a6xx_rpmh_stop(gmu);
 }
 
 static void a6xx_gmu_set_initial_freq(struct msm_gpu *gpu, struct a6xx_gmu *gmu)
drivers/gpu/drm/msm/adreno/a6xx_gmu.h +6 -0
index 94b6c5cab6f4..db5b3b13e743 100644
@@ -99,6 +99,12 @@ struct a6xx_gmu {
 	struct completion pd_gate;
 
 	struct qmp *qmp;
+
+/* To check if we can trigger sleep seq at PDC. Cleared in a6xx_rpmh_stop() */
+#define GMU_STATUS_FW_START	0
+/* To track if PDC sleep seq was done */
+#define GMU_STATUS_PDC_SLEEP	1
+	unsigned long status;
 };
 
 static inline u32 gmu_read(struct a6xx_gmu *gmu, u32 offset)
drivers/gpu/drm/panthor/panthor_fw.c +1 -0
index 4e2d3a02ea06..cdd6e1c08ceb 100644
@@ -1057,6 +1057,7 @@ void panthor_fw_pre_reset(struct panthor_device *ptdev, bool on_hang)
 	}
 
 	panthor_job_irq_suspend(&ptdev->fw->irq);
+	panthor_fw_stop(ptdev);
 }
 
 /**
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +1 -1
index 5d7df4c3b08c..a551458ad434 100644
@@ -1118,7 +1118,7 @@ static int vop2_plane_atomic_check(struct drm_plane *plane,
 		return format;
 
 	if (drm_rect_width(src) >> 16 < 4 || drm_rect_height(src) >> 16 < 4 ||
-	    drm_rect_width(dest) < 4 || drm_rect_width(dest) < 4) {
+	    drm_rect_width(dest) < 4 || drm_rect_height(dest) < 4) {
 		drm_err(vop2->drm, "Invalid size: %dx%d->%dx%d, min size is 4x4\n",
 			drm_rect_width(src) >> 16, drm_rect_height(src) >> 16,
 			drm_rect_width(dest), drm_rect_height(dest));
drivers/gpu/drm/scheduler/sched_main.c +7 -6
index 416590ea0dc3..d5260cb1ed0e 100644
@@ -952,13 +952,14 @@ int drm_sched_job_add_resv_dependencies(struct drm_sched_job *job,
 	dma_resv_assert_held(resv);
 
 	dma_resv_for_each_fence(&cursor, resv, usage, fence) {
-		/* Make sure to grab an additional ref on the added fence */
-		dma_fence_get(fence);
-		ret = drm_sched_job_add_dependency(job, fence);
-		if (ret) {
-			dma_fence_put(fence);
+		/*
+		 * As drm_sched_job_add_dependency always consumes the fence
+		 * reference (even when it fails), and dma_resv_for_each_fence
+		 * is not obtaining one, we need to grab one before calling.
+		 */
+		ret = drm_sched_job_add_dependency(job, dma_fence_get(fence));
+		if (ret)
 			return ret;
-		}
 	}
 	return 0;
 }
drivers/gpu/drm/xe/xe_guc_submit.c +12 -1
index cf6946424fc3..03d674e9e807 100644
@@ -41,6 +41,7 @@
 #include "xe_ring_ops_types.h"
 #include "xe_sched_job.h"
 #include "xe_trace.h"
+#include "xe_uc_fw.h"
 #include "xe_vm.h"
 
 static struct xe_guc *
@@ -1285,7 +1286,17 @@ static void __guc_exec_queue_process_msg_cleanup(struct xe_sched_msg *msg)
 	xe_assert(xe, !(q->flags & EXEC_QUEUE_FLAG_PERMANENT));
 	trace_xe_exec_queue_cleanup_entity(q);
 
-	if (exec_queue_registered(q))
+	/*
+	 * Expected state transitions for cleanup:
+	 * - If the exec queue is registered and GuC firmware is running, we must first
+	 *   disable scheduling and deregister the queue to ensure proper teardown and
+	 *   resource release in the GuC, then destroy the exec queue on driver side.
+	 * - If the GuC is already stopped (e.g., during driver unload or GPU reset),
+	 *   we cannot expect a response for the deregister request. In this case,
+	 *   it is safe to directly destroy the exec queue on driver side, as the GuC
+	 *   will not process further requests and all resources must be cleaned up locally.
+	 */
+	if (exec_queue_registered(q) && xe_uc_fw_is_running(&guc->fw))
 		disable_scheduling_deregister(guc, q);
 	else
 		__guc_exec_queue_fini(guc, q);
drivers/hid/hid-input.c +4 -1
index f5c217ac4bfa..f073d5621050 100644
@@ -622,7 +622,10 @@ static void hidinput_update_battery(struct hid_device *dev, unsigned int usage,
 		return;
 	}
 
-	if (value == 0 || value < dev->battery_min || value > dev->battery_max)
+	if ((usage & HID_USAGE_PAGE) == HID_UP_DIGITIZER && value == 0)
+		return;
+
+	if (value < dev->battery_min || value > dev->battery_max)
 		return;
 
 	capacity = hidinput_scale_battery_capacity(dev, value);
drivers/hid/hid-multitouch.c +15 -13
index 5c424010bc02..0e4cb0e668eb 100644
@@ -83,9 +83,8 @@ enum latency_mode {
 	HID_LATENCY_HIGH = 1,
 };
 
-#define MT_IO_FLAGS_RUNNING		0
-#define MT_IO_FLAGS_ACTIVE_SLOTS	1
-#define MT_IO_FLAGS_PENDING_SLOTS	2
+#define MT_IO_SLOTS_MASK		GENMASK(7, 0) /* reserve first 8 bits for slot tracking */
+#define MT_IO_FLAGS_RUNNING		32
 
 static const bool mtrue = true;		/* default for true */
 static const bool mfalse;		/* default for false */
@@ -160,7 +159,11 @@ struct mt_device {
 	struct mt_class mtclass;	/* our mt device class */
 	struct timer_list release_timer;	/* to release sticky fingers */
 	struct hid_device *hdev;	/* hid_device we're attached to */
-	unsigned long mt_io_flags;	/* mt flags (MT_IO_FLAGS_*) */
+	unsigned long mt_io_flags;	/* mt flags (MT_IO_FLAGS_RUNNING)
+					 * first 8 bits are reserved for keeping the slot
+					 * states, this is fine because we only support up
+					 * to 250 slots (MT_MAX_MAXCONTACT)
+					 */
 	__u8 inputmode_value;	/* InputMode HID feature value */
 	__u8 maxcontacts;
 	bool is_buttonpad;	/* is this device a button pad? */
@@ -941,6 +944,7 @@ static void mt_release_pending_palms(struct mt_device *td,
 
 	for_each_set_bit(slotnum, app->pending_palm_slots, td->maxcontacts) {
 		clear_bit(slotnum, app->pending_palm_slots);
+		clear_bit(slotnum, &td->mt_io_flags);
 
 		input_mt_slot(input, slotnum);
 		input_mt_report_slot_inactive(input);
@@ -972,12 +976,6 @@ static void mt_sync_frame(struct mt_device *td, struct mt_application *app,
 
 	app->num_received = 0;
 	app->left_button_state = 0;
-
-	if (test_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags))
-		set_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags);
-	else
-		clear_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags);
-	clear_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags);
 }
 
 static int mt_compute_timestamp(struct mt_application *app, __s32 value)
@@ -1152,7 +1150,9 @@ static int mt_process_slot(struct mt_device *td, struct input_dev *input,
 		input_event(input, EV_ABS, ABS_MT_TOUCH_MAJOR, major);
 		input_event(input, EV_ABS, ABS_MT_TOUCH_MINOR, minor);
 
-		set_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags);
+		set_bit(slotnum, &td->mt_io_flags);
+	} else {
+		clear_bit(slotnum, &td->mt_io_flags);
 	}
 
 	return 0;
@@ -1287,7 +1287,7 @@ static void mt_touch_report(struct hid_device *hid,
 	 * defect.
 	 */
 	if (app->quirks & MT_QUIRK_STICKY_FINGERS) {
-		if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
+		if (td->mt_io_flags & MT_IO_SLOTS_MASK)
 			mod_timer(&td->release_timer,
 				  jiffies + msecs_to_jiffies(100));
 		else
@@ -1663,6 +1663,7 @@ static int mt_input_configured(struct hid_device *hdev, struct hid_input *hi)
 	case HID_CP_CONSUMER_CONTROL:
 	case HID_GD_WIRELESS_RADIO_CTLS:
 	case HID_GD_SYSTEM_MULTIAXIS:
+	case HID_DG_PEN:
 		/* already handled by hid core */
 		break;
 	case HID_DG_TOUCHSCREEN:
@@ -1734,6 +1735,7 @@ static void mt_release_contacts(struct hid_device *hid)
 			for (i = 0; i < mt->num_slots; i++) {
 				input_mt_slot(input_dev, i);
 				input_mt_report_slot_inactive(input_dev);
+				clear_bit(i, &td->mt_io_flags);
 			}
 			input_mt_sync_frame(input_dev);
 			input_sync(input_dev);
@@ -1756,7 +1758,7 @@ static void mt_expired_timeout(struct timer_list *t)
 	 */
 	if (test_and_set_bit_lock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
 		return;
-	if (test_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags))
+	if (td->mt_io_flags & MT_IO_SLOTS_MASK)
 		mt_release_contacts(hdev);
 	clear_bit_unlock(MT_IO_FLAGS_RUNNING, &td->mt_io_flags);
 }
drivers/iio/imu/inv_icm42600/inv_icm42600_core.c +13 -22
index 790bc8fbf21d..9f88d8ca6d1b 100644
@@ -667,20 +667,12 @@ static void inv_icm42600_disable_vdd_reg(void *_data)
 static void inv_icm42600_disable_vddio_reg(void *_data)
 {
 	struct inv_icm42600_state *st = _data;
-	const struct device *dev = regmap_get_device(st->map);
-	int ret;
-
-	ret = regulator_disable(st->vddio_supply);
-	if (ret)
-		dev_err(dev, "failed to disable vddio error %d\n", ret);
-}
+	struct device *dev = regmap_get_device(st->map);
 
-static void inv_icm42600_disable_pm(void *_data)
-{
-	struct device *dev = _data;
+	if (pm_runtime_status_suspended(dev))
+		return;
 
-	pm_runtime_put_sync(dev);
-	pm_runtime_disable(dev);
+	regulator_disable(st->vddio_supply);
 }
 
 int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
@@ -777,16 +769,14 @@ int inv_icm42600_core_probe(struct regmap *regmap, int chip, int irq,
 		return ret;
 
 	/* setup runtime power management */
-	ret = pm_runtime_set_active(dev);
+	ret = devm_pm_runtime_set_active_enabled(dev);
 	if (ret)
 		return ret;
-	pm_runtime_get_noresume(dev);
-	pm_runtime_enable(dev);
+
 	pm_runtime_set_autosuspend_delay(dev, INV_ICM42600_SUSPEND_DELAY_MS);
 	pm_runtime_use_autosuspend(dev);
-	pm_runtime_put(dev);
 
-	return devm_add_action_or_reset(dev, inv_icm42600_disable_pm, dev);
+	return ret;
 }
 EXPORT_SYMBOL_NS_GPL(inv_icm42600_core_probe, IIO_ICM42600);
 
@@ -797,17 +787,15 @@ EXPORT_SYMBOL_NS_GPL(inv_icm42600_core_probe, IIO_ICM42600);
 static int inv_icm42600_suspend(struct device *dev)
 {
 	struct inv_icm42600_state *st = dev_get_drvdata(dev);
-	int ret;
+	int ret = 0;
 
 	mutex_lock(&st->lock);
 
 	st->suspended.gyro = st->conf.gyro.mode;
 	st->suspended.accel = st->conf.accel.mode;
 	st->suspended.temp = st->conf.temp_en;
-	if (pm_runtime_suspended(dev)) {
-		ret = 0;
+	if (pm_runtime_suspended(dev))
 		goto out_unlock;
-	}
 
 	/* disable FIFO data streaming */
 	if (st->fifo.on) {
@@ -839,10 +827,13 @@ static int inv_icm42600_resume(struct device *dev)
 	struct inv_icm42600_state *st = dev_get_drvdata(dev);
 	struct inv_icm42600_sensor_state *gyro_st = iio_priv(st->indio_gyro);
 	struct inv_icm42600_sensor_state *accel_st = iio_priv(st->indio_accel);
-	int ret;
+	int ret = 0;
 
 	mutex_lock(&st->lock);
 
+	if (pm_runtime_suspended(dev))
+		goto out_unlock;
+
 	ret = inv_icm42600_enable_regulator_vddio(st);
 	if (ret)
 		goto out_unlock;
drivers/md/md-linear.c +1 -0
index 369aed044b40..d733ebee624b 100644
@@ -267,6 +267,7 @@ static bool linear_make_request(struct mddev *mddev, struct bio *bio)
 		}
 
 		bio_chain(split, bio);
+		trace_block_split(split, bio->bi_iter.bi_sector);
 		submit_bio_noacct(bio);
 		bio = split;
 	}
drivers/md/raid0.c +16 -0
index 31bea72bcb01..db1ab214250f 100644
@@ -464,7 +464,15 @@ static void raid0_handle_discard(struct mddev *mddev, struct bio *bio)
 		struct bio *split = bio_split(bio,
 			zone->zone_end - bio->bi_iter.bi_sector, GFP_NOIO,
 			&mddev->bio_set);
+
+		if (IS_ERR(split)) {
+			bio->bi_status = errno_to_blk_status(PTR_ERR(split));
+			bio_endio(bio);
+			return;
+		}
+
 		bio_chain(split, bio);
+		trace_block_split(split, bio->bi_iter.bi_sector);
 		submit_bio_noacct(bio);
 		bio = split;
 		end = zone->zone_end;
@@ -606,7 +614,15 @@ static bool raid0_make_request(struct mddev *mddev, struct bio *bio)
 	if (sectors < bio_sectors(bio)) {
 		struct bio *split = bio_split(bio, sectors, GFP_NOIO,
 					      &mddev->bio_set);
+
+		if (IS_ERR(split)) {
+			bio->bi_status = errno_to_blk_status(PTR_ERR(split));
+			bio_endio(bio);
+			return true;
+		}
+
 		bio_chain(split, bio);
+		trace_block_split(split, bio->bi_iter.bi_sector);
 		raid0_map_submit_bio(mddev, bio);
 		bio = split;
 	}
drivers/md/raid1.c +35 -2
index faccf7344ef9..4c6b1bd6da9b 100644
@@ -1317,7 +1317,7 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 	struct raid1_info *mirror;
 	struct bio *read_bio;
 	int max_sectors;
-	int rdisk;
+	int rdisk, error;
 	bool r1bio_existed = !!r1_bio;
 
 	/*
@@ -1378,7 +1378,14 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 	if (max_sectors < bio_sectors(bio)) {
 		struct bio *split = bio_split(bio, max_sectors,
 					      gfp, &conf->bio_split);
+
+		if (IS_ERR(split)) {
+			error = PTR_ERR(split);
+			goto err_handle;
+		}
+
 		bio_chain(split, bio);
+		trace_block_split(split, bio->bi_iter.bi_sector);
 		submit_bio_noacct(bio);
 		bio = split;
 		r1_bio->master_bio = bio;
@@ -1404,6 +1411,13 @@ static void raid1_read_request(struct mddev *mddev, struct bio *bio,
 	read_bio->bi_private = r1_bio;
 	mddev_trace_remap(mddev, read_bio, r1_bio->sector);
 	submit_bio_noacct(read_bio);
+	return;
+
+err_handle:
+	atomic_dec(&mirror->rdev->nr_pending);
+	bio->bi_status = errno_to_blk_status(error);
+	set_bit(R1BIO_Uptodate, &r1_bio->state);
+	raid_end_bio_io(r1_bio);
 }
 
 static void raid1_write_request(struct mddev *mddev, struct bio *bio,
@@ -1411,7 +1425,7 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
 {
 	struct r1conf *conf = mddev->private;
 	struct r1bio *r1_bio;
-	int i, disks;
+	int i, disks, k, error;
 	unsigned long flags;
 	struct md_rdev *blocked_rdev;
 	int first_clone;
@@ -1557,7 +1571,14 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
 	if (max_sectors < bio_sectors(bio)) {
 		struct bio *split = bio_split(bio, max_sectors,
 					      GFP_NOIO, &conf->bio_split);
+
+		if (IS_ERR(split)) {
+			error = PTR_ERR(split);
+			goto err_handle;
+		}
+
 		bio_chain(split, bio);
+		trace_block_split(split, bio->bi_iter.bi_sector);
 		submit_bio_noacct(bio);
 		bio = split;
 		r1_bio->master_bio = bio;
@@ -1640,6 +1661,18 @@ static void raid1_write_request(struct mddev *mddev, struct bio *bio,
 
 	/* In case raid1d snuck in to freeze_array */
 	wake_up_barrier(conf);
+	return;
+err_handle:
+	for (k = 0; k < i; k++) {
+		if (r1_bio->bios[k]) {
+			rdev_dec_pending(conf->mirrors[k].rdev, mddev);
+			r1_bio->bios[k] = NULL;
+		}
+	}
+
+	bio->bi_status = errno_to_blk_status(error);
+	set_bit(R1BIO_Uptodate, &r1_bio->state);
+	raid_end_bio_io(r1_bio);
 }
 
 static bool raid1_make_request(struct mddev *mddev, struct bio *bio)
drivers/md/raid10.c +54 -1

109 lines not on this page · raw message

drivers/md/raid5.c +2 -0
index 39e7596e78c0..4fae8ade2409 100644
@@ -5484,8 +5484,10 @@ static struct bio *chunk_aligned_read(struct mddev *mddev, struct bio *raid_bio)
 
 	if (sectors < bio_sectors(raid_bio)) {
 		struct r5conf *conf = mddev->private;
+
 		split = bio_split(raid_bio, sectors, GFP_NOIO, &conf->bio_split);
 		bio_chain(split, raid_bio);
+		trace_block_split(split, raid_bio->bi_iter.bi_sector);
 		submit_bio_noacct(raid_bio);
 		raid_bio = split;
 	}
drivers/media/platform/nxp/imx8-isi/imx8-isi-core.h +1 -1
index 2810ebe9b5f7..5a4676d52079 100644
@@ -361,7 +361,7 @@ void mxc_isi_channel_get(struct mxc_isi_pipe *pipe);
 void mxc_isi_channel_put(struct mxc_isi_pipe *pipe);
 void mxc_isi_channel_enable(struct mxc_isi_pipe *pipe);
 void mxc_isi_channel_disable(struct mxc_isi_pipe *pipe);
-int mxc_isi_channel_chain(struct mxc_isi_pipe *pipe, bool bypass);
+int mxc_isi_channel_chain(struct mxc_isi_pipe *pipe);
 void mxc_isi_channel_unchain(struct mxc_isi_pipe *pipe);
 
 void mxc_isi_channel_config(struct mxc_isi_pipe *pipe,
drivers/media/platform/nxp/imx8-isi/imx8-isi-hw.c +1 -1
index 5623914f95e6..9225a7ac1c3e 100644
@@ -587,7 +587,7 @@ void mxc_isi_channel_release(struct mxc_isi_pipe *pipe)
  *
  * TODO: Support secondary line buffer for downscaling YUV420 images.
  */
-int mxc_isi_channel_chain(struct mxc_isi_pipe *pipe, bool bypass)
+int mxc_isi_channel_chain(struct mxc_isi_pipe *pipe)
 {
 	/* Channel chaining requires both line and output buffer. */
 	const u8 resources = MXC_ISI_CHANNEL_RES_OUTPUT_BUF
drivers/media/platform/nxp/imx8-isi/imx8-isi-m2m.c +92 -133

263 lines not on this page · raw message

drivers/media/platform/nxp/imx8-isi/imx8-isi-pipe.c +1 -1
index d76eb58deb09..a41c51dd9ce0 100644
@@ -855,7 +855,7 @@ int mxc_isi_pipe_acquire(struct mxc_isi_pipe *pipe,
 
 	/* Chain the channel if needed for wide resolutions. */
 	if (sink_fmt->width > MXC_ISI_MAX_WIDTH_UNCHAINED) {
-		ret = mxc_isi_channel_chain(pipe, bypass);
+		ret = mxc_isi_channel_chain(pipe);
 		if (ret)
 			mxc_isi_channel_release(pipe);
 	}
drivers/net/can/m_can/m_can.c +54 -30

168 lines not on this page · raw message

drivers/net/can/m_can/m_can.h +1 -0
index ef39e8e527ab..bd4746c63af3 100644
@@ -68,6 +68,7 @@ struct m_can_ops {
 	int (*write_fifo)(struct m_can_classdev *cdev, int addr_offset,
 			  const void *val, size_t val_count);
 	int (*init)(struct m_can_classdev *cdev);
+	int (*deinit)(struct m_can_classdev *cdev);
 };
 
 struct m_can_tx_op {
drivers/net/can/m_can/m_can_platform.c +1 -1
index b832566efda0..057eaa7b8b4b 100644
@@ -180,7 +180,7 @@ static void m_can_plat_remove(struct platform_device *pdev)
 	struct m_can_classdev *mcan_class = &priv->cdev;
 
 	m_can_class_unregister(mcan_class);
-
+	pm_runtime_disable(mcan_class->dev);
 	m_can_class_free_dev(mcan_class->net);
 }
 
drivers/net/can/usb/gs_usb.c +11 -12
index b6f4de375df7..fb904dc28b8e 100644
@@ -286,11 +286,6 @@ struct gs_host_frame {
 #define GS_MAX_RX_URBS 30
 #define GS_NAPI_WEIGHT 32
 
-/* Maximum number of interfaces the driver supports per device.
- * Current hardware only supports 3 interfaces. The future may vary.
- */
-#define GS_MAX_INTF 3
-
 struct gs_tx_context {
 	struct gs_can *dev;
 	unsigned int echo_id;
@@ -321,7 +316,6 @@ struct gs_can {
 
 /* usb interface struct */
 struct gs_usb {
-	struct gs_can *canch[GS_MAX_INTF];
 	struct usb_anchor rx_submitted;
 	struct usb_device *udev;
 
@@ -333,9 +327,11 @@ struct gs_usb {
 
 	unsigned int hf_size_rx;
 	u8 active_channels;
+	u8 channel_cnt;
 
 	unsigned int pipe_in;
 	unsigned int pipe_out;
+	struct gs_can *canch[] __counted_by(channel_cnt);
 };
 
 /* 'allocate' a tx context.
@@ -596,7 +592,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 	}
 
 	/* device reports out of range channel id */
-	if (hf->channel >= GS_MAX_INTF)
+	if (hf->channel >= parent->channel_cnt)
 		goto device_detach;
 
 	dev = parent->canch[hf->channel];
@@ -696,7 +692,7 @@ static void gs_usb_receive_bulk_callback(struct urb *urb)
 	/* USB failure take down all interfaces */
 	if (rc == -ENODEV) {
 device_detach:
-		for (rc = 0; rc < GS_MAX_INTF; rc++) {
+		for (rc = 0; rc < parent->channel_cnt; rc++) {
 			if (parent->canch[rc])
 				netif_device_detach(parent->canch[rc]->netdev);
 		}
@@ -1246,6 +1242,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,
 
 	netdev->flags |= IFF_ECHO; /* we support full roundtrip echo */
 	netdev->dev_id = channel;
+	netdev->dev_port = channel;
 
 	/* dev setup */
 	strcpy(dev->bt_const.name, KBUILD_MODNAME);
@@ -1457,17 +1454,19 @@ static int gs_usb_probe(struct usb_interface *intf,
 	icount = dconf.icount + 1;
 	dev_info(&intf->dev, "Configuring for %u interfaces\n", icount);
 
-	if (icount > GS_MAX_INTF) {
+	if (icount > type_max(parent->channel_cnt)) {
 		dev_err(&intf->dev,
 			"Driver cannot handle more that %u CAN interfaces\n",
-			GS_MAX_INTF);
+			type_max(parent->channel_cnt));
 		return -EINVAL;
 	}
 
-	parent = kzalloc(sizeof(*parent), GFP_KERNEL);
+	parent = kzalloc(struct_size(parent, canch, icount), GFP_KERNEL);
 	if (!parent)
 		return -ENOMEM;
 
+	parent->channel_cnt = icount;
+
 	init_usb_anchor(&parent->rx_submitted);
 
 	usb_set_intfdata(intf, parent);
@@ -1528,7 +1527,7 @@ static void gs_usb_disconnect(struct usb_interface *intf)
 		return;
 	}
 
-	for (i = 0; i < GS_MAX_INTF; i++)
+	for (i = 0; i < parent->channel_cnt; i++)
 		if (parent->canch[i])
 			gs_destroy_candev(parent->canch[i]);
 
drivers/net/ethernet/amd/xgbe/xgbe-drv.c +0 -1
index 8bc49259d71a..32a6d5261424 100644
@@ -1172,7 +1172,6 @@ static void xgbe_free_rx_data(struct xgbe_prv_data *pdata)
 
 static int xgbe_phy_reset(struct xgbe_prv_data *pdata)
 {
-	pdata->phy_link = -1;
 	pdata->phy_speed = SPEED_UNKNOWN;
 
 	return pdata->phy_if.phy_reset(pdata);
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c +1 -0
index ed76a8df6ec6..75e9cb3fc7aa 100644
@@ -1664,6 +1664,7 @@ static int xgbe_phy_init(struct xgbe_prv_data *pdata)
 		pdata->phy.duplex = DUPLEX_FULL;
 	}
 
+	pdata->phy_link = 0;
 	pdata->phy.link = 0;
 
 	pdata->phy.pause_autoneg = pdata->pause_autoneg;
drivers/net/ethernet/broadcom/tg3.c +1 -4
index 717e110d23c9..dc170feee8ad 100644
@@ -5803,7 +5803,7 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, bool force_reset)
 	u32 current_speed = SPEED_UNKNOWN;
 	u8 current_duplex = DUPLEX_UNKNOWN;
 	bool current_link_up = false;
-	u32 local_adv, remote_adv, sgsr;
+	u32 local_adv = 0, remote_adv = 0, sgsr;
 
 	if ((tg3_asic_rev(tp) == ASIC_REV_5719 ||
 	     tg3_asic_rev(tp) == ASIC_REV_5720) &&
@@ -5944,9 +5944,6 @@ static int tg3_setup_fiber_mii_phy(struct tg3 *tp, bool force_reset)
 		else
 			current_duplex = DUPLEX_HALF;
 
-		local_adv = 0;
-		remote_adv = 0;
-
 		if (bmcr & BMCR_ANENABLE) {
 			u32 common;
 
drivers/net/ethernet/dlink/dl2k.c +16 -7
index 92856cf387c7..7c9658a4ec4b 100644
@@ -498,25 +498,34 @@ static int alloc_list(struct net_device *dev)
 	for (i = 0; i < RX_RING_SIZE; i++) {
 		/* Allocated fixed size of skbuff */
 		struct sk_buff *skb;
+		dma_addr_t addr;
 
 		skb = netdev_alloc_skb_ip_align(dev, np->rx_buf_sz);
 		np->rx_skbuff[i] = skb;
-		if (!skb) {
-			free_list(dev);
-			return -ENOMEM;
-		}
+		if (!skb)
+			goto err_free_list;
+
+		addr = dma_map_single(&np->pdev->dev, skb->data,
+				      np->rx_buf_sz, DMA_FROM_DEVICE);
+		if (dma_mapping_error(&np->pdev->dev, addr))
+			goto err_kfree_skb;
 
 		np->rx_ring[i].next_desc = cpu_to_le64(np->rx_ring_dma +
 						((i + 1) % RX_RING_SIZE) *
 						sizeof(struct netdev_desc));
 		/* Rubicon now supports 40 bits of addressing space. */
-		np->rx_ring[i].fraginfo =
-		    cpu_to_le64(dma_map_single(&np->pdev->dev, skb->data,
-					       np->rx_buf_sz, DMA_FROM_DEVICE));
+		np->rx_ring[i].fraginfo = cpu_to_le64(addr);
 		np->rx_ring[i].fraginfo |= cpu_to_le64((u64)np->rx_buf_sz << 48);
 	}
 
 	return 0;
+
+err_kfree_skb:
+	dev_kfree_skb(np->rx_skbuff[i]);
+	np->rx_skbuff[i] = NULL;
+err_free_list:
+	free_list(dev);
+	return -ENOMEM;
 }
 
 static void rio_hw_init(struct net_device *dev)
drivers/net/ethernet/intel/ixgbevf/defines.h +5 -1
index 5f08779c0e4e..e177d1d58696 100644
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright(c) 1999 - 2018 Intel Corporation. */
+/* Copyright(c) 1999 - 2024 Intel Corporation. */
 
 #ifndef _IXGBEVF_DEFINES_H_
 #define _IXGBEVF_DEFINES_H_
@@ -16,6 +16,9 @@
 #define IXGBE_DEV_ID_X550_VF_HV		0x1564
 #define IXGBE_DEV_ID_X550EM_X_VF_HV	0x15A9
 
+#define IXGBE_DEV_ID_E610_VF		0x57AD
+#define IXGBE_SUBDEV_ID_E610_VF_HV	0x00FF
+
 #define IXGBE_VF_IRQ_CLEAR_MASK		7
 #define IXGBE_VF_MAX_TX_QUEUES		8
 #define IXGBE_VF_MAX_RX_QUEUES		8
@@ -25,6 +28,7 @@
 
 /* Link speed */
 typedef u32 ixgbe_link_speed;
+#define IXGBE_LINK_SPEED_UNKNOWN	0
 #define IXGBE_LINK_SPEED_1GB_FULL	0x0020
 #define IXGBE_LINK_SPEED_10GB_FULL	0x0080
 #define IXGBE_LINK_SPEED_100_FULL	0x0008
drivers/net/ethernet/intel/ixgbevf/ipsec.c +10 -0
index f804b35d79c7..83b3243f172c 100644
@@ -271,6 +271,9 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs,
 	adapter = netdev_priv(dev);
 	ipsec = adapter->ipsec;
 
+	if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
+		return -EOPNOTSUPP;
+
 	if (xs->id.proto != IPPROTO_ESP && xs->id.proto != IPPROTO_AH) {
 		NL_SET_ERR_MSG_MOD(extack, "Unsupported protocol for IPsec offload");
 		return -EINVAL;
@@ -400,6 +403,9 @@ static void ixgbevf_ipsec_del_sa(struct xfrm_state *xs)
 	adapter = netdev_priv(dev);
 	ipsec = adapter->ipsec;
 
+	if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
+		return;
+
 	if (xs->xso.dir == XFRM_DEV_OFFLOAD_IN) {
 		sa_idx = xs->xso.offload_handle - IXGBE_IPSEC_BASE_RX_INDEX;
 
@@ -628,6 +634,10 @@ void ixgbevf_init_ipsec_offload(struct ixgbevf_adapter *adapter)
 	size_t size;
 
 	switch (adapter->hw.api_version) {
+	case ixgbe_mbox_api_17:
+		if (!(adapter->pf_features & IXGBEVF_PF_SUP_IPSEC))
+			return;
+		break;
 	case ixgbe_mbox_api_14:
 		break;
 	default:
drivers/net/ethernet/intel/ixgbevf/ixgbevf.h +12 -1
index 130cb868774c..f31068e24e86 100644
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright(c) 1999 - 2018 Intel Corporation. */
+/* Copyright(c) 1999 - 2024 Intel Corporation. */
 
 #ifndef _IXGBEVF_H_
 #define _IXGBEVF_H_
@@ -366,6 +366,13 @@ struct ixgbevf_adapter {
 	/* Interrupt Throttle Rate */
 	u32 eitr_param;
 
+	u32 pf_features;
+#define IXGBEVF_PF_SUP_IPSEC		BIT(0)
+#define IXGBEVF_PF_SUP_ESX_MBX		BIT(1)
+
+#define IXGBEVF_SUPPORTED_FEATURES	(IXGBEVF_PF_SUP_IPSEC | \
+					IXGBEVF_PF_SUP_ESX_MBX)
+
 	struct ixgbevf_hw_stats stats;
 
 	unsigned long state;
@@ -418,6 +425,8 @@ enum ixgbevf_boards {
 	board_X550EM_x_vf,
 	board_X550EM_x_vf_hv,
 	board_x550em_a_vf,
+	board_e610_vf,
+	board_e610_vf_hv,
 };
 
 enum ixgbevf_xcast_modes {
@@ -434,11 +443,13 @@ extern const struct ixgbevf_info ixgbevf_X550EM_x_vf_info;
 extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops;
 extern const struct ixgbe_mbx_operations ixgbevf_mbx_ops_legacy;
 extern const struct ixgbevf_info ixgbevf_x550em_a_vf_info;
+extern const struct ixgbevf_info ixgbevf_e610_vf_info;
 
 extern const struct ixgbevf_info ixgbevf_82599_vf_hv_info;
 extern const struct ixgbevf_info ixgbevf_X540_vf_hv_info;
 extern const struct ixgbevf_info ixgbevf_X550_vf_hv_info;
 extern const struct ixgbevf_info ixgbevf_X550EM_x_vf_hv_info;
+extern const struct ixgbevf_info ixgbevf_e610_vf_hv_info;
 extern const struct ixgbe_mbx_operations ixgbevf_hv_mbx_ops;
 
 /* needed by ethtool.c */
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c +43 -3

102 lines not on this page · raw message

drivers/net/ethernet/intel/ixgbevf/mbx.h +8 -0
index 835bbcc5cc8e..a8ed23ee66aa 100644
@@ -66,6 +66,8 @@ enum ixgbe_pfvf_api_rev {
 	ixgbe_mbox_api_13,	/* API version 1.3, linux/freebsd VF driver */
 	ixgbe_mbox_api_14,	/* API version 1.4, linux/freebsd VF driver */
 	ixgbe_mbox_api_15,	/* API version 1.5, linux/freebsd VF driver */
+	ixgbe_mbox_api_16,      /* API version 1.6, linux/freebsd VF driver */
+	ixgbe_mbox_api_17,	/* API version 1.7, linux/freebsd VF driver */
 	/* This value should always be last */
 	ixgbe_mbox_api_unknown,	/* indicates that API version is not known */
 };
@@ -102,6 +104,12 @@ enum ixgbe_pfvf_api_rev {
 
 #define IXGBE_VF_GET_LINK_STATE 0x10 /* get vf link state */
 
+/* mailbox API, version 1.6 VF requests */
+#define IXGBE_VF_GET_PF_LINK_STATE	0x11 /* request PF to send link info */
+
+/* mailbox API, version 1.7 VF requests */
+#define IXGBE_VF_FEATURES_NEGOTIATE	0x12 /* get features supported by PF*/
+
 /* length of permanent address message returned from PF */
 #define IXGBE_VF_PERMADDR_MSG_LEN	4
 /* word in permanent address message with the current multicast type */
drivers/net/ethernet/intel/ixgbevf/vf.c +161 -33

264 lines not on this page · raw message

drivers/net/ethernet/intel/ixgbevf/vf.h +4 -1
index b4eef5b6c172..4f19b8900c29 100644
@@ -1,5 +1,5 @@
 /* SPDX-License-Identifier: GPL-2.0 */
-/* Copyright(c) 1999 - 2018 Intel Corporation. */
+/* Copyright(c) 1999 - 2024 Intel Corporation. */
 
 #ifndef __IXGBE_VF_H__
 #define __IXGBE_VF_H__
@@ -26,6 +26,7 @@ struct ixgbe_mac_operations {
 	s32 (*stop_adapter)(struct ixgbe_hw *);
 	s32 (*get_bus_info)(struct ixgbe_hw *);
 	s32 (*negotiate_api_version)(struct ixgbe_hw *hw, int api);
+	int (*negotiate_features)(struct ixgbe_hw *hw, u32 *pf_features);
 
 	/* Link */
 	s32 (*setup_link)(struct ixgbe_hw *, ixgbe_link_speed, bool, bool);
@@ -54,6 +55,8 @@ enum ixgbe_mac_type {
 	ixgbe_mac_X550_vf,
 	ixgbe_mac_X550EM_x_vf,
 	ixgbe_mac_x550em_a_vf,
+	ixgbe_mac_e610,
+	ixgbe_mac_e610_vf,
 	ixgbe_num_macs
 };
 
drivers/net/ethernet/realtek/r8169_main.c +3 -2
index 7b82779e4cd5..80b5262d0d57 100644
@@ -5060,8 +5060,9 @@ static int rtl8169_resume(struct device *device)
 	if (!device_may_wakeup(tp_to_dev(tp)))
 		clk_prepare_enable(tp->clk);
 
-	/* Reportedly at least Asus X453MA truncates packets otherwise */
-	if (tp->mac_version == RTL_GIGA_MAC_VER_37)
+	/* Some chip versions may truncate packets without this initialization */
+	if (tp->mac_version == RTL_GIGA_MAC_VER_37 ||
+	    tp->mac_version == RTL_GIGA_MAC_VER_46)
 		rtl_init_rxcfg(tp);
 
 	return rtl8169_runtime_resume(device);
drivers/net/netdevsim/netdev.c +7 -0
index ee2a7b2f6268..e2d92295ad33 100644
@@ -433,6 +433,7 @@ static void nsim_enable_napi(struct netdevsim *ns)
 static int nsim_open(struct net_device *dev)
 {
 	struct netdevsim *ns = netdev_priv(dev);
+	struct netdevsim *peer;
 	int err;
 
 	err = nsim_init_napi(ns);
@@ -441,6 +442,12 @@ static int nsim_open(struct net_device *dev)
 
 	nsim_enable_napi(ns);
 
+	peer = rtnl_dereference(ns->peer);
+	if (peer && netif_running(peer->netdev)) {
+		netif_carrier_on(dev);
+		netif_carrier_on(peer->netdev);
+	}
+
 	return 0;
 }
 
drivers/net/usb/lan78xx.c +29 -9
index 2f8637224b69..2da67814556f 100644
@@ -1920,13 +1920,19 @@ static const struct ethtool_ops lan78xx_ethtool_ops = {
 	.get_regs	= lan78xx_get_regs,
 };
 
-static void lan78xx_init_mac_address(struct lan78xx_net *dev)
+static int lan78xx_init_mac_address(struct lan78xx_net *dev)
 {
 	u32 addr_lo, addr_hi;
 	u8 addr[6];
+	int ret;
+
+	ret = lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
+	if (ret < 0)
+		return ret;
 
-	lan78xx_read_reg(dev, RX_ADDRL, &addr_lo);
-	lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
+	ret = lan78xx_read_reg(dev, RX_ADDRH, &addr_hi);
+	if (ret < 0)
+		return ret;
 
 	addr[0] = addr_lo & 0xFF;
 	addr[1] = (addr_lo >> 8) & 0xFF;
@@ -1959,14 +1965,26 @@ static void lan78xx_init_mac_address(struct lan78xx_net *dev)
 			  (addr[2] << 16) | (addr[3] << 24);
 		addr_hi = addr[4] | (addr[5] << 8);
 
-		lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
-		lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
+		ret = lan78xx_write_reg(dev, RX_ADDRL, addr_lo);
+		if (ret < 0)
+			return ret;
+
+		ret = lan78xx_write_reg(dev, RX_ADDRH, addr_hi);
+		if (ret < 0)
+			return ret;
 	}
 
-	lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
-	lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
+	ret = lan78xx_write_reg(dev, MAF_LO(0), addr_lo);
+	if (ret < 0)
+		return ret;
+
+	ret = lan78xx_write_reg(dev, MAF_HI(0), addr_hi | MAF_HI_VALID_);
+	if (ret < 0)
+		return ret;
 
 	eth_hw_addr_set(dev->net, addr);
+
+	return 0;
 }
 
 /* MDIO read and write wrappers for phylib */
@@ -2905,8 +2923,6 @@ static int lan78xx_reset(struct lan78xx_net *dev)
 		}
 	} while (buf & HW_CFG_LRST_);
 
-	lan78xx_init_mac_address(dev);
-
 	/* save DEVID for later usage */
 	ret = lan78xx_read_reg(dev, ID_REV, &buf);
 	if (ret < 0)
@@ -2915,6 +2931,10 @@ static int lan78xx_reset(struct lan78xx_net *dev)
 	dev->chipid = (buf & ID_REV_CHIP_ID_MASK_) >> 16;
 	dev->chiprev = buf & ID_REV_CHIP_REV_MASK_;
 
+	ret = lan78xx_init_mac_address(dev);
+	if (ret < 0)
+		return ret;
+
 	/* Respond to the IN token with a NAK */
 	ret = lan78xx_read_reg(dev, USB_CFG0, &buf);
 	if (ret < 0)
drivers/net/usb/r8152.c +6 -1
index 2cab046749a9..3fcd2b736c5e 100644
@@ -10151,7 +10151,12 @@ static int __init rtl8152_driver_init(void)
 	ret = usb_register_device_driver(&rtl8152_cfgselector_driver, THIS_MODULE);
 	if (ret)
 		return ret;
-	return usb_register(&rtl8152_driver);
+
+	ret = usb_register(&rtl8152_driver);
+	if (ret)
+		usb_deregister_device_driver(&rtl8152_cfgselector_driver);
+
+	return ret;
 }
 
 static void __exit rtl8152_driver_exit(void)
drivers/net/wireless/realtek/rtw89/core.c +21 -18
index 99711a4fb85d..df8fad7a2aea 100644
@@ -978,25 +978,14 @@ void rtw89_core_tx_kick_off(struct rtw89_dev *rtwdev, u8 qsel)
 }
 
 int rtw89_core_tx_kick_off_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
-				    int qsel, unsigned int timeout)
+				    struct rtw89_tx_wait_info *wait, int qsel,
+				    unsigned int timeout)
 {
-	struct rtw89_tx_skb_data *skb_data = RTW89_TX_SKB_CB(skb);
-	struct rtw89_tx_wait_info *wait;
 	unsigned long time_left;
 	int ret = 0;
 
 	lockdep_assert_wiphy(rtwdev->hw->wiphy);
 
-	wait = kzalloc(sizeof(*wait), GFP_KERNEL);
-	if (!wait) {
-		rtw89_core_tx_kick_off(rtwdev, qsel);
-		return 0;
-	}
-
-	init_completion(&wait->completion);
-	wait->skb = skb;
-	rcu_assign_pointer(skb_data->wait, wait);
-
 	rtw89_core_tx_kick_off(rtwdev, qsel);
 	time_left = wait_for_completion_timeout(&wait->completion,
 						msecs_to_jiffies(timeout));
@@ -1057,10 +1046,12 @@ int rtw89_h2c_tx(struct rtw89_dev *rtwdev,
 }
 
 int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
-			struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel)
+			struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel,
+			struct rtw89_tx_wait_info *wait)
 {
 	struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta);
 	struct rtw89_vif *rtwvif = vif_to_rtwvif(vif);
+	struct rtw89_tx_skb_data *skb_data = RTW89_TX_SKB_CB(skb);
 	struct rtw89_core_tx_request tx_req = {0};
 	struct rtw89_sta_link *rtwsta_link = NULL;
 	struct rtw89_vif_link *rtwvif_link;
@@ -1093,6 +1084,8 @@ int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
 	rtw89_core_tx_update_desc_info(rtwdev, &tx_req);
 	rtw89_core_tx_wake(rtwdev, &tx_req);
 
+	rcu_assign_pointer(skb_data->wait, wait);
+
 	ret = rtw89_hci_tx_write(rtwdev, &tx_req);
 	if (ret) {
 		rtw89_err(rtwdev, "failed to transmit skb to HCI\n");
@@ -2908,7 +2901,7 @@ static void rtw89_core_txq_push(struct rtw89_dev *rtwdev,
 			goto out;
 		}
 		rtw89_core_txq_check_agg(rtwdev, rtwtxq, skb);
-		ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, NULL);
+		ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, NULL, NULL);
 		if (ret) {
 			rtw89_err(rtwdev, "failed to push txq: %d\n", ret);
 			ieee80211_free_txskb(rtwdev->hw, skb);
@@ -3084,7 +3077,7 @@ static void rtw89_core_sta_pending_tx_iter(void *data,
 	skb_queue_walk_safe(&rtwsta->roc_queue, skb, tmp) {
 		skb_unlink(skb, &rtwsta->roc_queue);
 
-		ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel);
+		ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel, NULL);
 		if (ret) {
 			rtw89_warn(rtwdev, "pending tx failed with %d\n", ret);
 			dev_kfree_skb_any(skb);
@@ -3106,6 +3099,7 @@ static int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev,
 				    struct rtw89_vif_link *rtwvif_link, bool qos, bool ps)
 {
 	struct ieee80211_vif *vif = rtwvif_link_to_vif(rtwvif_link);
+	struct rtw89_tx_wait_info *wait;
 	struct ieee80211_sta *sta;
 	struct ieee80211_hdr *hdr;
 	struct sk_buff *skb;
@@ -3114,6 +3108,12 @@ static int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev,
 	if (vif->type != NL80211_IFTYPE_STATION || !vif->cfg.assoc)
 		return 0;
 
+	wait = kzalloc(sizeof(*wait), GFP_KERNEL);
+	if (!wait)
+		return -ENOMEM;
+
+	init_completion(&wait->completion);
+
 	rcu_read_lock();
 	sta = ieee80211_find_sta(vif, vif->cfg.ap_addr);
 	if (!sta) {
@@ -3127,11 +3127,13 @@ static int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev,
 		goto out;
 	}
 
+	wait->skb = skb;
+
 	hdr = (struct ieee80211_hdr *)skb->data;
 	if (ps)
 		hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
 
-	ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel);
+	ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel, wait);
 	if (ret) {
 		rtw89_warn(rtwdev, "nullfunc transmit failed: %d\n", ret);
 		dev_kfree_skb_any(skb);
@@ -3140,10 +3142,11 @@ static int rtw89_core_send_nullfunc(struct rtw89_dev *rtwdev,
 
 	rcu_read_unlock();
 
-	return rtw89_core_tx_kick_off_and_wait(rtwdev, skb, qsel,
+	return rtw89_core_tx_kick_off_and_wait(rtwdev, skb, wait, qsel,
 					       RTW89_ROC_TX_TIMEOUT);
 out:
 	rcu_read_unlock();
+	kfree(wait);
 
 	return ret;
 }
drivers/net/wireless/realtek/rtw89/core.h +4 -2
index cb703588e3a4..7be32b83d4d6 100644
@@ -6818,12 +6818,14 @@ static inline bool rtw89_is_rtl885xb(struct rtw89_dev *rtwdev)
 }
 
 int rtw89_core_tx_write(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif,
-			struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel);
+			struct ieee80211_sta *sta, struct sk_buff *skb, int *qsel,
+			struct rtw89_tx_wait_info *wait);
 int rtw89_h2c_tx(struct rtw89_dev *rtwdev,
 		 struct sk_buff *skb, bool fwdl);
 void rtw89_core_tx_kick_off(struct rtw89_dev *rtwdev, u8 qsel);
 int rtw89_core_tx_kick_off_and_wait(struct rtw89_dev *rtwdev, struct sk_buff *skb,
-				    int qsel, unsigned int timeout);
+				    struct rtw89_tx_wait_info *wait, int qsel,
+				    unsigned int timeout);
 void rtw89_core_fill_txdesc(struct rtw89_dev *rtwdev,
 			    struct rtw89_tx_desc_info *desc_info,
 			    void *txdesc);
drivers/net/wireless/realtek/rtw89/mac80211.c +1 -1
index 3a1a2b243adf..d1f9bd41f8b5 100644
@@ -36,7 +36,7 @@ static void rtw89_ops_tx(struct ieee80211_hw *hw,
 		return;
 	}
 
-	ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel);
+	ret = rtw89_core_tx_write(rtwdev, vif, sta, skb, &qsel, NULL);
 	if (ret) {
 		rtw89_err(rtwdev, "failed to transmit skb: %d\n", ret);
 		ieee80211_free_txskb(hw, skb);
drivers/net/wireless/realtek/rtw89/pci.c +0 -2
index 5fd5fe88e6b0..a87e1778a0d4 100644
@@ -1366,7 +1366,6 @@ static int rtw89_pci_txwd_submit(struct rtw89_dev *rtwdev,
 	struct pci_dev *pdev = rtwpci->pdev;
 	struct sk_buff *skb = tx_req->skb;
 	struct rtw89_pci_tx_data *tx_data = RTW89_PCI_TX_SKB_CB(skb);
-	struct rtw89_tx_skb_data *skb_data = RTW89_TX_SKB_CB(skb);
 	bool en_wd_info = desc_info->en_wd_info;
 	u32 txwd_len;
 	u32 txwp_len;
@@ -1382,7 +1381,6 @@ static int rtw89_pci_txwd_submit(struct rtw89_dev *rtwdev,
 	}
 
 	tx_data->dma = dma;
-	rcu_assign_pointer(skb_data->wait, NULL);
 
 	txwp_len = sizeof(*txwp_info);
 	txwd_len = chip->txwd_body_size;
drivers/nvme/host/multipath.c +4 -2
index 561dd08022c0..24cff8b04492 100644
@@ -131,12 +131,14 @@ void nvme_mpath_start_request(struct request *rq)
 	struct nvme_ns *ns = rq->q->queuedata;
 	struct gendisk *disk = ns->head->disk;
 
-	if (READ_ONCE(ns->head->subsys->iopolicy) == NVME_IOPOLICY_QD) {
+	if ((READ_ONCE(ns->head->subsys->iopolicy) == NVME_IOPOLICY_QD) &&
+	    !(nvme_req(rq)->flags & NVME_MPATH_CNT_ACTIVE)) {
 		atomic_inc(&ns->ctrl->nr_active);
 		nvme_req(rq)->flags |= NVME_MPATH_CNT_ACTIVE;
 	}
 
-	if (!blk_queue_io_stat(disk->queue) || blk_rq_is_passthrough(rq))
+	if (!blk_queue_io_stat(disk->queue) || blk_rq_is_passthrough(rq) ||
+	    (nvme_req(rq)->flags & NVME_MPATH_IO_STATS))
 		return;
 
 	nvme_req(rq)->flags |= NVME_MPATH_IO_STATS;
drivers/nvme/host/tcp.c +3 -0
index 83a6b18b01ad..77df3432dfb7 100644
@@ -1075,6 +1075,9 @@ static void nvme_tcp_write_space(struct sock *sk)
 	queue = sk->sk_user_data;
 	if (likely(queue && sk_stream_is_writeable(sk))) {
 		clear_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
+		/* Ensure pending TLS partial records are retried */
+		if (nvme_tcp_queue_tls(queue))
+			queue->write_space(sk);
 		queue_work_on(queue->io_cpu, nvme_tcp_wq, &queue->io_work);
 	}
 	read_unlock_bh(&sk->sk_callback_lock);
drivers/phy/cadence/cdns-dphy.c +99 -32

176 lines not on this page · raw message

drivers/usb/gadget/function/f_acm.c +19 -23

42 lines not on this page · raw message

drivers/usb/gadget/function/f_ecm.c +20 -28

48 lines not on this page · raw message

drivers/usb/gadget/function/f_ncm.c +33 -45

78 lines not on this page · raw message

drivers/usb/gadget/function/f_rndis.c +35 -50

85 lines not on this page · raw message

drivers/usb/gadget/udc/core.c +3 -0
index d709e24c1fd4..e3d63b8fa0f4 100644

Lines of this file are not shown. View the raw message.

fs/btrfs/extent_io.c +1 -1
index b310a07a84ad..86a76efb21f6 100644

Lines of this file are not shown. View the raw message.

fs/btrfs/free-space-tree.c +8 -7
index 51f286d5d00a..8e31af036e75 100644

Lines of this file are not shown. View the raw message.

fs/btrfs/ioctl.c +1 -1
index 1706f6d9b12e..03c3b5d0abbe 100644

Lines of this file are not shown. View the raw message.

fs/btrfs/relocation.c +7 -6
index 79eb984041dd..0d5a3846811a 100644

Lines of this file are not shown. View the raw message.

fs/btrfs/zoned.c +1 -1
index 8e8edfe0c619..4966b4f5a7d2 100644

Lines of this file are not shown. View the raw message.

fs/dax.c +1 -1
index 21b47402b3dc..756400f2a625 100644

Lines of this file are not shown. View the raw message.

fs/dcache.c +9 -3
index 0f6b16ba30d0..d7814142ba7d 100644

Lines of this file are not shown. View the raw message.

fs/ext4/ext4_jbd2.c +9 -2
index da4a82456383..9e7275dd901f 100644

Lines of this file are not shown. View the raw message.

fs/ext4/inode.c +8 -0
index 6af572425596..4ad34eba00a7 100644

Lines of this file are not shown. View the raw message.

fs/f2fs/data.c +1 -1
index 040c06dfb8c0..bbb29b602438 100644

Lines of this file are not shown. View the raw message.

fs/hfsplus/unicode.c +24 -0
index 36b6cf2a3abb..ebd326799f35 100644

Lines of this file are not shown. View the raw message.

fs/jbd2/transaction.c +9 -4
index f440110df93a..ae43920ce395 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/blocklayout.c +20 -13
index 08a20e5bcf7f..0822d8a119c6 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/blocklayoutxdr.c +106 -65

171 lines not on this page · raw message

fs/nfsd/blocklayoutxdr.h +4 -4
index 4e28ac8f1127..7d25ef689671 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/flexfilelayout.c +8 -0
index 3ca5304440ff..3c4419da5e24 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/flexfilelayoutxdr.c +1 -2
index aeb71c10ff1b..f9f7e38cba13 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/nfs4layouts.c +0 -1
index fbfddd3c4c94..fc5e82eddaa1 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/nfs4proc.c +15 -21
index 8f2dc7eb4fc4..6040de0923f8 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/nfs4xdr.c +6 -19
index 90db900b346c..66383eeeed15 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/nfsd.h +1 -0
index 4b56ba1e8e48..ae435444e8b3 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/pnfs.h +1 -0
index 925817f66917..dfd411d1f363 100644

Lines of this file are not shown. View the raw message.

fs/nfsd/xdr4.h +36 -3
index 2a21a7662e03..c75b295df206 100644

Lines of this file are not shown. View the raw message.

fs/smb/client/inode.c +4 -2
index e06d02b68c53..4862a9518a32 100644

Lines of this file are not shown. View the raw message.

fs/smb/client/misc.c +17 -0
index 499f791df779..3f3f184f7fb9 100644

Lines of this file are not shown. View the raw message.

fs/smb/client/smb2ops.c +4 -4
index 1b30035d02bc..35299967737f 100644

Lines of this file are not shown. View the raw message.

fs/smb/server/mgmt/user_session.c +2 -5
index b36d0676dbe5..00805aed0b07 100644

Lines of this file are not shown. View the raw message.

fs/smb/server/smb2pdu.c +8 -1
index d2182477566a..796235cb9567 100644

Lines of this file are not shown. View the raw message.

fs/smb/server/transport_ipc.c +12 -0
index 4454bbe3c710..816f136ce5c4 100644

Lines of this file are not shown. View the raw message.

fs/xfs/libxfs/xfs_log_format.h +29 -1
index 3e6682ed656b..a151ea6c0f72 100644

Lines of this file are not shown. View the raw message.

fs/xfs/libxfs/xfs_ondisk.h +2 -0
index 23c133fd36f5..01b65d877453 100644

Lines of this file are not shown. View the raw message.

fs/xfs/scrub/reap.c +5 -4
index 53697f3c5e1b..8688edec5875 100644

Lines of this file are not shown. View the raw message.

fs/xfs/xfs_log.c +4 -4
index 26b2f5887b88..a4c00decd97b 100644

Lines of this file are not shown. View the raw message.

fs/xfs/xfs_log_priv.h +2 -2
index b8778a4fd6b6..89a75b7cbd6a 100644

Lines of this file are not shown. View the raw message.

fs/xfs/xfs_log_recover.c +24 -10
index 704aaadb61cf..64338ce501c9 100644

Lines of this file are not shown. View the raw message.

include/linux/mm.h +1 -1
index f0fa8404957d..13b4bd7355c1 100644

Lines of this file are not shown. View the raw message.

include/linux/pci.h +14 -0
index 6b3fef24d60e..452a3dca28ea 100644

Lines of this file are not shown. View the raw message.

include/linux/pm_runtime.h +4 -0
index d0b29cd1fd20..142ab39a3b38 100644

Lines of this file are not shown. View the raw message.

include/linux/usb/gadget.h +25 -0
index df33333650a0..da4309f3cea3 100644

Lines of this file are not shown. View the raw message.

include/net/dst.h +32 -0
index e18826cd0559..e5c9ea188383 100644

Lines of this file are not shown. View the raw message.

include/net/inet6_hashtables.h +1 -1
index 74dd90ff5f12..c32878c69179 100644

Lines of this file are not shown. View the raw message.

include/net/inet_connection_sock.h +2 -1
index 4bd93571e6c1..bcc138ff087b 100644

Lines of this file are not shown. View the raw message.

include/net/inet_hashtables.h +1 -1
index 5eea47f135a4..3c4118c63cfe 100644

Lines of this file are not shown. View the raw message.

include/net/ip.h +6 -5
index bd201278c55a..5f0f1215d2f9 100644

Lines of this file are not shown. View the raw message.

include/net/ip_tunnels.h +15 -0
index ae83a969ae64..01fcf952b05d 100644

Lines of this file are not shown. View the raw message.

include/net/route.h +1 -1
index 8a11d19f897b..232b7bf55ba2 100644

Lines of this file are not shown. View the raw message.

io_uring/rw.c +1 -1
index 3ad104cf1e7d..996cd4bec482 100644

Lines of this file are not shown. View the raw message.

kernel/events/core.c +4 -4
index 3cc06ffb60c1..d60d48d482b0 100644

Lines of this file are not shown. View the raw message.

kernel/padata.c +5 -1
index 3e0ef0753e73..c3810f5bd715 100644

Lines of this file are not shown. View the raw message.

kernel/sched/fair.c +13 -13
index b3d9826e25b0..8bdcb5df0d46 100644

Lines of this file are not shown. View the raw message.

mm/slub.c +8 -1
index b75b50ad6748..24e65d7048ba 100644

Lines of this file are not shown. View the raw message.

net/core/dst.c +2 -2
index cc990706b645..9a0ddef8bee4 100644

Lines of this file are not shown. View the raw message.

net/core/sock.c +9 -5
index d392cb37a864..a5f248a91404 100644

Lines of this file are not shown. View the raw message.

net/ipv4/icmp.c +13 -11
index 8f11870b7737..508b23204edc 100644

Lines of this file are not shown. View the raw message.

net/ipv4/igmp.c +1 -1
index 9bf09de6a2e7..f4a87b90351e 100644

Lines of this file are not shown. View the raw message.

net/ipv4/ip_fragment.c +1 -1
index 9ca0a183a55f..183856b0b740 100644

Lines of this file are not shown. View the raw message.

net/ipv4/ip_output.c +12 -7
index 49811c9281d4..0bda561aa8a8 100644

Lines of this file are not shown. View the raw message.

net/ipv4/ip_tunnel.c +0 -14
index 09b73acf037a..7c77d06372d1 100644

Lines of this file are not shown. View the raw message.

net/ipv4/ip_vti.c +2 -2
index f0b4419cef34..fc9516166307 100644

Lines of this file are not shown. View the raw message.

net/ipv4/netfilter.c +2 -2
index e0aab66cd925..dff06b9eb660 100644

Lines of this file are not shown. View the raw message.

net/ipv4/route.c +4 -4
index 261ddb6542a4..7d04df4fc660 100644

Lines of this file are not shown. View the raw message.

net/ipv4/tcp_fastopen.c +3 -1
index 408985eb74ee..86c995dc1c5e 100644

Lines of this file are not shown. View the raw message.

net/ipv4/tcp_input.c +1 -2
index 4c8d84fc27ca..1d9e93a04930 100644

Lines of this file are not shown. View the raw message.

net/ipv4/tcp_ipv4.c +6 -6
index 824048679e1b..1572562b0498 100644

Lines of this file are not shown. View the raw message.

net/ipv4/tcp_metrics.c +4 -4
index 95669935494e..03c068ea27b6 100644

Lines of this file are not shown. View the raw message.

net/ipv4/tcp_output.c +15 -4
index 6d5387811c32..5e37dc45639d 100644

Lines of this file are not shown. View the raw message.

net/ipv4/xfrm4_output.c +1 -1
index 3cff51ba72bb..0ae67d537499 100644

Lines of this file are not shown. View the raw message.

net/ipv6/ip6_tunnel.c +1 -2
index 5350c9bb2319..b72ca1034906 100644

Lines of this file are not shown. View the raw message.

net/ipv6/tcp_ipv6.c +11 -11
index 882ce5444572..06edfe0b2db9 100644

Lines of this file are not shown. View the raw message.

net/mptcp/ctrl.c +7 -2
index dd595d9b5e50..0d60556cfefa 100644

Lines of this file are not shown. View the raw message.

net/tls/tls_main.c +2 -5
index 0acf313deb01..e52e4c91c909 100644

Lines of this file are not shown. View the raw message.

net/tls/tls_sw.c +25 -6
index f46550b96061..1ff0d01bdadf 100644

Lines of this file are not shown. View the raw message.

rust/bindings/bindings_helper.h +1 -0
index a80783fcbe04..8b97919a86e2 100644

Lines of this file are not shown. View the raw message.

sound/firewire/amdtp-stream.h +1 -1
index 775db3fc4959..ec10270c2cce 100644

Lines of this file are not shown. View the raw message.

sound/soc/amd/acp/acp-sdw-sof-mach.c +1 -1
index 99a244f495bd..876f0b7fcd3d 100644

Lines of this file are not shown. View the raw message.

sound/soc/codecs/idt821034.c +6 -6
index cb7a68c799f8..401d0897b8ab 100644

Lines of this file are not shown. View the raw message.

sound/soc/codecs/nau8821.c +40 -13

53 lines not on this page · raw message

sound/usb/card.c +8 -2
index 9c411b82a218..d0a42859208a 100644

Lines of this file are not shown. View the raw message.

tools/testing/selftests/bpf/prog_tests/arg_parsing.c +9 -3
index bb143de68875..e27d66b75fb1 100644

Lines of this file are not shown. View the raw message.

The rest of this diff is not shown. View the raw message.

Part of the diff is not shown here. View the raw message.