Skip to contentSkip to conversation

Linux 6.16.6

DISCUSSION Greg Kroah-Hartman 1 participant 2 messages Sep 9, 2025 Stable branch

lore
Share & tools
lore

Greg Kroah-Hartman

author maintainer
#0 lore raw

I'm announcing the release of the 6.16.6 kernel.

All users of the 6.16 kernel series must upgrade.

The updated 6.16.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.16.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

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

 Makefile                                                         |    2 
 arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts          |    2 
 arch/arm64/boot/dts/freescale/imx8mp-data-modul-edm-sbc.dts      |    1 
 arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi              |    1 
 arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mp-ras314.dts |   13 -
 arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl.dts      |   13 -
 arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi              |   22 +
 arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts             |    1 
 arch/arm64/boot/dts/rockchip/rk3582-radxa-e52c.dts               |    1 
 arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts          |    2 
 arch/arm64/boot/dts/rockchip/rk3588-orangepi-5.dtsi              |    2 
 arch/arm64/include/asm/module.h                                  |    1 
 arch/arm64/include/asm/module.lds.h                              |    1 
 arch/arm64/kernel/ftrace.c                                       |   13 -
 arch/arm64/kernel/module-plts.c                                  |   12 
 arch/arm64/kernel/module.c                                       |   11 
 arch/loongarch/kernel/signal.c                                   |   10 
 arch/loongarch/kernel/time.c                                     |   22 +
 arch/riscv/Kconfig                                               |    2 
 arch/riscv/include/asm/asm.h                                     |    2 
 arch/riscv/include/asm/uaccess.h                                 |    8 
 arch/riscv/kernel/entry.S                                        |    2 
 arch/riscv/kernel/kexec_elf.c                                    |    4 
 arch/riscv/kernel/kexec_image.c                                  |    2 
 arch/riscv/kernel/machine_kexec_file.c                           |    2 
 arch/riscv/net/bpf_jit_comp64.c                                  |    4 
 arch/x86/include/asm/pgtable_64_types.h                          |    3 
 arch/x86/mm/init_64.c                                            |   18 +
 drivers/accel/ivpu/ivpu_drv.c                                    |    2 
 drivers/accel/ivpu/ivpu_pm.c                                     |    4 
 drivers/accel/ivpu/ivpu_pm.h                                     |    2 
 drivers/acpi/arm64/iort.c                                        |    4 
 drivers/acpi/riscv/cppc.c                                        |    4 
 drivers/bluetooth/hci_vhci.c                                     |   57 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c                          |    2 
 drivers/gpu/drm/amd/amdgpu/dce_v10_0.c                           |    5 
 drivers/gpu/drm/amd/amdgpu/dce_v11_0.c                           |    5 
 drivers/gpu/drm/amd/amdgpu/dce_v6_0.c                            |    5 
 drivers/gpu/drm/amd/amdgpu/dce_v8_0.c                            |    5 
 drivers/gpu/drm/amd/amdgpu/mes_v11_0.c                           |    5 
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c                           |    6 
 drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c            |    8 
 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.c             |    9 
 drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.h             |    2 
 drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c             |    1 
 drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c        |   72 +++++
 drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.h        |    2 
 drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_init.c         |    1 
 drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h                      |    3 
 drivers/gpu/drm/bridge/ti-sn65dsi86.c                            |   11 
 drivers/gpu/drm/display/drm_dp_helper.c                          |    2 
 drivers/gpu/drm/nouveau/gv100_fence.c                            |    7 
 drivers/gpu/drm/nouveau/include/nvhw/class/clc36f.h              |   85 ++++++
 drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c                  |    2 
 drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga100.c                 |   23 +
 drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga102.c                 |    1 
 drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h                  |    2 
 drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c           |    1 
 drivers/gpu/drm/rockchip/rockchip_drm_vop2.c                     |    9 
 drivers/gpu/drm/xe/xe_bo.c                                       |    3 
 drivers/hwmon/ina238.c                                           |    9 
 drivers/hwmon/mlxreg-fan.c                                       |    5 
 drivers/isdn/mISDN/dsp_hwec.c                                    |    6 
 drivers/md/md.c                                                  |    5 
 drivers/md/raid1.c                                               |    2 
 drivers/net/dsa/mv88e6xxx/leds.c                                 |   17 +
 drivers/net/ethernet/broadcom/bnxt/bnxt.c                        |    2 
 drivers/net/ethernet/cadence/macb_main.c                         |   28 +-
 drivers/net/ethernet/cavium/thunder/thunder_bgx.c                |   20 -
 drivers/net/ethernet/intel/e1000e/ethtool.c                      |   10 
 drivers/net/ethernet/intel/i40e/i40e_client.c                    |    4 
 drivers/net/ethernet/intel/i40e/i40e_debugfs.c                   |  123 +---------
 drivers/net/ethernet/intel/ice/ice_main.c                        |   12 
 drivers/net/ethernet/intel/ice/ice_ptp.c                         |   13 -
 drivers/net/ethernet/intel/idpf/idpf_lib.c                       |    9 
 drivers/net/ethernet/intel/idpf/idpf_virtchnl.c                  |   12 
 drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c                 |    4 
 drivers/net/ethernet/mediatek/mtk_eth_soc.c                      |   10 
 drivers/net/ethernet/mellanox/mlx4/en_rx.c                       |    4 
 drivers/net/ethernet/microchip/lan865x/lan865x.c                 |    7 
 drivers/net/ethernet/oa_tc6.c                                    |    3 
 drivers/net/ethernet/ti/am65-cpsw-nuss.c                         |    2 
 drivers/net/ethernet/xilinx/xilinx_axienet_main.c                |   10 
 drivers/net/ethernet/xircom/xirc2ps_cs.c                         |    2 
 drivers/net/macsec.c                                             |    8 
 drivers/net/mctp/mctp-usb.c                                      |    1 
 drivers/net/pcs/pcs-rzn1-miic.c                                  |    2 
 drivers/net/phy/mscc/mscc_ptp.c                                  |   18 -
 drivers/net/ppp/ppp_generic.c                                    |    6 
 drivers/net/usb/cdc_ncm.c                                        |    7 
 drivers/net/vxlan/vxlan_core.c                                   |   18 -
 drivers/net/vxlan/vxlan_private.h                                |    4 
 drivers/net/wireless/ath/ath11k/core.h                           |    2 
 drivers/net/wireless/ath/ath11k/mac.c                            |  111 ++++++++-
 drivers/net/wireless/ath/ath12k/wmi.c                            |    1 
 drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c        |    6 
 drivers/net/wireless/intel/iwlwifi/fw/acpi.c                     |   25 +-
 drivers/net/wireless/intel/iwlwifi/fw/runtime.h                  |    8 
 drivers/net/wireless/intel/iwlwifi/fw/uefi.c                     |    6 
 drivers/net/wireless/intel/iwlwifi/pcie/drv.c                    |   22 +
 drivers/net/wireless/marvell/libertas/cfg.c                      |    9 
 drivers/net/wireless/marvell/mwifiex/cfg80211.c                  |    5 
 drivers/net/wireless/marvell/mwifiex/main.c                      |    4 
 drivers/net/wireless/mediatek/mt76/mac80211.c                    |   41 +++
 drivers/net/wireless/mediatek/mt76/mt76.h                        |    1 
 drivers/net/wireless/mediatek/mt76/mt7915/mac.c                  |   12 
 drivers/net/wireless/mediatek/mt76/mt7921/main.c                 |    5 
 drivers/net/wireless/mediatek/mt76/mt7925/mac.c                  |    2 
 drivers/net/wireless/mediatek/mt76/mt7925/main.c                 |    7 
 drivers/net/wireless/mediatek/mt76/mt7925/mcu.c                  |   12 
 drivers/net/wireless/mediatek/mt76/mt7996/mac.c                  |   56 ++--
 drivers/net/wireless/mediatek/mt76/mt7996/main.c                 |    5 
 drivers/net/wireless/mediatek/mt76/mt7996/mcu.c                  |   15 -
 drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h               |    1 
 drivers/net/wireless/mediatek/mt76/tx.c                          |   12 
 drivers/net/wireless/st/cw1200/sta.c                             |    2 
 drivers/of/of_numa.c                                             |    5 
 drivers/pcmcia/omap_cf.c                                         |    2 
 drivers/pcmcia/rsrc_iodyn.c                                      |    3 
 drivers/pcmcia/rsrc_nonstatic.c                                  |    4 
 drivers/platform/x86/acer-wmi.c                                  |   71 -----
 drivers/platform/x86/amd/pmc/pmc-quirks.c                        |   68 +++--
 drivers/platform/x86/amd/pmc/pmc.c                               |   13 -
 drivers/platform/x86/asus-nb-wmi.c                               |    2 
 drivers/platform/x86/asus-wmi.c                                  |    9 
 drivers/platform/x86/intel/tpmi_power_domains.c                  |    2 
 drivers/ptp/ptp_ocp.c                                            |    3 
 drivers/scsi/lpfc/lpfc_nvmet.c                                   |   10 
 drivers/scsi/sr.c                                                |   16 -
 drivers/soc/qcom/mdt_loader.c                                    |   12 
 drivers/spi/spi-fsl-lpspi.c                                      |   24 +
 drivers/spi/spi-microchip-core-qspi.c                            |   12 
 drivers/spi/spi-qpic-snand.c                                     |    6 
 drivers/tee/optee/ffa_abi.c                                      |    4 
 drivers/tee/tee_shm.c                                            |   14 -
 fs/btrfs/btrfs_inode.h                                           |    2 
 fs/btrfs/extent_io.c                                             |   17 +
 fs/btrfs/inode.c                                                 |    1 
 fs/btrfs/tree-log.c                                              |   78 ++++--
 fs/btrfs/zoned.c                                                 |   55 ++--
 fs/fs-writeback.c                                                |    9 
 fs/ocfs2/inode.c                                                 |    3 
 fs/proc/generic.c                                                |   38 +--
 fs/smb/client/cifs_unicode.c                                     |    3 
 include/linux/cpuhotplug.h                                       |    1 
 include/linux/pgalloc.h                                          |   29 ++
 include/linux/pgtable.h                                          |   25 +-
 include/linux/vmalloc.h                                          |   16 -
 include/net/sock.h                                               |   17 -
 include/uapi/linux/netfilter/nf_tables.h                         |    2 
 kernel/auditfilter.c                                             |    2 
 kernel/sched/topology.c                                          |    2 
 mm/kasan/init.c                                                  |   12 
 mm/kasan/kasan_test_c.c                                          |    2 
 mm/kmemleak.c                                                    |   27 +-
 mm/percpu.c                                                      |    6 
 mm/slub.c                                                        |   37 ++-
 mm/sparse-vmemmap.c                                              |   11 
 mm/sparse.c                                                      |   15 -
 mm/userfaultfd.c                                                 |    9 
 net/appletalk/atalk_proc.c                                       |    2 
 net/atm/resources.c                                              |    6 
 net/ax25/ax25_in.c                                               |    4 
 net/batman-adv/network-coding.c                                  |    7 
 net/bluetooth/af_bluetooth.c                                     |    2 
 net/bluetooth/hci_sync.c                                         |    2 
 net/bluetooth/l2cap_sock.c                                       |    3 
 net/bridge/br_netfilter_hooks.c                                  |    3 
 net/core/gen_estimator.c                                         |    2 
 net/core/sock.c                                                  |   33 --
 net/ipv4/devinet.c                                               |    7 
 net/ipv4/icmp.c                                                  |    6 
 net/ipv4/inet_connection_sock.c                                  |   27 --
 net/ipv4/inet_diag.c                                             |    2 
 net/ipv4/inet_hashtables.c                                       |    4 
 net/ipv4/ping.c                                                  |    2 
 net/ipv4/raw.c                                                   |    2 
 net/ipv4/tcp_ipv4.c                                              |    8 
 net/ipv4/udp.c                                                   |   16 -
 net/ipv6/datagram.c                                              |    2 
 net/ipv6/ip6_icmp.c                                              |    6 
 net/ipv6/tcp_ipv6.c                                              |   36 +-
 net/key/af_key.c                                                 |    2 
 net/llc/llc_proc.c                                               |    2 
 net/mac80211/mlme.c                                              |    8 
 net/mac80211/tests/chan-mode.c                                   |   30 ++
 net/mctp/af_mctp.c                                               |    2 
 net/mctp/route.c                                                 |   35 +-
 net/mptcp/protocol.c                                             |    1 
 net/netfilter/nf_conntrack_helper.c                              |    4 
 net/netfilter/nf_tables_api.c                                    |   42 ++-
 net/netlink/diag.c                                               |    2 
 net/packet/af_packet.c                                           |    2 
 net/packet/diag.c                                                |    2 
 net/phonet/socket.c                                              |    4 
 net/sctp/input.c                                                 |    2 
 net/sctp/proc.c                                                  |    4 
 net/sctp/socket.c                                                |    4 
 net/smc/smc_clc.c                                                |    2 
 net/smc/smc_diag.c                                               |    2 
 net/smc/smc_ib.c                                                 |    3 
 net/tipc/socket.c                                                |    2 
 net/unix/af_unix.c                                               |    2 
 net/unix/diag.c                                                  |    2 
 net/wireless/scan.c                                              |    3 
 net/wireless/sme.c                                               |    5 
 net/xdp/xsk_diag.c                                               |    2 
 rust/kernel/mm/virt.rs                                           |    1 
 scripts/Makefile.kasan                                           |   12 
 scripts/generate_rust_target.rs                                  |   12 
 sound/pci/hda/patch_hdmi.c                                       |    1 
 sound/pci/hda/patch_realtek.c                                    |    2 
 sound/pci/hda/tas2781_hda_i2c.c                                  |    5 
 sound/soc/renesas/rcar/core.c                                    |    2 
 sound/soc/soc-core.c                                             |    5 
 sound/soc/sof/intel/ptl.c                                        |    1 
 sound/usb/format.c                                               |   12 
 sound/usb/mixer_quirks.c                                         |    2 
 tools/gpio/Makefile                                              |    2 
 tools/net/ynl/pyynl/ynl_gen_c.py                                 |    2 
 tools/perf/util/bpf-event.c                                      |   39 ++-
 tools/perf/util/bpf-utils.c                                      |   61 +++-
 tools/power/cpupower/utils/cpupower-set.c                        |    4 
 tools/testing/selftests/drivers/net/hw/csum.py                   |    4 
 tools/testing/selftests/net/bind_bhash.c                         |    4 
 tools/testing/selftests/net/netfilter/conntrack_clash.sh         |    2 
 tools/testing/selftests/net/netfilter/conntrack_resize.sh        |    5 
 tools/testing/selftests/net/netfilter/nft_flowtable.sh           |  113 ++++++---
 tools/testing/selftests/net/netfilter/udpclash.c                 |    2 
 229 files changed, 1706 insertions(+), 917 deletions(-)

Aaron Erhardt (1):
ALSA: hda/realtek: Fix headset mic for TongFang X6[AF]R5xxY

Abin Joseph (1):
net: xilinx: axienet: Add error handling for RX metadata pointer retrieval

Ada Couprie Diaz (1):
kasan: fix GCC mem-intrinsic prefix with sw tags

Ajye Huang (1):
ASoC: SOF: Intel: WCL: Add the sdw_process_wakeen op

Alex Deucher (2):
drm/amdgpu: drop hw access in non-DC audio fini drm/amdgpu/mes11: make MES_MISC_OP_CHANGE_CONFIG failure non-fatal

Alexandre Ghiti (2):
riscv: Fix sparse warning in __get_user_error()
riscv: Fix sparse warning about different address spaces

Alok Tiwari (4):
xirc2ps_cs: fix register access when enabling FullDuplex
bnxt_en: fix incorrect page count in RX aggr ring log
ixgbe: fix incorrect map used in eee linkmode
mctp: return -ENOPROTOOPT for unknown getsockopt options

Antheas Kapenekakis (1):
platform/x86: asus-wmi: Remove extra keys from ignore_key_wlan quirk

Anup Patel (1):
ACPI: RISC-V: Fix FFH_CPPC_CSR error handling

Armin Wolf (1):
platform/x86: acer-wmi: Stop using ACPI bitmap for platform profile choices

Asbjørn Sloth Tønnesen (1):
tools: ynl-gen: fix nested array counting

Aurelien Jarno (1):
riscv: uaccess: fix __put_user_nocheck for unaligned accesses

Baptiste Lepers (1):
rust: mm: mark VmaNew as transparent

Benjamin Berg (1):
wifi: mac80211: do not permit 40 MHz EHT operation on 5/6 GHz

Bjorn Andersson (1):
soc: qcom: mdt_loader: Deal with zero e_shentsize

Breno Leitao (1):
riscv: kexec: Initialize kexec_buf struct

Chad Monroe (1):
wifi: mt76: mt7996: use the correct vif link for scanning/roc

Chen Ni (1):
pcmcia: omap: Add missing check for platform_get_resource

Chen-Yu Tsai (1):
arm64: dts: rockchip: Add supplies for eMMC on rk3588-orangepi-5

Chris Packham (1):
hwmon: (ina238) Correctly clamp temperature

Christian Loehle (1):
sched: Fix sched_numa_find_nth_cpu() if mask offline

Christoffer Sandberg (1):
platform/x86/amd/pmc: Add TUXEDO IB Pro Gen10 AMD to spurious 8042 quirks list

Christoph Paasch (1):
net/tcp: Fix socket memory leak in TCP-AO failure handling for IPv6

Chukun Pan (1):
arm64: dts: rockchip: mark eeprom as read-only for Radxa E52C

Colin Ian King (1):
drm/amd/amdgpu: Fix missing error return on kzalloc failure

Conor Dooley (1):

      spi: microchip-core-qspi: stop checking viability of op->max_freq in supports_op callback

Cryolitia PukNgae (1):
ALSA: usb-audio: Add mute TLV for playback volumes on some devices

Dan Carpenter (4):
wifi: cw1200: cap SSID length in cw1200_do_join()
wifi: libertas: cap SSID len in lbs_associate()
wifi: cfg80211: sme: cap SSID length in __cfg80211_connect_result()
ipv4: Fix NULL vs error pointer check in inet_blackhole_dev_init()

Dave Airlie (1):
nouveau: fix disabling the nonstall irq due to storm code

David Arcari (1):
platform/x86/intel: power-domains: Use topology_logical_package_id() for package ID

Dmitry Antipov (1):

      wifi: cfg80211: fix use-after-free in cmp_bss()

Duoming Zhou (2):
wifi: brcmfmac: fix use-after-free when rescheduling brcmf_btcoex_info work
ptp: ocp: fix use-after-free bugs causing by ptp_ocp_watchdog

Edward Adam Davis (1):
ocfs2: prevent release journal inode after journal shutdown

Emil Tantilov (1):
idpf: set mac type when adding and removing MAC filters

Emmanuel Grumbach (1):
wifi: iwlwifi: if scratch is ~0U, consider it a failure

Eric Dumazet (4):
net_sched: gen_estimator: fix est_timer() vs CONFIG_PREEMPT_RT=y
net: remove sock_i_uid()
net: lockless sock_i_ino()
ax25: properly unshare skbs in ax25_kiss_rcv()

Fabian Bläse (1):
icmp: fix icmp_ndo_send address translation for reply direction

Faith Ekstrand (1):
nouveau: Membar before between semaphore writes and the interrupt

Felix Fietkau (7):
wifi: mt76: prevent non-offchannel mgmt tx during scan/roc
wifi: mt76: mt7996: disable beacons when going offchannel
wifi: mt76: mt7996: add missing check for rx wcid entries
wifi: mt76: mt7915: fix list corruption after hardware restart
wifi: mt76: free pending offchannel tx frames on wcid cleanup
wifi: mt76: fix linked list corruption
net: ethernet: mtk_eth_soc: fix tx vlan tag for llc packets

Filipe Manana (3):
btrfs: fix race between logging inode and checking if it was logged before
btrfs: fix race between setting last_dir_index_offset and inode logging
btrfs: avoid load/store tearing races when checking if an inode was logged

Florian Westphal (2):
netfilter: nft_flowtable.sh: re-run with random mtu sizes
selftests: netfilter: fix udpclash tool hang

Gabor Juhos (1):
spi: spi-qpic-snand: unregister ECC engine on probe error and device remove

Gergo Koteles (2):
ALSA: hda: tas2781: fix tas2563 EFI data endianness
ALSA: hda: tas2781: reorder tas2563 calibration variables

Greg Kroah-Hartman (1):

      Linux 6.16.6

Gu Bowen (1):
mm: fix possible deadlock in kmemleak

Guenter Roeck (2):
hwmon: (ina238) Correctly clamp shunt voltage limit
hwmon: (ina238) Correctly clamp power limits

Harry Yoo (3):
x86/mm/64: define ARCH_PAGE_TABLE_SYNC_MASK and arch_sync_kernel_mappings()
mm: move page table sync declarations to linux/pgtable.h
mm: introduce and use {pgd,p4d}_populate_kernel()

Harshit Mogalapalli (1):

      wifi: mt76: mt7925: fix locking in mt7925_change_vif_links()

Horatiu Vultur (1):
phy: mscc: Stop taking ts_lock for tx_queue and use its own lock

Huacai Chen (1):
LoongArch: Save LBT before FPU in setup_sigcontext()

Ian Rogers (3):
perf bpf-event: Fix use-after-free in synthesis perf bpf-utils: Constify bpil_array_desc perf bpf-utils: Harden get_bpf_prog_info_linear

Ido Schimmel (2):
vxlan: Fix NPD when refreshing an FDB entry with a nexthop object
vxlan: Fix NPD in {arp,neigh}_reduce() when using nexthop objects

Imre Deak (1):
drm/dp: Change AUX DPCD probe address from LANE0_1_STATUS to TRAINING_PATTERN_SET

Ivan Lipski (1):
drm/amd/display: Clear the CUR_ENABLE register on DCN314 w/out DPP PG

Ivan Pravdin (1):
Bluetooth: vhci: Prevent use-after-free by removing debugfs files early

Jacob Keller (3):

      ice: fix NULL access of tx->in_use in ice_ptp_ts_irq
      ice: fix NULL access of tx->in_use in ice_ll_ts_intr
      i40e: remove read access to debugfs files

Jakub Kicinski (1):
selftests: drv-net: csum: fix interface name for remote host

Janusz Dziedzic (1):
wifi: mt76: mt7921: don't disconnect when CSA to DFS chan

Jeremy Kerr (2):
net: mctp: mctp_fraq_queue should take ownership of passed skb
net: mctp: usb: initialise mac header in RX path

Jesse.Zhang (1):
drm/amdgpu/sdma: bump firmware version checks for user queue support

Jiufei Xue (1):
fs: writeback: fix use-after-free in __mark_inode_dirty()

Johannes Berg (4):
wifi: iwlwifi: acpi: check DSM func validity
wifi: iwlwifi: uefi: check DSM item validity
wifi: iwlwifi: cfg: restore some 1000 series configs
wifi: iwlwifi: cfg: add back more lost PCI IDs

Johannes Thumshirn (1):
btrfs: zoned: skip ZONE FINISH of conventional zones

John Evans (1):
scsi: lpfc: Fix buffer free/clear order in deferred receive path

Joonas Lahtinen (1):
Revert "drm/i915/gem: Allow EXEC_CAPTURE on recoverable contexts on DG1"

Karol Wachowski (1):
accel/ivpu: Prevent recovery work from being queued during device removal

Kuninori Morimoto (2):
ASoC: soc-core: care NULL dirver name on snd_soc_lookup_component_nolocked()
ASoC: rsnd: tidyup direction name on rsnd_dai_connect()

Kuniyuki Iwashima (2):
Bluetooth: Fix use-after-free in l2cap_sock_cleanup_listen()
selftest: net: Fix weird setsockopt() in bind_bhash.c.

Lad Prabhakar (1):
net: pcs: rzn1-miic: Correct MODCTRL register offset

Larisa Grigore (4):
spi: spi-fsl-lpspi: Fix transmissions when using CONT
spi: spi-fsl-lpspi: Set correct chip-select polarity bit
spi: spi-fsl-lpspi: Reset FIFO and disable module on transfer abort
spi: spi-fsl-lpspi: Clear status register after disabling the module

Li Nan (1):
md: prevent incorrect update of resync/recovery offset

Li Qiong (1):
mm/slub: avoid accessing metadata when pointer is invalid in object_err()

Liu Jian (1):
net/smc: fix one NULL pointer dereference in smc_ib_is_sg_need_sync()

Lubomir Rintel (1):
cdc_ncm: Flag Intel OEM version of Fibocom L850-GL as WWAN

Ma Ke (1):
pcmcia: Fix a NULL pointer dereference in __iodyn_find_io_region()

Mahanta Jambigi (1):
net/smc: Remove validation of reserved bits in CLC Decline message

Makar Semyonov (1):
cifs: prevent NULL pointer dereference in UTF16 conversion

Marek Vasut (2):
arm64: dts: imx8mp: Fix missing microSD slot vqmmc on DH electronics i.MX8M Plus DHCOM
arm64: dts: imx8mp: Fix missing microSD slot vqmmc on Data Modul i.MX8M Plus eDM SBC

Mario Limonciello (1):
platform/x86/amd: pmc: Drop SMU F/W match for Cezanne

Markus Niebel (1):
arm64: dts: imx8mp-tqma8mpql: fix LDO5 power off

Maud Spierings (1):
arm64: dts: rockchip: Fix the headphone detection on the orangepi 5 plus

Miaoqian Lin (4):
mISDN: Fix memory leak in dsp_hwec_enable()
eth: mlx4: Fix IS_ERR() vs NULL check bug in mlx4_en_create_rx_ring ACPI/IORT: Fix memory leak in iort_rmr_alloc_sids()
net: dsa: mv88e6xxx: Fix fwnode reference leaks in mv88e6xxx_port_setup_leds

Michael Walle (1):
drm/bridge: ti-sn65dsi86: fix REFCLK setting

Miguel Ojeda (1):
rust: support Rust >= 1.91.0 target spec

Ming Lei (1):
scsi: sr: Reinstate rotational media flag

Ming Yen Hsieh (3):
wifi: mt76: mt7925u: use connac3 tx aggr check in tx complete
wifi: mt76: mt7925: fix the wrong bss cleanup for SAP
wifi: mt76: mt7925: skip EHT MLD TLV on non-MLD and pass conn_state for sta_cmd

Nathan Chancellor (2):
wifi: mt76: mt7996: Initialize hdr before passing to skb_put_data()
riscv: Only allow LTO with CMODEL_MEDANY

Nishanth Menon (1):
net: ethernet: ti: am65-cpsw-nuss: Fix null pointer dereference for ndev

Pei Xiao (2):
tee: fix NULL pointer dereference in tee_shm_put
tee: fix memory leak in tee_dyn_shm_alloc_helper

Peter Robinson (1):
arm64: dts: rockchip: Add vcc-supply to SPI flash on rk3399-pinebook-pro

Phil Sutter (2):
netfilter: conntrack: helper: Replace -EEXIST by -EBUSY
netfilter: nf_tables: Introduce NFTA_DEVICE_PREFIX

Piotr Zalewski (1):
drm/rockchip: vop2: make vp registers nonvolatile

Qianfeng Rong (1):
wifi: mwifiex: Initialize the chan_stats array to zero

Qingfang Deng (1):
ppp: fix memory leak in pad_compress_skb

Qu Wenruo (1):
btrfs: clear block dirty if submit_one_sector() failed

Radim Krčmář (4):
riscv: use lw when reading int cpu in new_vmalloc_check
riscv: use lw when reading int cpu in asm_per_cpu riscv, bpf: use lw when reading int cpu in BPF_MOV64_PERCPU_REG riscv, bpf: use lw when reading int cpu in bpf_get_smp_processor_id

Rameshkumar Sundaram (1):
wifi: ath11k: fix group data packet drops during rekey

Ramya Gnanasekar (1):
wifi: ath12k: Set EMLSR support flag in MLO flags for EML-capable stations

Rosen Penev (2):
net: thunder_bgx: add a missing of_node_put
net: thunder_bgx: decrement cleanup index before use

Ryan Wanner (1):
ARM: dts: microchip: sama7d65: Force SDMMC Legacy mode

Sabrina Dubroca (1):
macsec: read MACSEC_SA_ATTR_PN with nla_get_uint

Sasha Levin (1):
mm/userfaultfd: fix kmap_local LIFO ordering for CONFIG_HIGHPTE

Sean Anderson (1):
net: macb: Fix tx_ptr_lock locking

Shinji Nomoto (1):
cpupower: Fix a bug where the -t option of the set subcommand was not working.

Stanislav Fort (2):
audit: fix out-of-bounds read in audit_compare_dname_path()
batman-adv: fix OOB read/write in network-coding decode

Stefan Wahren (3):
net: ethernet: oa_tc6: Handle failure of spi_setup
microchip: lan865x: Fix module autoloading
microchip: lan865x: Fix LAN8651 autoloading

Sumanth Korikkar (1):
mm: fix accounting of memmap pages

Sungbae Yoo (1):
tee: optee: ffa: fix a typo of "optee_ffa_api_is_compatible"

Takashi Iwai (2):
ALSA: hda/hdmi: Add pin fix for another HP EliteDesk 800 G4 model platform/x86: asus-wmi: Fix racy registrations

Thomas Hellström (1):
drm/xe: Fix incorrect migration of backed-up object to VRAM

Timur Kristóf (1):
drm/amd/display: Don't warn when missing DCE encoder caps

Tina Wuest (1):
ALSA: usb-audio: Allow Focusrite devices to use low samplerates

Vadim Pasternak (1):
hwmon: mlxreg-fan: Prevent fans from getting stuck at 0 RPM

Ville Syrjälä (1):
drm/i915/gem: Allow EXEC_CAPTURE on recoverable contexts on DG1

Vitaly Lifshits (1):
e1000e: fix heap overflow in e1000_set_eeprom

Wang Liang (2):
netfilter: br_netfilter: do not check confirmed bit in br_nf_local_in() after confirm
net: atm: fix memory leak in atm_register_sysfs when device_register fail

Wentao Liang (1):
pcmcia: Add error handling for add_interval() in do_validate_mem()

Xianglai Li (1):
LoongArch: Add cpuhotplug hooks to fix high cpu usage of vCPU threads

Yang Li (1):
Bluetooth: hci_sync: Avoid adding default advertising on startup

Yeoreum Yun (1):
kunit: kasan_test: disable fortify string checker on kasan_strings() test

Yin Tirui (1):
of_numa: fix uninitialized memory nodes causing kernel panic

Yu Kuai (1):
md/raid1: fix data lost for writemostly rdev

Zhen Ni (1):
i40e: Fix potential invalid access when MAC list is empty

panfan (1):
arm64: ftrace: fix unreachable PLT for ftrace_caller in init_module with CONFIG_DYNAMIC_FTRACE

wangzijie (1):
proc: fix missing pde_set_flags() for net proc files

yangshiguang (1):
mm: slub: avoid wake up kswapd in set_track_prepare

zhang jiao (1):
tools: gpio: remove the include directory on make clean

author maintainer
#1 lore raw
Makefile +1 -1
index 58a78d215577..0200497da26c 100644
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 6
 PATCHLEVEL = 16
-SUBLEVEL = 5
+SUBLEVEL = 6
 EXTRAVERSION =
 NAME = Baby Opossum Posse
 
arch/arm/boot/dts/microchip/at91-sama7d65_curiosity.dts +2 -0
index 53a657cf4efb..dfe1f0616a81 100644
@@ -352,6 +352,8 @@ &rtt {
 
 &sdmmc1 {
 	bus-width = <4>;
+	no-1-8-v;
+	sdhci-caps-mask = <0x0 0x00200000>;
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_sdmmc1_default>;
 	status = "okay";
arch/arm64/boot/dts/freescale/imx8mp-data-modul-edm-sbc.dts +1 -0
index d0fc5977258f..16078ff60ef0 100644
@@ -555,6 +555,7 @@ &usdhc2 {
 	pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
 	cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
 	vmmc-supply = <&reg_usdhc2_vmmc>;
+	vqmmc-supply = <&ldo5>;
 	bus-width = <4>;
 	status = "okay";
 };
arch/arm64/boot/dts/freescale/imx8mp-dhcom-som.dtsi +1 -0
index 7f754e0a5d69..68c2e0156a5c 100644
@@ -609,6 +609,7 @@ &usdhc2 {
 	pinctrl-2 = <&pinctrl_usdhc2_200mhz>, <&pinctrl_usdhc2_gpio>;
 	cd-gpios = <&gpio2 12 GPIO_ACTIVE_LOW>;
 	vmmc-supply = <&reg_usdhc2_vmmc>;
+	vqmmc-supply = <&ldo5>;
 	bus-width = <4>;
 	status = "okay";
 };
arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mp-ras314.dts +7 -6
index d7fd9d36f824..f7346b3d35fe 100644
@@ -467,6 +467,10 @@ &pwm4 {
 	status = "okay";
 };
 
+&reg_usdhc2_vqmmc {
+	status = "okay";
+};
+
 &sai5 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_sai5>;
@@ -876,8 +880,7 @@ pinctrl_usdhc2: usdhc2grp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d2>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d2>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d2>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d2>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d2>;
 	};
 
 	pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
@@ -886,8 +889,7 @@ pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d4>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>;
 	};
 
 	pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
@@ -896,8 +898,7 @@ pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d4>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>;
 	};
 
 	pinctrl_usdhc2_gpio: usdhc2-gpiogrp {
arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql-mba8mpxl.dts +7 -6
index 23c612e80dd3..092b1b65a88c 100644
@@ -603,6 +603,10 @@ &pwm3 {
 	status = "okay";
 };
 
+&reg_usdhc2_vqmmc {
+	status = "okay";
+};
+
 &sai3 {
 	pinctrl-names = "default";
 	pinctrl-0 = <&pinctrl_sai3>;
@@ -982,8 +986,7 @@ pinctrl_usdhc2: usdhc2grp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d2>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d2>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d2>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d2>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d2>;
 	};
 
 	pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
@@ -992,8 +995,7 @@ pinctrl_usdhc2_100mhz: usdhc2-100mhzgrp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d4>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>;
 	};
 
 	pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
@@ -1002,8 +1004,7 @@ pinctrl_usdhc2_200mhz: usdhc2-200mhzgrp {
 			   <MX8MP_IOMUXC_SD2_DATA0__USDHC2_DATA0	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA1__USDHC2_DATA1	0x1d4>,
 			   <MX8MP_IOMUXC_SD2_DATA2__USDHC2_DATA2	0x1d4>,
-			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>,
-			   <MX8MP_IOMUXC_GPIO1_IO04__USDHC2_VSELECT	0xc0>;
+			   <MX8MP_IOMUXC_SD2_DATA3__USDHC2_DATA3	0x1d4>;
 	};
 
 	pinctrl_usdhc2_gpio: usdhc2-gpiogrp {
arch/arm64/boot/dts/freescale/imx8mp-tqma8mpql.dtsi +22 -0
index 6067ca3be814..0a592fa2d8bc 100644
@@ -24,6 +24,20 @@ reg_vcc3v3: regulator-vcc3v3 {
 		regulator-max-microvolt = <3300000>;
 		regulator-always-on;
 	};
+
+	reg_usdhc2_vqmmc: regulator-usdhc2-vqmmc {
+		compatible = "regulator-gpio";
+		pinctrl-names = "default";
+		pinctrl-0 = <&pinctrl_reg_usdhc2_vqmmc>;
+		regulator-name = "V_SD2";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
+		states = <1800000 0x1>,
+			 <3300000 0x0>;
+		vin-supply = <&ldo5_reg>;
+		status = "disabled";
+	};
 };
 
 &A53_0 {
@@ -180,6 +194,10 @@ m24c64: eeprom@57 {
 	};
 };
 
+&usdhc2 {
+	vqmmc-supply = <&reg_usdhc2_vqmmc>;
+};
+
 &usdhc3 {
 	pinctrl-names = "default", "state_100mhz", "state_200mhz";
 	pinctrl-0 = <&pinctrl_usdhc3>;
@@ -229,6 +247,10 @@ pinctrl_reg_usdhc2_vmmc: regusdhc2vmmcgrp {
 		fsl,pins = <MX8MP_IOMUXC_SD2_RESET_B__GPIO2_IO19	0x10>;
 	};
 
+	pinctrl_reg_usdhc2_vqmmc: regusdhc2vqmmcgrp {
+		fsl,pins = <MX8MP_IOMUXC_GPIO1_IO04__GPIO1_IO04		0xc0>;
+	};
+
 	pinctrl_usdhc3: usdhc3grp {
 		fsl,pins = <MX8MP_IOMUXC_NAND_WE_B__USDHC3_CLK		0x194>,
 			   <MX8MP_IOMUXC_NAND_WP_B__USDHC3_CMD		0x1d4>,
arch/arm64/boot/dts/rockchip/rk3399-pinebook-pro.dts +1 -0
index 5473070823cb..6cadde440fff 100644
@@ -966,6 +966,7 @@ spiflash: flash@0 {
 		reg = <0>;
 		m25p,fast-read;
 		spi-max-frequency = <10000000>;
+		vcc-supply = <&vcc_3v0>;
 	};
 };
 
arch/arm64/boot/dts/rockchip/rk3582-radxa-e52c.dts +1 -0
index e04f21d8c831..431ff77d4518 100644
@@ -250,6 +250,7 @@ eeprom@50 {
 		compatible = "belling,bl24c16a", "atmel,24c16";
 		reg = <0x50>;
 		pagesize = <16>;
+		read-only;
 		vcc-supply = <&vcc_3v3_pmu>;
 	};
 };
arch/arm64/boot/dts/rockchip/rk3588-orangepi-5-plus.dts +1 -1
index 121e4d1c3fa5..8222f1fae8fa 100644
@@ -77,7 +77,7 @@ &analog_sound {
 	pinctrl-names = "default";
 	pinctrl-0 = <&hp_detect>;
 	simple-audio-card,aux-devs = <&speaker_amp>, <&headphone_amp>;
-	simple-audio-card,hp-det-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_LOW>;
+	simple-audio-card,hp-det-gpios = <&gpio1 RK_PD3 GPIO_ACTIVE_HIGH>;
 	simple-audio-card,widgets =
 		"Microphone", "Onboard Microphone",
 		"Microphone", "Microphone Jack",
arch/arm64/boot/dts/rockchip/rk3588-orangepi-5.dtsi +2 -0
index 91d56c34a1e4..8a8f3b26754d 100644
@@ -365,6 +365,8 @@ &sdhci {
 	max-frequency = <200000000>;
 	mmc-hs400-1_8v;
 	mmc-hs400-enhanced-strobe;
+	vmmc-supply = <&vcc_3v3_s3>;
+	vqmmc-supply = <&vcc_1v8_s3>;
 	status = "okay";
 };
 
arch/arm64/include/asm/module.h +1 -0
index 79550b22ba19..fb9b88eebeb1 100644
@@ -19,6 +19,7 @@ struct mod_arch_specific {
 
 	/* for CONFIG_DYNAMIC_FTRACE */
 	struct plt_entry	*ftrace_trampolines;
+	struct plt_entry	*init_ftrace_trampolines;
 };
 
 u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
arch/arm64/include/asm/module.lds.h +1 -0
index b9ae8349e35d..fb944b46846d 100644
@@ -2,6 +2,7 @@ SECTIONS {
 	.plt 0 : { BYTE(0) }
 	.init.plt 0 : { BYTE(0) }
 	.text.ftrace_trampoline 0 : { BYTE(0) }
+	.init.text.ftrace_trampoline 0 : { BYTE(0) }
 
 #ifdef CONFIG_KASAN_SW_TAGS
 	/*
arch/arm64/kernel/ftrace.c +10 -3
index 5a890714ee2e..5adad37ab4fa 100644
@@ -258,10 +258,17 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
 	return ftrace_modify_code(pc, 0, new, false);
 }
 
-static struct plt_entry *get_ftrace_plt(struct module *mod)
+static struct plt_entry *get_ftrace_plt(struct module *mod, unsigned long addr)
 {
 #ifdef CONFIG_MODULES
-	struct plt_entry *plt = mod->arch.ftrace_trampolines;
+	struct plt_entry *plt = NULL;
+
+	if (within_module_mem_type(addr, mod, MOD_INIT_TEXT))
+		plt = mod->arch.init_ftrace_trampolines;
+	else if (within_module_mem_type(addr, mod, MOD_TEXT))
+		plt = mod->arch.ftrace_trampolines;
+	else
+		return NULL;
 
 	return &plt[FTRACE_PLT_IDX];
 #else
@@ -332,7 +339,7 @@ static bool ftrace_find_callable_addr(struct dyn_ftrace *rec,
 	if (WARN_ON(!mod))
 		return false;
 
-	plt = get_ftrace_plt(mod);
+	plt = get_ftrace_plt(mod, pc);
 	if (!plt) {
 		pr_err("ftrace: no module PLT for %ps\n", (void *)*addr);
 		return false;
arch/arm64/kernel/module-plts.c +11 -1
index bde32979c06a..7afd370da9f4 100644
@@ -283,7 +283,7 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 	unsigned long core_plts = 0;
 	unsigned long init_plts = 0;
 	Elf64_Sym *syms = NULL;
-	Elf_Shdr *pltsec, *tramp = NULL;
+	Elf_Shdr *pltsec, *tramp = NULL, *init_tramp = NULL;
 	int i;
 
 	/*
@@ -298,6 +298,9 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		else if (!strcmp(secstrings + sechdrs[i].sh_name,
 				 ".text.ftrace_trampoline"))
 			tramp = sechdrs + i;
+		else if (!strcmp(secstrings + sechdrs[i].sh_name,
+				 ".init.text.ftrace_trampoline"))
+			init_tramp = sechdrs + i;
 		else if (sechdrs[i].sh_type == SHT_SYMTAB)
 			syms = (Elf64_Sym *)sechdrs[i].sh_addr;
 	}
@@ -363,5 +366,12 @@ int module_frob_arch_sections(Elf_Ehdr *ehdr, Elf_Shdr *sechdrs,
 		tramp->sh_size = NR_FTRACE_PLTS * sizeof(struct plt_entry);
 	}
 
+	if (init_tramp) {
+		init_tramp->sh_type = SHT_NOBITS;
+		init_tramp->sh_flags = SHF_EXECINSTR | SHF_ALLOC;
+		init_tramp->sh_addralign = __alignof__(struct plt_entry);
+		init_tramp->sh_size = NR_FTRACE_PLTS * sizeof(struct plt_entry);
+	}
+
 	return 0;
 }
arch/arm64/kernel/module.c +11 -0
index 06bb680bfe97..8b6f5cd58883 100644
@@ -453,6 +453,17 @@ static int module_init_ftrace_plt(const Elf_Ehdr *hdr,
 	__init_plt(&plts[FTRACE_PLT_IDX], FTRACE_ADDR);
 
 	mod->arch.ftrace_trampolines = plts;
+
+	s = find_section(hdr, sechdrs, ".init.text.ftrace_trampoline");
+	if (!s)
+		return -ENOEXEC;
+
+	plts = (void *)s->sh_addr;
+
+	__init_plt(&plts[FTRACE_PLT_IDX], FTRACE_ADDR);
+
+	mod->arch.init_ftrace_trampolines = plts;
+
 #endif
 	return 0;
 }
arch/loongarch/kernel/signal.c +5 -5
index 4740cb5b2388..c9f7ca778364 100644
@@ -677,6 +677,11 @@ static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
 	for (i = 1; i < 32; i++)
 		err |= __put_user(regs->regs[i], &sc->sc_regs[i]);
 
+#ifdef CONFIG_CPU_HAS_LBT
+	if (extctx->lbt.addr)
+		err |= protected_save_lbt_context(extctx);
+#endif
+
 	if (extctx->lasx.addr)
 		err |= protected_save_lasx_context(extctx);
 	else if (extctx->lsx.addr)
@@ -684,11 +689,6 @@ static int setup_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc,
 	else if (extctx->fpu.addr)
 		err |= protected_save_fpu_context(extctx);
 
-#ifdef CONFIG_CPU_HAS_LBT
-	if (extctx->lbt.addr)
-		err |= protected_save_lbt_context(extctx);
-#endif
-
 	/* Set the "end" magic */
 	info = (struct sctx_info *)extctx->end.addr;
 	err |= __put_user(0, &info->magic);
arch/loongarch/kernel/time.c +22 -0
index 367906b10f81..f3092f2de8b5 100644
@@ -5,6 +5,7 @@
  * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
  */
 #include <linux/clockchips.h>
+#include <linux/cpuhotplug.h>
 #include <linux/delay.h>
 #include <linux/export.h>
 #include <linux/init.h>
@@ -102,6 +103,23 @@ static int constant_timer_next_event(unsigned long delta, struct clock_event_dev
 	return 0;
 }
 
+static int arch_timer_starting(unsigned int cpu)
+{
+	set_csr_ecfg(ECFGF_TIMER);
+
+	return 0;
+}
+
+static int arch_timer_dying(unsigned int cpu)
+{
+	constant_set_state_shutdown(this_cpu_ptr(&constant_clockevent_device));
+
+	/* Clear Timer Interrupt */
+	write_csr_tintclear(CSR_TINTCLR_TI);
+
+	return 0;
+}
+
 static unsigned long get_loops_per_jiffy(void)
 {
 	unsigned long lpj = (unsigned long)const_clock_freq;
@@ -172,6 +190,10 @@ int constant_clockevent_init(void)
 	lpj_fine = get_loops_per_jiffy();
 	pr_info("Constant clock event device register\n");
 
+	cpuhp_setup_state(CPUHP_AP_LOONGARCH_ARCH_TIMER_STARTING,
+			  "clockevents/loongarch/timer:starting",
+			  arch_timer_starting, arch_timer_dying);
+
 	return 0;
 }
 
arch/riscv/Kconfig +1 -1
index 1c5544401530..b29eff4ace2d 100644
@@ -69,7 +69,7 @@ config RISCV
 	select ARCH_SUPPORTS_HUGE_PFNMAP if TRANSPARENT_HUGEPAGE
 	select ARCH_SUPPORTS_HUGETLBFS if MMU
 	# LLD >= 14: https://github.com/llvm/llvm-project/issues/50505
-	select ARCH_SUPPORTS_LTO_CLANG if LLD_VERSION >= 140000
+	select ARCH_SUPPORTS_LTO_CLANG if LLD_VERSION >= 140000 && CMODEL_MEDANY
 	select ARCH_SUPPORTS_LTO_CLANG_THIN if LLD_VERSION >= 140000
 	select ARCH_SUPPORTS_MSEAL_SYSTEM_MAPPINGS if 64BIT && MMU
 	select ARCH_SUPPORTS_PAGE_TABLE_CHECK if MMU
arch/riscv/include/asm/asm.h +1 -1
index a8a2af6dfe9d..2a16e88e13de 100644
@@ -91,7 +91,7 @@
 #endif
 
 .macro asm_per_cpu dst sym tmp
-	REG_L \tmp, TASK_TI_CPU_NUM(tp)
+	lw    \tmp, TASK_TI_CPU_NUM(tp)
 	slli  \tmp, \tmp, PER_CPU_OFFSET_SHIFT
 	la    \dst, __per_cpu_offset
 	add   \dst, \dst, \tmp
arch/riscv/include/asm/uaccess.h +4 -4
index b88a6218b7f2..f5f4f7f85543 100644
@@ -209,7 +209,7 @@ do {									\
 		err = 0;						\
 		break;							\
 __gu_failed:								\
-		x = 0;							\
+		x = (__typeof__(x))0;					\
 		err = -EFAULT;						\
 } while (0)
 
@@ -311,7 +311,7 @@ do {								\
 do {								\
 	if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS) &&	\
 	    !IS_ALIGNED((uintptr_t)__gu_ptr, sizeof(*__gu_ptr))) {	\
-		__inttype(x) ___val = (__inttype(x))x;			\
+		__typeof__(*(__gu_ptr)) ___val = (x);		\
 		if (__asm_copy_to_user_sum_enabled(__gu_ptr, &(___val), sizeof(*__gu_ptr))) \
 			goto label;				\
 		break;						\
@@ -438,10 +438,10 @@ unsigned long __must_check clear_user(void __user *to, unsigned long n)
 }
 
 #define __get_kernel_nofault(dst, src, type, err_label)			\
-	__get_user_nocheck(*((type *)(dst)), (type *)(src), err_label)
+	__get_user_nocheck(*((type *)(dst)), (__force __user type *)(src), err_label)
 
 #define __put_kernel_nofault(dst, src, type, err_label)			\
-	__put_user_nocheck(*((type *)(src)), (type *)(dst), err_label)
+	__put_user_nocheck(*((type *)(src)), (__force __user type *)(dst), err_label)
 
 static __must_check __always_inline bool user_access_begin(const void __user *ptr, size_t len)
 {
arch/riscv/kernel/entry.S +1 -1
index 75656afa2d6b..4fdf187a62bf 100644
@@ -46,7 +46,7 @@
 	 * a0 = &new_vmalloc[BIT_WORD(cpu)]
 	 * a1 = BIT_MASK(cpu)
 	 */
-	REG_L 	a2, TASK_TI_CPU(tp)
+	lw	a2, TASK_TI_CPU(tp)
 	/*
 	 * Compute the new_vmalloc element position:
 	 * (cpu / 64) * 8 = (cpu >> 6) << 3
arch/riscv/kernel/kexec_elf.c +2 -2
index f4755d49b89e..a00aa92c824f 100644
@@ -28,7 +28,7 @@ static int riscv_kexec_elf_load(struct kimage *image, struct elfhdr *ehdr,
 	int i;
 	int ret = 0;
 	size_t size;
-	struct kexec_buf kbuf;
+	struct kexec_buf kbuf = {};
 	const struct elf_phdr *phdr;
 
 	kbuf.image = image;
@@ -66,7 +66,7 @@ static int elf_find_pbase(struct kimage *image, unsigned long kernel_len,
 {
 	int i;
 	int ret;
-	struct kexec_buf kbuf;
+	struct kexec_buf kbuf = {};
 	const struct elf_phdr *phdr;
 	unsigned long lowest_paddr = ULONG_MAX;
 	unsigned long lowest_vaddr = ULONG_MAX;
arch/riscv/kernel/kexec_image.c +1 -1
index 26a81774a78a..8f2eb900910b 100644
@@ -41,7 +41,7 @@ static void *image_load(struct kimage *image,
 	struct riscv_image_header *h;
 	u64 flags;
 	bool be_image, be_kernel;
-	struct kexec_buf kbuf;
+	struct kexec_buf kbuf = {};
 	int ret;
 
 	/* Check Image header */
arch/riscv/kernel/machine_kexec_file.c +1 -1
index e36104af2e24..b9eb41b0a975 100644
@@ -261,7 +261,7 @@ int load_extra_segments(struct kimage *image, unsigned long kernel_start,
 	int ret;
 	void *fdt;
 	unsigned long initrd_pbase = 0UL;
-	struct kexec_buf kbuf;
+	struct kexec_buf kbuf = {};
 	char *modified_cmdline = NULL;
 
 	kbuf.image = image;
arch/riscv/net/bpf_jit_comp64.c +2 -2
index 10e01ff06312..9883a55d61b5 100644
@@ -1356,7 +1356,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
 				emit_mv(rd, rs, ctx);
 #ifdef CONFIG_SMP
 			/* Load current CPU number in T1 */
-			emit_ld(RV_REG_T1, offsetof(struct thread_info, cpu),
+			emit_lw(RV_REG_T1, offsetof(struct thread_info, cpu),
 				RV_REG_TP, ctx);
 			/* Load address of __per_cpu_offset array in T2 */
 			emit_addr(RV_REG_T2, (u64)&__per_cpu_offset, extra_pass, ctx);
@@ -1763,7 +1763,7 @@ int bpf_jit_emit_insn(const struct bpf_insn *insn, struct rv_jit_context *ctx,
 		 */
 		if (insn->src_reg == 0 && insn->imm == BPF_FUNC_get_smp_processor_id) {
 			/* Load current CPU number in R0 */
-			emit_ld(bpf_to_rv_reg(BPF_REG_0, ctx), offsetof(struct thread_info, cpu),
+			emit_lw(bpf_to_rv_reg(BPF_REG_0, ctx), offsetof(struct thread_info, cpu),
 				RV_REG_TP, ctx);
 			break;
 		}
arch/x86/include/asm/pgtable_64_types.h +3 -0
index 4604f924d8b8..7eb61ef6a185 100644
@@ -36,6 +36,9 @@ static inline bool pgtable_l5_enabled(void)
 #define pgtable_l5_enabled() cpu_feature_enabled(X86_FEATURE_LA57)
 #endif /* USE_EARLY_PGTABLE_L5 */
 
+#define ARCH_PAGE_TABLE_SYNC_MASK \
+	(pgtable_l5_enabled() ? PGTBL_PGD_MODIFIED : PGTBL_P4D_MODIFIED)
+
 extern unsigned int pgdir_shift;
 extern unsigned int ptrs_per_p4d;
 
arch/x86/mm/init_64.c +18 -0
index fdb6cab524f0..458e5148d69e 100644
@@ -223,6 +223,24 @@ static void sync_global_pgds(unsigned long start, unsigned long end)
 		sync_global_pgds_l4(start, end);
 }
 
+/*
+ * Make kernel mappings visible in all page tables in the system.
+ * This is necessary except when the init task populates kernel mappings
+ * during the boot process. In that case, all processes originating from
+ * the init task copies the kernel mappings, so there is no issue.
+ * Otherwise, missing synchronization could lead to kernel crashes due
+ * to missing page table entries for certain kernel mappings.
+ *
+ * Synchronization is performed at the top level, which is the PGD in
+ * 5-level paging systems. But in 4-level paging systems, however,
+ * pgd_populate() is a no-op, so synchronization is done at the P4D level.
+ * sync_global_pgds() handles this difference between paging levels.
+ */
+void arch_sync_kernel_mappings(unsigned long start, unsigned long end)
+{
+	sync_global_pgds(start, end);
+}
+
 /*
  * NOTE: This function is marked __ref because it calls __init function
  * (alloc_bootmem_pages). It's safe to do it ONLY when after_bootmem == 0.
drivers/accel/ivpu/ivpu_drv.c +1 -1
index 0e7748c5e117..83a9f99ea7f9 100644
@@ -677,7 +677,7 @@ static void ivpu_bo_unbind_all_user_contexts(struct ivpu_device *vdev)
 static void ivpu_dev_fini(struct ivpu_device *vdev)
 {
 	ivpu_jobs_abort_all(vdev);
-	ivpu_pm_cancel_recovery(vdev);
+	ivpu_pm_disable_recovery(vdev);
 	ivpu_pm_disable(vdev);
 	ivpu_prepare_for_reset(vdev);
 	ivpu_shutdown(vdev);
drivers/accel/ivpu/ivpu_pm.c +2 -2
index ea30db181cd7..d2c6cebdc901 100644
@@ -408,10 +408,10 @@ void ivpu_pm_init(struct ivpu_device *vdev)
 	ivpu_dbg(vdev, PM, "Autosuspend delay = %d\n", delay);
 }
 
-void ivpu_pm_cancel_recovery(struct ivpu_device *vdev)
+void ivpu_pm_disable_recovery(struct ivpu_device *vdev)
 {
 	drm_WARN_ON(&vdev->drm, delayed_work_pending(&vdev->pm->job_timeout_work));
-	cancel_work_sync(&vdev->pm->recovery_work);
+	disable_work_sync(&vdev->pm->recovery_work);
 }
 
 void ivpu_pm_enable(struct ivpu_device *vdev)
drivers/accel/ivpu/ivpu_pm.h +1 -1
index 89b264cc0e3e..a2aa7a27f32e 100644
@@ -25,7 +25,7 @@ struct ivpu_pm_info {
 void ivpu_pm_init(struct ivpu_device *vdev);
 void ivpu_pm_enable(struct ivpu_device *vdev);
 void ivpu_pm_disable(struct ivpu_device *vdev);
-void ivpu_pm_cancel_recovery(struct ivpu_device *vdev);
+void ivpu_pm_disable_recovery(struct ivpu_device *vdev);
 
 int ivpu_pm_suspend_cb(struct device *dev);
 int ivpu_pm_resume_cb(struct device *dev);
drivers/acpi/arm64/iort.c +3 -1
index 98759d6199d3..65f0f56ad753 100644
@@ -937,8 +937,10 @@ static u32 *iort_rmr_alloc_sids(u32 *sids, u32 count, u32 id_start,
 
 	new_sids = krealloc_array(sids, count + new_count,
 				  sizeof(*new_sids), GFP_KERNEL);
-	if (!new_sids)
+	if (!new_sids) {
+		kfree(sids);
 		return NULL;
+	}
 
 	for (i = count; i < total_count; i++)
 		new_sids[i] = id_start++;
drivers/acpi/riscv/cppc.c +2 -2
index 440cf9fb91aa..42c1a9052470 100644
@@ -119,7 +119,7 @@ int cpc_read_ffh(int cpu, struct cpc_reg *reg, u64 *val)
 
 		*val = data.ret.value;
 
-		return (data.ret.error) ? sbi_err_map_linux_errno(data.ret.error) : 0;
+		return data.ret.error;
 	}
 
 	return -EINVAL;
@@ -148,7 +148,7 @@ int cpc_write_ffh(int cpu, struct cpc_reg *reg, u64 val)
 
 		smp_call_function_single(cpu, cppc_ffh_csr_write, &data, 1);
 
-		return (data.ret.error) ? sbi_err_map_linux_errno(data.ret.error) : 0;
+		return data.ret.error;
 	}
 
 	return -EINVAL;
drivers/bluetooth/hci_vhci.c +41 -16

81 lines not on this page · raw message

drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +1 -1
index 7d8b98aa5271..f9ceda7861f1 100644
@@ -447,7 +447,7 @@ static int psp_sw_init(struct amdgpu_ip_block *ip_block)
 	psp->cmd = kzalloc(sizeof(struct psp_gfx_cmd_resp), GFP_KERNEL);
 	if (!psp->cmd) {
 		dev_err(adev->dev, "Failed to allocate memory to command buffer!\n");
-		ret = -ENOMEM;
+		return -ENOMEM;
 	}
 
 	adev->psp.xgmi_context.supports_extended_data =
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +0 -5
index bf7c22f81cda..ba73518f5cdf 100644
@@ -1462,17 +1462,12 @@ static int dce_v10_0_audio_init(struct amdgpu_device *adev)
 
 static void dce_v10_0_audio_fini(struct amdgpu_device *adev)
 {
-	int i;
-
 	if (!amdgpu_audio)
 		return;
 
 	if (!adev->mode_info.audio.enabled)
 		return;
 
-	for (i = 0; i < adev->mode_info.audio.num_pins; i++)
-		dce_v10_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
-
 	adev->mode_info.audio.enabled = false;
 }
 
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +0 -5
index 47e05783c4a0..b01d88d078fa 100644
@@ -1511,17 +1511,12 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)
 
 static void dce_v11_0_audio_fini(struct amdgpu_device *adev)
 {
-	int i;
-
 	if (!amdgpu_audio)
 		return;
 
 	if (!adev->mode_info.audio.enabled)
 		return;
 
-	for (i = 0; i < adev->mode_info.audio.num_pins; i++)
-		dce_v11_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
-
 	adev->mode_info.audio.enabled = false;
 }
 
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +0 -5
index 276c025c4c03..81760a26f2ff 100644
@@ -1451,17 +1451,12 @@ static int dce_v6_0_audio_init(struct amdgpu_device *adev)
 
 static void dce_v6_0_audio_fini(struct amdgpu_device *adev)
 {
-	int i;
-
 	if (!amdgpu_audio)
 		return;
 
 	if (!adev->mode_info.audio.enabled)
 		return;
 
-	for (i = 0; i < adev->mode_info.audio.num_pins; i++)
-		dce_v6_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
-
 	adev->mode_info.audio.enabled = false;
 }
 
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +0 -5
index e62ccf9eb73d..19a265bd4d19 100644
@@ -1443,17 +1443,12 @@ static int dce_v8_0_audio_init(struct amdgpu_device *adev)
 
 static void dce_v8_0_audio_fini(struct amdgpu_device *adev)
 {
-	int i;
-
 	if (!amdgpu_audio)
 		return;
 
 	if (!adev->mode_info.audio.enabled)
 		return;
 
-	for (i = 0; i < adev->mode_info.audio.num_pins; i++)
-		dce_v8_0_audio_enable(adev, &adev->mode_info.audio.pin[i], false);
-
 	adev->mode_info.audio.enabled = false;
 }
 
drivers/gpu/drm/amd/amdgpu/mes_v11_0.c +3 -2
index 28eb846280dd..3f6a828cad8a 100644
@@ -641,8 +641,9 @@ static int mes_v11_0_misc_op(struct amdgpu_mes *mes,
 		break;
 	case MES_MISC_OP_CHANGE_CONFIG:
 		if ((mes->adev->mes.sched_version & AMDGPU_MES_VERSION_MASK) < 0x63) {
-			dev_err(mes->adev->dev, "MES FW version must be larger than 0x63 to support limit single process feature.\n");
-			return -EINVAL;
+			dev_warn_once(mes->adev->dev,
+				      "MES FW version must be larger than 0x63 to support limit single process feature.\n");
+			return 0;
 		}
 		misc_pkt.opcode = MESAPI_MISC__CHANGE_CONFIG;
 		misc_pkt.change_config.opcode =
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c +3 -3
index 041bca58add5..9ac52eb6f593 100644
@@ -1376,15 +1376,15 @@ static int sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
 
 	switch (amdgpu_ip_version(adev, SDMA0_HWIP, 0)) {
 	case IP_VERSION(6, 0, 0):
-		if ((adev->sdma.instance[0].fw_version >= 24) && !adev->sdma.disable_uq)
+		if ((adev->sdma.instance[0].fw_version >= 27) && !adev->sdma.disable_uq)
 			adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
 		break;
 	case IP_VERSION(6, 0, 2):
-		if ((adev->sdma.instance[0].fw_version >= 21) && !adev->sdma.disable_uq)
+		if ((adev->sdma.instance[0].fw_version >= 23) && !adev->sdma.disable_uq)
 			adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
 		break;
 	case IP_VERSION(6, 0, 3):
-		if ((adev->sdma.instance[0].fw_version >= 25) && !adev->sdma.disable_uq)
+		if ((adev->sdma.instance[0].fw_version >= 27) && !adev->sdma.disable_uq)
 			adev->userq_funcs[AMDGPU_HW_IP_DMA] = &userq_mes_funcs;
 		break;
 	default:
drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c +4 -4
index 4a9d07c31bc5..0c50fe266c8a 100644
@@ -896,13 +896,13 @@ void dce110_link_encoder_construct(
 						enc110->base.id, &bp_cap_info);
 
 	/* Override features with DCE-specific values */
-	if (BP_RESULT_OK == result) {
+	if (result == BP_RESULT_OK) {
 		enc110->base.features.flags.bits.IS_HBR2_CAPABLE =
 				bp_cap_info.DP_HBR2_EN;
 		enc110->base.features.flags.bits.IS_HBR3_CAPABLE =
 				bp_cap_info.DP_HBR3_EN;
 		enc110->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-	} else {
+	} else if (result != BP_RESULT_NORECORD) {
 		DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
 				__func__,
 				result);
@@ -1798,13 +1798,13 @@ void dce60_link_encoder_construct(
 						enc110->base.id, &bp_cap_info);
 
 	/* Override features with DCE-specific values */
-	if (BP_RESULT_OK == result) {
+	if (result == BP_RESULT_OK) {
 		enc110->base.features.flags.bits.IS_HBR2_CAPABLE =
 				bp_cap_info.DP_HBR2_EN;
 		enc110->base.features.flags.bits.IS_HBR3_CAPABLE =
 				bp_cap_info.DP_HBR3_EN;
 		enc110->base.features.flags.bits.HDMI_6GB_EN = bp_cap_info.HDMI_6GB_EN;
-	} else {
+	} else if (result != BP_RESULT_NORECORD) {
 		DC_LOG_WARNING("%s: Failed to get encoder_cap_info from VBIOS with error code %d!\n",
 				__func__,
 				result);
drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.c +9 -0
index 75fb77bca83b..01480a04f85e 100644
@@ -520,6 +520,15 @@ void dpp1_dppclk_control(
 		REG_UPDATE(DPP_CONTROL, DPP_CLOCK_ENABLE, 0);
 }
 
+void dpp_force_disable_cursor(struct dpp *dpp_base)
+{
+	struct dcn10_dpp *dpp = TO_DCN10_DPP(dpp_base);
+
+	/* Force disable cursor */
+	REG_UPDATE(CURSOR0_CONTROL, CUR0_ENABLE, 0);
+	dpp_base->pos.cur0_ctl.bits.cur0_enable = 0;
+}
+
 static const struct dpp_funcs dcn10_dpp_funcs = {
 		.dpp_read_state = dpp_read_state,
 		.dpp_reset = dpp_reset,
drivers/gpu/drm/amd/display/dc/dpp/dcn10/dcn10_dpp.h +2 -0
index c48139bed11f..f466182963f7 100644
@@ -1525,4 +1525,6 @@ void dpp1_construct(struct dcn10_dpp *dpp1,
 
 void dpp1_cm_get_gamut_remap(struct dpp *dpp_base,
 			     struct dpp_grph_csc_adjustment *adjust);
+void dpp_force_disable_cursor(struct dpp *dpp_base);
+
 #endif
drivers/gpu/drm/amd/display/dc/dpp/dcn30/dcn30_dpp.c +1 -0
index 2d70586cef40..09be2a90cc79 100644
@@ -1494,6 +1494,7 @@ static struct dpp_funcs dcn30_dpp_funcs = {
 	.dpp_dppclk_control		= dpp1_dppclk_control,
 	.dpp_set_hdr_multiplier		= dpp3_set_hdr_multiplier,
 	.dpp_get_gamut_remap		= dpp3_cm_get_gamut_remap,
+	.dpp_force_disable_cursor 	= dpp_force_disable_cursor,
 };
 
 
drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.c +72 -0

75 lines not on this page · raw message

drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_hwseq.h +2 -0
index 2305ad282f21..6c072d0274ea 100644
@@ -47,4 +47,6 @@ void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst,
 
 void dcn314_disable_link_output(struct dc_link *link, const struct link_resource *link_res, enum signal_type signal);
 
+void dcn314_dpp_pg_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool power_on);
+
 #endif /* __DC_HWSS_DCN314_H__ */
drivers/gpu/drm/amd/display/dc/hwss/dcn314/dcn314_init.c +1 -0
index f5112742edf9..9f454fa90e65 100644
@@ -141,6 +141,7 @@ static const struct hwseq_private_funcs dcn314_private_funcs = {
 	.enable_power_gating_plane = dcn314_enable_power_gating_plane,
 	.dpp_root_clock_control = dcn314_dpp_root_clock_control,
 	.hubp_pg_control = dcn31_hubp_pg_control,
+	.dpp_pg_control = dcn314_dpp_pg_control,
 	.program_all_writeback_pipes_in_tree = dcn30_program_all_writeback_pipes_in_tree,
 	.update_odm = dcn314_update_odm,
 	.dsc_pg_control = dcn314_dsc_pg_control,
drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h +3 -0
index 0c5675d1c593..1b7c085dc2cc 100644
@@ -349,6 +349,9 @@ struct dpp_funcs {
 		struct dpp *dpp_base,
 		enum dc_color_space color_space,
 		struct dc_csc_transform cursor_csc_color_matrix);
+
+	void (*dpp_force_disable_cursor)(struct dpp *dpp_base);
+
 };
 
 
drivers/gpu/drm/bridge/ti-sn65dsi86.c +11 -0
index 834b42a4d31f..4545ac42778a 100644
@@ -392,6 +392,17 @@ static int __maybe_unused ti_sn65dsi86_resume(struct device *dev)
 
 	gpiod_set_value_cansleep(pdata->enable_gpio, 1);
 
+	/*
+	 * After EN is deasserted and an external clock is detected, the bridge
+	 * will sample GPIO3:1 to determine its frequency. The driver will
+	 * overwrite this setting in ti_sn_bridge_set_refclk_freq(). But this is
+	 * racy. Thus we have to wait a couple of us. According to the datasheet
+	 * the GPIO lines has to be stable at least 5 us (td5) but it seems that
+	 * is not enough and the refclk frequency value is still lost or
+	 * overwritten by the bridge itself. Waiting for 20us seems to work.
+	 */
+	usleep_range(20, 30);
+
 	/*
 	 * If we have a reference clock we can enable communication w/ the
 	 * panel (including the aux channel) w/out any need for an input clock
drivers/gpu/drm/display/drm_dp_helper.c +1 -1
index f2a6559a2710..ea78c6c8ca7a 100644
@@ -725,7 +725,7 @@ ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,
 	 * monitor doesn't power down exactly after the throw away read.
 	 */
 	if (!aux->is_remote) {
-		ret = drm_dp_dpcd_probe(aux, DP_DPCD_REV);
+		ret = drm_dp_dpcd_probe(aux, DP_TRAINING_PATTERN_SET);
 		if (ret < 0)
 			return ret;
 	}
drivers/gpu/drm/nouveau/gv100_fence.c +6 -1
index cccdeca72002..317e516c4ec7 100644
@@ -18,7 +18,7 @@ gv100_fence_emit32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
 	struct nvif_push *push = &chan->chan.push;
 	int ret;
 
-	ret = PUSH_WAIT(push, 8);
+	ret = PUSH_WAIT(push, 13);
 	if (ret)
 		return ret;
 
@@ -32,6 +32,11 @@ gv100_fence_emit32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
 		  NVDEF(NVC36F, SEM_EXECUTE, PAYLOAD_SIZE, 32BIT) |
 		  NVDEF(NVC36F, SEM_EXECUTE, RELEASE_TIMESTAMP, DIS));
 
+	PUSH_MTHD(push, NVC36F, MEM_OP_A, 0,
+				MEM_OP_B, 0,
+				MEM_OP_C, NVDEF(NVC36F, MEM_OP_C, MEMBAR_TYPE, SYS_MEMBAR),
+				MEM_OP_D, NVDEF(NVC36F, MEM_OP_D, OPERATION, MEMBAR));
+
 	PUSH_MTHD(push, NVC36F, NON_STALL_INTERRUPT, 0);
 
 	PUSH_KICK(push);
drivers/gpu/drm/nouveau/include/nvhw/class/clc36f.h +85 -0

91 lines not on this page · raw message

drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c +2 -0
index fdffa0391b31..6fd4e60634fb 100644
@@ -350,6 +350,8 @@ nvkm_fifo_dtor(struct nvkm_engine *engine)
 	nvkm_chid_unref(&fifo->chid);
 
 	nvkm_event_fini(&fifo->nonstall.event);
+	if (fifo->func->nonstall_dtor)
+		fifo->func->nonstall_dtor(fifo);
 	mutex_destroy(&fifo->mutex);
 
 	if (fifo->func->dtor)
drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga100.c +15 -8
index e74493a4569e..6848a56f20c0 100644
@@ -517,19 +517,11 @@ ga100_fifo_nonstall_intr(struct nvkm_inth *inth)
 static void
 ga100_fifo_nonstall_block(struct nvkm_event *event, int type, int index)
 {
-	struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
-	struct nvkm_runl *runl = nvkm_runl_get(fifo, index, 0);
-
-	nvkm_inth_block(&runl->nonstall.inth);
 }
 
 static void
 ga100_fifo_nonstall_allow(struct nvkm_event *event, int type, int index)
 {
-	struct nvkm_fifo *fifo = container_of(event, typeof(*fifo), nonstall.event);
-	struct nvkm_runl *runl = nvkm_runl_get(fifo, index, 0);
-
-	nvkm_inth_allow(&runl->nonstall.inth);
 }
 
 const struct nvkm_event_func
@@ -564,12 +556,26 @@ ga100_fifo_nonstall_ctor(struct nvkm_fifo *fifo)
 		if (ret)
 			return ret;
 
+		nvkm_inth_allow(&runl->nonstall.inth);
+
 		nr = max(nr, runl->id + 1);
 	}
 
 	return nr;
 }
 
+void
+ga100_fifo_nonstall_dtor(struct nvkm_fifo *fifo)
+{
+	struct nvkm_runl *runl;
+
+	nvkm_runl_foreach(runl, fifo) {
+		if (runl->nonstall.vector < 0)
+			continue;
+		nvkm_inth_block(&runl->nonstall.inth);
+	}
+}
+
 int
 ga100_fifo_runl_ctor(struct nvkm_fifo *fifo)
 {
@@ -599,6 +605,7 @@ ga100_fifo = {
 	.runl_ctor = ga100_fifo_runl_ctor,
 	.mmu_fault = &tu102_fifo_mmu_fault,
 	.nonstall_ctor = ga100_fifo_nonstall_ctor,
+	.nonstall_dtor = ga100_fifo_nonstall_dtor,
 	.nonstall = &ga100_fifo_nonstall,
 	.runl = &ga100_runl,
 	.runq = &ga100_runq,
drivers/gpu/drm/nouveau/nvkm/engine/fifo/ga102.c +1 -0
index 755235f55b3a..18a0b1f4eab7 100644
@@ -30,6 +30,7 @@ ga102_fifo = {
 	.runl_ctor = ga100_fifo_runl_ctor,
 	.mmu_fault = &tu102_fifo_mmu_fault,
 	.nonstall_ctor = ga100_fifo_nonstall_ctor,
+	.nonstall_dtor = ga100_fifo_nonstall_dtor,
 	.nonstall = &ga100_fifo_nonstall,
 	.runl = &ga100_runl,
 	.runq = &ga100_runq,
drivers/gpu/drm/nouveau/nvkm/engine/fifo/priv.h +2 -0
index 5e81ae195329..fff1428ef267 100644
@@ -41,6 +41,7 @@ struct nvkm_fifo_func {
 	void (*start)(struct nvkm_fifo *, unsigned long *);
 
 	int (*nonstall_ctor)(struct nvkm_fifo *);
+	void (*nonstall_dtor)(struct nvkm_fifo *);
 	const struct nvkm_event_func *nonstall;
 
 	const struct nvkm_runl_func *runl;
@@ -200,6 +201,7 @@ u32 tu102_chan_doorbell_handle(struct nvkm_chan *);
 
 int ga100_fifo_runl_ctor(struct nvkm_fifo *);
 int ga100_fifo_nonstall_ctor(struct nvkm_fifo *);
+void ga100_fifo_nonstall_dtor(struct nvkm_fifo *);
 extern const struct nvkm_event_func ga100_fifo_nonstall;
 extern const struct nvkm_runl_func ga100_runl;
 extern const struct nvkm_runq_func ga100_runq;
drivers/gpu/drm/nouveau/nvkm/subdev/gsp/rm/r535/fifo.c +1 -0
index 1ac5628c5140..4ed54b386a60 100644
@@ -601,6 +601,7 @@ r535_fifo_new(const struct nvkm_fifo_func *hw, struct nvkm_device *device,
 	rm->chan.func = &r535_chan;
 	rm->nonstall = &ga100_fifo_nonstall;
 	rm->nonstall_ctor = ga100_fifo_nonstall_ctor;
+	rm->nonstall_dtor = ga100_fifo_nonstall_dtor;
 
 	return nvkm_fifo_new_(rm, device, type, inst, pfifo);
 }
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +5 -4
index 186f6452a7d3..b50927a824b4 100644
@@ -2579,12 +2579,13 @@ static int vop2_win_init(struct vop2 *vop2)
 }
 
 /*
- * The window registers are only updated when config done is written.
- * Until that they read back the old value. As we read-modify-write
- * these registers mark them as non-volatile. This makes sure we read
- * the new values from the regmap register cache.
+ * The window and video port registers are only updated when config
+ * done is written. Until that they read back the old value. As we
+ * read-modify-write these registers mark them as non-volatile. This
+ * makes sure we read the new values from the regmap register cache.
  */
 static const struct regmap_range vop2_nonvolatile_range[] = {
+	regmap_reg_range(RK3568_VP0_CTRL_BASE, RK3588_VP3_CTRL_BASE + 255),
 	regmap_reg_range(0x1000, 0x23ff),
 };
 
drivers/gpu/drm/xe/xe_bo.c +1 -2
index 74635b444122..50326e756f89 100644
@@ -803,8 +803,7 @@ static int xe_bo_move(struct ttm_buffer_object *ttm_bo, bool evict,
 		return ret;
 	}
 
-	tt_has_data = ttm && (ttm_tt_is_populated(ttm) ||
-			      (ttm->page_flags & TTM_TT_FLAG_SWAPPED));
+	tt_has_data = ttm && (ttm_tt_is_populated(ttm) || ttm_tt_is_swapped(ttm));
 
 	move_lacks_source = !old_mem || (handle_system_ccs ? (!bo->ccs_cleared) :
 					 (!mem_type_is_vram(old_mem_type) && !tt_has_data));
drivers/hwmon/ina238.c +5 -4
index 9a5fd16a4ec2..5c90c3e59f80 100644
@@ -300,7 +300,7 @@ static int ina238_write_in(struct device *dev, u32 attr, int channel,
 		regval = clamp_val(val, -163, 163);
 		regval = (regval * 1000 * 4) /
 			 (INA238_SHUNT_VOLTAGE_LSB * data->gain);
-		regval = clamp_val(regval, S16_MIN, S16_MAX);
+		regval = clamp_val(regval, S16_MIN, S16_MAX) & 0xffff;
 
 		switch (attr) {
 		case hwmon_in_max:
@@ -426,9 +426,10 @@ static int ina238_write_power(struct device *dev, u32 attr, long val)
 	 * Unsigned postive values. Compared against the 24-bit power register,
 	 * lower 8-bits are truncated. Same conversion to/from uW as POWER
 	 * register.
+	 * The first clamp_val() is to establish a baseline to avoid overflows.
 	 */
-	regval = clamp_val(val, 0, LONG_MAX);
-	regval = div_u64(val * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
+	regval = clamp_val(val, 0, LONG_MAX / 2);
+	regval = div_u64(regval * 4 * 100 * data->rshunt, data->config->power_calculate_factor *
 			1000ULL * INA238_FIXED_SHUNT * data->gain);
 	regval = clamp_val(regval >> 8, 0, U16_MAX);
 
@@ -481,7 +482,7 @@ static int ina238_write_temp(struct device *dev, u32 attr, long val)
 		return -EOPNOTSUPP;
 
 	/* Signed */
-	regval = clamp_val(val, -40000, 125000);
+	val = clamp_val(val, -40000, 125000);
 	regval = div_s64(val * 10000, data->config->temp_lsb) << data->config->temp_shift;
 	regval = clamp_val(regval, S16_MIN, S16_MAX) & (0xffff << data->config->temp_shift);
 
drivers/hwmon/mlxreg-fan.c +2 -3
index a5f89aab3fb4..c25a54d5b39a 100644
@@ -561,15 +561,14 @@ static int mlxreg_fan_cooling_config(struct device *dev, struct mlxreg_fan *fan)
 		if (!pwm->connected)
 			continue;
 		pwm->fan = fan;
+		/* Set minimal PWM speed. */
+		pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
 		pwm->cdev = devm_thermal_of_cooling_device_register(dev, NULL, mlxreg_fan_name[i],
 								    pwm, &mlxreg_fan_cooling_ops);
 		if (IS_ERR(pwm->cdev)) {
 			dev_err(dev, "Failed to register cooling device\n");
 			return PTR_ERR(pwm->cdev);
 		}
-
-		/* Set minimal PWM speed. */
-		pwm->last_hwmon_state = MLXREG_FAN_PWM_DUTY2STATE(MLXREG_FAN_MIN_DUTY);
 	}
 
 	return 0;
drivers/isdn/mISDN/dsp_hwec.c +3 -3
index 0b3f29195330..0cd216e28f00 100644
@@ -51,14 +51,14 @@ void dsp_hwec_enable(struct dsp *dsp, const char *arg)
 		goto _do;
 
 	{
-		char *dup, *tok, *name, *val;
+		char *dup, *next, *tok, *name, *val;
 		int tmp;
 
-		dup = kstrdup(arg, GFP_ATOMIC);
+		dup = next = kstrdup(arg, GFP_ATOMIC);
 		if (!dup)
 			return;
 
-		while ((tok = strsep(&dup, ","))) {
+		while ((tok = strsep(&next, ","))) {
 			if (!strlen(tok))
 				continue;
 			name = strsep(&tok, "=");
drivers/md/md.c +5 -0
index 8746b22060a7..3f355bb85797 100644
@@ -9089,6 +9089,11 @@ void md_do_sync(struct md_thread *thread)
 	}
 
 	action = md_sync_action(mddev);
+	if (action == ACTION_FROZEN || action == ACTION_IDLE) {
+		set_bit(MD_RECOVERY_INTR, &mddev->recovery);
+		goto skip;
+	}
+
 	desc = md_sync_action_name(action);
 	mddev->last_sync_action = action;
 
drivers/md/raid1.c +1 -1
index 6cee738a645f..6d5233605794 100644
@@ -1226,7 +1226,7 @@ static void alloc_behind_master_bio(struct r1bio *r1_bio,
 	int i = 0;
 	struct bio *behind_bio = NULL;
 
-	behind_bio = bio_alloc_bioset(NULL, vcnt, 0, GFP_NOIO,
+	behind_bio = bio_alloc_bioset(NULL, vcnt, bio->bi_opf, GFP_NOIO,
 				      &r1_bio->mddev->bio_set);
 
 	/* discard op, we don't support writezero/writesame yet */
drivers/net/dsa/mv88e6xxx/leds.c +13 -4
index 1c88bfaea46b..ab3bc645da56 100644
@@ -779,7 +779,8 @@ int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port)
 			continue;
 		if (led_num > 1) {
 			dev_err(dev, "invalid LED specified port %d\n", port);
-			return -EINVAL;
+			ret = -EINVAL;
+			goto err_put_led;
 		}
 
 		if (led_num == 0)
@@ -823,17 +824,25 @@ int mv88e6xxx_port_setup_leds(struct mv88e6xxx_chip *chip, int port)
 		init_data.devname_mandatory = true;
 		init_data.devicename = kasprintf(GFP_KERNEL, "%s:0%d:0%d", chip->info->name,
 						 port, led_num);
-		if (!init_data.devicename)
-			return -ENOMEM;
+		if (!init_data.devicename) {
+			ret = -ENOMEM;
+			goto err_put_led;
+		}
 
 		ret = devm_led_classdev_register_ext(dev, l, &init_data);
 		kfree(init_data.devicename);
 
 		if (ret) {
 			dev_err(dev, "Failed to init LED %d for port %d", led_num, port);
-			return ret;
+			goto err_put_led;
 		}
 	}
 
+	fwnode_handle_put(leds);
 	return 0;
+
+err_put_led:
+	fwnode_handle_put(led);
+	fwnode_handle_put(leds);
+	return ret;
 }
drivers/net/ethernet/broadcom/bnxt/bnxt.c +1 -1
index cb76ab78904f..d47c1d81c49b 100644
@@ -4390,7 +4390,7 @@ static void bnxt_alloc_one_rx_ring_netmem(struct bnxt *bp,
 	for (i = 0; i < bp->rx_agg_ring_size; i++) {
 		if (bnxt_alloc_rx_netmem(bp, rxr, prod, GFP_KERNEL)) {
 			netdev_warn(bp->dev, "init'ed rx ring %d with %d/%d pages only\n",
-				    ring_nr, i, bp->rx_ring_size);
+				    ring_nr, i, bp->rx_agg_ring_size);
 			break;
 		}
 		prod = NEXT_RX_AGG(prod);
drivers/net/ethernet/cadence/macb_main.c +16 -12
index d949d2ba6cb9..f5d7556afb97 100644
@@ -1223,12 +1223,13 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
 {
 	struct macb *bp = queue->bp;
 	u16 queue_index = queue - bp->queues;
+	unsigned long flags;
 	unsigned int tail;
 	unsigned int head;
 	int packets = 0;
 	u32 bytes = 0;
 
-	spin_lock(&queue->tx_ptr_lock);
+	spin_lock_irqsave(&queue->tx_ptr_lock, flags);
 	head = queue->tx_head;
 	for (tail = queue->tx_tail; tail != head && packets < budget; tail++) {
 		struct macb_tx_skb	*tx_skb;
@@ -1291,7 +1292,7 @@ static int macb_tx_complete(struct macb_queue *queue, int budget)
 	    CIRC_CNT(queue->tx_head, queue->tx_tail,
 		     bp->tx_ring_size) <= MACB_TX_WAKEUP_THRESH(bp))
 		netif_wake_subqueue(bp->dev, queue_index);
-	spin_unlock(&queue->tx_ptr_lock);
+	spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
 
 	return packets;
 }
@@ -1707,8 +1708,9 @@ static void macb_tx_restart(struct macb_queue *queue)
 {
 	struct macb *bp = queue->bp;
 	unsigned int head_idx, tbqp;
+	unsigned long flags;
 
-	spin_lock(&queue->tx_ptr_lock);
+	spin_lock_irqsave(&queue->tx_ptr_lock, flags);
 
 	if (queue->tx_head == queue->tx_tail)
 		goto out_tx_ptr_unlock;
@@ -1720,19 +1722,20 @@ static void macb_tx_restart(struct macb_queue *queue)
 	if (tbqp == head_idx)
 		goto out_tx_ptr_unlock;
 
-	spin_lock_irq(&bp->lock);
+	spin_lock(&bp->lock);
 	macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
-	spin_unlock_irq(&bp->lock);
+	spin_unlock(&bp->lock);
 
 out_tx_ptr_unlock:
-	spin_unlock(&queue->tx_ptr_lock);
+	spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
 }
 
 static bool macb_tx_complete_pending(struct macb_queue *queue)
 {
 	bool retval = false;
+	unsigned long flags;
 
-	spin_lock(&queue->tx_ptr_lock);
+	spin_lock_irqsave(&queue->tx_ptr_lock, flags);
 	if (queue->tx_head != queue->tx_tail) {
 		/* Make hw descriptor updates visible to CPU */
 		rmb();
@@ -1740,7 +1743,7 @@ static bool macb_tx_complete_pending(struct macb_queue *queue)
 		if (macb_tx_desc(queue, queue->tx_tail)->ctrl & MACB_BIT(TX_USED))
 			retval = true;
 	}
-	spin_unlock(&queue->tx_ptr_lock);
+	spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
 	return retval;
 }
 
@@ -2308,6 +2311,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	struct macb_queue *queue = &bp->queues[queue_index];
 	unsigned int desc_cnt, nr_frags, frag_size, f;
 	unsigned int hdrlen;
+	unsigned long flags;
 	bool is_lso;
 	netdev_tx_t ret = NETDEV_TX_OK;
 
@@ -2368,7 +2372,7 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
 		desc_cnt += DIV_ROUND_UP(frag_size, bp->max_tx_length);
 	}
 
-	spin_lock_bh(&queue->tx_ptr_lock);
+	spin_lock_irqsave(&queue->tx_ptr_lock, flags);
 
 	/* This is a hard error, log it. */
 	if (CIRC_SPACE(queue->tx_head, queue->tx_tail,
@@ -2392,15 +2396,15 @@ static netdev_tx_t macb_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	netdev_tx_sent_queue(netdev_get_tx_queue(bp->dev, queue_index),
 			     skb->len);
 
-	spin_lock_irq(&bp->lock);
+	spin_lock(&bp->lock);
 	macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(TSTART));
-	spin_unlock_irq(&bp->lock);
+	spin_unlock(&bp->lock);
 
 	if (CIRC_SPACE(queue->tx_head, queue->tx_tail, bp->tx_ring_size) < 1)
 		netif_stop_subqueue(dev, queue_index);
 
 unlock:
-	spin_unlock_bh(&queue->tx_ptr_lock);
+	spin_unlock_irqrestore(&queue->tx_ptr_lock, flags);
 
 	return ret;
 }
drivers/net/ethernet/cavium/thunder/thunder_bgx.c +12 -8
index 21495b5dce25..9efb60842ad1 100644
@@ -1493,13 +1493,17 @@ static int bgx_init_of_phy(struct bgx *bgx)
 		 * this cortina phy, for which there is no driver
 		 * support, ignore it.
 		 */
-		if (phy_np &&
-		    !of_device_is_compatible(phy_np, "cortina,cs4223-slice")) {
-			/* Wait until the phy drivers are available */
-			pd = of_phy_find_device(phy_np);
-			if (!pd)
-				goto defer;
-			bgx->lmac[lmac].phydev = pd;
+		if (phy_np) {
+			if (!of_device_is_compatible(phy_np, "cortina,cs4223-slice")) {
+				/* Wait until the phy drivers are available */
+				pd = of_phy_find_device(phy_np);
+				if (!pd) {
+					of_node_put(phy_np);
+					goto defer;
+				}
+				bgx->lmac[lmac].phydev = pd;
+			}
+			of_node_put(phy_np);
 		}
 
 		lmac++;
@@ -1515,11 +1519,11 @@ static int bgx_init_of_phy(struct bgx *bgx)
 	 * for phy devices we may have already found.
 	 */
 	while (lmac) {
+		lmac--;
 		if (bgx->lmac[lmac].phydev) {
 			put_device(&bgx->lmac[lmac].phydev->mdio.dev);
 			bgx->lmac[lmac].phydev = NULL;
 		}
-		lmac--;
 	}
 	of_node_put(node);
 	return -EPROBE_DEFER;
drivers/net/ethernet/intel/e1000e/ethtool.c +7 -3
index 9364bc2b4eb1..641a36dd0e60 100644
@@ -549,12 +549,12 @@ static int e1000_set_eeprom(struct net_device *netdev,
 {
 	struct e1000_adapter *adapter = netdev_priv(netdev);
 	struct e1000_hw *hw = &adapter->hw;
+	size_t total_len, max_len;
 	u16 *eeprom_buff;
-	void *ptr;
-	int max_len;
+	int ret_val = 0;
 	int first_word;
 	int last_word;
-	int ret_val = 0;
+	void *ptr;
 	u16 i;
 
 	if (eeprom->len == 0)
@@ -569,6 +569,10 @@ static int e1000_set_eeprom(struct net_device *netdev,
 
 	max_len = hw->nvm.word_size * 2;
 
+	if (check_add_overflow(eeprom->offset, eeprom->len, &total_len) ||
+	    total_len > max_len)
+		return -EFBIG;
+
 	first_word = eeprom->offset >> 1;
 	last_word = (eeprom->offset + eeprom->len - 1) >> 1;
 	eeprom_buff = kmalloc(max_len, GFP_KERNEL);
drivers/net/ethernet/intel/i40e/i40e_client.c +2 -2
index 59263551c383..0b099e5f4816 100644
@@ -359,8 +359,8 @@ static void i40e_client_add_instance(struct i40e_pf *pf)
 	if (i40e_client_get_params(vsi, &cdev->lan_info.params))
 		goto free_cdev;
 
-	mac = list_first_entry(&cdev->lan_info.netdev->dev_addrs.list,
-			       struct netdev_hw_addr, list);
+	mac = list_first_entry_or_null(&cdev->lan_info.netdev->dev_addrs.list,
+				       struct netdev_hw_addr, list);
 	if (mac)
 		ether_addr_copy(cdev->lan_info.lanmac, mac->addr);
 	else
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +19 -104

194 lines not on this page · raw message

drivers/net/ethernet/intel/ice/ice_main.c +7 -5
index d42892c8c5a1..a34faa489473 100644
@@ -3172,12 +3172,14 @@ static irqreturn_t ice_ll_ts_intr(int __always_unused irq, void *data)
 	hw = &pf->hw;
 	tx = &pf->ptp.port.tx;
 	spin_lock_irqsave(&tx->lock, flags);
-	ice_ptp_complete_tx_single_tstamp(tx);
+	if (tx->init) {
+		ice_ptp_complete_tx_single_tstamp(tx);
 
-	idx = find_next_bit_wrap(tx->in_use, tx->len,
-				 tx->last_ll_ts_idx_read + 1);
-	if (idx != tx->len)
-		ice_ptp_req_tx_single_tstamp(tx, idx);
+		idx = find_next_bit_wrap(tx->in_use, tx->len,
+					 tx->last_ll_ts_idx_read + 1);
+		if (idx != tx->len)
+			ice_ptp_req_tx_single_tstamp(tx, idx);
+	}
 	spin_unlock_irqrestore(&tx->lock, flags);
 
 	val = GLINT_DYN_CTL_INTENA_M | GLINT_DYN_CTL_CLEARPBA_M |
drivers/net/ethernet/intel/ice/ice_ptp.c +8 -5
index 55cad824c5b9..69e05bafb1e3 100644
@@ -2877,16 +2877,19 @@ irqreturn_t ice_ptp_ts_irq(struct ice_pf *pf)
 		 */
 		if (hw->dev_caps.ts_dev_info.ts_ll_int_read) {
 			struct ice_ptp_tx *tx = &pf->ptp.port.tx;
-			u8 idx;
+			u8 idx, last;
 
 			if (!ice_pf_state_is_nominal(pf))
 				return IRQ_HANDLED;
 
 			spin_lock(&tx->lock);
-			idx = find_next_bit_wrap(tx->in_use, tx->len,
-						 tx->last_ll_ts_idx_read + 1);
-			if (idx != tx->len)
-				ice_ptp_req_tx_single_tstamp(tx, idx);
+			if (tx->init) {
+				last = tx->last_ll_ts_idx_read + 1;
+				idx = find_next_bit_wrap(tx->in_use, tx->len,
+							 last);
+				if (idx != tx->len)
+					ice_ptp_req_tx_single_tstamp(tx, idx);
+			}
 			spin_unlock(&tx->lock);
 
 			return IRQ_HANDLED;
drivers/net/ethernet/intel/idpf/idpf_lib.c +6 -3
index e9f8da9f7979..5fc6147ecd93 100644
@@ -2277,6 +2277,7 @@ static int idpf_set_mac(struct net_device *netdev, void *p)
 	struct idpf_netdev_priv *np = netdev_priv(netdev);
 	struct idpf_vport_config *vport_config;
 	struct sockaddr *addr = p;
+	u8 old_mac_addr[ETH_ALEN];
 	struct idpf_vport *vport;
 	int err = 0;
 
@@ -2300,17 +2301,19 @@ static int idpf_set_mac(struct net_device *netdev, void *p)
 	if (ether_addr_equal(netdev->dev_addr, addr->sa_data))
 		goto unlock_mutex;
 
+	ether_addr_copy(old_mac_addr, vport->default_mac_addr);
+	ether_addr_copy(vport->default_mac_addr, addr->sa_data);
 	vport_config = vport->adapter->vport_config[vport->idx];
 	err = idpf_add_mac_filter(vport, np, addr->sa_data, false);
 	if (err) {
 		__idpf_del_mac_filter(vport_config, addr->sa_data);
+		ether_addr_copy(vport->default_mac_addr, netdev->dev_addr);
 		goto unlock_mutex;
 	}
 
-	if (is_valid_ether_addr(vport->default_mac_addr))
-		idpf_del_mac_filter(vport, np, vport->default_mac_addr, false);
+	if (is_valid_ether_addr(old_mac_addr))
+		__idpf_del_mac_filter(vport_config, old_mac_addr);
 
-	ether_addr_copy(vport->default_mac_addr, addr->sa_data);
 	eth_hw_addr_set(netdev, addr->sa_data);
 
 unlock_mutex:
drivers/net/ethernet/intel/idpf/idpf_virtchnl.c +12 -0
index 24febaaa8fbb..cb9a27307670 100644
@@ -3507,6 +3507,16 @@ u32 idpf_get_vport_id(struct idpf_vport *vport)
 	return le32_to_cpu(vport_msg->vport_id);
 }
 
+static void idpf_set_mac_type(struct idpf_vport *vport,
+			      struct virtchnl2_mac_addr *mac_addr)
+{
+	bool is_primary;
+
+	is_primary = ether_addr_equal(vport->default_mac_addr, mac_addr->addr);
+	mac_addr->type = is_primary ? VIRTCHNL2_MAC_ADDR_PRIMARY :
+				      VIRTCHNL2_MAC_ADDR_EXTRA;
+}
+
 /**
  * idpf_mac_filter_async_handler - Async callback for mac filters
  * @adapter: private data struct
@@ -3636,6 +3646,7 @@ int idpf_add_del_mac_filters(struct idpf_vport *vport,
 			    list) {
 		if (add && f->add) {
 			ether_addr_copy(mac_addr[i].addr, f->macaddr);
+			idpf_set_mac_type(vport, &mac_addr[i]);
 			i++;
 			f->add = false;
 			if (i == total_filters)
@@ -3643,6 +3654,7 @@ int idpf_add_del_mac_filters(struct idpf_vport *vport,
 		}
 		if (!add && f->remove) {
 			ether_addr_copy(mac_addr[i].addr, f->macaddr);
+			idpf_set_mac_type(vport, &mac_addr[i]);
 			i++;
 			f->remove = false;
 			if (i == total_filters)
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +2 -2
index d8a919ab7027..05a1f9f5914f 100644
@@ -3565,13 +3565,13 @@ ixgbe_get_eee_fw(struct ixgbe_adapter *adapter, struct ethtool_keee *edata)
 
 	for (i = 0; i < ARRAY_SIZE(ixgbe_ls_map); ++i) {
 		if (hw->phy.eee_speeds_supported & ixgbe_ls_map[i].mac_speed)
-			linkmode_set_bit(ixgbe_lp_map[i].link_mode,
+			linkmode_set_bit(ixgbe_ls_map[i].link_mode,
 					 edata->supported);
 	}
 
 	for (i = 0; i < ARRAY_SIZE(ixgbe_ls_map); ++i) {
 		if (hw->phy.eee_speeds_advertised & ixgbe_ls_map[i].mac_speed)
-			linkmode_set_bit(ixgbe_lp_map[i].link_mode,
+			linkmode_set_bit(ixgbe_ls_map[i].link_mode,
 					 edata->advertised);
 	}
 
drivers/net/ethernet/mediatek/mtk_eth_soc.c +9 -1
index b38e4f2de674..880f27ca84d4 100644
@@ -1737,6 +1737,13 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
 	bool gso = false;
 	int tx_num;
 
+	if (skb_vlan_tag_present(skb) &&
+	    !eth_proto_is_802_3(eth_hdr(skb)->h_proto)) {
+		skb = __vlan_hwaccel_push_inside(skb);
+		if (!skb)
+			goto dropped;
+	}
+
 	/* normally we can rely on the stack not calling this more than once,
 	 * however we have 2 queues running on the same ring so we need to lock
 	 * the ring access
@@ -1782,8 +1789,9 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 drop:
 	spin_unlock(&eth->page_lock);
-	stats->tx_dropped++;
 	dev_kfree_skb_any(skb);
+dropped:
+	stats->tx_dropped++;
 	return NETDEV_TX_OK;
 }
 
drivers/net/ethernet/mellanox/mlx4/en_rx.c +3 -1
index b33285d755b9..a626fd0d2073 100644
@@ -267,8 +267,10 @@ int mlx4_en_create_rx_ring(struct mlx4_en_priv *priv,
 	pp.dma_dir = priv->dma_dir;
 
 	ring->pp = page_pool_create(&pp);
-	if (!ring->pp)
+	if (IS_ERR(ring->pp)) {
+		err = PTR_ERR(ring->pp);
 		goto err_ring;
+	}
 
 	if (xdp_rxq_info_reg(&ring->xdp_rxq, priv->dev, queue_index, 0) < 0)
 		goto err_pp;
drivers/net/ethernet/microchip/lan865x/lan865x.c +5 -2
index 84c41f193561..79b800d2b72c 100644
@@ -423,13 +423,16 @@ static void lan865x_remove(struct spi_device *spi)
 	free_netdev(priv->netdev);
 }
 
-static const struct spi_device_id spidev_spi_ids[] = {
+static const struct spi_device_id lan865x_ids[] = {
 	{ .name = "lan8650" },
+	{ .name = "lan8651" },
 	{},
 };
+MODULE_DEVICE_TABLE(spi, lan865x_ids);
 
 static const struct of_device_id lan865x_dt_ids[] = {
 	{ .compatible = "microchip,lan8650" },
+	{ .compatible = "microchip,lan8651" },
 	{ /* Sentinel */ }
 };
 MODULE_DEVICE_TABLE(of, lan865x_dt_ids);
@@ -441,7 +444,7 @@ static struct spi_driver lan865x_driver = {
 	 },
 	.probe = lan865x_probe,
 	.remove = lan865x_remove,
-	.id_table = spidev_spi_ids,
+	.id_table = lan865x_ids,
 };
 module_spi_driver(lan865x_driver);
 
drivers/net/ethernet/oa_tc6.c +2 -1
index db200e4ec284..91a906a7918a 100644
@@ -1249,7 +1249,8 @@ struct oa_tc6 *oa_tc6_init(struct spi_device *spi, struct net_device *netdev)
 
 	/* Set the SPI controller to pump at realtime priority */
 	tc6->spi->rt = true;
-	spi_setup(tc6->spi);
+	if (spi_setup(tc6->spi) < 0)
+		return NULL;
 
 	tc6->spi_ctrl_tx_buf = devm_kzalloc(&tc6->spi->dev,
 					    OA_TC6_CTRL_SPI_BUF_SIZE,
drivers/net/ethernet/ti/am65-cpsw-nuss.c +1 -1
index 231ca141331f..dbdbc40109c5 100644
@@ -1522,7 +1522,7 @@ static int am65_cpsw_nuss_tx_compl_packets(struct am65_cpsw_common *common,
 		}
 	}
 
-	if (single_port) {
+	if (single_port && num_tx) {
 		netif_txq = netdev_get_tx_queue(ndev, chn);
 		netdev_tx_completed_queue(netif_txq, num_tx, total_bytes);
 		am65_cpsw_nuss_tx_wake(tx_chn, ndev, netif_txq);
drivers/net/ethernet/xilinx/xilinx_axienet_main.c +10 -0
index 0d8a05fe541a..ec6d47dc984a 100644
@@ -1168,6 +1168,15 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
 						       &meta_max_len);
 	dma_unmap_single(lp->dev, skbuf_dma->dma_address, lp->max_frm_size,
 			 DMA_FROM_DEVICE);
+
+	if (IS_ERR(app_metadata)) {
+		if (net_ratelimit())
+			netdev_err(lp->ndev, "Failed to get RX metadata pointer\n");
+		dev_kfree_skb_any(skb);
+		lp->ndev->stats.rx_dropped++;
+		goto rx_submit;
+	}
+
 	/* TODO: Derive app word index programmatically */
 	rx_len = (app_metadata[LEN_APP] & 0xFFFF);
 	skb_put(skb, rx_len);
@@ -1180,6 +1189,7 @@ static void axienet_dma_rx_cb(void *data, const struct dmaengine_result *result)
 	u64_stats_add(&lp->rx_bytes, rx_len);
 	u64_stats_update_end(&lp->rx_stat_sync);
 
+rx_submit:
 	for (i = 0; i < CIRC_SPACE(lp->rx_ring_head, lp->rx_ring_tail,
 				   RX_BUF_NUM_DEFAULT); i++)
 		axienet_rx_submit_desc(lp->ndev);
drivers/net/ethernet/xircom/xirc2ps_cs.c +1 -1
index a31d5d5e6593..97e88886253f 100644
@@ -1576,7 +1576,7 @@ do_reset(struct net_device *dev, int full)
 	    msleep(40);			/* wait 40 msec to let it complete */
 	}
 	if (full_duplex)
-	    PutByte(XIRCREG1_ECR, GetByte(XIRCREG1_ECR | FullDuplex));
+	    PutByte(XIRCREG1_ECR, GetByte(XIRCREG1_ECR) | FullDuplex);
     } else {  /* No MII */
 	SelectPage(0);
 	value = GetByte(XIRCREG_ESR);	 /* read the ESR */
drivers/net/macsec.c +4 -4
index 4c75d1fea552..01329fe7451a 100644
@@ -1844,7 +1844,7 @@ static int macsec_add_rxsa(struct sk_buff *skb, struct genl_info *info)
 
 	if (tb_sa[MACSEC_SA_ATTR_PN]) {
 		spin_lock_bh(&rx_sa->lock);
-		rx_sa->next_pn = nla_get_u64(tb_sa[MACSEC_SA_ATTR_PN]);
+		rx_sa->next_pn = nla_get_uint(tb_sa[MACSEC_SA_ATTR_PN]);
 		spin_unlock_bh(&rx_sa->lock);
 	}
 
@@ -2086,7 +2086,7 @@ static int macsec_add_txsa(struct sk_buff *skb, struct genl_info *info)
 	}
 
 	spin_lock_bh(&tx_sa->lock);
-	tx_sa->next_pn = nla_get_u64(tb_sa[MACSEC_SA_ATTR_PN]);
+	tx_sa->next_pn = nla_get_uint(tb_sa[MACSEC_SA_ATTR_PN]);
 	spin_unlock_bh(&tx_sa->lock);
 
 	if (tb_sa[MACSEC_SA_ATTR_ACTIVE])
@@ -2398,7 +2398,7 @@ static int macsec_upd_txsa(struct sk_buff *skb, struct genl_info *info)
 
 		spin_lock_bh(&tx_sa->lock);
 		prev_pn = tx_sa->next_pn_halves;
-		tx_sa->next_pn = nla_get_u64(tb_sa[MACSEC_SA_ATTR_PN]);
+		tx_sa->next_pn = nla_get_uint(tb_sa[MACSEC_SA_ATTR_PN]);
 		spin_unlock_bh(&tx_sa->lock);
 	}
 
@@ -2496,7 +2496,7 @@ static int macsec_upd_rxsa(struct sk_buff *skb, struct genl_info *info)
 
 		spin_lock_bh(&rx_sa->lock);
 		prev_pn = rx_sa->next_pn_halves;
-		rx_sa->next_pn = nla_get_u64(tb_sa[MACSEC_SA_ATTR_PN]);
+		rx_sa->next_pn = nla_get_uint(tb_sa[MACSEC_SA_ATTR_PN]);
 		spin_unlock_bh(&rx_sa->lock);
 	}
 
drivers/net/mctp/mctp-usb.c +1 -0
index 775a386d0aca..36ccc53b1797 100644
@@ -183,6 +183,7 @@ static void mctp_usb_in_complete(struct urb *urb)
 		struct mctp_usb_hdr *hdr;
 		u8 pkt_len; /* length of MCTP packet, no USB header */
 
+		skb_reset_mac_header(skb);
 		hdr = skb_pull_data(skb, sizeof(*hdr));
 		if (!hdr)
 			break;
drivers/net/pcs/pcs-rzn1-miic.c +1 -1
index d79bb9b06cd2..ce73d9474d5b 100644
@@ -19,7 +19,7 @@
 #define MIIC_PRCMD			0x0
 #define MIIC_ESID_CODE			0x4
 
-#define MIIC_MODCTRL			0x20
+#define MIIC_MODCTRL			0x8
 #define MIIC_MODCTRL_SW_MODE		GENMASK(4, 0)
 
 #define MIIC_CONVCTRL(port)		(0x100 + (port) * 4)
drivers/net/phy/mscc/mscc_ptp.c +8 -10
index 72847320cb65..d692df7d975c 100644
@@ -456,12 +456,12 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)
 		*p++ = (reg >> 24) & 0xff;
 	}
 
-	len = skb_queue_len(&ptp->tx_queue);
+	len = skb_queue_len_lockless(&ptp->tx_queue);
 	if (len < 1)
 		return;
 
 	while (len--) {
-		skb = __skb_dequeue(&ptp->tx_queue);
+		skb = skb_dequeue(&ptp->tx_queue);
 		if (!skb)
 			return;
 
@@ -486,7 +486,7 @@ static void vsc85xx_dequeue_skb(struct vsc85xx_ptp *ptp)
 		 * packet in the FIFO right now, reschedule it for later
 		 * packets.
 		 */
-		__skb_queue_tail(&ptp->tx_queue, skb);
+		skb_queue_tail(&ptp->tx_queue, skb);
 	}
 }
 
@@ -1068,6 +1068,7 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *mii_ts,
 	case HWTSTAMP_TX_ON:
 		break;
 	case HWTSTAMP_TX_OFF:
+		skb_queue_purge(&vsc8531->ptp->tx_queue);
 		break;
 	default:
 		return -ERANGE;
@@ -1092,9 +1093,6 @@ static int vsc85xx_hwtstamp(struct mii_timestamper *mii_ts,
 
 	mutex_lock(&vsc8531->ts_lock);
 
-	__skb_queue_purge(&vsc8531->ptp->tx_queue);
-	__skb_queue_head_init(&vsc8531->ptp->tx_queue);
-
 	/* Disable predictor while configuring the 1588 block */
 	val = vsc85xx_ts_read_csr(phydev, PROCESSOR,
 				  MSCC_PHY_PTP_INGR_PREDICTOR);
@@ -1180,9 +1178,7 @@ static void vsc85xx_txtstamp(struct mii_timestamper *mii_ts,
 
 	skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
 
-	mutex_lock(&vsc8531->ts_lock);
-	__skb_queue_tail(&vsc8531->ptp->tx_queue, skb);
-	mutex_unlock(&vsc8531->ts_lock);
+	skb_queue_tail(&vsc8531->ptp->tx_queue, skb);
 	return;
 
 out:
@@ -1548,6 +1544,7 @@ void vsc8584_ptp_deinit(struct phy_device *phydev)
 	if (vsc8531->ptp->ptp_clock) {
 		ptp_clock_unregister(vsc8531->ptp->ptp_clock);
 		skb_queue_purge(&vsc8531->rx_skbs_list);
+		skb_queue_purge(&vsc8531->ptp->tx_queue);
 	}
 }
 
@@ -1571,7 +1568,7 @@ irqreturn_t vsc8584_handle_ts_interrupt(struct phy_device *phydev)
 	if (rc & VSC85XX_1588_INT_FIFO_ADD) {
 		vsc85xx_get_tx_ts(priv->ptp);
 	} else if (rc & VSC85XX_1588_INT_FIFO_OVERFLOW) {
-		__skb_queue_purge(&priv->ptp->tx_queue);
+		skb_queue_purge(&priv->ptp->tx_queue);
 		vsc85xx_ts_reset_fifo(phydev);
 	}
 
@@ -1591,6 +1588,7 @@ int vsc8584_ptp_probe(struct phy_device *phydev)
 	mutex_init(&vsc8531->phc_lock);
 	mutex_init(&vsc8531->ts_lock);
 	skb_queue_head_init(&vsc8531->rx_skbs_list);
+	skb_queue_head_init(&vsc8531->ptp->tx_queue);
 
 	/* Retrieve the shared load/save GPIO. Request it as non exclusive as
 	 * the same GPIO can be requested by all the PHYs of the same package.
drivers/net/ppp/ppp_generic.c +3 -3
index 5e7672d2022c..bb5343c03925 100644
@@ -1752,7 +1752,6 @@ pad_compress_skb(struct ppp *ppp, struct sk_buff *skb)
 		 */
 		if (net_ratelimit())
 			netdev_err(ppp->dev, "ppp: compressor dropped pkt\n");
-		kfree_skb(skb);
 		consume_skb(new_skb);
 		new_skb = NULL;
 	}
@@ -1854,9 +1853,10 @@ ppp_send_frame(struct ppp *ppp, struct sk_buff *skb)
 					   "down - pkt dropped.\n");
 			goto drop;
 		}
-		skb = pad_compress_skb(ppp, skb);
-		if (!skb)
+		new_skb = pad_compress_skb(ppp, skb);
+		if (!new_skb)
 			goto drop;
+		skb = new_skb;
 	}
 
 	/*
drivers/net/usb/cdc_ncm.c +7 -0
index ea0e5e276cd6..5d123df0a866 100644
@@ -2087,6 +2087,13 @@ static const struct usb_device_id cdc_devs[] = {
 	  .driver_info = (unsigned long)&wwan_info,
 	},
 
+	/* Intel modem (label from OEM reads Fibocom L850-GL) */
+	{ USB_DEVICE_AND_INTERFACE_INFO(0x8087, 0x095a,
+		USB_CLASS_COMM,
+		USB_CDC_SUBCLASS_NCM, USB_CDC_PROTO_NONE),
+	  .driver_info = (unsigned long)&wwan_info,
+	},
+
 	/* DisplayLink docking stations */
 	{ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO
 		| USB_DEVICE_ID_MATCH_VENDOR,
drivers/net/vxlan/vxlan_core.c +12 -6
index 97792de896b7..45cec14d76f6 100644
@@ -1445,6 +1445,10 @@ static enum skb_drop_reason vxlan_snoop(struct net_device *dev,
 		if (READ_ONCE(f->updated) != now)
 			WRITE_ONCE(f->updated, now);
 
+		/* Don't override an fdb with nexthop with a learnt entry */
+		if (rcu_access_pointer(f->nh))
+			return SKB_DROP_REASON_VXLAN_ENTRY_EXISTS;
+
 		if (likely(vxlan_addr_equal(&rdst->remote_ip, src_ip) &&
 			   rdst->remote_ifindex == ifindex))
 			return SKB_NOT_DROPPED_YET;
@@ -1453,10 +1457,6 @@ static enum skb_drop_reason vxlan_snoop(struct net_device *dev,
 		if (f->state & (NUD_PERMANENT | NUD_NOARP))
 			return SKB_DROP_REASON_VXLAN_ENTRY_EXISTS;
 
-		/* Don't override an fdb with nexthop with a learnt entry */
-		if (rcu_access_pointer(f->nh))
-			return SKB_DROP_REASON_VXLAN_ENTRY_EXISTS;
-
 		if (net_ratelimit())
 			netdev_info(dev,
 				    "%pM migrated from %pIS to %pIS\n",
@@ -1880,6 +1880,7 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 	n = neigh_lookup(&arp_tbl, &tip, dev);
 
 	if (n) {
+		struct vxlan_rdst *rdst = NULL;
 		struct vxlan_fdb *f;
 		struct sk_buff	*reply;
 
@@ -1890,7 +1891,9 @@ static int arp_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 
 		rcu_read_lock();
 		f = vxlan_find_mac_tx(vxlan, n->ha, vni);
-		if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {
+		if (f)
+			rdst = first_remote_rcu(f);
+		if (rdst && vxlan_addr_any(&rdst->remote_ip)) {
 			/* bridge-local neighbor */
 			neigh_release(n);
 			rcu_read_unlock();
@@ -2047,6 +2050,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 	n = neigh_lookup(ipv6_stub->nd_tbl, &msg->target, dev);
 
 	if (n) {
+		struct vxlan_rdst *rdst = NULL;
 		struct vxlan_fdb *f;
 		struct sk_buff *reply;
 
@@ -2056,7 +2060,9 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
 		}
 
 		f = vxlan_find_mac_tx(vxlan, n->ha, vni);
-		if (f && vxlan_addr_any(&(first_remote_rcu(f)->remote_ip))) {
+		if (f)
+			rdst = first_remote_rcu(f);
+		if (rdst && vxlan_addr_any(&rdst->remote_ip)) {
 			/* bridge-local neighbor */
 			neigh_release(n);
 			goto out;
drivers/net/vxlan/vxlan_private.h +1 -3
index d328aed9feef..55b84c0cbd65 100644
@@ -61,9 +61,7 @@ static inline struct hlist_head *vs_head(struct net *net, __be16 port)
 	return &vn->sock_list[hash_32(ntohs(port), PORT_HASH_BITS)];
 }
 
-/* First remote destination for a forwarding entry.
- * Guaranteed to be non-NULL because remotes are never deleted.
- */
+/* First remote destination for a forwarding entry. */
 static inline struct vxlan_rdst *first_remote_rcu(struct vxlan_fdb *fdb)
 {
 	if (rcu_access_pointer(fdb->nh))
drivers/net/wireless/ath/ath11k/core.h +2 -0
index 6b2f207975e3..5d0210953fa3 100644
@@ -410,6 +410,8 @@ struct ath11k_vif {
 	bool do_not_send_tmpl;
 	struct ath11k_arp_ns_offload arp_ns_offload;
 	struct ath11k_rekey_data rekey_data;
+	u32 num_stations;
+	bool reinstall_group_keys;
 
 	struct ath11k_reg_tpc_power_info reg_tpc_info;
 
drivers/net/wireless/ath/ath11k/mac.c +102 -9

148 lines not on this page · raw message

drivers/net/wireless/ath/ath12k/wmi.c +1 -0
index 1d0d4a668946..eac5d48cade6 100644
@@ -2370,6 +2370,7 @@ int ath12k_wmi_send_peer_assoc_cmd(struct ath12k *ar,
 
 	eml_cap = arg->ml.eml_cap;
 	if (u16_get_bits(eml_cap, IEEE80211_EML_CAP_EMLSR_SUPP)) {
+		ml_params->flags |= cpu_to_le32(ATH12K_WMI_FLAG_MLO_EMLSR_SUPPORT);
 		/* Padding delay */
 		eml_pad_delay = ieee80211_emlsr_pad_delay_in_us(eml_cap);
 		ml_params->emlsr_padding_delay_us = cpu_to_le32(eml_pad_delay);
drivers/net/wireless/broadcom/brcm80211/brcmfmac/btcoex.c +2 -4
index 69ef8cf203d2..67c0c5a92f99 100644
@@ -393,10 +393,8 @@ void brcmf_btcoex_detach(struct brcmf_cfg80211_info *cfg)
 	if (!cfg->btcoex)
 		return;
 
-	if (cfg->btcoex->timer_on) {
-		cfg->btcoex->timer_on = false;
-		timer_shutdown_sync(&cfg->btcoex->timer);
-	}
+	timer_shutdown_sync(&cfg->btcoex->timer);
+	cfg->btcoex->timer_on = false;
 
 	cancel_work_sync(&cfg->btcoex->work);
 
drivers/net/wireless/intel/iwlwifi/fw/acpi.c +24 -1
index bee7d92293b8..7ec22738b5d6 100644
@@ -169,7 +169,7 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
 
 	BUILD_BUG_ON(ARRAY_SIZE(acpi_dsm_size) != DSM_FUNC_NUM_FUNCS);
 
-	if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size)))
+	if (WARN_ON(func >= ARRAY_SIZE(acpi_dsm_size) || !func))
 		return -EINVAL;
 
 	expected_size = acpi_dsm_size[func];
@@ -178,6 +178,29 @@ int iwl_acpi_get_dsm(struct iwl_fw_runtime *fwrt,
 	if (expected_size != sizeof(u8) && expected_size != sizeof(u32))
 		return -EOPNOTSUPP;
 
+	if (!fwrt->acpi_dsm_funcs_valid) {
+		ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV,
+					       DSM_FUNC_QUERY,
+					       &iwl_guid, &tmp,
+					       acpi_dsm_size[DSM_FUNC_QUERY]);
+		if (ret) {
+			/* always indicate BIT(0) to avoid re-reading */
+			fwrt->acpi_dsm_funcs_valid = BIT(0);
+			return ret;
+		}
+
+		IWL_DEBUG_RADIO(fwrt, "ACPI DSM validity bitmap 0x%x\n",
+				(u32)tmp);
+		/* always indicate BIT(0) to avoid re-reading */
+		fwrt->acpi_dsm_funcs_valid = tmp | BIT(0);
+	}
+
+	if (!(fwrt->acpi_dsm_funcs_valid & BIT(func))) {
+		IWL_DEBUG_RADIO(fwrt, "ACPI DSM %d not indicated as valid\n",
+				func);
+		return -ENODATA;
+	}
+
 	ret = iwl_acpi_get_dsm_integer(fwrt->dev, ACPI_DSM_REV, func,
 				       &iwl_guid, &tmp, expected_size);
 	if (ret)
drivers/net/wireless/intel/iwlwifi/fw/runtime.h +8 -0
index 0444a736c2b2..bd3bc2846cfa 100644
@@ -113,6 +113,10 @@ struct iwl_txf_iter_data {
  * @phy_filters: specific phy filters as read from WPFC BIOS table
  * @ppag_bios_rev: PPAG BIOS revision
  * @ppag_bios_source: see &enum bios_source
+ * @acpi_dsm_funcs_valid: bitmap indicating which DSM values are valid,
+ *	zero (default initialization) means it hasn't been read yet,
+ *	and BIT(0) is set when it has since function 0 also has this
+ *	bitmap and is always supported
  */
 struct iwl_fw_runtime {
 	struct iwl_trans *trans;
@@ -189,6 +193,10 @@ struct iwl_fw_runtime {
 	bool uats_valid;
 	u8 uefi_tables_lock_status;
 	struct iwl_phy_specific_cfg phy_filters;
+
+#ifdef CONFIG_ACPI
+	u32 acpi_dsm_funcs_valid;
+#endif
 };
 
 void iwl_fw_runtime_init(struct iwl_fw_runtime *fwrt, struct iwl_trans *trans,
drivers/net/wireless/intel/iwlwifi/fw/uefi.c +6 -0
index 48126ec6b94b..99a17b9323e9 100644
@@ -747,6 +747,12 @@ int iwl_uefi_get_dsm(struct iwl_fw_runtime *fwrt, enum iwl_dsm_funcs func,
 		goto out;
 	}
 
+	if (!(data->functions[DSM_FUNC_QUERY] & BIT(func))) {
+		IWL_DEBUG_RADIO(fwrt, "DSM func %d not in 0x%x\n",
+				func, data->functions[DSM_FUNC_QUERY]);
+		goto out;
+	}
+
 	*value = data->functions[func];
 
 	IWL_DEBUG_RADIO(fwrt,
drivers/net/wireless/intel/iwlwifi/pcie/drv.c +17 -5
index 0a9e0dbb58fb..4e47ccb43bd8 100644
@@ -670,6 +670,8 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
 
 	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_sff_name,
 		     DEVICE(0x0082), SUBDEV_MASKED(0xC000, 0xF000)),
+	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_sff_name,
+		     DEVICE(0x0085), SUBDEV_MASKED(0xC000, 0xF000)),
 	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_d_name,
 		     DEVICE(0x0082), SUBDEV(0x4820)),
 	IWL_DEV_INFO(iwl6005_n_cfg, iwl6005_2agn_mow1_name,
@@ -726,10 +728,10 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
 		     DEVICE(0x0083), SUBDEV_MASKED(0x5, 0xF)),
 	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
 		     DEVICE(0x0083), SUBDEV_MASKED(0x6, 0xF)),
+	IWL_DEV_INFO(iwl1000_bgn_cfg, iwl1000_bgn_name,
+		     DEVICE(0x0084), SUBDEV_MASKED(0x5, 0xF)),
 	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
-		     DEVICE(0x0084), SUBDEV(0x1216)),
-	IWL_DEV_INFO(iwl1000_bg_cfg, iwl1000_bg_name,
-		     DEVICE(0x0084), SUBDEV(0x1316)),
+		     DEVICE(0x0084), SUBDEV_MASKED(0x6, 0xF)),
 
 /* 100 Series WiFi */
 	IWL_DEV_INFO(iwl100_bgn_cfg, iwl100_bgn_name,
@@ -961,6 +963,12 @@ VISIBLE_IF_IWLWIFI_KUNIT const struct iwl_dev_info iwl_dev_info_table[] = {
 		     DEVICE(0x24F3), SUBDEV(0x0004)),
 	IWL_DEV_INFO(iwl8260_cfg, iwl8260_2n_name,
 		     DEVICE(0x24F3), SUBDEV(0x0044)),
+	IWL_DEV_INFO(iwl8260_cfg, iwl8260_2ac_name,
+		     DEVICE(0x24F4)),
+	IWL_DEV_INFO(iwl8260_cfg, iwl4165_2ac_name,
+		     DEVICE(0x24F5)),
+	IWL_DEV_INFO(iwl8260_cfg, iwl4165_2ac_name,
+		     DEVICE(0x24F6)),
 	IWL_DEV_INFO(iwl8265_cfg, iwl8265_2ac_name,
 		     DEVICE(0x24FD)),
 	IWL_DEV_INFO(iwl8265_cfg, iwl8275_2ac_name,
@@ -1503,11 +1511,15 @@ static int _iwl_pci_resume(struct device *device, bool restore)
 	 * Note: MAC (bits 0:7) will be cleared upon suspend even with wowlan,
 	 * but not bits [15:8]. So if we have bits set in lower word, assume
 	 * the device is alive.
+	 * Alternatively, if the scratch value is 0xFFFFFFFF, then we no longer
+	 * have access to the device and consider it powered off.
 	 * For older devices, just try silently to grab the NIC.
 	 */
 	if (trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_BZ) {
-		if (!(iwl_read32(trans, CSR_FUNC_SCRATCH) &
-		      CSR_FUNC_SCRATCH_POWER_OFF_MASK))
+		u32 scratch = iwl_read32(trans, CSR_FUNC_SCRATCH);
+
+		if (!(scratch & CSR_FUNC_SCRATCH_POWER_OFF_MASK) ||
+		    scratch == ~0U)
 			device_was_powered_off = true;
 	} else {
 		/*
drivers/net/wireless/marvell/libertas/cfg.c +6 -3
index 2e2c193716d9..309556541a83 100644
@@ -1151,10 +1151,13 @@ static int lbs_associate(struct lbs_private *priv,
 	/* add SSID TLV */
 	rcu_read_lock();
 	ssid_eid = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
-	if (ssid_eid)
-		pos += lbs_add_ssid_tlv(pos, ssid_eid + 2, ssid_eid[1]);
-	else
+	if (ssid_eid) {
+		u32 ssid_len = min(ssid_eid[1], IEEE80211_MAX_SSID_LEN);
+
+		pos += lbs_add_ssid_tlv(pos, ssid_eid + 2, ssid_len);
+	} else {
 		lbs_deb_assoc("no SSID\n");
+	}
 	rcu_read_unlock();
 
 	/* add DS param TLV */
drivers/net/wireless/marvell/mwifiex/cfg80211.c +3 -2
index 60c12328c2f3..8085a1ae4bdb 100644
@@ -4668,8 +4668,9 @@ int mwifiex_init_channel_scan_gap(struct mwifiex_adapter *adapter)
 	 * additional active scan request for hidden SSIDs on passive channels.
 	 */
 	adapter->num_in_chan_stats = 2 * (n_channels_bg + n_channels_a);
-	adapter->chan_stats = vmalloc(array_size(sizeof(*adapter->chan_stats),
-						 adapter->num_in_chan_stats));
+	adapter->chan_stats = kcalloc(adapter->num_in_chan_stats,
+				      sizeof(*adapter->chan_stats),
+				      GFP_KERNEL);
 
 	if (!adapter->chan_stats)
 		return -ENOMEM;
drivers/net/wireless/marvell/mwifiex/main.c +2 -2
index 7b50a88a18e5..1ec069bc8ea1 100644
@@ -642,7 +642,7 @@ static int _mwifiex_fw_dpc(const struct firmware *firmware, void *context)
 	goto done;
 
 err_add_intf:
-	vfree(adapter->chan_stats);
+	kfree(adapter->chan_stats);
 err_init_chan_scan:
 	wiphy_unregister(adapter->wiphy);
 	wiphy_free(adapter->wiphy);
@@ -1485,7 +1485,7 @@ static void mwifiex_uninit_sw(struct mwifiex_adapter *adapter)
 	wiphy_free(adapter->wiphy);
 	adapter->wiphy = NULL;
 
-	vfree(adapter->chan_stats);
+	kfree(adapter->chan_stats);
 	mwifiex_free_cmd_buffers(adapter);
 }
 
drivers/net/wireless/mediatek/mt76/mac80211.c +41 -0

53 lines not on this page · raw message

drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
index 0ecf77fcbe3d..0290ddbb2424 100644
@@ -1241,6 +1241,7 @@ int mt76_register_device(struct mt76_dev *dev, bool vht,
 			 struct ieee80211_rate *rates, int n_rates);
 void mt76_unregister_device(struct mt76_dev *dev);
 void mt76_free_device(struct mt76_dev *dev);
+void mt76_reset_device(struct mt76_dev *dev);
 void mt76_unregister_phy(struct mt76_phy *phy);
 
 struct mt76_phy *mt76_alloc_radio_phy(struct mt76_dev *dev, unsigned int size,
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +5 -7
index 6639976afcee..1c0d310146d6 100644
@@ -1460,17 +1460,15 @@ mt7915_mac_full_reset(struct mt7915_dev *dev)
 	if (i == 10)
 		dev_err(dev->mt76.dev, "chip full reset failed\n");
 
-	spin_lock_bh(&dev->mt76.sta_poll_lock);
-	while (!list_empty(&dev->mt76.sta_poll_list))
-		list_del_init(dev->mt76.sta_poll_list.next);
-	spin_unlock_bh(&dev->mt76.sta_poll_lock);
-
-	memset(dev->mt76.wcid_mask, 0, sizeof(dev->mt76.wcid_mask));
-	dev->mt76.vif_mask = 0;
 	dev->phy.omac_mask = 0;
 	if (phy2)
 		phy2->omac_mask = 0;
 
+	mt76_reset_device(&dev->mt76);
+
+	INIT_LIST_HEAD(&dev->sta_rc_list);
+	INIT_LIST_HEAD(&dev->twt_list);
+
 	i = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7915_WTBL_STA);
 	dev->mt76.global_wcid.idx = i;
 	dev->recovery.hw_full_reset = false;
drivers/net/wireless/mediatek/mt76/mt7921/main.c +1 -4
index 77f73ae1d7ec..f6b431c422eb 100644
@@ -1457,11 +1457,8 @@ static int mt7921_pre_channel_switch(struct ieee80211_hw *hw,
 	if (vif->type != NL80211_IFTYPE_STATION || !vif->cfg.assoc)
 		return -EOPNOTSUPP;
 
-	/* Avoid beacon loss due to the CAC(Channel Availability Check) time
-	 * of the AP.
-	 */
 	if (!cfg80211_chandef_usable(hw->wiphy, &chsw->chandef,
-				     IEEE80211_CHAN_RADAR))
+				     IEEE80211_CHAN_DISABLED))
 		return -EOPNOTSUPP;
 
 	return 0;
drivers/net/wireless/mediatek/mt76/mt7925/mac.c +1 -1
index 75823c9fd3a1..b581ab9427f2 100644
@@ -1449,7 +1449,7 @@ void mt7925_usb_sdio_tx_complete_skb(struct mt76_dev *mdev,
 	sta = wcid_to_sta(wcid);
 
 	if (sta && likely(e->skb->protocol != cpu_to_be16(ETH_P_PAE)))
-		mt76_connac2_tx_check_aggr(sta, txwi);
+		mt7925_tx_check_aggr(sta, e->skb, wcid);
 
 	skb_pull(e->skb, headroom);
 	mt76_tx_complete_skb(mdev, e->wcid, e->skb);
drivers/net/wireless/mediatek/mt76/mt7925/main.c +6 -1
index 5b001548dffc..5ea16a0eeea4 100644
@@ -1191,6 +1191,9 @@ mt7925_mac_sta_remove_links(struct mt792x_dev *dev, struct ieee80211_vif *vif,
 		struct mt792x_bss_conf *mconf;
 		struct mt792x_link_sta *mlink;
 
+		if (vif->type == NL80211_IFTYPE_AP)
+			break;
+
 		link_sta = mt792x_sta_to_link_sta(vif, sta, link_id);
 		if (!link_sta)
 			continue;
@@ -2067,8 +2070,10 @@ mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 					     GFP_KERNEL);
 			mlink = devm_kzalloc(dev->mt76.dev, sizeof(*mlink),
 					     GFP_KERNEL);
-			if (!mconf || !mlink)
+			if (!mconf || !mlink) {
+				mt792x_mutex_release(dev);
 				return -ENOMEM;
+			}
 		}
 
 		mconfs[link_id] = mconf;
drivers/net/wireless/mediatek/mt76/mt7925/mcu.c +8 -4
index 300c863f0e3e..cd457be26523 100644
@@ -1834,13 +1834,13 @@ mt7925_mcu_sta_eht_mld_tlv(struct sk_buff *skb,
 	struct tlv *tlv;
 	u16 eml_cap;
 
+	if (!ieee80211_vif_is_mld(vif))
+		return;
+
 	tlv = mt76_connac_mcu_add_tlv(skb, STA_REC_EHT_MLD, sizeof(*eht_mld));
 	eht_mld = (struct sta_rec_eht_mld *)tlv;
 	eht_mld->mld_type = 0xff;
 
-	if (!ieee80211_vif_is_mld(vif))
-		return;
-
 	ext_capa = cfg80211_get_iftype_ext_capa(wiphy,
 						ieee80211_vif_type_p2p(vif));
 	if (!ext_capa)
@@ -1912,6 +1912,7 @@ mt7925_mcu_sta_cmd(struct mt76_phy *phy,
 	struct mt76_dev *dev = phy->dev;
 	struct mt792x_bss_conf *mconf;
 	struct sk_buff *skb;
+	int conn_state;
 
 	mconf = mt792x_vif_to_link(mvif, info->wcid->link_id);
 
@@ -1920,10 +1921,13 @@ mt7925_mcu_sta_cmd(struct mt76_phy *phy,
 	if (IS_ERR(skb))
 		return PTR_ERR(skb);
 
+	conn_state = info->enable ? CONN_STATE_PORT_SECURE :
+				    CONN_STATE_DISCONNECT;
+
 	if (info->enable && info->link_sta) {
 		mt76_connac_mcu_sta_basic_tlv(dev, skb, info->link_conf,
 					      info->link_sta,
-					      info->enable, info->newly);
+					      conn_state, info->newly);
 		mt7925_mcu_sta_phy_tlv(skb, info->vif, info->link_sta);
 		mt7925_mcu_sta_ht_tlv(skb, info->link_sta);
 		mt7925_mcu_sta_vht_tlv(skb, info->link_sta);
drivers/net/wireless/mediatek/mt76/mt7996/mac.c +35 -21

93 lines not on this page · raw message

drivers/net/wireless/mediatek/mt76/mt7996/main.c +5 -0
index f41b2c98bc45..f6590ef85c0d 100644
@@ -516,6 +516,9 @@ int mt7996_set_channel(struct mt76_phy *mphy)
 	struct mt7996_phy *phy = mphy->priv;
 	int ret;
 
+	if (mphy->offchannel)
+		mt7996_mac_update_beacons(phy);
+
 	ret = mt7996_mcu_set_chan_info(phy, UNI_CHANNEL_SWITCH);
 	if (ret)
 		goto out;
@@ -533,6 +536,8 @@ int mt7996_set_channel(struct mt76_phy *mphy)
 
 	mt7996_mac_reset_counters(phy);
 	phy->noise = 0;
+	if (!mphy->offchannel)
+		mt7996_mac_update_beacons(phy);
 
 out:
 	ieee80211_queue_delayed_work(mphy->hw, &mphy->mac_work,
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +10 -5
index dd4b7b8c34ea..a808218da394 100644
@@ -1879,8 +1879,8 @@ mt7996_mcu_get_mmps_mode(enum ieee80211_smps_mode smps)
 int mt7996_mcu_set_fixed_rate_ctrl(struct mt7996_dev *dev,
 				   void *data, u16 version)
 {
+	struct uni_header hdr = {};
 	struct ra_fixed_rate *req;
-	struct uni_header hdr;
 	struct sk_buff *skb;
 	struct tlv *tlv;
 	int len;
@@ -2755,13 +2755,15 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 			  struct ieee80211_bss_conf *link_conf)
 {
 	struct mt7996_dev *dev = mt7996_hw_dev(hw);
-	struct mt76_vif_link *mlink = mt76_vif_conf_link(&dev->mt76, vif, link_conf);
+	struct mt7996_vif_link *link = mt7996_vif_conf_link(dev, vif, link_conf);
+	struct mt76_vif_link *mlink = link ? &link->mt76 : NULL;
 	struct ieee80211_mutable_offsets offs;
 	struct ieee80211_tx_info *info;
 	struct sk_buff *skb, *rskb;
 	struct tlv *tlv;
 	struct bss_bcn_content_tlv *bcn;
 	int len, extra_len = 0;
+	bool enabled = link_conf->enable_beacon;
 
 	if (link_conf->nontransmitted)
 		return 0;
@@ -2769,13 +2771,16 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 	if (!mlink)
 		return -EINVAL;
 
+	if (link->phy && link->phy->mt76->offchannel)
+		enabled = false;
+
 	rskb = __mt7996_mcu_alloc_bss_req(&dev->mt76, mlink,
 					  MT7996_MAX_BSS_OFFLOAD_SIZE);
 	if (IS_ERR(rskb))
 		return PTR_ERR(rskb);
 
 	skb = ieee80211_beacon_get_template(hw, vif, &offs, link_conf->link_id);
-	if (link_conf->enable_beacon && !skb) {
+	if (enabled && !skb) {
 		dev_kfree_skb(rskb);
 		return -EINVAL;
 	}
@@ -2794,7 +2799,7 @@ int mt7996_mcu_add_beacon(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
 	len = ALIGN(sizeof(*bcn) + MT_TXD_SIZE + extra_len, 4);
 	tlv = mt7996_mcu_add_uni_tlv(rskb, UNI_BSS_INFO_BCN_CONTENT, len);
 	bcn = (struct bss_bcn_content_tlv *)tlv;
-	bcn->enable = link_conf->enable_beacon;
+	bcn->enable = enabled;
 	if (!bcn->enable)
 		goto out;
 
@@ -3372,7 +3377,7 @@ int mt7996_mcu_set_hdr_trans(struct mt7996_dev *dev, bool hdr_trans)
 {
 	struct {
 		u8 __rsv[4];
-	} __packed hdr;
+	} __packed hdr = {};
 	struct hdr_trans_blacklist *req_blacklist;
 	struct hdr_trans_en *req_en;
 	struct sk_buff *skb;
drivers/net/wireless/mediatek/mt76/mt7996/mt7996.h +1 -0
index 33ac16b64ef1..8509d508e1e1 100644
@@ -732,6 +732,7 @@ void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
 			   struct sk_buff *skb, struct mt76_wcid *wcid,
 			   struct ieee80211_key_conf *key, int pid,
 			   enum mt76_txq_id qid, u32 changed);
+void mt7996_mac_update_beacons(struct mt7996_phy *phy);
 void mt7996_mac_set_coverage_class(struct mt7996_phy *phy);
 void mt7996_mac_work(struct work_struct *work);
 void mt7996_mac_reset_work(struct work_struct *work);
drivers/net/wireless/mediatek/mt76/tx.c +6 -6
index e6cf16706667..8ab5840fee57 100644
@@ -332,6 +332,7 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
 	struct mt76_wcid *wcid, struct sk_buff *skb)
 {
 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+	struct ieee80211_hdr *hdr = (void *)skb->data;
 	struct sk_buff_head *head;
 
 	if (mt76_testmode_enabled(phy)) {
@@ -349,7 +350,8 @@ mt76_tx(struct mt76_phy *phy, struct ieee80211_sta *sta,
 	info->hw_queue |= FIELD_PREP(MT_TX_HW_QUEUE_PHY, phy->band_idx);
 
 	if ((info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) ||
-	    (info->control.flags & IEEE80211_TX_CTRL_DONT_USE_RATE_MASK))
+	    ((info->control.flags & IEEE80211_TX_CTRL_DONT_USE_RATE_MASK) &&
+	     ieee80211_is_probe_req(hdr->frame_control)))
 		head = &wcid->tx_offchannel;
 	else
 		head = &wcid->tx_pending;
@@ -644,6 +646,7 @@ mt76_txq_schedule_pending_wcid(struct mt76_phy *phy, struct mt76_wcid *wcid,
 static void mt76_txq_schedule_pending(struct mt76_phy *phy)
 {
 	LIST_HEAD(tx_list);
+	int ret = 0;
 
 	if (list_empty(&phy->tx_list))
 		return;
@@ -655,13 +658,13 @@ static void mt76_txq_schedule_pending(struct mt76_phy *phy)
 	list_splice_init(&phy->tx_list, &tx_list);
 	while (!list_empty(&tx_list)) {
 		struct mt76_wcid *wcid;
-		int ret;
 
 		wcid = list_first_entry(&tx_list, struct mt76_wcid, tx_list);
 		list_del_init(&wcid->tx_list);
 
 		spin_unlock(&phy->tx_lock);
-		ret = mt76_txq_schedule_pending_wcid(phy, wcid, &wcid->tx_offchannel);
+		if (ret >= 0)
+			ret = mt76_txq_schedule_pending_wcid(phy, wcid, &wcid->tx_offchannel);
 		if (ret >= 0 && !phy->offchannel)
 			ret = mt76_txq_schedule_pending_wcid(phy, wcid, &wcid->tx_pending);
 		spin_lock(&phy->tx_lock);
@@ -670,9 +673,6 @@ static void mt76_txq_schedule_pending(struct mt76_phy *phy)
 		    !skb_queue_empty(&wcid->tx_offchannel) &&
 		    list_empty(&wcid->tx_list))
 			list_add_tail(&wcid->tx_list, &phy->tx_list);
-
-		if (ret < 0)
-			break;
 	}
 	spin_unlock(&phy->tx_lock);
 
drivers/net/wireless/st/cw1200/sta.c +1 -1
index 5dd7f6a38900..cc56018b2e32 100644
@@ -1290,7 +1290,7 @@ static void cw1200_do_join(struct cw1200_common *priv)
 		rcu_read_lock();
 		ssidie = ieee80211_bss_get_ie(bss, WLAN_EID_SSID);
 		if (ssidie) {
-			join.ssid_len = ssidie[1];
+			join.ssid_len = min(ssidie[1], IEEE80211_MAX_SSID_LEN);
 			memcpy(join.ssid, &ssidie[2], join.ssid_len);
 		}
 		rcu_read_unlock();
drivers/of/of_numa.c +4 -1
index 230d5f628c1b..cd2dc8e825c9 100644
@@ -59,8 +59,11 @@ static int __init of_numa_parse_memory_nodes(void)
 			r = -EINVAL;
 		}
 
-		for (i = 0; !r && !of_address_to_resource(np, i, &rsrc); i++)
+		for (i = 0; !r && !of_address_to_resource(np, i, &rsrc); i++) {
 			r = numa_add_memblk(nid, rsrc.start, rsrc.end + 1);
+			if (!r)
+				node_set(nid, numa_nodes_parsed);
+		}
 
 		if (!i || r) {
 			of_node_put(np);
drivers/pcmcia/omap_cf.c +2 -0
index 1b1dff56ec7b..441cdf83f5a4 100644
@@ -215,6 +215,8 @@ static int __init omap_cf_probe(struct platform_device *pdev)
 		return -EINVAL;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
 
 	cf = kzalloc(sizeof *cf, GFP_KERNEL);
 	if (!cf)
drivers/pcmcia/rsrc_iodyn.c +3 -0
index b04b16496b0c..2677b577c1f8 100644
@@ -62,6 +62,9 @@ static struct resource *__iodyn_find_io_region(struct pcmcia_socket *s,
 	unsigned long min = base;
 	int ret;
 
+	if (!res)
+		return NULL;
+
 	data.mask = align - 1;
 	data.offset = base & data.mask;
 
drivers/pcmcia/rsrc_nonstatic.c +3 -1
index bf9d070a4496..da494fe451ba 100644
@@ -375,7 +375,9 @@ static int do_validate_mem(struct pcmcia_socket *s,
 
 	if (validate && !s->fake_cis) {
 		/* move it to the validated data set */
-		add_interval(&s_data->mem_db_valid, base, size);
+		ret = add_interval(&s_data->mem_db_valid, base, size);
+		if (ret)
+			return ret;
 		sub_interval(&s_data->mem_db, base, size);
 	}
 
drivers/platform/x86/acer-wmi.c +12 -59

115 lines not on this page · raw message

drivers/platform/x86/amd/pmc/pmc-quirks.c +48 -20

95 lines not on this page · raw message

drivers/platform/x86/amd/pmc/pmc.c +0 -13
index 0b9b23eb7c2c..bd318fd02ccf 100644

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

drivers/platform/x86/asus-nb-wmi.c +0 -2
index f84c3d03c1de..e6726be5890e 100644

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

drivers/platform/x86/asus-wmi.c +8 -1
index f7191fdded14..e72a2b5d158e 100644

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

drivers/platform/x86/intel/tpmi_power_domains.c +1 -1
index 9d8247bb9cfa..8641353b2e06 100644

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

drivers/ptp/ptp_ocp.c +1 -2
index 1e7f72e57557..538828547595 100644

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

drivers/scsi/lpfc/lpfc_nvmet.c +6 -4
index fba2e62027b7..4cfc928bcf2d 100644

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

drivers/scsi/sr.c +10 -6
index b17796d5ee66..add13e306898 100644

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

drivers/soc/qcom/mdt_loader.c +7 -5
index 64e0facc392e..29124aa6d03b 100644

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

drivers/spi/spi-fsl-lpspi.c +13 -11
index 1a22d356a73d..90e4028ca14f 100644

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

drivers/spi/spi-microchip-core-qspi.c +0 -12
index fa828fcaaef2..073607fb51cb 100644

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

drivers/spi/spi-qpic-snand.c +4 -2
index e98e997680c7..cfc81327f7a4 100644

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

drivers/tee/optee/ffa_abi.c +2 -2
index f9ef7d94cebd..a963eed70c1d 100644

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

drivers/tee/tee_shm.c +10 -4
index daf6e5cfd59a..2a7d253d9c55 100644

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

fs/btrfs/btrfs_inode.h +1 -1
index a79fa0726f1d..216eff293ffe 100644

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

fs/btrfs/extent_io.c +13 -4
index 3711a5d07342..fac4000a5bca 100644

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

fs/btrfs/inode.c +1 -0
index df4c8312aae3..ffa5d6c15940 100644

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

fs/btrfs/tree-log.c +53 -25

78 lines not on this page · raw message

fs/btrfs/zoned.c +35 -20

55 lines not on this page · raw message

fs/fs-writeback.c +5 -4
index cc57367fb641..a07b8cf73ae2 100644

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

fs/ocfs2/inode.c +3 -0
index 12e5d1f73325..561d3b755fe8 100644

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

fs/proc/generic.c +21 -17
index e0e50914ab25..409bc1d11eca 100644

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

fs/smb/client/cifs_unicode.c +3 -0
index 4cc6e0896fad..f8659d36793f 100644

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

include/linux/cpuhotplug.h +1 -0
index df366ee15456..e62064cb9e08 100644

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

include/linux/pgalloc.h new file +29 -0
new file mode 100644
index 000000000000..9174fa59bbc5

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

include/linux/pgtable.h +21 -4
index 0b6e1f781d86..6dbf8303bd0e 100644

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

include/linux/vmalloc.h +0 -16
index fdc9aeb74a44..2759dac6be44 100644

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

include/net/sock.h +12 -5
index e3ab20345685..a348ae145eda 100644

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

include/uapi/linux/netfilter/nf_tables.h +2 -0
index 2beb30be2c5f..8e0eb832bc01 100644

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

kernel/auditfilter.c +1 -1
index e3f42018ed46..f7708fe2c457 100644

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

kernel/sched/topology.c +2 -0
index b958fe48e020..ac36069bd252 100644

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

mm/kasan/init.c +6 -6
index ced6b29fcf76..8fce3370c84e 100644

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

mm/kasan/kasan_test_c.c +2 -0
index c9cdafdde132..00ca3c4def37 100644

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

mm/kmemleak.c +20 -7
index 84265983f239..1ac56ceb29b6 100644

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

mm/percpu.c +3 -3
index b35494c8ede2..ce460711fa4e 100644

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

mm/slub.c +26 -11
index 394646988b1c..09b6404ac575 100644

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

mm/sparse-vmemmap.c +3 -8
index fd2ab5118e13..dbd8daccade2 100644

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

mm/sparse.c +9 -6
index 3c012cf83cc2..e6075b622407 100644

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

mm/userfaultfd.c +7 -2
index 2f4b98f2c8ad..563449d7b092 100644

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

net/appletalk/atalk_proc.c +1 -1
index 9c1241292d1d..01787fb6a7bc 100644

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

net/atm/resources.c +4 -2
index b19d851e1f44..7c6fdedbcf4e 100644

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

net/ax25/ax25_in.c +4 -0
index 1cac25aca637..f2d66af86359 100644

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

net/batman-adv/network-coding.c +6 -1
index 9f56308779cc..af97d077369f 100644

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

net/bluetooth/af_bluetooth.c +1 -1
index 6ad2f72f53f4..ee9bf84c88a7 100644

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

net/bluetooth/hci_sync.c +1 -1
index 749bba1512eb..a25439f1eeac 100644

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

net/bluetooth/l2cap_sock.c +3 -0
index 82d943c4cb50..05b7480970f7 100644

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

net/bridge/br_netfilter_hooks.c +0 -3
index 94cbe967d1c1..083e2fe96441 100644

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

net/core/gen_estimator.c +2 -0
index 7d426a8e29f3..f112156db587 100644

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

net/core/sock.c +0 -33
index 9fae9239f939..10c1df62338b 100644

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

net/ipv4/devinet.c +3 -4
index c47d3828d4f6..942a887bf089 100644

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

net/ipv4/icmp.c +4 -2
index 717cb7d3607a..14beae97f81b 100644

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

net/ipv4/inet_connection_sock.c +12 -15
index 46750c96d08e..f4157d26ec9e 100644

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

net/ipv4/inet_diag.c +1 -1
index 1d1d6ad53f4c..2fa53b16fe77 100644

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

net/ipv4/inet_hashtables.c +2 -2
index 77a0b52b2eab..ceeeec9b7290 100644

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

net/ipv4/ping.c +1 -1
index 4eacaf00e2e9..031df4c19fcc 100644

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

net/ipv4/raw.c +1 -1
index 32f942d0f944..1d2c89d63cc7 100644

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

net/ipv4/tcp_ipv4.c +4 -4
index 6a14f9e6fef6..429fb34b075e 100644

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

net/ipv4/udp.c +8 -8
index f94bb222aa2d..19573ee64a0f 100644

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

net/ipv6/datagram.c +1 -1
index 83f5aa5e133a..281722817a65 100644

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

net/ipv6/ip6_icmp.c +4 -2
index 9e3574880cb0..233914b63bdb 100644

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

net/ipv6/tcp_ipv6.c +17 -19
index f61b0396ef6b..5604ae6163f4 100644

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

net/key/af_key.c +1 -1
index b5d761700776..2ebde0352245 100644

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

net/llc/llc_proc.c +1 -1
index 07e9abb5978a..aa81c67b24a1 100644

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

net/mac80211/mlme.c +8 -0
index 006d02dce949..b73a6d7f3e93 100644

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

net/mac80211/tests/chan-mode.c +25 -5
index 96c7b3ab2744..adc069065e73 100644

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

net/mctp/af_mctp.c +1 -1
index 9d5db3feedec..4dee06171361 100644

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

net/mctp/route.c +19 -16
index d9c8e5a5f9ce..19ff259d7bc4 100644

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

net/mptcp/protocol.c +0 -1
index 76cb699885b3..1063c53850c0 100644

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

net/netfilter/nf_conntrack_helper.c +2 -2
index 4ed5878cb25b..ceb48c3ca0a4 100644

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

net/netfilter/nf_tables_api.c +31 -11

42 lines not on this page · raw message

net/netlink/diag.c +1 -1
index 61981e01fd6f..b8e58132e8af 100644

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

net/packet/af_packet.c +1 -1
index c7c7de3403f7..a7017d7f0927 100644

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

net/packet/diag.c +1 -1
index 47f69f3dbf73..6ce1dcc284d9 100644

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

net/phonet/socket.c +2 -2
index 5ce0b3ee5def..ea4d5e6533db 100644

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

net/sctp/input.c +1 -1
index 6fcdcaeed40e..7e99894778d4 100644

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

net/sctp/proc.c +2 -2
index ec00ee75d59a..74bff317e205 100644

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

net/sctp/socket.c +2 -2
index 1e5739858c20..aa6400811018 100644

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

net/smc/smc_clc.c +0 -2
index 521f5df80e10..8a794333e992 100644

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

net/smc/smc_diag.c +1 -1
index 6fdb2d96777a..8ed2f6689b01 100644

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

net/smc/smc_ib.c +3 -0
index 53828833a3f7..a42ef3f77b96 100644

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

net/tipc/socket.c +1 -1
index 7c61d47ea208..e028bf658499 100644

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

net/unix/af_unix.c +1 -1
index 52b155123985..564c970d97ff 100644

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

net/unix/diag.c +1 -1
index 79b182d0e62a..ca3473026151 100644

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

net/wireless/scan.c +2 -1
index e8a4fe44ec2d..f2a66af385dc 100644

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

net/wireless/sme.c +4 -1
index cf998500a965..05d06512983c 100644

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

net/xdp/xsk_diag.c +1 -1
index 09dcea0cbbed..0e0bca031c03 100644

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

rust/kernel/mm/virt.rs +1 -0
index 31803674aecc..a1181cfae962 100644

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

scripts/Makefile.kasan +8 -4
index 693dbbebebba..0ba2aac3b8dc 100644

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

scripts/generate_rust_target.rs +10 -2
index 39c82908ff3a..38b3416bb979 100644

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

sound/pci/hda/patch_hdmi.c +1 -0
index 9a7793eb16e9..bc43ea4d4e16 100644

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

sound/pci/hda/patch_realtek.c +2 -0
index 0ec98833e3d2..8458ca4d8d9d 100644

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

sound/pci/hda/tas2781_hda_i2c.c +4 -1
index 8c5ebbe8a1f3..eab99e9ba2c6 100644

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

sound/soc/renesas/rcar/core.c +1 -1
index a72f36d3ca2c..4f4ed24cb361 100644

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

sound/soc/soc-core.c +3 -2
index 16bbc074dc5f..d31ee6e9abef 100644

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

sound/soc/sof/intel/ptl.c +1 -0
index 1bc1f54c470d..4633cd01e7dd 100644

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

sound/usb/format.c +8 -4
index 0ee532acbb60..ec95a063beb1 100644

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

sound/usb/mixer_quirks.c +2 -0
index d0efb3dd8675..9530c59b3cf4 100644

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

tools/gpio/Makefile +1 -1
index ed565eb52275..342e056c8c66 100644

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

tools/net/ynl/pyynl/ynl_gen_c.py +1 -1
index 76032e01c2e7..0725a52b6ad7 100755

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

tools/perf/util/bpf-event.c +27 -12
index c81444059ad0..d9123c9637ba 100644

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

tools/perf/util/bpf-utils.c +39 -22

61 lines not on this page · raw message

tools/power/cpupower/utils/cpupower-set.c +2 -2
index 0677b58374ab..59ace394cf3e 100644

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

tools/testing/selftests/drivers/net/hw/csum.py +2 -2
index cd23af875317..3e3a89a34afe 100755

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

tools/testing/selftests/net/bind_bhash.c +2 -2
index 57ff67a3751e..da04b0b19b73 100644

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

tools/testing/selftests/net/netfilter/conntrack_clash.sh +1 -1
index 606a43a60f73..7fc6c5dbd551 100755

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

tools/testing/selftests/net/netfilter/conntrack_resize.sh +3 -2
index 788cd56ea4a0..615fe3c6f405 100755

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

tools/testing/selftests/net/netfilter/nft_flowtable.sh +76 -37

113 lines not on this page · raw message

tools/testing/selftests/net/netfilter/udpclash.c +1 -1
index 85c7b906ad08..79de163d61ab 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.