Skip to contentSkip to conversation

Linux 5.15.6

DISCUSSION Greg Kroah-Hartman 1 participant 2 messages Dec 1, 2021 Stable branch

lore
Share & tools
lore

Greg Kroah-Hartman

author maintainer
#0 lore raw

I'm announcing the release of the 5.15.6 kernel.

All users of the 5.15 kernel series must upgrade.

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

thanks,

greg k-h

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

 Documentation/admin-guide/sysctl/kernel.rst                 |    2 
 Documentation/networking/ipvs-sysctl.rst                    |    3 
 Makefile                                                    |    2 
 arch/arm/boot/dts/bcm2711.dtsi                              |    8 
 arch/arm/boot/dts/bcm5301x.dtsi                             |    4 
 arch/arm/mach-socfpga/core.h                                |    2 
 arch/arm/mach-socfpga/platsmp.c                             |    8 
 arch/arm64/include/asm/pgalloc.h                            |    2 
 arch/arm64/include/asm/uaccess.h                            |   48 ++
 arch/mips/Kconfig                                           |    2 
 arch/mips/kernel/cpu-probe.c                                |    4 
 arch/parisc/kernel/vmlinux.lds.S                            |    3 
 arch/powerpc/kernel/head_32.h                               |    6 
 arch/powerpc/kvm/book3s_hv_builtin.c                        |    5 
 arch/riscv/boot/dts/microchip/microchip-mpfs-icicle-kit.dts |   13 
 arch/riscv/boot/dts/microchip/microchip-mpfs.dtsi           |   33 -
 arch/x86/include/asm/xen/hypervisor.h                       |    5 
 block/blk-core.c                                            |    4 
 block/blk-mq.c                                              |   13 
 block/blk-mq.h                                              |    2 
 block/blk-sysfs.c                                           |   10 
 block/elevator.c                                            |   10 
 block/genhd.c                                               |    2 
 drivers/acpi/cppc_acpi.c                                    |    9 
 drivers/acpi/property.c                                     |   11 
 drivers/android/binder.c                                    |    2 
 drivers/cpufreq/intel_pstate.c                              |    7 
 drivers/firmware/arm_scmi/base.c                            |   15 
 drivers/firmware/arm_scmi/scmi_pm_domain.c                  |    4 
 drivers/firmware/arm_scmi/sensors.c                         |    2 
 drivers/firmware/arm_scmi/virtio.c                          |   10 
 drivers/firmware/arm_scmi/voltage.c                         |    2 
 drivers/firmware/smccc/soc_id.c                             |    2 
 drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c                      |    3 
 drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c                      |   15 
 drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c                       |   46 +-
 drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c           |    9 
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c        |   20 
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c         |   24 -
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu8_hwmgr.c         |    6 
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c       |   28 -
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c       |   10 
 drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c       |   58 +-
 drivers/gpu/drm/aspeed/aspeed_gfx_drv.c                     |    2 
 drivers/gpu/drm/hyperv/hyperv_drm_drv.c                     |   19 
 drivers/gpu/drm/nouveau/nvkm/engine/device/base.c           |   22 +
 drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.c             |    6 
 drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.c             |    6 
 drivers/gpu/drm/vc4/vc4_bo.c                                |    2 
 drivers/hid/hid-input.c                                     |    6 
 drivers/hid/hid-magicmouse.c                                |    7 
 drivers/hid/wacom_wac.c                                     |    8 
 drivers/hid/wacom_wac.h                                     |    1 
 drivers/i2c/busses/i2c-virtio.c                             |   14 
 drivers/iommu/amd/iommu_v2.c                                |    6 
 drivers/iommu/intel/iommu.c                                 |    6 
 drivers/iommu/rockchip-iommu.c                              |    4 
 drivers/media/cec/core/cec-adap.c                           |    1 
 drivers/media/v4l2-core/v4l2-compat-ioctl32.c               |   41 --
 drivers/mmc/host/sdhci-esdhc-imx.c                          |    2 
 drivers/mmc/host/sdhci.c                                    |   21 -
 drivers/mmc/host/sdhci.h                                    |    4 
 drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c          |    4 
 drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c   |    4 
 drivers/net/ethernet/intel/iavf/iavf.h                      |    3 
 drivers/net/ethernet/intel/iavf/iavf_ethtool.c              |   33 +
 drivers/net/ethernet/intel/iavf/iavf_main.c                 |   51 +-
 drivers/net/ethernet/intel/iavf/iavf_virtchnl.c             |   47 ++
 drivers/net/ethernet/intel/ice/ice_lib.c                    |    9 
 drivers/net/ethernet/intel/ice/ice_main.c                   |   18 
 drivers/net/ethernet/intel/igb/igb_main.c                   |    2 
 drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c             |   14 
 drivers/net/ethernet/marvell/prestera/prestera_switchdev.c  |    8 
 drivers/net/ethernet/mellanox/mlxsw/spectrum.c              |    2 
 drivers/net/ethernet/microchip/lan743x_main.c               |   12 
 drivers/net/ethernet/mscc/ocelot.c                          |   11 
 drivers/net/ethernet/netronome/nfp/nfp_net.h                |    3 
 drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c        |    2 
 drivers/net/ethernet/stmicro/stmmac/stmmac.h                |    1 
 drivers/net/ethernet/stmicro/stmmac/stmmac_main.c           |  127 ++++--
 drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c       |    2 
 drivers/net/ipa/ipa_cmd.c                                   |   16 
 drivers/net/ipa/ipa_cmd.h                                   |    6 
 drivers/net/ipa/ipa_endpoint.c                              |    2 
 drivers/net/ipa/ipa_main.c                                  |    6 
 drivers/net/ipa/ipa_modem.c                                 |    6 
 drivers/net/ipa/ipa_smp2p.c                                 |   21 -
 drivers/net/ipa/ipa_smp2p.h                                 |    7 
 drivers/net/mdio/mdio-aspeed.c                              |    7 
 drivers/net/phy/phylink.c                                   |   26 +
 drivers/net/usb/smsc95xx.c                                  |   55 +-
 drivers/nvme/target/io-cmd-file.c                           |    4 
 drivers/nvme/target/tcp.c                                   |    7 
 drivers/pci/controller/pci-aardvark.c                       |  242 ++++--------
 drivers/scsi/mpt3sas/mpt3sas_base.c                         |    4 
 drivers/scsi/mpt3sas/mpt3sas_base.h                         |    4 
 drivers/scsi/mpt3sas/mpt3sas_scsih.c                        |   59 ++
 drivers/scsi/qla2xxx/qla_edif.c                             |    2 
 drivers/scsi/scsi_debug.c                                   |    5 
 drivers/scsi/scsi_sysfs.c                                   |    2 
 drivers/scsi/sd.c                                           |    7 
 drivers/staging/fbtft/fb_ssd1351.c                          |    4 
 drivers/staging/fbtft/fbtft-core.c                          |    9 
 drivers/staging/greybus/audio_helper.c                      |    8 
 drivers/staging/r8188eu/core/rtw_mlme_ext.c                 |    6 
 drivers/staging/r8188eu/os_dep/ioctl_linux.c                |    8 
 drivers/staging/r8188eu/os_dep/mlme_linux.c                 |    2 
 drivers/staging/rtl8192e/rtl8192e/rtl_core.c                |    3 
 drivers/usb/chipidea/ci_hdrc_imx.c                          |   18 
 drivers/usb/core/hub.c                                      |   24 -
 drivers/usb/dwc2/gadget.c                                   |   17 
 drivers/usb/dwc2/hcd_queue.c                                |    2 
 drivers/usb/dwc3/core.c                                     |    8 
 drivers/usb/dwc3/core.h                                     |    2 
 drivers/usb/dwc3/gadget.c                                   |   39 +
 drivers/usb/host/xhci-tegra.c                               |   41 +-
 drivers/usb/serial/option.c                                 |    5 
 drivers/usb/serial/pl2303.c                                 |    1 
 drivers/usb/typec/tcpm/fusb302.c                            |    6 
 drivers/vdpa/vdpa_sim/vdpa_sim.c                            |    7 
 drivers/vhost/vsock.c                                       |    2 
 drivers/xen/xenbus/xenbus_probe.c                           |   27 +
 fs/ceph/super.c                                             |   11 
 fs/cifs/cifs_debug.c                                        |    2 
 fs/cifs/cifsglob.h                                          |    1 
 fs/cifs/connect.c                                           |    7 
 fs/erofs/utils.c                                            |    8 
 fs/f2fs/checkpoint.c                                        |    3 
 fs/f2fs/node.c                                              |    1 
 fs/fuse/dev.c                                               |   10 
 fs/io_uring.c                                               |   70 ++-
 fs/iomap/buffered-io.c                                      |   11 
 fs/ksmbd/smb2pdu.c                                          |   30 -
 fs/nfs/nfs42proc.c                                          |    4 
 fs/nfs/nfs42xdr.c                                           |    3 
 fs/proc/vmcore.c                                            |   16 
 include/net/ip6_fib.h                                       |    1 
 include/net/ipv6_stubs.h                                    |    1 
 include/net/nl802154.h                                      |    7 
 kernel/cpu.c                                                |    7 
 kernel/events/core.c                                        |    3 
 kernel/locking/rwsem.c                                      |  171 ++++----
 kernel/power/hibernate.c                                    |    6 
 kernel/sched/core.c                                         |    4 
 kernel/trace/trace.h                                        |   24 -
 kernel/trace/trace_events.c                                 |   10 
 kernel/trace/trace_uprobe.c                                 |    1 
 net/8021q/vlan.c                                            |    3 
 net/8021q/vlan_dev.c                                        |    3 
 net/ethtool/ioctl.c                                         |    2 
 net/ipv4/nexthop.c                                          |   35 +
 net/ipv4/tcp_cubic.c                                        |    5 
 net/ipv6/af_inet6.c                                         |    1 
 net/ipv6/ip6_output.c                                       |    2 
 net/ipv6/route.c                                            |   19 
 net/mptcp/options.c                                         |   32 -
 net/mptcp/protocol.c                                        |   51 ++
 net/mptcp/protocol.h                                        |   17 
 net/ncsi/ncsi-cmd.c                                         |   24 -
 net/netfilter/ipvs/ip_vs_core.c                             |    8 
 net/netfilter/nf_conntrack_netlink.c                        |    6 
 net/netfilter/nf_flow_table_offload.c                       |    4 
 net/sched/sch_ets.c                                         |    8 
 net/smc/af_smc.c                                            |   12 
 net/smc/smc_close.c                                         |    6 
 net/smc/smc_core.c                                          |   35 -
 net/tls/tls_main.c                                          |   47 +-
 net/tls/tls_sw.c                                            |   40 +
 net/unix/af_unix.c                                          |    3 
 sound/hda/intel-dsp-config.c                                |    9 
 sound/pci/ctxfi/ctamixer.c                                  |   14 
 sound/pci/ctxfi/ctdaio.c                                    |   16 
 sound/pci/ctxfi/ctresource.c                                |    7 
 sound/pci/ctxfi/ctresource.h                                |    4 
 sound/pci/ctxfi/ctsrc.c                                     |    7 
 sound/pci/hda/patch_realtek.c                               |   28 +
 sound/soc/codecs/lpass-rx-macro.c                           |    2 
 sound/soc/codecs/wcd934x.c                                  |    3 
 sound/soc/codecs/wcd938x.c                                  |    3 
 sound/soc/qcom/qdsp6/q6asm-dai.c                            |   19 
 sound/soc/qcom/qdsp6/q6routing.c                            |    6 
 sound/soc/soc-topology.c                                    |    3 
 sound/soc/sof/intel/hda-bus.c                               |   17 
 sound/soc/sof/intel/hda-dsp.c                               |    3 
 sound/soc/sof/intel/hda.c                                   |   16 
 sound/soc/stm/stm32_i2s.c                                   |    2 
 186 files changed, 1694 insertions(+), 972 deletions(-)

Adamos Ttofari (1):
cpufreq: intel_pstate: Add Ice Lake server to out-of-band IDs

Adrian Hunter (1):
mmc: sdhci: Fix ADMA for PAGE_SIZE >= 64KiB

Albert Wang (1):
usb: dwc3: gadget: Fix null pointer exception

Alex Bee (1):
iommu/rockchip: Fix PAGE_DESC_HI_MASKs for RK3568

Alex Deucher (3):
drm/amdgpu/pm: fix powerplay OD interface drm/amdgpu/gfx10: add wraparound gpu counter check for APUs as well drm/amdgpu/gfx9: switch to golden tsc registers for renoir+

Alex Elder (3):
net: ipa: directly disable ipa-setup-ready interrupt
net: ipa: separate disabling setup from modem stop
net: ipa: kill ipa_cmd_pipeline_clear()

Alex Williamson (1):
iommu/vt-d: Fix unmap_pages support

Alexander Aring (1):

      net: ieee802154: handle iftypes as u32

Amit Cohen (1):
mlxsw: spectrum: Protect driver from buggy firmware

Andreas Gruenbacher (1):
iomap: Fix inline extent handling in iomap_readpage

Arnd Bergmann (1):
media: v4l2-core: fix VIDIOC_DQEVENT handling on non-x86

Ben Skeggs (1):
drm/nouveau: recognise GA106

Benjamin Coddington (1):
NFSv42: Fix pagecache invalidation after COPY/CLONE

Brett Creeley (1):
iavf: Fix VLAN feature flags after VFR

Chao Yu (1):
f2fs: quota: fix potential deadlock

Christophe JAILLET (1):
ksmbd: Fix an error handling path in 'smb2_sess_setup()'

Christophe Leroy (1):
powerpc/32: Fix hardlockup on vmap stack overflow

Claudia Pellegrino (1):
HID: magicmouse: prevent division by 0 on scroll

Cristian Marussi (3):
firmware: arm_scmi: Fix null de-reference on error path
firmware: arm_scmi: Fix type error assignment in voltage protocol
firmware: arm_scmi: Fix type error in sensor protocol

Damien Le Moal (1):
scsi: sd: Fix sd_do_mode_sense() buffer length handling

Dan Carpenter (6):
usb: chipidea: ci_hdrc_imx: fix potential error pointer dereference in probe
staging: rtl8192e: Fix use after free in _rtl92e_pci_disconnect()
staging: r8188eu: fix a memory leak in rtw_wx_read32() drm/nouveau/acr: fix a couple NULL vs IS_ERR() checks
scsi: qla2xxx: edif: Fix off by one bug in qla_edif_app_getfcinfo() drm/vc4: fix error code in vc4_create_object()

Daniele Palmas (1):

      USB: serial: option: add Telit LE910S1 0x9200 composition

David Hildenbrand (1):
proc/vmcore: fix clearing user buffer by properly using clear_user()

Davide Caratti (1):
net/sched: sch_ets: don't peek at classes beyond 'nbands'

Diana Wang (1):
nfp: checking parameter process for rx-usecs/tx-usecs is invalid

Dmitry Osipenko (1):
usb: xhci: tegra: Check padctrl interrupt presence in device tree

Dylan Hung (1):
mdio: aspeed: Fix "Link is Down" issue

Eric Dumazet (3):
mptcp: fix delack timer
ipv6: fix typos in __ip6_finish_output()
tcp_cubic: fix spurious Hystart ACK train detections for not-cwnd-limited flows

Fabio Aiuto (1):
usb: dwc3: leave default DMA for PCI devices

Fabio M. De Francesco (1):
staging: r8188eu: Use kzalloc() with GFP_ATOMIC in atomic context

Florent Fourcot (2):
netfilter: ctnetlink: fix filtering with CTA_TUPLE_REPLY
netfilter: ctnetlink: do not erase error code with EINVAL

Florian Fainelli (3):
ARM: dts: BCM5301X: Fix I2C controller interrupt
ARM: dts: BCM5301X: Add interrupt properties to GPIO node
ARM: dts: bcm2711: Fix PCIe interrupts

Greg Kroah-Hartman (1):

      Linux 5.15.6

Guangbin Huang (1):
net: hns3: fix VF RSS failed problem after PF enable multi-TCs

Guo DaXing (1):
net/smc: Fix loop in smc_listen

Hans Verkuil (1):
media: cec: copy sequence field for the reply

Hans de Goede (1):
HID: input: Fix parsing of HID_CP_CONSUMER_CONTROL fields

Heiner Kallweit (1):
lan743x: fix deadlock in lan743x_phy_link_status_change()

Helge Deller (1):
Revert "parisc: Fix backtrace to always include init funtion names"

Holger Assmann (1):
net: stmmac: retain PTP clock time during SIOCSHWTSTAMP ioctls

Huang Jianan (1):
erofs: fix deadlock when shrink erofs slab

Huang Pei (2):
MIPS: loongson64: fix FTLB configuration
MIPS: use 3-level pgtable for 64KB page size on MIPS_VA_BITS_48

Jakub Kicinski (3):
tls: splice_read: fix record type check
tls: splice_read: fix accessing pre-processed records
tls: fix replacing proto_ops

Jason Gerecke (1):
HID: wacom: Use "Confidence" flag to prevent reporting invalid contacts

Jedrzej Jagielski (1):
iavf: Fix refreshing iavf adapter stats on ethtool request

Jeff Layton (1):
ceph: properly handle statfs on multifs setups

Jesse Brandeburg (1):
igb: fix netpoll exit with traffic

Jie Wang (1):
net: hns3: fix incorrect components info of ethtool --reset command

Jiri Olsa (1):
tracing/uprobe: Fix uprobe_perf_open probes iteration

Joel Stanley (1):
drm/aspeed: Fix vga_pw sysfs output

Joerg Roedel (1):
iommu/amd: Clarify AMD IOMMUv2 initialization messages

Johan Hovold (1):
USB: serial: pl2303: fix GC type detection

Juergen Gross (2):
x86/pvh: add prototype for xen_pvh_init()
xen/pvh: add missing prototype to header

Julian Wiedmann (1):
ethtool: ioctl: fix potential NULL deref in ethtool_set_coalesce()

Kai Vehmanen (1):
ASoC: SOF: Intel: hda: fix hotplug when only codec is suspended

Karsten Graul (1):
net/smc: Fix NULL pointer dereferencing in smc_vlan_by_tcpsk()

Krzysztof Kozlowski (2):
riscv: dts: microchip: fix board compatible
riscv: dts: microchip: drop duplicated MMC/SDHC node

Kumar Thangavel (1):
net/ncsi : Add payload to be 32-bit aligned to fix dropped packets

Larry Finger (1):
staging: r8188eu: Fix breakage introduced when 5G code was removed

Longpeng (1):
vdpa_sim: avoid putting an uninitialized iova_domain

Maciej Fijalkowski (1):

      ice: fix vsi->txq_map sizing

Marco Elver (1):
perf: Ignore sigtrap for tracepoints destined for other tasks

Marek Behún (2):
PCI: aardvark: Deduplicate code in advk_pcie_rd_conf()
net: marvell: mvpp2: increase MTU limit when XDP enabled

Mark Rutland (2):
arm64: uaccess: avoid blocking within critical sections sched/scs: Reset task stack state in bringup_cpu()

Marta Plantykow (1):
ice: avoid bpf_prog refcount underflow

Martyn Welch (1):
net: usb: Correct PHY handling of smsc95xx

Mathias Nyman (2):
usb: hub: Fix usb enumeration issue due to address0 race
usb: hub: Fix locking issues with address0_mutex

Maurizio Lombardi (1):
nvmet: use IOCB_NOWAIT only if the filesystem supports it

Mauro Carvalho Chehab (1):
docs: accounting: update delay-accounting.rst reference

Michael Kelley (1):
firmware: smccc: Fix check for ARCH_SOC_ID not implemented

Michael Straube (1):
staging: r8188eu: use GFP_ATOMIC under spinlock

Mike Christie (1):
scsi: core: sysfs: Fix setting device state to SDEV_RUNNING

Miklos Szeredi (1):
fuse: release pipe buf after last use

Minas Harutyunyan (1):
usb: dwc2: gadget: Fix ISOC flow for elapsed frames

Ming Lei (2):
blk-mq: cancel blk-mq dispatch work in both blk_cleanup_queue and disk_release()
block: avoid to quiesce queue in elevator_init_mq

Mingjie Zhang (1):
USB: serial: option: add Fibocom FM101-GL variants

Mohammed Gamal (1):
drm/hyperv: Fix device removal on Gen1 VMs

Namjae Jeon (3):
ksmbd: downgrade addition info error msg to debug in smb2_get_info_sec()
ksmbd: contain default data stream even if xattr is empty
ksmbd: fix memleak in get_file_stream_info()

Nathan Chancellor (1):
usb: dwc2: hcd_queue: Fix use of floating point literal

Nicholas Kazlauskas (2):
drm/amd/display: Fix DPIA outbox timeout after GPU reset drm/amd/display: Set plane update flags for all planes in reset

Nicholas Piggin (1):
KVM: PPC: Book3S HV: Prevent POWER7/8 TLB flush flushing SLB

Nikolay Aleksandrov (3):
net: nexthop: fix null pointer dereference when IPv6 is not enabled
net: ipv6: add fib6_nh_release_dsts stub
net: nexthop: release IPv6 per-cpu dsts when replacing a nexthop group

Nitesh B Venkatesh (1):
iavf: Prevent changing static ITR values if adaptive moderation is on

Noralf Trønnes (1):
staging/fbtft: Fix backlight

Olivier Moysan (1):
ASoC: stm32: i2s: fix 32 bits channel length without mclk

Ondrej Jirman (1):
usb: typec: fusb302: Fix masking of comparator and bc_lvl interrupts

Pali Rohár (3):
PCI: aardvark: Implement re-issuing config requests on CRS response
PCI: aardvark: Simplify initialization of rootcap on virtual bridge
PCI: aardvark: Fix link training

Paolo Abeni (1):
mptcp: use delegate action to schedule 3rd ack retrans

Pavel Begunkov (3):
io_uring: correct link-list traversal locking
io_uring: fail cancellation for EXITING tasks
io_uring: fix link traversal locking

Peng Fan (1):
firmware: arm_scmi: pm: Propagate return value to caller

Philip Yang (1):
drm/amdgpu: IH process reset count when restart

Pierre-Louis Bossart (1):
ALSA: intel-dsp-config: add quirk for JSL devices based on ES8336 codec

Pingfan Liu (1):

      arm64: mm: Fix VM_BUG_ON(mm != &init_mm) for trans_pgd

Rafael J. Wysocki (2):
ACPI: CPPC: Add NULL pointer check to cppc_get_perf()
cpufreq: intel_pstate: Fix active mode offline/online EPP handling

Roman Li (1):
drm/amd/display: Fix OLED brightness control on eDP

Russell King (Oracle) (2):
net: phylink: Force link down and retrigger resolve on interface change
net: phylink: Force retrigger in case of latched link-fail indicator

Sakari Ailus (1):
ACPI: Get acpi_device's parent from the parent field

Shin'ichiro Kawasaki (1):
scsi: scsi_debug: Zero clear zones at reset write pointer

Shyam Prasad N (2):
cifs: nosharesock should not share socket with future sessions
cifs: nosharesock should be set on new server

Sreekanth Reddy (3):
scsi: mpt3sas: Fix kernel panic during drive powercycle test
scsi: mpt3sas: Fix system going into read-only mode
scsi: mpt3sas: Fix incorrect system timestamp

Srinivas Kandagatla (5):
ASoC: qdsp6: q6routing: Conditionally reset FrontEnd Mixer
ASoC: qdsp6: q6asm: fix q6asm_dai_prepare error handling
ASoC: codecs: wcd938x: fix volatile register range
ASoC: codecs: wcd934x: return error code correctly from hw_params
ASoC: codecs: lpass-rx-macro: fix HPHR setting CLSH mask

Stefano Garzarella (1):
vhost/vsock: fix incorrect used length reported to the guest

Stefano Stabellini (2):
xen: don't continue xenstore initialization in case of errors
xen: detect uninitialized xenbus in xenbus_init

Steven Rostedt (VMware) (2):
tracing: Fix pid filtering when triggers are attached
tracing: Check pid filtering when creating events

Takashi Iwai (5):
ALSA: ctxfi: Fix out-of-range access
ALSA: hda/realtek: Fix LED on HP ProBook 435 G7
staging: greybus: Add missing rwsem around snd_ctl_remove() calls
ASoC: topology: Add missing rwsem around snd_ctl_remove() calls
ARM: socfpga: Fix crash with CONFIG_FORTIRY_SOURCE

Thinh Nguyen (3):
usb: dwc3: core: Revise GHWPARAMS9 offset
usb: dwc3: gadget: Ignore NoStream after End Transfer
usb: dwc3: gadget: Check for L1/L2/U3 for Start Transfer

Thomas Weißschuh (1):
HID: input: set usage type to key on keycode remap

Thomas Zeitlhofer (1):
PM: hibernate: use correct mode for swsusp_close()

Tim Harvey (1):
mmc: sdhci-esdhc-imx: disable CMDQ support

Todd Kjos (1):
binder: fix test regression due to sender_euid change

Tony Lu (2):
net/smc: Ensure the active closing peer first closes clcsock net/smc: Don't call clcsock shutdown twice when smc shutdown

Trond Myklebust (1):
NFSv42: Don't fail clone() unless the OP_CLONE operation failed

Varun Prakash (1):
nvmet-tcp: fix incomplete data digest send

Vincent Guittot (1):
firmware: arm_scmi: Fix base agent discover response

Vincent Whitchurch (2):
af_unix: fix regression in read after shutdown
i2c: virtio: disable timeout handling

Vladimir Oltean (2):
net: mscc: ocelot: don't downgrade timestamping RX filters in SIOCSHWTSTAMP
net: mscc: ocelot: correctly report the timestamping RX filters in ethtool

Volodymyr Mytnyk (2):
net: marvell: prestera: fix brige port operation
net: marvell: prestera: fix double free issue on err path

Waiman Long (1):
locking/rwsem: Make handoff bit handling more consistent

Weichao Guo (1):
f2fs: set SBI_NEED_FSCK flag when inconsistent node block found

Werner Sembach (1):
ALSA: hda/realtek: Add quirk for ASRock NUC Box 1100

Will Mortensen (1):
netfilter: flowtable: fix IPv6 tunnel addr match

Yannick Vignon (1):
net: stmmac: Disable Tx queues when reconfiguring the interface

Ye Bin (1):
io_uring: fix soft lockup when call __io_remove_buffers

Ziyang Xuan (1):
net: vlan: fix underflow for the real_dev refcnt

yangxingwu (1):
netfilter: ipvs: Fix reuse connection if RS weight is 0

author maintainer
#1 lore raw
Documentation/admin-guide/sysctl/kernel.rst +1 -1
index 426162009ce9..0e486f41185e 100644
@@ -1099,7 +1099,7 @@ task_delayacct
 ===============
 
 Enables/disables task delay accounting (see
-:doc:`accounting/delay-accounting.rst`). Enabling this feature incurs
+Documentation/accounting/delay-accounting.rst. Enabling this feature incurs
 a small amount of overhead in the scheduler but is useful for debugging
 and performance tuning. It is required by some tools such as iotop.
 
Documentation/networking/ipvs-sysctl.rst +1 -2
index 2afccc63856e..1cfbf1add2fc 100644
@@ -37,8 +37,7 @@ conn_reuse_mode - INTEGER
 
 	0: disable any special handling on port reuse. The new
 	connection will be delivered to the same real server that was
-	servicing the previous connection. This will effectively
-	disable expire_nodest_conn.
+	servicing the previous connection.
 
 	bit 1: enable rescheduling of new connections when it is safe.
 	That is, whenever expire_nodest_conn and for TCP sockets, when
Makefile +1 -1
index 820ccbe7586f..0faa64733281 100644
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
 PATCHLEVEL = 15
-SUBLEVEL = 5
+SUBLEVEL = 6
 EXTRAVERSION =
 NAME = Trick or Treat
 
arch/arm/boot/dts/bcm2711.dtsi +7 -1
index 3b60297af7f6..9e01dbca4a01 100644
@@ -506,11 +506,17 @@ pcie0: pcie@7d500000 {
 			#address-cells = <3>;
 			#interrupt-cells = <1>;
 			#size-cells = <2>;
-			interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>,
+			interrupts = <GIC_SPI 147 IRQ_TYPE_LEVEL_HIGH>,
 				     <GIC_SPI 148 IRQ_TYPE_LEVEL_HIGH>;
 			interrupt-names = "pcie", "msi";
 			interrupt-map-mask = <0x0 0x0 0x0 0x7>;
 			interrupt-map = <0 0 0 1 &gicv2 GIC_SPI 143
+							IRQ_TYPE_LEVEL_HIGH>,
+					<0 0 0 2 &gicv2 GIC_SPI 144
+							IRQ_TYPE_LEVEL_HIGH>,
+					<0 0 0 3 &gicv2 GIC_SPI 145
+							IRQ_TYPE_LEVEL_HIGH>,
+					<0 0 0 4 &gicv2 GIC_SPI 146
 							IRQ_TYPE_LEVEL_HIGH>;
 			msi-controller;
 			msi-parent = <&pcie0>;
arch/arm/boot/dts/bcm5301x.dtsi +3 -1
index d4f355015e3c..f69d2af3c1fa 100644
@@ -242,6 +242,8 @@ chipcommon: chipcommon@0 {
 
 			gpio-controller;
 			#gpio-cells = <2>;
+			interrupt-controller;
+			#interrupt-cells = <2>;
 		};
 
 		pcie0: pcie@12000 {
@@ -408,7 +410,7 @@ uart2: serial@18008000 {
 	i2c0: i2c@18009000 {
 		compatible = "brcm,iproc-i2c";
 		reg = <0x18009000 0x50>;
-		interrupts = <GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>;
+		interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
 		#address-cells = <1>;
 		#size-cells = <0>;
 		clock-frequency = <100000>;
arch/arm/mach-socfpga/core.h +1 -1
index fc2608b18a0d..18f01190dcfd 100644
@@ -33,7 +33,7 @@ extern void __iomem *sdr_ctl_base_addr;
 u32 socfpga_sdram_self_refresh(u32 sdr_base);
 extern unsigned int socfpga_sdram_self_refresh_sz;
 
-extern char secondary_trampoline, secondary_trampoline_end;
+extern char secondary_trampoline[], secondary_trampoline_end[];
 
 extern unsigned long socfpga_cpu1start_addr;
 
arch/arm/mach-socfpga/platsmp.c +4 -4
index fbb80b883e5d..201191cf68f3 100644
@@ -20,14 +20,14 @@
 
 static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-	int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
+	int trampoline_size = secondary_trampoline_end - secondary_trampoline;
 
 	if (socfpga_cpu1start_addr) {
 		/* This will put CPU #1 into reset. */
 		writel(RSTMGR_MPUMODRST_CPU1,
 		       rst_manager_base_addr + SOCFPGA_RSTMGR_MODMPURST);
 
-		memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
+		memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);
 
 		writel(__pa_symbol(secondary_startup),
 		       sys_manager_base_addr + (socfpga_cpu1start_addr & 0x000000ff));
@@ -45,12 +45,12 @@ static int socfpga_boot_secondary(unsigned int cpu, struct task_struct *idle)
 
 static int socfpga_a10_boot_secondary(unsigned int cpu, struct task_struct *idle)
 {
-	int trampoline_size = &secondary_trampoline_end - &secondary_trampoline;
+	int trampoline_size = secondary_trampoline_end - secondary_trampoline;
 
 	if (socfpga_cpu1start_addr) {
 		writel(RSTMGR_MPUMODRST_CPU1, rst_manager_base_addr +
 		       SOCFPGA_A10_RSTMGR_MODMPURST);
-		memcpy(phys_to_virt(0), &secondary_trampoline, trampoline_size);
+		memcpy(phys_to_virt(0), secondary_trampoline, trampoline_size);
 
 		writel(__pa_symbol(secondary_startup),
 		       sys_manager_base_addr + (socfpga_cpu1start_addr & 0x00000fff));
arch/arm64/include/asm/pgalloc.h +1 -1
index 8433a2058eb1..237224484d0f 100644
@@ -76,7 +76,7 @@ static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t ptep,
 static inline void
 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
 {
-	VM_BUG_ON(mm != &init_mm);
+	VM_BUG_ON(mm && mm != &init_mm);
 	__pmd_populate(pmdp, __pa(ptep), PMD_TYPE_TABLE | PMD_TABLE_UXN);
 }
 
arch/arm64/include/asm/uaccess.h +41 -7

92 lines not on this page · raw message

arch/mips/Kconfig +1 -1
index a917d408d27d..23654ccdbfb1 100644
@@ -3189,7 +3189,7 @@ config STACKTRACE_SUPPORT
 config PGTABLE_LEVELS
 	int
 	default 4 if PAGE_SIZE_4KB && MIPS_VA_BITS_48
-	default 3 if 64BIT && !PAGE_SIZE_64KB
+	default 3 if 64BIT && (!PAGE_SIZE_64KB || MIPS_VA_BITS_48)
 	default 2
 
 config MIPS_AUTO_PFN_OFFSET
arch/mips/kernel/cpu-probe.c +2 -2
index 630fcb4cb30e..7c861e6a8952 100644
@@ -1734,8 +1734,6 @@ static inline void decode_cpucfg(struct cpuinfo_mips *c)
 
 static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
 {
-	decode_configs(c);
-
 	/* All Loongson processors covered here define ExcCode 16 as GSExc. */
 	c->options |= MIPS_CPU_GSEXCEX;
 
@@ -1796,6 +1794,8 @@ static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu)
 		panic("Unknown Loongson Processor ID!");
 		break;
 	}
+
+	decode_configs(c);
 }
 #else
 static inline void cpu_probe_loongson(struct cpuinfo_mips *c, unsigned int cpu) { }
arch/parisc/kernel/vmlinux.lds.S +1 -2
index 3d208afd15bc..2769eb991f58 100644
@@ -57,8 +57,6 @@ SECTIONS
 {
 	. = KERNEL_BINARY_TEXT_START;
 
-	_stext = .;	/* start of kernel text, includes init code & data */
-
 	__init_begin = .;
 	HEAD_TEXT_SECTION
 	MLONGCALL_DISCARD(INIT_TEXT_SECTION(8))
@@ -82,6 +80,7 @@ SECTIONS
 	/* freed after init ends here */
 
 	_text = .;		/* Text and read-only data */
+	_stext = .;
 	MLONGCALL_KEEP(INIT_TEXT_SECTION(8))
 	.text ALIGN(PAGE_SIZE) : {
 		TEXT_TEXT
arch/powerpc/kernel/head_32.h +3 -3
index 6b1ec9e3541b..349c4a820231 100644
@@ -202,11 +202,11 @@ _ASM_NOKPROBE_SYMBOL(\name\()_virt)
 	mfspr	r1, SPRN_SPRG_THREAD
 	lwz	r1, TASK_CPU - THREAD(r1)
 	slwi	r1, r1, 3
-	addis	r1, r1, emergency_ctx@ha
+	addis	r1, r1, emergency_ctx-PAGE_OFFSET@ha
 #else
-	lis	r1, emergency_ctx@ha
+	lis	r1, emergency_ctx-PAGE_OFFSET@ha
 #endif
-	lwz	r1, emergency_ctx@l(r1)
+	lwz	r1, emergency_ctx-PAGE_OFFSET@l(r1)
 	addi	r1, r1, THREAD_SIZE - INT_FRAME_SIZE
 	EXCEPTION_PROLOG_2 0 vmap_stack_overflow
 	prepare_transfer_to_handler
arch/powerpc/kvm/book3s_hv_builtin.c +4 -1
index fcf4760a3a0e..70b7a8f97153 100644
@@ -695,6 +695,7 @@ static void flush_guest_tlb(struct kvm *kvm)
 				       "r" (0) : "memory");
 		}
 		asm volatile("ptesync": : :"memory");
+		// POWER9 congruence-class TLBIEL leaves ERAT. Flush it now.
 		asm volatile(PPC_RADIX_INVALIDATE_ERAT_GUEST : : :"memory");
 	} else {
 		for (set = 0; set < kvm->arch.tlb_sets; ++set) {
@@ -705,7 +706,9 @@ static void flush_guest_tlb(struct kvm *kvm)
 			rb += PPC_BIT(51);	/* increment set number */
 		}
 		asm volatile("ptesync": : :"memory");
-		asm volatile(PPC_ISA_3_0_INVALIDATE_ERAT : : :"memory");
+		// POWER9 congruence-class TLBIEL leaves ERAT. Flush it now.
+		if (cpu_has_feature(CPU_FTR_ARCH_300))
+			asm volatile(PPC_ISA_3_0_INVALIDATE_ERAT : : :"memory");
 	}
 }
 
arch/riscv/boot/dts/microchip/microchip-mpfs-icicle-kit.dts +11 -2
index b254c60589a1..cce5eca31f25 100644
@@ -12,7 +12,7 @@ / {
 	#address-cells = <2>;
 	#size-cells = <2>;
 	model = "Microchip PolarFire-SoC Icicle Kit";
-	compatible = "microchip,mpfs-icicle-kit";
+	compatible = "microchip,mpfs-icicle-kit", "microchip,mpfs";
 
 	aliases {
 		ethernet0 = &emac1;
@@ -56,8 +56,17 @@ &serial3 {
 	status = "okay";
 };
 
-&sdcard {
+&mmc {
 	status = "okay";
+
+	bus-width = <4>;
+	disable-wp;
+	cap-sd-highspeed;
+	card-detect-delay = <200>;
+	sd-uhs-sdr12;
+	sd-uhs-sdr25;
+	sd-uhs-sdr50;
+	sd-uhs-sdr104;
 };
 
 &emac0 {
arch/riscv/boot/dts/microchip/microchip-mpfs.dtsi +4 -29
index 9d2fbbc1f777..b12fd594e717 100644
@@ -6,8 +6,8 @@
 / {
 	#address-cells = <2>;
 	#size-cells = <2>;
-	model = "Microchip MPFS Icicle Kit";
-	compatible = "microchip,mpfs-icicle-kit";
+	model = "Microchip PolarFire SoC";
+	compatible = "microchip,mpfs";
 
 	chosen {
 	};
@@ -262,39 +262,14 @@ serial3: serial@20104000 {
 			status = "disabled";
 		};
 
-		emmc: mmc@20008000 {
+		/* Common node entry for emmc/sd */
+		mmc: mmc@20008000 {
 			compatible = "cdns,sd4hc";
 			reg = <0x0 0x20008000 0x0 0x1000>;
 			interrupt-parent = <&plic>;
 			interrupts = <88 89>;
 			pinctrl-names = "default";
 			clocks = <&clkcfg 6>;
-			bus-width = <4>;
-			cap-mmc-highspeed;
-			mmc-ddr-3_3v;
-			max-frequency = <200000000>;
-			non-removable;
-			no-sd;
-			no-sdio;
-			voltage-ranges = <3300 3300>;
-			status = "disabled";
-		};
-
-		sdcard: sdhc@20008000 {
-			compatible = "cdns,sd4hc";
-			reg = <0x0 0x20008000 0x0 0x1000>;
-			interrupt-parent = <&plic>;
-			interrupts = <88>;
-			pinctrl-names = "default";
-			clocks = <&clkcfg 6>;
-			bus-width = <4>;
-			disable-wp;
-			cap-sd-highspeed;
-			card-detect-delay = <200>;
-			sd-uhs-sdr12;
-			sd-uhs-sdr25;
-			sd-uhs-sdr50;
-			sd-uhs-sdr104;
 			max-frequency = <200000000>;
 			status = "disabled";
 		};
arch/x86/include/asm/xen/hypervisor.h +5 -0
index ff4b52e37e60..5adab895127e 100644
@@ -62,4 +62,9 @@ void xen_arch_register_cpu(int num);
 void xen_arch_unregister_cpu(int num);
 #endif
 
+#ifdef CONFIG_PVH
+void __init xen_pvh_init(struct boot_params *boot_params);
+void __init mem_map_via_hcall(struct boot_params *boot_params_p);
+#endif
+
 #endif /* _ASM_X86_XEN_HYPERVISOR_H */
block/blk-core.c +3 -1
index 12aa8c1da600..c2d912d0c976 100644
@@ -389,8 +389,10 @@ void blk_cleanup_queue(struct request_queue *q)
 	blk_queue_flag_set(QUEUE_FLAG_DEAD, q);
 
 	blk_sync_queue(q);
-	if (queue_is_mq(q))
+	if (queue_is_mq(q)) {
+		blk_mq_cancel_work_sync(q);
 		blk_mq_exit_queue(q);
+	}
 
 	/*
 	 * In theory, request pool of sched_tags belongs to request queue.
block/blk-mq.c +13 -0
index c8a9d10f7c18..82de39926a9f 100644
@@ -4018,6 +4018,19 @@ unsigned int blk_mq_rq_cpu(struct request *rq)
 }
 EXPORT_SYMBOL(blk_mq_rq_cpu);
 
+void blk_mq_cancel_work_sync(struct request_queue *q)
+{
+	if (queue_is_mq(q)) {
+		struct blk_mq_hw_ctx *hctx;
+		int i;
+
+		cancel_delayed_work_sync(&q->requeue_work);
+
+		queue_for_each_hw_ctx(q, hctx, i)
+			cancel_delayed_work_sync(&hctx->run_work);
+	}
+}
+
 static int __init blk_mq_init(void)
 {
 	int i;
block/blk-mq.h +2 -0
index d08779f77a26..7cdca23b6263 100644
@@ -129,6 +129,8 @@ extern int blk_mq_sysfs_register(struct request_queue *q);
 extern void blk_mq_sysfs_unregister(struct request_queue *q);
 extern void blk_mq_hctx_kobj_init(struct blk_mq_hw_ctx *hctx);
 
+void blk_mq_cancel_work_sync(struct request_queue *q);
+
 void blk_mq_release(struct request_queue *q);
 
 static inline struct blk_mq_ctx *__blk_mq_get_ctx(struct request_queue *q,
block/blk-sysfs.c +0 -10
index 614d9d47de36..4737ec024ee9 100644
@@ -805,16 +805,6 @@ static void blk_release_queue(struct kobject *kobj)
 
 	blk_free_queue_stats(q->stats);
 
-	if (queue_is_mq(q)) {
-		struct blk_mq_hw_ctx *hctx;
-		int i;
-
-		cancel_delayed_work_sync(&q->requeue_work);
-
-		queue_for_each_hw_ctx(q, hctx, i)
-			cancel_delayed_work_sync(&hctx->run_work);
-	}
-
 	blk_exit_queue(q);
 
 	blk_queue_free_zone_bitmaps(q);
block/elevator.c +8 -2
index ff45d8388f48..cd02ae332c4e 100644
@@ -694,12 +694,18 @@ void elevator_init_mq(struct request_queue *q)
 	if (!e)
 		return;
 
+	/*
+	 * We are called before adding disk, when there isn't any FS I/O,
+	 * so freezing queue plus canceling dispatch work is enough to
+	 * drain any dispatch activities originated from passthrough
+	 * requests, then no need to quiesce queue which may add long boot
+	 * latency, especially when lots of disks are involved.
+	 */
 	blk_mq_freeze_queue(q);
-	blk_mq_quiesce_queue(q);
+	blk_mq_cancel_work_sync(q);
 
 	err = blk_mq_init_sched(q, e);
 
-	blk_mq_unquiesce_queue(q);
 	blk_mq_unfreeze_queue(q);
 
 	if (err) {
block/genhd.c +2 -0
index 6accd0b185e9..f091a60dcf1e 100644
@@ -1086,6 +1086,8 @@ static void disk_release(struct device *dev)
 	might_sleep();
 	WARN_ON_ONCE(disk_live(disk));
 
+	blk_mq_cancel_work_sync(disk->queue);
+
 	disk_release_events(disk);
 	kfree(disk->random);
 	xa_destroy(&disk->part_tbl);
drivers/acpi/cppc_acpi.c +8 -1
index bd482108310c..3fbb17ecce2d 100644
@@ -1011,7 +1011,14 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
 static int cppc_get_perf(int cpunum, enum cppc_regs reg_idx, u64 *perf)
 {
 	struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
-	struct cpc_register_resource *reg = &cpc_desc->cpc_regs[reg_idx];
+	struct cpc_register_resource *reg;
+
+	if (!cpc_desc) {
+		pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
+		return -ENODEV;
+	}
+
+	reg = &cpc_desc->cpc_regs[reg_idx];
 
 	if (CPC_IN_PCC(reg)) {
 		int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpunum);
drivers/acpi/property.c +3 -8
index e312ebaed8db..781e312f4534 100644
@@ -1090,15 +1090,10 @@ struct fwnode_handle *acpi_node_get_parent(const struct fwnode_handle *fwnode)
 		/* All data nodes have parent pointer so just return that */
 		return to_acpi_data_node(fwnode)->parent;
 	} else if (is_acpi_device_node(fwnode)) {
-		acpi_handle handle, parent_handle;
+		struct device *dev = to_acpi_device_node(fwnode)->dev.parent;
 
-		handle = to_acpi_device_node(fwnode)->handle;
-		if (ACPI_SUCCESS(acpi_get_parent(handle, &parent_handle))) {
-			struct acpi_device *adev;
-
-			if (!acpi_bus_get_device(parent_handle, &adev))
-				return acpi_fwnode_handle(adev);
-		}
+		if (dev)
+			return acpi_fwnode_handle(to_acpi_device(dev));
 	}
 
 	return NULL;
drivers/android/binder.c +1 -1
index 49fb74196d02..cffbe57a8e08 100644
@@ -2710,7 +2710,7 @@ static void binder_transaction(struct binder_proc *proc,
 		t->from = thread;
 	else
 		t->from = NULL;
-	t->sender_euid = proc->cred->euid;
+	t->sender_euid = task_euid(proc->tsk);
 	t->to_proc = target_proc;
 	t->to_thread = target_thread;
 	t->code = tr->code;
drivers/cpufreq/intel_pstate.c +7 -0
index dafa631582ba..e15c3bc17a55 100644
@@ -999,6 +999,12 @@ static void intel_pstate_hwp_offline(struct cpudata *cpu)
 		 */
 		value &= ~GENMASK_ULL(31, 24);
 		value |= HWP_ENERGY_PERF_PREFERENCE(cpu->epp_cached);
+		/*
+		 * However, make sure that EPP will be set to "performance" when
+		 * the CPU is brought back online again and the "performance"
+		 * scaling algorithm is still in effect.
+		 */
+		cpu->epp_policy = CPUFREQ_POLICY_UNKNOWN;
 	}
 
 	/*
@@ -2249,6 +2255,7 @@ static const struct x86_cpu_id intel_pstate_cpu_oob_ids[] __initconst = {
 	X86_MATCH(BROADWELL_D,		core_funcs),
 	X86_MATCH(BROADWELL_X,		core_funcs),
 	X86_MATCH(SKYLAKE_X,		core_funcs),
+	X86_MATCH(ICELAKE_X,		core_funcs),
 	{}
 };
 
drivers/firmware/arm_scmi/base.c +12 -3
index de416f9e7921..f5219334fd3a 100644
@@ -34,6 +34,12 @@ struct scmi_msg_resp_base_attributes {
 	__le16 reserved;
 };
 
+struct scmi_msg_resp_base_discover_agent {
+	__le32 agent_id;
+	u8 name[SCMI_MAX_STR_SIZE];
+};
+
+
 struct scmi_msg_base_error_notify {
 	__le32 event_control;
 #define BASE_TP_NOTIFY_ALL	BIT(0)
@@ -225,18 +231,21 @@ static int scmi_base_discover_agent_get(const struct scmi_protocol_handle *ph,
 					int id, char *name)
 {
 	int ret;
+	struct scmi_msg_resp_base_discover_agent *agent_info;
 	struct scmi_xfer *t;
 
 	ret = ph->xops->xfer_get_init(ph, BASE_DISCOVER_AGENT,
-				      sizeof(__le32), SCMI_MAX_STR_SIZE, &t);
+				      sizeof(__le32), sizeof(*agent_info), &t);
 	if (ret)
 		return ret;
 
 	put_unaligned_le32(id, t->tx.buf);
 
 	ret = ph->xops->do_xfer(ph, t);
-	if (!ret)
-		strlcpy(name, t->rx.buf, SCMI_MAX_STR_SIZE);
+	if (!ret) {
+		agent_info = t->rx.buf;
+		strlcpy(name, agent_info->name, SCMI_MAX_STR_SIZE);
+	}
 
 	ph->xops->xfer_put(ph, t);
 
drivers/firmware/arm_scmi/scmi_pm_domain.c +1 -3
index 4371fdcd5a73..581d34c95769 100644
@@ -138,9 +138,7 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev)
 	scmi_pd_data->domains = domains;
 	scmi_pd_data->num_domains = num_domains;
 
-	of_genpd_add_provider_onecell(np, scmi_pd_data);
-
-	return 0;
+	return of_genpd_add_provider_onecell(np, scmi_pd_data);
 }
 
 static const struct scmi_device_id scmi_id_table[] = {
drivers/firmware/arm_scmi/sensors.c +1 -1
index 308471586381..cdbb287bd8bc 100644
@@ -637,7 +637,7 @@ static int scmi_sensor_config_get(const struct scmi_protocol_handle *ph,
 	if (ret)
 		return ret;
 
-	put_unaligned_le32(cpu_to_le32(sensor_id), t->tx.buf);
+	put_unaligned_le32(sensor_id, t->tx.buf);
 	ret = ph->xops->do_xfer(ph, t);
 	if (!ret) {
 		struct sensors_info *si = ph->get_priv(ph);
drivers/firmware/arm_scmi/virtio.c +5 -5
index 11e8efb71375..87039c5c03fd 100644
@@ -82,7 +82,8 @@ static bool scmi_vio_have_vq_rx(struct virtio_device *vdev)
 }
 
 static int scmi_vio_feed_vq_rx(struct scmi_vio_channel *vioch,
-			       struct scmi_vio_msg *msg)
+			       struct scmi_vio_msg *msg,
+			       struct device *dev)
 {
 	struct scatterlist sg_in;
 	int rc;
@@ -94,8 +95,7 @@ static int scmi_vio_feed_vq_rx(struct scmi_vio_channel *vioch,
 
 	rc = virtqueue_add_inbuf(vioch->vqueue, &sg_in, 1, msg, GFP_ATOMIC);
 	if (rc)
-		dev_err_once(vioch->cinfo->dev,
-			     "failed to add to virtqueue (%d)\n", rc);
+		dev_err_once(dev, "failed to add to virtqueue (%d)\n", rc);
 	else
 		virtqueue_kick(vioch->vqueue);
 
@@ -108,7 +108,7 @@ static void scmi_finalize_message(struct scmi_vio_channel *vioch,
 				  struct scmi_vio_msg *msg)
 {
 	if (vioch->is_rx) {
-		scmi_vio_feed_vq_rx(vioch, msg);
+		scmi_vio_feed_vq_rx(vioch, msg, vioch->cinfo->dev);
 	} else {
 		/* Here IRQs are assumed to be already disabled by the caller */
 		spin_lock(&vioch->lock);
@@ -269,7 +269,7 @@ static int virtio_chan_setup(struct scmi_chan_info *cinfo, struct device *dev,
 			list_add_tail(&msg->list, &vioch->free_list);
 			spin_unlock_irqrestore(&vioch->lock, flags);
 		} else {
-			scmi_vio_feed_vq_rx(vioch, msg);
+			scmi_vio_feed_vq_rx(vioch, msg, cinfo->dev);
 		}
 	}
 
drivers/firmware/arm_scmi/voltage.c +1 -1
index a5048956a0be..ac08e819088b 100644
@@ -156,7 +156,7 @@ static int scmi_voltage_descriptors_get(const struct scmi_protocol_handle *ph,
 			int cnt;
 
 			cmd->domain_id = cpu_to_le32(v->id);
-			cmd->level_index = desc_index;
+			cmd->level_index = cpu_to_le32(desc_index);
 			ret = ph->xops->do_xfer(ph, tl);
 			if (ret)
 				break;
drivers/firmware/smccc/soc_id.c +1 -1
index 581aa5e9b077..dd7c3d5e8b0b 100644
@@ -50,7 +50,7 @@ static int __init smccc_soc_init(void)
 	arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID,
 			     ARM_SMCCC_ARCH_SOC_ID, &res);
 
-	if (res.a0 == SMCCC_RET_NOT_SUPPORTED) {
+	if ((int)res.a0 == SMCCC_RET_NOT_SUPPORTED) {
 		pr_info("ARCH_SOC_ID not implemented, skipping ....\n");
 		return 0;
 	}
drivers/gpu/drm/amd/amdgpu/amdgpu_ih.c +2 -1
index f3d62e196901..0c7963dfacad 100644
@@ -223,7 +223,7 @@ int amdgpu_ih_wait_on_checkpoint_process(struct amdgpu_device *adev,
  */
 int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
 {
-	unsigned int count = AMDGPU_IH_MAX_NUM_IVS;
+	unsigned int count;
 	u32 wptr;
 
 	if (!ih->enabled || adev->shutdown)
@@ -232,6 +232,7 @@ int amdgpu_ih_process(struct amdgpu_device *adev, struct amdgpu_ih_ring *ih)
 	wptr = amdgpu_ih_get_wptr(adev, ih);
 
 restart_ih:
+	count  = AMDGPU_IH_MAX_NUM_IVS;
 	DRM_DEBUG("%s: rptr %d, wptr %d\n", __func__, ih->rptr, wptr);
 
 	/* Order reading of wptr vs. reading of IH ring data */
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +13 -2
index 16dbe593cba2..970d59a21005 100644
@@ -7729,8 +7729,19 @@ static uint64_t gfx_v10_0_get_gpu_clock_counter(struct amdgpu_device *adev)
 	switch (adev->asic_type) {
 	case CHIP_VANGOGH:
 	case CHIP_YELLOW_CARP:
-		clock = (uint64_t)RREG32_SOC15(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_Vangogh) |
-			((uint64_t)RREG32_SOC15(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_Vangogh) << 32ULL);
+		preempt_disable();
+		clock_hi = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_Vangogh);
+		clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_Vangogh);
+		hi_check = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_UPPER_Vangogh);
+		/* The SMUIO TSC clock frequency is 100MHz, which sets 32-bit carry over
+		 * roughly every 42 seconds.
+		 */
+		if (hi_check != clock_hi) {
+			clock_lo = RREG32_SOC15_NO_KIQ(SMUIO, 0, mmGOLDEN_TSC_COUNT_LOWER_Vangogh);
+			clock_hi = hi_check;
+		}
+		preempt_enable();
+		clock = clock_lo | (clock_hi << 32ULL);
 		break;
 	default:
 		preempt_disable();
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +35 -11

60 lines not on this page · raw message

drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +7 -2
index 084491afe540..dc995ce52eff 100644
@@ -2213,6 +2213,8 @@ static int dm_resume(void *handle)
 	if (amdgpu_in_reset(adev)) {
 		dc_state = dm->cached_dc_state;
 
+		amdgpu_dm_outbox_init(adev);
+
 		r = dm_dmub_hw_init(adev);
 		if (r)
 			DRM_ERROR("DMUB interface failed to initialize: status=%d\n", r);
@@ -2224,8 +2226,8 @@ static int dm_resume(void *handle)
 
 		for (i = 0; i < dc_state->stream_count; i++) {
 			dc_state->streams[i]->mode_changed = true;
-			for (j = 0; j < dc_state->stream_status->plane_count; j++) {
-				dc_state->stream_status->plane_states[j]->update_flags.raw
+			for (j = 0; j < dc_state->stream_status[i].plane_count; j++) {
+				dc_state->stream_status[i].plane_states[j]->update_flags.raw
 					= 0xffffffff;
 			}
 		}
@@ -3846,6 +3848,9 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
 		} else if (dc_link_detect(link, DETECT_REASON_BOOT)) {
 			amdgpu_dm_update_connector_after_detect(aconnector);
 			register_backlight_device(dm, link);
+
+			if (dm->num_of_edps)
+				update_connector_ext_caps(aconnector);
 			if (amdgpu_dc_feature_mask & DC_PSR_MASK)
 				amdgpu_dm_set_psr_caps(link);
 		}
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c +9 -11
index 258c573acc97..1f406f21b452 100644
@@ -1024,8 +1024,6 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
 	uint32_t min_freq, max_freq = 0;
 	uint32_t ret = 0;
 
-	phm_get_sysfs_buf(&buf, &size);
-
 	switch (type) {
 	case PP_SCLK:
 		smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetGfxclkFrequency, &now);
@@ -1038,13 +1036,13 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
 		else
 			i = 1;
 
-		size += sysfs_emit_at(buf, size, "0: %uMhz %s\n",
+		size += sprintf(buf + size, "0: %uMhz %s\n",
 					data->gfx_min_freq_limit/100,
 					i == 0 ? "*" : "");
-		size += sysfs_emit_at(buf, size, "1: %uMhz %s\n",
+		size += sprintf(buf + size, "1: %uMhz %s\n",
 					i == 1 ? now : SMU10_UMD_PSTATE_GFXCLK,
 					i == 1 ? "*" : "");
-		size += sysfs_emit_at(buf, size, "2: %uMhz %s\n",
+		size += sprintf(buf + size, "2: %uMhz %s\n",
 					data->gfx_max_freq_limit/100,
 					i == 2 ? "*" : "");
 		break;
@@ -1052,7 +1050,7 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
 		smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetFclkFrequency, &now);
 
 		for (i = 0; i < mclk_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i,
 					mclk_table->entries[i].clk / 100,
 					((mclk_table->entries[i].clk / 100)
@@ -1067,10 +1065,10 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
 			if (ret)
 				return ret;
 
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
-			size += sysfs_emit_at(buf, size, "0: %10uMhz\n",
+			size += sprintf(buf + size, "%s:\n", "OD_SCLK");
+			size += sprintf(buf + size, "0: %10uMhz\n",
 			(data->gfx_actual_soft_min_freq > 0) ? data->gfx_actual_soft_min_freq : min_freq);
-			size += sysfs_emit_at(buf, size, "1: %10uMhz\n",
+			size += sprintf(buf + size, "1: %10uMhz\n",
 			(data->gfx_actual_soft_max_freq > 0) ? data->gfx_actual_soft_max_freq : max_freq);
 		}
 		break;
@@ -1083,8 +1081,8 @@ static int smu10_print_clock_levels(struct pp_hwmgr *hwmgr,
 			if (ret)
 				return ret;
 
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
-			size += sysfs_emit_at(buf, size, "SCLK: %7uMHz %10uMHz\n",
+			size += sprintf(buf + size, "%s:\n", "OD_RANGE");
+			size += sprintf(buf + size, "SCLK: %7uMHz %10uMHz\n",
 				min_freq, max_freq);
 		}
 		break;
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +11 -13
index aceebf584225..611969bf4520 100644
@@ -4914,8 +4914,6 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
 	int size = 0;
 	uint32_t i, now, clock, pcie_speed;
 
-	phm_get_sysfs_buf(&buf, &size);
-
 	switch (type) {
 	case PP_SCLK:
 		smum_send_msg_to_smc(hwmgr, PPSMC_MSG_API_GetSclkFrequency, &clock);
@@ -4928,7 +4926,7 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
 		now = i;
 
 		for (i = 0; i < sclk_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, sclk_table->dpm_levels[i].value / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -4943,7 +4941,7 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
 		now = i;
 
 		for (i = 0; i < mclk_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, mclk_table->dpm_levels[i].value / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -4957,7 +4955,7 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
 		now = i;
 
 		for (i = 0; i < pcie_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %s %s\n", i,
+			size += sprintf(buf + size, "%d: %s %s\n", i,
 					(pcie_table->dpm_levels[i].value == 0) ? "2.5GT/s, x8" :
 					(pcie_table->dpm_levels[i].value == 1) ? "5.0GT/s, x16" :
 					(pcie_table->dpm_levels[i].value == 2) ? "8.0GT/s, x16" : "",
@@ -4965,32 +4963,32 @@ static int smu7_print_clock_levels(struct pp_hwmgr *hwmgr,
 		break;
 	case OD_SCLK:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
+			size += sprintf(buf + size, "%s:\n", "OD_SCLK");
 			for (i = 0; i < odn_sclk_table->num_of_pl; i++)
-				size += sysfs_emit_at(buf, size, "%d: %10uMHz %10umV\n",
+				size += sprintf(buf + size, "%d: %10uMHz %10umV\n",
 					i, odn_sclk_table->entries[i].clock/100,
 					odn_sclk_table->entries[i].vddc);
 		}
 		break;
 	case OD_MCLK:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_MCLK");
+			size += sprintf(buf + size, "%s:\n", "OD_MCLK");
 			for (i = 0; i < odn_mclk_table->num_of_pl; i++)
-				size += sysfs_emit_at(buf, size, "%d: %10uMHz %10umV\n",
+				size += sprintf(buf + size, "%d: %10uMHz %10umV\n",
 					i, odn_mclk_table->entries[i].clock/100,
 					odn_mclk_table->entries[i].vddc);
 		}
 		break;
 	case OD_RANGE:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
-			size += sysfs_emit_at(buf, size, "SCLK: %7uMHz %10uMHz\n",
+			size += sprintf(buf + size, "%s:\n", "OD_RANGE");
+			size += sprintf(buf + size, "SCLK: %7uMHz %10uMHz\n",
 				data->golden_dpm_table.sclk_table.dpm_levels[0].value/100,
 				hwmgr->platform_descriptor.overdriveLimit.engineClock/100);
-			size += sysfs_emit_at(buf, size, "MCLK: %7uMHz %10uMHz\n",
+			size += sprintf(buf + size, "MCLK: %7uMHz %10uMHz\n",
 				data->golden_dpm_table.mclk_table.dpm_levels[0].value/100,
 				hwmgr->platform_descriptor.overdriveLimit.memoryClock/100);
-			size += sysfs_emit_at(buf, size, "VDDC: %7umV %11umV\n",
+			size += sprintf(buf + size, "VDDC: %7umV %11umV\n",
 				data->odn_dpm_table.min_vddc,
 				data->odn_dpm_table.max_vddc);
 		}
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu8_hwmgr.c +2 -4
index 8e28a8eecefc..03bf8f069222 100644
@@ -1550,8 +1550,6 @@ static int smu8_print_clock_levels(struct pp_hwmgr *hwmgr,
 	uint32_t i, now;
 	int size = 0;
 
-	phm_get_sysfs_buf(&buf, &size);
-
 	switch (type) {
 	case PP_SCLK:
 		now = PHM_GET_FIELD(cgs_read_ind_register(hwmgr->device,
@@ -1561,7 +1559,7 @@ static int smu8_print_clock_levels(struct pp_hwmgr *hwmgr,
 				CURR_SCLK_INDEX);
 
 		for (i = 0; i < sclk_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, sclk_table->entries[i].clk / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -1573,7 +1571,7 @@ static int smu8_print_clock_levels(struct pp_hwmgr *hwmgr,
 				CURR_MCLK_INDEX);
 
 		for (i = SMU8_NUM_NBPMEMORYCLOCK; i > 0; i--)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					SMU8_NUM_NBPMEMORYCLOCK-i, data->sys_info.nbp_memory_clock[i-1] / 100,
 					(SMU8_NUM_NBPMEMORYCLOCK-i == now) ? "*" : "");
 		break;
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c +13 -15
index c981fc2882f0..e6336654c565 100644
@@ -4639,8 +4639,6 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 
 	int i, now, size = 0, count = 0;
 
-	phm_get_sysfs_buf(&buf, &size);
-
 	switch (type) {
 	case PP_SCLK:
 		if (data->registry_data.sclk_dpm_key_disabled)
@@ -4654,7 +4652,7 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 		else
 			count = sclk_table->count;
 		for (i = 0; i < count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, sclk_table->dpm_levels[i].value / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -4665,7 +4663,7 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 		smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentUclkIndex, &now);
 
 		for (i = 0; i < mclk_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, mclk_table->dpm_levels[i].value / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -4676,7 +4674,7 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 		smum_send_msg_to_smc(hwmgr, PPSMC_MSG_GetCurrentSocclkIndex, &now);
 
 		for (i = 0; i < soc_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, soc_table->dpm_levels[i].value / 100,
 					(i == now) ? "*" : "");
 		break;
@@ -4688,7 +4686,7 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 				PPSMC_MSG_GetClockFreqMHz, CLK_DCEFCLK, &now);
 
 		for (i = 0; i < dcef_table->count; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 					i, dcef_table->dpm_levels[i].value / 100,
 					(dcef_table->dpm_levels[i].value / 100 == now) ?
 					"*" : "");
@@ -4702,7 +4700,7 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 			gen_speed = pptable->PcieGenSpeed[i];
 			lane_width = pptable->PcieLaneCount[i];
 
-			size += sysfs_emit_at(buf, size, "%d: %s %s %s\n", i,
+			size += sprintf(buf + size, "%d: %s %s %s\n", i,
 					(gen_speed == 0) ? "2.5GT/s," :
 					(gen_speed == 1) ? "5.0GT/s," :
 					(gen_speed == 2) ? "8.0GT/s," :
@@ -4721,34 +4719,34 @@ static int vega10_print_clock_levels(struct pp_hwmgr *hwmgr,
 
 	case OD_SCLK:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_SCLK");
+			size += sprintf(buf + size, "%s:\n", "OD_SCLK");
 			podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_sclk;
 			for (i = 0; i < podn_vdd_dep->count; i++)
-				size += sysfs_emit_at(buf, size, "%d: %10uMhz %10umV\n",
+				size += sprintf(buf + size, "%d: %10uMhz %10umV\n",
 					i, podn_vdd_dep->entries[i].clk / 100,
 						podn_vdd_dep->entries[i].vddc);
 		}
 		break;
 	case OD_MCLK:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_MCLK");
+			size += sprintf(buf + size, "%s:\n", "OD_MCLK");
 			podn_vdd_dep = &data->odn_dpm_table.vdd_dep_on_mclk;
 			for (i = 0; i < podn_vdd_dep->count; i++)
-				size += sysfs_emit_at(buf, size, "%d: %10uMhz %10umV\n",
+				size += sprintf(buf + size, "%d: %10uMhz %10umV\n",
 					i, podn_vdd_dep->entries[i].clk/100,
 						podn_vdd_dep->entries[i].vddc);
 		}
 		break;
 	case OD_RANGE:
 		if (hwmgr->od_enabled) {
-			size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");
-			size += sysfs_emit_at(buf, size, "SCLK: %7uMHz %10uMHz\n",
+			size += sprintf(buf + size, "%s:\n", "OD_RANGE");
+			size += sprintf(buf + size, "SCLK: %7uMHz %10uMHz\n",
 				data->golden_dpm_table.gfx_table.dpm_levels[0].value/100,
 				hwmgr->platform_descriptor.overdriveLimit.engineClock/100);
-			size += sysfs_emit_at(buf, size, "MCLK: %7uMHz %10uMHz\n",
+			size += sprintf(buf + size, "MCLK: %7uMHz %10uMHz\n",
 				data->golden_dpm_table.mem_table.dpm_levels[0].value/100,
 				hwmgr->platform_descriptor.overdriveLimit.memoryClock/100);
-			size += sysfs_emit_at(buf, size, "VDDC: %7umV %11umV\n",
+			size += sprintf(buf + size, "VDDC: %7umV %11umV\n",
 				data->odn_dpm_table.min_vddc,
 				data->odn_dpm_table.max_vddc);
 		}
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c +4 -6
index f7e783e1c888..a2f4d6773d45 100644
@@ -2246,8 +2246,6 @@ static int vega12_print_clock_levels(struct pp_hwmgr *hwmgr,
 	int i, now, size = 0;
 	struct pp_clock_levels_with_latency clocks;
 
-	phm_get_sysfs_buf(&buf, &size);
-
 	switch (type) {
 	case PP_SCLK:
 		PP_ASSERT_WITH_CODE(
@@ -2260,7 +2258,7 @@ static int vega12_print_clock_levels(struct pp_hwmgr *hwmgr,
 				"Attempt to get gfx clk levels Failed!",
 				return -1);
 		for (i = 0; i < clocks.num_levels; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 				i, clocks.data[i].clocks_in_khz / 1000,
 				(clocks.data[i].clocks_in_khz / 1000 == now / 100) ? "*" : "");
 		break;
@@ -2276,7 +2274,7 @@ static int vega12_print_clock_levels(struct pp_hwmgr *hwmgr,
 				"Attempt to get memory clk levels Failed!",
 				return -1);
 		for (i = 0; i < clocks.num_levels; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 				i, clocks.data[i].clocks_in_khz / 1000,
 				(clocks.data[i].clocks_in_khz / 1000 == now / 100) ? "*" : "");
 		break;
@@ -2294,7 +2292,7 @@ static int vega12_print_clock_levels(struct pp_hwmgr *hwmgr,
 				"Attempt to get soc clk levels Failed!",
 				return -1);
 		for (i = 0; i < clocks.num_levels; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 				i, clocks.data[i].clocks_in_khz / 1000,
 				(clocks.data[i].clocks_in_khz / 1000 == now) ? "*" : "");
 		break;
@@ -2312,7 +2310,7 @@ static int vega12_print_clock_levels(struct pp_hwmgr *hwmgr,
 				"Attempt to get dcef clk levels Failed!",
 				return -1);
 		for (i = 0; i < clocks.num_levels; i++)
-			size += sysfs_emit_at(buf, size, "%d: %uMhz %s\n",
+			size += sprintf(buf + size, "%d: %uMhz %s\n",
 				i, clocks.data[i].clocks_in_khz / 1000,
 				(clocks.data[i].clocks_in_khz / 1000 == now) ? "*" : "");
 		break;
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c +28 -30

173 lines not on this page · raw message

drivers/gpu/drm/aspeed/aspeed_gfx_drv.c +1 -1
index b53fee6f1c17..65f172807a0d 100644
@@ -291,7 +291,7 @@ vga_pw_show(struct device *dev, struct device_attribute *attr, char *buf)
 	if (rc)
 		return rc;
 
-	return sprintf(buf, "%u\n", reg & 1);
+	return sprintf(buf, "%u\n", reg);
 }
 static DEVICE_ATTR_RO(vga_pw);
 
drivers/gpu/drm/hyperv/hyperv_drm_drv.c +18 -1
index cd818a629183..00e53de4812b 100644
@@ -225,12 +225,29 @@ static int hyperv_vmbus_remove(struct hv_device *hdev)
 {
 	struct drm_device *dev = hv_get_drvdata(hdev);
 	struct hyperv_drm_device *hv = to_hv(dev);
+	struct pci_dev *pdev;
 
 	drm_dev_unplug(dev);
 	drm_atomic_helper_shutdown(dev);
 	vmbus_close(hdev->channel);
 	hv_set_drvdata(hdev, NULL);
-	vmbus_free_mmio(hv->mem->start, hv->fb_size);
+
+	/*
+	 * Free allocated MMIO memory only on Gen2 VMs.
+	 * On Gen1 VMs, release the PCI device
+	 */
+	if (efi_enabled(EFI_BOOT)) {
+		vmbus_free_mmio(hv->mem->start, hv->fb_size);
+	} else {
+		pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
+				      PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
+		if (!pdev) {
+			drm_err(dev, "Unable to find PCI Hyper-V video\n");
+			return -ENODEV;
+		}
+		pci_release_region(pdev, 0);
+		pci_dev_put(pdev);
+	}
 
 	return 0;
 }
drivers/gpu/drm/nouveau/nvkm/engine/device/base.c +22 -0
index b51d690f375f..88d262ba648c 100644
@@ -2626,6 +2626,27 @@ nv174_chipset = {
 	.fifo     = { 0x00000001, ga102_fifo_new },
 };
 
+static const struct nvkm_device_chip
+nv176_chipset = {
+	.name = "GA106",
+	.bar      = { 0x00000001, tu102_bar_new },
+	.bios     = { 0x00000001, nvkm_bios_new },
+	.devinit  = { 0x00000001, ga100_devinit_new },
+	.fb       = { 0x00000001, ga102_fb_new },
+	.gpio     = { 0x00000001, ga102_gpio_new },
+	.i2c      = { 0x00000001, gm200_i2c_new },
+	.imem     = { 0x00000001, nv50_instmem_new },
+	.mc       = { 0x00000001, ga100_mc_new },
+	.mmu      = { 0x00000001, tu102_mmu_new },
+	.pci      = { 0x00000001, gp100_pci_new },
+	.privring = { 0x00000001, gm200_privring_new },
+	.timer    = { 0x00000001, gk20a_timer_new },
+	.top      = { 0x00000001, ga100_top_new },
+	.disp     = { 0x00000001, ga102_disp_new },
+	.dma      = { 0x00000001, gv100_dma_new },
+	.fifo     = { 0x00000001, ga102_fifo_new },
+};
+
 static const struct nvkm_device_chip
 nv177_chipset = {
 	.name = "GA107",
@@ -3072,6 +3093,7 @@ nvkm_device_ctor(const struct nvkm_device_func *func,
 		case 0x168: device->chip = &nv168_chipset; break;
 		case 0x172: device->chip = &nv172_chipset; break;
 		case 0x174: device->chip = &nv174_chipset; break;
+		case 0x176: device->chip = &nv176_chipset; break;
 		case 0x177: device->chip = &nv177_chipset; break;
 		default:
 			if (nvkm_boolopt(device->cfgopt, "NvEnableUnsupportedChipsets", false)) {
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gm200.c +4 -2
index cdb1ead26d84..82b4c8e1457c 100644
@@ -207,11 +207,13 @@ int
 gm200_acr_wpr_parse(struct nvkm_acr *acr)
 {
 	const struct wpr_header *hdr = (void *)acr->wpr_fw->data;
+	struct nvkm_acr_lsfw *lsfw;
 
 	while (hdr->falcon_id != WPR_HEADER_V0_FALCON_ID_INVALID) {
 		wpr_header_dump(&acr->subdev, hdr);
-		if (!nvkm_acr_lsfw_add(NULL, acr, NULL, (hdr++)->falcon_id))
-			return -ENOMEM;
+		lsfw = nvkm_acr_lsfw_add(NULL, acr, NULL, (hdr++)->falcon_id);
+		if (IS_ERR(lsfw))
+			return PTR_ERR(lsfw);
 	}
 
 	return 0;
drivers/gpu/drm/nouveau/nvkm/subdev/acr/gp102.c +4 -2
index fb9132a39bb1..fd97a935a380 100644
@@ -161,11 +161,13 @@ int
 gp102_acr_wpr_parse(struct nvkm_acr *acr)
 {
 	const struct wpr_header_v1 *hdr = (void *)acr->wpr_fw->data;
+	struct nvkm_acr_lsfw *lsfw;
 
 	while (hdr->falcon_id != WPR_HEADER_V1_FALCON_ID_INVALID) {
 		wpr_header_v1_dump(&acr->subdev, hdr);
-		if (!nvkm_acr_lsfw_add(NULL, acr, NULL, (hdr++)->falcon_id))
-			return -ENOMEM;
+		lsfw = nvkm_acr_lsfw_add(NULL, acr, NULL, (hdr++)->falcon_id);
+		if (IS_ERR(lsfw))
+			return PTR_ERR(lsfw);
 	}
 
 	return 0;
drivers/gpu/drm/vc4/vc4_bo.c +1 -1
index fddaeb0b09c1..f642bd6e71ff 100644
@@ -391,7 +391,7 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
 
 	bo = kzalloc(sizeof(*bo), GFP_KERNEL);
 	if (!bo)
-		return ERR_PTR(-ENOMEM);
+		return NULL;
 
 	bo->madv = VC4_MADV_WILLNEED;
 	refcount_set(&bo->usecnt, 0);
drivers/hid/hid-input.c +3 -3
index 4b5ebeacd283..6561770f1af5 100644
@@ -160,6 +160,7 @@ static int hidinput_setkeycode(struct input_dev *dev,
 	if (usage) {
 		*old_keycode = usage->type == EV_KEY ?
 				usage->code : KEY_RESERVED;
+		usage->type = EV_KEY;
 		usage->code = ke->keycode;
 
 		clear_bit(*old_keycode, dev->keybit);
@@ -650,10 +651,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
 						code += KEY_MACRO1;
 					else
 						code += BTN_TRIGGER_HAPPY - 0x1e;
-				} else {
-					goto ignore;
+					break;
 				}
-				break;
+				fallthrough;
 		default:
 			switch (field->physical) {
 			case HID_GD_MOUSE:
drivers/hid/hid-magicmouse.c +5 -2
index 686788ebf3e1..d7687ce70614 100644
@@ -256,8 +256,11 @@ static void magicmouse_emit_touch(struct magicmouse_sc *msc, int raw_id, u8 *tda
 		unsigned long now = jiffies;
 		int step_x = msc->touches[id].scroll_x - x;
 		int step_y = msc->touches[id].scroll_y - y;
-		int step_hr = ((64 - (int)scroll_speed) * msc->scroll_accel) /
-			      SCROLL_HR_STEPS;
+		int step_hr =
+			max_t(int,
+			      ((64 - (int)scroll_speed) * msc->scroll_accel) /
+					SCROLL_HR_STEPS,
+			      1);
 		int step_x_hr = msc->touches[id].scroll_x_hr - x;
 		int step_y_hr = msc->touches[id].scroll_y_hr - y;
 
drivers/hid/wacom_wac.c +7 -1
index 33a6908995b1..2a4cc39962e7 100644
@@ -2603,6 +2603,9 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
 		return;
 
 	switch (equivalent_usage) {
+	case HID_DG_CONFIDENCE:
+		wacom_wac->hid_data.confidence = value;
+		break;
 	case HID_GD_X:
 		wacom_wac->hid_data.x = value;
 		break;
@@ -2635,7 +2638,8 @@ static void wacom_wac_finger_event(struct hid_device *hdev,
 	}
 
 	if (usage->usage_index + 1 == field->report_count) {
-		if (equivalent_usage == wacom_wac->hid_data.last_slot_field)
+		if (equivalent_usage == wacom_wac->hid_data.last_slot_field &&
+		    wacom_wac->hid_data.confidence)
 			wacom_wac_finger_slot(wacom_wac, wacom_wac->touch_input);
 	}
 }
@@ -2653,6 +2657,8 @@ static void wacom_wac_finger_pre_report(struct hid_device *hdev,
 
 	wacom_wac->is_invalid_bt_frame = false;
 
+	hid_data->confidence = true;
+
 	for (i = 0; i < report->maxfield; i++) {
 		struct hid_field *field = report->field[i];
 		int j;
drivers/hid/wacom_wac.h +1 -0
index 8b2d4e5b2303..466b62cc16dc 100644
@@ -301,6 +301,7 @@ struct hid_data {
 	bool barrelswitch;
 	bool barrelswitch2;
 	bool serialhi;
+	bool confidence;
 	int x;
 	int y;
 	int pressure;
drivers/i2c/busses/i2c-virtio.c +5 -9
index f10a603b13fb..7b2474e6876f 100644
@@ -106,11 +106,10 @@ static int virtio_i2c_prepare_reqs(struct virtqueue *vq,
 
 static int virtio_i2c_complete_reqs(struct virtqueue *vq,
 				    struct virtio_i2c_req *reqs,
-				    struct i2c_msg *msgs, int num,
-				    bool timedout)
+				    struct i2c_msg *msgs, int num)
 {
 	struct virtio_i2c_req *req;
-	bool failed = timedout;
+	bool failed = false;
 	unsigned int len;
 	int i, j = 0;
 
@@ -132,7 +131,7 @@ static int virtio_i2c_complete_reqs(struct virtqueue *vq,
 			j++;
 	}
 
-	return timedout ? -ETIMEDOUT : j;
+	return j;
 }
 
 static int virtio_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
@@ -141,7 +140,6 @@ static int virtio_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
 	struct virtio_i2c *vi = i2c_get_adapdata(adap);
 	struct virtqueue *vq = vi->vq;
 	struct virtio_i2c_req *reqs;
-	unsigned long time_left;
 	int count;
 
 	reqs = kcalloc(num, sizeof(*reqs), GFP_KERNEL);
@@ -164,11 +162,9 @@ static int virtio_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
 	reinit_completion(&vi->completion);
 	virtqueue_kick(vq);
 
-	time_left = wait_for_completion_timeout(&vi->completion, adap->timeout);
-	if (!time_left)
-		dev_err(&adap->dev, "virtio i2c backend timeout.\n");
+	wait_for_completion(&vi->completion);
 
-	count = virtio_i2c_complete_reqs(vq, reqs, msgs, count, !time_left);
+	count = virtio_i2c_complete_reqs(vq, reqs, msgs, count);
 
 err_free:
 	kfree(reqs);
drivers/iommu/amd/iommu_v2.c +3 -3
index a9e568276c99..a45c5536d250 100644
@@ -928,10 +928,8 @@ static int __init amd_iommu_v2_init(void)
 {
 	int ret;
 
-	pr_info("AMD IOMMUv2 driver by Joerg Roedel <[email protected]>\n");
-
 	if (!amd_iommu_v2_supported()) {
-		pr_info("AMD IOMMUv2 functionality not available on this system\n");
+		pr_info("AMD IOMMUv2 functionality not available on this system - This is not a bug.\n");
 		/*
 		 * Load anyway to provide the symbols to other modules
 		 * which may use AMD IOMMUv2 optionally.
@@ -946,6 +944,8 @@ static int __init amd_iommu_v2_init(void)
 
 	amd_iommu_register_ppr_notifier(&ppr_nb);
 
+	pr_info("AMD IOMMUv2 loaded and initialized\n");
+
 	return 0;
 
 out:
drivers/iommu/intel/iommu.c +2 -4
index 9a356075d345..78f8c8e6803e 100644
@@ -1226,13 +1226,11 @@ static struct page *dma_pte_clear_level(struct dmar_domain *domain, int level,
 	pte = &pte[pfn_level_offset(pfn, level)];
 
 	do {
-		unsigned long level_pfn;
+		unsigned long level_pfn = pfn & level_mask(level);
 
 		if (!dma_pte_present(pte))
 			goto next;
 
-		level_pfn = pfn & level_mask(level);
-
 		/* If range covers entire pagetable, free it */
 		if (start_pfn <= level_pfn &&
 		    last_pfn >= level_pfn + level_size(level) - 1) {
@@ -1253,7 +1251,7 @@ static struct page *dma_pte_clear_level(struct dmar_domain *domain, int level,
 						       freelist);
 		}
 next:
-		pfn += level_size(level);
+		pfn = level_pfn + level_size(level);
 	} while (!first_pte_in_page(++pte) && pfn <= last_pfn);
 
 	if (first_pte)
drivers/iommu/rockchip-iommu.c +2 -2
index 5cb260820eda..7f23ad61c094 100644
@@ -200,8 +200,8 @@ static inline phys_addr_t rk_dte_pt_address(u32 dte)
 #define DTE_HI_MASK2	GENMASK(7, 4)
 #define DTE_HI_SHIFT1	24 /* shift bit 8 to bit 32 */
 #define DTE_HI_SHIFT2	32 /* shift bit 4 to bit 36 */
-#define PAGE_DESC_HI_MASK1	GENMASK_ULL(39, 36)
-#define PAGE_DESC_HI_MASK2	GENMASK_ULL(35, 32)
+#define PAGE_DESC_HI_MASK1	GENMASK_ULL(35, 32)
+#define PAGE_DESC_HI_MASK2	GENMASK_ULL(39, 36)
 
 static inline phys_addr_t rk_dte_pt_address_v2(u32 dte)
 {
drivers/media/cec/core/cec-adap.c +1 -0
index 79fa36de8a04..cd9cb354dc2c 100644
@@ -1199,6 +1199,7 @@ void cec_received_msg_ts(struct cec_adapter *adap,
 			if (abort)
 				dst->rx_status |= CEC_RX_STATUS_FEATURE_ABORT;
 			msg->flags = dst->flags;
+			msg->sequence = dst->sequence;
 			/* Remove it from the wait_queue */
 			list_del_init(&data->list);
 
drivers/media/v4l2-core/v4l2-compat-ioctl32.c +17 -24

91 lines not on this page · raw message

drivers/mmc/host/sdhci-esdhc-imx.c +0 -2
index e658f0174242..60f19369de84 100644
@@ -300,7 +300,6 @@ static struct esdhc_soc_data usdhc_imx8qxp_data = {
 	.flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
 			| ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200
 			| ESDHC_FLAG_HS400 | ESDHC_FLAG_HS400_ES
-			| ESDHC_FLAG_CQHCI
 			| ESDHC_FLAG_STATE_LOST_IN_LPMODE
 			| ESDHC_FLAG_CLK_RATE_LOST_IN_PM_RUNTIME,
 };
@@ -309,7 +308,6 @@ static struct esdhc_soc_data usdhc_imx8mm_data = {
 	.flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING
 			| ESDHC_FLAG_HAVE_CAP1 | ESDHC_FLAG_HS200
 			| ESDHC_FLAG_HS400 | ESDHC_FLAG_HS400_ES
-			| ESDHC_FLAG_CQHCI
 			| ESDHC_FLAG_STATE_LOST_IN_LPMODE,
 };
 
drivers/mmc/host/sdhci.c +18 -3
index 2d80a04e11d8..7728f26adb19 100644
@@ -771,7 +771,19 @@ static void sdhci_adma_table_pre(struct sdhci_host *host,
 			len -= offset;
 		}
 
-		BUG_ON(len > 65536);
+		/*
+		 * The block layer forces a minimum segment size of PAGE_SIZE,
+		 * so 'len' can be too big here if PAGE_SIZE >= 64KiB. Write
+		 * multiple descriptors, noting that the ADMA table is sized
+		 * for 4KiB chunks anyway, so it will be big enough.
+		 */
+		while (len > host->max_adma) {
+			int n = 32 * 1024; /* 32KiB*/
+
+			__sdhci_adma_write_desc(host, &desc, addr, n, ADMA2_TRAN_VALID);
+			addr += n;
+			len -= n;
+		}
 
 		/* tran, valid */
 		if (len)
@@ -3952,6 +3964,7 @@ struct sdhci_host *sdhci_alloc_host(struct device *dev,
 	 * descriptor for each segment, plus 1 for a nop end descriptor.
 	 */
 	host->adma_table_cnt = SDHCI_MAX_SEGS * 2 + 1;
+	host->max_adma = 65536;
 
 	host->max_timeout_count = 0xE;
 
@@ -4617,10 +4630,12 @@ int sdhci_setup_host(struct sdhci_host *host)
 	 * be larger than 64 KiB though.
 	 */
 	if (host->flags & SDHCI_USE_ADMA) {
-		if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC)
+		if (host->quirks & SDHCI_QUIRK_BROKEN_ADMA_ZEROLEN_DESC) {
+			host->max_adma = 65532; /* 32-bit alignment */
 			mmc->max_seg_size = 65535;
-		else
+		} else {
 			mmc->max_seg_size = 65536;
+		}
 	} else {
 		mmc->max_seg_size = mmc->max_req_size;
 	}
drivers/mmc/host/sdhci.h +3 -1
index e8d04e42a5af..6c689be3e48f 100644
@@ -340,7 +340,8 @@ struct sdhci_adma2_64_desc {
 
 /*
  * Maximum segments assuming a 512KiB maximum requisition size and a minimum
- * 4KiB page size.
+ * 4KiB page size. Note this also allows enough for multiple descriptors in
+ * case of PAGE_SIZE >= 64KiB.
  */
 #define SDHCI_MAX_SEGS		128
 
@@ -543,6 +544,7 @@ struct sdhci_host {
 	unsigned int blocks;	/* remaining PIO blocks */
 
 	int sg_count;		/* Mapped sg entries */
+	int max_adma;		/* Max. length in ADMA descriptor */
 
 	void *adma_table;	/* ADMA descriptor table */
 	void *align_buffer;	/* Bounce buffer */
drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +4 -0
index 5ebd96f6833d..526fb56c84f2 100644
@@ -985,6 +985,7 @@ static int hns3_set_reset(struct net_device *netdev, u32 *flags)
 	struct hnae3_ae_dev *ae_dev = pci_get_drvdata(h->pdev);
 	const struct hnae3_ae_ops *ops = h->ae_algo->ops;
 	const struct hns3_reset_type_map *rst_type_map;
+	enum ethtool_reset_flags rst_flags;
 	u32 i, size;
 
 	if (ops->ae_dev_resetting && ops->ae_dev_resetting(h))
@@ -1004,6 +1005,7 @@ static int hns3_set_reset(struct net_device *netdev, u32 *flags)
 	for (i = 0; i < size; i++) {
 		if (rst_type_map[i].rst_flags == *flags) {
 			rst_type = rst_type_map[i].rst_type;
+			rst_flags = rst_type_map[i].rst_flags;
 			break;
 		}
 	}
@@ -1019,6 +1021,8 @@ static int hns3_set_reset(struct net_device *netdev, u32 *flags)
 
 	ops->reset_event(h->pdev, h);
 
+	*flags &= ~rst_flags;
+
 	return 0;
 }
 
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +2 -2
index 3b8bde58613a..fee7d9e79f8c 100644
@@ -703,9 +703,9 @@ static int hclgevf_set_rss_tc_mode(struct hclgevf_dev *hdev,  u16 rss_size)
 	roundup_size = ilog2(roundup_size);
 
 	for (i = 0; i < HCLGEVF_MAX_TC_NUM; i++) {
-		tc_valid[i] = !!(hdev->hw_tc_map & BIT(i));
+		tc_valid[i] = 1;
 		tc_size[i] = roundup_size;
-		tc_offset[i] = rss_size * i;
+		tc_offset[i] = (hdev->hw_tc_map & BIT(i)) ? rss_size * i : 0;
 	}
 
 	hclgevf_cmd_setup_basic_desc(&desc, HCLGEVF_OPC_RSS_TC_MODE, false);
drivers/net/ethernet/intel/iavf/iavf.h +3 -0
index 46312a4415ba..0ae6da2992d0 100644
@@ -305,6 +305,7 @@ struct iavf_adapter {
 #define IAVF_FLAG_AQ_DEL_FDIR_FILTER		BIT(26)
 #define IAVF_FLAG_AQ_ADD_ADV_RSS_CFG		BIT(27)
 #define IAVF_FLAG_AQ_DEL_ADV_RSS_CFG		BIT(28)
+#define IAVF_FLAG_AQ_REQUEST_STATS		BIT(29)
 
 	/* OS defined structs */
 	struct net_device *netdev;
@@ -398,6 +399,7 @@ int iavf_up(struct iavf_adapter *adapter);
 void iavf_down(struct iavf_adapter *adapter);
 int iavf_process_config(struct iavf_adapter *adapter);
 void iavf_schedule_reset(struct iavf_adapter *adapter);
+void iavf_schedule_request_stats(struct iavf_adapter *adapter);
 void iavf_reset(struct iavf_adapter *adapter);
 void iavf_set_ethtool_ops(struct net_device *netdev);
 void iavf_update_stats(struct iavf_adapter *adapter);
@@ -455,4 +457,5 @@ void iavf_add_adv_rss_cfg(struct iavf_adapter *adapter);
 void iavf_del_adv_rss_cfg(struct iavf_adapter *adapter);
 struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
 					const u8 *macaddr);
+int iavf_lock_timeout(struct mutex *lock, unsigned int msecs);
 #endif /* _IAVF_H_ */
drivers/net/ethernet/intel/iavf/iavf_ethtool.c +29 -4
index 144a77679359..0cecaff38d04 100644
@@ -354,6 +354,9 @@ static void iavf_get_ethtool_stats(struct net_device *netdev,
 	struct iavf_adapter *adapter = netdev_priv(netdev);
 	unsigned int i;
 
+	/* Explicitly request stats refresh */
+	iavf_schedule_request_stats(adapter);
+
 	iavf_add_ethtool_stats(&data, adapter, iavf_gstrings_stats);
 
 	rcu_read_lock();
@@ -723,12 +726,31 @@ static int iavf_get_per_queue_coalesce(struct net_device *netdev, u32 queue,
  *
  * Change the ITR settings for a specific queue.
  **/
-static void iavf_set_itr_per_queue(struct iavf_adapter *adapter,
-				   struct ethtool_coalesce *ec, int queue)
+static int iavf_set_itr_per_queue(struct iavf_adapter *adapter,
+				  struct ethtool_coalesce *ec, int queue)
 {
 	struct iavf_ring *rx_ring = &adapter->rx_rings[queue];
 	struct iavf_ring *tx_ring = &adapter->tx_rings[queue];
 	struct iavf_q_vector *q_vector;
+	u16 itr_setting;
+
+	itr_setting = rx_ring->itr_setting & ~IAVF_ITR_DYNAMIC;
+
+	if (ec->rx_coalesce_usecs != itr_setting &&
+	    ec->use_adaptive_rx_coalesce) {
+		netif_info(adapter, drv, adapter->netdev,
+			   "Rx interrupt throttling cannot be changed if adaptive-rx is enabled\n");
+		return -EINVAL;
+	}
+
+	itr_setting = tx_ring->itr_setting & ~IAVF_ITR_DYNAMIC;
+
+	if (ec->tx_coalesce_usecs != itr_setting &&
+	    ec->use_adaptive_tx_coalesce) {
+		netif_info(adapter, drv, adapter->netdev,
+			   "Tx interrupt throttling cannot be changed if adaptive-tx is enabled\n");
+		return -EINVAL;
+	}
 
 	rx_ring->itr_setting = ITR_REG_ALIGN(ec->rx_coalesce_usecs);
 	tx_ring->itr_setting = ITR_REG_ALIGN(ec->tx_coalesce_usecs);
@@ -751,6 +773,7 @@ static void iavf_set_itr_per_queue(struct iavf_adapter *adapter,
 	 * the Tx and Rx ITR values based on the values we have entered
 	 * into the q_vector, no need to write the values now.
 	 */
+	return 0;
 }
 
 /**
@@ -792,9 +815,11 @@ static int __iavf_set_coalesce(struct net_device *netdev,
 	 */
 	if (queue < 0) {
 		for (i = 0; i < adapter->num_active_queues; i++)
-			iavf_set_itr_per_queue(adapter, ec, i);
+			if (iavf_set_itr_per_queue(adapter, ec, i))
+				return -EINVAL;
 	} else if (queue < adapter->num_active_queues) {
-		iavf_set_itr_per_queue(adapter, ec, queue);
+		if (iavf_set_itr_per_queue(adapter, ec, queue))
+			return -EINVAL;
 	} else {
 		netif_info(adapter, drv, netdev, "Invalid queue value, queue range is 0 - %d\n",
 			   adapter->num_active_queues - 1);
drivers/net/ethernet/intel/iavf/iavf_main.c +31 -20

108 lines not on this page · raw message

drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +44 -3

74 lines not on this page · raw message

drivers/net/ethernet/intel/ice/ice_lib.c +7 -2
index e47920fe73b8..62bf879dc623 100644
@@ -83,8 +83,13 @@ static int ice_vsi_alloc_arrays(struct ice_vsi *vsi)
 	if (!vsi->rx_rings)
 		goto err_rings;
 
-	/* XDP will have vsi->alloc_txq Tx queues as well, so double the size */
-	vsi->txq_map = devm_kcalloc(dev, (2 * vsi->alloc_txq),
+	/* txq_map needs to have enough space to track both Tx (stack) rings
+	 * and XDP rings; at this point vsi->num_xdp_txq might not be set,
+	 * so use num_possible_cpus() as we want to always provide XDP ring
+	 * per CPU, regardless of queue count settings from user that might
+	 * have come from ethtool's set_channels() callback;
+	 */
+	vsi->txq_map = devm_kcalloc(dev, (vsi->alloc_txq + num_possible_cpus()),
 				    sizeof(*vsi->txq_map), GFP_KERNEL);
 
 	if (!vsi->txq_map)
drivers/net/ethernet/intel/ice/ice_main.c +17 -1
index a39136b0bd16..f622ee20ac40 100644
@@ -2497,7 +2497,18 @@ int ice_prepare_xdp_rings(struct ice_vsi *vsi, struct bpf_prog *prog)
 			ice_stat_str(status));
 		goto clear_xdp_rings;
 	}
-	ice_vsi_assign_bpf_prog(vsi, prog);
+
+	/* assign the prog only when it's not already present on VSI;
+	 * this flow is a subject of both ethtool -L and ndo_bpf flows;
+	 * VSI rebuild that happens under ethtool -L can expose us to
+	 * the bpf_prog refcount issues as we would be swapping same
+	 * bpf_prog pointers from vsi->xdp_prog and calling bpf_prog_put
+	 * on it as it would be treated as an 'old_prog'; for ndo_bpf
+	 * this is not harmful as dev_xdp_install bumps the refcount
+	 * before calling the op exposed by the driver;
+	 */
+	if (!ice_is_xdp_ena_vsi(vsi))
+		ice_vsi_assign_bpf_prog(vsi, prog);
 
 	return 0;
 clear_xdp_rings:
@@ -2643,6 +2654,11 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
 		if (xdp_ring_err)
 			NL_SET_ERR_MSG_MOD(extack, "Freeing XDP Tx resources failed");
 	} else {
+		/* safe to call even when prog == vsi->xdp_prog as
+		 * dev_xdp_install in net/core/dev.c incremented prog's
+		 * refcount so corresponding bpf_prog_put won't cause
+		 * underflow
+		 */
 		ice_vsi_assign_bpf_prog(vsi, prog);
 	}
 
drivers/net/ethernet/intel/igb/igb_main.c +1 -1
index 751de06019a0..8f30577386b6 100644
@@ -8019,7 +8019,7 @@ static int igb_poll(struct napi_struct *napi, int budget)
 	if (likely(napi_complete_done(napi, work_done)))
 		igb_ring_irq_enable(q_vector);
 
-	return min(work_done, budget - 1);
+	return work_done;
 }
 
 /**
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +8 -6
index d74d4966b13f..ed6d0c019573 100644
@@ -5017,11 +5017,13 @@ static int mvpp2_change_mtu(struct net_device *dev, int mtu)
 		mtu = ALIGN(MVPP2_RX_PKT_SIZE(mtu), 8);
 	}
 
+	if (port->xdp_prog && mtu > MVPP2_MAX_RX_BUF_SIZE) {
+		netdev_err(dev, "Illegal MTU value %d (> %d) for XDP mode\n",
+			   mtu, (int)MVPP2_MAX_RX_BUF_SIZE);
+		return -EINVAL;
+	}
+
 	if (MVPP2_RX_PKT_SIZE(mtu) > MVPP2_BM_LONG_PKT_SIZE) {
-		if (port->xdp_prog) {
-			netdev_err(dev, "Jumbo frames are not supported with XDP\n");
-			return -EINVAL;
-		}
 		if (priv->percpu_pools) {
 			netdev_warn(dev, "mtu %d too high, switching to shared buffers", mtu);
 			mvpp2_bm_switch_buffers(priv, false);
@@ -5307,8 +5309,8 @@ static int mvpp2_xdp_setup(struct mvpp2_port *port, struct netdev_bpf *bpf)
 	bool running = netif_running(port->dev);
 	bool reset = !prog != !port->xdp_prog;
 
-	if (port->dev->mtu > ETH_DATA_LEN) {
-		NL_SET_ERR_MSG_MOD(bpf->extack, "XDP is not supported with jumbo frames enabled");
+	if (port->dev->mtu > MVPP2_MAX_RX_BUF_SIZE) {
+		NL_SET_ERR_MSG_MOD(bpf->extack, "MTU too large for XDP");
 		return -EOPNOTSUPP;
 	}
 
drivers/net/ethernet/marvell/prestera/prestera_switchdev.c +3 -5
index 3ce6ccd0f539..b4599fe4ca8d 100644
@@ -497,8 +497,8 @@ int prestera_bridge_port_join(struct net_device *br_dev,
 
 	br_port = prestera_bridge_port_add(bridge, port->dev);
 	if (IS_ERR(br_port)) {
-		err = PTR_ERR(br_port);
-		goto err_brport_create;
+		prestera_bridge_put(bridge);
+		return PTR_ERR(br_port);
 	}
 
 	err = switchdev_bridge_port_offload(br_port->dev, port->dev, NULL,
@@ -519,8 +519,6 @@ int prestera_bridge_port_join(struct net_device *br_dev,
 	switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
 err_switchdev_offload:
 	prestera_bridge_port_put(br_port);
-err_brport_create:
-	prestera_bridge_put(bridge);
 	return err;
 }
 
@@ -1124,7 +1122,7 @@ static int prestera_switchdev_blk_event(struct notifier_block *unused,
 						     prestera_port_obj_attr_set);
 		break;
 	default:
-		err = -EOPNOTSUPP;
+		return NOTIFY_DONE;
 	}
 
 	return notifier_from_errno(err);
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +1 -1
index 250c5a24264d..edfdd44de579 100644
@@ -2131,7 +2131,7 @@ static void mlxsw_sp_pude_event_func(const struct mlxsw_reg_info *reg,
 	max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
 	local_port = mlxsw_reg_pude_local_port_get(pude_pl);
 
-	if (WARN_ON_ONCE(local_port >= max_ports))
+	if (WARN_ON_ONCE(!local_port || local_port >= max_ports))
 		return;
 	mlxsw_sp_port = mlxsw_sp->ports[local_port];
 	if (!mlxsw_sp_port)
drivers/net/ethernet/microchip/lan743x_main.c +3 -9
index 4d5a5d6595b3..d64ce65a3c17 100644
@@ -914,8 +914,7 @@ static int lan743x_phy_reset(struct lan743x_adapter *adapter)
 }
 
 static void lan743x_phy_update_flowcontrol(struct lan743x_adapter *adapter,
-					   u8 duplex, u16 local_adv,
-					   u16 remote_adv)
+					   u16 local_adv, u16 remote_adv)
 {
 	struct lan743x_phy *phy = &adapter->phy;
 	u8 cap;
@@ -943,7 +942,6 @@ static void lan743x_phy_link_status_change(struct net_device *netdev)
 
 	phy_print_status(phydev);
 	if (phydev->state == PHY_RUNNING) {
-		struct ethtool_link_ksettings ksettings;
 		int remote_advertisement = 0;
 		int local_advertisement = 0;
 
@@ -980,18 +978,14 @@ static void lan743x_phy_link_status_change(struct net_device *netdev)
 		}
 		lan743x_csr_write(adapter, MAC_CR, data);
 
-		memset(&ksettings, 0, sizeof(ksettings));
-		phy_ethtool_get_link_ksettings(netdev, &ksettings);
 		local_advertisement =
 			linkmode_adv_to_mii_adv_t(phydev->advertising);
 		remote_advertisement =
 			linkmode_adv_to_mii_adv_t(phydev->lp_advertising);
 
-		lan743x_phy_update_flowcontrol(adapter,
-					       ksettings.base.duplex,
-					       local_advertisement,
+		lan743x_phy_update_flowcontrol(adapter, local_advertisement,
 					       remote_advertisement);
-		lan743x_ptp_update_latency(adapter, ksettings.base.speed);
+		lan743x_ptp_update_latency(adapter, phydev->speed);
 	}
 }
 
drivers/net/ethernet/mscc/ocelot.c +4 -7
index a08e4f530c1c..00b5e6860bf6 100644
@@ -1175,12 +1175,6 @@ int ocelot_hwstamp_set(struct ocelot *ocelot, int port, struct ifreq *ifr)
 	switch (cfg.rx_filter) {
 	case HWTSTAMP_FILTER_NONE:
 		break;
-	case HWTSTAMP_FILTER_ALL:
-	case HWTSTAMP_FILTER_SOME:
-	case HWTSTAMP_FILTER_PTP_V1_L4_EVENT:
-	case HWTSTAMP_FILTER_PTP_V1_L4_SYNC:
-	case HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ:
-	case HWTSTAMP_FILTER_NTP_ALL:
 	case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
 	case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
 	case HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ:
@@ -1299,7 +1293,10 @@ int ocelot_get_ts_info(struct ocelot *ocelot, int port,
 				 SOF_TIMESTAMPING_RAW_HARDWARE;
 	info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) |
 			 BIT(HWTSTAMP_TX_ONESTEP_SYNC);
-	info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | BIT(HWTSTAMP_FILTER_ALL);
+	info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
+			   BIT(HWTSTAMP_FILTER_PTP_V2_EVENT) |
+			   BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
+			   BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT);
 
 	return 0;
 }
drivers/net/ethernet/netronome/nfp/nfp_net.h +0 -3
index df203738511b..0b1865e9f0b5 100644
@@ -565,7 +565,6 @@ struct nfp_net_dp {
  * @exn_name:           Name for Exception interrupt
  * @shared_handler:     Handler for shared interrupts
  * @shared_name:        Name for shared interrupt
- * @me_freq_mhz:        ME clock_freq (MHz)
  * @reconfig_lock:	Protects @reconfig_posted, @reconfig_timer_active,
  *			@reconfig_sync_present and HW reconfiguration request
  *			regs/machinery from async requests (sync must take
@@ -650,8 +649,6 @@ struct nfp_net {
 	irq_handler_t shared_handler;
 	char shared_name[IFNAMSIZ + 8];
 
-	u32 me_freq_mhz;
-
 	bool link_up;
 	spinlock_t link_status_lock;
 
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c +1 -1
index 0685ece1f155..be1a358baadb 100644
@@ -1343,7 +1343,7 @@ static int nfp_net_set_coalesce(struct net_device *netdev,
 	 * ME timestamp ticks.  There are 16 ME clock cycles for each timestamp
 	 * count.
 	 */
-	factor = nn->me_freq_mhz / 16;
+	factor = nn->tlv_caps.me_freq_mhz / 16;
 
 	/* Each pair of (usecs, max_frames) fields specifies that interrupts
 	 * should be coalesced until
drivers/net/ethernet/stmicro/stmmac/stmmac.h +1 -0
index 43eead726886..5f129733aabd 100644
@@ -314,6 +314,7 @@ int stmmac_mdio_reset(struct mii_bus *mii);
 int stmmac_xpcs_setup(struct mii_bus *mii);
 void stmmac_set_ethtool_ops(struct net_device *netdev);
 
+int stmmac_init_tstamp_counter(struct stmmac_priv *priv, u32 systime_flags);
 void stmmac_ptp_register(struct stmmac_priv *priv);
 void stmmac_ptp_unregister(struct stmmac_priv *priv);
 int stmmac_open(struct net_device *dev);
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +81 -46

179 lines not on this page · raw message

drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c +1 -1
index 232ac98943cd..5d29f336315b 100644
@@ -816,7 +816,7 @@ static int __maybe_unused stmmac_pltfr_noirq_resume(struct device *dev)
 		if (ret)
 			return ret;
 
-		clk_prepare_enable(priv->plat->clk_ptp_ref);
+		stmmac_init_tstamp_counter(priv, priv->systime_flags);
 	}
 
 	return 0;
drivers/net/ipa/ipa_cmd.c +0 -16
index cff51731195a..d57472ea077f 100644
@@ -661,22 +661,6 @@ void ipa_cmd_pipeline_clear_wait(struct ipa *ipa)
 	wait_for_completion(&ipa->completion);
 }
 
-void ipa_cmd_pipeline_clear(struct ipa *ipa)
-{
-	u32 count = ipa_cmd_pipeline_clear_count();
-	struct gsi_trans *trans;
-
-	trans = ipa_cmd_trans_alloc(ipa, count);
-	if (trans) {
-		ipa_cmd_pipeline_clear_add(trans);
-		gsi_trans_commit_wait(trans);
-		ipa_cmd_pipeline_clear_wait(ipa);
-	} else {
-		dev_err(&ipa->pdev->dev,
-			"error allocating %u entry tag transaction\n", count);
-	}
-}
-
 static struct ipa_cmd_info *
 ipa_cmd_info_alloc(struct ipa_endpoint *endpoint, u32 tre_count)
 {
drivers/net/ipa/ipa_cmd.h +0 -6
index 69cd085d427d..05ed7e42e184 100644
@@ -163,12 +163,6 @@ u32 ipa_cmd_pipeline_clear_count(void);
  */
 void ipa_cmd_pipeline_clear_wait(struct ipa *ipa);
 
-/**
- * ipa_cmd_pipeline_clear() - Clear the hardware pipeline
- * @ipa:	- IPA pointer
- */
-void ipa_cmd_pipeline_clear(struct ipa *ipa);
-
 /**
  * ipa_cmd_trans_alloc() - Allocate a transaction for the command TX endpoint
  * @ipa:	IPA pointer
drivers/net/ipa/ipa_endpoint.c +0 -2
index ef790fd0ab56..03a170993420 100644
@@ -1636,8 +1636,6 @@ void ipa_endpoint_suspend(struct ipa *ipa)
 	if (ipa->modem_netdev)
 		ipa_modem_suspend(ipa->modem_netdev);
 
-	ipa_cmd_pipeline_clear(ipa);
-
 	ipa_endpoint_suspend_one(ipa->name_map[IPA_ENDPOINT_AP_LAN_RX]);
 	ipa_endpoint_suspend_one(ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX]);
 }
drivers/net/ipa/ipa_main.c +6 -0
index cdfa98a76e1f..a448ec198bee 100644
@@ -28,6 +28,7 @@
 #include "ipa_reg.h"
 #include "ipa_mem.h"
 #include "ipa_table.h"
+#include "ipa_smp2p.h"
 #include "ipa_modem.h"
 #include "ipa_uc.h"
 #include "ipa_interrupt.h"
@@ -801,6 +802,11 @@ static int ipa_remove(struct platform_device *pdev)
 	struct device *dev = &pdev->dev;
 	int ret;
 
+	/* Prevent the modem from triggering a call to ipa_setup().  This
+	 * also ensures a modem-initiated setup that's underway completes.
+	 */
+	ipa_smp2p_irq_disable_setup(ipa);
+
 	ret = pm_runtime_get_sync(dev);
 	if (WARN_ON(ret < 0))
 		goto out_power_put;
drivers/net/ipa/ipa_modem.c +3 -3
index ad116bcc0580..d0ab4d70c303 100644
@@ -339,9 +339,6 @@ int ipa_modem_stop(struct ipa *ipa)
 	if (state != IPA_MODEM_STATE_RUNNING)
 		return -EBUSY;
 
-	/* Prevent the modem from triggering a call to ipa_setup() */
-	ipa_smp2p_disable(ipa);
-
 	/* Clean up the netdev and endpoints if it was started */
 	if (netdev) {
 		struct ipa_priv *priv = netdev_priv(netdev);
@@ -369,6 +366,9 @@ static void ipa_modem_crashed(struct ipa *ipa)
 	struct device *dev = &ipa->pdev->dev;
 	int ret;
 
+	/* Prevent the modem from triggering a call to ipa_setup() */
+	ipa_smp2p_irq_disable_setup(ipa);
+
 	ret = pm_runtime_get_sync(dev);
 	if (ret < 0) {
 		dev_err(dev, "error %d getting power to handle crash\n", ret);
drivers/net/ipa/ipa_smp2p.c +10 -11
index df7639c39d71..211233612039 100644
@@ -53,7 +53,7 @@
  * @setup_ready_irq:	IPA interrupt triggered by modem to signal GSI ready
  * @power_on:		Whether IPA power is on
  * @notified:		Whether modem has been notified of power state
- * @disabled:		Whether setup ready interrupt handling is disabled
+ * @setup_disabled:	Whether setup ready interrupt handler is disabled
  * @mutex:		Mutex protecting ready-interrupt/shutdown interlock
  * @panic_notifier:	Panic notifier structure
 */
@@ -67,7 +67,7 @@ struct ipa_smp2p {
 	u32 setup_ready_irq;
 	bool power_on;
 	bool notified;
-	bool disabled;
+	bool setup_disabled;
 	struct mutex mutex;
 	struct notifier_block panic_notifier;
 };
@@ -155,11 +155,9 @@ static irqreturn_t ipa_smp2p_modem_setup_ready_isr(int irq, void *dev_id)
 	struct device *dev;
 	int ret;
 
-	mutex_lock(&smp2p->mutex);
-
-	if (smp2p->disabled)
-		goto out_mutex_unlock;
-	smp2p->disabled = true;		/* If any others arrive, ignore them */
+	/* Ignore any (spurious) interrupts received after the first */
+	if (smp2p->ipa->setup_complete)
+		return IRQ_HANDLED;
 
 	/* Power needs to be active for setup */
 	dev = &smp2p->ipa->pdev->dev;
@@ -176,8 +174,6 @@ static irqreturn_t ipa_smp2p_modem_setup_ready_isr(int irq, void *dev_id)
 out_power_put:
 	pm_runtime_mark_last_busy(dev);
 	(void)pm_runtime_put_autosuspend(dev);
-out_mutex_unlock:
-	mutex_unlock(&smp2p->mutex);
 
 	return IRQ_HANDLED;
 }
@@ -313,7 +309,7 @@ void ipa_smp2p_exit(struct ipa *ipa)
 	kfree(smp2p);
 }
 
-void ipa_smp2p_disable(struct ipa *ipa)
+void ipa_smp2p_irq_disable_setup(struct ipa *ipa)
 {
 	struct ipa_smp2p *smp2p = ipa->smp2p;
 
@@ -322,7 +318,10 @@ void ipa_smp2p_disable(struct ipa *ipa)
 
 	mutex_lock(&smp2p->mutex);
 
-	smp2p->disabled = true;
+	if (!smp2p->setup_disabled) {
+		disable_irq(smp2p->setup_ready_irq);
+		smp2p->setup_disabled = true;
+	}
 
 	mutex_unlock(&smp2p->mutex);
 }
drivers/net/ipa/ipa_smp2p.h +3 -4
index 99a956789638..59cee31a7383 100644
@@ -27,13 +27,12 @@ int ipa_smp2p_init(struct ipa *ipa, bool modem_init);
 void ipa_smp2p_exit(struct ipa *ipa);
 
 /**
- * ipa_smp2p_disable() - Prevent "ipa-setup-ready" interrupt handling
+ * ipa_smp2p_irq_disable_setup() - Disable the "setup ready" interrupt
  * @ipa:	IPA pointer
  *
- * Prevent handling of the "setup ready" interrupt from the modem.
- * This is used before initiating shutdown of the driver.
+ * Disable the "ipa-setup-ready" interrupt from the modem.
  */
-void ipa_smp2p_disable(struct ipa *ipa);
+void ipa_smp2p_irq_disable_setup(struct ipa *ipa);
 
 /**
  * ipa_smp2p_notify_reset() - Reset modem notification state
drivers/net/mdio/mdio-aspeed.c +7 -0
index cad820568f75..966c3b4ad59d 100644
@@ -61,6 +61,13 @@ static int aspeed_mdio_read(struct mii_bus *bus, int addr, int regnum)
 
 	iowrite32(ctrl, ctx->base + ASPEED_MDIO_CTRL);
 
+	rc = readl_poll_timeout(ctx->base + ASPEED_MDIO_CTRL, ctrl,
+				!(ctrl & ASPEED_MDIO_CTRL_FIRE),
+				ASPEED_MDIO_INTERVAL_US,
+				ASPEED_MDIO_TIMEOUT_US);
+	if (rc < 0)
+		return rc;
+
 	rc = readl_poll_timeout(ctx->base + ASPEED_MDIO_DATA, data,
 				data & ASPEED_MDIO_DATA_IDLE,
 				ASPEED_MDIO_INTERVAL_US,
drivers/net/phy/phylink.c +25 -1
index 7ec3105010ac..fef1416dcee4 100644
@@ -657,6 +657,7 @@ static void phylink_resolve(struct work_struct *w)
 	struct phylink_link_state link_state;
 	struct net_device *ndev = pl->netdev;
 	bool mac_config = false;
+	bool retrigger = false;
 	bool cur_link_state;
 
 	mutex_lock(&pl->state_mutex);
@@ -670,6 +671,7 @@ static void phylink_resolve(struct work_struct *w)
 		link_state.link = false;
 	} else if (pl->mac_link_dropped) {
 		link_state.link = false;
+		retrigger = true;
 	} else {
 		switch (pl->cur_link_an_mode) {
 		case MLO_AN_PHY:
@@ -686,6 +688,19 @@ static void phylink_resolve(struct work_struct *w)
 		case MLO_AN_INBAND:
 			phylink_mac_pcs_get_state(pl, &link_state);
 
+			/* The PCS may have a latching link-fail indicator.
+			 * If the link was up, bring the link down and
+			 * re-trigger the resolve. Otherwise, re-read the
+			 * PCS state to get the current status of the link.
+			 */
+			if (!link_state.link) {
+				if (cur_link_state)
+					retrigger = true;
+				else
+					phylink_mac_pcs_get_state(pl,
+								  &link_state);
+			}
+
 			/* If we have a phy, the "up" state is the union of
 			 * both the PHY and the MAC
 			 */
@@ -694,6 +709,15 @@ static void phylink_resolve(struct work_struct *w)
 
 			/* Only update if the PHY link is up */
 			if (pl->phydev && pl->phy_state.link) {
+				/* If the interface has changed, force a
+				 * link down event if the link isn't already
+				 * down, and re-resolve.
+				 */
+				if (link_state.interface !=
+				    pl->phy_state.interface) {
+					retrigger = true;
+					link_state.link = false;
+				}
 				link_state.interface = pl->phy_state.interface;
 
 				/* If we have a PHY, we need to update with
@@ -736,7 +760,7 @@ static void phylink_resolve(struct work_struct *w)
 		else
 			phylink_link_up(pl, link_state);
 	}
-	if (!link_state.link && pl->mac_link_dropped) {
+	if (!link_state.link && retrigger) {
 		pl->mac_link_dropped = false;
 		queue_work(system_power_efficient_wq, &pl->resolve);
 	}
drivers/net/usb/smsc95xx.c +26 -29

92 lines not on this page · raw message

drivers/nvme/target/io-cmd-file.c +3 -1
index 1dd1a0fe2e81..df7e033dd273 100644
@@ -8,6 +8,7 @@
 #include <linux/uio.h>
 #include <linux/falloc.h>
 #include <linux/file.h>
+#include <linux/fs.h>
 #include "nvmet.h"
 
 #define NVMET_MAX_MPOOL_BVEC		16
@@ -266,7 +267,8 @@ static void nvmet_file_execute_rw(struct nvmet_req *req)
 
 	if (req->ns->buffered_io) {
 		if (likely(!req->f.mpool_alloc) &&
-				nvmet_file_execute_io(req, IOCB_NOWAIT))
+		    (req->ns->file->f_mode & FMODE_NOWAIT) &&
+		    nvmet_file_execute_io(req, IOCB_NOWAIT))
 			return;
 		nvmet_file_submit_buffered_io(req);
 	} else
drivers/nvme/target/tcp.c +6 -1
index 84c387e4bf43..2b8bab28417b 100644
@@ -700,10 +700,11 @@ static int nvmet_try_send_r2t(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
 static int nvmet_try_send_ddgst(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
 {
 	struct nvmet_tcp_queue *queue = cmd->queue;
+	int left = NVME_TCP_DIGEST_LENGTH - cmd->offset;
 	struct msghdr msg = { .msg_flags = MSG_DONTWAIT };
 	struct kvec iov = {
 		.iov_base = (u8 *)&cmd->exp_ddgst + cmd->offset,
-		.iov_len = NVME_TCP_DIGEST_LENGTH - cmd->offset
+		.iov_len = left
 	};
 	int ret;
 
@@ -717,6 +718,10 @@ static int nvmet_try_send_ddgst(struct nvmet_tcp_cmd *cmd, bool last_in_batch)
 		return ret;
 
 	cmd->offset += ret;
+	left -= ret;
+
+	if (left)
+		return -EAGAIN;
 
 	if (queue->nvme_sq.sqhd_disabled) {
 		cmd->queue->snd_cmd = NULL;
drivers/pci/controller/pci-aardvark.c +99 -143

352 lines not on this page · raw message

drivers/scsi/mpt3sas/mpt3sas_base.c +2 -2
index 27eb652b564f..81dab9b82f79 100644

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

drivers/scsi/mpt3sas/mpt3sas_base.h +4 -0
index f87c0911f66a..1b3a44ce65aa 100644

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

drivers/scsi/mpt3sas/mpt3sas_scsih.c +57 -2

59 lines not on this page · raw message

drivers/scsi/qla2xxx/qla_edif.c +1 -1
index 9240e788b011..a04693498dc0 100644

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

drivers/scsi/scsi_debug.c +5 -0
index ead65cdfb522..1b1a63a46781 100644

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

drivers/scsi/scsi_sysfs.c +1 -1
index 9527e734a999..920aae661c5b 100644

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

drivers/scsi/sd.c +7 -0
index fce63335084e..78ead3369779 100644

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

drivers/staging/fbtft/fb_ssd1351.c +0 -4
index cf263a58a148..6fd549a424d5 100644

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

drivers/staging/fbtft/fbtft-core.c +1 -8
index ed992ca605eb..1690358b8f01 100644

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

drivers/staging/greybus/audio_helper.c +6 -2
index 1ed4772d2771..843760675876 100644

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

drivers/staging/r8188eu/core/rtw_mlme_ext.c +4 -2
index 5a472a4954b0..63d312d01171 100644

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

drivers/staging/r8188eu/os_dep/ioctl_linux.c +7 -1
index 013c322b98a2..0eccce57c63a 100644

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

drivers/staging/r8188eu/os_dep/mlme_linux.c +1 -1
index e3ee9dc7ab90..b0d1e20edc4c 100644

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

drivers/staging/rtl8192e/rtl8192e/rtl_core.c +2 -1
index a7dd1578b2c6..616ab3c8fde4 100644

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

drivers/usb/chipidea/ci_hdrc_imx.c +9 -9
index f1d100671ee6..097142ffb184 100644

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

drivers/usb/core/hub.c +18 -6
index 86658a81d284..00070a8a6507 100644

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

drivers/usb/dwc2/gadget.c +14 -3
index 11d85a6e0b0d..2190225bf3da 100644

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

drivers/usb/dwc2/hcd_queue.c +1 -1
index 89a788326c56..24beff610cf2 100644

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

drivers/usb/dwc3/core.c +5 -3
index 0104a80b185e..357b7805896e 100644

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

drivers/usb/dwc3/core.h +1 -1
index 0c100901a784..fd5d42ec5350 100644

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

drivers/usb/dwc3/gadget.c +28 -11
index ed97e47d3261..4c16805a2b31 100644

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

drivers/usb/host/xhci-tegra.c +29 -12

41 lines not on this page · raw message

drivers/usb/serial/option.c +5 -0
index a484ff5e4ebf..546fce4617a8 100644

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

drivers/usb/serial/pl2303.c +1 -0
index f45ca7ddf78e..a70fd86f735c 100644

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

drivers/usb/typec/tcpm/fusb302.c +4 -2
index 7a2a17866a82..72f9001b0792 100644

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

drivers/vdpa/vdpa_sim/vdpa_sim.c +5 -2
index 5f484fff8dbe..41b0cd17fcba 100644

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

drivers/vhost/vsock.c +1 -1
index 938aefbc75ec..4e3b95af7ee4 100644

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

drivers/xen/xenbus/xenbus_probe.c +26 -1
index bd003ca8acbe..fe360c33ce71 100644

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

fs/ceph/super.c +6 -5
index fd8742bae847..202ddde3d62a 100644

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

fs/cifs/cifs_debug.c +2 -0
index de2c12bcfa4b..905a901f7f80 100644

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

fs/cifs/cifsglob.h +1 -0
index dea4c929d3f4..3e5b8e177cfa 100644

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

fs/cifs/connect.c +7 -0
index e757ee52cc77..439f02f1886c 100644

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

fs/erofs/utils.c +6 -2
index bd86067a63f7..3ca703cd5b24 100644

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

fs/f2fs/checkpoint.c +2 -1
index 83e9bc0f91ff..7b0282724231 100644

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

fs/f2fs/node.c +1 -0
index e863136081b4..556fcd8457f3 100644

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

fs/fuse/dev.c +5 -5
index 5a1f142bdb48..a9d21b33da9c 100644

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

fs/io_uring.c +49 -21

70 lines not on this page · raw message

fs/iomap/buffered-io.c +9 -2
index 9cc5798423d1..97119ec3b850 100644

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

fs/ksmbd/smb2pdu.c +17 -13
index 589694af4e95..ad0ea5d36f2e 100644

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

fs/nfs/nfs42proc.c +3 -1
index a24349512ffe..9865b5c37d88 100644

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

fs/nfs/nfs42xdr.c +1 -2
index c8bad735e4c1..271e5f92ed01 100644

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

fs/proc/vmcore.c +10 -6
index 9a15334da208..e5730986758f 100644

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

include/net/ip6_fib.h +1 -0
index c412dde4d67d..83b8070d1cc9 100644

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

include/net/ipv6_stubs.h +1 -0
index afbce90c4480..45e0339be6fa 100644

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

include/net/nl802154.h +4 -3
index ddcee128f5d9..145acb8f2509 100644

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

kernel/cpu.c +7 -0
index 192e43a87407..407a2568f35e 100644

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

kernel/events/core.c +3 -0
index 7162b600e7ea..2931faf92a76 100644

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

kernel/locking/rwsem.c +85 -86

171 lines not on this page · raw message

kernel/power/hibernate.c +3 -3
index 559acef3fddb..b0888e9224da 100644

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

kernel/sched/core.c +0 -4
index 779f27a4b46a..6f4625f8276f 100644

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

kernel/trace/trace.h +18 -6
index 5c71d32b2860..421374c304fc 100644

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

kernel/trace/trace_events.c +10 -0
index bb1123ef2a02..44d031ffe511 100644

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

kernel/trace/trace_uprobe.c +1 -0
index 0a5c0db3137e..f5f0039d31e5 100644

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

net/8021q/vlan.c +0 -3
index a3a0a5e994f5..abaa5d96ded2 100644

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

net/8021q/vlan_dev.c +3 -0
index aeeb5f90417b..8602885c8a8e 100644

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

net/ethtool/ioctl.c +1 -1
index f2abc3152888..e4983f473a3c 100644

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

net/ipv4/nexthop.c +30 -5
index 9e8100728d46..5dbd4b5505eb 100644

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

net/ipv4/tcp_cubic.c +3 -2
index 4a30deaa9a37..8d2d4d652f6d 100644

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

net/ipv6/af_inet6.c +1 -0
index 0c4da163535a..dab4a047590b 100644

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

net/ipv6/ip6_output.c +1 -1
index 2f044a49afa8..ff4e83e2a506 100644

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

net/ipv6/route.c +19 -0
index 9b9ef09382ab..79cb5e5a4948 100644

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

net/mptcp/options.c +9 -23
index 350348f07070..0966855a7c25 100644

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

net/mptcp/protocol.c +42 -9

51 lines not on this page · raw message

net/mptcp/protocol.h +9 -8
index dc984676c5eb..82c5dc4d6b49 100644

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

net/ncsi/ncsi-cmd.c +16 -8
index ba9ae482141b..dda8b76b7798 100644

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

net/netfilter/ipvs/ip_vs_core.c +4 -4
index 128690c512df..393058a43aa7 100644

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

net/netfilter/nf_conntrack_netlink.c +2 -4
index f1e5443fe7c7..c7708bde057c 100644

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

net/netfilter/nf_flow_table_offload.c +2 -2
index d6bf1b2cd541..b561e0a44a45 100644

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

net/sched/sch_ets.c +5 -3
index 1f857ffd1ac2..92a686807971 100644

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

net/smc/af_smc.c +10 -2
index 32c1c7ce856d..3d8219e3b026 100644

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

net/smc/smc_close.c +6 -0
index 0f9ffba07d26..04620b53b74a 100644

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

net/smc/smc_core.c +18 -17
index d672c0f0e247..508a14fc4f58 100644

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

net/tls/tls_main.c +40 -7

47 lines not on this page · raw message

net/tls/tls_sw.c +27 -13
index 1b08b877a890..b0cdcea10180 100644

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

net/unix/af_unix.c +0 -3
index 78e08e82c08c..b0bfc78e421c 100644

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

sound/hda/intel-dsp-config.c +9 -0
index b9ac9e9e45a4..10a0bffc3cf6 100644

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

sound/pci/ctxfi/ctamixer.c +6 -8
index da6e6350ceaf..d074727c3e21 100644

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

sound/pci/ctxfi/ctdaio.c +8 -8
index f589da045342..7fc720046ce2 100644

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

sound/pci/ctxfi/ctresource.c +3 -4
index 81ad26934518..be1d3e61309c 100644

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

sound/pci/ctxfi/ctresource.h +2 -2
index fdbfd808816d..58553bda44f4 100644

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

sound/pci/ctxfi/ctsrc.c +3 -4
index bd4697b44233..4a94b4708a77 100644

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

sound/pci/hda/patch_realtek.c +28 -0
index 2f1727faec69..9ce7457533c9 100644

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

sound/soc/codecs/lpass-rx-macro.c +1 -1
index 196b06898eeb..07894ec5e7a6 100644

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

sound/soc/codecs/wcd934x.c +1 -2
index c496b359f2f4..4f568abd59e2 100644

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

sound/soc/codecs/wcd938x.c +3 -0
index 52de7d14b139..67151c7770c6 100644

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

sound/soc/qcom/qdsp6/q6asm-dai.c +13 -6
index 46f365528d50..b74b67720ef4 100644

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

sound/soc/qcom/qdsp6/q6routing.c +5 -1
index 3390ebef9549..243b8179e59d 100644

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

sound/soc/soc-topology.c +3 -0
index f6e5ac3e0314..7459956d62b9 100644

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

sound/soc/sof/intel/hda-bus.c +17 -0
index 30025d3c16b6..0862ff8b6627 100644

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

sound/soc/sof/intel/hda-dsp.c +1 -2
index 623cf291e207..262a70791a8f 100644

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

sound/soc/sof/intel/hda.c +16 -0
index f60e2c57d3d0..ef92cca7ae01 100644

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

sound/soc/stm/stm32_i2s.c +1 -1
index 6254bacad6eb..717f45a83445 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.