Merge tag 'perf-tools-fixes-for-v6.4-1-2023-05-20' of git://git.kernel.org/pub/scm...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 21 May 2023 20:24:59 +0000 (13:24 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 21 May 2023 20:24:59 +0000 (13:24 -0700)
Pull perf tools fixes from Arnaldo Carvalho de Melo:

 - Fail graciously if BUILD_BPF_SKEL=1 is specified and clang isn't
   available

 - Add empty 'struct rq' to 'perf lock contention' to satisfy libbpf
   'runqueue' type verification. This feature is built only with
   BUILD_BPF_SKEL=1

 - Make vmlinux.h use bpf.h and perf_event.h in source directory, not
   system ones that may be old and not have things like 'union
   perf_sample_weight'

 - Add system include paths to BPF builds to pick things missing in the
   headers included by clang -target bpf

 - Update various header copies with the kernel sources

 - Change divide by zero and not supported events behavior to show
   'nan'/'not counted' in 'perf stat' output.

   This happens when using things like 'perf stat -M TopdownL2 true',
   involving JSON metrics

 - Update no event/metric expectations affected by using JSON metrics in
   'perf stat -ddd' perf test

 - Avoid segv with 'perf stat --topdown' for metrics without a group

 - Do not assume which events may have a PMU name, allowing the logic to
   keep an AUX event group together. Makes this usecase work again:

     $ perf record --no-bpf-event -c 10 -e '{intel_pt//,tlb_flush.stlb_any/aux-sample-size=8192/pp}:u' -- sleep 0.1
     [ perf record: Woken up 1 times to write data ]
     [ perf record: Captured and wrote 0.078 MB perf.data ]
     $ perf script -F-dso,+addr | grep -C5 tlb_flush.stlb_any | head -11
     sleep 20444 [003]  7939.510243:  1  branches:uH:  7f5350cc82a2 dl_main+0x9a2 => 7f5350cb38f0 _dl_add_to_namespace_list+0x0
     sleep 20444 [003]  7939.510243:  1  branches:uH:  7f5350cb3908 _dl_add_to_namespace_list+0x18 => 7f5350cbb080 rtld_mutex_dummy+0x0
     sleep 20444 [003]  7939.510243:  1  branches:uH:  7f5350cc8350 dl_main+0xa50 => 0 [unknown]
     sleep 20444 [003]  7939.510244:  1  branches:uH:  7f5350cc83ca dl_main+0xaca => 7f5350caeb60 _dl_process_pt_gnu_property+0x0
     sleep 20444 [003]  7939.510245:  1  branches:uH:  7f5350caeb60 _dl_process_pt_gnu_property+0x0 => 0 [unknown]
     sleep 20444  7939.510245:       10 tlb_flush.stlb_any/aux-sample-size=8192/pp: 0 7f5350caeb60 _dl_process_pt_gnu_property+0x0
     sleep 20444 [003]  7939.510254:  1  branches:uH:  7f5350cc87fe dl_main+0xefe => 7f5350ccd240 strcmp+0x0
     sleep 20444 [003]  7939.510254:  1  branches:uH:  7f5350cc8862 dl_main+0xf62 => 0 [unknown]

 - Add a check for the above use case in 'perf test test_intel_pt'

 - Fix build with refcount checking on arm64, it was still accessing
   fields that need to be wrapped so that the refcounted struct gets
   checked

 - Fix contextid validation in ARM's CS-ETM, so that older kernels
   without that field can still be supported

 - Skip unsupported aggregation for stat events found in perf.data files
   in 'perf script'

 - Add stat test for record and script to check the previous problem

 - Remove needless debuginfod queries from 'perf test java symbol', this
   was just making the test take a long time to complete

 - Address python SafeConfigParser() deprecation warning in 'perf test
   attr'

 - Fix __NR_execve undeclared on i386 'perf bench syscall' build error

* tag 'perf-tools-fixes-for-v6.4-1-2023-05-20' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux: (33 commits)
  perf bench syscall: Fix __NR_execve undeclared build error
  perf test attr: Fix python SafeConfigParser() deprecation warning
  perf test attr: Update no event/metric expectations
  tools headers disabled-features: Sync with the kernel sources
  tools headers UAPI: Sync arch prctl headers with the kernel sources
  tools headers: Update the copy of x86's mem{cpy,set}_64.S used in 'perf bench'
  tools headers x86 cpufeatures: Sync with the kernel sources
  tools headers UAPI: Sync s390 syscall table file that wires up the memfd_secret syscall
  tools headers UAPI: Sync linux/prctl.h with the kernel sources
  perf metrics: Avoid segv with --topdown for metrics without a group
  perf lock contention: Add empty 'struct rq' to satisfy libbpf 'runqueue' type verification
  perf cs-etm: Fix contextid validation
  perf arm64: Fix build with refcount checking
  perf test: Add stat test for record and script
  perf script: Skip aggregation for stat events
  perf build: Add system include paths to BPF builds
  perf bpf skels: Make vmlinux.h use bpf.h and perf_event.h in source directory
  perf parse-events: Do not break up AUX event group
  perf test test_intel_pt.sh: Test sample mode with event with PMU name
  perf evsel: Modify group pmu name for software events
  ...

520 files changed:
.mailmap
CREDITS
Documentation/admin-guide/quickly-build-trimmed-linux.rst
Documentation/block/index.rst
Documentation/block/request.rst [deleted file]
Documentation/cdrom/index.rst
Documentation/devicetree/bindings/ata/ceva,ahci-1v84.yaml
Documentation/devicetree/bindings/display/msm/dsi-controller-main.yaml
Documentation/devicetree/bindings/media/i2c/ovti,ov2685.yaml
Documentation/devicetree/bindings/net/can/st,stm32-bxcan.yaml
Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-common.yaml
Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml
Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.yaml
Documentation/devicetree/bindings/sound/tas2562.yaml
Documentation/devicetree/bindings/sound/tas2770.yaml
Documentation/devicetree/bindings/sound/tas27xx.yaml
Documentation/filesystems/ramfs-rootfs-initramfs.rst
Documentation/filesystems/sharedsubtree.rst
Documentation/fpga/index.rst
Documentation/locking/index.rst
Documentation/networking/bonding.rst
Documentation/networking/index.rst
Documentation/networking/x25-iface.rst
Documentation/pcmcia/index.rst
Documentation/s390/vfio-ap.rst
Documentation/staging/crc32.rst
Documentation/timers/index.rst
MAINTAINERS
Makefile
arch/arm/boot/dts/stm32f429.dtsi
arch/arm/boot/dts/stm32f7-pinctrl.dtsi
arch/arm/include/asm/arm_pmuv3.h
arch/arm/kernel/unwind.c
arch/arm/mach-sa1100/jornada720_ssp.c
arch/arm/vfp/entry.S
arch/arm/vfp/vfphw.S
arch/arm64/include/asm/arm_pmuv3.h
arch/arm64/kernel/mte.c
arch/arm64/kernel/vdso.c
arch/arm64/mm/copypage.c
arch/arm64/mm/fault.c
arch/parisc/include/asm/pgtable.h
arch/parisc/kernel/kexec.c
arch/powerpc/boot/Makefile
arch/powerpc/crypto/Kconfig
arch/powerpc/include/asm/iommu.h
arch/powerpc/kernel/dma-iommu.c
arch/powerpc/kernel/iommu.c
arch/powerpc/kernel/isa-bridge.c
arch/powerpc/mm/book3s64/radix_pgtable.c
arch/powerpc/net/bpf_jit_comp.c
arch/powerpc/platforms/Kconfig
arch/powerpc/platforms/powernv/pci.c
arch/powerpc/platforms/pseries/iommu.c
arch/riscv/kernel/pi/Makefile
arch/riscv/kernel/probes/Makefile
arch/riscv/kernel/vmlinux.lds.S
arch/s390/Kconfig
arch/s390/configs/debug_defconfig
arch/s390/configs/defconfig
arch/s390/configs/zfcpdump_defconfig
arch/s390/crypto/chacha-glue.c
arch/s390/include/asm/compat.h
arch/s390/include/uapi/asm/statfs.h
arch/s390/kernel/Makefile
arch/s390/kernel/ipl.c
arch/s390/kernel/topology.c
arch/x86/events/core.c
arch/x86/events/intel/ds.c
arch/x86/include/asm/perf_event.h
arch/x86/kernel/Makefile
arch/x86/kernel/amd_nb.c
arch/x86/lib/retpoline.S
block/fops.c
drivers/acpi/resource.c
drivers/base/class.c
drivers/block/nbd.c
drivers/block/rnbd/rnbd-proto.h
drivers/block/ublk_drv.c
drivers/char/tpm/tpm-chip.c
drivers/char/tpm/tpm-interface.c
drivers/char/tpm/tpm_tis.c
drivers/char/tpm/tpm_tis_core.c
drivers/cpufreq/acpi-cpufreq.c
drivers/cpufreq/pcc-cpufreq.c
drivers/cxl/core/pci.c
drivers/firewire/net.c
drivers/firmware/sysfb_simplefb.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
drivers/gpu/drm/amd/amdgpu/nv.c
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
drivers/gpu/drm/amd/amdgpu/soc21.c
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.c
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_hwseq.h
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_init.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.h
drivers/gpu/drm/amd/display/dc/link/link_validation.c
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_mipi_dsi.c
drivers/gpu/drm/exynos/exynos_drm_g2d.h
drivers/gpu/drm/i915/Kconfig
drivers/gpu/drm/i915/display/intel_atomic_plane.c
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_hdcp.c
drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c
drivers/gpu/drm/i915/i915_pci.c
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c
drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h
drivers/gpu/drm/msm/dp/dp_audio.c
drivers/gpu/drm/msm/dp/dp_audio.h
drivers/gpu/drm/msm/dp/dp_display.c
drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem_submit.c
drivers/gpu/drm/msm/msm_iommu.c
drivers/gpu/drm/nouveau/include/nvif/if0012.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.h
drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c
drivers/gpu/drm/scheduler/sched_main.c
drivers/hwmon/k10temp.c
drivers/iommu/Kconfig
drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
drivers/media/dvb-core/dvb_ca_en50221.c
drivers/media/dvb-core/dvb_demux.c
drivers/media/dvb-core/dvb_frontend.c
drivers/media/dvb-core/dvb_net.c
drivers/media/dvb-core/dvbdev.c
drivers/media/dvb-frontends/mn88443x.c
drivers/media/pci/netup_unidvb/netup_unidvb_core.c
drivers/media/platform/mediatek/mdp3/mtk-mdp3-comp.c
drivers/media/platform/nxp/imx8-isi/imx8-isi-core.c
drivers/media/platform/renesas/rcar-vin/rcar-dma.c
drivers/media/usb/dvb-usb-v2/ce6230.c
drivers/media/usb/dvb-usb-v2/ec168.c
drivers/media/usb/dvb-usb-v2/rtl28xxu.c
drivers/media/usb/dvb-usb/az6027.c
drivers/media/usb/dvb-usb/digitv.c
drivers/media/usb/dvb-usb/dw2102.c
drivers/media/usb/pvrusb2/Kconfig
drivers/media/usb/ttusb-dec/ttusb_dec.c
drivers/net/bonding/bond_netlink.c
drivers/net/bonding/bond_options.c
drivers/net/can/Kconfig
drivers/net/can/bxcan.c
drivers/net/can/dev/skb.c
drivers/net/can/kvaser_pciefd.c
drivers/net/dsa/mv88e6xxx/port.h
drivers/net/dsa/rzn1_a5psw.c
drivers/net/dsa/rzn1_a5psw.h
drivers/net/ethernet/3com/3c515.c
drivers/net/ethernet/8390/ne.c
drivers/net/ethernet/8390/smc-ultra.c
drivers/net/ethernet/8390/wd.c
drivers/net/ethernet/amd/lance.c
drivers/net/ethernet/broadcom/genet/bcmgenet.c
drivers/net/ethernet/cirrus/cs89x0.c
drivers/net/ethernet/freescale/fec_main.c
drivers/net/ethernet/google/gve/gve_main.c
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c
drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h
drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
drivers/net/ethernet/intel/ice/ice_dcb_lib.c
drivers/net/ethernet/intel/ice/ice_lib.c
drivers/net/ethernet/intel/ice/ice_sriov.c
drivers/net/ethernet/intel/ice/ice_txrx.c
drivers/net/ethernet/intel/ice/ice_txrx.h
drivers/net/ethernet/intel/ice/ice_vf_lib.c
drivers/net/ethernet/intel/ice/ice_vf_lib.h
drivers/net/ethernet/intel/ice/ice_virtchnl.c
drivers/net/ethernet/intel/igb/e1000_mac.c
drivers/net/ethernet/mediatek/mtk_wed.c
drivers/net/ethernet/mscc/vsc7514_regs.c
drivers/net/ethernet/netronome/nfp/nic/main.h
drivers/net/ethernet/sfc/ef100_netdev.c
drivers/net/ethernet/stmicro/stmmac/dwmac4.h
drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
drivers/net/ethernet/sun/cassini.c
drivers/net/ipvlan/ipvlan_core.c
drivers/net/mdio/mdio-i2c.c
drivers/net/mdio/mdio-mvusb.c
drivers/net/pcs/pcs-xpcs.c
drivers/net/phy/bcm-phy-lib.h
drivers/net/phy/bcm7xxx.c
drivers/net/phy/dp83867.c
drivers/net/phy/phylink.c
drivers/net/tap.c
drivers/net/tun.c
drivers/net/virtio_net.c
drivers/net/wireless/broadcom/b43/b43.h
drivers/net/wireless/broadcom/b43legacy/b43legacy.h
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
drivers/net/wireless/intel/iwlwifi/fw/acpi.c
drivers/net/wireless/intel/iwlwifi/fw/dbg.c
drivers/net/wireless/intel/iwlwifi/mvm/ftm-initiator.c
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
drivers/net/wireless/intel/iwlwifi/mvm/link.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/mld-sta.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/nvm.c
drivers/net/wireless/intel/iwlwifi/mvm/rfi.c
drivers/net/wireless/intel/iwlwifi/mvm/rs.c
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.c
drivers/net/wireless/intel/iwlwifi/mvm/tx.c
drivers/net/wireless/mediatek/mt76/mt76_connac2_mac.h
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
drivers/net/wireless/mediatek/mt76/mt7996/mac.c
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/sdio.c
drivers/net/wireless/realtek/rtw88/usb.h
drivers/net/wireless/realtek/rtw89/mac.c
drivers/net/wireless/realtek/rtw89/mac.h
drivers/net/wireless/realtek/rtw89/rtw8852b.c
drivers/net/wireless/virtual/mac80211_hwsim.c
drivers/net/wwan/iosm/iosm_ipc_imem.c
drivers/net/wwan/iosm/iosm_ipc_imem_ops.c
drivers/net/wwan/iosm/iosm_ipc_imem_ops.h
drivers/net/wwan/t7xx/t7xx_pci.c
drivers/net/wwan/t7xx/t7xx_pci.h
drivers/nvme/host/core.c
drivers/nvme/host/hwmon.c
drivers/nvme/host/multipath.c
drivers/nvme/host/nvme.h
drivers/nvme/host/pci.c
drivers/s390/block/dasd_eckd.c
drivers/s390/cio/device.c
drivers/s390/cio/qdio.h
drivers/s390/crypto/pkey_api.c
drivers/scsi/scsi_lib.c
drivers/scsi/storvsc_drv.c
drivers/thunderbolt/nhi.c
drivers/thunderbolt/nhi_regs.h
drivers/tty/serial/8250/8250_bcm7271.c
drivers/tty/serial/8250/8250_exar.c
drivers/tty/serial/8250/8250_pci.c
drivers/tty/serial/8250/8250_port.c
drivers/tty/serial/arc_uart.c
drivers/tty/serial/qcom_geni_serial.c
drivers/tty/vt/vc_screen.c
drivers/ufs/core/ufs-mcq.c
drivers/ufs/core/ufshcd.c
drivers/usb/class/usbtmc.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h
drivers/usb/dwc3/debugfs.c
drivers/usb/dwc3/gadget.c
drivers/usb/gadget/function/u_ether.c
drivers/usb/gadget/udc/core.c
drivers/usb/host/uhci-pci.c
drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.h
drivers/usb/storage/scsiglue.c
drivers/usb/typec/altmodes/displayport.c
drivers/usb/typec/tipd/core.c
drivers/video/fbdev/68328fb.c
drivers/video/fbdev/Kconfig
drivers/video/fbdev/arcfb.c
drivers/video/fbdev/atmel_lcdfb.c
drivers/video/fbdev/aty/atyfb_base.c
drivers/video/fbdev/cg14.c
drivers/video/fbdev/controlfb.c
drivers/video/fbdev/core/fbmem.c
drivers/video/fbdev/core/modedb.c
drivers/video/fbdev/g364fb.c
drivers/video/fbdev/hgafb.c
drivers/video/fbdev/hpfb.c
drivers/video/fbdev/i810/i810_dvt.c
drivers/video/fbdev/imsttfb.c
drivers/video/fbdev/macfb.c
drivers/video/fbdev/maxinefb.c
drivers/video/fbdev/omap2/omapfb/displays/panel-tpo-td043mtea1.c
drivers/video/fbdev/p9100.c
drivers/video/fbdev/platinumfb.c
drivers/video/fbdev/sa1100fb.c
drivers/video/fbdev/stifb.c
drivers/video/fbdev/udlfb.c
drivers/video/fbdev/valkyriefb.c
drivers/video/fbdev/vfb.c
fs/btrfs/backref.c
fs/btrfs/backref.h
fs/btrfs/disk-io.c
fs/btrfs/free-space-cache.c
fs/btrfs/free-space-tree.c
fs/btrfs/free-space-tree.h
fs/btrfs/inode.c
fs/btrfs/print-tree.c
fs/btrfs/relocation.c
fs/btrfs/super.c
fs/btrfs/zoned.c
fs/ceph/mds_client.c
fs/ceph/snap.c
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/connect.c
fs/cifs/file.c
fs/cifs/smb1ops.c
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c
fs/ext4/balloc.c
fs/ext4/ext4.h
fs/ext4/extents_status.c
fs/ext4/hash.c
fs/ext4/ialloc.c
fs/ext4/inline.c
fs/ext4/inode.c
fs/ext4/mballoc.c
fs/ext4/migrate.c
fs/ext4/mmp.c
fs/ext4/namei.c
fs/ext4/super.c
fs/ext4/xattr.c
fs/gfs2/super.c
fs/ksmbd/connection.c
fs/ksmbd/oplock.c
fs/ksmbd/oplock.h
fs/ksmbd/smb2misc.c
fs/ksmbd/smb2pdu.c
fs/lockd/svc.c
fs/nfsd/nfsctl.c
fs/nfsd/trace.h
fs/nilfs2/inode.c
fs/notify/inotify/inotify_fsnotify.c
fs/pipe.c
fs/statfs.c
fs/xfs/libxfs/xfs_ag.c
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/scrub/bmap.c
fs/xfs/scrub/common.c
fs/xfs/scrub/common.h
fs/xfs/scrub/fscounters.c
fs/xfs/scrub/scrub.c
fs/xfs/scrub/scrub.h
fs/xfs/scrub/trace.h
fs/xfs/xfs_bmap_util.c
fs/xfs/xfs_icache.c
fs/xfs/xfs_iomap.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_super.c
include/drm/display/drm_dp.h
include/drm/display/drm_dp_helper.h
include/linux/blkdev.h
include/linux/compiler.h
include/linux/device/class.h
include/linux/dim.h
include/linux/if_vlan.h
include/linux/io_uring.h
include/linux/pci_ids.h
include/linux/phy.h
include/linux/shrinker.h
include/linux/sunrpc/svc_rdma.h
include/linux/sunrpc/svc_xprt.h
include/linux/tpm.h
include/linux/usb/composite.h
include/media/dvb_frontend.h
include/media/dvb_net.h
include/media/dvbdev.h
include/net/bonding.h
include/net/nexthop.h
include/net/sock.h
include/sound/hda-mlink.h
include/uapi/sound/sof/tokens.h
include/ufs/ufshcd.h
kernel/events/core.c
kernel/locking/rwsem.c
kernel/sched/core.c
kernel/time/tick-broadcast.c
kernel/trace/fprobe.c
kernel/trace/rethook.c
lib/dim/dim.c
lib/dim/net_dim.c
lib/dim/rdma_dim.c
lib/maple_tree.c
mm/kfence/kfence.h
mm/shrinker_debug.c
mm/vmscan.c
mm/zsmalloc.c
mm/zswap.c
net/8021q/vlan_dev.c
net/atm/resources.c
net/bridge/br_forward.c
net/bridge/br_private_tunnel.h
net/can/isotp.c
net/can/j1939/socket.c
net/core/datagram.c
net/core/dev.c
net/core/skbuff.c
net/core/stream.c
net/devlink/core.c
net/devlink/devl_internal.h
net/devlink/leftover.c
net/ipv4/af_inet.c
net/ipv4/tcp.c
net/ipv4/tcp_bpf.c
net/ipv4/tcp_input.c
net/ipv4/tcp_ipv4.c
net/ipv6/ip6_fib.c
net/ipv6/ip6_gre.c
net/key/af_key.c
net/llc/af_llc.c
net/mac80211/cfg.c
net/mac80211/chan.c
net/mac80211/ieee80211_i.h
net/mac80211/trace.h
net/mac80211/tx.c
net/mac80211/util.c
net/netfilter/core.c
net/netfilter/nf_conntrack_netlink.c
net/netfilter/nf_conntrack_standalone.c
net/netfilter/nf_tables_api.c
net/netfilter/nft_chain_filter.c
net/netfilter/nft_set_rbtree.c
net/netlink/af_netlink.c
net/nsh/nsh.c
net/packet/af_packet.c
net/smc/smc_close.c
net/smc/smc_rx.c
net/smc/smc_tx.c
net/socket.c
net/sunrpc/auth_gss/gss_krb5_crypto.c
net/sunrpc/svc.c
net/sunrpc/svc_xprt.c
net/sunrpc/svcsock.c
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_transport.c
net/tipc/bearer.c
net/tipc/bearer.h
net/tipc/link.c
net/tipc/socket.c
net/tipc/udp_media.c
net/tls/tls_main.c
net/unix/af_unix.c
net/vmw_vsock/af_vsock.c
net/wireless/scan.c
net/xfrm/xfrm_device.c
net/xfrm/xfrm_interface_core.c
net/xfrm/xfrm_policy.c
net/xfrm/xfrm_user.c
sound/core/oss/pcm_plugin.h
sound/firewire/digi00x/digi00x-stream.c
sound/pci/cs46xx/cs46xx_lib.c
sound/pci/hda/hda_generic.c
sound/pci/hda/patch_hdmi.c
sound/pci/hda/patch_realtek.c
sound/soc/amd/yc/acp6x-mach.c
sound/soc/codecs/cs35l56.c
sound/soc/codecs/ssm2602.c
sound/soc/dwc/dwc-i2s.c
sound/soc/fsl/fsl_micfil.c
sound/soc/jz4740/jz4740-i2s.c
sound/soc/mediatek/mt8186/mt8186-afe-clk.c
sound/soc/mediatek/mt8186/mt8186-afe-clk.h
sound/soc/mediatek/mt8186/mt8186-afe-pcm.c
sound/soc/mediatek/mt8186/mt8186-audsys-clk.c
sound/soc/mediatek/mt8186/mt8186-audsys-clk.h
sound/soc/sof/amd/acp-ipc.c
sound/soc/sof/debug.c
sound/soc/sof/intel/hda-mlink.c
sound/soc/sof/ipc3-topology.c
sound/soc/sof/ipc4-topology.c
sound/soc/sof/pcm.c
sound/soc/sof/pm.c
sound/soc/sof/sof-client-probes.c
sound/soc/sof/topology.c
sound/usb/format.c
tools/power/cpupower/lib/powercap.c
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c
tools/testing/cxl/test/mock.c
tools/testing/selftests/drivers/net/bonding/bond_options.sh
tools/testing/selftests/drivers/net/bonding/bond_topo_3d1c.sh
tools/testing/selftests/ftrace/Makefile
tools/testing/selftests/ftrace/ftracetest
tools/testing/selftests/ftrace/ftracetest-ktap [new file with mode: 0755]
tools/testing/selftests/net/fib_nexthops.sh
tools/testing/selftests/net/forwarding/lib.sh
tools/testing/selftests/net/srv6_end_dt4_l3vpn_test.sh
tools/testing/selftests/netfilter/nft_flowtable.sh
tools/testing/selftests/sgx/Makefile

index 71127b2..bf076bb 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -364,6 +364,11 @@ Nicolas Pitre <nico@fluxnic.net> <nico@linaro.org>
 Nicolas Saenz Julienne <nsaenz@kernel.org> <nsaenzjulienne@suse.de>
 Nicolas Saenz Julienne <nsaenz@kernel.org> <nsaenzjulienne@suse.com>
 Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
+Nikolay Aleksandrov <razor@blackwall.org> <naleksan@redhat.com>
+Nikolay Aleksandrov <razor@blackwall.org> <nikolay@redhat.com>
+Nikolay Aleksandrov <razor@blackwall.org> <nikolay@cumulusnetworks.com>
+Nikolay Aleksandrov <razor@blackwall.org> <nikolay@nvidia.com>
+Nikolay Aleksandrov <razor@blackwall.org> <nikolay@isovalent.com>
 Oleksandr Natalenko <oleksandr@natalenko.name> <oleksandr@redhat.com>
 Oleksij Rempel <linux@rempel-privat.de> <bug-track@fisher-privat.net>
 Oleksij Rempel <linux@rempel-privat.de> <external.Oleksij.Rempel@de.bosch.com>
diff --git a/CREDITS b/CREDITS
index 2d9da9a..de7e4db 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -1706,6 +1706,10 @@ S: Panoramastrasse 18
 S: D-69126 Heidelberg
 S: Germany
 
+N: Neil Horman
+M: nhorman@tuxdriver.com
+D: SCTP protocol maintainer.
+
 N: Simon Horman
 M: horms@verge.net.au
 D: Renesas ARM/ARM64 SoC maintainer
index ff4f4cc..f08149b 100644 (file)
@@ -215,12 +215,14 @@ again.
    reduce the compile time enormously, especially if you are running an
    universal kernel from a commodity Linux distribution.
 
-   There is a catch: the make target 'localmodconfig' will disable kernel
-   features you have not directly or indirectly through some program utilized
-   since you booted the system. You can reduce or nearly eliminate that risk by
-   using tricks outlined in the reference section; for quick testing purposes
-   that risk is often negligible, but it is an aspect you want to keep in mind
-   in case your kernel behaves oddly.
+   There is a catch: 'localmodconfig' is likely to disable kernel features you
+   did not use since you booted your Linux -- like drivers for currently
+   disconnected peripherals or a virtualization software not haven't used yet.
+   You can reduce or nearly eliminate that risk with tricks the reference
+   section outlines; but when building a kernel just for quick testing purposes
+   it is often negligible if such features are missing. But you should keep that
+   aspect in mind when using a kernel built with this make target, as it might
+   be the reason why something you only use occasionally stopped working.
 
    [:ref:`details<configuration>`]
 
@@ -271,6 +273,9 @@ again.
    does nothing at all; in that case you have to manually install your kernel,
    as outlined in the reference section.
 
+   If you are running a immutable Linux distribution, check its documentation
+   and the web to find out how to install your own kernel there.
+
    [:ref:`details<install>`]
 
 .. _another_sbs:
@@ -291,29 +296,29 @@ again.
    version you care about, as git otherwise might retrieve the entire commit
    history::
 
-     git fetch --shallow-exclude=v6.1 origin
-
-   If you modified the sources (for example by applying a patch), you now need
-   to discard those modifications; that's because git otherwise will not be able
-   to switch to the sources of another version due to potential conflicting
-   changes::
-
-     git reset --hard
+     git fetch --shallow-exclude=v6.0 origin
 
-   Now checkout the version you are interested in, as explained above::
+   Now switch to the version you are interested in -- but be aware the command
+   used here will discard any modifications you performed, as they would
+   conflict with the sources you want to checkout::
 
-     git checkout --detach origin/master
+     git checkout --force --detach origin/master
 
    At this point you might want to patch the sources again or set/modify a build
-   tag, as explained earlier; afterwards adjust the build configuration to the
-   new codebase and build your next kernel::
+   tag, as explained earlier. Afterwards adjust the build configuration to the
+   new codebase using olddefconfig, which will now adjust the configuration file
+   you prepared earlier using localmodconfig  (~/linux/.config) for your next
+   kernel::
 
      # reminder: if you want to apply patches, do it at this point
      # reminder: you might want to update your build tag at this point
      make olddefconfig
+
+   Now build your kernel::
+
      make -j $(nproc --all)
 
-   Install the kernel as outlined above::
+   Afterwards install the kernel as outlined above::
 
      command -v installkernel && sudo make modules_install install
 
@@ -584,11 +589,11 @@ versions and individual commits at hand at any time::
     curl -L \
       https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/clone.bundle \
       -o linux-stable.git.bundle
-    git clone clone.bundle ~/linux/
+    git clone linux-stable.git.bundle ~/linux/
     rm linux-stable.git.bundle
     cd ~/linux/
-    git remote set-url origin
-    https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
+    git remote set-url origin \
+      https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
     git fetch origin
     git checkout --detach origin/master
 
index 1029531..9fea696 100644 (file)
@@ -18,7 +18,6 @@ Block
    kyber-iosched
    null_blk
    pr
-   request
    stat
    switching-sched
    writeback_cache_control
diff --git a/Documentation/block/request.rst b/Documentation/block/request.rst
deleted file mode 100644 (file)
index 747021e..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-============================
-struct request documentation
-============================
-
-Jens Axboe <jens.axboe@oracle.com> 27/05/02
-
-
-.. FIXME:
-   No idea about what does mean - seems just some noise, so comment it
-
-   1.0
-   Index
-
-   2.0 Struct request members classification
-
-       2.1 struct request members explanation
-
-   3.0
-
-
-   2.0
-
-
-
-Short explanation of request members
-====================================
-
-Classification flags:
-
-       =       ====================
-       D       driver member
-       B       block layer member
-       I       I/O scheduler member
-       =       ====================
-
-Unless an entry contains a D classification, a device driver must not access
-this member. Some members may contain D classifications, but should only be
-access through certain macros or functions (eg ->flags).
-
-<linux/blkdev.h>
-
-=============================== ======= =======================================
-Member                         Flag    Comment
-=============================== ======= =======================================
-struct list_head queuelist     BI      Organization on various internal
-                                       queues
-
-``void *elevator_private``     I       I/O scheduler private data
-
-unsigned char cmd[16]          D       Driver can use this for setting up
-                                       a cdb before execution, see
-                                       blk_queue_prep_rq
-
-unsigned long flags            DBI     Contains info about data direction,
-                                       request type, etc.
-
-int rq_status                  D       Request status bits
-
-kdev_t rq_dev                  DBI     Target device
-
-int errors                     DB      Error counts
-
-sector_t sector                        DBI     Target location
-
-unsigned long hard_nr_sectors  B       Used to keep sector sane
-
-unsigned long nr_sectors       DBI     Total number of sectors in request
-
-unsigned long hard_nr_sectors  B       Used to keep nr_sectors sane
-
-unsigned short nr_phys_segments        DB      Number of physical scatter gather
-                                       segments in a request
-
-unsigned short nr_hw_segments  DB      Number of hardware scatter gather
-                                       segments in a request
-
-unsigned int current_nr_sectors        DB      Number of sectors in first segment
-                                       of request
-
-unsigned int hard_cur_sectors  B       Used to keep current_nr_sectors sane
-
-int tag                                DB      TCQ tag, if assigned
-
-``void *special``              D       Free to be used by driver
-
-``char *buffer``               D       Map of first segment, also see
-                                       section on bouncing SECTION
-
-``struct completion *waiting`` D       Can be used by driver to get signalled
-                                       on request completion
-
-``struct bio *bio``            DBI     First bio in request
-
-``struct bio *biotail``                DBI     Last bio in request
-
-``struct request_queue *q``    DB      Request queue this request belongs to
-
-``struct request_list *rl``    B       Request list this request came from
-=============================== ======= =======================================
index e87a878..e9b022d 100644 (file)
@@ -1,8 +1,8 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-=====
-cdrom
-=====
+======
+CD-ROM
+======
 
 .. toctree::
     :maxdepth: 1
index 9b31f86..71364c6 100644 (file)
@@ -32,7 +32,7 @@ properties:
     maxItems: 1
 
   iommus:
-    maxItems: 1
+    maxItems: 4
 
   power-domains:
     maxItems: 1
index e6c1ebf..130e16d 100644 (file)
@@ -82,6 +82,18 @@ properties:
       Indicates if the DSI controller is driving a panel which needs
       2 DSI links.
 
+  qcom,master-dsi:
+    type: boolean
+    description: |
+      Indicates if the DSI controller is the master DSI controller when
+      qcom,dual-dsi-mode enabled.
+
+  qcom,sync-dual-dsi:
+    type: boolean
+    description: |
+      Indicates if the DSI controller needs to sync the other DSI controller
+      with MIPI DCS commands when qcom,dual-dsi-mode enabled.
+
   assigned-clocks:
     minItems: 2
     maxItems: 4
index 8b38931..e2ffe0a 100644 (file)
@@ -49,6 +49,7 @@ properties:
 
         properties:
           data-lanes:
+            minItems: 1
             maxItems: 2
 
         required:
index 769fa5c..de1d429 100644 (file)
@@ -21,11 +21,22 @@ properties:
 
   st,can-primary:
     description:
-      Primary and secondary mode of the bxCAN peripheral is only relevant
-      if the chip has two CAN peripherals. In that case they share some
-      of the required logic.
+      Primary mode of the bxCAN peripheral is only relevant if the chip has
+      two CAN peripherals in dual CAN configuration. In that case they share
+      some of the required logic.
+      Not to be used if the peripheral is in single CAN configuration.
       To avoid misunderstandings, it should be noted that ST documentation
-      uses the terms master/slave instead of primary/secondary.
+      uses the terms master instead of primary.
+    type: boolean
+
+  st,can-secondary:
+    description:
+      Secondary mode of the bxCAN peripheral is only relevant if the chip
+      has two CAN peripherals in dual CAN configuration. In that case they
+      share some of the required logic.
+      Not to be used if the peripheral is in single CAN configuration.
+      To avoid misunderstandings, it should be noted that ST documentation
+      uses the terms slave instead of secondary.
     type: boolean
 
   reg:
index 9bff8ec..d91b639 100644 (file)
@@ -17,20 +17,11 @@ description:
 properties:
   clocks:
     minItems: 3
-    items:
-      - description: PCIe bridge clock.
-      - description: PCIe bus clock.
-      - description: PCIe PHY clock.
-      - description: Additional required clock entry for imx6sx-pcie,
-           imx6sx-pcie-ep, imx8mq-pcie, imx8mq-pcie-ep.
+    maxItems: 4
 
   clock-names:
     minItems: 3
-    items:
-      - const: pcie
-      - const: pcie_bus
-      - enum: [ pcie_phy, pcie_aux ]
-      - enum: [ pcie_inbound_axi, pcie_aux ]
+    maxItems: 4
 
   num-lanes:
     const: 1
index f4a328e..ee155ed 100644 (file)
@@ -31,6 +31,19 @@ properties:
       - const: dbi
       - const: addr_space
 
+  clocks:
+    minItems: 3
+    items:
+      - description: PCIe bridge clock.
+      - description: PCIe bus clock.
+      - description: PCIe PHY clock.
+      - description: Additional required clock entry for imx6sx-pcie,
+           imx6sx-pcie-ep, imx8mq-pcie, imx8mq-pcie-ep.
+
+  clock-names:
+    minItems: 3
+    maxItems: 4
+
   interrupts:
     items:
       - description: builtin eDMA interrupter.
@@ -49,6 +62,31 @@ required:
 allOf:
   - $ref: /schemas/pci/snps,dw-pcie-ep.yaml#
   - $ref: /schemas/pci/fsl,imx6q-pcie-common.yaml#
+  - if:
+      properties:
+        compatible:
+          enum:
+            - fsl,imx8mq-pcie-ep
+    then:
+      properties:
+        clocks:
+          minItems: 4
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_phy
+            - const: pcie_aux
+    else:
+      properties:
+        clocks:
+          maxItems: 3
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_aux
+
 
 unevaluatedProperties: false
 
index 2443641..81bbb87 100644 (file)
@@ -40,6 +40,19 @@ properties:
       - const: dbi
       - const: config
 
+  clocks:
+    minItems: 3
+    items:
+      - description: PCIe bridge clock.
+      - description: PCIe bus clock.
+      - description: PCIe PHY clock.
+      - description: Additional required clock entry for imx6sx-pcie,
+           imx6sx-pcie-ep, imx8mq-pcie, imx8mq-pcie-ep.
+
+  clock-names:
+    minItems: 3
+    maxItems: 4
+
   interrupts:
     items:
       - description: builtin MSI controller.
@@ -77,6 +90,70 @@ required:
 allOf:
   - $ref: /schemas/pci/snps,dw-pcie.yaml#
   - $ref: /schemas/pci/fsl,imx6q-pcie-common.yaml#
+  - if:
+      properties:
+        compatible:
+          enum:
+            - fsl,imx6sx-pcie
+    then:
+      properties:
+        clocks:
+          minItems: 4
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_phy
+            - const: pcie_inbound_axi
+
+  - if:
+      properties:
+        compatible:
+          enum:
+            - fsl,imx8mq-pcie
+    then:
+      properties:
+        clocks:
+          minItems: 4
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_phy
+            - const: pcie_aux
+
+  - if:
+      properties:
+        compatible:
+          enum:
+            - fsl,imx6q-pcie
+            - fsl,imx6qp-pcie
+            - fsl,imx7d-pcie
+    then:
+      properties:
+        clocks:
+          maxItems: 3
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_phy
+
+  - if:
+      properties:
+        compatible:
+          enum:
+            - fsl,imx8mm-pcie
+            - fsl,imx8mp-pcie
+    then:
+      properties:
+        clocks:
+          maxItems: 3
+        clock-names:
+          items:
+            - const: pcie
+            - const: pcie_bus
+            - const: pcie_aux
 
 unevaluatedProperties: false
 
index a5bb561..31a3024 100644 (file)
@@ -55,7 +55,9 @@ properties:
     description: TDM TX current sense time slot.
 
   '#sound-dai-cells':
-    const: 1
+    # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
+    # compatibility but is deprecated.
+    enum: [0, 1]
 
 required:
   - compatible
@@ -72,7 +74,7 @@ examples:
      codec: codec@4c {
        compatible = "ti,tas2562";
        reg = <0x4c>;
-       #sound-dai-cells = <1>;
+       #sound-dai-cells = <0>;
        interrupt-parent = <&gpio1>;
        interrupts = <14>;
        shutdown-gpios = <&gpio1 15 0>;
index 26088ad..8908bf1 100644 (file)
@@ -57,7 +57,9 @@ properties:
       - 1 # Falling edge
 
   '#sound-dai-cells':
-    const: 1
+    # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
+    # compatibility but is deprecated.
+    enum: [0, 1]
 
 required:
   - compatible
@@ -74,7 +76,7 @@ examples:
      codec: codec@41 {
        compatible = "ti,tas2770";
        reg = <0x41>;
-       #sound-dai-cells = <1>;
+       #sound-dai-cells = <0>;
        interrupt-parent = <&gpio1>;
        interrupts = <14>;
        reset-gpio = <&gpio1 15 0>;
index 8cba013..a876545 100644 (file)
@@ -50,7 +50,9 @@ properties:
     description: TDM TX voltage sense time slot.
 
   '#sound-dai-cells':
-    const: 1
+    # The codec has a single DAI, the #sound-dai-cells=<1>; case is left in for backward
+    # compatibility but is deprecated.
+    enum: [0, 1]
 
 required:
   - compatible
@@ -67,7 +69,7 @@ examples:
      codec: codec@38 {
        compatible = "ti,tas2764";
        reg = <0x38>;
-       #sound-dai-cells = <1>;
+       #sound-dai-cells = <0>;
        interrupt-parent = <&gpio1>;
        interrupts = <14>;
        reset-gpios = <&gpio1 15 0>;
index 1649606..447f767 100644 (file)
@@ -6,8 +6,7 @@ Ramfs, rootfs and initramfs
 
 October 17, 2005
 
-Rob Landley <rob@landley.net>
-=============================
+:Author: Rob Landley <rob@landley.net>
 
 What is ramfs?
 --------------
index d833953..1cf5648 100644 (file)
@@ -147,6 +147,7 @@ replicas continue to be exactly same.
 
 
 3) Setting mount states
+-----------------------
 
        The mount command (util-linux package) can be used to set mount
        states::
@@ -612,6 +613,7 @@ replicas continue to be exactly same.
 
 
 6) Quiz
+-------
 
        A. What is the result of the following command sequence?
 
@@ -673,6 +675,7 @@ replicas continue to be exactly same.
                /mnt/1/test be?
 
 7) FAQ
+------
 
        Q1. Why is bind mount needed? How is it different from symbolic links?
                symbolic links can get stale if the destination mount gets
@@ -841,6 +844,7 @@ replicas continue to be exactly same.
                             tmp  usr tmp usr tmp usr
 
 8) Implementation
+-----------------
 
 8A) Datastructure
 
index f80f956..43c9688 100644 (file)
@@ -1,7 +1,7 @@
 .. SPDX-License-Identifier: GPL-2.0
 
 ====
-fpga
+FPGA
 ====
 
 .. toctree::
index 7003bd5..6a9ea96 100644 (file)
@@ -1,7 +1,7 @@
 .. SPDX-License-Identifier: GPL-2.0
 
 =======
-locking
+Locking
 =======
 
 .. toctree::
index adc4bf4..28925e1 100644 (file)
@@ -776,10 +776,11 @@ peer_notif_delay
        Specify the delay, in milliseconds, between each peer
        notification (gratuitous ARP and unsolicited IPv6 Neighbor
        Advertisement) when they are issued after a failover event.
-       This delay should be a multiple of the link monitor interval
-       (arp_interval or miimon, whichever is active). The default
-       value is 0 which means to match the value of the link monitor
-       interval.
+       This delay should be a multiple of the MII link monitor interval
+       (miimon).
+
+       The valid range is 0 - 300000. The default value is 0, which means
+       to match the value of the MII link monitor interval.
 
 prio
        Slave priority. A higher number means higher priority.
index a164ff0..5b75c3f 100644 (file)
@@ -116,8 +116,8 @@ Contents:
    udplite
    vrf
    vxlan
-   x25-iface
    x25
+   x25-iface
    xfrm_device
    xfrm_proc
    xfrm_sync
index f34e9ec..285cefc 100644 (file)
@@ -1,8 +1,7 @@
 .. SPDX-License-Identifier: GPL-2.0
 
-============================-
 X.25 Device Driver Interface
-============================-
+============================
 
 Version 1.1
 
index 7ae1f62..8067236 100644 (file)
@@ -1,7 +1,7 @@
 .. SPDX-License-Identifier: GPL-2.0
 
 ======
-pcmcia
+PCMCIA
 ======
 
 .. toctree::
index d46e98c..bb3f4c4 100644 (file)
@@ -551,7 +551,6 @@ These are the steps:
    * IOMMU_SUPPORT
    * S390
    * ZCRYPT
-   * S390_AP_IOMMU
    * VFIO
    * KVM
 
index 8a6860f..7542220 100644 (file)
@@ -1,5 +1,5 @@
 =================================
-brief tutorial on CRC computation
+Brief tutorial on CRC computation
 =================================
 
 A CRC is a long-division remainder.  You add the CRC to the message,
index df510ad..983f91f 100644 (file)
@@ -1,7 +1,7 @@
 .. SPDX-License-Identifier: GPL-2.0
 
 ======
-timers
+Timers
 ======
 
 .. toctree::
index 7e0b87d..27ef116 100644 (file)
@@ -273,8 +273,8 @@ ABI/API
 L:     linux-api@vger.kernel.org
 F:     include/linux/syscalls.h
 F:     kernel/sys_ni.c
-X:     include/uapi/
 X:     arch/*/include/uapi/
+X:     include/uapi/
 
 ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
 M:     Hans de Goede <hdegoede@redhat.com>
@@ -406,12 +406,6 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     drivers/acpi/arm64
 
-ACPI SERIAL MULTI INSTANTIATE DRIVER
-M:     Hans de Goede <hdegoede@redhat.com>
-L:     platform-driver-x86@vger.kernel.org
-S:     Maintained
-F:     drivers/platform/x86/serial-multi-instantiate.c
-
 ACPI PCC(Platform Communication Channel) MAILBOX DRIVER
 M:     Sudeep Holla <sudeep.holla@arm.com>
 L:     linux-acpi@vger.kernel.org
@@ -430,6 +424,12 @@ B: https://bugzilla.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
 F:     drivers/acpi/pmic/
 
+ACPI SERIAL MULTI INSTANTIATE DRIVER
+M:     Hans de Goede <hdegoede@redhat.com>
+L:     platform-driver-x86@vger.kernel.org
+S:     Maintained
+F:     drivers/platform/x86/serial-multi-instantiate.c
+
 ACPI THERMAL DRIVER
 M:     Rafael J. Wysocki <rafael@kernel.org>
 R:     Zhang Rui <rui.zhang@intel.com>
@@ -823,6 +823,13 @@ L: linux-crypto@vger.kernel.org
 S:     Maintained
 F:     drivers/crypto/allwinner/
 
+ALLWINNER DMIC DRIVERS
+M:     Ban Tao <fengzheng923@gmail.com>
+L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/sound/allwinner,sun50i-h6-dmic.yaml
+F:     sound/soc/sunxi/sun50i-dmic.c
+
 ALLWINNER HARDWARE SPINLOCK SUPPORT
 M:     Wilken Gottwalt <wilken.gottwalt@posteo.net>
 S:     Maintained
@@ -844,13 +851,6 @@ L: linux-media@vger.kernel.org
 S:     Maintained
 F:     drivers/staging/media/sunxi/cedrus/
 
-ALLWINNER DMIC DRIVERS
-M:     Ban Tao <fengzheng923@gmail.com>
-L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
-S:     Maintained
-F:     Documentation/devicetree/bindings/sound/allwinner,sun50i-h6-dmic.yaml
-F:     sound/soc/sunxi/sun50i-dmic.c
-
 ALPHA PORT
 M:     Richard Henderson <richard.henderson@linaro.org>
 M:     Ivan Kokshaysky <ink@jurassic.park.msu.ru>
@@ -1026,6 +1026,16 @@ F:       drivers/char/hw_random/geode-rng.c
 F:     drivers/crypto/geode*
 F:     drivers/video/fbdev/geode/
 
+AMD HSMP DRIVER
+M:     Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
+R:     Carlos Bilbao <carlos.bilbao@amd.com>
+L:     platform-driver-x86@vger.kernel.org
+S:     Maintained
+F:     Documentation/arch/x86/amd_hsmp.rst
+F:     arch/x86/include/asm/amd_hsmp.h
+F:     arch/x86/include/uapi/asm/amd_hsmp.h
+F:     drivers/platform/x86/amd/hsmp.c
+
 AMD IOMMU (AMD-VI)
 M:     Joerg Roedel <joro@8bytes.org>
 R:     Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
@@ -1049,6 +1059,13 @@ F:       drivers/gpu/drm/amd/include/vi_structs.h
 F:     include/uapi/linux/kfd_ioctl.h
 F:     include/uapi/linux/kfd_sysfs.h
 
+AMD MP2 I2C DRIVER
+M:     Elie Morisse <syniurge@gmail.com>
+M:     Shyam Sundar S K <shyam-sundar.s-k@amd.com>
+L:     linux-i2c@vger.kernel.org
+S:     Maintained
+F:     drivers/i2c/busses/i2c-amd-mp2*
+
 AMD PDS CORE DRIVER
 M:     Shannon Nelson <shannon.nelson@amd.com>
 M:     Brett Creeley <brett.creeley@amd.com>
@@ -1058,18 +1075,6 @@ F:       Documentation/networking/device_drivers/ethernet/amd/pds_core.rst
 F:     drivers/net/ethernet/amd/pds_core/
 F:     include/linux/pds/
 
-AMD SPI DRIVER
-M:     Sanjay R Mehta <sanju.mehta@amd.com>
-S:     Maintained
-F:     drivers/spi/spi-amd.c
-
-AMD MP2 I2C DRIVER
-M:     Elie Morisse <syniurge@gmail.com>
-M:     Shyam Sundar S K <shyam-sundar.s-k@amd.com>
-L:     linux-i2c@vger.kernel.org
-S:     Maintained
-F:     drivers/i2c/busses/i2c-amd-mp2*
-
 AMD PMC DRIVER
 M:     Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
 L:     platform-driver-x86@vger.kernel.org
@@ -1083,16 +1088,6 @@ S:       Maintained
 F:     Documentation/ABI/testing/sysfs-amd-pmf
 F:     drivers/platform/x86/amd/pmf/
 
-AMD HSMP DRIVER
-M:     Naveen Krishna Chatradhi <naveenkrishna.chatradhi@amd.com>
-R:     Carlos Bilbao <carlos.bilbao@amd.com>
-L:     platform-driver-x86@vger.kernel.org
-S:     Maintained
-F:     Documentation/arch/x86/amd_hsmp.rst
-F:     arch/x86/include/asm/amd_hsmp.h
-F:     arch/x86/include/uapi/asm/amd_hsmp.h
-F:     drivers/platform/x86/amd/hsmp.c
-
 AMD POWERPLAY AND SWSMU
 M:     Evan Quan <evan.quan@amd.com>
 L:     amd-gfx@lists.freedesktop.org
@@ -1121,13 +1116,6 @@ M:       Tom Lendacky <thomas.lendacky@amd.com>
 S:     Supported
 F:     arch/arm64/boot/dts/amd/
 
-AMD XGBE DRIVER
-M:     "Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>
-L:     netdev@vger.kernel.org
-S:     Supported
-F:     arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
-F:     drivers/net/ethernet/amd/xgbe/
-
 AMD SENSOR FUSION HUB DRIVER
 M:     Basavaraj Natikar <basavaraj.natikar@amd.com>
 L:     linux-input@vger.kernel.org
@@ -1135,6 +1123,18 @@ S:       Maintained
 F:     Documentation/hid/amd-sfh*
 F:     drivers/hid/amd-sfh-hid/
 
+AMD SPI DRIVER
+M:     Sanjay R Mehta <sanju.mehta@amd.com>
+S:     Maintained
+F:     drivers/spi/spi-amd.c
+
+AMD XGBE DRIVER
+M:     "Shyam Sundar S K" <Shyam-sundar.S-k@amd.com>
+L:     netdev@vger.kernel.org
+S:     Supported
+F:     arch/arm64/boot/dts/amd/amd-seattle-xgbe*.dtsi
+F:     drivers/net/ethernet/amd/xgbe/
+
 AMLOGIC DDR PMU DRIVER
 M:     Jiucheng Xu <jiucheng.xu@amlogic.com>
 L:     linux-amlogic@lists.infradead.org
@@ -1169,6 +1169,14 @@ T:       git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
 F:     drivers/net/amt.c
 
+ANALOG DEVICES INC AD3552R DRIVER
+M:     Nuno Sá <nuno.sa@analog.com>
+L:     linux-iio@vger.kernel.org
+S:     Supported
+W:     https://ez.analog.com/linux-software-drivers
+F:     Documentation/devicetree/bindings/iio/dac/adi,ad3552r.yaml
+F:     drivers/iio/dac/ad3552r.c
+
 ANALOG DEVICES INC AD4130 DRIVER
 M:     Cosmin Tanislav <cosmin.tanislav@analog.com>
 L:     linux-iio@vger.kernel.org
@@ -1194,14 +1202,6 @@ W:       https://ez.analog.com/linux-software-drivers
 F:     Documentation/devicetree/bindings/iio/adc/adi,ad7292.yaml
 F:     drivers/iio/adc/ad7292.c
 
-ANALOG DEVICES INC AD3552R DRIVER
-M:     Nuno Sá <nuno.sa@analog.com>
-L:     linux-iio@vger.kernel.org
-S:     Supported
-W:     https://ez.analog.com/linux-software-drivers
-F:     Documentation/devicetree/bindings/iio/dac/adi,ad3552r.yaml
-F:     drivers/iio/dac/ad3552r.c
-
 ANALOG DEVICES INC AD7293 DRIVER
 M:     Antoniu Miclaus <antoniu.miclaus@analog.com>
 L:     linux-iio@vger.kernel.org
@@ -1210,23 +1210,6 @@ W:       https://ez.analog.com/linux-software-drivers
 F:     Documentation/devicetree/bindings/iio/dac/adi,ad7293.yaml
 F:     drivers/iio/dac/ad7293.c
 
-ANALOG DEVICES INC AD7768-1 DRIVER
-M:     Michael Hennerich <Michael.Hennerich@analog.com>
-L:     linux-iio@vger.kernel.org
-S:     Supported
-W:     https://ez.analog.com/linux-software-drivers
-F:     Documentation/devicetree/bindings/iio/adc/adi,ad7768-1.yaml
-F:     drivers/iio/adc/ad7768-1.c
-
-ANALOG DEVICES INC AD7780 DRIVER
-M:     Michael Hennerich <Michael.Hennerich@analog.com>
-M:     Renato Lui Geh <renatogeh@gmail.com>
-L:     linux-iio@vger.kernel.org
-S:     Supported
-W:     https://ez.analog.com/linux-software-drivers
-F:     Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
-F:     drivers/iio/adc/ad7780.c
-
 ANALOG DEVICES INC AD74115 DRIVER
 M:     Cosmin Tanislav <cosmin.tanislav@analog.com>
 L:     linux-iio@vger.kernel.org
@@ -1244,6 +1227,23 @@ F:       Documentation/devicetree/bindings/iio/addac/adi,ad74413r.yaml
 F:     drivers/iio/addac/ad74413r.c
 F:     include/dt-bindings/iio/addac/adi,ad74413r.h
 
+ANALOG DEVICES INC AD7768-1 DRIVER
+M:     Michael Hennerich <Michael.Hennerich@analog.com>
+L:     linux-iio@vger.kernel.org
+S:     Supported
+W:     https://ez.analog.com/linux-software-drivers
+F:     Documentation/devicetree/bindings/iio/adc/adi,ad7768-1.yaml
+F:     drivers/iio/adc/ad7768-1.c
+
+ANALOG DEVICES INC AD7780 DRIVER
+M:     Michael Hennerich <Michael.Hennerich@analog.com>
+M:     Renato Lui Geh <renatogeh@gmail.com>
+L:     linux-iio@vger.kernel.org
+S:     Supported
+W:     https://ez.analog.com/linux-software-drivers
+F:     Documentation/devicetree/bindings/iio/adc/adi,ad7780.yaml
+F:     drivers/iio/adc/ad7780.c
+
 ANALOG DEVICES INC ADA4250 DRIVER
 M:     Antoniu Miclaus <antoniu.miclaus@analog.com>
 L:     linux-iio@vger.kernel.org
@@ -1294,10 +1294,10 @@ F:      drivers/iio/imu/adis16460.c
 ANALOG DEVICES INC ADIS16475 DRIVER
 M:     Nuno Sa <nuno.sa@analog.com>
 L:     linux-iio@vger.kernel.org
-W:     https://ez.analog.com/linux-software-drivers
 S:     Supported
-F:     drivers/iio/imu/adis16475.c
+W:     https://ez.analog.com/linux-software-drivers
 F:     Documentation/devicetree/bindings/iio/imu/adi,adis16475.yaml
+F:     drivers/iio/imu/adis16475.c
 
 ANALOG DEVICES INC ADM1177 DRIVER
 M:     Michael Hennerich <Michael.Hennerich@analog.com>
@@ -1315,21 +1315,21 @@ W:      https://ez.analog.com/linux-software-drivers
 F:     Documentation/devicetree/bindings/iio/frequency/adi,admv1013.yaml
 F:     drivers/iio/frequency/admv1013.c
 
-ANALOG DEVICES INC ADMV8818 DRIVER
+ANALOG DEVICES INC ADMV1014 DRIVER
 M:     Antoniu Miclaus <antoniu.miclaus@analog.com>
 L:     linux-iio@vger.kernel.org
 S:     Supported
 W:     https://ez.analog.com/linux-software-drivers
-F:     Documentation/devicetree/bindings/iio/filter/adi,admv8818.yaml
-F:     drivers/iio/filter/admv8818.c
+F:     Documentation/devicetree/bindings/iio/frequency/adi,admv1014.yaml
+F:     drivers/iio/frequency/admv1014.c
 
-ANALOG DEVICES INC ADMV1014 DRIVER
+ANALOG DEVICES INC ADMV8818 DRIVER
 M:     Antoniu Miclaus <antoniu.miclaus@analog.com>
 L:     linux-iio@vger.kernel.org
 S:     Supported
 W:     https://ez.analog.com/linux-software-drivers
-F:     Documentation/devicetree/bindings/iio/frequency/adi,admv1014.yaml
-F:     drivers/iio/frequency/admv1014.c
+F:     Documentation/devicetree/bindings/iio/filter/adi,admv8818.yaml
+F:     drivers/iio/filter/admv8818.c
 
 ANALOG DEVICES INC ADP5061 DRIVER
 M:     Michael Hennerich <Michael.Hennerich@analog.com>
@@ -1351,8 +1351,8 @@ M:        Lars-Peter Clausen <lars@metafoo.de>
 L:     linux-media@vger.kernel.org
 S:     Supported
 W:     https://ez.analog.com/linux-software-drivers
-F:     drivers/media/i2c/adv7180.c
 F:     Documentation/devicetree/bindings/media/i2c/adv7180.yaml
+F:     drivers/media/i2c/adv7180.c
 
 ANALOG DEVICES INC ADV748X DRIVER
 M:     Kieran Bingham <kieran.bingham@ideasonboard.com>
@@ -1371,8 +1371,8 @@ ANALOG DEVICES INC ADV7604 DRIVER
 M:     Hans Verkuil <hverkuil-cisco@xs4all.nl>
 L:     linux-media@vger.kernel.org
 S:     Maintained
-F:     drivers/media/i2c/adv7604*
 F:     Documentation/devicetree/bindings/media/i2c/adv7604.yaml
+F:     drivers/media/i2c/adv7604*
 
 ANALOG DEVICES INC ADV7842 DRIVER
 M:     Hans Verkuil <hverkuil-cisco@xs4all.nl>
@@ -1384,8 +1384,8 @@ ANALOG DEVICES INC ADXRS290 DRIVER
 M:     Nishant Malpani <nish.malpani25@gmail.com>
 L:     linux-iio@vger.kernel.org
 S:     Supported
-F:     drivers/iio/gyro/adxrs290.c
 F:     Documentation/devicetree/bindings/iio/gyroscope/adi,adxrs290.yaml
+F:     drivers/iio/gyro/adxrs290.c
 
 ANALOG DEVICES INC ASOC CODEC DRIVERS
 M:     Lars-Peter Clausen <lars@metafoo.de>
@@ -1625,6 +1625,17 @@ S:       Maintained
 F:     drivers/net/arcnet/
 F:     include/uapi/linux/if_arcnet.h
 
+ARM AND ARM64 SoC SUB-ARCHITECTURES (COMMON PARTS)
+M:     Arnd Bergmann <arnd@arndb.de>
+M:     Olof Johansson <olof@lixom.net>
+M:     soc@kernel.org
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+C:     irc://irc.libera.chat/armlinux
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
+F:     arch/arm/boot/dts/Makefile
+F:     arch/arm64/boot/dts/Makefile
+
 ARM ARCHITECTED TIMER DRIVER
 M:     Mark Rutland <mark.rutland@arm.com>
 M:     Marc Zyngier <maz@kernel.org>
@@ -1666,10 +1677,7 @@ F:       drivers/power/reset/arm-versatile-reboot.c
 F:     drivers/soc/versatile/
 
 ARM KOMEDA DRM-KMS DRIVER
-M:     James (Qian) Wang <james.qian.wang@arm.com>
 M:     Liviu Dudau <liviu.dudau@arm.com>
-M:     Mihail Atanassov <mihail.atanassov@arm.com>
-L:     Mali DP Maintainers <malidp@foss.arm.com>
 S:     Supported
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/arm,komeda.yaml
@@ -1690,8 +1698,6 @@ F:        include/uapi/drm/panfrost_drm.h
 
 ARM MALI-DP DRM DRIVER
 M:     Liviu Dudau <liviu.dudau@arm.com>
-M:     Brian Starkey <brian.starkey@arm.com>
-L:     Mali DP Maintainers <malidp@foss.arm.com>
 S:     Supported
 T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/arm,malidp.yaml
@@ -1738,22 +1744,6 @@ S:       Odd Fixes
 F:     drivers/amba/
 F:     include/linux/amba/bus.h
 
-ARM PRIMECELL PL35X NAND CONTROLLER DRIVER
-M:     Miquel Raynal <miquel.raynal@bootlin.com>
-M:     Naga Sureshkumar Relli <nagasure@xilinx.com>
-L:     linux-mtd@lists.infradead.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/mtd/arm,pl353-nand-r2p1.yaml
-F:     drivers/mtd/nand/raw/pl35x-nand-controller.c
-
-ARM PRIMECELL PL35X SMC DRIVER
-M:     Miquel Raynal <miquel.raynal@bootlin.com>
-M:     Naga Sureshkumar Relli <nagasure@xilinx.com>
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     Maintained
-F:     Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
-F:     drivers/memory/pl353-smc.c
-
 ARM PRIMECELL CLCD PL110 DRIVER
 M:     Russell King <linux@armlinux.org.uk>
 S:     Odd Fixes
@@ -1771,6 +1761,22 @@ S:       Odd Fixes
 F:     drivers/mmc/host/mmci.*
 F:     include/linux/amba/mmci.h
 
+ARM PRIMECELL PL35X NAND CONTROLLER DRIVER
+M:     Miquel Raynal <miquel.raynal@bootlin.com>
+M:     Naga Sureshkumar Relli <nagasure@xilinx.com>
+L:     linux-mtd@lists.infradead.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/mtd/arm,pl353-nand-r2p1.yaml
+F:     drivers/mtd/nand/raw/pl35x-nand-controller.c
+
+ARM PRIMECELL PL35X SMC DRIVER
+M:     Miquel Raynal <miquel.raynal@bootlin.com>
+M:     Naga Sureshkumar Relli <nagasure@xilinx.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/memory-controllers/arm,pl35x-smc.yaml
+F:     drivers/memory/pl353-smc.c
+
 ARM PRIMECELL SSP PL022 SPI DRIVER
 M:     Linus Walleij <linus.walleij@linaro.org>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -1807,17 +1813,6 @@ F:       Documentation/devicetree/bindings/iommu/arm,smmu*
 F:     drivers/iommu/arm/
 F:     drivers/iommu/io-pgtable-arm*
 
-ARM AND ARM64 SoC SUB-ARCHITECTURES (COMMON PARTS)
-M:     Arnd Bergmann <arnd@arndb.de>
-M:     Olof Johansson <olof@lixom.net>
-M:     soc@kernel.org
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     Maintained
-C:     irc://irc.libera.chat/armlinux
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc.git
-F:     arch/arm/boot/dts/Makefile
-F:     arch/arm64/boot/dts/Makefile
-
 ARM SUB-ARCHITECTURES
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
@@ -1869,9 +1864,9 @@ M:        Chen-Yu Tsai <wens@csie.org>
 M:     Jernej Skrabec <jernej.skrabec@gmail.com>
 M:     Samuel Holland <samuel@sholland.org>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+L:     linux-sunxi@lists.linux.dev
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git
-L:     linux-sunxi@lists.linux.dev
 F:     arch/arm/mach-sunxi/
 F:     arch/arm64/boot/dts/allwinner/
 F:     drivers/clk/sunxi-ng/
@@ -1934,6 +1929,15 @@ F:       arch/arm/mach-alpine/
 F:     arch/arm64/boot/dts/amazon/
 F:     drivers/*/*alpine*
 
+ARM/APPLE MACHINE SOUND DRIVERS
+M:     Martin PoviÅ¡er <povik+lin@cutebit.org>
+L:     asahi@lists.linux.dev
+L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/sound/apple,*
+F:     sound/soc/apple/*
+F:     sound/soc/codecs/cs42l83-i2c.c
+
 ARM/APPLE MACHINE SUPPORT
 M:     Hector Martin <marcan@marcan.st>
 M:     Sven Peter <sven@svenpeter.dev>
@@ -1961,7 +1965,7 @@ F:        Documentation/devicetree/bindings/nvmem/apple,efuses.yaml
 F:     Documentation/devicetree/bindings/pci/apple,pcie.yaml
 F:     Documentation/devicetree/bindings/pinctrl/apple,pinctrl.yaml
 F:     Documentation/devicetree/bindings/power/apple*
-F:     Documentation/devicetree/bindings/pwm/pwm-apple.yaml
+F:     Documentation/devicetree/bindings/pwm/apple,s5l-fpwm.yaml
 F:     Documentation/devicetree/bindings/watchdog/apple,wdt.yaml
 F:     arch/arm64/boot/dts/apple/
 F:     drivers/bluetooth/hci_bcm4377.c
@@ -1985,15 +1989,6 @@ F:       include/dt-bindings/pinctrl/apple.h
 F:     include/linux/apple-mailbox.h
 F:     include/linux/soc/apple/*
 
-ARM/APPLE MACHINE SOUND DRIVERS
-M:     Martin PoviÅ¡er <povik+lin@cutebit.org>
-L:     asahi@lists.linux.dev
-L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
-S:     Maintained
-F:     Documentation/devicetree/bindings/sound/apple,*
-F:     sound/soc/apple/*
-F:     sound/soc/codecs/cs42l83-i2c.c
-
 ARM/ARTPEC MACHINE SUPPORT
 M:     Jesper Nilsson <jesper.nilsson@axis.com>
 M:     Lars Persson <lars.persson@axis.com>
@@ -2109,19 +2104,19 @@ S:      Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/coresight/linux.git
 F:     Documentation/ABI/testing/sysfs-bus-coresight-devices-*
 F:     Documentation/devicetree/bindings/arm/arm,coresight-*.yaml
-F:     Documentation/devicetree/bindings/arm/qcom,coresight-*.yaml
 F:     Documentation/devicetree/bindings/arm/arm,embedded-trace-extension.yaml
 F:     Documentation/devicetree/bindings/arm/arm,trace-buffer-extension.yaml
+F:     Documentation/devicetree/bindings/arm/qcom,coresight-*.yaml
 F:     Documentation/trace/coresight/*
 F:     drivers/hwtracing/coresight/*
 F:     include/dt-bindings/arm/coresight-cti-dt.h
 F:     include/linux/coresight*
 F:     samples/coresight/*
-F:     tools/perf/tests/shell/coresight/*
 F:     tools/perf/arch/arm/util/auxtrace.c
 F:     tools/perf/arch/arm/util/cs-etm.c
 F:     tools/perf/arch/arm/util/cs-etm.h
 F:     tools/perf/arch/arm/util/pmu.c
+F:     tools/perf/tests/shell/coresight/*
 F:     tools/perf/util/cs-etm-decoder/*
 F:     tools/perf/util/cs-etm.*
 
@@ -2156,9 +2151,9 @@ F:        Documentation/devicetree/bindings/leds/cznic,turris-omnia-leds.yaml
 F:     Documentation/devicetree/bindings/watchdog/armada-37xx-wdt.txt
 F:     drivers/bus/moxtet.c
 F:     drivers/firmware/turris-mox-rwtm.c
+F:     drivers/gpio/gpio-moxtet.c
 F:     drivers/leds/leds-turris-omnia.c
 F:     drivers/mailbox/armada-37xx-rwtm-mailbox.c
-F:     drivers/gpio/gpio-moxtet.c
 F:     drivers/watchdog/armada_37xx_wdt.c
 F:     include/dt-bindings/bus/moxtet.h
 F:     include/linux/armada-37xx-rwtm-mailbox.h
@@ -2188,10 +2183,10 @@ R:      NXP Linux Team <linux-imx@nxp.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
-X:     drivers/media/i2c/
 F:     arch/arm64/boot/dts/freescale/
 X:     arch/arm64/boot/dts/freescale/fsl-*
 X:     arch/arm64/boot/dts/freescale/qoriq-*
+X:     drivers/media/i2c/
 N:     imx
 N:     mxs
 
@@ -2245,12 +2240,12 @@ ARM/HPE GXP ARCHITECTURE
 M:     Jean-Marie Verdun <verdun@hpe.com>
 M:     Nick Hawkins <nick.hawkins@hpe.com>
 S:     Maintained
-F:     Documentation/hwmon/gxp-fan-ctrl.rst
 F:     Documentation/devicetree/bindings/arm/hpe,gxp.yaml
 F:     Documentation/devicetree/bindings/hwmon/hpe,gxp-fan-ctrl.yaml
 F:     Documentation/devicetree/bindings/i2c/hpe,gxp-i2c.yaml
 F:     Documentation/devicetree/bindings/spi/hpe,gxp-spifi.yaml
 F:     Documentation/devicetree/bindings/timer/hpe,gxp-timer.yaml
+F:     Documentation/hwmon/gxp-fan-ctrl.rst
 F:     arch/arm/boot/dts/hpe-bmc*
 F:     arch/arm/boot/dts/hpe-gxp*
 F:     arch/arm/mach-hpe/
@@ -2275,9 +2270,9 @@ M:        Krzysztof Halasa <khalasa@piap.pl>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     Documentation/devicetree/bindings/arm/intel-ixp4xx.yaml
-F:     Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
 F:     Documentation/devicetree/bindings/gpio/intel,ixp4xx-gpio.txt
 F:     Documentation/devicetree/bindings/interrupt-controller/intel,ixp4xx-interrupt.yaml
+F:     Documentation/devicetree/bindings/memory-controllers/intel,ixp4xx-expansion*
 F:     Documentation/devicetree/bindings/timer/intel,ixp4xx-timer.yaml
 F:     arch/arm/boot/dts/intel-ixp*
 F:     arch/arm/mach-ixp4xx/
@@ -2447,13 +2442,6 @@ F:       drivers/net/ethernet/microchip/vcap/
 F:     drivers/pinctrl/pinctrl-microchip-sgpio.c
 N:     sparx5
 
-Microchip Timer Counter Block (TCB) Capture Driver
-M:     Kamel Bouhara <kamel.bouhara@bootlin.com>
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-L:     linux-iio@vger.kernel.org
-S:     Maintained
-F:     drivers/counter/microchip-tcb-capture.c
-
 ARM/MILBEAUT ARCHITECTURE
 M:     Taichi Sugaya <sugaya.taichi@socionext.com>
 M:     Takao Orito <orito.takao@socionext.com>
@@ -2525,8 +2513,8 @@ F:        Documentation/devicetree/bindings/rtc/nuvoton,nct3018y.yaml
 F:     arch/arm/boot/dts/nuvoton-npcm*
 F:     arch/arm/mach-npcm/
 F:     arch/arm64/boot/dts/nuvoton/
-F:     drivers/*/*npcm*
 F:     drivers/*/*/*npcm*
+F:     drivers/*/*npcm*
 F:     drivers/rtc/rtc-nct3018y.c
 F:     include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
 F:     include/dt-bindings/clock/nuvoton,npcm845-clk.h
@@ -2569,9 +2557,15 @@ F:       arch/arm/mach-oxnas/
 F:     drivers/power/reset/oxnas-restart.c
 N:     oxnas
 
-ARM/QUALCOMM SUPPORT
-M:     Andy Gross <agross@kernel.org>
-M:     Bjorn Andersson <andersson@kernel.org>
+ARM/QUALCOMM CHROMEBOOK SUPPORT
+R:     cros-qcom-dts-watchers@chromium.org
+F:     arch/arm64/boot/dts/qcom/sc7180*
+F:     arch/arm64/boot/dts/qcom/sc7280*
+F:     arch/arm64/boot/dts/qcom/sdm845-cheza*
+
+ARM/QUALCOMM SUPPORT
+M:     Andy Gross <agross@kernel.org>
+M:     Bjorn Andersson <andersson@kernel.org>
 R:     Konrad Dybcio <konrad.dybcio@linaro.org>
 L:     linux-arm-msm@vger.kernel.org
 S:     Maintained
@@ -2602,22 +2596,16 @@ F:      drivers/pci/controller/dwc/pcie-qcom.c
 F:     drivers/phy/qualcomm/
 F:     drivers/power/*/msm*
 F:     drivers/reset/reset-qcom-*
-F:     drivers/ufs/host/ufs-qcom*
 F:     drivers/spi/spi-geni-qcom.c
 F:     drivers/spi/spi-qcom-qspi.c
 F:     drivers/spi/spi-qup.c
 F:     drivers/tty/serial/msm_serial.c
+F:     drivers/ufs/host/ufs-qcom*
 F:     drivers/usb/dwc3/dwc3-qcom.c
 F:     include/dt-bindings/*/qcom*
 F:     include/linux/*/qcom*
 F:     include/linux/soc/qcom/
 
-ARM/QUALCOMM CHROMEBOOK SUPPORT
-R:     cros-qcom-dts-watchers@chromium.org
-F:     arch/arm64/boot/dts/qcom/sc7180*
-F:     arch/arm64/boot/dts/qcom/sc7280*
-F:     arch/arm64/boot/dts/qcom/sdm845-cheza*
-
 ARM/RDA MICRO ARCHITECTURE
 M:     Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -2709,9 +2697,9 @@ R:        Alim Akhtar <alim.akhtar@samsung.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 L:     linux-samsung-soc@vger.kernel.org
 S:     Maintained
-C:     irc://irc.libera.chat/linux-exynos
 Q:     https://patchwork.kernel.org/project/linux-samsung-soc/list/
 B:     mailto:linux-samsung-soc@vger.kernel.org
+C:     irc://irc.libera.chat/linux-exynos
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git
 F:     Documentation/arm/samsung/
 F:     Documentation/devicetree/bindings/arm/samsung/
@@ -2811,8 +2799,8 @@ M:        Patrice Chotard <patrice.chotard@foss.st.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 W:     http://www.stlinux.com
-F:     Documentation/devicetree/bindings/spi/st,ssc-spi.yaml
 F:     Documentation/devicetree/bindings/i2c/st,sti-i2c.yaml
+F:     Documentation/devicetree/bindings/spi/st,ssc-spi.yaml
 F:     arch/arm/boot/dts/sti*
 F:     arch/arm/mach-sti/
 F:     drivers/ata/ahci_st.c
@@ -2959,15 +2947,15 @@ T:      git git://git.kernel.org/pub/scm/linux/kernel/git/iwamatsu/linux-visconti.git
 F:     Documentation/devicetree/bindings/arm/toshiba.yaml
 F:     Documentation/devicetree/bindings/clock/toshiba,tmpv770x-pipllct.yaml
 F:     Documentation/devicetree/bindings/clock/toshiba,tmpv770x-pismu.yaml
-F:     Documentation/devicetree/bindings/net/toshiba,visconti-dwmac.yaml
 F:     Documentation/devicetree/bindings/gpio/toshiba,gpio-visconti.yaml
+F:     Documentation/devicetree/bindings/net/toshiba,visconti-dwmac.yaml
 F:     Documentation/devicetree/bindings/pci/toshiba,visconti-pcie.yaml
 F:     Documentation/devicetree/bindings/pinctrl/toshiba,visconti-pinctrl.yaml
 F:     Documentation/devicetree/bindings/watchdog/toshiba,visconti-wdt.yaml
 F:     arch/arm64/boot/dts/toshiba/
 F:     drivers/clk/visconti/
-F:     drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c
 F:     drivers/gpio/gpio-visconti.c
+F:     drivers/net/ethernet/stmicro/stmmac/dwmac-visconti.c
 F:     drivers/pci/controller/dwc/pcie-visconti.c
 F:     drivers/pinctrl/visconti/
 F:     drivers/watchdog/visconti_wdt.c
@@ -3112,6 +3100,13 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/net/asix,ax88796c.yaml
 F:     drivers/net/ethernet/asix/ax88796c_*
 
+ASPEED CRYPTO DRIVER
+M:     Neal Liu <neal_liu@aspeedtech.com>
+L:     linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/crypto/aspeed,*
+F:     drivers/crypto/aspeed/
+
 ASPEED PECI CONTROLLER
 M:     Iwona Winiarska <iwona.winiarska@intel.com>
 L:     linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
@@ -3156,6 +3151,13 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/spi/aspeed,ast2600-fmc.yaml
 F:     drivers/spi/spi-aspeed-smc.c
 
+ASPEED USB UDC DRIVER
+M:     Neal Liu <neal_liu@aspeedtech.com>
+L:     linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
+S:     Maintained
+F:     Documentation/devicetree/bindings/usb/aspeed,ast2600-udc.yaml
+F:     drivers/usb/gadget/udc/aspeed_udc.c
+
 ASPEED VIDEO ENGINE DRIVER
 M:     Eddie James <eajames@linux.ibm.com>
 L:     linux-media@vger.kernel.org
@@ -3164,19 +3166,11 @@ S:      Maintained
 F:     Documentation/devicetree/bindings/media/aspeed-video.txt
 F:     drivers/media/platform/aspeed/
 
-ASPEED USB UDC DRIVER
-M:     Neal Liu <neal_liu@aspeedtech.com>
-L:     linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
-S:     Maintained
-F:     Documentation/devicetree/bindings/usb/aspeed,ast2600-udc.yaml
-F:     drivers/usb/gadget/udc/aspeed_udc.c
-
-ASPEED CRYPTO DRIVER
-M:     Neal Liu <neal_liu@aspeedtech.com>
-L:     linux-aspeed@lists.ozlabs.org (moderated for non-subscribers)
+ASUS EC HARDWARE MONITOR DRIVER
+M:     Eugene Shalygin <eugene.shalygin@gmail.com>
+L:     linux-hwmon@vger.kernel.org
 S:     Maintained
-F:     Documentation/devicetree/bindings/crypto/aspeed,*
-F:     drivers/crypto/aspeed/
+F:     drivers/hwmon/asus-ec-sensors.c
 
 ASUS NOTEBOOKS AND EEEPC ACPI/WMI EXTRAS DRIVERS
 M:     Corentin Chary <corentin.chary@gmail.com>
@@ -3194,6 +3188,12 @@ S:       Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
 F:     drivers/platform/x86/asus-tf103c-dock.c
 
+ASUS WIRELESS RADIO CONTROL DRIVER
+M:     João Paulo Rechi Vita <jprvita@gmail.com>
+L:     platform-driver-x86@vger.kernel.org
+S:     Maintained
+F:     drivers/platform/x86/asus-wireless.c
+
 ASUS WMI HARDWARE MONITOR DRIVER
 M:     Ed Brindley <kernel@maidavale.org>
 M:     Denis Pauk <pauk.denis@gmail.com>
@@ -3201,18 +3201,6 @@ L:       linux-hwmon@vger.kernel.org
 S:     Maintained
 F:     drivers/hwmon/asus_wmi_sensors.c
 
-ASUS EC HARDWARE MONITOR DRIVER
-M:     Eugene Shalygin <eugene.shalygin@gmail.com>
-L:     linux-hwmon@vger.kernel.org
-S:     Maintained
-F:     drivers/hwmon/asus-ec-sensors.c
-
-ASUS WIRELESS RADIO CONTROL DRIVER
-M:     João Paulo Rechi Vita <jprvita@gmail.com>
-L:     platform-driver-x86@vger.kernel.org
-S:     Maintained
-F:     drivers/platform/x86/asus-wireless.c
-
 ASYMMETRIC KEYS
 M:     David Howells <dhowells@redhat.com>
 L:     keyrings@vger.kernel.org
@@ -3352,10 +3340,10 @@ R:      Boqun Feng <boqun.feng@gmail.com>
 R:     Mark Rutland <mark.rutland@arm.com>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
+F:     Documentation/atomic_*.txt
 F:     arch/*/include/asm/atomic*.h
 F:     include/*/atomic*.h
 F:     include/linux/refcount.h
-F:     Documentation/atomic_*.txt
 F:     scripts/atomic/
 
 ATTO EXPRESSSAS SAS/SATA RAID SCSI DRIVER
@@ -3649,50 +3637,6 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/iio/accel/bosch,bma400.yaml
 F:     drivers/iio/accel/bma400*
 
-BPF [GENERAL] (Safe Dynamic Programs and Tools)
-M:     Alexei Starovoitov <ast@kernel.org>
-M:     Daniel Borkmann <daniel@iogearbox.net>
-M:     Andrii Nakryiko <andrii@kernel.org>
-R:     Martin KaFai Lau <martin.lau@linux.dev>
-R:     Song Liu <song@kernel.org>
-R:     Yonghong Song <yhs@fb.com>
-R:     John Fastabend <john.fastabend@gmail.com>
-R:     KP Singh <kpsingh@kernel.org>
-R:     Stanislav Fomichev <sdf@google.com>
-R:     Hao Luo <haoluo@google.com>
-R:     Jiri Olsa <jolsa@kernel.org>
-L:     bpf@vger.kernel.org
-S:     Supported
-W:     https://bpf.io/
-Q:     https://patchwork.kernel.org/project/netdevbpf/list/?delegate=121173
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
-F:     Documentation/bpf/
-F:     Documentation/networking/filter.rst
-F:     Documentation/userspace-api/ebpf/
-F:     arch/*/net/*
-F:     include/linux/bpf*
-F:     include/linux/btf*
-F:     include/linux/filter.h
-F:     include/trace/events/xdp.h
-F:     include/uapi/linux/bpf*
-F:     include/uapi/linux/btf*
-F:     include/uapi/linux/filter.h
-F:     kernel/bpf/
-F:     kernel/trace/bpf_trace.c
-F:     lib/test_bpf.c
-F:     net/bpf/
-F:     net/core/filter.c
-F:     net/sched/act_bpf.c
-F:     net/sched/cls_bpf.c
-F:     samples/bpf/
-F:     scripts/bpf_doc.py
-F:     scripts/pahole-flags.sh
-F:     scripts/pahole-version.sh
-F:     tools/bpf/
-F:     tools/lib/bpf/
-F:     tools/testing/selftests/bpf/
-
 BPF JIT for ARM
 M:     Shubham Bansal <illusionist.neo@gmail.com>
 L:     bpf@vger.kernel.org
@@ -3771,79 +3715,79 @@ S:      Supported
 F:     arch/x86/net/
 X:     arch/x86/net/bpf_jit_comp32.c
 
+BPF [BTF]
+M:     Martin KaFai Lau <martin.lau@linux.dev>
+L:     bpf@vger.kernel.org
+S:     Maintained
+F:     include/linux/btf*
+F:     kernel/bpf/btf.c
+
 BPF [CORE]
 M:     Alexei Starovoitov <ast@kernel.org>
 M:     Daniel Borkmann <daniel@iogearbox.net>
 R:     John Fastabend <john.fastabend@gmail.com>
 L:     bpf@vger.kernel.org
 S:     Maintained
-F:     kernel/bpf/verifier.c
-F:     kernel/bpf/tnum.c
-F:     kernel/bpf/core.c
-F:     kernel/bpf/syscall.c
-F:     kernel/bpf/dispatcher.c
-F:     kernel/bpf/trampoline.c
 F:     include/linux/bpf*
 F:     include/linux/filter.h
 F:     include/linux/tnum.h
+F:     kernel/bpf/core.c
+F:     kernel/bpf/dispatcher.c
+F:     kernel/bpf/syscall.c
+F:     kernel/bpf/tnum.c
+F:     kernel/bpf/trampoline.c
+F:     kernel/bpf/verifier.c
 
-BPF [BTF]
-M:     Martin KaFai Lau <martin.lau@linux.dev>
-L:     bpf@vger.kernel.org
-S:     Maintained
-F:     kernel/bpf/btf.c
-F:     include/linux/btf*
-
-BPF [TRACING]
-M:     Song Liu <song@kernel.org>
-R:     Jiri Olsa <jolsa@kernel.org>
+BPF [DOCUMENTATION] (Related to Standardization)
+R:     David Vernet <void@manifault.com>
 L:     bpf@vger.kernel.org
+L:     bpf@ietf.org
 S:     Maintained
-F:     kernel/trace/bpf_trace.c
-F:     kernel/bpf/stackmap.c
+F:     Documentation/bpf/instruction-set.rst
 
-BPF [NETWORKING] (tc BPF, sock_addr)
-M:     Martin KaFai Lau <martin.lau@linux.dev>
+BPF [GENERAL] (Safe Dynamic Programs and Tools)
+M:     Alexei Starovoitov <ast@kernel.org>
 M:     Daniel Borkmann <daniel@iogearbox.net>
+M:     Andrii Nakryiko <andrii@kernel.org>
+R:     Martin KaFai Lau <martin.lau@linux.dev>
+R:     Song Liu <song@kernel.org>
+R:     Yonghong Song <yhs@fb.com>
 R:     John Fastabend <john.fastabend@gmail.com>
+R:     KP Singh <kpsingh@kernel.org>
+R:     Stanislav Fomichev <sdf@google.com>
+R:     Hao Luo <haoluo@google.com>
+R:     Jiri Olsa <jolsa@kernel.org>
 L:     bpf@vger.kernel.org
-L:     netdev@vger.kernel.org
-S:     Maintained
+S:     Supported
+W:     https://bpf.io/
+Q:     https://patchwork.kernel.org/project/netdevbpf/list/?delegate=121173
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf.git
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git
+F:     Documentation/bpf/
+F:     Documentation/networking/filter.rst
+F:     Documentation/userspace-api/ebpf/
+F:     arch/*/net/*
+F:     include/linux/bpf*
+F:     include/linux/btf*
+F:     include/linux/filter.h
+F:     include/trace/events/xdp.h
+F:     include/uapi/linux/bpf*
+F:     include/uapi/linux/btf*
+F:     include/uapi/linux/filter.h
+F:     kernel/bpf/
+F:     kernel/trace/bpf_trace.c
+F:     lib/test_bpf.c
+F:     net/bpf/
 F:     net/core/filter.c
 F:     net/sched/act_bpf.c
 F:     net/sched/cls_bpf.c
-
-BPF [NETWORKING] (struct_ops, reuseport)
-M:     Martin KaFai Lau <martin.lau@linux.dev>
-L:     bpf@vger.kernel.org
-L:     netdev@vger.kernel.org
-S:     Maintained
-F:     kernel/bpf/bpf_struct*
-
-BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
-M:     KP Singh <kpsingh@kernel.org>
-R:     Florent Revest <revest@chromium.org>
-R:     Brendan Jackman <jackmanb@chromium.org>
-L:     bpf@vger.kernel.org
-S:     Maintained
-F:     Documentation/bpf/prog_lsm.rst
-F:     include/linux/bpf_lsm.h
-F:     kernel/bpf/bpf_lsm.c
-F:     security/bpf/
-
-BPF [STORAGE & CGROUPS]
-M:     Martin KaFai Lau <martin.lau@linux.dev>
-L:     bpf@vger.kernel.org
-S:     Maintained
-F:     kernel/bpf/cgroup.c
-F:     kernel/bpf/*storage.c
-F:     kernel/bpf/bpf_lru*
-
-BPF [RINGBUF]
-M:     Andrii Nakryiko <andrii@kernel.org>
-L:     bpf@vger.kernel.org
-S:     Maintained
-F:     kernel/bpf/ringbuf.c
+F:     samples/bpf/
+F:     scripts/bpf_doc.py
+F:     scripts/pahole-flags.sh
+F:     scripts/pahole-version.sh
+F:     tools/bpf/
+F:     tools/lib/bpf/
+F:     tools/testing/selftests/bpf/
 
 BPF [ITERATOR]
 M:     Yonghong Song <yhs@fb.com>
@@ -3870,12 +3814,45 @@ L:      bpf@vger.kernel.org
 S:     Maintained
 F:     tools/lib/bpf/
 
-BPF [TOOLING] (bpftool)
-M:     Quentin Monnet <quentin@isovalent.com>
+BPF [MISC]
+L:     bpf@vger.kernel.org
+S:     Odd Fixes
+K:     (?:\b|_)bpf(?:\b|_)
+
+BPF [NETWORKING] (struct_ops, reuseport)
+M:     Martin KaFai Lau <martin.lau@linux.dev>
+L:     bpf@vger.kernel.org
+L:     netdev@vger.kernel.org
+S:     Maintained
+F:     kernel/bpf/bpf_struct*
+
+BPF [NETWORKING] (tc BPF, sock_addr)
+M:     Martin KaFai Lau <martin.lau@linux.dev>
+M:     Daniel Borkmann <daniel@iogearbox.net>
+R:     John Fastabend <john.fastabend@gmail.com>
+L:     bpf@vger.kernel.org
+L:     netdev@vger.kernel.org
+S:     Maintained
+F:     net/core/filter.c
+F:     net/sched/act_bpf.c
+F:     net/sched/cls_bpf.c
+
+BPF [RINGBUF]
+M:     Andrii Nakryiko <andrii@kernel.org>
+L:     bpf@vger.kernel.org
+S:     Maintained
+F:     kernel/bpf/ringbuf.c
+
+BPF [SECURITY & LSM] (Security Audit and Enforcement using BPF)
+M:     KP Singh <kpsingh@kernel.org>
+R:     Florent Revest <revest@chromium.org>
+R:     Brendan Jackman <jackmanb@chromium.org>
 L:     bpf@vger.kernel.org
 S:     Maintained
-F:     kernel/bpf/disasm.*
-F:     tools/bpf/bpftool/
+F:     Documentation/bpf/prog_lsm.rst
+F:     include/linux/bpf_lsm.h
+F:     kernel/bpf/bpf_lsm.c
+F:     security/bpf/
 
 BPF [SELFTESTS] (Test Runners & Infrastructure)
 M:     Andrii Nakryiko <andrii@kernel.org>
@@ -3884,17 +3861,28 @@ L:      bpf@vger.kernel.org
 S:     Maintained
 F:     tools/testing/selftests/bpf/
 
-BPF [DOCUMENTATION] (Related to Standardization)
-R:     David Vernet <void@manifault.com>
+BPF [STORAGE & CGROUPS]
+M:     Martin KaFai Lau <martin.lau@linux.dev>
 L:     bpf@vger.kernel.org
-L:     bpf@ietf.org
 S:     Maintained
-F:     Documentation/bpf/instruction-set.rst
+F:     kernel/bpf/*storage.c
+F:     kernel/bpf/bpf_lru*
+F:     kernel/bpf/cgroup.c
 
-BPF [MISC]
+BPF [TOOLING] (bpftool)
+M:     Quentin Monnet <quentin@isovalent.com>
 L:     bpf@vger.kernel.org
-S:     Odd Fixes
-K:     (?:\b|_)bpf(?:\b|_)
+S:     Maintained
+F:     kernel/bpf/disasm.*
+F:     tools/bpf/bpftool/
+
+BPF [TRACING]
+M:     Song Liu <song@kernel.org>
+R:     Jiri Olsa <jolsa@kernel.org>
+L:     bpf@vger.kernel.org
+S:     Maintained
+F:     kernel/bpf/stackmap.c
+F:     kernel/trace/bpf_trace.c
 
 BROADCOM B44 10/100 ETHERNET DRIVER
 M:     Michael Chan <michael.chan@broadcom.com>
@@ -3913,34 +3901,6 @@ F:       drivers/net/dsa/bcm_sf2*
 F:     include/linux/dsa/brcm.h
 F:     include/linux/platform_data/b53.h
 
-BROADCOM BCMBCA ARM ARCHITECTURE
-M:     William Zhang <william.zhang@broadcom.com>
-M:     Anand Gore <anand.gore@broadcom.com>
-M:     Kursad Oney <kursad.oney@broadcom.com>
-M:     Florian Fainelli <f.fainelli@gmail.com>
-M:     RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
-R:     Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     Maintained
-T:     git https://github.com/broadcom/stblinux.git
-F:     Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
-F:     arch/arm64/boot/dts/broadcom/bcmbca/*
-N:     bcmbca
-N:     bcm[9]?47622
-N:     bcm[9]?4912
-N:     bcm[9]?63138
-N:     bcm[9]?63146
-N:     bcm[9]?63148
-N:     bcm[9]?63158
-N:     bcm[9]?63178
-N:     bcm[9]?6756
-N:     bcm[9]?6813
-N:     bcm[9]?6846
-N:     bcm[9]?6855
-N:     bcm[9]?6856
-N:     bcm[9]?6858
-N:     bcm[9]?6878
-
 BROADCOM BCM2711/BCM2835 ARM ARCHITECTURE
 M:     Florian Fainelli <f.fainelli@gmail.com>
 R:     Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
@@ -4038,11 +3998,39 @@ N:      brcmstb
 N:     bcm7038
 N:     bcm7120
 
+BROADCOM BCMBCA ARM ARCHITECTURE
+M:     William Zhang <william.zhang@broadcom.com>
+M:     Anand Gore <anand.gore@broadcom.com>
+M:     Kursad Oney <kursad.oney@broadcom.com>
+M:     Florian Fainelli <f.fainelli@gmail.com>
+M:     RafaÅ‚ MiÅ‚ecki <rafal@milecki.pl>
+R:     Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+T:     git https://github.com/broadcom/stblinux.git
+F:     Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
+F:     arch/arm64/boot/dts/broadcom/bcmbca/*
+N:     bcmbca
+N:     bcm[9]?47622
+N:     bcm[9]?4912
+N:     bcm[9]?63138
+N:     bcm[9]?63146
+N:     bcm[9]?63148
+N:     bcm[9]?63158
+N:     bcm[9]?63178
+N:     bcm[9]?6756
+N:     bcm[9]?6813
+N:     bcm[9]?6846
+N:     bcm[9]?6855
+N:     bcm[9]?6856
+N:     bcm[9]?6858
+N:     bcm[9]?6878
+
 BROADCOM BDC DRIVER
 M:     Justin Chen <justinpopo6@gmail.com>
 M:     Al Cooper <alcooperx@gmail.com>
-L:     linux-usb@vger.kernel.org
 R:     Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
+L:     linux-usb@vger.kernel.org
 S:     Maintained
 F:     Documentation/devicetree/bindings/usb/brcm,bdc.yaml
 F:     drivers/usb/gadget/udc/bdc/
@@ -4064,10 +4052,10 @@ F:      arch/mips/bmips/*
 F:     arch/mips/boot/dts/brcm/bcm*.dts*
 F:     arch/mips/include/asm/mach-bmips/*
 F:     arch/mips/kernel/*bmips*
-F:     drivers/soc/bcm/bcm63xx
 F:     drivers/irqchip/irq-bcm63*
 F:     drivers/irqchip/irq-bcm7*
 F:     drivers/irqchip/irq-brcmstb*
+F:     drivers/soc/bcm/bcm63xx
 F:     include/linux/bcm963xx_nvram.h
 F:     include/linux/bcm963xx_tag.h
 
@@ -4349,9 +4337,9 @@ M:        Florian Fainelli <f.fainelli@gmail.com>
 R:     Broadcom internal kernel review list <bcm-kernel-feedback-list@broadcom.com>
 L:     netdev@vger.kernel.org
 S:     Supported
+F:     Documentation/devicetree/bindings/net/brcm,systemport.yaml
 F:     drivers/net/ethernet/broadcom/bcmsysport.*
 F:     drivers/net/ethernet/broadcom/unimac.h
-F:     Documentation/devicetree/bindings/net/brcm,systemport.yaml
 
 BROADCOM TG3 GIGABIT ETHERNET DRIVER
 M:     Siva Reddy Kallam <siva.kallam@broadcom.com>
@@ -4483,29 +4471,6 @@ W:       https://github.com/Cascoda/ca8210-linux.git
 F:     Documentation/devicetree/bindings/net/ieee802154/ca8210.txt
 F:     drivers/net/ieee802154/ca8210.c
 
-CANAAN/KENDRYTE K210 SOC FPIOA DRIVER
-M:     Damien Le Moal <dlemoal@kernel.org>
-L:     linux-riscv@lists.infradead.org
-L:     linux-gpio@vger.kernel.org (pinctrl driver)
-F:     Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml
-F:     drivers/pinctrl/pinctrl-k210.c
-
-CANAAN/KENDRYTE K210 SOC RESET CONTROLLER DRIVER
-M:     Damien Le Moal <dlemoal@kernel.org>
-L:     linux-kernel@vger.kernel.org
-L:     linux-riscv@lists.infradead.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml
-F:     drivers/reset/reset-k210.c
-
-CANAAN/KENDRYTE K210 SOC SYSTEM CONTROLLER DRIVER
-M:     Damien Le Moal <dlemoal@kernel.org>
-L:     linux-riscv@lists.infradead.org
-S:     Maintained
-F:      Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml
-F:     drivers/soc/canaan/
-F:     include/soc/canaan/
-
 CACHEFILES: FS-CACHE BACKEND FOR CACHING ON MOUNTED FILESYSTEMS
 M:     David Howells <dhowells@redhat.com>
 L:     linux-cachefs@redhat.com (moderated for non-subscribers)
@@ -4627,6 +4592,29 @@ F:       Documentation/networking/j1939.rst
 F:     include/uapi/linux/can/j1939.h
 F:     net/can/j1939/
 
+CANAAN/KENDRYTE K210 SOC FPIOA DRIVER
+M:     Damien Le Moal <dlemoal@kernel.org>
+L:     linux-riscv@lists.infradead.org
+L:     linux-gpio@vger.kernel.org (pinctrl driver)
+F:     Documentation/devicetree/bindings/pinctrl/canaan,k210-fpioa.yaml
+F:     drivers/pinctrl/pinctrl-k210.c
+
+CANAAN/KENDRYTE K210 SOC RESET CONTROLLER DRIVER
+M:     Damien Le Moal <dlemoal@kernel.org>
+L:     linux-kernel@vger.kernel.org
+L:     linux-riscv@lists.infradead.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/reset/canaan,k210-rst.yaml
+F:     drivers/reset/reset-k210.c
+
+CANAAN/KENDRYTE K210 SOC SYSTEM CONTROLLER DRIVER
+M:     Damien Le Moal <dlemoal@kernel.org>
+L:     linux-riscv@lists.infradead.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/mfd/canaan,k210-sysctl.yaml
+F:     drivers/soc/canaan/
+F:     include/soc/canaan/
+
 CAPABILITIES
 M:     Serge Hallyn <serge@hallyn.com>
 L:     linux-security-module@vger.kernel.org
@@ -4686,8 +4674,8 @@ F:        arch/arm64/boot/dts/cavium/thunder2-99xx*
 
 CBS/ETF/TAPRIO QDISCS
 M:     Vinicius Costa Gomes <vinicius.gomes@intel.com>
-S:     Maintained
 L:     netdev@vger.kernel.org
+S:     Maintained
 F:     net/sched/sch_cbs.c
 F:     net/sched/sch_etf.c
 F:     net/sched/sch_taprio.c
@@ -4710,10 +4698,10 @@ CCTRNG ARM TRUSTZONE CRYPTOCELL TRUE RANDOM NUMBER GENERATOR (TRNG) DRIVER
 M:     Hadar Gat <hadar.gat@arm.com>
 L:     linux-crypto@vger.kernel.org
 S:     Supported
+W:     https://developer.arm.com/products/system-ip/trustzone-cryptocell/cryptocell-700-family
+F:     Documentation/devicetree/bindings/rng/arm-cctrng.yaml
 F:     drivers/char/hw_random/cctrng.c
 F:     drivers/char/hw_random/cctrng.h
-F:     Documentation/devicetree/bindings/rng/arm-cctrng.yaml
-W:     https://developer.arm.com/products/system-ip/trustzone-cryptocell/cryptocell-700-family
 
 CEC FRAMEWORK
 M:     Hans Verkuil <hverkuil-cisco@xs4all.nl>
@@ -4873,13 +4861,6 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml
 F:     sound/soc/codecs/cros_ec_codec.*
 
-CHROMEOS EC UART DRIVER
-M:     Bhanu Prakash Maiya <bhanumaiya@chromium.org>
-R:     Benson Leung <bleung@chromium.org>
-R:     Tzung-Bi Shih <tzungbi@kernel.org>
-S:     Maintained
-F:     drivers/platform/chrome/cros_ec_uart.c
-
 CHROMEOS EC SUBDRIVERS
 M:     Benson Leung <bleung@chromium.org>
 R:     Guenter Roeck <groeck@chromium.org>
@@ -4889,13 +4870,12 @@ F:      drivers/power/supply/cros_usbpd-charger.c
 N:     cros_ec
 N:     cros-ec
 
-CHROMEOS EC USB TYPE-C DRIVER
-M:     Prashant Malani <pmalani@chromium.org>
-L:     chrome-platform@lists.linux.dev
+CHROMEOS EC UART DRIVER
+M:     Bhanu Prakash Maiya <bhanumaiya@chromium.org>
+R:     Benson Leung <bleung@chromium.org>
+R:     Tzung-Bi Shih <tzungbi@kernel.org>
 S:     Maintained
-F:     drivers/platform/chrome/cros_ec_typec.*
-F:     drivers/platform/chrome/cros_typec_switch.c
-F:     drivers/platform/chrome/cros_typec_vdm.*
+F:     drivers/platform/chrome/cros_ec_uart.c
 
 CHROMEOS EC USB PD NOTIFY DRIVER
 M:     Prashant Malani <pmalani@chromium.org>
@@ -4904,6 +4884,14 @@ S:       Maintained
 F:     drivers/platform/chrome/cros_usbpd_notify.c
 F:     include/linux/platform_data/cros_usbpd_notify.h
 
+CHROMEOS EC USB TYPE-C DRIVER
+M:     Prashant Malani <pmalani@chromium.org>
+L:     chrome-platform@lists.linux.dev
+S:     Maintained
+F:     drivers/platform/chrome/cros_ec_typec.*
+F:     drivers/platform/chrome/cros_typec_switch.c
+F:     drivers/platform/chrome/cros_typec_vdm.*
+
 CHROMEOS HPS DRIVER
 M:     Dan Callaghan <dcallagh@chromium.org>
 R:     Sami Kyöstilä <skyostil@chromium.org>
@@ -4921,7 +4909,6 @@ F:        drivers/media/cec/i2c/ch7322.c
 CIRRUS LOGIC AUDIO CODEC DRIVERS
 M:     James Schulman <james.schulman@cirrus.com>
 M:     David Rhodes <david.rhodes@cirrus.com>
-M:     Lucas Tanure <tanureal@opensource.cirrus.com>
 M:     Richard Fitzgerald <rf@opensource.cirrus.com>
 L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
 L:     patches@opensource.cirrus.com
@@ -5021,6 +5008,18 @@ M:       Nelson Escobar <neescoba@cisco.com>
 S:     Supported
 F:     drivers/infiniband/hw/usnic/
 
+CLANG CONTROL FLOW INTEGRITY SUPPORT
+M:     Sami Tolvanen <samitolvanen@google.com>
+M:     Kees Cook <keescook@chromium.org>
+R:     Nathan Chancellor <nathan@kernel.org>
+R:     Nick Desaulniers <ndesaulniers@google.com>
+L:     llvm@lists.linux.dev
+S:     Supported
+B:     https://github.com/ClangBuiltLinux/linux/issues
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
+F:     include/linux/cfi.h
+F:     kernel/cfi.c
+
 CLANG-FORMAT FILE
 M:     Miguel Ojeda <ojeda@kernel.org>
 S:     Maintained
@@ -5041,18 +5040,6 @@ F:       scripts/Makefile.clang
 F:     scripts/clang-tools/
 K:     \b(?i:clang|llvm)\b
 
-CLANG CONTROL FLOW INTEGRITY SUPPORT
-M:     Sami Tolvanen <samitolvanen@google.com>
-M:     Kees Cook <keescook@chromium.org>
-R:     Nathan Chancellor <nathan@kernel.org>
-R:     Nick Desaulniers <ndesaulniers@google.com>
-L:     llvm@lists.linux.dev
-S:     Supported
-B:     https://github.com/ClangBuiltLinux/linux/issues
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/hardening
-F:     include/linux/cfi.h
-F:     kernel/cfi.c
-
 CLK API
 M:     Russell King <linux@armlinux.org.uk>
 L:     linux-clk@vger.kernel.org
@@ -5223,8 +5210,8 @@ CONTEXT TRACKING
 M:     Frederic Weisbecker <frederic@kernel.org>
 M:     "Paul E. McKenney" <paulmck@kernel.org>
 S:     Maintained
-F:     kernel/context_tracking.c
 F:     include/linux/context_tracking*
+F:     kernel/context_tracking.c
 
 CONTROL GROUP (CGROUP)
 M:     Tejun Heo <tj@kernel.org>
@@ -5385,8 +5372,8 @@ F:        drivers/cpuidle/cpuidle-big_little.c
 
 CPUIDLE DRIVER - ARM EXYNOS
 M:     Daniel Lezcano <daniel.lezcano@linaro.org>
-R:     Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 M:     Kukjin Kim <kgene@kernel.org>
+R:     Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 L:     linux-pm@vger.kernel.org
 L:     linux-samsung-soc@vger.kernel.org
 S:     Supported
@@ -5407,8 +5394,8 @@ M:        Ulf Hansson <ulf.hansson@linaro.org>
 L:     linux-pm@vger.kernel.org
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Supported
-F:     drivers/cpuidle/cpuidle-psci.h
 F:     drivers/cpuidle/cpuidle-psci-domain.c
+F:     drivers/cpuidle/cpuidle-psci.h
 
 CPUIDLE DRIVER - DT IDLE PM DOMAIN
 M:     Ulf Hansson <ulf.hansson@linaro.org>
@@ -5552,19 +5539,19 @@ S:      Supported
 W:     http://www.chelsio.com
 F:     drivers/crypto/chelsio
 
-CXGB4 INLINE CRYPTO DRIVER
-M:     Ayush Sawal <ayush.sawal@chelsio.com>
+CXGB4 ETHERNET DRIVER (CXGB4)
+M:     Raju Rangoju <rajur@chelsio.com>
 L:     netdev@vger.kernel.org
 S:     Supported
 W:     http://www.chelsio.com
-F:     drivers/net/ethernet/chelsio/inline_crypto/
+F:     drivers/net/ethernet/chelsio/cxgb4/
 
-CXGB4 ETHERNET DRIVER (CXGB4)
-M:     Raju Rangoju <rajur@chelsio.com>
+CXGB4 INLINE CRYPTO DRIVER
+M:     Ayush Sawal <ayush.sawal@chelsio.com>
 L:     netdev@vger.kernel.org
 S:     Supported
 W:     http://www.chelsio.com
-F:     drivers/net/ethernet/chelsio/cxgb4/
+F:     drivers/net/ethernet/chelsio/inline_crypto/
 
 CXGB4 ISCSI DRIVER (CXGB4I)
 M:     Varun Prakash <varun@chelsio.com>
@@ -5621,16 +5608,6 @@ CYCLADES PC300 DRIVER
 S:     Orphan
 F:     drivers/net/wan/pc300*
 
-CYPRESS_FIRMWARE MEDIA DRIVER
-M:     Antti Palosaari <crope@iki.fi>
-L:     linux-media@vger.kernel.org
-S:     Maintained
-W:     https://linuxtv.org
-W:     http://palosaari.fi/linux/
-Q:     http://patchwork.linuxtv.org/project/linux-media/list/
-T:     git git://linuxtv.org/anttip/media_tree.git
-F:     drivers/media/common/cypress_firmware*
-
 CYPRESS CY8C95X0 PINCTRL DRIVER
 M:     Patrick Rudolph <patrick.rudolph@9elements.com>
 L:     linux-gpio@vger.kernel.org
@@ -5650,6 +5627,16 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/input/cypress-sf.yaml
 F:     drivers/input/keyboard/cypress-sf.c
 
+CYPRESS_FIRMWARE MEDIA DRIVER
+M:     Antti Palosaari <crope@iki.fi>
+L:     linux-media@vger.kernel.org
+S:     Maintained
+W:     https://linuxtv.org
+W:     http://palosaari.fi/linux/
+Q:     http://patchwork.linuxtv.org/project/linux-media/list/
+T:     git git://linuxtv.org/anttip/media_tree.git
+F:     drivers/media/common/cypress_firmware*
+
 CYTTSP TOUCHSCREEN DRIVER
 M:     Linus Walleij <linus.walleij@linaro.org>
 L:     linux-input@vger.kernel.org
@@ -5816,11 +5803,6 @@ S:       Maintained
 F:     Documentation/driver-api/dcdbas.rst
 F:     drivers/platform/x86/dell/dcdbas.*
 
-DELL WMI DESCRIPTOR DRIVER
-L:     Dell.Client.Kernel@dell.com
-S:     Maintained
-F:     drivers/platform/x86/dell/dell-wmi-descriptor.c
-
 DELL WMI DDV DRIVER
 M:     Armin Wolf <W_Armin@gmx.de>
 S:     Maintained
@@ -5828,13 +5810,17 @@ F:      Documentation/ABI/testing/debugfs-dell-wmi-ddv
 F:     Documentation/ABI/testing/sysfs-platform-dell-wmi-ddv
 F:     drivers/platform/x86/dell/dell-wmi-ddv.c
 
-DELL WMI SYSMAN DRIVER
-M:     Prasanth Ksr <prasanth.ksr@dell.com>
+DELL WMI DESCRIPTOR DRIVER
+L:     Dell.Client.Kernel@dell.com
+S:     Maintained
+F:     drivers/platform/x86/dell/dell-wmi-descriptor.c
+
+DELL WMI HARDWARE PRIVACY SUPPORT
+M:     Perry Yuan <Perry.Yuan@dell.com>
 L:     Dell.Client.Kernel@dell.com
 L:     platform-driver-x86@vger.kernel.org
 S:     Maintained
-F:     Documentation/ABI/testing/sysfs-class-firmware-attributes
-F:     drivers/platform/x86/dell/dell-wmi-sysman/
+F:     drivers/platform/x86/dell/dell-wmi-privacy.c
 
 DELL WMI NOTIFICATIONS DRIVER
 M:     Matthew Garrett <mjg59@srcf.ucam.org>
@@ -5842,20 +5828,13 @@ M:      Pali Rohár <pali@kernel.org>
 S:     Maintained
 F:     drivers/platform/x86/dell/dell-wmi-base.c
 
-DELL WMI HARDWARE PRIVACY SUPPORT
-M:     Perry Yuan <Perry.Yuan@dell.com>
+DELL WMI SYSMAN DRIVER
+M:     Prasanth Ksr <prasanth.ksr@dell.com>
 L:     Dell.Client.Kernel@dell.com
 L:     platform-driver-x86@vger.kernel.org
 S:     Maintained
-F:     drivers/platform/x86/dell/dell-wmi-privacy.c
-
-DELTA ST MEDIA DRIVER
-M:     Hugues Fruchet <hugues.fruchet@foss.st.com>
-L:     linux-media@vger.kernel.org
-S:     Supported
-W:     https://linuxtv.org
-T:     git git://linuxtv.org/media_tree.git
-F:     drivers/media/platform/st/sti/delta
+F:     Documentation/ABI/testing/sysfs-class-firmware-attributes
+F:     drivers/platform/x86/dell/dell-wmi-sysman/
 
 DELTA AHE-50DC FAN CONTROL MODULE DRIVER
 M:     Zev Weiss <zev@bewilderbeest.net>
@@ -5879,6 +5858,14 @@ F:       Documentation/devicetree/bindings/reset/delta,tn48m-reset.yaml
 F:     drivers/gpio/gpio-tn48m.c
 F:     include/dt-bindings/reset/delta,tn48m-reset.h
 
+DELTA ST MEDIA DRIVER
+M:     Hugues Fruchet <hugues.fruchet@foss.st.com>
+L:     linux-media@vger.kernel.org
+S:     Supported
+W:     https://linuxtv.org
+T:     git git://linuxtv.org/media_tree.git
+F:     drivers/media/platform/st/sti/delta
+
 DENALI NAND DRIVER
 L:     linux-mtd@lists.infradead.org
 S:     Orphan
@@ -5891,13 +5878,6 @@ S:       Maintained
 F:     drivers/dma/dw-edma/
 F:     include/linux/dma/edma.h
 
-DESIGNWARE XDATA IP DRIVER
-M:     Gustavo Pimentel <gustavo.pimentel@synopsys.com>
-L:     linux-pci@vger.kernel.org
-S:     Maintained
-F:     Documentation/misc-devices/dw-xdata-pcie.rst
-F:     drivers/misc/dw-xdata-pcie.c
-
 DESIGNWARE USB2 DRD IP DRIVER
 M:     Minas Harutyunyan <hminas@synopsys.com>
 L:     linux-usb@vger.kernel.org
@@ -5911,6 +5891,13 @@ L:       linux-usb@vger.kernel.org
 S:     Maintained
 F:     drivers/usb/dwc3/
 
+DESIGNWARE XDATA IP DRIVER
+M:     Gustavo Pimentel <gustavo.pimentel@synopsys.com>
+L:     linux-pci@vger.kernel.org
+S:     Maintained
+F:     Documentation/misc-devices/dw-xdata-pcie.rst
+F:     drivers/misc/dw-xdata-pcie.c
+
 DEVANTECH SRF ULTRASONIC RANGER IIO DRIVER
 M:     Andreas Klinger <ak@it-klinger.de>
 L:     linux-iio@vger.kernel.org
@@ -6019,9 +6006,9 @@ W:        http://www.dialog-semiconductor.com/products
 F:     Documentation/devicetree/bindings/input/da90??-onkey.txt
 F:     Documentation/devicetree/bindings/input/dlg,da72??.txt
 F:     Documentation/devicetree/bindings/mfd/da90*.txt
-F:     Documentation/devicetree/bindings/mfd/da90*.yaml
-F:     Documentation/devicetree/bindings/regulator/dlg,da9*.yaml
+F:     Documentation/devicetree/bindings/mfd/dlg,da90*.yaml
 F:     Documentation/devicetree/bindings/regulator/da92*.txt
+F:     Documentation/devicetree/bindings/regulator/dlg,da9*.yaml
 F:     Documentation/devicetree/bindings/regulator/slg51000.txt
 F:     Documentation/devicetree/bindings/sound/da[79]*.txt
 F:     Documentation/devicetree/bindings/thermal/da90??-thermal.txt
@@ -6140,6 +6127,12 @@ F:       include/linux/dma/
 F:     include/linux/dmaengine.h
 F:     include/linux/of_dma.h
 
+DMA MAPPING BENCHMARK
+M:     Xiang Chen <chenxiang66@hisilicon.com>
+L:     iommu@lists.linux.dev
+F:     kernel/dma/map_benchmark.c
+F:     tools/testing/selftests/dma/
+
 DMA MAPPING HELPERS
 M:     Christoph Hellwig <hch@lst.de>
 M:     Marek Szyprowski <m.szyprowski@samsung.com>
@@ -6150,17 +6143,11 @@ W:      http://git.infradead.org/users/hch/dma-mapping.git
 T:     git git://git.infradead.org/users/hch/dma-mapping.git
 F:     include/asm-generic/dma-mapping.h
 F:     include/linux/dma-direct.h
-F:     include/linux/dma-mapping.h
 F:     include/linux/dma-map-ops.h
+F:     include/linux/dma-mapping.h
 F:     include/linux/swiotlb.h
 F:     kernel/dma/
 
-DMA MAPPING BENCHMARK
-M:     Xiang Chen <chenxiang66@hisilicon.com>
-L:     iommu@lists.linux.dev
-F:     kernel/dma/map_benchmark.c
-F:     tools/testing/selftests/dma/
-
 DMA-BUF HEAPS FRAMEWORK
 M:     Sumit Semwal <sumit.semwal@linaro.org>
 R:     Benjamin Gaignard <benjamin.gaignard@collabora.com>
@@ -6218,6 +6205,7 @@ X:        Documentation/devicetree/
 X:     Documentation/driver-api/media/
 X:     Documentation/firmware-guide/acpi/
 X:     Documentation/i2c/
+X:     Documentation/netlink/
 X:     Documentation/power/
 X:     Documentation/spi/
 X:     Documentation/userspace-api/media/
@@ -6350,6 +6338,25 @@ S:       Maintained
 F:     drivers/soc/ti/smartreflex.c
 F:     include/linux/power/smartreflex.h
 
+DRM ACCEL DRIVERS FOR INTEL VPU
+M:     Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
+M:     Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
+L:     dri-devel@lists.freedesktop.org
+S:     Supported
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     drivers/accel/ivpu/
+F:     include/uapi/drm/ivpu_accel.h
+
+DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
+M:     Oded Gabbay <ogabbay@kernel.org>
+L:     dri-devel@lists.freedesktop.org
+S:     Maintained
+C:     irc://irc.oftc.net/dri-devel
+T:     git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
+F:     Documentation/accel/
+F:     drivers/accel/
+F:     include/drm/drm_accel.h
+
 DRM DRIVER FOR ALLWINNER DE2 AND DE3 ENGINE
 M:     Maxime Ripard <mripard@kernel.org>
 M:     Chen-Yu Tsai <wens@csie.org>
@@ -6432,6 +6439,21 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/display/panel/feiyang,fy07024di26a30d.yaml
 F:     drivers/gpu/drm/panel/panel-feiyang-fy07024di26a30d.c
 
+DRM DRIVER FOR FIRMWARE FRAMEBUFFERS
+M:     Thomas Zimmermann <tzimmermann@suse.de>
+M:     Javier Martinez Canillas <javierm@redhat.com>
+L:     dri-devel@lists.freedesktop.org
+S:     Maintained
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     drivers/gpu/drm/drm_aperture.c
+F:     drivers/gpu/drm/tiny/ofdrm.c
+F:     drivers/gpu/drm/tiny/simpledrm.c
+F:     drivers/video/aperture.c
+F:     drivers/video/nomodeset.c
+F:     include/drm/drm_aperture.h
+F:     include/linux/aperture.h
+F:     include/video/nomodeset.h
+
 DRM DRIVER FOR GENERIC EDP PANELS
 R:     Douglas Anderson <dianders@chromium.org>
 F:     Documentation/devicetree/bindings/display/panel/panel-edp.yaml
@@ -6466,6 +6488,14 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/himax,hx8357d.txt
 F:     drivers/gpu/drm/tiny/hx8357d.c
 
+DRM DRIVER FOR HYPERV SYNTHETIC VIDEO DEVICE
+M:     Deepak Rawat <drawat.floss@gmail.com>
+L:     linux-hyperv@vger.kernel.org
+L:     dri-devel@lists.freedesktop.org
+S:     Maintained
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     drivers/gpu/drm/hyperv
+
 DRM DRIVER FOR ILITEK ILI9225 PANELS
 M:     David Lechner <david@lechnology.com>
 S:     Maintained
@@ -6495,11 +6525,11 @@ F:      drivers/gpu/drm/logicvc/
 DRM DRIVER FOR LVDS PANELS
 M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
 L:     dri-devel@lists.freedesktop.org
-T:     git git://anongit.freedesktop.org/drm/drm-misc
 S:     Maintained
-F:     drivers/gpu/drm/panel/panel-lvds.c
+T:     git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/lvds.yaml
 F:     Documentation/devicetree/bindings/display/panel/panel-lvds.yaml
+F:     drivers/gpu/drm/panel/panel-lvds.c
 
 DRM DRIVER FOR MANTIX MLAF057WE51 PANELS
 M:     Guido Günther <agx@sigxcpu.org>
@@ -6608,13 +6638,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/repaper.txt
 F:     drivers/gpu/drm/tiny/repaper.c
 
-DRM DRIVER FOR SOLOMON SSD130X OLED DISPLAYS
-M:     Javier Martinez Canillas <javierm@redhat.com>
-S:     Maintained
-T:     git git://anongit.freedesktop.org/drm/drm-misc
-F:     Documentation/devicetree/bindings/display/solomon,ssd1307fb.yaml
-F:     drivers/gpu/drm/solomon/ssd130x*
-
 DRM DRIVER FOR QEMU'S CIRRUS DEVICE
 M:     Dave Airlie <airlied@redhat.com>
 M:     Gerd Hoffmann <kraxel@redhat.com>
@@ -6663,29 +6686,6 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/display/panel/samsung,s6d27a1.yaml
 F:     drivers/gpu/drm/panel/panel-samsung-s6d27a1.c
 
-DRM DRIVER FOR SITRONIX ST7703 PANELS
-M:     Guido Günther <agx@sigxcpu.org>
-R:     Purism Kernel Team <kernel@puri.sm>
-R:     Ondrej Jirman <megous@megous.com>
-S:     Maintained
-F:     Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
-F:     drivers/gpu/drm/panel/panel-sitronix-st7703.c
-
-DRM DRIVER FOR FIRMWARE FRAMEBUFFERS
-M:     Thomas Zimmermann <tzimmermann@suse.de>
-M:     Javier Martinez Canillas <javierm@redhat.com>
-L:     dri-devel@lists.freedesktop.org
-S:     Maintained
-T:     git git://anongit.freedesktop.org/drm/drm-misc
-F:     drivers/gpu/drm/drm_aperture.c
-F:     drivers/gpu/drm/tiny/ofdrm.c
-F:     drivers/gpu/drm/tiny/simpledrm.c
-F:     drivers/video/aperture.c
-F:     drivers/video/nomodeset.c
-F:     include/drm/drm_aperture.h
-F:     include/linux/aperture.h
-F:     include/video/nomodeset.h
-
 DRM DRIVER FOR SITRONIX ST7586 PANELS
 M:     David Lechner <david@lechnology.com>
 S:     Maintained
@@ -6699,6 +6699,14 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/display/panel/sitronix,st7701.yaml
 F:     drivers/gpu/drm/panel/panel-sitronix-st7701.c
 
+DRM DRIVER FOR SITRONIX ST7703 PANELS
+M:     Guido Günther <agx@sigxcpu.org>
+R:     Purism Kernel Team <kernel@puri.sm>
+R:     Ondrej Jirman <megous@megous.com>
+S:     Maintained
+F:     Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
+F:     drivers/gpu/drm/panel/panel-sitronix-st7703.c
+
 DRM DRIVER FOR SITRONIX ST7735R PANELS
 M:     David Lechner <david@lechnology.com>
 S:     Maintained
@@ -6706,6 +6714,13 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/sitronix,st7735r.yaml
 F:     drivers/gpu/drm/tiny/st7735r.c
 
+DRM DRIVER FOR SOLOMON SSD130X OLED DISPLAYS
+M:     Javier Martinez Canillas <javierm@redhat.com>
+S:     Maintained
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     Documentation/devicetree/bindings/display/solomon,ssd1307fb.yaml
+F:     drivers/gpu/drm/solomon/ssd130x*
+
 DRM DRIVER FOR ST-ERICSSON MCDE
 M:     Linus Walleij <linus.walleij@linaro.org>
 S:     Maintained
@@ -6804,25 +6819,6 @@ F:       include/drm/drm*
 F:     include/linux/vga*
 F:     include/uapi/drm/drm*
 
-DRM COMPUTE ACCELERATORS DRIVERS AND FRAMEWORK
-M:     Oded Gabbay <ogabbay@kernel.org>
-L:     dri-devel@lists.freedesktop.org
-S:     Maintained
-C:     irc://irc.oftc.net/dri-devel
-T:     git https://git.kernel.org/pub/scm/linux/kernel/git/ogabbay/accel.git
-F:     Documentation/accel/
-F:     drivers/accel/
-F:     include/drm/drm_accel.h
-
-DRM ACCEL DRIVERS FOR INTEL VPU
-M:     Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
-M:     Stanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
-L:     dri-devel@lists.freedesktop.org
-S:     Supported
-T:     git git://anongit.freedesktop.org/drm/drm-misc
-F:     drivers/accel/ivpu/
-F:     include/uapi/drm/ivpu_accel.h
-
 DRM DRIVERS FOR ALLWINNER A10
 M:     Maxime Ripard <mripard@kernel.org>
 M:     Chen-Yu Tsai <wens@csie.org>
@@ -6926,14 +6922,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/hisilicon/
 F:     drivers/gpu/drm/hisilicon/
 
-DRM DRIVER FOR HYPERV SYNTHETIC VIDEO DEVICE
-M:     Deepak Rawat <drawat.floss@gmail.com>
-L:     linux-hyperv@vger.kernel.org
-L:     dri-devel@lists.freedesktop.org
-S:     Maintained
-T:     git git://anongit.freedesktop.org/drm/drm-misc
-F:     drivers/gpu/drm/hyperv
-
 DRM DRIVERS FOR LIMA
 M:     Qiang Yu <yuq825@gmail.com>
 L:     dri-devel@lists.freedesktop.org
@@ -7085,6 +7073,14 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/xlnx/
 F:     drivers/gpu/drm/xlnx/
 
+DRM GPU SCHEDULER
+M:     Luben Tuikov <luben.tuikov@amd.com>
+L:     dri-devel@lists.freedesktop.org
+S:     Maintained
+T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     drivers/gpu/drm/scheduler/
+F:     include/drm/gpu_scheduler.h
+
 DRM PANEL DRIVERS
 M:     Neil Armstrong <neil.armstrong@linaro.org>
 R:     Sam Ravnborg <sam@ravnborg.org>
@@ -7113,14 +7109,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/ttm/
 F:     include/drm/ttm/
 
-DRM GPU SCHEDULER
-M:     Luben Tuikov <luben.tuikov@amd.com>
-L:     dri-devel@lists.freedesktop.org
-S:     Maintained
-T:     git git://anongit.freedesktop.org/drm/drm-misc
-F:     drivers/gpu/drm/scheduler/
-F:     include/drm/gpu_scheduler.h
-
 DSBR100 USB FM RADIO DRIVER
 M:     Alexey Klimov <klimov.linux@gmail.com>
 L:     linux-media@vger.kernel.org
@@ -7248,10 +7236,10 @@ F:      drivers/media/usb/dvb-usb-v2/usb_urb.c
 
 DYNAMIC DEBUG
 M:     Jason Baron <jbaron@akamai.com>
+M:     Jim Cromie <jim.cromie@gmail.com>
 S:     Maintained
 F:     include/linux/dynamic_debug.h
 F:     lib/dynamic_debug.c
-M:     Jim Cromie <jim.cromie@gmail.com>
 F:     lib/test_dynamic_debug.c
 
 DYNAMIC INTERRUPT MODERATION
@@ -7261,6 +7249,15 @@ F:       Documentation/networking/net_dim.rst
 F:     include/linux/dim.h
 F:     lib/dim/
 
+DYNAMIC THERMAL POWER MANAGEMENT (DTPM)
+M:     Daniel Lezcano <daniel.lezcano@kernel.org>
+L:     linux-pm@vger.kernel.org
+S:     Supported
+B:     https://bugzilla.kernel.org
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
+F:     drivers/powercap/dtpm*
+F:     include/linux/dtpm.h
+
 DZ DECSTATION DZ11 SERIAL DRIVER
 M:     "Maciej W. Rozycki" <macro@orcam.me.uk>
 S:     Maintained
@@ -7599,22 +7596,22 @@ W:      http://www.broadcom.com
 F:     drivers/infiniband/hw/ocrdma/
 F:     include/uapi/rdma/ocrdma-abi.h
 
-EMULEX/BROADCOM LPFC FC/FCOE SCSI DRIVER
+EMULEX/BROADCOM EFCT FC/FCOE SCSI TARGET DRIVER
 M:     James Smart <james.smart@broadcom.com>
-M:     Dick Kennedy <dick.kennedy@broadcom.com>
+M:     Ram Vegesna <ram.vegesna@broadcom.com>
 L:     linux-scsi@vger.kernel.org
+L:     target-devel@vger.kernel.org
 S:     Supported
 W:     http://www.broadcom.com
-F:     drivers/scsi/lpfc/
+F:     drivers/scsi/elx/
 
-EMULEX/BROADCOM EFCT FC/FCOE SCSI TARGET DRIVER
+EMULEX/BROADCOM LPFC FC/FCOE SCSI DRIVER
 M:     James Smart <james.smart@broadcom.com>
-M:     Ram Vegesna <ram.vegesna@broadcom.com>
+M:     Dick Kennedy <dick.kennedy@broadcom.com>
 L:     linux-scsi@vger.kernel.org
-L:     target-devel@vger.kernel.org
 S:     Supported
 W:     http://www.broadcom.com
-F:     drivers/scsi/elx/
+F:     drivers/scsi/lpfc/
 
 ENE CB710 FLASH CARD READER DRIVER
 M:     MichaÅ‚ MirosÅ‚aw <mirq-linux@rere.qmqm.pl>
@@ -7707,8 +7704,8 @@ F:        drivers/net/mdio/of_mdio.c
 F:     drivers/net/pcs/
 F:     drivers/net/phy/
 F:     include/dt-bindings/net/qca-ar803x.h
-F:     include/linux/linkmode.h
 F:     include/linux/*mdio*.h
+F:     include/linux/linkmode.h
 F:     include/linux/mdio/*.h
 F:     include/linux/mii.h
 F:     include/linux/of_net.h
@@ -7771,8 +7768,8 @@ M:        Mimi Zohar <zohar@linux.ibm.com>
 L:     linux-integrity@vger.kernel.org
 S:     Supported
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
-F:     security/integrity/evm/
 F:     security/integrity/
+F:     security/integrity/evm/
 
 EXTENSIBLE FIRMWARE INTERFACE (EFI)
 M:     Ard Biesheuvel <ardb@kernel.org>
@@ -7803,8 +7800,8 @@ EXTRA BOOT CONFIG
 M:     Masami Hiramatsu <mhiramat@kernel.org>
 L:     linux-kernel@vger.kernel.org
 L:     linux-trace-kernel@vger.kernel.org
-Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 F:     Documentation/admin-guide/bootconfig.rst
 F:     fs/proc/bootconfig.c
@@ -8091,21 +8088,6 @@ F:       Documentation/fpga/
 F:     drivers/fpga/
 F:     include/linux/fpga/
 
-INTEL MAX10 BMC SECURE UPDATES
-M:     Russ Weight <russell.h.weight@intel.com>
-L:     linux-fpga@vger.kernel.org
-S:     Maintained
-F:     Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update
-F:     drivers/fpga/intel-m10-bmc-sec-update.c
-
-MICROCHIP POLARFIRE FPGA DRIVERS
-M:     Conor Dooley <conor.dooley@microchip.com>
-R:     Ivan Bornyakov <i.bornyakov@metrotek.ru>
-L:     linux-fpga@vger.kernel.org
-S:     Supported
-F:     Documentation/devicetree/bindings/fpga/microchip,mpf-spi-fpga-mgr.yaml
-F:     drivers/fpga/microchip-spi.c
-
 FPU EMULATOR
 M:     Bill Metzenthen <billm@melbpc.org.au>
 S:     Maintained
@@ -8114,9 +8096,9 @@ F:        arch/x86/math-emu/
 
 FRAMEBUFFER CORE
 M:     Daniel Vetter <daniel@ffwll.ch>
-F:     drivers/video/fbdev/core/
 S:     Odd Fixes
 T:     git git://anongit.freedesktop.org/drm/drm-misc
+F:     drivers/video/fbdev/core/
 
 FRAMEBUFFER LAYER
 M:     Helge Deller <deller@gmx.de>
@@ -8493,15 +8475,15 @@ M:      Masami Hiramatsu <mhiramat@kernel.org>
 R:     Mark Rutland <mark.rutland@arm.com>
 L:     linux-kernel@vger.kernel.org
 L:     linux-trace-kernel@vger.kernel.org
-Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 F:     Documentation/trace/ftrace*
-F:     kernel/trace/ftrace*
-F:     kernel/trace/fgraph.c
 F:     arch/*/*/*/*ftrace*
 F:     arch/*/*/*ftrace*
 F:     include/*/ftrace.h
+F:     kernel/trace/fgraph.c
+F:     kernel/trace/ftrace*
 F:     samples/ftrace
 
 FUNGIBLE ETHERNET DRIVERS
@@ -8542,10 +8524,10 @@ GATEWORKS SYSTEM CONTROLLER (GSC) DRIVER
 M:     Tim Harvey <tharvey@gateworks.com>
 S:     Maintained
 F:     Documentation/devicetree/bindings/mfd/gateworks-gsc.yaml
-F:     drivers/mfd/gateworks-gsc.c
-F:     include/linux/mfd/gsc.h
 F:     Documentation/hwmon/gsc-hwmon.rst
 F:     drivers/hwmon/gsc-hwmon.c
+F:     drivers/mfd/gateworks-gsc.c
+F:     include/linux/mfd/gsc.h
 F:     include/linux/platform_data/gsc_hwmon.h
 
 GCC PLUGINS
@@ -8673,8 +8655,8 @@ R:        Andy Shevchenko <andy@kernel.org>
 S:     Maintained
 F:     lib/string.c
 F:     lib/string_helpers.c
-F:     lib/test_string.c
 F:     lib/test-string_helpers.c
+F:     lib/test_string.c
 
 GENERIC UIO DRIVER FOR PCI DEVICES
 M:     "Michael S. Tsirkin" <mst@redhat.com>
@@ -9157,25 +9139,18 @@ L:      linux-input@vger.kernel.org
 S:     Maintained
 F:     drivers/hid/hid-logitech-*
 
-HID++ LOGITECH DRIVERS
-R:     Filipe Laíns <lains@riseup.net>
-R:     Bastien Nocera <hadess@hadess.net>
-L:     linux-input@vger.kernel.org
-S:     Maintained
-F:     drivers/hid/hid-logitech-hidpp.c
-
-HID PLAYSTATION DRIVER
-M:     Roderick Colenbrander <roderick.colenbrander@sony.com>
-L:     linux-input@vger.kernel.org
-S:     Supported
-F:     drivers/hid/hid-playstation.c
-
 HID PHOENIX RC FLIGHT CONTROLLER
 M:     Marcus Folkesson <marcus.folkesson@gmail.com>
 L:     linux-input@vger.kernel.org
 S:     Maintained
 F:     drivers/hid/hid-pxrc.c
 
+HID PLAYSTATION DRIVER
+M:     Roderick Colenbrander <roderick.colenbrander@sony.com>
+L:     linux-input@vger.kernel.org
+S:     Supported
+F:     drivers/hid/hid-playstation.c
+
 HID SENSOR HUB DRIVERS
 M:     Jiri Kosina <jikos@kernel.org>
 M:     Jonathan Cameron <jic23@kernel.org>
@@ -9202,6 +9177,13 @@ S:       Maintained
 F:     drivers/hid/wacom.h
 F:     drivers/hid/wacom_*
 
+HID++ LOGITECH DRIVERS
+R:     Filipe Laíns <lains@riseup.net>
+R:     Bastien Nocera <hadess@hadess.net>
+L:     linux-input@vger.kernel.org
+S:     Maintained
+F:     drivers/hid/hid-logitech-hidpp.c
+
 HIGH-RESOLUTION TIMERS, CLOCKEVENTS
 M:     Thomas Gleixner <tglx@linutronix.de>
 L:     linux-kernel@vger.kernel.org
@@ -9226,6 +9208,12 @@ W:       http://www.highpoint-tech.com
 F:     Documentation/scsi/hptiop.rst
 F:     drivers/scsi/hptiop.c
 
+HIKEY960 ONBOARD USB GPIO HUB DRIVER
+M:     John Stultz <jstultz@google.com>
+L:     linux-kernel@vger.kernel.org
+S:     Maintained
+F:     drivers/misc/hisi_hikey_usb.c
+
 HIMAX HX83112B TOUCHSCREEN SUPPORT
 M:     Job Noorman <job@noorman.info>
 L:     linux-input@vger.kernel.org
@@ -9274,6 +9262,12 @@ F:       drivers/crypto/hisilicon/hpre/hpre.h
 F:     drivers/crypto/hisilicon/hpre/hpre_crypto.c
 F:     drivers/crypto/hisilicon/hpre/hpre_main.c
 
+HISILICON HNS3 PMU DRIVER
+M:     Guangbin Huang <huangguangbin2@huawei.com>
+S:     Supported
+F:     Documentation/admin-guide/perf/hns3-pmu.rst
+F:     drivers/perf/hisilicon/hns3_pmu.c
+
 HISILICON I2C CONTROLLER DRIVER
 M:     Yicong Yang <yangyicong@hisilicon.com>
 L:     linux-i2c@vger.kernel.org
@@ -9306,12 +9300,6 @@ W:       http://www.hisilicon.com
 F:     Documentation/devicetree/bindings/net/hisilicon*.txt
 F:     drivers/net/ethernet/hisilicon/
 
-HIKEY960 ONBOARD USB GPIO HUB DRIVER
-M:     John Stultz <jstultz@google.com>
-L:     linux-kernel@vger.kernel.org
-S:     Maintained
-F:     drivers/misc/hisi_hikey_usb.c
-
 HISILICON PMU DRIVER
 M:     Shaokun Zhang <zhangshaokun@hisilicon.com>
 M:     Jonathan Cameron <jonathan.cameron@huawei.com>
@@ -9321,12 +9309,6 @@ F:       Documentation/admin-guide/perf/hisi-pcie-pmu.rst
 F:     Documentation/admin-guide/perf/hisi-pmu.rst
 F:     drivers/perf/hisilicon
 
-HISILICON HNS3 PMU DRIVER
-M:     Guangbin Huang <huangguangbin2@huawei.com>
-S:     Supported
-F:     Documentation/admin-guide/perf/hns3-pmu.rst
-F:     drivers/perf/hisilicon/hns3_pmu.c
-
 HISILICON PTT DRIVER
 M:     Yicong Yang <yangyicong@hisilicon.com>
 M:     Jonathan Cameron <jonathan.cameron@huawei.com>
@@ -9350,14 +9332,6 @@ F:       drivers/crypto/hisilicon/qm.c
 F:     drivers/crypto/hisilicon/sgl.c
 F:     include/linux/hisi_acc_qm.h
 
-HISILICON ZIP Controller DRIVER
-M:     Yang Shen <shenyang39@huawei.com>
-M:     Zhou Wang <wangzhou1@hisilicon.com>
-L:     linux-crypto@vger.kernel.org
-S:     Maintained
-F:     Documentation/ABI/testing/debugfs-hisi-zip
-F:     drivers/crypto/hisilicon/zip/
-
 HISILICON ROCE DRIVER
 M:     Haoyue Xu <xuhaoyue1@hisilicon.com>
 M:     Wenpeng Liang <liangwenpeng@huawei.com>
@@ -9416,6 +9390,14 @@ S:       Maintained
 W:     http://www.hisilicon.com
 F:     drivers/spi/spi-hisi-sfc-v3xx.c
 
+HISILICON ZIP Controller DRIVER
+M:     Yang Shen <shenyang39@huawei.com>
+M:     Zhou Wang <wangzhou1@hisilicon.com>
+L:     linux-crypto@vger.kernel.org
+S:     Maintained
+F:     Documentation/ABI/testing/debugfs-hisi-zip
+F:     drivers/crypto/hisilicon/zip/
+
 HMM - Heterogeneous Memory Management
 M:     Jérôme Glisse <jglisse@redhat.com>
 L:     linux-mm@kvack.org
@@ -9492,9 +9474,9 @@ F:        drivers/input/touchscreen/htcpen.c
 HTE SUBSYSTEM
 M:     Dipen Patel <dipenp@nvidia.com>
 L:     timestamp@lists.linux.dev
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pateldipen1984/linux.git
-Q:     https://patchwork.kernel.org/project/timestamp/list/
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/timestamp/list/
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pateldipen1984/linux.git
 F:     Documentation/devicetree/bindings/timestamp/
 F:     Documentation/driver-api/hte/
 F:     drivers/hte/
@@ -9589,8 +9571,8 @@ T:        git git://git.kernel.org/pub/scm/linux/kernel/git/hyperv/linux.git
 F:     Documentation/ABI/stable/sysfs-bus-vmbus
 F:     Documentation/ABI/testing/debugfs-hyperv
 F:     Documentation/devicetree/bindings/bus/microsoft,vmbus.yaml
-F:     Documentation/virt/hyperv
 F:     Documentation/networking/device_drivers/ethernet/microsoft/netvsc.rst
+F:     Documentation/virt/hyperv
 F:     arch/arm64/hyperv
 F:     arch/arm64/include/asm/hyperv-tlfs.h
 F:     arch/arm64/include/asm/mshyperv.h
@@ -9772,6 +9754,12 @@ L:       linux-i2c@vger.kernel.org
 S:     Maintained
 F:     drivers/i2c/i2c-stub.c
 
+I3C DRIVER FOR ASPEED AST2600
+M:     Jeremy Kerr <jk@codeconstruct.com.au>
+S:     Maintained
+F:     Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c.yaml
+F:     drivers/i3c/master/ast2600-i3c-master.c
+
 I3C DRIVER FOR CADENCE I3C MASTER IP
 M:     PrzemysÅ‚aw Gaj <pgaj@cadence.com>
 S:     Maintained
@@ -9783,12 +9771,6 @@ S:       Orphan
 F:     Documentation/devicetree/bindings/i3c/snps,dw-i3c-master.yaml
 F:     drivers/i3c/master/dw*
 
-I3C DRIVER FOR ASPEED AST2600
-M:     Jeremy Kerr <jk@codeconstruct.com.au>
-S:     Maintained
-F:     Documentation/devicetree/bindings/i3c/aspeed,ast2600-i3c.yaml
-F:     drivers/i3c/master/ast2600-i3c-master.c
-
 I3C SUBSYSTEM
 M:     Alexandre Belloni <alexandre.belloni@bootlin.com>
 L:     linux-i3c@lists.infradead.org (moderated for non-subscribers)
@@ -9867,6 +9849,11 @@ L:       netdev@vger.kernel.org
 S:     Supported
 F:     drivers/net/ethernet/ibm/ibmvnic.*
 
+IBM Power VFIO Support
+M:     Timothy Pearson <tpearson@raptorengineering.com>
+S:     Supported
+F:     drivers/vfio/vfio_iommu_spapr_tce.c
+
 IBM Power Virtual Ethernet Device Driver
 M:     Nick Child <nnac123@linux.ibm.com>
 L:     netdev@vger.kernel.org
@@ -9912,11 +9899,6 @@ F:       drivers/crypto/vmx/ghash*
 F:     drivers/crypto/vmx/ppc-xlate.pl
 F:     drivers/crypto/vmx/vmx.c
 
-IBM Power VFIO Support
-M:     Timothy Pearson <tpearson@raptorengineering.com>
-S:     Supported
-F:     drivers/vfio/vfio_iommu_spapr_tce.c
-
 IBM ServeRAID RAID DRIVER
 S:     Orphan
 F:     drivers/scsi/ips.*
@@ -9984,6 +9966,10 @@ F:       include/net/nl802154.h
 F:     net/ieee802154/
 F:     net/mac802154/
 
+IFCVF VIRTIO DATA PATH ACCELERATOR
+R:     Zhu Lingshan <lingshan.zhu@intel.com>
+F:     drivers/vdpa/ifcvf/
+
 IFE PROTOCOL
 M:     Yotam Gigi <yotam.gi@gmail.com>
 M:     Jamal Hadi Salim <jhs@mojatatu.com>
@@ -10248,8 +10234,8 @@ M:      Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
 L:     linux-integrity@vger.kernel.org
 S:     Supported
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/zohar/linux-integrity.git
-F:     security/integrity/ima/
 F:     security/integrity/
+F:     security/integrity/ima/
 
 INTEL 810/815 FRAMEBUFFER DRIVER
 M:     Antonino Daplas <adaplas@gmail.com>
@@ -10403,14 +10389,6 @@ S:     Supported
 Q:     https://patchwork.kernel.org/project/linux-dmaengine/list/
 F:     drivers/dma/ioat*
 
-INTEL IDXD DRIVER
-M:     Fenghua Yu <fenghua.yu@intel.com>
-M:     Dave Jiang <dave.jiang@intel.com>
-L:     dmaengine@vger.kernel.org
-S:     Supported
-F:     drivers/dma/idxd/*
-F:     include/uapi/linux/idxd.h
-
 INTEL IDLE DRIVER
 M:     Jacob Pan <jacob.jun.pan@linux.intel.com>
 M:     Len Brown <lenb@kernel.org>
@@ -10420,6 +10398,14 @@ B:     https://bugzilla.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux.git
 F:     drivers/idle/intel_idle.c
 
+INTEL IDXD DRIVER
+M:     Fenghua Yu <fenghua.yu@intel.com>
+M:     Dave Jiang <dave.jiang@intel.com>
+L:     dmaengine@vger.kernel.org
+S:     Supported
+F:     drivers/dma/idxd/*
+F:     include/uapi/linux/idxd.h
+
 INTEL IN FIELD SCAN (IFS) DEVICE
 M:     Jithu Joseph <jithu.joseph@intel.com>
 R:     Ashok Raj <ashok.raj@intel.com>
@@ -10466,18 +10452,18 @@ F:    Documentation/admin-guide/media/ipu3_rcb.svg
 F:     Documentation/userspace-api/media/v4l/pixfmt-meta-intel-ipu3.rst
 F:     drivers/staging/media/ipu3/
 
-INTEL IXP4XX CRYPTO SUPPORT
-M:     Corentin Labbe <clabbe@baylibre.com>
-L:     linux-crypto@vger.kernel.org
-S:     Maintained
-F:     drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
-
 INTEL ISHTP ECLITE DRIVER
 M:     Sumesh K Naduvalath <sumesh.k.naduvalath@intel.com>
 L:     platform-driver-x86@vger.kernel.org
 S:     Supported
 F:     drivers/platform/x86/intel/ishtp_eclite.c
 
+INTEL IXP4XX CRYPTO SUPPORT
+M:     Corentin Labbe <clabbe@baylibre.com>
+L:     linux-crypto@vger.kernel.org
+S:     Maintained
+F:     drivers/crypto/intel/ixp4xx/ixp4xx_crypto.c
+
 INTEL IXP4XX QMGR, NPE, ETHERNET and HSS SUPPORT
 M:     Krzysztof Halasa <khalasa@piap.pl>
 S:     Maintained
@@ -10556,6 +10542,13 @@ F:     drivers/hwmon/intel-m10-bmc-hwmon.c
 F:     drivers/mfd/intel-m10-bmc*
 F:     include/linux/mfd/intel-m10-bmc.h
 
+INTEL MAX10 BMC SECURE UPDATES
+M:     Russ Weight <russell.h.weight@intel.com>
+L:     linux-fpga@vger.kernel.org
+S:     Maintained
+F:     Documentation/ABI/testing/sysfs-driver-intel-m10-bmc-sec-update
+F:     drivers/fpga/intel-m10-bmc-sec-update.c
+
 INTEL P-Unit IPC DRIVER
 M:     Zha Qipeng <qipeng.zha@intel.com>
 L:     platform-driver-x86@vger.kernel.org
@@ -10603,6 +10596,13 @@ L:     linux-pm@vger.kernel.org
 S:     Supported
 F:     drivers/cpufreq/intel_pstate.c
 
+INTEL PTP DFL ToD DRIVER
+M:     Tianfei Zhang <tianfei.zhang@intel.com>
+L:     linux-fpga@vger.kernel.org
+L:     netdev@vger.kernel.org
+S:     Maintained
+F:     drivers/ptp/ptp_dfl_tod.c
+
 INTEL QUADRATURE ENCODER PERIPHERAL DRIVER
 M:     Jarkko Nikula <jarkko.nikula@linux.intel.com>
 L:     linux-iio@vger.kernel.org
@@ -10621,6 +10621,21 @@ F:     drivers/platform/x86/intel/sdsi.c
 F:     tools/arch/x86/intel_sdsi/
 F:     tools/testing/selftests/drivers/sdsi/
 
+INTEL SGX
+M:     Jarkko Sakkinen <jarkko@kernel.org>
+R:     Dave Hansen <dave.hansen@linux.intel.com>
+L:     linux-sgx@vger.kernel.org
+S:     Supported
+Q:     https://patchwork.kernel.org/project/intel-sgx/list/
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/sgx
+F:     Documentation/arch/x86/sgx.rst
+F:     arch/x86/entry/vdso/vsgx.S
+F:     arch/x86/include/asm/sgx.h
+F:     arch/x86/include/uapi/asm/sgx.h
+F:     arch/x86/kernel/cpu/sgx/*
+F:     tools/testing/selftests/sgx/*
+K:     \bSGX_
+
 INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER
 M:     Daniel Scally <djrscally@gmail.com>
 S:     Maintained
@@ -10638,13 +10653,13 @@ INTEL STRATIX10 FIRMWARE DRIVERS
 M:     Dinh Nguyen <dinguyen@kernel.org>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
 F:     Documentation/ABI/testing/sysfs-devices-platform-stratix10-rsu
 F:     Documentation/devicetree/bindings/firmware/intel,stratix10-svc.txt
 F:     drivers/firmware/stratix10-rsu.c
 F:     drivers/firmware/stratix10-svc.c
 F:     include/linux/firmware/intel/stratix10-smc.h
 F:     include/linux/firmware/intel/stratix10-svc-client.h
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/dinguyen/linux.git
 
 INTEL TELEMETRY DRIVER
 M:     Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
@@ -10729,21 +10744,6 @@ F:     Documentation/arch/x86/intel_txt.rst
 F:     arch/x86/kernel/tboot.c
 F:     include/linux/tboot.h
 
-INTEL SGX
-M:     Jarkko Sakkinen <jarkko@kernel.org>
-R:     Dave Hansen <dave.hansen@linux.intel.com>
-L:     linux-sgx@vger.kernel.org
-S:     Supported
-Q:     https://patchwork.kernel.org/project/intel-sgx/list/
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/sgx
-F:     Documentation/arch/x86/sgx.rst
-F:     arch/x86/entry/vdso/vsgx.S
-F:     arch/x86/include/asm/sgx.h
-F:     arch/x86/include/uapi/asm/sgx.h
-F:     arch/x86/kernel/cpu/sgx/*
-F:     tools/testing/selftests/sgx/*
-K:     \bSGX_
-
 INTERCONNECT API
 M:     Georgi Djakov <djakov@kernel.org>
 L:     linux-pm@vger.kernel.org
@@ -10812,18 +10812,6 @@ F:     drivers/iommu/dma-iommu.h
 F:     drivers/iommu/iova.c
 F:     include/linux/iova.h
 
-IOMMUFD
-M:     Jason Gunthorpe <jgg@nvidia.com>
-M:     Kevin Tian <kevin.tian@intel.com>
-L:     iommu@lists.linux.dev
-S:     Maintained
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
-F:     Documentation/userspace-api/iommufd.rst
-F:     drivers/iommu/iommufd/
-F:     include/linux/iommufd.h
-F:     include/uapi/linux/iommufd.h
-F:     tools/testing/selftests/iommu/
-
 IOMMU SUBSYSTEM
 M:     Joerg Roedel <joro@8bytes.org>
 M:     Will Deacon <will@kernel.org>
@@ -10839,6 +10827,18 @@ F:     include/linux/iova.h
 F:     include/linux/of_iommu.h
 F:     include/uapi/linux/iommu.h
 
+IOMMUFD
+M:     Jason Gunthorpe <jgg@nvidia.com>
+M:     Kevin Tian <kevin.tian@intel.com>
+L:     iommu@lists.linux.dev
+S:     Maintained
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/jgg/iommufd.git
+F:     Documentation/userspace-api/iommufd.rst
+F:     drivers/iommu/iommufd/
+F:     include/linux/iommufd.h
+F:     include/uapi/linux/iommufd.h
+F:     tools/testing/selftests/iommu/
+
 IOSYS-MAP HELPERS
 M:     Thomas Zimmermann <tzimmermann@suse.de>
 L:     dri-devel@lists.freedesktop.org
@@ -10853,11 +10853,11 @@ L:    io-uring@vger.kernel.org
 S:     Maintained
 T:     git git://git.kernel.dk/linux-block
 T:     git git://git.kernel.dk/liburing
-F:     io_uring/
 F:     include/linux/io_uring.h
 F:     include/linux/io_uring_types.h
 F:     include/trace/events/io_uring.h
 F:     include/uapi/linux/io_uring.h
+F:     io_uring/
 F:     tools/io_uring/
 
 IPMI SUBSYSTEM
@@ -10866,8 +10866,8 @@ L:      openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
 S:     Supported
 W:     http://openipmi.sourceforge.net/
 T:     git https://github.com/cminyard/linux-ipmi.git for-next
-F:     Documentation/driver-api/ipmi.rst
 F:     Documentation/devicetree/bindings/ipmi/
+F:     Documentation/driver-api/ipmi.rst
 F:     drivers/char/ipmi/
 F:     include/linux/ipmi*
 F:     include/uapi/linux/ipmi*
@@ -10919,8 +10919,8 @@ M:      Thomas Gleixner <tglx@linutronix.de>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
-F:     kernel/irq/
 F:     include/linux/group_cpus.h
+F:     kernel/irq/
 F:     lib/group_cpus.c
 
 IRQCHIP DRIVERS
@@ -11258,6 +11258,7 @@ L:      linux-nfs@vger.kernel.org
 S:     Supported
 W:     http://nfs.sourceforge.net/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git
+F:     Documentation/filesystems/nfs/
 F:     fs/exportfs/
 F:     fs/lockd/
 F:     fs/nfs_common/
@@ -11273,7 +11274,6 @@ F:      include/trace/misc/sunrpc.h
 F:     include/uapi/linux/nfsd/
 F:     include/uapi/linux/sunrpc/
 F:     net/sunrpc/
-F:     Documentation/filesystems/nfs/
 
 KERNEL REGRESSIONS
 M:     Thorsten Leemhuis <linux@leemhuis.info>
@@ -11392,79 +11392,38 @@ F:    tools/testing/selftests/kvm/*/riscv/
 KERNEL VIRTUAL MACHINE for s390 (KVM/s390)
 M:     Christian Borntraeger <borntraeger@linux.ibm.com>
 M:     Janosch Frank <frankja@linux.ibm.com>
-M:     Claudio Imbrenda <imbrenda@linux.ibm.com>
-R:     David Hildenbrand <david@redhat.com>
-L:     kvm@vger.kernel.org
-S:     Supported
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
-F:     Documentation/virt/kvm/s390*
-F:     arch/s390/include/asm/gmap.h
-F:     arch/s390/include/asm/kvm*
-F:     arch/s390/include/uapi/asm/kvm*
-F:     arch/s390/include/uapi/asm/uvdevice.h
-F:     arch/s390/kernel/uv.c
-F:     arch/s390/kvm/
-F:     arch/s390/mm/gmap.c
-F:     drivers/s390/char/uvdevice.c
-F:     tools/testing/selftests/drivers/s390x/uvdevice/
-F:     tools/testing/selftests/kvm/*/s390x/
-F:     tools/testing/selftests/kvm/s390x/
-
-KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
-M:     Sean Christopherson <seanjc@google.com>
-M:     Paolo Bonzini <pbonzini@redhat.com>
-L:     kvm@vger.kernel.org
-S:     Supported
-T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
-F:     arch/x86/include/asm/kvm*
-F:     arch/x86/include/asm/svm.h
-F:     arch/x86/include/asm/vmx*.h
-F:     arch/x86/include/uapi/asm/kvm*
-F:     arch/x86/include/uapi/asm/svm.h
-F:     arch/x86/include/uapi/asm/vmx.h
-F:     arch/x86/kvm/
-F:     arch/x86/kvm/*/
-
-KVM PARAVIRT (KVM/paravirt)
-M:     Paolo Bonzini <pbonzini@redhat.com>
-R:     Wanpeng Li <wanpengli@tencent.com>
-R:     Vitaly Kuznetsov <vkuznets@redhat.com>
-L:     kvm@vger.kernel.org
-S:     Supported
-T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
-F:     arch/x86/kernel/kvm.c
-F:     arch/x86/kernel/kvmclock.c
-F:     arch/x86/include/asm/pvclock-abi.h
-F:     include/linux/kvm_para.h
-F:     include/uapi/linux/kvm_para.h
-F:     include/uapi/asm-generic/kvm_para.h
-F:     include/asm-generic/kvm_para.h
-F:     arch/um/include/asm/kvm_para.h
-F:     arch/x86/include/asm/kvm_para.h
-F:     arch/x86/include/uapi/asm/kvm_para.h
-
-KVM X86 HYPER-V (KVM/hyper-v)
-M:     Vitaly Kuznetsov <vkuznets@redhat.com>
-M:     Sean Christopherson <seanjc@google.com>
-M:     Paolo Bonzini <pbonzini@redhat.com>
-L:     kvm@vger.kernel.org
-S:     Supported
-T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
-F:     arch/x86/kvm/hyperv.*
-F:     arch/x86/kvm/kvm_onhyperv.*
-F:     arch/x86/kvm/svm/hyperv.*
-F:     arch/x86/kvm/svm/svm_onhyperv.*
-F:     arch/x86/kvm/vmx/hyperv.*
+M:     Claudio Imbrenda <imbrenda@linux.ibm.com>
+R:     David Hildenbrand <david@redhat.com>
+L:     kvm@vger.kernel.org
+S:     Supported
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
+F:     Documentation/virt/kvm/s390*
+F:     arch/s390/include/asm/gmap.h
+F:     arch/s390/include/asm/kvm*
+F:     arch/s390/include/uapi/asm/kvm*
+F:     arch/s390/include/uapi/asm/uvdevice.h
+F:     arch/s390/kernel/uv.c
+F:     arch/s390/kvm/
+F:     arch/s390/mm/gmap.c
+F:     drivers/s390/char/uvdevice.c
+F:     tools/testing/selftests/drivers/s390x/uvdevice/
+F:     tools/testing/selftests/kvm/*/s390x/
+F:     tools/testing/selftests/kvm/s390x/
 
-KVM X86 Xen (KVM/Xen)
-M:     David Woodhouse <dwmw2@infradead.org>
-M:     Paul Durrant <paul@xen.org>
+KERNEL VIRTUAL MACHINE FOR X86 (KVM/x86)
 M:     Sean Christopherson <seanjc@google.com>
 M:     Paolo Bonzini <pbonzini@redhat.com>
 L:     kvm@vger.kernel.org
 S:     Supported
 T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
-F:     arch/x86/kvm/xen.*
+F:     arch/x86/include/asm/kvm*
+F:     arch/x86/include/asm/svm.h
+F:     arch/x86/include/asm/vmx*.h
+F:     arch/x86/include/uapi/asm/kvm*
+F:     arch/x86/include/uapi/asm/svm.h
+F:     arch/x86/include/uapi/asm/vmx.h
+F:     arch/x86/kvm/
+F:     arch/x86/kvm/*/
 
 KERNFS
 M:     Greg Kroah-Hartman <gregkh@linuxfoundation.org>
@@ -11504,14 +11463,6 @@ F:     include/keys/trusted-type.h
 F:     include/keys/trusted_tpm.h
 F:     security/keys/trusted-keys/
 
-KEYS-TRUSTED-TEE
-M:     Sumit Garg <sumit.garg@linaro.org>
-L:     linux-integrity@vger.kernel.org
-L:     keyrings@vger.kernel.org
-S:     Supported
-F:     include/keys/trusted_tee.h
-F:     security/keys/trusted-keys/trusted_tee.c
-
 KEYS-TRUSTED-CAAM
 M:     Ahmad Fatoum <a.fatoum@pengutronix.de>
 R:     Pengutronix Kernel Team <kernel@pengutronix.de>
@@ -11521,6 +11472,14 @@ S:     Maintained
 F:     include/keys/trusted_caam.h
 F:     security/keys/trusted-keys/trusted_caam.c
 
+KEYS-TRUSTED-TEE
+M:     Sumit Garg <sumit.garg@linaro.org>
+L:     linux-integrity@vger.kernel.org
+L:     keyrings@vger.kernel.org
+S:     Supported
+F:     include/keys/trusted_tee.h
+F:     security/keys/trusted-keys/trusted_tee.c
+
 KEYS/KEYRINGS
 M:     David Howells <dhowells@redhat.com>
 M:     Jarkko Sakkinen <jarkko@kernel.org>
@@ -11583,8 +11542,8 @@ L:      linux-amlogic@lists.infradead.org
 S:     Maintained
 F:     Documentation/devicetree/bindings/mfd/khadas,mcu.yaml
 F:     drivers/mfd/khadas-mcu.c
-F:     include/linux/mfd/khadas-mcu.h
 F:     drivers/thermal/khadas_mcu_fan.c
+F:     include/linux/mfd/khadas-mcu.h
 
 KIONIX/ROHM KX022A ACCELEROMETER
 M:     Matti Vaittinen <mazziesaccount@gmail.com>
@@ -11621,8 +11580,8 @@ M:      "David S. Miller" <davem@davemloft.net>
 M:     Masami Hiramatsu <mhiramat@kernel.org>
 L:     linux-kernel@vger.kernel.org
 L:     linux-trace-kernel@vger.kernel.org
-Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 F:     Documentation/trace/kprobes.rst
 F:     include/asm-generic/kprobes.h
@@ -11656,6 +11615,47 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/leds/backlight/kinetic,ktz8866.yaml
 F:     drivers/video/backlight/ktz8866.c
 
+KVM PARAVIRT (KVM/paravirt)
+M:     Paolo Bonzini <pbonzini@redhat.com>
+R:     Wanpeng Li <wanpengli@tencent.com>
+R:     Vitaly Kuznetsov <vkuznets@redhat.com>
+L:     kvm@vger.kernel.org
+S:     Supported
+T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
+F:     arch/um/include/asm/kvm_para.h
+F:     arch/x86/include/asm/kvm_para.h
+F:     arch/x86/include/asm/pvclock-abi.h
+F:     arch/x86/include/uapi/asm/kvm_para.h
+F:     arch/x86/kernel/kvm.c
+F:     arch/x86/kernel/kvmclock.c
+F:     include/asm-generic/kvm_para.h
+F:     include/linux/kvm_para.h
+F:     include/uapi/asm-generic/kvm_para.h
+F:     include/uapi/linux/kvm_para.h
+
+KVM X86 HYPER-V (KVM/hyper-v)
+M:     Vitaly Kuznetsov <vkuznets@redhat.com>
+M:     Sean Christopherson <seanjc@google.com>
+M:     Paolo Bonzini <pbonzini@redhat.com>
+L:     kvm@vger.kernel.org
+S:     Supported
+T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
+F:     arch/x86/kvm/hyperv.*
+F:     arch/x86/kvm/kvm_onhyperv.*
+F:     arch/x86/kvm/svm/hyperv.*
+F:     arch/x86/kvm/svm/svm_onhyperv.*
+F:     arch/x86/kvm/vmx/hyperv.*
+
+KVM X86 Xen (KVM/Xen)
+M:     David Woodhouse <dwmw2@infradead.org>
+M:     Paul Durrant <paul@xen.org>
+M:     Sean Christopherson <seanjc@google.com>
+M:     Paolo Bonzini <pbonzini@redhat.com>
+L:     kvm@vger.kernel.org
+S:     Supported
+T:     git git://git.kernel.org/pub/scm/virt/kvm/kvm.git
+F:     arch/x86/kvm/xen.*
+
 L3MDEV
 M:     David Ahern <dsahern@kernel.org>
 L:     netdev@vger.kernel.org
@@ -11897,9 +11897,9 @@ F:      scripts/spdxexclude
 LINEAR RANGES HELPERS
 M:     Mark Brown <broonie@kernel.org>
 R:     Matti Vaittinen <mazziesaccount@gmail.com>
+F:     include/linux/linear_range.h
 F:     lib/linear_ranges.c
 F:     lib/test_linear_ranges.c
-F:     include/linux/linear_range.h
 
 LINUX FOR POWER MACINTOSH
 M:     Benjamin Herrenschmidt <benh@kernel.crashing.org>
@@ -12026,11 +12026,11 @@ M:    Joel Stanley <joel@jms.id.au>
 S:     Maintained
 F:     Documentation/devicetree/bindings/*/litex,*.yaml
 F:     arch/openrisc/boot/dts/or1klitex.dts
-F:     include/linux/litex.h
-F:     drivers/tty/serial/liteuart.c
-F:     drivers/soc/litex/*
-F:     drivers/net/ethernet/litex/*
 F:     drivers/mmc/host/litex_mmc.c
+F:     drivers/net/ethernet/litex/*
+F:     drivers/soc/litex/*
+F:     drivers/tty/serial/liteuart.c
+F:     include/linux/litex.h
 N:     litex
 
 LIVE PATCHING
@@ -12159,10 +12159,17 @@ R:    WANG Xuerui <kernel@xen0n.name>
 L:     loongarch@lists.linux.dev
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson.git
-F:     arch/loongarch/
-F:     drivers/*/*loongarch*
 F:     Documentation/loongarch/
 F:     Documentation/translations/zh_CN/loongarch/
+F:     arch/loongarch/
+F:     drivers/*/*loongarch*
+
+LOONGSON GPIO DRIVER
+M:     Yinbo Zhu <zhuyinbo@loongson.cn>
+L:     linux-gpio@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
+F:     drivers/gpio/gpio-loongson-64bit.c
 
 LOONGSON LS2X I2C DRIVER
 M:     Binbin Zhou <zhoubinbin@loongson.cn>
@@ -12171,6 +12178,14 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/i2c/loongson,ls2x-i2c.yaml
 F:     drivers/i2c/busses/i2c-ls2x.c
 
+LOONGSON-2 SOC SERIES CLOCK DRIVER
+M:     Yinbo Zhu <zhuyinbo@loongson.cn>
+L:     linux-clk@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/clock/loongson,ls2k-clk.yaml
+F:     drivers/clk/clk-loongson2.c
+F:     include/dt-bindings/clock/loongson,ls2k-clk.h
+
 LOONGSON-2 SOC SERIES GUTS DRIVER
 M:     Yinbo Zhu <zhuyinbo@loongson.cn>
 L:     loongarch@lists.linux.dev
@@ -12186,21 +12201,6 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/pinctrl/loongson,ls2k-pinctrl.yaml
 F:     drivers/pinctrl/pinctrl-loongson2.c
 
-LOONGSON GPIO DRIVER
-M:     Yinbo Zhu <zhuyinbo@loongson.cn>
-L:     linux-gpio@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/gpio/loongson,ls-gpio.yaml
-F:     drivers/gpio/gpio-loongson-64bit.c
-
-LOONGSON-2 SOC SERIES CLOCK DRIVER
-M:     Yinbo Zhu <zhuyinbo@loongson.cn>
-L:     linux-clk@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/clock/loongson,ls2k-clk.yaml
-F:     drivers/clk/clk-loongson2.c
-F:     include/dt-bindings/clock/loongson,ls2k-clk.h
-
 LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
 M:     Sathya Prakash <sathya.prakash@broadcom.com>
 M:     Sreekanth Reddy <sreekanth.reddy@broadcom.com>
@@ -12361,20 +12361,26 @@ MAILBOX API
 M:     Jassi Brar <jassisinghbrar@gmail.com>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
+F:     Documentation/devicetree/bindings/mailbox/
 F:     drivers/mailbox/
+F:     include/dt-bindings/mailbox/
 F:     include/linux/mailbox_client.h
 F:     include/linux/mailbox_controller.h
-F:     include/dt-bindings/mailbox/
-F:     Documentation/devicetree/bindings/mailbox/
 
 MAILBOX ARM MHUv2
 M:     Viresh Kumar <viresh.kumar@linaro.org>
 M:     Tushar Khandelwal <Tushar.Khandelwal@arm.com>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
+F:     Documentation/devicetree/bindings/mailbox/arm,mhuv2.yaml
 F:     drivers/mailbox/arm_mhuv2.c
 F:     include/linux/mailbox/arm_mhuv2_message.h
-F:     Documentation/devicetree/bindings/mailbox/arm,mhuv2.yaml
+
+MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
+M:     Michael Kerrisk <mtk.manpages@gmail.com>
+L:     linux-man@vger.kernel.org
+S:     Maintained
+W:     http://www.kernel.org/doc/man-pages
 
 MANAGEMENT COMPONENT TRANSPORT PROTOCOL (MCTP)
 M:     Jeremy Kerr <jk@codeconstruct.com.au>
@@ -12388,12 +12394,6 @@ F:     include/net/mctpdevice.h
 F:     include/net/netns/mctp.h
 F:     net/mctp/
 
-MAN-PAGES: MANUAL PAGES FOR LINUX -- Sections 2, 3, 4, 5, and 7
-M:     Michael Kerrisk <mtk.manpages@gmail.com>
-L:     linux-man@vger.kernel.org
-S:     Maintained
-W:     http://www.kernel.org/doc/man-pages
-
 MAPLE TREE
 M:     Liam R. Howlett <Liam.Howlett@oracle.com>
 L:     linux-mm@kvack.org
@@ -12425,8 +12425,8 @@ F:      include/linux/platform_data/mv88e6xxx.h
 MARVELL ARMADA 3700 PHY DRIVERS
 M:     Miquel Raynal <miquel.raynal@bootlin.com>
 S:     Maintained
-F:     Documentation/devicetree/bindings/phy/phy-mvebu-comphy.txt
 F:     Documentation/devicetree/bindings/phy/marvell,armada-3700-utmi-phy.yaml
+F:     Documentation/devicetree/bindings/phy/phy-mvebu-comphy.txt
 F:     drivers/phy/marvell/phy-mvebu-a3700-comphy.c
 F:     drivers/phy/marvell/phy-mvebu-a3700-utmi.c
 
@@ -12528,6 +12528,13 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/mtd/marvell-nand.txt
 F:     drivers/mtd/nand/raw/marvell_nand.c
 
+MARVELL OCTEON ENDPOINT DRIVER
+M:     Veerasenareddy Burru <vburru@marvell.com>
+M:     Abhijit Ayarekar <aayarekar@marvell.com>
+L:     netdev@vger.kernel.org
+S:     Supported
+F:     drivers/net/ethernet/marvell/octeon_ep
+
 MARVELL OCTEONTX2 PHYSICAL FUNCTION DRIVER
 M:     Sunil Goutham <sgoutham@marvell.com>
 M:     Geetha sowjanya <gakula@marvell.com>
@@ -12575,13 +12582,6 @@ S:     Supported
 F:     Documentation/devicetree/bindings/mmc/marvell,xenon-sdhci.yaml
 F:     drivers/mmc/host/sdhci-xenon*
 
-MARVELL OCTEON ENDPOINT DRIVER
-M:     Veerasenareddy Burru <vburru@marvell.com>
-M:     Abhijit Ayarekar <aayarekar@marvell.com>
-L:     netdev@vger.kernel.org
-S:     Supported
-F:     drivers/net/ethernet/marvell/octeon_ep
-
 MATROX FRAMEBUFFER DRIVER
 L:     linux-fbdev@vger.kernel.org
 S:     Orphan
@@ -12781,12 +12781,6 @@ L:     netdev@vger.kernel.org
 S:     Supported
 F:     drivers/net/phy/mxl-gpy.c
 
-MCBA MICROCHIP CAN BUS ANALYZER TOOL DRIVER
-R:     Yasushi SHOJI <yashi@spacecubics.com>
-L:     linux-can@vger.kernel.org
-S:     Maintained
-F:     drivers/net/can/usb/mcba_usb.c
-
 MCAN MMIO DEVICE DRIVER
 M:     Chandrasekar Ramakrishnan <rcsekar@samsung.com>
 L:     linux-can@vger.kernel.org
@@ -12796,6 +12790,12 @@ F:     drivers/net/can/m_can/m_can.c
 F:     drivers/net/can/m_can/m_can.h
 F:     drivers/net/can/m_can/m_can_platform.c
 
+MCBA MICROCHIP CAN BUS ANALYZER TOOL DRIVER
+R:     Yasushi SHOJI <yashi@spacecubics.com>
+L:     linux-can@vger.kernel.org
+S:     Maintained
+F:     drivers/net/can/usb/mcba_usb.c
+
 MCP2221A MICROCHIP USB-HID TO I2C BRIDGE DRIVER
 M:     Rishi Gupta <gupt21@gmail.com>
 L:     linux-i2c@vger.kernel.org
@@ -13204,13 +13204,6 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/clock/mediatek,mt7621-sysc.yaml
 F:     drivers/clk/ralink/clk-mt7621.c
 
-MEDIATEK MT7621/28/88 I2C DRIVER
-M:     Stefan Roese <sr@denx.de>
-L:     linux-i2c@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
-F:     drivers/i2c/busses/i2c-mt7621.c
-
 MEDIATEK MT7621 PCIE CONTROLLER DRIVER
 M:     Sergio Paracuellos <sergio.paracuellos@gmail.com>
 S:     Maintained
@@ -13223,6 +13216,13 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/phy/mediatek,mt7621-pci-phy.yaml
 F:     drivers/phy/ralink/phy-mt7621-pci.c
 
+MEDIATEK MT7621/28/88 I2C DRIVER
+M:     Stefan Roese <sr@denx.de>
+L:     linux-i2c@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/i2c/mediatek,mt7621-i2c.yaml
+F:     drivers/i2c/busses/i2c-mt7621.c
+
 MEDIATEK NAND CONTROLLER DRIVER
 L:     linux-mtd@lists.infradead.org
 S:     Orphan
@@ -13482,10 +13482,22 @@ MEMORY FREQUENCY SCALING DRIVERS FOR NVIDIA TEGRA
 M:     Dmitry Osipenko <digetx@gmail.com>
 L:     linux-pm@vger.kernel.org
 L:     linux-tegra@vger.kernel.org
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git
 S:     Maintained
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/chanwoo/linux.git
 F:     drivers/devfreq/tegra30-devfreq.c
 
+MEMORY HOT(UN)PLUG
+M:     David Hildenbrand <david@redhat.com>
+M:     Oscar Salvador <osalvador@suse.de>
+L:     linux-mm@kvack.org
+S:     Maintained
+F:     Documentation/admin-guide/mm/memory-hotplug.rst
+F:     Documentation/core-api/memory-hotplug.rst
+F:     drivers/base/memory.c
+F:     include/linux/memory_hotplug.h
+F:     mm/memory_hotplug.c
+F:     tools/testing/selftests/memory-hotplug/
+
 MEMORY MANAGEMENT
 M:     Andrew Morton <akpm@linux-foundation.org>
 L:     linux-mm@kvack.org
@@ -13504,30 +13516,6 @@ F:     mm/
 F:     tools/mm/
 F:     tools/testing/selftests/mm/
 
-VMALLOC
-M:     Andrew Morton <akpm@linux-foundation.org>
-R:     Uladzislau Rezki <urezki@gmail.com>
-R:     Christoph Hellwig <hch@infradead.org>
-R:     Lorenzo Stoakes <lstoakes@gmail.com>
-L:     linux-mm@kvack.org
-S:     Maintained
-W:     http://www.linux-mm.org
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
-F:     include/linux/vmalloc.h
-F:     mm/vmalloc.c
-
-MEMORY HOT(UN)PLUG
-M:     David Hildenbrand <david@redhat.com>
-M:     Oscar Salvador <osalvador@suse.de>
-L:     linux-mm@kvack.org
-S:     Maintained
-F:     Documentation/admin-guide/mm/memory-hotplug.rst
-F:     Documentation/core-api/memory-hotplug.rst
-F:     drivers/base/memory.c
-F:     include/linux/memory_hotplug.h
-F:     mm/memory_hotplug.c
-F:     tools/testing/selftests/memory-hotplug/
-
 MEMORY TECHNOLOGY DEVICES (MTD)
 M:     Miquel Raynal <miquel.raynal@bootlin.com>
 M:     Richard Weinberger <richard@nod.at>
@@ -13638,6 +13626,12 @@ W:     http://www.monstr.eu/fdt/
 T:     git git://git.monstr.eu/linux-2.6-microblaze.git
 F:     arch/microblaze/
 
+MICROBLAZE TMR INJECT
+M:     Appana Durga Kedareswara rao <appana.durga.kedareswara.rao@amd.com>
+S:     Supported
+F:     Documentation/devicetree/bindings/misc/xlnx,tmr-inject.yaml
+F:     drivers/misc/xilinx_tmr_inject.c
+
 MICROBLAZE TMR MANAGER
 M:     Appana Durga Kedareswara rao <appana.durga.kedareswara.rao@amd.com>
 S:     Supported
@@ -13645,12 +13639,6 @@ F:     Documentation/ABI/testing/sysfs-driver-xilinx-tmr-manager
 F:     Documentation/devicetree/bindings/misc/xlnx,tmr-manager.yaml
 F:     drivers/misc/xilinx_tmr_manager.c
 
-MICROBLAZE TMR INJECT
-M:     Appana Durga Kedareswara rao <appana.durga.kedareswara.rao@amd.com>
-S:     Supported
-F:     Documentation/devicetree/bindings/misc/xlnx,tmr-inject.yaml
-F:     drivers/misc/xilinx_tmr_inject.c
-
 MICROCHIP AT91 DMA DRIVERS
 M:     Ludovic Desroches <ludovic.desroches@microchip.com>
 M:     Tudor Ambarus <tudor.ambarus@linaro.org>
@@ -13726,10 +13714,10 @@ L:    linux-media@vger.kernel.org
 S:     Supported
 F:     Documentation/devicetree/bindings/media/atmel,isc.yaml
 F:     Documentation/devicetree/bindings/media/microchip,xisc.yaml
-F:     drivers/staging/media/deprecated/atmel/atmel-isc*
-F:     drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
 F:     drivers/media/platform/microchip/microchip-isc*
 F:     drivers/media/platform/microchip/microchip-sama*-isc*
+F:     drivers/staging/media/deprecated/atmel/atmel-isc*
+F:     drivers/staging/media/deprecated/atmel/atmel-sama*-isc*
 F:     include/linux/atmel-isc-media.h
 
 MICROCHIP ISI DRIVER
@@ -13751,13 +13739,6 @@ F:     include/linux/dsa/ksz_common.h
 F:     include/linux/platform_data/microchip-ksz.h
 F:     net/dsa/tag_ksz.c
 
-MICROCHIP LAN87xx/LAN937x T1 PHY DRIVER
-M:     Arun Ramadoss <arun.ramadoss@microchip.com>
-R:     UNGLinuxDriver@microchip.com
-L:     netdev@vger.kernel.org
-S:     Maintained
-F:     drivers/net/phy/microchip_t1.c
-
 MICROCHIP LAN743X ETHERNET DRIVER
 M:     Bryan Whitehead <bryan.whitehead@microchip.com>
 M:     UNGLinuxDriver@microchip.com
@@ -13765,6 +13746,13 @@ L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/net/ethernet/microchip/lan743x_*
 
+MICROCHIP LAN87xx/LAN937x T1 PHY DRIVER
+M:     Arun Ramadoss <arun.ramadoss@microchip.com>
+R:     UNGLinuxDriver@microchip.com
+L:     netdev@vger.kernel.org
+S:     Maintained
+F:     drivers/net/phy/microchip_t1.c
+
 MICROCHIP LAN966X ETHERNET DRIVER
 M:     Horatiu Vultur <horatiu.vultur@microchip.com>
 M:     UNGLinuxDriver@microchip.com
@@ -13806,14 +13794,6 @@ S:     Supported
 F:     Documentation/devicetree/bindings/mtd/atmel-nand.txt
 F:     drivers/mtd/nand/raw/atmel/*
 
-MICROCHIP PCI1XXXX GP DRIVER
-M:     Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
-L:     linux-gpio@vger.kernel.org
-S:     Supported
-F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.c
-F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.h
-F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c
-
 MICROCHIP OTPC DRIVER
 M:     Claudiu Beznea <claudiu.beznea@microchip.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -13822,6 +13802,14 @@ F:     Documentation/devicetree/bindings/nvmem/microchip,sama7g5-otpc.yaml
 F:     drivers/nvmem/microchip-otpc.c
 F:     include/dt-bindings/nvmem/microchip,sama7g5-otpc.h
 
+MICROCHIP PCI1XXXX GP DRIVER
+M:     Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
+L:     linux-gpio@vger.kernel.org
+S:     Supported
+F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.c
+F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gp.h
+F:     drivers/misc/mchp_pci1xxxx/mchp_pci1xxxx_gpio.c
+
 MICROCHIP PCI1XXXX I2C DRIVER
 M:     Tharun Kumar P <tharunkumar.pasumarthi@microchip.com>
 M:     Kumaravel Thiagarajan <kumaravel.thiagarajan@microchip.com>
@@ -13837,6 +13825,14 @@ L:     linux-serial@vger.kernel.org
 S:     Maintained
 F:     drivers/tty/serial/8250/8250_pci1xxxx.c
 
+MICROCHIP POLARFIRE FPGA DRIVERS
+M:     Conor Dooley <conor.dooley@microchip.com>
+R:     Ivan Bornyakov <i.bornyakov@metrotek.ru>
+L:     linux-fpga@vger.kernel.org
+S:     Supported
+F:     Documentation/devicetree/bindings/fpga/microchip,mpf-spi-fpga-mgr.yaml
+F:     drivers/fpga/microchip-spi.c
+
 MICROCHIP PWM DRIVER
 M:     Claudiu Beznea <claudiu.beznea@microchip.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@@ -13858,6 +13854,12 @@ M:     Claudiu Beznea <claudiu.beznea@microchip.com>
 S:     Supported
 F:     drivers/power/reset/at91-sama5d2_shdwc.c
 
+MICROCHIP SOC DRIVERS
+M:     Conor Dooley <conor@kernel.org>
+S:     Supported
+T:     git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
+F:     drivers/soc/microchip/
+
 MICROCHIP SPI DRIVER
 M:     Tudor Ambarus <tudor.ambarus@linaro.org>
 S:     Supported
@@ -13871,11 +13873,12 @@ F:    Documentation/devicetree/bindings/misc/atmel-ssc.txt
 F:     drivers/misc/atmel-ssc.c
 F:     include/linux/atmel-ssc.h
 
-MICROCHIP SOC DRIVERS
-M:     Conor Dooley <conor@kernel.org>
-S:     Supported
-T:     git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
-F:     drivers/soc/microchip/
+Microchip Timer Counter Block (TCB) Capture Driver
+M:     Kamel Bouhara <kamel.bouhara@bootlin.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+L:     linux-iio@vger.kernel.org
+S:     Maintained
+F:     drivers/counter/microchip-tcb-capture.c
 
 MICROCHIP USB251XB DRIVER
 M:     Richard Leitner <richard.leitner@skidata.com>
@@ -13992,6 +13995,12 @@ L:     platform-driver-x86@vger.kernel.org
 S:     Supported
 F:     drivers/platform/surface/surfacepro3_button.c
 
+MICROSOFT SURFACE SYSTEM AGGREGATOR HUB DRIVER
+M:     Maximilian Luz <luzmaximilian@gmail.com>
+L:     platform-driver-x86@vger.kernel.org
+S:     Maintained
+F:     drivers/platform/surface/surface_aggregator_hub.c
+
 MICROSOFT SURFACE SYSTEM AGGREGATOR SUBSYSTEM
 M:     Maximilian Luz <luzmaximilian@gmail.com>
 L:     platform-driver-x86@vger.kernel.org
@@ -14007,12 +14016,6 @@ F:     include/linux/surface_acpi_notify.h
 F:     include/linux/surface_aggregator/
 F:     include/uapi/linux/surface_aggregator/
 
-MICROSOFT SURFACE SYSTEM AGGREGATOR HUB DRIVER
-M:     Maximilian Luz <luzmaximilian@gmail.com>
-L:     platform-driver-x86@vger.kernel.org
-S:     Maintained
-F:     drivers/platform/surface/surface_aggregator_hub.c
-
 MICROTEK X6 SCANNER
 M:     Oliver Neukum <oliver@neukum.org>
 S:     Maintained
@@ -14178,11 +14181,11 @@ L:    linux-modules@vger.kernel.org
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof/linux.git modules-next
-F:     include/linux/module.h
 F:     include/linux/kmod.h
+F:     include/linux/module.h
 F:     kernel/module/
-F:     scripts/module*
 F:     lib/test_kmod.c
+F:     scripts/module*
 F:     tools/testing/selftests/kmod/
 
 MONOLITHIC POWER SYSTEM PMIC DRIVER
@@ -14558,6 +14561,7 @@ T:      git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
 F:     Documentation/devicetree/bindings/net/
 F:     drivers/connector/
 F:     drivers/net/
+X:     drivers/net/wireless/
 F:     include/dt-bindings/net/
 F:     include/linux/etherdevice.h
 F:     include/linux/fcdevice.h
@@ -14607,6 +14611,7 @@ B:      mailto:netdev@vger.kernel.org
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git
 F:     Documentation/core-api/netlink.rst
+F:     Documentation/netlink/
 F:     Documentation/networking/
 F:     Documentation/process/maintainer-netdev.rst
 F:     Documentation/userspace-api/netlink/
@@ -14621,6 +14626,7 @@ F:      include/uapi/linux/netdevice.h
 F:     lib/net_utils.c
 F:     lib/random32.c
 F:     net/
+X:     net/bluetooth/
 F:     tools/net/
 F:     tools/testing/selftests/net/
 
@@ -14771,6 +14777,7 @@ L:      linux-nfs@vger.kernel.org
 S:     Maintained
 W:     http://client.linux-nfs.org
 T:     git git://git.linux-nfs.org/projects/trondmy/linux-nfs.git
+F:     Documentation/filesystems/nfs/
 F:     fs/lockd/
 F:     fs/nfs/
 F:     fs/nfs_common/
@@ -14780,7 +14787,6 @@ F:      include/linux/sunrpc/
 F:     include/uapi/linux/nfs*
 F:     include/uapi/linux/sunrpc/
 F:     net/sunrpc/
-F:     Documentation/filesystems/nfs/
 
 NILFS2 FILESYSTEM
 M:     Ryusuke Konishi <konishi.ryusuke@gmail.com>
@@ -14984,12 +14990,6 @@ F:     drivers/nvme/target/auth.c
 F:     drivers/nvme/target/fabrics-cmd-auth.c
 F:     include/linux/nvme-auth.h
 
-NVM EXPRESS HARDWARE MONITORING SUPPORT
-M:     Guenter Roeck <linux@roeck-us.net>
-L:     linux-nvme@lists.infradead.org
-S:     Supported
-F:     drivers/nvme/host/hwmon.c
-
 NVM EXPRESS FC TRANSPORT DRIVERS
 M:     James Smart <james.smart@broadcom.com>
 L:     linux-nvme@lists.infradead.org
@@ -15000,6 +15000,12 @@ F:     drivers/nvme/target/fcloop.c
 F:     include/linux/nvme-fc-driver.h
 F:     include/linux/nvme-fc.h
 
+NVM EXPRESS HARDWARE MONITORING SUPPORT
+M:     Guenter Roeck <linux@roeck-us.net>
+L:     linux-nvme@lists.infradead.org
+S:     Supported
+F:     drivers/nvme/host/hwmon.c
+
 NVM EXPRESS TARGET DRIVER
 M:     Christoph Hellwig <hch@lst.de>
 M:     Sagi Grimberg <sagi@grimberg.me>
@@ -15020,6 +15026,13 @@ F:     drivers/nvmem/
 F:     include/linux/nvmem-consumer.h
 F:     include/linux/nvmem-provider.h
 
+NXP BLUETOOTH WIRELESS DRIVERS
+M:     Amitkumar Karwar <amitkumar.karwar@nxp.com>
+M:     Neeraj Kale <neeraj.sanjaykale@nxp.com>
+S:     Maintained
+F:     Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
+F:     drivers/bluetooth/btnxpuart.c
+
 NXP C45 TJA11XX PHY DRIVER
 M:     Radu Pirea <radu-nicolae.pirea@oss.nxp.com>
 L:     netdev@vger.kernel.org
@@ -15045,16 +15058,17 @@ F:    drivers/iio/gyro/fxas21002c_core.c
 F:     drivers/iio/gyro/fxas21002c_i2c.c
 F:     drivers/iio/gyro/fxas21002c_spi.c
 
-NXP i.MX CLOCK DRIVERS
-M:     Abel Vesa <abelvesa@kernel.org>
-R:     Peng Fan <peng.fan@nxp.com>
-L:     linux-clk@vger.kernel.org
+NXP i.MX 7D/6SX/6UL/93 AND VF610 ADC DRIVER
+M:     Haibo Chen <haibo.chen@nxp.com>
+L:     linux-iio@vger.kernel.org
 L:     linux-imx@nxp.com
 S:     Maintained
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux.git clk/imx
-F:     Documentation/devicetree/bindings/clock/imx*
-F:     drivers/clk/imx/
-F:     include/dt-bindings/clock/imx*
+F:     Documentation/devicetree/bindings/iio/adc/fsl,imx7d-adc.yaml
+F:     Documentation/devicetree/bindings/iio/adc/fsl,vf610-adc.yaml
+F:     Documentation/devicetree/bindings/iio/adc/nxp,imx93-adc.yaml
+F:     drivers/iio/adc/imx7d_adc.c
+F:     drivers/iio/adc/imx93_adc.c
+F:     drivers/iio/adc/vf610_adc.c
 
 NXP i.MX 8M ISI DRIVER
 M:     Laurent Pinchart <laurent.pinchart@ideasonboard.com>
@@ -15063,6 +15077,15 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/media/nxp,imx8-isi.yaml
 F:     drivers/media/platform/nxp/imx8-isi/
 
+NXP i.MX 8MP DW100 V4L2 DRIVER
+M:     Xavier Roumegue <xavier.roumegue@oss.nxp.com>
+L:     linux-media@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/media/nxp,dw100.yaml
+F:     Documentation/userspace-api/media/drivers/dw100.rst
+F:     drivers/media/platform/nxp/dw100/
+F:     include/uapi/linux/dw100.h
+
 NXP i.MX 8MQ DCSS DRIVER
 M:     Laurentiu Palcu <laurentiu.palcu@oss.nxp.com>
 R:     Lucas Stach <l.stach@pengutronix.de>
@@ -15080,17 +15103,24 @@ S:    Maintained
 F:     Documentation/devicetree/bindings/iio/adc/nxp,imx8qxp-adc.yaml
 F:     drivers/iio/adc/imx8qxp-adc.c
 
-NXP i.MX 7D/6SX/6UL/93 AND VF610 ADC DRIVER
-M:     Haibo Chen <haibo.chen@nxp.com>
-L:     linux-iio@vger.kernel.org
+NXP i.MX 8QXP/8QM JPEG V4L2 DRIVER
+M:     Mirela Rabulea <mirela.rabulea@nxp.com>
+R:     NXP Linux Team <linux-imx@nxp.com>
+L:     linux-media@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/media/nxp,imx8-jpeg.yaml
+F:     drivers/media/platform/nxp/imx-jpeg
+
+NXP i.MX CLOCK DRIVERS
+M:     Abel Vesa <abelvesa@kernel.org>
+R:     Peng Fan <peng.fan@nxp.com>
+L:     linux-clk@vger.kernel.org
 L:     linux-imx@nxp.com
 S:     Maintained
-F:     Documentation/devicetree/bindings/iio/adc/fsl,imx7d-adc.yaml
-F:     Documentation/devicetree/bindings/iio/adc/fsl,vf610-adc.yaml
-F:     Documentation/devicetree/bindings/iio/adc/nxp,imx93-adc.yaml
-F:     drivers/iio/adc/imx7d_adc.c
-F:     drivers/iio/adc/imx93_adc.c
-F:     drivers/iio/adc/vf610_adc.c
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/abelvesa/linux.git clk/imx
+F:     Documentation/devicetree/bindings/clock/imx*
+F:     drivers/clk/imx/
+F:     include/dt-bindings/clock/imx*
 
 NXP PF8100/PF8121A/PF8200 PMIC REGULATOR DEVICE DRIVER
 M:     Jagan Teki <jagan@amarulasolutions.com>
@@ -15136,34 +15166,17 @@ S:    Maintained
 F:     Documentation/devicetree/bindings/sound/tfa9879.txt
 F:     sound/soc/codecs/tfa9879*
 
-NXP/Goodix TFA989X (TFA1) DRIVER
-M:     Stephan Gerhold <stephan@gerhold.net>
-L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
-S:     Maintained
-F:     Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
-F:     sound/soc/codecs/tfa989x.c
-
 NXP-NCI NFC DRIVER
 S:     Orphan
 F:     Documentation/devicetree/bindings/net/nfc/nxp,nci.yaml
 F:     drivers/nfc/nxp-nci
 
-NXP i.MX 8MP DW100 V4L2 DRIVER
-M:     Xavier Roumegue <xavier.roumegue@oss.nxp.com>
-L:     linux-media@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/media/nxp,dw100.yaml
-F:     Documentation/userspace-api/media/drivers/dw100.rst
-F:     drivers/media/platform/nxp/dw100/
-F:     include/uapi/linux/dw100.h
-
-NXP i.MX 8QXP/8QM JPEG V4L2 DRIVER
-M:     Mirela Rabulea <mirela.rabulea@nxp.com>
-R:     NXP Linux Team <linux-imx@nxp.com>
-L:     linux-media@vger.kernel.org
+NXP/Goodix TFA989X (TFA1) DRIVER
+M:     Stephan Gerhold <stephan@gerhold.net>
+L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
 S:     Maintained
-F:     Documentation/devicetree/bindings/media/nxp,imx8-jpeg.yaml
-F:     drivers/media/platform/nxp/imx-jpeg
+F:     Documentation/devicetree/bindings/sound/nxp,tfa989x.yaml
+F:     sound/soc/codecs/tfa989x.c
 
 NZXT-KRAKEN2 HARDWARE MONITORING DRIVER
 M:     Jonas Malaco <jonas@protocubo.io>
@@ -15689,8 +15702,8 @@ M:      Rob Herring <robh+dt@kernel.org>
 M:     Frank Rowand <frowand.list@gmail.com>
 L:     devicetree@vger.kernel.org
 S:     Maintained
-C:     irc://irc.libera.chat/devicetree
 W:     http://www.devicetree.org/
+C:     irc://irc.libera.chat/devicetree
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git
 F:     Documentation/ABI/testing/sysfs-firmware-ofw
 F:     drivers/of/
@@ -15706,8 +15719,8 @@ M:      Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>
 M:     Conor Dooley <conor+dt@kernel.org>
 L:     devicetree@vger.kernel.org
 S:     Maintained
-C:     irc://irc.libera.chat/devicetree
 Q:     http://patchwork.ozlabs.org/project/devicetree-bindings/list/
+C:     irc://irc.libera.chat/devicetree
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git
 F:     Documentation/devicetree/
 F:     arch/*/boot/dts/
@@ -15720,13 +15733,6 @@ L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/ptp/ptp_ocp.c
 
-INTEL PTP DFL ToD DRIVER
-M:     Tianfei Zhang <tianfei.zhang@intel.com>
-L:     linux-fpga@vger.kernel.org
-L:     netdev@vger.kernel.org
-S:     Maintained
-F:     drivers/ptp/ptp_dfl_tod.c
-
 OPENCORES I2C BUS DRIVER
 M:     Peter Korsgaard <peter@korsgaard.com>
 M:     Andrew Lunn <andrew@lunn.ch>
@@ -15745,8 +15751,8 @@ L:      linux-openrisc@vger.kernel.org
 S:     Maintained
 W:     http://openrisc.io
 T:     git https://github.com/openrisc/linux.git
-F:     Documentation/devicetree/bindings/openrisc/
 F:     Documentation/arch/openrisc/
+F:     Documentation/devicetree/bindings/openrisc/
 F:     arch/openrisc/
 F:     drivers/irqchip/irq-ompic.c
 F:     drivers/irqchip/irq-or1k-*
@@ -16062,6 +16068,14 @@ L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Maintained
 F:     drivers/pci/controller/dwc/*layerscape*
 
+PCI DRIVER FOR FU740
+M:     Paul Walmsley <paul.walmsley@sifive.com>
+M:     Greentime Hu <greentime.hu@sifive.com>
+L:     linux-pci@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml
+F:     drivers/pci/controller/dwc/pcie-fu740.c
+
 PCI DRIVER FOR GENERIC OF HOSTS
 M:     Will Deacon <will@kernel.org>
 L:     linux-pci@vger.kernel.org
@@ -16082,14 +16096,6 @@ F:     Documentation/devicetree/bindings/pci/fsl,imx6q-pcie-ep.yaml
 F:     Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.yaml
 F:     drivers/pci/controller/dwc/*imx6*
 
-PCI DRIVER FOR FU740
-M:     Paul Walmsley <paul.walmsley@sifive.com>
-M:     Greentime Hu <greentime.hu@sifive.com>
-L:     linux-pci@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/pci/sifive,fu740-pcie.yaml
-F:     drivers/pci/controller/dwc/pcie-fu740.c
-
 PCI DRIVER FOR INTEL IXP4XX
 M:     Linus Walleij <linus.walleij@linaro.org>
 S:     Maintained
@@ -16169,8 +16175,8 @@ M:      Jingoo Han <jingoohan1@gmail.com>
 M:     Gustavo Pimentel <gustavo.pimentel@synopsys.com>
 L:     linux-pci@vger.kernel.org
 S:     Maintained
-F:     Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml
 F:     Documentation/devicetree/bindings/pci/snps,dw-pcie-ep.yaml
+F:     Documentation/devicetree/bindings/pci/snps,dw-pcie.yaml
 F:     drivers/pci/controller/dwc/*designware*
 
 PCI DRIVER FOR TI DRA7XX/J721E
@@ -16190,6 +16196,14 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/pci/v3-v360epc-pci.txt
 F:     drivers/pci/controller/pci-v3-semi.c
 
+PCI DRIVER FOR XILINX VERSAL CPM
+M:     Bharat Kumar Gogada <bharat.kumar.gogada@amd.com>
+M:     Michal Simek <michal.simek@amd.com>
+L:     linux-pci@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml
+F:     drivers/pci/controller/pcie-xilinx-cpm.c
+
 PCI ENDPOINT SUBSYSTEM
 M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
 M:     Krzysztof WilczyÅ„ski <kw@linux.com>
@@ -16227,19 +16241,6 @@ L:     linux-pci@vger.kernel.org
 S:     Supported
 F:     Documentation/PCI/pci-error-recovery.rst
 
-PCI PEER-TO-PEER DMA (P2PDMA)
-M:     Bjorn Helgaas <bhelgaas@google.com>
-M:     Logan Gunthorpe <logang@deltatee.com>
-L:     linux-pci@vger.kernel.org
-S:     Supported
-Q:     https://patchwork.kernel.org/project/linux-pci/list/
-B:     https://bugzilla.kernel.org
-C:     irc://irc.oftc.net/linux-pci
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
-F:     Documentation/driver-api/pci/p2pdma.rst
-F:     drivers/pci/p2pdma.c
-F:     include/linux/pci-p2pdma.h
-
 PCI MSI DRIVER FOR ALTERA MSI IP
 M:     Joyce Ooi <joyce.ooi@intel.com>
 L:     linux-pci@vger.kernel.org
@@ -16270,6 +16271,19 @@ F:     drivers/pci/controller/
 F:     drivers/pci/pci-bridge-emul.c
 F:     drivers/pci/pci-bridge-emul.h
 
+PCI PEER-TO-PEER DMA (P2PDMA)
+M:     Bjorn Helgaas <bhelgaas@google.com>
+M:     Logan Gunthorpe <logang@deltatee.com>
+L:     linux-pci@vger.kernel.org
+S:     Supported
+Q:     https://patchwork.kernel.org/project/linux-pci/list/
+B:     https://bugzilla.kernel.org
+C:     irc://irc.oftc.net/linux-pci
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
+F:     Documentation/driver-api/pci/p2pdma.rst
+F:     drivers/pci/p2pdma.c
+F:     include/linux/pci-p2pdma.h
+
 PCI SUBSYSTEM
 M:     Bjorn Helgaas <bhelgaas@google.com>
 L:     linux-pci@vger.kernel.org
@@ -16378,14 +16392,6 @@ L:     linux-arm-msm@vger.kernel.org
 S:     Maintained
 F:     drivers/pci/controller/dwc/pcie-qcom.c
 
-PCIE ENDPOINT DRIVER FOR QUALCOMM
-M:     Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
-L:     linux-pci@vger.kernel.org
-L:     linux-arm-msm@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/pci/qcom,pcie-ep.yaml
-F:     drivers/pci/controller/dwc/pcie-qcom-ep.c
-
 PCIE DRIVER FOR ROCKCHIP
 M:     Shawn Lin <shawn.lin@rock-chips.com>
 L:     linux-pci@vger.kernel.org
@@ -16407,13 +16413,13 @@ L:    linux-pci@vger.kernel.org
 S:     Maintained
 F:     drivers/pci/controller/dwc/*spear*
 
-PCI DRIVER FOR XILINX VERSAL CPM
-M:     Bharat Kumar Gogada <bharat.kumar.gogada@amd.com>
-M:     Michal Simek <michal.simek@amd.com>
+PCIE ENDPOINT DRIVER FOR QUALCOMM
+M:     Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
 L:     linux-pci@vger.kernel.org
+L:     linux-arm-msm@vger.kernel.org
 S:     Maintained
-F:     Documentation/devicetree/bindings/pci/xilinx-versal-cpm.yaml
-F:     drivers/pci/controller/pcie-xilinx-cpm.c
+F:     Documentation/devicetree/bindings/pci/qcom,pcie-ep.yaml
+F:     drivers/pci/controller/dwc/pcie-qcom-ep.c
 
 PCMCIA SUBSYSTEM
 M:     Dominik Brodowski <linux@dominikbrodowski.net>
@@ -16683,9 +16689,9 @@ R:      Alim Akhtar <alim.akhtar@samsung.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 L:     linux-samsung-soc@vger.kernel.org
 S:     Maintained
-C:     irc://irc.libera.chat/linux-exynos
 Q:     https://patchwork.kernel.org/project/linux-samsung-soc/list/
 B:     mailto:linux-samsung-soc@vger.kernel.org
+C:     irc://irc.libera.chat/linux-exynos
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/pinctrl/samsung.git
 F:     Documentation/devicetree/bindings/pinctrl/samsung,pinctrl*yaml
 F:     drivers/pinctrl/samsung/
@@ -16742,17 +16748,10 @@ F:    Documentation/driver-api/pldmfw/
 F:     include/linux/pldmfw.h
 F:     lib/pldmfw/
 
-PLX DMA DRIVER
-M:     Logan Gunthorpe <logang@deltatee.com>
-S:     Maintained
-F:     drivers/dma/plx_dma.c
-
-PM6764TR DRIVER
-M:     Charles Hsu     <hsu.yungteng@gmail.com>
-L:     linux-hwmon@vger.kernel.org
+PLX DMA DRIVER
+M:     Logan Gunthorpe <logang@deltatee.com>
 S:     Maintained
-F:     Documentation/hwmon/pm6764tr.rst
-F:     drivers/hwmon/pmbus/pm6764tr.c
+F:     drivers/dma/plx_dma.c
 
 PM-GRAPH UTILITY
 M:     "Todd E Brandt" <todd.e.brandt@linux.intel.com>
@@ -16763,6 +16762,13 @@ B:     https://bugzilla.kernel.org/buglist.cgi?component=pm-graph&product=Tools
 T:     git git://github.com/intel/pm-graph
 F:     tools/power/pm-graph
 
+PM6764TR DRIVER
+M:     Charles Hsu     <hsu.yungteng@gmail.com>
+L:     linux-hwmon@vger.kernel.org
+S:     Maintained
+F:     Documentation/hwmon/pm6764tr.rst
+F:     drivers/hwmon/pmbus/pm6764tr.c
+
 PMBUS HARDWARE MONITORING DRIVERS
 M:     Guenter Roeck <linux@roeck-us.net>
 L:     linux-hwmon@vger.kernel.org
@@ -16843,15 +16849,6 @@ F:     include/linux/pm_*
 F:     include/linux/powercap.h
 F:     kernel/configs/nopm.config
 
-DYNAMIC THERMAL POWER MANAGEMENT (DTPM)
-M:     Daniel Lezcano <daniel.lezcano@kernel.org>
-L:     linux-pm@vger.kernel.org
-S:     Supported
-B:     https://bugzilla.kernel.org
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
-F:     drivers/powercap/dtpm*
-F:     include/linux/dtpm.h
-
 POWER STATE COORDINATION INTERFACE (PSCI)
 M:     Mark Rutland <mark.rutland@arm.com>
 M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
@@ -17010,8 +17007,8 @@ R:      Guilherme G. Piccoli <gpiccoli@igalia.com>
 L:     linux-hardening@vger.kernel.org
 S:     Supported
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux.git for-next/pstore
-F:     Documentation/admin-guide/ramoops.rst
 F:     Documentation/admin-guide/pstore-blk.rst
+F:     Documentation/admin-guide/ramoops.rst
 F:     Documentation/devicetree/bindings/reserved-memory/ramoops.yaml
 F:     drivers/acpi/apei/erst.c
 F:     drivers/firmware/efi/efi-pstore.c
@@ -17160,10 +17157,10 @@ F:    sound/soc/codecs/lpass-va-macro.c
 F:     sound/soc/codecs/lpass-wsa-macro.*
 F:     sound/soc/codecs/msm8916-wcd-analog.c
 F:     sound/soc/codecs/msm8916-wcd-digital.c
-F:     sound/soc/codecs/wcd9335.*
-F:     sound/soc/codecs/wcd934x.c
 F:     sound/soc/codecs/wcd-clsh-v2.*
 F:     sound/soc/codecs/wcd-mbhc-v2.*
+F:     sound/soc/codecs/wcd9335.*
+F:     sound/soc/codecs/wcd934x.c
 F:     sound/soc/codecs/wsa881x.c
 F:     sound/soc/codecs/wsa883x.c
 F:     sound/soc/qcom/
@@ -17320,14 +17317,21 @@ Q:    http://patchwork.linuxtv.org/project/linux-media/list/
 T:     git git://linuxtv.org/anttip/media_tree.git
 F:     drivers/media/tuners/qt1010*
 
+QUALCOMM ATH12K WIRELESS DRIVER
+M:     Kalle Valo <kvalo@kernel.org>
+L:     ath12k@lists.infradead.org
+S:     Supported
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
+F:     drivers/net/wireless/ath/ath12k/
+
 QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
 M:     Kalle Valo <kvalo@kernel.org>
 L:     ath10k@lists.infradead.org
 S:     Supported
 W:     https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
-F:     drivers/net/wireless/ath/ath10k/
 F:     Documentation/devicetree/bindings/net/wireless/qcom,ath10k.yaml
+F:     drivers/net/wireless/ath/ath10k/
 
 QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
 M:     Kalle Valo <kvalo@kernel.org>
@@ -17337,13 +17341,6 @@ T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
 F:     Documentation/devicetree/bindings/net/wireless/qcom,ath11k.yaml
 F:     drivers/net/wireless/ath/ath11k/
 
-QUALCOMM ATH12K WIRELESS DRIVER
-M:     Kalle Valo <kvalo@kernel.org>
-L:     ath12k@lists.infradead.org
-S:     Supported
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
-F:     drivers/net/wireless/ath/ath12k/
-
 QUALCOMM ATHEROS ATH9K WIRELESS DRIVER
 M:     Toke Høiland-Jørgensen <toke@toke.dk>
 L:     linux-wireless@vger.kernel.org
@@ -17440,8 +17437,8 @@ F:      include/uapi/misc/fastrpc.h
 QUALCOMM HEXAGON ARCHITECTURE
 M:     Brian Cain <bcain@quicinc.com>
 L:     linux-hexagon@vger.kernel.org
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bcain/linux.git
 S:     Supported
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/bcain/linux.git
 F:     arch/hexagon/
 
 QUALCOMM HIDMA DRIVER
@@ -17563,9 +17560,9 @@ M:      Christian König <christian.koenig@amd.com>
 M:     Pan, Xinhui <Xinhui.Pan@amd.com>
 L:     amd-gfx@lists.freedesktop.org
 S:     Supported
-T:     git https://gitlab.freedesktop.org/agd5f/linux.git
 B:     https://gitlab.freedesktop.org/drm/amd/-/issues
 C:     irc://irc.oftc.net/radeon
+T:     git https://gitlab.freedesktop.org/agd5f/linux.git
 F:     Documentation/gpu/amdgpu/
 F:     drivers/gpu/drm/amd/
 F:     drivers/gpu/drm/radeon/
@@ -17653,8 +17650,8 @@ F:      arch/mips/generic/board-ranchu.c
 RANDOM NUMBER DRIVER
 M:     "Theodore Ts'o" <tytso@mit.edu>
 M:     Jason A. Donenfeld <Jason@zx2c4.com>
-T:     git https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git
 S:     Maintained
+T:     git https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git
 F:     drivers/char/random.c
 F:     drivers/virt/vmgenid.c
 
@@ -17688,8 +17685,8 @@ T:      git git://linuxtv.org/media_tree.git
 F:     Documentation/driver-api/media/rc-core.rst
 F:     Documentation/userspace-api/media/rc/
 F:     drivers/media/rc/
-F:     include/media/rc-map.h
 F:     include/media/rc-core.h
+F:     include/media/rc-map.h
 F:     include/uapi/linux/lirc.h
 
 RCMM REMOTE CONTROLS DECODER
@@ -17806,6 +17803,14 @@ F:     include/linux/rtc/
 F:     include/uapi/linux/rtc.h
 F:     tools/testing/selftests/rtc/
 
+Real-time Linux Analysis (RTLA) tools
+M:     Daniel Bristot de Oliveira <bristot@kernel.org>
+M:     Steven Rostedt <rostedt@goodmis.org>
+L:     linux-trace-devel@vger.kernel.org
+S:     Maintained
+F:     Documentation/tools/rtla/
+F:     tools/tracing/rtla/
+
 REALTEK AUDIO CODECS
 M:     Oder Chiou <oder_chiou@realtek.com>
 S:     Maintained
@@ -17929,6 +17934,14 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/sound/renesas,idt821034.yaml
 F:     sound/soc/codecs/idt821034.c
 
+RENESAS R-CAR GEN3 & RZ/N1 NAND CONTROLLER DRIVER
+M:     Miquel Raynal <miquel.raynal@bootlin.com>
+L:     linux-mtd@lists.infradead.org
+L:     linux-renesas-soc@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
+F:     drivers/mtd/nand/raw/renesas-nand-controller.c
+
 RENESAS R-CAR GYROADC DRIVER
 M:     Marek Vasut <marek.vasut@gmail.com>
 L:     linux-iio@vger.kernel.org
@@ -17947,9 +17960,9 @@ F:      drivers/i2c/busses/i2c-sh_mobile.c
 
 RENESAS R-CAR SATA DRIVER
 R:     Sergey Shtylyov <s.shtylyov@omp.ru>
-S:     Supported
 L:     linux-ide@vger.kernel.org
 L:     linux-renesas-soc@vger.kernel.org
+S:     Supported
 F:     Documentation/devicetree/bindings/ata/renesas,rcar-sata.yaml
 F:     drivers/ata/sata_rcar.c
 
@@ -17969,12 +17982,6 @@ S:     Supported
 F:     Documentation/devicetree/bindings/i2c/renesas,riic.yaml
 F:     drivers/i2c/busses/i2c-riic.c
 
-RENESAS USB PHY DRIVER
-M:     Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
-L:     linux-renesas-soc@vger.kernel.org
-S:     Maintained
-F:     drivers/phy/renesas/phy-rcar-gen3-usb*.c
-
 RENESAS RZ/G2L A/D DRIVER
 M:     Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
 L:     linux-iio@vger.kernel.org
@@ -18020,13 +18027,11 @@ S:    Maintained
 F:     Documentation/devicetree/bindings/usb/renesas,rzn1-usbf.yaml
 F:     drivers/usb/gadget/udc/renesas_usbf.c
 
-RENESAS R-CAR GEN3 & RZ/N1 NAND CONTROLLER DRIVER
-M:     Miquel Raynal <miquel.raynal@bootlin.com>
-L:     linux-mtd@lists.infradead.org
+RENESAS USB PHY DRIVER
+M:     Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
 L:     linux-renesas-soc@vger.kernel.org
 S:     Maintained
-F:     Documentation/devicetree/bindings/mtd/renesas-nandc.yaml
-F:     drivers/mtd/nand/raw/renesas-nand-controller.c
+F:     drivers/phy/renesas/phy-rcar-gen3-usb*.c
 
 RENESAS VERSACLOCK 7 CLOCK DRIVER
 M:     Alex Helms <alexander.helms.jy@renesas.com>
@@ -18094,15 +18099,6 @@ S:     Maintained
 F:     drivers/mtd/nand/raw/r852.c
 F:     drivers/mtd/nand/raw/r852.h
 
-RISC-V PMU DRIVERS
-M:     Atish Patra <atishp@atishpatra.org>
-R:     Anup Patel <anup@brainfault.org>
-L:     linux-riscv@lists.infradead.org
-S:     Supported
-F:     drivers/perf/riscv_pmu.c
-F:     drivers/perf/riscv_pmu_legacy.c
-F:     drivers/perf/riscv_pmu_sbi.c
-
 RISC-V ARCHITECTURE
 M:     Paul Walmsley <paul.walmsley@sifive.com>
 M:     Palmer Dabbelt <palmer@dabbelt.com>
@@ -18155,6 +18151,15 @@ T:     git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
 F:     Documentation/devicetree/bindings/riscv/
 F:     arch/riscv/boot/dts/
 
+RISC-V PMU DRIVERS
+M:     Atish Patra <atishp@atishpatra.org>
+R:     Anup Patel <anup@brainfault.org>
+L:     linux-riscv@lists.infradead.org
+S:     Supported
+F:     drivers/perf/riscv_pmu.c
+F:     drivers/perf/riscv_pmu_legacy.c
+F:     drivers/perf/riscv_pmu_sbi.c
+
 RNBD BLOCK DRIVERS
 M:     Md. Haris Iqbal <haris.iqbal@ionos.com>
 M:     Jack Wang <jinpu.wang@ionos.com>
@@ -18459,14 +18464,6 @@ F:     drivers/s390/net/*iucv*
 F:     include/net/iucv/
 F:     net/iucv/
 
-S390 NETWORK DRIVERS
-M:     Alexandra Winter <wintera@linux.ibm.com>
-M:     Wenjia Zhang <wenjia@linux.ibm.com>
-L:     linux-s390@vger.kernel.org
-L:     netdev@vger.kernel.org
-S:     Supported
-F:     drivers/s390/net/
-
 S390 MM
 M:     Alexander Gordeev <agordeev@linux.ibm.com>
 M:     Gerald Schaefer <gerald.schaefer@linux.ibm.com>
@@ -18476,14 +18473,22 @@ T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
 F:     arch/s390/include/asm/pgtable.h
 F:     arch/s390/mm
 
+S390 NETWORK DRIVERS
+M:     Alexandra Winter <wintera@linux.ibm.com>
+M:     Wenjia Zhang <wenjia@linux.ibm.com>
+L:     linux-s390@vger.kernel.org
+L:     netdev@vger.kernel.org
+S:     Supported
+F:     drivers/s390/net/
+
 S390 PCI SUBSYSTEM
 M:     Niklas Schnelle <schnelle@linux.ibm.com>
 M:     Gerald Schaefer <gerald.schaefer@linux.ibm.com>
 L:     linux-s390@vger.kernel.org
 S:     Supported
+F:     Documentation/s390/pci.rst
 F:     arch/s390/pci/
 F:     drivers/pci/hotplug/s390_pci_hpc.c
-F:     Documentation/s390/pci.rst
 
 S390 SCM DRIVER
 M:     Vineeth Vijayan <vneethv@linux.ibm.com>
@@ -18568,10 +18573,9 @@ F:     Documentation/admin-guide/LSM/SafeSetID.rst
 F:     security/safesetid/
 
 SAMSUNG AUDIO (ASoC) DRIVERS
-M:     Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
 M:     Sylwester Nawrocki <s.nawrocki@samsung.com>
 L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
-S:     Supported
+S:     Maintained
 B:     mailto:linux-samsung-soc@vger.kernel.org
 F:     Documentation/devicetree/bindings/sound/samsung*
 F:     sound/soc/samsung/
@@ -18835,12 +18839,11 @@ F:    drivers/target/
 F:     include/target/
 
 SCTP PROTOCOL
-M:     Neil Horman <nhorman@tuxdriver.com>
 M:     Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
 M:     Xin Long <lucien.xin@gmail.com>
 L:     linux-sctp@vger.kernel.org
 S:     Maintained
-W:     http://lksctp.sourceforge.net
+W:     https://github.com/sctp/lksctp-tools/wiki
 F:     Documentation/networking/sctp.rst
 F:     include/linux/sctp.h
 F:     include/net/sctp/
@@ -18916,6 +18919,13 @@ L:     linux-mmc@vger.kernel.org
 S:     Supported
 F:     drivers/mmc/host/sdhci-of-at91.c
 
+SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) NXP i.MX DRIVER
+M:     Haibo Chen <haibo.chen@nxp.com>
+L:     linux-imx@nxp.com
+L:     linux-mmc@vger.kernel.org
+S:     Maintained
+F:     drivers/mmc/host/sdhci-esdhc-imx.c
+
 SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) SAMSUNG DRIVER
 M:     Ben Dooks <ben-linux@fluff.org>
 M:     Jaehoon Chung <jh80.chung@samsung.com>
@@ -18935,13 +18945,6 @@ L:     linux-mmc@vger.kernel.org
 S:     Maintained
 F:     drivers/mmc/host/sdhci-omap.c
 
-SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) NXP i.MX DRIVER
-M:     Haibo Chen <haibo.chen@nxp.com>
-L:     linux-imx@nxp.com
-L:     linux-mmc@vger.kernel.org
-S:     Maintained
-F:     drivers/mmc/host/sdhci-esdhc-imx.c
-
 SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER
 M:     Jonathan Derrick <jonathan.derrick@linux.dev>
 L:     linux-block@vger.kernel.org
@@ -18951,6 +18954,15 @@ F:     block/sed*
 F:     include/linux/sed*
 F:     include/uapi/linux/sed*
 
+SECURE MONITOR CALL(SMC) CALLING CONVENTION (SMCCC)
+M:     Mark Rutland <mark.rutland@arm.com>
+M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
+M:     Sudeep Holla <sudeep.holla@arm.com>
+L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+S:     Maintained
+F:     drivers/firmware/smccc/
+F:     include/linux/arm-smccc.h
+
 SECURITY CONTACT
 M:     Security Officers <security@kernel.org>
 S:     Supported
@@ -19400,15 +19412,6 @@ M:     Nicolas Pitre <nico@fluxnic.net>
 S:     Odd Fixes
 F:     drivers/net/ethernet/smsc/smc91x.*
 
-SECURE MONITOR CALL(SMC) CALLING CONVENTION (SMCCC)
-M:     Mark Rutland <mark.rutland@arm.com>
-M:     Lorenzo Pieralisi <lpieralisi@kernel.org>
-M:     Sudeep Holla <sudeep.holla@arm.com>
-L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
-S:     Maintained
-F:     drivers/firmware/smccc/
-F:     include/linux/arm-smccc.h
-
 SMM665 HARDWARE MONITOR DRIVER
 M:     Guenter Roeck <linux@roeck-us.net>
 L:     linux-hwmon@vger.kernel.org
@@ -19456,6 +19459,10 @@ L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/net/ethernet/smsc/smsc9420.*
 
+SNET DPU VIRTIO DATA PATH ACCELERATOR
+R:     Alvaro Karsz <alvaro.karsz@solid-run.com>
+F:     drivers/vdpa/solidrun/
+
 SOCIONEXT (SNI) AVE NETWORK DRIVER
 M:     Kunihiko Hayashi <hayashi.kunihiko@socionext.com>
 L:     netdev@vger.kernel.org
@@ -19725,6 +19732,13 @@ F:     include/uapi/sound/
 F:     sound/
 F:     tools/testing/selftests/alsa
 
+SOUND - ALSA SELFTESTS
+M:     Mark Brown <broonie@kernel.org>
+L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
+L:     linux-kselftest@vger.kernel.org
+S:     Supported
+F:     tools/testing/selftests/alsa
+
 SOUND - COMPRESSED AUDIO
 M:     Vinod Koul <vkoul@kernel.org>
 L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
@@ -19743,13 +19757,6 @@ F:     include/sound/dmaengine_pcm.h
 F:     sound/core/pcm_dmaengine.c
 F:     sound/soc/soc-generic-dmaengine-pcm.c
 
-SOUND - ALSA SELFTESTS
-M:     Mark Brown <broonie@kernel.org>
-L:     alsa-devel@alsa-project.org (moderated for non-subscribers)
-L:     linux-kselftest@vger.kernel.org
-S:     Supported
-F:     tools/testing/selftests/alsa
-
 SOUND - SOC LAYER / DYNAMIC AUDIO POWER MANAGEMENT (ASoC)
 M:     Liam Girdwood <lgirdwood@gmail.com>
 M:     Mark Brown <broonie@kernel.org>
@@ -19769,8 +19776,8 @@ M:      Liam Girdwood <lgirdwood@gmail.com>
 M:     Peter Ujfalusi <peter.ujfalusi@linux.intel.com>
 M:     Bard Liao <yung-chuan.liao@linux.intel.com>
 M:     Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
-R:     Kai Vehmanen <kai.vehmanen@linux.intel.com>
 M:     Daniel Baluta <daniel.baluta@nxp.com>
+R:     Kai Vehmanen <kai.vehmanen@linux.intel.com>
 L:     sound-open-firmware@alsa-project.org (moderated for non-subscribers)
 S:     Supported
 W:     https://github.com/thesofproject/linux/
@@ -19832,9 +19839,9 @@ M:      "Luc Van Oostenryck" <luc.vanoostenryck@gmail.com>
 L:     linux-sparse@vger.kernel.org
 S:     Maintained
 W:     https://sparse.docs.kernel.org/
-T:     git git://git.kernel.org/pub/scm/devel/sparse/sparse.git
 Q:     https://patchwork.kernel.org/project/linux-sparse/list/
 B:     https://bugzilla.kernel.org/enter_bug.cgi?component=Sparse&product=Tools
+T:     git git://git.kernel.org/pub/scm/devel/sparse/sparse.git
 F:     include/linux/compiler.h
 
 SPEAKUP CONSOLE SPEECH DRIVER
@@ -20203,6 +20210,11 @@ W:     http://www.stlinux.com
 F:     Documentation/networking/device_drivers/ethernet/stmicro/
 F:     drivers/net/ethernet/stmicro/stmmac/
 
+SUN HAPPY MEAL ETHERNET DRIVER
+M:     Sean Anderson <seanga2@gmail.com>
+S:     Maintained
+F:     drivers/net/ethernet/sun/sunhme.*
+
 SUN3/3X
 M:     Sam Creasey <sammy@sammy.net>
 S:     Maintained
@@ -20225,11 +20237,6 @@ L:     netdev@vger.kernel.org
 S:     Maintained
 F:     drivers/net/ethernet/dlink/sundance.c
 
-SUN HAPPY MEAL ETHERNET DRIVER
-M:     Sean Anderson <seanga2@gmail.com>
-S:     Maintained
-F:     drivers/net/ethernet/sun/sunhme.*
-
 SUNPLUS ETHERNET DRIVER
 M:     Wells Lu <wellslutw@gmail.com>
 L:     netdev@vger.kernel.org
@@ -20251,15 +20258,6 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/nvmem/sunplus,sp7021-ocotp.yaml
 F:     drivers/nvmem/sunplus-ocotp.c
 
-SUNPLUS USB2 PHY DRIVER
-M:     Vincent Shih <vincent.sunplus@gmail.com>
-L:     linux-usb@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/phy/sunplus,sp7021-usb2-phy.yaml
-F:     drivers/phy/sunplus/Kconfig
-F:     drivers/phy/sunplus/Makefile
-F:     drivers/phy/sunplus/phy-sunplus-usb2.c
-
 SUNPLUS PWM DRIVER
 M:     Hammer Hsieh <hammerh0314@gmail.com>
 S:     Maintained
@@ -20286,6 +20284,15 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/serial/sunplus,sp7021-uart.yaml
 F:     drivers/tty/serial/sunplus-uart.c
 
+SUNPLUS USB2 PHY DRIVER
+M:     Vincent Shih <vincent.sunplus@gmail.com>
+L:     linux-usb@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/phy/sunplus,sp7021-usb2-phy.yaml
+F:     drivers/phy/sunplus/Kconfig
+F:     drivers/phy/sunplus/Makefile
+F:     drivers/phy/sunplus/phy-sunplus-usb2.c
+
 SUNPLUS WATCHDOG DRIVER
 M:     Xiantao Hu <xt.hu@cqplus1.com>
 L:     linux-watchdog@vger.kernel.org
@@ -20697,6 +20704,14 @@ F:     include/linux/if_team.h
 F:     include/uapi/linux/if_team.h
 F:     tools/testing/selftests/drivers/net/team/
 
+TECHNICAL ADVISORY BOARD PROCESS DOCS
+M:     "Theodore Ts'o" <tytso@mit.edu>
+M:     Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+L:     tech-board-discuss@lists.linux-foundation.org
+S:     Maintained
+F:     Documentation/process/contribution-maturity-model.rst
+F:     Documentation/process/researcher-guidelines.rst
+
 TECHNOLOGIC SYSTEMS TS-5500 PLATFORM SUPPORT
 M:     "Savoir-faire Linux Inc." <kernel@savoirfairelinux.com>
 S:     Maintained
@@ -20776,6 +20791,14 @@ M:     Thierry Reding <thierry.reding@gmail.com>
 S:     Supported
 F:     drivers/pwm/pwm-tegra.c
 
+TEGRA QUAD SPI DRIVER
+M:     Thierry Reding <thierry.reding@gmail.com>
+M:     Jonathan Hunter <jonathanh@nvidia.com>
+M:     Sowjanya Komatineni <skomatineni@nvidia.com>
+L:     linux-tegra@vger.kernel.org
+S:     Maintained
+F:     drivers/spi/spi-tegra210-quad.c
+
 TEGRA SERIAL DRIVER
 M:     Laxman Dewangan <ldewangan@nvidia.com>
 S:     Supported
@@ -20786,14 +20809,6 @@ M:     Laxman Dewangan <ldewangan@nvidia.com>
 S:     Supported
 F:     drivers/spi/spi-tegra*
 
-TEGRA QUAD SPI DRIVER
-M:     Thierry Reding <thierry.reding@gmail.com>
-M:     Jonathan Hunter <jonathanh@nvidia.com>
-M:     Sowjanya Komatineni <skomatineni@nvidia.com>
-L:     linux-tegra@vger.kernel.org
-S:     Maintained
-F:     drivers/spi/spi-tegra210-quad.c
-
 TEGRA VIDEO DRIVER
 M:     Thierry Reding <thierry.reding@gmail.com>
 M:     Jonathan Hunter <jonathanh@nvidia.com>
@@ -20842,13 +20857,6 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/sound/davinci-mcasp-audio.yaml
 F:     sound/soc/ti/
 
-TEXAS INSTRUMENTS' DAC7612 DAC DRIVER
-M:     Ricardo Ribalda <ribalda@kernel.org>
-L:     linux-iio@vger.kernel.org
-S:     Supported
-F:     Documentation/devicetree/bindings/iio/dac/ti,dac7612.yaml
-F:     drivers/iio/dac/ti-dac7612.c
-
 TEXAS INSTRUMENTS DMA DRIVERS
 M:     Peter Ujfalusi <peter.ujfalusi@gmail.com>
 L:     dmaengine@vger.kernel.org
@@ -20857,10 +20865,26 @@ F:    Documentation/devicetree/bindings/dma/ti-dma-crossbar.txt
 F:     Documentation/devicetree/bindings/dma/ti-edma.txt
 F:     Documentation/devicetree/bindings/dma/ti/
 F:     drivers/dma/ti/
-X:     drivers/dma/ti/cppi41.c
+F:     include/linux/dma/k3-psil.h
 F:     include/linux/dma/k3-udma-glue.h
 F:     include/linux/dma/ti-cppi5.h
-F:     include/linux/dma/k3-psil.h
+X:     drivers/dma/ti/cppi41.c
+
+TEXAS INSTRUMENTS TPS23861 PoE PSE DRIVER
+M:     Robert Marko <robert.marko@sartura.hr>
+M:     Luka Perkov <luka.perkov@sartura.hr>
+L:     linux-hwmon@vger.kernel.org
+S:     Maintained
+F:     Documentation/devicetree/bindings/hwmon/ti,tps23861.yaml
+F:     Documentation/hwmon/tps23861.rst
+F:     drivers/hwmon/tps23861.c
+
+TEXAS INSTRUMENTS' DAC7612 DAC DRIVER
+M:     Ricardo Ribalda <ribalda@kernel.org>
+L:     linux-iio@vger.kernel.org
+S:     Supported
+F:     Documentation/devicetree/bindings/iio/dac/ti,dac7612.yaml
+F:     drivers/iio/dac/ti-dac7612.c
 
 TEXAS INSTRUMENTS' SYSTEM CONTROL INTERFACE (TISCI) PROTOCOL DRIVER
 M:     Nishanth Menon <nm@ti.com>
@@ -20886,15 +20910,6 @@ F:     include/dt-bindings/soc/ti,sci_pm_domain.h
 F:     include/linux/soc/ti/ti_sci_inta_msi.h
 F:     include/linux/soc/ti/ti_sci_protocol.h
 
-TEXAS INSTRUMENTS TPS23861 PoE PSE DRIVER
-M:     Robert Marko <robert.marko@sartura.hr>
-M:     Luka Perkov <luka.perkov@sartura.hr>
-L:     linux-hwmon@vger.kernel.org
-S:     Maintained
-F:     Documentation/devicetree/bindings/hwmon/ti,tps23861.yaml
-F:     Documentation/hwmon/tps23861.rst
-F:     drivers/hwmon/tps23861.c
-
 TEXAS INSTRUMENTS' TMP117 TEMPERATURE SENSOR DRIVER
 M:     Puranjay Mohan <puranjay12@gmail.com>
 L:     linux-iio@vger.kernel.org
@@ -21371,8 +21386,8 @@ M:      Steven Rostedt <rostedt@goodmis.org>
 M:     Masami Hiramatsu <mhiramat@kernel.org>
 L:     linux-kernel@vger.kernel.org
 L:     linux-trace-kernel@vger.kernel.org
-Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-trace-kernel/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git
 F:     Documentation/trace/*
 F:     fs/tracefs/
@@ -21400,31 +21415,15 @@ TRACING OS NOISE / LATENCY TRACERS
 M:     Steven Rostedt <rostedt@goodmis.org>
 M:     Daniel Bristot de Oliveira <bristot@kernel.org>
 S:     Maintained
-F:     kernel/trace/trace_osnoise.c
+F:     Documentation/trace/hwlat_detector.rst
+F:     Documentation/trace/osnoise-tracer.rst
+F:     Documentation/trace/timerlat-tracer.rst
+F:     arch/*/kernel/trace.c
 F:     include/trace/events/osnoise.h
 F:     kernel/trace/trace_hwlat.c
 F:     kernel/trace/trace_irqsoff.c
+F:     kernel/trace/trace_osnoise.c
 F:     kernel/trace/trace_sched_wakeup.c
-F:     Documentation/trace/osnoise-tracer.rst
-F:     Documentation/trace/timerlat-tracer.rst
-F:     Documentation/trace/hwlat_detector.rst
-F:     arch/*/kernel/trace.c
-
-Real-time Linux Analysis (RTLA) tools
-M:     Daniel Bristot de Oliveira <bristot@kernel.org>
-M:     Steven Rostedt <rostedt@goodmis.org>
-L:     linux-trace-devel@vger.kernel.org
-S:     Maintained
-F:     Documentation/tools/rtla/
-F:     tools/tracing/rtla/
-
-TECHNICAL ADVISORY BOARD PROCESS DOCS
-M:     "Theodore Ts'o" <tytso@mit.edu>
-M:     Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-L:     tech-board-discuss@lists.linux-foundation.org
-S:     Maintained
-F:     Documentation/process/researcher-guidelines.rst
-F:     Documentation/process/contribution-maturity-model.rst
 
 TRADITIONAL CHINESE DOCUMENTATION
 M:     Hu Haowen <src.res@email.cn>
@@ -21782,8 +21781,8 @@ USB ISP1760 DRIVER
 M:     Rui Miguel Silva <rui.silva@linaro.org>
 L:     linux-usb@vger.kernel.org
 S:     Maintained
-F:     drivers/usb/isp1760/*
 F:     Documentation/devicetree/bindings/usb/nxp,isp1760.yaml
+F:     drivers/usb/isp1760/*
 
 USB LAN78XX ETHERNET DRIVER
 M:     Woojung Huh <woojung.huh@microchip.com>
@@ -21854,6 +21853,13 @@ L:     linux-usb@vger.kernel.org
 S:     Supported
 F:     drivers/usb/class/usblp.c
 
+USB QMI WWAN NETWORK DRIVER
+M:     Bjørn Mork <bjorn@mork.no>
+L:     netdev@vger.kernel.org
+S:     Maintained
+F:     Documentation/ABI/testing/sysfs-class-net-qmi
+F:     drivers/net/usb/qmi_wwan.c
+
 USB RAW GADGET DRIVER
 R:     Andrey Konovalov <andreyknvl@gmail.com>
 L:     linux-usb@vger.kernel.org
@@ -21862,13 +21868,6 @@ F:     Documentation/usb/raw-gadget.rst
 F:     drivers/usb/gadget/legacy/raw_gadget.c
 F:     include/uapi/linux/usb/raw_gadget.h
 
-USB QMI WWAN NETWORK DRIVER
-M:     Bjørn Mork <bjorn@mork.no>
-L:     netdev@vger.kernel.org
-S:     Maintained
-F:     Documentation/ABI/testing/sysfs-class-net-qmi
-F:     drivers/net/usb/qmi_wwan.c
-
 USB RTL8150 DRIVER
 M:     Petko Manolov <petkan@nucleusys.com>
 L:     linux-usb@vger.kernel.org
@@ -22120,6 +22119,12 @@ F:     drivers/vfio/mdev/
 F:     include/linux/mdev.h
 F:     samples/vfio-mdev/
 
+VFIO MLX5 PCI DRIVER
+M:     Yishai Hadas <yishaih@nvidia.com>
+L:     kvm@vger.kernel.org
+S:     Maintained
+F:     drivers/vfio/pci/mlx5/
+
 VFIO PCI DEVICE SPECIFIC DRIVERS
 R:     Jason Gunthorpe <jgg@nvidia.com>
 R:     Yishai Hadas <yishaih@nvidia.com>
@@ -22136,12 +22141,6 @@ L:     kvm@vger.kernel.org
 S:     Maintained
 F:     drivers/vfio/platform/
 
-VFIO MLX5 PCI DRIVER
-M:     Yishai Hadas <yishaih@nvidia.com>
-L:     kvm@vger.kernel.org
-S:     Maintained
-F:     drivers/vfio/pci/mlx5/
-
 VGA_SWITCHEROO
 R:     Lukas Wunner <lukas@wunner.de>
 S:     Maintained
@@ -22151,8 +22150,8 @@ F:      drivers/gpu/vga/vga_switcheroo.c
 F:     include/linux/vga_switcheroo.h
 
 VIA RHINE NETWORK DRIVER
-S:     Maintained
 M:     Kevin Brace <kevinbrace@bracecomputerlab.com>
+S:     Maintained
 F:     drivers/net/ethernet/via/via-rhine.c
 
 VIA SD/MMC CARD CONTROLLER DRIVER
@@ -22204,6 +22203,14 @@ S:     Maintained
 F:     drivers/media/common/videobuf2/*
 F:     include/media/videobuf2-*
 
+VIDTV VIRTUAL DIGITAL TV DRIVER
+M:     Daniel W. S. Almeida <dwlsalmeida@gmail.com>
+L:     linux-media@vger.kernel.org
+S:     Maintained
+W:     https://linuxtv.org
+T:     git git://linuxtv.org/media_tree.git
+F:     drivers/media/test-drivers/vidtv/*
+
 VIMC VIRTUAL MEDIA CONTROLLER DRIVER
 M:     Shuah Khan <skhan@linuxfoundation.org>
 R:     Kieran Bingham <kieran.bingham@ideasonboard.com>
@@ -22233,6 +22240,16 @@ F:     include/uapi/linux/virtio_vsock.h
 F:     net/vmw_vsock/virtio_transport.c
 F:     net/vmw_vsock/virtio_transport_common.c
 
+VIRTIO BALLOON
+M:     "Michael S. Tsirkin" <mst@redhat.com>
+M:     David Hildenbrand <david@redhat.com>
+L:     virtualization@lists.linux-foundation.org
+S:     Maintained
+F:     drivers/virtio/virtio_balloon.c
+F:     include/linux/balloon_compaction.h
+F:     include/uapi/linux/virtio_balloon.h
+F:     mm/balloon_compaction.c
+
 VIRTIO BLOCK AND SCSI DRIVERS
 M:     "Michael S. Tsirkin" <mst@redhat.com>
 M:     Jason Wang <jasowang@redhat.com>
@@ -22275,30 +22292,6 @@ F:     include/linux/vringh.h
 F:     include/uapi/linux/virtio_*.h
 F:     tools/virtio/
 
-VISL VIRTUAL STATELESS DECODER DRIVER
-M:     Daniel Almeida <daniel.almeida@collabora.com>
-L:     linux-media@vger.kernel.org
-S:     Supported
-F:     drivers/media/test-drivers/visl
-
-IFCVF VIRTIO DATA PATH ACCELERATOR
-R:     Zhu Lingshan <lingshan.zhu@intel.com>
-F:     drivers/vdpa/ifcvf/
-
-SNET DPU VIRTIO DATA PATH ACCELERATOR
-R:     Alvaro Karsz <alvaro.karsz@solid-run.com>
-F:     drivers/vdpa/solidrun/
-
-VIRTIO BALLOON
-M:     "Michael S. Tsirkin" <mst@redhat.com>
-M:     David Hildenbrand <david@redhat.com>
-L:     virtualization@lists.linux-foundation.org
-S:     Maintained
-F:     drivers/virtio/virtio_balloon.c
-F:     include/uapi/linux/virtio_balloon.h
-F:     include/linux/balloon_compaction.h
-F:     mm/balloon_compaction.c
-
 VIRTIO CRYPTO DRIVER
 M:     Gonglei <arei.gonglei@huawei.com>
 L:     virtualization@lists.linux-foundation.org
@@ -22359,11 +22352,20 @@ L:    virtualization@lists.linux-foundation.org
 L:     netdev@vger.kernel.org
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git
-F:     kernel/vhost_task.c
 F:     drivers/vhost/
 F:     include/linux/sched/vhost_task.h
 F:     include/linux/vhost_iotlb.h
 F:     include/uapi/linux/vhost.h
+F:     kernel/vhost_task.c
+
+VIRTIO I2C DRIVER
+M:     Conghui Chen <conghui.chen@intel.com>
+M:     Viresh Kumar <viresh.kumar@linaro.org>
+L:     linux-i2c@vger.kernel.org
+L:     virtualization@lists.linux-foundation.org
+S:     Maintained
+F:     drivers/i2c/busses/i2c-virtio.c
+F:     include/uapi/linux/virtio_i2c.h
 
 VIRTIO INPUT DRIVER
 M:     Gerd Hoffmann <kraxel@redhat.com>
@@ -22386,6 +22388,13 @@ W:     https://virtio-mem.gitlab.io/
 F:     drivers/virtio/virtio_mem.c
 F:     include/uapi/linux/virtio_mem.h
 
+VIRTIO PMEM DRIVER
+M:     Pankaj Gupta <pankaj.gupta.linux@gmail.com>
+L:     virtualization@lists.linux-foundation.org
+S:     Maintained
+F:     drivers/nvdimm/nd_virtio.c
+F:     drivers/nvdimm/virtio_pmem.c
+
 VIRTIO SOUND DRIVER
 M:     Anton Yakovlev <anton.yakovlev@opensynergy.com>
 M:     "Michael S. Tsirkin" <mst@redhat.com>
@@ -22395,22 +22404,6 @@ S:     Maintained
 F:     include/uapi/linux/virtio_snd.h
 F:     sound/virtio/*
 
-VIRTIO I2C DRIVER
-M:     Conghui Chen <conghui.chen@intel.com>
-M:     Viresh Kumar <viresh.kumar@linaro.org>
-L:     linux-i2c@vger.kernel.org
-L:     virtualization@lists.linux-foundation.org
-S:     Maintained
-F:     drivers/i2c/busses/i2c-virtio.c
-F:     include/uapi/linux/virtio_i2c.h
-
-VIRTIO PMEM DRIVER
-M:     Pankaj Gupta <pankaj.gupta.linux@gmail.com>
-L:     virtualization@lists.linux-foundation.org
-S:     Maintained
-F:     drivers/nvdimm/virtio_pmem.c
-F:     drivers/nvdimm/nd_virtio.c
-
 VIRTUAL BOX GUEST DEVICE DRIVER
 M:     Hans de Goede <hdegoede@redhat.com>
 M:     Arnd Bergmann <arnd@arndb.de>
@@ -22432,6 +22425,12 @@ S:     Maintained
 F:     drivers/input/serio/userio.c
 F:     include/uapi/linux/userio.h
 
+VISL VIRTUAL STATELESS DECODER DRIVER
+M:     Daniel Almeida <daniel.almeida@collabora.com>
+L:     linux-media@vger.kernel.org
+S:     Supported
+F:     drivers/media/test-drivers/visl
+
 VIVID VIRTUAL VIDEO DRIVER
 M:     Hans Verkuil <hverkuil@xs4all.nl>
 L:     linux-media@vger.kernel.org
@@ -22440,14 +22439,6 @@ W:     https://linuxtv.org
 T:     git git://linuxtv.org/media_tree.git
 F:     drivers/media/test-drivers/vivid/*
 
-VIDTV VIRTUAL DIGITAL TV DRIVER
-M:     Daniel W. S. Almeida <dwlsalmeida@gmail.com>
-L:     linux-media@vger.kernel.org
-S:     Maintained
-W:     https://linuxtv.org
-T:     git git://linuxtv.org/media_tree.git
-F:     drivers/media/test-drivers/vidtv/*
-
 VLYNQ BUS
 M:     Florian Fainelli <f.fainelli@gmail.com>
 L:     openwrt-devel@lists.openwrt.org (subscribers-only)
@@ -22455,16 +22446,6 @@ S:     Maintained
 F:     drivers/vlynq/vlynq.c
 F:     include/linux/vlynq.h
 
-VME SUBSYSTEM
-M:     Martyn Welch <martyn@welchs.me.uk>
-M:     Manohar Vanga <manohar.vanga@gmail.com>
-M:     Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-L:     linux-kernel@vger.kernel.org
-S:     Odd fixes
-T:     git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
-F:     Documentation/driver-api/vme.rst
-F:     drivers/staging/vme_user/
-
 VM SOCKETS (AF_VSOCK)
 M:     Stefano Garzarella <sgarzare@redhat.com>
 L:     virtualization@lists.linux-foundation.org
@@ -22478,6 +22459,28 @@ F:     include/uapi/linux/vsockmon.h
 F:     net/vmw_vsock/
 F:     tools/testing/vsock/
 
+VMALLOC
+M:     Andrew Morton <akpm@linux-foundation.org>
+R:     Uladzislau Rezki <urezki@gmail.com>
+R:     Christoph Hellwig <hch@infradead.org>
+R:     Lorenzo Stoakes <lstoakes@gmail.com>
+L:     linux-mm@kvack.org
+S:     Maintained
+W:     http://www.linux-mm.org
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
+F:     include/linux/vmalloc.h
+F:     mm/vmalloc.c
+
+VME SUBSYSTEM
+M:     Martyn Welch <martyn@welchs.me.uk>
+M:     Manohar Vanga <manohar.vanga@gmail.com>
+M:     Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+L:     linux-kernel@vger.kernel.org
+S:     Odd fixes
+T:     git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
+F:     Documentation/driver-api/vme.rst
+F:     drivers/staging/vme_user/
+
 VMWARE BALLOON DRIVER
 M:     Nadav Amit <namit@vmware.com>
 R:     VMware PV-Drivers Reviewers <pv-drivers@vmware.com>
@@ -22659,9 +22662,9 @@ F:      drivers/input/tablet/wacom_serial4.c
 WANGXUN ETHERNET DRIVER
 M:     Jiawen Wu <jiawenwu@trustnetic.com>
 M:     Mengyuan Lou <mengyuanlou@net-swift.com>
-W:     https://www.net-swift.com
 L:     netdev@vger.kernel.org
 S:     Maintained
+W:     https://www.net-swift.com
 F:     Documentation/networking/device_drivers/ethernet/wangxun/*
 F:     drivers/net/ethernet/wangxun/
 
@@ -22676,8 +22679,8 @@ F:      Documentation/devicetree/bindings/watchdog/
 F:     Documentation/watchdog/
 F:     drivers/watchdog/
 F:     include/linux/watchdog.h
-F:     include/uapi/linux/watchdog.h
 F:     include/trace/events/watchdog.h
+F:     include/uapi/linux/watchdog.h
 
 WHISKEYCOVE PMIC GPIO DRIVER
 M:     Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
@@ -22834,8 +22837,8 @@ R:      "H. Peter Anvin" <hpa@zytor.com>
 L:     linux-kernel@vger.kernel.org
 S:     Maintained
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
-F:     Documentation/devicetree/bindings/x86/
 F:     Documentation/arch/x86/
+F:     Documentation/devicetree/bindings/x86/
 F:     arch/x86/
 
 X86 ENTRY CODE
@@ -22966,6 +22969,8 @@ M:      John Fastabend <john.fastabend@gmail.com>
 L:     netdev@vger.kernel.org
 L:     bpf@vger.kernel.org
 S:     Supported
+F:     drivers/net/ethernet/*/*/*/*/*xdp*
+F:     drivers/net/ethernet/*/*/*xdp*
 F:     include/net/xdp.h
 F:     include/net/xdp_priv.h
 F:     include/trace/events/xdp.h
@@ -22973,10 +22978,8 @@ F:     kernel/bpf/cpumap.c
 F:     kernel/bpf/devmap.c
 F:     net/core/xdp.c
 F:     samples/bpf/xdp*
-F:     tools/testing/selftests/bpf/*xdp*
 F:     tools/testing/selftests/bpf/*/*xdp*
-F:     drivers/net/ethernet/*/*/*/*/*xdp*
-F:     drivers/net/ethernet/*/*/*xdp*
+F:     tools/testing/selftests/bpf/*xdp*
 K:     (?:\b|_)xdp(?:\b|_)
 
 XDP SOCKETS (AF_XDP)
@@ -22988,11 +22991,11 @@ L:    netdev@vger.kernel.org
 L:     bpf@vger.kernel.org
 S:     Maintained
 F:     Documentation/networking/af_xdp.rst
+F:     include/net/netns/xdp.h
 F:     include/net/xdp_sock*
 F:     include/net/xsk_buff_pool.h
 F:     include/uapi/linux/if_xdp.h
 F:     include/uapi/linux/xdp_diag.h
-F:     include/net/netns/xdp.h
 F:     net/xdp/
 F:     tools/testing/selftests/bpf/*xsk*
 
@@ -23094,11 +23097,11 @@ F:    include/xen/arm/swiotlb-xen.h
 F:     include/xen/swiotlb-xen.h
 
 XFS FILESYSTEM
-C:     irc://irc.oftc.net/xfs
 M:     Darrick J. Wong <djwong@kernel.org>
 L:     linux-xfs@vger.kernel.org
 S:     Supported
 W:     http://xfs.org/
+C:     irc://irc.oftc.net/xfs
 T:     git git://git.kernel.org/pub/scm/fs/xfs/xfs-linux.git
 F:     Documentation/ABI/testing/sysfs-fs-xfs
 F:     Documentation/admin-guide/xfs.rst
@@ -23128,16 +23131,28 @@ S:    Maintained
 F:     Documentation/devicetree/bindings/net/can/xilinx,can.yaml
 F:     drivers/net/can/xilinx_can.c
 
+XILINX EVENT MANAGEMENT DRIVER
+M:     Abhyuday Godhasara <abhyuday.godhasara@xilinx.com>
+S:     Maintained
+F:     drivers/soc/xilinx/xlnx_event_manager.c
+F:     include/linux/firmware/xlnx-event-manager.h
+
 XILINX GPIO DRIVER
 M:     Shubhrajyoti Datta <shubhrajyoti.datta@xilinx.com>
 R:     Srinivas Neeli <srinivas.neeli@xilinx.com>
 R:     Michal Simek <michal.simek@amd.com>
 S:     Maintained
-F:     Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml
 F:     Documentation/devicetree/bindings/gpio/gpio-zynq.yaml
+F:     Documentation/devicetree/bindings/gpio/xlnx,gpio-xilinx.yaml
 F:     drivers/gpio/gpio-xilinx.c
 F:     drivers/gpio/gpio-zynq.c
 
+XILINX PWM DRIVER
+M:     Sean Anderson <sean.anderson@seco.com>
+S:     Maintained
+F:     drivers/pwm/pwm-xilinx.c
+F:     include/clocksource/timer-xilinx.h
+
 XILINX SD-FEC IP CORES
 M:     Derek Kiernan <derek.kiernan@xilinx.com>
 M:     Dragan Cvetic <dragan.cvetic@xilinx.com>
@@ -23149,12 +23164,6 @@ F:     drivers/misc/Makefile
 F:     drivers/misc/xilinx_sdfec.c
 F:     include/uapi/misc/xilinx_sdfec.h
 
-XILINX PWM DRIVER
-M:     Sean Anderson <sean.anderson@seco.com>
-S:     Maintained
-F:     drivers/pwm/pwm-xilinx.c
-F:     include/clocksource/timer-xilinx.h
-
 XILINX UARTLITE SERIAL DRIVER
 M:     Peter Korsgaard <jacmet@sunsite.dk>
 L:     linux-serial@vger.kernel.org
@@ -23220,12 +23229,6 @@ M:     Harsha <harsha.harsha@xilinx.com>
 S:     Maintained
 F:     drivers/crypto/xilinx/zynqmp-sha.c
 
-XILINX EVENT MANAGEMENT DRIVER
-M:     Abhyuday Godhasara <abhyuday.godhasara@xilinx.com>
-S:     Maintained
-F:     drivers/soc/xilinx/xlnx_event_manager.c
-F:     include/linux/firmware/xlnx-event-manager.h
-
 XILLYBUS DRIVER
 M:     Eli Billauer <eli.billauer@gmail.com>
 L:     linux-kernel@vger.kernel.org
@@ -23273,6 +23276,13 @@ S:     Maintained
 F:     Documentation/input/devices/yealink.rst
 F:     drivers/input/misc/yealink.*
 
+Z3FOLD COMPRESSED PAGE ALLOCATOR
+M:     Vitaly Wool <vitaly.wool@konsulko.com>
+R:     Miaohe Lin <linmiaohe@huawei.com>
+L:     linux-mm@kvack.org
+S:     Maintained
+F:     mm/z3fold.c
+
 Z8530 DRIVER FOR AX.25
 M:     Joerg Reuter <jreuter@yaina.de>
 L:     linux-hams@vger.kernel.org
@@ -23290,13 +23300,6 @@ L:     linux-mm@kvack.org
 S:     Maintained
 F:     mm/zbud.c
 
-Z3FOLD COMPRESSED PAGE ALLOCATOR
-M:     Vitaly Wool <vitaly.wool@konsulko.com>
-R:     Miaohe Lin <linmiaohe@huawei.com>
-L:     linux-mm@kvack.org
-S:     Maintained
-F:     mm/z3fold.c
-
 ZD1211RW WIRELESS DRIVER
 M:     Ulrich Kunitz <kune@deine-taler.de>
 L:     linux-wireless@vger.kernel.org
@@ -23383,10 +23386,10 @@ M:    Nick Terrell <terrelln@fb.com>
 S:     Maintained
 B:     https://github.com/facebook/zstd/issues
 T:     git https://github.com/terrelln/linux.git
+F:     crypto/zstd.c
 F:     include/linux/zstd*
-F:     lib/zstd/
 F:     lib/decompress_unzstd.c
-F:     crypto/zstd.c
+F:     lib/zstd/
 N:     zstd
 K:     zstd
 
@@ -23398,13 +23401,6 @@ L:     linux-mm@kvack.org
 S:     Maintained
 F:     mm/zswap.c
 
-NXP BLUETOOTH WIRELESS DRIVERS
-M:     Amitkumar Karwar <amitkumar.karwar@nxp.com>
-M:     Neeraj Kale <neeraj.sanjaykale@nxp.com>
-S:     Maintained
-F:     Documentation/devicetree/bindings/net/bluetooth/nxp,88w8987-bt.yaml
-F:     drivers/bluetooth/btnxpuart.c
-
 THE REST
 M:     Linus Torvalds <torvalds@linux-foundation.org>
 L:     linux-kernel@vger.kernel.org
index 9d765eb..f836936 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
 VERSION = 6
 PATCHLEVEL = 4
 SUBLEVEL = 0
-EXTRAVERSION = -rc1
+EXTRAVERSION = -rc2
 NAME = Hurr durr I'ma ninja sloth
 
 # *DOCUMENTATION*
index c9e05e3..00bf53f 100644 (file)
                        interrupt-names = "tx", "rx0", "rx1", "sce";
                        resets = <&rcc STM32F4_APB1_RESET(CAN2)>;
                        clocks = <&rcc 0 STM32F4_APB1_CLOCK(CAN2)>;
+                       st,can-secondary;
                        st,gcan = <&gcan>;
                        status = "disabled";
                };
index c8e6c52..9f65403 100644 (file)
                                        slew-rate = <2>;
                                };
                        };
+
+                       can1_pins_a: can1-0 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('A', 12, AF9)>; /* CAN1_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('A', 11, AF9)>; /* CAN1_RX */
+                                       bias-pull-up;
+                               };
+                       };
+
+                       can1_pins_b: can1-1 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('B', 9, AF9)>; /* CAN1_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('B', 8, AF9)>; /* CAN1_RX */
+                                       bias-pull-up;
+                               };
+                       };
+
+                       can1_pins_c: can1-2 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('D', 1, AF9)>; /* CAN1_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('D', 0, AF9)>; /* CAN1_RX */
+                                       bias-pull-up;
+
+                               };
+                       };
+
+                       can1_pins_d: can1-3 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('H', 13, AF9)>; /* CAN1_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('H', 14, AF9)>; /* CAN1_RX */
+                                       bias-pull-up;
+
+                               };
+                       };
+
+                       can2_pins_a: can2-0 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('B', 6, AF9)>; /* CAN2_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('B', 5, AF9)>; /* CAN2_RX */
+                                       bias-pull-up;
+                               };
+                       };
+
+                       can2_pins_b: can2-1 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('B', 13, AF9)>; /* CAN2_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('B', 12, AF9)>; /* CAN2_RX */
+                                       bias-pull-up;
+                               };
+                       };
+
+                       can3_pins_a: can3-0 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('A', 15, AF11)>; /* CAN3_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('A', 8, AF11)>; /* CAN3_RX */
+                                       bias-pull-up;
+                               };
+                       };
+
+                       can3_pins_b: can3-1 {
+                               pins1 {
+                                       pinmux = <STM32_PINMUX('B', 4, AF11)>;  /* CAN3_TX */
+                               };
+                               pins2 {
+                                       pinmux = <STM32_PINMUX('B', 3, AF11)>; /* CAN3_RX */
+                                       bias-pull-up;
+                               };
+                       };
                };
        };
 };
index 78d3d4b..f4db3e7 100644 (file)
@@ -92,7 +92,7 @@
 
 #define RETURN_READ_PMEVCNTRN(n) \
        return read_sysreg(PMEVCNTR##n)
-static unsigned long read_pmevcntrn(int n)
+static inline unsigned long read_pmevcntrn(int n)
 {
        PMEVN_SWITCH(n, RETURN_READ_PMEVCNTRN);
        return 0;
@@ -100,14 +100,14 @@ static unsigned long read_pmevcntrn(int n)
 
 #define WRITE_PMEVCNTRN(n) \
        write_sysreg(val, PMEVCNTR##n)
-static void write_pmevcntrn(int n, unsigned long val)
+static inline void write_pmevcntrn(int n, unsigned long val)
 {
        PMEVN_SWITCH(n, WRITE_PMEVCNTRN);
 }
 
 #define WRITE_PMEVTYPERN(n) \
        write_sysreg(val, PMEVTYPER##n)
-static void write_pmevtypern(int n, unsigned long val)
+static inline void write_pmevtypern(int n, unsigned long val)
 {
        PMEVN_SWITCH(n, WRITE_PMEVTYPERN);
 }
index 53be7ea..9d21921 100644 (file)
@@ -308,6 +308,29 @@ static int unwind_exec_pop_subset_r0_to_r3(struct unwind_ctrl_block *ctrl,
        return URC_OK;
 }
 
+static unsigned long unwind_decode_uleb128(struct unwind_ctrl_block *ctrl)
+{
+       unsigned long bytes = 0;
+       unsigned long insn;
+       unsigned long result = 0;
+
+       /*
+        * unwind_get_byte() will advance `ctrl` one instruction at a time, so
+        * loop until we get an instruction byte where bit 7 is not set.
+        *
+        * Note: This decodes a maximum of 4 bytes to output 28 bits data where
+        * max is 0xfffffff: that will cover a vsp increment of 1073742336, hence
+        * it is sufficient for unwinding the stack.
+        */
+       do {
+               insn = unwind_get_byte(ctrl);
+               result |= (insn & 0x7f) << (bytes * 7);
+               bytes++;
+       } while (!!(insn & 0x80) && (bytes != sizeof(result)));
+
+       return result;
+}
+
 /*
  * Execute the current unwind instruction.
  */
@@ -361,7 +384,7 @@ static int unwind_exec_insn(struct unwind_ctrl_block *ctrl)
                if (ret)
                        goto error;
        } else if (insn == 0xb2) {
-               unsigned long uleb128 = unwind_get_byte(ctrl);
+               unsigned long uleb128 = unwind_decode_uleb128(ctrl);
 
                ctrl->vrs[SP] += 0x204 + (uleb128 << 2);
        } else {
index 67f72ca..1956b09 100644 (file)
@@ -1,5 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0-only
-/**
+/*
  *  arch/arm/mac-sa1100/jornada720_ssp.c
  *
  *  Copyright (C) 2006/2007 Kristoffer Ericson <Kristoffer.Ericson@gmail.com>
@@ -26,6 +26,7 @@ static unsigned long jornada_ssp_flags;
 
 /**
  * jornada_ssp_reverse - reverses input byte
+ * @byte: input byte to reverse
  *
  * we need to reverse all data we receive from the mcu due to its physical location
  * returns : 01110111 -> 11101110
@@ -46,6 +47,7 @@ EXPORT_SYMBOL(jornada_ssp_reverse);
 
 /**
  * jornada_ssp_byte - waits for ready ssp bus and sends byte
+ * @byte: input byte to transmit
  *
  * waits for fifo buffer to clear and then transmits, if it doesn't then we will
  * timeout after <timeout> rounds. Needs mcu running before its called.
@@ -77,6 +79,7 @@ EXPORT_SYMBOL(jornada_ssp_byte);
 
 /**
  * jornada_ssp_inout - decide if input is command or trading byte
+ * @byte: input byte to send (may be %TXDUMMY)
  *
  * returns : (jornada_ssp_byte(byte)) on success
  *         : %-ETIMEDOUT on timeout failure
index 7483ef8..62206ef 100644 (file)
@@ -23,6 +23,9 @@
 @
 ENTRY(do_vfp)
        mov     r1, r10
-       mov     r3, r9
-       b       vfp_entry
+       str     lr, [sp, #-8]!
+       add     r3, sp, #4
+       str     r9, [r3]
+       bl      vfp_entry
+       ldr     pc, [sp], #8
 ENDPROC(do_vfp)
index 4d84782..a4610d0 100644 (file)
@@ -172,13 +172,14 @@ vfp_hw_state_valid:
                                        @ out before setting an FPEXC that
                                        @ stops us reading stuff
        VFPFMXR FPEXC, r1               @ Restore FPEXC last
+       mov     sp, r3                  @ we think we have handled things
+       pop     {lr}
        sub     r2, r2, #4              @ Retry current instruction - if Thumb
        str     r2, [sp, #S_PC]         @ mode it's two 16-bit instructions,
                                        @ else it's one 32-bit instruction, so
                                        @ always subtract 4 from the following
                                        @ instruction address.
 
-       mov     lr, r3                  @ we think we have handled things
 local_bh_enable_and_ret:
        adr     r0, .
        mov     r1, #SOFTIRQ_DISABLE_OFFSET
@@ -209,8 +210,9 @@ skip:
 
 process_exception:
        DBGSTR  "bounce"
+       mov     sp, r3                  @ setup for a return to the user code.
+       pop     {lr}
        mov     r2, sp                  @ nothing stacked - regdump is at TOS
-       mov     lr, r3                  @ setup for a return to the user code.
 
        @ Now call the C code to package up the bounce to the support code
        @   r0 holds the trigger instruction
index d6b51de..18dc2fb 100644 (file)
@@ -13,7 +13,7 @@
 
 #define RETURN_READ_PMEVCNTRN(n) \
        return read_sysreg(pmevcntr##n##_el0)
-static unsigned long read_pmevcntrn(int n)
+static inline unsigned long read_pmevcntrn(int n)
 {
        PMEVN_SWITCH(n, RETURN_READ_PMEVCNTRN);
        return 0;
@@ -21,14 +21,14 @@ static unsigned long read_pmevcntrn(int n)
 
 #define WRITE_PMEVCNTRN(n) \
        write_sysreg(val, pmevcntr##n##_el0)
-static void write_pmevcntrn(int n, unsigned long val)
+static inline void write_pmevcntrn(int n, unsigned long val)
 {
        PMEVN_SWITCH(n, WRITE_PMEVCNTRN);
 }
 
 #define WRITE_PMEVTYPERN(n) \
        write_sysreg(val, pmevtyper##n##_el0)
-static void write_pmevtypern(int n, unsigned long val)
+static inline void write_pmevtypern(int n, unsigned long val)
 {
        PMEVN_SWITCH(n, WRITE_PMEVTYPERN);
 }
index f5bcb0d..7e89968 100644 (file)
@@ -66,13 +66,10 @@ void mte_sync_tags(pte_t old_pte, pte_t pte)
                return;
 
        /* if PG_mte_tagged is set, tags have already been initialised */
-       for (i = 0; i < nr_pages; i++, page++) {
-               if (!page_mte_tagged(page)) {
+       for (i = 0; i < nr_pages; i++, page++)
+               if (!page_mte_tagged(page))
                        mte_sync_page_tags(page, old_pte, check_swap,
                                           pte_is_tagged);
-                       set_page_mte_tagged(page);
-               }
-       }
 
        /* ensure the tags are visible before the PTE is set */
        smp_wmb();
index 0119dc9..d9e1355 100644 (file)
@@ -288,7 +288,7 @@ static int aarch32_alloc_kuser_vdso_page(void)
 
        memcpy((void *)(vdso_page + 0x1000 - kuser_sz), __kuser_helper_start,
               kuser_sz);
-       aarch32_vectors_page = virt_to_page(vdso_page);
+       aarch32_vectors_page = virt_to_page((void *)vdso_page);
        return 0;
 }
 
index 4aadcfb..a7bb200 100644 (file)
@@ -21,9 +21,10 @@ void copy_highpage(struct page *to, struct page *from)
 
        copy_page(kto, kfrom);
 
+       if (kasan_hw_tags_enabled())
+               page_kasan_tag_reset(to);
+
        if (system_supports_mte() && page_mte_tagged(from)) {
-               if (kasan_hw_tags_enabled())
-                       page_kasan_tag_reset(to);
                /* It's a new page, shouldn't have been tagged yet */
                WARN_ON_ONCE(!try_page_mte_tagging(to));
                mte_copy_page_tags(kto, kfrom);
index 9e0db5c..cb21ccd 100644 (file)
@@ -480,8 +480,8 @@ static void do_bad_area(unsigned long far, unsigned long esr,
        }
 }
 
-#define VM_FAULT_BADMAP                0x010000
-#define VM_FAULT_BADACCESS     0x020000
+#define VM_FAULT_BADMAP                ((__force vm_fault_t)0x010000)
+#define VM_FAULT_BADACCESS     ((__force vm_fault_t)0x020000)
 
 static vm_fault_t __do_page_fault(struct mm_struct *mm, unsigned long addr,
                                  unsigned int mm_flags, unsigned long vm_flags,
index e2950f5..e715df5 100644 (file)
@@ -413,12 +413,12 @@ extern void paging_init (void);
  *   For the 64bit version, the offset is extended by 32bit.
  */
 #define __swp_type(x)                     ((x).val & 0x1f)
-#define __swp_offset(x)                   ( (((x).val >> 6) &  0x7) | \
-                                         (((x).val >> 8) & ~0x7) )
+#define __swp_offset(x)                   ( (((x).val >> 5) & 0x7) | \
+                                         (((x).val >> 10) << 3) )
 #define __swp_entry(type, offset)         ((swp_entry_t) { \
                                            ((type) & 0x1f) | \
-                                           ((offset &  0x7) << 6) | \
-                                           ((offset & ~0x7) << 8) })
+                                           ((offset & 0x7) << 5) | \
+                                           ((offset >> 3) << 10) })
 #define __pte_to_swp_entry(pte)                ((swp_entry_t) { pte_val(pte) })
 #define __swp_entry_to_pte(x)          ((pte_t) { (x).val })
 
index 5eb7f30..db57345 100644 (file)
@@ -4,6 +4,8 @@
 #include <linux/console.h>
 #include <linux/kexec.h>
 #include <linux/delay.h>
+#include <linux/reboot.h>
+
 #include <asm/cacheflush.h>
 #include <asm/sections.h>
 
index 85cde5b..771b794 100644 (file)
@@ -34,8 +34,6 @@ endif
 
 BOOTCFLAGS    := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
                 -fno-strict-aliasing -O2 -msoft-float -mno-altivec -mno-vsx \
-                $(call cc-option,-mno-prefixed) $(call cc-option,-mno-pcrel) \
-                $(call cc-option,-mno-mma) \
                 $(call cc-option,-mno-spe) $(call cc-option,-mspe=no) \
                 -pipe -fomit-frame-pointer -fno-builtin -fPIC -nostdinc \
                 $(LINUXINCLUDE)
@@ -71,6 +69,10 @@ BOOTAFLAGS   := -D__ASSEMBLY__ $(BOOTCFLAGS) -nostdinc
 
 BOOTARFLAGS    := -crD
 
+BOOTCFLAGS     += $(call cc-option,-mno-prefixed) \
+                  $(call cc-option,-mno-pcrel) \
+                  $(call cc-option,-mno-mma)
+
 ifdef CONFIG_CC_IS_CLANG
 BOOTCFLAGS += $(CLANG_FLAGS)
 BOOTAFLAGS += $(CLANG_FLAGS)
index 7113f93..ad18725 100644 (file)
@@ -96,7 +96,7 @@ config CRYPTO_AES_PPC_SPE
 
 config CRYPTO_AES_GCM_P10
        tristate "Stitched AES/GCM acceleration support on P10 or later CPU (PPC)"
-       depends on PPC64 && CPU_LITTLE_ENDIAN
+       depends on PPC64 && CPU_LITTLE_ENDIAN && VSX
        select CRYPTO_LIB_AES
        select CRYPTO_ALGAPI
        select CRYPTO_AEAD
index 678b5bd..34e14df 100644 (file)
@@ -205,7 +205,6 @@ extern void iommu_register_group(struct iommu_table_group *table_group,
                                 int pci_domain_number, unsigned long pe_num);
 extern int iommu_add_device(struct iommu_table_group *table_group,
                struct device *dev);
-extern void iommu_del_device(struct device *dev);
 extern long iommu_tce_xchg(struct mm_struct *mm, struct iommu_table *tbl,
                unsigned long entry, unsigned long *hpa,
                enum dma_data_direction *direction);
@@ -229,10 +228,6 @@ static inline int iommu_add_device(struct iommu_table_group *table_group,
 {
        return 0;
 }
-
-static inline void iommu_del_device(struct device *dev)
-{
-}
 #endif /* !CONFIG_IOMMU_API */
 
 u64 dma_iommu_get_required_mask(struct device *dev);
index 038ce8d..8920862 100644 (file)
@@ -144,7 +144,7 @@ static bool dma_iommu_bypass_supported(struct device *dev, u64 mask)
 /* We support DMA to/from any memory page via the iommu */
 int dma_iommu_dma_supported(struct device *dev, u64 mask)
 {
-       struct iommu_table *tbl = get_iommu_table_base(dev);
+       struct iommu_table *tbl;
 
        if (dev_is_pci(dev) && dma_iommu_bypass_supported(dev, mask)) {
                /*
@@ -162,6 +162,8 @@ int dma_iommu_dma_supported(struct device *dev, u64 mask)
                return 1;
        }
 
+       tbl = get_iommu_table_base(dev);
+
        if (!tbl) {
                dev_err(dev, "Warning: IOMMU dma not supported: mask 0x%08llx, table unavailable\n", mask);
                return 0;
index 0089dd4..67f0b01 100644 (file)
@@ -518,7 +518,7 @@ int ppc_iommu_map_sg(struct device *dev, struct iommu_table *tbl,
                /* Convert entry to a dma_addr_t */
                entry += tbl->it_offset;
                dma_addr = entry << tbl->it_page_shift;
-               dma_addr |= (s->offset & ~IOMMU_PAGE_MASK(tbl));
+               dma_addr |= (vaddr & ~IOMMU_PAGE_MASK(tbl));
 
                DBG("  - %lu pages, entry: %lx, dma_addr: %lx\n",
                            npages, entry, dma_addr);
@@ -905,6 +905,7 @@ void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl,
        unsigned int order;
        unsigned int nio_pages, io_order;
        struct page *page;
+       int tcesize = (1 << tbl->it_page_shift);
 
        size = PAGE_ALIGN(size);
        order = get_order(size);
@@ -931,7 +932,8 @@ void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl,
        memset(ret, 0, size);
 
        /* Set up tces to cover the allocated range */
-       nio_pages = size >> tbl->it_page_shift;
+       nio_pages = IOMMU_PAGE_ALIGN(size, tbl) >> tbl->it_page_shift;
+
        io_order = get_iommu_order(size, tbl);
        mapping = iommu_alloc(dev, tbl, ret, nio_pages, DMA_BIDIRECTIONAL,
                              mask >> tbl->it_page_shift, io_order, 0);
@@ -939,7 +941,8 @@ void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl,
                free_pages((unsigned long)ret, order);
                return NULL;
        }
-       *dma_handle = mapping;
+
+       *dma_handle = mapping | ((u64)ret & (tcesize - 1));
        return ret;
 }
 
@@ -950,7 +953,7 @@ void iommu_free_coherent(struct iommu_table *tbl, size_t size,
                unsigned int nio_pages;
 
                size = PAGE_ALIGN(size);
-               nio_pages = size >> tbl->it_page_shift;
+               nio_pages = IOMMU_PAGE_ALIGN(size, tbl) >> tbl->it_page_shift;
                iommu_free(tbl, dma_handle, nio_pages);
                size = PAGE_ALIGN(size);
                free_pages((unsigned long)vaddr, get_order(size));
@@ -1168,23 +1171,6 @@ int iommu_add_device(struct iommu_table_group *table_group, struct device *dev)
 }
 EXPORT_SYMBOL_GPL(iommu_add_device);
 
-void iommu_del_device(struct device *dev)
-{
-       /*
-        * Some devices might not have IOMMU table and group
-        * and we needn't detach them from the associated
-        * IOMMU groups
-        */
-       if (!device_iommu_mapped(dev)) {
-               pr_debug("iommu_tce: skipping device %s with no tbl\n",
-                        dev_name(dev));
-               return;
-       }
-
-       iommu_group_remove_device(dev);
-}
-EXPORT_SYMBOL_GPL(iommu_del_device);
-
 /*
  * A simple iommu_table_group_ops which only allows reusing the existing
  * iommu_table. This handles VFIO for POWER7 or the nested KVM.
index 85bdd7d..48e0eaf 100644 (file)
@@ -93,11 +93,12 @@ static int process_ISA_OF_ranges(struct device_node *isa_node,
        }
 
 inval_range:
-       if (!phb_io_base_phys) {
+       if (phb_io_base_phys) {
                pr_err("no ISA IO ranges or unexpected isa range, mapping 64k\n");
                remap_isa_base(phb_io_base_phys, 0x10000);
+               return 0;
        }
-       return 0;
+       return -EINVAL;
 }
 
 
index 26245aa..2297aa7 100644 (file)
@@ -1040,8 +1040,8 @@ void radix__ptep_set_access_flags(struct vm_area_struct *vma, pte_t *ptep,
                                  pte_t entry, unsigned long address, int psize)
 {
        struct mm_struct *mm = vma->vm_mm;
-       unsigned long set = pte_val(entry) & (_PAGE_DIRTY | _PAGE_ACCESSED |
-                                             _PAGE_RW | _PAGE_EXEC);
+       unsigned long set = pte_val(entry) & (_PAGE_DIRTY | _PAGE_SOFT_DIRTY |
+                                             _PAGE_ACCESSED | _PAGE_RW | _PAGE_EXEC);
 
        unsigned long change = pte_val(entry) ^ pte_val(*ptep);
        /*
index e93aefc..37043df 100644 (file)
@@ -101,6 +101,8 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)
                bpf_hdr = jit_data->header;
                proglen = jit_data->proglen;
                extra_pass = true;
+               /* During extra pass, ensure index is reset before repopulating extable entries */
+               cgctx.exentry_idx = 0;
                goto skip_init_ctx;
        }
 
index 0d9b760..3e2e252 100644 (file)
@@ -265,6 +265,7 @@ config CPM2
 config FSL_ULI1575
        bool "ULI1575 PCIe south bridge support"
        depends on FSL_SOC_BOOKE || PPC_86xx
+       depends on PCI
        select FSL_PCI
        select GENERIC_ISA_DMA
        help
index 233a50e..7725492 100644 (file)
@@ -865,28 +865,3 @@ void __init pnv_pci_init(void)
        /* Configure IOMMU DMA hooks */
        set_pci_dma_ops(&dma_iommu_ops);
 }
-
-static int pnv_tce_iommu_bus_notifier(struct notifier_block *nb,
-               unsigned long action, void *data)
-{
-       struct device *dev = data;
-
-       switch (action) {
-       case BUS_NOTIFY_DEL_DEVICE:
-               iommu_del_device(dev);
-               return 0;
-       default:
-               return 0;
-       }
-}
-
-static struct notifier_block pnv_tce_iommu_bus_nb = {
-       .notifier_call = pnv_tce_iommu_bus_notifier,
-};
-
-static int __init pnv_tce_iommu_bus_notifier_init(void)
-{
-       bus_register_notifier(&pci_bus_type, &pnv_tce_iommu_bus_nb);
-       return 0;
-}
-machine_subsys_initcall_sync(powernv, pnv_tce_iommu_bus_notifier_init);
index 7464fa6..918f511 100644 (file)
@@ -91,19 +91,24 @@ static struct iommu_table_group *iommu_pseries_alloc_group(int node)
 static void iommu_pseries_free_group(struct iommu_table_group *table_group,
                const char *node_name)
 {
-       struct iommu_table *tbl;
-
        if (!table_group)
                return;
 
-       tbl = table_group->tables[0];
 #ifdef CONFIG_IOMMU_API
        if (table_group->group) {
                iommu_group_put(table_group->group);
                BUG_ON(table_group->group);
        }
 #endif
-       iommu_tce_table_put(tbl);
+
+       /* Default DMA window table is at index 0, while DDW at 1. SR-IOV
+        * adapters only have table on index 1.
+        */
+       if (table_group->tables[0])
+               iommu_tce_table_put(table_group->tables[0]);
+
+       if (table_group->tables[1])
+               iommu_tce_table_put(table_group->tables[1]);
 
        kfree(table_group);
 }
@@ -1695,31 +1700,6 @@ static int __init disable_multitce(char *str)
 
 __setup("multitce=", disable_multitce);
 
-static int tce_iommu_bus_notifier(struct notifier_block *nb,
-               unsigned long action, void *data)
-{
-       struct device *dev = data;
-
-       switch (action) {
-       case BUS_NOTIFY_DEL_DEVICE:
-               iommu_del_device(dev);
-               return 0;
-       default:
-               return 0;
-       }
-}
-
-static struct notifier_block tce_iommu_bus_nb = {
-       .notifier_call = tce_iommu_bus_notifier,
-};
-
-static int __init tce_iommu_bus_notifier_init(void)
-{
-       bus_register_notifier(&pci_bus_type, &tce_iommu_bus_nb);
-       return 0;
-}
-machine_subsys_initcall_sync(pseries, tce_iommu_bus_notifier_init);
-
 #ifdef CONFIG_SPAPR_TCE_IOMMU
 struct iommu_group *pSeries_pci_device_group(struct pci_controller *hose,
                                             struct pci_dev *pdev)
index 5d7cb99..7b593d4 100644 (file)
@@ -22,7 +22,7 @@ KCOV_INSTRUMENT       := n
 
 $(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \
                               --remove-section=.note.gnu.property \
-                              --prefix-alloc-sections=.init
+                              --prefix-alloc-sections=.init.pi
 $(obj)/%.pi.o: $(obj)/%.o FORCE
        $(call if_changed,objcopy)
 
index c40139e..8265ff4 100644 (file)
@@ -4,3 +4,5 @@ obj-$(CONFIG_RETHOOK)           += rethook.o rethook_trampoline.o
 obj-$(CONFIG_KPROBES_ON_FTRACE)        += ftrace.o
 obj-$(CONFIG_UPROBES)          += uprobes.o decode-insn.o simulate-insn.o
 CFLAGS_REMOVE_simulate-insn.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_rethook.o = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_rethook_trampoline.o = $(CC_FLAGS_FTRACE)
index f03b569..e5f9f46 100644 (file)
@@ -84,11 +84,8 @@ SECTIONS
        __init_data_begin = .;
        INIT_DATA_SECTION(16)
 
-       /* Those sections result from the compilation of kernel/pi/string.c */
-       .init.pidata : {
-               *(.init.srodata.cst8*)
-               *(.init__bug_table*)
-               *(.init.sdata*)
+       .init.pi : {
+               *(.init.pi*)
        }
 
        .init.bss : {
index db20c15..6dab9c1 100644 (file)
@@ -469,19 +469,11 @@ config SCHED_SMT
 config SCHED_MC
        def_bool n
 
-config SCHED_BOOK
-       def_bool n
-
-config SCHED_DRAWER
-       def_bool n
-
 config SCHED_TOPOLOGY
        def_bool y
        prompt "Topology scheduler support"
        select SCHED_SMT
        select SCHED_MC
-       select SCHED_BOOK
-       select SCHED_DRAWER
        help
          Topology scheduler support improves the CPU scheduler's decision
          making when dealing with machines that have multi-threading,
@@ -716,7 +708,6 @@ config EADM_SCH
 config VFIO_CCW
        def_tristate n
        prompt "Support for VFIO-CCW subchannels"
-       depends on S390_CCW_IOMMU
        depends on VFIO
        select VFIO_MDEV
        help
@@ -728,7 +719,7 @@ config VFIO_CCW
 config VFIO_AP
        def_tristate n
        prompt "VFIO support for AP devices"
-       depends on S390_AP_IOMMU && KVM
+       depends on KVM
        depends on VFIO
        depends on ZCRYPT
        select VFIO_MDEV
index 4ccf66d..be3bf03 100644 (file)
@@ -591,8 +591,6 @@ CONFIG_VIRTIO_BALLOON=m
 CONFIG_VIRTIO_INPUT=y
 CONFIG_VHOST_NET=m
 CONFIG_VHOST_VSOCK=m
-CONFIG_S390_CCW_IOMMU=y
-CONFIG_S390_AP_IOMMU=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -703,6 +701,7 @@ CONFIG_IMA_DEFAULT_HASH_SHA256=y
 CONFIG_IMA_WRITE_POLICY=y
 CONFIG_IMA_APPRAISE=y
 CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor"
+CONFIG_INIT_STACK_NONE=y
 CONFIG_CRYPTO_USER=m
 # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
 CONFIG_CRYPTO_PCRYPT=m
index 693297a..769c7ee 100644 (file)
@@ -580,8 +580,6 @@ CONFIG_VIRTIO_BALLOON=m
 CONFIG_VIRTIO_INPUT=y
 CONFIG_VHOST_NET=m
 CONFIG_VHOST_VSOCK=m
-CONFIG_S390_CCW_IOMMU=y
-CONFIG_S390_AP_IOMMU=y
 CONFIG_EXT4_FS=y
 CONFIG_EXT4_FS_POSIX_ACL=y
 CONFIG_EXT4_FS_SECURITY=y
@@ -686,6 +684,7 @@ CONFIG_IMA_DEFAULT_HASH_SHA256=y
 CONFIG_IMA_WRITE_POLICY=y
 CONFIG_IMA_APPRAISE=y
 CONFIG_LSM="yama,loadpin,safesetid,integrity,selinux,smack,tomoyo,apparmor"
+CONFIG_INIT_STACK_NONE=y
 CONFIG_CRYPTO_FIPS=y
 CONFIG_CRYPTO_USER=m
 # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set
index 33a232b..6f68b39 100644 (file)
@@ -67,6 +67,7 @@ CONFIG_ZFCP=y
 # CONFIG_MISC_FILESYSTEMS is not set
 # CONFIG_NETWORK_FILESYSTEMS is not set
 CONFIG_LSM="yama,loadpin,safesetid,integrity"
+CONFIG_INIT_STACK_NONE=y
 # CONFIG_ZLIB_DFLTCC is not set
 CONFIG_XZ_DEC_MICROLZMA=y
 CONFIG_PRINTK_TIME=y
index 7752bd3..5fae187 100644 (file)
@@ -82,7 +82,7 @@ void chacha_crypt_arch(u32 *state, u8 *dst, const u8 *src,
         * it cannot handle a block of data or less, but otherwise
         * it can handle data of arbitrary size
         */
-       if (bytes <= CHACHA_BLOCK_SIZE || nrounds != 20)
+       if (bytes <= CHACHA_BLOCK_SIZE || nrounds != 20 || !MACHINE_HAS_VX)
                chacha_crypt_generic(state, dst, src, bytes, nrounds);
        else
                chacha20_crypt_s390(state, dst, src, bytes,
index a386070..3cb9d81 100644 (file)
@@ -112,7 +112,7 @@ struct compat_statfs64 {
        u32             f_namelen;
        u32             f_frsize;
        u32             f_flags;
-       u32             f_spare[4];
+       u32             f_spare[5];
 };
 
 /*
index 72604f7..f85b507 100644 (file)
@@ -30,7 +30,7 @@ struct statfs {
        unsigned int    f_namelen;
        unsigned int    f_frsize;
        unsigned int    f_flags;
-       unsigned int    f_spare[4];
+       unsigned int    f_spare[5];
 };
 
 struct statfs64 {
@@ -45,7 +45,7 @@ struct statfs64 {
        unsigned int    f_namelen;
        unsigned int    f_frsize;
        unsigned int    f_flags;
-       unsigned int    f_spare[4];
+       unsigned int    f_spare[5];
 };
 
 #endif
index 8983837..6b2a051 100644 (file)
@@ -10,6 +10,7 @@ CFLAGS_REMOVE_ftrace.o                = $(CC_FLAGS_FTRACE)
 
 # Do not trace early setup code
 CFLAGS_REMOVE_early.o          = $(CC_FLAGS_FTRACE)
+CFLAGS_REMOVE_rethook.o                = $(CC_FLAGS_FTRACE)
 
 endif
 
index 43de939..f44f70d 100644 (file)
@@ -1935,14 +1935,13 @@ static struct shutdown_action __refdata dump_action = {
 
 static void dump_reipl_run(struct shutdown_trigger *trigger)
 {
-       unsigned long ipib = (unsigned long) reipl_block_actual;
        struct lowcore *abs_lc;
        unsigned int csum;
 
        csum = (__force unsigned int)
               csum_partial(reipl_block_actual, reipl_block_actual->hdr.len, 0);
        abs_lc = get_abs_lowcore();
-       abs_lc->ipib = ipib;
+       abs_lc->ipib = __pa(reipl_block_actual);
        abs_lc->ipib_checksum = csum;
        put_abs_lowcore(abs_lc);
        dump_run(trigger);
index 9fd1953..68adf1d 100644 (file)
@@ -95,7 +95,7 @@ out:
 static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)
 {
        static cpumask_t mask;
-       int i;
+       unsigned int max_cpu;
 
        cpumask_clear(&mask);
        if (!cpumask_test_cpu(cpu, &cpu_setup_mask))
@@ -104,9 +104,10 @@ static void cpu_thread_map(cpumask_t *dst, unsigned int cpu)
        if (topology_mode != TOPOLOGY_MODE_HW)
                goto out;
        cpu -= cpu % (smp_cpu_mtid + 1);
-       for (i = 0; i <= smp_cpu_mtid; i++) {
-               if (cpumask_test_cpu(cpu + i, &cpu_setup_mask))
-                       cpumask_set_cpu(cpu + i, &mask);
+       max_cpu = min(cpu + smp_cpu_mtid, nr_cpu_ids - 1);
+       for (; cpu <= max_cpu; cpu++) {
+               if (cpumask_test_cpu(cpu, &cpu_setup_mask))
+                       cpumask_set_cpu(cpu, &mask);
        }
 out:
        cpumask_copy(dst, &mask);
@@ -123,25 +124,26 @@ static void add_cpus_to_mask(struct topology_core *tl_core,
        unsigned int core;
 
        for_each_set_bit(core, &tl_core->mask, TOPOLOGY_CORE_BITS) {
-               unsigned int rcore;
-               int lcpu, i;
+               unsigned int max_cpu, rcore;
+               int cpu;
 
                rcore = TOPOLOGY_CORE_BITS - 1 - core + tl_core->origin;
-               lcpu = smp_find_processor_id(rcore << smp_cpu_mt_shift);
-               if (lcpu < 0)
+               cpu = smp_find_processor_id(rcore << smp_cpu_mt_shift);
+               if (cpu < 0)
                        continue;
-               for (i = 0; i <= smp_cpu_mtid; i++) {
-                       topo = &cpu_topology[lcpu + i];
+               max_cpu = min(cpu + smp_cpu_mtid, nr_cpu_ids - 1);
+               for (; cpu <= max_cpu; cpu++) {
+                       topo = &cpu_topology[cpu];
                        topo->drawer_id = drawer->id;
                        topo->book_id = book->id;
                        topo->socket_id = socket->id;
                        topo->core_id = rcore;
-                       topo->thread_id = lcpu + i;
+                       topo->thread_id = cpu;
                        topo->dedicated = tl_core->d;
-                       cpumask_set_cpu(lcpu + i, &drawer->mask);
-                       cpumask_set_cpu(lcpu + i, &book->mask);
-                       cpumask_set_cpu(lcpu + i, &socket->mask);
-                       smp_cpu_set_polarization(lcpu + i, tl_core->pp);
+                       cpumask_set_cpu(cpu, &drawer->mask);
+                       cpumask_set_cpu(cpu, &book->mask);
+                       cpumask_set_cpu(cpu, &socket->mask);
+                       smp_cpu_set_polarization(cpu, tl_core->pp);
                }
        }
 }
index d096b04..9d24870 100644 (file)
@@ -1703,10 +1703,8 @@ int x86_pmu_handle_irq(struct pt_regs *regs)
 
                perf_sample_data_init(&data, 0, event->hw.last_period);
 
-               if (has_branch_stack(event)) {
-                       data.br_stack = &cpuc->lbr_stack;
-                       data.sample_flags |= PERF_SAMPLE_BRANCH_STACK;
-               }
+               if (has_branch_stack(event))
+                       perf_sample_save_brstack(&data, event, &cpuc->lbr_stack);
 
                if (perf_event_overflow(event, &data, regs))
                        x86_pmu_stop(event, 0);
index a2e566e..df88576 100644 (file)
@@ -1229,12 +1229,14 @@ pebs_update_state(bool needed_cb, struct cpu_hw_events *cpuc,
                  struct perf_event *event, bool add)
 {
        struct pmu *pmu = event->pmu;
+
        /*
         * Make sure we get updated with the first PEBS
         * event. It will trigger also during removal, but
         * that does not hurt:
         */
-       bool update = cpuc->n_pebs == 1;
+       if (cpuc->n_pebs == 1)
+               cpuc->pebs_data_cfg = PEBS_UPDATE_DS_SW;
 
        if (needed_cb != pebs_needs_sched_cb(cpuc)) {
                if (!needed_cb)
@@ -1242,7 +1244,7 @@ pebs_update_state(bool needed_cb, struct cpu_hw_events *cpuc,
                else
                        perf_sched_cb_dec(pmu);
 
-               update = true;
+               cpuc->pebs_data_cfg |= PEBS_UPDATE_DS_SW;
        }
 
        /*
@@ -1252,24 +1254,13 @@ pebs_update_state(bool needed_cb, struct cpu_hw_events *cpuc,
        if (x86_pmu.intel_cap.pebs_baseline && add) {
                u64 pebs_data_cfg;
 
-               /* Clear pebs_data_cfg and pebs_record_size for first PEBS. */
-               if (cpuc->n_pebs == 1) {
-                       cpuc->pebs_data_cfg = 0;
-                       cpuc->pebs_record_size = sizeof(struct pebs_basic);
-               }
-
                pebs_data_cfg = pebs_update_adaptive_cfg(event);
-
-               /* Update pebs_record_size if new event requires more data. */
-               if (pebs_data_cfg & ~cpuc->pebs_data_cfg) {
-                       cpuc->pebs_data_cfg |= pebs_data_cfg;
-                       adaptive_pebs_record_size_update();
-                       update = true;
-               }
+               /*
+                * Be sure to update the thresholds when we change the record.
+                */
+               if (pebs_data_cfg & ~cpuc->pebs_data_cfg)
+                       cpuc->pebs_data_cfg |= pebs_data_cfg | PEBS_UPDATE_DS_SW;
        }
-
-       if (update)
-               pebs_update_threshold(cpuc);
 }
 
 void intel_pmu_pebs_add(struct perf_event *event)
@@ -1326,9 +1317,17 @@ static void intel_pmu_pebs_via_pt_enable(struct perf_event *event)
        wrmsrl(base + idx, value);
 }
 
+static inline void intel_pmu_drain_large_pebs(struct cpu_hw_events *cpuc)
+{
+       if (cpuc->n_pebs == cpuc->n_large_pebs &&
+           cpuc->n_pebs != cpuc->n_pebs_via_pt)
+               intel_pmu_drain_pebs_buffer();
+}
+
 void intel_pmu_pebs_enable(struct perf_event *event)
 {
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
+       u64 pebs_data_cfg = cpuc->pebs_data_cfg & ~PEBS_UPDATE_DS_SW;
        struct hw_perf_event *hwc = &event->hw;
        struct debug_store *ds = cpuc->ds;
        unsigned int idx = hwc->idx;
@@ -1344,11 +1343,22 @@ void intel_pmu_pebs_enable(struct perf_event *event)
 
        if (x86_pmu.intel_cap.pebs_baseline) {
                hwc->config |= ICL_EVENTSEL_ADAPTIVE;
-               if (cpuc->pebs_data_cfg != cpuc->active_pebs_data_cfg) {
-                       wrmsrl(MSR_PEBS_DATA_CFG, cpuc->pebs_data_cfg);
-                       cpuc->active_pebs_data_cfg = cpuc->pebs_data_cfg;
+               if (pebs_data_cfg != cpuc->active_pebs_data_cfg) {
+                       /*
+                        * drain_pebs() assumes uniform record size;
+                        * hence we need to drain when changing said
+                        * size.
+                        */
+                       intel_pmu_drain_large_pebs(cpuc);
+                       adaptive_pebs_record_size_update();
+                       wrmsrl(MSR_PEBS_DATA_CFG, pebs_data_cfg);
+                       cpuc->active_pebs_data_cfg = pebs_data_cfg;
                }
        }
+       if (cpuc->pebs_data_cfg & PEBS_UPDATE_DS_SW) {
+               cpuc->pebs_data_cfg = pebs_data_cfg;
+               pebs_update_threshold(cpuc);
+       }
 
        if (idx >= INTEL_PMC_IDX_FIXED) {
                if (x86_pmu.intel_cap.pebs_format < 5)
@@ -1391,9 +1401,7 @@ void intel_pmu_pebs_disable(struct perf_event *event)
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
        struct hw_perf_event *hwc = &event->hw;
 
-       if (cpuc->n_pebs == cpuc->n_large_pebs &&
-           cpuc->n_pebs != cpuc->n_pebs_via_pt)
-               intel_pmu_drain_pebs_buffer();
+       intel_pmu_drain_large_pebs(cpuc);
 
        cpuc->pebs_enabled &= ~(1ULL << hwc->idx);
 
index 8fc15ed..abf0988 100644 (file)
 #define PEBS_DATACFG_LBRS      BIT_ULL(3)
 #define PEBS_DATACFG_LBR_SHIFT 24
 
+/* Steal the highest bit of pebs_data_cfg for SW usage */
+#define PEBS_UPDATE_DS_SW      BIT_ULL(63)
+
 /*
  * Intel "Architectural Performance Monitoring" CPUID
  * detection/enumeration details:
index dd61752..4070a01 100644 (file)
@@ -17,6 +17,7 @@ CFLAGS_REMOVE_ftrace.o = -pg
 CFLAGS_REMOVE_early_printk.o = -pg
 CFLAGS_REMOVE_head64.o = -pg
 CFLAGS_REMOVE_sev.o = -pg
+CFLAGS_REMOVE_rethook.o = -pg
 endif
 
 KASAN_SANITIZE_head$(BITS).o                           := n
index 4266b64..7e331e8 100644 (file)
@@ -36,6 +36,7 @@
 #define PCI_DEVICE_ID_AMD_19H_M50H_DF_F4 0x166e
 #define PCI_DEVICE_ID_AMD_19H_M60H_DF_F4 0x14e4
 #define PCI_DEVICE_ID_AMD_19H_M70H_DF_F4 0x14f4
+#define PCI_DEVICE_ID_AMD_19H_M78H_DF_F4 0x12fc
 
 /* Protect the PCI config register pairs used for SMN. */
 static DEFINE_MUTEX(smn_mutex);
@@ -79,6 +80,7 @@ static const struct pci_device_id amd_nb_misc_ids[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M50H_DF_F3) },
        { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M60H_DF_F3) },
        { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M70H_DF_F3) },
+       { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_19H_M78H_DF_F3) },
        {}
 };
 
index 27ef53f..b3b1e37 100644 (file)
@@ -144,8 +144,8 @@ SYM_CODE_END(__x86_indirect_jump_thunk_array)
  */
        .align 64
        .skip 63, 0xcc
-SYM_FUNC_START_NOALIGN(zen_untrain_ret);
-
+SYM_START(zen_untrain_ret, SYM_L_GLOBAL, SYM_A_NONE)
+       ANNOTATE_NOENDBR
        /*
         * As executed from zen_untrain_ret, this is:
         *
index d2e6be4..58d0aeb 100644 (file)
@@ -678,6 +678,16 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
        return error;
 }
 
+static int blkdev_mmap(struct file *file, struct vm_area_struct *vma)
+{
+       struct inode *bd_inode = bdev_file_inode(file);
+
+       if (bdev_read_only(I_BDEV(bd_inode)))
+               return generic_file_readonly_mmap(file, vma);
+
+       return generic_file_mmap(file, vma);
+}
+
 const struct file_operations def_blk_fops = {
        .open           = blkdev_open,
        .release        = blkdev_close,
@@ -685,7 +695,7 @@ const struct file_operations def_blk_fops = {
        .read_iter      = blkdev_read_iter,
        .write_iter     = blkdev_write_iter,
        .iopoll         = iocb_bio_iopoll,
-       .mmap           = generic_file_mmap,
+       .mmap           = blkdev_mmap,
        .fsync          = blkdev_fsync,
        .unlocked_ioctl = blkdev_ioctl,
 #ifdef CONFIG_COMPAT
index e8492b3..0800a9d 100644 (file)
@@ -516,6 +516,17 @@ static const struct dmi_system_id maingear_laptop[] = {
        { }
 };
 
+static const struct dmi_system_id lg_laptop[] = {
+       {
+               .ident = "LG Electronics 17U70P",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
+                       DMI_MATCH(DMI_BOARD_NAME, "17U70P"),
+               },
+       },
+       { }
+};
+
 struct irq_override_cmp {
        const struct dmi_system_id *system;
        unsigned char irq;
@@ -532,6 +543,7 @@ static const struct irq_override_cmp override_table[] = {
        { lenovo_laptop, 10, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, true },
        { tongfang_gm_rg, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
        { maingear_laptop, 1, ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_LOW, 1, true },
+       { lg_laptop, 1, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_LOW, 0, false },
 };
 
 static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity,
index ac1808d..05d9df9 100644 (file)
@@ -320,6 +320,7 @@ void class_dev_iter_init(struct class_dev_iter *iter, const struct class *class,
                start_knode = &start->p->knode_class;
        klist_iter_init_node(&sp->klist_devices, &iter->ki, start_knode);
        iter->type = type;
+       iter->sp = sp;
 }
 EXPORT_SYMBOL_GPL(class_dev_iter_init);
 
@@ -361,6 +362,7 @@ EXPORT_SYMBOL_GPL(class_dev_iter_next);
 void class_dev_iter_exit(struct class_dev_iter *iter)
 {
        klist_iter_exit(&iter->ki);
+       subsys_put(iter->sp);
 }
 EXPORT_SYMBOL_GPL(class_dev_iter_exit);
 
index 9c35c95..65ecde3 100644 (file)
@@ -1666,7 +1666,7 @@ static int nbd_dev_dbg_init(struct nbd_device *nbd)
                return -EIO;
 
        dir = debugfs_create_dir(nbd_name(nbd), nbd_dbg_dir);
-       if (!dir) {
+       if (IS_ERR(dir)) {
                dev_err(nbd_to_dev(nbd), "Failed to create debugfs dir for '%s'\n",
                        nbd_name(nbd));
                return -EIO;
@@ -1692,7 +1692,7 @@ static int nbd_dbg_init(void)
        struct dentry *dbg_dir;
 
        dbg_dir = debugfs_create_dir("nbd", NULL);
-       if (!dbg_dir)
+       if (IS_ERR(dbg_dir))
                return -EIO;
 
        nbd_dbg_dir = dbg_dir;
index ea7ac8b..da1d054 100644 (file)
@@ -241,7 +241,7 @@ static inline blk_opf_t rnbd_to_bio_flags(u32 rnbd_opf)
                bio_opf = REQ_OP_WRITE;
                break;
        case RNBD_OP_FLUSH:
-               bio_opf = REQ_OP_FLUSH | REQ_PREFLUSH;
+               bio_opf = REQ_OP_WRITE | REQ_PREFLUSH;
                break;
        case RNBD_OP_DISCARD:
                bio_opf = REQ_OP_DISCARD;
index c7331f5..33d3298 100644 (file)
@@ -1120,6 +1120,11 @@ static inline bool ublk_queue_ready(struct ublk_queue *ubq)
        return ubq->nr_io_ready == ubq->q_depth;
 }
 
+static void ublk_cmd_cancel_cb(struct io_uring_cmd *cmd, unsigned issue_flags)
+{
+       io_uring_cmd_done(cmd, UBLK_IO_RES_ABORT, 0, issue_flags);
+}
+
 static void ublk_cancel_queue(struct ublk_queue *ubq)
 {
        int i;
@@ -1131,8 +1136,8 @@ static void ublk_cancel_queue(struct ublk_queue *ubq)
                struct ublk_io *io = &ubq->ios[i];
 
                if (io->flags & UBLK_IO_FLAG_ACTIVE)
-                       io_uring_cmd_done(io->cmd, UBLK_IO_RES_ABORT, 0,
-                                               IO_URING_F_UNLOCKED);
+                       io_uring_cmd_complete_in_task(io->cmd,
+                                                     ublk_cmd_cancel_cb);
        }
 
        /* all io commands are canceled */
@@ -1281,7 +1286,7 @@ static inline int ublk_check_cmd_op(u32 cmd_op)
 {
        u32 ioc_type = _IOC_TYPE(cmd_op);
 
-       if (IS_ENABLED(CONFIG_BLKDEV_UBLK_LEGACY_OPCODES) && ioc_type != 'u')
+       if (!IS_ENABLED(CONFIG_BLKDEV_UBLK_LEGACY_OPCODES) && ioc_type != 'u')
                return -EOPNOTSUPP;
 
        if (ioc_type != 'u' && ioc_type != 0)
index c10a4aa..cd48033 100644 (file)
@@ -571,6 +571,10 @@ static int tpm_hwrng_read(struct hwrng *rng, void *data, size_t max, bool wait)
 {
        struct tpm_chip *chip = container_of(rng, struct tpm_chip, hwrng);
 
+       /* Give back zero bytes, as TPM chip has not yet fully resumed: */
+       if (chip->flags & TPM_CHIP_FLAG_SUSPENDED)
+               return 0;
+
        return tpm_get_random(chip, data, max);
 }
 
index 4463d00..586ca10 100644 (file)
@@ -412,6 +412,8 @@ int tpm_pm_suspend(struct device *dev)
        }
 
 suspended:
+       chip->flags |= TPM_CHIP_FLAG_SUSPENDED;
+
        if (rc)
                dev_err(dev, "Ignoring error %d while suspending\n", rc);
        return 0;
@@ -429,6 +431,14 @@ int tpm_pm_resume(struct device *dev)
        if (chip == NULL)
                return -ENODEV;
 
+       chip->flags &= ~TPM_CHIP_FLAG_SUSPENDED;
+
+       /*
+        * Guarantee that SUSPENDED is written last, so that hwrng does not
+        * activate before the chip has been fully resumed.
+        */
+       wmb();
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_pm_resume);
index 7af3898..709b4e1 100644 (file)
@@ -122,6 +122,22 @@ static const struct dmi_system_id tpm_tis_dmi_table[] = {
                        DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T490s"),
                },
        },
+       {
+               .callback = tpm_tis_disable_irq,
+               .ident = "ThinkStation P360 Tiny",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkStation P360 Tiny"),
+               },
+       },
+       {
+               .callback = tpm_tis_disable_irq,
+               .ident = "ThinkPad L490",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad L490"),
+               },
+       },
        {}
 };
 
index 02945d5..558144f 100644 (file)
@@ -1209,25 +1209,20 @@ static void tpm_tis_reenable_interrupts(struct tpm_chip *chip)
        u32 intmask;
        int rc;
 
-       if (chip->ops->clk_enable != NULL)
-               chip->ops->clk_enable(chip, true);
-
-       /* reenable interrupts that device may have lost or
-        * BIOS/firmware may have disabled
+       /*
+        * Re-enable interrupts that device may have lost or BIOS/firmware may
+        * have disabled.
         */
        rc = tpm_tis_write8(priv, TPM_INT_VECTOR(priv->locality), priv->irq);
-       if (rc < 0)
-               goto out;
+       if (rc < 0) {
+               dev_err(&chip->dev, "Setting IRQ failed.\n");
+               return;
+       }
 
        intmask = priv->int_mask | TPM_GLOBAL_INT_ENABLE;
-
-       tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
-
-out:
-       if (chip->ops->clk_enable != NULL)
-               chip->ops->clk_enable(chip, false);
-
-       return;
+       rc = tpm_tis_write32(priv, TPM_INT_ENABLE(priv->locality), intmask);
+       if (rc < 0)
+               dev_err(&chip->dev, "Enabling interrupts failed.\n");
 }
 
 int tpm_tis_resume(struct device *dev)
@@ -1235,27 +1230,27 @@ int tpm_tis_resume(struct device *dev)
        struct tpm_chip *chip = dev_get_drvdata(dev);
        int ret;
 
-       ret = tpm_tis_request_locality(chip, 0);
-       if (ret < 0)
+       ret = tpm_chip_start(chip);
+       if (ret)
                return ret;
 
        if (chip->flags & TPM_CHIP_FLAG_IRQ)
                tpm_tis_reenable_interrupts(chip);
 
-       ret = tpm_pm_resume(dev);
-       if (ret)
-               goto out;
-
        /*
         * TPM 1.2 requires self-test on resume. This function actually returns
         * an error code but for unknown reason it isn't handled.
         */
        if (!(chip->flags & TPM_CHIP_FLAG_TPM2))
                tpm1_do_selftest(chip);
-out:
-       tpm_tis_relinquish_locality(chip, 0);
 
-       return ret;
+       tpm_chip_stop(chip);
+
+       ret = tpm_pm_resume(dev);
+       if (ret)
+               return ret;
+
+       return 0;
 }
 EXPORT_SYMBOL_GPL(tpm_tis_resume);
 #endif
index 2990439..b2f05d2 100644 (file)
@@ -975,7 +975,7 @@ static int __init acpi_cpufreq_probe(struct platform_device *pdev)
 
        /* don't keep reloading if cpufreq_driver exists */
        if (cpufreq_get_current_driver())
-               return -EEXIST;
+               return -ENODEV;
 
        pr_debug("%s\n", __func__);
 
index 1d2cfea..73efbcf 100644 (file)
@@ -583,7 +583,7 @@ static int __init pcc_cpufreq_probe(struct platform_device *pdev)
 
        /* Skip initialization if another cpufreq driver is there. */
        if (cpufreq_get_current_driver())
-               return -EEXIST;
+               return -ENODEV;
 
        if (acpi_disabled)
                return -ENODEV;
index bdbd907..f332fe7 100644 (file)
@@ -571,6 +571,7 @@ void read_cdat_data(struct cxl_port *port)
                /* Don't leave table data allocated on error */
                devm_kfree(dev, cdat_table);
                dev_err(dev, "CDAT data read error\n");
+               return;
        }
 
        port->cdat.table = cdat_table + sizeof(__le32);
index af22be8..538bd67 100644 (file)
@@ -706,21 +706,22 @@ static void fwnet_receive_packet(struct fw_card *card, struct fw_request *r,
        int rcode;
 
        if (destination == IEEE1394_ALL_NODES) {
-               kfree(r);
-
-               return;
-       }
-
-       if (offset != dev->handler.offset)
+               // Although the response to the broadcast packet is not necessarily required, the
+               // fw_send_response() function should still be called to maintain the reference
+               // counting of the object. In the case, the call of function just releases the
+               // object as a result to decrease the reference counting.
+               rcode = RCODE_COMPLETE;
+       } else if (offset != dev->handler.offset) {
                rcode = RCODE_ADDRESS_ERROR;
-       else if (tcode != TCODE_WRITE_BLOCK_REQUEST)
+       } else if (tcode != TCODE_WRITE_BLOCK_REQUEST) {
                rcode = RCODE_TYPE_ERROR;
-       else if (fwnet_incoming_packet(dev, payload, length,
-                                      source, generation, false) != 0) {
+       else if (fwnet_incoming_packet(dev, payload, length,
+                                        source, generation, false) != 0) {
                dev_err(&dev->netdev->dev, "incoming packet failure\n");
                rcode = RCODE_CONFLICT_ERROR;
-       } else
+       } else {
                rcode = RCODE_COMPLETE;
+       }
 
        fw_send_response(card, r, rcode);
 }
index 82c64cb..74363ed 100644 (file)
@@ -51,7 +51,8 @@ __init bool sysfb_parse_mode(const struct screen_info *si,
         *
         * It's not easily possible to fix this in struct screen_info,
         * as this could break UAPI. The best solution is to compute
-        * bits_per_pixel here and ignore lfb_depth. In the loop below,
+        * bits_per_pixel from the color bits, reserved bits and
+        * reported lfb_depth, whichever is highest.  In the loop below,
         * ignore simplefb formats with alpha bits, as EFI and VESA
         * don't specify alpha channels.
         */
@@ -60,6 +61,7 @@ __init bool sysfb_parse_mode(const struct screen_info *si,
                                          si->green_size + si->green_pos,
                                          si->blue_size + si->blue_pos),
                                     si->rsvd_size + si->rsvd_pos);
+               bits_per_pixel = max_t(u32, bits_per_pixel, si->lfb_depth);
        } else {
                bits_per_pixel = si->lfb_depth;
        }
index 981a9cf..5c7d408 100644 (file)
@@ -3757,6 +3757,12 @@ int amdgpu_device_init(struct amdgpu_device *adev,
                adev->have_atomics_support = ((struct amd_sriov_msg_pf2vf_info *)
                        adev->virt.fw_reserve.p_pf2vf)->pcie_atomic_ops_support_flags ==
                        (PCI_EXP_DEVCAP2_ATOMIC_COMP32 | PCI_EXP_DEVCAP2_ATOMIC_COMP64);
+       /* APUs w/ gfx9 onwards doesn't reply on PCIe atomics, rather it is a
+        * internal path natively support atomics, set have_atomics_support to true.
+        */
+       else if ((adev->flags & AMD_IS_APU) &&
+               (adev->ip_versions[GC_HWIP][0] > IP_VERSION(9, 0, 0)))
+               adev->have_atomics_support = true;
        else
                adev->have_atomics_support =
                        !pci_enable_atomic_ops_to_root(adev->pdev,
@@ -4506,7 +4512,11 @@ static int amdgpu_device_recover_vram(struct amdgpu_device *adev)
        dev_info(adev->dev, "recover vram bo from shadow start\n");
        mutex_lock(&adev->shadow_list_lock);
        list_for_each_entry(vmbo, &adev->shadow_list, shadow_list) {
-               shadow = &vmbo->bo;
+               /* If vm is compute context or adev is APU, shadow will be NULL */
+               if (!vmbo->shadow)
+                       continue;
+               shadow = vmbo->shadow;
+
                /* No need to recover an evicted BO */
                if (shadow->tbo.resource->mem_type != TTM_PL_TT ||
                    shadow->tbo.resource->start == AMDGPU_BO_INVALID_OFFSET ||
index f52d0ba..a7d2508 100644 (file)
@@ -582,7 +582,8 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)
                if (r)
                        amdgpu_fence_driver_force_completion(ring);
 
-               if (ring->fence_drv.irq_src)
+               if (!drm_dev_is_unplugged(adev_to_drm(adev)) &&
+                   ring->fence_drv.irq_src)
                        amdgpu_irq_put(adev, ring->fence_drv.irq_src,
                                       ring->fence_drv.irq_type);
 
index 9d3a054..f3f541b 100644 (file)
@@ -687,9 +687,11 @@ int amdgpu_gfx_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *r
                if (r)
                        return r;
 
-               r = amdgpu_irq_get(adev, &adev->gfx.cp_ecc_error_irq, 0);
-               if (r)
-                       goto late_fini;
+               if (adev->gfx.cp_ecc_error_irq.funcs) {
+                       r = amdgpu_irq_get(adev, &adev->gfx.cp_ecc_error_irq, 0);
+                       if (r)
+                               goto late_fini;
+               }
        } else {
                amdgpu_ras_feature_enable_on_boot(adev, ras_block, 0);
        }
index f5b5ce1..1ec0765 100644 (file)
@@ -8152,8 +8152,14 @@ static int gfx_v10_0_set_powergating_state(void *handle,
        case IP_VERSION(10, 3, 3):
        case IP_VERSION(10, 3, 6):
        case IP_VERSION(10, 3, 7):
+               if (!enable)
+                       amdgpu_gfx_off_ctrl(adev, false);
+
                gfx_v10_cntl_pg(adev, enable);
-               amdgpu_gfx_off_ctrl(adev, enable);
+
+               if (enable)
+                       amdgpu_gfx_off_ctrl(adev, true);
+
                break;
        default:
                break;
index a9da048..c4940b6 100644 (file)
@@ -1315,13 +1315,6 @@ static int gfx_v11_0_sw_init(void *handle)
        if (r)
                return r;
 
-       /* ECC error */
-       r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_GRBM_CP,
-                                 GFX_11_0_0__SRCID__CP_ECC_ERROR,
-                                 &adev->gfx.cp_ecc_error_irq);
-       if (r)
-               return r;
-
        /* FED error */
        r = amdgpu_irq_add_id(adev, SOC21_IH_CLIENTID_GFX,
                                  GFX_11_0_0__SRCID__RLC_GC_FED_INTERRUPT,
@@ -4444,7 +4437,6 @@ static int gfx_v11_0_hw_fini(void *handle)
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
        int r;
 
-       amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
        amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
        amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
 
@@ -4675,24 +4667,27 @@ static uint64_t gfx_v11_0_get_gpu_clock_counter(struct amdgpu_device *adev)
        uint64_t clock;
        uint64_t clock_counter_lo, clock_counter_hi_pre, clock_counter_hi_after;
 
-       amdgpu_gfx_off_ctrl(adev, false);
-       mutex_lock(&adev->gfx.gpu_clock_mutex);
        if (amdgpu_sriov_vf(adev)) {
+               amdgpu_gfx_off_ctrl(adev, false);
+               mutex_lock(&adev->gfx.gpu_clock_mutex);
                clock_counter_hi_pre = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_HI);
                clock_counter_lo = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_LO);
                clock_counter_hi_after = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_HI);
                if (clock_counter_hi_pre != clock_counter_hi_after)
                        clock_counter_lo = (uint64_t)RREG32_SOC15(GC, 0, regCP_MES_MTIME_LO);
+               mutex_unlock(&adev->gfx.gpu_clock_mutex);
+               amdgpu_gfx_off_ctrl(adev, true);
        } else {
+               preempt_disable();
                clock_counter_hi_pre = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_UPPER);
                clock_counter_lo = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_LOWER);
                clock_counter_hi_after = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_UPPER);
                if (clock_counter_hi_pre != clock_counter_hi_after)
                        clock_counter_lo = (uint64_t)RREG32_SOC15(SMUIO, 0, regGOLDEN_TSC_COUNT_LOWER);
+               preempt_enable();
        }
        clock = clock_counter_lo | (clock_counter_hi_after << 32ULL);
-       mutex_unlock(&adev->gfx.gpu_clock_mutex);
-       amdgpu_gfx_off_ctrl(adev, true);
+
        return clock;
 }
 
@@ -5158,8 +5153,14 @@ static int gfx_v11_0_set_powergating_state(void *handle,
                break;
        case IP_VERSION(11, 0, 1):
        case IP_VERSION(11, 0, 4):
+               if (!enable)
+                       amdgpu_gfx_off_ctrl(adev, false);
+
                gfx_v11_cntl_pg(adev, enable);
-               amdgpu_gfx_off_ctrl(adev, enable);
+
+               if (enable)
+                       amdgpu_gfx_off_ctrl(adev, true);
+
                break;
        default:
                break;
@@ -5897,36 +5898,6 @@ static void gfx_v11_0_set_compute_eop_interrupt_state(struct amdgpu_device *adev
        }
 }
 
-#define CP_ME1_PIPE_INST_ADDR_INTERVAL  0x1
-#define SET_ECC_ME_PIPE_STATE(reg_addr, state) \
-       do { \
-               uint32_t tmp = RREG32_SOC15_IP(GC, reg_addr); \
-               tmp = REG_SET_FIELD(tmp, CP_ME1_PIPE0_INT_CNTL, CP_ECC_ERROR_INT_ENABLE, state); \
-               WREG32_SOC15_IP(GC, reg_addr, tmp); \
-       } while (0)
-
-static int gfx_v11_0_set_cp_ecc_error_state(struct amdgpu_device *adev,
-                                                       struct amdgpu_irq_src *source,
-                                                       unsigned type,
-                                                       enum amdgpu_interrupt_state state)
-{
-       uint32_t ecc_irq_state = 0;
-       uint32_t pipe0_int_cntl_addr = 0;
-       int i = 0;
-
-       ecc_irq_state = (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0;
-
-       pipe0_int_cntl_addr = SOC15_REG_OFFSET(GC, 0, regCP_ME1_PIPE0_INT_CNTL);
-
-       WREG32_FIELD15_PREREG(GC, 0, CP_INT_CNTL_RING0, CP_ECC_ERROR_INT_ENABLE, ecc_irq_state);
-
-       for (i = 0; i < adev->gfx.mec.num_pipe_per_mec; i++)
-               SET_ECC_ME_PIPE_STATE(pipe0_int_cntl_addr + i * CP_ME1_PIPE_INST_ADDR_INTERVAL,
-                                       ecc_irq_state);
-
-       return 0;
-}
-
 static int gfx_v11_0_set_eop_interrupt_state(struct amdgpu_device *adev,
                                            struct amdgpu_irq_src *src,
                                            unsigned type,
@@ -6341,11 +6312,6 @@ static const struct amdgpu_irq_src_funcs gfx_v11_0_priv_inst_irq_funcs = {
        .process = gfx_v11_0_priv_inst_irq,
 };
 
-static const struct amdgpu_irq_src_funcs gfx_v11_0_cp_ecc_error_irq_funcs = {
-       .set = gfx_v11_0_set_cp_ecc_error_state,
-       .process = amdgpu_gfx_cp_ecc_error_irq,
-};
-
 static const struct amdgpu_irq_src_funcs gfx_v11_0_rlc_gc_fed_irq_funcs = {
        .process = gfx_v11_0_rlc_gc_fed_irq,
 };
@@ -6361,9 +6327,6 @@ static void gfx_v11_0_set_irq_funcs(struct amdgpu_device *adev)
        adev->gfx.priv_inst_irq.num_types = 1;
        adev->gfx.priv_inst_irq.funcs = &gfx_v11_0_priv_inst_irq_funcs;
 
-       adev->gfx.cp_ecc_error_irq.num_types = 1; /* CP ECC error */
-       adev->gfx.cp_ecc_error_irq.funcs = &gfx_v11_0_cp_ecc_error_irq_funcs;
-
        adev->gfx.rlc_gc_fed_irq.num_types = 1; /* 0x80 FED error */
        adev->gfx.rlc_gc_fed_irq.funcs = &gfx_v11_0_rlc_gc_fed_irq_funcs;
 
index adbcd81..9818743 100644 (file)
@@ -3764,7 +3764,8 @@ static int gfx_v9_0_hw_fini(void *handle)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 
-       amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
+       if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
+               amdgpu_irq_put(adev, &adev->gfx.cp_ecc_error_irq, 0);
        amdgpu_irq_put(adev, &adev->gfx.priv_reg_irq, 0);
        amdgpu_irq_put(adev, &adev->gfx.priv_inst_irq, 0);
 
@@ -4002,30 +4003,25 @@ static uint64_t gfx_v9_0_get_gpu_clock_counter(struct amdgpu_device *adev)
                clock = clock_lo | (clock_hi << 32ULL);
                break;
        case IP_VERSION(9, 1, 0):
+       case IP_VERSION(9, 2, 2):
                preempt_disable();
-               clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven);
-               clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven);
-               hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven);
-               /* The PWR TSC clock frequency is 100MHz, which sets 32-bit carry over
-                * roughly every 42 seconds.
-                */
-               if (hi_check != clock_hi) {
+               if (adev->rev_id >= 0x8) {
+                       clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2);
+                       clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2);
+                       hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2);
+               } else {
+                       clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven);
                        clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven);
-                       clock_hi = hi_check;
+                       hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven);
                }
-               preempt_enable();
-               clock = clock_lo | (clock_hi << 32ULL);
-               break;
-       case IP_VERSION(9, 2, 2):
-               preempt_disable();
-               clock_hi = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2);
-               clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2);
-               hi_check = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_UPPER_Raven2);
                /* The PWR TSC clock frequency is 100MHz, which sets 32-bit carry over
-                * roughly every 42 seconds.
-                */
+               * roughly every 42 seconds.
+               */
                if (hi_check != clock_hi) {
-                       clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2);
+                       if (adev->rev_id >= 0x8)
+                               clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven2);
+                       else
+                               clock_lo = RREG32_SOC15_NO_KIQ(PWR, 0, mmGOLDEN_TSC_COUNT_LOWER_Raven);
                        clock_hi = hi_check;
                }
                preempt_enable();
index d95f9fe..4116c11 100644 (file)
@@ -31,6 +31,8 @@
 #include "umc_v8_10.h"
 #include "athub/athub_3_0_0_sh_mask.h"
 #include "athub/athub_3_0_0_offset.h"
+#include "dcn/dcn_3_2_0_offset.h"
+#include "dcn/dcn_3_2_0_sh_mask.h"
 #include "oss/osssys_6_0_0_offset.h"
 #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"
 #include "navi10_enum.h"
@@ -546,7 +548,24 @@ static void gmc_v11_0_get_vm_pte(struct amdgpu_device *adev,
 
 static unsigned gmc_v11_0_get_vbios_fb_size(struct amdgpu_device *adev)
 {
-       return 0;
+       u32 d1vga_control = RREG32_SOC15(DCE, 0, regD1VGA_CONTROL);
+       unsigned size;
+
+       if (REG_GET_FIELD(d1vga_control, D1VGA_CONTROL, D1VGA_MODE_ENABLE)) {
+               size = AMDGPU_VBIOS_VGA_ALLOCATION;
+       } else {
+               u32 viewport;
+               u32 pitch;
+
+               viewport = RREG32_SOC15(DCE, 0, regHUBP0_DCSURF_PRI_VIEWPORT_DIMENSION);
+               pitch = RREG32_SOC15(DCE, 0, regHUBPREQ0_DCSURF_SURFACE_PITCH);
+               size = (REG_GET_FIELD(viewport,
+                                       HUBP0_DCSURF_PRI_VIEWPORT_DIMENSION, PRI_VIEWPORT_HEIGHT) *
+                               REG_GET_FIELD(pitch, HUBPREQ0_DCSURF_SURFACE_PITCH, PITCH) *
+                               4);
+       }
+
+       return size;
 }
 
 static const struct amdgpu_gmc_funcs gmc_v11_0_gmc_funcs = {
index c55e094..1c2292c 100644 (file)
@@ -54,6 +54,7 @@ static int jpeg_v3_0_early_init(void *handle)
 
        switch (adev->ip_versions[UVD_HWIP][0]) {
        case IP_VERSION(3, 1, 1):
+       case IP_VERSION(3, 1, 2):
                break;
        default:
                harvest = RREG32_SOC15(JPEG, 0, mmCC_UVD_HARVESTING);
index 98c826f..0fb6013 100644 (file)
@@ -98,6 +98,16 @@ static const struct amdgpu_video_codecs nv_video_codecs_decode =
 };
 
 /* Sienna Cichlid */
+static const struct amdgpu_video_codec_info sc_video_codecs_encode_array[] = {
+       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2160, 0)},
+       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 7680, 4352, 0)},
+};
+
+static const struct amdgpu_video_codecs sc_video_codecs_encode = {
+       .codec_count = ARRAY_SIZE(sc_video_codecs_encode_array),
+       .codec_array = sc_video_codecs_encode_array,
+};
+
 static const struct amdgpu_video_codec_info sc_video_codecs_decode_array_vcn0[] =
 {
        {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG2, 4096, 4096, 3)},
@@ -136,8 +146,8 @@ static const struct amdgpu_video_codecs sc_video_codecs_decode_vcn1 =
 /* SRIOV Sienna Cichlid, not const since data is controlled by host */
 static struct amdgpu_video_codec_info sriov_sc_video_codecs_encode_array[] =
 {
-       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2304, 0)},
-       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 4096, 2304, 0)},
+       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_MPEG4_AVC, 4096, 2160, 0)},
+       {codec_info_build(AMDGPU_INFO_VIDEO_CAPS_CODEC_IDX_HEVC, 7680, 4352, 0)},
 };
 
 static struct amdgpu_video_codec_info sriov_sc_video_codecs_decode_array_vcn0[] =
@@ -237,12 +247,12 @@ static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
                } else {
                        if (adev->vcn.harvest_config & AMDGPU_VCN_HARVEST_VCN0) {
                                if (encode)
-                                       *codecs = &nv_video_codecs_encode;
+                                       *codecs = &sc_video_codecs_encode;
                                else
                                        *codecs = &sc_video_codecs_decode_vcn1;
                        } else {
                                if (encode)
-                                       *codecs = &nv_video_codecs_encode;
+                                       *codecs = &sc_video_codecs_encode;
                                else
                                        *codecs = &sc_video_codecs_decode_vcn0;
                        }
@@ -251,14 +261,14 @@ static int nv_query_video_codecs(struct amdgpu_device *adev, bool encode,
        case IP_VERSION(3, 0, 16):
        case IP_VERSION(3, 0, 2):
                if (encode)
-                       *codecs = &nv_video_codecs_encode;
+                       *codecs = &sc_video_codecs_encode;
                else
                        *codecs = &sc_video_codecs_decode_vcn0;
                return 0;
        case IP_VERSION(3, 1, 1):
        case IP_VERSION(3, 1, 2):
                if (encode)
-                       *codecs = &nv_video_codecs_encode;
+                       *codecs = &sc_video_codecs_encode;
                else
                        *codecs = &yc_video_codecs_decode;
                return 0;
index b3cc04d..9295ac7 100644 (file)
@@ -1917,9 +1917,11 @@ static int sdma_v4_0_hw_fini(void *handle)
                return 0;
        }
 
-       for (i = 0; i < adev->sdma.num_instances; i++) {
-               amdgpu_irq_put(adev, &adev->sdma.ecc_irq,
-                              AMDGPU_SDMA_IRQ_INSTANCE0 + i);
+       if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__SDMA)) {
+               for (i = 0; i < adev->sdma.num_instances; i++) {
+                       amdgpu_irq_put(adev, &adev->sdma.ecc_irq,
+                                      AMDGPU_SDMA_IRQ_INSTANCE0 + i);
+               }
        }
 
        sdma_v4_0_ctx_switch_enable(adev, false);
index 744be2a..d771625 100644 (file)
@@ -711,7 +711,7 @@ static int soc21_common_early_init(void *handle)
                        AMD_PG_SUPPORT_VCN_DPG |
                        AMD_PG_SUPPORT_GFX_PG |
                        AMD_PG_SUPPORT_JPEG;
-               adev->external_rev_id = adev->rev_id + 0x1;
+               adev->external_rev_id = adev->rev_id + 0x80;
                break;
 
        default:
index 40c488b..cc3fe9c 100644 (file)
@@ -423,3 +423,68 @@ void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool
 
        PERF_TRACE();
 }
+static void apply_symclk_on_tx_off_wa(struct dc_link *link)
+{
+       /* There are use cases where SYMCLK is referenced by OTG. For instance
+        * for TMDS signal, OTG relies SYMCLK even if TX video output is off.
+        * However current link interface will power off PHY when disabling link
+        * output. This will turn off SYMCLK generated by PHY. The workaround is
+        * to identify such case where SYMCLK is still in use by OTG when we
+        * power off PHY. When this is detected, we will temporarily power PHY
+        * back on and move PHY's SYMCLK state to SYMCLK_ON_TX_OFF by calling
+        * program_pix_clk interface. When OTG is disabled, we will then power
+        * off PHY by calling disable link output again.
+        *
+        * In future dcn generations, we plan to rework transmitter control
+        * interface so that we could have an option to set SYMCLK ON TX OFF
+        * state in one step without this workaround
+        */
+
+       struct dc *dc = link->ctx->dc;
+       struct pipe_ctx *pipe_ctx = NULL;
+       uint8_t i;
+
+       if (link->phy_state.symclk_ref_cnts.otg > 0) {
+               for (i = 0; i < MAX_PIPES; i++) {
+                       pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i];
+                       if (pipe_ctx->stream && pipe_ctx->stream->link == link && pipe_ctx->top_pipe == NULL) {
+                               pipe_ctx->clock_source->funcs->program_pix_clk(
+                                               pipe_ctx->clock_source,
+                                               &pipe_ctx->stream_res.pix_clk_params,
+                                               dc->link_srv->dp_get_encoding_format(
+                                                               &pipe_ctx->link_config.dp_link_settings),
+                                               &pipe_ctx->pll_settings);
+                               link->phy_state.symclk_state = SYMCLK_ON_TX_OFF;
+                               break;
+                       }
+               }
+       }
+}
+
+void dcn314_disable_link_output(struct dc_link *link,
+               const struct link_resource *link_res,
+               enum signal_type signal)
+{
+       struct dc *dc = link->ctx->dc;
+       const struct link_hwss *link_hwss = get_link_hwss(link, link_res);
+       struct dmcu *dmcu = dc->res_pool->dmcu;
+
+       if (signal == SIGNAL_TYPE_EDP &&
+                       link->dc->hwss.edp_backlight_control)
+               link->dc->hwss.edp_backlight_control(link, false);
+       else if (dmcu != NULL && dmcu->funcs->lock_phy)
+               dmcu->funcs->lock_phy(dmcu);
+
+       link_hwss->disable_link_output(link, link_res, signal);
+       link->phy_state.symclk_state = SYMCLK_OFF_TX_OFF;
+       /*
+        * Add the logic to extract BOTH power up and power down sequences
+        * from enable/disable link output and only call edp panel control
+        * in enable_link_dp and disable_link_dp once.
+        */
+       if (dmcu != NULL && dmcu->funcs->lock_phy)
+               dmcu->funcs->unlock_phy(dmcu);
+       dc->link_srv->dp_trace_source_sequence(link, DPCD_SOURCE_SEQ_AFTER_DISABLE_LINK_PHY);
+
+       apply_symclk_on_tx_off_wa(link);
+}
index c786d5e..6d0b625 100644 (file)
@@ -45,4 +45,6 @@ void dcn314_hubp_pg_control(struct dce_hwseq *hws, unsigned int hubp_inst, bool
 
 void dcn314_dpp_root_clock_control(struct dce_hwseq *hws, unsigned int dpp_inst, bool clock_on);
 
+void dcn314_disable_link_output(struct dc_link *link, const struct link_resource *link_res, enum signal_type signal);
+
 #endif /* __DC_HWSS_DCN314_H__ */
index 5267e90..a588f46 100644 (file)
@@ -105,7 +105,7 @@ static const struct hw_sequencer_funcs dcn314_funcs = {
        .enable_lvds_link_output = dce110_enable_lvds_link_output,
        .enable_tmds_link_output = dce110_enable_tmds_link_output,
        .enable_dp_link_output = dce110_enable_dp_link_output,
-       .disable_link_output = dce110_disable_link_output,
+       .disable_link_output = dcn314_disable_link_output,
        .z10_restore = dcn31_z10_restore,
        .z10_save_init = dcn31_z10_save_init,
        .set_disp_pattern_generator = dcn30_set_disp_pattern_generator,
index 13c7e73..d75248b 100644 (file)
@@ -810,7 +810,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
                                        v->SwathHeightY[k],
                                        v->SwathHeightC[k],
                                        TWait,
-                                       v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ?
+                                       (v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <= MEM_STROBE_FREQ_MHZ ||
+                                               v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <= MIN_DCFCLK_FREQ_MHZ) ?
                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
                                        /* Output */
                                        &v->DSTXAfterScaler[k],
@@ -3310,7 +3311,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l
                                                        v->swath_width_chroma_ub_this_state[k],
                                                        v->SwathHeightYThisState[k],
                                                        v->SwathHeightCThisState[k], v->TWait,
-                                                       v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ ?
+                                                       (v->DRAMSpeedPerState[i] <= MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <= MIN_DCFCLK_FREQ_MHZ) ?
                                                                        mode_lib->vba.ip.min_prefetch_in_strobe_us : 0,
 
                                                        /* Output */
index 500b3dd..d98e36a 100644 (file)
@@ -53,6 +53,7 @@
 #define BPP_BLENDED_PIPE 0xffffffff
 
 #define MEM_STROBE_FREQ_MHZ 1600
+#define MIN_DCFCLK_FREQ_MHZ 200
 #define MEM_STROBE_MAX_DELIVERY_TIME_US 60.0
 
 struct display_mode_lib;
index d4b7da5..e8b2fc4 100644 (file)
@@ -359,5 +359,8 @@ bool link_validate_dpia_bandwidth(const struct dc_stream_state *stream, const un
                link[i] = stream[i].link;
                bw_needed[i] = dc_bandwidth_in_kbps_from_timing(&stream[i].timing);
        }
+
+       ret = dpia_validate_usb4_bw(link, bw_needed, num_streams);
+
        return ret;
 }
index 300e156..078aaaa 100644 (file)
@@ -36,6 +36,8 @@
 #define amdgpu_dpm_enable_bapm(adev, e) \
                ((adev)->powerplay.pp_funcs->enable_bapm((adev)->powerplay.pp_handle, (e)))
 
+#define amdgpu_dpm_is_legacy_dpm(adev) ((adev)->powerplay.pp_handle == (adev))
+
 int amdgpu_dpm_get_sclk(struct amdgpu_device *adev, bool low)
 {
        const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
@@ -1460,15 +1462,24 @@ int amdgpu_dpm_get_smu_prv_buf_details(struct amdgpu_device *adev,
 
 int amdgpu_dpm_is_overdrive_supported(struct amdgpu_device *adev)
 {
-       struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
-       struct smu_context *smu = adev->powerplay.pp_handle;
+       if (is_support_sw_smu(adev)) {
+               struct smu_context *smu = adev->powerplay.pp_handle;
 
-       if ((is_support_sw_smu(adev) && smu->od_enabled) ||
-           (is_support_sw_smu(adev) && smu->is_apu) ||
-               (!is_support_sw_smu(adev) && hwmgr->od_enabled))
-               return true;
+               return (smu->od_enabled || smu->is_apu);
+       } else {
+               struct pp_hwmgr *hwmgr;
 
-       return false;
+               /*
+                * dpm on some legacy asics don't carry od_enabled member
+                * as its pp_handle is casted directly from adev.
+                */
+               if (amdgpu_dpm_is_legacy_dpm(adev))
+                       return false;
+
+               hwmgr = (struct pp_hwmgr *)adev->powerplay.pp_handle;
+
+               return hwmgr->od_enabled;
+       }
 }
 
 int amdgpu_dpm_set_pp_table(struct amdgpu_device *adev,
index 5633c57..2ddf519 100644 (file)
@@ -733,6 +733,24 @@ static int smu_late_init(void *handle)
                return ret;
        }
 
+       /*
+        * Explicitly notify PMFW the power mode the system in. Since
+        * the PMFW may boot the ASIC with a different mode.
+        * For those supporting ACDC switch via gpio, PMFW will
+        * handle the switch automatically. Driver involvement
+        * is unnecessary.
+        */
+       if (!smu->dc_controlled_by_gpio) {
+               ret = smu_set_power_source(smu,
+                                          adev->pm.ac_power ? SMU_POWER_SOURCE_AC :
+                                          SMU_POWER_SOURCE_DC);
+               if (ret) {
+                       dev_err(adev->dev, "Failed to switch to %s mode!\n",
+                               adev->pm.ac_power ? "AC" : "DC");
+                       return ret;
+               }
+       }
+
        if ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 1)) ||
            (adev->ip_versions[MP1_HWIP][0] == IP_VERSION(13, 0, 3)))
                return 0;
index c400051..275f708 100644 (file)
@@ -3413,26 +3413,8 @@ static int navi10_post_smu_init(struct smu_context *smu)
                return 0;
 
        ret = navi10_run_umc_cdr_workaround(smu);
-       if (ret) {
+       if (ret)
                dev_err(adev->dev, "Failed to apply umc cdr workaround!\n");
-               return ret;
-       }
-
-       if (!smu->dc_controlled_by_gpio) {
-               /*
-                * For Navi1X, manually switch it to AC mode as PMFW
-                * may boot it with DC mode.
-                */
-               ret = smu_v11_0_set_power_source(smu,
-                                                adev->pm.ac_power ?
-                                                SMU_POWER_SOURCE_AC :
-                                                SMU_POWER_SOURCE_DC);
-               if (ret) {
-                       dev_err(adev->dev, "Failed to switch to %s mode!\n",
-                                       adev->pm.ac_power ? "AC" : "DC");
-                       return ret;
-               }
-       }
 
        return ret;
 }
index 3d9ff46..98a33f8 100644 (file)
@@ -1770,6 +1770,7 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
        .enable_mgpu_fan_boost = smu_v13_0_7_enable_mgpu_fan_boost,
        .get_power_limit = smu_v13_0_7_get_power_limit,
        .set_power_limit = smu_v13_0_set_power_limit,
+       .set_power_source = smu_v13_0_set_power_source,
        .get_power_profile_mode = smu_v13_0_7_get_power_profile_mode,
        .set_power_profile_mode = smu_v13_0_7_set_power_profile_mode,
        .set_tool_table_location = smu_v13_0_set_tool_table_location,
index 794ffd4..f32ce29 100644 (file)
@@ -425,11 +425,12 @@ struct ast_device *ast_device_create(const struct drm_driver *drv,
                return ERR_PTR(-EIO);
 
        /*
-        * If we don't have IO space at all, use MMIO now and
-        * assume the chip has MMIO enabled by default (rev 0x20
-        * and higher).
+        * After AST2500, MMIO is enabled by default, and it should be adopted
+        * to be compatible with Arm.
         */
-       if (!(pci_resource_flags(pdev, 2) & IORESOURCE_IO)) {
+       if (pdev->revision >= 0x40) {
+               ast->ioregs = ast->regs + AST_IO_MM_OFFSET;
+       } else if (!(pci_resource_flags(pdev, 2) & IORESOURCE_IO)) {
                drm_info(dev, "platform has no IO space, trying MMIO\n");
                ast->ioregs = ast->regs + AST_IO_MM_OFFSET;
        }
index 6445898..6bb1b8b 100644 (file)
@@ -641,19 +641,27 @@ static void drm_fb_helper_damage(struct drm_fb_helper *helper, u32 x, u32 y,
 static void drm_fb_helper_memory_range_to_clip(struct fb_info *info, off_t off, size_t len,
                                               struct drm_rect *clip)
 {
+       u32 line_length = info->fix.line_length;
+       u32 fb_height = info->var.yres;
        off_t end = off + len;
        u32 x1 = 0;
-       u32 y1 = off / info->fix.line_length;
+       u32 y1 = off / line_length;
        u32 x2 = info->var.xres;
-       u32 y2 = DIV_ROUND_UP(end, info->fix.line_length);
+       u32 y2 = DIV_ROUND_UP(end, line_length);
+
+       /* Don't allow any of them beyond the bottom bound of display area */
+       if (y1 > fb_height)
+               y1 = fb_height;
+       if (y2 > fb_height)
+               y2 = fb_height;
 
        if ((y2 - y1) == 1) {
                /*
                 * We've only written to a single scanline. Try to reduce
                 * the number of horizontal pixels that need an update.
                 */
-               off_t bit_off = (off % info->fix.line_length) * 8;
-               off_t bit_end = (end % info->fix.line_length) * 8;
+               off_t bit_off = (off % line_length) * 8;
+               off_t bit_end = (end % line_length) * 8;
 
                x1 = bit_off / info->var.bits_per_pixel;
                x2 = DIV_ROUND_UP(bit_end, info->var.bits_per_pixel);
index 295382c..3fd6c73 100644 (file)
@@ -221,7 +221,7 @@ mipi_dsi_device_register_full(struct mipi_dsi_host *host,
                return dsi;
        }
 
-       dsi->dev.of_node = info->node;
+       device_set_node(&dsi->dev, of_fwnode_handle(info->node));
        dsi->channel = info->channel;
        strlcpy(dsi->name, info->type, sizeof(dsi->name));
 
index 74ea3c2..1a5ae78 100644 (file)
@@ -34,11 +34,11 @@ static inline int exynos_g2d_exec_ioctl(struct drm_device *dev, void *data,
        return -ENODEV;
 }
 
-int g2d_open(struct drm_device *drm_dev, struct drm_file *file)
+static inline int g2d_open(struct drm_device *drm_dev, struct drm_file *file)
 {
        return 0;
 }
 
-void g2d_close(struct drm_device *drm_dev, struct drm_file *file)
+static inline void g2d_close(struct drm_device *drm_dev, struct drm_file *file)
 { }
 #endif
index 06a0ca1..e4f4d2e 100644 (file)
@@ -62,10 +62,11 @@ config DRM_I915_FORCE_PROBE
          This is the default value for the i915.force_probe module
          parameter. Using the module parameter overrides this option.
 
-         Force probe the i915 for Intel graphics devices that are
-         recognized but not properly supported by this kernel version. It is
-         recommended to upgrade to a kernel version with proper support as soon
-         as it is available.
+         Force probe the i915 driver for Intel graphics devices that are
+         recognized but not properly supported by this kernel version. Force
+         probing an unsupported device taints the kernel. It is recommended to
+         upgrade to a kernel version with proper support as soon as it is
+         available.
 
          It can also be used to block the probe of recognized and fully
          supported devices.
@@ -75,7 +76,8 @@ config DRM_I915_FORCE_PROBE
          Use "<pci-id>[,<pci-id>,...]" to force probe the i915 for listed
          devices. For example, "4500" or "4500,4571".
 
-         Use "*" to force probe the driver for all known devices.
+         Use "*" to force probe the driver for all known devices. Not
+         recommended.
 
          Use "!" right before the ID to block the probe of the device. For
          example, "4500,!4571" forces the probe of 4500 and blocks the probe of
index 40de9f0..f33164b 100644 (file)
@@ -1028,7 +1028,7 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
        int ret;
 
        if (old_obj) {
-               const struct intel_crtc_state *crtc_state =
+               const struct intel_crtc_state *new_crtc_state =
                        intel_atomic_get_new_crtc_state(state,
                                                        to_intel_crtc(old_plane_state->hw.crtc));
 
@@ -1043,7 +1043,7 @@ intel_prepare_plane_fb(struct drm_plane *_plane,
                 * This should only fail upon a hung GPU, in which case we
                 * can safely continue.
                 */
-               if (intel_crtc_needs_modeset(crtc_state)) {
+               if (new_crtc_state && intel_crtc_needs_modeset(new_crtc_state)) {
                        ret = i915_sw_fence_await_reservation(&state->commit_ready,
                                                              old_obj->base.resv,
                                                              false, 0,
index f0bace9..529ee22 100644 (file)
@@ -1601,6 +1601,11 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
                pipe_config->dsc.slice_count =
                        drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
                                                        true);
+               if (!pipe_config->dsc.slice_count) {
+                       drm_dbg_kms(&dev_priv->drm, "Unsupported Slice Count %d\n",
+                                   pipe_config->dsc.slice_count);
+                       return -EINVAL;
+               }
        } else {
                u16 dsc_max_output_bpp = 0;
                u8 dsc_dp_slice_count;
index 650232c..b183efa 100644 (file)
@@ -204,8 +204,6 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
        struct intel_digital_port *dig_port = intel_attached_dig_port(connector);
        struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
        struct intel_hdcp *hdcp = &connector->hdcp;
-       struct intel_gt *gt = dev_priv->media_gt;
-       struct intel_gsc_uc *gsc = &gt->uc.gsc;
        bool capable = false;
 
        /* I915 support for HDCP2.2 */
@@ -213,9 +211,13 @@ bool intel_hdcp2_capable(struct intel_connector *connector)
                return false;
 
        /* If MTL+ make sure gsc is loaded and proxy is setup */
-       if (intel_hdcp_gsc_cs_required(dev_priv))
-               if (!intel_uc_fw_is_running(&gsc->fw))
+       if (intel_hdcp_gsc_cs_required(dev_priv)) {
+               struct intel_gt *gt = dev_priv->media_gt;
+               struct intel_gsc_uc *gsc = gt ? &gt->uc.gsc : NULL;
+
+               if (!gsc || !intel_uc_fw_is_running(&gsc->fw))
                        return false;
+       }
 
        /* MEI/GSC interface is solid depending on which is used */
        mutex_lock(&dev_priv->display.hdcp.comp_mutex);
index cf49188..e0e7931 100644 (file)
        { FORCEWAKE_MT,             0,      0, "FORCEWAKE" }
 
 #define COMMON_GEN9BASE_GLOBAL \
-       { GEN8_FAULT_TLB_DATA0,     0,      0, "GEN8_FAULT_TLB_DATA0" }, \
-       { GEN8_FAULT_TLB_DATA1,     0,      0, "GEN8_FAULT_TLB_DATA1" }, \
        { ERROR_GEN6,               0,      0, "ERROR_GEN6" }, \
        { DONE_REG,                 0,      0, "DONE_REG" }, \
        { HSW_GTT_CACHE_EN,         0,      0, "HSW_GTT_CACHE_EN" }
 
+#define GEN9_GLOBAL \
+       { GEN8_FAULT_TLB_DATA0,     0,      0, "GEN8_FAULT_TLB_DATA0" }, \
+       { GEN8_FAULT_TLB_DATA1,     0,      0, "GEN8_FAULT_TLB_DATA1" }
+
 #define COMMON_GEN12BASE_GLOBAL \
        { GEN12_FAULT_TLB_DATA0,    0,      0, "GEN12_FAULT_TLB_DATA0" }, \
        { GEN12_FAULT_TLB_DATA1,    0,      0, "GEN12_FAULT_TLB_DATA1" }, \
@@ -142,6 +144,7 @@ static const struct __guc_mmio_reg_descr xe_lpd_gsc_inst_regs[] = {
 static const struct __guc_mmio_reg_descr default_global_regs[] = {
        COMMON_BASE_GLOBAL,
        COMMON_GEN9BASE_GLOBAL,
+       GEN9_GLOBAL,
 };
 
 static const struct __guc_mmio_reg_descr default_rc_class_regs[] = {
index 2a012da..edcfb5f 100644 (file)
@@ -1344,6 +1344,12 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENODEV;
        }
 
+       if (intel_info->require_force_probe) {
+               dev_info(&pdev->dev, "Force probing unsupported Device ID %04x, tainting kernel\n",
+                        pdev->device);
+               add_taint(TAINT_USER, LOCKDEP_STILL_OK);
+       }
+
        /* Only bind to function 0 of the device. Early generations
         * used function 1 as a placeholder for multi-head. This causes
         * us confusion instead, especially on the systems where both
index 2b3ae84..bdcd554 100644 (file)
@@ -98,17 +98,17 @@ static const struct dpu_sspp_cfg msm8998_sspp[] = {
 
 static const struct dpu_lm_cfg msm8998_lm[] = {
        LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_0, LM_2, DSPP_0),
+               &msm8998_lm_sblk, PINGPONG_0, LM_1, DSPP_0),
        LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_1, LM_5, DSPP_1),
+               &msm8998_lm_sblk, PINGPONG_1, LM_0, DSPP_1),
        LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_2, LM_0, 0),
+               &msm8998_lm_sblk, PINGPONG_2, LM_5, 0),
        LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK,
                &msm8998_lm_sblk, PINGPONG_MAX, 0, 0),
        LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK,
                &msm8998_lm_sblk, PINGPONG_MAX, 0, 0),
        LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK,
-               &msm8998_lm_sblk, PINGPONG_3, LM_1, 0),
+               &msm8998_lm_sblk, PINGPONG_3, LM_2, 0),
 };
 
 static const struct dpu_pingpong_cfg msm8998_pp[] = {
@@ -134,10 +134,10 @@ static const struct dpu_dspp_cfg msm8998_dspp[] = {
 };
 
 static const struct dpu_intf_cfg msm8998_intf[] = {
-       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
-       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
-       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
-       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
+       INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25),
+       INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27),
+       INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29),
+       INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31),
 };
 
 static const struct dpu_perf_cfg msm8998_perf_data = {
index 282d410..42b0e58 100644 (file)
@@ -128,10 +128,10 @@ static const struct dpu_dspp_cfg sm8150_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8150_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
        PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
index c574002..e3bdfe7 100644 (file)
@@ -116,10 +116,10 @@ static const struct dpu_lm_cfg sc8180x_lm[] = {
 };
 
 static const struct dpu_pingpong_cfg sc8180x_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
        PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
index 2c40229..ed13058 100644 (file)
@@ -129,10 +129,10 @@ static const struct dpu_dspp_cfg sm8250_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8250_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
        PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk,
index 8799ed7..a46b117 100644 (file)
@@ -80,8 +80,8 @@ static const struct dpu_dspp_cfg sc7180_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sc7180_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -1, -1),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -1, -1),
+       PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, -1, -1),
+       PP_BLK("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk, -1, -1),
 };
 
 static const struct dpu_intf_cfg sc7180_intf[] = {
index 6f04d8f..988d820 100644 (file)
@@ -122,7 +122,6 @@ const struct dpu_mdss_cfg dpu_sm6115_cfg = {
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
-                    BIT(MDP_INTF0_INTR) | \
                     BIT(MDP_INTF1_INTR),
 };
 
index 303492d..c9003dc 100644 (file)
@@ -112,7 +112,6 @@ const struct dpu_mdss_cfg dpu_qcm2290_cfg = {
        .mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \
                     BIT(MDP_SSPP_TOP0_INTR2) | \
                     BIT(MDP_SSPP_TOP0_HIST_INTR) | \
-                    BIT(MDP_INTF0_INTR) | \
                     BIT(MDP_INTF1_INTR),
 };
 
index ca107ca..4f6a965 100644 (file)
@@ -127,22 +127,22 @@ static const struct dpu_dspp_cfg sm8350_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sm8350_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
 };
index 5957de1..6b2c7ea 100644 (file)
@@ -87,10 +87,10 @@ static const struct dpu_dspp_cfg sc7280_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sc7280_pp[] = {
-       PP_BLK("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1),
 };
 
 static const struct dpu_intf_cfg sc7280_intf[] = {
index 9aab110..706d0f1 100644 (file)
@@ -121,18 +121,18 @@ static const struct dpu_dspp_cfg sc8280xp_dspp[] = {
 };
 
 static const struct dpu_pingpong_cfg sc8280xp_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1),
-       PP_BLK_TE("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1),
-       PP_BLK_TE("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1),
-       PP_BLK_TE("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1),
-       PP_BLK_TE("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk_te,
-                 DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1),
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1),
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1),
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1),
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1),
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1),
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+                       DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1),
 };
 
 static const struct dpu_merge_3d_cfg sc8280xp_merge_3d[] = {
index 02a259b..4ecb3df 100644 (file)
@@ -128,28 +128,28 @@ static const struct dpu_dspp_cfg sm8450_dspp[] = {
 };
 /* FIXME: interrupts */
 static const struct dpu_pingpong_cfg sm8450_pp[] = {
-       PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)),
-       PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te,
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)),
-       PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)),
-       PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)),
-       PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
-       PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
-       PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk,
+       PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
 };
index 9e40303..d0ab351 100644 (file)
@@ -132,28 +132,28 @@ static const struct dpu_dspp_cfg sm8550_dspp[] = {
                 &sm8150_dspp_sblk),
 };
 static const struct dpu_pingpong_cfg sm8550_pp[] = {
-       PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8),
                        -1),
-       PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9),
                        -1),
-       PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10),
                        -1),
-       PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11),
                        -1),
-       PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30),
                        -1),
-       PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk,
                        DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31),
                        -1),
-       PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
-       PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
+       PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk,
                        -1,
                        -1),
 };
index 03f162a..5d994bc 100644 (file)
@@ -491,7 +491,7 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {
        .len = 0x20, .version = 0x20000},
 };
 
-#define PP_BLK_DIPHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
+#define PP_BLK_DITHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \
        {\
        .name = _name, .id = _id, \
        .base = _base, .len = 0, \
@@ -587,12 +587,12 @@ static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};
 
 static const struct dpu_vbif_dynamic_ot_cfg msm8998_ot_rdwr_cfg[] = {
        {
-               .pps = 1088 * 1920 * 30,
+               .pps = 1920 * 1080 * 30,
                .ot_limit = 2,
        },
        {
-               .pps = 1088 * 1920 * 60,
-               .ot_limit = 6,
+               .pps = 1920 * 1080 * 60,
+               .ot_limit = 4,
        },
        {
                .pps = 3840 * 2160 * 30,
@@ -705,10 +705,7 @@ static const struct dpu_qos_lut_entry msm8998_qos_linear[] = {
        {.fl = 10, .lut = 0x1555b},
        {.fl = 11, .lut = 0x5555b},
        {.fl = 12, .lut = 0x15555b},
-       {.fl = 13, .lut = 0x55555b},
-       {.fl = 14, .lut = 0},
-       {.fl = 1,  .lut = 0x1b},
-       {.fl = 0,  .lut = 0}
+       {.fl = 0,  .lut = 0x55555b}
 };
 
 static const struct dpu_qos_lut_entry sdm845_qos_linear[] = {
@@ -730,9 +727,7 @@ static const struct dpu_qos_lut_entry msm8998_qos_macrotile[] = {
        {.fl = 10, .lut = 0x1aaff},
        {.fl = 11, .lut = 0x5aaff},
        {.fl = 12, .lut = 0x15aaff},
-       {.fl = 13, .lut = 0x55aaff},
-       {.fl = 1,  .lut = 0x1aaff},
-       {.fl = 0,  .lut = 0},
+       {.fl = 0,  .lut = 0x55aaff},
 };
 
 static const struct dpu_qos_lut_entry sc7180_qos_linear[] = {
index 53326f2..17f3e7e 100644 (file)
@@ -15,7 +15,7 @@
 
 /*
  * Register offsets in MDSS register file for the interrupt registers
- * w.r.t. to the MDP base
+ * w.r.t. the MDP base
  */
 #define MDP_SSPP_TOP0_OFF              0x0
 #define MDP_INTF_0_OFF                 0x6A000
 #define MDP_INTF_3_OFF                 0x6B800
 #define MDP_INTF_4_OFF                 0x6C000
 #define MDP_INTF_5_OFF                 0x6C800
+#define INTF_INTR_EN                   0x1c0
+#define INTF_INTR_STATUS               0x1c4
+#define INTF_INTR_CLEAR                        0x1c8
 #define MDP_AD4_0_OFF                  0x7C000
 #define MDP_AD4_1_OFF                  0x7D000
 #define MDP_AD4_INTR_EN_OFF            0x41c
 #define MDP_AD4_INTR_CLEAR_OFF         0x424
 #define MDP_AD4_INTR_STATUS_OFF                0x420
-#define MDP_INTF_0_OFF_REV_7xxx             0x34000
-#define MDP_INTF_1_OFF_REV_7xxx             0x35000
-#define MDP_INTF_2_OFF_REV_7xxx             0x36000
-#define MDP_INTF_3_OFF_REV_7xxx             0x37000
-#define MDP_INTF_4_OFF_REV_7xxx             0x38000
-#define MDP_INTF_5_OFF_REV_7xxx             0x39000
-#define MDP_INTF_6_OFF_REV_7xxx             0x3a000
-#define MDP_INTF_7_OFF_REV_7xxx             0x3b000
-#define MDP_INTF_8_OFF_REV_7xxx             0x3c000
+#define MDP_INTF_0_OFF_REV_7xxx                0x34000
+#define MDP_INTF_1_OFF_REV_7xxx                0x35000
+#define MDP_INTF_2_OFF_REV_7xxx                0x36000
+#define MDP_INTF_3_OFF_REV_7xxx                0x37000
+#define MDP_INTF_4_OFF_REV_7xxx                0x38000
+#define MDP_INTF_5_OFF_REV_7xxx                0x39000
+#define MDP_INTF_6_OFF_REV_7xxx                0x3a000
+#define MDP_INTF_7_OFF_REV_7xxx                0x3b000
+#define MDP_INTF_8_OFF_REV_7xxx                0x3c000
 
 /**
  * struct dpu_intr_reg - array of DPU register sets
index 84ee2ef..b9dddf5 100644 (file)
 #define   INTF_TPG_RGB_MAPPING          0x11C
 #define   INTF_PROG_FETCH_START         0x170
 #define   INTF_PROG_ROT_START           0x174
-
-#define   INTF_FRAME_LINE_COUNT_EN      0x0A8
-#define   INTF_FRAME_COUNT              0x0AC
-#define   INTF_LINE_COUNT               0x0B0
-
 #define   INTF_MUX                      0x25C
 #define   INTF_STATUS                   0x26C
 
index 2d28afd..a3e413d 100644 (file)
@@ -61,6 +61,7 @@ static const struct dpu_wb_cfg *_wb_offset(enum dpu_wb wb,
        for (i = 0; i < m->wb_count; i++) {
                if (wb == m->wb[i].id) {
                        b->blk_addr = addr + m->wb[i].base;
+                       b->log_mask = DPU_DBG_MASK_WB;
                        return &m->wb[i];
                }
        }
index feb9a72..5acd568 100644 (file)
@@ -21,9 +21,6 @@
 #define HIST_INTR_EN                    0x01c
 #define HIST_INTR_STATUS                0x020
 #define HIST_INTR_CLEAR                 0x024
-#define INTF_INTR_EN                    0x1C0
-#define INTF_INTR_STATUS                0x1C4
-#define INTF_INTR_CLEAR                 0x1C8
 #define SPLIT_DISPLAY_EN                0x2F4
 #define SPLIT_DISPLAY_UPPER_PIPE_CTRL   0x2F8
 #define DSPP_IGC_COLOR0_RAM_LUTN        0x300
index 6666783..1245c7a 100644 (file)
@@ -593,6 +593,18 @@ static struct hdmi_codec_pdata codec_data = {
        .i2s = 1,
 };
 
+void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio)
+{
+       struct dp_audio_private *audio_priv;
+
+       audio_priv = container_of(dp_audio, struct dp_audio_private, dp_audio);
+
+       if (audio_priv->audio_pdev) {
+               platform_device_unregister(audio_priv->audio_pdev);
+               audio_priv->audio_pdev = NULL;
+       }
+}
+
 int dp_register_audio_driver(struct device *dev,
                struct dp_audio *dp_audio)
 {
index 84e5f4a..4ab7888 100644 (file)
@@ -53,6 +53,8 @@ struct dp_audio *dp_audio_get(struct platform_device *pdev,
 int dp_register_audio_driver(struct device *dev,
                struct dp_audio *dp_audio);
 
+void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio);
+
 /**
  * dp_audio_put()
  *
index 3e13acd..99a38db 100644 (file)
@@ -326,6 +326,7 @@ static void dp_display_unbind(struct device *dev, struct device *master,
        kthread_stop(dp->ev_tsk);
 
        dp_power_client_deinit(dp->power);
+       dp_unregister_audio_driver(dev, dp->audio);
        dp_aux_unregister(dp->aux);
        dp->drm_dev = NULL;
        dp->aux->drm_dev = NULL;
index d77fa97..9c45d64 100644 (file)
@@ -155,6 +155,8 @@ static bool can_do_async(struct drm_atomic_state *state,
        for_each_new_crtc_in_state(state, crtc, crtc_state, i) {
                if (drm_atomic_crtc_needs_modeset(crtc_state))
                        return false;
+               if (!crtc_state->active)
+                       return false;
                if (++num_crtcs > 1)
                        return false;
                *async_crtc = crtc;
index db6c4e2..cd39b9d 100644 (file)
@@ -219,7 +219,8 @@ static void put_pages(struct drm_gem_object *obj)
        }
 }
 
-static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
+static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj,
+                                             unsigned madv)
 {
        struct msm_drm_private *priv = obj->dev->dev_private;
        struct msm_gem_object *msm_obj = to_msm_bo(obj);
@@ -227,7 +228,9 @@ static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj)
 
        msm_gem_assert_locked(obj);
 
-       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) {
+       if (GEM_WARN_ON(msm_obj->madv > madv)) {
+               DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
+                       msm_obj->madv, madv);
                return ERR_PTR(-EBUSY);
        }
 
@@ -248,7 +251,7 @@ struct page **msm_gem_pin_pages(struct drm_gem_object *obj)
        struct page **p;
 
        msm_gem_lock(obj);
-       p = msm_gem_pin_pages_locked(obj);
+       p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
        msm_gem_unlock(obj);
 
        return p;
@@ -473,10 +476,7 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)
 
        msm_gem_assert_locked(obj);
 
-       if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED))
-               return -EBUSY;
-
-       pages = msm_gem_pin_pages_locked(obj);
+       pages = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
@@ -699,13 +699,7 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)
        if (obj->import_attach)
                return ERR_PTR(-ENODEV);
 
-       if (GEM_WARN_ON(msm_obj->madv > madv)) {
-               DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n",
-                       msm_obj->madv, madv);
-               return ERR_PTR(-EBUSY);
-       }
-
-       pages = msm_gem_pin_pages_locked(obj);
+       pages = msm_gem_pin_pages_locked(obj, madv);
        if (IS_ERR(pages))
                return ERR_CAST(pages);
 
index aff18c2..9f5933c 100644 (file)
@@ -722,7 +722,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
        struct msm_drm_private *priv = dev->dev_private;
        struct drm_msm_gem_submit *args = data;
        struct msm_file_private *ctx = file->driver_priv;
-       struct msm_gem_submit *submit;
+       struct msm_gem_submit *submit = NULL;
        struct msm_gpu *gpu = priv->gpu;
        struct msm_gpu_submitqueue *queue;
        struct msm_ringbuffer *ring;
@@ -769,13 +769,15 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
                out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
                if (out_fence_fd < 0) {
                        ret = out_fence_fd;
-                       return ret;
+                       goto out_post_unlock;
                }
        }
 
        submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds);
-       if (IS_ERR(submit))
-               return PTR_ERR(submit);
+       if (IS_ERR(submit)) {
+               ret = PTR_ERR(submit);
+               goto out_post_unlock;
+       }
 
        trace_msm_gpu_submit(pid_nr(submit->pid), ring->id, submit->ident,
                args->nr_bos, args->nr_cmds);
@@ -962,11 +964,20 @@ out:
        if (has_ww_ticket)
                ww_acquire_fini(&submit->ticket);
 out_unlock:
-       if (ret && (out_fence_fd >= 0))
-               put_unused_fd(out_fence_fd);
        mutex_unlock(&queue->lock);
 out_post_unlock:
-       msm_gem_submit_put(submit);
+       if (ret && (out_fence_fd >= 0))
+               put_unused_fd(out_fence_fd);
+
+       if (!IS_ERR_OR_NULL(submit)) {
+               msm_gem_submit_put(submit);
+       } else {
+               /*
+                * If the submit hasn't yet taken ownership of the queue
+                * then we need to drop the reference ourself:
+                */
+               msm_submitqueue_put(queue);
+       }
        if (!IS_ERR_OR_NULL(post_deps)) {
                for (i = 0; i < args->nr_out_syncobjs; ++i) {
                        kfree(post_deps[i].chain);
index 418e1e0..5cc8d35 100644 (file)
@@ -234,7 +234,12 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)
        /* Get the pagetable configuration from the domain */
        if (adreno_smmu->cookie)
                ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie);
-       if (!ttbr1_cfg)
+
+       /*
+        * If you hit this WARN_ONCE() you are probably missing an entry in
+        * qcom_smmu_impl_of_match[] in arm-smmu-qcom.c
+        */
+       if (WARN_ONCE(!ttbr1_cfg, "No per-process page tables"))
                return ERR_PTR(-ENODEV);
 
        pagetable = kzalloc(sizeof(*pagetable), GFP_KERNEL);
@@ -410,7 +415,7 @@ struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsig
        struct msm_mmu *mmu;
 
        mmu = msm_iommu_new(dev, quirks);
-       if (IS_ERR(mmu))
+       if (IS_ERR_OR_NULL(mmu))
                return mmu;
 
        iommu = to_msm_iommu(mmu);
index eb99d84..16d4ad5 100644 (file)
@@ -2,6 +2,8 @@
 #ifndef __NVIF_IF0012_H__
 #define __NVIF_IF0012_H__
 
+#include <drm/display/drm_dp.h>
+
 union nvif_outp_args {
        struct nvif_outp_v0 {
                __u8 version;
@@ -63,7 +65,7 @@ union nvif_outp_acquire_args {
                                __u8 hda;
                                __u8 mst;
                                __u8 pad04[4];
-                               __u8 dpcd[16];
+                               __u8 dpcd[DP_RECEIVER_CAP_SIZE];
                        } dp;
                };
        } v0;
index b7631c1..4e7f873 100644 (file)
@@ -3,6 +3,7 @@
 #define __NVKM_DISP_OUTP_H__
 #include "priv.h"
 
+#include <drm/display/drm_dp.h>
 #include <subdev/bios.h>
 #include <subdev/bios/dcb.h>
 #include <subdev/bios/dp.h>
@@ -42,7 +43,7 @@ struct nvkm_outp {
                        bool aux_pwr_pu;
                        u8 lttpr[6];
                        u8 lttprs;
-                       u8 dpcd[16];
+                       u8 dpcd[DP_RECEIVER_CAP_SIZE];
 
                        struct {
                                int dpcd; /* -1, or index into SUPPORTED_LINK_RATES table */
index 4f0ca70..fc283a4 100644 (file)
@@ -146,7 +146,7 @@ nvkm_uoutp_mthd_release(struct nvkm_outp *outp, void *argv, u32 argc)
 }
 
 static int
-nvkm_uoutp_mthd_acquire_dp(struct nvkm_outp *outp, u8 dpcd[16],
+nvkm_uoutp_mthd_acquire_dp(struct nvkm_outp *outp, u8 dpcd[DP_RECEIVER_CAP_SIZE],
                           u8 link_nr, u8 link_bw, bool hda, bool mst)
 {
        int ret;
index fcd5bd7..8c18363 100644 (file)
@@ -309,7 +309,7 @@ static void drm_sched_start_timeout(struct drm_gpu_scheduler *sched)
  */
 void drm_sched_fault(struct drm_gpu_scheduler *sched)
 {
-       if (sched->ready)
+       if (sched->timeout_wq)
                mod_delayed_work(sched->timeout_wq, &sched->work_tdr, 0);
 }
 EXPORT_SYMBOL(drm_sched_fault);
index ba2f6a4..7b177b9 100644 (file)
@@ -507,6 +507,7 @@ static const struct pci_device_id k10temp_id_table[] = {
        { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M50H_DF_F3) },
        { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M60H_DF_F3) },
        { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M70H_DF_F3) },
+       { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_19H_M78H_DF_F3) },
        { PCI_VDEVICE(HYGON, PCI_DEVICE_ID_AMD_17H_DF_F3) },
        {}
 };
index db98c3f..6de9007 100644 (file)
@@ -417,22 +417,6 @@ config S390_IOMMU
        help
          Support for the IOMMU API for s390 PCI devices.
 
-config S390_CCW_IOMMU
-       bool "S390 CCW IOMMU Support"
-       depends on S390 && CCW || COMPILE_TEST
-       select IOMMU_API
-       help
-         Enables bits of IOMMU API required by VFIO. The iommu_ops
-         is not implemented as it is not necessary for VFIO.
-
-config S390_AP_IOMMU
-       bool "S390 AP IOMMU Support"
-       depends on S390 && ZCRYPT || COMPILE_TEST
-       select IOMMU_API
-       help
-         Enables bits of IOMMU API required by VFIO. The iommu_ops
-         is not implemented as it is not necessary for VFIO.
-
 config MTK_IOMMU
        tristate "MediaTek IOMMU Support"
        depends on ARCH_MEDIATEK || COMPILE_TEST
index ae09c62..c71afda 100644 (file)
@@ -517,6 +517,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
        { .compatible = "qcom,qcm2290-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,qdu1000-smmu-500", .data = &qcom_smmu_500_impl0_data  },
        { .compatible = "qcom,sc7180-smmu-500", .data = &qcom_smmu_500_impl0_data },
+       { .compatible = "qcom,sc7180-smmu-v2", .data = &qcom_smmu_v2_data },
        { .compatible = "qcom,sc7280-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,sc8180x-smmu-500", .data = &qcom_smmu_500_impl0_data },
        { .compatible = "qcom,sc8280xp-smmu-500", .data = &qcom_smmu_500_impl0_data },
@@ -561,5 +562,14 @@ struct arm_smmu_device *qcom_smmu_impl_init(struct arm_smmu_device *smmu)
        if (match)
                return qcom_smmu_create(smmu, match->data);
 
+       /*
+        * If you hit this WARN_ON() you are missing an entry in the
+        * qcom_smmu_impl_of_match[] table, and GPU per-process page-
+        * tables will be broken.
+        */
+       WARN(of_device_is_compatible(np, "qcom,adreno-smmu"),
+            "Missing qcom_smmu_impl_of_match entry for: %s",
+            dev_name(smmu->dev));
+
        return smmu;
 }
index c2d2792..baf6454 100644 (file)
@@ -151,6 +151,12 @@ struct dvb_ca_private {
 
        /* mutex serializing ioctls */
        struct mutex ioctl_mutex;
+
+       /* A mutex used when a device is disconnected */
+       struct mutex remove_mutex;
+
+       /* Whether the device is disconnected */
+       int exit;
 };
 
 static void dvb_ca_private_free(struct dvb_ca_private *ca)
@@ -187,7 +193,7 @@ static void dvb_ca_en50221_thread_wakeup(struct dvb_ca_private *ca);
 static int dvb_ca_en50221_read_data(struct dvb_ca_private *ca, int slot,
                                    u8 *ebuf, int ecount);
 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,
-                                    u8 *ebuf, int ecount);
+                                    u8 *ebuf, int ecount, int size_write_flag);
 
 /**
  * findstr - Safely find needle in haystack.
@@ -370,7 +376,7 @@ static int dvb_ca_en50221_link_init(struct dvb_ca_private *ca, int slot)
        ret = dvb_ca_en50221_wait_if_status(ca, slot, STATUSREG_FR, HZ / 10);
        if (ret)
                return ret;
-       ret = dvb_ca_en50221_write_data(ca, slot, buf, 2);
+       ret = dvb_ca_en50221_write_data(ca, slot, buf, 2, CMDREG_SW);
        if (ret != 2)
                return -EIO;
        ret = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND, IRQEN);
@@ -778,11 +784,13 @@ exit:
  * @buf: The data in this buffer is treated as a complete link-level packet to
  *      be written.
  * @bytes_write: Size of ebuf.
+ * @size_write_flag: A flag on Command Register which says whether the link size
+ * information will be writen or not.
  *
  * return: Number of bytes written, or < 0 on error.
  */
 static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,
-                                    u8 *buf, int bytes_write)
+                                    u8 *buf, int bytes_write, int size_write_flag)
 {
        struct dvb_ca_slot *sl = &ca->slot_info[slot];
        int status;
@@ -817,7 +825,7 @@ static int dvb_ca_en50221_write_data(struct dvb_ca_private *ca, int slot,
 
        /* OK, set HC bit */
        status = ca->pub->write_cam_control(ca->pub, slot, CTRLIF_COMMAND,
-                                           IRQEN | CMDREG_HC);
+                                           IRQEN | CMDREG_HC | size_write_flag);
        if (status)
                goto exit;
 
@@ -1508,7 +1516,7 @@ static ssize_t dvb_ca_en50221_io_write(struct file *file,
 
                        mutex_lock(&sl->slot_lock);
                        status = dvb_ca_en50221_write_data(ca, slot, fragbuf,
-                                                          fraglen + 2);
+                                                          fraglen + 2, 0);
                        mutex_unlock(&sl->slot_lock);
                        if (status == (fraglen + 2)) {
                                written = 1;
@@ -1709,12 +1717,22 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
 
        dprintk("%s\n", __func__);
 
-       if (!try_module_get(ca->pub->owner))
+       mutex_lock(&ca->remove_mutex);
+
+       if (ca->exit) {
+               mutex_unlock(&ca->remove_mutex);
+               return -ENODEV;
+       }
+
+       if (!try_module_get(ca->pub->owner)) {
+               mutex_unlock(&ca->remove_mutex);
                return -EIO;
+       }
 
        err = dvb_generic_open(inode, file);
        if (err < 0) {
                module_put(ca->pub->owner);
+               mutex_unlock(&ca->remove_mutex);
                return err;
        }
 
@@ -1739,6 +1757,7 @@ static int dvb_ca_en50221_io_open(struct inode *inode, struct file *file)
 
        dvb_ca_private_get(ca);
 
+       mutex_unlock(&ca->remove_mutex);
        return 0;
 }
 
@@ -1758,6 +1777,8 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)
 
        dprintk("%s\n", __func__);
 
+       mutex_lock(&ca->remove_mutex);
+
        /* mark the CA device as closed */
        ca->open = 0;
        dvb_ca_en50221_thread_update_delay(ca);
@@ -1768,6 +1789,13 @@ static int dvb_ca_en50221_io_release(struct inode *inode, struct file *file)
 
        dvb_ca_private_put(ca);
 
+       if (dvbdev->users == 1 && ca->exit == 1) {
+               mutex_unlock(&ca->remove_mutex);
+               wake_up(&dvbdev->wait_queue);
+       } else {
+               mutex_unlock(&ca->remove_mutex);
+       }
+
        return err;
 }
 
@@ -1891,6 +1919,7 @@ int dvb_ca_en50221_init(struct dvb_adapter *dvb_adapter,
        }
 
        mutex_init(&ca->ioctl_mutex);
+       mutex_init(&ca->remove_mutex);
 
        if (signal_pending(current)) {
                ret = -EINTR;
@@ -1933,6 +1962,14 @@ void dvb_ca_en50221_release(struct dvb_ca_en50221 *pubca)
 
        dprintk("%s\n", __func__);
 
+       mutex_lock(&ca->remove_mutex);
+       ca->exit = 1;
+       mutex_unlock(&ca->remove_mutex);
+
+       if (ca->dvbdev->users < 1)
+               wait_event(ca->dvbdev->wait_queue,
+                               ca->dvbdev->users == 1);
+
        /* shutdown the thread if there was one */
        kthread_stop(ca->thread);
 
index 398c862..7c4d86b 100644 (file)
@@ -115,12 +115,12 @@ static inline int dvb_dmx_swfilter_payload(struct dvb_demux_feed *feed,
 
        cc = buf[3] & 0x0f;
        ccok = ((feed->cc + 1) & 0x0f) == cc;
-       feed->cc = cc;
        if (!ccok) {
                set_buf_flags(feed, DMX_BUFFER_FLAG_DISCONTINUITY_DETECTED);
                dprintk_sect_loss("missed packet: %d instead of %d!\n",
                                  cc, (feed->cc + 1) & 0x0f);
        }
+       feed->cc = cc;
 
        if (buf[1] & 0x40)      // PUSI ?
                feed->peslen = 0xfffa;
@@ -300,7 +300,6 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
 
        cc = buf[3] & 0x0f;
        ccok = ((feed->cc + 1) & 0x0f) == cc;
-       feed->cc = cc;
 
        if (buf[3] & 0x20) {
                /* adaption field present, check for discontinuity_indicator */
@@ -336,6 +335,7 @@ static int dvb_dmx_swfilter_section_packet(struct dvb_demux_feed *feed,
                feed->pusi_seen = false;
                dvb_dmx_swfilter_section_new(feed);
        }
+       feed->cc = cc;
 
        if (buf[1] & 0x40) {
                /* PUSI=1 (is set), section boundary is here */
index cc0a789..bc6950a 100644 (file)
@@ -293,14 +293,22 @@ static int dvb_frontend_get_event(struct dvb_frontend *fe,
        }
 
        if (events->eventw == events->eventr) {
-               int ret;
+               struct wait_queue_entry wait;
+               int ret = 0;
 
                if (flags & O_NONBLOCK)
                        return -EWOULDBLOCK;
 
-               ret = wait_event_interruptible(events->wait_queue,
-                                              dvb_frontend_test_event(fepriv, events));
-
+               init_waitqueue_entry(&wait, current);
+               add_wait_queue(&events->wait_queue, &wait);
+               while (!dvb_frontend_test_event(fepriv, events)) {
+                       wait_woken(&wait, TASK_INTERRUPTIBLE, 0);
+                       if (signal_pending(current)) {
+                               ret = -ERESTARTSYS;
+                               break;
+                       }
+               }
+               remove_wait_queue(&events->wait_queue, &wait);
                if (ret < 0)
                        return ret;
        }
@@ -809,15 +817,26 @@ static void dvb_frontend_stop(struct dvb_frontend *fe)
 
        dev_dbg(fe->dvb->device, "%s:\n", __func__);
 
+       mutex_lock(&fe->remove_mutex);
+
        if (fe->exit != DVB_FE_DEVICE_REMOVED)
                fe->exit = DVB_FE_NORMAL_EXIT;
        mb();
 
-       if (!fepriv->thread)
+       if (!fepriv->thread) {
+               mutex_unlock(&fe->remove_mutex);
                return;
+       }
 
        kthread_stop(fepriv->thread);
 
+       mutex_unlock(&fe->remove_mutex);
+
+       if (fepriv->dvbdev->users < -1) {
+               wait_event(fepriv->dvbdev->wait_queue,
+                          fepriv->dvbdev->users == -1);
+       }
+
        sema_init(&fepriv->sem, 1);
        fepriv->state = FESTATE_IDLE;
 
@@ -2761,9 +2780,13 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
        struct dvb_adapter *adapter = fe->dvb;
        int ret;
 
+       mutex_lock(&fe->remove_mutex);
+
        dev_dbg(fe->dvb->device, "%s:\n", __func__);
-       if (fe->exit == DVB_FE_DEVICE_REMOVED)
-               return -ENODEV;
+       if (fe->exit == DVB_FE_DEVICE_REMOVED) {
+               ret = -ENODEV;
+               goto err_remove_mutex;
+       }
 
        if (adapter->mfe_shared == 2) {
                mutex_lock(&adapter->mfe_lock);
@@ -2771,7 +2794,8 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
                        if (adapter->mfe_dvbdev &&
                            !adapter->mfe_dvbdev->writers) {
                                mutex_unlock(&adapter->mfe_lock);
-                               return -EBUSY;
+                               ret = -EBUSY;
+                               goto err_remove_mutex;
                        }
                        adapter->mfe_dvbdev = dvbdev;
                }
@@ -2794,8 +2818,10 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
                        while (mferetry-- && (mfedev->users != -1 ||
                                              mfepriv->thread)) {
                                if (msleep_interruptible(500)) {
-                                       if (signal_pending(current))
-                                               return -EINTR;
+                                       if (signal_pending(current)) {
+                                               ret = -EINTR;
+                                               goto err_remove_mutex;
+                                       }
                                }
                        }
 
@@ -2807,7 +2833,8 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
                                if (mfedev->users != -1 ||
                                    mfepriv->thread) {
                                        mutex_unlock(&adapter->mfe_lock);
-                                       return -EBUSY;
+                                       ret = -EBUSY;
+                                       goto err_remove_mutex;
                                }
                                adapter->mfe_dvbdev = dvbdev;
                        }
@@ -2866,6 +2893,8 @@ static int dvb_frontend_open(struct inode *inode, struct file *file)
 
        if (adapter->mfe_shared)
                mutex_unlock(&adapter->mfe_lock);
+
+       mutex_unlock(&fe->remove_mutex);
        return ret;
 
 err3:
@@ -2887,6 +2916,9 @@ err1:
 err0:
        if (adapter->mfe_shared)
                mutex_unlock(&adapter->mfe_lock);
+
+err_remove_mutex:
+       mutex_unlock(&fe->remove_mutex);
        return ret;
 }
 
@@ -2897,6 +2929,8 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
        struct dvb_frontend_private *fepriv = fe->frontend_priv;
        int ret;
 
+       mutex_lock(&fe->remove_mutex);
+
        dev_dbg(fe->dvb->device, "%s:\n", __func__);
 
        if ((file->f_flags & O_ACCMODE) != O_RDONLY) {
@@ -2918,10 +2952,18 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
                }
                mutex_unlock(&fe->dvb->mdev_lock);
 #endif
-               if (fe->exit != DVB_FE_NO_EXIT)
-                       wake_up(&dvbdev->wait_queue);
                if (fe->ops.ts_bus_ctrl)
                        fe->ops.ts_bus_ctrl(fe, 0);
+
+               if (fe->exit != DVB_FE_NO_EXIT) {
+                       mutex_unlock(&fe->remove_mutex);
+                       wake_up(&dvbdev->wait_queue);
+               } else {
+                       mutex_unlock(&fe->remove_mutex);
+               }
+
+       } else {
+               mutex_unlock(&fe->remove_mutex);
        }
 
        dvb_frontend_put(fe);
@@ -3022,6 +3064,7 @@ int dvb_register_frontend(struct dvb_adapter *dvb,
        fepriv = fe->frontend_priv;
 
        kref_init(&fe->refcount);
+       mutex_init(&fe->remove_mutex);
 
        /*
         * After initialization, there need to be two references: one
index 8a2febf..8bb8dd3 100644 (file)
@@ -1564,15 +1564,43 @@ static long dvb_net_ioctl(struct file *file,
        return dvb_usercopy(file, cmd, arg, dvb_net_do_ioctl);
 }
 
+static int locked_dvb_net_open(struct inode *inode, struct file *file)
+{
+       struct dvb_device *dvbdev = file->private_data;
+       struct dvb_net *dvbnet = dvbdev->priv;
+       int ret;
+
+       if (mutex_lock_interruptible(&dvbnet->remove_mutex))
+               return -ERESTARTSYS;
+
+       if (dvbnet->exit) {
+               mutex_unlock(&dvbnet->remove_mutex);
+               return -ENODEV;
+       }
+
+       ret = dvb_generic_open(inode, file);
+
+       mutex_unlock(&dvbnet->remove_mutex);
+
+       return ret;
+}
+
 static int dvb_net_close(struct inode *inode, struct file *file)
 {
        struct dvb_device *dvbdev = file->private_data;
        struct dvb_net *dvbnet = dvbdev->priv;
 
+       mutex_lock(&dvbnet->remove_mutex);
+
        dvb_generic_release(inode, file);
 
-       if(dvbdev->users == 1 && dvbnet->exit == 1)
+       if (dvbdev->users == 1 && dvbnet->exit == 1) {
+               mutex_unlock(&dvbnet->remove_mutex);
                wake_up(&dvbdev->wait_queue);
+       } else {
+               mutex_unlock(&dvbnet->remove_mutex);
+       }
+
        return 0;
 }
 
@@ -1580,7 +1608,7 @@ static int dvb_net_close(struct inode *inode, struct file *file)
 static const struct file_operations dvb_net_fops = {
        .owner = THIS_MODULE,
        .unlocked_ioctl = dvb_net_ioctl,
-       .open = dvb_generic_open,
+       .open = locked_dvb_net_open,
        .release = dvb_net_close,
        .llseek = noop_llseek,
 };
@@ -1599,10 +1627,13 @@ void dvb_net_release (struct dvb_net *dvbnet)
 {
        int i;
 
+       mutex_lock(&dvbnet->remove_mutex);
        dvbnet->exit = 1;
+       mutex_unlock(&dvbnet->remove_mutex);
+
        if (dvbnet->dvbdev->users < 1)
                wait_event(dvbnet->dvbdev->wait_queue,
-                               dvbnet->dvbdev->users==1);
+                               dvbnet->dvbdev->users == 1);
 
        dvb_unregister_device(dvbnet->dvbdev);
 
@@ -1621,6 +1652,7 @@ int dvb_net_init (struct dvb_adapter *adap, struct dvb_net *dvbnet,
        int i;
 
        mutex_init(&dvbnet->ioctl_mutex);
+       mutex_init(&dvbnet->remove_mutex);
        dvbnet->demux = dmx;
 
        for (i=0; i<DVB_NET_DEVICES_MAX; i++)
index e9b3ce0..a4b05e3 100644 (file)
@@ -27,6 +27,7 @@
 #include <media/tuner.h>
 
 static DEFINE_MUTEX(dvbdev_mutex);
+static LIST_HEAD(dvbdevfops_list);
 static int dvbdev_debug;
 
 module_param(dvbdev_debug, int, 0644);
@@ -453,14 +454,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
                        enum dvb_device_type type, int demux_sink_pads)
 {
        struct dvb_device *dvbdev;
-       struct file_operations *dvbdevfops;
+       struct file_operations *dvbdevfops = NULL;
+       struct dvbdevfops_node *node = NULL, *new_node = NULL;
        struct device *clsdev;
        int minor;
        int id, ret;
 
        mutex_lock(&dvbdev_register_lock);
 
-       if ((id = dvbdev_get_free_id (adap, type)) < 0){
+       if ((id = dvbdev_get_free_id (adap, type)) < 0) {
                mutex_unlock(&dvbdev_register_lock);
                *pdvbdev = NULL;
                pr_err("%s: couldn't find free device id\n", __func__);
@@ -468,18 +470,45 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
        }
 
        *pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
-
        if (!dvbdev){
                mutex_unlock(&dvbdev_register_lock);
                return -ENOMEM;
        }
 
-       dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
+       /*
+        * When a device of the same type is probe()d more than once,
+        * the first allocated fops are used. This prevents memory leaks
+        * that can occur when the same device is probe()d repeatedly.
+        */
+       list_for_each_entry(node, &dvbdevfops_list, list_head) {
+               if (node->fops->owner == adap->module &&
+                               node->type == type &&
+                               node->template == template) {
+                       dvbdevfops = node->fops;
+                       break;
+               }
+       }
 
-       if (!dvbdevfops){
-               kfree (dvbdev);
-               mutex_unlock(&dvbdev_register_lock);
-               return -ENOMEM;
+       if (dvbdevfops == NULL) {
+               dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
+               if (!dvbdevfops) {
+                       kfree(dvbdev);
+                       mutex_unlock(&dvbdev_register_lock);
+                       return -ENOMEM;
+               }
+
+               new_node = kzalloc(sizeof(struct dvbdevfops_node), GFP_KERNEL);
+               if (!new_node) {
+                       kfree(dvbdevfops);
+                       kfree(dvbdev);
+                       mutex_unlock(&dvbdev_register_lock);
+                       return -ENOMEM;
+               }
+
+               new_node->fops = dvbdevfops;
+               new_node->type = type;
+               new_node->template = template;
+               list_add_tail (&new_node->list_head, &dvbdevfops_list);
        }
 
        memcpy(dvbdev, template, sizeof(struct dvb_device));
@@ -490,20 +519,20 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
        dvbdev->priv = priv;
        dvbdev->fops = dvbdevfops;
        init_waitqueue_head (&dvbdev->wait_queue);
-
        dvbdevfops->owner = adap->module;
-
        list_add_tail (&dvbdev->list_head, &adap->device_list);
-
        down_write(&minor_rwsem);
 #ifdef CONFIG_DVB_DYNAMIC_MINORS
        for (minor = 0; minor < MAX_DVB_MINORS; minor++)
                if (dvb_minors[minor] == NULL)
                        break;
-
        if (minor == MAX_DVB_MINORS) {
+               if (new_node) {
+                       list_del (&new_node->list_head);
+                       kfree(dvbdevfops);
+                       kfree(new_node);
+               }
                list_del (&dvbdev->list_head);
-               kfree(dvbdevfops);
                kfree(dvbdev);
                up_write(&minor_rwsem);
                mutex_unlock(&dvbdev_register_lock);
@@ -512,41 +541,47 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 #else
        minor = nums2minor(adap->num, type, id);
 #endif
-
        dvbdev->minor = minor;
        dvb_minors[minor] = dvb_device_get(dvbdev);
        up_write(&minor_rwsem);
-
        ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
        if (ret) {
                pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
                      __func__);
-
+               if (new_node) {
+                       list_del (&new_node->list_head);
+                       kfree(dvbdevfops);
+                       kfree(new_node);
+               }
                dvb_media_device_free(dvbdev);
                list_del (&dvbdev->list_head);
-               kfree(dvbdevfops);
                kfree(dvbdev);
                mutex_unlock(&dvbdev_register_lock);
                return ret;
        }
 
-       mutex_unlock(&dvbdev_register_lock);
-
        clsdev = device_create(dvb_class, adap->device,
                               MKDEV(DVB_MAJOR, minor),
                               dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
        if (IS_ERR(clsdev)) {
                pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
                       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
+               if (new_node) {
+                       list_del (&new_node->list_head);
+                       kfree(dvbdevfops);
+                       kfree(new_node);
+               }
                dvb_media_device_free(dvbdev);
                list_del (&dvbdev->list_head);
-               kfree(dvbdevfops);
                kfree(dvbdev);
+               mutex_unlock(&dvbdev_register_lock);
                return PTR_ERR(clsdev);
        }
+
        dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
                adap->num, dnames[type], id, minor, minor);
 
+       mutex_unlock(&dvbdev_register_lock);
        return 0;
 }
 EXPORT_SYMBOL(dvb_register_device);
@@ -575,7 +610,6 @@ static void dvb_free_device(struct kref *ref)
 {
        struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
 
-       kfree (dvbdev->fops);
        kfree (dvbdev);
 }
 
@@ -1081,9 +1115,17 @@ error:
 
 static void __exit exit_dvbdev(void)
 {
+       struct dvbdevfops_node *node, *next;
+
        class_destroy(dvb_class);
        cdev_del(&dvb_device_cdev);
        unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
+
+       list_for_each_entry_safe(node, next, &dvbdevfops_list, list_head) {
+               list_del (&node->list_head);
+               kfree(node->fops);
+               kfree(node);
+       }
 }
 
 subsys_initcall(init_dvbdev);
index 1f1753f..0782f83 100644 (file)
@@ -798,7 +798,7 @@ MODULE_DEVICE_TABLE(i2c, mn88443x_i2c_id);
 static struct i2c_driver mn88443x_driver = {
        .driver = {
                .name = "mn88443x",
-               .of_match_table = of_match_ptr(mn88443x_of_match),
+               .of_match_table = mn88443x_of_match,
        },
        .probe_new = mn88443x_probe,
        .remove   = mn88443x_remove,
index 8287851..d85bfbb 100644 (file)
@@ -697,7 +697,7 @@ static void netup_unidvb_dma_fini(struct netup_unidvb_dev *ndev, int num)
        netup_unidvb_dma_enable(dma, 0);
        msleep(50);
        cancel_work_sync(&dma->work);
-       del_timer(&dma->timeout);
+       del_timer_sync(&dma->timeout);
 }
 
 static int netup_unidvb_dma_setup(struct netup_unidvb_dev *ndev)
@@ -887,12 +887,7 @@ static int netup_unidvb_initdev(struct pci_dev *pci_dev,
                ndev->lmmio0, (u32)pci_resource_len(pci_dev, 0),
                ndev->lmmio1, (u32)pci_resource_len(pci_dev, 1),
                pci_dev->irq);
-       if (request_irq(pci_dev->irq, netup_unidvb_isr, IRQF_SHARED,
-                       "netup_unidvb", pci_dev) < 0) {
-               dev_err(&pci_dev->dev,
-                       "%s(): can't get IRQ %d\n", __func__, pci_dev->irq);
-               goto irq_request_err;
-       }
+
        ndev->dma_size = 2 * 188 *
                NETUP_DMA_BLOCKS_COUNT * NETUP_DMA_PACKETS_COUNT;
        ndev->dma_virt = dma_alloc_coherent(&pci_dev->dev,
@@ -933,6 +928,14 @@ static int netup_unidvb_initdev(struct pci_dev *pci_dev,
                dev_err(&pci_dev->dev, "netup_unidvb: DMA setup failed\n");
                goto dma_setup_err;
        }
+
+       if (request_irq(pci_dev->irq, netup_unidvb_isr, IRQF_SHARED,
+                       "netup_unidvb", pci_dev) < 0) {
+               dev_err(&pci_dev->dev,
+                       "%s(): can't get IRQ %d\n", __func__, pci_dev->irq);
+               goto dma_setup_err;
+       }
+
        dev_info(&pci_dev->dev,
                "netup_unidvb: device has been initialized\n");
        return 0;
@@ -951,8 +954,6 @@ spi_setup_err:
        dma_free_coherent(&pci_dev->dev, ndev->dma_size,
                        ndev->dma_virt, ndev->dma_phys);
 dma_alloc_err:
-       free_irq(pci_dev->irq, pci_dev);
-irq_request_err:
        iounmap(ndev->lmmio1);
 pci_bar1_error:
        iounmap(ndev->lmmio0);
index 75c92e2..19a4a08 100644 (file)
@@ -1035,7 +1035,6 @@ static int mdp_comp_sub_create(struct mdp_dev *mdp)
 {
        struct device *dev = &mdp->pdev->dev;
        struct device_node *node, *parent;
-       const struct mtk_mdp_driver_data *data = mdp->mdp_data;
 
        parent = dev->of_node->parent;
 
@@ -1045,7 +1044,7 @@ static int mdp_comp_sub_create(struct mdp_dev *mdp)
                int id, alias_id;
                struct mdp_comp *comp;
 
-               of_id = of_match_node(data->mdp_sub_comp_dt_ids, node);
+               of_id = of_match_node(mdp->mdp_data->mdp_sub_comp_dt_ids, node);
                if (!of_id)
                        continue;
                if (!of_device_is_available(node)) {
index 2385216..253e771 100644 (file)
@@ -378,8 +378,8 @@ static int mxc_isi_runtime_resume(struct device *dev)
 }
 
 static const struct dev_pm_ops mxc_isi_pm_ops = {
-       SET_SYSTEM_SLEEP_PM_OPS(mxc_isi_pm_suspend, mxc_isi_pm_resume)
-       SET_RUNTIME_PM_OPS(mxc_isi_runtime_suspend, mxc_isi_runtime_resume, NULL)
+       SYSTEM_SLEEP_PM_OPS(mxc_isi_pm_suspend, mxc_isi_pm_resume)
+       RUNTIME_PM_OPS(mxc_isi_runtime_suspend, mxc_isi_runtime_resume, NULL)
 };
 
 /* -----------------------------------------------------------------------------
@@ -528,7 +528,7 @@ static struct platform_driver mxc_isi_driver = {
        .driver = {
                .of_match_table = mxc_isi_of_match,
                .name           = MXC_ISI_DRIVER_NAME,
-               .pm             = &mxc_isi_pm_ops,
+               .pm             = pm_ptr(&mxc_isi_pm_ops),
        }
 };
 module_platform_driver(mxc_isi_driver);
index 98bfd44..2a77353 100644 (file)
@@ -728,11 +728,9 @@ static int rvin_setup(struct rvin_dev *vin)
        case V4L2_FIELD_SEQ_TB:
        case V4L2_FIELD_SEQ_BT:
        case V4L2_FIELD_NONE:
-               vnmc = VNMC_IM_ODD_EVEN;
-               progressive = true;
-               break;
        case V4L2_FIELD_ALTERNATE:
                vnmc = VNMC_IM_ODD_EVEN;
+               progressive = true;
                break;
        default:
                vnmc = VNMC_IM_ODD;
@@ -1312,12 +1310,23 @@ static int rvin_mc_validate_format(struct rvin_dev *vin, struct v4l2_subdev *sd,
        }
 
        if (rvin_scaler_needed(vin)) {
+               /* Gen3 can't scale NV12 */
+               if (vin->info->model == RCAR_GEN3 &&
+                   vin->format.pixelformat == V4L2_PIX_FMT_NV12)
+                       return -EPIPE;
+
                if (!vin->scaler)
                        return -EPIPE;
        } else {
-               if (fmt.format.width != vin->format.width ||
-                   fmt.format.height != vin->format.height)
-                       return -EPIPE;
+               if (vin->format.pixelformat == V4L2_PIX_FMT_NV12) {
+                       if (ALIGN(fmt.format.width, 32) != vin->format.width ||
+                           ALIGN(fmt.format.height, 32) != vin->format.height)
+                               return -EPIPE;
+               } else {
+                       if (fmt.format.width != vin->format.width ||
+                           fmt.format.height != vin->format.height)
+                               return -EPIPE;
+               }
        }
 
        if (fmt.format.code != vin->mbus_code)
index 44540de..d3b5cb4 100644 (file)
@@ -101,6 +101,10 @@ static int ce6230_i2c_master_xfer(struct i2c_adapter *adap,
                if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
                        if (msg[i].addr ==
                                ce6230_zl10353_config.demod_address) {
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                req.cmd = DEMOD_READ;
                                req.value = msg[i].addr >> 1;
                                req.index = msg[i].buf[0];
@@ -117,6 +121,10 @@ static int ce6230_i2c_master_xfer(struct i2c_adapter *adap,
                } else {
                        if (msg[i].addr ==
                                ce6230_zl10353_config.demod_address) {
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                req.cmd = DEMOD_WRITE;
                                req.value = msg[i].addr >> 1;
                                req.index = msg[i].buf[0];
index 7ed0ab9..0e4773f 100644 (file)
@@ -115,6 +115,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
        while (i < num) {
                if (num > i + 1 && (msg[i+1].flags & I2C_M_RD)) {
                        if (msg[i].addr == ec168_ec100_config.demod_address) {
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                req.cmd = READ_DEMOD;
                                req.value = 0;
                                req.index = 0xff00 + msg[i].buf[0]; /* reg */
@@ -131,6 +135,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                        }
                } else {
                        if (msg[i].addr == ec168_ec100_config.demod_address) {
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                req.cmd = WRITE_DEMOD;
                                req.value = msg[i].buf[1]; /* val */
                                req.index = 0xff00 + msg[i].buf[0]; /* reg */
@@ -139,6 +147,10 @@ static int ec168_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                                ret = ec168_ctrl_msg(d, &req);
                                i += 1;
                        } else {
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                req.cmd = WRITE_I2C;
                                req.value = msg[i].buf[0]; /* val */
                                req.index = 0x0100 + msg[i].addr; /* I2C addr */
index 795a012..f7884bb 100644 (file)
@@ -176,6 +176,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                        ret = -EOPNOTSUPP;
                        goto err_mutex_unlock;
                } else if (msg[0].addr == 0x10) {
+                       if (msg[0].len < 1 || msg[1].len < 1) {
+                               ret = -EOPNOTSUPP;
+                               goto err_mutex_unlock;
+                       }
                        /* method 1 - integrated demod */
                        if (msg[0].buf[0] == 0x00) {
                                /* return demod page from driver cache */
@@ -189,6 +193,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                                ret = rtl28xxu_ctrl_msg(d, &req);
                        }
                } else if (msg[0].len < 2) {
+                       if (msg[0].len < 1) {
+                               ret = -EOPNOTSUPP;
+                               goto err_mutex_unlock;
+                       }
                        /* method 2 - old I2C */
                        req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
                        req.index = CMD_I2C_RD;
@@ -217,8 +225,16 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                        ret = -EOPNOTSUPP;
                        goto err_mutex_unlock;
                } else if (msg[0].addr == 0x10) {
+                       if (msg[0].len < 1) {
+                               ret = -EOPNOTSUPP;
+                               goto err_mutex_unlock;
+                       }
                        /* method 1 - integrated demod */
                        if (msg[0].buf[0] == 0x00) {
+                               if (msg[0].len < 2) {
+                                       ret = -EOPNOTSUPP;
+                                       goto err_mutex_unlock;
+                               }
                                /* save demod page for later demod access */
                                dev->page = msg[0].buf[1];
                                ret = 0;
@@ -231,6 +247,10 @@ static int rtl28xxu_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                                ret = rtl28xxu_ctrl_msg(d, &req);
                        }
                } else if ((msg[0].len < 23) && (!dev->new_i2c_write)) {
+                       if (msg[0].len < 1) {
+                               ret = -EOPNOTSUPP;
+                               goto err_mutex_unlock;
+                       }
                        /* method 2 - old I2C */
                        req.value = (msg[0].buf[0] << 8) | (msg[0].addr << 1);
                        req.index = CMD_I2C_WR;
index 7d78ee0..a31c6f8 100644 (file)
@@ -988,6 +988,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
                        /* write/read request */
                        if (i + 1 < num && (msg[i + 1].flags & I2C_M_RD)) {
                                req = 0xB9;
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                index = (((msg[i].buf[0] << 8) & 0xff00) | (msg[i].buf[1] & 0x00ff));
                                value = msg[i].addr + (msg[i].len << 8);
                                length = msg[i + 1].len + 6;
@@ -1001,6 +1005,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
 
                                /* demod 16bit addr */
                                req = 0xBD;
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                index = (((msg[i].buf[0] << 8) & 0xff00) | (msg[i].buf[1] & 0x00ff));
                                value = msg[i].addr + (2 << 8);
                                length = msg[i].len - 2;
@@ -1026,6 +1034,10 @@ static int az6027_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[], int n
                        } else {
 
                                req = 0xBD;
+                               if (msg[i].len < 1) {
+                                       i = -EOPNOTSUPP;
+                                       break;
+                               }
                                index = msg[i].buf[0] & 0x00FF;
                                value = msg[i].addr + (1 << 8);
                                length = msg[i].len - 1;
index 2756815..32134be 100644 (file)
@@ -63,6 +63,10 @@ static int digitv_i2c_xfer(struct i2c_adapter *adap,struct i2c_msg msg[],int num
                warn("more than 2 i2c messages at a time is not handled yet. TODO.");
 
        for (i = 0; i < num; i++) {
+               if (msg[i].len < 1) {
+                       i = -EOPNOTSUPP;
+                       break;
+               }
                /* write/read request */
                if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
                        if (digitv_ctrl_msg(d, USB_READ_COFDM, msg[i].buf[0], NULL, 0,
index 0ca7642..8747960 100644 (file)
@@ -946,7 +946,7 @@ static int su3000_read_mac_address(struct dvb_usb_device *d, u8 mac[6])
        for (i = 0; i < 6; i++) {
                obuf[1] = 0xf0 + i;
                if (i2c_transfer(&d->i2c_adap, msg, 2) != 2)
-                       break;
+                       return -1;
                else
                        mac[i] = ibuf[0];
        }
index 9501b10..0df1027 100644 (file)
@@ -37,6 +37,7 @@ config VIDEO_PVRUSB2_DVB
        bool "pvrusb2 ATSC/DVB support"
        default y
        depends on VIDEO_PVRUSB2 && DVB_CORE
+       depends on VIDEO_PVRUSB2=m || DVB_CORE=y
        select DVB_LGDT330X if MEDIA_SUBDRV_AUTOSELECT
        select DVB_S5H1409 if MEDIA_SUBDRV_AUTOSELECT
        select DVB_S5H1411 if MEDIA_SUBDRV_AUTOSELECT
index 38822ce..c4474d4 100644 (file)
@@ -1544,8 +1544,7 @@ static void ttusb_dec_exit_dvb(struct ttusb_dec *dec)
        dvb_dmx_release(&dec->demux);
        if (dec->fe) {
                dvb_unregister_frontend(dec->fe);
-               if (dec->fe->ops.release)
-                       dec->fe->ops.release(dec->fe);
+               dvb_frontend_detach(dec->fe);
        }
        dvb_unregister_adapter(&dec->adapter);
 }
index c2d080f..27cbe14 100644 (file)
@@ -84,6 +84,11 @@ nla_put_failure:
        return -EMSGSIZE;
 }
 
+/* Limit the max delay range to 300s */
+static struct netlink_range_validation delay_range = {
+       .max = 300000,
+};
+
 static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
        [IFLA_BOND_MODE]                = { .type = NLA_U8 },
        [IFLA_BOND_ACTIVE_SLAVE]        = { .type = NLA_U32 },
@@ -114,7 +119,7 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = {
        [IFLA_BOND_AD_ACTOR_SYSTEM]     = { .type = NLA_BINARY,
                                            .len  = ETH_ALEN },
        [IFLA_BOND_TLB_DYNAMIC_LB]      = { .type = NLA_U8 },
-       [IFLA_BOND_PEER_NOTIF_DELAY]    = { .type = NLA_U32 },
+       [IFLA_BOND_PEER_NOTIF_DELAY]    = NLA_POLICY_FULL_RANGE(NLA_U32, &delay_range),
        [IFLA_BOND_MISSED_MAX]          = { .type = NLA_U8 },
        [IFLA_BOND_NS_IP6_TARGET]       = { .type = NLA_NESTED },
 };
index 0498fc6..f3f27f0 100644 (file)
@@ -169,6 +169,12 @@ static const struct bond_opt_value bond_num_peer_notif_tbl[] = {
        { NULL,      -1,  0}
 };
 
+static const struct bond_opt_value bond_peer_notif_delay_tbl[] = {
+       { "off",     0,   0},
+       { "maxval",  300000, BOND_VALFLAG_MAX},
+       { NULL,      -1,  0}
+};
+
 static const struct bond_opt_value bond_primary_reselect_tbl[] = {
        { "always",  BOND_PRI_RESELECT_ALWAYS,  BOND_VALFLAG_DEFAULT},
        { "better",  BOND_PRI_RESELECT_BETTER,  0},
@@ -488,7 +494,7 @@ static const struct bond_option bond_opts[BOND_OPT_LAST] = {
                .id = BOND_OPT_PEER_NOTIF_DELAY,
                .name = "peer_notif_delay",
                .desc = "Delay between each peer notification on failover event, in milliseconds",
-               .values = bond_intmax_tbl,
+               .values = bond_peer_notif_delay_tbl,
                .set = bond_option_peer_notif_delay_set
        }
 };
index 3ceccaf..b190007 100644 (file)
@@ -95,7 +95,7 @@ config CAN_AT91
 
 config CAN_BXCAN
        tristate "STM32 Basic Extended CAN (bxCAN) devices"
-       depends on OF || ARCH_STM32 || COMPILE_TEST
+       depends on ARCH_STM32 || COMPILE_TEST
        depends on HAS_IOMEM
        select CAN_RX_OFFLOAD
        help
index e26ccd4..027a8a1 100644 (file)
 #define BXCAN_FiR1_REG(b) (0x40 + (b) * 8)
 #define BXCAN_FiR2_REG(b) (0x44 + (b) * 8)
 
-#define BXCAN_FILTER_ID(primary) (primary ? 0 : 14)
+#define BXCAN_FILTER_ID(cfg) ((cfg) == BXCAN_CFG_DUAL_SECONDARY ? 14 : 0)
 
 /* Filter primary register (FMR) bits */
 #define BXCAN_FMR_CANSB_MASK GENMASK(13, 8)
@@ -135,6 +135,12 @@ enum bxcan_lec_code {
        BXCAN_LEC_UNUSED
 };
 
+enum bxcan_cfg {
+       BXCAN_CFG_SINGLE = 0,
+       BXCAN_CFG_DUAL_PRIMARY,
+       BXCAN_CFG_DUAL_SECONDARY
+};
+
 /* Structure of the message buffer */
 struct bxcan_mb {
        u32 id;                 /* can identifier */
@@ -167,7 +173,7 @@ struct bxcan_priv {
        struct regmap *gcan;
        int tx_irq;
        int sce_irq;
-       bool primary;
+       enum bxcan_cfg cfg;
        struct clk *clk;
        spinlock_t rmw_lock;    /* lock for read-modify-write operations */
        unsigned int tx_head;
@@ -202,17 +208,17 @@ static inline void bxcan_rmw(struct bxcan_priv *priv, void __iomem *addr,
        spin_unlock_irqrestore(&priv->rmw_lock, flags);
 }
 
-static void bxcan_disable_filters(struct bxcan_priv *priv, bool primary)
+static void bxcan_disable_filters(struct bxcan_priv *priv, enum bxcan_cfg cfg)
 {
-       unsigned int fid = BXCAN_FILTER_ID(primary);
+       unsigned int fid = BXCAN_FILTER_ID(cfg);
        u32 fmask = BIT(fid);
 
        regmap_update_bits(priv->gcan, BXCAN_FA1R_REG, fmask, 0);
 }
 
-static void bxcan_enable_filters(struct bxcan_priv *priv, bool primary)
+static void bxcan_enable_filters(struct bxcan_priv *priv, enum bxcan_cfg cfg)
 {
-       unsigned int fid = BXCAN_FILTER_ID(primary);
+       unsigned int fid = BXCAN_FILTER_ID(cfg);
        u32 fmask = BIT(fid);
 
        /* Filter settings:
@@ -680,7 +686,7 @@ static int bxcan_chip_start(struct net_device *ndev)
                  BXCAN_BTR_BRP_MASK | BXCAN_BTR_TS1_MASK | BXCAN_BTR_TS2_MASK |
                  BXCAN_BTR_SJW_MASK, set);
 
-       bxcan_enable_filters(priv, priv->primary);
+       bxcan_enable_filters(priv, priv->cfg);
 
        /* Clear all internal status */
        priv->tx_head = 0;
@@ -806,7 +812,7 @@ static void bxcan_chip_stop(struct net_device *ndev)
                  BXCAN_IER_EPVIE | BXCAN_IER_EWGIE | BXCAN_IER_FOVIE1 |
                  BXCAN_IER_FFIE1 | BXCAN_IER_FMPIE1 | BXCAN_IER_FOVIE0 |
                  BXCAN_IER_FFIE0 | BXCAN_IER_FMPIE0 | BXCAN_IER_TMEIE, 0);
-       bxcan_disable_filters(priv, priv->primary);
+       bxcan_disable_filters(priv, priv->cfg);
        bxcan_enter_sleep_mode(priv);
        priv->can.state = CAN_STATE_STOPPED;
 }
@@ -931,7 +937,7 @@ static int bxcan_probe(struct platform_device *pdev)
        struct clk *clk = NULL;
        void __iomem *regs;
        struct regmap *gcan;
-       bool primary;
+       enum bxcan_cfg cfg;
        int err, rx_irq, tx_irq, sce_irq;
 
        regs = devm_platform_ioremap_resource(pdev, 0);
@@ -946,7 +952,13 @@ static int bxcan_probe(struct platform_device *pdev)
                return PTR_ERR(gcan);
        }
 
-       primary = of_property_read_bool(np, "st,can-primary");
+       if (of_property_read_bool(np, "st,can-primary"))
+               cfg = BXCAN_CFG_DUAL_PRIMARY;
+       else if (of_property_read_bool(np, "st,can-secondary"))
+               cfg = BXCAN_CFG_DUAL_SECONDARY;
+       else
+               cfg = BXCAN_CFG_SINGLE;
+
        clk = devm_clk_get(dev, NULL);
        if (IS_ERR(clk)) {
                dev_err(dev, "failed to get clock\n");
@@ -992,7 +1004,7 @@ static int bxcan_probe(struct platform_device *pdev)
        priv->clk = clk;
        priv->tx_irq = tx_irq;
        priv->sce_irq = sce_irq;
-       priv->primary = primary;
+       priv->cfg = cfg;
        priv->can.clock.freq = clk_get_rate(clk);
        spin_lock_init(&priv->rmw_lock);
        priv->tx_head = 0;
index 241ec63..f6d05b3 100644 (file)
@@ -54,7 +54,8 @@ int can_put_echo_skb(struct sk_buff *skb, struct net_device *dev,
        /* check flag whether this packet has to be looped back */
        if (!(dev->flags & IFF_ECHO) ||
            (skb->protocol != htons(ETH_P_CAN) &&
-            skb->protocol != htons(ETH_P_CANFD))) {
+            skb->protocol != htons(ETH_P_CANFD) &&
+            skb->protocol != htons(ETH_P_CANXL))) {
                kfree_skb(skb);
                return 0;
        }
index 53e8a91..be189ed 100644 (file)
@@ -71,10 +71,12 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
 #define KVASER_PCIEFD_SYSID_BUILD_REG (KVASER_PCIEFD_SYSID_BASE + 0x14)
 /* Shared receive buffer registers */
 #define KVASER_PCIEFD_SRB_BASE 0x1f200
+#define KVASER_PCIEFD_SRB_FIFO_LAST_REG (KVASER_PCIEFD_SRB_BASE + 0x1f4)
 #define KVASER_PCIEFD_SRB_CMD_REG (KVASER_PCIEFD_SRB_BASE + 0x200)
 #define KVASER_PCIEFD_SRB_IEN_REG (KVASER_PCIEFD_SRB_BASE + 0x204)
 #define KVASER_PCIEFD_SRB_IRQ_REG (KVASER_PCIEFD_SRB_BASE + 0x20c)
 #define KVASER_PCIEFD_SRB_STAT_REG (KVASER_PCIEFD_SRB_BASE + 0x210)
+#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG (KVASER_PCIEFD_SRB_BASE + 0x214)
 #define KVASER_PCIEFD_SRB_CTRL_REG (KVASER_PCIEFD_SRB_BASE + 0x218)
 /* EPCS flash controller registers */
 #define KVASER_PCIEFD_SPI_BASE 0x1fc00
@@ -111,6 +113,9 @@ MODULE_DESCRIPTION("CAN driver for Kvaser CAN/PCIe devices");
 /* DMA support */
 #define KVASER_PCIEFD_SRB_STAT_DMA BIT(24)
 
+/* SRB current packet level */
+#define KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK 0xff
+
 /* DMA Enable */
 #define KVASER_PCIEFD_SRB_CTRL_DMA_ENABLE BIT(0)
 
@@ -526,7 +531,7 @@ static int kvaser_pciefd_set_tx_irq(struct kvaser_pciefd_can *can)
              KVASER_PCIEFD_KCAN_IRQ_TOF | KVASER_PCIEFD_KCAN_IRQ_ABD |
              KVASER_PCIEFD_KCAN_IRQ_TAE | KVASER_PCIEFD_KCAN_IRQ_TAL |
              KVASER_PCIEFD_KCAN_IRQ_FDIC | KVASER_PCIEFD_KCAN_IRQ_BPP |
-             KVASER_PCIEFD_KCAN_IRQ_TAR | KVASER_PCIEFD_KCAN_IRQ_TFD;
+             KVASER_PCIEFD_KCAN_IRQ_TAR;
 
        iowrite32(msk, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
 
@@ -554,6 +559,8 @@ static void kvaser_pciefd_setup_controller(struct kvaser_pciefd_can *can)
 
        if (can->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
                mode |= KVASER_PCIEFD_KCAN_MODE_LOM;
+       else
+               mode &= ~KVASER_PCIEFD_KCAN_MODE_LOM;
 
        mode |= KVASER_PCIEFD_KCAN_MODE_EEN;
        mode |= KVASER_PCIEFD_KCAN_MODE_EPEN;
@@ -572,7 +579,7 @@ static void kvaser_pciefd_start_controller_flush(struct kvaser_pciefd_can *can)
 
        spin_lock_irqsave(&can->lock, irq);
        iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
-       iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
+       iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
                  can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
 
        status = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_STAT_REG);
@@ -615,7 +622,7 @@ static int kvaser_pciefd_bus_on(struct kvaser_pciefd_can *can)
        iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
        iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
 
-       iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD | KVASER_PCIEFD_KCAN_IRQ_TFD,
+       iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
                  can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
 
        mode = ioread32(can->reg_base + KVASER_PCIEFD_KCAN_MODE_REG);
@@ -719,6 +726,7 @@ static int kvaser_pciefd_stop(struct net_device *netdev)
                iowrite32(0, can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
                del_timer(&can->bec_poll_timer);
        }
+       can->can.state = CAN_STATE_STOPPED;
        close_candev(netdev);
 
        return ret;
@@ -1007,8 +1015,7 @@ static int kvaser_pciefd_setup_can_ctrls(struct kvaser_pciefd *pcie)
                SET_NETDEV_DEV(netdev, &pcie->pci->dev);
 
                iowrite32(-1, can->reg_base + KVASER_PCIEFD_KCAN_IRQ_REG);
-               iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD |
-                         KVASER_PCIEFD_KCAN_IRQ_TFD,
+               iowrite32(KVASER_PCIEFD_KCAN_IRQ_ABD,
                          can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
 
                pcie->can[i] = can;
@@ -1058,6 +1065,7 @@ static int kvaser_pciefd_setup_dma(struct kvaser_pciefd *pcie)
 {
        int i;
        u32 srb_status;
+       u32 srb_packet_count;
        dma_addr_t dma_addr[KVASER_PCIEFD_DMA_COUNT];
 
        /* Disable the DMA */
@@ -1085,6 +1093,15 @@ static int kvaser_pciefd_setup_dma(struct kvaser_pciefd *pcie)
                  KVASER_PCIEFD_SRB_CMD_RDB1,
                  pcie->reg_base + KVASER_PCIEFD_SRB_CMD_REG);
 
+       /* Empty Rx FIFO */
+       srb_packet_count = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_RX_NR_PACKETS_REG) &
+                          KVASER_PCIEFD_SRB_RX_NR_PACKETS_MASK;
+       while (srb_packet_count) {
+               /* Drop current packet in FIFO */
+               ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_FIFO_LAST_REG);
+               srb_packet_count--;
+       }
+
        srb_status = ioread32(pcie->reg_base + KVASER_PCIEFD_SRB_STAT_REG);
        if (!(srb_status & KVASER_PCIEFD_SRB_STAT_DI)) {
                dev_err(&pcie->pci->dev, "DMA not idle before enabling\n");
@@ -1425,9 +1442,6 @@ static int kvaser_pciefd_handle_status_packet(struct kvaser_pciefd *pcie,
                cmd = KVASER_PCIEFD_KCAN_CMD_AT;
                cmd |= ++can->cmd_seq << KVASER_PCIEFD_KCAN_CMD_SEQ_SHIFT;
                iowrite32(cmd, can->reg_base + KVASER_PCIEFD_KCAN_CMD_REG);
-
-               iowrite32(KVASER_PCIEFD_KCAN_IRQ_TFD,
-                         can->reg_base + KVASER_PCIEFD_KCAN_IEN_REG);
        } else if (p->header[0] & KVASER_PCIEFD_SPACK_IDET &&
                   p->header[0] & KVASER_PCIEFD_SPACK_IRM &&
                   cmdseq == (p->header[1] & KVASER_PCIEFD_PACKET_SEQ_MSK) &&
@@ -1714,15 +1728,6 @@ static int kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can)
        if (irq & KVASER_PCIEFD_KCAN_IRQ_TOF)
                netdev_err(can->can.dev, "Tx FIFO overflow\n");
 
-       if (irq & KVASER_PCIEFD_KCAN_IRQ_TFD) {
-               u8 count = ioread32(can->reg_base +
-                                   KVASER_PCIEFD_KCAN_TX_NPACKETS_REG) & 0xff;
-
-               if (count == 0)
-                       iowrite32(KVASER_PCIEFD_KCAN_CTRL_EFLUSH,
-                                 can->reg_base + KVASER_PCIEFD_KCAN_CTRL_REG);
-       }
-
        if (irq & KVASER_PCIEFD_KCAN_IRQ_BPP)
                netdev_err(can->can.dev,
                           "Fail to change bittiming, when not in reset mode\n");
@@ -1824,6 +1829,11 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
        if (err)
                goto err_teardown_can_ctrls;
 
+       err = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
+                         IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
+       if (err)
+               goto err_teardown_can_ctrls;
+
        iowrite32(KVASER_PCIEFD_SRB_IRQ_DPD0 | KVASER_PCIEFD_SRB_IRQ_DPD1,
                  pcie->reg_base + KVASER_PCIEFD_SRB_IRQ_REG);
 
@@ -1844,11 +1854,6 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
        iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1,
                  pcie->reg_base + KVASER_PCIEFD_SRB_CMD_REG);
 
-       err = request_irq(pcie->pci->irq, kvaser_pciefd_irq_handler,
-                         IRQF_SHARED, KVASER_PCIEFD_DRV_NAME, pcie);
-       if (err)
-               goto err_teardown_can_ctrls;
-
        err = kvaser_pciefd_reg_candev(pcie);
        if (err)
                goto err_free_irq;
@@ -1856,6 +1861,8 @@ static int kvaser_pciefd_probe(struct pci_dev *pdev,
        return 0;
 
 err_free_irq:
+       /* Disable PCI interrupts */
+       iowrite32(0, pcie->reg_base + KVASER_PCIEFD_IEN_REG);
        free_irq(pcie->pci->irq, pcie);
 
 err_teardown_can_ctrls:
index aec9d4f..d19b630 100644 (file)
 /* Offset 0x10: Extended Port Control Command */
 #define MV88E6393X_PORT_EPC_CMD                0x10
 #define MV88E6393X_PORT_EPC_CMD_BUSY   0x8000
-#define MV88E6393X_PORT_EPC_CMD_WRITE  0x0300
+#define MV88E6393X_PORT_EPC_CMD_WRITE  0x3000
 #define MV88E6393X_PORT_EPC_INDEX_PORT_ETYPE   0x02
 
 /* Offset 0x11: Extended Port Control Data */
index 919027c..c37d2e5 100644 (file)
@@ -120,6 +120,22 @@ static void a5psw_port_mgmtfwd_set(struct a5psw *a5psw, int port, bool enable)
        a5psw_port_pattern_set(a5psw, port, A5PSW_PATTERN_MGMTFWD, enable);
 }
 
+static void a5psw_port_tx_enable(struct a5psw *a5psw, int port, bool enable)
+{
+       u32 mask = A5PSW_PORT_ENA_TX(port);
+       u32 reg = enable ? mask : 0;
+
+       /* Even though the port TX is disabled through TXENA bit in the
+        * PORT_ENA register, it can still send BPDUs. This depends on the tag
+        * configuration added when sending packets from the CPU port to the
+        * switch port. Indeed, when using forced forwarding without filtering,
+        * even disabled ports will be able to send packets that are tagged.
+        * This allows to implement STP support when ports are in a state where
+        * forwarding traffic should be stopped but BPDUs should still be sent.
+        */
+       a5psw_reg_rmw(a5psw, A5PSW_PORT_ENA, mask, reg);
+}
+
 static void a5psw_port_enable_set(struct a5psw *a5psw, int port, bool enable)
 {
        u32 port_ena = 0;
@@ -292,6 +308,22 @@ static int a5psw_set_ageing_time(struct dsa_switch *ds, unsigned int msecs)
        return 0;
 }
 
+static void a5psw_port_learning_set(struct a5psw *a5psw, int port, bool learn)
+{
+       u32 mask = A5PSW_INPUT_LEARN_DIS(port);
+       u32 reg = !learn ? mask : 0;
+
+       a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
+}
+
+static void a5psw_port_rx_block_set(struct a5psw *a5psw, int port, bool block)
+{
+       u32 mask = A5PSW_INPUT_LEARN_BLOCK(port);
+       u32 reg = block ? mask : 0;
+
+       a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
+}
+
 static void a5psw_flooding_set_resolution(struct a5psw *a5psw, int port,
                                          bool set)
 {
@@ -308,6 +340,14 @@ static void a5psw_flooding_set_resolution(struct a5psw *a5psw, int port,
                a5psw_reg_writel(a5psw, offsets[i], a5psw->bridged_ports);
 }
 
+static void a5psw_port_set_standalone(struct a5psw *a5psw, int port,
+                                     bool standalone)
+{
+       a5psw_port_learning_set(a5psw, port, !standalone);
+       a5psw_flooding_set_resolution(a5psw, port, !standalone);
+       a5psw_port_mgmtfwd_set(a5psw, port, standalone);
+}
+
 static int a5psw_port_bridge_join(struct dsa_switch *ds, int port,
                                  struct dsa_bridge bridge,
                                  bool *tx_fwd_offload,
@@ -323,8 +363,7 @@ static int a5psw_port_bridge_join(struct dsa_switch *ds, int port,
        }
 
        a5psw->br_dev = bridge.dev;
-       a5psw_flooding_set_resolution(a5psw, port, true);
-       a5psw_port_mgmtfwd_set(a5psw, port, false);
+       a5psw_port_set_standalone(a5psw, port, false);
 
        return 0;
 }
@@ -334,8 +373,7 @@ static void a5psw_port_bridge_leave(struct dsa_switch *ds, int port,
 {
        struct a5psw *a5psw = ds->priv;
 
-       a5psw_flooding_set_resolution(a5psw, port, false);
-       a5psw_port_mgmtfwd_set(a5psw, port, true);
+       a5psw_port_set_standalone(a5psw, port, true);
 
        /* No more ports bridged */
        if (a5psw->bridged_ports == BIT(A5PSW_CPU_PORT))
@@ -344,28 +382,35 @@ static void a5psw_port_bridge_leave(struct dsa_switch *ds, int port,
 
 static void a5psw_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 {
-       u32 mask = A5PSW_INPUT_LEARN_DIS(port) | A5PSW_INPUT_LEARN_BLOCK(port);
+       bool learning_enabled, rx_enabled, tx_enabled;
        struct a5psw *a5psw = ds->priv;
-       u32 reg = 0;
 
        switch (state) {
        case BR_STATE_DISABLED:
        case BR_STATE_BLOCKING:
-               reg |= A5PSW_INPUT_LEARN_DIS(port);
-               reg |= A5PSW_INPUT_LEARN_BLOCK(port);
-               break;
        case BR_STATE_LISTENING:
-               reg |= A5PSW_INPUT_LEARN_DIS(port);
+               rx_enabled = false;
+               tx_enabled = false;
+               learning_enabled = false;
                break;
        case BR_STATE_LEARNING:
-               reg |= A5PSW_INPUT_LEARN_BLOCK(port);
+               rx_enabled = false;
+               tx_enabled = false;
+               learning_enabled = true;
                break;
        case BR_STATE_FORWARDING:
-       default:
+               rx_enabled = true;
+               tx_enabled = true;
+               learning_enabled = true;
                break;
+       default:
+               dev_err(ds->dev, "invalid STP state: %d\n", state);
+               return;
        }
 
-       a5psw_reg_rmw(a5psw, A5PSW_INPUT_LEARN, mask, reg);
+       a5psw_port_learning_set(a5psw, port, learning_enabled);
+       a5psw_port_rx_block_set(a5psw, port, !rx_enabled);
+       a5psw_port_tx_enable(a5psw, port, tx_enabled);
 }
 
 static void a5psw_port_fast_age(struct dsa_switch *ds, int port)
@@ -673,7 +718,7 @@ static int a5psw_setup(struct dsa_switch *ds)
        }
 
        /* Configure management port */
-       reg = A5PSW_CPU_PORT | A5PSW_MGMT_CFG_DISCARD;
+       reg = A5PSW_CPU_PORT | A5PSW_MGMT_CFG_ENABLE;
        a5psw_reg_writel(a5psw, A5PSW_MGMT_CFG, reg);
 
        /* Set pattern 0 to forward all frame to mgmt port */
@@ -722,13 +767,15 @@ static int a5psw_setup(struct dsa_switch *ds)
                if (dsa_port_is_unused(dp))
                        continue;
 
-               /* Enable egress flooding for CPU port */
-               if (dsa_port_is_cpu(dp))
+               /* Enable egress flooding and learning for CPU port */
+               if (dsa_port_is_cpu(dp)) {
                        a5psw_flooding_set_resolution(a5psw, port, true);
+                       a5psw_port_learning_set(a5psw, port, true);
+               }
 
-               /* Enable management forward only for user ports */
+               /* Enable standalone mode for user ports */
                if (dsa_port_is_user(dp))
-                       a5psw_port_mgmtfwd_set(a5psw, port, true);
+                       a5psw_port_set_standalone(a5psw, port, true);
        }
 
        return 0;
index c67abd4..b869192 100644 (file)
@@ -19,6 +19,7 @@
 #define A5PSW_PORT_OFFSET(port)                (0x400 * (port))
 
 #define A5PSW_PORT_ENA                 0x8
+#define A5PSW_PORT_ENA_TX(port)                BIT(port)
 #define A5PSW_PORT_ENA_RX_SHIFT                16
 #define A5PSW_PORT_ENA_TX_RX(port)     (BIT((port) + A5PSW_PORT_ENA_RX_SHIFT) | \
                                         BIT(port))
@@ -36,7 +37,7 @@
 #define A5PSW_INPUT_LEARN_BLOCK(p)     BIT(p)
 
 #define A5PSW_MGMT_CFG                 0x20
-#define A5PSW_MGMT_CFG_DISCARD         BIT(7)
+#define A5PSW_MGMT_CFG_ENABLE          BIT(6)
 
 #define A5PSW_MODE_CFG                 0x24
 #define A5PSW_MODE_STATS_RESET         BIT(31)
index d2f4358..ba3e7aa 100644 (file)
@@ -66,8 +66,10 @@ static int max_interrupt_work = 20;
 #include <linux/timer.h>
 #include <linux/ethtool.h>
 #include <linux/bitops.h>
-
 #include <linux/uaccess.h>
+
+#include <net/Space.h>
+
 #include <asm/io.h>
 #include <asm/dma.h>
 
index 0a9118b..bc9c81d 100644 (file)
@@ -52,6 +52,7 @@ static const char version2[] =
 #include <linux/etherdevice.h>
 #include <linux/jiffies.h>
 #include <linux/platform_device.h>
+#include <net/Space.h>
 
 #include <asm/io.h>
 
index 6e62c37..7465650 100644 (file)
@@ -66,6 +66,7 @@ static const char version[] =
 #include <linux/isapnp.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <net/Space.h>
 
 #include <asm/io.h>
 #include <asm/irq.h>
index 5b00c45..119021d 100644 (file)
@@ -37,6 +37,7 @@ static const char version[] =
 #include <linux/delay.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <net/Space.h>
 
 #include <asm/io.h>
 
index 8971665..6cf3818 100644 (file)
@@ -59,6 +59,7 @@ static const char version[] = "lance.c:v1.16 2006/11/09 dplatt@3do.com, becker@c
 #include <linux/skbuff.h>
 #include <linux/mm.h>
 #include <linux/bitops.h>
+#include <net/Space.h>
 
 #include <asm/io.h>
 #include <asm/dma.h>
index f28ffc3..eca0c92 100644 (file)
@@ -3450,7 +3450,7 @@ err_clk_disable:
        return ret;
 }
 
-static void bcmgenet_netif_stop(struct net_device *dev)
+static void bcmgenet_netif_stop(struct net_device *dev, bool stop_phy)
 {
        struct bcmgenet_priv *priv = netdev_priv(dev);
 
@@ -3465,6 +3465,8 @@ static void bcmgenet_netif_stop(struct net_device *dev)
        /* Disable MAC transmit. TX DMA disabled must be done before this */
        umac_enable_set(priv, CMD_TX_EN, false);
 
+       if (stop_phy)
+               phy_stop(dev->phydev);
        bcmgenet_disable_rx_napi(priv);
        bcmgenet_intr_disable(priv);
 
@@ -3485,7 +3487,7 @@ static int bcmgenet_close(struct net_device *dev)
 
        netif_dbg(priv, ifdown, dev, "bcmgenet_close\n");
 
-       bcmgenet_netif_stop(dev);
+       bcmgenet_netif_stop(dev, false);
 
        /* Really kill the PHY state machine and disconnect from it */
        phy_disconnect(dev->phydev);
@@ -4303,7 +4305,7 @@ static int bcmgenet_suspend(struct device *d)
 
        netif_device_detach(dev);
 
-       bcmgenet_netif_stop(dev);
+       bcmgenet_netif_stop(dev, true);
 
        if (!device_may_wakeup(d))
                phy_suspend(dev->phydev);
index 06a0c00..276c32c 100644 (file)
@@ -72,6 +72,8 @@
 #include <linux/gfp.h>
 #include <linux/io.h>
 
+#include <net/Space.h>
+
 #include <asm/irq.h>
 #include <linux/atomic.h>
 #if ALLOW_DMA
index 42ec6ca..577d948 100644 (file)
@@ -3798,7 +3798,6 @@ static int fec_enet_txq_xmit_frame(struct fec_enet_private *fep,
        entries_free = fec_enet_get_free_txdesc_num(txq);
        if (entries_free < MAX_SKB_FRAGS + 1) {
                netdev_err(fep->netdev, "NOT enough BD for SG!\n");
-               xdp_return_frame(frame);
                return NETDEV_TX_BUSY;
        }
 
@@ -4478,9 +4477,11 @@ fec_drv_remove(struct platform_device *pdev)
        struct device_node *np = pdev->dev.of_node;
        int ret;
 
-       ret = pm_runtime_resume_and_get(&pdev->dev);
+       ret = pm_runtime_get_sync(&pdev->dev);
        if (ret < 0)
-               return ret;
+               dev_err(&pdev->dev,
+                       "Failed to resume device in remove callback (%pe)\n",
+                       ERR_PTR(ret));
 
        cancel_work_sync(&fep->tx_timeout_work);
        fec_ptp_stop(pdev);
@@ -4493,8 +4494,13 @@ fec_drv_remove(struct platform_device *pdev)
                of_phy_deregister_fixed_link(np);
        of_node_put(fep->phy_node);
 
-       clk_disable_unprepare(fep->clk_ahb);
-       clk_disable_unprepare(fep->clk_ipg);
+       /* After pm_runtime_get_sync() failed, the clks are still off, so skip
+        * disabling them again.
+        */
+       if (ret >= 0) {
+               clk_disable_unprepare(fep->clk_ahb);
+               clk_disable_unprepare(fep->clk_ipg);
+       }
        pm_runtime_put_noidle(&pdev->dev);
        pm_runtime_disable(&pdev->dev);
 
index 57ce743..caa00c7 100644 (file)
@@ -294,19 +294,6 @@ static int gve_napi_poll_dqo(struct napi_struct *napi, int budget)
        bool reschedule = false;
        int work_done = 0;
 
-       /* Clear PCI MSI-X Pending Bit Array (PBA)
-        *
-        * This bit is set if an interrupt event occurs while the vector is
-        * masked. If this bit is set and we reenable the interrupt, it will
-        * fire again. Since we're just about to poll the queue state, we don't
-        * need it to fire again.
-        *
-        * Under high softirq load, it's possible that the interrupt condition
-        * is triggered twice before we got the chance to process it.
-        */
-       gve_write_irq_doorbell_dqo(priv, block,
-                                  GVE_ITR_NO_UPDATE_DQO | GVE_ITR_CLEAR_PBA_BIT_DQO);
-
        if (block->tx)
                reschedule |= gve_tx_poll_dqo(block, /*do_clean=*/true);
 
index cbbab5b..b85c412 100644 (file)
@@ -331,9 +331,25 @@ static int hclge_comm_cmd_csq_done(struct hclge_comm_hw *hw)
        return head == hw->cmq.csq.next_to_use;
 }
 
-static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw,
+static u32 hclge_get_cmdq_tx_timeout(u16 opcode, u32 tx_timeout)
+{
+       static const struct hclge_cmdq_tx_timeout_map cmdq_tx_timeout_map[] = {
+               {HCLGE_OPC_CFG_RST_TRIGGER, HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS},
+       };
+       u32 i;
+
+       for (i = 0; i < ARRAY_SIZE(cmdq_tx_timeout_map); i++)
+               if (cmdq_tx_timeout_map[i].opcode == opcode)
+                       return cmdq_tx_timeout_map[i].tx_timeout;
+
+       return tx_timeout;
+}
+
+static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw, u16 opcode,
                                     bool *is_completed)
 {
+       u32 cmdq_tx_timeout = hclge_get_cmdq_tx_timeout(opcode,
+                                                       hw->cmq.tx_timeout);
        u32 timeout = 0;
 
        do {
@@ -343,7 +359,7 @@ static void hclge_comm_wait_for_resp(struct hclge_comm_hw *hw,
                }
                udelay(1);
                timeout++;
-       } while (timeout < hw->cmq.tx_timeout);
+       } while (timeout < cmdq_tx_timeout);
 }
 
 static int hclge_comm_cmd_convert_err_code(u16 desc_ret)
@@ -407,7 +423,8 @@ static int hclge_comm_cmd_check_result(struct hclge_comm_hw *hw,
         * if multi descriptors to be sent, use the first one to check
         */
        if (HCLGE_COMM_SEND_SYNC(le16_to_cpu(desc->flag)))
-               hclge_comm_wait_for_resp(hw, &is_completed);
+               hclge_comm_wait_for_resp(hw, le16_to_cpu(desc->opcode),
+                                        &is_completed);
 
        if (!is_completed)
                ret = -EBADE;
@@ -529,7 +546,7 @@ int hclge_comm_cmd_queue_init(struct pci_dev *pdev, struct hclge_comm_hw *hw)
        cmdq->crq.desc_num = HCLGE_COMM_NIC_CMQ_DESC_NUM;
 
        /* Setup Tx write back timeout */
-       cmdq->tx_timeout = HCLGE_COMM_CMDQ_TX_TIMEOUT;
+       cmdq->tx_timeout = HCLGE_COMM_CMDQ_TX_TIMEOUT_DEFAULT;
 
        /* Setup queue rings */
        ret = hclge_comm_alloc_cmd_queue(hw, HCLGE_COMM_TYPE_CSQ);
index de72ecb..18f1b4b 100644 (file)
@@ -54,7 +54,8 @@
 #define HCLGE_COMM_NIC_SW_RST_RDY              BIT(HCLGE_COMM_NIC_SW_RST_RDY_B)
 #define HCLGE_COMM_NIC_CMQ_DESC_NUM_S          3
 #define HCLGE_COMM_NIC_CMQ_DESC_NUM            1024
-#define HCLGE_COMM_CMDQ_TX_TIMEOUT             30000
+#define HCLGE_COMM_CMDQ_TX_TIMEOUT_DEFAULT     30000
+#define HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS       500000
 
 enum hclge_opcode_type {
        /* Generic commands */
@@ -360,6 +361,11 @@ struct hclge_comm_caps_bit_map {
        u16 local_bit;
 };
 
+struct hclge_cmdq_tx_timeout_map {
+       u32 opcode;
+       u32 tx_timeout;
+};
+
 struct hclge_comm_firmware_compat_cmd {
        __le32 compat;
        u8 rsv[20];
index 4c3e90a..d385ffc 100644 (file)
@@ -130,7 +130,7 @@ static struct hns3_dbg_cmd_info hns3_dbg_cmd[] = {
                .name = "tx_bd_queue",
                .cmd = HNAE3_DBG_CMD_TX_BD,
                .dentry = HNS3_DBG_DENTRY_TX_BD,
-               .buf_len = HNS3_DBG_READ_LEN_4MB,
+               .buf_len = HNS3_DBG_READ_LEN_5MB,
                .init = hns3_dbg_bd_file_init,
        },
        {
index 97578ea..4a5ef8a 100644 (file)
@@ -10,6 +10,7 @@
 #define HNS3_DBG_READ_LEN_128KB        0x20000
 #define HNS3_DBG_READ_LEN_1MB  0x100000
 #define HNS3_DBG_READ_LEN_4MB  0x400000
+#define HNS3_DBG_READ_LEN_5MB  0x500000
 #define HNS3_DBG_WRITE_LEN     1024
 
 #define HNS3_DBG_DATA_STR_LEN  32
index 4fb5406..2689b10 100644 (file)
@@ -8053,12 +8053,15 @@ static void hclge_ae_stop(struct hnae3_handle *handle)
        /* If it is not PF reset or FLR, the firmware will disable the MAC,
         * so it only need to stop phy here.
         */
-       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) &&
-           hdev->reset_type != HNAE3_FUNC_RESET &&
-           hdev->reset_type != HNAE3_FLR_RESET) {
-               hclge_mac_stop_phy(hdev);
-               hclge_update_link_status(hdev);
-               return;
+       if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) {
+               hclge_pfc_pause_en_cfg(hdev, HCLGE_PFC_TX_RX_DISABLE,
+                                      HCLGE_PFC_DISABLE);
+               if (hdev->reset_type != HNAE3_FUNC_RESET &&
+                   hdev->reset_type != HNAE3_FLR_RESET) {
+                       hclge_mac_stop_phy(hdev);
+                       hclge_update_link_status(hdev);
+                       return;
+               }
        }
 
        hclge_reset_tqp(handle);
index 4a33f65..922c0da 100644 (file)
@@ -171,8 +171,8 @@ int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx)
        return hclge_cmd_send(&hdev->hw, &desc, 1);
 }
 
-static int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
-                                 u8 pfc_bitmap)
+int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
+                          u8 pfc_bitmap)
 {
        struct hclge_desc desc;
        struct hclge_pfc_en_cmd *pfc = (struct hclge_pfc_en_cmd *)desc.data;
index 68f28a9..dd6f1fd 100644 (file)
@@ -164,6 +164,9 @@ struct hclge_bp_to_qs_map_cmd {
        u32 rsvd1;
 };
 
+#define HCLGE_PFC_DISABLE      0
+#define HCLGE_PFC_TX_RX_DISABLE        0
+
 struct hclge_pfc_en_cmd {
        u8 tx_rx_en_bitmap;
        u8 pri_en_bitmap;
@@ -235,6 +238,8 @@ void hclge_tm_schd_info_update(struct hclge_dev *hdev, u8 num_tc);
 void hclge_tm_pfc_info_update(struct hclge_dev *hdev);
 int hclge_tm_dwrr_cfg(struct hclge_dev *hdev);
 int hclge_tm_init_hw(struct hclge_dev *hdev, bool init);
+int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap,
+                          u8 pfc_bitmap);
 int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx);
 int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr);
 void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
index f240462..dd08989 100644 (file)
@@ -1436,7 +1436,10 @@ static int hclgevf_reset_wait(struct hclgevf_dev *hdev)
         * might happen in case reset assertion was made by PF. Yes, this also
         * means we might end up waiting bit more even for VF reset.
         */
-       msleep(5000);
+       if (hdev->reset_type == HNAE3_VF_FULL_RESET)
+               msleep(5000);
+       else
+               msleep(500);
 
        return 0;
 }
index 9afbbda..7c0578b 100644 (file)
@@ -2238,11 +2238,6 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,
                iavf_process_config(adapter);
                adapter->flags |= IAVF_FLAG_SETUP_NETDEV_FEATURES;
 
-               /* Request VLAN offload settings */
-               if (VLAN_V2_ALLOWED(adapter))
-                       iavf_set_vlan_offload_features(adapter, 0,
-                                                      netdev->features);
-
                iavf_set_queue_vlan_tag_loc(adapter);
 
                was_mac_changed = !ether_addr_equal(netdev->dev_addr,
index c6d4926..850db8e 100644 (file)
@@ -932,10 +932,9 @@ ice_tx_prepare_vlan_flags_dcb(struct ice_tx_ring *tx_ring,
        if ((first->tx_flags & ICE_TX_FLAGS_HW_VLAN ||
             first->tx_flags & ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN) ||
            skb->priority != TC_PRIO_CONTROL) {
-               first->tx_flags &= ~ICE_TX_FLAGS_VLAN_PR_M;
+               first->vid &= ~VLAN_PRIO_MASK;
                /* Mask the lower 3 bits to set the 802.1p priority */
-               first->tx_flags |= (skb->priority & 0x7) <<
-                                  ICE_TX_FLAGS_VLAN_PR_S;
+               first->vid |= (skb->priority << VLAN_PRIO_SHIFT) & VLAN_PRIO_MASK;
                /* if this is not already set it means a VLAN 0 + priority needs
                 * to be offloaded
                 */
index 450317d..11ae0e4 100644 (file)
@@ -2745,6 +2745,8 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
                        goto unroll_vector_base;
 
                ice_vsi_map_rings_to_vectors(vsi);
+               vsi->stat_offsets_loaded = false;
+
                if (ice_is_xdp_ena_vsi(vsi)) {
                        ret = ice_vsi_determine_xdp_res(vsi);
                        if (ret)
@@ -2793,6 +2795,9 @@ ice_vsi_cfg_def(struct ice_vsi *vsi, struct ice_vsi_cfg_params *params)
                ret = ice_vsi_alloc_ring_stats(vsi);
                if (ret)
                        goto unroll_vector_base;
+
+               vsi->stat_offsets_loaded = false;
+
                /* Do not exit if configuring RSS had an issue, at least
                 * receive traffic on first queue. Hence no need to capture
                 * return value
index f1dca59..588ad86 100644 (file)
@@ -1171,7 +1171,7 @@ int ice_set_vf_spoofchk(struct net_device *netdev, int vf_id, bool ena)
        if (!vf)
                return -EINVAL;
 
-       ret = ice_check_vf_ready_for_cfg(vf);
+       ret = ice_check_vf_ready_for_reset(vf);
        if (ret)
                goto out_put_vf;
 
@@ -1286,7 +1286,7 @@ int ice_set_vf_mac(struct net_device *netdev, int vf_id, u8 *mac)
                goto out_put_vf;
        }
 
-       ret = ice_check_vf_ready_for_cfg(vf);
+       ret = ice_check_vf_ready_for_reset(vf);
        if (ret)
                goto out_put_vf;
 
@@ -1340,7 +1340,7 @@ int ice_set_vf_trust(struct net_device *netdev, int vf_id, bool trusted)
                return -EOPNOTSUPP;
        }
 
-       ret = ice_check_vf_ready_for_cfg(vf);
+       ret = ice_check_vf_ready_for_reset(vf);
        if (ret)
                goto out_put_vf;
 
@@ -1653,7 +1653,7 @@ ice_set_vf_port_vlan(struct net_device *netdev, int vf_id, u16 vlan_id, u8 qos,
        if (!vf)
                return -EINVAL;
 
-       ret = ice_check_vf_ready_for_cfg(vf);
+       ret = ice_check_vf_ready_for_reset(vf);
        if (ret)
                goto out_put_vf;
 
index 4fcf2d0..059bd91 100644 (file)
@@ -1664,8 +1664,7 @@ ice_tx_map(struct ice_tx_ring *tx_ring, struct ice_tx_buf *first,
 
        if (first->tx_flags & ICE_TX_FLAGS_HW_VLAN) {
                td_cmd |= (u64)ICE_TX_DESC_CMD_IL2TAG1;
-               td_tag = (first->tx_flags & ICE_TX_FLAGS_VLAN_M) >>
-                         ICE_TX_FLAGS_VLAN_S;
+               td_tag = first->vid;
        }
 
        dma = dma_map_single(tx_ring->dev, skb->data, size, DMA_TO_DEVICE);
@@ -1998,7 +1997,7 @@ ice_tx_prepare_vlan_flags(struct ice_tx_ring *tx_ring, struct ice_tx_buf *first)
         * VLAN offloads exclusively so we only care about the VLAN ID here
         */
        if (skb_vlan_tag_present(skb)) {
-               first->tx_flags |= skb_vlan_tag_get(skb) << ICE_TX_FLAGS_VLAN_S;
+               first->vid = skb_vlan_tag_get(skb);
                if (tx_ring->flags & ICE_TX_FLAGS_RING_VLAN_L2TAG2)
                        first->tx_flags |= ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN;
                else
@@ -2388,8 +2387,7 @@ ice_xmit_frame_ring(struct sk_buff *skb, struct ice_tx_ring *tx_ring)
                offload.cd_qw1 |= (u64)(ICE_TX_DESC_DTYPE_CTX |
                                        (ICE_TX_CTX_DESC_IL2TAG2 <<
                                        ICE_TXD_CTX_QW1_CMD_S));
-               offload.cd_l2tag2 = (first->tx_flags & ICE_TX_FLAGS_VLAN_M) >>
-                       ICE_TX_FLAGS_VLAN_S;
+               offload.cd_l2tag2 = first->vid;
        }
 
        /* set up TSO offload */
index fff0efe..166413f 100644 (file)
@@ -127,10 +127,6 @@ static inline int ice_skb_pad(void)
 #define ICE_TX_FLAGS_IPV6      BIT(6)
 #define ICE_TX_FLAGS_TUNNEL    BIT(7)
 #define ICE_TX_FLAGS_HW_OUTER_SINGLE_VLAN      BIT(8)
-#define ICE_TX_FLAGS_VLAN_M    0xffff0000
-#define ICE_TX_FLAGS_VLAN_PR_M 0xe0000000
-#define ICE_TX_FLAGS_VLAN_PR_S 29
-#define ICE_TX_FLAGS_VLAN_S    16
 
 #define ICE_XDP_PASS           0
 #define ICE_XDP_CONSUMED       BIT(0)
@@ -182,8 +178,9 @@ struct ice_tx_buf {
                unsigned int gso_segs;
                unsigned int nr_frags;  /* used for mbuf XDP */
        };
-       u32 type:16;                    /* &ice_tx_buf_type */
-       u32 tx_flags:16;
+       u32 tx_flags:12;
+       u32 type:4;                     /* &ice_tx_buf_type */
+       u32 vid:16;
        DEFINE_DMA_UNMAP_LEN(len);
        DEFINE_DMA_UNMAP_ADDR(dma);
 };
index 89fd698..bf74a2f 100644 (file)
@@ -186,6 +186,25 @@ int ice_check_vf_ready_for_cfg(struct ice_vf *vf)
 }
 
 /**
+ * ice_check_vf_ready_for_reset - check if VF is ready to be reset
+ * @vf: VF to check if it's ready to be reset
+ *
+ * The purpose of this function is to ensure that the VF is not in reset,
+ * disabled, and is both initialized and active, thus enabling us to safely
+ * initialize another reset.
+ */
+int ice_check_vf_ready_for_reset(struct ice_vf *vf)
+{
+       int ret;
+
+       ret = ice_check_vf_ready_for_cfg(vf);
+       if (!ret && !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states))
+               ret = -EAGAIN;
+
+       return ret;
+}
+
+/**
  * ice_trigger_vf_reset - Reset a VF on HW
  * @vf: pointer to the VF structure
  * @is_vflr: true if VFLR was issued, false if not
index e3cda6f..a38ef00 100644 (file)
@@ -215,6 +215,7 @@ u16 ice_get_num_vfs(struct ice_pf *pf);
 struct ice_vsi *ice_get_vf_vsi(struct ice_vf *vf);
 bool ice_is_vf_disabled(struct ice_vf *vf);
 int ice_check_vf_ready_for_cfg(struct ice_vf *vf);
+int ice_check_vf_ready_for_reset(struct ice_vf *vf);
 void ice_set_vf_state_dis(struct ice_vf *vf);
 bool ice_is_any_vf_in_unicast_promisc(struct ice_pf *pf);
 void
index 97243c6..f4a524f 100644 (file)
@@ -3955,6 +3955,7 @@ error_handler:
                ice_vc_notify_vf_link_state(vf);
                break;
        case VIRTCHNL_OP_RESET_VF:
+               clear_bit(ICE_VF_STATE_ACTIVE, vf->vf_states);
                ops->reset_vf(vf);
                break;
        case VIRTCHNL_OP_ADD_ETH_ADDR:
index 205d577..caf91c6 100644 (file)
@@ -426,7 +426,7 @@ void igb_mta_set(struct e1000_hw *hw, u32 hash_value)
 static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
 {
        u32 hash_value, hash_mask;
-       u8 bit_shift = 0;
+       u8 bit_shift = 1;
 
        /* Register count multiplied by bits per register */
        hash_mask = (hw->mac.mta_reg_count * 32) - 1;
@@ -434,7 +434,7 @@ static u32 igb_hash_mc_addr(struct e1000_hw *hw, u8 *mc_addr)
        /* For a mc_filter_type of 0, bit_shift is the number of left-shifts
         * where 0xFF would still fall within the hash mask.
         */
-       while (hash_mask >> bit_shift != 0xFF)
+       while (hash_mask >> bit_shift != 0xFF && bit_shift < 4)
                bit_shift++;
 
        /* The portion of the address that is used for the hash table
index 4c205af..985cff9 100644 (file)
@@ -654,7 +654,7 @@ __mtk_wed_detach(struct mtk_wed_device *dev)
                                           BIT(hw->index), BIT(hw->index));
        }
 
-       if (!hw_list[!hw->index]->wed_dev &&
+       if ((!hw_list[!hw->index] || !hw_list[!hw->index]->wed_dev) &&
            hw->eth->dma_dev != hw->eth->dev)
                mtk_eth_set_dma_device(hw->eth, hw->eth->dev);
 
index ef6fd3f..5595bfe 100644 (file)
@@ -307,15 +307,15 @@ static const u32 vsc7514_sys_regmap[] = {
        REG(SYS_COUNT_DROP_YELLOW_PRIO_4,               0x000218),
        REG(SYS_COUNT_DROP_YELLOW_PRIO_5,               0x00021c),
        REG(SYS_COUNT_DROP_YELLOW_PRIO_6,               0x000220),
-       REG(SYS_COUNT_DROP_YELLOW_PRIO_7,               0x000214),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_0,                0x000218),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_1,                0x00021c),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_2,                0x000220),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_3,                0x000224),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_4,                0x000228),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_5,                0x00022c),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_6,                0x000230),
-       REG(SYS_COUNT_DROP_GREEN_PRIO_7,                0x000234),
+       REG(SYS_COUNT_DROP_YELLOW_PRIO_7,               0x000224),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_0,                0x000228),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_1,                0x00022c),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_2,                0x000230),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_3,                0x000234),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_4,                0x000238),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_5,                0x00023c),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_6,                0x000240),
+       REG(SYS_COUNT_DROP_GREEN_PRIO_7,                0x000244),
        REG(SYS_RESET_CFG,                              0x000508),
        REG(SYS_CMID,                                   0x00050c),
        REG(SYS_VLAN_ETYPE_CFG,                         0x000510),
index 094374d..38b8b10 100644 (file)
@@ -8,7 +8,7 @@
 
 #ifdef CONFIG_DCB
 /* DCB feature definitions */
-#define NFP_NET_MAX_DSCP       4
+#define NFP_NET_MAX_DSCP       64
 #define NFP_NET_MAX_TC         IEEE_8021QAZ_MAX_TCS
 #define NFP_NET_MAX_PRIO       8
 #define NFP_DCB_CFG_STRIDE     256
index d916877..be395cd 100644 (file)
@@ -378,7 +378,9 @@ int ef100_probe_netdev(struct efx_probe_data *probe_data)
        efx->net_dev = net_dev;
        SET_NETDEV_DEV(net_dev, &efx->pci_dev->dev);
 
-       net_dev->features |= efx->type->offload_features;
+       /* enable all supported features except rx-fcs and rx-all */
+       net_dev->features |= efx->type->offload_features &
+                            ~(NETIF_F_RXFCS | NETIF_F_RXALL);
        net_dev->hw_features |= efx->type->offload_features;
        net_dev->hw_enc_features |= efx->type->offload_features;
        net_dev->vlan_features |= NETIF_F_HW_CSUM | NETIF_F_SG |
index 4538f33..d3c5306 100644 (file)
@@ -181,6 +181,7 @@ enum power_event {
 #define GMAC4_LPI_CTRL_STATUS  0xd0
 #define GMAC4_LPI_TIMER_CTRL   0xd4
 #define GMAC4_LPI_ENTRY_TIMER  0xd8
+#define GMAC4_MAC_ONEUS_TIC_COUNTER    0xdc
 
 /* LPI control and status defines */
 #define GMAC4_LPI_CTRL_STATUS_LPITCSE  BIT(21) /* LPI Tx Clock Stop Enable */
index afaec3f..03b1c5a 100644 (file)
@@ -25,6 +25,7 @@ static void dwmac4_core_init(struct mac_device_info *hw,
        struct stmmac_priv *priv = netdev_priv(dev);
        void __iomem *ioaddr = hw->pcsr;
        u32 value = readl(ioaddr + GMAC_CONFIG);
+       u32 clk_rate;
 
        value |= GMAC_CORE_INIT;
 
@@ -47,6 +48,10 @@ static void dwmac4_core_init(struct mac_device_info *hw,
 
        writel(value, ioaddr + GMAC_CONFIG);
 
+       /* Configure LPI 1us counter to number of CSR clock ticks in 1us - 1 */
+       clk_rate = clk_get_rate(priv->plat->stmmac_clk);
+       writel((clk_rate / 1000000) - 1, ioaddr + GMAC4_MAC_ONEUS_TIC_COUNTER);
+
        /* Enable GMAC interrupts */
        value = GMAC_INT_DEFAULT_ENABLE;
 
index 4ef05ba..d61dfa2 100644 (file)
@@ -5077,6 +5077,8 @@ err_out_iounmap:
                cas_shutdown(cp);
        mutex_unlock(&cp->pm_mutex);
 
+       vfree(cp->fw_data);
+
        pci_iounmap(pdev, cp->regs);
 
 
index 460b3d4..ab5133e 100644 (file)
@@ -436,6 +436,9 @@ static int ipvlan_process_v4_outbound(struct sk_buff *skb)
                goto err;
        }
        skb_dst_set(skb, &rt->dst);
+
+       memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
+
        err = ip_local_out(net, skb->sk, skb);
        if (unlikely(net_xmit_eval(err)))
                dev->stats.tx_errors++;
@@ -474,6 +477,9 @@ static int ipvlan_process_v6_outbound(struct sk_buff *skb)
                goto err;
        }
        skb_dst_set(skb, dst);
+
+       memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
+
        err = ip6_local_out(net, skb->sk, skb);
        if (unlikely(net_xmit_eval(err)))
                dev->stats.tx_errors++;
index 1e0c206..da2001e 100644 (file)
@@ -291,7 +291,8 @@ static int i2c_rollball_mii_cmd(struct mii_bus *bus, int bus_addr, u8 cmd,
        return i2c_transfer_rollball(i2c, msgs, ARRAY_SIZE(msgs));
 }
 
-static int i2c_mii_read_rollball(struct mii_bus *bus, int phy_id, int reg)
+static int i2c_mii_read_rollball(struct mii_bus *bus, int phy_id, int devad,
+                                int reg)
 {
        u8 buf[4], res[6];
        int bus_addr, ret;
@@ -302,7 +303,7 @@ static int i2c_mii_read_rollball(struct mii_bus *bus, int phy_id, int reg)
                return 0xffff;
 
        buf[0] = ROLLBALL_DATA_ADDR;
-       buf[1] = (reg >> 16) & 0x1f;
+       buf[1] = devad;
        buf[2] = (reg >> 8) & 0xff;
        buf[3] = reg & 0xff;
 
@@ -322,8 +323,8 @@ static int i2c_mii_read_rollball(struct mii_bus *bus, int phy_id, int reg)
        return val;
 }
 
-static int i2c_mii_write_rollball(struct mii_bus *bus, int phy_id, int reg,
-                                 u16 val)
+static int i2c_mii_write_rollball(struct mii_bus *bus, int phy_id, int devad,
+                                 int reg, u16 val)
 {
        int bus_addr, ret;
        u8 buf[6];
@@ -333,7 +334,7 @@ static int i2c_mii_write_rollball(struct mii_bus *bus, int phy_id, int reg,
                return 0;
 
        buf[0] = ROLLBALL_DATA_ADDR;
-       buf[1] = (reg >> 16) & 0x1f;
+       buf[1] = devad;
        buf[2] = (reg >> 8) & 0xff;
        buf[3] = reg & 0xff;
        buf[4] = val >> 8;
@@ -405,8 +406,8 @@ struct mii_bus *mdio_i2c_alloc(struct device *parent, struct i2c_adapter *i2c,
                        return ERR_PTR(ret);
                }
 
-               mii->read = i2c_mii_read_rollball;
-               mii->write = i2c_mii_write_rollball;
+               mii->read_c45 = i2c_mii_read_rollball;
+               mii->write_c45 = i2c_mii_write_rollball;
                break;
        default:
                mii->read = i2c_mii_read_default_c22;
index 68fc559..554837c 100644 (file)
@@ -67,6 +67,7 @@ static int mvusb_mdio_probe(struct usb_interface *interface,
        struct device *dev = &interface->dev;
        struct mvusb_mdio *mvusb;
        struct mii_bus *mdio;
+       int ret;
 
        mdio = devm_mdiobus_alloc_size(dev, sizeof(*mvusb));
        if (!mdio)
@@ -87,7 +88,15 @@ static int mvusb_mdio_probe(struct usb_interface *interface,
        mdio->write = mvusb_mdio_write;
 
        usb_set_intfdata(interface, mvusb);
-       return of_mdiobus_register(mdio, dev->of_node);
+       ret = of_mdiobus_register(mdio, dev->of_node);
+       if (ret)
+               goto put_dev;
+
+       return 0;
+
+put_dev:
+       usb_put_dev(mvusb->udev);
+       return ret;
 }
 
 static void mvusb_mdio_disconnect(struct usb_interface *interface)
index 539cd43..72f25e7 100644 (file)
@@ -873,7 +873,7 @@ int xpcs_do_config(struct dw_xpcs *xpcs, phy_interface_t interface,
 
        switch (compat->an_mode) {
        case DW_AN_C73:
-               if (phylink_autoneg_inband(mode)) {
+               if (test_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, advertising)) {
                        ret = xpcs_config_aneg_c73(xpcs, compat);
                        if (ret)
                                return ret;
@@ -1203,7 +1203,7 @@ static const struct xpcs_compat synopsys_xpcs_compat[DW_XPCS_INTERFACE_MAX] = {
        [DW_XPCS_2500BASEX] = {
                .supported = xpcs_2500basex_features,
                .interface = xpcs_2500basex_interfaces,
-               .num_interfaces = ARRAY_SIZE(xpcs_2500basex_features),
+               .num_interfaces = ARRAY_SIZE(xpcs_2500basex_interfaces),
                .an_mode = DW_2500BASEX,
        },
 };
index 9902fb1..729db44 100644 (file)
@@ -40,6 +40,11 @@ static inline int bcm_phy_write_exp_sel(struct phy_device *phydev,
        return bcm_phy_write_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER, val);
 }
 
+static inline int bcm_phy_read_exp_sel(struct phy_device *phydev, u16 reg)
+{
+       return bcm_phy_read_exp(phydev, reg | MII_BCM54XX_EXP_SEL_ER);
+}
+
 int bcm54xx_auxctl_write(struct phy_device *phydev, u16 regnum, u16 val);
 int bcm54xx_auxctl_read(struct phy_device *phydev, u16 regnum);
 
index 06be71e..f8c17a2 100644 (file)
@@ -486,7 +486,7 @@ static int bcm7xxx_16nm_ephy_afe_config(struct phy_device *phydev)
        bcm_phy_write_misc(phydev, 0x0038, 0x0002, 0xede0);
 
        /* Read CORE_EXPA9 */
-       tmp = bcm_phy_read_exp(phydev, 0x00a9);
+       tmp = bcm_phy_read_exp_sel(phydev, 0x00a9);
        /* CORE_EXPA9[6:1] is rcalcode[5:0] */
        rcalcode = (tmp & 0x7e) / 2;
        /* Correct RCAL code + 1 is -1% rprogr, LP: +16 */
index d75f526..76f5a24 100644 (file)
@@ -44,6 +44,7 @@
 #define DP83867_STRAP_STS1     0x006E
 #define DP83867_STRAP_STS2     0x006f
 #define DP83867_RGMIIDCTL      0x0086
+#define DP83867_DSP_FFE_CFG    0x012c
 #define DP83867_RXFCFG         0x0134
 #define DP83867_RXFPMD1        0x0136
 #define DP83867_RXFPMD2        0x0137
@@ -941,8 +942,27 @@ static int dp83867_phy_reset(struct phy_device *phydev)
 
        usleep_range(10, 20);
 
-       return phy_modify(phydev, MII_DP83867_PHYCTRL,
+       err = phy_modify(phydev, MII_DP83867_PHYCTRL,
                         DP83867_PHYCR_FORCE_LINK_GOOD, 0);
+       if (err < 0)
+               return err;
+
+       /* Configure the DSP Feedforward Equalizer Configuration register to
+        * improve short cable (< 1 meter) performance. This will not affect
+        * long cable performance.
+        */
+       err = phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_DSP_FFE_CFG,
+                           0x0e81);
+       if (err < 0)
+               return err;
+
+       err = phy_write(phydev, DP83867_CTRL, DP83867_SW_RESTART);
+       if (err < 0)
+               return err;
+
+       usleep_range(10, 20);
+
+       return 0;
 }
 
 static void dp83867_link_change_notify(struct phy_device *phydev)
index a4111f1..e237949 100644 (file)
@@ -2225,6 +2225,10 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
 
        ASSERT_RTNL();
 
+       /* Mask out unsupported advertisements */
+       linkmode_and(config.advertising, kset->link_modes.advertising,
+                    pl->supported);
+
        if (pl->phydev) {
                /* We can rely on phylib for this update; we also do not need
                 * to update the pl->link_config settings:
@@ -2249,10 +2253,6 @@ int phylink_ethtool_ksettings_set(struct phylink *pl,
 
        config = pl->link_config;
 
-       /* Mask out unsupported advertisements */
-       linkmode_and(config.advertising, kset->link_modes.advertising,
-                    pl->supported);
-
        /* FIXME: should we reject autoneg if phy/mac does not support it? */
        switch (kset->base.autoneg) {
        case AUTONEG_DISABLE:
index ce993cc..d30d730 100644 (file)
@@ -742,7 +742,7 @@ static ssize_t tap_get_user(struct tap_queue *q, void *msg_control,
 
        /* Move network header to the right position for VLAN tagged packets */
        if (eth_type_vlan(skb->protocol) &&
-           __vlan_get_protocol(skb, skb->protocol, &depth) != 0)
+           vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0)
                skb_set_network_header(skb, depth);
 
        /* copy skb_ubuf_info for callback when skb has no error */
@@ -1197,7 +1197,7 @@ static int tap_get_user_xdp(struct tap_queue *q, struct xdp_buff *xdp)
 
        /* Move network header to the right position for VLAN tagged packets */
        if (eth_type_vlan(skb->protocol) &&
-           __vlan_get_protocol(skb, skb->protocol, &depth) != 0)
+           vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0)
                skb_set_network_header(skb, depth);
 
        rcu_read_lock();
index d4d0a41..d75456a 100644 (file)
@@ -1977,6 +1977,14 @@ napi_busy:
                int queue_len;
 
                spin_lock_bh(&queue->lock);
+
+               if (unlikely(tfile->detached)) {
+                       spin_unlock_bh(&queue->lock);
+                       rcu_read_unlock();
+                       err = -EBUSY;
+                       goto free_skb;
+               }
+
                __skb_queue_tail(queue, skb);
                queue_len = skb_queue_len(queue);
                spin_unlock(&queue->lock);
@@ -2512,6 +2520,13 @@ build:
        if (tfile->napi_enabled) {
                queue = &tfile->sk.sk_write_queue;
                spin_lock(&queue->lock);
+
+               if (unlikely(tfile->detached)) {
+                       spin_unlock(&queue->lock);
+                       kfree_skb(skb);
+                       return -EBUSY;
+               }
+
                __skb_queue_tail(queue, skb);
                spin_unlock(&queue->lock);
                ret = 1;
index a12ae26..56ca1d2 100644 (file)
@@ -1868,6 +1868,38 @@ static int virtnet_poll(struct napi_struct *napi, int budget)
        return received;
 }
 
+static void virtnet_disable_queue_pair(struct virtnet_info *vi, int qp_index)
+{
+       virtnet_napi_tx_disable(&vi->sq[qp_index].napi);
+       napi_disable(&vi->rq[qp_index].napi);
+       xdp_rxq_info_unreg(&vi->rq[qp_index].xdp_rxq);
+}
+
+static int virtnet_enable_queue_pair(struct virtnet_info *vi, int qp_index)
+{
+       struct net_device *dev = vi->dev;
+       int err;
+
+       err = xdp_rxq_info_reg(&vi->rq[qp_index].xdp_rxq, dev, qp_index,
+                              vi->rq[qp_index].napi.napi_id);
+       if (err < 0)
+               return err;
+
+       err = xdp_rxq_info_reg_mem_model(&vi->rq[qp_index].xdp_rxq,
+                                        MEM_TYPE_PAGE_SHARED, NULL);
+       if (err < 0)
+               goto err_xdp_reg_mem_model;
+
+       virtnet_napi_enable(vi->rq[qp_index].vq, &vi->rq[qp_index].napi);
+       virtnet_napi_tx_enable(vi, vi->sq[qp_index].vq, &vi->sq[qp_index].napi);
+
+       return 0;
+
+err_xdp_reg_mem_model:
+       xdp_rxq_info_unreg(&vi->rq[qp_index].xdp_rxq);
+       return err;
+}
+
 static int virtnet_open(struct net_device *dev)
 {
        struct virtnet_info *vi = netdev_priv(dev);
@@ -1881,22 +1913,20 @@ static int virtnet_open(struct net_device *dev)
                        if (!try_fill_recv(vi, &vi->rq[i], GFP_KERNEL))
                                schedule_delayed_work(&vi->refill, 0);
 
-               err = xdp_rxq_info_reg(&vi->rq[i].xdp_rxq, dev, i, vi->rq[i].napi.napi_id);
+               err = virtnet_enable_queue_pair(vi, i);
                if (err < 0)
-                       return err;
-
-               err = xdp_rxq_info_reg_mem_model(&vi->rq[i].xdp_rxq,
-                                                MEM_TYPE_PAGE_SHARED, NULL);
-               if (err < 0) {
-                       xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
-                       return err;
-               }
-
-               virtnet_napi_enable(vi->rq[i].vq, &vi->rq[i].napi);
-               virtnet_napi_tx_enable(vi, vi->sq[i].vq, &vi->sq[i].napi);
+                       goto err_enable_qp;
        }
 
        return 0;
+
+err_enable_qp:
+       disable_delayed_refill(vi);
+       cancel_delayed_work_sync(&vi->refill);
+
+       for (i--; i >= 0; i--)
+               virtnet_disable_queue_pair(vi, i);
+       return err;
 }
 
 static int virtnet_poll_tx(struct napi_struct *napi, int budget)
@@ -2305,11 +2335,8 @@ static int virtnet_close(struct net_device *dev)
        /* Make sure refill_work doesn't re-enable napi! */
        cancel_delayed_work_sync(&vi->refill);
 
-       for (i = 0; i < vi->max_queue_pairs; i++) {
-               virtnet_napi_tx_disable(&vi->sq[i].napi);
-               napi_disable(&vi->rq[i].napi);
-               xdp_rxq_info_unreg(&vi->rq[i].xdp_rxq);
-       }
+       for (i = 0; i < vi->max_queue_pairs; i++)
+               virtnet_disable_queue_pair(vi, i);
 
        return 0;
 }
index 9fc7c08..67b4bac 100644 (file)
@@ -651,7 +651,7 @@ struct b43_iv {
        union {
                __be16 d16;
                __be32 d32;
-       } data __packed;
+       } __packed data;
 } __packed;
 
 
index 6b0cec4..f49365d 100644 (file)
@@ -379,7 +379,7 @@ struct b43legacy_iv {
        union {
                __be16 d16;
                __be32 d32;
-       } data __packed;
+       } __packed data;
 } __packed;
 
 #define B43legacy_PHYMODE(phytype)     (1 << (phytype))
index ff710b0..00679a9 100644 (file)
@@ -1039,6 +1039,11 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
        struct brcmf_sdio_dev *sdiodev;
        struct brcmf_bus *bus_if;
 
+       if (!id) {
+               dev_err(&func->dev, "Error no sdio_device_id passed for %x:%x\n", func->vendor, func->device);
+               return -ENODEV;
+       }
+
        brcmf_dbg(SDIO, "Enter\n");
        brcmf_dbg(SDIO, "Class=%x\n", func->class);
        brcmf_dbg(SDIO, "sdio vendor ID: 0x%04x\n", func->vendor);
index 59f3e9c..8022068 100644 (file)
@@ -2394,6 +2394,9 @@ static void brcmf_pcie_debugfs_create(struct device *dev)
 }
 #endif
 
+/* Forward declaration for pci_match_id() call */
+static const struct pci_device_id brcmf_pcie_devid_table[];
+
 static int
 brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
@@ -2404,6 +2407,14 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
        struct brcmf_core *core;
        struct brcmf_bus *bus;
 
+       if (!id) {
+               id = pci_match_id(brcmf_pcie_devid_table, pdev);
+               if (!id) {
+                       pci_err(pdev, "Error could not find pci_device_id for %x:%x\n", pdev->vendor, pdev->device);
+                       return -ENODEV;
+               }
+       }
+
        brcmf_dbg(PCIE, "Enter %x:%x\n", pdev->vendor, pdev->device);
 
        ret = -ENOMEM;
index 246843a..2178675 100644 (file)
@@ -1331,6 +1331,9 @@ brcmf_usb_disconnect_cb(struct brcmf_usbdev_info *devinfo)
        brcmf_usb_detach(devinfo);
 }
 
+/* Forward declaration for usb_match_id() call */
+static const struct usb_device_id brcmf_usb_devid_table[];
+
 static int
 brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
@@ -1342,6 +1345,14 @@ brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
        u32 num_of_eps;
        u8 endpoint_num, ep;
 
+       if (!id) {
+               id = usb_match_id(intf, brcmf_usb_devid_table);
+               if (!id) {
+                       dev_err(&intf->dev, "Error could not find matching usb_device_id\n");
+                       return -ENODEV;
+               }
+       }
+
        brcmf_dbg(USB, "Enter 0x%04x:0x%04x\n", id->idVendor, id->idProduct);
 
        devinfo = kzalloc(sizeof(*devinfo), GFP_ATOMIC);
index 5f4a513..cb9181f 100644 (file)
@@ -38,7 +38,7 @@ static const struct dmi_system_id dmi_ppag_approved_list[] = {
        },
        { .ident = "ASUS",
          .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTek COMPUTER INC."),
+                       DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
                },
        },
        {}
index d9faaae..5521997 100644 (file)
@@ -1664,14 +1664,10 @@ static __le32 iwl_get_mon_reg(struct iwl_fw_runtime *fwrt, u32 alloc_id,
 }
 
 static void *
-iwl_dump_ini_mon_fill_header(struct iwl_fw_runtime *fwrt,
-                            struct iwl_dump_ini_region_data *reg_data,
+iwl_dump_ini_mon_fill_header(struct iwl_fw_runtime *fwrt, u32 alloc_id,
                             struct iwl_fw_ini_monitor_dump *data,
                             const struct iwl_fw_mon_regs *addrs)
 {
-       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
-       u32 alloc_id = le32_to_cpu(reg->dram_alloc_id);
-
        if (!iwl_trans_grab_nic_access(fwrt->trans)) {
                IWL_ERR(fwrt, "Failed to get monitor header\n");
                return NULL;
@@ -1702,8 +1698,10 @@ iwl_dump_ini_mon_dram_fill_header(struct iwl_fw_runtime *fwrt,
                                  void *data, u32 data_len)
 {
        struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       u32 alloc_id = le32_to_cpu(reg->dram_alloc_id);
 
-       return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
+       return iwl_dump_ini_mon_fill_header(fwrt, alloc_id, mon_dump,
                                            &fwrt->trans->cfg->mon_dram_regs);
 }
 
@@ -1713,8 +1711,10 @@ iwl_dump_ini_mon_smem_fill_header(struct iwl_fw_runtime *fwrt,
                                  void *data, u32 data_len)
 {
        struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       u32 alloc_id = le32_to_cpu(reg->internal_buffer.alloc_id);
 
-       return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
+       return iwl_dump_ini_mon_fill_header(fwrt, alloc_id, mon_dump,
                                            &fwrt->trans->cfg->mon_smem_regs);
 }
 
@@ -1725,7 +1725,10 @@ iwl_dump_ini_mon_dbgi_fill_header(struct iwl_fw_runtime *fwrt,
 {
        struct iwl_fw_ini_monitor_dump *mon_dump = (void *)data;
 
-       return iwl_dump_ini_mon_fill_header(fwrt, reg_data, mon_dump,
+       return iwl_dump_ini_mon_fill_header(fwrt,
+                                           /* no offset calculation later */
+                                           IWL_FW_INI_ALLOCATION_ID_DBGC1,
+                                           mon_dump,
                                            &fwrt->trans->cfg->mon_dbgi_regs);
 }
 
index 3963a0d..652a603 100644 (file)
@@ -526,6 +526,11 @@ iwl_mvm_ftm_put_target(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                rcu_read_lock();
 
                sta = rcu_dereference(mvm->fw_id_to_mac_id[mvmvif->deflink.ap_sta_id]);
+               if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
+                       rcu_read_unlock();
+                       return PTR_ERR_OR_ZERO(sta);
+               }
+
                if (sta->mfp && (peer->ftm.trigger_based || peer->ftm.non_trigger_based))
                        FTM_PUT_FLAG(PMF);
 
index b35c96c..205c09b 100644 (file)
@@ -1091,7 +1091,7 @@ static const struct dmi_system_id dmi_tas_approved_list[] = {
        },
                { .ident = "LENOVO",
          .matches = {
-                       DMI_MATCH(DMI_SYS_VENDOR, "Lenovo"),
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
                },
        },
        { .ident = "DELL",
@@ -1727,8 +1727,7 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
        iwl_mvm_tas_init(mvm);
        iwl_mvm_leds_sync(mvm);
 
-       if (fw_has_capa(&mvm->fw->ucode_capa,
-                       IWL_UCODE_TLV_CAPA_RFIM_SUPPORT)) {
+       if (iwl_rfi_supported(mvm)) {
                if (iwl_mvm_eval_dsm_rfi(mvm) == DSM_VALUE_RFI_ENABLE)
                        iwl_rfi_send_config_cmd(mvm, NULL);
        }
index eb828de..3814915 100644 (file)
@@ -123,11 +123,13 @@ int iwl_mvm_link_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                                if (mvmvif->link[i]->phy_ctxt)
                                        count++;
 
-                       /* FIXME: IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM should be
-                        * defined per HW
-                        */
-                       if (count >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM)
-                               return -EINVAL;
+                       if (vif->type == NL80211_IFTYPE_AP) {
+                               if (count > mvm->fw->ucode_capa.num_beacons)
+                                       return -EOPNOTSUPP;
+                       /* this should be per HW or such */
+                       } else if (count >= IWL_MVM_FW_MAX_ACTIVE_LINKS_NUM) {
+                               return -EOPNOTSUPP;
+                       }
                }
 
                /* Catch early if driver tries to activate or deactivate a link
index 0f01b62..17f788a 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2012-2014, 2018-2022 Intel Corporation
+ * Copyright (C) 2012-2014, 2018-2023 Intel Corporation
  * Copyright (C) 2013-2015 Intel Mobile Communications GmbH
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
  */
@@ -3607,7 +3607,8 @@ static bool iwl_mvm_vif_conf_from_sta(struct iwl_mvm *mvm,
                                      struct ieee80211_vif *vif,
                                      struct ieee80211_sta *sta)
 {
-       unsigned int i;
+       struct ieee80211_link_sta *link_sta;
+       unsigned int link_id;
 
        /* Beacon interval check - firmware will crash if the beacon
         * interval is less than 16. We can't avoid connecting at all,
@@ -3616,14 +3617,11 @@ static bool iwl_mvm_vif_conf_from_sta(struct iwl_mvm *mvm,
         * wpa_s will blocklist the AP...
         */
 
-       for_each_set_bit(i, (unsigned long *)&sta->valid_links,
-                        IEEE80211_MLD_MAX_NUM_LINKS) {
-               struct ieee80211_link_sta *link_sta =
-                       link_sta_dereference_protected(sta, i);
+       for_each_sta_active_link(vif, sta, link_sta, link_id) {
                struct ieee80211_bss_conf *link_conf =
-                       link_conf_dereference_protected(vif, i);
+                       link_conf_dereference_protected(vif, link_id);
 
-               if (!link_conf || !link_sta)
+               if (!link_conf)
                        continue;
 
                if (link_conf->beacon_int < IWL_MVM_MIN_BEACON_INTERVAL_TU) {
@@ -3645,24 +3643,23 @@ static void iwl_mvm_vif_set_he_support(struct ieee80211_hw *hw,
                                       bool is_sta)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
-       unsigned int i;
+       struct ieee80211_link_sta *link_sta;
+       unsigned int link_id;
 
-       for_each_set_bit(i, (unsigned long *)&sta->valid_links,
-                        IEEE80211_MLD_MAX_NUM_LINKS) {
-               struct ieee80211_link_sta *link_sta =
-                       link_sta_dereference_protected(sta, i);
+       for_each_sta_active_link(vif, sta, link_sta, link_id) {
                struct ieee80211_bss_conf *link_conf =
-                       link_conf_dereference_protected(vif, i);
+                       link_conf_dereference_protected(vif, link_id);
 
-               if (!link_conf || !link_sta || !mvmvif->link[i])
+               if (!link_conf || !mvmvif->link[link_id])
                        continue;
 
                link_conf->he_support = link_sta->he_cap.has_he;
 
                if (is_sta) {
-                       mvmvif->link[i]->he_ru_2mhz_block = false;
+                       mvmvif->link[link_id]->he_ru_2mhz_block = false;
                        if (link_sta->he_cap.has_he)
-                               iwl_mvm_check_he_obss_narrow_bw_ru(hw, vif, i,
+                               iwl_mvm_check_he_obss_narrow_bw_ru(hw, vif,
+                                                                  link_id,
                                                                   link_conf);
                }
        }
@@ -3675,6 +3672,7 @@ iwl_mvm_sta_state_notexist_to_none(struct iwl_mvm *mvm,
                                   struct iwl_mvm_sta_state_ops *callbacks)
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct ieee80211_link_sta *link_sta;
        unsigned int i;
        int ret;
 
@@ -3699,15 +3697,9 @@ iwl_mvm_sta_state_notexist_to_none(struct iwl_mvm *mvm,
                                           NL80211_TDLS_SETUP);
        }
 
-       for (i = 0; i < ARRAY_SIZE(sta->link); i++) {
-               struct ieee80211_link_sta *link_sta;
-
-               link_sta = link_sta_dereference_protected(sta, i);
-               if (!link_sta)
-                       continue;
-
+       for_each_sta_active_link(vif, sta, link_sta, i)
                link_sta->agg.max_rc_amsdu_len = 1;
-       }
+
        ieee80211_sta_recalc_aggregates(sta);
 
        if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls)
@@ -3725,7 +3717,8 @@ iwl_mvm_sta_state_auth_to_assoc(struct ieee80211_hw *hw,
 {
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
        struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
-       unsigned int i;
+       struct ieee80211_link_sta *link_sta;
+       unsigned int link_id;
 
        lockdep_assert_held(&mvm->mutex);
 
@@ -3751,14 +3744,13 @@ iwl_mvm_sta_state_auth_to_assoc(struct ieee80211_hw *hw,
                if (!mvm->mld_api_is_used)
                        goto out;
 
-               for_each_set_bit(i, (unsigned long *)&sta->valid_links,
-                                IEEE80211_MLD_MAX_NUM_LINKS) {
+               for_each_sta_active_link(vif, sta, link_sta, link_id) {
                        struct ieee80211_bss_conf *link_conf =
-                               link_conf_dereference_protected(vif, i);
+                               link_conf_dereference_protected(vif, link_id);
 
                        if (WARN_ON(!link_conf))
                                return -EINVAL;
-                       if (!mvmvif->link[i])
+                       if (!mvmvif->link[link_id])
                                continue;
 
                        iwl_mvm_link_changed(mvm, vif, link_conf,
@@ -3889,6 +3881,9 @@ int iwl_mvm_mac_sta_state_common(struct ieee80211_hw *hw,
                 * from the AP now.
                 */
                iwl_mvm_reset_cca_40mhz_workaround(mvm, vif);
+
+               /* Also free dup data just in case any assertions below fail */
+               kfree(mvm_sta->dup_data);
        }
 
        mutex_lock(&mvm->mutex);
index fbc2d5e..7fb66c5 100644 (file)
@@ -906,11 +906,12 @@ iwl_mvm_mld_change_vif_links(struct ieee80211_hw *hw,
                                n_active++;
                }
 
-               if (vif->type == NL80211_IFTYPE_AP &&
-                   n_active > mvm->fw->ucode_capa.num_beacons)
-                       return -EOPNOTSUPP;
-               else if (n_active > 1)
+               if (vif->type == NL80211_IFTYPE_AP) {
+                       if (n_active > mvm->fw->ucode_capa.num_beacons)
+                               return -EOPNOTSUPP;
+               } else if (n_active > 1) {
                        return -EOPNOTSUPP;
+               }
        }
 
        for (i = 0; i < IEEE80211_MLD_MAX_NUM_LINKS; i++) {
index 0bfdf44..85a4ce8 100644 (file)
@@ -667,15 +667,15 @@ int iwl_mvm_mld_add_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                ret = iwl_mvm_mld_alloc_sta_links(mvm, vif, sta);
                if (ret)
                        return ret;
-       }
 
-       spin_lock_init(&mvm_sta->lock);
+               spin_lock_init(&mvm_sta->lock);
 
-       if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
-               ret = iwl_mvm_alloc_sta_after_restart(mvm, vif, sta);
-       else
                ret = iwl_mvm_sta_init(mvm, vif, sta, IWL_MVM_INVALID_STA,
                                       STATION_TYPE_PEER);
+       } else {
+               ret = iwl_mvm_alloc_sta_after_restart(mvm, vif, sta);
+       }
+
        if (ret)
                goto err;
 
@@ -728,7 +728,7 @@ int iwl_mvm_mld_update_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
        struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
        struct ieee80211_link_sta *link_sta;
        unsigned int link_id;
-       int ret = 0;
+       int ret = -EINVAL;
 
        lockdep_assert_held(&mvm->mutex);
 
@@ -791,8 +791,6 @@ int iwl_mvm_mld_rm_sta(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
 
        lockdep_assert_held(&mvm->mutex);
 
-       kfree(mvm_sta->dup_data);
-
        /* flush its queues here since we are freeing mvm_sta */
        for_each_sta_active_link(vif, sta, link_sta, link_id) {
                struct iwl_mvm_link_sta *mvm_link_sta =
index 6e7470d..9e5008e 100644 (file)
@@ -2347,6 +2347,7 @@ int iwl_mvm_mld_update_sta_keys(struct iwl_mvm *mvm,
                                u32 old_sta_mask,
                                u32 new_sta_mask);
 
+bool iwl_rfi_supported(struct iwl_mvm *mvm);
 int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm,
                            struct iwl_rfi_lut_entry *rfi_table);
 struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm);
index 6d18a1f..fdf60af 100644 (file)
@@ -445,6 +445,11 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
                struct iwl_mcc_update_resp *mcc_resp = (void *)pkt->data;
 
                n_channels =  __le32_to_cpu(mcc_resp->n_channels);
+               if (iwl_rx_packet_payload_len(pkt) !=
+                   struct_size(mcc_resp, channels, n_channels)) {
+                       resp_cp = ERR_PTR(-EINVAL);
+                       goto exit;
+               }
                resp_len = sizeof(struct iwl_mcc_update_resp) +
                           n_channels * sizeof(__le32);
                resp_cp = kmemdup(mcc_resp, resp_len, GFP_KERNEL);
@@ -456,6 +461,11 @@ iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
                struct iwl_mcc_update_resp_v3 *mcc_resp_v3 = (void *)pkt->data;
 
                n_channels =  __le32_to_cpu(mcc_resp_v3->n_channels);
+               if (iwl_rx_packet_payload_len(pkt) !=
+                   struct_size(mcc_resp_v3, channels, n_channels)) {
+                       resp_cp = ERR_PTR(-EINVAL);
+                       goto exit;
+               }
                resp_len = sizeof(struct iwl_mcc_update_resp) +
                           n_channels * sizeof(__le32);
                resp_cp = kzalloc(resp_len, GFP_KERNEL);
index bb77bc9..2ecd32b 100644 (file)
@@ -1,6 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
 /*
- * Copyright (C) 2020 - 2021 Intel Corporation
+ * Copyright (C) 2020 - 2022 Intel Corporation
  */
 
 #include "mvm.h"
@@ -70,6 +70,16 @@ static const struct iwl_rfi_lut_entry iwl_rfi_table[IWL_RFI_LUT_SIZE] = {
                PHY_BAND_6, PHY_BAND_6,}},
 };
 
+bool iwl_rfi_supported(struct iwl_mvm *mvm)
+{
+       /* The feature depends on a platform bugfix, so for now
+        * it's always disabled.
+        * When the platform support detection is implemented we should
+        * check FW TLV and platform support instead.
+        */
+       return false;
+}
+
 int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, struct iwl_rfi_lut_entry *rfi_table)
 {
        int ret;
@@ -81,7 +91,7 @@ int iwl_rfi_send_config_cmd(struct iwl_mvm *mvm, struct iwl_rfi_lut_entry *rfi_t
                .len[0] = sizeof(cmd),
        };
 
-       if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_RFIM_SUPPORT))
+       if (!iwl_rfi_supported(mvm))
                return -EOPNOTSUPP;
 
        lockdep_assert_held(&mvm->mutex);
@@ -113,7 +123,7 @@ struct iwl_rfi_freq_table_resp_cmd *iwl_rfi_get_freq_table(struct iwl_mvm *mvm)
                .flags = CMD_WANT_SKB,
        };
 
-       if (!fw_has_capa(&mvm->fw->ucode_capa, IWL_UCODE_TLV_CAPA_RFIM_SUPPORT))
+       if (!iwl_rfi_supported(mvm))
                return ERR_PTR(-EOPNOTSUPP);
 
        mutex_lock(&mvm->mutex);
index a4c1e3b..23266d0 100644 (file)
@@ -2691,6 +2691,8 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
                return;
 
        lq_sta = mvm_sta;
+
+       spin_lock(&lq_sta->pers.lock);
        iwl_mvm_hwrate_to_tx_rate_v1(lq_sta->last_rate_n_flags,
                                     info->band, &info->control.rates[0]);
        info->control.rates[0].count = 1;
@@ -2705,6 +2707,7 @@ static void rs_drv_get_rate(void *mvm_r, struct ieee80211_sta *sta,
                iwl_mvm_hwrate_to_tx_rate_v1(last_ucode_rate, info->band,
                                             &txrc->reported_rate);
        }
+       spin_unlock(&lq_sta->pers.lock);
 }
 
 static void *rs_drv_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,
index e1d02c2..6226e4e 100644 (file)
@@ -691,6 +691,11 @@ void iwl_mvm_reorder_timer_expired(struct timer_list *t)
 
                rcu_read_lock();
                sta = rcu_dereference(buf->mvm->fw_id_to_mac_id[sta_id]);
+               if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
+                       rcu_read_unlock();
+                       goto out;
+               }
+
                mvmsta = iwl_mvm_sta_from_mac80211(sta);
 
                /* SN is set to the last expired frame + 1 */
@@ -712,6 +717,8 @@ void iwl_mvm_reorder_timer_expired(struct timer_list *t)
                          entries[index].e.reorder_time +
                          1 + RX_REORDER_BUF_TIMEOUT_MQ);
        }
+
+out:
        spin_unlock(&buf->lock);
 }
 
@@ -2512,7 +2519,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                                RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
                                /* Unblock BCAST / MCAST station */
                                iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);
-                               cancel_delayed_work_sync(&mvm->cs_tx_unblock_dwork);
+                               cancel_delayed_work(&mvm->cs_tx_unblock_dwork);
                        }
                }
 
index 5469d63..05a54a6 100644 (file)
@@ -281,7 +281,7 @@ static void iwl_mvm_rx_agg_session_expired(struct timer_list *t)
         * A-MDPU and hence the timer continues to run. Then, the
         * timer expires and sta is NULL.
         */
-       if (!sta)
+       if (IS_ERR_OR_NULL(sta))
                goto unlock;
 
        mvm_sta = iwl_mvm_sta_from_mac80211(sta);
@@ -2089,9 +2089,6 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
 
        lockdep_assert_held(&mvm->mutex);
 
-       if (iwl_mvm_has_new_rx_api(mvm))
-               kfree(mvm_sta->dup_data);
-
        ret = iwl_mvm_drain_sta(mvm, mvm_sta, true);
        if (ret)
                return ret;
@@ -3785,6 +3782,9 @@ static inline u8 *iwl_mvm_get_mac_addr(struct iwl_mvm *mvm,
                u8 sta_id = mvmvif->deflink.ap_sta_id;
                sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
                                                lockdep_is_held(&mvm->mutex));
+               if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta)))
+                       return NULL;
+
                return sta->addr;
        }
 
@@ -3822,6 +3822,11 @@ static int __iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
 
        if (keyconf->cipher == WLAN_CIPHER_SUITE_TKIP) {
                addr = iwl_mvm_get_mac_addr(mvm, vif, sta);
+               if (!addr) {
+                       IWL_ERR(mvm, "Failed to find mac address\n");
+                       return -EINVAL;
+               }
+
                /* get phase 1 key from mac80211 */
                ieee80211_get_key_rx_seq(keyconf, 0, &seq);
                ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k);
index 10d7178..00719e1 100644 (file)
@@ -1875,7 +1875,7 @@ static void iwl_mvm_rx_tx_cmd_agg(struct iwl_mvm *mvm,
        mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, sta_id);
 
        sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
-       if (WARN_ON_ONCE(!sta || !sta->wme)) {
+       if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta) || !sta->wme)) {
                rcu_read_unlock();
                return;
        }
index a5ec0f6..fabf637 100644 (file)
@@ -173,7 +173,7 @@ enum {
 #define MT_TXS5_MPDU_TX_CNT            GENMASK(31, 23)
 
 #define MT_TXS6_MPDU_FAIL_CNT          GENMASK(31, 23)
-
+#define MT_TXS7_MPDU_RETRY_BYTE                GENMASK(22, 0)
 #define MT_TXS7_MPDU_RETRY_CNT         GENMASK(31, 23)
 
 /* RXD DW0 */
index ee0fbfc..d39a3cc 100644 (file)
@@ -608,7 +608,8 @@ bool mt76_connac2_mac_fill_txs(struct mt76_dev *dev, struct mt76_wcid *wcid,
        /* PPDU based reporting */
        if (FIELD_GET(MT_TXS0_TXS_FORMAT, txs) > 1) {
                stats->tx_bytes +=
-                       le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_BYTE);
+                       le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_BYTE) -
+                       le32_get_bits(txs_data[7], MT_TXS7_MPDU_RETRY_BYTE);
                stats->tx_packets +=
                        le32_get_bits(txs_data[5], MT_TXS5_MPDU_TX_CNT);
                stats->tx_failed +=
index 130eb7b..39a4a73 100644 (file)
@@ -1088,7 +1088,7 @@ void mt7996_mac_write_txwi(struct mt7996_dev *dev, __le32 *txwi,
                else if (beacon && mvif->beacon_rates_idx)
                        idx = mvif->beacon_rates_idx;
 
-               txwi[6] |= FIELD_PREP(MT_TXD6_TX_RATE, idx);
+               txwi[6] |= cpu_to_le32(FIELD_PREP(MT_TXD6_TX_RATE, idx));
                txwi[3] |= cpu_to_le32(MT_TXD3_BA_DISABLE);
        }
 }
index 8eafbf1..808c1c8 100644 (file)
@@ -1803,6 +1803,7 @@ struct rtl8xxxu_priv {
        u32 rege9c;
        u32 regeb4;
        u32 regebc;
+       u32 regrcr;
        int next_mbox;
        int nr_out_eps;
 
index fd8c8c6..831639d 100644 (file)
@@ -4171,6 +4171,7 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
                RCR_ACCEPT_MGMT_FRAME | RCR_HTC_LOC_CTRL |
                RCR_APPEND_PHYSTAT | RCR_APPEND_ICV | RCR_APPEND_MIC;
        rtl8xxxu_write32(priv, REG_RCR, val32);
+       priv->regrcr = val32;
 
        if (fops->init_reg_rxfltmap) {
                /* Accept all data frames */
@@ -6501,7 +6502,7 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,
                                      unsigned int *total_flags, u64 multicast)
 {
        struct rtl8xxxu_priv *priv = hw->priv;
-       u32 rcr = rtl8xxxu_read32(priv, REG_RCR);
+       u32 rcr = priv->regrcr;
 
        dev_dbg(&priv->udev->dev, "%s: changed_flags %08x, total_flags %08x\n",
                __func__, changed_flags, *total_flags);
@@ -6547,6 +6548,7 @@ static void rtl8xxxu_configure_filter(struct ieee80211_hw *hw,
         */
 
        rtl8xxxu_write32(priv, REG_RCR, rcr);
+       priv->regrcr = rcr;
 
        *total_flags &= (FIF_ALLMULTI | FIF_FCSFAIL | FIF_BCN_PRBRESP_PROMISC |
                         FIF_CONTROL | FIF_OTHER_BSS | FIF_PSPOLL |
index 7aa6eda..a6c024c 100644 (file)
@@ -918,7 +918,7 @@ static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw,
        struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
 
        if (changed & IEEE80211_RC_BW_CHANGED)
-               rtw_update_sta_info(rtwdev, si, true);
+               ieee80211_queue_work(rtwdev->hw, &si->rc_work);
 }
 
 const struct ieee80211_ops rtw_ops = {
index 5bf6b45..d30a191 100644 (file)
@@ -319,6 +319,17 @@ static u8 rtw_acquire_macid(struct rtw_dev *rtwdev)
        return mac_id;
 }
 
+static void rtw_sta_rc_work(struct work_struct *work)
+{
+       struct rtw_sta_info *si = container_of(work, struct rtw_sta_info,
+                                              rc_work);
+       struct rtw_dev *rtwdev = si->rtwdev;
+
+       mutex_lock(&rtwdev->mutex);
+       rtw_update_sta_info(rtwdev, si, true);
+       mutex_unlock(&rtwdev->mutex);
+}
+
 int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
                struct ieee80211_vif *vif)
 {
@@ -329,12 +340,14 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
        if (si->mac_id >= RTW_MAX_MAC_ID_NUM)
                return -ENOSPC;
 
+       si->rtwdev = rtwdev;
        si->sta = sta;
        si->vif = vif;
        si->init_ra_lv = 1;
        ewma_rssi_init(&si->avg_rssi);
        for (i = 0; i < ARRAY_SIZE(sta->txq); i++)
                rtw_txq_init(rtwdev, sta->txq[i]);
+       INIT_WORK(&si->rc_work, rtw_sta_rc_work);
 
        rtw_update_sta_info(rtwdev, si, true);
        rtw_fw_media_status_report(rtwdev, si->mac_id, true);
@@ -353,6 +366,8 @@ void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
        struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
        int i;
 
+       cancel_work_sync(&si->rc_work);
+
        rtw_release_macid(rtwdev, si->mac_id);
        if (fw_exist)
                rtw_fw_media_status_report(rtwdev, si->mac_id, false);
index a563285..9e841f6 100644 (file)
@@ -743,6 +743,7 @@ struct rtw_txq {
 DECLARE_EWMA(rssi, 10, 16);
 
 struct rtw_sta_info {
+       struct rtw_dev *rtwdev;
        struct ieee80211_sta *sta;
        struct ieee80211_vif *vif;
 
@@ -767,6 +768,8 @@ struct rtw_sta_info {
 
        bool use_cfg_mask;
        struct cfg80211_bitrate_mask *mask;
+
+       struct work_struct rc_work;
 };
 
 enum rtw_bfee_role {
index af0459a..06fce7c 100644 (file)
@@ -87,11 +87,6 @@ static void rtw_sdio_writew(struct rtw_dev *rtwdev, u16 val, u32 addr,
        u8 buf[2];
        int i;
 
-       if (rtw_sdio_use_memcpy_io(rtwdev, addr, 2)) {
-               sdio_writew(rtwsdio->sdio_func, val, addr, err_ret);
-               return;
-       }
-
        *(__le16 *)buf = cpu_to_le16(val);
 
        for (i = 0; i < 2; i++) {
@@ -125,9 +120,6 @@ static u16 rtw_sdio_readw(struct rtw_dev *rtwdev, u32 addr, int *err_ret)
        u8 buf[2];
        int i;
 
-       if (rtw_sdio_use_memcpy_io(rtwdev, addr, 2))
-               return sdio_readw(rtwsdio->sdio_func, addr, err_ret);
-
        for (i = 0; i < 2; i++) {
                buf[i] = sdio_readb(rtwsdio->sdio_func, addr + i, err_ret);
                if (*err_ret)
index 30647f0..ad1d795 100644 (file)
@@ -78,7 +78,7 @@ struct rtw_usb {
        u8 pipe_interrupt;
        u8 pipe_in;
        u8 out_ep[RTW_USB_EP_MAX];
-       u8 qsel_to_ep[TX_DESC_QSEL_MAX];
+       int qsel_to_ep[TX_DESC_QSEL_MAX];
        u8 usb_txagg_num;
 
        struct workqueue_struct *txwq, *rxwq;
index b8019cf..512de49 100644 (file)
@@ -1425,6 +1425,8 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
        .wde_size4 = {RTW89_WDE_PG_64, 0, 4096,},
        /* PCIE 64 */
        .wde_size6 = {RTW89_WDE_PG_64, 512, 0,},
+       /* 8852B PCIE SCC */
+       .wde_size7 = {RTW89_WDE_PG_64, 510, 2,},
        /* DLFW */
        .wde_size9 = {RTW89_WDE_PG_64, 0, 1024,},
        /* 8852C DLFW */
@@ -1449,6 +1451,8 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
        .wde_qt4 = {0, 0, 0, 0,},
        /* PCIE 64 */
        .wde_qt6 = {448, 48, 0, 16,},
+       /* 8852B PCIE SCC */
+       .wde_qt7 = {446, 48, 0, 16,},
        /* 8852C DLFW */
        .wde_qt17 = {0, 0, 0,  0,},
        /* 8852C PCIE SCC */
index a8d9847..6ba633c 100644 (file)
@@ -792,6 +792,7 @@ struct rtw89_mac_size_set {
        const struct rtw89_dle_size wde_size0;
        const struct rtw89_dle_size wde_size4;
        const struct rtw89_dle_size wde_size6;
+       const struct rtw89_dle_size wde_size7;
        const struct rtw89_dle_size wde_size9;
        const struct rtw89_dle_size wde_size18;
        const struct rtw89_dle_size wde_size19;
@@ -804,6 +805,7 @@ struct rtw89_mac_size_set {
        const struct rtw89_wde_quota wde_qt0;
        const struct rtw89_wde_quota wde_qt4;
        const struct rtw89_wde_quota wde_qt6;
+       const struct rtw89_wde_quota wde_qt7;
        const struct rtw89_wde_quota wde_qt17;
        const struct rtw89_wde_quota wde_qt18;
        const struct rtw89_ple_quota ple_qt4;
index eaa2ea0..6da1b60 100644 (file)
        RTW8852B_FW_BASENAME "-" __stringify(RTW8852B_FW_FORMAT_MAX) ".bin"
 
 static const struct rtw89_hfc_ch_cfg rtw8852b_hfc_chcfg_pcie[] = {
-       {5, 343, grp_0}, /* ACH 0 */
-       {5, 343, grp_0}, /* ACH 1 */
-       {5, 343, grp_0}, /* ACH 2 */
-       {5, 343, grp_0}, /* ACH 3 */
+       {5, 341, grp_0}, /* ACH 0 */
+       {5, 341, grp_0}, /* ACH 1 */
+       {4, 342, grp_0}, /* ACH 2 */
+       {4, 342, grp_0}, /* ACH 3 */
        {0, 0, grp_0}, /* ACH 4 */
        {0, 0, grp_0}, /* ACH 5 */
        {0, 0, grp_0}, /* ACH 6 */
        {0, 0, grp_0}, /* ACH 7 */
-       {4, 344, grp_0}, /* B0MGQ */
-       {4, 344, grp_0}, /* B0HIQ */
+       {4, 342, grp_0}, /* B0MGQ */
+       {4, 342, grp_0}, /* B0HIQ */
        {0, 0, grp_0}, /* B1MGQ */
        {0, 0, grp_0}, /* B1HIQ */
        {40, 0, 0} /* FWCMDQ */
 };
 
 static const struct rtw89_hfc_pub_cfg rtw8852b_hfc_pubcfg_pcie = {
-       448, /* Group 0 */
+       446, /* Group 0 */
        0, /* Group 1 */
-       448, /* Public Max */
+       446, /* Public Max */
        0 /* WP threshold */
 };
 
@@ -49,13 +49,13 @@ static const struct rtw89_hfc_param_ini rtw8852b_hfc_param_ini_pcie[] = {
 };
 
 static const struct rtw89_dle_mem rtw8852b_dle_mem_pcie[] = {
-       [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size6,
-                          &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt6,
-                          &rtw89_mac_size.wde_qt6, &rtw89_mac_size.ple_qt18,
+       [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size7,
+                          &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt7,
+                          &rtw89_mac_size.wde_qt7, &rtw89_mac_size.ple_qt18,
                           &rtw89_mac_size.ple_qt58},
-       [RTW89_QTA_WOW] = {RTW89_QTA_WOW, &rtw89_mac_size.wde_size6,
-                          &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt6,
-                          &rtw89_mac_size.wde_qt6, &rtw89_mac_size.ple_qt18,
+       [RTW89_QTA_WOW] = {RTW89_QTA_WOW, &rtw89_mac_size.wde_size7,
+                          &rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt7,
+                          &rtw89_mac_size.wde_qt7, &rtw89_mac_size.ple_qt18,
                           &rtw89_mac_size.ple_qt_52b_wow},
        [RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size9,
                            &rtw89_mac_size.ple_size8, &rtw89_mac_size.wde_qt4,
index 9a8faaf..89c7a14 100644 (file)
@@ -5964,10 +5964,11 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info)
                        ret = -ENOMEM;
                        goto out_free;
                }
+               param.pmsr_capa = pmsr_capa;
+
                ret = parse_pmsr_capa(info->attrs[HWSIM_ATTR_PMSR_SUPPORT], pmsr_capa, info);
                if (ret)
                        goto out_free;
-               param.pmsr_capa = pmsr_capa;
        }
 
        ret = mac80211_hwsim_new_radio(info, &param);
index c066b00..829515a 100644 (file)
@@ -565,24 +565,32 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
        struct ipc_mux_config mux_cfg;
        struct iosm_imem *ipc_imem;
        u8 ctrl_chl_idx = 0;
+       int ret;
 
        ipc_imem = container_of(instance, struct iosm_imem, run_state_worker);
 
        if (ipc_imem->phase != IPC_P_RUN) {
                dev_err(ipc_imem->dev,
                        "Modem link down. Exit run state worker.");
-               return;
+               goto err_out;
        }
 
        if (test_and_clear_bit(IOSM_DEVLINK_INIT, &ipc_imem->flag))
                ipc_devlink_deinit(ipc_imem->ipc_devlink);
 
-       if (!ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg))
-               ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem);
+       ret = ipc_imem_setup_cp_mux_cap_init(ipc_imem, &mux_cfg);
+       if (ret < 0)
+               goto err_out;
+
+       ipc_imem->mux = ipc_mux_init(&mux_cfg, ipc_imem);
+       if (!ipc_imem->mux)
+               goto err_out;
+
+       ret = ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol);
+       if (ret < 0)
+               goto err_ipc_mux_deinit;
 
-       ipc_imem_wwan_channel_init(ipc_imem, mux_cfg.protocol);
-       if (ipc_imem->mux)
-               ipc_imem->mux->wwan = ipc_imem->wwan;
+       ipc_imem->mux->wwan = ipc_imem->wwan;
 
        while (ctrl_chl_idx < IPC_MEM_MAX_CHANNELS) {
                if (!ipc_chnl_cfg_get(&chnl_cfg_port, ctrl_chl_idx)) {
@@ -622,6 +630,13 @@ static void ipc_imem_run_state_worker(struct work_struct *instance)
 
        /* Complete all memory stores after setting bit */
        smp_mb__after_atomic();
+
+       return;
+
+err_ipc_mux_deinit:
+       ipc_mux_deinit(ipc_imem->mux);
+err_out:
+       ipc_uevent_send(ipc_imem->dev, UEVENT_CD_READY_LINK_DOWN);
 }
 
 static void ipc_imem_handle_irq(struct iosm_imem *ipc_imem, int irq)
index 66b90cc..109cf89 100644 (file)
@@ -77,8 +77,8 @@ out:
 }
 
 /* Initialize wwan channel */
-void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
-                               enum ipc_mux_protocol mux_type)
+int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+                              enum ipc_mux_protocol mux_type)
 {
        struct ipc_chnl_cfg chnl_cfg = { 0 };
 
@@ -87,7 +87,7 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
        /* If modem version is invalid (0xffffffff), do not initialize WWAN. */
        if (ipc_imem->cp_version == -1) {
                dev_err(ipc_imem->dev, "invalid CP version");
-               return;
+               return -EIO;
        }
 
        ipc_chnl_cfg_get(&chnl_cfg, ipc_imem->nr_of_channels);
@@ -104,9 +104,13 @@ void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
 
        /* WWAN registration. */
        ipc_imem->wwan = ipc_wwan_init(ipc_imem, ipc_imem->dev);
-       if (!ipc_imem->wwan)
+       if (!ipc_imem->wwan) {
                dev_err(ipc_imem->dev,
                        "failed to register the ipc_wwan interfaces");
+               return -ENOMEM;
+       }
+
+       return 0;
 }
 
 /* Map SKB to DMA for transfer */
index f8afb21..026c5bd 100644 (file)
@@ -91,9 +91,11 @@ int ipc_imem_sys_wwan_transmit(struct iosm_imem *ipc_imem, int if_id,
  *                             MUX.
  * @ipc_imem:          Pointer to iosm_imem struct.
  * @mux_type:          Type of mux protocol.
+ *
+ * Return: 0 on success and failure value on error
  */
-void ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
-                               enum ipc_mux_protocol mux_type);
+int ipc_imem_wwan_channel_init(struct iosm_imem *ipc_imem,
+                              enum ipc_mux_protocol mux_type);
 
 /**
  * ipc_imem_sys_devlink_open - Open a Flash/CD Channel link to CP
index 226fc17..91256e0 100644 (file)
@@ -45,6 +45,7 @@
 #define T7XX_PCI_IREG_BASE             0
 #define T7XX_PCI_EREG_BASE             2
 
+#define T7XX_INIT_TIMEOUT              20
 #define PM_SLEEP_DIS_TIMEOUT_MS                20
 #define PM_ACK_TIMEOUT_MS              1500
 #define PM_AUTOSUSPEND_MS              20000
@@ -96,6 +97,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev)
        spin_lock_init(&t7xx_dev->md_pm_lock);
        init_completion(&t7xx_dev->sleep_lock_acquire);
        init_completion(&t7xx_dev->pm_sr_ack);
+       init_completion(&t7xx_dev->init_done);
        atomic_set(&t7xx_dev->md_pm_state, MTK_PM_INIT);
 
        device_init_wakeup(&pdev->dev, true);
@@ -124,6 +126,7 @@ void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_dev)
        pm_runtime_mark_last_busy(&t7xx_dev->pdev->dev);
        pm_runtime_allow(&t7xx_dev->pdev->dev);
        pm_runtime_put_noidle(&t7xx_dev->pdev->dev);
+       complete_all(&t7xx_dev->init_done);
 }
 
 static int t7xx_pci_pm_reinit(struct t7xx_pci_dev *t7xx_dev)
@@ -529,6 +532,20 @@ static void t7xx_pci_shutdown(struct pci_dev *pdev)
        __t7xx_pci_pm_suspend(pdev);
 }
 
+static int t7xx_pci_pm_prepare(struct device *dev)
+{
+       struct pci_dev *pdev = to_pci_dev(dev);
+       struct t7xx_pci_dev *t7xx_dev;
+
+       t7xx_dev = pci_get_drvdata(pdev);
+       if (!wait_for_completion_timeout(&t7xx_dev->init_done, T7XX_INIT_TIMEOUT * HZ)) {
+               dev_warn(dev, "Not ready for system sleep.\n");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
 static int t7xx_pci_pm_suspend(struct device *dev)
 {
        return __t7xx_pci_pm_suspend(to_pci_dev(dev));
@@ -555,6 +572,7 @@ static int t7xx_pci_pm_runtime_resume(struct device *dev)
 }
 
 static const struct dev_pm_ops t7xx_pci_pm_ops = {
+       .prepare = t7xx_pci_pm_prepare,
        .suspend = t7xx_pci_pm_suspend,
        .resume = t7xx_pci_pm_resume,
        .resume_noirq = t7xx_pci_pm_resume_noirq,
index 112efa5..f08f1ab 100644 (file)
@@ -69,6 +69,7 @@ struct t7xx_pci_dev {
        struct t7xx_modem       *md;
        struct t7xx_ccmni_ctrl  *ccmni_ctlb;
        bool                    rgu_pci_irq_en;
+       struct completion       init_done;
 
        /* Low Power Items */
        struct list_head        md_pm_entities;
index ccb6eb1..1f0cbb7 100644 (file)
@@ -3585,6 +3585,9 @@ static ssize_t nvme_sysfs_delete(struct device *dev,
 {
        struct nvme_ctrl *ctrl = dev_get_drvdata(dev);
 
+       if (!test_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags))
+               return -EBUSY;
+
        if (device_remove_file_self(dev, attr))
                nvme_delete_ctrl_sync(ctrl);
        return count;
@@ -5045,7 +5048,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)
         * that were missed. We identify persistent discovery controllers by
         * checking that they started once before, hence are reconnecting back.
         */
-       if (test_and_set_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags) &&
+       if (test_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags) &&
            nvme_discovery_ctrl(ctrl))
                nvme_change_uevent(ctrl, "NVME_EVENT=rediscover");
 
@@ -5056,6 +5059,7 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)
        }
 
        nvme_change_uevent(ctrl, "NVME_EVENT=connected");
+       set_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags);
 }
 EXPORT_SYMBOL_GPL(nvme_start_ctrl);
 
index 9e6e56c..316f3e4 100644 (file)
@@ -163,7 +163,9 @@ static umode_t nvme_hwmon_is_visible(const void *_data,
        case hwmon_temp_max:
        case hwmon_temp_min:
                if ((!channel && data->ctrl->wctemp) ||
-                   (channel && data->log->temp_sensor[channel - 1])) {
+                   (channel && data->log->temp_sensor[channel - 1] &&
+                    !(data->ctrl->quirks &
+                      NVME_QUIRK_NO_SECONDARY_TEMP_THRESH))) {
                        if (data->ctrl->quirks &
                            NVME_QUIRK_NO_TEMP_THRESH_CHANGE)
                                return 0444;
index 9171452..2bc159a 100644 (file)
@@ -884,7 +884,6 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)
 {
        if (!head->disk)
                return;
-       blk_mark_disk_dead(head->disk);
        /* make sure all pending bios are cleaned up */
        kblockd_schedule_work(&head->requeue_work);
        flush_work(&head->requeue_work);
index bf46f12..a2d4f59 100644 (file)
@@ -149,6 +149,11 @@ enum nvme_quirks {
         * Reports garbage in the namespace identifiers (eui64, nguid, uuid).
         */
        NVME_QUIRK_BOGUS_NID                    = (1 << 18),
+
+       /*
+        * No temperature thresholds for channels other than 0 (Composite).
+        */
+       NVME_QUIRK_NO_SECONDARY_TEMP_THRESH     = (1 << 19),
 };
 
 /*
index 7f25c0f..3224458 100644 (file)
@@ -2956,7 +2956,7 @@ static struct nvme_dev *nvme_pci_alloc_dev(struct pci_dev *pdev,
         * over a single page.
         */
        dev->ctrl.max_hw_sectors = min_t(u32,
-               NVME_MAX_KB_SZ << 1, dma_max_mapping_size(&pdev->dev) >> 9);
+               NVME_MAX_KB_SZ << 1, dma_opt_mapping_size(&pdev->dev) >> 9);
        dev->ctrl.max_segments = NVME_MAX_SEGS;
 
        /*
@@ -3402,6 +3402,8 @@ static const struct pci_device_id nvme_id_table[] = {
                .driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
        { PCI_DEVICE(0x2646, 0x2263),   /* KINGSTON A2000 NVMe SSD  */
                .driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
+       { PCI_DEVICE(0x2646, 0x5013),   /* Kingston KC3000, Kingston FURY Renegade */
+               .driver_data = NVME_QUIRK_NO_SECONDARY_TEMP_THRESH, },
        { PCI_DEVICE(0x2646, 0x5018),   /* KINGSTON OM8SFP4xxxxP OS21012 NVMe SSD */
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
        { PCI_DEVICE(0x2646, 0x5016),   /* KINGSTON OM3PGP4xxxxP OS21011 NVMe SSD */
@@ -3441,6 +3443,10 @@ static const struct pci_device_id nvme_id_table[] = {
                                NVME_QUIRK_IGNORE_DEV_SUBNQN, },
        { PCI_DEVICE(0x10ec, 0x5763), /* TEAMGROUP T-FORCE CARDEA ZERO Z330 SSD */
                .driver_data = NVME_QUIRK_BOGUS_NID, },
+       { PCI_DEVICE(0x1e4b, 0x1602), /* HS-SSD-FUTURE 2048G  */
+               .driver_data = NVME_QUIRK_BOGUS_NID, },
+       { PCI_DEVICE(0x10ec, 0x5765), /* TEAMGROUP MP33 2TB SSD */
+               .driver_data = NVME_QUIRK_BOGUS_NID, },
        { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0061),
                .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
        { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0x0065),
index ade1369..113c509 100644 (file)
@@ -127,6 +127,8 @@ static int prepare_itcw(struct itcw *, unsigned int, unsigned int, int,
                        struct dasd_device *, struct dasd_device *,
                        unsigned int, int, unsigned int, unsigned int,
                        unsigned int, unsigned int);
+static int dasd_eckd_query_pprc_status(struct dasd_device *,
+                                      struct dasd_pprc_data_sc4 *);
 
 /* initial attempt at a probe function. this can be simplified once
  * the other detection code is gone */
@@ -3733,6 +3735,26 @@ static int count_exts(unsigned int from, unsigned int to, int trks_per_ext)
        return count;
 }
 
+static int dasd_in_copy_relation(struct dasd_device *device)
+{
+       struct dasd_pprc_data_sc4 *temp;
+       int rc;
+
+       if (!dasd_eckd_pprc_enabled(device))
+               return 0;
+
+       temp = kzalloc(sizeof(*temp), GFP_KERNEL);
+       if (!temp)
+               return -ENOMEM;
+
+       rc = dasd_eckd_query_pprc_status(device, temp);
+       if (!rc)
+               rc = temp->dev_info[0].state;
+
+       kfree(temp);
+       return rc;
+}
+
 /*
  * Release allocated space for a given range or an entire volume.
  */
@@ -3749,6 +3771,7 @@ dasd_eckd_dso_ras(struct dasd_device *device, struct dasd_block *block,
        int cur_to_trk, cur_from_trk;
        struct dasd_ccw_req *cqr;
        u32 beg_cyl, end_cyl;
+       int copy_relation;
        struct ccw1 *ccw;
        int trks_per_ext;
        size_t ras_size;
@@ -3760,6 +3783,10 @@ dasd_eckd_dso_ras(struct dasd_device *device, struct dasd_block *block,
        if (dasd_eckd_ras_sanity_checks(device, first_trk, last_trk))
                return ERR_PTR(-EINVAL);
 
+       copy_relation = dasd_in_copy_relation(device);
+       if (copy_relation < 0)
+               return ERR_PTR(copy_relation);
+
        rq = req ? blk_mq_rq_to_pdu(req) : NULL;
 
        features = &private->features;
@@ -3788,9 +3815,11 @@ dasd_eckd_dso_ras(struct dasd_device *device, struct dasd_block *block,
        /*
         * This bit guarantees initialisation of tracks within an extent that is
         * not fully specified, but is only supported with a certain feature
-        * subset.
+        * subset and for devices not in a copy relation.
         */
-       ras_data->op_flags.guarantee_init = !!(features->feature[56] & 0x01);
+       if (features->feature[56] & 0x01 && !copy_relation)
+               ras_data->op_flags.guarantee_init = 1;
+
        ras_data->lss = private->conf.ned->ID;
        ras_data->dev_addr = private->conf.ned->unit_addr;
        ras_data->nr_exts = nr_exts;
index 8eb089b..d5c43e9 100644 (file)
@@ -1111,6 +1111,8 @@ static void io_subchannel_verify(struct subchannel *sch)
        cdev = sch_get_cdev(sch);
        if (cdev)
                dev_fsm_event(cdev, DEV_EVENT_VERIFY);
+       else
+               css_schedule_eval(sch->schid);
 }
 
 static void io_subchannel_terminate_path(struct subchannel *sch, u8 mask)
index 5ea6249..641f0db 100644 (file)
@@ -95,7 +95,7 @@ static inline int do_sqbs(u64 token, unsigned char state, int queue,
                "       lgr     1,%[token]\n"
                "       .insn   rsy,0xeb000000008a,%[qs],%[ccq],0(%[state])"
                : [ccq] "+&d" (_ccq), [qs] "+&d" (_queuestart)
-               : [state] "d" ((unsigned long)state), [token] "d" (token)
+               : [state] "a" ((unsigned long)state), [token] "d" (token)
                : "memory", "cc", "1");
        *count = _ccq & 0xff;
        *start = _queuestart & 0xff;
index 5a05d1c..a8def50 100644 (file)
@@ -1293,6 +1293,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,
                        return PTR_ERR(kkey);
                rc = pkey_keyblob2pkey(kkey, ktp.keylen, &ktp.protkey);
                DEBUG_DBG("%s pkey_keyblob2pkey()=%d\n", __func__, rc);
+               memzero_explicit(kkey, ktp.keylen);
                kfree(kkey);
                if (rc)
                        break;
@@ -1426,6 +1427,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,
                                        kkey, ktp.keylen, &ktp.protkey);
                DEBUG_DBG("%s pkey_keyblob2pkey2()=%d\n", __func__, rc);
                kfree(apqns);
+               memzero_explicit(kkey, ktp.keylen);
                kfree(kkey);
                if (rc)
                        break;
@@ -1552,6 +1554,7 @@ static long pkey_unlocked_ioctl(struct file *filp, unsigned int cmd,
                                        protkey, &protkeylen);
                DEBUG_DBG("%s pkey_keyblob2pkey3()=%d\n", __func__, rc);
                kfree(apqns);
+               memzero_explicit(kkey, ktp.keylen);
                kfree(kkey);
                if (rc) {
                        kfree(protkey);
index b7c569a..0226c92 100644 (file)
@@ -1463,6 +1463,8 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
        struct Scsi_Host *host = cmd->device->host;
        int rtn = 0;
 
+       atomic_inc(&cmd->device->iorequest_cnt);
+
        /* check if the device is still usable */
        if (unlikely(cmd->device->sdev_state == SDEV_DEL)) {
                /* in SDEV_DEL we error all commands. DID_NO_CONNECT
@@ -1483,6 +1485,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
                 */
                SCSI_LOG_MLQUEUE(3, scmd_printk(KERN_INFO, cmd,
                        "queuecommand : device blocked\n"));
+               atomic_dec(&cmd->device->iorequest_cnt);
                return SCSI_MLQUEUE_DEVICE_BUSY;
        }
 
@@ -1515,6 +1518,7 @@ static int scsi_dispatch_cmd(struct scsi_cmnd *cmd)
        trace_scsi_dispatch_cmd_start(cmd);
        rtn = host->hostt->queuecommand(host, cmd);
        if (rtn) {
+               atomic_dec(&cmd->device->iorequest_cnt);
                trace_scsi_dispatch_cmd_error(cmd, rtn);
                if (rtn != SCSI_MLQUEUE_DEVICE_BUSY &&
                    rtn != SCSI_MLQUEUE_TARGET_BUSY)
@@ -1761,7 +1765,6 @@ static blk_status_t scsi_queue_rq(struct blk_mq_hw_ctx *hctx,
                goto out_dec_host_busy;
        }
 
-       atomic_inc(&cmd->device->iorequest_cnt);
        return BLK_STS_OK;
 
 out_dec_host_busy:
index d9ce379..e6bc622 100644 (file)
@@ -1780,7 +1780,7 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
 
        length = scsi_bufflen(scmnd);
        payload = (struct vmbus_packet_mpb_array *)&cmd_request->mpb;
-       payload_sz = sizeof(cmd_request->mpb);
+       payload_sz = 0;
 
        if (scsi_sg_count(scmnd)) {
                unsigned long offset_in_hvpg = offset_in_hvpage(sgl->offset);
@@ -1789,10 +1789,10 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
                unsigned long hvpfn, hvpfns_to_add;
                int j, i = 0, sg_count;
 
-               if (hvpg_count > MAX_PAGE_BUFFER_COUNT) {
+               payload_sz = (hvpg_count * sizeof(u64) +
+                             sizeof(struct vmbus_packet_mpb_array));
 
-                       payload_sz = (hvpg_count * sizeof(u64) +
-                                     sizeof(struct vmbus_packet_mpb_array));
+               if (hvpg_count > MAX_PAGE_BUFFER_COUNT) {
                        payload = kzalloc(payload_sz, GFP_ATOMIC);
                        if (!payload)
                                return SCSI_MLQUEUE_DEVICE_BUSY;
index d76e923..c0aee5d 100644 (file)
@@ -54,6 +54,21 @@ static int ring_interrupt_index(const struct tb_ring *ring)
        return bit;
 }
 
+static void nhi_mask_interrupt(struct tb_nhi *nhi, int mask, int ring)
+{
+       if (nhi->quirks & QUIRK_AUTO_CLEAR_INT)
+               return;
+       iowrite32(mask, nhi->iobase + REG_RING_INTERRUPT_MASK_CLEAR_BASE + ring);
+}
+
+static void nhi_clear_interrupt(struct tb_nhi *nhi, int ring)
+{
+       if (nhi->quirks & QUIRK_AUTO_CLEAR_INT)
+               ioread32(nhi->iobase + REG_RING_NOTIFY_BASE + ring);
+       else
+               iowrite32(~0, nhi->iobase + REG_RING_INT_CLEAR + ring);
+}
+
 /*
  * ring_interrupt_active() - activate/deactivate interrupts for a single ring
  *
@@ -61,8 +76,8 @@ static int ring_interrupt_index(const struct tb_ring *ring)
  */
 static void ring_interrupt_active(struct tb_ring *ring, bool active)
 {
-       int reg = REG_RING_INTERRUPT_BASE +
-                 ring_interrupt_index(ring) / 32 * 4;
+       int index = ring_interrupt_index(ring) / 32 * 4;
+       int reg = REG_RING_INTERRUPT_BASE + index;
        int interrupt_bit = ring_interrupt_index(ring) & 31;
        int mask = 1 << interrupt_bit;
        u32 old, new;
@@ -123,7 +138,11 @@ static void ring_interrupt_active(struct tb_ring *ring, bool active)
                                         "interrupt for %s %d is already %s\n",
                                         RING_TYPE(ring), ring->hop,
                                         active ? "enabled" : "disabled");
-       iowrite32(new, ring->nhi->iobase + reg);
+
+       if (active)
+               iowrite32(new, ring->nhi->iobase + reg);
+       else
+               nhi_mask_interrupt(ring->nhi, mask, index);
 }
 
 /*
@@ -136,11 +155,11 @@ static void nhi_disable_interrupts(struct tb_nhi *nhi)
        int i = 0;
        /* disable interrupts */
        for (i = 0; i < RING_INTERRUPT_REG_COUNT(nhi); i++)
-               iowrite32(0, nhi->iobase + REG_RING_INTERRUPT_BASE + 4 * i);
+               nhi_mask_interrupt(nhi, ~0, 4 * i);
 
        /* clear interrupt status bits */
        for (i = 0; i < RING_NOTIFY_REG_COUNT(nhi); i++)
-               ioread32(nhi->iobase + REG_RING_NOTIFY_BASE + 4 * i);
+               nhi_clear_interrupt(nhi, 4 * i);
 }
 
 /* ring helper methods */
index faef165..6ba2958 100644 (file)
@@ -93,6 +93,8 @@ struct ring_desc {
 #define REG_RING_INTERRUPT_BASE        0x38200
 #define RING_INTERRUPT_REG_COUNT(nhi) ((31 + 2 * nhi->hop_count) / 32)
 
+#define REG_RING_INTERRUPT_MASK_CLEAR_BASE     0x38208
+
 #define REG_INT_THROTTLING_RATE        0x38c00
 
 /* Interrupt Vector Allocation */
index f801b1f..af0e1c0 100644 (file)
@@ -1012,7 +1012,7 @@ static int brcmuart_probe(struct platform_device *pdev)
        of_property_read_u32(np, "clock-frequency", &clk_rate);
 
        /* See if a Baud clock has been specified */
-       baud_mux_clk = of_clk_get_by_name(np, "sw_baud");
+       baud_mux_clk = devm_clk_get(dev, "sw_baud");
        if (IS_ERR(baud_mux_clk)) {
                if (PTR_ERR(baud_mux_clk) == -EPROBE_DEFER) {
                        ret = -EPROBE_DEFER;
@@ -1032,7 +1032,7 @@ static int brcmuart_probe(struct platform_device *pdev)
        if (clk_rate == 0) {
                dev_err(dev, "clock-frequency or clk not defined\n");
                ret = -EINVAL;
-               goto release_dma;
+               goto err_clk_disable;
        }
 
        dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not ");
@@ -1119,6 +1119,8 @@ err1:
        serial8250_unregister_port(priv->line);
 err:
        brcmuart_free_bufs(dev, priv);
+err_clk_disable:
+       clk_disable_unprepare(baud_mux_clk);
 release_dma:
        if (priv->dma_enabled)
                brcmuart_arbitration(priv, 0);
@@ -1133,6 +1135,7 @@ static int brcmuart_remove(struct platform_device *pdev)
        hrtimer_cancel(&priv->hrt);
        serial8250_unregister_port(priv->line);
        brcmuart_free_bufs(&pdev->dev, priv);
+       clk_disable_unprepare(priv->baud_mux_clk);
        if (priv->dma_enabled)
                brcmuart_arbitration(priv, 0);
        return 0;
index 64770c6..b406cba 100644 (file)
 #define PCI_DEVICE_ID_COMMTECH_4224PCIE                0x0020
 #define PCI_DEVICE_ID_COMMTECH_4228PCIE                0x0021
 #define PCI_DEVICE_ID_COMMTECH_4222PCIE                0x0022
+
 #define PCI_DEVICE_ID_EXAR_XR17V4358           0x4358
 #define PCI_DEVICE_ID_EXAR_XR17V8358           0x8358
 
+#define PCI_SUBDEVICE_ID_USR_2980              0x0128
+#define PCI_SUBDEVICE_ID_USR_2981              0x0129
+
 #define PCI_DEVICE_ID_SEALEVEL_710xC           0x1001
 #define PCI_DEVICE_ID_SEALEVEL_720xC           0x1002
 #define PCI_DEVICE_ID_SEALEVEL_740xC           0x1004
@@ -829,6 +833,15 @@ static const struct exar8250_board pbn_exar_XR17V8358 = {
                (kernel_ulong_t)&bd                     \
        }
 
+#define USR_DEVICE(devid, sdevid, bd) {                        \
+       PCI_DEVICE_SUB(                                 \
+               PCI_VENDOR_ID_USR,                      \
+               PCI_DEVICE_ID_EXAR_##devid,             \
+               PCI_VENDOR_ID_EXAR,                     \
+               PCI_SUBDEVICE_ID_USR_##sdevid), 0, 0,   \
+               (kernel_ulong_t)&bd                     \
+       }
+
 static const struct pci_device_id exar_pci_tbl[] = {
        EXAR_DEVICE(ACCESSIO, COM_2S, pbn_exar_XR17C15x),
        EXAR_DEVICE(ACCESSIO, COM_4S, pbn_exar_XR17C15x),
@@ -853,6 +866,10 @@ static const struct pci_device_id exar_pci_tbl[] = {
 
        IBM_DEVICE(XR17C152, SATURN_SERIAL_ONE_PORT, pbn_exar_ibm_saturn),
 
+       /* USRobotics USR298x-OEM PCI Modems */
+       USR_DEVICE(XR17C152, 2980, pbn_exar_XR17C15x),
+       USR_DEVICE(XR17C152, 2981, pbn_exar_XR17C15x),
+
        /* Exar Corp. XR17C15[248] Dual/Quad/Octal UART */
        EXAR_DEVICE(EXAR, XR17C152, pbn_exar_XR17C15x),
        EXAR_DEVICE(EXAR, XR17C154, pbn_exar_XR17C15x),
index c55be6f..e80c4f6 100644 (file)
@@ -1920,6 +1920,8 @@ pci_moxa_setup(struct serial_private *priv,
 #define PCI_SUBDEVICE_ID_SIIG_DUAL_30  0x2530
 #define PCI_VENDOR_ID_ADVANTECH                0x13fe
 #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66
+#define PCI_DEVICE_ID_ADVANTECH_PCI1600        0x1600
+#define PCI_DEVICE_ID_ADVANTECH_PCI1600_1611   0x1611
 #define PCI_DEVICE_ID_ADVANTECH_PCI3620        0x3620
 #define PCI_DEVICE_ID_ADVANTECH_PCI3618        0x3618
 #define PCI_DEVICE_ID_ADVANTECH_PCIf618        0xf618
@@ -4085,6 +4087,9 @@ static SIMPLE_DEV_PM_OPS(pciserial_pm_ops, pciserial_suspend_one,
                         pciserial_resume_one);
 
 static const struct pci_device_id serial_pci_tbl[] = {
+       {       PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI1600,
+               PCI_DEVICE_ID_ADVANTECH_PCI1600_1611, PCI_ANY_ID, 0, 0,
+               pbn_b0_4_921600 },
        /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
        {       PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
                PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
index fe8d79c..c153ba3 100644 (file)
@@ -669,6 +669,7 @@ EXPORT_SYMBOL_GPL(serial8250_em485_supported);
 /**
  * serial8250_em485_config() - generic ->rs485_config() callback
  * @port: uart port
+ * @termios: termios structure
  * @rs485: rs485 settings
  *
  * Generic callback usable by 8250 uart drivers to activate rs485 settings
index 59e25f2..4b2512e 100644 (file)
@@ -606,10 +606,11 @@ static int arc_serial_probe(struct platform_device *pdev)
        }
        uart->baud = val;
 
-       port->membase = of_iomap(np, 0);
-       if (!port->membase)
+       port->membase = devm_platform_ioremap_resource(pdev, 0);
+       if (IS_ERR(port->membase)) {
                /* No point of dev_err since UART itself is hosed here */
-               return -ENXIO;
+               return PTR_ERR(port->membase);
+       }
 
        port->irq = irq_of_parse_and_map(np, 0);
 
index 08dc3e2..8582479 100644 (file)
@@ -1664,19 +1664,18 @@ static int qcom_geni_serial_probe(struct platform_device *pdev)
        uport->private_data = &port->private_data;
        platform_set_drvdata(pdev, port);
 
-       ret = uart_add_one_port(drv, uport);
-       if (ret)
-               return ret;
-
        irq_set_status_flags(uport->irq, IRQ_NOAUTOEN);
        ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr,
                        IRQF_TRIGGER_HIGH, port->name, uport);
        if (ret) {
                dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret);
-               uart_remove_one_port(drv, uport);
                return ret;
        }
 
+       ret = uart_add_one_port(drv, uport);
+       if (ret)
+               return ret;
+
        /*
         * Set pm_runtime status as ACTIVE so that wakeup_irq gets
         * enabled/disabled from dev_pm_arm_wake_irq during system
index 498ba9c..829c4be 100644 (file)
@@ -656,10 +656,17 @@ vcs_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
                        }
                }
 
-               /* The vcs_size might have changed while we slept to grab
-                * the user buffer, so recheck.
+               /* The vc might have been freed or vcs_size might have changed
+                * while we slept to grab the user buffer, so recheck.
                 * Return data written up to now on failure.
                 */
+               vc = vcs_vc(inode, &viewed);
+               if (!vc) {
+                       if (written)
+                               break;
+                       ret = -ENXIO;
+                       goto unlock_out;
+               }
                size = vcs_size(vc, attr, false);
                if (size < 0) {
                        if (written)
index 202ff71..51b3c6a 100644 (file)
@@ -150,7 +150,8 @@ static int ufshcd_mcq_config_nr_queues(struct ufs_hba *hba)
        u32 hba_maxq, rem, tot_queues;
        struct Scsi_Host *host = hba->host;
 
-       hba_maxq = FIELD_GET(MAX_QUEUE_SUP, hba->mcq_capabilities);
+       /* maxq is 0 based value */
+       hba_maxq = FIELD_GET(MAX_QUEUE_SUP, hba->mcq_capabilities) + 1;
 
        tot_queues = UFS_MCQ_NUM_DEV_CMD_QUEUES + read_queues + poll_queues +
                        rw_queues;
@@ -265,7 +266,7 @@ static int ufshcd_mcq_get_tag(struct ufs_hba *hba,
        addr = (le64_to_cpu(cqe->command_desc_base_addr) & CQE_UCD_BA) -
                hba->ucdl_dma_addr;
 
-       return div_u64(addr, sizeof(struct utp_transfer_cmd_desc));
+       return div_u64(addr, ufshcd_get_ucd_size(hba));
 }
 
 static void ufshcd_mcq_process_cqe(struct ufs_hba *hba,
index 17d7bb8..e7e79f5 100644 (file)
@@ -2849,10 +2849,10 @@ static void ufshcd_map_queues(struct Scsi_Host *shost)
 static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
 {
        struct utp_transfer_cmd_desc *cmd_descp = (void *)hba->ucdl_base_addr +
-               i * sizeof_utp_transfer_cmd_desc(hba);
+               i * ufshcd_get_ucd_size(hba);
        struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
        dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr +
-               i * sizeof_utp_transfer_cmd_desc(hba);
+               i * ufshcd_get_ucd_size(hba);
        u16 response_offset = offsetof(struct utp_transfer_cmd_desc,
                                       response_upiu);
        u16 prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
@@ -3761,7 +3761,7 @@ static int ufshcd_memory_alloc(struct ufs_hba *hba)
        size_t utmrdl_size, utrdl_size, ucdl_size;
 
        /* Allocate memory for UTP command descriptors */
-       ucdl_size = sizeof_utp_transfer_cmd_desc(hba) * hba->nutrs;
+       ucdl_size = ufshcd_get_ucd_size(hba) * hba->nutrs;
        hba->ucdl_base_addr = dmam_alloc_coherent(hba->dev,
                                                  ucdl_size,
                                                  &hba->ucdl_dma_addr,
@@ -3861,7 +3861,7 @@ static void ufshcd_host_memory_configure(struct ufs_hba *hba)
        prdt_offset =
                offsetof(struct utp_transfer_cmd_desc, prd_table);
 
-       cmd_desc_size = sizeof_utp_transfer_cmd_desc(hba);
+       cmd_desc_size = ufshcd_get_ucd_size(hba);
        cmd_desc_dma_addr = hba->ucdl_dma_addr;
 
        for (i = 0; i < hba->nutrs; i++) {
@@ -8452,7 +8452,7 @@ static void ufshcd_release_sdb_queue(struct ufs_hba *hba, int nutrs)
 {
        size_t ucdl_size, utrdl_size;
 
-       ucdl_size = sizeof(struct utp_transfer_cmd_desc) * nutrs;
+       ucdl_size = ufshcd_get_ucd_size(hba) * nutrs;
        dmam_free_coherent(hba->dev, ucdl_size, hba->ucdl_base_addr,
                           hba->ucdl_dma_addr);
 
@@ -9459,8 +9459,16 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
                         * that performance might be impacted.
                         */
                        ret = ufshcd_urgent_bkops(hba);
-                       if (ret)
+                       if (ret) {
+                               /*
+                                * If return err in suspend flow, IO will hang.
+                                * Trigger error handler and break suspend for
+                                * error recovery.
+                                */
+                               ufshcd_force_error_recovery(hba);
+                               ret = -EBUSY;
                                goto enable_scaling;
+                       }
                } else {
                        /* make sure that auto bkops is disabled */
                        ufshcd_disable_auto_bkops(hba);
index 4bb6d30..311007b 100644 (file)
@@ -1928,6 +1928,8 @@ static int usbtmc_ioctl_request(struct usbtmc_device_data *data,
 
        if (request.req.wLength > USBTMC_BUFSIZE)
                return -EMSGSIZE;
+       if (request.req.wLength == 0)   /* Length-0 requests are never IN */
+               request.req.bRequestType &= ~USB_DIR_IN;
 
        is_in = request.req.bRequestType & USB_DIR_IN;
 
index 0beaab9..7b2ce01 100644 (file)
@@ -1137,7 +1137,7 @@ static int dwc3_core_init(struct dwc3 *dwc)
 
        dwc3_set_incr_burst_type(dwc);
 
-       dwc3_phy_power_on(dwc);
+       ret = dwc3_phy_power_on(dwc);
        if (ret)
                goto err_exit_phy;
 
index d56457c..1f043c3 100644 (file)
@@ -1116,6 +1116,7 @@ struct dwc3_scratchpad_array {
  * @dis_metastability_quirk: set to disable metastability quirk.
  * @dis_split_quirk: set to disable split boundary.
  * @wakeup_configured: set if the device is configured for remote wakeup.
+ * @suspended: set to track suspend event due to U3/L2.
  * @imod_interval: set the interrupt moderation interval in 250ns
  *                     increments or 0 to disable.
  * @max_cfg_eps: current max number of IN eps used across all USB configs.
@@ -1332,6 +1333,7 @@ struct dwc3 {
        unsigned                dis_split_quirk:1;
        unsigned                async_callbacks:1;
        unsigned                wakeup_configured:1;
+       unsigned                suspended:1;
 
        u16                     imod_interval;
 
index e4a2560..ebf0346 100644 (file)
@@ -332,6 +332,11 @@ static int dwc3_lsp_show(struct seq_file *s, void *unused)
        unsigned int            current_mode;
        unsigned long           flags;
        u32                     reg;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        reg = dwc3_readl(dwc->regs, DWC3_GSTS);
@@ -350,6 +355,8 @@ static int dwc3_lsp_show(struct seq_file *s, void *unused)
        }
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -395,6 +402,11 @@ static int dwc3_mode_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = s->private;
        unsigned long           flags;
        u32                     reg;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        reg = dwc3_readl(dwc->regs, DWC3_GCTL);
@@ -414,6 +426,8 @@ static int dwc3_mode_show(struct seq_file *s, void *unused)
                seq_printf(s, "UNKNOWN %08x\n", DWC3_GCTL_PRTCAP(reg));
        }
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -463,6 +477,11 @@ static int dwc3_testmode_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = s->private;
        unsigned long           flags;
        u32                     reg;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
@@ -493,6 +512,8 @@ static int dwc3_testmode_show(struct seq_file *s, void *unused)
                seq_printf(s, "UNKNOWN %d\n", reg);
        }
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -509,6 +530,7 @@ static ssize_t dwc3_testmode_write(struct file *file,
        unsigned long           flags;
        u32                     testmode = 0;
        char                    buf[32];
+       int                     ret;
 
        if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
                return -EFAULT;
@@ -526,10 +548,16 @@ static ssize_t dwc3_testmode_write(struct file *file,
        else
                testmode = 0;
 
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
+
        spin_lock_irqsave(&dwc->lock, flags);
        dwc3_gadget_set_test_mode(dwc, testmode);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return count;
 }
 
@@ -548,12 +576,18 @@ static int dwc3_link_state_show(struct seq_file *s, void *unused)
        enum dwc3_link_state    state;
        u32                     reg;
        u8                      speed;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        reg = dwc3_readl(dwc->regs, DWC3_GSTS);
        if (DWC3_GSTS_CURMOD(reg) != DWC3_GSTS_CURMOD_DEVICE) {
                seq_puts(s, "Not available\n");
                spin_unlock_irqrestore(&dwc->lock, flags);
+               pm_runtime_put_sync(dwc->dev);
                return 0;
        }
 
@@ -566,6 +600,8 @@ static int dwc3_link_state_show(struct seq_file *s, void *unused)
                   dwc3_gadget_hs_link_string(state));
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -584,6 +620,7 @@ static ssize_t dwc3_link_state_write(struct file *file,
        char                    buf[32];
        u32                     reg;
        u8                      speed;
+       int                     ret;
 
        if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
                return -EFAULT;
@@ -603,10 +640,15 @@ static ssize_t dwc3_link_state_write(struct file *file,
        else
                return -EINVAL;
 
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
+
        spin_lock_irqsave(&dwc->lock, flags);
        reg = dwc3_readl(dwc->regs, DWC3_GSTS);
        if (DWC3_GSTS_CURMOD(reg) != DWC3_GSTS_CURMOD_DEVICE) {
                spin_unlock_irqrestore(&dwc->lock, flags);
+               pm_runtime_put_sync(dwc->dev);
                return -EINVAL;
        }
 
@@ -616,12 +658,15 @@ static ssize_t dwc3_link_state_write(struct file *file,
        if (speed < DWC3_DSTS_SUPERSPEED &&
            state != DWC3_LINK_STATE_RECOV) {
                spin_unlock_irqrestore(&dwc->lock, flags);
+               pm_runtime_put_sync(dwc->dev);
                return -EINVAL;
        }
 
        dwc3_gadget_set_link_state(dwc, state);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return count;
 }
 
@@ -645,6 +690,11 @@ static int dwc3_tx_fifo_size_show(struct seq_file *s, void *unused)
        unsigned long           flags;
        u32                     mdwidth;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_TXFIFO);
@@ -657,6 +707,8 @@ static int dwc3_tx_fifo_size_show(struct seq_file *s, void *unused)
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -667,6 +719,11 @@ static int dwc3_rx_fifo_size_show(struct seq_file *s, void *unused)
        unsigned long           flags;
        u32                     mdwidth;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_RXFIFO);
@@ -679,6 +736,8 @@ static int dwc3_rx_fifo_size_show(struct seq_file *s, void *unused)
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -688,12 +747,19 @@ static int dwc3_tx_request_queue_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_TXREQQ);
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -703,12 +769,19 @@ static int dwc3_rx_request_queue_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_RXREQQ);
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -718,12 +791,19 @@ static int dwc3_rx_info_queue_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_RXINFOQ);
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -733,12 +813,19 @@ static int dwc3_descriptor_fetch_queue_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_DESCFETCHQ);
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -748,12 +835,19 @@ static int dwc3_event_queue_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        u32                     val;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        val = dwc3_core_fifo_space(dep, DWC3_EVENTQ);
        seq_printf(s, "%u\n", val);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -798,6 +892,11 @@ static int dwc3_trb_ring_show(struct seq_file *s, void *unused)
        struct dwc3             *dwc = dep->dwc;
        unsigned long           flags;
        int                     i;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        if (dep->number <= 1) {
@@ -827,6 +926,8 @@ static int dwc3_trb_ring_show(struct seq_file *s, void *unused)
 out:
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -839,6 +940,11 @@ static int dwc3_ep_info_register_show(struct seq_file *s, void *unused)
        u32                     lower_32_bits;
        u32                     upper_32_bits;
        u32                     reg;
+       int                     ret;
+
+       ret = pm_runtime_resume_and_get(dwc->dev);
+       if (ret < 0)
+               return ret;
 
        spin_lock_irqsave(&dwc->lock, flags);
        reg = DWC3_GDBGLSPMUX_EPSELECT(dep->number);
@@ -851,6 +957,8 @@ static int dwc3_ep_info_register_show(struct seq_file *s, void *unused)
        seq_printf(s, "0x%016llx\n", ep_info);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
+       pm_runtime_put_sync(dwc->dev);
+
        return 0;
 }
 
@@ -910,6 +1018,7 @@ void dwc3_debugfs_init(struct dwc3 *dwc)
        dwc->regset->regs = dwc3_regs;
        dwc->regset->nregs = ARRAY_SIZE(dwc3_regs);
        dwc->regset->base = dwc->regs - DWC3_GLOBALS_REGS_START;
+       dwc->regset->dev = dwc->dev;
 
        root = debugfs_create_dir(dev_name(dwc->dev), usb_debug_root);
        dwc->debug_root = root;
index c0ca4d1..d831f5a 100644 (file)
@@ -2440,6 +2440,7 @@ static int dwc3_gadget_func_wakeup(struct usb_gadget *g, int intf_id)
                        return -EINVAL;
                }
                dwc3_resume_gadget(dwc);
+               dwc->suspended = false;
                dwc->link_state = DWC3_LINK_STATE_U0;
        }
 
@@ -2699,6 +2700,21 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc)
        return ret;
 }
 
+static int dwc3_gadget_soft_connect(struct dwc3 *dwc)
+{
+       /*
+        * In the Synopsys DWC_usb31 1.90a programming guide section
+        * 4.1.9, it specifies that for a reconnect after a
+        * device-initiated disconnect requires a core soft reset
+        * (DCTL.CSftRst) before enabling the run/stop bit.
+        */
+       dwc3_core_soft_reset(dwc);
+
+       dwc3_event_buffers_setup(dwc);
+       __dwc3_gadget_start(dwc);
+       return dwc3_gadget_run_stop(dwc, true);
+}
+
 static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
 {
        struct dwc3             *dwc = gadget_to_dwc(g);
@@ -2737,21 +2753,10 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on)
 
        synchronize_irq(dwc->irq_gadget);
 
-       if (!is_on) {
+       if (!is_on)
                ret = dwc3_gadget_soft_disconnect(dwc);
-       } else {
-               /*
-                * In the Synopsys DWC_usb31 1.90a programming guide section
-                * 4.1.9, it specifies that for a reconnect after a
-                * device-initiated disconnect requires a core soft reset
-                * (DCTL.CSftRst) before enabling the run/stop bit.
-                */
-               dwc3_core_soft_reset(dwc);
-
-               dwc3_event_buffers_setup(dwc);
-               __dwc3_gadget_start(dwc);
-               ret = dwc3_gadget_run_stop(dwc, true);
-       }
+       else
+               ret = dwc3_gadget_soft_connect(dwc);
 
        pm_runtime_put(dwc->dev);
 
@@ -3938,6 +3943,8 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc)
 {
        int                     reg;
 
+       dwc->suspended = false;
+
        dwc3_gadget_set_link_state(dwc, DWC3_LINK_STATE_RX_DET);
 
        reg = dwc3_readl(dwc->regs, DWC3_DCTL);
@@ -3962,6 +3969,8 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc)
 {
        u32                     reg;
 
+       dwc->suspended = false;
+
        /*
         * Ideally, dwc3_reset_gadget() would trigger the function
         * drivers to stop any active transfers through ep disable.
@@ -4180,6 +4189,8 @@ static void dwc3_gadget_conndone_interrupt(struct dwc3 *dwc)
 
 static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, unsigned int evtinfo)
 {
+       dwc->suspended = false;
+
        /*
         * TODO take core out of low power mode when that's
         * implemented.
@@ -4277,6 +4288,7 @@ static void dwc3_gadget_linksts_change_interrupt(struct dwc3 *dwc,
                if (dwc->gadget->wakeup_armed) {
                        dwc3_gadget_enable_linksts_evts(dwc, false);
                        dwc3_resume_gadget(dwc);
+                       dwc->suspended = false;
                }
                break;
        case DWC3_LINK_STATE_U1:
@@ -4303,8 +4315,10 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc,
 {
        enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK;
 
-       if (dwc->link_state != next && next == DWC3_LINK_STATE_U3)
+       if (!dwc->suspended && next == DWC3_LINK_STATE_U3) {
+               dwc->suspended = true;
                dwc3_suspend_gadget(dwc);
+       }
 
        dwc->link_state = next;
 }
@@ -4655,42 +4669,39 @@ void dwc3_gadget_exit(struct dwc3 *dwc)
 int dwc3_gadget_suspend(struct dwc3 *dwc)
 {
        unsigned long flags;
+       int ret;
 
        if (!dwc->gadget_driver)
                return 0;
 
-       dwc3_gadget_run_stop(dwc, false);
+       ret = dwc3_gadget_soft_disconnect(dwc);
+       if (ret)
+               goto err;
 
        spin_lock_irqsave(&dwc->lock, flags);
        dwc3_disconnect_gadget(dwc);
-       __dwc3_gadget_stop(dwc);
        spin_unlock_irqrestore(&dwc->lock, flags);
 
        return 0;
+
+err:
+       /*
+        * Attempt to reset the controller's state. Likely no
+        * communication can be established until the host
+        * performs a port reset.
+        */
+       if (dwc->softconnect)
+               dwc3_gadget_soft_connect(dwc);
+
+       return ret;
 }
 
 int dwc3_gadget_resume(struct dwc3 *dwc)
 {
-       int                     ret;
-
        if (!dwc->gadget_driver || !dwc->softconnect)
                return 0;
 
-       ret = __dwc3_gadget_start(dwc);
-       if (ret < 0)
-               goto err0;
-
-       ret = dwc3_gadget_run_stop(dwc, true);
-       if (ret < 0)
-               goto err1;
-
-       return 0;
-
-err1:
-       __dwc3_gadget_stop(dwc);
-
-err0:
-       return ret;
+       return dwc3_gadget_soft_connect(dwc);
 }
 
 void dwc3_gadget_process_pending_events(struct dwc3 *dwc)
index 6956ad8..a366abb 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/etherdevice.h>
 #include <linux/ethtool.h>
 #include <linux/if_vlan.h>
+#include <linux/string_helpers.h>
 #include <linux/usb/composite.h>
 
 #include "u_ether.h"
@@ -965,6 +966,8 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len)
        dev = netdev_priv(net);
        snprintf(host_addr, len, "%pm", dev->host_mac);
 
+       string_upper(host_addr, host_addr);
+
        return strlen(host_addr);
 }
 EXPORT_SYMBOL_GPL(gether_get_host_addr_cdc);
index 4641153..52e6d2e 100644 (file)
@@ -37,10 +37,6 @@ static const struct bus_type gadget_bus_type;
  * @vbus: for udcs who care about vbus status, this value is real vbus status;
  * for udcs who do not care about vbus status, this value is always true
  * @started: the UDC's started state. True if the UDC had started.
- * @connect_lock: protects udc->vbus, udc->started, gadget->connect, gadget->deactivate related
- * functions. usb_gadget_connect_locked, usb_gadget_disconnect_locked,
- * usb_udc_connect_control_locked, usb_gadget_udc_start_locked, usb_gadget_udc_stop_locked are
- * called with this lock held.
  *
  * This represents the internal data structure which is used by the UDC-class
  * to hold information about udc driver and gadget together.
@@ -52,7 +48,6 @@ struct usb_udc {
        struct list_head                list;
        bool                            vbus;
        bool                            started;
-       struct mutex                    connect_lock;
 };
 
 static struct class *udc_class;
@@ -692,9 +687,17 @@ out:
 }
 EXPORT_SYMBOL_GPL(usb_gadget_vbus_disconnect);
 
-/* Internal version of usb_gadget_connect needs to be called with connect_lock held. */
-static int usb_gadget_connect_locked(struct usb_gadget *gadget)
-       __must_hold(&gadget->udc->connect_lock)
+/**
+ * usb_gadget_connect - software-controlled connect to USB host
+ * @gadget:the peripheral being connected
+ *
+ * Enables the D+ (or potentially D-) pullup.  The host will start
+ * enumerating this gadget when the pullup is active and a VBUS session
+ * is active (the link is powered).
+ *
+ * Returns zero on success, else negative errno.
+ */
+int usb_gadget_connect(struct usb_gadget *gadget)
 {
        int ret = 0;
 
@@ -703,15 +706,10 @@ static int usb_gadget_connect_locked(struct usb_gadget *gadget)
                goto out;
        }
 
-       if (gadget->connected)
-               goto out;
-
-       if (gadget->deactivated || !gadget->udc->started) {
+       if (gadget->deactivated) {
                /*
                 * If gadget is deactivated we only save new state.
                 * Gadget will be connected automatically after activation.
-                *
-                * udc first needs to be started before gadget can be pulled up.
                 */
                gadget->connected = true;
                goto out;
@@ -726,32 +724,22 @@ out:
 
        return ret;
 }
+EXPORT_SYMBOL_GPL(usb_gadget_connect);
 
 /**
- * usb_gadget_connect - software-controlled connect to USB host
- * @gadget:the peripheral being connected
+ * usb_gadget_disconnect - software-controlled disconnect from USB host
+ * @gadget:the peripheral being disconnected
  *
- * Enables the D+ (or potentially D-) pullup.  The host will start
- * enumerating this gadget when the pullup is active and a VBUS session
- * is active (the link is powered).
+ * Disables the D+ (or potentially D-) pullup, which the host may see
+ * as a disconnect (when a VBUS session is active).  Not all systems
+ * support software pullup controls.
+ *
+ * Following a successful disconnect, invoke the ->disconnect() callback
+ * for the current gadget driver so that UDC drivers don't need to.
  *
  * Returns zero on success, else negative errno.
  */
-int usb_gadget_connect(struct usb_gadget *gadget)
-{
-       int ret;
-
-       mutex_lock(&gadget->udc->connect_lock);
-       ret = usb_gadget_connect_locked(gadget);
-       mutex_unlock(&gadget->udc->connect_lock);
-
-       return ret;
-}
-EXPORT_SYMBOL_GPL(usb_gadget_connect);
-
-/* Internal version of usb_gadget_disconnect needs to be called with connect_lock held. */
-static int usb_gadget_disconnect_locked(struct usb_gadget *gadget)
-       __must_hold(&gadget->udc->connect_lock)
+int usb_gadget_disconnect(struct usb_gadget *gadget)
 {
        int ret = 0;
 
@@ -763,12 +751,10 @@ static int usb_gadget_disconnect_locked(struct usb_gadget *gadget)
        if (!gadget->connected)
                goto out;
 
-       if (gadget->deactivated || !gadget->udc->started) {
+       if (gadget->deactivated) {
                /*
                 * If gadget is deactivated we only save new state.
                 * Gadget will stay disconnected after activation.
-                *
-                * udc should have been started before gadget being pulled down.
                 */
                gadget->connected = false;
                goto out;
@@ -788,30 +774,6 @@ out:
 
        return ret;
 }
-
-/**
- * usb_gadget_disconnect - software-controlled disconnect from USB host
- * @gadget:the peripheral being disconnected
- *
- * Disables the D+ (or potentially D-) pullup, which the host may see
- * as a disconnect (when a VBUS session is active).  Not all systems
- * support software pullup controls.
- *
- * Following a successful disconnect, invoke the ->disconnect() callback
- * for the current gadget driver so that UDC drivers don't need to.
- *
- * Returns zero on success, else negative errno.
- */
-int usb_gadget_disconnect(struct usb_gadget *gadget)
-{
-       int ret;
-
-       mutex_lock(&gadget->udc->connect_lock);
-       ret = usb_gadget_disconnect_locked(gadget);
-       mutex_unlock(&gadget->udc->connect_lock);
-
-       return ret;
-}
 EXPORT_SYMBOL_GPL(usb_gadget_disconnect);
 
 /**
@@ -832,11 +794,10 @@ int usb_gadget_deactivate(struct usb_gadget *gadget)
        if (gadget->deactivated)
                goto out;
 
-       mutex_lock(&gadget->udc->connect_lock);
        if (gadget->connected) {
-               ret = usb_gadget_disconnect_locked(gadget);
+               ret = usb_gadget_disconnect(gadget);
                if (ret)
-                       goto unlock;
+                       goto out;
 
                /*
                 * If gadget was being connected before deactivation, we want
@@ -846,8 +807,6 @@ int usb_gadget_deactivate(struct usb_gadget *gadget)
        }
        gadget->deactivated = true;
 
-unlock:
-       mutex_unlock(&gadget->udc->connect_lock);
 out:
        trace_usb_gadget_deactivate(gadget, ret);
 
@@ -871,7 +830,6 @@ int usb_gadget_activate(struct usb_gadget *gadget)
        if (!gadget->deactivated)
                goto out;
 
-       mutex_lock(&gadget->udc->connect_lock);
        gadget->deactivated = false;
 
        /*
@@ -879,8 +837,7 @@ int usb_gadget_activate(struct usb_gadget *gadget)
         * while it was being deactivated, we call usb_gadget_connect().
         */
        if (gadget->connected)
-               ret = usb_gadget_connect_locked(gadget);
-       mutex_unlock(&gadget->udc->connect_lock);
+               ret = usb_gadget_connect(gadget);
 
 out:
        trace_usb_gadget_activate(gadget, ret);
@@ -1121,13 +1078,12 @@ EXPORT_SYMBOL_GPL(usb_gadget_set_state);
 
 /* ------------------------------------------------------------------------- */
 
-/* Acquire connect_lock before calling this function. */
-static void usb_udc_connect_control_locked(struct usb_udc *udc) __must_hold(&udc->connect_lock)
+static void usb_udc_connect_control(struct usb_udc *udc)
 {
-       if (udc->vbus && udc->started)
-               usb_gadget_connect_locked(udc->gadget);
+       if (udc->vbus)
+               usb_gadget_connect(udc->gadget);
        else
-               usb_gadget_disconnect_locked(udc->gadget);
+               usb_gadget_disconnect(udc->gadget);
 }
 
 /**
@@ -1143,12 +1099,10 @@ void usb_udc_vbus_handler(struct usb_gadget *gadget, bool status)
 {
        struct usb_udc *udc = gadget->udc;
 
-       mutex_lock(&udc->connect_lock);
        if (udc) {
                udc->vbus = status;
-               usb_udc_connect_control_locked(udc);
+               usb_udc_connect_control(udc);
        }
-       mutex_unlock(&udc->connect_lock);
 }
 EXPORT_SYMBOL_GPL(usb_udc_vbus_handler);
 
@@ -1170,7 +1124,7 @@ void usb_gadget_udc_reset(struct usb_gadget *gadget,
 EXPORT_SYMBOL_GPL(usb_gadget_udc_reset);
 
 /**
- * usb_gadget_udc_start_locked - tells usb device controller to start up
+ * usb_gadget_udc_start - tells usb device controller to start up
  * @udc: The UDC to be started
  *
  * This call is issued by the UDC Class driver when it's about
@@ -1181,11 +1135,8 @@ EXPORT_SYMBOL_GPL(usb_gadget_udc_reset);
  * necessary to have it powered on.
  *
  * Returns zero on success, else negative errno.
- *
- * Caller should acquire connect_lock before invoking this function.
  */
-static inline int usb_gadget_udc_start_locked(struct usb_udc *udc)
-       __must_hold(&udc->connect_lock)
+static inline int usb_gadget_udc_start(struct usb_udc *udc)
 {
        int ret;
 
@@ -1202,7 +1153,7 @@ static inline int usb_gadget_udc_start_locked(struct usb_udc *udc)
 }
 
 /**
- * usb_gadget_udc_stop_locked - tells usb device controller we don't need it anymore
+ * usb_gadget_udc_stop - tells usb device controller we don't need it anymore
  * @udc: The UDC to be stopped
  *
  * This call is issued by the UDC Class driver after calling
@@ -1211,11 +1162,8 @@ static inline int usb_gadget_udc_start_locked(struct usb_udc *udc)
  * The details are implementation specific, but it can go as
  * far as powering off UDC completely and disable its data
  * line pullups.
- *
- * Caller should acquire connect lock before invoking this function.
  */
-static inline void usb_gadget_udc_stop_locked(struct usb_udc *udc)
-       __must_hold(&udc->connect_lock)
+static inline void usb_gadget_udc_stop(struct usb_udc *udc)
 {
        if (!udc->started) {
                dev_err(&udc->dev, "UDC had already stopped\n");
@@ -1374,7 +1322,6 @@ int usb_add_gadget(struct usb_gadget *gadget)
 
        udc->gadget = gadget;
        gadget->udc = udc;
-       mutex_init(&udc->connect_lock);
 
        udc->started = false;
 
@@ -1576,15 +1523,11 @@ static int gadget_bind_driver(struct device *dev)
        if (ret)
                goto err_bind;
 
-       mutex_lock(&udc->connect_lock);
-       ret = usb_gadget_udc_start_locked(udc);
-       if (ret) {
-               mutex_unlock(&udc->connect_lock);
+       ret = usb_gadget_udc_start(udc);
+       if (ret)
                goto err_start;
-       }
        usb_gadget_enable_async_callbacks(udc);
-       usb_udc_connect_control_locked(udc);
-       mutex_unlock(&udc->connect_lock);
+       usb_udc_connect_control(udc);
 
        kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
        return 0;
@@ -1615,14 +1558,12 @@ static void gadget_unbind_driver(struct device *dev)
 
        kobject_uevent(&udc->dev.kobj, KOBJ_CHANGE);
 
-       mutex_lock(&udc->connect_lock);
-       usb_gadget_disconnect_locked(gadget);
+       usb_gadget_disconnect(gadget);
        usb_gadget_disable_async_callbacks(udc);
        if (gadget->irq)
                synchronize_irq(gadget->irq);
        udc->driver->unbind(gadget);
-       usb_gadget_udc_stop_locked(udc);
-       mutex_unlock(&udc->connect_lock);
+       usb_gadget_udc_stop(udc);
 
        mutex_lock(&udc_lock);
        driver->is_bound = false;
@@ -1708,15 +1649,11 @@ static ssize_t soft_connect_store(struct device *dev,
        }
 
        if (sysfs_streq(buf, "connect")) {
-               mutex_lock(&udc->connect_lock);
-               usb_gadget_udc_start_locked(udc);
-               usb_gadget_connect_locked(udc->gadget);
-               mutex_unlock(&udc->connect_lock);
+               usb_gadget_udc_start(udc);
+               usb_gadget_connect(udc->gadget);
        } else if (sysfs_streq(buf, "disconnect")) {
-               mutex_lock(&udc->connect_lock);
-               usb_gadget_disconnect_locked(udc->gadget);
-               usb_gadget_udc_stop_locked(udc);
-               mutex_unlock(&udc->connect_lock);
+               usb_gadget_disconnect(udc->gadget);
+               usb_gadget_udc_stop(udc);
        } else {
                dev_err(dev, "unsupported command '%s'\n", buf);
                ret = -EINVAL;
index 3592f75..7bd2fdd 100644 (file)
@@ -119,11 +119,13 @@ static int uhci_pci_init(struct usb_hcd *hcd)
 
        uhci->rh_numports = uhci_count_ports(hcd);
 
-       /* Intel controllers report the OverCurrent bit active on.
-        * VIA controllers report it active off, so we'll adjust the
-        * bit value.  (It's not standardized in the UHCI spec.)
+       /*
+        * Intel controllers report the OverCurrent bit active on.  VIA
+        * and ZHAOXIN controllers report it active off, so we'll adjust
+        * the bit value.  (It's not standardized in the UHCI spec.)
         */
-       if (to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_VIA)
+       if (to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_VIA ||
+                       to_pci_dev(uhci_dev(uhci))->vendor == PCI_VENDOR_ID_ZHAOXIN)
                uhci->oc_low = 1;
 
        /* HP's server management chip requires a longer port reset delay. */
index ddb79f2..79b3691 100644 (file)
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/acpi.h>
 #include <linux/reset.h>
+#include <linux/suspend.h>
 
 #include "xhci.h"
 #include "xhci-trace.h"
@@ -387,7 +388,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
 
        if (pdev->vendor == PCI_VENDOR_ID_AMD &&
                pdev->device == PCI_DEVICE_ID_AMD_RENOIR_XHCI)
-               xhci->quirks |= XHCI_BROKEN_D3COLD;
+               xhci->quirks |= XHCI_BROKEN_D3COLD_S2I;
 
        if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
                xhci->quirks |= XHCI_LPM_SUPPORT;
@@ -801,9 +802,16 @@ static int xhci_pci_suspend(struct usb_hcd *hcd, bool do_wakeup)
         * Systems with the TI redriver that loses port status change events
         * need to have the registers polled during D3, so avoid D3cold.
         */
-       if (xhci->quirks & (XHCI_COMP_MODE_QUIRK | XHCI_BROKEN_D3COLD))
+       if (xhci->quirks & XHCI_COMP_MODE_QUIRK)
                pci_d3cold_disable(pdev);
 
+#ifdef CONFIG_SUSPEND
+       /* d3cold is broken, but only when s2idle is used */
+       if (pm_suspend_target_state == PM_SUSPEND_TO_IDLE &&
+           xhci->quirks & (XHCI_BROKEN_D3COLD_S2I))
+               pci_d3cold_disable(pdev);
+#endif
+
        if (xhci->quirks & XHCI_PME_STUCK_QUIRK)
                xhci_pme_quirk(hcd);
 
index 1ad12d5..2bc82b3 100644 (file)
@@ -276,6 +276,26 @@ static void inc_enq(struct xhci_hcd *xhci, struct xhci_ring *ring,
        trace_xhci_inc_enq(ring);
 }
 
+static int xhci_num_trbs_to(struct xhci_segment *start_seg, union xhci_trb *start,
+                           struct xhci_segment *end_seg, union xhci_trb *end,
+                           unsigned int num_segs)
+{
+       union xhci_trb *last_on_seg;
+       int num = 0;
+       int i = 0;
+
+       do {
+               if (start_seg == end_seg && end >= start)
+                       return num + (end - start);
+               last_on_seg = &start_seg->trbs[TRBS_PER_SEGMENT - 1];
+               num += last_on_seg - start;
+               start_seg = start_seg->next;
+               start = start_seg->trbs;
+       } while (i++ <= num_segs);
+
+       return -EINVAL;
+}
+
 /*
  * Check to see if there's room to enqueue num_trbs on the ring and make sure
  * enqueue pointer will not advance into dequeue segment. See rules above.
@@ -2140,6 +2160,7 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep,
                     u32 trb_comp_code)
 {
        struct xhci_ep_ctx *ep_ctx;
+       int trbs_freed;
 
        ep_ctx = xhci_get_ep_ctx(xhci, ep->vdev->out_ctx, ep->ep_index);
 
@@ -2209,9 +2230,15 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_virt_ep *ep,
        }
 
        /* Update ring dequeue pointer */
+       trbs_freed = xhci_num_trbs_to(ep_ring->deq_seg, ep_ring->dequeue,
+                                     td->last_trb_seg, td->last_trb,
+                                     ep_ring->num_segs);
+       if (trbs_freed < 0)
+               xhci_dbg(xhci, "Failed to count freed trbs at TD finish\n");
+       else
+               ep_ring->num_trbs_free += trbs_freed;
        ep_ring->dequeue = td->last_trb;
        ep_ring->deq_seg = td->last_trb_seg;
-       ep_ring->num_trbs_free += td->num_trbs - 1;
        inc_deq(xhci, ep_ring);
 
        return xhci_td_cleanup(xhci, td, ep_ring, td->status);
index 08d7219..6b690ec 100644 (file)
@@ -1901,7 +1901,7 @@ struct xhci_hcd {
 #define XHCI_DISABLE_SPARSE    BIT_ULL(38)
 #define XHCI_SG_TRB_CACHE_SIZE_QUIRK   BIT_ULL(39)
 #define XHCI_NO_SOFT_RETRY     BIT_ULL(40)
-#define XHCI_BROKEN_D3COLD     BIT_ULL(41)
+#define XHCI_BROKEN_D3COLD_S2I BIT_ULL(41)
 #define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(42)
 #define XHCI_SUSPEND_RESUME_CLKS       BIT_ULL(43)
 #define XHCI_RESET_TO_DEFAULT  BIT_ULL(44)
index 8931df5..c54e980 100644 (file)
@@ -406,22 +406,25 @@ static DEF_SCSI_QCMD(queuecommand)
  ***********************************************************************/
 
 /* Command timeout and abort */
-static int command_abort(struct scsi_cmnd *srb)
+static int command_abort_matching(struct us_data *us, struct scsi_cmnd *srb_match)
 {
-       struct us_data *us = host_to_us(srb->device->host);
-
-       usb_stor_dbg(us, "%s called\n", __func__);
-
        /*
         * us->srb together with the TIMED_OUT, RESETTING, and ABORTING
         * bits are protected by the host lock.
         */
        scsi_lock(us_to_host(us));
 
-       /* Is this command still active? */
-       if (us->srb != srb) {
+       /* is there any active pending command to abort ? */
+       if (!us->srb) {
                scsi_unlock(us_to_host(us));
                usb_stor_dbg(us, "-- nothing to abort\n");
+               return SUCCESS;
+       }
+
+       /* Does the command match the passed srb if any ? */
+       if (srb_match && us->srb != srb_match) {
+               scsi_unlock(us_to_host(us));
+               usb_stor_dbg(us, "-- pending command mismatch\n");
                return FAILED;
        }
 
@@ -444,6 +447,14 @@ static int command_abort(struct scsi_cmnd *srb)
        return SUCCESS;
 }
 
+static int command_abort(struct scsi_cmnd *srb)
+{
+       struct us_data *us = host_to_us(srb->device->host);
+
+       usb_stor_dbg(us, "%s called\n", __func__);
+       return command_abort_matching(us, srb);
+}
+
 /*
  * This invokes the transport reset mechanism to reset the state of the
  * device
@@ -455,6 +466,9 @@ static int device_reset(struct scsi_cmnd *srb)
 
        usb_stor_dbg(us, "%s called\n", __func__);
 
+       /* abort any pending command before reset */
+       command_abort_matching(us, NULL);
+
        /* lock the device pointers and do the reset */
        mutex_lock(&(us->dev_mutex));
        result = us->transport_reset(us);
index 8f3e884..66de880 100644 (file)
@@ -516,6 +516,10 @@ static ssize_t pin_assignment_show(struct device *dev,
 
        mutex_unlock(&dp->lock);
 
+       /* get_current_pin_assignments can return 0 when no matching pin assignments are found */
+       if (len == 0)
+               len++;
+
        buf[len - 1] = '\n';
        return len;
 }
index 8b075ca..438cc40 100644 (file)
@@ -886,6 +886,9 @@ static void tps6598x_remove(struct i2c_client *client)
 {
        struct tps6598x *tps = i2c_get_clientdata(client);
 
+       if (!client->irq)
+               cancel_delayed_work_sync(&tps->wq_poll);
+
        tps6598x_disconnect(tps, 0);
        typec_unregister_port(tps->port);
        usb_role_switch_put(tps->role_sw);
index 3ccf46f..07d6e8d 100644 (file)
@@ -124,7 +124,7 @@ static u_long get_line_length(int xres_virtual, int bpp)
      *  First part, xxxfb_check_var, must not write anything
      *  to hardware, it should only verify and adjust var.
      *  This means it doesn't alter par but it does use hardware
-     *  data from it to check this var. 
+     *  data from it to check this var.
      */
 
 static int mc68x328fb_check_var(struct fb_var_screeninfo *var,
@@ -182,7 +182,7 @@ static int mc68x328fb_check_var(struct fb_var_screeninfo *var,
 
        /*
         * Now that we checked it we alter var. The reason being is that the video
-        * mode passed in might not work but slight changes to it might make it 
+        * mode passed in might not work but slight changes to it might make it
         * work. This way we let the user know what is acceptable.
         */
        switch (var->bits_per_pixel) {
@@ -257,8 +257,8 @@ static int mc68x328fb_check_var(struct fb_var_screeninfo *var,
 }
 
 /* This routine actually sets the video mode. It's in here where we
- * the hardware state info->par and fix which can be affected by the 
- * change in par. For this driver it doesn't do much. 
+ * the hardware state info->par and fix which can be affected by the
+ * change in par. For this driver it doesn't do much.
  */
 static int mc68x328fb_set_par(struct fb_info *info)
 {
@@ -295,7 +295,7 @@ static int mc68x328fb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
         *   {hardwarespecific} contains width of RAMDAC
         *   cmap[X] is programmed to (X << red.offset) | (X << green.offset) | (X << blue.offset)
         *   RAMDAC[X] is programmed to (red, green, blue)
-        * 
+        *
         * Pseudocolor:
         *    uses offset = 0 && length = RAMDAC register width.
         *    var->{color}.offset is 0
@@ -384,7 +384,7 @@ static int mc68x328fb_pan_display(struct fb_var_screeninfo *var,
 }
 
     /*
-     *  Most drivers don't need their own mmap function 
+     *  Most drivers don't need their own mmap function
      */
 
 static int mc68x328fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
index 96e9157..0fdf5f4 100644 (file)
@@ -124,7 +124,7 @@ config FB_PROVIDE_GET_FB_UNMAPPED_AREA
        depends on FB
        help
          Allow generic frame-buffer to provide get_fb_unmapped_area
-         function.
+         function to provide shareable character device support on nommu.
 
 menuconfig FB_FOREIGN_ENDIAN
        bool "Framebuffer foreign endianness support"
index 45e6401..024d0ee 100644 (file)
@@ -523,7 +523,7 @@ static int arcfb_probe(struct platform_device *dev)
 
        info = framebuffer_alloc(sizeof(struct arcfb_par), &dev->dev);
        if (!info)
-               goto err;
+               goto err_fb_alloc;
 
        info->screen_base = (char __iomem *)videomemory;
        info->fbops = &arcfb_ops;
@@ -535,7 +535,7 @@ static int arcfb_probe(struct platform_device *dev)
 
        if (!dio_addr || !cio_addr || !c2io_addr) {
                printk(KERN_WARNING "no IO addresses supplied\n");
-               goto err1;
+               goto err_addr;
        }
        par->dio_addr = dio_addr;
        par->cio_addr = cio_addr;
@@ -551,12 +551,12 @@ static int arcfb_probe(struct platform_device *dev)
                        printk(KERN_INFO
                                "arcfb: Failed req IRQ %d\n", par->irq);
                        retval = -EBUSY;
-                       goto err1;
+                       goto err_addr;
                }
        }
        retval = register_framebuffer(info);
        if (retval < 0)
-               goto err1;
+               goto err_register_fb;
        platform_set_drvdata(dev, info);
        fb_info(info, "Arc frame buffer device, using %dK of video memory\n",
                videomemorysize >> 10);
@@ -580,9 +580,12 @@ static int arcfb_probe(struct platform_device *dev)
        }
 
        return 0;
-err1:
+
+err_register_fb:
+       free_irq(par->irq, info);
+err_addr:
        framebuffer_release(info);
-err:
+err_fb_alloc:
        vfree(videomemory);
        return retval;
 }
index 8187a7c..987c5f5 100644 (file)
@@ -317,7 +317,7 @@ static inline void atmel_lcdfb_free_video_memory(struct atmel_lcdfb_info *sinfo)
 /**
  *     atmel_lcdfb_alloc_video_memory - Allocate framebuffer memory
  *     @sinfo: the frame buffer to allocate memory for
- *     
+ *
  *     This function is called only from the atmel_lcdfb_probe()
  *     so no locking by fb_info->mm_lock around smem_len setting is needed.
  */
index b02e4e6..cba2b11 100644 (file)
@@ -3498,11 +3498,6 @@ static int atyfb_setup_generic(struct pci_dev *pdev, struct fb_info *info,
        if (ret)
                goto atyfb_setup_generic_fail;
 #endif
-       if (!(aty_ld_le32(CRTC_GEN_CNTL, par) & CRTC_EXT_DISP_EN))
-               par->clk_wr_offset = (inb(R_GENMO) & 0x0CU) >> 2;
-       else
-               par->clk_wr_offset = aty_ld_8(CLOCK_CNTL, par) & 0x03U;
-
        /* according to ATI, we should use clock 3 for acelerated mode */
        par->clk_wr_offset = 3;
 
index a028ede..832a82f 100644 (file)
@@ -512,7 +512,7 @@ static int cg14_probe(struct platform_device *op)
        is_8mb = (resource_size(&op->resource[1]) == (8 * 1024 * 1024));
 
        BUILD_BUG_ON(sizeof(par->mmap_map) != sizeof(__cg14_mmap_map));
-               
+
        memcpy(&par->mmap_map, &__cg14_mmap_map, sizeof(par->mmap_map));
 
        for (i = 0; i < CG14_MMAP_ENTRIES; i++) {
index 77dbf94..82eeb13 100644 (file)
@@ -113,14 +113,14 @@ struct fb_info_control {
        struct fb_info          info;
        struct fb_par_control   par;
        u32                     pseudo_palette[16];
-               
+
        struct cmap_regs        __iomem *cmap_regs;
        unsigned long           cmap_regs_phys;
-       
+
        struct control_regs     __iomem *control_regs;
        unsigned long           control_regs_phys;
        unsigned long           control_regs_size;
-       
+
        __u8                    __iomem *frame_buffer;
        unsigned long           frame_buffer_phys;
        unsigned long           fb_orig_base;
@@ -196,7 +196,7 @@ static void set_control_clock(unsigned char *params)
                while (!req.complete)
                        cuda_poll();
        }
-#endif 
+#endif
 }
 
 /*
@@ -233,19 +233,19 @@ static void control_set_hardware(struct fb_info_control *p, struct fb_par_contro
                if (p->par.xoffset != par->xoffset ||
                    p->par.yoffset != par->yoffset)
                        set_screen_start(par->xoffset, par->yoffset, p);
-                       
+
                return;
        }
-       
+
        p->par = *par;
        cmode = p->par.cmode;
        r = &par->regvals;
-       
+
        /* Turn off display */
        out_le32(CNTRL_REG(p,ctrl), 0x400 | par->ctrl);
-       
+
        set_control_clock(r->clock_params);
-       
+
        RADACAL_WRITE(0x20, r->radacal_ctrl);
        RADACAL_WRITE(0x21, p->control_use_bank2 ? 0 : 1);
        RADACAL_WRITE(0x10, 0);
@@ -254,7 +254,7 @@ static void control_set_hardware(struct fb_info_control *p, struct fb_par_contro
        rp = &p->control_regs->vswin;
        for (i = 0; i < 16; ++i, ++rp)
                out_le32(&rp->r, r->regs[i]);
-       
+
        out_le32(CNTRL_REG(p,pitch), par->pitch);
        out_le32(CNTRL_REG(p,mode), r->mode);
        out_le32(CNTRL_REG(p,vram_attr), p->vram_attr);
@@ -366,7 +366,7 @@ static int read_control_sense(struct fb_info_control *p)
        sense |= (in_le32(CNTRL_REG(p,mon_sense)) & 0x180) >> 7;
 
        out_le32(CNTRL_REG(p,mon_sense), 077);  /* turn off drivers */
-       
+
        return sense;
 }
 
@@ -558,9 +558,9 @@ static int control_var_to_par(struct fb_var_screeninfo *var,
 static void control_par_to_var(struct fb_par_control *par, struct fb_var_screeninfo *var)
 {
        struct control_regints *rv;
-       
+
        rv = (struct control_regints *) par->regvals.regs;
-       
+
        memset(var, 0, sizeof(*var));
        var->xres = par->xres;
        var->yres = par->yres;
@@ -568,7 +568,7 @@ static void control_par_to_var(struct fb_par_control *par, struct fb_var_screeni
        var->yres_virtual = par->vyres;
        var->xoffset = par->xoffset;
        var->yoffset = par->yoffset;
-       
+
        switch(par->cmode) {
        default:
        case CMODE_8:
@@ -634,7 +634,7 @@ static int controlfb_check_var (struct fb_var_screeninfo *var, struct fb_info *i
 
        err = control_var_to_par(var, &par, info);
        if (err)
-               return err;     
+               return err;
        control_par_to_var(&par, var);
 
        return 0;
@@ -655,7 +655,7 @@ static int controlfb_set_par (struct fb_info *info)
                                 " control_var_to_par: %d.\n", err);
                return err;
        }
-       
+
        control_set_hardware(p, &par);
 
        info->fix.visual = (p->par.cmode == CMODE_8) ?
@@ -840,7 +840,7 @@ static int __init init_control(struct fb_info_control *p)
        int full, sense, vmode, cmode, vyres;
        struct fb_var_screeninfo var;
        int rc;
-       
+
        printk(KERN_INFO "controlfb: ");
 
        full = p->total_vram == 0x400000;
index e808dc8..28739f1 100644 (file)
@@ -1468,7 +1468,7 @@ __releases(&info->lock)
 }
 
 #if defined(CONFIG_FB_PROVIDE_GET_FB_UNMAPPED_AREA) && !defined(CONFIG_MMU)
-unsigned long get_fb_unmapped_area(struct file *filp,
+static unsigned long get_fb_unmapped_area(struct file *filp,
                                   unsigned long addr, unsigned long len,
                                   unsigned long pgoff, unsigned long flags)
 {
index 23cf8eb..f7e019d 100644 (file)
@@ -257,6 +257,11 @@ static const struct fb_videomode modedb[] = {
        { NULL, 72, 480, 300, 33386, 40, 24, 11, 19, 80, 3, 0,
                FB_VMODE_DOUBLE },
 
+       /* 1920x1080 @ 60 Hz, 67.3 kHz hsync */
+       { NULL, 60, 1920, 1080, 6734, 148, 88, 36, 4, 44, 5, 0,
+               FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+               FB_VMODE_NONINTERLACED },
+
        /* 1920x1200 @ 60 Hz, 74.5 Khz hsync */
        { NULL, 60, 1920, 1200, 5177, 128, 336, 1, 38, 208, 3,
                FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
index 05837a3..c5b7673 100644 (file)
@@ -6,7 +6,7 @@
  *
  *  This driver is based on tgafb.c
  *
- *     Copyright (C) 1997 Geert Uytterhoeven 
+ *     Copyright (C) 1997 Geert Uytterhoeven
  *     Copyright (C) 1995  Jay Estabrook
  *
  *  This file is subject to the terms and conditions of the GNU General Public
@@ -28,7 +28,7 @@
 #include <asm/io.h>
 #include <asm/jazz.h>
 
-/* 
+/*
  * Various defines for the G364
  */
 #define G364_MEM_BASE   0xe4400000
@@ -125,7 +125,7 @@ static const struct fb_ops g364fb_ops = {
  *
  *  This call looks only at xoffset, yoffset and the FB_VMODE_YWRAP flag
  */
-static int g364fb_pan_display(struct fb_var_screeninfo *var, 
+static int g364fb_pan_display(struct fb_var_screeninfo *var,
                              struct fb_info *info)
 {
        if (var->xoffset ||
index 20bdab7..0af5801 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * linux/drivers/video/hgafb.c -- Hercules graphics adaptor frame buffer device
- * 
+ *
  *      Created 25 Nov 1999 by Ferenc Bakonyi (fero@drama.obuda.kando.hu)
  *      Based on skeletonfb.c by Geert Uytterhoeven and
  *               mdacon.c by Andrew Apted
@@ -8,14 +8,14 @@
  * History:
  *
  * - Revision 0.1.8 (23 Oct 2002): Ported to new framebuffer api.
- * 
- * - Revision 0.1.7 (23 Jan 2001): fix crash resulting from MDA only cards 
+ *
+ * - Revision 0.1.7 (23 Jan 2001): fix crash resulting from MDA only cards
  *                                being detected as Hercules.   (Paul G.)
  * - Revision 0.1.6 (17 Aug 2000): new style structs
  *                                 documentation
  * - Revision 0.1.5 (13 Mar 2000): spinlocks instead of saveflags();cli();etc
  *                                 minor fixes
- * - Revision 0.1.4 (24 Jan 2000): fixed a bug in hga_card_detect() for 
+ * - Revision 0.1.4 (24 Jan 2000): fixed a bug in hga_card_detect() for
  *                                  HGA-only systems
  * - Revision 0.1.3 (22 Jan 2000): modified for the new fb_info structure
  *                                 screen is cleared after rmmod
@@ -143,7 +143,7 @@ static bool nologo = 0;
 
 static void write_hga_b(unsigned int val, unsigned char reg)
 {
-       outb_p(reg, HGA_INDEX_PORT); 
+       outb_p(reg, HGA_INDEX_PORT);
        outb_p(val, HGA_VALUE_PORT);
 }
 
@@ -155,7 +155,7 @@ static void write_hga_w(unsigned int val, unsigned char reg)
 
 static int test_hga_b(unsigned char val, unsigned char reg)
 {
-       outb_p(reg, HGA_INDEX_PORT); 
+       outb_p(reg, HGA_INDEX_PORT);
        outb  (val, HGA_VALUE_PORT);
        udelay(20); val = (inb_p(HGA_VALUE_PORT) == val);
        return val;
@@ -244,7 +244,7 @@ static void hga_show_logo(struct fb_info *info)
        void __iomem *dest = hga_vram;
        char *logo = linux_logo_bw;
        int x, y;
-       
+
        for (y = 134; y < 134 + 80 ; y++) * this needs some cleanup *
                for (x = 0; x < 10 ; x++)
                        writeb(~*(logo++),(dest + HGA_ROWADDR(y) + x + 40));
@@ -255,7 +255,7 @@ static void hga_pan(unsigned int xoffset, unsigned int yoffset)
 {
        unsigned int base;
        unsigned long flags;
-       
+
        base = (yoffset / 8) * 90 + xoffset;
        spin_lock_irqsave(&hga_reg_lock, flags);
        write_hga_w(base, 0x0c);        /* start address */
@@ -310,7 +310,7 @@ static int hga_card_detect(void)
        /* Ok, there is definitely a card registering at the correct
         * memory location, so now we do an I/O port test.
         */
-       
+
        if (!test_hga_b(0x66, 0x0f))        /* cursor low register */
                goto error;
 
@@ -321,7 +321,7 @@ static int hga_card_detect(void)
         * bit of the status register is changing.  This test lasts for
         * approximately 1/10th of a second.
         */
-       
+
        p_save = q_save = inb_p(HGA_STATUS_PORT) & HGA_STATUS_VSYNC;
 
        for (count=0; count < 50000 && p_save == q_save; count++) {
@@ -329,7 +329,7 @@ static int hga_card_detect(void)
                udelay(2);
        }
 
-       if (p_save == q_save) 
+       if (p_save == q_save)
                goto error;
 
        switch (inb_p(HGA_STATUS_PORT) & 0x70) {
@@ -415,7 +415,7 @@ static int hgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
  *     @info:pointer to fb_info object containing info for current hga board
  *
  *     This function looks only at xoffset, yoffset and the %FB_VMODE_YWRAP
- *     flag in @var. If input parameters are correct it calls hga_pan() to 
+ *     flag in @var. If input parameters are correct it calls hga_pan() to
  *     program the hardware. @info->var is updated to the new values.
  *     A zero is returned on success and %-EINVAL for failure.
  */
@@ -442,9 +442,9 @@ static int hgafb_pan_display(struct fb_var_screeninfo *var,
  *     hgafb_blank - (un)blank the screen
  *     @blank_mode:blanking method to use
  *     @info:unused
- *     
- *     Blank the screen if blank_mode != 0, else unblank. 
- *     Implements VESA suspend and powerdown modes on hardware that supports 
+ *
+ *     Blank the screen if blank_mode != 0, else unblank.
+ *     Implements VESA suspend and powerdown modes on hardware that supports
  *     disabling hsync/vsync:
  *             @blank_mode == 2 means suspend vsync,
  *             @blank_mode == 3 means suspend hsync,
@@ -539,15 +539,15 @@ static const struct fb_ops hgafb_ops = {
        .fb_copyarea    = hgafb_copyarea,
        .fb_imageblit   = hgafb_imageblit,
 };
-               
+
 /* ------------------------------------------------------------------------- *
  *
  * Functions in fb_info
- * 
+ *
  * ------------------------------------------------------------------------- */
 
 /* ------------------------------------------------------------------------- */
-    
+
        /*
         *  Initialization
         */
index cdd44e5..77fbff4 100644 (file)
@@ -92,7 +92,7 @@ static int hpfb_setcolreg(unsigned regno, unsigned red, unsigned green,
 
        if (regno >= info->cmap.len)
                return 1;
-       
+
        while (in_be16(fb_regs + 0x6002) & 0x4) udelay(1);
 
        out_be16(fb_regs + 0x60ba, 0xff);
@@ -143,7 +143,7 @@ static void topcat_blit(int x0, int y0, int x1, int y1, int w, int h, int rr)
        out_8(fb_regs + WMOVE, fb_bitmask);
 }
 
-static void hpfb_copyarea(struct fb_info *info, const struct fb_copyarea *area) 
+static void hpfb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
 {
        topcat_blit(area->sx, area->sy, area->dx, area->dy, area->width, area->height, RR_COPY);
 }
@@ -315,7 +315,7 @@ unmap_screen_base:
        return ret;
 }
 
-/* 
+/*
  * Check that the secondary ID indicates that we have some hope of working with this
  * framebuffer.  The catseye boards are pretty much like topcats and we can muddle through.
  */
@@ -323,7 +323,7 @@ unmap_screen_base:
 #define topcat_sid_ok(x)  (((x) == DIO_ID2_LRCATSEYE) || ((x) == DIO_ID2_HRCCATSEYE)    \
                           || ((x) == DIO_ID2_HRMCATSEYE) || ((x) == DIO_ID2_TOPCAT))
 
-/* 
+/*
  * Initialise the framebuffer
  */
 static int hpfb_dio_probe(struct dio_dev *d, const struct dio_device_id *ent)
index b4b3670..2082b5c 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "i810_regs.h"
 #include "i810.h"
+#include "i810_main.h"
 
 struct mode_registers std_modes[] = {
        /* 640x480 @ 60Hz */
@@ -276,7 +277,7 @@ void i810fb_fill_var_timings(struct fb_var_screeninfo *var)
        var->upper_margin = total - (yres + var->lower_margin + var->vsync_len);
 }
 
-u32 i810_get_watermark(struct fb_var_screeninfo *var,
+u32 i810_get_watermark(const struct fb_var_screeninfo *var,
                       struct i810fb_par *par)
 {
        struct mode_registers *params = &par->regs;
index bea4564..975dd68 100644 (file)
@@ -1347,7 +1347,7 @@ static const struct fb_ops imsttfb_ops = {
        .fb_ioctl       = imsttfb_ioctl,
 };
 
-static void init_imstt(struct fb_info *info)
+static int init_imstt(struct fb_info *info)
 {
        struct imstt_par *par = info->par;
        __u32 i, tmp, *ip, *end;
@@ -1420,7 +1420,7 @@ static void init_imstt(struct fb_info *info)
            || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) {
                printk("imsttfb: %ux%ux%u not supported\n", info->var.xres, info->var.yres, info->var.bits_per_pixel);
                framebuffer_release(info);
-               return;
+               return -ENODEV;
        }
 
        sprintf(info->fix.id, "IMS TT (%s)", par->ramdac == IBM ? "IBM" : "TVP");
@@ -1456,12 +1456,13 @@ static void init_imstt(struct fb_info *info)
 
        if (register_framebuffer(info) < 0) {
                framebuffer_release(info);
-               return;
+               return -ENODEV;
        }
 
        tmp = (read_reg_le32(par->dc_regs, SSTATUS) & 0x0f00) >> 8;
        fb_info(info, "%s frame buffer; %uMB vram; chip version %u\n",
                info->fix.id, info->fix.smem_len >> 20, tmp);
+       return 0;
 }
 
 static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
@@ -1529,10 +1530,10 @@ static int imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        if (!par->cmap_regs)
                goto error;
        info->pseudo_palette = par->palette;
-       init_imstt(info);
-
-       pci_set_drvdata(pdev, info);
-       return 0;
+       ret = init_imstt(info);
+       if (!ret)
+               pci_set_drvdata(pdev, info);
+       return ret;
 
 error:
        if (par->dc_regs)
index 312e35c..44ff860 100644 (file)
@@ -339,7 +339,7 @@ static int civic_setpalette(unsigned int regno, unsigned int red,
 {
        unsigned long flags;
        int clut_status;
-       
+
        local_irq_save(flags);
 
        /* Set the register address */
@@ -439,7 +439,7 @@ static int macfb_setcolreg(unsigned regno, unsigned red, unsigned green,
         * (according to the entries in the `var' structure).
         * Return non-zero for invalid regno.
         */
-       
+
        if (regno >= fb_info->cmap.len)
                return 1;
 
@@ -548,7 +548,7 @@ static int __init macfb_init(void)
                return -ENODEV;
        macfb_setup(option);
 
-       if (!MACH_IS_MAC) 
+       if (!MACH_IS_MAC)
                return -ENODEV;
 
        if (mac_bi_data.id == MAC_MODEL_Q630 ||
@@ -644,7 +644,7 @@ static int __init macfb_init(void)
                err = -EINVAL;
                goto fail_unmap;
        }
-       
+
        /*
         * We take a wild guess that if the video physical address is
         * in nubus slot space, that the nubus card is driving video.
@@ -774,7 +774,7 @@ static int __init macfb_init(void)
                        civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000);
                        break;
 
-               
+
                /*
                 * Assorted weirdos
                 * We think this may be like the LC II
index ae1a42b..4e6b052 100644 (file)
@@ -138,7 +138,7 @@ int __init maxinefb_init(void)
                *(volatile unsigned char *)fboff = 0x0;
 
        maxinefb_fix.smem_start = fb_start;
-       
+
        /* erase hardware cursor */
        for (i = 0; i < 512; i++) {
                maxinefb_ims332_write_register(IMS332_REG_CURSOR_RAM + i,
index 1eaa35c..477789c 100644 (file)
@@ -491,7 +491,8 @@ static int tpo_td043_probe(struct spi_device *spi)
 
        ddata->vcc_reg = devm_regulator_get(&spi->dev, "vcc");
        if (IS_ERR(ddata->vcc_reg)) {
-               r = dev_err_probe(&spi->dev, r, "failed to get LCD VCC regulator\n");
+               r = dev_err_probe(&spi->dev, PTR_ERR(ddata->vcc_reg),
+                                 "failed to get LCD VCC regulator\n");
                goto err_regulator;
        }
 
index 3e44f95..0876962 100644 (file)
@@ -65,7 +65,7 @@ static const struct fb_ops p9100_ops = {
 #define P9100_FB_OFF 0x0UL
 
 /* 3 bits: 2=8bpp 3=16bpp 5=32bpp 7=24bpp */
-#define SYS_CONFIG_PIXELSIZE_SHIFT 26 
+#define SYS_CONFIG_PIXELSIZE_SHIFT 26
 
 #define SCREENPAINT_TIMECTL1_ENABLE_VIDEO 0x20 /* 0 = off, 1 = on */
 
@@ -110,7 +110,7 @@ struct p9100_regs {
        u32 vram_xxx[25];
 
        /* Registers for IBM RGB528 Palette */
-       u32 ramdac_cmap_wridx; 
+       u32 ramdac_cmap_wridx;
        u32 ramdac_palette_data;
        u32 ramdac_pixel_mask;
        u32 ramdac_palette_rdaddr;
index 82f019f..f8283fc 100644 (file)
@@ -52,17 +52,17 @@ struct fb_info_platinum {
                __u8 red, green, blue;
        }                               palette[256];
        u32                             pseudo_palette[16];
-       
+
        volatile struct cmap_regs       __iomem *cmap_regs;
        unsigned long                   cmap_regs_phys;
-       
+
        volatile struct platinum_regs   __iomem *platinum_regs;
        unsigned long                   platinum_regs_phys;
-       
+
        __u8                            __iomem *frame_buffer;
        volatile __u8                   __iomem *base_frame_buffer;
        unsigned long                   frame_buffer_phys;
-       
+
        unsigned long                   total_vram;
        int                             clktype;
        int                             dactype;
@@ -133,7 +133,7 @@ static int platinumfb_set_par (struct fb_info *info)
        platinum_set_hardware(pinfo);
 
        init = platinum_reg_init[pinfo->vmode-1];
-       
+
        if ((pinfo->vmode == VMODE_832_624_75) && (pinfo->cmode > CMODE_8))
                offset = 0x10;
 
@@ -214,7 +214,7 @@ static int platinumfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
                        break;
                }
        }
-       
+
        return 0;
 }
 
@@ -269,7 +269,7 @@ static void platinum_set_hardware(struct fb_info_platinum *pinfo)
        struct platinum_regvals         *init;
        int                             i;
        int                             vmode, cmode;
-       
+
        vmode = pinfo->vmode;
        cmode = pinfo->cmode;
 
@@ -436,7 +436,7 @@ static int read_platinum_sense(struct fb_info_platinum *info)
  * This routine takes a user-supplied var, and picks the best vmode/cmode from it.
  * It also updates the var structure to the actual mode data obtained
  */
-static int platinum_var_to_par(struct fb_var_screeninfo *var, 
+static int platinum_var_to_par(struct fb_var_screeninfo *var,
                               struct fb_info_platinum *pinfo,
                               int check_only)
 {
@@ -478,12 +478,12 @@ static int platinum_var_to_par(struct fb_var_screeninfo *var,
        pinfo->yoffset = 0;
        pinfo->vxres = pinfo->xres;
        pinfo->vyres = pinfo->yres;
-       
+
        return 0;
 }
 
 
-/* 
+/*
  * Parse user specified options (`video=platinumfb:')
  */
 static int __init platinumfb_setup(char *options)
@@ -624,7 +624,7 @@ static int platinumfb_probe(struct platform_device* odev)
                break;
        }
        dev_set_drvdata(&odev->dev, info);
-       
+
        rc = platinum_init_fb(info);
        if (rc != 0) {
                iounmap(pinfo->frame_buffer);
@@ -640,9 +640,9 @@ static void platinumfb_remove(struct platform_device* odev)
 {
        struct fb_info          *info = dev_get_drvdata(&odev->dev);
        struct fb_info_platinum *pinfo = info->par;
-       
+
         unregister_framebuffer (info);
-       
+
        /* Unmap frame buffer and registers */
        iounmap(pinfo->frame_buffer);
        iounmap(pinfo->platinum_regs);
@@ -656,7 +656,7 @@ static void platinumfb_remove(struct platform_device* odev)
        framebuffer_release(info);
 }
 
-static struct of_device_id platinumfb_match[] = 
+static struct of_device_id platinumfb_match[] =
 {
        {
        .name           = "platinum",
@@ -664,7 +664,7 @@ static struct of_device_id platinumfb_match[] =
        {},
 };
 
-static struct platform_driver platinum_driver = 
+static struct platform_driver platinum_driver =
 {
        .driver = {
                .name = "platinumfb",
index b1b8ccd..a2408bf 100644 (file)
  *     - Driver appears to be working for Brutus 320x200x8bpp mode.  Other
  *       resolutions are working, but only the 8bpp mode is supported.
  *       Changes need to be made to the palette encode and decode routines
- *       to support 4 and 16 bpp modes.  
+ *       to support 4 and 16 bpp modes.
  *       Driver is not designed to be a module.  The FrameBuffer is statically
- *       allocated since dynamic allocation of a 300k buffer cannot be 
- *       guaranteed. 
+ *       allocated since dynamic allocation of a 300k buffer cannot be
+ *       guaranteed.
  *
  * 1999/06/17:
  *     - FrameBuffer memory is now allocated at run-time when the
- *       driver is initialized.    
+ *       driver is initialized.
  *
  * 2000/04/10: Nicolas Pitre <nico@fluxnic.net>
  *     - Big cleanup for dynamic selection of machine type at run time.
@@ -74,8 +74,8 @@
  *
  * 2000/08/07: Tak-Shing Chan <tchan.rd@idthk.com>
  *            Jeff Sutherland <jsutherland@accelent.com>
- *     - Resolved an issue caused by a change made to the Assabet's PLD 
- *       earlier this year which broke the framebuffer driver for newer 
+ *     - Resolved an issue caused by a change made to the Assabet's PLD
+ *       earlier this year which broke the framebuffer driver for newer
  *       Phase 4 Assabets.  Some other parameters were changed to optimize
  *       for the Sharp display.
  *
  * 2000/11/23: Eric Peng <ericpeng@coventive.com>
  *     - Freebird add
  *
- * 2001/02/07: Jamey Hicks <jamey.hicks@compaq.com> 
+ * 2001/02/07: Jamey Hicks <jamey.hicks@compaq.com>
  *            Cliff Brake <cbrake@accelent.com>
  *     - Added PM callback
  *
@@ -500,7 +500,7 @@ sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
  *     the shortest recovery time
  *  Suspend
  *     This refers to a level of power management in which substantial power
- *     reduction is achieved by the display.  The display can have a longer 
+ *     reduction is achieved by the display.  The display can have a longer
  *     recovery time from this state than from the Stand-by state
  *  Off
  *     This indicates that the display is consuming the lowest level of power
@@ -522,9 +522,9 @@ sa1100fb_set_cmap(struct fb_cmap *cmap, int kspc, int con,
  */
 /*
  * sa1100fb_blank():
- *     Blank the display by setting all palette values to zero.  Note, the 
+ *     Blank the display by setting all palette values to zero.  Note, the
  *     12 and 16 bpp modes don't really use the palette, so this will not
- *      blank the display in all modes.  
+ *      blank the display in all modes.
  */
 static int sa1100fb_blank(int blank, struct fb_info *info)
 {
@@ -603,8 +603,8 @@ static inline unsigned int get_pcd(struct sa1100fb_info *fbi,
 
 /*
  * sa1100fb_activate_var():
- *     Configures LCD Controller based on entries in var parameter.  Settings are      
- *     only written to the controller if changes were made.  
+ *     Configures LCD Controller based on entries in var parameter.  Settings are
+ *     only written to the controller if changes were made.
  */
 static int sa1100fb_activate_var(struct fb_var_screeninfo *var, struct sa1100fb_info *fbi)
 {
@@ -747,7 +747,7 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)
         *
         * SA1110 spec update nr. 25 says we can and should
         * clear LDD15 to 12 for 4 or 8bpp modes with active
-        * panels.  
+        * panels.
         */
        if ((fbi->reg_lccr0 & LCCR0_CMS) == LCCR0_Color &&
            (fbi->reg_lccr0 & (LCCR0_Dual|LCCR0_Act)) != 0) {
@@ -1020,9 +1020,9 @@ static int sa1100fb_resume(struct platform_device *dev)
 
 /*
  * sa1100fb_map_video_memory():
- *      Allocates the DRAM memory for the frame buffer.  This buffer is  
- *     remapped into a non-cached, non-buffered, memory region to  
- *      allow palette and pixel writes to occur without flushing the 
+ *      Allocates the DRAM memory for the frame buffer.  This buffer is
+ *     remapped into a non-cached, non-buffered, memory region to
+ *      allow palette and pixel writes to occur without flushing the
  *      cache.  Once this area is remapped, all virtual memory
  *      access to the video memory should occur at the new region.
  */
index ef8a4c5..686a234 100644 (file)
@@ -1,11 +1,11 @@
 /*
- * linux/drivers/video/stifb.c - 
- * Low level Frame buffer driver for HP workstations with 
+ * linux/drivers/video/stifb.c -
+ * Low level Frame buffer driver for HP workstations with
  * STI (standard text interface) video firmware.
  *
  * Copyright (C) 2001-2006 Helge Deller <deller@gmx.de>
  * Portions Copyright (C) 2001 Thomas Bogendoerfer <tsbogend@alpha.franken.de>
- * 
+ *
  * Based on:
  * - linux/drivers/video/artistfb.c -- Artist frame buffer driver
  *     Copyright (C) 2000 Philipp Rumpf <prumpf@tux.org>
@@ -14,7 +14,7 @@
  * - HP Xhp cfb-based X11 window driver for XFree86
  *     (c)Copyright 1992 Hewlett-Packard Co.
  *
- * 
+ *
  *  The following graphics display devices (NGLE family) are supported by this driver:
  *
  *  HPA4070A   known as "HCRX", a 1280x1024 color device with 8 planes
@@ -30,7 +30,7 @@
  *             supports 1280x1024 color displays with 8 planes.
  *  HP710G     same as HP710C, 1280x1024 grayscale only
  *  HP710L     same as HP710C, 1024x768 color only
- *  HP712      internal graphics support on HP9000s712 SPU, supports 640x480, 
+ *  HP712      internal graphics support on HP9000s712 SPU, supports 640x480,
  *             1024x768 or 1280x1024 color displays on 8 planes (Artist)
  *
  * This file is subject to the terms and conditions of the GNU General Public
@@ -92,7 +92,7 @@ typedef struct {
        __s32   misc_video_end;
 } video_setup_t;
 
-typedef struct {                  
+typedef struct {
        __s16   sizeof_ngle_data;
        __s16   x_size_visible;     /* visible screen dim in pixels  */
        __s16   y_size_visible;
@@ -177,10 +177,10 @@ static int __initdata stifb_bpp_pref[MAX_STI_ROMS];
 #endif /* DEBUG_STIFB_REGS */
 
 
-#define ENABLE 1       /* for enabling/disabling screen */     
+#define ENABLE 1       /* for enabling/disabling screen */
 #define DISABLE 0
 
-#define NGLE_LOCK(fb_info)     do { } while (0) 
+#define NGLE_LOCK(fb_info)     do { } while (0)
 #define NGLE_UNLOCK(fb_info)   do { } while (0)
 
 static void
@@ -198,9 +198,9 @@ SETUP_HW(struct stifb_info *fb)
 
 static void
 SETUP_FB(struct stifb_info *fb)
-{      
+{
        unsigned int reg10_value = 0;
-       
+
        SETUP_HW(fb);
        switch (fb->id)
        {
@@ -210,15 +210,15 @@ SETUP_FB(struct stifb_info *fb)
                        reg10_value = 0x13601000;
                        break;
                case S9000_ID_A1439A:
-                       if (fb->info.var.bits_per_pixel == 32)                                          
+                       if (fb->info.var.bits_per_pixel == 32)
                                reg10_value = 0xBBA0A000;
-                       else 
+                       else
                                reg10_value = 0x13601000;
                        break;
                case S9000_ID_HCRX:
                        if (fb->info.var.bits_per_pixel == 32)
                                reg10_value = 0xBBA0A000;
-                       else                                    
+                       else
                                reg10_value = 0x13602000;
                        break;
                case S9000_ID_TIMBER:
@@ -243,7 +243,7 @@ START_IMAGE_COLORMAP_ACCESS(struct stifb_info *fb)
 }
 
 static void
-WRITE_IMAGE_COLOR(struct stifb_info *fb, int index, int color) 
+WRITE_IMAGE_COLOR(struct stifb_info *fb, int index, int color)
 {
        SETUP_HW(fb);
        WRITE_WORD(((0x100+index)<<2), fb, REG_3);
@@ -251,30 +251,30 @@ WRITE_IMAGE_COLOR(struct stifb_info *fb, int index, int color)
 }
 
 static void
-FINISH_IMAGE_COLORMAP_ACCESS(struct stifb_info *fb) 
-{              
+FINISH_IMAGE_COLORMAP_ACCESS(struct stifb_info *fb)
+{
        WRITE_WORD(0x400, fb, REG_2);
        if (fb->info.var.bits_per_pixel == 32) {
                WRITE_WORD(0x83000100, fb, REG_1);
        } else {
                if (fb->id == S9000_ID_ARTIST || fb->id == CRT_ID_VISUALIZE_EG)
                        WRITE_WORD(0x80000100, fb, REG_26);
-               else                                                    
+               else
                        WRITE_WORD(0x80000100, fb, REG_1);
        }
        SETUP_FB(fb);
 }
 
 static void
-SETUP_RAMDAC(struct stifb_info *fb) 
+SETUP_RAMDAC(struct stifb_info *fb)
 {
        SETUP_HW(fb);
        WRITE_WORD(0x04000000, fb, 0x1020);
        WRITE_WORD(0xff000000, fb, 0x1028);
 }
 
-static void 
-CRX24_SETUP_RAMDAC(struct stifb_info *fb) 
+static void
+CRX24_SETUP_RAMDAC(struct stifb_info *fb)
 {
        SETUP_HW(fb);
        WRITE_WORD(0x04000000, fb, 0x1000);
@@ -286,14 +286,14 @@ CRX24_SETUP_RAMDAC(struct stifb_info *fb)
 }
 
 #if 0
-static void 
+static void
 HCRX_SETUP_RAMDAC(struct stifb_info *fb)
 {
        WRITE_WORD(0xffffffff, fb, REG_32);
 }
 #endif
 
-static void 
+static void
 CRX24_SET_OVLY_MASK(struct stifb_info *fb)
 {
        SETUP_HW(fb);
@@ -314,7 +314,7 @@ ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
         WRITE_WORD(value,      fb, 0x1038);
 }
 
-static void 
+static void
 CRX24_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
 {
        unsigned int value = enable ? 0x10000000 : 0x30000000;
@@ -325,11 +325,11 @@ CRX24_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
 }
 
 static void
-ARTIST_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable) 
+ARTIST_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
 {
        u32 DregsMiscVideo = REG_21;
        u32 DregsMiscCtl = REG_27;
-       
+
        SETUP_HW(fb);
        if (enable) {
          WRITE_WORD(READ_WORD(fb, DregsMiscVideo) | 0x0A000000, fb, DregsMiscVideo);
@@ -344,7 +344,7 @@ ARTIST_ENABLE_DISABLE_DISPLAY(struct stifb_info *fb, int enable)
        (READ_BYTE(fb, REG_16b3) - 1)
 
 #define HYPER_CONFIG_PLANES_24 0x00000100
-       
+
 #define IS_24_DEVICE(fb) \
        (fb->deviceSpecificConfig & HYPER_CONFIG_PLANES_24)
 
@@ -470,15 +470,15 @@ SETUP_ATTR_ACCESS(struct stifb_info *fb, unsigned BufferNumber)
 }
 
 static void
-SET_ATTR_SIZE(struct stifb_info *fb, int width, int height) 
+SET_ATTR_SIZE(struct stifb_info *fb, int width, int height)
 {
-       /* REG_6 seems to have special values when run on a 
+       /* REG_6 seems to have special values when run on a
           RDI precisionbook parisc laptop (INTERNAL_EG_DX1024 or
           INTERNAL_EG_X1024).  The values are:
                0x2f0: internal (LCD) & external display enabled
                0x2a0: external display only
                0x000: zero on standard artist graphic cards
-       */ 
+       */
        WRITE_WORD(0x00000000, fb, REG_6);
        WRITE_WORD((width<<16) | height, fb, REG_9);
        WRITE_WORD(0x05000000, fb, REG_6);
@@ -486,7 +486,7 @@ SET_ATTR_SIZE(struct stifb_info *fb, int width, int height)
 }
 
 static void
-FINISH_ATTR_ACCESS(struct stifb_info *fb) 
+FINISH_ATTR_ACCESS(struct stifb_info *fb)
 {
        SETUP_HW(fb);
        WRITE_WORD(0x00000000, fb, REG_12);
@@ -499,7 +499,7 @@ elkSetupPlanes(struct stifb_info *fb)
        SETUP_FB(fb);
 }
 
-static void 
+static void
 ngleSetupAttrPlanes(struct stifb_info *fb, int BufferNumber)
 {
        SETUP_ATTR_ACCESS(fb, BufferNumber);
@@ -519,7 +519,7 @@ rattlerSetupPlanes(struct stifb_info *fb)
         * read mask register for overlay planes, not image planes).
         */
        CRX24_SETUP_RAMDAC(fb);
-    
+
        /* change fb->id temporarily to fool SETUP_FB() */
        saved_id = fb->id;
        fb->id = CRX24_OVERLAY_PLANES;
@@ -565,7 +565,7 @@ setNgleLutBltCtl(struct stifb_info *fb, int offsetWithinLut, int length)
        lutBltCtl.all           = 0x80000000;
        lutBltCtl.fields.length = length;
 
-       switch (fb->id) 
+       switch (fb->id)
        {
        case S9000_ID_A1439A:           /* CRX24 */
                if (fb->var.bits_per_pixel == 8) {
@@ -576,12 +576,12 @@ setNgleLutBltCtl(struct stifb_info *fb, int offsetWithinLut, int length)
                        lutBltCtl.fields.lutOffset = 0 * 256;
                }
                break;
-               
+
        case S9000_ID_ARTIST:
                lutBltCtl.fields.lutType = NGLE_CMAP_INDEXED0_TYPE;
                lutBltCtl.fields.lutOffset = 0 * 256;
                break;
-               
+
        default:
                lutBltCtl.fields.lutType = NGLE_CMAP_INDEXED0_TYPE;
                lutBltCtl.fields.lutOffset = 0;
@@ -596,7 +596,7 @@ setNgleLutBltCtl(struct stifb_info *fb, int offsetWithinLut, int length)
 #endif
 
 static NgleLutBltCtl
-setHyperLutBltCtl(struct stifb_info *fb, int offsetWithinLut, int length) 
+setHyperLutBltCtl(struct stifb_info *fb, int offsetWithinLut, int length)
 {
        NgleLutBltCtl lutBltCtl;
 
@@ -633,7 +633,7 @@ static void hyperUndoITE(struct stifb_info *fb)
 
        /* Hardware setup for full-depth write to "magic" location */
        GET_FIFO_SLOTS(fb, nFreeFifoSlots, 7);
-       NGLE_QUICK_SET_DST_BM_ACCESS(fb, 
+       NGLE_QUICK_SET_DST_BM_ACCESS(fb,
                BA(IndexedDcd, Otc04, Ots08, AddrLong,
                BAJustPoint(0), BINovly, BAIndexBase(0)));
        NGLE_QUICK_SET_IMAGE_BITMAP_OP(fb,
@@ -653,13 +653,13 @@ static void hyperUndoITE(struct stifb_info *fb)
        NGLE_UNLOCK(fb);
 }
 
-static void 
+static void
 ngleDepth8_ClearImagePlanes(struct stifb_info *fb)
 {
        /* FIXME! */
 }
 
-static void 
+static void
 ngleDepth24_ClearImagePlanes(struct stifb_info *fb)
 {
        /* FIXME! */
@@ -675,7 +675,7 @@ ngleResetAttrPlanes(struct stifb_info *fb, unsigned int ctlPlaneReg)
        NGLE_LOCK(fb);
 
        GET_FIFO_SLOTS(fb, nFreeFifoSlots, 4);
-       NGLE_QUICK_SET_DST_BM_ACCESS(fb, 
+       NGLE_QUICK_SET_DST_BM_ACCESS(fb,
                                     BA(IndexedDcd, Otc32, OtsIndirect,
                                        AddrLong, BAJustPoint(0),
                                        BINattr, BAIndexBase(0)));
@@ -713,22 +713,22 @@ ngleResetAttrPlanes(struct stifb_info *fb, unsigned int ctlPlaneReg)
        /**** Finally, set the Control Plane Register back to zero: ****/
        GET_FIFO_SLOTS(fb, nFreeFifoSlots, 1);
        NGLE_QUICK_SET_CTL_PLN_REG(fb, 0);
-       
+
        NGLE_UNLOCK(fb);
 }
-    
+
 static void
 ngleClearOverlayPlanes(struct stifb_info *fb, int mask, int data)
 {
        int nFreeFifoSlots = 0;
        u32 packed_dst;
        u32 packed_len;
-    
+
        NGLE_LOCK(fb);
 
        /* Hardware setup */
        GET_FIFO_SLOTS(fb, nFreeFifoSlots, 8);
-       NGLE_QUICK_SET_DST_BM_ACCESS(fb, 
+       NGLE_QUICK_SET_DST_BM_ACCESS(fb,
                                     BA(IndexedDcd, Otc04, Ots08, AddrLong,
                                        BAJustPoint(0), BINovly, BAIndexBase(0)));
 
@@ -736,23 +736,23 @@ ngleClearOverlayPlanes(struct stifb_info *fb, int mask, int data)
 
         NGLE_REALLY_SET_IMAGE_FG_COLOR(fb, data);
         NGLE_REALLY_SET_IMAGE_PLANEMASK(fb, mask);
-    
+
         packed_dst = 0;
         packed_len = (fb->info.var.xres << 16) | fb->info.var.yres;
         NGLE_SET_DSTXY(fb, packed_dst);
-    
-        /* Write zeroes to overlay planes */                  
+
+       /* Write zeroes to overlay planes */
        NGLE_QUICK_SET_IMAGE_BITMAP_OP(fb,
                                       IBOvals(RopSrc, MaskAddrOffset(0),
                                               BitmapExtent08, StaticReg(0),
                                               DataDynamic, MaskOtc, BGx(0), FGx(0)));
-                      
+
         SET_LENXY_START_RECFILL(fb, packed_len);
 
        NGLE_UNLOCK(fb);
 }
 
-static void 
+static void
 hyperResetPlanes(struct stifb_info *fb, int enable)
 {
        unsigned int controlPlaneReg;
@@ -783,7 +783,7 @@ hyperResetPlanes(struct stifb_info *fb, int enable)
                ngleClearOverlayPlanes(fb, 0xff, 255);
 
                /**************************************************
-                ** Also need to counteract ITE settings 
+                ** Also need to counteract ITE settings
                 **************************************************/
                hyperUndoITE(fb);
                break;
@@ -803,13 +803,13 @@ hyperResetPlanes(struct stifb_info *fb, int enable)
                ngleResetAttrPlanes(fb, controlPlaneReg);
                break;
        }
-       
+
        NGLE_UNLOCK(fb);
 }
 
 /* Return pointer to in-memory structure holding ELK device-dependent ROM values. */
 
-static void 
+static void
 ngleGetDeviceRomData(struct stifb_info *fb)
 {
 #if 0
@@ -821,7 +821,7 @@ XXX: FIXME: !!!
        char    *pCard8;
        int     i;
        char    *mapOrigin = NULL;
-    
+
        int romTableIdx;
 
        pPackedDevRomData = fb->ngle_rom;
@@ -888,7 +888,7 @@ SETUP_HCRX(struct stifb_info *fb)
 
        /* Initialize Hyperbowl registers */
        GET_FIFO_SLOTS(fb, nFreeFifoSlots, 7);
-       
+
        if (IS_24_DEVICE(fb)) {
                hyperbowl = (fb->info.var.bits_per_pixel == 32) ?
                        HYPERBOWL_MODE01_8_24_LUT0_TRANSPARENT_LUT1_OPAQUE :
@@ -897,9 +897,9 @@ SETUP_HCRX(struct stifb_info *fb)
                /* First write to Hyperbowl must happen twice (bug) */
                WRITE_WORD(hyperbowl, fb, REG_40);
                WRITE_WORD(hyperbowl, fb, REG_40);
-               
+
                WRITE_WORD(HYPERBOWL_MODE2_8_24, fb, REG_39);
-               
+
                WRITE_WORD(0x014c0148, fb, REG_42); /* Set lut 0 to be the direct color */
                WRITE_WORD(0x404c4048, fb, REG_43);
                WRITE_WORD(0x034c0348, fb, REG_44);
@@ -990,7 +990,7 @@ stifb_setcolreg(u_int regno, u_int red, u_int green,
                                0,      /* Offset w/i LUT */
                                256);   /* Load entire LUT */
                NGLE_BINC_SET_SRCADDR(fb,
-                               NGLE_LONG_FB_ADDRESS(0, 0x100, 0)); 
+                               NGLE_LONG_FB_ADDRESS(0, 0x100, 0));
                                /* 0x100 is same as used in WRITE_IMAGE_COLOR() */
                START_COLORMAPLOAD(fb, lutBltCtl.all);
                SETUP_FB(fb);
@@ -1028,7 +1028,7 @@ stifb_blank(int blank_mode, struct fb_info *info)
                ENABLE_DISABLE_DISPLAY(fb, enable);
                break;
        }
-       
+
        SETUP_FB(fb);
        return 0;
 }
@@ -1114,15 +1114,15 @@ stifb_init_display(struct stifb_info *fb)
 
        /* HCRX specific initialization */
        SETUP_HCRX(fb);
-       
+
        /*
        if (id == S9000_ID_HCRX)
                hyperInitSprite(fb);
        else
                ngleInitSprite(fb);
        */
-       
-       /* Initialize the image planes. */ 
+
+       /* Initialize the image planes. */
         switch (id) {
         case S9000_ID_HCRX:
            hyperResetPlanes(fb, ENABLE);
@@ -1194,7 +1194,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        fb = kzalloc(sizeof(*fb), GFP_ATOMIC);
        if (!fb)
                return -ENOMEM;
-       
+
        info = &fb->info;
 
        /* set struct to a known state */
@@ -1235,7 +1235,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
                        dev_name, fb->id);
                goto out_err0;
        }
-       
+
        /* default to 8 bpp on most graphic chips */
        bpp = 8;
        xres = sti_onscreen_x(fb->sti);
@@ -1256,7 +1256,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
                fb->id = S9000_ID_A1659A;
                break;
        case S9000_ID_TIMBER:   /* HP9000/710 Any (may be a grayscale device) */
-               if (strstr(dev_name, "GRAYSCALE") || 
+               if (strstr(dev_name, "GRAYSCALE") ||
                    strstr(dev_name, "Grayscale") ||
                    strstr(dev_name, "grayscale"))
                        var->grayscale = 1;
@@ -1295,16 +1295,16 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        case CRT_ID_VISUALIZE_EG:
        case S9000_ID_ARTIST:   /* Artist */
                break;
-       default: 
+       default:
 #ifdef FALLBACK_TO_1BPP
-               printk(KERN_WARNING 
+               printk(KERN_WARNING
                        "stifb: Unsupported graphics card (id=0x%08x) "
                                "- now trying 1bpp mode instead\n",
                        fb->id);
                bpp = 1;        /* default to 1 bpp */
                break;
 #else
-               printk(KERN_WARNING 
+               printk(KERN_WARNING
                        "stifb: Unsupported graphics card (id=0x%08x) "
                                "- skipping.\n",
                        fb->id);
@@ -1320,11 +1320,11 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
        fix->line_length = (fb->sti->glob_cfg->total_x * bpp) / 8;
        if (!fix->line_length)
                fix->line_length = 2048; /* default */
-       
+
        /* limit fbsize to max visible screen size */
        if (fix->smem_len > yres*fix->line_length)
                fix->smem_len = ALIGN(yres*fix->line_length, 4*1024*1024);
-       
+
        fix->accel = FB_ACCEL_NONE;
 
        switch (bpp) {
@@ -1350,7 +1350,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
            default:
                break;
        }
-       
+
        var->xres = var->xres_virtual = xres;
        var->yres = var->yres_virtual = yres;
        var->bits_per_pixel = bpp;
@@ -1379,7 +1379,7 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
                                fix->smem_start, fix->smem_start+fix->smem_len);
                goto out_err2;
        }
-               
+
        if (!request_mem_region(fix->mmio_start, fix->mmio_len, "stifb mmio")) {
                printk(KERN_ERR "stifb: cannot reserve sti mmio region 0x%04lx-0x%04lx\n",
                                fix->mmio_start, fix->mmio_start+fix->mmio_len);
@@ -1393,11 +1393,11 @@ static int __init stifb_init_fb(struct sti_struct *sti, int bpp_pref)
 
        fb_info(&fb->info, "%s %dx%d-%d frame buffer device, %s, id: %04x, mmio: 0x%04lx\n",
                fix->id,
-               var->xres, 
+               var->xres,
                var->yres,
                var->bits_per_pixel,
                dev_name,
-               fb->id, 
+               fb->id,
                fix->mmio_start);
 
        return 0;
@@ -1413,6 +1413,7 @@ out_err1:
        iounmap(info->screen_base);
 out_err0:
        kfree(fb);
+       sti->info = NULL;
        return -ENXIO;
 }
 
@@ -1426,7 +1427,7 @@ static int __init stifb_init(void)
        struct sti_struct *sti;
        struct sti_struct *def_sti;
        int i;
-       
+
 #ifndef MODULE
        char *option = NULL;
 
@@ -1438,7 +1439,7 @@ static int __init stifb_init(void)
                printk(KERN_INFO "stifb: disabled by \"stifb=off\" kernel parameter\n");
                return -ENXIO;
        }
-       
+
        def_sti = sti_get_rom(0);
        if (def_sti) {
                for (i = 1; i <= MAX_STI_ROMS; i++) {
@@ -1472,7 +1473,7 @@ stifb_cleanup(void)
 {
        struct sti_struct *sti;
        int i;
-       
+
        for (i = 1; i <= MAX_STI_ROMS; i++) {
                sti = sti_get_rom(i);
                if (!sti)
@@ -1495,10 +1496,10 @@ int __init
 stifb_setup(char *options)
 {
        int i;
-       
+
        if (!options || !*options)
                return 1;
-       
+
        if (strncmp(options, "off", 3) == 0) {
                stifb_disabled = 1;
                options += 3;
index 216d49c..dabc30a 100644 (file)
@@ -27,6 +27,8 @@
 #include <video/udlfb.h>
 #include "edid.h"
 
+#define OUT_EP_NUM     1       /* The endpoint number we will use */
+
 static const struct fb_fix_screeninfo dlfb_fix = {
        .id =           "udlfb",
        .type =         FB_TYPE_PACKED_PIXELS,
@@ -1541,24 +1543,16 @@ static const struct device_attribute fb_device_attrs[] = {
 static int dlfb_select_std_channel(struct dlfb_data *dlfb)
 {
        int ret;
-       void *buf;
        static const u8 set_def_chn[] = {
                                0x57, 0xCD, 0xDC, 0xA7,
                                0x1C, 0x88, 0x5E, 0x15,
                                0x60, 0xFE, 0xC6, 0x97,
                                0x16, 0x3D, 0x47, 0xF2  };
 
-       buf = kmemdup(set_def_chn, sizeof(set_def_chn), GFP_KERNEL);
-
-       if (!buf)
-               return -ENOMEM;
-
-       ret = usb_control_msg(dlfb->udev, usb_sndctrlpipe(dlfb->udev, 0),
-                       NR_USB_REQUEST_CHANNEL,
+       ret = usb_control_msg_send(dlfb->udev, 0, NR_USB_REQUEST_CHANNEL,
                        (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
-                       buf, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT);
-
-       kfree(buf);
+                       &set_def_chn, sizeof(set_def_chn), USB_CTRL_SET_TIMEOUT,
+                       GFP_KERNEL);
 
        return ret;
 }
@@ -1652,7 +1646,7 @@ static int dlfb_usb_probe(struct usb_interface *intf,
        struct fb_info *info;
        int retval;
        struct usb_device *usbdev = interface_to_usbdev(intf);
-       struct usb_endpoint_descriptor *out;
+       static u8 out_ep[] = {OUT_EP_NUM + USB_DIR_OUT, 0};
 
        /* usb initialization */
        dlfb = kzalloc(sizeof(*dlfb), GFP_KERNEL);
@@ -1666,9 +1660,9 @@ static int dlfb_usb_probe(struct usb_interface *intf,
        dlfb->udev = usb_get_dev(usbdev);
        usb_set_intfdata(intf, dlfb);
 
-       retval = usb_find_common_endpoints(intf->cur_altsetting, NULL, &out, NULL, NULL);
-       if (retval) {
-               dev_err(&intf->dev, "Device should have at lease 1 bulk endpoint!\n");
+       if (!usb_check_bulk_endpoints(intf, out_ep)) {
+               dev_err(&intf->dev, "Invalid DisplayLink device!\n");
+               retval = -EINVAL;
                goto error;
        }
 
@@ -1927,7 +1921,8 @@ retry:
                }
 
                /* urb->transfer_buffer_length set to actual before submit */
-               usb_fill_bulk_urb(urb, dlfb->udev, usb_sndbulkpipe(dlfb->udev, 1),
+               usb_fill_bulk_urb(urb, dlfb->udev,
+                       usb_sndbulkpipe(dlfb->udev, OUT_EP_NUM),
                        buf, size, dlfb_urb_completion, unode);
                urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
 
index 1007023..b166b7c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  valkyriefb.c -- frame buffer device for the PowerMac 'valkyrie' display
  *
- *  Created 8 August 1998 by 
+ *  Created 8 August 1998 by
  *  Martin Costabel <costabel@wanadoo.fr> and Kevin Schoedel
  *
  *  Vmode-switching changes and vmode 15/17 modifications created 29 August
@@ -77,13 +77,13 @@ struct fb_info_valkyrie {
        struct fb_par_valkyrie  par;
        struct cmap_regs        __iomem *cmap_regs;
        unsigned long           cmap_regs_phys;
-       
+
        struct valkyrie_regs    __iomem *valkyrie_regs;
        unsigned long           valkyrie_regs_phys;
-       
+
        __u8                    __iomem *frame_buffer;
        unsigned long           frame_buffer_phys;
-       
+
        int                     sense;
        unsigned long           total_vram;
 
@@ -244,7 +244,7 @@ static inline int valkyrie_vram_reqd(int video_mode, int color_mode)
 {
        int pitch;
        struct valkyrie_regvals *init = valkyrie_reg_init[video_mode-1];
-       
+
        if ((pitch = init->pitch[color_mode]) == 0)
                pitch = 2 * init->pitch[0];
        return init->vres * pitch;
@@ -467,7 +467,7 @@ static int valkyrie_var_to_par(struct fb_var_screeninfo *var,
                printk(KERN_ERR "valkyriefb: vmode %d not valid.\n", vmode);
                return -EINVAL;
        }
-       
+
        if (cmode != CMODE_8 && cmode != CMODE_16) {
                printk(KERN_ERR "valkyriefb: cmode %d not valid.\n", cmode);
                return -EINVAL;
@@ -516,7 +516,7 @@ static void valkyrie_init_fix(struct fb_fix_screeninfo *fix, struct fb_info_valk
        fix->ywrapstep = 0;
        fix->ypanstep = 0;
        fix->xpanstep = 0;
-       
+
 }
 
 /* Fix must already be inited above */
index a945739..6f19909 100644 (file)
@@ -111,7 +111,7 @@ static u_long get_line_length(int xres_virtual, int bpp)
      *  First part, xxxfb_check_var, must not write anything
      *  to hardware, it should only verify and adjust var.
      *  This means it doesn't alter par but it does use hardware
-     *  data from it to check this var. 
+     *  data from it to check this var.
      */
 
 static int vfb_check_var(struct fb_var_screeninfo *var,
@@ -169,7 +169,7 @@ static int vfb_check_var(struct fb_var_screeninfo *var,
 
        /*
         * Now that we checked it we alter var. The reason being is that the video
-        * mode passed in might not work but slight changes to it might make it 
+        * mode passed in might not work but slight changes to it might make it
         * work. This way we let the user know what is acceptable.
         */
        switch (var->bits_per_pixel) {
@@ -235,8 +235,8 @@ static int vfb_check_var(struct fb_var_screeninfo *var,
 }
 
 /* This routine actually sets the video mode. It's in here where we
- * the hardware state info->par and fix which can be affected by the 
- * change in par. For this driver it doesn't do much. 
+ * the hardware state info->par and fix which can be affected by the
+ * change in par. For this driver it doesn't do much.
  */
 static int vfb_set_par(struct fb_info *info)
 {
@@ -379,7 +379,7 @@ static int vfb_pan_display(struct fb_var_screeninfo *var,
 }
 
     /*
-     *  Most drivers don't need their own mmap function 
+     *  Most drivers don't need their own mmap function
      */
 
 static int vfb_mmap(struct fb_info *info,
index e54f088..79336fa 100644 (file)
@@ -45,7 +45,8 @@ static int check_extent_in_eb(struct btrfs_backref_walk_ctx *ctx,
        int root_count;
        bool cached;
 
-       if (!btrfs_file_extent_compression(eb, fi) &&
+       if (!ctx->ignore_extent_item_pos &&
+           !btrfs_file_extent_compression(eb, fi) &&
            !btrfs_file_extent_encryption(eb, fi) &&
            !btrfs_file_extent_other_encoding(eb, fi)) {
                u64 data_offset;
@@ -552,7 +553,7 @@ static int add_all_parents(struct btrfs_backref_walk_ctx *ctx,
                                count++;
                        else
                                goto next;
-                       if (!ctx->ignore_extent_item_pos) {
+                       if (!ctx->skip_inode_ref_list) {
                                ret = check_extent_in_eb(ctx, &key, eb, fi, &eie);
                                if (ret == BTRFS_ITERATE_EXTENT_INODES_STOP ||
                                    ret < 0)
@@ -564,7 +565,7 @@ static int add_all_parents(struct btrfs_backref_walk_ctx *ctx,
                                                  eie, (void **)&old, GFP_NOFS);
                        if (ret < 0)
                                break;
-                       if (!ret && !ctx->ignore_extent_item_pos) {
+                       if (!ret && !ctx->skip_inode_ref_list) {
                                while (old->next)
                                        old = old->next;
                                old->next = eie;
@@ -1606,7 +1607,7 @@ again:
                                goto out;
                }
                if (ref->count && ref->parent) {
-                       if (!ctx->ignore_extent_item_pos && !ref->inode_list &&
+                       if (!ctx->skip_inode_ref_list && !ref->inode_list &&
                            ref->level == 0) {
                                struct btrfs_tree_parent_check check = { 0 };
                                struct extent_buffer *eb;
@@ -1647,7 +1648,7 @@ again:
                                                  (void **)&eie, GFP_NOFS);
                        if (ret < 0)
                                goto out;
-                       if (!ret && !ctx->ignore_extent_item_pos) {
+                       if (!ret && !ctx->skip_inode_ref_list) {
                                /*
                                 * We've recorded that parent, so we must extend
                                 * its inode list here.
@@ -1743,7 +1744,7 @@ int btrfs_find_all_leafs(struct btrfs_backref_walk_ctx *ctx)
 static int btrfs_find_all_roots_safe(struct btrfs_backref_walk_ctx *ctx)
 {
        const u64 orig_bytenr = ctx->bytenr;
-       const bool orig_ignore_extent_item_pos = ctx->ignore_extent_item_pos;
+       const bool orig_skip_inode_ref_list = ctx->skip_inode_ref_list;
        bool roots_ulist_allocated = false;
        struct ulist_iterator uiter;
        int ret = 0;
@@ -1764,7 +1765,7 @@ static int btrfs_find_all_roots_safe(struct btrfs_backref_walk_ctx *ctx)
                roots_ulist_allocated = true;
        }
 
-       ctx->ignore_extent_item_pos = true;
+       ctx->skip_inode_ref_list = true;
 
        ULIST_ITER_INIT(&uiter);
        while (1) {
@@ -1789,7 +1790,7 @@ static int btrfs_find_all_roots_safe(struct btrfs_backref_walk_ctx *ctx)
        ulist_free(ctx->refs);
        ctx->refs = NULL;
        ctx->bytenr = orig_bytenr;
-       ctx->ignore_extent_item_pos = orig_ignore_extent_item_pos;
+       ctx->skip_inode_ref_list = orig_skip_inode_ref_list;
 
        return ret;
 }
@@ -1912,7 +1913,7 @@ int btrfs_is_data_extent_shared(struct btrfs_inode *inode, u64 bytenr,
                goto out_trans;
        }
 
-       walk_ctx.ignore_extent_item_pos = true;
+       walk_ctx.skip_inode_ref_list = true;
        walk_ctx.trans = trans;
        walk_ctx.fs_info = fs_info;
        walk_ctx.refs = &ctx->refs;
index ef6bbea..1616e3e 100644 (file)
@@ -60,6 +60,12 @@ struct btrfs_backref_walk_ctx {
         * @extent_item_pos is ignored.
         */
        bool ignore_extent_item_pos;
+       /*
+        * If true and bytenr corresponds to a data extent, then the inode list
+        * (each member describing inode number, file offset and root) is not
+        * added to each reference added to the @refs ulist.
+        */
+       bool skip_inode_ref_list;
        /* A valid transaction handle or NULL. */
        struct btrfs_trans_handle *trans;
        /*
index 59ea049..fbf9006 100644 (file)
@@ -3121,23 +3121,34 @@ int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs_info)
 {
        int ret;
        const bool cache_opt = btrfs_test_opt(fs_info, SPACE_CACHE);
-       bool clear_free_space_tree = false;
+       bool rebuild_free_space_tree = false;
 
        if (btrfs_test_opt(fs_info, CLEAR_CACHE) &&
            btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
-               clear_free_space_tree = true;
+               rebuild_free_space_tree = true;
        } else if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE) &&
                   !btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID)) {
                btrfs_warn(fs_info, "free space tree is invalid");
-               clear_free_space_tree = true;
+               rebuild_free_space_tree = true;
        }
 
-       if (clear_free_space_tree) {
-               btrfs_info(fs_info, "clearing free space tree");
-               ret = btrfs_clear_free_space_tree(fs_info);
+       if (rebuild_free_space_tree) {
+               btrfs_info(fs_info, "rebuilding free space tree");
+               ret = btrfs_rebuild_free_space_tree(fs_info);
                if (ret) {
                        btrfs_warn(fs_info,
-                                  "failed to clear free space tree: %d", ret);
+                                  "failed to rebuild free space tree: %d", ret);
+                       goto out;
+               }
+       }
+
+       if (btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE) &&
+           !btrfs_test_opt(fs_info, FREE_SPACE_TREE)) {
+               btrfs_info(fs_info, "disabling free space tree");
+               ret = btrfs_delete_free_space_tree(fs_info);
+               if (ret) {
+                       btrfs_warn(fs_info,
+                                  "failed to disable free space tree: %d", ret);
                        goto out;
                }
        }
index d84cef8..cf98a3c 100644 (file)
@@ -870,15 +870,16 @@ static int __load_free_space_cache(struct btrfs_root *root, struct inode *inode,
                        }
                        spin_lock(&ctl->tree_lock);
                        ret = link_free_space(ctl, e);
-                       ctl->total_bitmaps++;
-                       recalculate_thresholds(ctl);
-                       spin_unlock(&ctl->tree_lock);
                        if (ret) {
+                               spin_unlock(&ctl->tree_lock);
                                btrfs_err(fs_info,
                                        "Duplicate entries in free space cache, dumping");
                                kmem_cache_free(btrfs_free_space_cachep, e);
                                goto free_cache;
                        }
+                       ctl->total_bitmaps++;
+                       recalculate_thresholds(ctl);
+                       spin_unlock(&ctl->tree_lock);
                        list_add_tail(&e->list, &bitmaps);
                }
 
index 4d155a4..b21da14 100644 (file)
@@ -1252,7 +1252,7 @@ out:
        return ret;
 }
 
-int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
+int btrfs_delete_free_space_tree(struct btrfs_fs_info *fs_info)
 {
        struct btrfs_trans_handle *trans;
        struct btrfs_root *tree_root = fs_info->tree_root;
@@ -1298,6 +1298,54 @@ abort:
        return ret;
 }
 
+int btrfs_rebuild_free_space_tree(struct btrfs_fs_info *fs_info)
+{
+       struct btrfs_trans_handle *trans;
+       struct btrfs_key key = {
+               .objectid = BTRFS_FREE_SPACE_TREE_OBJECTID,
+               .type = BTRFS_ROOT_ITEM_KEY,
+               .offset = 0,
+       };
+       struct btrfs_root *free_space_root = btrfs_global_root(fs_info, &key);
+       struct rb_node *node;
+       int ret;
+
+       trans = btrfs_start_transaction(free_space_root, 1);
+       if (IS_ERR(trans))
+               return PTR_ERR(trans);
+
+       set_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
+       set_bit(BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, &fs_info->flags);
+
+       ret = clear_free_space_tree(trans, free_space_root);
+       if (ret)
+               goto abort;
+
+       node = rb_first_cached(&fs_info->block_group_cache_tree);
+       while (node) {
+               struct btrfs_block_group *block_group;
+
+               block_group = rb_entry(node, struct btrfs_block_group,
+                                      cache_node);
+               ret = populate_free_space_tree(trans, block_group);
+               if (ret)
+                       goto abort;
+               node = rb_next(node);
+       }
+
+       btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
+       btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
+       clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
+
+       ret = btrfs_commit_transaction(trans);
+       clear_bit(BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, &fs_info->flags);
+       return ret;
+abort:
+       btrfs_abort_transaction(trans, ret);
+       btrfs_end_transaction(trans);
+       return ret;
+}
+
 static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
                                        struct btrfs_block_group *block_group,
                                        struct btrfs_path *path)
index dc2463e..6d5551d 100644 (file)
@@ -18,7 +18,8 @@ struct btrfs_caching_control;
 
 void set_free_space_tree_thresholds(struct btrfs_block_group *block_group);
 int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info);
-int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info);
+int btrfs_delete_free_space_tree(struct btrfs_fs_info *fs_info);
+int btrfs_rebuild_free_space_tree(struct btrfs_fs_info *fs_info);
 int load_free_space_tree(struct btrfs_caching_control *caching_ctl);
 int add_block_group_free_space(struct btrfs_trans_handle *trans,
                               struct btrfs_block_group *block_group);
index 57d0700..19c707b 100644 (file)
@@ -3108,6 +3108,9 @@ int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
                btrfs_rewrite_logical_zoned(ordered_extent);
                btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
                                        ordered_extent->disk_num_bytes);
+       } else if (btrfs_is_data_reloc_root(inode->root)) {
+               btrfs_zone_finish_endio(fs_info, ordered_extent->disk_bytenr,
+                                       ordered_extent->disk_num_bytes);
        }
 
        if (test_bit(BTRFS_ORDERED_TRUNCATED, &ordered_extent->flags)) {
index b93c962..497b9db 100644 (file)
@@ -151,10 +151,10 @@ static void print_extent_item(struct extent_buffer *eb, int slot, int type)
                        pr_cont("shared data backref parent %llu count %u\n",
                               offset, btrfs_shared_data_ref_count(eb, sref));
                        /*
-                        * offset is supposed to be a tree block which
-                        * must be aligned to nodesize.
+                        * Offset is supposed to be a tree block which must be
+                        * aligned to sectorsize.
                         */
-                       if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
+                       if (!IS_ALIGNED(offset, eb->fs_info->sectorsize))
                                pr_info(
                        "\t\t\t(parent %llu not aligned to sectorsize %u)\n",
                                     offset, eb->fs_info->sectorsize);
index 09b1988..59a0649 100644 (file)
@@ -3422,7 +3422,7 @@ int add_data_references(struct reloc_control *rc,
        btrfs_release_path(path);
 
        ctx.bytenr = extent_key->objectid;
-       ctx.ignore_extent_item_pos = true;
+       ctx.skip_inode_ref_list = true;
        ctx.fs_info = rc->extent_root->fs_info;
 
        ret = btrfs_find_all_leafs(&ctx);
index 0f2f915..ec18e22 100644 (file)
@@ -828,8 +828,7 @@ out:
                ret = -EINVAL;
        }
        if (btrfs_fs_compat_ro(info, BLOCK_GROUP_TREE) &&
-           (btrfs_test_opt(info, CLEAR_CACHE) ||
-            !btrfs_test_opt(info, FREE_SPACE_TREE))) {
+            !btrfs_test_opt(info, FREE_SPACE_TREE)) {
                btrfs_err(info, "cannot disable free space tree with block-group-tree feature");
                ret = -EINVAL;
        }
index d510576..39828af 100644 (file)
@@ -122,10 +122,9 @@ static int sb_write_pointer(struct block_device *bdev, struct blk_zone *zones,
                int i;
 
                for (i = 0; i < BTRFS_NR_SB_LOG_ZONES; i++) {
-                       u64 bytenr;
-
-                       bytenr = ((zones[i].start + zones[i].len)
-                                  << SECTOR_SHIFT) - BTRFS_SUPER_INFO_SIZE;
+                       u64 zone_end = (zones[i].start + zones[i].capacity) << SECTOR_SHIFT;
+                       u64 bytenr = ALIGN_DOWN(zone_end, BTRFS_SUPER_INFO_SIZE) -
+                                               BTRFS_SUPER_INFO_SIZE;
 
                        page[i] = read_cache_page_gfp(mapping,
                                        bytenr >> PAGE_SHIFT, GFP_NOFS);
@@ -1610,11 +1609,11 @@ void btrfs_redirty_list_add(struct btrfs_transaction *trans,
            !list_empty(&eb->release_list))
                return;
 
+       memzero_extent_buffer(eb, 0, eb->len);
+       set_bit(EXTENT_BUFFER_NO_CHECK, &eb->bflags);
        set_extent_buffer_dirty(eb);
        set_extent_bits_nowait(&trans->dirty_pages, eb->start,
                               eb->start + eb->len - 1, EXTENT_DIRTY);
-       memzero_extent_buffer(eb, 0, eb->len);
-       set_bit(EXTENT_BUFFER_NO_CHECK, &eb->bflags);
 
        spin_lock(&trans->releasing_ebs_lock);
        list_add_tail(&eb->release_list, &trans->releasing_ebs);
index 29cf002..4c0f22a 100644 (file)
@@ -3942,7 +3942,7 @@ static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
        struct dentry *dentry;
        struct ceph_cap *cap;
        char *path;
-       int pathlen = 0, err = 0;
+       int pathlen = 0, err;
        u64 pathbase;
        u64 snap_follows;
 
@@ -3965,6 +3965,7 @@ static int reconnect_caps_cb(struct inode *inode, int mds, void *arg)
        cap = __get_cap_for_mds(ci, mds);
        if (!cap) {
                spin_unlock(&ci->i_ceph_lock);
+               err = 0;
                goto out_err;
        }
        dout(" adding %p ino %llx.%llx cap %p %lld %s\n",
index 8700720..0b236eb 100644 (file)
@@ -1111,6 +1111,19 @@ skip_inode:
                                continue;
                        adjust_snap_realm_parent(mdsc, child, realm->ino);
                }
+       } else {
+               /*
+                * In the non-split case both 'num_split_inos' and
+                * 'num_split_realms' should be 0, making this a no-op.
+                * However the MDS happens to populate 'split_realms' list
+                * in one of the UPDATE op cases by mistake.
+                *
+                * Skip both lists just in case to ensure that 'p' is
+                * positioned at the start of realm info, as expected by
+                * ceph_update_snap_trace().
+                */
+               p += sizeof(u64) * num_split_inos;
+               p += sizeof(u64) * num_split_realms;
        }
 
        /*
index 32f7c81..43a4d86 100644 (file)
@@ -246,7 +246,7 @@ cifs_read_super(struct super_block *sb)
        if (cifs_sb->ctx->rasize)
                sb->s_bdi->ra_pages = cifs_sb->ctx->rasize / PAGE_SIZE;
        else
-               sb->s_bdi->ra_pages = cifs_sb->ctx->rsize / PAGE_SIZE;
+               sb->s_bdi->ra_pages = 2 * (cifs_sb->ctx->rsize / PAGE_SIZE);
 
        sb->s_blocksize = CIFS_MAX_MSGSIZE;
        sb->s_blocksize_bits = 14;      /* default 2**14 = CIFS_MAX_MSGSIZE */
@@ -744,6 +744,7 @@ static void cifs_umount_begin(struct super_block *sb)
        spin_unlock(&tcon->tc_lock);
        spin_unlock(&cifs_tcp_ses_lock);
 
+       cifs_close_all_deferred_files(tcon);
        /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
        /* cancel_notify_requests(tcon); */
        if (tcon->ses && tcon->ses->server) {
@@ -759,6 +760,20 @@ static void cifs_umount_begin(struct super_block *sb)
        return;
 }
 
+static int cifs_freeze(struct super_block *sb)
+{
+       struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
+       struct cifs_tcon *tcon;
+
+       if (cifs_sb == NULL)
+               return 0;
+
+       tcon = cifs_sb_master_tcon(cifs_sb);
+
+       cifs_close_all_deferred_files(tcon);
+       return 0;
+}
+
 #ifdef CONFIG_CIFS_STATS2
 static int cifs_show_stats(struct seq_file *s, struct dentry *root)
 {
@@ -797,6 +812,7 @@ static const struct super_operations cifs_super_ops = {
        as opens */
        .show_options = cifs_show_options,
        .umount_begin   = cifs_umount_begin,
+       .freeze_fs      = cifs_freeze,
 #ifdef CONFIG_CIFS_STATS2
        .show_stats = cifs_show_stats,
 #endif
index 414685c..5f8fd20 100644 (file)
@@ -424,8 +424,8 @@ struct smb_version_operations {
        /* check for STATUS_NETWORK_SESSION_EXPIRED */
        bool (*is_session_expired)(char *);
        /* send oplock break response */
-       int (*oplock_response)(struct cifs_tcon *, struct cifs_fid *,
-                              struct cifsInodeInfo *);
+       int (*oplock_response)(struct cifs_tcon *tcon, __u64 persistent_fid, __u64 volatile_fid,
+                       __u16 net_fid, struct cifsInodeInfo *cifs_inode);
        /* query remote filesystem */
        int (*queryfs)(const unsigned int, struct cifs_tcon *,
                       struct cifs_sb_info *, struct kstatfs *);
index eeeed6f..8e9a672 100644 (file)
@@ -2709,6 +2709,13 @@ cifs_match_super(struct super_block *sb, void *data)
 
        spin_lock(&cifs_tcp_ses_lock);
        cifs_sb = CIFS_SB(sb);
+
+       /* We do not want to use a superblock that has been shutdown */
+       if (CIFS_MOUNT_SHUTDOWN & cifs_sb->mnt_cifs_flags) {
+               spin_unlock(&cifs_tcp_ses_lock);
+               return 0;
+       }
+
        tlink = cifs_get_tlink(cifs_sb_master_tlink(cifs_sb));
        if (tlink == NULL) {
                /* can not match superblock if tlink were ever null */
index c5fcefd..ba7f2e0 100644 (file)
@@ -4881,9 +4881,9 @@ void cifs_oplock_break(struct work_struct *work)
        struct cifs_tcon *tcon = tlink_tcon(cfile->tlink);
        struct TCP_Server_Info *server = tcon->ses->server;
        int rc = 0;
-       bool purge_cache = false;
-       struct cifs_deferred_close *dclose;
-       bool is_deferred = false;
+       bool purge_cache = false, oplock_break_cancelled;
+       __u64 persistent_fid, volatile_fid;
+       __u16 net_fid;
 
        wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
                        TASK_UNINTERRUPTIBLE);
@@ -4924,28 +4924,28 @@ oplock_break_ack:
         * file handles but cached, then schedule deferred close immediately.
         * So, new open will not use cached handle.
         */
-       spin_lock(&CIFS_I(inode)->deferred_lock);
-       is_deferred = cifs_is_deferred_close(cfile, &dclose);
-       spin_unlock(&CIFS_I(inode)->deferred_lock);
 
-       if (!CIFS_CACHE_HANDLE(cinode) && is_deferred &&
-                       cfile->deferred_close_scheduled && delayed_work_pending(&cfile->deferred)) {
+       if (!CIFS_CACHE_HANDLE(cinode) && !list_empty(&cinode->deferred_closes))
                cifs_close_deferred_file(cinode);
-       }
 
+       persistent_fid = cfile->fid.persistent_fid;
+       volatile_fid = cfile->fid.volatile_fid;
+       net_fid = cfile->fid.netfid;
+       oplock_break_cancelled = cfile->oplock_break_cancelled;
+
+       _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false);
        /*
         * releasing stale oplock after recent reconnect of smb session using
         * a now incorrect file handle is not a data integrity issue but do
         * not bother sending an oplock release if session to server still is
         * disconnected since oplock already released by the server
         */
-       if (!cfile->oplock_break_cancelled) {
-               rc = tcon->ses->server->ops->oplock_response(tcon, &cfile->fid,
-                                                            cinode);
+       if (!oplock_break_cancelled) {
+               rc = tcon->ses->server->ops->oplock_response(tcon, persistent_fid,
+                               volatile_fid, net_fid, cinode);
                cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
        }
 
-       _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false);
        cifs_done_oplock_break(cinode);
 }
 
index abda614..7d1b3fc 100644 (file)
@@ -897,12 +897,11 @@ cifs_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
 }
 
 static int
-cifs_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
-                    struct cifsInodeInfo *cinode)
+cifs_oplock_response(struct cifs_tcon *tcon, __u64 persistent_fid,
+               __u64 volatile_fid, __u16 net_fid, struct cifsInodeInfo *cinode)
 {
-       return CIFSSMBLock(0, tcon, fid->netfid, current->tgid, 0, 0, 0, 0,
-                          LOCKING_ANDX_OPLOCK_RELEASE, false,
-                          CIFS_CACHE_READ(cinode) ? 1 : 0);
+       return CIFSSMBLock(0, tcon, net_fid, current->tgid, 0, 0, 0, 0,
+                          LOCKING_ANDX_OPLOCK_RELEASE, false, CIFS_CACHE_READ(cinode) ? 1 : 0);
 }
 
 static int
index a817582..5065398 100644 (file)
@@ -1682,7 +1682,7 @@ smb2_copychunk_range(const unsigned int xid,
                pcchunk->SourceOffset = cpu_to_le64(src_off);
                pcchunk->TargetOffset = cpu_to_le64(dest_off);
                pcchunk->Length =
-                       cpu_to_le32(min_t(u32, len, tcon->max_bytes_chunk));
+                       cpu_to_le32(min_t(u64, len, tcon->max_bytes_chunk));
 
                /* Request server copy to target from src identified by key */
                kfree(retbuf);
@@ -2383,15 +2383,14 @@ smb2_is_network_name_deleted(char *buf, struct TCP_Server_Info *server)
 }
 
 static int
-smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
-                    struct cifsInodeInfo *cinode)
+smb2_oplock_response(struct cifs_tcon *tcon, __u64 persistent_fid,
+               __u64 volatile_fid, __u16 net_fid, struct cifsInodeInfo *cinode)
 {
        if (tcon->ses->server->capabilities & SMB2_GLOBAL_CAP_LEASING)
                return SMB2_lease_break(0, tcon, cinode->lease_key,
                                        smb2_get_lease_state(cinode));
 
-       return SMB2_oplock_break(0, tcon, fid->persistent_fid,
-                                fid->volatile_fid,
+       return SMB2_oplock_break(0, tcon, persistent_fid, volatile_fid,
                                 CIFS_CACHE_READ(cinode) ? 1 : 0);
 }
 
index e33ca0d..9ed61b6 100644 (file)
@@ -1947,6 +1947,9 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
        init_copy_chunk_defaults(tcon);
        if (server->ops->validate_negotiate)
                rc = server->ops->validate_negotiate(xid, tcon);
+       if (rc == 0) /* See MS-SMB2 2.2.10 and 3.2.5.5 */
+               if (tcon->share_flags & SMB2_SHAREFLAG_ISOLATED_TRANSPORT)
+                       server->nosharesock = true;
 tcon_exit:
 
        free_rsp_buf(resp_buftype, rsp);
index 0942694..c1edde8 100644 (file)
@@ -305,6 +305,38 @@ struct ext4_group_desc * ext4_get_group_desc(struct super_block *sb,
        return desc;
 }
 
+static ext4_fsblk_t ext4_valid_block_bitmap_padding(struct super_block *sb,
+                                                   ext4_group_t block_group,
+                                                   struct buffer_head *bh)
+{
+       ext4_grpblk_t next_zero_bit;
+       unsigned long bitmap_size = sb->s_blocksize * 8;
+       unsigned int offset = num_clusters_in_group(sb, block_group);
+
+       if (bitmap_size <= offset)
+               return 0;
+
+       next_zero_bit = ext4_find_next_zero_bit(bh->b_data, bitmap_size, offset);
+
+       return (next_zero_bit < bitmap_size ? next_zero_bit : 0);
+}
+
+struct ext4_group_info *ext4_get_group_info(struct super_block *sb,
+                                           ext4_group_t group)
+{
+        struct ext4_group_info **grp_info;
+        long indexv, indexh;
+
+        if (unlikely(group >= EXT4_SB(sb)->s_groups_count)) {
+                ext4_error(sb, "invalid group %u", group);
+                return NULL;
+        }
+        indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb));
+        indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1);
+        grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv);
+        return grp_info[indexh];
+}
+
 /*
  * Return the block number which was discovered to be invalid, or 0 if
  * the block bitmap is valid.
@@ -379,7 +411,7 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
 
        if (buffer_verified(bh))
                return 0;
-       if (EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
+       if (!grp || EXT4_MB_GRP_BBITMAP_CORRUPT(grp))
                return -EFSCORRUPTED;
 
        ext4_lock_group(sb, block_group);
@@ -402,6 +434,15 @@ static int ext4_validate_block_bitmap(struct super_block *sb,
                                        EXT4_GROUP_INFO_BBITMAP_CORRUPT);
                return -EFSCORRUPTED;
        }
+       blk = ext4_valid_block_bitmap_padding(sb, block_group, bh);
+       if (unlikely(blk != 0)) {
+               ext4_unlock_group(sb, block_group);
+               ext4_error(sb, "bg %u: block %llu: padding at end of block bitmap is not set",
+                          block_group, blk);
+               ext4_mark_group_bitmap_corrupted(sb, block_group,
+                                                EXT4_GROUP_INFO_BBITMAP_CORRUPT);
+               return -EFSCORRUPTED;
+       }
        set_buffer_verified(bh);
 verified:
        ext4_unlock_group(sb, block_group);
index 18cb268..6948d67 100644 (file)
@@ -1684,6 +1684,30 @@ static inline struct ext4_inode_info *EXT4_I(struct inode *inode)
        return container_of(inode, struct ext4_inode_info, vfs_inode);
 }
 
+static inline int ext4_writepages_down_read(struct super_block *sb)
+{
+       percpu_down_read(&EXT4_SB(sb)->s_writepages_rwsem);
+       return memalloc_nofs_save();
+}
+
+static inline void ext4_writepages_up_read(struct super_block *sb, int ctx)
+{
+       memalloc_nofs_restore(ctx);
+       percpu_up_read(&EXT4_SB(sb)->s_writepages_rwsem);
+}
+
+static inline int ext4_writepages_down_write(struct super_block *sb)
+{
+       percpu_down_write(&EXT4_SB(sb)->s_writepages_rwsem);
+       return memalloc_nofs_save();
+}
+
+static inline void ext4_writepages_up_write(struct super_block *sb, int ctx)
+{
+       memalloc_nofs_restore(ctx);
+       percpu_up_write(&EXT4_SB(sb)->s_writepages_rwsem);
+}
+
 static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
 {
        return ino == EXT4_ROOT_INO ||
@@ -2625,6 +2649,8 @@ extern void ext4_check_blocks_bitmap(struct super_block *);
 extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
                                                    ext4_group_t block_group,
                                                    struct buffer_head ** bh);
+extern struct ext4_group_info *ext4_get_group_info(struct super_block *sb,
+                                                  ext4_group_t group);
 extern int ext4_should_retry_alloc(struct super_block *sb, int *retries);
 
 extern struct buffer_head *ext4_read_block_bitmap_nowait(struct super_block *sb,
@@ -3232,19 +3258,6 @@ static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
        raw_inode->i_size_high = cpu_to_le32(i_size >> 32);
 }
 
-static inline
-struct ext4_group_info *ext4_get_group_info(struct super_block *sb,
-                                           ext4_group_t group)
-{
-        struct ext4_group_info **grp_info;
-        long indexv, indexh;
-        BUG_ON(group >= EXT4_SB(sb)->s_groups_count);
-        indexv = group >> (EXT4_DESC_PER_BLOCK_BITS(sb));
-        indexh = group & ((EXT4_DESC_PER_BLOCK(sb)) - 1);
-        grp_info = sbi_array_rcu_deref(EXT4_SB(sb), s_group_info, indexv);
-        return grp_info[indexh];
-}
-
 /*
  * Reading s_groups_count requires using smp_rmb() afterwards.  See
  * the locking protocol documented in the comments of ext4_group_add()
index 7bc2210..595abb9 100644 (file)
@@ -267,14 +267,12 @@ static void __es_find_extent_range(struct inode *inode,
 
        /* see if the extent has been cached */
        es->es_lblk = es->es_len = es->es_pblk = 0;
-       if (tree->cache_es) {
-               es1 = tree->cache_es;
-               if (in_range(lblk, es1->es_lblk, es1->es_len)) {
-                       es_debug("%u cached by [%u/%u) %llu %x\n",
-                                lblk, es1->es_lblk, es1->es_len,
-                                ext4_es_pblock(es1), ext4_es_status(es1));
-                       goto out;
-               }
+       es1 = READ_ONCE(tree->cache_es);
+       if (es1 && in_range(lblk, es1->es_lblk, es1->es_len)) {
+               es_debug("%u cached by [%u/%u) %llu %x\n",
+                        lblk, es1->es_lblk, es1->es_len,
+                        ext4_es_pblock(es1), ext4_es_status(es1));
+               goto out;
        }
 
        es1 = __es_tree_search(&tree->root, lblk);
@@ -293,7 +291,7 @@ out:
        }
 
        if (es1 && matching_fn(es1)) {
-               tree->cache_es = es1;
+               WRITE_ONCE(tree->cache_es, es1);
                es->es_lblk = es1->es_lblk;
                es->es_len = es1->es_len;
                es->es_pblk = es1->es_pblk;
@@ -931,14 +929,12 @@ int ext4_es_lookup_extent(struct inode *inode, ext4_lblk_t lblk,
 
        /* find extent in cache firstly */
        es->es_lblk = es->es_len = es->es_pblk = 0;
-       if (tree->cache_es) {
-               es1 = tree->cache_es;
-               if (in_range(lblk, es1->es_lblk, es1->es_len)) {
-                       es_debug("%u cached by [%u/%u)\n",
-                                lblk, es1->es_lblk, es1->es_len);
-                       found = 1;
-                       goto out;
-               }
+       es1 = READ_ONCE(tree->cache_es);
+       if (es1 && in_range(lblk, es1->es_lblk, es1->es_len)) {
+               es_debug("%u cached by [%u/%u)\n",
+                        lblk, es1->es_lblk, es1->es_len);
+               found = 1;
+               goto out;
        }
 
        node = tree->root.rb_node;
index 147b524..46c3423 100644 (file)
@@ -277,7 +277,11 @@ static int __ext4fs_dirhash(const struct inode *dir, const char *name, int len,
        }
        default:
                hinfo->hash = 0;
-               return -1;
+               hinfo->minor_hash = 0;
+               ext4_warning(dir->i_sb,
+                            "invalid/unsupported hash tree version %u",
+                            hinfo->hash_version);
+               return -EINVAL;
        }
        hash = hash & ~1;
        if (hash == (EXT4_HTREE_EOF_32BIT << 1))
index 787ab89..754f961 100644 (file)
@@ -91,7 +91,7 @@ static int ext4_validate_inode_bitmap(struct super_block *sb,
 
        if (buffer_verified(bh))
                return 0;
-       if (EXT4_MB_GRP_IBITMAP_CORRUPT(grp))
+       if (!grp || EXT4_MB_GRP_IBITMAP_CORRUPT(grp))
                return -EFSCORRUPTED;
 
        ext4_lock_group(sb, block_group);
@@ -293,7 +293,7 @@ void ext4_free_inode(handle_t *handle, struct inode *inode)
        }
        if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
                grp = ext4_get_group_info(sb, block_group);
-               if (unlikely(EXT4_MB_GRP_IBITMAP_CORRUPT(grp))) {
+               if (!grp || unlikely(EXT4_MB_GRP_IBITMAP_CORRUPT(grp))) {
                        fatal = -EFSCORRUPTED;
                        goto error_return;
                }
@@ -1046,7 +1046,7 @@ got_group:
                         * Skip groups with already-known suspicious inode
                         * tables
                         */
-                       if (EXT4_MB_GRP_IBITMAP_CORRUPT(grp))
+                       if (!grp || EXT4_MB_GRP_IBITMAP_CORRUPT(grp))
                                goto next_group;
                }
 
@@ -1183,6 +1183,10 @@ got:
 
                if (!(sbi->s_mount_state & EXT4_FC_REPLAY)) {
                        grp = ext4_get_group_info(sb, group);
+                       if (!grp) {
+                               err = -EFSCORRUPTED;
+                               goto out;
+                       }
                        down_read(&grp->alloc_sem); /*
                                                     * protect vs itable
                                                     * lazyinit
@@ -1526,7 +1530,7 @@ int ext4_init_inode_table(struct super_block *sb, ext4_group_t group,
        }
 
        gdp = ext4_get_group_desc(sb, group, &group_desc_bh);
-       if (!gdp)
+       if (!gdp || !grp)
                goto out;
 
        /*
index 859bc4e..5854bd5 100644 (file)
@@ -34,6 +34,7 @@ static int get_max_inline_xattr_value_size(struct inode *inode,
        struct ext4_xattr_ibody_header *header;
        struct ext4_xattr_entry *entry;
        struct ext4_inode *raw_inode;
+       void *end;
        int free, min_offs;
 
        if (!EXT4_INODE_HAS_XATTR_SPACE(inode))
@@ -57,14 +58,23 @@ static int get_max_inline_xattr_value_size(struct inode *inode,
        raw_inode = ext4_raw_inode(iloc);
        header = IHDR(inode, raw_inode);
        entry = IFIRST(header);
+       end = (void *)raw_inode + EXT4_SB(inode->i_sb)->s_inode_size;
 
        /* Compute min_offs. */
-       for (; !IS_LAST_ENTRY(entry); entry = EXT4_XATTR_NEXT(entry)) {
+       while (!IS_LAST_ENTRY(entry)) {
+               void *next = EXT4_XATTR_NEXT(entry);
+
+               if (next >= end) {
+                       EXT4_ERROR_INODE(inode,
+                                        "corrupt xattr in inline inode");
+                       return 0;
+               }
                if (!entry->e_value_inum && entry->e_value_size) {
                        size_t offs = le16_to_cpu(entry->e_value_offs);
                        if (offs < min_offs)
                                min_offs = offs;
                }
+               entry = next;
        }
        free = min_offs -
                ((void *)entry - (void *)IFIRST(header)) - sizeof(__u32);
@@ -350,7 +360,7 @@ static int ext4_update_inline_data(handle_t *handle, struct inode *inode,
 
        error = ext4_xattr_ibody_get(inode, i.name_index, i.name,
                                     value, len);
-       if (error == -ENODATA)
+       if (error < 0)
                goto out;
 
        BUFFER_TRACE(is.iloc.bh, "get_write_access");
@@ -1175,6 +1185,7 @@ static int ext4_finish_convert_inline_dir(handle_t *handle,
                ext4_initialize_dirent_tail(dir_block,
                                            inode->i_sb->s_blocksize);
        set_buffer_uptodate(dir_block);
+       unlock_buffer(dir_block);
        err = ext4_handle_dirty_dirblock(handle, inode, dir_block);
        if (err)
                return err;
@@ -1249,6 +1260,7 @@ static int ext4_convert_inline_data_nolock(handle_t *handle,
        if (!S_ISDIR(inode->i_mode)) {
                memcpy(data_bh->b_data, buf, inline_size);
                set_buffer_uptodate(data_bh);
+               unlock_buffer(data_bh);
                error = ext4_handle_dirty_metadata(handle,
                                                   inode, data_bh);
        } else {
@@ -1256,7 +1268,6 @@ static int ext4_convert_inline_data_nolock(handle_t *handle,
                                                       buf, inline_size);
        }
 
-       unlock_buffer(data_bh);
 out_restore:
        if (error)
                ext4_restore_inline_data(handle, inode, iloc, buf, inline_size);
index 0d5ba92..ce5f21b 100644 (file)
@@ -2783,11 +2783,12 @@ static int ext4_writepages(struct address_space *mapping,
                .can_map = 1,
        };
        int ret;
+       int alloc_ctx;
 
        if (unlikely(ext4_forced_shutdown(EXT4_SB(sb))))
                return -EIO;
 
-       percpu_down_read(&EXT4_SB(sb)->s_writepages_rwsem);
+       alloc_ctx = ext4_writepages_down_read(sb);
        ret = ext4_do_writepages(&mpd);
        /*
         * For data=journal writeback we could have come across pages marked
@@ -2796,7 +2797,7 @@ static int ext4_writepages(struct address_space *mapping,
         */
        if (!ret && mpd.journalled_more_data)
                ret = ext4_do_writepages(&mpd);
-       percpu_up_read(&EXT4_SB(sb)->s_writepages_rwsem);
+       ext4_writepages_up_read(sb, alloc_ctx);
 
        return ret;
 }
@@ -2824,17 +2825,18 @@ static int ext4_dax_writepages(struct address_space *mapping,
        long nr_to_write = wbc->nr_to_write;
        struct inode *inode = mapping->host;
        struct ext4_sb_info *sbi = EXT4_SB(mapping->host->i_sb);
+       int alloc_ctx;
 
        if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb))))
                return -EIO;
 
-       percpu_down_read(&sbi->s_writepages_rwsem);
+       alloc_ctx = ext4_writepages_down_read(inode->i_sb);
        trace_ext4_writepages(inode, wbc);
 
        ret = dax_writeback_mapping_range(mapping, sbi->s_daxdev, wbc);
        trace_ext4_writepages_result(inode, wbc, ret,
                                     nr_to_write - wbc->nr_to_write);
-       percpu_up_read(&sbi->s_writepages_rwsem);
+       ext4_writepages_up_read(inode->i_sb, alloc_ctx);
        return ret;
 }
 
@@ -3375,7 +3377,7 @@ static int ext4_iomap_overwrite_begin(struct inode *inode, loff_t offset,
         */
        flags &= ~IOMAP_WRITE;
        ret = ext4_iomap_begin(inode, offset, length, flags, iomap, srcmap);
-       WARN_ON_ONCE(iomap->type != IOMAP_MAPPED);
+       WARN_ON_ONCE(!ret && iomap->type != IOMAP_MAPPED);
        return ret;
 }
 
@@ -5928,7 +5930,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
        journal_t *journal;
        handle_t *handle;
        int err;
-       struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+       int alloc_ctx;
 
        /*
         * We have to be very careful here: changing a data block's
@@ -5966,7 +5968,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
                }
        }
 
-       percpu_down_write(&sbi->s_writepages_rwsem);
+       alloc_ctx = ext4_writepages_down_write(inode->i_sb);
        jbd2_journal_lock_updates(journal);
 
        /*
@@ -5983,7 +5985,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
                err = jbd2_journal_flush(journal, 0);
                if (err < 0) {
                        jbd2_journal_unlock_updates(journal);
-                       percpu_up_write(&sbi->s_writepages_rwsem);
+                       ext4_writepages_up_write(inode->i_sb, alloc_ctx);
                        return err;
                }
                ext4_clear_inode_flag(inode, EXT4_INODE_JOURNAL_DATA);
@@ -5991,7 +5993,7 @@ int ext4_change_inode_journal_flag(struct inode *inode, int val)
        ext4_set_aops(inode);
 
        jbd2_journal_unlock_updates(journal);
-       percpu_up_write(&sbi->s_writepages_rwsem);
+       ext4_writepages_up_write(inode->i_sb, alloc_ctx);
 
        if (val)
                filemap_invalidate_unlock(inode->i_mapping);
index 78259bd..7b2e36d 100644 (file)
@@ -745,6 +745,8 @@ static int __mb_check_buddy(struct ext4_buddy *e4b, char *file,
        MB_CHECK_ASSERT(e4b->bd_info->bb_fragments == fragments);
 
        grp = ext4_get_group_info(sb, e4b->bd_group);
+       if (!grp)
+               return NULL;
        list_for_each(cur, &grp->bb_prealloc_list) {
                ext4_group_t groupnr;
                struct ext4_prealloc_space *pa;
@@ -1060,9 +1062,9 @@ mb_set_largest_free_order(struct super_block *sb, struct ext4_group_info *grp)
 
 static noinline_for_stack
 void ext4_mb_generate_buddy(struct super_block *sb,
-                               void *buddy, void *bitmap, ext4_group_t group)
+                           void *buddy, void *bitmap, ext4_group_t group,
+                           struct ext4_group_info *grp)
 {
-       struct ext4_group_info *grp = ext4_get_group_info(sb, group);
        struct ext4_sb_info *sbi = EXT4_SB(sb);
        ext4_grpblk_t max = EXT4_CLUSTERS_PER_GROUP(sb);
        ext4_grpblk_t i = 0;
@@ -1181,6 +1183,8 @@ static int ext4_mb_init_cache(struct page *page, char *incore, gfp_t gfp)
                        break;
 
                grinfo = ext4_get_group_info(sb, group);
+               if (!grinfo)
+                       continue;
                /*
                 * If page is uptodate then we came here after online resize
                 * which added some new uninitialized group info structs, so
@@ -1246,6 +1250,10 @@ static int ext4_mb_init_cache(struct page *page, char *incore, gfp_t gfp)
                                group, page->index, i * blocksize);
                        trace_ext4_mb_buddy_bitmap_load(sb, group);
                        grinfo = ext4_get_group_info(sb, group);
+                       if (!grinfo) {
+                               err = -EFSCORRUPTED;
+                               goto out;
+                       }
                        grinfo->bb_fragments = 0;
                        memset(grinfo->bb_counters, 0,
                               sizeof(*grinfo->bb_counters) *
@@ -1256,7 +1264,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore, gfp_t gfp)
                        ext4_lock_group(sb, group);
                        /* init the buddy */
                        memset(data, 0xff, blocksize);
-                       ext4_mb_generate_buddy(sb, data, incore, group);
+                       ext4_mb_generate_buddy(sb, data, incore, group, grinfo);
                        ext4_unlock_group(sb, group);
                        incore = NULL;
                } else {
@@ -1370,6 +1378,9 @@ int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp)
        might_sleep();
        mb_debug(sb, "init group %u\n", group);
        this_grp = ext4_get_group_info(sb, group);
+       if (!this_grp)
+               return -EFSCORRUPTED;
+
        /*
         * This ensures that we don't reinit the buddy cache
         * page which map to the group from which we are already
@@ -1444,6 +1455,8 @@ ext4_mb_load_buddy_gfp(struct super_block *sb, ext4_group_t group,
 
        blocks_per_page = PAGE_SIZE / sb->s_blocksize;
        grp = ext4_get_group_info(sb, group);
+       if (!grp)
+               return -EFSCORRUPTED;
 
        e4b->bd_blkbits = sb->s_blocksize_bits;
        e4b->bd_info = grp;
@@ -2159,6 +2172,8 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,
        struct ext4_group_info *grp = ext4_get_group_info(ac->ac_sb, group);
        struct ext4_free_extent ex;
 
+       if (!grp)
+               return -EFSCORRUPTED;
        if (!(ac->ac_flags & (EXT4_MB_HINT_TRY_GOAL | EXT4_MB_HINT_GOAL_ONLY)))
                return 0;
        if (grp->bb_free == 0)
@@ -2385,7 +2400,7 @@ static bool ext4_mb_good_group(struct ext4_allocation_context *ac,
 
        BUG_ON(cr < 0 || cr >= 4);
 
-       if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
+       if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(grp) || !grp))
                return false;
 
        free = grp->bb_free;
@@ -2454,6 +2469,8 @@ static int ext4_mb_good_group_nolock(struct ext4_allocation_context *ac,
        ext4_grpblk_t free;
        int ret = 0;
 
+       if (!grp)
+               return -EFSCORRUPTED;
        if (sbi->s_mb_stats)
                atomic64_inc(&sbi->s_bal_cX_groups_considered[ac->ac_criteria]);
        if (should_lock) {
@@ -2534,7 +2551,7 @@ ext4_group_t ext4_mb_prefetch(struct super_block *sb, ext4_group_t group,
                 * prefetch once, so we avoid getblk() call, which can
                 * be expensive.
                 */
-               if (!EXT4_MB_GRP_TEST_AND_SET_READ(grp) &&
+               if (gdp && grp && !EXT4_MB_GRP_TEST_AND_SET_READ(grp) &&
                    EXT4_MB_GRP_NEED_INIT(grp) &&
                    ext4_free_group_clusters(sb, gdp) > 0 &&
                    !(ext4_has_group_desc_csum(sb) &&
@@ -2578,7 +2595,7 @@ void ext4_mb_prefetch_fini(struct super_block *sb, ext4_group_t group,
                gdp = ext4_get_group_desc(sb, group, NULL);
                grp = ext4_get_group_info(sb, group);
 
-               if (EXT4_MB_GRP_NEED_INIT(grp) &&
+               if (grp && gdp && EXT4_MB_GRP_NEED_INIT(grp) &&
                    ext4_free_group_clusters(sb, gdp) > 0 &&
                    !(ext4_has_group_desc_csum(sb) &&
                      (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)))) {
@@ -2837,6 +2854,8 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
                sizeof(struct ext4_group_info);
 
        grinfo = ext4_get_group_info(sb, group);
+       if (!grinfo)
+               return 0;
        /* Load the group info in memory only if not already loaded. */
        if (unlikely(EXT4_MB_GRP_NEED_INIT(grinfo))) {
                err = ext4_mb_load_buddy(sb, group, &e4b);
@@ -2847,7 +2866,7 @@ static int ext4_mb_seq_groups_show(struct seq_file *seq, void *v)
                buddy_loaded = 1;
        }
 
-       memcpy(&sg, ext4_get_group_info(sb, group), i);
+       memcpy(&sg, grinfo, i);
 
        if (buddy_loaded)
                ext4_mb_unload_buddy(&e4b);
@@ -3208,8 +3227,12 @@ static int ext4_mb_init_backend(struct super_block *sb)
 
 err_freebuddy:
        cachep = get_groupinfo_cache(sb->s_blocksize_bits);
-       while (i-- > 0)
-               kmem_cache_free(cachep, ext4_get_group_info(sb, i));
+       while (i-- > 0) {
+               struct ext4_group_info *grp = ext4_get_group_info(sb, i);
+
+               if (grp)
+                       kmem_cache_free(cachep, grp);
+       }
        i = sbi->s_group_info_size;
        rcu_read_lock();
        group_info = rcu_dereference(sbi->s_group_info);
@@ -3522,6 +3545,8 @@ int ext4_mb_release(struct super_block *sb)
                for (i = 0; i < ngroups; i++) {
                        cond_resched();
                        grinfo = ext4_get_group_info(sb, i);
+                       if (!grinfo)
+                               continue;
                        mb_group_bb_bitmap_free(grinfo);
                        ext4_lock_group(sb, i);
                        count = ext4_mb_cleanup_pa(grinfo);
@@ -4606,6 +4631,8 @@ static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
        struct ext4_free_data *entry;
 
        grp = ext4_get_group_info(sb, group);
+       if (!grp)
+               return;
        n = rb_first(&(grp->bb_free_root));
 
        while (n) {
@@ -4633,6 +4660,9 @@ void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
        int preallocated = 0;
        int len;
 
+       if (!grp)
+               return;
+
        /* all form of preallocation discards first load group,
         * so the only competing code is preallocation use.
         * we don't need any locking here
@@ -4869,6 +4899,8 @@ adjust_bex:
 
        ei = EXT4_I(ac->ac_inode);
        grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group);
+       if (!grp)
+               return;
 
        pa->pa_node_lock.inode_lock = &ei->i_prealloc_lock;
        pa->pa_inode = ac->ac_inode;
@@ -4918,6 +4950,8 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac)
        atomic_add(pa->pa_free, &EXT4_SB(sb)->s_mb_preallocated);
 
        grp = ext4_get_group_info(sb, ac->ac_b_ex.fe_group);
+       if (!grp)
+               return;
        lg = ac->ac_lg;
        BUG_ON(lg == NULL);
 
@@ -5013,7 +5047,11 @@ ext4_mb_release_group_pa(struct ext4_buddy *e4b,
        trace_ext4_mb_release_group_pa(sb, pa);
        BUG_ON(pa->pa_deleted == 0);
        ext4_get_group_no_and_offset(sb, pa->pa_pstart, &group, &bit);
-       BUG_ON(group != e4b->bd_group && pa->pa_len != 0);
+       if (unlikely(group != e4b->bd_group && pa->pa_len != 0)) {
+               ext4_warning(sb, "bad group: expected %u, group %u, pa_start %llu",
+                            e4b->bd_group, group, pa->pa_pstart);
+               return 0;
+       }
        mb_free_blocks(pa->pa_inode, e4b, bit, pa->pa_len);
        atomic_add(pa->pa_len, &EXT4_SB(sb)->s_mb_discarded);
        trace_ext4_mballoc_discard(sb, NULL, group, bit, pa->pa_len);
@@ -5043,6 +5081,8 @@ ext4_mb_discard_group_preallocations(struct super_block *sb,
        int err;
        int free = 0;
 
+       if (!grp)
+               return 0;
        mb_debug(sb, "discard preallocation for group %u\n", group);
        if (list_empty(&grp->bb_prealloc_list))
                goto out_dbg;
@@ -5297,6 +5337,9 @@ static inline void ext4_mb_show_pa(struct super_block *sb)
                struct ext4_prealloc_space *pa;
                ext4_grpblk_t start;
                struct list_head *cur;
+
+               if (!grp)
+                       continue;
                ext4_lock_group(sb, i);
                list_for_each(cur, &grp->bb_prealloc_list) {
                        pa = list_entry(cur, struct ext4_prealloc_space,
@@ -6064,6 +6107,7 @@ static void ext4_mb_clear_bb(handle_t *handle, struct inode *inode,
        struct buffer_head *bitmap_bh = NULL;
        struct super_block *sb = inode->i_sb;
        struct ext4_group_desc *gdp;
+       struct ext4_group_info *grp;
        unsigned int overflow;
        ext4_grpblk_t bit;
        struct buffer_head *gd_bh;
@@ -6089,8 +6133,8 @@ do_more:
        overflow = 0;
        ext4_get_group_no_and_offset(sb, block, &block_group, &bit);
 
-       if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(
-                       ext4_get_group_info(sb, block_group))))
+       grp = ext4_get_group_info(sb, block_group);
+       if (unlikely(!grp || EXT4_MB_GRP_BBITMAP_CORRUPT(grp)))
                return;
 
        /*
@@ -6692,6 +6736,8 @@ int ext4_trim_fs(struct super_block *sb, struct fstrim_range *range)
 
        for (group = first_group; group <= last_group; group++) {
                grp = ext4_get_group_info(sb, group);
+               if (!grp)
+                       continue;
                /* We only do this if the grp has never been initialized */
                if (unlikely(EXT4_MB_GRP_NEED_INIT(grp))) {
                        ret = ext4_mb_init_group(sb, group, GFP_NOFS);
index a19a966..d98ac2a 100644 (file)
@@ -408,7 +408,6 @@ static int free_ext_block(handle_t *handle, struct inode *inode)
 
 int ext4_ext_migrate(struct inode *inode)
 {
-       struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
        handle_t *handle;
        int retval = 0, i;
        __le32 *i_data;
@@ -418,6 +417,7 @@ int ext4_ext_migrate(struct inode *inode)
        unsigned long max_entries;
        __u32 goal, tmp_csum_seed;
        uid_t owner[2];
+       int alloc_ctx;
 
        /*
         * If the filesystem does not support extents, or the inode
@@ -434,7 +434,7 @@ int ext4_ext_migrate(struct inode *inode)
                 */
                return retval;
 
-       percpu_down_write(&sbi->s_writepages_rwsem);
+       alloc_ctx = ext4_writepages_down_write(inode->i_sb);
 
        /*
         * Worst case we can touch the allocation bitmaps and a block
@@ -586,7 +586,7 @@ out_tmp_inode:
        unlock_new_inode(tmp_inode);
        iput(tmp_inode);
 out_unlock:
-       percpu_up_write(&sbi->s_writepages_rwsem);
+       ext4_writepages_up_write(inode->i_sb, alloc_ctx);
        return retval;
 }
 
@@ -605,6 +605,7 @@ int ext4_ind_migrate(struct inode *inode)
        ext4_fsblk_t                    blk;
        handle_t                        *handle;
        int                             ret, ret2 = 0;
+       int                             alloc_ctx;
 
        if (!ext4_has_feature_extents(inode->i_sb) ||
            (!ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS)))
@@ -621,7 +622,7 @@ int ext4_ind_migrate(struct inode *inode)
        if (test_opt(inode->i_sb, DELALLOC))
                ext4_alloc_da_blocks(inode);
 
-       percpu_down_write(&sbi->s_writepages_rwsem);
+       alloc_ctx = ext4_writepages_down_write(inode->i_sb);
 
        handle = ext4_journal_start(inode, EXT4_HT_MIGRATE, 1);
        if (IS_ERR(handle)) {
@@ -665,6 +666,6 @@ errout:
        ext4_journal_stop(handle);
        up_write(&EXT4_I(inode)->i_data_sem);
 out_unlock:
-       percpu_up_write(&sbi->s_writepages_rwsem);
+       ext4_writepages_up_write(inode->i_sb, alloc_ctx);
        return ret;
 }
index 4022bc7..0aaf38f 100644 (file)
@@ -39,28 +39,36 @@ static void ext4_mmp_csum_set(struct super_block *sb, struct mmp_struct *mmp)
  * Write the MMP block using REQ_SYNC to try to get the block on-disk
  * faster.
  */
-static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
+static int write_mmp_block_thawed(struct super_block *sb,
+                                 struct buffer_head *bh)
 {
        struct mmp_struct *mmp = (struct mmp_struct *)(bh->b_data);
 
-       /*
-        * We protect against freezing so that we don't create dirty buffers
-        * on frozen filesystem.
-        */
-       sb_start_write(sb);
        ext4_mmp_csum_set(sb, mmp);
        lock_buffer(bh);
        bh->b_end_io = end_buffer_write_sync;
        get_bh(bh);
        submit_bh(REQ_OP_WRITE | REQ_SYNC | REQ_META | REQ_PRIO, bh);
        wait_on_buffer(bh);
-       sb_end_write(sb);
        if (unlikely(!buffer_uptodate(bh)))
                return -EIO;
-
        return 0;
 }
 
+static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
+{
+       int err;
+
+       /*
+        * We protect against freezing so that we don't create dirty buffers
+        * on frozen filesystem.
+        */
+       sb_start_write(sb);
+       err = write_mmp_block_thawed(sb, bh);
+       sb_end_write(sb);
+       return err;
+}
+
 /*
  * Read the MMP block. It _must_ be read from disk and hence we clear the
  * uptodate flag on the buffer.
@@ -344,7 +352,11 @@ skip:
        seq = mmp_new_seq();
        mmp->mmp_seq = cpu_to_le32(seq);
 
-       retval = write_mmp_block(sb, bh);
+       /*
+        * On mount / remount we are protected against fs freezing (by s_umount
+        * semaphore) and grabbing freeze protection upsets lockdep
+        */
+       retval = write_mmp_block_thawed(sb, bh);
        if (retval)
                goto failed;
 
index a5010b5..45b5798 100644 (file)
@@ -674,7 +674,7 @@ static struct stats dx_show_leaf(struct inode *dir,
                                len = de->name_len;
                                if (!IS_ENCRYPTED(dir)) {
                                        /* Directory is not encrypted */
-                                       ext4fs_dirhash(dir, de->name,
+                                       (void) ext4fs_dirhash(dir, de->name,
                                                de->name_len, &h);
                                        printk("%*.s:(U)%x.%u ", len,
                                               name, h.hash,
@@ -709,8 +709,9 @@ static struct stats dx_show_leaf(struct inode *dir,
                                        if (IS_CASEFOLDED(dir))
                                                h.hash = EXT4_DIRENT_HASH(de);
                                        else
-                                               ext4fs_dirhash(dir, de->name,
-                                                      de->name_len, &h);
+                                               (void) ext4fs_dirhash(dir,
+                                                       de->name,
+                                                       de->name_len, &h);
                                        printk("%*.s:(E)%x.%u ", len, name,
                                               h.hash, (unsigned) ((char *) de
                                                                   - base));
@@ -720,7 +721,8 @@ static struct stats dx_show_leaf(struct inode *dir,
 #else
                                int len = de->name_len;
                                char *name = de->name;
-                               ext4fs_dirhash(dir, de->name, de->name_len, &h);
+                               (void) ext4fs_dirhash(dir, de->name,
+                                                     de->name_len, &h);
                                printk("%*.s:%x.%u ", len, name, h.hash,
                                       (unsigned) ((char *) de - base));
 #endif
@@ -849,8 +851,14 @@ dx_probe(struct ext4_filename *fname, struct inode *dir,
        hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
        /* hash is already computed for encrypted casefolded directory */
        if (fname && fname_name(fname) &&
-                               !(IS_ENCRYPTED(dir) && IS_CASEFOLDED(dir)))
-               ext4fs_dirhash(dir, fname_name(fname), fname_len(fname), hinfo);
+           !(IS_ENCRYPTED(dir) && IS_CASEFOLDED(dir))) {
+               int ret = ext4fs_dirhash(dir, fname_name(fname),
+                                        fname_len(fname), hinfo);
+               if (ret < 0) {
+                       ret_err = ERR_PTR(ret);
+                       goto fail;
+               }
+       }
        hash = hinfo->hash;
 
        if (root->info.unused_flags & 1) {
@@ -1111,7 +1119,12 @@ static int htree_dirblock_to_tree(struct file *dir_file,
                                hinfo->minor_hash = 0;
                        }
                } else {
-                       ext4fs_dirhash(dir, de->name, de->name_len, hinfo);
+                       err = ext4fs_dirhash(dir, de->name,
+                                            de->name_len, hinfo);
+                       if (err < 0) {
+                               count = err;
+                               goto errout;
+                       }
                }
                if ((hinfo->hash < start_hash) ||
                    ((hinfo->hash == start_hash) &&
@@ -1313,8 +1326,12 @@ static int dx_make_map(struct inode *dir, struct buffer_head *bh,
                if (de->name_len && de->inode) {
                        if (ext4_hash_in_dirent(dir))
                                h.hash = EXT4_DIRENT_HASH(de);
-                       else
-                               ext4fs_dirhash(dir, de->name, de->name_len, &h);
+                       else {
+                               int err = ext4fs_dirhash(dir, de->name,
+                                                    de->name_len, &h);
+                               if (err < 0)
+                                       return err;
+                       }
                        map_tail--;
                        map_tail->hash = h.hash;
                        map_tail->offs = ((char *) de - base)>>2;
@@ -1452,10 +1469,9 @@ int ext4_fname_setup_ci_filename(struct inode *dir, const struct qstr *iname,
        hinfo->hash_version = DX_HASH_SIPHASH;
        hinfo->seed = NULL;
        if (cf_name->name)
-               ext4fs_dirhash(dir, cf_name->name, cf_name->len, hinfo);
+               return ext4fs_dirhash(dir, cf_name->name, cf_name->len, hinfo);
        else
-               ext4fs_dirhash(dir, iname->name, iname->len, hinfo);
-       return 0;
+               return ext4fs_dirhash(dir, iname->name, iname->len, hinfo);
 }
 #endif
 
@@ -2298,10 +2314,15 @@ static int make_indexed_dir(handle_t *handle, struct ext4_filename *fname,
        fname->hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
 
        /* casefolded encrypted hashes are computed on fname setup */
-       if (!ext4_hash_in_dirent(dir))
-               ext4fs_dirhash(dir, fname_name(fname),
-                               fname_len(fname), &fname->hinfo);
-
+       if (!ext4_hash_in_dirent(dir)) {
+               int err = ext4fs_dirhash(dir, fname_name(fname),
+                                        fname_len(fname), &fname->hinfo);
+               if (err < 0) {
+                       brelse(bh2);
+                       brelse(bh);
+                       return err;
+               }
+       }
        memset(frames, 0, sizeof(frames));
        frame = frames;
        frame->entries = entries;
index d39f386..9680fe7 100644 (file)
@@ -1048,6 +1048,8 @@ void ext4_mark_group_bitmap_corrupted(struct super_block *sb,
        struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL);
        int ret;
 
+       if (!grp || !gdp)
+               return;
        if (flags & EXT4_GROUP_INFO_BBITMAP_CORRUPT) {
                ret = ext4_test_and_set_bit(EXT4_GROUP_INFO_BBITMAP_CORRUPT_BIT,
                                            &grp->bb_state);
@@ -3238,11 +3240,9 @@ static __le16 ext4_group_desc_csum(struct super_block *sb, __u32 block_group,
        crc = crc16(crc, (__u8 *)gdp, offset);
        offset += sizeof(gdp->bg_checksum); /* skip checksum */
        /* for checksum of struct ext4_group_desc do the rest...*/
-       if (ext4_has_feature_64bit(sb) &&
-           offset < le16_to_cpu(sbi->s_es->s_desc_size))
+       if (ext4_has_feature_64bit(sb) && offset < sbi->s_desc_size)
                crc = crc16(crc, (__u8 *)gdp + offset,
-                           le16_to_cpu(sbi->s_es->s_desc_size) -
-                               offset);
+                           sbi->s_desc_size - offset);
 
 out:
        return cpu_to_le16(crc);
@@ -5684,8 +5684,9 @@ static int ext4_fill_super(struct super_block *sb, struct fs_context *fc)
                descr = "out journal";
 
        if (___ratelimit(&ext4_mount_msg_ratelimit, "EXT4-fs mount"))
-               ext4_msg(sb, KERN_INFO, "mounted filesystem %pU with%s. "
-                        "Quota mode: %s.", &sb->s_uuid, descr,
+               ext4_msg(sb, KERN_INFO, "mounted filesystem %pU %s with%s. "
+                        "Quota mode: %s.", &sb->s_uuid,
+                        sb_rdonly(sb) ? "ro" : "r/w", descr,
                         ext4_quota_mode(sb));
 
        /* Update the s_overhead_clusters if necessary */
@@ -6387,6 +6388,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
        struct ext4_mount_options old_opts;
        ext4_group_t g;
        int err = 0;
+       int enable_rw = 0;
 #ifdef CONFIG_QUOTA
        int enable_quota = 0;
        int i, j;
@@ -6573,7 +6575,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
                        if (err)
                                goto restore_opts;
 
-                       sb->s_flags &= ~SB_RDONLY;
+                       enable_rw = 1;
                        if (ext4_has_feature_mmp(sb)) {
                                err = ext4_multi_mount_protect(sb,
                                                le64_to_cpu(es->s_mmp_block));
@@ -6616,9 +6618,6 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
        }
 
 #ifdef CONFIG_QUOTA
-       /* Release old quota file names */
-       for (i = 0; i < EXT4_MAXQUOTAS; i++)
-               kfree(old_opts.s_qf_names[i]);
        if (enable_quota) {
                if (sb_any_quota_suspended(sb))
                        dquot_resume(sb, -1);
@@ -6628,16 +6627,29 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
                                goto restore_opts;
                }
        }
+       /* Release old quota file names */
+       for (i = 0; i < EXT4_MAXQUOTAS; i++)
+               kfree(old_opts.s_qf_names[i]);
 #endif
        if (!test_opt(sb, BLOCK_VALIDITY) && sbi->s_system_blks)
                ext4_release_system_zone(sb);
 
+       if (enable_rw)
+               sb->s_flags &= ~SB_RDONLY;
+
        if (!ext4_has_feature_mmp(sb) || sb_rdonly(sb))
                ext4_stop_mmpd(sbi);
 
        return 0;
 
 restore_opts:
+       /*
+        * If there was a failing r/w to ro transition, we may need to
+        * re-enable quota
+        */
+       if ((sb->s_flags & SB_RDONLY) && !(old_sb_flags & SB_RDONLY) &&
+           sb_any_quota_suspended(sb))
+               dquot_resume(sb, -1);
        sb->s_flags = old_sb_flags;
        sbi->s_mount_opt = old_opts.s_mount_opt;
        sbi->s_mount_opt2 = old_opts.s_mount_opt2;
@@ -6678,8 +6690,9 @@ static int ext4_reconfigure(struct fs_context *fc)
        if (ret < 0)
                return ret;
 
-       ext4_msg(sb, KERN_INFO, "re-mounted %pU. Quota mode: %s.",
-                &sb->s_uuid, ext4_quota_mode(sb));
+       ext4_msg(sb, KERN_INFO, "re-mounted %pU %s. Quota mode: %s.",
+                &sb->s_uuid, sb_rdonly(sb) ? "ro" : "r/w",
+                ext4_quota_mode(sb));
 
        return 0;
 }
index dadad29..dfc2e22 100644 (file)
@@ -2614,6 +2614,7 @@ static int ext4_xattr_move_to_block(handle_t *handle, struct inode *inode,
                .in_inode = !!entry->e_value_inum,
        };
        struct ext4_xattr_ibody_header *header = IHDR(inode, raw_inode);
+       int needs_kvfree = 0;
        int error;
 
        is = kzalloc(sizeof(struct ext4_xattr_ibody_find), GFP_NOFS);
@@ -2636,7 +2637,7 @@ static int ext4_xattr_move_to_block(handle_t *handle, struct inode *inode,
                        error = -ENOMEM;
                        goto out;
                }
-
+               needs_kvfree = 1;
                error = ext4_xattr_inode_get(inode, entry, buffer, value_size);
                if (error)
                        goto out;
@@ -2675,7 +2676,7 @@ static int ext4_xattr_move_to_block(handle_t *handle, struct inode *inode,
 
 out:
        kfree(b_entry_name);
-       if (entry->e_value_inum && buffer)
+       if (needs_kvfree && buffer)
                kvfree(buffer);
        if (is)
                brelse(is->iloc.bh);
index 5eed8c2..a84bf64 100644 (file)
@@ -1419,6 +1419,14 @@ static void gfs2_evict_inode(struct inode *inode)
        if (inode->i_nlink || sb_rdonly(sb) || !ip->i_no_addr)
                goto out;
 
+       /*
+        * In case of an incomplete mount, gfs2_evict_inode() may be called for
+        * system files without having an active journal to write to.  In that
+        * case, skip the filesystem evict.
+        */
+       if (!sdp->sd_jdesc)
+               goto out;
+
        gfs2_holder_mark_uninitialized(&gh);
        ret = evict_should_delete(inode, &gh);
        if (ret == SHOULD_DEFER_EVICTION)
index 4ed379f..4882a81 100644 (file)
@@ -351,7 +351,8 @@ int ksmbd_conn_handler_loop(void *p)
                        break;
 
                /* 4 for rfc1002 length field */
-               size = pdu_size + 4;
+               /* 1 for implied bcc[0] */
+               size = pdu_size + 4 + 1;
                conn->request_buf = kvmalloc(size, GFP_KERNEL);
                if (!conn->request_buf)
                        break;
index 2e54ded..6d1ccb9 100644 (file)
@@ -1449,11 +1449,12 @@ struct lease_ctx_info *parse_lease_state(void *open_req)
  * smb2_find_context_vals() - find a particular context info in open request
  * @open_req:  buffer containing smb2 file open(create) request
  * @tag:       context name to search for
+ * @tag_len:   the length of tag
  *
  * Return:     pointer to requested context, NULL if @str context not found
  *             or error pointer if name length is invalid.
  */
-struct create_context *smb2_find_context_vals(void *open_req, const char *tag)
+struct create_context *smb2_find_context_vals(void *open_req, const char *tag, int tag_len)
 {
        struct create_context *cc;
        unsigned int next = 0;
@@ -1492,7 +1493,7 @@ struct create_context *smb2_find_context_vals(void *open_req, const char *tag)
                        return ERR_PTR(-EINVAL);
 
                name = (char *)cc + name_off;
-               if (memcmp(name, tag, name_len) == 0)
+               if (name_len == tag_len && !memcmp(name, tag, name_len))
                        return cc;
 
                remain_len -= next;
index 0975344..4b0fe6d 100644 (file)
@@ -118,7 +118,7 @@ void create_durable_v2_rsp_buf(char *cc, struct ksmbd_file *fp);
 void create_mxac_rsp_buf(char *cc, int maximal_access);
 void create_disk_id_rsp_buf(char *cc, __u64 file_id, __u64 vol_id);
 void create_posix_rsp_buf(char *cc, struct ksmbd_file *fp);
-struct create_context *smb2_find_context_vals(void *open_req, const char *str);
+struct create_context *smb2_find_context_vals(void *open_req, const char *tag, int tag_len);
 struct oplock_info *lookup_lease_in_table(struct ksmbd_conn *conn,
                                          char *lease_key);
 int find_same_lease_key(struct ksmbd_session *sess, struct ksmbd_inode *ci,
index fbdde42..0ffe663 100644 (file)
@@ -416,8 +416,11 @@ int ksmbd_smb2_check_message(struct ksmbd_work *work)
 
                /*
                 * Allow a message that padded to 8byte boundary.
+                * Linux 4.19.217 with smb 3.0.2 are sometimes
+                * sending messages where the cls_len is exactly
+                * 8 bytes less than len.
                 */
-               if (clc_len < len && (len - clc_len) < 8)
+               if (clc_len < len && (len - clc_len) <= 8)
                        goto validate_credit;
 
                pr_err_ratelimited(
index cb93fd2..717bcd2 100644 (file)
@@ -1356,7 +1356,7 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
        struct authenticate_message *authblob;
        struct ksmbd_user *user;
        char *name;
-       unsigned int auth_msg_len, name_off, name_len, secbuf_len;
+       unsigned int name_off, name_len, secbuf_len;
 
        secbuf_len = le16_to_cpu(req->SecurityBufferLength);
        if (secbuf_len < sizeof(struct authenticate_message)) {
@@ -1366,9 +1366,8 @@ static struct ksmbd_user *session_user(struct ksmbd_conn *conn,
        authblob = user_authblob(conn, req);
        name_off = le32_to_cpu(authblob->UserName.BufferOffset);
        name_len = le16_to_cpu(authblob->UserName.Length);
-       auth_msg_len = le16_to_cpu(req->SecurityBufferOffset) + secbuf_len;
 
-       if (auth_msg_len < (u64)name_off + name_len)
+       if (secbuf_len < (u64)name_off + name_len)
                return NULL;
 
        name = smb_strndup_from_utf16((const char *)authblob + name_off,
@@ -2464,7 +2463,7 @@ static int smb2_create_sd_buffer(struct ksmbd_work *work,
                return -ENOENT;
 
        /* Parse SD BUFFER create contexts */
-       context = smb2_find_context_vals(req, SMB2_CREATE_SD_BUFFER);
+       context = smb2_find_context_vals(req, SMB2_CREATE_SD_BUFFER, 4);
        if (!context)
                return -ENOENT;
        else if (IS_ERR(context))
@@ -2666,7 +2665,7 @@ int smb2_open(struct ksmbd_work *work)
 
        if (req->CreateContextsOffset) {
                /* Parse non-durable handle create contexts */
-               context = smb2_find_context_vals(req, SMB2_CREATE_EA_BUFFER);
+               context = smb2_find_context_vals(req, SMB2_CREATE_EA_BUFFER, 4);
                if (IS_ERR(context)) {
                        rc = PTR_ERR(context);
                        goto err_out1;
@@ -2686,7 +2685,7 @@ int smb2_open(struct ksmbd_work *work)
                }
 
                context = smb2_find_context_vals(req,
-                                                SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST);
+                                                SMB2_CREATE_QUERY_MAXIMAL_ACCESS_REQUEST, 4);
                if (IS_ERR(context)) {
                        rc = PTR_ERR(context);
                        goto err_out1;
@@ -2697,7 +2696,7 @@ int smb2_open(struct ksmbd_work *work)
                }
 
                context = smb2_find_context_vals(req,
-                                                SMB2_CREATE_TIMEWARP_REQUEST);
+                                                SMB2_CREATE_TIMEWARP_REQUEST, 4);
                if (IS_ERR(context)) {
                        rc = PTR_ERR(context);
                        goto err_out1;
@@ -2709,7 +2708,7 @@ int smb2_open(struct ksmbd_work *work)
 
                if (tcon->posix_extensions) {
                        context = smb2_find_context_vals(req,
-                                                        SMB2_CREATE_TAG_POSIX);
+                                                        SMB2_CREATE_TAG_POSIX, 16);
                        if (IS_ERR(context)) {
                                rc = PTR_ERR(context);
                                goto err_out1;
@@ -3107,7 +3106,7 @@ int smb2_open(struct ksmbd_work *work)
                struct create_alloc_size_req *az_req;
 
                az_req = (struct create_alloc_size_req *)smb2_find_context_vals(req,
-                                       SMB2_CREATE_ALLOCATION_SIZE);
+                                       SMB2_CREATE_ALLOCATION_SIZE, 4);
                if (IS_ERR(az_req)) {
                        rc = PTR_ERR(az_req);
                        goto err_out;
@@ -3134,7 +3133,7 @@ int smb2_open(struct ksmbd_work *work)
                                            err);
                }
 
-               context = smb2_find_context_vals(req, SMB2_CREATE_QUERY_ON_DISK_ID);
+               context = smb2_find_context_vals(req, SMB2_CREATE_QUERY_ON_DISK_ID, 4);
                if (IS_ERR(context)) {
                        rc = PTR_ERR(context);
                        goto err_out;
index bb94949..04ba95b 100644 (file)
@@ -77,9 +77,9 @@ static const unsigned long    nlm_grace_period_min = 0;
 static const unsigned long     nlm_grace_period_max = 240;
 static const unsigned long     nlm_timeout_min = 3;
 static const unsigned long     nlm_timeout_max = 20;
-static const int               nlm_port_min = 0, nlm_port_max = 65535;
 
 #ifdef CONFIG_SYSCTL
+static const int               nlm_port_min = 0, nlm_port_max = 65535;
 static struct ctl_table_header * nlm_sysctl_table;
 #endif
 
index 7b8f17e..c159817 100644 (file)
@@ -153,18 +153,6 @@ static int exports_net_open(struct net *net, struct file *file)
        return 0;
 }
 
-static int exports_proc_open(struct inode *inode, struct file *file)
-{
-       return exports_net_open(current->nsproxy->net_ns, file);
-}
-
-static const struct proc_ops exports_proc_ops = {
-       .proc_open      = exports_proc_open,
-       .proc_read      = seq_read,
-       .proc_lseek     = seq_lseek,
-       .proc_release   = seq_release,
-};
-
 static int exports_nfsd_open(struct inode *inode, struct file *file)
 {
        return exports_net_open(inode->i_sb->s_fs_info, file);
@@ -1458,6 +1446,19 @@ static struct file_system_type nfsd_fs_type = {
 MODULE_ALIAS_FS("nfsd");
 
 #ifdef CONFIG_PROC_FS
+
+static int exports_proc_open(struct inode *inode, struct file *file)
+{
+       return exports_net_open(current->nsproxy->net_ns, file);
+}
+
+static const struct proc_ops exports_proc_ops = {
+       .proc_open      = exports_proc_open,
+       .proc_read      = seq_read,
+       .proc_lseek     = seq_lseek,
+       .proc_release   = seq_release,
+};
+
 static int create_proc_exports_entry(void)
 {
        struct proc_dir_entry *entry;
index 4183819..72a906a 100644 (file)
@@ -1365,19 +1365,19 @@ TRACE_EVENT(nfsd_cb_setup,
                __field(u32, cl_id)
                __field(unsigned long, authflavor)
                __sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
-               __array(unsigned char, netid, 8)
+               __string(netid, netid)
        ),
        TP_fast_assign(
                __entry->cl_boot = clp->cl_clientid.cl_boot;
                __entry->cl_id = clp->cl_clientid.cl_id;
-               strlcpy(__entry->netid, netid, sizeof(__entry->netid));
+               __assign_str(netid, netid);
                __entry->authflavor = authflavor;
                __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
                                  clp->cl_cb_conn.cb_addrlen)
        ),
        TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s",
                __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
-               __entry->netid, show_nfsd_authflavor(__entry->authflavor))
+               __get_str(netid), show_nfsd_authflavor(__entry->authflavor))
 );
 
 TRACE_EVENT(nfsd_cb_setup_err,
index 1310d2d..a8ce522 100644 (file)
@@ -917,6 +917,7 @@ void nilfs_evict_inode(struct inode *inode)
        struct nilfs_transaction_info ti;
        struct super_block *sb = inode->i_sb;
        struct nilfs_inode_info *ii = NILFS_I(inode);
+       struct the_nilfs *nilfs;
        int ret;
 
        if (inode->i_nlink || !ii->i_root || unlikely(is_bad_inode(inode))) {
@@ -929,6 +930,23 @@ void nilfs_evict_inode(struct inode *inode)
 
        truncate_inode_pages_final(&inode->i_data);
 
+       nilfs = sb->s_fs_info;
+       if (unlikely(sb_rdonly(sb) || !nilfs->ns_writer)) {
+               /*
+                * If this inode is about to be disposed after the file system
+                * has been degraded to read-only due to file system corruption
+                * or after the writer has been detached, do not make any
+                * changes that cause writes, just clear it.
+                * Do this check after read-locking ns_segctor_sem by
+                * nilfs_transaction_begin() in order to avoid a race with
+                * the writer detach operation.
+                */
+               clear_inode(inode);
+               nilfs_clear_inode(inode);
+               nilfs_transaction_abort(sb);
+               return;
+       }
+
        /* TODO: some of the following operations may fail.  */
        nilfs_truncate_bmap(ii, 0);
        nilfs_mark_inode_dirty(inode);
index 49cfe2a..993375f 100644 (file)
@@ -65,7 +65,7 @@ int inotify_handle_inode_event(struct fsnotify_mark *inode_mark, u32 mask,
        struct fsnotify_event *fsn_event;
        struct fsnotify_group *group = inode_mark->group;
        int ret;
-       int len = 0;
+       int len = 0, wd;
        int alloc_len = sizeof(struct inotify_event_info);
        struct mem_cgroup *old_memcg;
 
@@ -81,6 +81,13 @@ int inotify_handle_inode_event(struct fsnotify_mark *inode_mark, u32 mask,
                              fsn_mark);
 
        /*
+        * We can be racing with mark being detached. Don't report event with
+        * invalid wd.
+        */
+       wd = READ_ONCE(i_mark->wd);
+       if (wd == -1)
+               return 0;
+       /*
         * Whoever is interested in the event, pays for the allocation. Do not
         * trigger OOM killer in the target monitoring memcg as it may have
         * security repercussion.
@@ -110,7 +117,7 @@ int inotify_handle_inode_event(struct fsnotify_mark *inode_mark, u32 mask,
        fsn_event = &event->fse;
        fsnotify_init_event(fsn_event);
        event->mask = mask;
-       event->wd = i_mark->wd;
+       event->wd = wd;
        event->sync_cookie = cookie;
        event->name_len = len;
        if (len)
index ceb17d2..2d88f73 100644 (file)
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -342,7 +342,8 @@ pipe_read(struct kiocb *iocb, struct iov_iter *to)
                        break;
                if (ret)
                        break;
-               if (filp->f_flags & O_NONBLOCK) {
+               if ((filp->f_flags & O_NONBLOCK) ||
+                   (iocb->ki_flags & IOCB_NOWAIT)) {
                        ret = -EAGAIN;
                        break;
                }
@@ -547,7 +548,8 @@ pipe_write(struct kiocb *iocb, struct iov_iter *from)
                        continue;
 
                /* Wait for buffer space to become available. */
-               if (filp->f_flags & O_NONBLOCK) {
+               if ((filp->f_flags & O_NONBLOCK) ||
+                   (iocb->ki_flags & IOCB_NOWAIT)) {
                        if (!ret)
                                ret = -EAGAIN;
                        break;
index 0ba34c1..96d1c3e 100644 (file)
@@ -130,6 +130,7 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p)
        if (sizeof(buf) == sizeof(*st))
                memcpy(&buf, st, sizeof(*st));
        else {
+               memset(&buf, 0, sizeof(buf));
                if (sizeof buf.f_blocks == 4) {
                        if ((st->f_blocks | st->f_bfree | st->f_bavail |
                             st->f_bsize | st->f_frsize) &
@@ -158,7 +159,6 @@ static int do_statfs_native(struct kstatfs *st, struct statfs __user *p)
                buf.f_namelen = st->f_namelen;
                buf.f_frsize = st->f_frsize;
                buf.f_flags = st->f_flags;
-               memset(buf.f_spare, 0, sizeof(buf.f_spare));
        }
        if (copy_to_user(p, &buf, sizeof(buf)))
                return -EFAULT;
@@ -171,6 +171,7 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p)
        if (sizeof(buf) == sizeof(*st))
                memcpy(&buf, st, sizeof(*st));
        else {
+               memset(&buf, 0, sizeof(buf));
                buf.f_type = st->f_type;
                buf.f_bsize = st->f_bsize;
                buf.f_blocks = st->f_blocks;
@@ -182,7 +183,6 @@ static int do_statfs64(struct kstatfs *st, struct statfs64 __user *p)
                buf.f_namelen = st->f_namelen;
                buf.f_frsize = st->f_frsize;
                buf.f_flags = st->f_flags;
-               memset(buf.f_spare, 0, sizeof(buf.f_spare));
        }
        if (copy_to_user(p, &buf, sizeof(buf)))
                return -EFAULT;
index 1b078bb..9b373a0 100644 (file)
@@ -495,10 +495,12 @@ xfs_freesp_init_recs(
                ASSERT(start >= mp->m_ag_prealloc_blocks);
                if (start != mp->m_ag_prealloc_blocks) {
                        /*
-                        * Modify first record to pad stripe align of log
+                        * Modify first record to pad stripe align of log and
+                        * bump the record count.
                         */
                        arec->ar_blockcount = cpu_to_be32(start -
                                                mp->m_ag_prealloc_blocks);
+                       be16_add_cpu(&block->bb_numrecs, 1);
                        nrec = arec + 1;
 
                        /*
@@ -509,7 +511,6 @@ xfs_freesp_init_recs(
                                        be32_to_cpu(arec->ar_startblock) +
                                        be32_to_cpu(arec->ar_blockcount));
                        arec = nrec;
-                       be16_add_cpu(&block->bb_numrecs, 1);
                }
                /*
                 * Change record start to after the internal log
@@ -518,15 +519,13 @@ xfs_freesp_init_recs(
        }
 
        /*
-        * Calculate the record block count and check for the case where
-        * the log might have consumed all available space in the AG. If
-        * so, reset the record count to 0 to avoid exposure of an invalid
-        * record start block.
+        * Calculate the block count of this record; if it is nonzero,
+        * increment the record count.
         */
        arec->ar_blockcount = cpu_to_be32(id->agsize -
                                          be32_to_cpu(arec->ar_startblock));
-       if (!arec->ar_blockcount)
-               block->bb_numrecs = 0;
+       if (arec->ar_blockcount)
+               be16_add_cpu(&block->bb_numrecs, 1);
 }
 
 /*
@@ -538,7 +537,7 @@ xfs_bnoroot_init(
        struct xfs_buf          *bp,
        struct aghdr_init_data  *id)
 {
-       xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 1, id->agno);
+       xfs_btree_init_block(mp, bp, XFS_BTNUM_BNO, 0, 0, id->agno);
        xfs_freesp_init_recs(mp, bp, id);
 }
 
@@ -548,7 +547,7 @@ xfs_cntroot_init(
        struct xfs_buf          *bp,
        struct aghdr_init_data  *id)
 {
-       xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 1, id->agno);
+       xfs_btree_init_block(mp, bp, XFS_BTNUM_CNT, 0, 0, id->agno);
        xfs_freesp_init_recs(mp, bp, id);
 }
 
index b512de0..cd8870a 100644 (file)
@@ -3494,8 +3494,10 @@ xfs_bmap_btalloc_at_eof(
                if (!caller_pag)
                        args->pag = xfs_perag_get(mp, XFS_FSB_TO_AGNO(mp, ap->blkno));
                error = xfs_alloc_vextent_exact_bno(args, ap->blkno);
-               if (!caller_pag)
+               if (!caller_pag) {
                        xfs_perag_put(args->pag);
+                       args->pag = NULL;
+               }
                if (error)
                        return error;
 
@@ -3505,7 +3507,6 @@ xfs_bmap_btalloc_at_eof(
                 * Exact allocation failed. Reset to try an aligned allocation
                 * according to the original allocation specification.
                 */
-               args->pag = NULL;
                args->alignment = stripe_align;
                args->minlen = nextminlen;
                args->minalignslop = 0;
index 87ab9f9..69bc89d 100644 (file)
@@ -42,12 +42,12 @@ xchk_setup_inode_bmap(
        xfs_ilock(sc->ip, XFS_IOLOCK_EXCL);
 
        /*
-        * We don't want any ephemeral data fork updates sitting around
+        * We don't want any ephemeral data/cow fork updates sitting around
         * while we inspect block mappings, so wait for directio to finish
         * and flush dirty data if we have delalloc reservations.
         */
        if (S_ISREG(VFS_I(sc->ip)->i_mode) &&
-           sc->sm->sm_type == XFS_SCRUB_TYPE_BMBTD) {
+           sc->sm->sm_type != XFS_SCRUB_TYPE_BMBTA) {
                struct address_space    *mapping = VFS_I(sc->ip)->i_mapping;
 
                sc->ilock_flags |= XFS_MMAPLOCK_EXCL;
index 9aa7966..7a20256 100644 (file)
@@ -1164,32 +1164,6 @@ xchk_metadata_inode_forks(
        return 0;
 }
 
-/* Pause background reaping of resources. */
-void
-xchk_stop_reaping(
-       struct xfs_scrub        *sc)
-{
-       sc->flags |= XCHK_REAPING_DISABLED;
-       xfs_blockgc_stop(sc->mp);
-       xfs_inodegc_stop(sc->mp);
-}
-
-/* Restart background reaping of resources. */
-void
-xchk_start_reaping(
-       struct xfs_scrub        *sc)
-{
-       /*
-        * Readonly filesystems do not perform inactivation or speculative
-        * preallocation, so there's no need to restart the workers.
-        */
-       if (!xfs_is_readonly(sc->mp)) {
-               xfs_inodegc_start(sc->mp);
-               xfs_blockgc_start(sc->mp);
-       }
-       sc->flags &= ~XCHK_REAPING_DISABLED;
-}
-
 /*
  * Enable filesystem hooks (i.e. runtime code patching) before starting a scrub
  * operation.  Callers must not hold any locks that intersect with the CPU
index 18b5f2b..791235c 100644 (file)
@@ -156,8 +156,6 @@ static inline bool xchk_skip_xref(struct xfs_scrub_metadata *sm)
 }
 
 int xchk_metadata_inode_forks(struct xfs_scrub *sc);
-void xchk_stop_reaping(struct xfs_scrub *sc);
-void xchk_start_reaping(struct xfs_scrub *sc);
 
 /*
  * Setting up a hook to wait for intents to drain is costly -- we have to take
index faa315b..e382a35 100644 (file)
@@ -150,13 +150,6 @@ xchk_setup_fscounters(
        if (error)
                return error;
 
-       /*
-        * Pause background reclaim while we're scrubbing to reduce the
-        * likelihood of background perturbations to the counters throwing off
-        * our calculations.
-        */
-       xchk_stop_reaping(sc);
-
        return xchk_trans_alloc(sc, 0);
 }
 
@@ -454,6 +447,12 @@ xchk_fscounters(
                xchk_set_corrupt(sc);
 
        /*
+        * XXX: We can't quiesce percpu counter updates, so exit early.
+        * This can be re-enabled when we gain exclusive freeze functionality.
+        */
+       return 0;
+
+       /*
         * If ifree exceeds icount by more than the minimum variance then
         * something's probably wrong with the counters.
         */
index 02819be..3d98f60 100644 (file)
@@ -186,8 +186,6 @@ xchk_teardown(
        }
        if (sc->sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR)
                mnt_drop_write_file(sc->file);
-       if (sc->flags & XCHK_REAPING_DISABLED)
-               xchk_start_reaping(sc);
        if (sc->buf) {
                if (sc->buf_cleanup)
                        sc->buf_cleanup(sc->buf);
index e719034..b38e938 100644 (file)
@@ -106,7 +106,6 @@ struct xfs_scrub {
 
 /* XCHK state flags grow up from zero, XREP state flags grown down from 2^31 */
 #define XCHK_TRY_HARDER                (1 << 0)  /* can't get resources, try again */
-#define XCHK_REAPING_DISABLED  (1 << 1)  /* background block reaping paused */
 #define XCHK_FSGATES_DRAIN     (1 << 2)  /* defer ops draining enabled */
 #define XCHK_NEED_DRAIN                (1 << 3)  /* scrub needs to drain defer ops */
 #define XREP_ALREADY_FIXED     (1 << 31) /* checking our repair work */
index 68efd6f..b3894da 100644 (file)
@@ -98,7 +98,6 @@ TRACE_DEFINE_ENUM(XFS_SCRUB_TYPE_FSCOUNTERS);
 
 #define XFS_SCRUB_STATE_STRINGS \
        { XCHK_TRY_HARDER,                      "try_harder" }, \
-       { XCHK_REAPING_DISABLED,                "reaping_disabled" }, \
        { XCHK_FSGATES_DRAIN,                   "fsgates_drain" }, \
        { XCHK_NEED_DRAIN,                      "need_drain" }, \
        { XREP_ALREADY_FIXED,                   "already_fixed" }
index f032d3a..fbb6755 100644 (file)
@@ -558,7 +558,9 @@ xfs_getbmap(
                if (!xfs_iext_next_extent(ifp, &icur, &got)) {
                        xfs_fileoff_t   end = XFS_B_TO_FSB(mp, XFS_ISIZE(ip));
 
-                       out[bmv->bmv_entries - 1].bmv_oflags |= BMV_OF_LAST;
+                       if (bmv->bmv_entries > 0)
+                               out[bmv->bmv_entries - 1].bmv_oflags |=
+                                                               BMV_OF_LAST;
 
                        if (whichfork != XFS_ATTR_FORK && bno < end &&
                            !xfs_getbmap_full(bmv)) {
index 351849f..0f60e30 100644 (file)
@@ -435,18 +435,23 @@ xfs_iget_check_free_state(
 }
 
 /* Make all pending inactivation work start immediately. */
-static void
+static bool
 xfs_inodegc_queue_all(
        struct xfs_mount        *mp)
 {
        struct xfs_inodegc      *gc;
        int                     cpu;
+       bool                    ret = false;
 
        for_each_online_cpu(cpu) {
                gc = per_cpu_ptr(mp->m_inodegc, cpu);
-               if (!llist_empty(&gc->list))
+               if (!llist_empty(&gc->list)) {
                        mod_delayed_work_on(cpu, mp->m_inodegc_wq, &gc->work, 0);
+                       ret = true;
+               }
        }
+
+       return ret;
 }
 
 /*
@@ -1856,6 +1861,8 @@ xfs_inodegc_worker(
        struct xfs_inode        *ip, *n;
        unsigned int            nofs_flag;
 
+       ASSERT(gc->cpu == smp_processor_id());
+
        WRITE_ONCE(gc->items, 0);
 
        if (!node)
@@ -1909,24 +1916,41 @@ xfs_inodegc_flush(
 
 /*
  * Flush all the pending work and then disable the inode inactivation background
- * workers and wait for them to stop.
+ * workers and wait for them to stop.  Caller must hold sb->s_umount to
+ * coordinate changes in the inodegc_enabled state.
  */
 void
 xfs_inodegc_stop(
        struct xfs_mount        *mp)
 {
+       bool                    rerun;
+
        if (!xfs_clear_inodegc_enabled(mp))
                return;
 
+       /*
+        * Drain all pending inodegc work, including inodes that could be
+        * queued by racing xfs_inodegc_queue or xfs_inodegc_shrinker_scan
+        * threads that sample the inodegc state just prior to us clearing it.
+        * The inodegc flag state prevents new threads from queuing more
+        * inodes, so we queue pending work items and flush the workqueue until
+        * all inodegc lists are empty.  IOWs, we cannot use drain_workqueue
+        * here because it does not allow other unserialized mechanisms to
+        * reschedule inodegc work while this draining is in progress.
+        */
        xfs_inodegc_queue_all(mp);
-       drain_workqueue(mp->m_inodegc_wq);
+       do {
+               flush_workqueue(mp->m_inodegc_wq);
+               rerun = xfs_inodegc_queue_all(mp);
+       } while (rerun);
 
        trace_xfs_inodegc_stop(mp, __return_address);
 }
 
 /*
  * Enable the inode inactivation background workers and schedule deferred inode
- * inactivation work if there is any.
+ * inactivation work if there is any.  Caller must hold sb->s_umount to
+ * coordinate changes in the inodegc_enabled state.
  */
 void
 xfs_inodegc_start(
@@ -2069,7 +2093,8 @@ xfs_inodegc_queue(
                queue_delay = 0;
 
        trace_xfs_inodegc_queue(mp, __return_address);
-       mod_delayed_work(mp->m_inodegc_wq, &gc->work, queue_delay);
+       mod_delayed_work_on(current_cpu(), mp->m_inodegc_wq, &gc->work,
+                       queue_delay);
        put_cpu_ptr(gc);
 
        if (xfs_inodegc_want_flush_work(ip, items, shrinker_hits)) {
@@ -2113,7 +2138,8 @@ xfs_inodegc_cpu_dead(
 
        if (xfs_is_inodegc_enabled(mp)) {
                trace_xfs_inodegc_queue(mp, __return_address);
-               mod_delayed_work(mp->m_inodegc_wq, &gc->work, 0);
+               mod_delayed_work_on(current_cpu(), mp->m_inodegc_wq, &gc->work,
+                               0);
        }
        put_cpu_ptr(gc);
 }
index 285885c..18c8f16 100644 (file)
@@ -1006,8 +1006,9 @@ xfs_buffered_write_iomap_begin(
        if (eof)
                imap.br_startoff = end_fsb; /* fake hole until the end */
 
-       /* We never need to allocate blocks for zeroing a hole. */
-       if ((flags & IOMAP_ZERO) && imap.br_startoff > offset_fsb) {
+       /* We never need to allocate blocks for zeroing or unsharing a hole. */
+       if ((flags & (IOMAP_UNSHARE | IOMAP_ZERO)) &&
+           imap.br_startoff > offset_fsb) {
                xfs_hole_to_iomap(ip, iomap, offset_fsb, imap.br_startoff);
                goto out_unlock;
        }
index f3269c0..aaaf5ec 100644 (file)
@@ -66,6 +66,9 @@ struct xfs_inodegc {
        /* approximate count of inodes in the list */
        unsigned int            items;
        unsigned int            shrinker_hits;
+#if defined(DEBUG) || defined(XFS_WARN)
+       unsigned int            cpu;
+#endif
 };
 
 /*
index 4d2e874..7e70625 100644 (file)
@@ -1095,6 +1095,9 @@ xfs_inodegc_init_percpu(
 
        for_each_possible_cpu(cpu) {
                gc = per_cpu_ptr(mp->m_inodegc, cpu);
+#if defined(DEBUG) || defined(XFS_WARN)
+               gc->cpu = cpu;
+#endif
                init_llist_head(&gc->list);
                gc->items = 0;
                INIT_DELAYED_WORK(&gc->work, xfs_inodegc_worker);
index 358db4a..f8813c1 100644 (file)
 
 #define DP_DSC_MAX_BITS_PER_PIXEL_HI        0x068   /* eDP 1.4 */
 # define DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK  (0x3 << 0)
-# define DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT 8
-# define DP_DSC_MAX_BPP_DELTA_VERSION_MASK  0x06
-# define DP_DSC_MAX_BPP_DELTA_AVAILABILITY  0x08
+# define DP_DSC_MAX_BPP_DELTA_VERSION_MASK  (0x3 << 5) /* eDP 1.5 & DP 2.0 */
+# define DP_DSC_MAX_BPP_DELTA_AVAILABILITY  (1 << 7)   /* eDP 1.5 & DP 2.0 */
 
 #define DP_DSC_DEC_COLOR_FORMAT_CAP         0x069
 # define DP_DSC_RGB                         (1 << 0)
index 533d3ee..86f24a7 100644 (file)
@@ -181,9 +181,8 @@ static inline u16
 drm_edp_dsc_sink_output_bpp(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
 {
        return dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_LOW - DP_DSC_SUPPORT] |
-               (dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] &
-                DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK <<
-                DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT);
+               ((dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] &
+                 DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK) << 8);
 }
 
 static inline u32
index b441e63..c0ffe20 100644 (file)
@@ -1376,8 +1376,6 @@ enum blk_unique_id {
        BLK_UID_NAA     = 3,
 };
 
-#define NFL4_UFLG_MASK                 0x0000003F
-
 struct block_device_operations {
        void (*submit_bio)(struct bio *bio);
        int (*poll_bio)(struct bio *bio, struct io_comp_batch *iob,
index 947a60b..d7779a1 100644 (file)
  * Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
  * to disable branch tracing on a per file basis.
  */
-#if defined(CONFIG_TRACE_BRANCH_PROFILING) \
-    && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
 void ftrace_likely_update(struct ftrace_likely_data *f, int val,
                          int expect, int is_constant);
-
+#if defined(CONFIG_TRACE_BRANCH_PROFILING) \
+    && !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
 #define likely_notrace(x)      __builtin_expect(!!(x), 1)
 #define unlikely_notrace(x)    __builtin_expect(!!(x), 0)
 
index 9deeaeb..abf3d3b 100644 (file)
@@ -74,6 +74,7 @@ struct class {
 struct class_dev_iter {
        struct klist_iter               ki;
        const struct device_type        *type;
+       struct subsys_private           *sp;
 };
 
 int __must_check class_register(const struct class *class);
index 6c57339..f343bc9 100644 (file)
@@ -236,8 +236,9 @@ void dim_park_tired(struct dim *dim);
  *
  * Calculate the delta between two samples (in data rates).
  * Takes into consideration counter wrap-around.
+ * Returned boolean indicates whether curr_stats are reliable.
  */
-void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
+bool dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
                    struct dim_stats *curr_stats);
 
 /**
index 0f40f37..6ba7195 100644 (file)
@@ -637,6 +637,23 @@ static inline __be16 vlan_get_protocol(const struct sk_buff *skb)
        return __vlan_get_protocol(skb, skb->protocol, NULL);
 }
 
+/* This version of __vlan_get_protocol() also pulls mac header in skb->head */
+static inline __be16 vlan_get_protocol_and_depth(struct sk_buff *skb,
+                                                __be16 type, int *depth)
+{
+       int maclen;
+
+       type = __vlan_get_protocol(skb, type, &maclen);
+
+       if (type) {
+               if (!pskb_may_pull(skb, maclen))
+                       type = 0;
+               else if (depth)
+                       *depth = maclen;
+       }
+       return type;
+}
+
 /* A getter for the SKB protocol field which will handle VLAN tags consistently
  * whether VLAN acceleration is enabled or not.
  */
index 3399d97..7fe31b2 100644 (file)
@@ -36,6 +36,11 @@ struct io_uring_cmd {
        u8              pdu[32]; /* available inline for free use */
 };
 
+static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe)
+{
+       return sqe->cmd;
+}
+
 #if defined(CONFIG_IO_URING)
 int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
                              struct iov_iter *iter, void *ioucmd);
@@ -66,11 +71,6 @@ static inline void io_uring_free(struct task_struct *tsk)
        if (tsk->io_uring)
                __io_uring_free(tsk);
 }
-
-static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe)
-{
-       return sqe->cmd;
-}
 #else
 static inline int io_uring_cmd_import_fixed(u64 ubuf, unsigned long len, int rw,
                              struct iov_iter *iter, void *ioucmd)
index 45c3d62..95f33da 100644 (file)
 #define PCI_DEVICE_ID_AMD_19H_M50H_DF_F3 0x166d
 #define PCI_DEVICE_ID_AMD_19H_M60H_DF_F3 0x14e3
 #define PCI_DEVICE_ID_AMD_19H_M70H_DF_F3 0x14f3
+#define PCI_DEVICE_ID_AMD_19H_M78H_DF_F3 0x12fb
 #define PCI_DEVICE_ID_AMD_CNB17H_F3    0x1703
 #define PCI_DEVICE_ID_AMD_LANCE                0x2000
 #define PCI_DEVICE_ID_AMD_LANCE_HOME   0x2001
index c5a0dc8..6478838 100644 (file)
@@ -1900,10 +1900,8 @@ void phy_package_leave(struct phy_device *phydev);
 int devm_phy_package_join(struct device *dev, struct phy_device *phydev,
                          int addr, size_t priv_size);
 
-#if IS_ENABLED(CONFIG_PHYLIB)
 int __init mdio_bus_init(void);
 void mdio_bus_exit(void);
-#endif
 
 int phy_ethtool_get_strings(struct phy_device *phydev, u8 *data);
 int phy_ethtool_get_sset_count(struct phy_device *phydev);
index 7bde8e1..224293b 100644 (file)
@@ -107,7 +107,10 @@ extern void synchronize_shrinkers(void);
 
 #ifdef CONFIG_SHRINKER_DEBUG
 extern int shrinker_debugfs_add(struct shrinker *shrinker);
-extern struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker);
+extern struct dentry *shrinker_debugfs_detach(struct shrinker *shrinker,
+                                             int *debugfs_id);
+extern void shrinker_debugfs_remove(struct dentry *debugfs_entry,
+                                   int debugfs_id);
 extern int __printf(2, 3) shrinker_debugfs_rename(struct shrinker *shrinker,
                                                  const char *fmt, ...);
 #else /* CONFIG_SHRINKER_DEBUG */
@@ -115,10 +118,16 @@ static inline int shrinker_debugfs_add(struct shrinker *shrinker)
 {
        return 0;
 }
-static inline struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker)
+static inline struct dentry *shrinker_debugfs_detach(struct shrinker *shrinker,
+                                                    int *debugfs_id)
 {
+       *debugfs_id = -1;
        return NULL;
 }
+static inline void shrinker_debugfs_remove(struct dentry *debugfs_entry,
+                                          int debugfs_id)
+{
+}
 static inline __printf(2, 3)
 int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...)
 {
index 24aa159..fbc4bd4 100644 (file)
@@ -176,7 +176,7 @@ extern struct svc_rdma_recv_ctxt *
 extern void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
                                   struct svc_rdma_recv_ctxt *ctxt);
 extern void svc_rdma_flush_recv_queues(struct svcxprt_rdma *rdma);
-extern void svc_rdma_release_rqst(struct svc_rqst *rqstp);
+extern void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *ctxt);
 extern int svc_rdma_recvfrom(struct svc_rqst *);
 
 /* svc_rdma_rw.c */
index 8674792..a6b1263 100644 (file)
@@ -23,7 +23,7 @@ struct svc_xprt_ops {
        int             (*xpo_sendto)(struct svc_rqst *);
        int             (*xpo_result_payload)(struct svc_rqst *, unsigned int,
                                              unsigned int);
-       void            (*xpo_release_rqst)(struct svc_rqst *);
+       void            (*xpo_release_ctxt)(struct svc_xprt *xprt, void *ctxt);
        void            (*xpo_detach)(struct svc_xprt *);
        void            (*xpo_free)(struct svc_xprt *);
        void            (*xpo_kill_temp_xprt)(struct svc_xprt *);
index 7769338..6a1e8f1 100644 (file)
@@ -282,6 +282,7 @@ enum tpm_chip_flags {
        TPM_CHIP_FLAG_ALWAYS_POWERED            = BIT(5),
        TPM_CHIP_FLAG_FIRMWARE_POWER_MANAGED    = BIT(6),
        TPM_CHIP_FLAG_FIRMWARE_UPGRADE          = BIT(7),
+       TPM_CHIP_FLAG_SUSPENDED                 = BIT(8),
 };
 
 #define to_tpm_chip(d) container_of(d, struct tpm_chip, dev)
index a2448e9..07531c4 100644 (file)
@@ -443,7 +443,7 @@ static inline struct usb_composite_driver *to_cdriver(
  * @bcd_webusb_version: 0x0100 by default, WebUSB specification version
  * @b_webusb_vendor_code: 0x0 by default, vendor code for WebUSB
  * @landing_page: empty by default, landing page to announce in WebUSB
- * @use_webusb:: false by default, interested gadgets set it
+ * @use_webusb: false by default, interested gadgets set it
  * @os_desc_config: the configuration to be used with OS descriptors
  * @setup_pending: true when setup request is queued but not completed
  * @os_desc_pending: true when os_desc request is queued but not completed
index e7c4487..367d538 100644 (file)
@@ -686,7 +686,10 @@ struct dtv_frontend_properties {
  * @id:                        Frontend ID
  * @exit:              Used to inform the DVB core that the frontend
  *                     thread should exit (usually, means that the hardware
- *                     got disconnected.
+ *                     got disconnected).
+ * @remove_mutex:      mutex that avoids a race condition between a callback
+ *                     called when the hardware is disconnected and the
+ *                     file_operations of dvb_frontend.
  */
 
 struct dvb_frontend {
@@ -704,6 +707,7 @@ struct dvb_frontend {
        int (*callback)(void *adapter_priv, int component, int cmd, int arg);
        int id;
        unsigned int exit;
+       struct mutex remove_mutex;
 };
 
 /**
index 9980b1d..4a921ea 100644 (file)
@@ -39,6 +39,9 @@ struct net_device;
  * @exit:              flag to indicate when the device is being removed.
  * @demux:             pointer to &struct dmx_demux.
  * @ioctl_mutex:       protect access to this struct.
+ * @remove_mutex:      mutex that avoids a race condition between a callback
+ *                     called when the hardware is disconnected and the
+ *                     file_operations of dvb_net.
  *
  * Currently, the core supports up to %DVB_NET_DEVICES_MAX (10) network
  * devices.
@@ -51,6 +54,7 @@ struct dvb_net {
        unsigned int exit:1;
        struct dmx_demux *demux;
        struct mutex ioctl_mutex;
+       struct mutex remove_mutex;
 };
 
 /**
index 29d25c8..8958e5e 100644 (file)
@@ -194,6 +194,21 @@ struct dvb_device {
 };
 
 /**
+ * struct dvbdevfops_node - fops nodes registered in dvbdevfops_list
+ *
+ * @fops:              Dynamically allocated fops for ->owner registration
+ * @type:              type of dvb_device
+ * @template:          dvb_device used for registration
+ * @list_head:         list_head for dvbdevfops_list
+ */
+struct dvbdevfops_node {
+       struct file_operations *fops;
+       enum dvb_device_type type;
+       const struct dvb_device *template;
+       struct list_head list_head;
+};
+
+/**
  * dvb_device_get - Increase dvb_device reference
  *
  * @dvbdev:    pointer to struct dvb_device
index a60a249..0efef2a 100644 (file)
@@ -233,7 +233,7 @@ struct bonding {
         */
        spinlock_t mode_lock;
        spinlock_t stats_lock;
-       u      send_peer_notif;
+       u32      send_peer_notif;
        u8       igmp_retrans;
 #ifdef CONFIG_PROC_FS
        struct   proc_dir_entry *proc_entry;
index 9fa291a..2b12725 100644 (file)
@@ -497,29 +497,6 @@ static inline struct fib6_nh *nexthop_fib6_nh(struct nexthop *nh)
        return NULL;
 }
 
-/* Variant of nexthop_fib6_nh().
- * Caller should either hold rcu_read_lock(), or RTNL.
- */
-static inline struct fib6_nh *nexthop_fib6_nh_bh(struct nexthop *nh)
-{
-       struct nh_info *nhi;
-
-       if (nh->is_group) {
-               struct nh_group *nh_grp;
-
-               nh_grp = rcu_dereference_rtnl(nh->nh_grp);
-               nh = nexthop_mpath_select(nh_grp, 0);
-               if (!nh)
-                       return NULL;
-       }
-
-       nhi = rcu_dereference_rtnl(nh->nh_info);
-       if (nhi->family == AF_INET6)
-               return &nhi->fib6_nh;
-
-       return NULL;
-}
-
 static inline struct net_device *fib6_info_nh_dev(struct fib6_info *f6i)
 {
        struct fib6_nh *fib6_nh;
index 8b7ed71..656ea89 100644 (file)
@@ -2718,7 +2718,7 @@ static inline void sock_recv_cmsgs(struct msghdr *msg, struct sock *sk,
                __sock_recv_cmsgs(msg, sk, skb);
        else if (unlikely(sock_flag(sk, SOCK_TIMESTAMP)))
                sock_write_timestamp(sk, skb->tstamp);
-       else if (unlikely(sk->sk_stamp == SK_DEFAULT_STAMP))
+       else if (unlikely(sock_read_timestamp(sk) == SK_DEFAULT_STAMP))
                sock_write_timestamp(sk, 0);
 }
 
index dbc47af..4f44f0b 100644 (file)
@@ -44,6 +44,9 @@ int hdac_bus_eml_sdw_power_down_unlocked(struct hdac_bus *bus, int sublink);
 
 int hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num);
 
+int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
+                                  int channel_mask, int stream_id, int dir);
+
 void hda_bus_ml_put_all(struct hdac_bus *bus);
 void hda_bus_ml_reset_losidv(struct hdac_bus *bus);
 int hda_bus_ml_resume(struct hdac_bus *bus);
@@ -51,6 +54,7 @@ int hda_bus_ml_suspend(struct hdac_bus *bus);
 
 struct hdac_ext_link *hdac_bus_eml_ssp_get_hlink(struct hdac_bus *bus);
 struct hdac_ext_link *hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus);
+struct hdac_ext_link *hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus);
 
 struct mutex *hdac_bus_eml_get_mutex(struct hdac_bus *bus, bool alt, int elid);
 
@@ -144,6 +148,13 @@ hdac_bus_eml_sdw_power_down_unlocked(struct hdac_bus *bus, int sublink) { return
 static inline int
 hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num) { return 0; }
 
+static inline int
+hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
+                              int channel_mask, int stream_id, int dir)
+{
+       return 0;
+}
+
 static inline void hda_bus_ml_put_all(struct hdac_bus *bus) { }
 static inline void hda_bus_ml_reset_losidv(struct hdac_bus *bus) { }
 static inline int hda_bus_ml_resume(struct hdac_bus *bus) { return 0; }
@@ -155,6 +166,9 @@ hdac_bus_eml_ssp_get_hlink(struct hdac_bus *bus) { return NULL; }
 static inline struct hdac_ext_link *
 hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus) { return NULL; }
 
+static inline struct hdac_ext_link *
+hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus) { return NULL; }
+
 static inline struct mutex *
 hdac_bus_eml_get_mutex(struct hdac_bus *bus, bool alt, int elid) { return NULL; }
 
index bbc3787..e9ec7e4 100644 (file)
 #define SOF_TKN_CAVS_AUDIO_FORMAT_IN_INTERLEAVING_STYLE        1906
 #define SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG   1907
 #define SOF_TKN_CAVS_AUDIO_FORMAT_IN_SAMPLE_TYPE       1908
-#define SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX            1909
+#define SOF_TKN_CAVS_AUDIO_FORMAT_INPUT_PIN_INDEX      1909
 /* intentional token numbering discontinuity, reserved for future use */
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_RATE     1930
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_BIT_DEPTH        1931
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_INTERLEAVING_STYLE       1936
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG  1937
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OUT_SAMPLE_TYPE      1938
+#define SOF_TKN_CAVS_AUDIO_FORMAT_OUTPUT_PIN_INDEX     1939
 /* intentional token numbering discontinuity, reserved for future use */
 #define SOF_TKN_CAVS_AUDIO_FORMAT_IBS          1970
 #define SOF_TKN_CAVS_AUDIO_FORMAT_OBS          1971
index f755329..df1d04f 100644 (file)
@@ -1133,7 +1133,7 @@ static inline size_t ufshcd_sg_entry_size(const struct ufs_hba *hba)
        ({ (void)(hba); BUILD_BUG_ON(sg_entry_size != sizeof(struct ufshcd_sg_entry)); })
 #endif
 
-static inline size_t sizeof_utp_transfer_cmd_desc(const struct ufs_hba *hba)
+static inline size_t ufshcd_get_ucd_size(const struct ufs_hba *hba)
 {
        return sizeof(struct utp_transfer_cmd_desc) + SG_ALL * ufshcd_sg_entry_size(hba);
 }
index 68baa81..db016e4 100644 (file)
@@ -10150,8 +10150,20 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
        perf_trace_buf_update(record, event_type);
 
        hlist_for_each_entry_rcu(event, head, hlist_entry) {
-               if (perf_tp_event_match(event, &data, regs))
+               if (perf_tp_event_match(event, &data, regs)) {
                        perf_swevent_event(event, count, &data, regs);
+
+                       /*
+                        * Here use the same on-stack perf_sample_data,
+                        * some members in data are event-specific and
+                        * need to be re-computed for different sweveents.
+                        * Re-initialize data->sample_flags safely to avoid
+                        * the problem that next event skips preparing data
+                        * because data->sample_flags is set.
+                        */
+                       perf_sample_data_init(&data, 0, 0);
+                       perf_sample_save_raw_data(&data, &raw);
+               }
        }
 
        /*
index acb5a50..9eabd58 100644 (file)
@@ -1240,7 +1240,7 @@ static struct rw_semaphore *rwsem_downgrade_wake(struct rw_semaphore *sem)
 /*
  * lock for reading
  */
-static inline int __down_read_common(struct rw_semaphore *sem, int state)
+static __always_inline int __down_read_common(struct rw_semaphore *sem, int state)
 {
        int ret = 0;
        long count;
@@ -1258,17 +1258,17 @@ out:
        return ret;
 }
 
-static inline void __down_read(struct rw_semaphore *sem)
+static __always_inline void __down_read(struct rw_semaphore *sem)
 {
        __down_read_common(sem, TASK_UNINTERRUPTIBLE);
 }
 
-static inline int __down_read_interruptible(struct rw_semaphore *sem)
+static __always_inline int __down_read_interruptible(struct rw_semaphore *sem)
 {
        return __down_read_common(sem, TASK_INTERRUPTIBLE);
 }
 
-static inline int __down_read_killable(struct rw_semaphore *sem)
+static __always_inline int __down_read_killable(struct rw_semaphore *sem)
 {
        return __down_read_common(sem, TASK_KILLABLE);
 }
index 944c3ae..a68d127 100644 (file)
@@ -11492,7 +11492,7 @@ void call_trace_sched_update_nr_running(struct rq *rq, int count)
 
 #ifdef CONFIG_SCHED_MM_CID
 
-/**
+/*
  * @cid_lock: Guarantee forward-progress of cid allocation.
  *
  * Concurrency ID allocation within a bitmap is mostly lock-free. The cid_lock
@@ -11501,7 +11501,7 @@ void call_trace_sched_update_nr_running(struct rq *rq, int count)
  */
 DEFINE_RAW_SPINLOCK(cid_lock);
 
-/**
+/*
  * @use_cid_lock: Select cid allocation behavior: lock-free vs spinlock.
  *
  * When @use_cid_lock is 0, the cid allocation is lock-free. When contention is
index 93bf2b4..771d1e0 100644 (file)
@@ -35,14 +35,15 @@ static __cacheline_aligned_in_smp DEFINE_RAW_SPINLOCK(tick_broadcast_lock);
 #ifdef CONFIG_TICK_ONESHOT
 static DEFINE_PER_CPU(struct clock_event_device *, tick_oneshot_wakeup_device);
 
-static void tick_broadcast_setup_oneshot(struct clock_event_device *bc);
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc, bool from_periodic);
 static void tick_broadcast_clear_oneshot(int cpu);
 static void tick_resume_broadcast_oneshot(struct clock_event_device *bc);
 # ifdef CONFIG_HOTPLUG_CPU
 static void tick_broadcast_oneshot_offline(unsigned int cpu);
 # endif
 #else
-static inline void tick_broadcast_setup_oneshot(struct clock_event_device *bc) { BUG(); }
+static inline void
+tick_broadcast_setup_oneshot(struct clock_event_device *bc, bool from_periodic) { BUG(); }
 static inline void tick_broadcast_clear_oneshot(int cpu) { }
 static inline void tick_resume_broadcast_oneshot(struct clock_event_device *bc) { }
 # ifdef CONFIG_HOTPLUG_CPU
@@ -264,7 +265,7 @@ int tick_device_uses_broadcast(struct clock_event_device *dev, int cpu)
                if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
                        tick_broadcast_start_periodic(bc);
                else
-                       tick_broadcast_setup_oneshot(bc);
+                       tick_broadcast_setup_oneshot(bc, false);
                ret = 1;
        } else {
                /*
@@ -500,7 +501,7 @@ void tick_broadcast_control(enum tick_broadcast_mode mode)
                        if (tick_broadcast_device.mode == TICKDEV_MODE_PERIODIC)
                                tick_broadcast_start_periodic(bc);
                        else
-                               tick_broadcast_setup_oneshot(bc);
+                               tick_broadcast_setup_oneshot(bc, false);
                }
        }
 out:
@@ -1020,48 +1021,101 @@ static inline ktime_t tick_get_next_period(void)
 /**
  * tick_broadcast_setup_oneshot - setup the broadcast device
  */
-static void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
+static void tick_broadcast_setup_oneshot(struct clock_event_device *bc,
+                                        bool from_periodic)
 {
        int cpu = smp_processor_id();
+       ktime_t nexttick = 0;
 
        if (!bc)
                return;
 
-       /* Set it up only once ! */
-       if (bc->event_handler != tick_handle_oneshot_broadcast) {
-               int was_periodic = clockevent_state_periodic(bc);
-
-               bc->event_handler = tick_handle_oneshot_broadcast;
-
+       /*
+        * When the broadcast device was switched to oneshot by the first
+        * CPU handling the NOHZ change, the other CPUs will reach this
+        * code via hrtimer_run_queues() -> tick_check_oneshot_change()
+        * too. Set up the broadcast device only once!
+        */
+       if (bc->event_handler == tick_handle_oneshot_broadcast) {
                /*
-                * We must be careful here. There might be other CPUs
-                * waiting for periodic broadcast. We need to set the
-                * oneshot_mask bits for those and program the
-                * broadcast device to fire.
+                * The CPU which switched from periodic to oneshot mode
+                * set the broadcast oneshot bit for all other CPUs which
+                * are in the general (periodic) broadcast mask to ensure
+                * that CPUs which wait for the periodic broadcast are
+                * woken up.
+                *
+                * Clear the bit for the local CPU as the set bit would
+                * prevent the first tick_broadcast_enter() after this CPU
+                * switched to oneshot state to program the broadcast
+                * device.
+                *
+                * This code can also be reached via tick_broadcast_control(),
+                * but this cannot avoid the tick_broadcast_clear_oneshot()
+                * as that would break the periodic to oneshot transition of
+                * secondary CPUs. But that's harmless as the below only
+                * clears already cleared bits.
                 */
+               tick_broadcast_clear_oneshot(cpu);
+               return;
+       }
+
+
+       bc->event_handler = tick_handle_oneshot_broadcast;
+       bc->next_event = KTIME_MAX;
+
+       /*
+        * When the tick mode is switched from periodic to oneshot it must
+        * be ensured that CPUs which are waiting for periodic broadcast
+        * get their wake-up at the next tick.  This is achieved by ORing
+        * tick_broadcast_mask into tick_broadcast_oneshot_mask.
+        *
+        * For other callers, e.g. broadcast device replacement,
+        * tick_broadcast_oneshot_mask must not be touched as this would
+        * set bits for CPUs which are already NOHZ, but not idle. Their
+        * next tick_broadcast_enter() would observe the bit set and fail
+        * to update the expiry time and the broadcast event device.
+        */
+       if (from_periodic) {
                cpumask_copy(tmpmask, tick_broadcast_mask);
+               /* Remove the local CPU as it is obviously not idle */
                cpumask_clear_cpu(cpu, tmpmask);
-               cpumask_or(tick_broadcast_oneshot_mask,
-                          tick_broadcast_oneshot_mask, tmpmask);
+               cpumask_or(tick_broadcast_oneshot_mask, tick_broadcast_oneshot_mask, tmpmask);
 
-               if (was_periodic && !cpumask_empty(tmpmask)) {
-                       ktime_t nextevt = tick_get_next_period();
+               /*
+                * Ensure that the oneshot broadcast handler will wake the
+                * CPUs which are still waiting for periodic broadcast.
+                */
+               nexttick = tick_get_next_period();
+               tick_broadcast_init_next_event(tmpmask, nexttick);
 
-                       clockevents_switch_state(bc, CLOCK_EVT_STATE_ONESHOT);
-                       tick_broadcast_init_next_event(tmpmask, nextevt);
-                       tick_broadcast_set_event(bc, cpu, nextevt);
-               } else
-                       bc->next_event = KTIME_MAX;
-       } else {
                /*
-                * The first cpu which switches to oneshot mode sets
-                * the bit for all other cpus which are in the general
-                * (periodic) broadcast mask. So the bit is set and
-                * would prevent the first broadcast enter after this
-                * to program the bc device.
+                * If the underlying broadcast clock event device is
+                * already in oneshot state, then there is nothing to do.
+                * The device was already armed for the next tick
+                * in tick_handle_broadcast_periodic()
                 */
-               tick_broadcast_clear_oneshot(cpu);
+               if (clockevent_state_oneshot(bc))
+                       return;
        }
+
+       /*
+        * When switching from periodic to oneshot mode arm the broadcast
+        * device for the next tick.
+        *
+        * If the broadcast device has been replaced in oneshot mode and
+        * the oneshot broadcast mask is not empty, then arm it to expire
+        * immediately in order to reevaluate the next expiring timer.
+        * @nexttick is 0 and therefore in the past which will cause the
+        * clockevent code to force an event.
+        *
+        * For both cases the programming can be avoided when the oneshot
+        * broadcast mask is empty.
+        *
+        * tick_broadcast_set_event() implicitly switches the broadcast
+        * device to oneshot state.
+        */
+       if (!cpumask_empty(tick_broadcast_oneshot_mask))
+               tick_broadcast_set_event(bc, cpu, nexttick);
 }
 
 /*
@@ -1070,14 +1124,16 @@ static void tick_broadcast_setup_oneshot(struct clock_event_device *bc)
 void tick_broadcast_switch_to_oneshot(void)
 {
        struct clock_event_device *bc;
+       enum tick_device_mode oldmode;
        unsigned long flags;
 
        raw_spin_lock_irqsave(&tick_broadcast_lock, flags);
 
+       oldmode = tick_broadcast_device.mode;
        tick_broadcast_device.mode = TICKDEV_MODE_ONESHOT;
        bc = tick_broadcast_device.evtdev;
        if (bc)
-               tick_broadcast_setup_oneshot(bc);
+               tick_broadcast_setup_oneshot(bc, oldmode == TICKDEV_MODE_PERIODIC);
 
        raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags);
 }
index 9abb390..18d3684 100644 (file)
 struct fprobe_rethook_node {
        struct rethook_node node;
        unsigned long entry_ip;
+       unsigned long entry_parent_ip;
        char data[];
 };
 
-static void fprobe_handler(unsigned long ip, unsigned long parent_ip,
-                          struct ftrace_ops *ops, struct ftrace_regs *fregs)
+static inline void __fprobe_handler(unsigned long ip, unsigned long parent_ip,
+                       struct ftrace_ops *ops, struct ftrace_regs *fregs)
 {
        struct fprobe_rethook_node *fpr;
        struct rethook_node *rh = NULL;
        struct fprobe *fp;
        void *entry_data = NULL;
-       int bit, ret;
+       int ret = 0;
 
        fp = container_of(ops, struct fprobe, ops);
-       if (fprobe_disabled(fp))
-               return;
-
-       bit = ftrace_test_recursion_trylock(ip, parent_ip);
-       if (bit < 0) {
-               fp->nmissed++;
-               return;
-       }
 
        if (fp->exit_handler) {
                rh = rethook_try_get(fp->rethook);
                if (!rh) {
                        fp->nmissed++;
-                       goto out;
+                       return;
                }
                fpr = container_of(rh, struct fprobe_rethook_node, node);
                fpr->entry_ip = ip;
+               fpr->entry_parent_ip = parent_ip;
                if (fp->entry_data_size)
                        entry_data = fpr->data;
        }
@@ -61,23 +55,60 @@ static void fprobe_handler(unsigned long ip, unsigned long parent_ip,
                else
                        rethook_hook(rh, ftrace_get_regs(fregs), true);
        }
-out:
+}
+
+static void fprobe_handler(unsigned long ip, unsigned long parent_ip,
+               struct ftrace_ops *ops, struct ftrace_regs *fregs)
+{
+       struct fprobe *fp;
+       int bit;
+
+       fp = container_of(ops, struct fprobe, ops);
+       if (fprobe_disabled(fp))
+               return;
+
+       /* recursion detection has to go before any traceable function and
+        * all functions before this point should be marked as notrace
+        */
+       bit = ftrace_test_recursion_trylock(ip, parent_ip);
+       if (bit < 0) {
+               fp->nmissed++;
+               return;
+       }
+       __fprobe_handler(ip, parent_ip, ops, fregs);
        ftrace_test_recursion_unlock(bit);
+
 }
 NOKPROBE_SYMBOL(fprobe_handler);
 
 static void fprobe_kprobe_handler(unsigned long ip, unsigned long parent_ip,
                                  struct ftrace_ops *ops, struct ftrace_regs *fregs)
 {
-       struct fprobe *fp = container_of(ops, struct fprobe, ops);
+       struct fprobe *fp;
+       int bit;
+
+       fp = container_of(ops, struct fprobe, ops);
+       if (fprobe_disabled(fp))
+               return;
+
+       /* recursion detection has to go before any traceable function and
+        * all functions called before this point should be marked as notrace
+        */
+       bit = ftrace_test_recursion_trylock(ip, parent_ip);
+       if (bit < 0) {
+               fp->nmissed++;
+               return;
+       }
 
        if (unlikely(kprobe_running())) {
                fp->nmissed++;
                return;
        }
+
        kprobe_busy_begin();
-       fprobe_handler(ip, parent_ip, ops, fregs);
+       __fprobe_handler(ip, parent_ip, ops, fregs);
        kprobe_busy_end();
+       ftrace_test_recursion_unlock(bit);
 }
 
 static void fprobe_exit_handler(struct rethook_node *rh, void *data,
@@ -85,14 +116,26 @@ static void fprobe_exit_handler(struct rethook_node *rh, void *data,
 {
        struct fprobe *fp = (struct fprobe *)data;
        struct fprobe_rethook_node *fpr;
+       int bit;
 
        if (!fp || fprobe_disabled(fp))
                return;
 
        fpr = container_of(rh, struct fprobe_rethook_node, node);
 
+       /*
+        * we need to assure no calls to traceable functions in-between the
+        * end of fprobe_handler and the beginning of fprobe_exit_handler.
+        */
+       bit = ftrace_test_recursion_trylock(fpr->entry_ip, fpr->entry_parent_ip);
+       if (bit < 0) {
+               fp->nmissed++;
+               return;
+       }
+
        fp->exit_handler(fp, fpr->entry_ip, regs,
                         fp->entry_data_size ? (void *)fpr->data : NULL);
+       ftrace_test_recursion_unlock(bit);
 }
 NOKPROBE_SYMBOL(fprobe_exit_handler);
 
index 32c3dfd..60f6cb2 100644 (file)
@@ -288,7 +288,7 @@ unsigned long rethook_trampoline_handler(struct pt_regs *regs,
         * These loops must be protected from rethook_free_rcu() because those
         * are accessing 'rhn->rethook'.
         */
-       preempt_disable();
+       preempt_disable_notrace();
 
        /*
         * Run the handler on the shadow stack. Do not unlink the list here because
@@ -321,7 +321,7 @@ unsigned long rethook_trampoline_handler(struct pt_regs *regs,
                first = first->next;
                rethook_recycle(rhn);
        }
-       preempt_enable();
+       preempt_enable_notrace();
 
        return correct_ret_addr;
 }
index 38045d6..e89aaf0 100644 (file)
@@ -54,7 +54,7 @@ void dim_park_tired(struct dim *dim)
 }
 EXPORT_SYMBOL(dim_park_tired);
 
-void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
+bool dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
                    struct dim_stats *curr_stats)
 {
        /* u32 holds up to 71 minutes, should be enough */
@@ -66,7 +66,7 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
                             start->comp_ctr);
 
        if (!delta_us)
-               return;
+               return false;
 
        curr_stats->ppms = DIV_ROUND_UP(npkts * USEC_PER_MSEC, delta_us);
        curr_stats->bpms = DIV_ROUND_UP(nbytes * USEC_PER_MSEC, delta_us);
@@ -79,5 +79,6 @@ void dim_calc_stats(struct dim_sample *start, struct dim_sample *end,
        else
                curr_stats->cpe_ratio = 0;
 
+       return true;
 }
 EXPORT_SYMBOL(dim_calc_stats);
index 53f6b9c..4e32f7a 100644 (file)
@@ -227,7 +227,8 @@ void net_dim(struct dim *dim, struct dim_sample end_sample)
                                  dim->start_sample.event_ctr);
                if (nevents < DIM_NEVENTS)
                        break;
-               dim_calc_stats(&dim->start_sample, &end_sample, &curr_stats);
+               if (!dim_calc_stats(&dim->start_sample, &end_sample, &curr_stats))
+                       break;
                if (net_dim_decision(&curr_stats, dim)) {
                        dim->state = DIM_APPLY_NEW_PROFILE;
                        schedule_work(&dim->work);
index 15462d5..88f7794 100644 (file)
@@ -88,7 +88,8 @@ void rdma_dim(struct dim *dim, u64 completions)
                nevents = curr_sample->event_ctr - dim->start_sample.event_ctr;
                if (nevents < DIM_NEVENTS)
                        break;
-               dim_calc_stats(&dim->start_sample, curr_sample, &curr_stats);
+               if (!dim_calc_stats(&dim->start_sample, curr_sample, &curr_stats))
+                       break;
                if (rdma_dim_decision(&curr_stats, dim)) {
                        dim->state = DIM_APPLY_NEW_PROFILE;
                        schedule_work(&dim->work);
index 110a364..8ebc43d 100644 (file)
@@ -5317,15 +5317,9 @@ int mas_empty_area(struct ma_state *mas, unsigned long min,
 
        mt = mte_node_type(mas->node);
        pivots = ma_pivots(mas_mn(mas), mt);
-       if (offset)
-               mas->min = pivots[offset - 1] + 1;
-
-       if (offset < mt_pivots[mt])
-               mas->max = pivots[offset];
-
-       if (mas->index < mas->min)
-               mas->index = mas->min;
-
+       min = mas_safe_min(mas, pivots, offset);
+       if (mas->index < min)
+               mas->index = min;
        mas->last = mas->index + size - 1;
        return 0;
 }
index 2aafc46..392fb27 100644 (file)
@@ -29,7 +29,7 @@
  * canary of every 8 bytes is the same. 64-bit memory can be filled and checked
  * at a time instead of byte by byte to improve performance.
  */
-#define KFENCE_CANARY_PATTERN_U64 ((u64)0xaaaaaaaaaaaaaaaa ^ (u64)(0x0706050403020100))
+#define KFENCE_CANARY_PATTERN_U64 ((u64)0xaaaaaaaaaaaaaaaa ^ (u64)(le64_to_cpu(0x0706050403020100)))
 
 /* Maximum stack depth for reports. */
 #define KFENCE_STACK_DEPTH 64
index 3f83b10..fe10436 100644 (file)
@@ -237,7 +237,8 @@ int shrinker_debugfs_rename(struct shrinker *shrinker, const char *fmt, ...)
 }
 EXPORT_SYMBOL(shrinker_debugfs_rename);
 
-struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker)
+struct dentry *shrinker_debugfs_detach(struct shrinker *shrinker,
+                                      int *debugfs_id)
 {
        struct dentry *entry = shrinker->debugfs_entry;
 
@@ -246,14 +247,18 @@ struct dentry *shrinker_debugfs_remove(struct shrinker *shrinker)
        kfree_const(shrinker->name);
        shrinker->name = NULL;
 
-       if (entry) {
-               ida_free(&shrinker_debugfs_ida, shrinker->debugfs_id);
-               shrinker->debugfs_entry = NULL;
-       }
+       *debugfs_id = entry ? shrinker->debugfs_id : -1;
+       shrinker->debugfs_entry = NULL;
 
        return entry;
 }
 
+void shrinker_debugfs_remove(struct dentry *debugfs_entry, int debugfs_id)
+{
+       debugfs_remove_recursive(debugfs_entry);
+       ida_free(&shrinker_debugfs_ida, debugfs_id);
+}
+
 static int __init shrinker_debugfs_init(void)
 {
        struct shrinker *shrinker;
index d257916..6d0cd28 100644 (file)
@@ -805,6 +805,7 @@ EXPORT_SYMBOL(register_shrinker);
 void unregister_shrinker(struct shrinker *shrinker)
 {
        struct dentry *debugfs_entry;
+       int debugfs_id;
 
        if (!(shrinker->flags & SHRINKER_REGISTERED))
                return;
@@ -814,13 +815,13 @@ void unregister_shrinker(struct shrinker *shrinker)
        shrinker->flags &= ~SHRINKER_REGISTERED;
        if (shrinker->flags & SHRINKER_MEMCG_AWARE)
                unregister_memcg_shrinker(shrinker);
-       debugfs_entry = shrinker_debugfs_remove(shrinker);
+       debugfs_entry = shrinker_debugfs_detach(shrinker, &debugfs_id);
        mutex_unlock(&shrinker_mutex);
 
        atomic_inc(&shrinker_srcu_generation);
        synchronize_srcu(&shrinker_srcu);
 
-       debugfs_remove_recursive(debugfs_entry);
+       shrinker_debugfs_remove(debugfs_entry, debugfs_id);
 
        kfree(shrinker->nr_deferred);
        shrinker->nr_deferred = NULL;
index 44ddaf5..02f7f41 100644 (file)
@@ -1331,31 +1331,6 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle,
        obj_to_location(obj, &page, &obj_idx);
        zspage = get_zspage(page);
 
-#ifdef CONFIG_ZPOOL
-       /*
-        * Move the zspage to front of pool's LRU.
-        *
-        * Note that this is swap-specific, so by definition there are no ongoing
-        * accesses to the memory while the page is swapped out that would make
-        * it "hot". A new entry is hot, then ages to the tail until it gets either
-        * written back or swaps back in.
-        *
-        * Furthermore, map is also called during writeback. We must not put an
-        * isolated page on the LRU mid-reclaim.
-        *
-        * As a result, only update the LRU when the page is mapped for write
-        * when it's first instantiated.
-        *
-        * This is a deviation from the other backends, which perform this update
-        * in the allocation function (zbud_alloc, z3fold_alloc).
-        */
-       if (mm == ZS_MM_WO) {
-               if (!list_empty(&zspage->lru))
-                       list_del(&zspage->lru);
-               list_add(&zspage->lru, &pool->lru);
-       }
-#endif
-
        /*
         * migration cannot move any zpages in this zspage. Here, pool->lock
         * is too heavy since callers would take some time until they calls
@@ -1525,9 +1500,8 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
                fix_fullness_group(class, zspage);
                record_obj(handle, obj);
                class_stat_inc(class, ZS_OBJS_INUSE, 1);
-               spin_unlock(&pool->lock);
 
-               return handle;
+               goto out;
        }
 
        spin_unlock(&pool->lock);
@@ -1550,6 +1524,14 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp)
 
        /* We completely set up zspage so mark them as movable */
        SetZsPageMovable(pool, zspage);
+out:
+#ifdef CONFIG_ZPOOL
+       /* Add/move zspage to beginning of LRU */
+       if (!list_empty(&zspage->lru))
+               list_del(&zspage->lru);
+       list_add(&zspage->lru, &pool->lru);
+#endif
+
        spin_unlock(&pool->lock);
 
        return handle;
index e1e621d..59da2a4 100644 (file)
@@ -1020,6 +1020,22 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle)
                goto fail;
 
        case ZSWAP_SWAPCACHE_NEW: /* page is locked */
+               /*
+                * Having a local reference to the zswap entry doesn't exclude
+                * swapping from invalidating and recycling the swap slot. Once
+                * the swapcache is secured against concurrent swapping to and
+                * from the slot, recheck that the entry is still current before
+                * writing.
+                */
+               spin_lock(&tree->lock);
+               if (zswap_rb_search(&tree->rbroot, entry->offset) != entry) {
+                       spin_unlock(&tree->lock);
+                       delete_from_swap_cache(page_folio(page));
+                       ret = -ENOMEM;
+                       goto fail;
+               }
+               spin_unlock(&tree->lock);
+
                /* decompress */
                acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx);
                dlen = PAGE_SIZE;
index 870e493..b90781b 100644 (file)
@@ -109,8 +109,8 @@ static netdev_tx_t vlan_dev_hard_start_xmit(struct sk_buff *skb,
         * NOTE: THIS ASSUMES DIX ETHERNET, SPECIFICALLY NOT SUPPORTING
         * OTHER THINGS LIKE FDDI/TokenRing/802.3 SNAPs...
         */
-       if (veth->h_vlan_proto != vlan->vlan_proto ||
-           vlan->flags & VLAN_FLAG_REORDER_HDR) {
+       if (vlan->flags & VLAN_FLAG_REORDER_HDR ||
+           veth->h_vlan_proto != vlan->vlan_proto) {
                u16 vlan_tci;
                vlan_tci = vlan->vlan_id;
                vlan_tci |= vlan_dev_get_egress_qos_mask(dev, skb->priority);
index 2b2d33e..995d29e 100644 (file)
@@ -400,6 +400,7 @@ done:
        return error;
 }
 
+#ifdef CONFIG_PROC_FS
 void *atm_dev_seq_start(struct seq_file *seq, loff_t *pos)
 {
        mutex_lock(&atm_dev_mutex);
@@ -415,3 +416,4 @@ void *atm_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos)
 {
        return seq_list_next(v, &atm_devs, pos);
 }
+#endif
index 5774470..84d6dd5 100644 (file)
@@ -42,7 +42,7 @@ int br_dev_queue_push_xmit(struct net *net, struct sock *sk, struct sk_buff *skb
            eth_type_vlan(skb->protocol)) {
                int depth;
 
-               if (!__vlan_get_protocol(skb, skb->protocol, &depth))
+               if (!vlan_get_protocol_and_depth(skb, skb->protocol, &depth))
                        goto drop;
 
                skb_set_network_header(skb, depth);
index 2b05328..efb0960 100644 (file)
@@ -27,6 +27,10 @@ int br_process_vlan_tunnel_info(const struct net_bridge *br,
 int br_get_vlan_tunnel_info_size(struct net_bridge_vlan_group *vg);
 int br_fill_vlan_tunnel_info(struct sk_buff *skb,
                             struct net_bridge_vlan_group *vg);
+bool vlan_tunid_inrange(const struct net_bridge_vlan *v_curr,
+                       const struct net_bridge_vlan *v_last);
+int br_vlan_tunnel_info(const struct net_bridge_port *p, int cmd,
+                       u16 vid, u32 tun_id, bool *changed);
 
 #ifdef CONFIG_BRIDGE_VLAN_FILTERING
 /* br_vlan_tunnel.c */
@@ -43,10 +47,6 @@ void br_handle_ingress_vlan_tunnel(struct sk_buff *skb,
                                   struct net_bridge_vlan_group *vg);
 int br_handle_egress_vlan_tunnel(struct sk_buff *skb,
                                 struct net_bridge_vlan *vlan);
-bool vlan_tunid_inrange(const struct net_bridge_vlan *v_curr,
-                       const struct net_bridge_vlan *v_last);
-int br_vlan_tunnel_info(const struct net_bridge_port *p, int cmd,
-                       u16 vid, u32 tun_id, bool *changed);
 #else
 static inline int vlan_tunnel_init(struct net_bridge_vlan_group *vg)
 {
index a750259..84f9aba 100644 (file)
@@ -1139,7 +1139,7 @@ static int isotp_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
        struct isotp_sock *so = isotp_sk(sk);
        int ret = 0;
 
-       if (flags & ~(MSG_DONTWAIT | MSG_TRUNC | MSG_PEEK))
+       if (flags & ~(MSG_DONTWAIT | MSG_TRUNC | MSG_PEEK | MSG_CMSG_COMPAT))
                return -EINVAL;
 
        if (!so->bound)
index 7e90f9e..1790469 100644 (file)
@@ -798,7 +798,7 @@ static int j1939_sk_recvmsg(struct socket *sock, struct msghdr *msg,
        struct j1939_sk_buff_cb *skcb;
        int ret = 0;
 
-       if (flags & ~(MSG_DONTWAIT | MSG_ERRQUEUE))
+       if (flags & ~(MSG_DONTWAIT | MSG_ERRQUEUE | MSG_CMSG_COMPAT))
                return -EINVAL;
 
        if (flags & MSG_ERRQUEUE)
index 5662dff..176eb58 100644 (file)
@@ -807,18 +807,21 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
 {
        struct sock *sk = sock->sk;
        __poll_t mask;
+       u8 shutdown;
 
        sock_poll_wait(file, sock, wait);
        mask = 0;
 
        /* exceptional events? */
-       if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
+       if (READ_ONCE(sk->sk_err) ||
+           !skb_queue_empty_lockless(&sk->sk_error_queue))
                mask |= EPOLLERR |
                        (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
 
-       if (sk->sk_shutdown & RCV_SHUTDOWN)
+       shutdown = READ_ONCE(sk->sk_shutdown);
+       if (shutdown & RCV_SHUTDOWN)
                mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
-       if (sk->sk_shutdown == SHUTDOWN_MASK)
+       if (shutdown == SHUTDOWN_MASK)
                mask |= EPOLLHUP;
 
        /* readable? */
@@ -827,10 +830,12 @@ __poll_t datagram_poll(struct file *file, struct socket *sock,
 
        /* Connection-based need to check for termination and startup */
        if (connection_based(sk)) {
-               if (sk->sk_state == TCP_CLOSE)
+               int state = READ_ONCE(sk->sk_state);
+
+               if (state == TCP_CLOSE)
                        mask |= EPOLLHUP;
                /* connection hasn't started yet? */
-               if (sk->sk_state == TCP_SYN_SENT)
+               if (state == TCP_SYN_SENT)
                        return mask;
        }
 
index 735096d..b3c13e0 100644 (file)
@@ -3335,7 +3335,7 @@ __be16 skb_network_protocol(struct sk_buff *skb, int *depth)
                type = eth->h_proto;
        }
 
-       return __vlan_get_protocol(skb, type, depth);
+       return vlan_get_protocol_and_depth(skb, type, depth);
 }
 
 /* openvswitch calls this on rx path, so we need a different check.
index 26a5860..515ec5c 100644 (file)
@@ -5298,7 +5298,7 @@ bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off)
        u32 csum_end = (u32)start + (u32)off + sizeof(__sum16);
        u32 csum_start = skb_headroom(skb) + (u32)start;
 
-       if (unlikely(csum_start > U16_MAX || csum_end > skb_headlen(skb))) {
+       if (unlikely(csum_start >= U16_MAX || csum_end > skb_headlen(skb))) {
                net_warn_ratelimited("bad partial csum: csum=%u/%u headroom=%u headlen=%u\n",
                                     start, off, skb_headroom(skb), skb_headlen(skb));
                return false;
@@ -5306,7 +5306,7 @@ bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off)
        skb->ip_summed = CHECKSUM_PARTIAL;
        skb->csum_start = csum_start;
        skb->csum_offset = off;
-       skb_set_transport_header(skb, start);
+       skb->transport_header = csum_start;
        return true;
 }
 EXPORT_SYMBOL_GPL(skb_partial_csum_set);
index 434446a..f5c4e47 100644 (file)
@@ -73,8 +73,8 @@ int sk_stream_wait_connect(struct sock *sk, long *timeo_p)
                add_wait_queue(sk_sleep(sk), &wait);
                sk->sk_write_pending++;
                done = sk_wait_event(sk, timeo_p,
-                                    !sk->sk_err &&
-                                    !((1 << sk->sk_state) &
+                                    !READ_ONCE(sk->sk_err) &&
+                                    !((1 << READ_ONCE(sk->sk_state)) &
                                       ~(TCPF_ESTABLISHED | TCPF_CLOSE_WAIT)), &wait);
                remove_wait_queue(sk_sleep(sk), &wait);
                sk->sk_write_pending--;
@@ -87,9 +87,9 @@ EXPORT_SYMBOL(sk_stream_wait_connect);
  * sk_stream_closing - Return 1 if we still have things to send in our buffers.
  * @sk: socket to verify
  */
-static inline int sk_stream_closing(struct sock *sk)
+static int sk_stream_closing(const struct sock *sk)
 {
-       return (1 << sk->sk_state) &
+       return (1 << READ_ONCE(sk->sk_state)) &
               (TCPF_FIN_WAIT1 | TCPF_CLOSING | TCPF_LAST_ACK);
 }
 
@@ -142,8 +142,8 @@ int sk_stream_wait_memory(struct sock *sk, long *timeo_p)
 
                set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                sk->sk_write_pending++;
-               sk_wait_event(sk, &current_timeo, sk->sk_err ||
-                                                 (sk->sk_shutdown & SEND_SHUTDOWN) ||
+               sk_wait_event(sk, &current_timeo, READ_ONCE(sk->sk_err) ||
+                                                 (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN) ||
                                                  (sk_stream_memory_free(sk) &&
                                                  !vm_wait), &wait);
                sk->sk_write_pending--;
index 777b091..c23ebab 100644 (file)
@@ -204,11 +204,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
        if (ret < 0)
                goto err_xa_alloc;
 
-       devlink->netdevice_nb.notifier_call = devlink_port_netdevice_event;
-       ret = register_netdevice_notifier(&devlink->netdevice_nb);
-       if (ret)
-               goto err_register_netdevice_notifier;
-
        devlink->dev = dev;
        devlink->ops = ops;
        xa_init_flags(&devlink->ports, XA_FLAGS_ALLOC);
@@ -233,8 +228,6 @@ struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
 
        return devlink;
 
-err_register_netdevice_notifier:
-       xa_erase(&devlinks, devlink->index);
 err_xa_alloc:
        kfree(devlink);
        return NULL;
@@ -266,8 +259,6 @@ void devlink_free(struct devlink *devlink)
        xa_destroy(&devlink->params);
        xa_destroy(&devlink->ports);
 
-       WARN_ON_ONCE(unregister_netdevice_notifier(&devlink->netdevice_nb));
-
        xa_erase(&devlinks, devlink->index);
 
        devlink_put(devlink);
@@ -303,6 +294,10 @@ static struct pernet_operations devlink_pernet_ops __net_initdata = {
        .pre_exit = devlink_pernet_pre_exit,
 };
 
+static struct notifier_block devlink_port_netdevice_nb = {
+       .notifier_call = devlink_port_netdevice_event,
+};
+
 static int __init devlink_init(void)
 {
        int err;
@@ -311,6 +306,9 @@ static int __init devlink_init(void)
        if (err)
                goto out;
        err = register_pernet_subsys(&devlink_pernet_ops);
+       if (err)
+               goto out;
+       err = register_netdevice_notifier(&devlink_port_netdevice_nb);
 
 out:
        WARN_ON(err);
index e133f42..62921b2 100644 (file)
@@ -50,7 +50,6 @@ struct devlink {
        u8 reload_failed:1;
        refcount_t refcount;
        struct rcu_work rwork;
-       struct notifier_block netdevice_nb;
        char priv[] __aligned(NETDEV_ALIGN);
 };
 
index dffca2f..cd02549 100644 (file)
@@ -7073,10 +7073,9 @@ int devlink_port_netdevice_event(struct notifier_block *nb,
        struct devlink_port *devlink_port = netdev->devlink_port;
        struct devlink *devlink;
 
-       devlink = container_of(nb, struct devlink, netdevice_nb);
-
-       if (!devlink_port || devlink_port->devlink != devlink)
+       if (!devlink_port)
                return NOTIFY_OK;
+       devlink = devlink_port->devlink;
 
        switch (event) {
        case NETDEV_POST_INIT:
index 940062e..c4aab3a 100644 (file)
@@ -894,7 +894,7 @@ int inet_shutdown(struct socket *sock, int how)
                   EPOLLHUP, even on eg. unconnected UDP sockets -- RR */
                fallthrough;
        default:
-               sk->sk_shutdown |= how;
+               WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | how);
                if (sk->sk_prot->shutdown)
                        sk->sk_prot->shutdown(sk, how);
                break;
index 20db115..4d6392c 100644 (file)
@@ -498,6 +498,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
        __poll_t mask;
        struct sock *sk = sock->sk;
        const struct tcp_sock *tp = tcp_sk(sk);
+       u8 shutdown;
        int state;
 
        sock_poll_wait(file, sock, wait);
@@ -540,9 +541,10 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
         * NOTE. Check for TCP_CLOSE is added. The goal is to prevent
         * blocking on fresh not-connected or disconnected socket. --ANK
         */
-       if (sk->sk_shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
+       shutdown = READ_ONCE(sk->sk_shutdown);
+       if (shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
                mask |= EPOLLHUP;
-       if (sk->sk_shutdown & RCV_SHUTDOWN)
+       if (shutdown & RCV_SHUTDOWN)
                mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
 
        /* Connected or passive Fast Open socket? */
@@ -559,7 +561,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
                if (tcp_stream_is_readable(sk, target))
                        mask |= EPOLLIN | EPOLLRDNORM;
 
-               if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
+               if (!(shutdown & SEND_SHUTDOWN)) {
                        if (__sk_stream_is_writeable(sk, 1)) {
                                mask |= EPOLLOUT | EPOLLWRNORM;
                        } else {  /* send SIGIO later */
@@ -2867,7 +2869,7 @@ void __tcp_close(struct sock *sk, long timeout)
        int data_was_unread = 0;
        int state;
 
-       sk->sk_shutdown = SHUTDOWN_MASK;
+       WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
 
        if (sk->sk_state == TCP_LISTEN) {
                tcp_set_state(sk, TCP_CLOSE);
@@ -3119,7 +3121,7 @@ int tcp_disconnect(struct sock *sk, int flags)
 
        inet_bhash2_reset_saddr(sk);
 
-       sk->sk_shutdown = 0;
+       WRITE_ONCE(sk->sk_shutdown, 0);
        sock_reset_flag(sk, SOCK_DONE);
        tp->srtt_us = 0;
        tp->mdev_us = jiffies_to_usecs(TCP_TIMEOUT_INIT);
@@ -4649,7 +4651,7 @@ void tcp_done(struct sock *sk)
        if (req)
                reqsk_fastopen_remove(sk, req, false);
 
-       sk->sk_shutdown = SHUTDOWN_MASK;
+       WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
 
        if (!sock_flag(sk, SOCK_DEAD))
                sk->sk_state_change(sk);
index ebf9175..2e95474 100644 (file)
@@ -168,7 +168,7 @@ static int tcp_msg_wait_data(struct sock *sk, struct sk_psock *psock,
        sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
        ret = sk_wait_event(sk, &timeo,
                            !list_empty(&psock->ingress_msg) ||
-                           !skb_queue_empty(&sk->sk_receive_queue), &wait);
+                           !skb_queue_empty_lockless(&sk->sk_receive_queue), &wait);
        sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
        remove_wait_queue(sk_sleep(sk), &wait);
        return ret;
index a057330..61b6710 100644 (file)
@@ -4362,7 +4362,7 @@ void tcp_fin(struct sock *sk)
 
        inet_csk_schedule_ack(sk);
 
-       sk->sk_shutdown |= RCV_SHUTDOWN;
+       WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN);
        sock_set_flag(sk, SOCK_DONE);
 
        switch (sk->sk_state) {
@@ -6599,7 +6599,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
                        break;
 
                tcp_set_state(sk, TCP_FIN_WAIT2);
-               sk->sk_shutdown |= SEND_SHUTDOWN;
+               WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | SEND_SHUTDOWN);
 
                sk_dst_confirm(sk);
 
index 39bda2b..06d2573 100644 (file)
@@ -829,6 +829,9 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
                                   inet_twsk(sk)->tw_priority : sk->sk_priority;
                transmit_time = tcp_transmit_time(sk);
                xfrm_sk_clone_policy(ctl_sk, sk);
+       } else {
+               ctl_sk->sk_mark = 0;
+               ctl_sk->sk_priority = 0;
        }
        ip_send_unicast_reply(ctl_sk,
                              skb, &TCP_SKB_CB(skb)->header.h4.opt,
@@ -836,7 +839,6 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
                              &arg, arg.iov[0].iov_len,
                              transmit_time);
 
-       ctl_sk->sk_mark = 0;
        xfrm_sk_free_policy(ctl_sk);
        sock_net_set(ctl_sk, &init_net);
        __TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
@@ -935,7 +937,6 @@ static void tcp_v4_send_ack(const struct sock *sk,
                              &arg, arg.iov[0].iov_len,
                              transmit_time);
 
-       ctl_sk->sk_mark = 0;
        sock_net_set(ctl_sk, &init_net);
        __TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
        local_bh_enable();
index 2438da5..bac768d 100644 (file)
@@ -2491,7 +2491,7 @@ static int ipv6_route_native_seq_show(struct seq_file *seq, void *v)
        const struct net_device *dev;
 
        if (rt->nh)
-               fib6_nh = nexthop_fib6_nh_bh(rt->nh);
+               fib6_nh = nexthop_fib6_nh(rt->nh);
 
        seq_printf(seq, "%pi6 %02x ", &rt->fib6_dst.addr, rt->fib6_dst.plen);
 
@@ -2556,14 +2556,14 @@ static struct fib6_table *ipv6_route_seq_next_table(struct fib6_table *tbl,
 
        if (tbl) {
                h = (tbl->tb6_id & (FIB6_TABLE_HASHSZ - 1)) + 1;
-               node = rcu_dereference_bh(hlist_next_rcu(&tbl->tb6_hlist));
+               node = rcu_dereference(hlist_next_rcu(&tbl->tb6_hlist));
        } else {
                h = 0;
                node = NULL;
        }
 
        while (!node && h < FIB6_TABLE_HASHSZ) {
-               node = rcu_dereference_bh(
+               node = rcu_dereference(
                        hlist_first_rcu(&net->ipv6.fib_table_hash[h++]));
        }
        return hlist_entry_safe(node, struct fib6_table, tb6_hlist);
@@ -2593,7 +2593,7 @@ static void *ipv6_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
        if (!v)
                goto iter_table;
 
-       n = rcu_dereference_bh(((struct fib6_info *)v)->fib6_next);
+       n = rcu_dereference(((struct fib6_info *)v)->fib6_next);
        if (n)
                return n;
 
@@ -2619,12 +2619,12 @@ iter_table:
 }
 
 static void *ipv6_route_seq_start(struct seq_file *seq, loff_t *pos)
-       __acquires(RCU_BH)
+       __acquires(RCU)
 {
        struct net *net = seq_file_net(seq);
        struct ipv6_route_iter *iter = seq->private;
 
-       rcu_read_lock_bh();
+       rcu_read_lock();
        iter->tbl = ipv6_route_seq_next_table(NULL, net);
        iter->skip = *pos;
 
@@ -2645,7 +2645,7 @@ static bool ipv6_route_iter_active(struct ipv6_route_iter *iter)
 }
 
 static void ipv6_route_native_seq_stop(struct seq_file *seq, void *v)
-       __releases(RCU_BH)
+       __releases(RCU)
 {
        struct net *net = seq_file_net(seq);
        struct ipv6_route_iter *iter = seq->private;
@@ -2653,7 +2653,7 @@ static void ipv6_route_native_seq_stop(struct seq_file *seq, void *v)
        if (ipv6_route_iter_active(iter))
                fib6_walker_unlink(net, &iter->w);
 
-       rcu_read_unlock_bh();
+       rcu_read_unlock();
 }
 
 #if IS_BUILTIN(CONFIG_IPV6) && defined(CONFIG_BPF_SYSCALL)
index a4ecfc9..da80974 100644 (file)
@@ -1015,12 +1015,14 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
                                            ntohl(tun_id),
                                            ntohl(md->u.index), truncate,
                                            false);
+                       proto = htons(ETH_P_ERSPAN);
                } else if (md->version == 2) {
                        erspan_build_header_v2(skb,
                                               ntohl(tun_id),
                                               md->u.md2.dir,
                                               get_hwid(&md->u.md2),
                                               truncate, false);
+                       proto = htons(ETH_P_ERSPAN2);
                } else {
                        goto tx_err;
                }
@@ -1043,24 +1045,25 @@ static netdev_tx_t ip6erspan_tunnel_xmit(struct sk_buff *skb,
                        break;
                }
 
-               if (t->parms.erspan_ver == 1)
+               if (t->parms.erspan_ver == 1) {
                        erspan_build_header(skb, ntohl(t->parms.o_key),
                                            t->parms.index,
                                            truncate, false);
-               else if (t->parms.erspan_ver == 2)
+                       proto = htons(ETH_P_ERSPAN);
+               } else if (t->parms.erspan_ver == 2) {
                        erspan_build_header_v2(skb, ntohl(t->parms.o_key),
                                               t->parms.dir,
                                               t->parms.hwid,
                                               truncate, false);
-               else
+                       proto = htons(ETH_P_ERSPAN2);
+               } else {
                        goto tx_err;
+               }
 
                fl6.daddr = t->parms.raddr;
        }
 
        /* Push GRE header. */
-       proto = (t->parms.erspan_ver == 1) ? htons(ETH_P_ERSPAN)
-                                          : htons(ETH_P_ERSPAN2);
        gre_build_header(skb, 8, TUNNEL_SEQ, proto, 0, htonl(atomic_fetch_inc(&t->o_seqno)));
 
        /* TooBig packet may have updated dst->dev's mtu */
index a815f5a..31ab12f 100644 (file)
@@ -1940,7 +1940,8 @@ static u32 gen_reqid(struct net *net)
 }
 
 static int
-parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
+parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_policy *pol,
+                  struct sadb_x_ipsecrequest *rq)
 {
        struct net *net = xp_net(xp);
        struct xfrm_tmpl *t = xp->xfrm_vec + xp->xfrm_nr;
@@ -1958,9 +1959,12 @@ parse_ipsecrequest(struct xfrm_policy *xp, struct sadb_x_ipsecrequest *rq)
        if ((mode = pfkey_mode_to_xfrm(rq->sadb_x_ipsecrequest_mode)) < 0)
                return -EINVAL;
        t->mode = mode;
-       if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE)
+       if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_USE) {
+               if ((mode == XFRM_MODE_TUNNEL || mode == XFRM_MODE_BEET) &&
+                   pol->sadb_x_policy_dir == IPSEC_DIR_OUTBOUND)
+                       return -EINVAL;
                t->optional = 1;
-       else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
+       else if (rq->sadb_x_ipsecrequest_level == IPSEC_LEVEL_UNIQUE) {
                t->reqid = rq->sadb_x_ipsecrequest_reqid;
                if (t->reqid > IPSEC_MANUAL_REQID_MAX)
                        t->reqid = 0;
@@ -2002,7 +2006,7 @@ parse_ipsecrequests(struct xfrm_policy *xp, struct sadb_x_policy *pol)
                    rq->sadb_x_ipsecrequest_len < sizeof(*rq))
                        return -EINVAL;
 
-               if ((err = parse_ipsecrequest(xp, rq)) < 0)
+               if ((err = parse_ipsecrequest(xp, pol, rq)) < 0)
                        return err;
                len -= rq->sadb_x_ipsecrequest_len;
                rq = (void*)((u8*)rq + rq->sadb_x_ipsecrequest_len);
index da7fe94..9ffbc66 100644 (file)
@@ -583,7 +583,8 @@ static int llc_ui_wait_for_disc(struct sock *sk, long timeout)
 
        add_wait_queue(sk_sleep(sk), &wait);
        while (1) {
-               if (sk_wait_event(sk, &timeout, sk->sk_state == TCP_CLOSE, &wait))
+               if (sk_wait_event(sk, &timeout,
+                                 READ_ONCE(sk->sk_state) == TCP_CLOSE, &wait))
                        break;
                rc = -ERESTARTSYS;
                if (signal_pending(current))
@@ -603,7 +604,8 @@ static bool llc_ui_wait_for_conn(struct sock *sk, long timeout)
 
        add_wait_queue(sk_sleep(sk), &wait);
        while (1) {
-               if (sk_wait_event(sk, &timeout, sk->sk_state != TCP_SYN_SENT, &wait))
+               if (sk_wait_event(sk, &timeout,
+                                 READ_ONCE(sk->sk_state) != TCP_SYN_SENT, &wait))
                        break;
                if (signal_pending(current) || !timeout)
                        break;
@@ -622,7 +624,7 @@ static int llc_ui_wait_for_busy_core(struct sock *sk, long timeout)
        while (1) {
                rc = 0;
                if (sk_wait_event(sk, &timeout,
-                                 (sk->sk_shutdown & RCV_SHUTDOWN) ||
+                                 (READ_ONCE(sk->sk_shutdown) & RCV_SHUTDOWN) ||
                                  (!llc_data_accept_state(llc->state) &&
                                   !llc->remote_busy_flag &&
                                   !llc->p_flag), &wait))
index 7317e4a..86b2036 100644 (file)
@@ -1578,9 +1578,10 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev,
                sdata_dereference(link->u.ap.unsol_bcast_probe_resp,
                                  sdata);
 
-       /* abort any running channel switch */
+       /* abort any running channel switch or color change */
        mutex_lock(&local->mtx);
        link_conf->csa_active = false;
+       link_conf->color_change_active = false;
        if (link->csa_block_tx) {
                ieee80211_wake_vif_queues(local, sdata,
                                          IEEE80211_QUEUE_STOP_REASON_CSA);
@@ -3589,7 +3590,7 @@ void ieee80211_channel_switch_disconnect(struct ieee80211_vif *vif, bool block_t
 EXPORT_SYMBOL(ieee80211_channel_switch_disconnect);
 
 static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
-                                         u32 *changed)
+                                         u64 *changed)
 {
        int err;
 
@@ -3632,7 +3633,7 @@ static int ieee80211_set_after_csa_beacon(struct ieee80211_sub_if_data *sdata,
 static int __ieee80211_csa_finalize(struct ieee80211_sub_if_data *sdata)
 {
        struct ieee80211_local *local = sdata->local;
-       u32 changed = 0;
+       u64 changed = 0;
        int err;
 
        sdata_assert_lock(sdata);
index dbc34fb..77c90ed 100644 (file)
@@ -258,7 +258,8 @@ ieee80211_get_max_required_bw(struct ieee80211_sub_if_data *sdata,
 
 static enum nl80211_chan_width
 ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,
-                                         struct ieee80211_chanctx_conf *conf)
+                                         struct ieee80211_chanctx *ctx,
+                                         struct ieee80211_link_data *rsvd_for)
 {
        enum nl80211_chan_width max_bw = NL80211_CHAN_WIDTH_20_NOHT;
        struct ieee80211_vif *vif = &sdata->vif;
@@ -267,13 +268,14 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,
        rcu_read_lock();
        for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) {
                enum nl80211_chan_width width = NL80211_CHAN_WIDTH_20_NOHT;
-               struct ieee80211_bss_conf *link_conf =
-                       rcu_dereference(sdata->vif.link_conf[link_id]);
+               struct ieee80211_link_data *link =
+                       rcu_dereference(sdata->link[link_id]);
 
-               if (!link_conf)
+               if (!link)
                        continue;
 
-               if (rcu_access_pointer(link_conf->chanctx_conf) != conf)
+               if (link != rsvd_for &&
+                   rcu_access_pointer(link->conf->chanctx_conf) != &ctx->conf)
                        continue;
 
                switch (vif->type) {
@@ -287,7 +289,7 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,
                         * point, so take the width from the chandef, but
                         * account also for TDLS peers
                         */
-                       width = max(link_conf->chandef.width,
+                       width = max(link->conf->chandef.width,
                                    ieee80211_get_max_required_bw(sdata, link_id));
                        break;
                case NL80211_IFTYPE_P2P_DEVICE:
@@ -296,7 +298,7 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,
                case NL80211_IFTYPE_ADHOC:
                case NL80211_IFTYPE_MESH_POINT:
                case NL80211_IFTYPE_OCB:
-                       width = link_conf->chandef.width;
+                       width = link->conf->chandef.width;
                        break;
                case NL80211_IFTYPE_WDS:
                case NL80211_IFTYPE_UNSPECIFIED:
@@ -316,7 +318,8 @@ ieee80211_get_chanctx_vif_max_required_bw(struct ieee80211_sub_if_data *sdata,
 
 static enum nl80211_chan_width
 ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,
-                                     struct ieee80211_chanctx_conf *conf)
+                                     struct ieee80211_chanctx *ctx,
+                                     struct ieee80211_link_data *rsvd_for)
 {
        struct ieee80211_sub_if_data *sdata;
        enum nl80211_chan_width max_bw = NL80211_CHAN_WIDTH_20_NOHT;
@@ -328,7 +331,8 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,
                if (!ieee80211_sdata_running(sdata))
                        continue;
 
-               width = ieee80211_get_chanctx_vif_max_required_bw(sdata, conf);
+               width = ieee80211_get_chanctx_vif_max_required_bw(sdata, ctx,
+                                                                 rsvd_for);
 
                max_bw = max(max_bw, width);
        }
@@ -336,8 +340,8 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,
        /* use the configured bandwidth in case of monitor interface */
        sdata = rcu_dereference(local->monitor_sdata);
        if (sdata &&
-           rcu_access_pointer(sdata->vif.bss_conf.chanctx_conf) == conf)
-               max_bw = max(max_bw, conf->def.width);
+           rcu_access_pointer(sdata->vif.bss_conf.chanctx_conf) == &ctx->conf)
+               max_bw = max(max_bw, ctx->conf.def.width);
 
        rcu_read_unlock();
 
@@ -349,8 +353,10 @@ ieee80211_get_chanctx_max_required_bw(struct ieee80211_local *local,
  * the max of min required widths of all the interfaces bound to this
  * channel context.
  */
-static u32 _ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
-                                            struct ieee80211_chanctx *ctx)
+static u32
+_ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
+                                 struct ieee80211_chanctx *ctx,
+                                 struct ieee80211_link_data *rsvd_for)
 {
        enum nl80211_chan_width max_bw;
        struct cfg80211_chan_def min_def;
@@ -370,7 +376,7 @@ static u32 _ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
                return 0;
        }
 
-       max_bw = ieee80211_get_chanctx_max_required_bw(local, &ctx->conf);
+       max_bw = ieee80211_get_chanctx_max_required_bw(local, ctx, rsvd_for);
 
        /* downgrade chandef up to max_bw */
        min_def = ctx->conf.def;
@@ -448,9 +454,10 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local,
  * channel context.
  */
 void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
-                                     struct ieee80211_chanctx *ctx)
+                                     struct ieee80211_chanctx *ctx,
+                                     struct ieee80211_link_data *rsvd_for)
 {
-       u32 changed = _ieee80211_recalc_chanctx_min_def(local, ctx);
+       u32 changed = _ieee80211_recalc_chanctx_min_def(local, ctx, rsvd_for);
 
        if (!changed)
                return;
@@ -464,10 +471,11 @@ void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
        ieee80211_chan_bw_change(local, ctx, false);
 }
 
-static void ieee80211_change_chanctx(struct ieee80211_local *local,
-                                    struct ieee80211_chanctx *ctx,
-                                    struct ieee80211_chanctx *old_ctx,
-                                    const struct cfg80211_chan_def *chandef)
+static void _ieee80211_change_chanctx(struct ieee80211_local *local,
+                                     struct ieee80211_chanctx *ctx,
+                                     struct ieee80211_chanctx *old_ctx,
+                                     const struct cfg80211_chan_def *chandef,
+                                     struct ieee80211_link_data *rsvd_for)
 {
        u32 changed;
 
@@ -492,7 +500,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,
        ieee80211_chan_bw_change(local, old_ctx, true);
 
        if (cfg80211_chandef_identical(&ctx->conf.def, chandef)) {
-               ieee80211_recalc_chanctx_min_def(local, ctx);
+               ieee80211_recalc_chanctx_min_def(local, ctx, rsvd_for);
                return;
        }
 
@@ -502,7 +510,7 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,
 
        /* check if min chanctx also changed */
        changed = IEEE80211_CHANCTX_CHANGE_WIDTH |
-                 _ieee80211_recalc_chanctx_min_def(local, ctx);
+                 _ieee80211_recalc_chanctx_min_def(local, ctx, rsvd_for);
        drv_change_chanctx(local, ctx, changed);
 
        if (!local->use_chanctx) {
@@ -514,6 +522,14 @@ static void ieee80211_change_chanctx(struct ieee80211_local *local,
        ieee80211_chan_bw_change(local, old_ctx, false);
 }
 
+static void ieee80211_change_chanctx(struct ieee80211_local *local,
+                                    struct ieee80211_chanctx *ctx,
+                                    struct ieee80211_chanctx *old_ctx,
+                                    const struct cfg80211_chan_def *chandef)
+{
+       _ieee80211_change_chanctx(local, ctx, old_ctx, chandef, NULL);
+}
+
 static struct ieee80211_chanctx *
 ieee80211_find_chanctx(struct ieee80211_local *local,
                       const struct cfg80211_chan_def *chandef,
@@ -638,7 +654,7 @@ ieee80211_alloc_chanctx(struct ieee80211_local *local,
        ctx->conf.rx_chains_dynamic = 1;
        ctx->mode = mode;
        ctx->conf.radar_enabled = false;
-       ieee80211_recalc_chanctx_min_def(local, ctx);
+       _ieee80211_recalc_chanctx_min_def(local, ctx, NULL);
 
        return ctx;
 }
@@ -855,6 +871,9 @@ static int ieee80211_assign_link_chanctx(struct ieee80211_link_data *link,
        }
 
        if (new_ctx) {
+               /* recalc considering the link we'll use it for now */
+               ieee80211_recalc_chanctx_min_def(local, new_ctx, link);
+
                ret = drv_assign_vif_chanctx(local, sdata, link->conf, new_ctx);
                if (ret)
                        goto out;
@@ -873,12 +892,12 @@ out:
                ieee80211_recalc_chanctx_chantype(local, curr_ctx);
                ieee80211_recalc_smps_chanctx(local, curr_ctx);
                ieee80211_recalc_radar_chanctx(local, curr_ctx);
-               ieee80211_recalc_chanctx_min_def(local, curr_ctx);
+               ieee80211_recalc_chanctx_min_def(local, curr_ctx, NULL);
        }
 
        if (new_ctx && ieee80211_chanctx_num_assigned(local, new_ctx) > 0) {
                ieee80211_recalc_txpower(sdata, false);
-               ieee80211_recalc_chanctx_min_def(local, new_ctx);
+               ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL);
        }
 
        if (sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
@@ -1270,7 +1289,7 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)
 
        ieee80211_link_update_chandef(link, &link->reserved_chandef);
 
-       ieee80211_change_chanctx(local, new_ctx, old_ctx, chandef);
+       _ieee80211_change_chanctx(local, new_ctx, old_ctx, chandef, link);
 
        vif_chsw[0].vif = &sdata->vif;
        vif_chsw[0].old_ctx = &old_ctx->conf;
@@ -1300,7 +1319,7 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link)
        if (ieee80211_chanctx_refcount(local, old_ctx) == 0)
                ieee80211_free_chanctx(local, old_ctx);
 
-       ieee80211_recalc_chanctx_min_def(local, new_ctx);
+       ieee80211_recalc_chanctx_min_def(local, new_ctx, NULL);
        ieee80211_recalc_smps_chanctx(local, new_ctx);
        ieee80211_recalc_radar_chanctx(local, new_ctx);
 
@@ -1665,7 +1684,7 @@ static int ieee80211_vif_use_reserved_switch(struct ieee80211_local *local)
                ieee80211_recalc_chanctx_chantype(local, ctx);
                ieee80211_recalc_smps_chanctx(local, ctx);
                ieee80211_recalc_radar_chanctx(local, ctx);
-               ieee80211_recalc_chanctx_min_def(local, ctx);
+               ieee80211_recalc_chanctx_min_def(local, ctx, NULL);
 
                list_for_each_entry_safe(link, link_tmp, &ctx->reserved_links,
                                         reserved_chanctx_list) {
index a0a7839..b0372e7 100644 (file)
@@ -2537,7 +2537,8 @@ int ieee80211_chanctx_refcount(struct ieee80211_local *local,
 void ieee80211_recalc_smps_chanctx(struct ieee80211_local *local,
                                   struct ieee80211_chanctx *chanctx);
 void ieee80211_recalc_chanctx_min_def(struct ieee80211_local *local,
-                                     struct ieee80211_chanctx *ctx);
+                                     struct ieee80211_chanctx *ctx,
+                                     struct ieee80211_link_data *rsvd_for);
 bool ieee80211_is_radar_required(struct ieee80211_local *local);
 
 void ieee80211_dfs_cac_timer(unsigned long data);
index de5d69f..db0d013 100644 (file)
@@ -67,7 +67,7 @@
                        __entry->min_freq_offset = (c)->chan ? (c)->chan->freq_offset : 0;      \
                        __entry->min_chan_width = (c)->width;                           \
                        __entry->min_center_freq1 = (c)->center_freq1;                  \
-                       __entry->freq1_offset = (c)->freq1_offset;                      \
+                       __entry->min_freq1_offset = (c)->freq1_offset;                  \
                        __entry->min_center_freq2 = (c)->center_freq2;
 #define MIN_CHANDEF_PR_FMT     " min_control:%d.%03d MHz min_width:%d min_center: %d.%03d/%d MHz"
 #define MIN_CHANDEF_PR_ARG     __entry->min_control_freq, __entry->min_freq_offset,    \
index 1a33274..0d9fbc8 100644 (file)
@@ -3791,6 +3791,7 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
        ieee80211_tx_result r;
        struct ieee80211_vif *vif = txq->vif;
        int q = vif->hw_queue[txq->ac];
+       unsigned long flags;
        bool q_stopped;
 
        WARN_ON_ONCE(softirq_count() == 0);
@@ -3799,9 +3800,9 @@ struct sk_buff *ieee80211_tx_dequeue(struct ieee80211_hw *hw,
                return NULL;
 
 begin:
-       spin_lock(&local->queue_stop_reason_lock);
+       spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
        q_stopped = local->queue_stop_reasons[q];
-       spin_unlock(&local->queue_stop_reason_lock);
+       spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 
        if (unlikely(q_stopped)) {
                /* mark for waking later */
index 1527d6a..4bf7615 100644 (file)
@@ -3015,7 +3015,7 @@ void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata,
 
                chanctx = container_of(chanctx_conf, struct ieee80211_chanctx,
                                       conf);
-               ieee80211_recalc_chanctx_min_def(local, chanctx);
+               ieee80211_recalc_chanctx_min_def(local, chanctx, NULL);
        }
  unlock:
        mutex_unlock(&local->chanctx_mtx);
index f0783e4..5f76ae8 100644 (file)
@@ -711,9 +711,11 @@ void nf_conntrack_destroy(struct nf_conntrack *nfct)
 
        rcu_read_lock();
        ct_hook = rcu_dereference(nf_ct_hook);
-       BUG_ON(ct_hook == NULL);
-       ct_hook->destroy(nfct);
+       if (ct_hook)
+               ct_hook->destroy(nfct);
        rcu_read_unlock();
+
+       WARN_ON(!ct_hook);
 }
 EXPORT_SYMBOL(nf_conntrack_destroy);
 
index d40544c..69c8c8c 100644 (file)
@@ -2976,7 +2976,9 @@ nla_put_failure:
        return -1;
 }
 
+#if IS_ENABLED(CONFIG_NF_NAT)
 static const union nf_inet_addr any_addr;
+#endif
 
 static __be32 nf_expect_get_id(const struct nf_conntrack_expect *exp)
 {
@@ -3460,10 +3462,12 @@ ctnetlink_change_expect(struct nf_conntrack_expect *x,
        return 0;
 }
 
+#if IS_ENABLED(CONFIG_NF_NAT)
 static const struct nla_policy exp_nat_nla_policy[CTA_EXPECT_NAT_MAX+1] = {
        [CTA_EXPECT_NAT_DIR]    = { .type = NLA_U32 },
        [CTA_EXPECT_NAT_TUPLE]  = { .type = NLA_NESTED },
 };
+#endif
 
 static int
 ctnetlink_parse_expect_nat(const struct nlattr *attr,
index 57f6724..169e16f 100644 (file)
@@ -1218,11 +1218,12 @@ static int __init nf_conntrack_standalone_init(void)
        nf_conntrack_htable_size_user = nf_conntrack_htable_size;
 #endif
 
+       nf_conntrack_init_end();
+
        ret = register_pernet_subsys(&nf_conntrack_net_ops);
        if (ret < 0)
                goto out_pernet;
 
-       nf_conntrack_init_end();
        return 0;
 
 out_pernet:
index 59fb832..dc56759 100644 (file)
@@ -3865,12 +3865,10 @@ static struct nft_rule *nft_rule_lookup_byid(const struct net *net,
        struct nft_trans *trans;
 
        list_for_each_entry(trans, &nft_net->commit_list, list) {
-               struct nft_rule *rule = nft_trans_rule(trans);
-
                if (trans->msg_type == NFT_MSG_NEWRULE &&
                    trans->ctx.chain == chain &&
                    id == nft_trans_rule_id(trans))
-                       return rule;
+                       return nft_trans_rule(trans);
        }
        return ERR_PTR(-ENOENT);
 }
index c3563f0..680fe55 100644 (file)
@@ -344,6 +344,12 @@ static void nft_netdev_event(unsigned long event, struct net_device *dev,
                return;
        }
 
+       /* UNREGISTER events are also happening on netns exit.
+        *
+        * Although nf_tables core releases all tables/chains, only this event
+        * handler provides guarantee that hook->ops.dev is still accessible,
+        * so we cannot skip exiting net namespaces.
+        */
        __nft_release_basechain(ctx);
 }
 
@@ -362,9 +368,6 @@ static int nf_tables_netdev_event(struct notifier_block *this,
            event != NETDEV_CHANGENAME)
                return NOTIFY_DONE;
 
-       if (!check_net(ctx.net))
-               return NOTIFY_DONE;
-
        nft_net = nft_pernet(ctx.net);
        mutex_lock(&nft_net->commit_mutex);
        list_for_each_entry(table, &nft_net->tables, list) {
index 19ea4d3..2f114aa 100644 (file)
@@ -221,7 +221,7 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set,
 {
        struct nft_set *set = (struct nft_set *)__set;
        struct rb_node *prev = rb_prev(&rbe->node);
-       struct nft_rbtree_elem *rbe_prev;
+       struct nft_rbtree_elem *rbe_prev = NULL;
        struct nft_set_gc_batch *gcb;
 
        gcb = nft_set_gc_batch_check(set, NULL, GFP_ATOMIC);
@@ -229,17 +229,21 @@ static int nft_rbtree_gc_elem(const struct nft_set *__set,
                return -ENOMEM;
 
        /* search for expired end interval coming before this element. */
-       do {
+       while (prev) {
                rbe_prev = rb_entry(prev, struct nft_rbtree_elem, node);
                if (nft_rbtree_interval_end(rbe_prev))
                        break;
 
                prev = rb_prev(prev);
-       } while (prev != NULL);
+       }
+
+       if (rbe_prev) {
+               rb_erase(&rbe_prev->node, &priv->root);
+               atomic_dec(&set->nelems);
+       }
 
-       rb_erase(&rbe_prev->node, &priv->root);
        rb_erase(&rbe->node, &priv->root);
-       atomic_sub(2, &set->nelems);
+       atomic_dec(&set->nelems);
 
        nft_set_gc_batch_add(gcb, rbe);
        nft_set_gc_batch_complete(gcb);
@@ -268,7 +272,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
                               struct nft_set_ext **ext)
 {
        struct nft_rbtree_elem *rbe, *rbe_le = NULL, *rbe_ge = NULL;
-       struct rb_node *node, *parent, **p, *first = NULL;
+       struct rb_node *node, *next, *parent, **p, *first = NULL;
        struct nft_rbtree *priv = nft_set_priv(set);
        u8 genmask = nft_genmask_next(net);
        int d, err;
@@ -307,7 +311,9 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
         * Values stored in the tree are in reversed order, starting from
         * highest to lowest value.
         */
-       for (node = first; node != NULL; node = rb_next(node)) {
+       for (node = first; node != NULL; node = next) {
+               next = rb_next(node);
+
                rbe = rb_entry(node, struct nft_rbtree_elem, node);
 
                if (!nft_set_elem_active(&rbe->ext, genmask))
index 7ef8b9a..c878041 100644 (file)
@@ -1990,7 +1990,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
 
        skb_free_datagram(sk, skb);
 
-       if (nlk->cb_running &&
+       if (READ_ONCE(nlk->cb_running) &&
            atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
                ret = netlink_dump(sk);
                if (ret) {
@@ -2302,7 +2302,7 @@ static int netlink_dump(struct sock *sk)
        if (cb->done)
                cb->done(cb);
 
-       nlk->cb_running = false;
+       WRITE_ONCE(nlk->cb_running, false);
        module = cb->module;
        skb = cb->skb;
        mutex_unlock(nlk->cb_mutex);
@@ -2365,7 +2365,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
                        goto error_put;
        }
 
-       nlk->cb_running = true;
+       WRITE_ONCE(nlk->cb_running, true);
        nlk->dump_done_errno = INT_MAX;
 
        mutex_unlock(nlk->cb_mutex);
@@ -2703,7 +2703,7 @@ static int netlink_native_seq_show(struct seq_file *seq, void *v)
                           nlk->groups ? (u32)nlk->groups[0] : 0,
                           sk_rmem_alloc_get(s),
                           sk_wmem_alloc_get(s),
-                          nlk->cb_running,
+                          READ_ONCE(nlk->cb_running),
                           refcount_read(&s->sk_refcnt),
                           atomic_read(&s->sk_drops),
                           sock_i_ino(s)
index e9ca007..0f23e5e 100644 (file)
@@ -77,13 +77,12 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb,
                                       netdev_features_t features)
 {
        struct sk_buff *segs = ERR_PTR(-EINVAL);
+       u16 mac_offset = skb->mac_header;
        unsigned int nsh_len, mac_len;
        __be16 proto;
-       int nhoff;
 
        skb_reset_network_header(skb);
 
-       nhoff = skb->network_header - skb->mac_header;
        mac_len = skb->mac_len;
 
        if (unlikely(!pskb_may_pull(skb, NSH_BASE_HDR_LEN)))
@@ -108,15 +107,14 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb,
        segs = skb_mac_gso_segment(skb, features);
        if (IS_ERR_OR_NULL(segs)) {
                skb_gso_error_unwind(skb, htons(ETH_P_NSH), nsh_len,
-                                    skb->network_header - nhoff,
-                                    mac_len);
+                                    mac_offset, mac_len);
                goto out;
        }
 
        for (skb = segs; skb; skb = skb->next) {
                skb->protocol = htons(ETH_P_NSH);
                __skb_push(skb, nsh_len);
-               skb_set_mac_header(skb, -nhoff);
+               skb->mac_header = mac_offset;
                skb->network_header = skb->mac_header + mac_len;
                skb->mac_len = mac_len;
        }
index 640d94e..94c6a1f 100644 (file)
@@ -1934,10 +1934,8 @@ static void packet_parse_headers(struct sk_buff *skb, struct socket *sock)
        /* Move network header to the right position for VLAN tagged packets */
        if (likely(skb->dev->type == ARPHRD_ETHER) &&
            eth_type_vlan(skb->protocol) &&
-           __vlan_get_protocol(skb, skb->protocol, &depth) != 0) {
-               if (pskb_may_pull(skb, depth))
-                       skb_set_network_header(skb, depth);
-       }
+           vlan_get_protocol_and_depth(skb, skb->protocol, &depth) != 0)
+               skb_set_network_header(skb, depth);
 
        skb_probe_transport_header(skb);
 }
index 31db743..dbdf03e 100644 (file)
@@ -67,8 +67,8 @@ static void smc_close_stream_wait(struct smc_sock *smc, long timeout)
 
                rc = sk_wait_event(sk, &timeout,
                                   !smc_tx_prepared_sends(&smc->conn) ||
-                                  sk->sk_err == ECONNABORTED ||
-                                  sk->sk_err == ECONNRESET ||
+                                  READ_ONCE(sk->sk_err) == ECONNABORTED ||
+                                  READ_ONCE(sk->sk_err) == ECONNRESET ||
                                   smc->conn.killed,
                                   &wait);
                if (rc)
index 4380d32..9a2f363 100644 (file)
@@ -267,9 +267,9 @@ int smc_rx_wait(struct smc_sock *smc, long *timeo,
        sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
        add_wait_queue(sk_sleep(sk), &wait);
        rc = sk_wait_event(sk, timeo,
-                          sk->sk_err ||
+                          READ_ONCE(sk->sk_err) ||
                           cflags->peer_conn_abort ||
-                          sk->sk_shutdown & RCV_SHUTDOWN ||
+                          READ_ONCE(sk->sk_shutdown) & RCV_SHUTDOWN ||
                           conn->killed ||
                           fcrit(conn),
                           &wait);
index f4b6a71..4512844 100644 (file)
@@ -113,8 +113,8 @@ static int smc_tx_wait(struct smc_sock *smc, int flags)
                        break; /* at least 1 byte of free & no urgent data */
                set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
                sk_wait_event(sk, &timeo,
-                             sk->sk_err ||
-                             (sk->sk_shutdown & SEND_SHUTDOWN) ||
+                             READ_ONCE(sk->sk_err) ||
+                             (READ_ONCE(sk->sk_shutdown) & SEND_SHUTDOWN) ||
                              smc_cdc_rxed_any_close(conn) ||
                              (atomic_read(&conn->sndbuf_space) &&
                               !conn->urg_tx_pend),
index a7b4b37..b7e01d0 100644 (file)
@@ -2911,7 +2911,7 @@ static int do_recvmmsg(int fd, struct mmsghdr __user *mmsg,
                 * error to return on the next call or if the
                 * app asks about it using getsockopt(SO_ERROR).
                 */
-               sock->sk->sk_err = -err;
+               WRITE_ONCE(sock->sk->sk_err, -err);
        }
 out_put:
        fput_light(sock->file, fput_needed);
index 212c5d5..9734e1d 100644 (file)
@@ -639,6 +639,16 @@ gss_krb5_cts_crypt(struct crypto_sync_skcipher *cipher, struct xdr_buf *buf,
 
        ret = write_bytes_to_xdr_buf(buf, offset, data, len);
 
+#if IS_ENABLED(CONFIG_KUNIT)
+       /*
+        * CBC-CTS does not define an output IV but RFC 3962 defines it as the
+        * penultimate block of ciphertext, so copy that into the IV buffer
+        * before returning.
+        */
+       if (encrypt)
+               memcpy(iv, data, crypto_sync_skcipher_ivsize(cipher));
+#endif
+
 out:
        kfree(data);
        return ret;
index 26367cf..79967b6 100644 (file)
@@ -1052,7 +1052,7 @@ static int __svc_register(struct net *net, const char *progname,
 #endif
        }
 
-       trace_svc_register(progname, version, protocol, port, family, error);
+       trace_svc_register(progname, version, family, protocol, port, error);
        return error;
 }
 
@@ -1416,7 +1416,7 @@ err_bad_rpc:
        /* Only RPCv2 supported */
        xdr_stream_encode_u32(xdr, RPC_VERSION);
        xdr_stream_encode_u32(xdr, RPC_VERSION);
-       goto sendit;
+       return 1;       /* don't wrap */
 
 err_bad_auth:
        dprintk("svc: authentication failed (%d)\n",
@@ -1432,7 +1432,7 @@ err_bad_auth:
 err_bad_prog:
        dprintk("svc: unknown program %d\n", rqstp->rq_prog);
        serv->sv_stats->rpcbadfmt++;
-       xdr_stream_encode_u32(xdr, RPC_PROG_UNAVAIL);
+       *rqstp->rq_accept_statp = rpc_prog_unavail;
        goto sendit;
 
 err_bad_vers:
@@ -1440,7 +1440,12 @@ err_bad_vers:
                       rqstp->rq_vers, rqstp->rq_prog, progp->pg_name);
 
        serv->sv_stats->rpcbadfmt++;
-       xdr_stream_encode_u32(xdr, RPC_PROG_MISMATCH);
+       *rqstp->rq_accept_statp = rpc_prog_mismatch;
+
+       /*
+        * svc_authenticate() has already added the verifier and
+        * advanced the stream just past rq_accept_statp.
+        */
        xdr_stream_encode_u32(xdr, process.mismatch.lovers);
        xdr_stream_encode_u32(xdr, process.mismatch.hivers);
        goto sendit;
@@ -1449,19 +1454,19 @@ err_bad_proc:
        svc_printk(rqstp, "unknown procedure (%d)\n", rqstp->rq_proc);
 
        serv->sv_stats->rpcbadfmt++;
-       xdr_stream_encode_u32(xdr, RPC_PROC_UNAVAIL);
+       *rqstp->rq_accept_statp = rpc_proc_unavail;
        goto sendit;
 
 err_garbage_args:
        svc_printk(rqstp, "failed to decode RPC header\n");
 
        serv->sv_stats->rpcbadfmt++;
-       xdr_stream_encode_u32(xdr, RPC_GARBAGE_ARGS);
+       *rqstp->rq_accept_statp = rpc_garbage_args;
        goto sendit;
 
 err_system_err:
        serv->sv_stats->rpcbadfmt++;
-       xdr_stream_encode_u32(xdr, RPC_SYSTEM_ERR);
+       *rqstp->rq_accept_statp = rpc_system_err;
        goto sendit;
 }
 
index 84e5d7d..13a1489 100644 (file)
@@ -532,13 +532,23 @@ void svc_reserve(struct svc_rqst *rqstp, int space)
 }
 EXPORT_SYMBOL_GPL(svc_reserve);
 
+static void free_deferred(struct svc_xprt *xprt, struct svc_deferred_req *dr)
+{
+       if (!dr)
+               return;
+
+       xprt->xpt_ops->xpo_release_ctxt(xprt, dr->xprt_ctxt);
+       kfree(dr);
+}
+
 static void svc_xprt_release(struct svc_rqst *rqstp)
 {
        struct svc_xprt *xprt = rqstp->rq_xprt;
 
-       xprt->xpt_ops->xpo_release_rqst(rqstp);
+       xprt->xpt_ops->xpo_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
+       rqstp->rq_xprt_ctxt = NULL;
 
-       kfree(rqstp->rq_deferred);
+       free_deferred(xprt, rqstp->rq_deferred);
        rqstp->rq_deferred = NULL;
 
        svc_rqst_release_pages(rqstp);
@@ -1054,7 +1064,7 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
        spin_unlock_bh(&serv->sv_lock);
 
        while ((dr = svc_deferred_dequeue(xprt)) != NULL)
-               kfree(dr);
+               free_deferred(xprt, dr);
 
        call_xpt_users(xprt);
        svc_xprt_put(xprt);
@@ -1176,8 +1186,8 @@ static void svc_revisit(struct cache_deferred_req *dreq, int too_many)
        if (too_many || test_bit(XPT_DEAD, &xprt->xpt_flags)) {
                spin_unlock(&xprt->xpt_lock);
                trace_svc_defer_drop(dr);
+               free_deferred(xprt, dr);
                svc_xprt_put(xprt);
-               kfree(dr);
                return;
        }
        dr->xprt = NULL;
@@ -1222,14 +1232,14 @@ static struct cache_deferred_req *svc_defer(struct cache_req *req)
                dr->addrlen = rqstp->rq_addrlen;
                dr->daddr = rqstp->rq_daddr;
                dr->argslen = rqstp->rq_arg.len >> 2;
-               dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
-               rqstp->rq_xprt_ctxt = NULL;
 
                /* back up head to the start of the buffer and copy */
                skip = rqstp->rq_arg.len - rqstp->rq_arg.head[0].iov_len;
                memcpy(dr->args, rqstp->rq_arg.head[0].iov_base - skip,
                       dr->argslen << 2);
        }
+       dr->xprt_ctxt = rqstp->rq_xprt_ctxt;
+       rqstp->rq_xprt_ctxt = NULL;
        trace_svc_defer(rqstp);
        svc_xprt_get(rqstp->rq_xprt);
        dr->xprt = rqstp->rq_xprt;
@@ -1262,6 +1272,8 @@ static noinline int svc_deferred_recv(struct svc_rqst *rqstp)
        rqstp->rq_daddr       = dr->daddr;
        rqstp->rq_respages    = rqstp->rq_pages;
        rqstp->rq_xprt_ctxt   = dr->xprt_ctxt;
+
+       dr->xprt_ctxt = NULL;
        svc_xprt_received(rqstp->rq_xprt);
        return dr->argslen << 2;
 }
index a51c9b9..63fe7a3 100644 (file)
@@ -121,27 +121,27 @@ static void svc_reclassify_socket(struct socket *sock)
 #endif
 
 /**
- * svc_tcp_release_rqst - Release transport-related resources
- * @rqstp: request structure with resources to be released
+ * svc_tcp_release_ctxt - Release transport-related resources
+ * @xprt: the transport which owned the context
+ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
  *
  */
-static void svc_tcp_release_rqst(struct svc_rqst *rqstp)
+static void svc_tcp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
 {
 }
 
 /**
- * svc_udp_release_rqst - Release transport-related resources
- * @rqstp: request structure with resources to be released
+ * svc_udp_release_ctxt - Release transport-related resources
+ * @xprt: the transport which owned the context
+ * @ctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
  *
  */
-static void svc_udp_release_rqst(struct svc_rqst *rqstp)
+static void svc_udp_release_ctxt(struct svc_xprt *xprt, void *ctxt)
 {
-       struct sk_buff *skb = rqstp->rq_xprt_ctxt;
+       struct sk_buff *skb = ctxt;
 
-       if (skb) {
-               rqstp->rq_xprt_ctxt = NULL;
+       if (skb)
                consume_skb(skb);
-       }
 }
 
 union svc_pktinfo_u {
@@ -696,7 +696,8 @@ static int svc_udp_sendto(struct svc_rqst *rqstp)
        unsigned int sent;
        int err;
 
-       svc_udp_release_rqst(rqstp);
+       svc_udp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
+       rqstp->rq_xprt_ctxt = NULL;
 
        svc_set_cmsg_data(rqstp, cmh);
 
@@ -768,7 +769,7 @@ static const struct svc_xprt_ops svc_udp_ops = {
        .xpo_recvfrom = svc_udp_recvfrom,
        .xpo_sendto = svc_udp_sendto,
        .xpo_result_payload = svc_sock_result_payload,
-       .xpo_release_rqst = svc_udp_release_rqst,
+       .xpo_release_ctxt = svc_udp_release_ctxt,
        .xpo_detach = svc_sock_detach,
        .xpo_free = svc_sock_free,
        .xpo_has_wspace = svc_udp_has_wspace,
@@ -895,6 +896,9 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
                trace_svcsock_accept_err(xprt, serv->sv_name, err);
                return NULL;
        }
+       if (IS_ERR(sock_alloc_file(newsock, O_NONBLOCK, NULL)))
+               return NULL;
+
        set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags);
 
        err = kernel_getpeername(newsock, sin);
@@ -935,7 +939,7 @@ static struct svc_xprt *svc_tcp_accept(struct svc_xprt *xprt)
        return &newsvsk->sk_xprt;
 
 failed:
-       sock_release(newsock);
+       sockfd_put(newsock);
        return NULL;
 }
 
@@ -1298,7 +1302,8 @@ static int svc_tcp_sendto(struct svc_rqst *rqstp)
        unsigned int sent;
        int err;
 
-       svc_tcp_release_rqst(rqstp);
+       svc_tcp_release_ctxt(xprt, rqstp->rq_xprt_ctxt);
+       rqstp->rq_xprt_ctxt = NULL;
 
        atomic_inc(&svsk->sk_sendqlen);
        mutex_lock(&xprt->xpt_mutex);
@@ -1343,7 +1348,7 @@ static const struct svc_xprt_ops svc_tcp_ops = {
        .xpo_recvfrom = svc_tcp_recvfrom,
        .xpo_sendto = svc_tcp_sendto,
        .xpo_result_payload = svc_sock_result_payload,
-       .xpo_release_rqst = svc_tcp_release_rqst,
+       .xpo_release_ctxt = svc_tcp_release_ctxt,
        .xpo_detach = svc_tcp_sock_detach,
        .xpo_free = svc_sock_free,
        .xpo_has_wspace = svc_tcp_has_wspace,
@@ -1430,7 +1435,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
                                                struct socket *sock,
                                                int flags)
 {
-       struct file     *filp = NULL;
        struct svc_sock *svsk;
        struct sock     *inet;
        int             pmap_register = !(flags & SVC_SOCK_ANONYMOUS);
@@ -1439,14 +1443,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
        if (!svsk)
                return ERR_PTR(-ENOMEM);
 
-       if (!sock->file) {
-               filp = sock_alloc_file(sock, O_NONBLOCK, NULL);
-               if (IS_ERR(filp)) {
-                       kfree(svsk);
-                       return ERR_CAST(filp);
-               }
-       }
-
        inet = sock->sk;
 
        if (pmap_register) {
@@ -1456,8 +1452,6 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv,
                                     inet->sk_protocol,
                                     ntohs(inet_sk(inet)->inet_sport));
                if (err < 0) {
-                       if (filp)
-                               fput(filp);
                        kfree(svsk);
                        return ERR_PTR(err);
                }
index 1c658fa..a22fe75 100644 (file)
@@ -239,21 +239,20 @@ void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
 }
 
 /**
- * svc_rdma_release_rqst - Release transport-specific per-rqst resources
- * @rqstp: svc_rqst being released
+ * svc_rdma_release_ctxt - Release transport-specific per-rqst resources
+ * @xprt: the transport which owned the context
+ * @vctxt: the context from rqstp->rq_xprt_ctxt or dr->xprt_ctxt
  *
  * Ensure that the recv_ctxt is released whether or not a Reply
  * was sent. For example, the client could close the connection,
  * or svc_process could drop an RPC, before the Reply is sent.
  */
-void svc_rdma_release_rqst(struct svc_rqst *rqstp)
+void svc_rdma_release_ctxt(struct svc_xprt *xprt, void *vctxt)
 {
-       struct svc_rdma_recv_ctxt *ctxt = rqstp->rq_xprt_ctxt;
-       struct svc_xprt *xprt = rqstp->rq_xprt;
+       struct svc_rdma_recv_ctxt *ctxt = vctxt;
        struct svcxprt_rdma *rdma =
                container_of(xprt, struct svcxprt_rdma, sc_xprt);
 
-       rqstp->rq_xprt_ctxt = NULL;
        if (ctxt)
                svc_rdma_recv_ctxt_put(rdma, ctxt);
 }
index 416b298..ca04f7a 100644 (file)
@@ -80,7 +80,7 @@ static const struct svc_xprt_ops svc_rdma_ops = {
        .xpo_recvfrom = svc_rdma_recvfrom,
        .xpo_sendto = svc_rdma_sendto,
        .xpo_result_payload = svc_rdma_result_payload,
-       .xpo_release_rqst = svc_rdma_release_rqst,
+       .xpo_release_ctxt = svc_rdma_release_ctxt,
        .xpo_detach = svc_rdma_detach,
        .xpo_free = svc_rdma_free,
        .xpo_has_wspace = svc_rdma_has_wspace,
index 35cac77..5388140 100644 (file)
@@ -541,6 +541,19 @@ int tipc_bearer_mtu(struct net *net, u32 bearer_id)
        return mtu;
 }
 
+int tipc_bearer_min_mtu(struct net *net, u32 bearer_id)
+{
+       int mtu = TIPC_MIN_BEARER_MTU;
+       struct tipc_bearer *b;
+
+       rcu_read_lock();
+       b = bearer_get(net, bearer_id);
+       if (b)
+               mtu += b->encap_hlen;
+       rcu_read_unlock();
+       return mtu;
+}
+
 /* tipc_bearer_xmit_skb - sends buffer to destination over bearer
  */
 void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
@@ -1138,8 +1151,8 @@ int __tipc_nl_bearer_set(struct sk_buff *skb, struct genl_info *info)
                                return -EINVAL;
                        }
 #ifdef CONFIG_TIPC_MEDIA_UDP
-                       if (tipc_udp_mtu_bad(nla_get_u32
-                                            (props[TIPC_NLA_PROP_MTU]))) {
+                       if (nla_get_u32(props[TIPC_NLA_PROP_MTU]) <
+                           b->encap_hlen + TIPC_MIN_BEARER_MTU) {
                                NL_SET_ERR_MSG(info->extack,
                                               "MTU value is out-of-range");
                                return -EINVAL;
index 490ad6e..bd0cc5c 100644 (file)
@@ -146,6 +146,7 @@ struct tipc_media {
  * @identity: array index of this bearer within TIPC bearer array
  * @disc: ptr to link setup request
  * @net_plane: network plane ('A' through 'H') currently associated with bearer
+ * @encap_hlen: encap headers length
  * @up: bearer up flag (bit 0)
  * @refcnt: tipc_bearer reference counter
  *
@@ -170,6 +171,7 @@ struct tipc_bearer {
        u32 identity;
        struct tipc_discoverer *disc;
        char net_plane;
+       u16 encap_hlen;
        unsigned long up;
        refcount_t refcnt;
 };
@@ -232,6 +234,7 @@ int tipc_bearer_setup(void);
 void tipc_bearer_cleanup(void);
 void tipc_bearer_stop(struct net *net);
 int tipc_bearer_mtu(struct net *net, u32 bearer_id);
+int tipc_bearer_min_mtu(struct net *net, u32 bearer_id);
 bool tipc_bearer_bcast_support(struct net *net, u32 bearer_id);
 void tipc_bearer_xmit_skb(struct net *net, u32 bearer_id,
                          struct sk_buff *skb,
index b3ce248..2eff1c7 100644 (file)
@@ -2200,7 +2200,7 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
        struct tipc_msg *hdr = buf_msg(skb);
        struct tipc_gap_ack_blks *ga = NULL;
        bool reply = msg_probe(hdr), retransmitted = false;
-       u32 dlen = msg_data_sz(hdr), glen = 0;
+       u32 dlen = msg_data_sz(hdr), glen = 0, msg_max;
        u16 peers_snd_nxt =  msg_next_sent(hdr);
        u16 peers_tol = msg_link_tolerance(hdr);
        u16 peers_prio = msg_linkprio(hdr);
@@ -2239,6 +2239,9 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
        switch (mtyp) {
        case RESET_MSG:
        case ACTIVATE_MSG:
+               msg_max = msg_max_pkt(hdr);
+               if (msg_max < tipc_bearer_min_mtu(l->net, l->bearer_id))
+                       break;
                /* Complete own link name with peer's interface name */
                if_name =  strrchr(l->name, ':') + 1;
                if (sizeof(l->name) - (if_name - l->name) <= TIPC_MAX_IF_NAME)
@@ -2283,8 +2286,8 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
                l->peer_session = msg_session(hdr);
                l->in_session = true;
                l->peer_bearer_id = msg_bearer_id(hdr);
-               if (l->mtu > msg_max_pkt(hdr))
-                       l->mtu = msg_max_pkt(hdr);
+               if (l->mtu > msg_max)
+                       l->mtu = msg_max;
                break;
 
        case STATE_MSG:
index 37edfe1..dd73d71 100644 (file)
@@ -314,9 +314,9 @@ static void tsk_rej_rx_queue(struct sock *sk, int error)
                tipc_sk_respond(sk, skb, error);
 }
 
-static bool tipc_sk_connected(struct sock *sk)
+static bool tipc_sk_connected(const struct sock *sk)
 {
-       return sk->sk_state == TIPC_ESTABLISHED;
+       return READ_ONCE(sk->sk_state) == TIPC_ESTABLISHED;
 }
 
 /* tipc_sk_type_connectionless - check if the socket is datagram socket
index c2bb818..0a85244 100644 (file)
@@ -738,8 +738,8 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
                        udp_conf.local_ip.s_addr = local.ipv4.s_addr;
                udp_conf.use_udp_checksums = false;
                ub->ifindex = dev->ifindex;
-               if (tipc_mtu_bad(dev, sizeof(struct iphdr) +
-                                     sizeof(struct udphdr))) {
+               b->encap_hlen = sizeof(struct iphdr) + sizeof(struct udphdr);
+               if (tipc_mtu_bad(dev, b->encap_hlen)) {
                        err = -EINVAL;
                        goto err;
                }
@@ -760,6 +760,7 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
                else
                        udp_conf.local_ip6 = local.ipv6;
                ub->ifindex = dev->ifindex;
+               b->encap_hlen = sizeof(struct ipv6hdr) + sizeof(struct udphdr);
                b->mtu = 1280;
 #endif
        } else {
index b32c112..f2e7302 100644 (file)
@@ -111,7 +111,8 @@ int wait_on_pending_writer(struct sock *sk, long *timeo)
                        break;
                }
 
-               if (sk_wait_event(sk, timeo, !sk->sk_write_pending, &wait))
+               if (sk_wait_event(sk, timeo,
+                                 !READ_ONCE(sk->sk_write_pending), &wait))
                        break;
        }
        remove_wait_queue(sk_sleep(sk), &wait);
index fb31e8a..cc695c9 100644 (file)
@@ -603,7 +603,7 @@ static void unix_release_sock(struct sock *sk, int embrion)
        /* Clear state */
        unix_state_lock(sk);
        sock_orphan(sk);
-       sk->sk_shutdown = SHUTDOWN_MASK;
+       WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
        path         = u->path;
        u->path.dentry = NULL;
        u->path.mnt = NULL;
@@ -628,7 +628,7 @@ static void unix_release_sock(struct sock *sk, int embrion)
                if (sk->sk_type == SOCK_STREAM || sk->sk_type == SOCK_SEQPACKET) {
                        unix_state_lock(skpair);
                        /* No more writes */
-                       skpair->sk_shutdown = SHUTDOWN_MASK;
+                       WRITE_ONCE(skpair->sk_shutdown, SHUTDOWN_MASK);
                        if (!skb_queue_empty(&sk->sk_receive_queue) || embrion)
                                WRITE_ONCE(skpair->sk_err, ECONNRESET);
                        unix_state_unlock(skpair);
@@ -1442,7 +1442,7 @@ static long unix_wait_for_peer(struct sock *other, long timeo)
 
        sched = !sock_flag(other, SOCK_DEAD) &&
                !(other->sk_shutdown & RCV_SHUTDOWN) &&
-               unix_recvq_full(other);
+               unix_recvq_full_lockless(other);
 
        unix_state_unlock(other);
 
@@ -3008,7 +3008,7 @@ static int unix_shutdown(struct socket *sock, int mode)
        ++mode;
 
        unix_state_lock(sk);
-       sk->sk_shutdown |= mode;
+       WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | mode);
        other = unix_peer(sk);
        if (other)
                sock_hold(other);
@@ -3028,7 +3028,7 @@ static int unix_shutdown(struct socket *sock, int mode)
                if (mode&SEND_SHUTDOWN)
                        peer_mode |= RCV_SHUTDOWN;
                unix_state_lock(other);
-               other->sk_shutdown |= peer_mode;
+               WRITE_ONCE(other->sk_shutdown, other->sk_shutdown | peer_mode);
                unix_state_unlock(other);
                other->sk_state_change(other);
                if (peer_mode == SHUTDOWN_MASK)
@@ -3160,16 +3160,18 @@ static __poll_t unix_poll(struct file *file, struct socket *sock, poll_table *wa
 {
        struct sock *sk = sock->sk;
        __poll_t mask;
+       u8 shutdown;
 
        sock_poll_wait(file, sock, wait);
        mask = 0;
+       shutdown = READ_ONCE(sk->sk_shutdown);
 
        /* exceptional events? */
        if (READ_ONCE(sk->sk_err))
                mask |= EPOLLERR;
-       if (sk->sk_shutdown == SHUTDOWN_MASK)
+       if (shutdown == SHUTDOWN_MASK)
                mask |= EPOLLHUP;
-       if (sk->sk_shutdown & RCV_SHUTDOWN)
+       if (shutdown & RCV_SHUTDOWN)
                mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
 
        /* readable? */
@@ -3203,9 +3205,11 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
        struct sock *sk = sock->sk, *other;
        unsigned int writable;
        __poll_t mask;
+       u8 shutdown;
 
        sock_poll_wait(file, sock, wait);
        mask = 0;
+       shutdown = READ_ONCE(sk->sk_shutdown);
 
        /* exceptional events? */
        if (READ_ONCE(sk->sk_err) ||
@@ -3213,9 +3217,9 @@ static __poll_t unix_dgram_poll(struct file *file, struct socket *sock,
                mask |= EPOLLERR |
                        (sock_flag(sk, SOCK_SELECT_ERR_QUEUE) ? EPOLLPRI : 0);
 
-       if (sk->sk_shutdown & RCV_SHUTDOWN)
+       if (shutdown & RCV_SHUTDOWN)
                mask |= EPOLLRDHUP | EPOLLIN | EPOLLRDNORM;
-       if (sk->sk_shutdown == SHUTDOWN_MASK)
+       if (shutdown == SHUTDOWN_MASK)
                mask |= EPOLLHUP;
 
        /* readable? */
index 413407b..efb8a09 100644 (file)
@@ -1462,7 +1462,7 @@ static int vsock_connect(struct socket *sock, struct sockaddr *addr,
                        vsock_transport_cancel_pkt(vsk);
                        vsock_remove_connected(vsk);
                        goto out_wait;
-               } else if (timeout == 0) {
+               } else if ((sk->sk_state != TCP_ESTABLISHED) && (timeout == 0)) {
                        err = -ETIMEDOUT;
                        sk->sk_state = TCP_CLOSE;
                        sock->state = SS_UNCONNECTED;
index a138225..c501db7 100644 (file)
@@ -5,7 +5,7 @@
  * Copyright 2008 Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright 2016      Intel Deutschland GmbH
- * Copyright (C) 2018-2022 Intel Corporation
+ * Copyright (C) 2018-2023 Intel Corporation
  */
 #include <linux/kernel.h>
 #include <linux/slab.h>
@@ -540,6 +540,10 @@ static int cfg80211_parse_ap_info(struct cfg80211_colocated_ap *entry,
        /* skip the TBTT offset */
        pos++;
 
+       /* ignore entries with invalid BSSID */
+       if (!is_valid_ether_addr(pos))
+               return -EINVAL;
+
        memcpy(entry->bssid, pos, ETH_ALEN);
        pos += ETH_ALEN;
 
index bef28c6..408f5e5 100644 (file)
@@ -378,7 +378,7 @@ int xfrm_dev_policy_add(struct net *net, struct xfrm_policy *xp,
                break;
        default:
                xdo->dev = NULL;
-               dev_put(dev);
+               netdev_put(dev, &xdo->dev_tracker);
                NL_SET_ERR_MSG(extack, "Unrecognized offload direction");
                return -EINVAL;
        }
index 35279c2..1f99dc4 100644 (file)
@@ -310,52 +310,6 @@ static void xfrmi_scrub_packet(struct sk_buff *skb, bool xnet)
        skb->mark = 0;
 }
 
-static int xfrmi_input(struct sk_buff *skb, int nexthdr, __be32 spi,
-                      int encap_type, unsigned short family)
-{
-       struct sec_path *sp;
-
-       sp = skb_sec_path(skb);
-       if (sp && (sp->len || sp->olen) &&
-           !xfrm_policy_check(NULL, XFRM_POLICY_IN, skb, family))
-               goto discard;
-
-       XFRM_SPI_SKB_CB(skb)->family = family;
-       if (family == AF_INET) {
-               XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct iphdr, daddr);
-               XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip4 = NULL;
-       } else {
-               XFRM_SPI_SKB_CB(skb)->daddroff = offsetof(struct ipv6hdr, daddr);
-               XFRM_TUNNEL_SKB_CB(skb)->tunnel.ip6 = NULL;
-       }
-
-       return xfrm_input(skb, nexthdr, spi, encap_type);
-discard:
-       kfree_skb(skb);
-       return 0;
-}
-
-static int xfrmi4_rcv(struct sk_buff *skb)
-{
-       return xfrmi_input(skb, ip_hdr(skb)->protocol, 0, 0, AF_INET);
-}
-
-static int xfrmi6_rcv(struct sk_buff *skb)
-{
-       return xfrmi_input(skb, skb_network_header(skb)[IP6CB(skb)->nhoff],
-                          0, 0, AF_INET6);
-}
-
-static int xfrmi4_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
-{
-       return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET);
-}
-
-static int xfrmi6_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type)
-{
-       return xfrmi_input(skb, nexthdr, spi, encap_type, AF_INET6);
-}
-
 static int xfrmi_rcv_cb(struct sk_buff *skb, int err)
 {
        const struct xfrm_mode *inner_mode;
@@ -991,8 +945,8 @@ static struct pernet_operations xfrmi_net_ops = {
 };
 
 static struct xfrm6_protocol xfrmi_esp6_protocol __read_mostly = {
-       .handler        =       xfrmi6_rcv,
-       .input_handler  =       xfrmi6_input,
+       .handler        =       xfrm6_rcv,
+       .input_handler  =       xfrm_input,
        .cb_handler     =       xfrmi_rcv_cb,
        .err_handler    =       xfrmi6_err,
        .priority       =       10,
@@ -1042,8 +996,8 @@ static struct xfrm6_tunnel xfrmi_ip6ip_handler __read_mostly = {
 #endif
 
 static struct xfrm4_protocol xfrmi_esp4_protocol __read_mostly = {
-       .handler        =       xfrmi4_rcv,
-       .input_handler  =       xfrmi4_input,
+       .handler        =       xfrm4_rcv,
+       .input_handler  =       xfrm_input,
        .cb_handler     =       xfrmi_rcv_cb,
        .err_handler    =       xfrmi4_err,
        .priority       =       10,
index 5c61ec0..6d15788 100644 (file)
@@ -3312,7 +3312,7 @@ xfrm_secpath_reject(int idx, struct sk_buff *skb, const struct flowi *fl)
 
 static inline int
 xfrm_state_ok(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x,
-             unsigned short family)
+             unsigned short family, u32 if_id)
 {
        if (xfrm_state_kern(x))
                return tmpl->optional && !xfrm_state_addr_cmp(tmpl, x, tmpl->encap_family);
@@ -3323,7 +3323,8 @@ xfrm_state_ok(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x,
                (tmpl->allalgs || (tmpl->aalgos & (1<<x->props.aalgo)) ||
                 !(xfrm_id_proto_match(tmpl->id.proto, IPSEC_PROTO_ANY))) &&
                !(x->props.mode != XFRM_MODE_TRANSPORT &&
-                 xfrm_state_addr_cmp(tmpl, x, family));
+                 xfrm_state_addr_cmp(tmpl, x, family)) &&
+               (if_id == 0 || if_id == x->if_id);
 }
 
 /*
@@ -3335,7 +3336,7 @@ xfrm_state_ok(const struct xfrm_tmpl *tmpl, const struct xfrm_state *x,
  */
 static inline int
 xfrm_policy_ok(const struct xfrm_tmpl *tmpl, const struct sec_path *sp, int start,
-              unsigned short family)
+              unsigned short family, u32 if_id)
 {
        int idx = start;
 
@@ -3345,7 +3346,7 @@ xfrm_policy_ok(const struct xfrm_tmpl *tmpl, const struct sec_path *sp, int star
        } else
                start = -1;
        for (; idx < sp->len; idx++) {
-               if (xfrm_state_ok(tmpl, sp->xvec[idx], family))
+               if (xfrm_state_ok(tmpl, sp->xvec[idx], family, if_id))
                        return ++idx;
                if (sp->xvec[idx]->props.mode != XFRM_MODE_TRANSPORT) {
                        if (start == -1)
@@ -3712,12 +3713,6 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                }
                xfrm_nr = ti;
 
-               if (net->xfrm.policy_default[dir] == XFRM_USERPOLICY_BLOCK &&
-                   !xfrm_nr) {
-                       XFRM_INC_STATS(net, LINUX_MIB_XFRMINNOSTATES);
-                       goto reject;
-               }
-
                if (npols > 1) {
                        xfrm_tmpl_sort(stp, tpp, xfrm_nr, family);
                        tpp = stp;
@@ -3730,7 +3725,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                 * are implied between each two transformations.
                 */
                for (i = xfrm_nr-1, k = 0; i >= 0; i--) {
-                       k = xfrm_policy_ok(tpp[i], sp, k, family);
+                       k = xfrm_policy_ok(tpp[i], sp, k, family, if_id);
                        if (k < 0) {
                                if (k < -1)
                                        /* "-2 - errored_index" returned */
@@ -3745,9 +3740,6 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                        goto reject;
                }
 
-               if (if_id)
-                       secpath_reset(skb);
-
                xfrm_pols_put(pols, npols);
                return 1;
        }
index d720e16..c34a2a0 100644 (file)
@@ -1770,7 +1770,7 @@ static void copy_templates(struct xfrm_policy *xp, struct xfrm_user_tmpl *ut,
 }
 
 static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
-                        struct netlink_ext_ack *extack)
+                        int dir, struct netlink_ext_ack *extack)
 {
        u16 prev_family;
        int i;
@@ -1796,6 +1796,10 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
                switch (ut[i].mode) {
                case XFRM_MODE_TUNNEL:
                case XFRM_MODE_BEET:
+                       if (ut[i].optional && dir == XFRM_POLICY_OUT) {
+                               NL_SET_ERR_MSG(extack, "Mode in optional template not allowed in outbound policy");
+                               return -EINVAL;
+                       }
                        break;
                default:
                        if (ut[i].family != prev_family) {
@@ -1833,7 +1837,7 @@ static int validate_tmpl(int nr, struct xfrm_user_tmpl *ut, u16 family,
 }
 
 static int copy_from_user_tmpl(struct xfrm_policy *pol, struct nlattr **attrs,
-                              struct netlink_ext_ack *extack)
+                              int dir, struct netlink_ext_ack *extack)
 {
        struct nlattr *rt = attrs[XFRMA_TMPL];
 
@@ -1844,7 +1848,7 @@ static int copy_from_user_tmpl(struct xfrm_policy *pol, struct nlattr **attrs,
                int nr = nla_len(rt) / sizeof(*utmpl);
                int err;
 
-               err = validate_tmpl(nr, utmpl, pol->family, extack);
+               err = validate_tmpl(nr, utmpl, pol->family, dir, extack);
                if (err)
                        return err;
 
@@ -1921,7 +1925,7 @@ static struct xfrm_policy *xfrm_policy_construct(struct net *net,
        if (err)
                goto error;
 
-       if (!(err = copy_from_user_tmpl(xp, attrs, extack)))
+       if (!(err = copy_from_user_tmpl(xp, attrs, p->dir, extack)))
                err = copy_from_user_sec_ctx(xp, attrs);
        if (err)
                goto error;
@@ -1980,6 +1984,7 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh,
 
        if (err) {
                xfrm_dev_policy_delete(xp);
+               xfrm_dev_policy_free(xp);
                security_xfrm_policy_free(xp->security);
                kfree(xp);
                return err;
@@ -3499,7 +3504,7 @@ static struct xfrm_policy *xfrm_compile_policy(struct sock *sk, int opt,
                return NULL;
 
        nr = ((len - sizeof(*p)) / sizeof(*ut));
-       if (validate_tmpl(nr, ut, p->sel.family, NULL))
+       if (validate_tmpl(nr, ut, p->sel.family, p->dir, NULL))
                return NULL;
 
        if (p->dir > XFRM_POLICY_OUT)
index 46e273b..50a6b50 100644 (file)
@@ -141,6 +141,14 @@ int snd_pcm_area_copy(const struct snd_pcm_channel_area *src_channel,
 
 void *snd_pcm_plug_buf_alloc(struct snd_pcm_substream *plug, snd_pcm_uframes_t size);
 void snd_pcm_plug_buf_unlock(struct snd_pcm_substream *plug, void *ptr);
+#else
+
+static inline snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t drv_size) { return drv_size; }
+static inline snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t clt_size) { return clt_size; }
+static inline int snd_pcm_plug_slave_format(int format, const struct snd_mask *format_mask) { return format; }
+
+#endif
+
 snd_pcm_sframes_t snd_pcm_oss_write3(struct snd_pcm_substream *substream,
                                     const char *ptr, snd_pcm_uframes_t size,
                                     int in_kernel);
@@ -151,14 +159,6 @@ snd_pcm_sframes_t snd_pcm_oss_writev3(struct snd_pcm_substream *substream,
 snd_pcm_sframes_t snd_pcm_oss_readv3(struct snd_pcm_substream *substream,
                                     void **bufs, snd_pcm_uframes_t frames);
 
-#else
-
-static inline snd_pcm_sframes_t snd_pcm_plug_client_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t drv_size) { return drv_size; }
-static inline snd_pcm_sframes_t snd_pcm_plug_slave_size(struct snd_pcm_substream *handle, snd_pcm_uframes_t clt_size) { return clt_size; }
-static inline int snd_pcm_plug_slave_format(int format, const struct snd_mask *format_mask) { return format; }
-
-#endif
-
 #ifdef PLUGIN_DEBUG
 #define pdprintf(fmt, args...) printk(KERN_DEBUG "plugin: " fmt, ##args)
 #else
index a15f55b..295163b 100644 (file)
@@ -259,8 +259,10 @@ int snd_dg00x_stream_init_duplex(struct snd_dg00x *dg00x)
                return err;
 
        err = init_stream(dg00x, &dg00x->tx_stream);
-       if (err < 0)
+       if (err < 0) {
                destroy_stream(dg00x, &dg00x->rx_stream);
+               return err;
+       }
 
        err = amdtp_domain_init(&dg00x->domain);
        if (err < 0) {
index 62f4584..7d882b3 100644 (file)
@@ -531,7 +531,7 @@ static int load_firmware(struct snd_cs46xx *chip)
        return err;
 }
 
-int snd_cs46xx_download_image(struct snd_cs46xx *chip)
+static __maybe_unused int snd_cs46xx_download_image(struct snd_cs46xx *chip)
 {
        int idx, err;
        unsigned int offset = 0;
index fc114e5..dbf7aa8 100644 (file)
@@ -1155,8 +1155,8 @@ static bool path_has_mixer(struct hda_codec *codec, int path_idx, int ctl_type)
        return path && path->ctls[ctl_type];
 }
 
-static const char * const channel_name[4] = {
-       "Front", "Surround", "CLFE", "Side"
+static const char * const channel_name[] = {
+       "Front", "Surround", "CLFE", "Side", "Back",
 };
 
 /* give some appropriate ctl name prefix for the given line out channel */
@@ -1182,7 +1182,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
 
        /* multi-io channels */
        if (ch >= cfg->line_outs)
-               return channel_name[ch];
+               goto fixed_name;
 
        switch (cfg->line_out_type) {
        case AUTO_PIN_SPEAKER_OUT:
@@ -1234,6 +1234,7 @@ static const char *get_line_out_pfx(struct hda_codec *codec, int ch,
        if (cfg->line_outs == 1 && !spec->multi_ios)
                return "Line Out";
 
+ fixed_name:
        if (ch >= ARRAY_SIZE(channel_name)) {
                snd_BUG();
                return "PCM";
index 64a9440..5c0b1a0 100644 (file)
@@ -4589,6 +4589,11 @@ HDA_CODEC_ENTRY(0x10de009d, "GPU 9d HDMI/DP",    patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de009e, "GPU 9e HDMI/DP",  patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de009f, "GPU 9f HDMI/DP",  patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de00a0, "GPU a0 HDMI/DP",  patch_nvhdmi),
+HDA_CODEC_ENTRY(0x10de00a3, "GPU a3 HDMI/DP",  patch_nvhdmi),
+HDA_CODEC_ENTRY(0x10de00a4, "GPU a4 HDMI/DP",  patch_nvhdmi),
+HDA_CODEC_ENTRY(0x10de00a5, "GPU a5 HDMI/DP",  patch_nvhdmi),
+HDA_CODEC_ENTRY(0x10de00a6, "GPU a6 HDMI/DP",  patch_nvhdmi),
+HDA_CODEC_ENTRY(0x10de00a7, "GPU a7 HDMI/DP",  patch_nvhdmi),
 HDA_CODEC_ENTRY(0x10de8001, "MCP73 HDMI",      patch_nvhdmi_2ch),
 HDA_CODEC_ENTRY(0x10de8067, "MCP67/68 HDMI",   patch_nvhdmi_2ch),
 HDA_CODEC_ENTRY(0x67663d82, "Arise 82 HDMI/DP",        patch_gf_hdmi),
index 172ffc2..a7e4765 100644 (file)
@@ -7063,6 +7063,8 @@ enum {
        ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
        ALC295_FIXUP_DISABLE_DAC3,
        ALC285_FIXUP_SPEAKER2_TO_DAC1,
+       ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
+       ALC285_FIXUP_ASUS_HEADSET_MIC,
        ALC280_FIXUP_HP_HEADSET_MIC,
        ALC221_FIXUP_HP_FRONT_MIC,
        ALC292_FIXUP_TPT460,
@@ -8033,6 +8035,22 @@ static const struct hda_fixup alc269_fixups[] = {
                .chained = true,
                .chain_id = ALC269_FIXUP_THINKPAD_ACPI
        },
+       [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc285_fixup_speaker2_to_dac1,
+               .chained = true,
+               .chain_id = ALC245_FIXUP_CS35L41_SPI_2
+       },
+       [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
+               .type = HDA_FIXUP_PINS,
+               .v.pins = (const struct hda_pintbl[]) {
+                       { 0x19, 0x03a11050 },
+                       { 0x1b, 0x03a11c30 },
+                       { }
+               },
+               .chained = true,
+               .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
+       },
        [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
                .type = HDA_FIXUP_PINS,
                .v.pins = (const struct hda_pintbl[]) {
@@ -9363,7 +9381,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
        SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
-       SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
+       SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
        SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
        SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
        SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
@@ -9458,7 +9476,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
-        SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
@@ -9469,8 +9487,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
        SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
        SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2),
+       SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2),
+       SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2),
+       SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
        SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
@@ -9480,7 +9503,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
+       SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
        SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
+       SND_PCI_QUIRK(0x103c, 0x8c26, "HP HP EliteBook 800G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
        SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
        SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
        SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
@@ -9500,6 +9525,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
        SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
+       SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
+       SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
        SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
        SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
        SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
@@ -9522,6 +9549,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
        SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
+       SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
        SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
        SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
        SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
@@ -9618,6 +9646,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
+       SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
        SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
@@ -11663,6 +11692,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
        SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
        SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
        SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
+       SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
        SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
        SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
        SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
index 0bc6e40..4406a5d 100644 (file)
@@ -311,6 +311,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
                        DMI_MATCH(DMI_BOARD_NAME, "8A22"),
                }
        },
+       {
+               .driver_data = &acp6x_card,
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "System76"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "pang12"),
+               }
+       },
        {}
 };
 
index 46762f7..d1677d7 100644 (file)
@@ -852,10 +852,11 @@ static void cs35l56_dsp_work(struct work_struct *work)
         */
        if (cs35l56->sdw_peripheral) {
                cs35l56->sdw_irq_no_unmask = true;
-               cancel_work_sync(&cs35l56->sdw_irq_work);
+               flush_work(&cs35l56->sdw_irq_work);
                sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_MASK_1, 0);
                sdw_read_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1);
                sdw_write_no_pm(cs35l56->sdw_peripheral, CS35L56_SDW_GEN_INT_STAT_1, 0xFF);
+               flush_work(&cs35l56->sdw_irq_work);
        }
 
        ret = cs35l56_mbox_send(cs35l56, CS35L56_MBOX_CMD_SHUTDOWN);
index 00b6036..c293244 100644 (file)
@@ -53,6 +53,18 @@ static const struct reg_default ssm2602_reg[SSM2602_CACHEREGNUM] = {
        { .reg = 0x09, .def = 0x0000 }
 };
 
+/*
+ * ssm2602 register patch
+ * Workaround for playback distortions after power up: activates digital
+ * core, and then powers on output, DAC, and whole chip at the same time
+ */
+
+static const struct reg_sequence ssm2602_patch[] = {
+       { SSM2602_ACTIVE, 0x01 },
+       { SSM2602_PWR,    0x07 },
+       { SSM2602_RESET,  0x00 },
+};
+
 
 /*Appending several "None"s just for OSS mixer use*/
 static const char *ssm2602_input_select[] = {
@@ -598,6 +610,9 @@ static int ssm260x_component_probe(struct snd_soc_component *component)
                return ret;
        }
 
+       regmap_register_patch(ssm2602->regmap, ssm2602_patch,
+                             ARRAY_SIZE(ssm2602_patch));
+
        /* set the update bits */
        regmap_update_bits(ssm2602->regmap, SSM2602_LINVOL,
                            LINVOL_LRIN_BOTH, LINVOL_LRIN_BOTH);
index acdf98b..ca20cad 100644 (file)
@@ -132,13 +132,13 @@ static irqreturn_t i2s_irq_handler(int irq, void *dev_id)
 
                /* Error Handling: TX */
                if (isr[i] & ISR_TXFO) {
-                       dev_err(dev->dev, "TX overrun (ch_id=%d)\n", i);
+                       dev_err_ratelimited(dev->dev, "TX overrun (ch_id=%d)\n", i);
                        irq_valid = true;
                }
 
                /* Error Handling: TX */
                if (isr[i] & ISR_RXFO) {
-                       dev_err(dev->dev, "RX overrun (ch_id=%d)\n", i);
+                       dev_err_ratelimited(dev->dev, "RX overrun (ch_id=%d)\n", i);
                        irq_valid = true;
                }
        }
index 94341e4..3f08082 100644 (file)
@@ -1159,7 +1159,7 @@ static int fsl_micfil_probe(struct platform_device *pdev)
        ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
        if (ret) {
                dev_err(&pdev->dev, "failed to pcm register\n");
-               return ret;
+               goto err_pm_disable;
        }
 
        fsl_micfil_dai.capture.formats = micfil->soc->formats;
@@ -1169,9 +1169,20 @@ static int fsl_micfil_probe(struct platform_device *pdev)
        if (ret) {
                dev_err(&pdev->dev, "failed to register component %s\n",
                        fsl_micfil_component.name);
+               goto err_pm_disable;
        }
 
        return ret;
+
+err_pm_disable:
+       pm_runtime_disable(&pdev->dev);
+
+       return ret;
+}
+
+static void fsl_micfil_remove(struct platform_device *pdev)
+{
+       pm_runtime_disable(&pdev->dev);
 }
 
 static int __maybe_unused fsl_micfil_runtime_suspend(struct device *dev)
@@ -1232,6 +1243,7 @@ static const struct dev_pm_ops fsl_micfil_pm_ops = {
 
 static struct platform_driver fsl_micfil_driver = {
        .probe = fsl_micfil_probe,
+       .remove_new = fsl_micfil_remove,
        .driver = {
                .name = "fsl-micfil-dai",
                .pm = &fsl_micfil_pm_ops,
index 6d9cfe0..d0f6c94 100644 (file)
@@ -218,18 +218,48 @@ static int jz4740_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
        return 0;
 }
 
+static int jz4740_i2s_get_i2sdiv(unsigned long mclk, unsigned long rate,
+                                unsigned long i2sdiv_max)
+{
+       unsigned long div, rate1, rate2, err1, err2;
+
+       div = mclk / (64 * rate);
+       if (div == 0)
+               div = 1;
+
+       rate1 = mclk / (64 * div);
+       rate2 = mclk / (64 * (div + 1));
+
+       err1 = abs(rate1 - rate);
+       err2 = abs(rate2 - rate);
+
+       /*
+        * Choose the divider that produces the smallest error in the
+        * output rate and reject dividers with a 5% or higher error.
+        * In the event that both dividers are outside the acceptable
+        * error margin, reject the rate to prevent distorted audio.
+        * (The number 5% is arbitrary.)
+        */
+       if (div <= i2sdiv_max && err1 <= err2 && err1 < rate/20)
+               return div;
+       if (div < i2sdiv_max && err2 < rate/20)
+               return div + 1;
+
+       return -EINVAL;
+}
+
 static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
 {
        struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
        struct regmap_field *div_field;
+       unsigned long i2sdiv_max;
        unsigned int sample_size;
-       uint32_t ctrl;
-       int div;
+       uint32_t ctrl, conf;
+       int div = 1;
 
        regmap_read(i2s->regmap, JZ_REG_AIC_CTRL, &ctrl);
-
-       div = clk_get_rate(i2s->clk_i2s) / (64 * params_rate(params));
+       regmap_read(i2s->regmap, JZ_REG_AIC_CONF, &conf);
 
        switch (params_format(params)) {
        case SNDRV_PCM_FORMAT_S8:
@@ -258,11 +288,27 @@ static int jz4740_i2s_hw_params(struct snd_pcm_substream *substream,
                        ctrl &= ~JZ_AIC_CTRL_MONO_TO_STEREO;
 
                div_field = i2s->field_i2sdiv_playback;
+               i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_playback.msb,
+                                    i2s->soc_info->field_i2sdiv_playback.lsb);
        } else {
                ctrl &= ~JZ_AIC_CTRL_INPUT_SAMPLE_SIZE;
                ctrl |= FIELD_PREP(JZ_AIC_CTRL_INPUT_SAMPLE_SIZE, sample_size);
 
                div_field = i2s->field_i2sdiv_capture;
+               i2sdiv_max = GENMASK(i2s->soc_info->field_i2sdiv_capture.msb,
+                                    i2s->soc_info->field_i2sdiv_capture.lsb);
+       }
+
+       /*
+        * Only calculate I2SDIV if we're supplying the bit or frame clock.
+        * If the codec is supplying both clocks then the divider output is
+        * unused, and we don't want it to limit the allowed sample rates.
+        */
+       if (conf & (JZ_AIC_CONF_BIT_CLK_MASTER | JZ_AIC_CONF_SYNC_CLK_MASTER)) {
+               div = jz4740_i2s_get_i2sdiv(clk_get_rate(i2s->clk_i2s),
+                                           params_rate(params), i2sdiv_max);
+               if (div < 0)
+                       return div;
        }
 
        regmap_write(i2s->regmap, JZ_REG_AIC_CTRL, ctrl);
index a6b4f29..539e3a0 100644 (file)
@@ -644,9 +644,3 @@ int mt8186_init_clock(struct mtk_base_afe *afe)
 
        return 0;
 }
-
-void mt8186_deinit_clock(void *priv)
-{
-       struct mtk_base_afe *afe = priv;
-       mt8186_audsys_clk_unregister(afe);
-}
index d598871..a9d59e5 100644 (file)
@@ -81,7 +81,6 @@ enum {
 struct mtk_base_afe;
 int mt8186_set_audio_int_bus_parent(struct mtk_base_afe *afe, int clk_id);
 int mt8186_init_clock(struct mtk_base_afe *afe);
-void mt8186_deinit_clock(void *priv);
 int mt8186_afe_enable_cgs(struct mtk_base_afe *afe);
 void mt8186_afe_disable_cgs(struct mtk_base_afe *afe);
 int mt8186_afe_enable_clock(struct mtk_base_afe *afe);
index 41172a8..a868a04 100644 (file)
@@ -2848,10 +2848,6 @@ static int mt8186_afe_pcm_dev_probe(struct platform_device *pdev)
                return ret;
        }
 
-       ret = devm_add_action_or_reset(dev, mt8186_deinit_clock, (void *)afe);
-       if (ret)
-               return ret;
-
        /* init memif */
        afe->memif_32bit_supported = 0;
        afe->memif_size = MT8186_MEMIF_NUM;
index 578969c..5666be6 100644 (file)
@@ -84,6 +84,29 @@ static const struct afe_gate aud_clks[CLK_AUD_NR_CLK] = {
        GATE_AUD2(CLK_AUD_ETDM_OUT1_BCLK, "aud_etdm_out1_bclk", "top_audio", 24),
 };
 
+static void mt8186_audsys_clk_unregister(void *data)
+{
+       struct mtk_base_afe *afe = data;
+       struct mt8186_afe_private *afe_priv = afe->platform_priv;
+       struct clk *clk;
+       struct clk_lookup *cl;
+       int i;
+
+       if (!afe_priv)
+               return;
+
+       for (i = 0; i < CLK_AUD_NR_CLK; i++) {
+               cl = afe_priv->lookup[i];
+               if (!cl)
+                       continue;
+
+               clk = cl->clk;
+               clk_unregister_gate(clk);
+
+               clkdev_drop(cl);
+       }
+}
+
 int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
 {
        struct mt8186_afe_private *afe_priv = afe->platform_priv;
@@ -124,27 +147,6 @@ int mt8186_audsys_clk_register(struct mtk_base_afe *afe)
                afe_priv->lookup[i] = cl;
        }
 
-       return 0;
+       return devm_add_action_or_reset(afe->dev, mt8186_audsys_clk_unregister, afe);
 }
 
-void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe)
-{
-       struct mt8186_afe_private *afe_priv = afe->platform_priv;
-       struct clk *clk;
-       struct clk_lookup *cl;
-       int i;
-
-       if (!afe_priv)
-               return;
-
-       for (i = 0; i < CLK_AUD_NR_CLK; i++) {
-               cl = afe_priv->lookup[i];
-               if (!cl)
-                       continue;
-
-               clk = cl->clk;
-               clk_unregister_gate(clk);
-
-               clkdev_drop(cl);
-       }
-}
index b8d6a06..897a291 100644 (file)
@@ -10,6 +10,5 @@
 #define _MT8186_AUDSYS_CLK_H_
 
 int mt8186_audsys_clk_register(struct mtk_base_afe *afe);
-void mt8186_audsys_clk_unregister(struct mtk_base_afe *afe);
 
 #endif
index 4e0c48a..749e856 100644 (file)
@@ -209,7 +209,12 @@ int acp_sof_ipc_msg_data(struct snd_sof_dev *sdev, struct snd_sof_pcm_stream *sp
                acp_mailbox_read(sdev, offset, p, sz);
        } else {
                struct snd_pcm_substream *substream = sps->substream;
-               struct acp_dsp_stream *stream = substream->runtime->private_data;
+               struct acp_dsp_stream *stream;
+
+               if (!substream || !substream->runtime)
+                       return -ESTRPIPE;
+
+               stream = substream->runtime->private_data;
 
                if (!stream)
                        return -ESTRPIPE;
index b42b598..d547318 100644 (file)
@@ -438,8 +438,8 @@ void snd_sof_handle_fw_exception(struct snd_sof_dev *sdev, const char *msg)
                /* should we prevent DSP entering D3 ? */
                if (!sdev->ipc_dump_printed)
                        dev_info(sdev->dev,
-                                "preventing DSP entering D3 state to preserve context\n");
-               pm_runtime_get_noresume(sdev->dev);
+                                "Attempting to prevent DSP from entering D3 state to preserve context\n");
+               pm_runtime_get_if_in_use(sdev->dev);
        }
 
        /* dump vital information to the logs */
index 775582a..b7cbf66 100644 (file)
@@ -19,6 +19,9 @@
 
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_MLINK)
 
+/* worst-case number of sublinks is used for sublink refcount array allocation only */
+#define HDAML_MAX_SUBLINKS (AZX_ML_LCTL_CPA_SHIFT - AZX_ML_LCTL_SPA_SHIFT)
+
 /**
  * struct hdac_ext2_link - HDAudio extended+alternate link
  *
@@ -33,6 +36,7 @@
  * @leptr:             extended link pointer
  * @eml_lock:          mutual exclusion to access shared registers e.g. CPA/SPA bits
  * in LCTL register
+ * @sublink_ref_count: array of refcounts, required to power-manage sublinks independently
  * @base_ptr:          pointer to shim/ip/shim_vs space
  * @instance_offset:   offset between each of @slcount instances managed by link
  * @shim_offset:       offset to SHIM register base
@@ -53,6 +57,7 @@ struct hdac_ext2_link {
        u32 leptr;
 
        struct mutex eml_lock; /* prevent concurrent access to e.g. CPA/SPA */
+       int sublink_ref_count[HDAML_MAX_SUBLINKS];
 
        /* internal values computed from LCAP contents */
        void __iomem *base_ptr;
@@ -68,6 +73,7 @@ struct hdac_ext2_link {
 #define AZX_REG_SDW_SHIM_OFFSET                                0x0
 #define AZX_REG_SDW_IP_OFFSET                          0x100
 #define AZX_REG_SDW_VS_SHIM_OFFSET                     0x6000
+#define AZX_REG_SDW_SHIM_PCMSyCM(y)                    (0x16 + 0x4 * (y))
 
 /* only one instance supported */
 #define AZX_REG_INTEL_DMIC_SHIM_OFFSET                 0x0
@@ -91,7 +97,7 @@ struct hdac_ext2_link {
  */
 
 static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
-                         void __iomem *ml_addr, int link_idx)
+                         void __iomem *remap_addr, void __iomem *ml_addr, int link_idx)
 {
        struct hdac_ext_link *hlink = &h2link->hext_link;
        u32 base_offset;
@@ -126,15 +132,16 @@ static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
                link_idx, h2link->slcount);
 
        /* find IP ID and offsets */
-       h2link->leptr = readl(hlink->ml_addr + AZX_REG_ML_LEPTR);
+       h2link->leptr = readl(ml_addr + AZX_REG_ML_LEPTR);
 
        h2link->elid = FIELD_GET(AZX_REG_ML_LEPTR_ID, h2link->leptr);
 
        base_offset = FIELD_GET(AZX_REG_ML_LEPTR_PTR, h2link->leptr);
-       h2link->base_ptr = hlink->ml_addr + base_offset;
+       h2link->base_ptr = remap_addr + base_offset;
 
        switch (h2link->elid) {
        case AZX_REG_ML_LEPTR_ID_SDW:
+               h2link->instance_offset = AZX_REG_SDW_INSTANCE_OFFSET;
                h2link->shim_offset = AZX_REG_SDW_SHIM_OFFSET;
                h2link->ip_offset = AZX_REG_SDW_IP_OFFSET;
                h2link->shim_vs_offset = AZX_REG_SDW_VS_SHIM_OFFSET;
@@ -149,6 +156,7 @@ static int hdaml_lnk_enum(struct device *dev, struct hdac_ext2_link *h2link,
                        link_idx, base_offset);
                break;
        case AZX_REG_ML_LEPTR_ID_INTEL_SSP:
+               h2link->instance_offset = AZX_REG_INTEL_SSP_INSTANCE_OFFSET;
                h2link->shim_offset = AZX_REG_INTEL_SSP_SHIM_OFFSET;
                h2link->ip_offset = AZX_REG_INTEL_SSP_IP_OFFSET;
                h2link->shim_vs_offset = AZX_REG_INTEL_SSP_VS_SHIM_OFFSET;
@@ -333,6 +341,21 @@ static void hdaml_link_set_lsdiid(u32 __iomem *lsdiid, int dev_num)
        writel(val, lsdiid);
 }
 
+static void hdaml_shim_map_stream_ch(u16 __iomem *pcmsycm, int lchan, int hchan,
+                                    int stream_id, int dir)
+{
+       u16 val;
+
+       val = readw(pcmsycm);
+
+       u16p_replace_bits(&val, lchan, GENMASK(3, 0));
+       u16p_replace_bits(&val, hchan, GENMASK(7, 4));
+       u16p_replace_bits(&val, stream_id, GENMASK(13, 8));
+       u16p_replace_bits(&val, dir, BIT(15));
+
+       writew(val, pcmsycm);
+}
+
 static void hdaml_lctl_offload_enable(u32 __iomem *lctl, bool enable)
 {
        u32 val = readl(lctl);
@@ -364,7 +387,7 @@ static int hda_ml_alloc_h2link(struct hdac_bus *bus, int index)
        hlink->bus = bus;
        hlink->ml_addr = bus->mlcap + AZX_ML_BASE + (AZX_ML_INTERVAL * index);
 
-       ret = hdaml_lnk_enum(bus->dev, h2link, hlink->ml_addr, index);
+       ret = hdaml_lnk_enum(bus->dev, h2link, bus->remap_addr, hlink->ml_addr, index);
        if (ret < 0) {
                kfree(h2link);
                return ret;
@@ -641,8 +664,13 @@ static int hdac_bus_eml_power_up_base(struct hdac_bus *bus, bool alt, int elid,
        if (eml_lock)
                mutex_lock(&h2link->eml_lock);
 
-       if (++hlink->ref_count > 1)
-               goto skip_init;
+       if (!alt) {
+               if (++hlink->ref_count > 1)
+                       goto skip_init;
+       } else {
+               if (++h2link->sublink_ref_count[sublink] > 1)
+                       goto skip_init;
+       }
 
        ret = hdaml_link_init(hlink->ml_addr + AZX_REG_ML_LCTL, sublink);
 
@@ -684,9 +712,13 @@ static int hdac_bus_eml_power_down_base(struct hdac_bus *bus, bool alt, int elid
        if (eml_lock)
                mutex_lock(&h2link->eml_lock);
 
-       if (--hlink->ref_count > 0)
-               goto skip_shutdown;
-
+       if (!alt) {
+               if (--hlink->ref_count > 0)
+                       goto skip_shutdown;
+       } else {
+               if (--h2link->sublink_ref_count[sublink] > 0)
+                       goto skip_shutdown;
+       }
        ret = hdaml_link_shutdown(hlink->ml_addr + AZX_REG_ML_LCTL, sublink);
 
 skip_shutdown:
@@ -740,6 +772,40 @@ int hdac_bus_eml_sdw_set_lsdiid(struct hdac_bus *bus, int sublink, int dev_num)
        return 0;
 } EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_set_lsdiid, SND_SOC_SOF_HDA_MLINK);
 
+/*
+ * the 'y' parameter comes from the PCMSyCM hardware register naming. 'y' refers to the
+ * PDI index, i.e. the FIFO used for RX or TX
+ */
+int hdac_bus_eml_sdw_map_stream_ch(struct hdac_bus *bus, int sublink, int y,
+                                  int channel_mask, int stream_id, int dir)
+{
+       struct hdac_ext2_link *h2link;
+       u16 __iomem *pcmsycm;
+       u16 val;
+
+       h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
+       if (!h2link)
+               return -ENODEV;
+
+       pcmsycm = h2link->base_ptr + h2link->shim_offset +
+               h2link->instance_offset * sublink +
+               AZX_REG_SDW_SHIM_PCMSyCM(y);
+
+       mutex_lock(&h2link->eml_lock);
+
+       hdaml_shim_map_stream_ch(pcmsycm, 0, hweight32(channel_mask),
+                                stream_id, dir);
+
+       mutex_unlock(&h2link->eml_lock);
+
+       val = readw(pcmsycm);
+
+       dev_dbg(bus->dev, "channel_mask %#x stream_id %d dir %d pcmscm %#x\n",
+               channel_mask, stream_id, dir, val);
+
+       return 0;
+} EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_map_stream_ch, SND_SOC_SOF_HDA_MLINK);
+
 void hda_bus_ml_put_all(struct hdac_bus *bus)
 {
        struct hdac_ext_link *hlink;
@@ -836,6 +902,18 @@ struct hdac_ext_link *hdac_bus_eml_dmic_get_hlink(struct hdac_bus *bus)
 }
 EXPORT_SYMBOL_NS(hdac_bus_eml_dmic_get_hlink, SND_SOC_SOF_HDA_MLINK);
 
+struct hdac_ext_link *hdac_bus_eml_sdw_get_hlink(struct hdac_bus *bus)
+{
+       struct hdac_ext2_link *h2link;
+
+       h2link = find_ext2_link(bus, true, AZX_REG_ML_LEPTR_ID_SDW);
+       if (!h2link)
+               return NULL;
+
+       return &h2link->hext_link;
+}
+EXPORT_SYMBOL_NS(hdac_bus_eml_sdw_get_hlink, SND_SOC_SOF_HDA_MLINK);
+
 int hdac_bus_eml_enable_offload(struct hdac_bus *bus, bool alt, int elid, bool enable)
 {
        struct hdac_ext2_link *h2link;
index fc1eb8e..ba4ef29 100644 (file)
@@ -2103,10 +2103,13 @@ static int sof_ipc3_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *
         * For the case of PAUSE/HW_FREE, since there are no quirks, flags can be used as is.
         */
 
-       if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS)
+       if (flags & SOF_DAI_CONFIG_FLAGS_HW_PARAMS) {
+               /* Clear stale command */
+               config->flags &= ~SOF_DAI_CONFIG_FLAGS_CMD_MASK;
                config->flags |= flags;
-       else
+       } else {
                config->flags = flags;
+       }
 
        /* only send the IPC if the widget is set up in the DSP */
        if (swidget->use_count > 0) {
index 059eebf..5abe616 100644 (file)
@@ -59,7 +59,7 @@ static const struct sof_topology_token ipc4_in_audio_format_tokens[] = {
                audio_fmt.interleaving_style)},
        {SOF_TKN_CAVS_AUDIO_FORMAT_IN_FMT_CFG, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, audio_fmt.fmt_cfg)},
-       {SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+       {SOF_TKN_CAVS_AUDIO_FORMAT_INPUT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, pin_index)},
        {SOF_TKN_CAVS_AUDIO_FORMAT_IBS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, buffer_size)},
@@ -79,7 +79,7 @@ static const struct sof_topology_token ipc4_out_audio_format_tokens[] = {
                audio_fmt.interleaving_style)},
        {SOF_TKN_CAVS_AUDIO_FORMAT_OUT_FMT_CFG, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, audio_fmt.fmt_cfg)},
-       {SOF_TKN_CAVS_AUDIO_FORMAT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
+       {SOF_TKN_CAVS_AUDIO_FORMAT_OUTPUT_PIN_INDEX, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, pin_index)},
        {SOF_TKN_CAVS_AUDIO_FORMAT_OBS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
                offsetof(struct sof_ipc4_pin_format, buffer_size)},
index 567db32..d0ab6f3 100644 (file)
@@ -643,16 +643,17 @@ static int sof_pcm_probe(struct snd_soc_component *component)
                                       "%s/%s",
                                       plat_data->tplg_filename_prefix,
                                       plat_data->tplg_filename);
-       if (!tplg_filename)
-               return -ENOMEM;
+       if (!tplg_filename) {
+               ret = -ENOMEM;
+               goto pm_error;
+       }
 
        ret = snd_sof_load_topology(component, tplg_filename);
-       if (ret < 0) {
+       if (ret < 0)
                dev_err(component->dev, "error: failed to load DSP topology %d\n",
                        ret);
-               return ret;
-       }
 
+pm_error:
        pm_runtime_mark_last_busy(component->dev);
        pm_runtime_put_autosuspend(component->dev);
 
index 2fdbc53..2b23244 100644 (file)
@@ -164,7 +164,7 @@ static int sof_resume(struct device *dev, bool runtime_resume)
                ret = tplg_ops->set_up_all_pipelines(sdev, false);
                if (ret < 0) {
                        dev_err(sdev->dev, "Failed to restore pipeline after resume %d\n", ret);
-                       return ret;
+                       goto setup_fail;
                }
        }
 
@@ -178,6 +178,18 @@ static int sof_resume(struct device *dev, bool runtime_resume)
                        dev_err(sdev->dev, "ctx_restore IPC error during resume: %d\n", ret);
        }
 
+setup_fail:
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_DEBUG_ENABLE_DEBUGFS_CACHE)
+       if (ret < 0) {
+               /*
+                * Debugfs cannot be read in runtime suspend, so cache
+                * the contents upon failure. This allows to capture
+                * possible DSP coredump information.
+                */
+               sof_cache_debugfs(sdev);
+       }
+#endif
+
        return ret;
 }
 
index fff1268..8d9e9d5 100644 (file)
@@ -218,12 +218,7 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to,
 
        ret = ipc->points_info(cdev, &desc, &num_desc);
        if (ret < 0)
-               goto exit;
-
-       pm_runtime_mark_last_busy(dev);
-       err = pm_runtime_put_autosuspend(dev);
-       if (err < 0)
-               dev_err_ratelimited(dev, "debugfs read failed to idle %d\n", err);
+               goto pm_error;
 
        for (i = 0; i < num_desc; i++) {
                offset = strlen(buf);
@@ -241,6 +236,13 @@ static ssize_t sof_probes_dfs_points_read(struct file *file, char __user *to,
        ret = simple_read_from_buffer(to, count, ppos, buf, strlen(buf));
 
        kfree(desc);
+
+pm_error:
+       pm_runtime_mark_last_busy(dev);
+       err = pm_runtime_put_autosuspend(dev);
+       if (err < 0)
+               dev_err_ratelimited(dev, "debugfs read failed to idle %d\n", err);
+
 exit:
        kfree(buf);
        return ret;
index d3d536b..f160dc4 100644 (file)
@@ -586,6 +586,10 @@ static int sof_copy_tuples(struct snd_sof_dev *sdev, struct snd_soc_tplg_vendor_
                                if (*num_copied_tuples == tuples_size)
                                        return 0;
                        }
+
+                       /* stop when we've found the required token instances */
+                       if (found == num_tokens * token_instance_num)
+                               return 0;
                }
 
                /* next array */
@@ -1261,7 +1265,7 @@ static int sof_widget_parse_tokens(struct snd_soc_component *scomp, struct snd_s
                if (num_sets > 1) {
                        struct snd_sof_tuple *new_tuples;
 
-                       num_tuples += token_list[object_token_list[i]].count * num_sets;
+                       num_tuples += token_list[object_token_list[i]].count * (num_sets - 1);
                        new_tuples = krealloc(swidget->tuples,
                                              sizeof(*new_tuples) * num_tuples, GFP_KERNEL);
                        if (!new_tuples) {
index 4b1c5ba..ab5fed9 100644 (file)
@@ -423,6 +423,7 @@ static int line6_parse_audio_format_rates_quirk(struct snd_usb_audio *chip,
        case USB_ID(0x0e41, 0x4248): /* Line6 Helix >= fw 2.82 */
        case USB_ID(0x0e41, 0x4249): /* Line6 Helix Rack >= fw 2.82 */
        case USB_ID(0x0e41, 0x424a): /* Line6 Helix LT >= fw 2.82 */
+       case USB_ID(0x0e41, 0x424b): /* Line6 Pod Go */
        case USB_ID(0x19f7, 0x0011): /* Rode Rodecaster Pro */
                return set_fixed_rate(fp, 48000, SNDRV_PCM_RATE_48000);
        }
index 0ce29ee..a7a59c6 100644 (file)
@@ -40,25 +40,34 @@ static int sysfs_get_enabled(char *path, int *mode)
 {
        int fd;
        char yes_no;
+       int ret = 0;
 
        *mode = 0;
 
        fd = open(path, O_RDONLY);
-       if (fd == -1)
-               return -1;
+       if (fd == -1) {
+               ret = -1;
+               goto out;
+       }
 
        if (read(fd, &yes_no, 1) != 1) {
-               close(fd);
-               return -1;
+               ret = -1;
+               goto out_close;
        }
 
        if (yes_no == '1') {
                *mode = 1;
-               return 0;
+               goto out_close;
        } else if (yes_no == '0') {
-               return 0;
+               goto out_close;
+       } else {
+               ret = -1;
+               goto out_close;
        }
-       return -1;
+out_close:
+       close(fd);
+out:
+       return ret;
 }
 
 int powercap_get_enabled(int *mode)
index e7d48cb..ae6af35 100644 (file)
@@ -70,8 +70,8 @@ static int max_freq_mode;
  */
 static unsigned long max_frequency;
 
-static unsigned long long tsc_at_measure_start;
-static unsigned long long tsc_at_measure_end;
+static unsigned long long *tsc_at_measure_start;
+static unsigned long long *tsc_at_measure_end;
 static unsigned long long *mperf_previous_count;
 static unsigned long long *aperf_previous_count;
 static unsigned long long *mperf_current_count;
@@ -169,7 +169,7 @@ static int mperf_get_count_percent(unsigned int id, double *percent,
        aperf_diff = aperf_current_count[cpu] - aperf_previous_count[cpu];
 
        if (max_freq_mode == MAX_FREQ_TSC_REF) {
-               tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
+               tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
                *percent = 100.0 * mperf_diff / tsc_diff;
                dprint("%s: TSC Ref - mperf_diff: %llu, tsc_diff: %llu\n",
                       mperf_cstates[id].name, mperf_diff, tsc_diff);
@@ -206,7 +206,7 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
 
        if (max_freq_mode == MAX_FREQ_TSC_REF) {
                /* Calculate max_freq from TSC count */
-               tsc_diff = tsc_at_measure_end - tsc_at_measure_start;
+               tsc_diff = tsc_at_measure_end[cpu] - tsc_at_measure_start[cpu];
                time_diff = timespec_diff_us(time_start, time_end);
                max_frequency = tsc_diff / time_diff;
        }
@@ -225,33 +225,27 @@ static int mperf_get_count_freq(unsigned int id, unsigned long long *count,
 static int mperf_start(void)
 {
        int cpu;
-       unsigned long long dbg;
 
        clock_gettime(CLOCK_REALTIME, &time_start);
-       mperf_get_tsc(&tsc_at_measure_start);
 
-       for (cpu = 0; cpu < cpu_count; cpu++)
+       for (cpu = 0; cpu < cpu_count; cpu++) {
+               mperf_get_tsc(&tsc_at_measure_start[cpu]);
                mperf_init_stats(cpu);
+       }
 
-       mperf_get_tsc(&dbg);
-       dprint("TSC diff: %llu\n", dbg - tsc_at_measure_start);
        return 0;
 }
 
 static int mperf_stop(void)
 {
-       unsigned long long dbg;
        int cpu;
 
-       for (cpu = 0; cpu < cpu_count; cpu++)
+       for (cpu = 0; cpu < cpu_count; cpu++) {
                mperf_measure_stats(cpu);
+               mperf_get_tsc(&tsc_at_measure_end[cpu]);
+       }
 
-       mperf_get_tsc(&tsc_at_measure_end);
        clock_gettime(CLOCK_REALTIME, &time_end);
-
-       mperf_get_tsc(&dbg);
-       dprint("TSC diff: %llu\n", dbg - tsc_at_measure_end);
-
        return 0;
 }
 
@@ -353,7 +347,8 @@ struct cpuidle_monitor *mperf_register(void)
        aperf_previous_count = calloc(cpu_count, sizeof(unsigned long long));
        mperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
        aperf_current_count = calloc(cpu_count, sizeof(unsigned long long));
-
+       tsc_at_measure_start = calloc(cpu_count, sizeof(unsigned long long));
+       tsc_at_measure_end = calloc(cpu_count, sizeof(unsigned long long));
        mperf_monitor.name_len = strlen(mperf_monitor.name);
        return &mperf_monitor;
 }
@@ -364,6 +359,8 @@ void mperf_unregister(void)
        free(aperf_previous_count);
        free(mperf_current_count);
        free(aperf_current_count);
+       free(tsc_at_measure_start);
+       free(tsc_at_measure_end);
        free(is_valid);
 }
 
index c4e53f2..de3933a 100644 (file)
@@ -19,7 +19,7 @@ void register_cxl_mock_ops(struct cxl_mock_ops *ops)
 }
 EXPORT_SYMBOL_GPL(register_cxl_mock_ops);
 
-static DEFINE_SRCU(cxl_mock_srcu);
+DEFINE_STATIC_SRCU(cxl_mock_srcu);
 
 void unregister_cxl_mock_ops(struct cxl_mock_ops *ops)
 {
index db29a31..607ba5c 100755 (executable)
@@ -6,6 +6,7 @@
 ALL_TESTS="
        prio
        arp_validate
+       num_grat_arp
 "
 
 REQUIRE_MZ=no
@@ -255,6 +256,55 @@ arp_validate()
        arp_validate_ns "active-backup"
 }
 
+garp_test()
+{
+       local param="$1"
+       local active_slave exp_num real_num i
+       RET=0
+
+       # create bond
+       bond_reset "${param}"
+
+       bond_check_connection
+       [ $RET -ne 0 ] && log_test "num_grat_arp" "$retmsg"
+
+
+       # Add tc rules to count GARP number
+       for i in $(seq 0 2); do
+               tc -n ${g_ns} filter add dev s$i ingress protocol arp pref 1 handle 101 \
+                       flower skip_hw arp_op request arp_sip ${s_ip4} arp_tip ${s_ip4} action pass
+       done
+
+       # Do failover
+       active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")
+       ip -n ${s_ns} link set ${active_slave} down
+
+       exp_num=$(echo "${param}" | cut -f6 -d ' ')
+       sleep $((exp_num + 2))
+
+       active_slave=$(cmd_jq "ip -n ${s_ns} -d -j link show bond0" ".[].linkinfo.info_data.active_slave")
+
+       # check result
+       real_num=$(tc_rule_handle_stats_get "dev s${active_slave#eth} ingress" 101 ".packets" "-n ${g_ns}")
+       if [ "${real_num}" -ne "${exp_num}" ]; then
+               echo "$real_num garp packets sent on active slave ${active_slave}"
+               RET=1
+       fi
+
+       for i in $(seq 0 2); do
+               tc -n ${g_ns} filter del dev s$i ingress
+       done
+}
+
+num_grat_arp()
+{
+       local val
+       for val in 10 20 30 50; do
+               garp_test "mode active-backup miimon 100 num_grat_arp $val peer_notify_delay 1000"
+               log_test "num_grat_arp" "active-backup miimon num_grat_arp $val"
+       done
+}
+
 trap cleanup EXIT
 
 setup_prepare
index 4045ca9..69ab99a 100644 (file)
@@ -61,6 +61,8 @@ server_create()
                ip -n ${g_ns} link set s${i} up
                ip -n ${g_ns} link set s${i} master br0
                ip -n ${s_ns} link set eth${i} master bond0
+
+               tc -n ${g_ns} qdisc add dev s${i} clsact
        done
 
        ip -n ${s_ns} link set bond0 up
index d6e106f..a1e955d 100644 (file)
@@ -1,7 +1,8 @@
 # SPDX-License-Identifier: GPL-2.0
 all:
 
-TEST_PROGS := ftracetest
+TEST_PROGS_EXTENDED := ftracetest
+TEST_PROGS := ftracetest-ktap
 TEST_FILES := test.d settings
 EXTRA_CLEAN := $(OUTPUT)/logs/*
 
index c3311c8..2506621 100755 (executable)
@@ -13,6 +13,7 @@ echo "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]"
 echo " Options:"
 echo "         -h|--help  Show help message"
 echo "         -k|--keep  Keep passed test logs"
+echo "         -K|--ktap  Output in KTAP format"
 echo "         -v|--verbose Increase verbosity of test messages"
 echo "         -vv        Alias of -v -v (Show all results in stdout)"
 echo "         -vvv       Alias of -v -v -v (Show all commands immediately)"
@@ -85,6 +86,10 @@ parse_opts() { # opts
       KEEP_LOG=1
       shift 1
     ;;
+    --ktap|-K)
+      KTAP=1
+      shift 1
+    ;;
     --verbose|-v|-vv|-vvv)
       if [ $VERBOSE -eq -1 ]; then
        usage "--console can not use with --verbose"
@@ -178,6 +183,7 @@ TEST_DIR=$TOP_DIR/test.d
 TEST_CASES=`find_testcases $TEST_DIR`
 LOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/
 KEEP_LOG=0
+KTAP=0
 DEBUG=0
 VERBOSE=0
 UNSUPPORTED_RESULT=0
@@ -229,7 +235,7 @@ prlog() { # messages
     newline=
     shift
   fi
-  printf "$*$newline"
+  [ "$KTAP" != "1" ] && printf "$*$newline"
   [ "$LOG_FILE" ] && printf "$*$newline" | strip_esc >> $LOG_FILE
 }
 catlog() { #file
@@ -260,11 +266,11 @@ TOTAL_RESULT=0
 
 INSTANCE=
 CASENO=0
+CASENAME=
 
 testcase() { # testfile
   CASENO=$((CASENO+1))
-  desc=`grep "^#[ \t]*description:" $1 | cut -f2- -d:`
-  prlog -n "[$CASENO]$INSTANCE$desc"
+  CASENAME=`grep "^#[ \t]*description:" $1 | cut -f2- -d:`
 }
 
 checkreq() { # testfile
@@ -277,40 +283,68 @@ test_on_instance() { # testfile
   grep -q "^#[ \t]*flags:.*instance" $1
 }
 
+ktaptest() { # result comment
+  if [ "$KTAP" != "1" ]; then
+    return
+  fi
+
+  local result=
+  if [ "$1" = "1" ]; then
+    result="ok"
+  else
+    result="not ok"
+  fi
+  shift
+
+  local comment=$*
+  if [ "$comment" != "" ]; then
+    comment="# $comment"
+  fi
+
+  echo $CASENO $result $INSTANCE$CASENAME $comment
+}
+
 eval_result() { # sigval
   case $1 in
     $PASS)
       prlog "  [${color_green}PASS${color_reset}]"
+      ktaptest 1
       PASSED_CASES="$PASSED_CASES $CASENO"
       return 0
     ;;
     $FAIL)
       prlog "  [${color_red}FAIL${color_reset}]"
+      ktaptest 0
       FAILED_CASES="$FAILED_CASES $CASENO"
       return 1 # this is a bug.
     ;;
     $UNRESOLVED)
       prlog "  [${color_blue}UNRESOLVED${color_reset}]"
+      ktaptest 0 UNRESOLVED
       UNRESOLVED_CASES="$UNRESOLVED_CASES $CASENO"
       return $UNRESOLVED_RESULT # depends on use case
     ;;
     $UNTESTED)
       prlog "  [${color_blue}UNTESTED${color_reset}]"
+      ktaptest 1 SKIP
       UNTESTED_CASES="$UNTESTED_CASES $CASENO"
       return 0
     ;;
     $UNSUPPORTED)
       prlog "  [${color_blue}UNSUPPORTED${color_reset}]"
+      ktaptest 1 SKIP
       UNSUPPORTED_CASES="$UNSUPPORTED_CASES $CASENO"
       return $UNSUPPORTED_RESULT # depends on use case
     ;;
     $XFAIL)
       prlog "  [${color_green}XFAIL${color_reset}]"
+      ktaptest 1 XFAIL
       XFAILED_CASES="$XFAILED_CASES $CASENO"
       return 0
     ;;
     *)
       prlog "  [${color_blue}UNDEFINED${color_reset}]"
+      ktaptest 0 error
       UNDEFINED_CASES="$UNDEFINED_CASES $CASENO"
       return 1 # this must be a test bug
     ;;
@@ -371,6 +405,7 @@ __run_test() { # testfile
 run_test() { # testfile
   local testname=`basename $1`
   testcase $1
+  prlog -n "[$CASENO]$INSTANCE$CASENAME"
   if [ ! -z "$LOG_FILE" ] ; then
     local testlog=`mktemp $LOG_DIR/${CASENO}-${testname}-log.XXXXXX`
   else
@@ -405,6 +440,17 @@ run_test() { # testfile
 # load in the helper functions
 . $TEST_DIR/functions
 
+if [ "$KTAP" = "1" ]; then
+  echo "TAP version 13"
+
+  casecount=`echo $TEST_CASES | wc -w`
+  for t in $TEST_CASES; do
+    test_on_instance $t || continue
+    casecount=$((casecount+1))
+  done
+  echo "1..${casecount}"
+fi
+
 # Main loop
 for t in $TEST_CASES; do
   run_test $t
@@ -439,6 +485,17 @@ prlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w`
 prlog "# of xfailed: " `echo $XFAILED_CASES | wc -w`
 prlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w`
 
+if [ "$KTAP" = "1" ]; then
+  echo -n "# Totals:"
+  echo -n " pass:"`echo $PASSED_CASES | wc -w`
+  echo -n " faii:"`echo $FAILED_CASES | wc -w`
+  echo -n " xfail:"`echo $XFAILED_CASES | wc -w`
+  echo -n " xpass:0"
+  echo -n " skip:"`echo $UNTESTED_CASES $UNSUPPORTED_CASES | wc -w`
+  echo -n " error:"`echo $UNRESOLVED_CASES $UNDEFINED_CASES | wc -w`
+  echo
+fi
+
 cleanup
 
 # if no error, return 0
diff --git a/tools/testing/selftests/ftrace/ftracetest-ktap b/tools/testing/selftests/ftrace/ftracetest-ktap
new file mode 100755 (executable)
index 0000000..b328467
--- /dev/null
@@ -0,0 +1,8 @@
+#!/bin/sh -e
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# ftracetest-ktap: Wrapper to integrate ftracetest with the kselftest runner
+#
+# Copyright (C) Arm Ltd., 2023
+
+./ftracetest -K
index a47b26a..0f5e88c 100755 (executable)
@@ -2283,7 +2283,7 @@ EOF
 ################################################################################
 # main
 
-while getopts :t:pP46hv:w: o
+while getopts :t:pP46hvw: o
 do
        case $o in
                t) TESTS=$OPTARG;;
index 057c3d0..9ddb68d 100755 (executable)
@@ -791,8 +791,9 @@ tc_rule_handle_stats_get()
        local id=$1; shift
        local handle=$1; shift
        local selector=${1:-.packets}; shift
+       local netns=${1:-""}; shift
 
-       tc -j -s filter show $id \
+       tc $netns -j -s filter show $id \
            | jq ".[] | select(.options.handle == $handle) | \
                  .options.actions[0].stats$selector"
 }
index 1003119..f962823 100755 (executable)
@@ -232,10 +232,14 @@ setup_rt_networking()
        local nsname=rt-${rt}
 
        ip netns add ${nsname}
+
+       ip netns exec ${nsname} sysctl -wq net.ipv6.conf.all.accept_dad=0
+       ip netns exec ${nsname} sysctl -wq net.ipv6.conf.default.accept_dad=0
+
        ip link set veth-rt-${rt} netns ${nsname}
        ip -netns ${nsname} link set veth-rt-${rt} name veth0
 
-       ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0
+       ip -netns ${nsname} addr add ${IPv6_RT_NETWORK}::${rt}/64 dev veth0 nodad
        ip -netns ${nsname} link set veth0 up
        ip -netns ${nsname} link set lo up
 
@@ -254,6 +258,12 @@ setup_hs()
 
        # set the networking for the host
        ip netns add ${hsname}
+
+       # disable the rp_filter otherwise the kernel gets confused about how
+       # to route decap ipv4 packets.
+       ip netns exec ${rtname} sysctl -wq net.ipv4.conf.all.rp_filter=0
+       ip netns exec ${rtname} sysctl -wq net.ipv4.conf.default.rp_filter=0
+
        ip -netns ${hsname} link add veth0 type veth peer name ${rtveth}
        ip -netns ${hsname} link set ${rtveth} netns ${rtname}
        ip -netns ${hsname} addr add ${IPv4_HS_NETWORK}.${hs}/24 dev veth0
@@ -272,11 +282,6 @@ setup_hs()
 
        ip netns exec ${rtname} sysctl -wq net.ipv4.conf.${rtveth}.proxy_arp=1
 
-       # disable the rp_filter otherwise the kernel gets confused about how
-       # to route decap ipv4 packets.
-       ip netns exec ${rtname} sysctl -wq net.ipv4.conf.all.rp_filter=0
-       ip netns exec ${rtname} sysctl -wq net.ipv4.conf.${rtveth}.rp_filter=0
-
        ip netns exec ${rtname} sh -c "echo 1 > /proc/sys/net/vrf/strict_mode"
 }
 
index 7060bae..a32f490 100755 (executable)
@@ -188,6 +188,26 @@ if [ $? -ne 0 ]; then
        exit $ksft_skip
 fi
 
+ip netns exec $ns2 nft -f - <<EOF
+table inet filter {
+   counter ip4dscp0 { }
+   counter ip4dscp3 { }
+
+   chain input {
+      type filter hook input priority 0; policy accept;
+      meta l4proto tcp goto {
+             ip dscp cs3 counter name ip4dscp3 accept
+             ip dscp 0 counter name ip4dscp0 accept
+      }
+   }
+}
+EOF
+
+if [ $? -ne 0 ]; then
+       echo "SKIP: Could not load nft ruleset"
+       exit $ksft_skip
+fi
+
 # test basic connectivity
 if ! ip netns exec $ns1 ping -c 1 -q 10.0.2.99 > /dev/null; then
   echo "ERROR: $ns1 cannot reach ns2" 1>&2
@@ -255,6 +275,60 @@ check_counters()
        fi
 }
 
+check_dscp()
+{
+       local what=$1
+       local ok=1
+
+       local counter=$(ip netns exec $ns2 nft reset counter inet filter ip4dscp3 | grep packets)
+
+       local pc4=${counter%*bytes*}
+       local pc4=${pc4#*packets}
+
+       local counter=$(ip netns exec $ns2 nft reset counter inet filter ip4dscp0 | grep packets)
+       local pc4z=${counter%*bytes*}
+       local pc4z=${pc4z#*packets}
+
+       case "$what" in
+       "dscp_none")
+               if [ $pc4 -gt 0 ] || [ $pc4z -eq 0 ]; then
+                       echo "FAIL: dscp counters do not match, expected dscp3 == 0, dscp0 > 0, but got $pc4,$pc4z" 1>&2
+                       ret=1
+                       ok=0
+               fi
+               ;;
+       "dscp_fwd")
+               if [ $pc4 -eq 0 ] || [ $pc4z -eq 0 ]; then
+                       echo "FAIL: dscp counters do not match, expected dscp3 and dscp0 > 0 but got $pc4,$pc4z" 1>&2
+                       ret=1
+                       ok=0
+               fi
+               ;;
+       "dscp_ingress")
+               if [ $pc4 -eq 0 ] || [ $pc4z -gt 0 ]; then
+                       echo "FAIL: dscp counters do not match, expected dscp3 > 0, dscp0 == 0 but got $pc4,$pc4z" 1>&2
+                       ret=1
+                       ok=0
+               fi
+               ;;
+       "dscp_egress")
+               if [ $pc4 -eq 0 ] || [ $pc4z -gt 0 ]; then
+                       echo "FAIL: dscp counters do not match, expected dscp3 > 0, dscp0 == 0 but got $pc4,$pc4z" 1>&2
+                       ret=1
+                       ok=0
+               fi
+               ;;
+       *)
+               echo "FAIL: Unknown DSCP check" 1>&2
+               ret=1
+               ok=0
+       esac
+
+       if [ $ok -eq 1 ] ;then
+               echo "PASS: $what: dscp packet counters match"
+       fi
+}
+
 check_transfer()
 {
        in=$1
@@ -286,17 +360,26 @@ test_tcp_forwarding_ip()
        ip netns exec $nsa nc -w 4 "$dstip" "$dstport" < "$nsin" > "$ns1out" &
        cpid=$!
 
-       sleep 3
+       sleep 1
 
-       if ps -p $lpid > /dev/null;then
+       prev="$(ls -l $ns1out $ns2out)"
+       sleep 1
+
+       while [[ "$prev" != "$(ls -l $ns1out $ns2out)" ]]; do
+               sleep 1;
+               prev="$(ls -l $ns1out $ns2out)"
+       done
+
+       if test -d /proc/"$lpid"/; then
                kill $lpid
        fi
 
-       if ps -p $cpid > /dev/null;then
+       if test -d /proc/"$cpid"/; then
                kill $cpid
        fi
 
-       wait
+       wait $lpid
+       wait $cpid
 
        if ! check_transfer "$nsin" "$ns2out" "ns1 -> ns2"; then
                lret=1
@@ -316,6 +399,51 @@ test_tcp_forwarding()
        return $?
 }
 
+test_tcp_forwarding_set_dscp()
+{
+       check_dscp "dscp_none"
+
+ip netns exec $nsr1 nft -f - <<EOF
+table netdev dscpmangle {
+   chain setdscp0 {
+      type filter hook ingress device "veth0" priority 0; policy accept
+       ip dscp set cs3
+  }
+}
+EOF
+if [ $? -eq 0 ]; then
+       test_tcp_forwarding_ip "$1" "$2"  10.0.2.99 12345
+       check_dscp "dscp_ingress"
+
+       ip netns exec $nsr1 nft delete table netdev dscpmangle
+else
+       echo "SKIP: Could not load netdev:ingress for veth0"
+fi
+
+ip netns exec $nsr1 nft -f - <<EOF
+table netdev dscpmangle {
+   chain setdscp0 {
+      type filter hook egress device "veth1" priority 0; policy accept
+      ip dscp set cs3
+  }
+}
+EOF
+if [ $? -eq 0 ]; then
+       test_tcp_forwarding_ip "$1" "$2"  10.0.2.99 12345
+       check_dscp "dscp_egress"
+
+       ip netns exec $nsr1 nft flush table netdev dscpmangle
+else
+       echo "SKIP: Could not load netdev:egress for veth1"
+fi
+
+       # partial.  If flowtable really works, then both dscp-is-0 and dscp-is-cs3
+       # counters should have seen packets (before and after ft offload kicks in).
+       ip netns exec $nsr1 nft -a insert rule inet filter forward ip dscp set cs3
+       test_tcp_forwarding_ip "$1" "$2"  10.0.2.99 12345
+       check_dscp "dscp_fwd"
+}
+
 test_tcp_forwarding_nat()
 {
        local lret
@@ -385,6 +513,11 @@ table ip nat {
 }
 EOF
 
+if ! test_tcp_forwarding_set_dscp $ns1 $ns2 0 ""; then
+       echo "FAIL: flow offload for ns1/ns2 with dscp update" 1>&2
+       exit 0
+fi
+
 if ! test_tcp_forwarding_nat $ns1 $ns2 0 ""; then
        echo "FAIL: flow offload for ns1/ns2 with NAT" 1>&2
        ip netns exec $nsr1 nft list ruleset
@@ -489,8 +622,8 @@ ip -net $nsr1 addr add 10.0.1.1/24 dev veth0
 ip -net $nsr1 addr add dead:1::1/64 dev veth0
 ip -net $nsr1 link set up dev veth0
 
-KEY_SHA="0x"$(ps -xaf | sha1sum | cut -d " " -f 1)
-KEY_AES="0x"$(ps -xaf | md5sum | cut -d " " -f 1)
+KEY_SHA="0x"$(ps -af | sha1sum | cut -d " " -f 1)
+KEY_AES="0x"$(ps -af | md5sum | cut -d " " -f 1)
 SPI1=$RANDOM
 SPI2=$RANDOM
 
index 75af864..50aab6b 100644 (file)
@@ -17,6 +17,7 @@ ENCL_CFLAGS := -Wall -Werror -static -nostdlib -nostartfiles -fPIC \
               -fno-stack-protector -mrdrnd $(INCLUDES)
 
 TEST_CUSTOM_PROGS := $(OUTPUT)/test_sgx
+TEST_FILES := $(OUTPUT)/test_encl.elf
 
 ifeq ($(CAN_BUILD_X86_64), 1)
 all: $(TEST_CUSTOM_PROGS) $(OUTPUT)/test_encl.elf