Merge tag 'sched_urgent_for_v6.1_rc6' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 20 Nov 2022 18:43:52 +0000 (10:43 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 20 Nov 2022 18:43:52 +0000 (10:43 -0800)
Pull scheduler fixes from Borislav Petkov:

 - Fix a small race on the task's exit path where there's a
   misunderstanding whether the task holds rq->lock or not

 - Prevent processes from getting killed when using deprecated or
   unknown rseq ABI flags in order to be able to fuzz the rseq() syscall
   with syzkaller

* tag 'sched_urgent_for_v6.1_rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  sched: Fix race in task_call_func()
  rseq: Use pr_warn_once() when deprecated/unknown ABI flags are encountered

301 files changed:
.mailmap
CREDITS
Documentation/devicetree/bindings/input/goodix,gt7375p.yaml
Documentation/devicetree/bindings/sound/google,cros-ec-codec.yaml
Documentation/devicetree/bindings/sound/realtek,rt1015p.yaml
Documentation/driver-api/miscellaneous.rst
Documentation/process/code-of-conduct-interpretation.rst
MAINTAINERS
arch/arm/boot/dts/imx7s.dtsi
arch/arm/boot/dts/lan966x-pcb8291.dts
arch/arm/boot/dts/sama7g5-pinfunc.h
arch/arm/mach-at91/pm_suspend.S
arch/arm64/boot/dts/freescale/imx8mm-tqma8mqml-mba8mx.dts
arch/arm64/boot/dts/freescale/imx8mm.dtsi
arch/arm64/boot/dts/freescale/imx8mn.dtsi
arch/arm64/boot/dts/freescale/imx93-pinfunc.h [changed mode: 0755->0644]
arch/arm64/boot/dts/qcom/ipq8074.dtsi
arch/arm64/boot/dts/qcom/msm8996.dtsi
arch/arm64/boot/dts/qcom/sa8155p-adp.dts
arch/arm64/boot/dts/qcom/sa8295p-adp.dts
arch/arm64/boot/dts/qcom/sc7280.dtsi
arch/arm64/boot/dts/qcom/sc8280xp-crd.dts
arch/arm64/boot/dts/qcom/sc8280xp.dtsi
arch/arm64/boot/dts/qcom/sm8150-sony-xperia-kumano.dtsi
arch/arm64/boot/dts/qcom/sm8250-sony-xperia-edo.dtsi
arch/arm64/boot/dts/qcom/sm8250.dtsi
arch/arm64/boot/dts/qcom/sm8350-hdk.dts
arch/arm64/include/asm/pgtable.h
arch/arm64/kernel/entry-ftrace.S
arch/powerpc/kernel/vmlinux.lds.S
arch/s390/include/asm/processor.h
arch/x86/events/amd/core.c
arch/x86/events/amd/uncore.c
arch/x86/events/intel/pt.c
arch/x86/include/asm/msr-index.h
arch/x86/include/asm/qspinlock_paravirt.h
arch/x86/kernel/cpu/amd.c
arch/x86/kernel/cpu/hygon.c
arch/x86/kvm/svm/svm.c
arch/x86/kvm/x86.c
arch/x86/net/bpf_jit_comp.c
arch/x86/power/cpu.c
arch/x86/xen/enlighten_pv.c
arch/x86/xen/setup.c
block/blk-cgroup.c
block/blk-core.c
block/blk-settings.c
block/blk.h
drivers/accessibility/speakup/main.c
drivers/accessibility/speakup/utils.h
drivers/android/binder_alloc.c
drivers/block/drbd/drbd_main.c
drivers/extcon/extcon-usbc-tusb320.c
drivers/firmware/google/coreboot_table.c
drivers/gpu/drm/amd/amdgpu/amdgpu.h
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.h
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c
drivers/gpu/drm/amd/display/dc/bios/bios_parser2.c
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hubp.c
drivers/gpu/drm/amd/display/dc/dcn314/dcn314_optc.c
drivers/gpu/drm/amd/display/dc/dcn32/dcn32_hwseq.c
drivers/gpu/drm/amd/display/dc/dml/dcn32/dcn32_fpu.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/dml/dcn32/display_mode_vba_util_32.c
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v11_0.h
drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/smu_v11_0.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
drivers/gpu/drm/display/drm_dp_dual_mode_helper.c
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_internal.h
drivers/gpu/drm/drm_mode_config.c
drivers/gpu/drm/i915/gem/i915_gem_ttm.c
drivers/gpu/drm/lima/lima_devfreq.c
drivers/gpu/drm/panel/panel-simple.c
drivers/gpu/drm/tegra/drm.c
drivers/gpu/drm/vc4/vc4_kms.c
drivers/gpu/host1x/dev.c
drivers/iio/accel/bma400_core.c
drivers/iio/adc/at91-sama5d2_adc.c
drivers/iio/adc/at91_adc.c
drivers/iio/adc/mp2629_adc.c
drivers/iio/imu/bno055/bno055.c
drivers/iio/pressure/ms5611.h
drivers/iio/pressure/ms5611_core.c
drivers/iio/pressure/ms5611_spi.c
drivers/iio/trigger/iio-trig-sysfs.c
drivers/input/joystick/iforce/iforce-main.c
drivers/input/misc/soc_button_array.c
drivers/input/mouse/synaptics.c
drivers/input/serio/i8042-acpipnpio.h
drivers/input/serio/i8042.c
drivers/input/touchscreen/goodix.c
drivers/iommu/intel/iommu.c
drivers/iommu/intel/pasid.c
drivers/isdn/mISDN/core.c
drivers/isdn/mISDN/dsp_pipeline.c
drivers/md/dm-bufio.c
drivers/md/dm-crypt.c
drivers/md/dm-integrity.c
drivers/md/dm-ioctl.c
drivers/md/dm-log-writes.c
drivers/misc/vmw_vmci/vmci_queue_pair.c
drivers/mmc/core/core.c
drivers/mmc/host/sdhci-pci-core.c
drivers/mmc/host/sdhci-pci-o2micro.c
drivers/mtd/nand/onenand/Kconfig
drivers/mtd/nand/raw/nand_base.c
drivers/mtd/nand/raw/qcom_nandc.c
drivers/net/ethernet/amazon/ena/ena_netdev.c
drivers/net/ethernet/atheros/ag71xx.c
drivers/net/ethernet/broadcom/bgmac.c
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/cavium/liquidio/lio_main.c
drivers/net/ethernet/hisilicon/hns3/hnae3.h
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.c
drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_rss.h
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
drivers/net/ethernet/huawei/hinic/hinic_main.c
drivers/net/ethernet/marvell/octeon_ep/octep_main.c
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
drivers/net/ethernet/microchip/lan966x/lan966x_ethtool.c
drivers/net/ethernet/microchip/sparx5/sparx5_ethtool.c
drivers/net/ethernet/microchip/sparx5/sparx5_main.c
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
drivers/net/ethernet/pensando/ionic/ionic_main.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
drivers/net/macvlan.c
drivers/net/mctp/mctp-i2c.c
drivers/net/mhi_net.c
drivers/net/netdevsim/dev.c
drivers/net/phy/dp83867.c
drivers/net/phy/marvell.c
drivers/net/thunderbolt.c
drivers/net/usb/qmi_wwan.c
drivers/net/usb/smsc95xx.c
drivers/nvme/host/pci.c
drivers/nvme/target/auth.c
drivers/nvmem/lan9662-otpc.c
drivers/nvmem/u-boot-env.c
drivers/parport/parport_pc.c
drivers/pinctrl/devicetree.c
drivers/pinctrl/mediatek/mtk-eint.c
drivers/pinctrl/mediatek/mtk-eint.h
drivers/pinctrl/mediatek/pinctrl-mt2701.c
drivers/pinctrl/mediatek/pinctrl-mt2712.c
drivers/pinctrl/mediatek/pinctrl-mt6765.c
drivers/pinctrl/mediatek/pinctrl-mt6779.c
drivers/pinctrl/mediatek/pinctrl-mt6795.c
drivers/pinctrl/mediatek/pinctrl-mt7622.c
drivers/pinctrl/mediatek/pinctrl-mt7623.c
drivers/pinctrl/mediatek/pinctrl-mt7629.c
drivers/pinctrl/mediatek/pinctrl-mt7986.c
drivers/pinctrl/mediatek/pinctrl-mt8127.c
drivers/pinctrl/mediatek/pinctrl-mt8135.c
drivers/pinctrl/mediatek/pinctrl-mt8167.c
drivers/pinctrl/mediatek/pinctrl-mt8173.c
drivers/pinctrl/mediatek/pinctrl-mt8183.c
drivers/pinctrl/mediatek/pinctrl-mt8186.c
drivers/pinctrl/mediatek/pinctrl-mt8188.c
drivers/pinctrl/mediatek/pinctrl-mt8192.c
drivers/pinctrl/mediatek/pinctrl-mt8195.c
drivers/pinctrl/mediatek/pinctrl-mt8365.c
drivers/pinctrl/mediatek/pinctrl-mt8516.c
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
drivers/pinctrl/pinctrl-rockchip.c
drivers/pinctrl/qcom/pinctrl-sc8280xp.c
drivers/platform/surface/aggregator/ssh_packet_layer.c
drivers/platform/surface/surface_aggregator_registry.c
drivers/platform/x86/acer-wmi.c
drivers/platform/x86/amd/pmc.c
drivers/platform/x86/asus-wmi.c
drivers/platform/x86/hp-wmi.c
drivers/platform/x86/ideapad-laptop.c
drivers/platform/x86/intel/pmc/pltdrv.c
drivers/platform/x86/thinkpad_acpi.c
drivers/s390/block/dcssblk.c
drivers/s390/scsi/zfcp_fsf.c
drivers/scsi/mpi3mr/mpi3mr_os.c
drivers/scsi/scsi_debug.c
drivers/scsi/scsi_transport_iscsi.c
drivers/siox/siox-core.c
drivers/slimbus/Kconfig
drivers/slimbus/stream.c
drivers/soc/imx/soc-imx8m.c
drivers/staging/rtl8192e/rtllib_softmac_wx.c
drivers/target/loopback/tcm_loop.c
drivers/tty/n_gsm.c
drivers/tty/serial/8250/8250_lpss.c
drivers/tty/serial/8250/8250_omap.c
drivers/tty/serial/8250/8250_port.c
drivers/tty/serial/fsl_lpuart.c
drivers/tty/serial/imx.c
drivers/usb/cdns3/host.c
drivers/usb/chipidea/otg_fsm.c
drivers/usb/core/quirks.c
drivers/usb/dwc3/core.c
drivers/usb/dwc3/gadget.c
drivers/usb/dwc3/host.c
drivers/usb/host/bcma-hcd.c
drivers/usb/serial/option.c
drivers/usb/typec/mux/intel_pmc_mux.c
drivers/usb/typec/tipd/core.c
drivers/vfio/pci/vfio_pci_core.c
drivers/vfio/vfio_main.c
drivers/xen/pcpu.c
drivers/xen/platform-pci.c
drivers/xen/xen-pciback/conf_space_capability.c
fs/ceph/caps.c
fs/ceph/inode.c
fs/ceph/snap.c
fs/cifs/connect.c
fs/cifs/ioctl.c
fs/cifs/smb2ops.c
fs/erofs/fscache.c
fs/erofs/internal.h
fs/erofs/super.c
fs/erofs/sysfs.c
fs/erofs/zdata.c
fs/kernfs/dir.c
fs/netfs/buffered_read.c
fs/netfs/io.c
fs/nfsd/trace.h
fs/zonefs/super.c
fs/zonefs/sysfs.c
include/linux/blkdev.h
include/linux/bpf.h
include/linux/io_uring.h
include/linux/vfio.h
include/net/ip.h
include/net/ipv6.h
include/net/sock.h
include/soc/at91/sama7-ddr.h
include/sound/sof/info.h
include/uapi/linux/ip.h
include/uapi/linux/ipv6.h
io_uring/io_uring.c
io_uring/io_uring.h
io_uring/net.c
io_uring/poll.c
kernel/bpf/dispatcher.c
kernel/bpf/percpu_freelist.c
kernel/bpf/verifier.c
kernel/events/core.c
mm/maccess.c
net/bpf/test_run.c
net/bridge/br_vlan.c
net/caif/chnl_net.c
net/dsa/dsa2.c
net/dsa/dsa_priv.h
net/dsa/master.c
net/dsa/port.c
net/ipv4/Kconfig
net/ipv4/inet_hashtables.c
net/kcm/kcmsock.c
net/l2tp/l2tp_core.c
net/tls/tls_device_fallback.c
net/x25/x25_dev.c
scripts/package/mkdebian
sound/hda/intel-dsp-config.c
sound/pci/hda/patch_realtek.c
sound/soc/amd/yc/acp6x-mach.c
sound/soc/codecs/rt5514-spi.c
sound/soc/codecs/rt5677-spi.c
sound/soc/codecs/tas2764.c
sound/soc/codecs/tas2770.c
sound/soc/codecs/tas2780.c
sound/soc/fsl/fsl_asrc.c
sound/soc/fsl/fsl_esai.c
sound/soc/fsl/fsl_sai.c
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/intel/boards/sof_es8336.c
sound/soc/intel/common/soc-acpi-intel-icl-match.c
sound/soc/soc-core.c
sound/soc/soc-dapm.c
sound/soc/soc-utils.c
sound/soc/sof/ipc3-topology.c
sound/soc/sof/topology.c
sound/soc/stm/stm32_adfsdm.c
sound/usb/midi.c
tools/arch/x86/include/asm/msr-index.h
tools/iio/iio_generic_buffer.c
tools/testing/selftests/bpf/prog_tests/varlen.c
tools/testing/selftests/bpf/progs/test_varlen.c
tools/testing/selftests/bpf/test_progs.c
tools/testing/selftests/bpf/test_verifier.c

index fdd7989..406b99f 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -416,6 +416,7 @@ TripleX Chung <xxx.phy@gmail.com> <triplex@zh-kernel.org>
 TripleX Chung <xxx.phy@gmail.com> <zhongyu@18mail.cn>
 Tsuneo Yoshioka <Tsuneo.Yoshioka@f-secure.com>
 Tycho Andersen <tycho@tycho.pizza> <tycho@tycho.ws>
+Tzung-Bi Shih <tzungbi@kernel.org> <tzungbi@google.com>
 Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de>
 Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
 Uwe Kleine-König <ukleinek@strlen.de>
diff --git a/CREDITS b/CREDITS
index 54672cb..198f675 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -2452,6 +2452,10 @@ S: 482 Shadowgraph Dr.
 S: San Jose, CA  95110
 S: USA
 
+N: Michal Marek
+E: michal.lkml@markovi.net
+D: Kbuild Maintainer 2009-2017
+
 N: Martin Mares
 E: mj@ucw.cz
 W: http://www.ucw.cz/~mj/
index fe1c501..1c191bc 100644 (file)
@@ -16,8 +16,11 @@ description:
 
 properties:
   compatible:
-    items:
+    oneOf:
       - const: goodix,gt7375p
+      - items:
+          - const: goodix,gt7986u
+          - const: goodix,gt7375p
 
   reg:
     enum:
index c3e9f34..dea293f 100644 (file)
@@ -8,7 +8,7 @@ title: Audio codec controlled by ChromeOS EC
 
 maintainers:
   - Cheng-Yi Chiang <cychiang@chromium.org>
-  - Tzung-Bi Shih <tzungbi@google.com>
+  - Tzung-Bi Shih <tzungbi@kernel.org>
 
 description: |
   Google's ChromeOS EC codec is a digital mic codec provided by the
index 1d73204..ea7d490 100644 (file)
@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
 title: Realtek rt1015p codec devicetree bindings
 
 maintainers:
-  - Tzung-Bi Shih <tzungbi@google.com>
+  - Tzung-Bi Shih <tzungbi@kernel.org>
 
 description: |
   Rt1015p is a rt1015 variant which does not support I2C and
index 304ffb1..4a5104a 100644 (file)
@@ -16,12 +16,11 @@ Parallel Port Devices
 16x50 UART Driver
 =================
 
-.. kernel-doc:: drivers/tty/serial/serial_core.c
-   :export:
-
 .. kernel-doc:: drivers/tty/serial/8250/8250_core.c
    :export:
 
+See serial/driver.rst for related APIs.
+
 Pulse-Width Modulation (PWM)
 ============================
 
index 922e0b5..66b07f1 100644 (file)
@@ -51,7 +51,7 @@ the Technical Advisory Board (TAB) or other maintainers if you're
 uncertain how to handle situations that come up.  It will not be
 considered a violation report unless you want it to be.  If you are
 uncertain about approaching the TAB or any other maintainers, please
-reach out to our conflict mediator, Joanna Lee <joanna.lee@gesmer.com>.
+reach out to our conflict mediator, Joanna Lee <jlee@linuxfoundation.org>.
 
 In the end, "be kind to each other" is really what the end goal is for
 everybody.  We know everyone is human and we all fail at times, but the
index 256f039..2585e7e 100644 (file)
@@ -2197,7 +2197,7 @@ M:        Wei Xu <xuwei5@hisilicon.com>
 L:     linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
 S:     Supported
 W:     http://www.hisilicon.com
-T:     git git://github.com/hisilicon/linux-hisi.git
+T:     git https://github.com/hisilicon/linux-hisi.git
 F:     arch/arm/boot/dts/hi3*
 F:     arch/arm/boot/dts/hip*
 F:     arch/arm/boot/dts/hisi*
@@ -4809,7 +4809,7 @@ R:        Jeff Layton <jlayton@kernel.org>
 L:     ceph-devel@vger.kernel.org
 S:     Supported
 W:     http://ceph.com/
-T:     git git://github.com/ceph/ceph-client.git
+T:     git https://github.com/ceph/ceph-client.git
 F:     include/linux/ceph/
 F:     include/linux/crush/
 F:     net/ceph/
@@ -4821,7 +4821,7 @@ R:        Jeff Layton <jlayton@kernel.org>
 L:     ceph-devel@vger.kernel.org
 S:     Supported
 W:     http://ceph.com/
-T:     git git://github.com/ceph/ceph-client.git
+T:     git https://github.com/ceph/ceph-client.git
 F:     Documentation/filesystems/ceph.rst
 F:     fs/ceph/
 
@@ -4911,7 +4911,7 @@ F:        drivers/platform/chrome/
 
 CHROMEOS EC CODEC DRIVER
 M:     Cheng-Yi Chiang <cychiang@chromium.org>
-M:     Tzung-Bi Shih <tzungbi@google.com>
+M:     Tzung-Bi Shih <tzungbi@kernel.org>
 R:     Guenter Roeck <groeck@chromium.org>
 L:     chrome-platform@lists.linux.dev
 S:     Maintained
@@ -11035,6 +11035,7 @@ KCONFIG
 M:     Masahiro Yamada <masahiroy@kernel.org>
 L:     linux-kbuild@vger.kernel.org
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-kbuild/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git kconfig
 F:     Documentation/kbuild/kconfig*
 F:     scripts/Kconfig.include
@@ -11092,10 +11093,12 @@ F:    fs/autofs/
 
 KERNEL BUILD + files below scripts/ (unless maintained elsewhere)
 M:     Masahiro Yamada <masahiroy@kernel.org>
-M:     Michal Marek <michal.lkml@markovi.net>
+R:     Nathan Chancellor <nathan@kernel.org>
 R:     Nick Desaulniers <ndesaulniers@google.com>
+R:     Nicolas Schier <nicolas@fjasle.eu>
 L:     linux-kbuild@vger.kernel.org
 S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-kbuild/list/
 T:     git git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git
 F:     Documentation/kbuild/
 F:     Makefile
@@ -13625,6 +13628,12 @@ S:     Supported
 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 USB251XB DRIVER
 M:     Richard Leitner <richard.leitner@skidata.com>
 L:     linux-usb@vger.kernel.org
@@ -17222,7 +17231,7 @@ R:      Dongsheng Yang <dongsheng.yang@easystack.cn>
 L:     ceph-devel@vger.kernel.org
 S:     Supported
 W:     http://ceph.com/
-T:     git git://github.com/ceph/ceph-client.git
+T:     git https://github.com/ceph/ceph-client.git
 F:     Documentation/ABI/testing/sysfs-bus-rbd
 F:     drivers/block/rbd.c
 F:     drivers/block/rbd_types.h
@@ -17723,7 +17732,7 @@ F:      arch/riscv/
 N:     riscv
 K:     riscv
 
-RISC-V/MICROCHIP POLARFIRE SOC SUPPORT
+RISC-V MICROCHIP FPGA SUPPORT
 M:     Conor Dooley <conor.dooley@microchip.com>
 M:     Daire McNamara <daire.mcnamara@microchip.com>
 L:     linux-riscv@lists.infradead.org
@@ -17741,17 +17750,26 @@ F:    Documentation/devicetree/bindings/usb/microchip,mpfs-musb.yaml
 F:     arch/riscv/boot/dts/microchip/
 F:     drivers/char/hw_random/mpfs-rng.c
 F:     drivers/clk/microchip/clk-mpfs.c
-F:     drivers/i2c/busses/i2c-microchip-core.c
+F:     drivers/i2c/busses/i2c-microchip-corei2c.c
 F:     drivers/mailbox/mailbox-mpfs.c
 F:     drivers/pci/controller/pcie-microchip-host.c
 F:     drivers/reset/reset-mpfs.c
 F:     drivers/rtc/rtc-mpfs.c
-F:     drivers/soc/microchip/
+F:     drivers/soc/microchip/mpfs-sys-controller.c
 F:     drivers/spi/spi-microchip-core-qspi.c
 F:     drivers/spi/spi-microchip-core.c
 F:     drivers/usb/musb/mpfs.c
 F:     include/soc/microchip/mpfs.h
 
+RISC-V MISC SOC SUPPORT
+M:     Conor Dooley <conor@kernel.org>
+L:     linux-riscv@lists.infradead.org
+S:     Maintained
+Q:     https://patchwork.kernel.org/project/linux-riscv/list/
+T:     git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
+F:     Documentation/devicetree/bindings/riscv/
+F:     arch/riscv/boot/dts/
+
 RNBD BLOCK DRIVERS
 M:     Md. Haris Iqbal <haris.iqbal@ionos.com>
 M:     Jack Wang <jinpu.wang@ionos.com>
@@ -18778,7 +18796,6 @@ M:      Palmer Dabbelt <palmer@dabbelt.com>
 M:     Paul Walmsley <paul.walmsley@sifive.com>
 L:     linux-riscv@lists.infradead.org
 S:     Supported
-T:     git https://github.com/sifive/riscv-linux.git
 N:     sifive
 K:     [^@]sifive
 
@@ -18797,6 +18814,13 @@ S:     Maintained
 F:     Documentation/devicetree/bindings/dma/sifive,fu540-c000-pdma.yaml
 F:     drivers/dma/sf-pdma/
 
+SIFIVE SOC DRIVERS
+M:     Conor Dooley <conor@kernel.org>
+L:     linux-riscv@lists.infradead.org
+S:     Maintained
+T:     git https://git.kernel.org/pub/scm/linux/kernel/git/conor/linux.git/
+F:     drivers/soc/sifive/
+
 SILEAD TOUCHSCREEN DRIVER
 M:     Hans de Goede <hdegoede@redhat.com>
 L:     linux-input@vger.kernel.org
@@ -19598,6 +19622,11 @@ M:     Ion Badulescu <ionut@badula.org>
 S:     Odd Fixes
 F:     drivers/net/ethernet/adaptec/starfire*
 
+STARFIVE DEVICETREES
+M:     Emil Renner Berthing <kernel@esmil.dk>
+S:     Maintained
+F:     arch/riscv/boot/dts/starfive/
+
 STARFIVE JH7100 CLOCK DRIVERS
 M:     Emil Renner Berthing <kernel@esmil.dk>
 S:     Maintained
index 0fc9e6b..03d2e85 100644 (file)
                        clocks = <&clks IMX7D_NAND_USDHC_BUS_RAWNAND_CLK>;
                };
 
-               gpmi: nand-controller@33002000{
+               gpmi: nand-controller@33002000 {
                        compatible = "fsl,imx7d-gpmi-nand";
                        #address-cells = <1>;
-                       #size-cells = <1>;
+                       #size-cells = <0>;
                        reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
                        reg-names = "gpmi-nand", "bch";
                        interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
index f4f054c..3a3d76a 100644 (file)
                pins = "GPIO_35", "GPIO_36";
                function = "can0_b";
        };
+
+       sgpio_a_pins: sgpio-a-pins {
+               /* SCK, D0, D1, LD */
+               pins = "GPIO_32", "GPIO_33", "GPIO_34", "GPIO_35";
+               function = "sgpio_a";
+       };
 };
 
 &can0 {
        status = "okay";
 };
 
+&sgpio {
+       pinctrl-0 = <&sgpio_a_pins>;
+       pinctrl-names = "default";
+       microchip,sgpio-port-ranges = <0 3>, <8 11>;
+       status = "okay";
+
+       gpio@0 {
+               ngpios = <64>;
+       };
+       gpio@1 {
+               ngpios = <64>;
+       };
+};
+
 &switch {
        status = "okay";
 };
index 4eb3044..6e87f0d 100644 (file)
 #define PIN_PB2__FLEXCOM6_IO0          PINMUX_PIN(PIN_PB2, 2, 1)
 #define PIN_PB2__ADTRG                 PINMUX_PIN(PIN_PB2, 3, 1)
 #define PIN_PB2__A20                   PINMUX_PIN(PIN_PB2, 4, 1)
-#define PIN_PB2__FLEXCOM11_IO0         PINMUX_PIN(PIN_PB2, 6, 3)
+#define PIN_PB2__FLEXCOM11_IO1         PINMUX_PIN(PIN_PB2, 6, 3)
 #define PIN_PB3                                35
 #define PIN_PB3__GPIO                  PINMUX_PIN(PIN_PB3, 0, 0)
 #define PIN_PB3__RF1                   PINMUX_PIN(PIN_PB3, 1, 1)
index ffed4d9..e4904fa 100644 (file)
@@ -169,10 +169,15 @@ sr_ena_2:
        cmp     tmp1, #UDDRC_STAT_SELFREF_TYPE_SW
        bne     sr_ena_2
 
-       /* Put DDR PHY's DLL in bypass mode for non-backup modes. */
+       /* Disable DX DLLs for non-backup modes. */
        cmp     r7, #AT91_PM_BACKUP
        beq     sr_ena_3
 
+       /* Do not soft reset the AC DLL. */
+       ldr     tmp1, [r3, DDR3PHY_ACDLLCR]
+       bic     tmp1, tmp1, DDR3PHY_ACDLLCR_DLLSRST
+       str     tmp1, [r3, DDR3PHY_ACDLLCR]
+
        /* Disable DX DLLs. */
        ldr     tmp1, [r3, #DDR3PHY_DX0DLLCR]
        orr     tmp1, tmp1, #DDR3PHY_DXDLLCR_DLLDIS
index 7e0aeb2..a0aeac6 100644 (file)
                off-on-delay-us = <12000>;
        };
 
-       extcon_usbotg1: extcon-usbotg1 {
-               compatible = "linux,extcon-usb-gpio";
+       connector {
+               compatible = "gpio-usb-b-connector", "usb-b-connector";
+               type = "micro";
+               label = "X19";
                pinctrl-names = "default";
-               pinctrl-0 = <&pinctrl_usb1_extcon>;
-               id-gpio = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+               pinctrl-0 = <&pinctrl_usb1_connector>;
+               id-gpios = <&gpio1 10 GPIO_ACTIVE_HIGH>;
+
+               ports {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+
+                       port@0 {
+                               reg = <0>;
+                               usb_dr_connector: endpoint {
+                                       remote-endpoint = <&usb1_drd_sw>;
+                               };
+                       };
+               };
        };
 };
 
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_usbotg1>;
        dr_mode = "otg";
-       extcon = <&extcon_usbotg1>;
        srp-disable;
        hnp-disable;
        adp-disable;
        power-active-high;
        over-current-active-low;
+       usb-role-switch;
        status = "okay";
+
+       port {
+               usb1_drd_sw: endpoint {
+                       remote-endpoint = <&usb_dr_connector>;
+               };
+       };
 };
 
 &usbotg2 {
                           <MX8MM_IOMUXC_GPIO1_IO13_USB1_OTG_OC         0x84>;
        };
 
-       pinctrl_usb1_extcon: usb1-extcongrp {
+       pinctrl_usb1_connector: usb1-connectorgrp {
                fsl,pins = <MX8MM_IOMUXC_GPIO1_IO10_GPIO1_IO10          0x1c0>;
        };
 
index dabd94d..50ef929 100644 (file)
                        clocks = <&clk IMX8MM_CLK_NAND_USDHC_BUS_RAWNAND_CLK>;
                };
 
-               gpmi: nand-controller@33002000{
+               gpmi: nand-controller@33002000 {
                        compatible = "fsl,imx8mm-gpmi-nand", "fsl,imx7d-gpmi-nand";
                        #address-cells = <1>;
-                       #size-cells = <1>;
+                       #size-cells = <0>;
                        reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
                        reg-names = "gpmi-nand", "bch";
                        interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
index ad0b99a..67b554b 100644 (file)
                gpmi: nand-controller@33002000 {
                        compatible = "fsl,imx8mn-gpmi-nand", "fsl,imx7d-gpmi-nand";
                        #address-cells = <1>;
-                       #size-cells = <1>;
+                       #size-cells = <0>;
                        reg = <0x33002000 0x2000>, <0x33004000 0x4000>;
                        reg-names = "gpmi-nand", "bch";
                        interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
old mode 100755 (executable)
new mode 100644 (file)
index a47acf9..a721cdd 100644 (file)
 
                apcs_glb: mailbox@b111000 {
                        compatible = "qcom,ipq8074-apcs-apps-global";
-                       reg = <0x0b111000 0x6000>;
+                       reg = <0x0b111000 0x1000>;
 
                        #clock-cells = <1>;
                        #mbox-cells = <1>;
index c0a2baf..aba7176 100644 (file)
                };
 
                saw3: syscon@9a10000 {
-                       compatible = "qcom,tcsr-msm8996", "syscon";
+                       compatible = "syscon";
                        reg = <0x09a10000 0x1000>;
                };
 
index 87ab0e1..4dee790 100644 (file)
@@ -43,7 +43,6 @@
 
                regulator-always-on;
                regulator-boot-on;
-               regulator-allow-set-load;
 
                vin-supply = <&vreg_3p3>;
        };
                        regulator-max-microvolt = <880000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7a_1p8: ldo7 {
                        regulator-max-microvolt = <2960000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l11a_0p8: ldo11 {
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7c_1p8: ldo7 {
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l10c_3p3: ldo10 {
index b608b82..2c62ba6 100644 (file)
@@ -83,6 +83,9 @@
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l4c: ldo4 {
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7c: ldo7 {
                        regulator-max-microvolt = <2504000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l17c: ldo17 {
                        regulator-max-microvolt = <2504000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
        };
 
index 2125803..4cdc88d 100644 (file)
 
                lpass_audiocc: clock-controller@3300000 {
                        compatible = "qcom,sc7280-lpassaudiocc";
-                       reg = <0 0x03300000 0 0x30000>;
+                       reg = <0 0x03300000 0 0x30000>,
+                             <0 0x032a9000 0 0x1000>;
                        clocks = <&rpmhcc RPMH_CXO_CLK>,
                               <&lpass_aon LPASS_AON_CC_MAIN_RCG_CLK_SRC>;
                        clock-names = "bi_tcxo", "lpass_aon_cc_main_rcg_clk_src";
index fea7d82..5e30349 100644 (file)
                        regulator-max-microvolt = <2504000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l13c: ldo13 {
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l4d: ldo4 {
index c32bcde..212d63d 100644 (file)
 
                ufs_mem_phy: phy@1d87000 {
                        compatible = "qcom,sc8280xp-qmp-ufs-phy";
-                       reg = <0 0x01d87000 0 0xe10>;
+                       reg = <0 0x01d87000 0 0x1c8>;
                        #address-cells = <2>;
                        #size-cells = <2>;
                        ranges;
                        clock-names = "ref",
                                      "ref_aux";
-                       clocks = <&rpmhcc RPMH_CXO_CLK>,
+                       clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>,
                                 <&gcc GCC_UFS_PHY_PHY_AUX_CLK>;
 
                        resets = <&ufs_mem_hc 0>;
 
                ufs_card_phy: phy@1da7000 {
                        compatible = "qcom,sc8280xp-qmp-ufs-phy";
-                       reg = <0 0x01da7000 0 0xe10>;
+                       reg = <0 0x01da7000 0 0x1c8>;
                        #address-cells = <2>;
                        #size-cells = <2>;
                        ranges;
                        clock-names = "ref",
                                      "ref_aux";
-                       clocks = <&gcc GCC_UFS_1_CARD_CLKREF_CLK>,
+                       clocks = <&gcc GCC_UFS_REF_CLKREF_CLK>,
                                 <&gcc GCC_UFS_CARD_PHY_AUX_CLK>;
 
                        resets = <&ufs_card_hc 0>;
                        usb_0_ssphy: usb3-phy@88eb400 {
                                reg = <0 0x088eb400 0 0x100>,
                                      <0 0x088eb600 0 0x3ec>,
-                                     <0 0x088ec400 0 0x1f0>,
+                                     <0 0x088ec400 0 0x364>,
                                      <0 0x088eba00 0 0x100>,
                                      <0 0x088ebc00 0 0x3ec>,
-                                     <0 0x088ec700 0 0x64>;
+                                     <0 0x088ec200 0 0x18>;
                                #phy-cells = <0>;
                                #clock-cells = <0>;
                                clocks = <&gcc GCC_USB3_PRIM_PHY_PIPE_CLK>;
                                clock-names = "pipe0";
                                clock-output-names = "usb0_phy_pipe_clk_src";
                        };
-
-                       usb_0_dpphy: dp-phy@88ed200 {
-                               reg = <0 0x088ed200 0 0x200>,
-                                     <0 0x088ed400 0 0x200>,
-                                     <0 0x088eda00 0 0x200>,
-                                     <0 0x088ea600 0 0x200>,
-                                     <0 0x088ea800 0 0x200>;
-                               #clock-cells = <1>;
-                               #phy-cells = <0>;
-                       };
                };
 
                usb_1_hsphy: phy@8902000 {
 
                        usb_1_ssphy: usb3-phy@8903400 {
                                reg = <0 0x08903400 0 0x100>,
-                                     <0 0x08903c00 0 0x3ec>,
-                                     <0 0x08904400 0 0x1f0>,
+                                     <0 0x08903600 0 0x3ec>,
+                                     <0 0x08904400 0 0x364>,
                                      <0 0x08903a00 0 0x100>,
                                      <0 0x08903c00 0 0x3ec>,
                                      <0 0x08904200 0 0x18>;
                                clock-names = "pipe0";
                                clock-output-names = "usb1_phy_pipe_clk_src";
                        };
-
-                       usb_1_dpphy: dp-phy@8904200 {
-                               reg = <0 0x08904200 0 0x200>,
-                                     <0 0x08904400 0 0x200>,
-                                     <0 0x08904a00 0 0x200>,
-                                     <0 0x08904600 0 0x200>,
-                                     <0 0x08904800 0 0x200>;
-                               #clock-cells = <1>;
-                               #phy-cells = <0>;
-                       };
                };
 
                system-cache-controller@9200000 {
index 014fe3a..fb6e5a1 100644 (file)
                        regulator-max-microvolt = <2960000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7c_3p0: ldo7 {
                        regulator-max-microvolt = <2960000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l10c_3p3: ldo10 {
index 549e0a2..5428aab 100644 (file)
                        regulator-max-microvolt = <2960000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7c_2p85: ldo7 {
                        regulator-max-microvolt = <2960000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l10c_3p3: ldo10 {
index a5b62ca..e276eed 100644 (file)
                                exit-latency-us = <6562>;
                                min-residency-us = <9987>;
                                local-timer-stop;
+                               status = "disabled";
                        };
                };
        };
index 0fcf5bd..69ae650 100644 (file)
                        regulator-max-microvolt = <888000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l6b_1p2: ldo6 {
                        regulator-max-microvolt = <1208000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l7b_2p96: ldo7 {
                        regulator-max-microvolt = <2504000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
 
                vreg_l9b_1p2: ldo9 {
                        regulator-max-microvolt = <1200000>;
                        regulator-initial-mode = <RPMH_REGULATOR_MODE_HPM>;
                        regulator-allow-set-load;
+                       regulator-allowed-modes =
+                           <RPMH_REGULATOR_MODE_LPM
+                            RPMH_REGULATOR_MODE_HPM>;
                };
        };
 
index 71a1af4..edf6625 100644 (file)
@@ -863,12 +863,12 @@ static inline bool pte_user_accessible_page(pte_t pte)
 
 static inline bool pmd_user_accessible_page(pmd_t pmd)
 {
-       return pmd_present(pmd) && (pmd_user(pmd) || pmd_user_exec(pmd));
+       return pmd_leaf(pmd) && (pmd_user(pmd) || pmd_user_exec(pmd));
 }
 
 static inline bool pud_user_accessible_page(pud_t pud)
 {
-       return pud_present(pud) && pud_user(pud);
+       return pud_leaf(pud) && pud_user(pud);
 }
 #endif
 
index 795344a..322a831 100644 (file)
@@ -299,11 +299,11 @@ SYM_TYPED_FUNC_START(ftrace_stub)
        ret
 SYM_FUNC_END(ftrace_stub)
 
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 SYM_TYPED_FUNC_START(ftrace_stub_graph)
        ret
 SYM_FUNC_END(ftrace_stub_graph)
 
-#ifdef CONFIG_FUNCTION_GRAPH_TRACER
 /*
  * void return_to_handler(void)
  *
index 7786e3a..8c3862b 100644 (file)
@@ -142,7 +142,7 @@ SECTIONS
 #endif
 
        .data.rel.ro : AT(ADDR(.data.rel.ro) - LOAD_OFFSET) {
-               *(.data.rel.ro*)
+               *(.data.rel.ro .data.rel.ro.*)
        }
 
        .branch_lt : AT(ADDR(.branch_lt) - LOAD_OFFSET) {
index 87be3e8..c907f74 100644 (file)
@@ -199,7 +199,16 @@ unsigned long __get_wchan(struct task_struct *p);
 /* Has task runtime instrumentation enabled ? */
 #define is_ri_task(tsk) (!!(tsk)->thread.ri_cb)
 
-register unsigned long current_stack_pointer asm("r15");
+/* avoid using global register due to gcc bug in versions < 8.4 */
+#define current_stack_pointer (__current_stack_pointer())
+
+static __always_inline unsigned long __current_stack_pointer(void)
+{
+       unsigned long sp;
+
+       asm volatile("lgr %0,15" : "=d" (sp));
+       return sp;
+}
 
 static __always_inline unsigned short stap(void)
 {
index 8b70237..d6f3703 100644 (file)
@@ -861,8 +861,7 @@ static int amd_pmu_handle_irq(struct pt_regs *regs)
        pmu_enabled = cpuc->enabled;
        cpuc->enabled = 0;
 
-       /* stop everything (includes BRS) */
-       amd_pmu_disable_all();
+       amd_brs_disable_all();
 
        /* Drain BRS is in use (could be inactive) */
        if (cpuc->lbr_users)
@@ -873,7 +872,7 @@ static int amd_pmu_handle_irq(struct pt_regs *regs)
 
        cpuc->enabled = pmu_enabled;
        if (pmu_enabled)
-               amd_pmu_enable_all(0);
+               amd_brs_enable_all();
 
        return amd_pmu_adjust_nmi_window(handled);
 }
index d568afc..83f15fe 100644 (file)
@@ -553,6 +553,7 @@ static void uncore_clean_online(void)
 
        hlist_for_each_entry_safe(uncore, n, &uncore_unused_list, node) {
                hlist_del(&uncore->node);
+               kfree(uncore->events);
                kfree(uncore);
        }
 }
index 82ef87e..42a5579 100644 (file)
@@ -1263,6 +1263,15 @@ static int pt_buffer_try_single(struct pt_buffer *buf, int nr_pages)
        if (1 << order != nr_pages)
                goto out;
 
+       /*
+        * Some processors cannot always support single range for more than
+        * 4KB - refer errata TGL052, ADL037 and RPL017. Future processors might
+        * also be affected, so for now rather than trying to keep track of
+        * which ones, just disable it for all.
+        */
+       if (nr_pages > 1)
+               goto out;
+
        buf->single = true;
        buf->nr_pages = nr_pages;
        ret = 0;
index 10ac527..4a2af82 100644 (file)
 #define MSR_AMD64_CPUID_FN_1           0xc0011004
 #define MSR_AMD64_LS_CFG               0xc0011020
 #define MSR_AMD64_DC_CFG               0xc0011022
+
+#define MSR_AMD64_DE_CFG               0xc0011029
+#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT   1
+#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE      BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT)
+
 #define MSR_AMD64_BU_CFG2              0xc001102a
 #define MSR_AMD64_IBSFETCHCTL          0xc0011030
 #define MSR_AMD64_IBSFETCHLINAD                0xc0011031
 #define FAM10H_MMIO_CONF_BASE_MASK     0xfffffffULL
 #define FAM10H_MMIO_CONF_BASE_SHIFT    20
 #define MSR_FAM10H_NODE_ID             0xc001100c
-#define MSR_F10H_DECFG                 0xc0011029
-#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT    1
-#define MSR_F10H_DECFG_LFENCE_SERIALIZE                BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
 
 /* K8 MSRs */
 #define MSR_K8_TOP_MEM1                        0xc001001a
index 60ece59..dbb38a6 100644 (file)
@@ -37,7 +37,7 @@ __PV_CALLEE_SAVE_REGS_THUNK(__pv_queued_spin_unlock_slowpath, ".spinlock.text");
  *   rsi = lockval           (second argument)
  *   rdx = internal variable (set to 0)
  */
-asm    (".pushsection .spinlock.text;"
+asm    (".pushsection .spinlock.text, \"ax\";"
        ".globl " PV_UNLOCK ";"
        ".type " PV_UNLOCK ", @function;"
        ".align 4,0x90;"
index 860b602..c75d75b 100644 (file)
@@ -770,8 +770,6 @@ static void init_amd_gh(struct cpuinfo_x86 *c)
                set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
 }
 
-#define MSR_AMD64_DE_CFG       0xC0011029
-
 static void init_amd_ln(struct cpuinfo_x86 *c)
 {
        /*
@@ -965,8 +963,8 @@ static void init_amd(struct cpuinfo_x86 *c)
                 * msr_set_bit() uses the safe accessors, too, even if the MSR
                 * is not present.
                 */
-               msr_set_bit(MSR_F10H_DECFG,
-                           MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
+               msr_set_bit(MSR_AMD64_DE_CFG,
+                           MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
 
                /* A serializing LFENCE stops RDTSC speculation */
                set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
index 21fd425..c393b87 100644 (file)
@@ -326,8 +326,8 @@ static void init_hygon(struct cpuinfo_x86 *c)
                 * msr_set_bit() uses the safe accessors, too, even if the MSR
                 * is not present.
                 */
-               msr_set_bit(MSR_F10H_DECFG,
-                           MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT);
+               msr_set_bit(MSR_AMD64_DE_CFG,
+                           MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT);
 
                /* A serializing LFENCE stops RDTSC speculation */
                set_cpu_cap(c, X86_FEATURE_LFENCE_RDTSC);
index 9f88c8e..4b6d2b0 100644 (file)
@@ -2709,9 +2709,9 @@ static int svm_get_msr_feature(struct kvm_msr_entry *msr)
        msr->data = 0;
 
        switch (msr->index) {
-       case MSR_F10H_DECFG:
-               if (boot_cpu_has(X86_FEATURE_LFENCE_RDTSC))
-                       msr->data |= MSR_F10H_DECFG_LFENCE_SERIALIZE;
+       case MSR_AMD64_DE_CFG:
+               if (cpu_feature_enabled(X86_FEATURE_LFENCE_RDTSC))
+                       msr->data |= MSR_AMD64_DE_CFG_LFENCE_SERIALIZE;
                break;
        case MSR_IA32_PERF_CAPABILITIES:
                return 0;
@@ -2812,7 +2812,7 @@ static int svm_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info)
                        msr_info->data = 0x1E;
                }
                break;
-       case MSR_F10H_DECFG:
+       case MSR_AMD64_DE_CFG:
                msr_info->data = svm->msr_decfg;
                break;
        default:
@@ -3041,7 +3041,7 @@ static int svm_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr)
        case MSR_VM_IGNNE:
                vcpu_unimpl(vcpu, "unimplemented wrmsr: 0x%x data 0x%llx\n", ecx, data);
                break;
-       case MSR_F10H_DECFG: {
+       case MSR_AMD64_DE_CFG: {
                struct kvm_msr_entry msr_entry;
 
                msr_entry.index = msr->index;
index ecea83f..490ec23 100644 (file)
@@ -1557,7 +1557,7 @@ static const u32 msr_based_features_all[] = {
        MSR_IA32_VMX_EPT_VPID_CAP,
        MSR_IA32_VMX_VMFUNC,
 
-       MSR_F10H_DECFG,
+       MSR_AMD64_DE_CFG,
        MSR_IA32_UCODE_REV,
        MSR_IA32_ARCH_CAPABILITIES,
        MSR_IA32_PERF_CAPABILITIES,
index 00127ab..9962042 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/bpf.h>
 #include <linux/memory.h>
 #include <linux/sort.h>
-#include <linux/init.h>
 #include <asm/extable.h>
 #include <asm/set_memory.h>
 #include <asm/nospec-branch.h>
@@ -389,18 +388,6 @@ out:
        return ret;
 }
 
-int __init bpf_arch_init_dispatcher_early(void *ip)
-{
-       const u8 *nop_insn = x86_nops[5];
-
-       if (is_endbr(*(u32 *)ip))
-               ip += ENDBR_INSN_SIZE;
-
-       if (memcmp(ip, nop_insn, X86_PATCH_SIZE))
-               text_poke_early(ip, nop_insn, X86_PATCH_SIZE);
-       return 0;
-}
-
 int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
                       void *old_addr, void *new_addr)
 {
index bb176c7..4cd39f3 100644 (file)
@@ -519,6 +519,7 @@ static void pm_save_spec_msr(void)
                MSR_TSX_FORCE_ABORT,
                MSR_IA32_MCU_OPT_CTRL,
                MSR_AMD64_LS_CFG,
+               MSR_AMD64_DE_CFG,
        };
 
        msr_build_context(spec_msr_id, ARRAY_SIZE(spec_msr_id));
index f82857e..038da45 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/start_kernel.h>
 #include <linux/sched.h>
 #include <linux/kprobes.h>
+#include <linux/kstrtox.h>
 #include <linux/memblock.h>
 #include <linux/export.h>
 #include <linux/mm.h>
@@ -113,7 +114,7 @@ static __read_mostly bool xen_msr_safe = IS_ENABLED(CONFIG_XEN_PV_MSR_SAFE);
 static int __init parse_xen_msr_safe(char *str)
 {
        if (str)
-               return strtobool(str, &xen_msr_safe);
+               return kstrtobool(str, &xen_msr_safe);
        return -EINVAL;
 }
 early_param("xen_msr_safe", parse_xen_msr_safe);
index 4f43095..8db26f1 100644 (file)
@@ -7,6 +7,7 @@
 
 #include <linux/init.h>
 #include <linux/sched.h>
+#include <linux/kstrtox.h>
 #include <linux/mm.h>
 #include <linux/pm.h>
 #include <linux/memblock.h>
@@ -85,7 +86,7 @@ static void __init xen_parse_512gb(void)
        arg = strstr(xen_start_info->cmd_line, "xen_512gb_limit=");
        if (!arg)
                val = true;
-       else if (strtobool(arg + strlen("xen_512gb_limit="), &val))
+       else if (kstrtobool(arg + strlen("xen_512gb_limit="), &val))
                return;
 
        xen_512gb_limit = val;
index 6a5c849..ed761c6 100644 (file)
@@ -1213,7 +1213,7 @@ static int blkcg_css_online(struct cgroup_subsys_state *css)
         * parent so that offline always happens towards the root.
         */
        if (parent)
-               blkcg_pin_online(css);
+               blkcg_pin_online(&parent->css);
        return 0;
 }
 
index 1766715..5487912 100644 (file)
@@ -425,7 +425,6 @@ struct request_queue *blk_alloc_queue(int node_id, bool alloc_srcu)
                                PERCPU_REF_INIT_ATOMIC, GFP_KERNEL))
                goto fail_stats;
 
-       blk_queue_dma_alignment(q, 511);
        blk_set_default_limits(&q->limits);
        q->nr_requests = BLKDEV_DEFAULT_RQ;
 
index 8bb9eef..8ac1038 100644 (file)
@@ -57,8 +57,8 @@ void blk_set_default_limits(struct queue_limits *lim)
        lim->misaligned = 0;
        lim->zoned = BLK_ZONED_NONE;
        lim->zone_write_granularity = 0;
+       lim->dma_alignment = 511;
 }
-EXPORT_SYMBOL(blk_set_default_limits);
 
 /**
  * blk_set_stacking_limits - set default limits for stacking devices
@@ -600,6 +600,7 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
 
        t->io_min = max(t->io_min, b->io_min);
        t->io_opt = lcm_not_zero(t->io_opt, b->io_opt);
+       t->dma_alignment = max(t->dma_alignment, b->dma_alignment);
 
        /* Set non-power-of-2 compatible chunk_sectors boundary */
        if (b->chunk_sectors)
@@ -773,7 +774,7 @@ EXPORT_SYMBOL(blk_queue_virt_boundary);
  **/
 void blk_queue_dma_alignment(struct request_queue *q, int mask)
 {
-       q->dma_alignment = mask;
+       q->limits.dma_alignment = mask;
 }
 EXPORT_SYMBOL(blk_queue_dma_alignment);
 
@@ -795,8 +796,8 @@ void blk_queue_update_dma_alignment(struct request_queue *q, int mask)
 {
        BUG_ON(mask > PAGE_SIZE);
 
-       if (mask > q->dma_alignment)
-               q->dma_alignment = mask;
+       if (mask > q->limits.dma_alignment)
+               q->limits.dma_alignment = mask;
 }
 EXPORT_SYMBOL(blk_queue_update_dma_alignment);
 
index d6ea0d1..a186ea2 100644 (file)
@@ -331,6 +331,7 @@ void blk_rq_set_mixed_merge(struct request *rq);
 bool blk_rq_merge_ok(struct request *rq, struct bio *bio);
 enum elv_merge blk_try_merge(struct request *rq, struct bio *bio);
 
+void blk_set_default_limits(struct queue_limits *lim);
 int blk_dev_init(void);
 
 /*
index f522652..73db0cb 100644 (file)
@@ -1778,7 +1778,7 @@ static void speakup_con_update(struct vc_data *vc)
 {
        unsigned long flags;
 
-       if (!speakup_console[vc->vc_num] || spk_parked)
+       if (!speakup_console[vc->vc_num] || spk_parked || !synth)
                return;
        if (!spin_trylock_irqsave(&speakup_info.spinlock, flags))
                /* Speakup output, discard */
index 4bf2ee8..4ce9a12 100644 (file)
@@ -54,7 +54,7 @@ static inline int oops(const char *msg, const char *info)
 
 static inline struct st_key *hash_name(char *name)
 {
-       u_char *pn = (u_char *)name;
+       unsigned char *pn = (unsigned char *)name;
        int hash = 0;
 
        while (*pn) {
index 1c39cfc..4ad42b0 100644 (file)
@@ -739,6 +739,12 @@ int binder_alloc_mmap_handler(struct binder_alloc *alloc,
        const char *failure_string;
        struct binder_buffer *buffer;
 
+       if (unlikely(vma->vm_mm != alloc->mm)) {
+               ret = -EINVAL;
+               failure_string = "invalid vma->vm_mm";
+               goto err_invalid_mm;
+       }
+
        mutex_lock(&binder_alloc_mmap_lock);
        if (alloc->buffer_size) {
                ret = -EBUSY;
@@ -785,6 +791,7 @@ err_alloc_pages_failed:
        alloc->buffer_size = 0;
 err_already_mapped:
        mutex_unlock(&binder_alloc_mmap_lock);
+err_invalid_mm:
        binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
                           "%s: %d %lx-%lx %s failed %d\n", __func__,
                           alloc->pid, vma->vm_start, vma->vm_end,
index f3e4db1..8532b83 100644 (file)
@@ -2672,7 +2672,7 @@ static int init_submitter(struct drbd_device *device)
 enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsigned int minor)
 {
        struct drbd_resource *resource = adm_ctx->resource;
-       struct drbd_connection *connection;
+       struct drbd_connection *connection, *n;
        struct drbd_device *device;
        struct drbd_peer_device *peer_device, *tmp_peer_device;
        struct gendisk *disk;
@@ -2789,7 +2789,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
        return NO_ERROR;
 
 out_idr_remove_from_resource:
-       for_each_connection(connection, resource) {
+       for_each_connection_safe(connection, n, resource) {
                peer_device = idr_remove(&connection->peer_devices, vnr);
                if (peer_device)
                        kref_put(&connection->kref, drbd_destroy_connection);
index 41041ff..2a120d8 100644 (file)
@@ -327,7 +327,13 @@ static irqreturn_t tusb320_irq_handler(int irq, void *dev_id)
                return IRQ_NONE;
 
        tusb320_extcon_irq_handler(priv, reg);
-       tusb320_typec_irq_handler(priv, reg);
+
+       /*
+        * Type-C support is optional. Only call the Type-C handler if a
+        * port had been registered previously.
+        */
+       if (priv->port)
+               tusb320_typec_irq_handler(priv, reg);
 
        regmap_write(priv->regmap, TUSB320_REG9, reg);
 
index c52bcaa..9ca21fe 100644 (file)
@@ -149,12 +149,8 @@ static int coreboot_table_probe(struct platform_device *pdev)
        if (!ptr)
                return -ENOMEM;
 
-       ret = bus_register(&coreboot_bus_type);
-       if (!ret) {
-               ret = coreboot_table_populate(dev, ptr);
-               if (ret)
-                       bus_unregister(&coreboot_bus_type);
-       }
+       ret = coreboot_table_populate(dev, ptr);
+
        memunmap(ptr);
 
        return ret;
@@ -169,7 +165,6 @@ static int __cb_dev_unregister(struct device *dev, void *dummy)
 static int coreboot_table_remove(struct platform_device *pdev)
 {
        bus_for_each_dev(&coreboot_bus_type, NULL, NULL, __cb_dev_unregister);
-       bus_unregister(&coreboot_bus_type);
        return 0;
 }
 
@@ -199,6 +194,32 @@ static struct platform_driver coreboot_table_driver = {
                .of_match_table = of_match_ptr(coreboot_of_match),
        },
 };
-module_platform_driver(coreboot_table_driver);
+
+static int __init coreboot_table_driver_init(void)
+{
+       int ret;
+
+       ret = bus_register(&coreboot_bus_type);
+       if (ret)
+               return ret;
+
+       ret = platform_driver_register(&coreboot_table_driver);
+       if (ret) {
+               bus_unregister(&coreboot_bus_type);
+               return ret;
+       }
+
+       return 0;
+}
+
+static void __exit coreboot_table_driver_exit(void)
+{
+       platform_driver_unregister(&coreboot_table_driver);
+       bus_unregister(&coreboot_bus_type);
+}
+
+module_init(coreboot_table_driver_init);
+module_exit(coreboot_table_driver_exit);
+
 MODULE_AUTHOR("Google, Inc.");
 MODULE_LICENSE("GPL");
index 8639a4f..2eca582 100644 (file)
@@ -1293,6 +1293,7 @@ void amdgpu_device_pcie_port_wreg(struct amdgpu_device *adev,
                                u32 reg, u32 v);
 struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
                                            struct dma_fence *gang);
+bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev);
 
 /* atpx handler */
 #if defined(CONFIG_VGA_SWITCHEROO)
index 84f44f7..6d1ff7b 100644 (file)
@@ -171,9 +171,7 @@ int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
            (kfd_mem_limit.ttm_mem_used + ttm_mem_needed >
             kfd_mem_limit.max_ttm_mem_limit) ||
            (adev && adev->kfd.vram_used + vram_needed >
-            adev->gmc.real_vram_size -
-            atomic64_read(&adev->vram_pin_size) -
-            reserved_for_pt)) {
+            adev->gmc.real_vram_size - reserved_for_pt)) {
                ret = -ENOMEM;
                goto release;
        }
index d371000..d038b25 100644 (file)
@@ -109,6 +109,7 @@ static int amdgpu_cs_p1_ib(struct amdgpu_cs_parser *p,
                return r;
 
        ++(num_ibs[r]);
+       p->gang_leader_idx = r;
        return 0;
 }
 
@@ -287,8 +288,10 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
                }
        }
 
-       if (!p->gang_size)
-               return -EINVAL;
+       if (!p->gang_size) {
+               ret = -EINVAL;
+               goto free_partial_kdata;
+       }
 
        for (i = 0; i < p->gang_size; ++i) {
                ret = amdgpu_job_alloc(p->adev, num_ibs[i], &p->jobs[i], vm);
@@ -300,7 +303,7 @@ static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
                if (ret)
                        goto free_all_kdata;
        }
-       p->gang_leader = p->jobs[p->gang_size - 1];
+       p->gang_leader = p->jobs[p->gang_leader_idx];
 
        if (p->ctx->vram_lost_counter != p->gang_leader->vram_lost_counter) {
                ret = -ECANCELED;
@@ -1195,16 +1198,18 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
                        return r;
        }
 
-       for (i = 0; i < p->gang_size - 1; ++i) {
+       for (i = 0; i < p->gang_size; ++i) {
+               if (p->jobs[i] == leader)
+                       continue;
+
                r = amdgpu_sync_clone(&leader->sync, &p->jobs[i]->sync);
                if (r)
                        return r;
        }
 
-       r = amdgpu_ctx_wait_prev_fence(p->ctx, p->entities[p->gang_size - 1]);
+       r = amdgpu_ctx_wait_prev_fence(p->ctx, p->entities[p->gang_leader_idx]);
        if (r && r != -ERESTARTSYS)
                DRM_ERROR("amdgpu_ctx_wait_prev_fence failed.\n");
-
        return r;
 }
 
@@ -1238,9 +1243,12 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
        for (i = 0; i < p->gang_size; ++i)
                drm_sched_job_arm(&p->jobs[i]->base);
 
-       for (i = 0; i < (p->gang_size - 1); ++i) {
+       for (i = 0; i < p->gang_size; ++i) {
                struct dma_fence *fence;
 
+               if (p->jobs[i] == leader)
+                       continue;
+
                fence = &p->jobs[i]->base.s_fence->scheduled;
                r = amdgpu_sync_fence(&leader->sync, fence);
                if (r)
@@ -1276,7 +1284,10 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
        list_for_each_entry(e, &p->validated, tv.head) {
 
                /* Everybody except for the gang leader uses READ */
-               for (i = 0; i < (p->gang_size - 1); ++i) {
+               for (i = 0; i < p->gang_size; ++i) {
+                       if (p->jobs[i] == leader)
+                               continue;
+
                        dma_resv_add_fence(e->tv.bo->base.resv,
                                           &p->jobs[i]->base.s_fence->finished,
                                           DMA_RESV_USAGE_READ);
@@ -1286,7 +1297,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
                e->tv.num_shared = 0;
        }
 
-       seq = amdgpu_ctx_add_fence(p->ctx, p->entities[p->gang_size - 1],
+       seq = amdgpu_ctx_add_fence(p->ctx, p->entities[p->gang_leader_idx],
                                   p->fence);
        amdgpu_cs_post_dependencies(p);
 
index cbaa19b..f80adf9 100644 (file)
@@ -54,6 +54,7 @@ struct amdgpu_cs_parser {
 
        /* scheduler job objects */
        unsigned int            gang_size;
+       unsigned int            gang_leader_idx;
        struct drm_sched_entity *entities[AMDGPU_CS_GANG_SIZE];
        struct amdgpu_job       *jobs[AMDGPU_CS_GANG_SIZE];
        struct amdgpu_job       *gang_leader;
index 6451089..f1e9663 100644 (file)
@@ -6044,3 +6044,44 @@ struct dma_fence *amdgpu_device_switch_gang(struct amdgpu_device *adev,
        dma_fence_put(old);
        return NULL;
 }
+
+bool amdgpu_device_has_display_hardware(struct amdgpu_device *adev)
+{
+       switch (adev->asic_type) {
+#ifdef CONFIG_DRM_AMDGPU_SI
+       case CHIP_HAINAN:
+#endif
+       case CHIP_TOPAZ:
+               /* chips with no display hardware */
+               return false;
+#ifdef CONFIG_DRM_AMDGPU_SI
+       case CHIP_TAHITI:
+       case CHIP_PITCAIRN:
+       case CHIP_VERDE:
+       case CHIP_OLAND:
+#endif
+#ifdef CONFIG_DRM_AMDGPU_CIK
+       case CHIP_BONAIRE:
+       case CHIP_HAWAII:
+       case CHIP_KAVERI:
+       case CHIP_KABINI:
+       case CHIP_MULLINS:
+#endif
+       case CHIP_TONGA:
+       case CHIP_FIJI:
+       case CHIP_POLARIS10:
+       case CHIP_POLARIS11:
+       case CHIP_POLARIS12:
+       case CHIP_VEGAM:
+       case CHIP_CARRIZO:
+       case CHIP_STONEY:
+               /* chips with display hardware */
+               return true;
+       default:
+               /* IP discovery */
+               if (!adev->ip_versions[DCE_HWIP][0] ||
+                   (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK))
+                       return false;
+               return true;
+       }
+}
index 34233a7..b06cb0b 100644 (file)
@@ -656,7 +656,7 @@ void amdgpu_gmc_get_vbios_allocations(struct amdgpu_device *adev)
        }
 
        if (amdgpu_sriov_vf(adev) ||
-           !amdgpu_device_ip_get_ip_block(adev, AMD_IP_BLOCK_TYPE_DCE)) {
+           !amdgpu_device_has_display_hardware(adev)) {
                size = 0;
        } else {
                size = amdgpu_gmc_get_vbios_fb_size(adev);
index 21d822b..88f9b32 100644 (file)
@@ -45,6 +45,7 @@ MODULE_FIRMWARE("amdgpu/psp_13_0_0_ta.bin");
 MODULE_FIRMWARE("amdgpu/psp_13_0_7_sos.bin");
 MODULE_FIRMWARE("amdgpu/psp_13_0_7_ta.bin");
 MODULE_FIRMWARE("amdgpu/psp_13_0_10_sos.bin");
+MODULE_FIRMWARE("amdgpu/psp_13_0_10_ta.bin");
 
 /* For large FW files the time to complete can be very long */
 #define USBC_PD_POLLING_LIMIT_S 240
index 509739d..3e1ecca 100644 (file)
@@ -147,6 +147,14 @@ MODULE_FIRMWARE(FIRMWARE_NAVI12_DMCU);
 /* Number of bytes in PSP footer for firmware. */
 #define PSP_FOOTER_BYTES 0x100
 
+/*
+ * DMUB Async to Sync Mechanism Status
+ */
+#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
+#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
+#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
+#define DMUB_ASYNC_TO_SYNC_ACCESS_INVALID 4
+
 /**
  * DOC: overview
  *
@@ -1637,12 +1645,6 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
                }
        }
 
-       if (amdgpu_dm_initialize_drm_device(adev)) {
-               DRM_ERROR(
-               "amdgpu: failed to initialize sw for display support.\n");
-               goto error;
-       }
-
        /* Enable outbox notification only after IRQ handlers are registered and DMUB is alive.
         * It is expected that DMUB will resend any pending notifications at this point, for
         * example HPD from DPIA.
@@ -1650,6 +1652,12 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
        if (dc_is_dmub_outbox_supported(adev->dm.dc))
                dc_enable_dmub_outbox(adev->dm.dc);
 
+       if (amdgpu_dm_initialize_drm_device(adev)) {
+               DRM_ERROR(
+               "amdgpu: failed to initialize sw for display support.\n");
+               goto error;
+       }
+
        /* create fake encoders for MST */
        dm_dp_create_fake_mst_encoders(adev);
 
@@ -10109,6 +10117,8 @@ static int amdgpu_dm_set_dmub_async_sync_status(bool is_cmd_aux,
                        *operation_result = AUX_RET_ERROR_TIMEOUT;
                } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_FAIL) {
                        *operation_result = AUX_RET_ERROR_ENGINE_ACQUIRE;
+               } else if (status_type == DMUB_ASYNC_TO_SYNC_ACCESS_INVALID) {
+                       *operation_result = AUX_RET_ERROR_INVALID_REPLY;
                } else {
                        *operation_result = AUX_RET_ERROR_UNKNOWN;
                }
@@ -10156,6 +10166,16 @@ int amdgpu_dm_process_dmub_aux_transfer_sync(bool is_cmd_aux, struct dc_context
                        payload->reply[0] = adev->dm.dmub_notify->aux_reply.command;
                        if (!payload->write && adev->dm.dmub_notify->aux_reply.length &&
                            payload->reply[0] == AUX_TRANSACTION_REPLY_AUX_ACK) {
+
+                               if (payload->length != adev->dm.dmub_notify->aux_reply.length) {
+                                       DRM_WARN("invalid read from DPIA AUX %x(%d) got length %d!\n",
+                                                       payload->address, payload->length,
+                                                       adev->dm.dmub_notify->aux_reply.length);
+                                       return amdgpu_dm_set_dmub_async_sync_status(is_cmd_aux, ctx,
+                                                       DMUB_ASYNC_TO_SYNC_ACCESS_INVALID,
+                                                       (uint32_t *)operation_result);
+                               }
+
                                memcpy(payload->data, adev->dm.dmub_notify->aux_reply.data,
                                       adev->dm.dmub_notify->aux_reply.length);
                        }
index b5ce15c..635c398 100644 (file)
 #define AMDGPU_DMUB_NOTIFICATION_MAX 5
 
 /*
- * DMUB Async to Sync Mechanism Status
- */
-#define DMUB_ASYNC_TO_SYNC_ACCESS_FAIL 1
-#define DMUB_ASYNC_TO_SYNC_ACCESS_TIMEOUT 2
-#define DMUB_ASYNC_TO_SYNC_ACCESS_SUCCESS 3
-/*
 #include "include/amdgpu_dal_power_if.h"
 #include "amdgpu_dm_irq.h"
 */
index 594fe8a..64dd029 100644 (file)
@@ -412,7 +412,7 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
 {
        struct amdgpu_crtc *acrtc = NULL;
        struct drm_plane *cursor_plane;
-
+       bool is_dcn;
        int res = -ENOMEM;
 
        cursor_plane = kzalloc(sizeof(*cursor_plane), GFP_KERNEL);
@@ -450,8 +450,14 @@ int amdgpu_dm_crtc_init(struct amdgpu_display_manager *dm,
        acrtc->otg_inst = -1;
 
        dm->adev->mode_info.crtcs[crtc_index] = acrtc;
-       drm_crtc_enable_color_mgmt(&acrtc->base, MAX_COLOR_LUT_ENTRIES,
+
+       /* Don't enable DRM CRTC degamma property for DCE since it doesn't
+        * support programmable degamma anywhere.
+        */
+       is_dcn = dm->adev->dm.dc->caps.color.dpp.dcn_arch;
+       drm_crtc_enable_color_mgmt(&acrtc->base, is_dcn ? MAX_COLOR_LUT_ENTRIES : 0,
                                   true, MAX_COLOR_LUT_ENTRIES);
+
        drm_mode_crtc_set_gamma_size(&acrtc->base, MAX_COLOR_LEGACY_LUT_ENTRIES);
 
        return 0;
index ee0456b..e0c8d6f 100644 (file)
@@ -2393,6 +2393,26 @@ static enum bp_result get_vram_info_v25(
        return result;
 }
 
+static enum bp_result get_vram_info_v30(
+       struct bios_parser *bp,
+       struct dc_vram_info *info)
+{
+       struct atom_vram_info_header_v3_0 *info_v30;
+       enum bp_result result = BP_RESULT_OK;
+
+       info_v30 = GET_IMAGE(struct atom_vram_info_header_v3_0,
+                                               DATA_TABLES(vram_info));
+
+       if (info_v30 == NULL)
+               return BP_RESULT_BADBIOSTABLE;
+
+       info->num_chans = info_v30->channel_num;
+       info->dram_channel_width_bytes = (1 << info_v30->channel_width) / 8;
+
+       return result;
+}
+
+
 /*
  * get_integrated_info_v11
  *
@@ -3060,6 +3080,16 @@ static enum bp_result bios_parser_get_vram_info(
                        }
                        break;
 
+               case 3:
+                       switch (revision.minor) {
+                       case 0:
+                               result = get_vram_info_v30(bp, info);
+                               break;
+                       default:
+                               break;
+                       }
+                       break;
+
                default:
                        return result;
                }
index 84e1486..39a57bc 100644 (file)
@@ -87,6 +87,7 @@ static struct hubp_funcs dcn31_hubp_funcs = {
        .hubp_init = hubp3_init,
        .set_unbounded_requesting = hubp31_set_unbounded_requesting,
        .hubp_soft_reset = hubp31_soft_reset,
+       .hubp_set_flip_int = hubp1_set_flip_int,
        .hubp_in_blank = hubp1_in_blank,
        .program_extended_blank = hubp31_program_extended_blank,
 };
index 47eb162..7dd36e4 100644 (file)
@@ -237,7 +237,7 @@ static struct timing_generator_funcs dcn314_tg_funcs = {
                .clear_optc_underflow = optc1_clear_optc_underflow,
                .setup_global_swap_lock = NULL,
                .get_crc = optc1_get_crc,
-               .configure_crc = optc2_configure_crc,
+               .configure_crc = optc1_configure_crc,
                .set_dsc_config = optc3_set_dsc_config,
                .get_dsc_status = optc2_get_dsc_status,
                .set_dwb_source = NULL,
index cf5bd97..ac41a76 100644 (file)
@@ -283,8 +283,7 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
                        using the max for calculation */
 
                if (hubp->curs_attr.width > 0) {
-                               // Round cursor width to next multiple of 64
-                               cursor_size = (((hubp->curs_attr.width + 63) / 64) * 64) * hubp->curs_attr.height;
+                               cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
 
                                switch (pipe->stream->cursor_attributes.color_format) {
                                case CURSOR_MODE_MONO:
@@ -309,9 +308,9 @@ static uint32_t dcn32_calculate_cab_allocation(struct dc *dc, struct dc_state *c
                                                cursor_size > 16384) {
                                        /* cursor_num_mblk = CEILING(num_cursors*cursor_width*cursor_width*cursor_Bpe/mblk_bytes, 1)
                                         */
-                                       cache_lines_used += (((hubp->curs_attr.width * hubp->curs_attr.height * cursor_bpp +
-                                                                               DCN3_2_MALL_MBLK_SIZE_BYTES - 1) / DCN3_2_MALL_MBLK_SIZE_BYTES) *
-                                                                               DCN3_2_MALL_MBLK_SIZE_BYTES) / dc->caps.cache_line_size + 2;
+                                       cache_lines_used += (((cursor_size + DCN3_2_MALL_MBLK_SIZE_BYTES - 1) /
+                                                       DCN3_2_MALL_MBLK_SIZE_BYTES) * DCN3_2_MALL_MBLK_SIZE_BYTES) /
+                                                       dc->caps.cache_line_size + 2;
                                }
                                break;
                        }
@@ -727,10 +726,7 @@ void dcn32_update_mall_sel(struct dc *dc, struct dc_state *context)
                struct hubp *hubp = pipe->plane_res.hubp;
 
                if (pipe->stream && pipe->plane_state && hubp && hubp->funcs->hubp_update_mall_sel) {
-                       //Round cursor width up to next multiple of 64
-                       int cursor_width = ((hubp->curs_attr.width + 63) / 64) * 64;
-                       int cursor_height = hubp->curs_attr.height;
-                       int cursor_size = cursor_width * cursor_height;
+                       int cursor_size = hubp->curs_attr.pitch * hubp->curs_attr.height;
 
                        switch (hubp->curs_attr.color_format) {
                        case CURSOR_MODE_MONO:
index 659323e..12e17bc 100644 (file)
@@ -1803,6 +1803,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
                         */
                        context->bw_ctx.dml.soc.dram_clock_change_latency_us =
                                        dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
+                       /* For DCN32/321 need to validate with fclk pstate change latency equal to dummy so
+                        * prefetch is scheduled correctly to account for dummy pstate.
+                        */
+                       if (dummy_latency_index == 0)
+                               context->bw_ctx.dml.soc.fclk_change_latency_us =
+                                               dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
                        dcn32_internal_validate_bw(dc, context, pipes, &pipe_cnt, &vlevel, false);
                        maxMpcComb = context->bw_ctx.dml.vba.maxMpcComb;
                        dcfclk_from_fw_based_mclk_switching = context->bw_ctx.dml.vba.DCFCLKState[vlevel][context->bw_ctx.dml.vba.maxMpcComb];
@@ -1990,6 +1996,10 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
 
        context->perf_params.stutter_period_us = context->bw_ctx.dml.vba.StutterPeriod;
 
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching && dummy_latency_index == 0)
+               context->bw_ctx.dml.soc.fclk_change_latency_us =
+                               dc->clk_mgr->bw_params->dummy_pstate_table[dummy_latency_index].dummy_pstate_latency_us;
+
        dcn32_calculate_dlg_params(dc, context, pipes, pipe_cnt, vlevel);
 
        if (!pstate_en)
@@ -1997,8 +2007,12 @@ void dcn32_calculate_wm_and_dlg_fpu(struct dc *dc, struct dc_state *context,
                context->bw_ctx.dml.soc.dram_clock_change_latency_us =
                                dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.pstate_latency_us;
 
-       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching)
+       if (context->bw_ctx.bw.dcn.clk.fw_based_mclk_switching) {
                dcn30_setup_mclk_switch_using_fw_based_vblank_stretch(dc, context);
+               if (dummy_latency_index == 0)
+                       context->bw_ctx.dml.soc.fclk_change_latency_us =
+                                       dc->clk_mgr->bw_params->wm_table.nv_entries[WM_A].dml_input.fclk_change_latency_us;
+       }
 }
 
 static void dcn32_get_optimal_dcfclk_fclk_for_uclk(unsigned int uclk_mts,
index 244fd15..9afd9ba 100644 (file)
@@ -718,6 +718,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman
 
        do {
                MaxTotalRDBandwidth = 0;
+               DestinationLineTimesForPrefetchLessThan2 = false;
+               VRatioPrefetchMoreThanMax = false;
 #ifdef __DML_VBA_DEBUG__
                dml_print("DML::%s: Start loop: VStartup = %d\n", __func__, mode_lib->vba.VStartupLines);
 #endif
index f82e14c..c8b28c8 100644 (file)
@@ -46,6 +46,8 @@
 // Prefetch schedule max vratio
 #define __DML_MAX_VRATIO_PRE__ 4.0
 
+#define __DML_VBA_MAX_DST_Y_PRE__    63.75
+
 #define BPP_INVALID 0
 #define BPP_BLENDED_PIPE 0xffffffff
 
index 635fc54..debe46b 100644 (file)
@@ -3475,7 +3475,6 @@ bool dml32_CalculatePrefetchSchedule(
        double  min_Lsw;
        double  Tsw_est1 = 0;
        double  Tsw_est3 = 0;
-       double  TPreMargin = 0;
 
        if (v->GPUVMEnable == true && v->HostVMEnable == true)
                HostVMDynamicLevelsTrips = v->HostVMMaxNonCachedPageTableLevels;
@@ -3669,6 +3668,7 @@ bool dml32_CalculatePrefetchSchedule(
        dst_y_prefetch_equ = VStartup - (*TSetup + dml_max(TWait + TCalc, *Tdmdl)) / LineTime -
                        (*DSTYAfterScaler + (double) *DSTXAfterScaler / (double) myPipe->HTotal);
 
+       dst_y_prefetch_equ = dml_min(dst_y_prefetch_equ, __DML_VBA_MAX_DST_Y_PRE__);
 #ifdef __DML_VBA_DEBUG__
        dml_print("DML::%s: HTotal = %d\n", __func__, myPipe->HTotal);
        dml_print("DML::%s: min_Lsw = %f\n", __func__, min_Lsw);
@@ -3701,8 +3701,6 @@ bool dml32_CalculatePrefetchSchedule(
 
        dst_y_prefetch_equ = dml_floor(4.0 * (dst_y_prefetch_equ + 0.125), 1) / 4.0;
        Tpre_rounded = dst_y_prefetch_equ * LineTime;
-
-       TPreMargin = Tpre_rounded - TPreReq;
 #ifdef __DML_VBA_DEBUG__
        dml_print("DML::%s: dst_y_prefetch_equ: %f (after round)\n", __func__, dst_y_prefetch_equ);
        dml_print("DML::%s: LineTime: %f\n", __func__, LineTime);
@@ -3730,7 +3728,8 @@ bool dml32_CalculatePrefetchSchedule(
        *VRatioPrefetchY = 0;
        *VRatioPrefetchC = 0;
        *RequiredPrefetchPixDataBWLuma = 0;
-       if (dst_y_prefetch_equ > 1 && TPreMargin > 0.0) {
+       if (dst_y_prefetch_equ > 1 &&
+                       (Tpre_rounded >= TPreReq || dst_y_prefetch_equ == __DML_VBA_MAX_DST_Y_PRE__)) {
                double PrefetchBandwidth1;
                double PrefetchBandwidth2;
                double PrefetchBandwidth3;
index 4fe75dd..b880f4d 100644 (file)
@@ -1156,22 +1156,21 @@ static int smu_smc_hw_setup(struct smu_context *smu)
        uint64_t features_supported;
        int ret = 0;
 
-       if (adev->in_suspend && smu_is_dpm_running(smu)) {
-               dev_info(adev->dev, "dpm has been enabled\n");
-               /* this is needed specifically */
-               switch (adev->ip_versions[MP1_HWIP][0]) {
-               case IP_VERSION(11, 0, 7):
-               case IP_VERSION(11, 0, 11):
-               case IP_VERSION(11, 5, 0):
-               case IP_VERSION(11, 0, 12):
+       switch (adev->ip_versions[MP1_HWIP][0]) {
+       case IP_VERSION(11, 0, 7):
+       case IP_VERSION(11, 0, 11):
+       case IP_VERSION(11, 5, 0):
+       case IP_VERSION(11, 0, 12):
+               if (adev->in_suspend && smu_is_dpm_running(smu)) {
+                       dev_info(adev->dev, "dpm has been enabled\n");
                        ret = smu_system_features_control(smu, true);
                        if (ret)
                                dev_err(adev->dev, "Failed system features control!\n");
-                       break;
-               default:
-                       break;
+                       return ret;
                }
-               return ret;
+               break;
+       default:
+               break;
        }
 
        ret = smu_init_display_count(smu, 0);
index e2fa3b0..f816b1d 100644 (file)
@@ -1388,6 +1388,14 @@ enum smu_cmn2asic_mapping_type {
        CMN2ASIC_MAPPING_WORKLOAD,
 };
 
+enum smu_baco_seq {
+       BACO_SEQ_BACO = 0,
+       BACO_SEQ_MSR,
+       BACO_SEQ_BAMACO,
+       BACO_SEQ_ULPS,
+       BACO_SEQ_COUNT,
+};
+
 #define MSG_MAP(msg, index, valid_in_vf) \
        [SMU_MSG_##msg] = {1, (index), (valid_in_vf)}
 
index a921549..d466db6 100644 (file)
@@ -147,14 +147,6 @@ struct smu_11_5_power_context {
        uint32_t        max_fast_ppt_limit;
 };
 
-enum smu_v11_0_baco_seq {
-       BACO_SEQ_BACO = 0,
-       BACO_SEQ_MSR,
-       BACO_SEQ_BAMACO,
-       BACO_SEQ_ULPS,
-       BACO_SEQ_COUNT,
-};
-
 #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
 
 int smu_v11_0_init_microcode(struct smu_context *smu);
@@ -257,7 +249,7 @@ int smu_v11_0_baco_enter(struct smu_context *smu);
 int smu_v11_0_baco_exit(struct smu_context *smu);
 
 int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
-                                     enum smu_v11_0_baco_seq baco_seq);
+                                     enum smu_baco_seq baco_seq);
 
 int smu_v11_0_mode1_reset(struct smu_context *smu);
 
index 80fb583..b7f4569 100644 (file)
@@ -124,14 +124,6 @@ struct smu_13_0_power_context {
        enum smu_13_0_power_state power_state;
 };
 
-enum smu_v13_0_baco_seq {
-       BACO_SEQ_BACO = 0,
-       BACO_SEQ_MSR,
-       BACO_SEQ_BAMACO,
-       BACO_SEQ_ULPS,
-       BACO_SEQ_COUNT,
-};
-
 #if defined(SWSMU_CODE_LAYER_L2) || defined(SWSMU_CODE_LAYER_L3)
 
 int smu_v13_0_init_microcode(struct smu_context *smu);
@@ -218,6 +210,9 @@ int smu_v13_0_set_azalia_d3_pme(struct smu_context *smu);
 int smu_v13_0_get_max_sustainable_clocks_by_dc(struct smu_context *smu,
                                               struct pp_smu_nv_clock_table *max_clocks);
 
+int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
+                                     enum smu_baco_seq baco_seq);
+
 bool smu_v13_0_baco_is_support(struct smu_context *smu);
 
 enum smu_baco_state smu_v13_0_baco_get_state(struct smu_context *smu);
index 6212fd2..697e98a 100644 (file)
@@ -379,6 +379,10 @@ static void sienna_cichlid_check_bxco_support(struct smu_context *smu)
                    ((adev->pdev->device == 0x73BF) &&
                    (adev->pdev->revision == 0xCF)) ||
                    ((adev->pdev->device == 0x7422) &&
+                   (adev->pdev->revision == 0x00)) ||
+                   ((adev->pdev->device == 0x73A3) &&
+                   (adev->pdev->revision == 0x00)) ||
+                   ((adev->pdev->device == 0x73E3) &&
                    (adev->pdev->revision == 0x00)))
                        smu_baco->platform_support = false;
 
index dccbd9f..70b5607 100644 (file)
@@ -1576,7 +1576,7 @@ int smu_v11_0_set_azalia_d3_pme(struct smu_context *smu)
 }
 
 int smu_v11_0_baco_set_armd3_sequence(struct smu_context *smu,
-                                     enum smu_v11_0_baco_seq baco_seq)
+                                     enum smu_baco_seq baco_seq)
 {
        return smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_ArmD3, baco_seq, NULL);
 }
index 43fb102..89f0f6e 100644 (file)
@@ -2230,6 +2230,15 @@ int smu_v13_0_gfx_ulv_control(struct smu_context *smu,
        return ret;
 }
 
+int smu_v13_0_baco_set_armd3_sequence(struct smu_context *smu,
+                                     enum smu_baco_seq baco_seq)
+{
+       return smu_cmn_send_smc_msg_with_param(smu,
+                                              SMU_MSG_ArmD3,
+                                              baco_seq,
+                                              NULL);
+}
+
 bool smu_v13_0_baco_is_support(struct smu_context *smu)
 {
        struct smu_baco_context *smu_baco = &smu->smu_baco;
index 2952932..f0121d1 100644 (file)
@@ -120,6 +120,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(Mode1Reset,                     PPSMC_MSG_Mode1Reset,                  0),
        MSG_MAP(PrepareMp1ForUnload,            PPSMC_MSG_PrepareMp1ForUnload,         0),
        MSG_MAP(DFCstateControl,                PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
+       MSG_MAP(ArmD3,                          PPSMC_MSG_ArmD3,                       0),
 };
 
 static struct cmn2asic_mapping smu_v13_0_0_clk_map[SMU_CLK_COUNT] = {
@@ -1566,6 +1567,31 @@ static int smu_v13_0_0_set_power_profile_mode(struct smu_context *smu,
                                               NULL);
 }
 
+static int smu_v13_0_0_baco_enter(struct smu_context *smu)
+{
+       struct smu_baco_context *smu_baco = &smu->smu_baco;
+       struct amdgpu_device *adev = smu->adev;
+
+       if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
+               return smu_v13_0_baco_set_armd3_sequence(smu,
+                               smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
+       else
+               return smu_v13_0_baco_enter(smu);
+}
+
+static int smu_v13_0_0_baco_exit(struct smu_context *smu)
+{
+       struct amdgpu_device *adev = smu->adev;
+
+       if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
+               /* Wait for PMFW handling for the Dstate change */
+               usleep_range(10000, 11000);
+               return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
+       } else {
+               return smu_v13_0_baco_exit(smu);
+       }
+}
+
 static bool smu_v13_0_0_is_mode1_reset_supported(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
@@ -1827,8 +1853,8 @@ static const struct pptable_funcs smu_v13_0_0_ppt_funcs = {
        .baco_is_support = smu_v13_0_baco_is_support,
        .baco_get_state = smu_v13_0_baco_get_state,
        .baco_set_state = smu_v13_0_baco_set_state,
-       .baco_enter = smu_v13_0_baco_enter,
-       .baco_exit = smu_v13_0_baco_exit,
+       .baco_enter = smu_v13_0_0_baco_enter,
+       .baco_exit = smu_v13_0_0_baco_exit,
        .mode1_reset_is_support = smu_v13_0_0_is_mode1_reset_supported,
        .mode1_reset = smu_v13_0_mode1_reset,
        .set_mp1_state = smu_v13_0_0_set_mp1_state,
index c4102cf..d74debc 100644 (file)
@@ -122,6 +122,7 @@ static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] =
        MSG_MAP(PrepareMp1ForUnload,            PPSMC_MSG_PrepareMp1ForUnload,         0),
        MSG_MAP(SetMGpuFanBoostLimitRpm,        PPSMC_MSG_SetMGpuFanBoostLimitRpm,     0),
        MSG_MAP(DFCstateControl,                PPSMC_MSG_SetExternalClientDfCstateAllow, 0),
+       MSG_MAP(ArmD3,                          PPSMC_MSG_ArmD3,                       0),
 };
 
 static struct cmn2asic_mapping smu_v13_0_7_clk_map[SMU_CLK_COUNT] = {
@@ -1578,6 +1579,31 @@ static int smu_v13_0_7_set_mp1_state(struct smu_context *smu,
        return ret;
 }
 
+static int smu_v13_0_7_baco_enter(struct smu_context *smu)
+{
+       struct smu_baco_context *smu_baco = &smu->smu_baco;
+       struct amdgpu_device *adev = smu->adev;
+
+       if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev))
+               return smu_v13_0_baco_set_armd3_sequence(smu,
+                               smu_baco->maco_support ? BACO_SEQ_BAMACO : BACO_SEQ_BACO);
+       else
+               return smu_v13_0_baco_enter(smu);
+}
+
+static int smu_v13_0_7_baco_exit(struct smu_context *smu)
+{
+       struct amdgpu_device *adev = smu->adev;
+
+       if (adev->in_runpm && smu_cmn_is_audio_func_enabled(adev)) {
+               /* Wait for PMFW handling for the Dstate change */
+               usleep_range(10000, 11000);
+               return smu_v13_0_baco_set_armd3_sequence(smu, BACO_SEQ_ULPS);
+       } else {
+               return smu_v13_0_baco_exit(smu);
+       }
+}
+
 static bool smu_v13_0_7_is_mode1_reset_supported(struct smu_context *smu)
 {
        struct amdgpu_device *adev = smu->adev;
@@ -1655,8 +1681,8 @@ static const struct pptable_funcs smu_v13_0_7_ppt_funcs = {
        .baco_is_support = smu_v13_0_baco_is_support,
        .baco_get_state = smu_v13_0_baco_get_state,
        .baco_set_state = smu_v13_0_baco_set_state,
-       .baco_enter = smu_v13_0_baco_enter,
-       .baco_exit = smu_v13_0_baco_exit,
+       .baco_enter = smu_v13_0_7_baco_enter,
+       .baco_exit = smu_v13_0_7_baco_exit,
        .mode1_reset_is_support = smu_v13_0_7_is_mode1_reset_supported,
        .mode1_reset = smu_v13_0_mode1_reset,
        .set_mp1_state = smu_v13_0_7_set_mp1_state,
index 3ea53bb..bd61e20 100644 (file)
 ssize_t drm_dp_dual_mode_read(struct i2c_adapter *adapter,
                              u8 offset, void *buffer, size_t size)
 {
+       u8 zero = 0;
+       char *tmpbuf = NULL;
+       /*
+        * As sub-addressing is not supported by all adaptors,
+        * always explicitly read from the start and discard
+        * any bytes that come before the requested offset.
+        * This way, no matter whether the adaptor supports it
+        * or not, we'll end up reading the proper data.
+        */
        struct i2c_msg msgs[] = {
                {
                        .addr = DP_DUAL_MODE_SLAVE_ADDRESS,
                        .flags = 0,
                        .len = 1,
-                       .buf = &offset,
+                       .buf = &zero,
                },
                {
                        .addr = DP_DUAL_MODE_SLAVE_ADDRESS,
                        .flags = I2C_M_RD,
-                       .len = size,
+                       .len = size + offset,
                        .buf = buffer,
                },
        };
        int ret;
 
+       if (offset) {
+               tmpbuf = kmalloc(size + offset, GFP_KERNEL);
+               if (!tmpbuf)
+                       return -ENOMEM;
+
+               msgs[1].buf = tmpbuf;
+       }
+
        ret = i2c_transfer(adapter, msgs, ARRAY_SIZE(msgs));
+       if (tmpbuf)
+               memcpy(buffer, tmpbuf + offset, size);
+
+       kfree(tmpbuf);
+
        if (ret < 0)
                return ret;
        if (ret != ARRAY_SIZE(msgs))
@@ -208,18 +230,6 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(const struct drm_device *dev,
        if (ret)
                return DRM_DP_DUAL_MODE_UNKNOWN;
 
-       /*
-        * Sigh. Some (maybe all?) type 1 adaptors are broken and ack
-        * the offset but ignore it, and instead they just always return
-        * data from the start of the HDMI ID buffer. So for a broken
-        * type 1 HDMI adaptor a single byte read will always give us
-        * 0x44, and for a type 1 DVI adaptor it should give 0x00
-        * (assuming it implements any registers). Fortunately neither
-        * of those values will match the type 2 signature of the
-        * DP_DUAL_MODE_ADAPTOR_ID register so we can proceed with
-        * the type 2 adaptor detection safely even in the presence
-        * of broken type 1 adaptors.
-        */
        ret = drm_dp_dual_mode_read(adapter, DP_DUAL_MODE_ADAPTOR_ID,
                                    &adaptor_id, sizeof(adaptor_id));
        drm_dbg_kms(dev, "DP dual mode adaptor ID: %02x (err %zd)\n", adaptor_id, ret);
@@ -233,11 +243,10 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(const struct drm_device *dev,
                                return DRM_DP_DUAL_MODE_TYPE2_DVI;
                }
                /*
-                * If neither a proper type 1 ID nor a broken type 1 adaptor
-                * as described above, assume type 1, but let the user know
-                * that we may have misdetected the type.
+                * If not a proper type 1 ID, still assume type 1, but let
+                * the user know that we may have misdetected the type.
                 */
-               if (!is_type1_adaptor(adaptor_id) && adaptor_id != hdmi_id[0])
+               if (!is_type1_adaptor(adaptor_id))
                        drm_err(dev, "Unexpected DP dual mode adaptor ID %02x\n", adaptor_id);
 
        }
@@ -343,10 +352,8 @@ EXPORT_SYMBOL(drm_dp_dual_mode_get_tmds_output);
  * @enable: enable (as opposed to disable) the TMDS output buffers
  *
  * Set the state of the TMDS output buffers in the adaptor. For
- * type2 this is set via the DP_DUAL_MODE_TMDS_OEN register. As
- * some type 1 adaptors have problems with registers (see comments
- * in drm_dp_dual_mode_detect()) we avoid touching the register,
- * making this function a no-op on type 1 adaptors.
+ * type2 this is set via the DP_DUAL_MODE_TMDS_OEN register.
+ * Type1 adaptors do not support any register writes.
  *
  * Returns:
  * 0 on success, negative error code on failure
index 8214a0b..203bf8d 100644 (file)
@@ -615,7 +615,7 @@ static int drm_dev_init(struct drm_device *dev,
        mutex_init(&dev->clientlist_mutex);
        mutex_init(&dev->master_mutex);
 
-       ret = drmm_add_action(dev, drm_dev_init_release, NULL);
+       ret = drmm_add_action_or_reset(dev, drm_dev_init_release, NULL);
        if (ret)
                return ret;
 
index 7bb98e6..5ea5e26 100644 (file)
@@ -104,7 +104,8 @@ static inline void drm_vblank_flush_worker(struct drm_vblank_crtc *vblank)
 
 static inline void drm_vblank_destroy_worker(struct drm_vblank_crtc *vblank)
 {
-       kthread_destroy_worker(vblank->worker);
+       if (vblank->worker)
+               kthread_destroy_worker(vblank->worker);
 }
 
 int drm_vblank_worker_init(struct drm_vblank_crtc *vblank);
index 939d621..688c8af 100644 (file)
@@ -151,9 +151,6 @@ int drm_mode_getresources(struct drm_device *dev, void *data,
        count = 0;
        connector_id = u64_to_user_ptr(card_res->connector_id_ptr);
        drm_for_each_connector_iter(connector, &conn_iter) {
-               if (connector->registration_state != DRM_CONNECTOR_REGISTERED)
-                       continue;
-
                /* only expose writeback connectors if userspace understands them */
                if (!file_priv->writeback_connectors &&
                    (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK))
index a4aa950..3d4305e 100644 (file)
@@ -1013,9 +1013,6 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
                return VM_FAULT_SIGBUS;
        }
 
-       if (i915_ttm_cpu_maps_iomem(bo->resource))
-               wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
-
        if (!i915_ttm_resource_mappable(bo->resource)) {
                int err = -ENODEV;
                int i;
@@ -1042,6 +1039,9 @@ static vm_fault_t vm_fault_ttm(struct vm_fault *vmf)
                }
        }
 
+       if (i915_ttm_cpu_maps_iomem(bo->resource))
+               wakeref = intel_runtime_pm_get(&to_i915(obj->base.dev)->runtime_pm);
+
        if (drm_dev_enter(dev, &idx)) {
                ret = ttm_bo_vm_fault_reserved(vmf, vmf->vma->vm_page_prot,
                                               TTM_BO_VM_NUM_PREFAULT);
index 011be7f..bc8fb4e 100644 (file)
@@ -112,11 +112,6 @@ int lima_devfreq_init(struct lima_device *ldev)
        unsigned long cur_freq;
        int ret;
        const char *regulator_names[] = { "mali", NULL };
-       const char *clk_names[] = { "core", NULL };
-       struct dev_pm_opp_config config = {
-               .regulator_names = regulator_names,
-               .clk_names = clk_names,
-       };
 
        if (!device_property_present(dev, "operating-points-v2"))
                /* Optional, continue without devfreq */
@@ -124,7 +119,15 @@ int lima_devfreq_init(struct lima_device *ldev)
 
        spin_lock_init(&ldevfreq->lock);
 
-       ret = devm_pm_opp_set_config(dev, &config);
+       /*
+        * clkname is set separately so it is not affected by the optional
+        * regulator setting which may return error.
+        */
+       ret = devm_pm_opp_set_clkname(dev, "core");
+       if (ret)
+               return ret;
+
+       ret = devm_pm_opp_set_regulators(dev, regulator_names);
        if (ret) {
                /* Continue if the optional regulator is missing */
                if (ret != -ENODEV)
index 2944228..8a3b685 100644 (file)
@@ -2500,6 +2500,7 @@ static const struct display_timing logictechno_lt161010_2nh_timing = {
 static const struct panel_desc logictechno_lt161010_2nh = {
        .timings = &logictechno_lt161010_2nh_timing,
        .num_timings = 1,
+       .bpc = 6,
        .size = {
                .width = 154,
                .height = 86,
@@ -2529,6 +2530,7 @@ static const struct display_timing logictechno_lt170410_2whc_timing = {
 static const struct panel_desc logictechno_lt170410_2whc = {
        .timings = &logictechno_lt170410_2whc_timing,
        .num_timings = 1,
+       .bpc = 8,
        .size = {
                .width = 217,
                .height = 136,
index 6748ec1..a1f909d 100644 (file)
@@ -1093,6 +1093,10 @@ static bool host1x_drm_wants_iommu(struct host1x_device *dev)
        struct host1x *host1x = dev_get_drvdata(dev->dev.parent);
        struct iommu_domain *domain;
 
+       /* Our IOMMU usage policy doesn't currently play well with GART */
+       if (of_machine_is_compatible("nvidia,tegra20"))
+               return false;
+
        /*
         * If the Tegra DRM clients are backed by an IOMMU, push buffers are
         * likely to be allocated beyond the 32-bit boundary if sufficient
index 4419e81..0a6347c 100644 (file)
@@ -197,8 +197,8 @@ vc4_hvs_get_new_global_state(struct drm_atomic_state *state)
        struct drm_private_state *priv_state;
 
        priv_state = drm_atomic_get_new_private_obj_state(state, &vc4->hvs_channels);
-       if (IS_ERR(priv_state))
-               return ERR_CAST(priv_state);
+       if (!priv_state)
+               return ERR_PTR(-EINVAL);
 
        return to_vc4_hvs_state(priv_state);
 }
@@ -210,8 +210,8 @@ vc4_hvs_get_old_global_state(struct drm_atomic_state *state)
        struct drm_private_state *priv_state;
 
        priv_state = drm_atomic_get_old_private_obj_state(state, &vc4->hvs_channels);
-       if (IS_ERR(priv_state))
-               return ERR_CAST(priv_state);
+       if (!priv_state)
+               return ERR_PTR(-EINVAL);
 
        return to_vc4_hvs_state(priv_state);
 }
index 0cd3f97..f60ea24 100644 (file)
@@ -292,6 +292,10 @@ static void host1x_setup_virtualization_tables(struct host1x *host)
 
 static bool host1x_wants_iommu(struct host1x *host1x)
 {
+       /* Our IOMMU usage policy doesn't currently play well with GART */
+       if (of_machine_is_compatible("nvidia,tegra20"))
+               return false;
+
        /*
         * If we support addressing a maximum of 32 bits of physical memory
         * and if the host1x firewall is enabled, there's no need to enable
index ad8fce3..490c342 100644 (file)
@@ -869,18 +869,6 @@ static int bma400_init(struct bma400_data *data)
        unsigned int val;
        int ret;
 
-       /* Try to read chip_id register. It must return 0x90. */
-       ret = regmap_read(data->regmap, BMA400_CHIP_ID_REG, &val);
-       if (ret) {
-               dev_err(data->dev, "Failed to read chip id register\n");
-               return ret;
-       }
-
-       if (val != BMA400_ID_REG_VAL) {
-               dev_err(data->dev, "Chip ID mismatch\n");
-               return -ENODEV;
-       }
-
        data->regulators[BMA400_VDD_REGULATOR].supply = "vdd";
        data->regulators[BMA400_VDDIO_REGULATOR].supply = "vddio";
        ret = devm_regulator_bulk_get(data->dev,
@@ -906,6 +894,18 @@ static int bma400_init(struct bma400_data *data)
        if (ret)
                return ret;
 
+       /* Try to read chip_id register. It must return 0x90. */
+       ret = regmap_read(data->regmap, BMA400_CHIP_ID_REG, &val);
+       if (ret) {
+               dev_err(data->dev, "Failed to read chip id register\n");
+               return ret;
+       }
+
+       if (val != BMA400_ID_REG_VAL) {
+               dev_err(data->dev, "Chip ID mismatch\n");
+               return -ENODEV;
+       }
+
        ret = bma400_get_power_mode(data);
        if (ret) {
                dev_err(data->dev, "Failed to get the initial power-mode\n");
index 33e2515..870f4cb 100644 (file)
@@ -2307,11 +2307,9 @@ static int at91_adc_temp_sensor_init(struct at91_adc_state *st,
        clb->p6 = buf[AT91_ADC_TS_CLB_IDX_P6];
 
        /*
-        * We prepare here the conversion to milli and also add constant
-        * factor (5 degrees Celsius) to p1 here to avoid doing it on
-        * hotpath.
+        * We prepare here the conversion to milli to avoid doing it on hotpath.
         */
-       clb->p1 = clb->p1 * 1000 + 5000;
+       clb->p1 = clb->p1 * 1000;
 
 free_buf:
        kfree(buf);
index 532daaa..366e252 100644 (file)
@@ -634,8 +634,10 @@ static struct iio_trigger *at91_adc_allocate_trigger(struct iio_dev *idev,
        trig->ops = &at91_adc_trigger_ops;
 
        ret = iio_trigger_register(trig);
-       if (ret)
+       if (ret) {
+               iio_trigger_free(trig);
                return NULL;
+       }
 
        return trig;
 }
index 30a31f1..88e947f 100644 (file)
@@ -57,7 +57,8 @@ static struct iio_map mp2629_adc_maps[] = {
        MP2629_MAP(SYSTEM_VOLT, "system-volt"),
        MP2629_MAP(INPUT_VOLT, "input-volt"),
        MP2629_MAP(BATT_CURRENT, "batt-current"),
-       MP2629_MAP(INPUT_CURRENT, "input-current")
+       MP2629_MAP(INPUT_CURRENT, "input-current"),
+       { }
 };
 
 static int mp2629_read_raw(struct iio_dev *indio_dev,
@@ -74,7 +75,7 @@ static int mp2629_read_raw(struct iio_dev *indio_dev,
                if (ret)
                        return ret;
 
-               if (chan->address == MP2629_INPUT_VOLT)
+               if (chan->channel == MP2629_INPUT_VOLT)
                        rval &= GENMASK(6, 0);
                *val = rval;
                return IIO_VAL_INT;
index 307557a..52744dd 100644 (file)
@@ -632,7 +632,7 @@ static int bno055_set_regmask(struct bno055_priv *priv, int val, int val2,
                        return -EINVAL;
                }
                delta = abs(tbl_val - req_val);
-               if (delta < best_delta || first) {
+               if (first || delta < best_delta) {
                        best_delta = delta;
                        hwval = i;
                        first = false;
index cbc9349..550b75b 100644 (file)
@@ -25,13 +25,6 @@ enum {
        MS5607,
 };
 
-struct ms5611_chip_info {
-       u16 prom[MS5611_PROM_WORDS_NB];
-
-       int (*temp_and_pressure_compensate)(struct ms5611_chip_info *chip_info,
-                                           s32 *temp, s32 *pressure);
-};
-
 /*
  * OverSampling Rate descriptor.
  * Warning: cmd MUST be kept aligned on a word boundary (see
@@ -50,12 +43,15 @@ struct ms5611_state {
        const struct ms5611_osr *pressure_osr;
        const struct ms5611_osr *temp_osr;
 
+       u16 prom[MS5611_PROM_WORDS_NB];
+
        int (*reset)(struct ms5611_state *st);
        int (*read_prom_word)(struct ms5611_state *st, int index, u16 *word);
        int (*read_adc_temp_and_pressure)(struct ms5611_state *st,
                                          s32 *temp, s32 *pressure);
 
-       struct ms5611_chip_info *chip_info;
+       int (*compensate_temp_and_pressure)(struct ms5611_state *st, s32 *temp,
+                                         s32 *pressure);
        struct regulator *vdd;
 };
 
index 717521d..c564a1d 100644 (file)
@@ -85,7 +85,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
        struct ms5611_state *st = iio_priv(indio_dev);
 
        for (i = 0; i < MS5611_PROM_WORDS_NB; i++) {
-               ret = st->read_prom_word(st, i, &st->chip_info->prom[i]);
+               ret = st->read_prom_word(st, i, &st->prom[i]);
                if (ret < 0) {
                        dev_err(&indio_dev->dev,
                                "failed to read prom at %d\n", i);
@@ -93,7 +93,7 @@ static int ms5611_read_prom(struct iio_dev *indio_dev)
                }
        }
 
-       if (!ms5611_prom_is_valid(st->chip_info->prom, MS5611_PROM_WORDS_NB)) {
+       if (!ms5611_prom_is_valid(st->prom, MS5611_PROM_WORDS_NB)) {
                dev_err(&indio_dev->dev, "PROM integrity check failed\n");
                return -ENODEV;
        }
@@ -114,21 +114,20 @@ static int ms5611_read_temp_and_pressure(struct iio_dev *indio_dev,
                return ret;
        }
 
-       return st->chip_info->temp_and_pressure_compensate(st->chip_info,
-                                                          temp, pressure);
+       return st->compensate_temp_and_pressure(st, temp, pressure);
 }
 
-static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
+static int ms5611_temp_and_pressure_compensate(struct ms5611_state *st,
                                               s32 *temp, s32 *pressure)
 {
        s32 t = *temp, p = *pressure;
        s64 off, sens, dt;
 
-       dt = t - (chip_info->prom[5] << 8);
-       off = ((s64)chip_info->prom[2] << 16) + ((chip_info->prom[4] * dt) >> 7);
-       sens = ((s64)chip_info->prom[1] << 15) + ((chip_info->prom[3] * dt) >> 8);
+       dt = t - (st->prom[5] << 8);
+       off = ((s64)st->prom[2] << 16) + ((st->prom[4] * dt) >> 7);
+       sens = ((s64)st->prom[1] << 15) + ((st->prom[3] * dt) >> 8);
 
-       t = 2000 + ((chip_info->prom[6] * dt) >> 23);
+       t = 2000 + ((st->prom[6] * dt) >> 23);
        if (t < 2000) {
                s64 off2, sens2, t2;
 
@@ -154,17 +153,17 @@ static int ms5611_temp_and_pressure_compensate(struct ms5611_chip_info *chip_inf
        return 0;
 }
 
-static int ms5607_temp_and_pressure_compensate(struct ms5611_chip_info *chip_info,
+static int ms5607_temp_and_pressure_compensate(struct ms5611_state *st,
                                               s32 *temp, s32 *pressure)
 {
        s32 t = *temp, p = *pressure;
        s64 off, sens, dt;
 
-       dt = t - (chip_info->prom[5] << 8);
-       off = ((s64)chip_info->prom[2] << 17) + ((chip_info->prom[4] * dt) >> 6);
-       sens = ((s64)chip_info->prom[1] << 16) + ((chip_info->prom[3] * dt) >> 7);
+       dt = t - (st->prom[5] << 8);
+       off = ((s64)st->prom[2] << 17) + ((st->prom[4] * dt) >> 6);
+       sens = ((s64)st->prom[1] << 16) + ((st->prom[3] * dt) >> 7);
 
-       t = 2000 + ((chip_info->prom[6] * dt) >> 23);
+       t = 2000 + ((st->prom[6] * dt) >> 23);
        if (t < 2000) {
                s64 off2, sens2, t2, tmp;
 
@@ -342,15 +341,6 @@ static int ms5611_write_raw(struct iio_dev *indio_dev,
 
 static const unsigned long ms5611_scan_masks[] = {0x3, 0};
 
-static struct ms5611_chip_info chip_info_tbl[] = {
-       [MS5611] = {
-               .temp_and_pressure_compensate = ms5611_temp_and_pressure_compensate,
-       },
-       [MS5607] = {
-               .temp_and_pressure_compensate = ms5607_temp_and_pressure_compensate,
-       }
-};
-
 static const struct iio_chan_spec ms5611_channels[] = {
        {
                .type = IIO_PRESSURE,
@@ -433,7 +423,20 @@ int ms5611_probe(struct iio_dev *indio_dev, struct device *dev,
        struct ms5611_state *st = iio_priv(indio_dev);
 
        mutex_init(&st->lock);
-       st->chip_info = &chip_info_tbl[type];
+
+       switch (type) {
+       case MS5611:
+               st->compensate_temp_and_pressure =
+                       ms5611_temp_and_pressure_compensate;
+               break;
+       case MS5607:
+               st->compensate_temp_and_pressure =
+                       ms5607_temp_and_pressure_compensate;
+               break;
+       default:
+               return -EINVAL;
+       }
+
        st->temp_osr =
                &ms5611_avail_temp_osr[ARRAY_SIZE(ms5611_avail_temp_osr) - 1];
        st->pressure_osr =
index 432e912..a0a7205 100644 (file)
@@ -91,7 +91,7 @@ static int ms5611_spi_probe(struct spi_device *spi)
        spi_set_drvdata(spi, indio_dev);
 
        spi->mode = SPI_MODE_0;
-       spi->max_speed_hz = 20000000;
+       spi->max_speed_hz = min(spi->max_speed_hz, 20000000U);
        spi->bits_per_word = 8;
        ret = spi_setup(spi);
        if (ret < 0)
index d6c5e96..6b05eed 100644 (file)
@@ -203,9 +203,13 @@ static int iio_sysfs_trigger_remove(int id)
 
 static int __init iio_sysfs_trig_init(void)
 {
+       int ret;
        device_initialize(&iio_sysfs_trig_dev);
        dev_set_name(&iio_sysfs_trig_dev, "iio_sysfs_trigger");
-       return device_add(&iio_sysfs_trig_dev);
+       ret = device_add(&iio_sysfs_trig_dev);
+       if (ret)
+               put_device(&iio_sysfs_trig_dev);
+       return ret;
 }
 module_init(iio_sysfs_trig_init);
 
index b86de13..84b8752 100644 (file)
@@ -273,22 +273,22 @@ int iforce_init_device(struct device *parent, u16 bustype,
  * Get device info.
  */
 
-       if (!iforce_get_id_packet(iforce, 'M', buf, &len) || len < 3)
+       if (!iforce_get_id_packet(iforce, 'M', buf, &len) && len >= 3)
                input_dev->id.vendor = get_unaligned_le16(buf + 1);
        else
                dev_warn(&iforce->dev->dev, "Device does not respond to id packet M\n");
 
-       if (!iforce_get_id_packet(iforce, 'P', buf, &len) || len < 3)
+       if (!iforce_get_id_packet(iforce, 'P', buf, &len) && len >= 3)
                input_dev->id.product = get_unaligned_le16(buf + 1);
        else
                dev_warn(&iforce->dev->dev, "Device does not respond to id packet P\n");
 
-       if (!iforce_get_id_packet(iforce, 'B', buf, &len) || len < 3)
+       if (!iforce_get_id_packet(iforce, 'B', buf, &len) && len >= 3)
                iforce->device_memory.end = get_unaligned_le16(buf + 1);
        else
                dev_warn(&iforce->dev->dev, "Device does not respond to id packet B\n");
 
-       if (!iforce_get_id_packet(iforce, 'N', buf, &len) || len < 2)
+       if (!iforce_get_id_packet(iforce, 'N', buf, &len) && len >= 2)
                ff_effects = buf[1];
        else
                dev_warn(&iforce->dev->dev, "Device does not respond to id packet N\n");
index 4804761..0948938 100644 (file)
 #include <linux/gpio.h>
 #include <linux/platform_device.h>
 
+static bool use_low_level_irq;
+module_param(use_low_level_irq, bool, 0444);
+MODULE_PARM_DESC(use_low_level_irq, "Use low-level triggered IRQ instead of edge triggered");
+
 struct soc_button_info {
        const char *name;
        int acpi_index;
@@ -74,6 +78,13 @@ static const struct dmi_system_id dmi_use_low_level_irq[] = {
                },
        },
        {
+               /* Acer Switch V 10 SW5-017, same issue as Acer Switch 10 SW5-012. */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
+               },
+       },
+       {
                /*
                 * Acer One S1003. _LID method messes with power-button GPIO
                 * IRQ settings, leading to a non working power-button.
@@ -164,7 +175,8 @@ soc_button_device_create(struct platform_device *pdev,
                }
 
                /* See dmi_use_low_level_irq[] comment */
-               if (!autorepeat && dmi_check_system(dmi_use_low_level_irq)) {
+               if (!autorepeat && (use_low_level_irq ||
+                                   dmi_check_system(dmi_use_low_level_irq))) {
                        irq_set_irq_type(irq, IRQ_TYPE_LEVEL_LOW);
                        gpio_keys[n_buttons].irq = irq;
                        gpio_keys[n_buttons].gpio = -ENOENT;
index fa021af..b0f7764 100644 (file)
@@ -192,6 +192,7 @@ static const char * const smbus_pnp_ids[] = {
        "SYN3221", /* HP 15-ay000 */
        "SYN323d", /* HP Spectre X360 13-w013dx */
        "SYN3257", /* HP Envy 13-ad105ng */
+       "SYN3286", /* HP Laptop 15-da3001TU */
        NULL
 };
 
index 0778dc0..46f8a69 100644 (file)
@@ -115,18 +115,18 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
                .driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_NEVER)
        },
        {
-               /* ASUS ZenBook UX425UA */
+               /* ASUS ZenBook UX425UA/QA */
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425UA"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX425"),
                },
                .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
        },
        {
-               /* ASUS ZenBook UM325UA */
+               /* ASUS ZenBook UM325UA/QA */
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
-                       DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325UA_UM325UA"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "ZenBook UX325"),
                },
                .driver_data = (void *)(SERIO_QUIRK_PROBE_DEFER | SERIO_QUIRK_RESET_NEVER)
        },
index f948649..6dac7c1 100644 (file)
@@ -1543,8 +1543,6 @@ static int i8042_probe(struct platform_device *dev)
 {
        int error;
 
-       i8042_platform_device = dev;
-
        if (i8042_reset == I8042_RESET_ALWAYS) {
                error = i8042_controller_selftest();
                if (error)
@@ -1582,7 +1580,6 @@ static int i8042_probe(struct platform_device *dev)
        i8042_free_aux_ports(); /* in case KBD failed but AUX not */
        i8042_free_irqs();
        i8042_controller_reset(false);
-       i8042_platform_device = NULL;
 
        return error;
 }
@@ -1592,7 +1589,6 @@ static int i8042_remove(struct platform_device *dev)
        i8042_unregister_ports();
        i8042_free_irqs();
        i8042_controller_reset(false);
-       i8042_platform_device = NULL;
 
        return 0;
 }
index a33cc79..c281e49 100644 (file)
@@ -1158,6 +1158,7 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
        input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
        input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
 
+retry_read_config:
        /* Read configuration and apply touchscreen parameters */
        goodix_read_config(ts);
 
@@ -1165,6 +1166,16 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
        touchscreen_parse_properties(ts->input_dev, true, &ts->prop);
 
        if (!ts->prop.max_x || !ts->prop.max_y || !ts->max_touch_num) {
+               if (!ts->reset_controller_at_probe &&
+                   ts->irq_pin_access_method != IRQ_PIN_ACCESS_NONE) {
+                       dev_info(&ts->client->dev, "Config not set, resetting controller\n");
+                       /* Retry after a controller reset */
+                       ts->reset_controller_at_probe = true;
+                       error = goodix_reset(ts);
+                       if (error)
+                               return error;
+                       goto retry_read_config;
+               }
                dev_err(&ts->client->dev,
                        "Invalid config (%d, %d, %d), using defaults\n",
                        ts->prop.max_x, ts->prop.max_y, ts->max_touch_num);
index 48cdcd0..996a8b5 100644 (file)
@@ -959,11 +959,9 @@ static struct dma_pte *pfn_to_dma_pte(struct dmar_domain *domain,
 
                        domain_flush_cache(domain, tmp_page, VTD_PAGE_SIZE);
                        pteval = ((uint64_t)virt_to_dma_pfn(tmp_page) << VTD_PAGE_SHIFT) | DMA_PTE_READ | DMA_PTE_WRITE;
-                       if (domain_use_first_level(domain)) {
-                               pteval |= DMA_FL_PTE_XD | DMA_FL_PTE_US;
-                               if (iommu_is_dma_domain(&domain->domain))
-                                       pteval |= DMA_FL_PTE_ACCESS;
-                       }
+                       if (domain_use_first_level(domain))
+                               pteval |= DMA_FL_PTE_XD | DMA_FL_PTE_US | DMA_FL_PTE_ACCESS;
+
                        if (cmpxchg64(&pte->val, 0ULL, pteval))
                                /* Someone else set it while we were thinking; use theirs. */
                                free_pgtable_page(tmp_page);
index c30ddac..e13d7e5 100644 (file)
@@ -642,7 +642,7 @@ int intel_pasid_setup_second_level(struct intel_iommu *iommu,
         * Since it is a second level only translation setup, we should
         * set SRE bit as well (addresses are expected to be GPAs).
         */
-       if (pasid != PASID_RID2PASID)
+       if (pasid != PASID_RID2PASID && ecap_srs(iommu->ecap))
                pasid_set_sre(pte);
        pasid_set_present(pte);
        spin_unlock(&iommu->lock);
@@ -685,7 +685,8 @@ int intel_pasid_setup_pass_through(struct intel_iommu *iommu,
         * We should set SRE bit as well since the addresses are expected
         * to be GPAs.
         */
-       pasid_set_sre(pte);
+       if (ecap_srs(iommu->ecap))
+               pasid_set_sre(pte);
        pasid_set_present(pte);
        spin_unlock(&iommu->lock);
 
index 7ea0100..90ee56d 100644 (file)
@@ -222,7 +222,7 @@ mISDN_register_device(struct mISDNdevice *dev,
 
        err = get_free_devid();
        if (err < 0)
-               goto error1;
+               return err;
        dev->id = err;
 
        device_initialize(&dev->dev);
index c3b2c99..cfbcd9e 100644 (file)
@@ -77,6 +77,7 @@ int mISDN_dsp_element_register(struct mISDN_dsp_element *elem)
        if (!entry)
                return -ENOMEM;
 
+       INIT_LIST_HEAD(&entry->list);
        entry->elem = elem;
 
        entry->dev.class = elements_class;
@@ -107,7 +108,7 @@ err2:
        device_unregister(&entry->dev);
        return ret;
 err1:
-       kfree(entry);
+       put_device(&entry->dev);
        return ret;
 }
 EXPORT_SYMBOL(mISDN_dsp_element_register);
index 9c5ef81..bb786c3 100644 (file)
@@ -1858,6 +1858,8 @@ bad:
        dm_io_client_destroy(c->dm_io);
 bad_dm_io:
        mutex_destroy(&c->lock);
+       if (c->no_sleep)
+               static_branch_dec(&no_sleep_enabled);
        kfree(c);
 bad_client:
        return ERR_PTR(r);
index 159c680..2653516 100644 (file)
@@ -3630,6 +3630,7 @@ static void crypt_io_hints(struct dm_target *ti, struct queue_limits *limits)
        limits->physical_block_size =
                max_t(unsigned, limits->physical_block_size, cc->sector_size);
        limits->io_min = max_t(unsigned, limits->io_min, cc->sector_size);
+       limits->dma_alignment = limits->logical_block_size - 1;
 }
 
 static struct target_type crypt_target = {
index aaf2472..e97e9f9 100644 (file)
@@ -263,6 +263,7 @@ struct dm_integrity_c {
 
        struct completion crypto_backoff;
 
+       bool wrote_to_journal;
        bool journal_uptodate;
        bool just_formatted;
        bool recalculate_flag;
@@ -2375,6 +2376,8 @@ static void integrity_commit(struct work_struct *w)
        if (!commit_sections)
                goto release_flush_bios;
 
+       ic->wrote_to_journal = true;
+
        i = commit_start;
        for (n = 0; n < commit_sections; n++) {
                for (j = 0; j < ic->journal_section_entries; j++) {
@@ -2591,10 +2594,6 @@ static void integrity_writer(struct work_struct *w)
 
        unsigned prev_free_sectors;
 
-       /* the following test is not needed, but it tests the replay code */
-       if (unlikely(dm_post_suspending(ic->ti)) && !ic->meta_dev)
-               return;
-
        spin_lock_irq(&ic->endio_wait.lock);
        write_start = ic->committed_section;
        write_sections = ic->n_committed_sections;
@@ -3101,10 +3100,17 @@ static void dm_integrity_postsuspend(struct dm_target *ti)
        drain_workqueue(ic->commit_wq);
 
        if (ic->mode == 'J') {
-               if (ic->meta_dev)
-                       queue_work(ic->writer_wq, &ic->writer_work);
+               queue_work(ic->writer_wq, &ic->writer_work);
                drain_workqueue(ic->writer_wq);
                dm_integrity_flush_buffers(ic, true);
+               if (ic->wrote_to_journal) {
+                       init_journal(ic, ic->free_section,
+                                    ic->journal_sections - ic->free_section, ic->commit_seq);
+                       if (ic->free_section) {
+                               init_journal(ic, 0, ic->free_section,
+                                            next_commit_seq(ic->commit_seq));
+                       }
+               }
        }
 
        if (ic->mode == 'B') {
@@ -3132,6 +3138,8 @@ static void dm_integrity_resume(struct dm_target *ti)
 
        DEBUG_print("resume\n");
 
+       ic->wrote_to_journal = false;
+
        if (ic->provided_data_sectors != old_provided_data_sectors) {
                if (ic->provided_data_sectors > old_provided_data_sectors &&
                    ic->mode == 'B' &&
@@ -3370,6 +3378,7 @@ static void dm_integrity_io_hints(struct dm_target *ti, struct queue_limits *lim
                limits->logical_block_size = ic->sectors_per_block << SECTOR_SHIFT;
                limits->physical_block_size = ic->sectors_per_block << SECTOR_SHIFT;
                blk_limits_io_min(limits, ic->sectors_per_block << SECTOR_SHIFT);
+               limits->dma_alignment = limits->logical_block_size - 1;
        }
 }
 
index 6b3f867..3bfc158 100644 (file)
@@ -655,7 +655,7 @@ static void list_version_get_needed(struct target_type *tt, void *needed_param)
     size_t *needed = needed_param;
 
     *needed += sizeof(struct dm_target_versions);
-    *needed += strlen(tt->name);
+    *needed += strlen(tt->name) + 1;
     *needed += ALIGN_MASK;
 }
 
@@ -720,7 +720,7 @@ static int __list_versions(struct dm_ioctl *param, size_t param_size, const char
        iter_info.old_vers = NULL;
        iter_info.vers = vers;
        iter_info.flags = 0;
-       iter_info.end = (char *)vers+len;
+       iter_info.end = (char *)vers + needed;
 
        /*
         * Now loop through filling out the names & versions.
index 20fd688..178e13a 100644 (file)
@@ -875,6 +875,7 @@ static void log_writes_io_hints(struct dm_target *ti, struct queue_limits *limit
        limits->logical_block_size = bdev_logical_block_size(lc->dev->bdev);
        limits->physical_block_size = bdev_physical_block_size(lc->dev->bdev);
        limits->io_min = limits->physical_block_size;
+       limits->dma_alignment = limits->logical_block_size - 1;
 }
 
 #if IS_ENABLED(CONFIG_FS_DAX)
index e71068f..844264e 100644 (file)
@@ -854,6 +854,7 @@ static int qp_notify_peer_local(bool attach, struct vmci_handle handle)
        u32 context_id = vmci_get_context_id();
        struct vmci_event_qp ev;
 
+       memset(&ev, 0, sizeof(ev));
        ev.msg.hdr.dst = vmci_make_handle(context_id, VMCI_EVENT_HANDLER);
        ev.msg.hdr.src = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
                                          VMCI_CONTEXT_RESOURCE_ID);
@@ -1467,6 +1468,7 @@ static int qp_notify_peer(bool attach,
         * kernel.
         */
 
+       memset(&ev, 0, sizeof(ev));
        ev.msg.hdr.dst = vmci_make_handle(peer_id, VMCI_EVENT_HANDLER);
        ev.msg.hdr.src = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
                                          VMCI_CONTEXT_RESOURCE_ID);
index 95fa8fb..c5de202 100644 (file)
@@ -1134,7 +1134,13 @@ u32 mmc_select_voltage(struct mmc_host *host, u32 ocr)
                mmc_power_cycle(host, ocr);
        } else {
                bit = fls(ocr) - 1;
-               ocr &= 3 << bit;
+               /*
+                * The bit variable represents the highest voltage bit set in
+                * the OCR register.
+                * To keep a range of 2 values (e.g. 3.2V/3.3V and 3.3V/3.4V),
+                * we must shift the mask '3' with (bit - 1).
+                */
+               ocr &= 3 << (bit - 1);
                if (bit != host->ios.vdd)
                        dev_warn(mmc_dev(host), "exceeding card's volts\n");
        }
index 34ea1ac..28dc650 100644 (file)
@@ -1749,6 +1749,8 @@ static int amd_probe(struct sdhci_pci_chip *chip)
                }
        }
 
+       pci_dev_put(smbus_dev);
+
        if (gen == AMD_CHIPSET_BEFORE_ML || gen == AMD_CHIPSET_CZ)
                chip->quirks2 |= SDHCI_QUIRK2_CLEAR_TRANSFERMODE_REG_BEFORE_CMD;
 
index ad457cd..bca1d09 100644 (file)
@@ -32,6 +32,7 @@
 #define O2_SD_CAPS             0xE0
 #define O2_SD_ADMA1            0xE2
 #define O2_SD_ADMA2            0xE7
+#define O2_SD_MISC_CTRL2       0xF0
 #define O2_SD_INF_MOD          0xF1
 #define O2_SD_MISC_CTRL4       0xFC
 #define O2_SD_MISC_CTRL                0x1C0
@@ -877,6 +878,12 @@ static int sdhci_pci_o2_probe(struct sdhci_pci_chip *chip)
                /* Set Tuning Windows to 5 */
                pci_write_config_byte(chip->pdev,
                                O2_SD_TUNING_CTRL, 0x55);
+               //Adjust 1st and 2nd CD debounce time
+               pci_read_config_dword(chip->pdev, O2_SD_MISC_CTRL2, &scratch_32);
+               scratch_32 &= 0xFFE7FFFF;
+               scratch_32 |= 0x00180000;
+               pci_write_config_dword(chip->pdev, O2_SD_MISC_CTRL2, scratch_32);
+               pci_write_config_dword(chip->pdev, O2_SD_DETECT_SETTING, 1);
                /* Lock WP */
                ret = pci_read_config_byte(chip->pdev,
                                           O2_SD_LOCK_WP, &scratch);
index 34d9a7a..c94bf48 100644 (file)
@@ -26,6 +26,7 @@ config MTD_ONENAND_OMAP2
        tristate "OneNAND on OMAP2/OMAP3 support"
        depends on ARCH_OMAP2 || ARCH_OMAP3 || (COMPILE_TEST && ARM)
        depends on OF || COMPILE_TEST
+       depends on OMAP_GPMC
        help
          Support for a OneNAND flash device connected to an OMAP2/OMAP3 SoC
          via the GPMC memory controller.
index 33f2c98..c3cc660 100644 (file)
@@ -5834,7 +5834,7 @@ nand_match_ecc_req(struct nand_chip *chip,
        int req_step = requirements->step_size;
        int req_strength = requirements->strength;
        int req_corr, step_size, strength, nsteps, ecc_bytes, ecc_bytes_total;
-       int best_step, best_strength, best_ecc_bytes;
+       int best_step = 0, best_strength = 0, best_ecc_bytes = 0;
        int best_ecc_bytes_total = INT_MAX;
        int i, j;
 
@@ -5915,7 +5915,7 @@ nand_maximize_ecc(struct nand_chip *chip,
        int step_size, strength, nsteps, ecc_bytes, corr;
        int best_corr = 0;
        int best_step = 0;
-       int best_strength, best_ecc_bytes;
+       int best_strength = 0, best_ecc_bytes = 0;
        int i, j;
 
        for (i = 0; i < caps->nstepinfos; i++) {
index 8f80019..198a447 100644 (file)
@@ -3167,16 +3167,18 @@ static int qcom_nand_host_init_and_register(struct qcom_nand_controller *nandc,
 
        ret = mtd_device_parse_register(mtd, probes, NULL, NULL, 0);
        if (ret)
-               nand_cleanup(chip);
+               goto err;
 
        if (nandc->props->use_codeword_fixup) {
                ret = qcom_nand_host_parse_boot_partitions(nandc, host, dn);
-               if (ret) {
-                       nand_cleanup(chip);
-                       return ret;
-               }
+               if (ret)
+                       goto err;
        }
 
+       return 0;
+
+err:
+       nand_cleanup(chip);
        return ret;
 }
 
index d350eee..5a454b5 100644 (file)
@@ -4543,13 +4543,19 @@ static struct pci_driver ena_pci_driver = {
 
 static int __init ena_init(void)
 {
+       int ret;
+
        ena_wq = create_singlethread_workqueue(DRV_MODULE_NAME);
        if (!ena_wq) {
                pr_err("Failed to create workqueue\n");
                return -ENOMEM;
        }
 
-       return pci_register_driver(&ena_pci_driver);
+       ret = pci_register_driver(&ena_pci_driver);
+       if (ret)
+               destroy_workqueue(ena_wq);
+
+       return ret;
 }
 
 static void __exit ena_cleanup(void)
index cc932b3..4a1efe9 100644 (file)
@@ -1427,7 +1427,7 @@ static int ag71xx_open(struct net_device *ndev)
        if (ret) {
                netif_err(ag, link, ndev, "phylink_of_phy_connect filed with err: %i\n",
                          ret);
-               goto err;
+               return ret;
        }
 
        max_frame_len = ag71xx_max_frame_len(ndev->mtu);
@@ -1448,6 +1448,7 @@ static int ag71xx_open(struct net_device *ndev)
 
 err:
        ag71xx_rings_cleanup(ag);
+       phylink_disconnect_phy(ag->phylink);
        return ret;
 }
 
index 5fb3af5..3038386 100644 (file)
@@ -1568,7 +1568,6 @@ void bgmac_enet_remove(struct bgmac *bgmac)
        phy_disconnect(bgmac->net_dev->phydev);
        netif_napi_del(&bgmac->napi);
        bgmac_dma_free(bgmac);
-       free_netdev(bgmac->net_dev);
 }
 EXPORT_SYMBOL_GPL(bgmac_enet_remove);
 
index c78b6e9..9f8a6ce 100644 (file)
@@ -14037,8 +14037,16 @@ static struct pci_driver bnxt_pci_driver = {
 
 static int __init bnxt_init(void)
 {
+       int err;
+
        bnxt_debug_init();
-       return pci_register_driver(&bnxt_pci_driver);
+       err = pci_register_driver(&bnxt_pci_driver);
+       if (err) {
+               bnxt_debug_exit();
+               return err;
+       }
+
+       return 0;
 }
 
 static void __exit bnxt_exit(void)
index d312bd5..7577182 100644 (file)
@@ -1794,13 +1794,10 @@ static int liquidio_open(struct net_device *netdev)
 
        ifstate_set(lio, LIO_IFSTATE_RUNNING);
 
-       if (OCTEON_CN23XX_PF(oct)) {
-               if (!oct->msix_on)
-                       if (setup_tx_poll_fn(netdev))
-                               return -1;
-       } else {
-               if (setup_tx_poll_fn(netdev))
-                       return -1;
+       if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on)) {
+               ret = setup_tx_poll_fn(netdev);
+               if (ret)
+                       goto err_poll;
        }
 
        netif_tx_start_all_queues(netdev);
@@ -1813,7 +1810,7 @@ static int liquidio_open(struct net_device *netdev)
        /* tell Octeon to start forwarding packets to host */
        ret = send_rx_ctrl_cmd(lio, 1);
        if (ret)
-               return ret;
+               goto err_rx_ctrl;
 
        /* start periodical statistics fetch */
        INIT_DELAYED_WORK(&lio->stats_wk.work, lio_fetch_stats);
@@ -1824,6 +1821,27 @@ static int liquidio_open(struct net_device *netdev)
        dev_info(&oct->pci_dev->dev, "%s interface is opened\n",
                 netdev->name);
 
+       return 0;
+
+err_rx_ctrl:
+       if (!OCTEON_CN23XX_PF(oct) || (OCTEON_CN23XX_PF(oct) && !oct->msix_on))
+               cleanup_tx_poll_fn(netdev);
+err_poll:
+       if (lio->ptp_clock) {
+               ptp_clock_unregister(lio->ptp_clock);
+               lio->ptp_clock = NULL;
+       }
+
+       if (oct->props[lio->ifidx].napi_enabled == 1) {
+               list_for_each_entry_safe(napi, n, &netdev->napi_list, dev_list)
+                       napi_disable(napi);
+
+               oct->props[lio->ifidx].napi_enabled = 0;
+
+               if (OCTEON_CN23XX_PF(oct))
+                       oct->droq[0]->ops.poll_mode = 0;
+       }
+
        return ret;
 }
 
index 0179fc2..17137de 100644 (file)
@@ -819,7 +819,6 @@ struct hnae3_knic_private_info {
        const struct hnae3_dcb_ops *dcb_ops;
 
        u16 int_rl_setting;
-       enum pkt_hash_types rss_type;
        void __iomem *io_base;
 };
 
index e23729a..ae27365 100644 (file)
@@ -191,23 +191,6 @@ u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle)
        return HCLGE_COMM_RSS_KEY_SIZE;
 }
 
-void hclge_comm_get_rss_type(struct hnae3_handle *nic,
-                            struct hclge_comm_rss_tuple_cfg *rss_tuple_sets)
-{
-       if (rss_tuple_sets->ipv4_tcp_en ||
-           rss_tuple_sets->ipv4_udp_en ||
-           rss_tuple_sets->ipv4_sctp_en ||
-           rss_tuple_sets->ipv6_tcp_en ||
-           rss_tuple_sets->ipv6_udp_en ||
-           rss_tuple_sets->ipv6_sctp_en)
-               nic->kinfo.rss_type = PKT_HASH_TYPE_L4;
-       else if (rss_tuple_sets->ipv4_fragment_en ||
-                rss_tuple_sets->ipv6_fragment_en)
-               nic->kinfo.rss_type = PKT_HASH_TYPE_L3;
-       else
-               nic->kinfo.rss_type = PKT_HASH_TYPE_NONE;
-}
-
 int hclge_comm_parse_rss_hfunc(struct hclge_comm_rss_cfg *rss_cfg,
                               const u8 hfunc, u8 *hash_algo)
 {
@@ -344,9 +327,6 @@ int hclge_comm_set_rss_input_tuple(struct hnae3_handle *nic,
        req->ipv6_sctp_en = rss_cfg->rss_tuple_sets.ipv6_sctp_en;
        req->ipv6_fragment_en = rss_cfg->rss_tuple_sets.ipv6_fragment_en;
 
-       if (is_pf)
-               hclge_comm_get_rss_type(nic, &rss_cfg->rss_tuple_sets);
-
        ret = hclge_comm_cmd_send(hw, &desc, 1);
        if (ret)
                dev_err(&hw->cmq.csq.pdev->dev,
index 946d166..92af3d2 100644 (file)
@@ -95,8 +95,6 @@ struct hclge_comm_rss_tc_mode_cmd {
 };
 
 u32 hclge_comm_get_rss_key_size(struct hnae3_handle *handle);
-void hclge_comm_get_rss_type(struct hnae3_handle *nic,
-                            struct hclge_comm_rss_tuple_cfg *rss_tuple_sets);
 void hclge_comm_rss_indir_init_cfg(struct hnae3_ae_dev *ae_dev,
                                   struct hclge_comm_rss_cfg *rss_cfg);
 int hclge_comm_get_rss_tuple(struct hclge_comm_rss_cfg *rss_cfg, int flow_type,
index 4cb2421..0285779 100644 (file)
@@ -105,26 +105,28 @@ static const struct pci_device_id hns3_pci_tbl[] = {
 };
 MODULE_DEVICE_TABLE(pci, hns3_pci_tbl);
 
-#define HNS3_RX_PTYPE_ENTRY(ptype, l, s, t) \
+#define HNS3_RX_PTYPE_ENTRY(ptype, l, s, t, h) \
        {       ptype, \
                l, \
                CHECKSUM_##s, \
                HNS3_L3_TYPE_##t, \
-               1 }
+               1, \
+               h}
 
 #define HNS3_RX_PTYPE_UNUSED_ENTRY(ptype) \
-               { ptype, 0, CHECKSUM_NONE, HNS3_L3_TYPE_PARSE_FAIL, 0 }
+               { ptype, 0, CHECKSUM_NONE, HNS3_L3_TYPE_PARSE_FAIL, 0, \
+                 PKT_HASH_TYPE_NONE }
 
 static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
        HNS3_RX_PTYPE_UNUSED_ENTRY(0),
-       HNS3_RX_PTYPE_ENTRY(1, 0, COMPLETE, ARP),
-       HNS3_RX_PTYPE_ENTRY(2, 0, COMPLETE, RARP),
-       HNS3_RX_PTYPE_ENTRY(3, 0, COMPLETE, LLDP),
-       HNS3_RX_PTYPE_ENTRY(4, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(5, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(6, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(7, 0, COMPLETE, CNM),
-       HNS3_RX_PTYPE_ENTRY(8, 0, NONE, PARSE_FAIL),
+       HNS3_RX_PTYPE_ENTRY(1, 0, COMPLETE, ARP, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(2, 0, COMPLETE, RARP, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(3, 0, COMPLETE, LLDP, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(4, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(5, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(6, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(7, 0, COMPLETE, CNM, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(8, 0, NONE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
        HNS3_RX_PTYPE_UNUSED_ENTRY(9),
        HNS3_RX_PTYPE_UNUSED_ENTRY(10),
        HNS3_RX_PTYPE_UNUSED_ENTRY(11),
@@ -132,36 +134,36 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
        HNS3_RX_PTYPE_UNUSED_ENTRY(13),
        HNS3_RX_PTYPE_UNUSED_ENTRY(14),
        HNS3_RX_PTYPE_UNUSED_ENTRY(15),
-       HNS3_RX_PTYPE_ENTRY(16, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(17, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(18, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(19, 0, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(20, 0, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(21, 0, NONE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(22, 0, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(23, 0, NONE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(24, 0, NONE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(25, 0, UNNECESSARY, IPV4),
+       HNS3_RX_PTYPE_ENTRY(16, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(17, 0, COMPLETE, IPV4, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(18, 0, COMPLETE, IPV4, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(19, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(20, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(21, 0, NONE, IPV4, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(22, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(23, 0, NONE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(24, 0, NONE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(25, 0, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
        HNS3_RX_PTYPE_UNUSED_ENTRY(26),
        HNS3_RX_PTYPE_UNUSED_ENTRY(27),
        HNS3_RX_PTYPE_UNUSED_ENTRY(28),
-       HNS3_RX_PTYPE_ENTRY(29, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(30, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(31, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(32, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(33, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(34, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(35, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(36, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(37, 0, COMPLETE, IPV4),
+       HNS3_RX_PTYPE_ENTRY(29, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(30, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(31, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(32, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(33, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(34, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(35, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(36, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(37, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
        HNS3_RX_PTYPE_UNUSED_ENTRY(38),
-       HNS3_RX_PTYPE_ENTRY(39, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(40, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(41, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(42, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(43, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(44, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(45, 0, COMPLETE, IPV6),
+       HNS3_RX_PTYPE_ENTRY(39, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(40, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(41, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(42, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(43, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(44, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(45, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
        HNS3_RX_PTYPE_UNUSED_ENTRY(46),
        HNS3_RX_PTYPE_UNUSED_ENTRY(47),
        HNS3_RX_PTYPE_UNUSED_ENTRY(48),
@@ -227,35 +229,35 @@ static const struct hns3_rx_ptype hns3_rx_ptype_tbl[] = {
        HNS3_RX_PTYPE_UNUSED_ENTRY(108),
        HNS3_RX_PTYPE_UNUSED_ENTRY(109),
        HNS3_RX_PTYPE_UNUSED_ENTRY(110),
-       HNS3_RX_PTYPE_ENTRY(111, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(112, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(113, 0, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(114, 0, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(115, 0, NONE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(116, 0, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(117, 0, NONE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(118, 0, NONE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(119, 0, UNNECESSARY, IPV6),
+       HNS3_RX_PTYPE_ENTRY(111, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(112, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(113, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(114, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(115, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(116, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(117, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(118, 0, NONE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(119, 0, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
        HNS3_RX_PTYPE_UNUSED_ENTRY(120),
        HNS3_RX_PTYPE_UNUSED_ENTRY(121),
        HNS3_RX_PTYPE_UNUSED_ENTRY(122),
-       HNS3_RX_PTYPE_ENTRY(123, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(124, 0, COMPLETE, PARSE_FAIL),
-       HNS3_RX_PTYPE_ENTRY(125, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(126, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(127, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(128, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(129, 1, UNNECESSARY, IPV4),
-       HNS3_RX_PTYPE_ENTRY(130, 0, COMPLETE, IPV4),
-       HNS3_RX_PTYPE_ENTRY(131, 0, COMPLETE, IPV4),
+       HNS3_RX_PTYPE_ENTRY(123, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(124, 0, COMPLETE, PARSE_FAIL, PKT_HASH_TYPE_NONE),
+       HNS3_RX_PTYPE_ENTRY(125, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(126, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(127, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(128, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(129, 1, UNNECESSARY, IPV4, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(130, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(131, 0, COMPLETE, IPV4, PKT_HASH_TYPE_L3),
        HNS3_RX_PTYPE_UNUSED_ENTRY(132),
-       HNS3_RX_PTYPE_ENTRY(133, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(134, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(135, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(136, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(137, 1, UNNECESSARY, IPV6),
-       HNS3_RX_PTYPE_ENTRY(138, 0, COMPLETE, IPV6),
-       HNS3_RX_PTYPE_ENTRY(139, 0, COMPLETE, IPV6),
+       HNS3_RX_PTYPE_ENTRY(133, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(134, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(135, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(136, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(137, 1, UNNECESSARY, IPV6, PKT_HASH_TYPE_L4),
+       HNS3_RX_PTYPE_ENTRY(138, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
+       HNS3_RX_PTYPE_ENTRY(139, 0, COMPLETE, IPV6, PKT_HASH_TYPE_L3),
        HNS3_RX_PTYPE_UNUSED_ENTRY(140),
        HNS3_RX_PTYPE_UNUSED_ENTRY(141),
        HNS3_RX_PTYPE_UNUSED_ENTRY(142),
@@ -3776,8 +3778,8 @@ static void hns3_nic_reuse_page(struct sk_buff *skb, int i,
                desc_cb->reuse_flag = 1;
        } else if (frag_size <= ring->rx_copybreak) {
                ret = hns3_handle_rx_copybreak(skb, i, ring, pull_len, desc_cb);
-               if (ret)
-                       goto out;
+               if (!ret)
+                       return;
        }
 
 out:
@@ -4171,15 +4173,35 @@ static int hns3_set_gro_and_checksum(struct hns3_enet_ring *ring,
 }
 
 static void hns3_set_rx_skb_rss_type(struct hns3_enet_ring *ring,
-                                    struct sk_buff *skb, u32 rss_hash)
+                                    struct sk_buff *skb, u32 rss_hash,
+                                    u32 l234info, u32 ol_info)
 {
-       struct hnae3_handle *handle = ring->tqp->handle;
-       enum pkt_hash_types rss_type;
+       enum pkt_hash_types rss_type = PKT_HASH_TYPE_NONE;
+       struct net_device *netdev = ring_to_netdev(ring);
+       struct hns3_nic_priv *priv = netdev_priv(netdev);
 
-       if (rss_hash)
-               rss_type = handle->kinfo.rss_type;
-       else
-               rss_type = PKT_HASH_TYPE_NONE;
+       if (test_bit(HNS3_NIC_STATE_RXD_ADV_LAYOUT_ENABLE, &priv->state)) {
+               u32 ptype = hnae3_get_field(ol_info, HNS3_RXD_PTYPE_M,
+                                           HNS3_RXD_PTYPE_S);
+
+               rss_type = hns3_rx_ptype_tbl[ptype].hash_type;
+       } else {
+               int l3_type = hnae3_get_field(l234info, HNS3_RXD_L3ID_M,
+                                             HNS3_RXD_L3ID_S);
+               int l4_type = hnae3_get_field(l234info, HNS3_RXD_L4ID_M,
+                                             HNS3_RXD_L4ID_S);
+
+               if (l3_type == HNS3_L3_TYPE_IPV4 ||
+                   l3_type == HNS3_L3_TYPE_IPV6) {
+                       if (l4_type == HNS3_L4_TYPE_UDP ||
+                           l4_type == HNS3_L4_TYPE_TCP ||
+                           l4_type == HNS3_L4_TYPE_SCTP)
+                               rss_type = PKT_HASH_TYPE_L4;
+                       else if (l4_type == HNS3_L4_TYPE_IGMP ||
+                                l4_type == HNS3_L4_TYPE_ICMP)
+                               rss_type = PKT_HASH_TYPE_L3;
+               }
+       }
 
        skb_set_hash(skb, rss_hash, rss_type);
 }
@@ -4282,7 +4304,8 @@ static int hns3_handle_bdinfo(struct hns3_enet_ring *ring, struct sk_buff *skb)
 
        ring->tqp_vector->rx_group.total_bytes += len;
 
-       hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash));
+       hns3_set_rx_skb_rss_type(ring, skb, le32_to_cpu(desc->rx.rss_hash),
+                                l234info, ol_info);
        return 0;
 }
 
index 133a054..294a14b 100644 (file)
@@ -404,6 +404,7 @@ struct hns3_rx_ptype {
        u32 ip_summed : 2;
        u32 l3_type : 4;
        u32 valid : 1;
+       u32 hash_type: 3;
 };
 
 struct ring_stats {
index 987271d..4e54f91 100644 (file)
@@ -3443,6 +3443,7 @@ static int hclge_update_tp_port_info(struct hclge_dev *hdev)
        hdev->hw.mac.autoneg = cmd.base.autoneg;
        hdev->hw.mac.speed = cmd.base.speed;
        hdev->hw.mac.duplex = cmd.base.duplex;
+       linkmode_copy(hdev->hw.mac.advertising, cmd.link_modes.advertising);
 
        return 0;
 }
@@ -4859,7 +4860,6 @@ static int hclge_set_rss_tuple(struct hnae3_handle *handle,
                return ret;
        }
 
-       hclge_comm_get_rss_type(&vport->nic, &hdev->rss_cfg.rss_tuple_sets);
        return 0;
 }
 
@@ -11587,9 +11587,12 @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
        if (ret)
                goto err_msi_irq_uninit;
 
-       if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER &&
-           !hnae3_dev_phy_imp_supported(hdev)) {
-               ret = hclge_mac_mdio_config(hdev);
+       if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER) {
+               if (hnae3_dev_phy_imp_supported(hdev))
+                       ret = hclge_update_tp_port_info(hdev);
+               else
+                       ret = hclge_mac_mdio_config(hdev);
+
                if (ret)
                        goto err_msi_irq_uninit;
        }
index e1f54a2..2d6906a 100644 (file)
@@ -1474,8 +1474,15 @@ static struct pci_driver hinic_driver = {
 
 static int __init hinic_module_init(void)
 {
+       int ret;
+
        hinic_dbg_register_debugfs(HINIC_DRV_NAME);
-       return pci_register_driver(&hinic_driver);
+
+       ret = pci_register_driver(&hinic_driver);
+       if (ret)
+               hinic_dbg_unregister_debugfs();
+
+       return ret;
 }
 
 static void __exit hinic_module_exit(void)
index 9089adc..b45dd7f 100644 (file)
@@ -521,14 +521,12 @@ static int octep_open(struct net_device *netdev)
        octep_oq_dbell_init(oct);
 
        ret = octep_get_link_status(oct);
-       if (ret)
+       if (ret > 0)
                octep_link_up(netdev);
 
        return 0;
 
 set_queues_err:
-       octep_napi_disable(oct);
-       octep_napi_delete(oct);
        octep_clean_irqs(oct);
 setup_irq_err:
        octep_free_oqs(oct);
@@ -958,7 +956,7 @@ int octep_device_setup(struct octep_device *oct)
        ret = octep_ctrl_mbox_init(ctrl_mbox);
        if (ret) {
                dev_err(&pdev->dev, "Failed to initialize control mbox\n");
-               return -1;
+               goto unsupported_dev;
        }
        oct->ctrl_mbox_ifstats_offset = OCTEP_CTRL_MBOX_SZ(ctrl_mbox->h2fq.elem_sz,
                                                           ctrl_mbox->h2fq.elem_cnt,
@@ -968,6 +966,10 @@ int octep_device_setup(struct octep_device *oct)
        return 0;
 
 unsupported_dev:
+       for (i = 0; i < OCTEP_MMIO_REGIONS; i++)
+               iounmap(oct->mmio[i].hw_addr);
+
+       kfree(oct->conf);
        return -1;
 }
 
@@ -1070,7 +1072,11 @@ static int octep_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        netdev->max_mtu = OCTEP_MAX_MTU;
        netdev->mtu = OCTEP_DEFAULT_MTU;
 
-       octep_get_mac_addr(octep_dev, octep_dev->mac_addr);
+       err = octep_get_mac_addr(octep_dev, octep_dev->mac_addr);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to get mac address\n");
+               goto register_dev_err;
+       }
        eth_hw_addr_set(netdev, octep_dev->mac_addr);
 
        err = register_netdev(netdev);
index 4efccd9..1290b2d 100644 (file)
@@ -3470,6 +3470,8 @@ mlxsw_sp_switchdev_vxlan_fdb_del(struct mlxsw_sp *mlxsw_sp,
        u16 vid;
 
        vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
+       if (!vxlan_fdb_info->offloaded)
+               return;
 
        bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
        if (!bridge_device)
index fea4254..06811c6 100644 (file)
@@ -716,6 +716,9 @@ int lan966x_stats_init(struct lan966x *lan966x)
        snprintf(queue_name, sizeof(queue_name), "%s-stats",
                 dev_name(lan966x->dev));
        lan966x->stats_queue = create_singlethread_workqueue(queue_name);
+       if (!lan966x->stats_queue)
+               return -ENOMEM;
+
        INIT_DELAYED_WORK(&lan966x->stats_work, lan966x_check_stats_work);
        queue_delayed_work(lan966x->stats_queue, &lan966x->stats_work,
                           LAN966X_STATS_CHECK_DELAY);
index 6b0febc..01f3a3a 100644 (file)
@@ -1253,6 +1253,9 @@ int sparx_stats_init(struct sparx5 *sparx5)
        snprintf(queue_name, sizeof(queue_name), "%s-stats",
                 dev_name(sparx5->dev));
        sparx5->stats_queue = create_singlethread_workqueue(queue_name);
+       if (!sparx5->stats_queue)
+               return -ENOMEM;
+
        INIT_DELAYED_WORK(&sparx5->stats_work, sparx5_check_stats_work);
        queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work,
                           SPX5_STATS_CHECK_DELAY);
index 62a325e..eeac04b 100644 (file)
@@ -659,6 +659,9 @@ static int sparx5_start(struct sparx5 *sparx5)
        snprintf(queue_name, sizeof(queue_name), "%s-mact",
                 dev_name(sparx5->dev));
        sparx5->mact_queue = create_singlethread_workqueue(queue_name);
+       if (!sparx5->mact_queue)
+               return -ENOMEM;
+
        INIT_DELAYED_WORK(&sparx5->mact_work, sparx5_mact_pull_work);
        queue_delayed_work(sparx5->mact_queue, &sparx5->mact_work,
                           SPX5_MACT_PULL_DELAY);
index 22a5d24..1775997 100644 (file)
@@ -1477,15 +1477,15 @@ nfp_port_get_module_info(struct net_device *netdev,
 
                if (data < 0x3) {
                        modinfo->type = ETH_MODULE_SFF_8436;
-                       modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
+                       modinfo->eeprom_len = ETH_MODULE_SFF_8436_MAX_LEN;
                } else {
                        modinfo->type = ETH_MODULE_SFF_8636;
-                       modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN;
+                       modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
                }
                break;
        case NFP_INTERFACE_QSFP28:
                modinfo->type = ETH_MODULE_SFF_8636;
-               modinfo->eeprom_len = ETH_MODULE_SFF_8636_LEN;
+               modinfo->eeprom_len = ETH_MODULE_SFF_8636_MAX_LEN;
                break;
        default:
                netdev_err(netdev, "Unsupported module 0x%x detected\n",
index 56f93b0..5456c2b 100644 (file)
@@ -687,8 +687,14 @@ int ionic_port_reset(struct ionic *ionic)
 
 static int __init ionic_init_module(void)
 {
+       int ret;
+
        ionic_debugfs_create();
-       return ionic_bus_register_driver();
+       ret = ionic_bus_register_driver();
+       if (ret)
+               ionic_debugfs_destroy();
+
+       return ret;
 }
 
 static void __exit ionic_cleanup_module(void)
index 8273e6a..6b43da7 100644 (file)
@@ -6548,6 +6548,9 @@ void stmmac_xdp_release(struct net_device *dev)
        struct stmmac_priv *priv = netdev_priv(dev);
        u32 chan;
 
+       /* Ensure tx function is not running */
+       netif_tx_disable(dev);
+
        /* Disable NAPI process */
        stmmac_disable_all_queues(priv);
 
index 578897a..b8cc55b 100644 (file)
@@ -141,7 +141,7 @@ static struct macvlan_source_entry *macvlan_hash_lookup_source(
        u32 idx = macvlan_eth_hash(addr);
        struct hlist_head *h = &vlan->port->vlan_source_hash[idx];
 
-       hlist_for_each_entry_rcu(entry, h, hlist) {
+       hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
                if (ether_addr_equal_64bits(entry->addr, addr) &&
                    entry->vlan == vlan)
                        return entry;
@@ -1647,7 +1647,7 @@ static int macvlan_fill_info_macaddr(struct sk_buff *skb,
        struct hlist_head *h = &vlan->port->vlan_source_hash[i];
        struct macvlan_source_entry *entry;
 
-       hlist_for_each_entry_rcu(entry, h, hlist) {
+       hlist_for_each_entry_rcu(entry, h, hlist, lockdep_rtnl_is_held()) {
                if (entry->vlan != vlan)
                        continue;
                if (nla_put(skb, IFLA_MACVLAN_MACADDR, ETH_ALEN, entry->addr))
index 0762c73..1d67a3c 100644 (file)
@@ -43,6 +43,7 @@
 enum {
        MCTP_I2C_FLOW_STATE_NEW = 0,
        MCTP_I2C_FLOW_STATE_ACTIVE,
+       MCTP_I2C_FLOW_STATE_INVALID,
 };
 
 /* List of all struct mctp_i2c_client
@@ -374,12 +375,18 @@ mctp_i2c_get_tx_flow_state(struct mctp_i2c_dev *midev, struct sk_buff *skb)
         */
        if (!key->valid) {
                state = MCTP_I2C_TX_FLOW_INVALID;
-
-       } else if (key->dev_flow_state == MCTP_I2C_FLOW_STATE_NEW) {
-               key->dev_flow_state = MCTP_I2C_FLOW_STATE_ACTIVE;
-               state = MCTP_I2C_TX_FLOW_NEW;
        } else {
-               state = MCTP_I2C_TX_FLOW_EXISTING;
+               switch (key->dev_flow_state) {
+               case MCTP_I2C_FLOW_STATE_NEW:
+                       key->dev_flow_state = MCTP_I2C_FLOW_STATE_ACTIVE;
+                       state = MCTP_I2C_TX_FLOW_NEW;
+                       break;
+               case MCTP_I2C_FLOW_STATE_ACTIVE:
+                       state = MCTP_I2C_TX_FLOW_EXISTING;
+                       break;
+               default:
+                       state = MCTP_I2C_TX_FLOW_INVALID;
+               }
        }
 
        spin_unlock_irqrestore(&key->lock, flags);
@@ -617,21 +624,31 @@ static void mctp_i2c_release_flow(struct mctp_dev *mdev,
 
 {
        struct mctp_i2c_dev *midev = netdev_priv(mdev->dev);
+       bool queue_release = false;
        unsigned long flags;
 
        spin_lock_irqsave(&midev->lock, flags);
-       midev->release_count++;
-       spin_unlock_irqrestore(&midev->lock, flags);
-
-       /* Ensure we have a release operation queued, through the fake
-        * marker skb
+       /* if we have seen the flow/key previously, we need to pair the
+        * original lock with a release
         */
-       spin_lock(&midev->tx_queue.lock);
-       if (!midev->unlock_marker.next)
-               __skb_queue_tail(&midev->tx_queue, &midev->unlock_marker);
-       spin_unlock(&midev->tx_queue.lock);
+       if (key->dev_flow_state == MCTP_I2C_FLOW_STATE_ACTIVE) {
+               midev->release_count++;
+               queue_release = true;
+       }
+       key->dev_flow_state = MCTP_I2C_FLOW_STATE_INVALID;
+       spin_unlock_irqrestore(&midev->lock, flags);
 
-       wake_up(&midev->tx_wq);
+       if (queue_release) {
+               /* Ensure we have a release operation queued, through the fake
+                * marker skb
+                */
+               spin_lock(&midev->tx_queue.lock);
+               if (!midev->unlock_marker.next)
+                       __skb_queue_tail(&midev->tx_queue,
+                                        &midev->unlock_marker);
+               spin_unlock(&midev->tx_queue.lock);
+               wake_up(&midev->tx_wq);
+       }
 }
 
 static const struct net_device_ops mctp_i2c_ops = {
index 0b1b6f6..0b9d379 100644 (file)
@@ -343,6 +343,8 @@ static void mhi_net_dellink(struct mhi_device *mhi_dev, struct net_device *ndev)
 
        kfree_skb(mhi_netdev->skbagg_head);
 
+       free_netdev(ndev);
+
        dev_set_drvdata(&mhi_dev->dev, NULL);
 }
 
index a7880c7..68e56e4 100644 (file)
@@ -1683,6 +1683,7 @@ void nsim_drv_remove(struct nsim_bus_dev *nsim_bus_dev)
                                  ARRAY_SIZE(nsim_devlink_params));
        devl_resources_unregister(devlink);
        kfree(nsim_dev->vfconfigs);
+       kfree(nsim_dev->fa_cookie);
        devl_unlock(devlink);
        devlink_free(devlink);
        dev_set_drvdata(&nsim_bus_dev->dev, NULL);
index 417527f..7446d5c 100644 (file)
@@ -682,6 +682,13 @@ static int dp83867_of_init(struct phy_device *phydev)
         */
        dp83867->io_impedance = DP83867_IO_MUX_CFG_IO_IMPEDANCE_MIN / 2;
 
+       /* For non-OF device, the RX and TX FIFO depths are taken from
+        * default value. So, we init RX & TX FIFO depths here
+        * so that it is configured correctly later in dp83867_config_init();
+        */
+       dp83867->tx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
+       dp83867->rx_fifo_depth = DP83867_PHYCR_FIFO_DEPTH_4_B_NIB;
+
        return 0;
 }
 #endif /* CONFIG_OF_MDIO */
index 2810f4f..0d706ee 100644 (file)
@@ -2015,14 +2015,16 @@ static int m88e1510_loopback(struct phy_device *phydev, bool enable)
                if (err < 0)
                        return err;
 
-               /* FIXME: Based on trial and error test, it seem 1G need to have
-                * delay between soft reset and loopback enablement.
-                */
-               if (phydev->speed == SPEED_1000)
-                       msleep(1000);
+               err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
+                                BMCR_LOOPBACK);
 
-               return phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK,
-                                 BMCR_LOOPBACK);
+               if (!err) {
+                       /* It takes some time for PHY device to switch
+                        * into/out-of loopback mode.
+                        */
+                       msleep(1000);
+               }
+               return err;
        } else {
                err = phy_modify(phydev, MII_BMCR, BMCR_LOOPBACK, 0);
                if (err < 0)
index 83fcaeb..a52ee2b 100644 (file)
@@ -1391,12 +1391,21 @@ static int __init tbnet_init(void)
        tb_property_add_immediate(tbnet_dir, "prtcstns", flags);
 
        ret = tb_register_property_dir("network", tbnet_dir);
-       if (ret) {
-               tb_property_free_dir(tbnet_dir);
-               return ret;
-       }
+       if (ret)
+               goto err_free_dir;
+
+       ret = tb_register_service_driver(&tbnet_driver);
+       if (ret)
+               goto err_unregister;
 
-       return tb_register_service_driver(&tbnet_driver);
+       return 0;
+
+err_unregister:
+       tb_unregister_property_dir("network", tbnet_dir);
+err_free_dir:
+       tb_property_free_dir(tbnet_dir);
+
+       return ret;
 }
 module_init(tbnet_init);
 
index 26c34a7..afd6faa 100644 (file)
@@ -1357,6 +1357,7 @@ static const struct usb_device_id products[] = {
        {QMI_FIXED_INTF(0x2357, 0x0201, 4)},    /* TP-LINK HSUPA Modem MA180 */
        {QMI_FIXED_INTF(0x2357, 0x9000, 4)},    /* TP-LINK MA260 */
        {QMI_QUIRK_SET_DTR(0x1bc7, 0x1031, 3)}, /* Telit LE910C1-EUX */
+       {QMI_QUIRK_SET_DTR(0x1bc7, 0x103a, 0)}, /* Telit LE910C4-WWX */
        {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
        {QMI_QUIRK_SET_DTR(0x1bc7, 0x1050, 2)}, /* Telit FN980 */
        {QMI_QUIRK_SET_DTR(0x1bc7, 0x1057, 2)}, /* Telit FN980 */
index bfb58c9..32d2c60 100644 (file)
@@ -66,6 +66,7 @@ struct smsc95xx_priv {
        spinlock_t mac_cr_lock;
        u8 features;
        u8 suspend_flags;
+       bool is_internal_phy;
        struct irq_chip irqchip;
        struct irq_domain *irqdomain;
        struct fwnode_handle *irqfwnode;
@@ -252,6 +253,43 @@ done:
        mutex_unlock(&dev->phy_mutex);
 }
 
+static int smsc95xx_mdiobus_reset(struct mii_bus *bus)
+{
+       struct smsc95xx_priv *pdata;
+       struct usbnet *dev;
+       u32 val;
+       int ret;
+
+       dev = bus->priv;
+       pdata = dev->driver_priv;
+
+       if (pdata->is_internal_phy)
+               return 0;
+
+       mutex_lock(&dev->phy_mutex);
+
+       ret = smsc95xx_read_reg(dev, PM_CTRL, &val);
+       if (ret < 0)
+               goto reset_out;
+
+       val |= PM_CTL_PHY_RST_;
+
+       ret = smsc95xx_write_reg(dev, PM_CTRL, val);
+       if (ret < 0)
+               goto reset_out;
+
+       /* Driver has no knowledge at this point about the external PHY.
+        * The 802.3 specifies that the reset process shall
+        * be completed within 0.5 s.
+        */
+       fsleep(500000);
+
+reset_out:
+       mutex_unlock(&dev->phy_mutex);
+
+       return 0;
+}
+
 static int smsc95xx_mdiobus_read(struct mii_bus *bus, int phy_id, int idx)
 {
        struct usbnet *dev = bus->priv;
@@ -1052,7 +1090,6 @@ static void smsc95xx_handle_link_change(struct net_device *net)
 static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
 {
        struct smsc95xx_priv *pdata;
-       bool is_internal_phy;
        char usb_path[64];
        int ret, phy_irq;
        u32 val;
@@ -1133,13 +1170,14 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
        if (ret < 0)
                goto free_mdio;
 
-       is_internal_phy = !(val & HW_CFG_PSEL_);
-       if (is_internal_phy)
+       pdata->is_internal_phy = !(val & HW_CFG_PSEL_);
+       if (pdata->is_internal_phy)
                pdata->mdiobus->phy_mask = ~(1u << SMSC95XX_INTERNAL_PHY_ID);
 
        pdata->mdiobus->priv = dev;
        pdata->mdiobus->read = smsc95xx_mdiobus_read;
        pdata->mdiobus->write = smsc95xx_mdiobus_write;
+       pdata->mdiobus->reset = smsc95xx_mdiobus_reset;
        pdata->mdiobus->name = "smsc95xx-mdiobus";
        pdata->mdiobus->parent = &dev->udev->dev;
 
@@ -1160,7 +1198,7 @@ static int smsc95xx_bind(struct usbnet *dev, struct usb_interface *intf)
        }
 
        pdata->phydev->irq = phy_irq;
-       pdata->phydev->is_internal = is_internal_phy;
+       pdata->phydev->is_internal = pdata->is_internal_phy;
 
        /* detect device revision as different features may be available */
        ret = smsc95xx_read_reg(dev, ID_REV, &val);
index 02b5578..f433551 100644 (file)
@@ -3489,6 +3489,8 @@ static const struct pci_device_id nvme_id_table[] = {
                                NVME_QUIRK_IGNORE_DEV_SUBNQN, },
         { PCI_DEVICE(0x1344, 0x5407), /* Micron Technology Inc NVMe SSD */
                .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN },
+        { PCI_DEVICE(0x1344, 0x6001),   /* Micron Nitro NVMe */
+                .driver_data = NVME_QUIRK_BOGUS_NID, },
        { PCI_DEVICE(0x1c5c, 0x1504),   /* SK Hynix PC400 */
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
        { PCI_DEVICE(0x1c5c, 0x174a),   /* SK Hynix P31 SSD */
@@ -3519,6 +3521,8 @@ static const struct pci_device_id nvme_id_table[] = {
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
        { PCI_DEVICE(0x2646, 0x501E),   /* KINGSTON OM3PGP4xxxxQ OS21011 NVMe SSD */
                .driver_data = NVME_QUIRK_DISABLE_WRITE_ZEROES, },
+       { PCI_DEVICE(0x1f40, 0x5236),   /* Netac Technologies Co. NV7000 NVMe SSD */
+               .driver_data = NVME_QUIRK_BOGUS_NID, },
        { PCI_DEVICE(0x1e4B, 0x1001),   /* MAXIO MAP1001 */
                .driver_data = NVME_QUIRK_BOGUS_NID, },
        { PCI_DEVICE(0x1e4B, 0x1002),   /* MAXIO MAP1002 */
index c4113b4..4dcddcf 100644 (file)
@@ -45,9 +45,11 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
        if (!dhchap_secret)
                return -ENOMEM;
        if (set_ctrl) {
+               kfree(host->dhchap_ctrl_secret);
                host->dhchap_ctrl_secret = strim(dhchap_secret);
                host->dhchap_ctrl_key_hash = key_hash;
        } else {
+               kfree(host->dhchap_secret);
                host->dhchap_secret = strim(dhchap_secret);
                host->dhchap_key_hash = key_hash;
        }
index f6732fd..377bf34 100644 (file)
@@ -203,7 +203,7 @@ static int lan9662_otp_probe(struct platform_device *pdev)
 }
 
 static const struct of_device_id lan9662_otp_match[] = {
-       { .compatible = "microchip,lan9662-otp", },
+       { .compatible = "microchip,lan9662-otpc", },
        { },
 };
 MODULE_DEVICE_TABLE(of, lan9662_otp_match);
index 8e72d1b..4fdbdcc 100644 (file)
@@ -135,7 +135,7 @@ static int u_boot_env_parse(struct u_boot_env *priv)
                break;
        case U_BOOT_FORMAT_REDUNDANT:
                crc32_offset = offsetof(struct u_boot_env_image_redundant, crc32);
-               crc32_data_offset = offsetof(struct u_boot_env_image_redundant, mark);
+               crc32_data_offset = offsetof(struct u_boot_env_image_redundant, data);
                data_offset = offsetof(struct u_boot_env_image_redundant, data);
                break;
        }
index 7c45927..5784dc2 100644 (file)
@@ -468,7 +468,7 @@ static size_t parport_pc_fifo_write_block_pio(struct parport *port,
        const unsigned char *bufp = buf;
        size_t left = length;
        unsigned long expire = jiffies + port->physport->cad->timeout;
-       const int fifo = FIFO(port);
+       const unsigned long fifo = FIFO(port);
        int poll_for = 8; /* 80 usecs */
        const struct parport_pc_private *priv = port->physport->private_data;
        const int fifo_depth = priv->fifo_depth;
index ef898ee..6e0a409 100644 (file)
@@ -220,6 +220,8 @@ int pinctrl_dt_to_map(struct pinctrl *p, struct pinctrl_dev *pctldev)
        for (state = 0; ; state++) {
                /* Retrieve the pinctrl-* property */
                propname = kasprintf(GFP_KERNEL, "pinctrl-%d", state);
+               if (!propname)
+                       return -ENOMEM;
                prop = of_find_property(np, propname, &size);
                kfree(propname);
                if (!prop) {
index f7b54a5..65d3129 100644 (file)
@@ -24,6 +24,7 @@
 #define MTK_EINT_EDGE_SENSITIVE           0
 #define MTK_EINT_LEVEL_SENSITIVE          1
 #define MTK_EINT_DBNC_SET_DBNC_BITS      4
+#define MTK_EINT_DBNC_MAX                16
 #define MTK_EINT_DBNC_RST_BIT            (0x1 << 1)
 #define MTK_EINT_DBNC_SET_EN             (0x1 << 0)
 
@@ -48,6 +49,21 @@ static const struct mtk_eint_regs mtk_generic_eint_regs = {
        .dbnc_clr  = 0x700,
 };
 
+const unsigned int debounce_time_mt2701[] = {
+       500, 1000, 16000, 32000, 64000, 128000, 256000, 0
+};
+EXPORT_SYMBOL_GPL(debounce_time_mt2701);
+
+const unsigned int debounce_time_mt6765[] = {
+       125, 250, 500, 1000, 16000, 32000, 64000, 128000, 256000, 512000, 0
+};
+EXPORT_SYMBOL_GPL(debounce_time_mt6765);
+
+const unsigned int debounce_time_mt6795[] = {
+       500, 1000, 16000, 32000, 64000, 128000, 256000, 512000, 0
+};
+EXPORT_SYMBOL_GPL(debounce_time_mt6795);
+
 static void __iomem *mtk_eint_get_offset(struct mtk_eint *eint,
                                         unsigned int eint_num,
                                         unsigned int offset)
@@ -404,10 +420,11 @@ int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_num,
        int virq, eint_offset;
        unsigned int set_offset, bit, clr_bit, clr_offset, rst, i, unmask,
                     dbnc;
-       static const unsigned int debounce_time[] = {500, 1000, 16000, 32000,
-                                                    64000, 128000, 256000};
        struct irq_data *d;
 
+       if (!eint->hw->db_time)
+               return -EOPNOTSUPP;
+
        virq = irq_find_mapping(eint->domain, eint_num);
        eint_offset = (eint_num % 4) * 8;
        d = irq_get_irq_data(virq);
@@ -418,9 +435,9 @@ int mtk_eint_set_debounce(struct mtk_eint *eint, unsigned long eint_num,
        if (!mtk_eint_can_en_debounce(eint, eint_num))
                return -EINVAL;
 
-       dbnc = ARRAY_SIZE(debounce_time);
-       for (i = 0; i < ARRAY_SIZE(debounce_time); i++) {
-               if (debounce <= debounce_time[i]) {
+       dbnc = eint->num_db_time;
+       for (i = 0; i < eint->num_db_time; i++) {
+               if (debounce <= eint->hw->db_time[i]) {
                        dbnc = i;
                        break;
                }
@@ -494,6 +511,13 @@ int mtk_eint_do_init(struct mtk_eint *eint)
        if (!eint->domain)
                return -ENOMEM;
 
+       if (eint->hw->db_time) {
+               for (i = 0; i < MTK_EINT_DBNC_MAX; i++)
+                       if (eint->hw->db_time[i] == 0)
+                               break;
+               eint->num_db_time = i;
+       }
+
        mtk_eint_hw_init(eint);
        for (i = 0; i < eint->hw->ap_num; i++) {
                int virq = irq_create_mapping(eint->domain, i);
index 48468d0..6139b16 100644 (file)
@@ -37,8 +37,13 @@ struct mtk_eint_hw {
        u8              ports;
        unsigned int    ap_num;
        unsigned int    db_cnt;
+       const unsigned int *db_time;
 };
 
+extern const unsigned int debounce_time_mt2701[];
+extern const unsigned int debounce_time_mt6765[];
+extern const unsigned int debounce_time_mt6795[];
+
 struct mtk_eint;
 
 struct mtk_eint_xt {
@@ -62,6 +67,7 @@ struct mtk_eint {
        /* Used to fit into various EINT device */
        const struct mtk_eint_hw *hw;
        const struct mtk_eint_regs *regs;
+       u16 num_db_time;
 
        /* Used to fit into various pinctrl device */
        void *pctl;
index d1583b4..b185538 100644 (file)
@@ -518,6 +518,7 @@ static const struct mtk_pinctrl_devdata mt2701_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 169,
                .db_cnt    = 16,
+               .db_time   = debounce_time_mt2701,
        },
 };
 
index b921068..730a496 100644 (file)
@@ -567,6 +567,7 @@ static const struct mtk_pinctrl_devdata mt2712_pinctrl_data = {
                .ports     = 8,
                .ap_num    = 229,
                .db_cnt    = 40,
+               .db_time   = debounce_time_mt2701,
        },
 };
 
index c57b19f..f6ec41e 100644 (file)
@@ -1062,6 +1062,7 @@ static const struct mtk_eint_hw mt6765_eint_hw = {
        .ports     = 6,
        .ap_num    = 160,
        .db_cnt    = 13,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt6765_data = {
index 4ddf8bd..62d4f5a 100644 (file)
@@ -737,6 +737,7 @@ static const struct mtk_eint_hw mt6779_eint_hw = {
        .ports     = 6,
        .ap_num    = 195,
        .db_cnt    = 13,
+       .db_time   = debounce_time_mt2701,
 };
 
 static const struct mtk_pin_soc mt6779_data = {
index f901522..01e855c 100644 (file)
@@ -475,6 +475,7 @@ static const struct mtk_eint_hw mt6795_eint_hw = {
        .ports     = 7,
        .ap_num    = 224,
        .db_cnt    = 32,
+       .db_time   = debounce_time_mt6795,
 };
 
 static const unsigned int mt6795_pull_type[] = {
index 68eee88..3c1148d 100644 (file)
@@ -846,6 +846,7 @@ static const struct mtk_eint_hw mt7622_eint_hw = {
        .ports     = 7,
        .ap_num    = ARRAY_SIZE(mt7622_pins),
        .db_cnt    = 20,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt7622_data = {
index b8d9d31..6999770 100644 (file)
@@ -1369,6 +1369,7 @@ static const struct mtk_eint_hw mt7623_eint_hw = {
        .ports     = 6,
        .ap_num    = 169,
        .db_cnt    = 20,
+       .db_time   = debounce_time_mt2701,
 };
 
 static struct mtk_pin_soc mt7623_data = {
index b5f0fa4..2ce411c 100644 (file)
@@ -402,6 +402,7 @@ static const struct mtk_eint_hw mt7629_eint_hw = {
        .ports     = 7,
        .ap_num    = ARRAY_SIZE(mt7629_pins),
        .db_cnt    = 16,
+       .db_time   = debounce_time_mt2701,
 };
 
 static struct mtk_pin_soc mt7629_data = {
index f26869f..50cb736 100644 (file)
@@ -826,6 +826,7 @@ static const struct mtk_eint_hw mt7986a_eint_hw = {
        .ports = 7,
        .ap_num = ARRAY_SIZE(mt7986a_pins),
        .db_cnt = 16,
+       .db_time = debounce_time_mt6765,
 };
 
 static const struct mtk_eint_hw mt7986b_eint_hw = {
@@ -833,6 +834,7 @@ static const struct mtk_eint_hw mt7986b_eint_hw = {
        .ports = 7,
        .ap_num = ARRAY_SIZE(mt7986b_pins),
        .db_cnt = 16,
+       .db_time = debounce_time_mt6765,
 };
 
 static struct mtk_pin_soc mt7986a_data = {
index 91c530e..e8772dc 100644 (file)
@@ -286,6 +286,7 @@ static const struct mtk_pinctrl_devdata mt8127_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 143,
                .db_cnt    = 16,
+               .db_time = debounce_time_mt2701,
        },
 };
 
index 5628467..cdb0252 100644 (file)
@@ -315,6 +315,7 @@ static const struct mtk_pinctrl_devdata mt8135_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 192,
                .db_cnt    = 16,
+               .db_time = debounce_time_mt2701,
        },
 };
 
index 825167f..866da2c 100644 (file)
@@ -319,6 +319,7 @@ static const struct mtk_pinctrl_devdata mt8167_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 169,
                .db_cnt    = 64,
+               .db_time = debounce_time_mt6795,
        },
 };
 
index 1d7d11a..37d8cec 100644 (file)
@@ -327,6 +327,7 @@ static const struct mtk_pinctrl_devdata mt8173_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 224,
                .db_cnt    = 16,
+               .db_time   = debounce_time_mt2701,
        },
 };
 
index fecb1e6..ddc48b7 100644 (file)
@@ -545,6 +545,7 @@ static const struct mtk_eint_hw mt8183_eint_hw = {
        .ports     = 6,
        .ap_num    = 212,
        .db_cnt    = 13,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt8183_data = {
index a4dd519..a02f7c3 100644 (file)
@@ -1222,6 +1222,7 @@ static const struct mtk_eint_hw mt8186_eint_hw = {
        .ports     = 7,
        .ap_num    = 217,
        .db_cnt    = 32,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt8186_data = {
index d0e75c1..6a3d012 100644 (file)
@@ -1625,6 +1625,7 @@ static const struct mtk_eint_hw mt8188_eint_hw = {
        .ports     = 7,
        .ap_num    = 225,
        .db_cnt    = 32,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt8188_data = {
index 78c02b7..9695f4e 100644 (file)
@@ -1371,6 +1371,7 @@ static const struct mtk_eint_hw mt8192_eint_hw = {
        .ports     = 7,
        .ap_num    = 224,
        .db_cnt    = 32,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_reg_calc mt8192_reg_cals[PINCTRL_PIN_REG_MAX] = {
index 563693d..89557c7 100644 (file)
@@ -935,6 +935,7 @@ static const struct mtk_eint_hw mt8195_eint_hw = {
        .ports     = 7,
        .ap_num    = 225,
        .db_cnt    = 32,
+       .db_time   = debounce_time_mt6765,
 };
 
 static const struct mtk_pin_soc mt8195_data = {
index 57f37a2..e31b89b 100644 (file)
@@ -453,6 +453,7 @@ static const struct mtk_pinctrl_devdata mt8365_pinctrl_data = {
                .ports     = 5,
                .ap_num = 160,
                .db_cnt = 160,
+               .db_time   = debounce_time_mt6765,
        },
 };
 
index 939a193..e929339 100644 (file)
@@ -319,6 +319,7 @@ static const struct mtk_pinctrl_devdata mt8516_pinctrl_data = {
                .ports     = 6,
                .ap_num    = 169,
                .db_cnt    = 64,
+               .db_time   = debounce_time_mt6795,
        },
 };
 
index e1ae3be..b7921b5 100644 (file)
@@ -709,6 +709,9 @@ static int mtk_pinconf_bias_set_rsel(struct mtk_pinctrl *hw,
 {
        int err, rsel_val;
 
+       if (!pullup && arg == MTK_DISABLE)
+               return 0;
+
        if (hw->rsel_si_unit) {
                /* find pin rsel_index from pin_rsel array*/
                err = mtk_hw_pin_rsel_lookup(hw, desc, pullup, arg, &rsel_val);
index 53bdfc4..da974ff 100644 (file)
@@ -679,14 +679,54 @@ static void rockchip_get_recalced_mux(struct rockchip_pin_bank *bank, int pin,
 }
 
 static struct rockchip_mux_route_data px30_mux_route_data[] = {
+       RK_MUXROUTE_SAME(2, RK_PB4, 1, 0x184, BIT(16 + 7)), /* cif-d0m0 */
+       RK_MUXROUTE_SAME(3, RK_PA1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d0m1 */
+       RK_MUXROUTE_SAME(2, RK_PB6, 1, 0x184, BIT(16 + 7)), /* cif-d1m0 */
+       RK_MUXROUTE_SAME(3, RK_PA2, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d1m1 */
        RK_MUXROUTE_SAME(2, RK_PA0, 1, 0x184, BIT(16 + 7)), /* cif-d2m0 */
        RK_MUXROUTE_SAME(3, RK_PA3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d2m1 */
+       RK_MUXROUTE_SAME(2, RK_PA1, 1, 0x184, BIT(16 + 7)), /* cif-d3m0 */
+       RK_MUXROUTE_SAME(3, RK_PA5, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d3m1 */
+       RK_MUXROUTE_SAME(2, RK_PA2, 1, 0x184, BIT(16 + 7)), /* cif-d4m0 */
+       RK_MUXROUTE_SAME(3, RK_PA7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d4m1 */
+       RK_MUXROUTE_SAME(2, RK_PA3, 1, 0x184, BIT(16 + 7)), /* cif-d5m0 */
+       RK_MUXROUTE_SAME(3, RK_PB0, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d5m1 */
+       RK_MUXROUTE_SAME(2, RK_PA4, 1, 0x184, BIT(16 + 7)), /* cif-d6m0 */
+       RK_MUXROUTE_SAME(3, RK_PB1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d6m1 */
+       RK_MUXROUTE_SAME(2, RK_PA5, 1, 0x184, BIT(16 + 7)), /* cif-d7m0 */
+       RK_MUXROUTE_SAME(3, RK_PB4, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d7m1 */
+       RK_MUXROUTE_SAME(2, RK_PA6, 1, 0x184, BIT(16 + 7)), /* cif-d8m0 */
+       RK_MUXROUTE_SAME(3, RK_PB6, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d8m1 */
+       RK_MUXROUTE_SAME(2, RK_PA7, 1, 0x184, BIT(16 + 7)), /* cif-d9m0 */
+       RK_MUXROUTE_SAME(3, RK_PB7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d9m1 */
+       RK_MUXROUTE_SAME(2, RK_PB7, 1, 0x184, BIT(16 + 7)), /* cif-d10m0 */
+       RK_MUXROUTE_SAME(3, RK_PC6, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d10m1 */
+       RK_MUXROUTE_SAME(2, RK_PC0, 1, 0x184, BIT(16 + 7)), /* cif-d11m0 */
+       RK_MUXROUTE_SAME(3, RK_PC7, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-d11m1 */
+       RK_MUXROUTE_SAME(2, RK_PB0, 1, 0x184, BIT(16 + 7)), /* cif-vsyncm0 */
+       RK_MUXROUTE_SAME(3, RK_PD1, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-vsyncm1 */
+       RK_MUXROUTE_SAME(2, RK_PB1, 1, 0x184, BIT(16 + 7)), /* cif-hrefm0 */
+       RK_MUXROUTE_SAME(3, RK_PD2, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-hrefm1 */
+       RK_MUXROUTE_SAME(2, RK_PB2, 1, 0x184, BIT(16 + 7)), /* cif-clkinm0 */
+       RK_MUXROUTE_SAME(3, RK_PD3, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-clkinm1 */
+       RK_MUXROUTE_SAME(2, RK_PB3, 1, 0x184, BIT(16 + 7)), /* cif-clkoutm0 */
+       RK_MUXROUTE_SAME(3, RK_PD0, 3, 0x184, BIT(16 + 7) | BIT(7)), /* cif-clkoutm1 */
        RK_MUXROUTE_SAME(3, RK_PC6, 2, 0x184, BIT(16 + 8)), /* pdm-m0 */
        RK_MUXROUTE_SAME(2, RK_PC6, 1, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-m1 */
+       RK_MUXROUTE_SAME(3, RK_PD3, 2, 0x184, BIT(16 + 8)), /* pdm-sdi0m0 */
+       RK_MUXROUTE_SAME(2, RK_PC5, 2, 0x184, BIT(16 + 8) | BIT(8)), /* pdm-sdi0m1 */
        RK_MUXROUTE_SAME(1, RK_PD3, 2, 0x184, BIT(16 + 10)), /* uart2-rxm0 */
        RK_MUXROUTE_SAME(2, RK_PB6, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-rxm1 */
+       RK_MUXROUTE_SAME(1, RK_PD2, 2, 0x184, BIT(16 + 10)), /* uart2-txm0 */
+       RK_MUXROUTE_SAME(2, RK_PB4, 2, 0x184, BIT(16 + 10) | BIT(10)), /* uart2-txm1 */
        RK_MUXROUTE_SAME(0, RK_PC1, 2, 0x184, BIT(16 + 9)), /* uart3-rxm0 */
        RK_MUXROUTE_SAME(1, RK_PB7, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rxm1 */
+       RK_MUXROUTE_SAME(0, RK_PC0, 2, 0x184, BIT(16 + 9)), /* uart3-txm0 */
+       RK_MUXROUTE_SAME(1, RK_PB6, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-txm1 */
+       RK_MUXROUTE_SAME(0, RK_PC2, 2, 0x184, BIT(16 + 9)), /* uart3-ctsm0 */
+       RK_MUXROUTE_SAME(1, RK_PB4, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-ctsm1 */
+       RK_MUXROUTE_SAME(0, RK_PC3, 2, 0x184, BIT(16 + 9)), /* uart3-rtsm0 */
+       RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x184, BIT(16 + 9) | BIT(9)), /* uart3-rtsm1 */
 };
 
 static struct rockchip_mux_route_data rv1126_mux_route_data[] = {
index aa20753..e96c006 100644 (file)
@@ -1873,8 +1873,8 @@ static const struct msm_pingroup sc8280xp_groups[] = {
        [225] = PINGROUP(225, hs3_mi2s, phase_flag, _, _, _, _, egpio),
        [226] = PINGROUP(226, hs3_mi2s, phase_flag, _, _, _, _, egpio),
        [227] = PINGROUP(227, hs3_mi2s, phase_flag, _, _, _, _, egpio),
-       [228] = UFS_RESET(ufs_reset, 0xf1004),
-       [229] = UFS_RESET(ufs1_reset, 0xf3004),
+       [228] = UFS_RESET(ufs_reset, 0xf1000),
+       [229] = UFS_RESET(ufs1_reset, 0xf3000),
        [230] = SDC_QDSD_PINGROUP(sdc2_clk, 0xe8000, 14, 6),
        [231] = SDC_QDSD_PINGROUP(sdc2_cmd, 0xe8000, 11, 3),
        [232] = SDC_QDSD_PINGROUP(sdc2_data, 0xe8000, 9, 0),
index 6748fe4..def8d7a 100644 (file)
@@ -1596,16 +1596,32 @@ static void ssh_ptl_timeout_reap(struct work_struct *work)
                ssh_ptl_tx_wakeup_packet(ptl);
 }
 
-static bool ssh_ptl_rx_retransmit_check(struct ssh_ptl *ptl, u8 seq)
+static bool ssh_ptl_rx_retransmit_check(struct ssh_ptl *ptl, const struct ssh_frame *frame)
 {
        int i;
 
        /*
+        * Ignore unsequenced packets. On some devices (notably Surface Pro 9),
+        * unsequenced events will always be sent with SEQ=0x00. Attempting to
+        * detect retransmission would thus just block all events.
+        *
+        * While sequence numbers would also allow detection of retransmitted
+        * packets in unsequenced communication, they have only ever been used
+        * to cover edge-cases in sequenced transmission. In particular, the
+        * only instance of packets being retransmitted (that we are aware of)
+        * is due to an ACK timeout. As this does not happen in unsequenced
+        * communication, skip the retransmission check for those packets
+        * entirely.
+        */
+       if (frame->type == SSH_FRAME_TYPE_DATA_NSQ)
+               return false;
+
+       /*
         * Check if SEQ has been seen recently (i.e. packet was
         * re-transmitted and we should ignore it).
         */
        for (i = 0; i < ARRAY_SIZE(ptl->rx.blocked.seqs); i++) {
-               if (likely(ptl->rx.blocked.seqs[i] != seq))
+               if (likely(ptl->rx.blocked.seqs[i] != frame->seq))
                        continue;
 
                ptl_dbg(ptl, "ptl: ignoring repeated data packet\n");
@@ -1613,7 +1629,7 @@ static bool ssh_ptl_rx_retransmit_check(struct ssh_ptl *ptl, u8 seq)
        }
 
        /* Update list of blocked sequence IDs. */
-       ptl->rx.blocked.seqs[ptl->rx.blocked.offset] = seq;
+       ptl->rx.blocked.seqs[ptl->rx.blocked.offset] = frame->seq;
        ptl->rx.blocked.offset = (ptl->rx.blocked.offset + 1)
                                  % ARRAY_SIZE(ptl->rx.blocked.seqs);
 
@@ -1624,7 +1640,7 @@ static void ssh_ptl_rx_dataframe(struct ssh_ptl *ptl,
                                 const struct ssh_frame *frame,
                                 const struct ssam_span *payload)
 {
-       if (ssh_ptl_rx_retransmit_check(ptl, frame->seq))
+       if (ssh_ptl_rx_retransmit_check(ptl, frame))
                return;
 
        ptl->ops.data_received(ptl, payload);
index 5859110..023f126 100644 (file)
@@ -234,6 +234,19 @@ static const struct software_node *ssam_node_group_sl3[] = {
        NULL,
 };
 
+/* Devices for Surface Laptop 5. */
+static const struct software_node *ssam_node_group_sl5[] = {
+       &ssam_node_root,
+       &ssam_node_bat_ac,
+       &ssam_node_bat_main,
+       &ssam_node_tmp_pprof,
+       &ssam_node_hid_main_keyboard,
+       &ssam_node_hid_main_touchpad,
+       &ssam_node_hid_main_iid5,
+       &ssam_node_hid_sam_ucm_ucsi,
+       NULL,
+};
+
 /* Devices for Surface Laptop Studio. */
 static const struct software_node *ssam_node_group_sls[] = {
        &ssam_node_root,
@@ -268,6 +281,7 @@ static const struct software_node *ssam_node_group_sp7[] = {
        NULL,
 };
 
+/* Devices for Surface Pro 8 */
 static const struct software_node *ssam_node_group_sp8[] = {
        &ssam_node_root,
        &ssam_node_hub_kip,
@@ -284,6 +298,23 @@ static const struct software_node *ssam_node_group_sp8[] = {
        NULL,
 };
 
+/* Devices for Surface Pro 9 */
+static const struct software_node *ssam_node_group_sp9[] = {
+       &ssam_node_root,
+       &ssam_node_hub_kip,
+       &ssam_node_bat_ac,
+       &ssam_node_bat_main,
+       &ssam_node_tmp_pprof,
+       /* TODO: Tablet mode switch (via POS subsystem) */
+       &ssam_node_hid_kip_keyboard,
+       &ssam_node_hid_kip_penstash,
+       &ssam_node_hid_kip_touchpad,
+       &ssam_node_hid_kip_fwupd,
+       &ssam_node_hid_sam_sensors,
+       &ssam_node_hid_sam_ucm_ucsi,
+       NULL,
+};
+
 
 /* -- SSAM platform/meta-hub driver. ---------------------------------------- */
 
@@ -303,6 +334,9 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
        /* Surface Pro 8 */
        { "MSHW0263", (unsigned long)ssam_node_group_sp8 },
 
+       /* Surface Pro 9 */
+       { "MSHW0343", (unsigned long)ssam_node_group_sp9 },
+
        /* Surface Book 2 */
        { "MSHW0107", (unsigned long)ssam_node_group_gen5 },
 
@@ -324,6 +358,9 @@ static const struct acpi_device_id ssam_platform_hub_match[] = {
        /* Surface Laptop 4 (13", Intel) */
        { "MSHW0250", (unsigned long)ssam_node_group_sl3 },
 
+       /* Surface Laptop 5 */
+       { "MSHW0350", (unsigned long)ssam_node_group_sl5 },
+
        /* Surface Laptop Go 1 */
        { "MSHW0118", (unsigned long)ssam_node_group_slg1 },
 
index 18224f9..ee67efd 100644 (file)
@@ -566,6 +566,15 @@ static const struct dmi_system_id acer_quirks[] __initconst = {
        },
        {
                .callback = set_force_caps,
+               .ident = "Acer Aspire Switch V 10 SW5-017",
+               .matches = {
+                       DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
+                       DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "SW5-017"),
+               },
+               .driver_data = (void *)ACER_CAP_KBD_DOCK,
+       },
+       {
+               .callback = set_force_caps,
                .ident = "Acer One 10 (S1003)",
                .matches = {
                        DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Acer"),
index 96e790e..ef4ae97 100644 (file)
@@ -276,7 +276,6 @@ static const struct file_operations amd_pmc_stb_debugfs_fops_v2 = {
        .release = amd_pmc_stb_debugfs_release_v2,
 };
 
-#if defined(CONFIG_SUSPEND) || defined(CONFIG_DEBUG_FS)
 static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev)
 {
        if (dev->cpu_id == AMD_CPU_ID_PCO) {
@@ -351,7 +350,6 @@ static int get_metrics_table(struct amd_pmc_dev *pdev, struct smu_metrics *table
        memcpy_fromio(table, pdev->smu_virt_addr, sizeof(struct smu_metrics));
        return 0;
 }
-#endif /* CONFIG_SUSPEND || CONFIG_DEBUG_FS */
 
 #ifdef CONFIG_SUSPEND
 static void amd_pmc_validate_deepest(struct amd_pmc_dev *pdev)
@@ -964,6 +962,7 @@ static const struct acpi_device_id amd_pmc_acpi_ids[] = {
        {"AMDI0006", 0},
        {"AMDI0007", 0},
        {"AMDI0008", 0},
+       {"AMDI0009", 0},
        {"AMD0004", 0},
        {"AMD0005", 0},
        { }
index 6e8e093..872efc1 100644 (file)
@@ -1738,6 +1738,8 @@ static void asus_wmi_set_xusb2pr(struct asus_wmi *asus)
        pci_write_config_dword(xhci_pdev, USB_INTEL_XUSB2PR,
                                cpu_to_le32(ports_available));
 
+       pci_dev_put(xhci_pdev);
+
        pr_info("set USB_INTEL_XUSB2PR old: 0x%04x, new: 0x%04x\n",
                        orig_ports_available, ports_available);
 }
index 1244903..0a99058 100644 (file)
@@ -90,6 +90,7 @@ enum hp_wmi_event_ids {
        HPWMI_PEAKSHIFT_PERIOD          = 0x0F,
        HPWMI_BATTERY_CHARGE_PERIOD     = 0x10,
        HPWMI_SANITIZATION_MODE         = 0x17,
+       HPWMI_SMART_EXPERIENCE_APP      = 0x21,
 };
 
 /*
@@ -859,6 +860,8 @@ static void hp_wmi_notify(u32 value, void *context)
                break;
        case HPWMI_SANITIZATION_MODE:
                break;
+       case HPWMI_SMART_EXPERIENCE_APP:
+               break;
        default:
                pr_info("Unknown event_id - %d - 0x%x\n", event_id, event_data);
                break;
index 33b3dfd..3ea8fc6 100644 (file)
@@ -136,6 +136,7 @@ struct ideapad_private {
                bool dytc                 : 1;
                bool fan_mode             : 1;
                bool fn_lock              : 1;
+               bool set_fn_lock_led      : 1;
                bool hw_rfkill_switch     : 1;
                bool kbd_bl               : 1;
                bool touchpad_ctrl_via_ec : 1;
@@ -154,7 +155,21 @@ MODULE_PARM_DESC(no_bt_rfkill, "No rfkill for bluetooth.");
 
 static bool allow_v4_dytc;
 module_param(allow_v4_dytc, bool, 0444);
-MODULE_PARM_DESC(allow_v4_dytc, "Enable DYTC version 4 platform-profile support.");
+MODULE_PARM_DESC(allow_v4_dytc,
+       "Enable DYTC version 4 platform-profile support. "
+       "If you need this please report this to: platform-driver-x86@vger.kernel.org");
+
+static bool hw_rfkill_switch;
+module_param(hw_rfkill_switch, bool, 0444);
+MODULE_PARM_DESC(hw_rfkill_switch,
+       "Enable rfkill support for laptops with a hw on/off wifi switch/slider. "
+       "If you need this please report this to: platform-driver-x86@vger.kernel.org");
+
+static bool set_fn_lock_led;
+module_param(set_fn_lock_led, bool, 0444);
+MODULE_PARM_DESC(set_fn_lock_led,
+       "Enable driver based updates of the fn-lock LED on fn-lock changes. "
+       "If you need this please report this to: platform-driver-x86@vger.kernel.org");
 
 /*
  * ACPI Helpers
@@ -1501,6 +1516,9 @@ static void ideapad_wmi_notify(u32 value, void *context)
                ideapad_input_report(priv, value);
                break;
        case 208:
+               if (!priv->features.set_fn_lock_led)
+                       break;
+
                if (!eval_hals(priv->adev->handle, &result)) {
                        bool state = test_bit(HALS_FNLOCK_STATE_BIT, &result);
 
@@ -1514,6 +1532,18 @@ static void ideapad_wmi_notify(u32 value, void *context)
 }
 #endif
 
+/* On some models we need to call exec_sals(SALS_FNLOCK_ON/OFF) to set the LED */
+static const struct dmi_system_id set_fn_lock_led_list[] = {
+       {
+               /* https://bugzilla.kernel.org/show_bug.cgi?id=212671 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Legion R7000P2020H"),
+               }
+       },
+       {}
+};
+
 /*
  * Some ideapads have a hardware rfkill switch, but most do not have one.
  * Reading VPCCMD_R_RF always results in 0 on models without a hardware rfkill,
@@ -1556,7 +1586,10 @@ static void ideapad_check_features(struct ideapad_private *priv)
        acpi_handle handle = priv->adev->handle;
        unsigned long val;
 
-       priv->features.hw_rfkill_switch = dmi_check_system(hw_rfkill_list);
+       priv->features.set_fn_lock_led =
+               set_fn_lock_led || dmi_check_system(set_fn_lock_led_list);
+       priv->features.hw_rfkill_switch =
+               hw_rfkill_switch || dmi_check_system(hw_rfkill_list);
 
        /* Most ideapads with ELAN0634 touchpad don't use EC touchpad switch */
        if (acpi_dev_present("ELAN0634", NULL, -1))
index 15ca8af..ddfba38 100644 (file)
@@ -18,6 +18,8 @@
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
 
+#include <xen/xen.h>
+
 static void intel_pmc_core_release(struct device *dev)
 {
        kfree(dev);
@@ -53,6 +55,13 @@ static int __init pmc_core_platform_init(void)
        if (acpi_dev_present("INT33A1", NULL, -1))
                return -ENODEV;
 
+       /*
+        * Skip forcefully attaching the device for VMs. Make an exception for
+        * Xen dom0, which does have full hardware access.
+        */
+       if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR) && !xen_initial_domain())
+               return -ENODEV;
+
        if (!x86_match_cpu(intel_pmc_core_platform_ids))
                return -ENODEV;
 
index 20e5c04..8476dfe 100644 (file)
@@ -4497,6 +4497,14 @@ static const struct dmi_system_id fwbug_list[] __initconst = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "21A0"),
                }
        },
+       {
+               .ident = "P14s Gen2 AMD",
+               .driver_data = &quirk_s2idle_bug,
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "LENOVO"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "21A1"),
+               }
+       },
        {}
 };
 
index 93b80da..b392b9f 100644 (file)
@@ -636,6 +636,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
        dev_info->gd->minors = DCSSBLK_MINORS_PER_DISK;
        dev_info->gd->fops = &dcssblk_devops;
        dev_info->gd->private_data = dev_info;
+       dev_info->gd->flags |= GENHD_FL_NO_PART;
        blk_queue_logical_block_size(dev_info->gd->queue, 4096);
        blk_queue_flag_set(QUEUE_FLAG_DAX, dev_info->gd->queue);
 
index 19223b0..ab3ea52 100644 (file)
@@ -884,7 +884,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
        const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req);
        struct zfcp_adapter *adapter = req->adapter;
        struct zfcp_qdio *qdio = adapter->qdio;
-       int req_id = req->req_id;
+       unsigned long req_id = req->req_id;
 
        zfcp_reqlist_add(adapter->req_list, req);
 
index f77ee40..3306de7 100644 (file)
@@ -3265,7 +3265,8 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc,
        }
 
        if (scmd->result != (DID_OK << 16) && (scmd->cmnd[0] != ATA_12) &&
-           (scmd->cmnd[0] != ATA_16)) {
+           (scmd->cmnd[0] != ATA_16) &&
+           mrioc->logging_level & MPI3_DEBUG_SCSI_ERROR) {
                ioc_info(mrioc, "%s :scmd->result 0x%x\n", __func__,
                    scmd->result);
                scsi_print_command(scmd);
index 6298536..bebda91 100644 (file)
@@ -7323,8 +7323,12 @@ static int sdebug_add_host_helper(int per_host_idx)
        dev_set_name(&sdbg_host->dev, "adapter%d", sdebug_num_hosts);
 
        error = device_register(&sdbg_host->dev);
-       if (error)
+       if (error) {
+               spin_lock(&sdebug_host_list_lock);
+               list_del(&sdbg_host->host_list);
+               spin_unlock(&sdebug_host_list_lock);
                goto clean;
+       }
 
        ++sdebug_num_hosts;
        return 0;
index cd3db96..f473c00 100644 (file)
@@ -231,7 +231,7 @@ iscsi_create_endpoint(int dd_size)
        dev_set_name(&ep->dev, "ep-%d", id);
        err = device_register(&ep->dev);
         if (err)
-               goto free_id;
+               goto put_dev;
 
        err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
        if (err)
@@ -245,10 +245,12 @@ unregister_dev:
        device_unregister(&ep->dev);
        return NULL;
 
-free_id:
+put_dev:
        mutex_lock(&iscsi_ep_idr_mutex);
        idr_remove(&iscsi_ep_idr, id);
        mutex_unlock(&iscsi_ep_idr_mutex);
+       put_device(&ep->dev);
+       return NULL;
 free_ep:
        kfree(ep);
        return NULL;
@@ -766,7 +768,7 @@ iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *transport,
 
        err = device_register(&iface->dev);
        if (err)
-               goto free_iface;
+               goto put_dev;
 
        err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group);
        if (err)
@@ -780,9 +782,8 @@ unreg_iface:
        device_unregister(&iface->dev);
        return NULL;
 
-free_iface:
-       put_device(iface->dev.parent);
-       kfree(iface);
+put_dev:
+       put_device(&iface->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_iface);
@@ -1251,15 +1252,15 @@ iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index,
 
        err = device_register(&fnode_sess->dev);
        if (err)
-               goto free_fnode_sess;
+               goto put_dev;
 
        if (dd_size)
                fnode_sess->dd_data = &fnode_sess[1];
 
        return fnode_sess;
 
-free_fnode_sess:
-       kfree(fnode_sess);
+put_dev:
+       put_device(&fnode_sess->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess);
@@ -1299,15 +1300,15 @@ iscsi_create_flashnode_conn(struct Scsi_Host *shost,
 
        err = device_register(&fnode_conn->dev);
        if (err)
-               goto free_fnode_conn;
+               goto put_dev;
 
        if (dd_size)
                fnode_conn->dd_data = &fnode_conn[1];
 
        return fnode_conn;
 
-free_fnode_conn:
-       kfree(fnode_conn);
+put_dev:
+       put_device(&fnode_conn->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);
@@ -4815,7 +4816,7 @@ iscsi_register_transport(struct iscsi_transport *tt)
        dev_set_name(&priv->dev, "%s", tt->name);
        err = device_register(&priv->dev);
        if (err)
-               goto free_priv;
+               goto put_dev;
 
        err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
        if (err)
@@ -4850,8 +4851,8 @@ iscsi_register_transport(struct iscsi_transport *tt)
 unregister_dev:
        device_unregister(&priv->dev);
        return NULL;
-free_priv:
-       kfree(priv);
+put_dev:
+       put_device(&priv->dev);
        return NULL;
 }
 EXPORT_SYMBOL_GPL(iscsi_register_transport);
index 7c4f32d..5614085 100644 (file)
@@ -839,6 +839,8 @@ static struct siox_device *siox_device_add(struct siox_master *smaster,
 
 err_device_register:
        /* don't care to make the buffer smaller again */
+       put_device(&sdevice->dev);
+       sdevice = NULL;
 
 err_buf_alloc:
        siox_master_unlock(smaster);
index 2ed821f..a0fdf9d 100644 (file)
@@ -23,7 +23,7 @@ config SLIM_QCOM_CTRL
 config SLIM_QCOM_NGD_CTRL
        tristate "Qualcomm SLIMbus Satellite Non-Generic Device Component"
        depends on HAS_IOMEM && DMA_ENGINE && NET
-       depends on QCOM_RPROC_COMMON || COMPILE_TEST
+       depends on QCOM_RPROC_COMMON || (COMPILE_TEST && !QCOM_RPROC_COMMON)
        depends on ARCH_QCOM || COMPILE_TEST
        select QCOM_QMI_HELPERS
        select QCOM_PDR_HELPERS
index 75f87b3..73a2aa3 100644 (file)
@@ -67,10 +67,10 @@ static const int slim_presence_rate_table[] = {
        384000,
        768000,
        0, /* Reserved */
-       110250,
-       220500,
-       441000,
-       882000,
+       11025,
+       22050,
+       44100,
+       88200,
        176400,
        352800,
        705600,
index cc57a38..28144c6 100644 (file)
@@ -11,6 +11,7 @@
 #include <linux/platform_device.h>
 #include <linux/arm-smccc.h>
 #include <linux/of.h>
+#include <linux/clk.h>
 
 #define REV_B1                         0x21
 
@@ -56,6 +57,7 @@ static u32 __init imx8mq_soc_revision(void)
        void __iomem *ocotp_base;
        u32 magic;
        u32 rev;
+       struct clk *clk;
 
        np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-ocotp");
        if (!np)
@@ -63,6 +65,13 @@ static u32 __init imx8mq_soc_revision(void)
 
        ocotp_base = of_iomap(np, 0);
        WARN_ON(!ocotp_base);
+       clk = of_clk_get_by_name(np, NULL);
+       if (!clk) {
+               WARN_ON(!clk);
+               return 0;
+       }
+
+       clk_prepare_enable(clk);
 
        /*
         * SOC revision on older imx8mq is not available in fuses so query
@@ -79,6 +88,8 @@ static u32 __init imx8mq_soc_revision(void)
        soc_uid <<= 32;
        soc_uid |= readl_relaxed(ocotp_base + OCOTP_UID_LOW);
 
+       clk_disable_unprepare(clk);
+       clk_put(clk);
        iounmap(ocotp_base);
        of_node_put(np);
 
index f9589c5..1e5ad3b 100644 (file)
@@ -439,7 +439,7 @@ int rtllib_wx_set_essid(struct rtllib_device *ieee,
                        union iwreq_data *wrqu, char *extra)
 {
 
-       int ret = 0, len, i;
+       int ret = 0, len;
        short proto_started;
        unsigned long flags;
 
@@ -455,13 +455,6 @@ int rtllib_wx_set_essid(struct rtllib_device *ieee,
                goto out;
        }
 
-       for (i = 0; i < len; i++) {
-               if (extra[i] < 0) {
-                       ret = -1;
-                       goto out;
-               }
-       }
-
        if (proto_started)
                rtllib_stop_protocol(ieee, true);
 
index 4407b56..139031c 100644 (file)
@@ -397,6 +397,7 @@ static int tcm_loop_setup_hba_bus(struct tcm_loop_hba *tl_hba, int tcm_loop_host
        ret = device_register(&tl_hba->dev);
        if (ret) {
                pr_err("device_register() failed for tl_hba->dev: %d\n", ret);
+               put_device(&tl_hba->dev);
                return -ENODEV;
        }
 
@@ -1073,7 +1074,7 @@ check_len:
         */
        ret = tcm_loop_setup_hba_bus(tl_hba, tcm_loop_hba_no_cnt);
        if (ret)
-               goto out;
+               return ERR_PTR(ret);
 
        sh = tl_hba->sh;
        tcm_loop_hba_no_cnt++;
index 5e516f5..b6e0cc4 100644 (file)
@@ -264,7 +264,7 @@ struct gsm_mux {
        bool constipated;               /* Asked by remote to shut up */
        bool has_devices;               /* Devices were registered */
 
-       struct mutex tx_mutex;
+       spinlock_t tx_lock;
        unsigned int tx_bytes;          /* TX data outstanding */
 #define TX_THRESH_HI           8192
 #define TX_THRESH_LO           2048
@@ -272,7 +272,7 @@ struct gsm_mux {
        struct list_head tx_data_list;  /* Pending data packets */
 
        /* Control messages */
-       struct delayed_work kick_timeout;       /* Kick TX queuing on timeout */
+       struct timer_list kick_timer;   /* Kick TX queuing on timeout */
        struct timer_list t2_timer;     /* Retransmit timer for commands */
        int cretries;                   /* Command retry counter */
        struct gsm_control *pending_cmd;/* Our current pending command */
@@ -700,6 +700,7 @@ static int gsm_send(struct gsm_mux *gsm, int addr, int cr, int control)
        struct gsm_msg *msg;
        u8 *dp;
        int ocr;
+       unsigned long flags;
 
        msg = gsm_data_alloc(gsm, addr, 0, control);
        if (!msg)
@@ -721,10 +722,10 @@ static int gsm_send(struct gsm_mux *gsm, int addr, int cr, int control)
 
        gsm_print_packet("Q->", addr, cr, control, NULL, 0);
 
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        list_add_tail(&msg->list, &gsm->tx_ctrl_list);
        gsm->tx_bytes += msg->len;
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
        gsmld_write_trigger(gsm);
 
        return 0;
@@ -749,7 +750,7 @@ static void gsm_dlci_clear_queues(struct gsm_mux *gsm, struct gsm_dlci *dlci)
        spin_unlock_irqrestore(&dlci->lock, flags);
 
        /* Clear data packets in MUX write queue */
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        list_for_each_entry_safe(msg, nmsg, &gsm->tx_data_list, list) {
                if (msg->addr != addr)
                        continue;
@@ -757,7 +758,7 @@ static void gsm_dlci_clear_queues(struct gsm_mux *gsm, struct gsm_dlci *dlci)
                list_del(&msg->list);
                kfree(msg);
        }
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 }
 
 /**
@@ -1028,7 +1029,7 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
        gsm->tx_bytes += msg->len;
 
        gsmld_write_trigger(gsm);
-       schedule_delayed_work(&gsm->kick_timeout, 10 * gsm->t1 * HZ / 100);
+       mod_timer(&gsm->kick_timer, jiffies + 10 * gsm->t1 * HZ / 100);
 }
 
 /**
@@ -1043,9 +1044,10 @@ static void __gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
 
 static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
 {
-       mutex_lock(&dlci->gsm->tx_mutex);
+       unsigned long flags;
+       spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
        __gsm_data_queue(dlci, msg);
-       mutex_unlock(&dlci->gsm->tx_mutex);
+       spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
 }
 
 /**
@@ -1057,7 +1059,7 @@ static void gsm_data_queue(struct gsm_dlci *dlci, struct gsm_msg *msg)
  *     is data. Keep to the MRU of the mux. This path handles the usual tty
  *     interface which is a byte stream with optional modem data.
  *
- *     Caller must hold the tx_mutex of the mux.
+ *     Caller must hold the tx_lock of the mux.
  */
 
 static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
@@ -1117,7 +1119,7 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
  *     is data. Keep to the MRU of the mux. This path handles framed data
  *     queued as skbuffs to the DLCI.
  *
- *     Caller must hold the tx_mutex of the mux.
+ *     Caller must hold the tx_lock of the mux.
  */
 
 static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
@@ -1133,7 +1135,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
        if (dlci->adaption == 4)
                overhead = 1;
 
-       /* dlci->skb is locked by tx_mutex */
+       /* dlci->skb is locked by tx_lock */
        if (dlci->skb == NULL) {
                dlci->skb = skb_dequeue_tail(&dlci->skb_list);
                if (dlci->skb == NULL)
@@ -1187,7 +1189,7 @@ static int gsm_dlci_data_output_framed(struct gsm_mux *gsm,
  *     Push an empty frame in to the transmit queue to update the modem status
  *     bits and to transmit an optional break.
  *
- *     Caller must hold the tx_mutex of the mux.
+ *     Caller must hold the tx_lock of the mux.
  */
 
 static int gsm_dlci_modem_output(struct gsm_mux *gsm, struct gsm_dlci *dlci,
@@ -1301,12 +1303,13 @@ static int gsm_dlci_data_sweep(struct gsm_mux *gsm)
 
 static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
 {
+       unsigned long flags;
        int sweep;
 
        if (dlci->constipated)
                return;
 
-       mutex_lock(&dlci->gsm->tx_mutex);
+       spin_lock_irqsave(&dlci->gsm->tx_lock, flags);
        /* If we have nothing running then we need to fire up */
        sweep = (dlci->gsm->tx_bytes < TX_THRESH_LO);
        if (dlci->gsm->tx_bytes == 0) {
@@ -1317,7 +1320,7 @@ static void gsm_dlci_data_kick(struct gsm_dlci *dlci)
        }
        if (sweep)
                gsm_dlci_data_sweep(dlci->gsm);
-       mutex_unlock(&dlci->gsm->tx_mutex);
+       spin_unlock_irqrestore(&dlci->gsm->tx_lock, flags);
 }
 
 /*
@@ -1708,7 +1711,7 @@ static struct gsm_control *gsm_control_send(struct gsm_mux *gsm,
                unsigned int command, u8 *data, int clen)
 {
        struct gsm_control *ctrl = kzalloc(sizeof(struct gsm_control),
-                                               GFP_KERNEL);
+                                               GFP_ATOMIC);
        unsigned long flags;
        if (ctrl == NULL)
                return NULL;
@@ -2019,23 +2022,24 @@ static void gsm_dlci_command(struct gsm_dlci *dlci, const u8 *data, int len)
 }
 
 /**
- *     gsm_kick_timeout        -       transmit if possible
- *     @work: work contained in our gsm object
+ *     gsm_kick_timer  -       transmit if possible
+ *     @t: timer contained in our gsm object
  *
  *     Transmit data from DLCIs if the queue is empty. We can't rely on
  *     a tty wakeup except when we filled the pipe so we need to fire off
  *     new data ourselves in other cases.
  */
-static void gsm_kick_timeout(struct work_struct *work)
+static void gsm_kick_timer(struct timer_list *t)
 {
-       struct gsm_mux *gsm = container_of(work, struct gsm_mux, kick_timeout.work);
+       struct gsm_mux *gsm = from_timer(gsm, t, kick_timer);
+       unsigned long flags;
        int sent = 0;
 
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        /* If we have nothing running then we need to fire up */
        if (gsm->tx_bytes < TX_THRESH_LO)
                sent = gsm_dlci_data_sweep(gsm);
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 
        if (sent && debug & DBG_DATA)
                pr_info("%s TX queue stalled\n", __func__);
@@ -2492,7 +2496,7 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc)
        }
 
        /* Finish outstanding timers, making sure they are done */
-       cancel_delayed_work_sync(&gsm->kick_timeout);
+       del_timer_sync(&gsm->kick_timer);
        del_timer_sync(&gsm->t2_timer);
 
        /* Finish writing to ldisc */
@@ -2565,7 +2569,6 @@ static void gsm_free_mux(struct gsm_mux *gsm)
                        break;
                }
        }
-       mutex_destroy(&gsm->tx_mutex);
        mutex_destroy(&gsm->mutex);
        kfree(gsm->txframe);
        kfree(gsm->buf);
@@ -2637,15 +2640,15 @@ static struct gsm_mux *gsm_alloc_mux(void)
        }
        spin_lock_init(&gsm->lock);
        mutex_init(&gsm->mutex);
-       mutex_init(&gsm->tx_mutex);
        kref_init(&gsm->ref);
        INIT_LIST_HEAD(&gsm->tx_ctrl_list);
        INIT_LIST_HEAD(&gsm->tx_data_list);
-       INIT_DELAYED_WORK(&gsm->kick_timeout, gsm_kick_timeout);
+       timer_setup(&gsm->kick_timer, gsm_kick_timer, 0);
        timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
        INIT_WORK(&gsm->tx_work, gsmld_write_task);
        init_waitqueue_head(&gsm->event);
        spin_lock_init(&gsm->control_lock);
+       spin_lock_init(&gsm->tx_lock);
 
        gsm->t1 = T1;
        gsm->t2 = T2;
@@ -2670,7 +2673,6 @@ static struct gsm_mux *gsm_alloc_mux(void)
        }
        spin_unlock(&gsm_mux_lock);
        if (i == MAX_MUX) {
-               mutex_destroy(&gsm->tx_mutex);
                mutex_destroy(&gsm->mutex);
                kfree(gsm->txframe);
                kfree(gsm->buf);
@@ -2826,16 +2828,17 @@ static void gsmld_write_trigger(struct gsm_mux *gsm)
 static void gsmld_write_task(struct work_struct *work)
 {
        struct gsm_mux *gsm = container_of(work, struct gsm_mux, tx_work);
+       unsigned long flags;
        int i, ret;
 
        /* All outstanding control channel and control messages and one data
         * frame is sent.
         */
        ret = -ENODEV;
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        if (gsm->tty)
                ret = gsm_data_kick(gsm);
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 
        if (ret >= 0)
                for (i = 0; i < NUM_DLCI; i++)
@@ -3042,6 +3045,7 @@ static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
                           const unsigned char *buf, size_t nr)
 {
        struct gsm_mux *gsm = tty->disc_data;
+       unsigned long flags;
        int space;
        int ret;
 
@@ -3049,13 +3053,13 @@ static ssize_t gsmld_write(struct tty_struct *tty, struct file *file,
                return -ENODEV;
 
        ret = -ENOBUFS;
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        space = tty_write_room(tty);
        if (space >= nr)
                ret = tty->ops->write(tty, buf, nr);
        else
                set_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 
        return ret;
 }
@@ -3352,13 +3356,14 @@ static struct tty_ldisc_ops tty_ldisc_packet = {
 static void gsm_modem_upd_via_data(struct gsm_dlci *dlci, u8 brk)
 {
        struct gsm_mux *gsm = dlci->gsm;
+       unsigned long flags;
 
        if (dlci->state != DLCI_OPEN || dlci->adaption != 2)
                return;
 
-       mutex_lock(&gsm->tx_mutex);
+       spin_lock_irqsave(&gsm->tx_lock, flags);
        gsm_dlci_modem_output(gsm, dlci, brk);
-       mutex_unlock(&gsm->tx_mutex);
+       spin_unlock_irqrestore(&gsm->tx_lock, flags);
 }
 
 /**
index 44cc755..0e43bdf 100644 (file)
@@ -174,6 +174,8 @@ static int ehl_serial_setup(struct lpss8250 *lpss, struct uart_port *port)
         */
        up->dma = dma;
 
+       lpss->dma_maxburst = 16;
+
        port->set_termios = dw8250_do_set_termios;
 
        return 0;
@@ -277,8 +279,13 @@ static int lpss8250_dma_setup(struct lpss8250 *lpss, struct uart_8250_port *port
        struct dw_dma_slave *rx_param, *tx_param;
        struct device *dev = port->port.dev;
 
-       if (!lpss->dma_param.dma_dev)
+       if (!lpss->dma_param.dma_dev) {
+               dma = port->dma;
+               if (dma)
+                       goto out_configuration_only;
+
                return 0;
+       }
 
        rx_param = devm_kzalloc(dev, sizeof(*rx_param), GFP_KERNEL);
        if (!rx_param)
@@ -289,16 +296,18 @@ static int lpss8250_dma_setup(struct lpss8250 *lpss, struct uart_8250_port *port
                return -ENOMEM;
 
        *rx_param = lpss->dma_param;
-       dma->rxconf.src_maxburst = lpss->dma_maxburst;
-
        *tx_param = lpss->dma_param;
-       dma->txconf.dst_maxburst = lpss->dma_maxburst;
 
        dma->fn = lpss8250_dma_filter;
        dma->rx_param = rx_param;
        dma->tx_param = tx_param;
 
        port->dma = dma;
+
+out_configuration_only:
+       dma->rxconf.src_maxburst = lpss->dma_maxburst;
+       dma->txconf.dst_maxburst = lpss->dma_maxburst;
+
        return 0;
 }
 
index 41b8c6b..3f33014 100644 (file)
@@ -157,7 +157,11 @@ static u32 uart_read(struct uart_8250_port *up, u32 reg)
        return readl(up->port.membase + (reg << up->port.regshift));
 }
 
-static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
+/*
+ * Called on runtime PM resume path from omap8250_restore_regs(), and
+ * omap8250_set_mctrl().
+ */
+static void __omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
 {
        struct uart_8250_port *up = up_to_u8250p(port);
        struct omap8250_priv *priv = up->port.private_data;
@@ -181,6 +185,20 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
        }
 }
 
+static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
+{
+       int err;
+
+       err = pm_runtime_resume_and_get(port->dev);
+       if (err)
+               return;
+
+       __omap8250_set_mctrl(port, mctrl);
+
+       pm_runtime_mark_last_busy(port->dev);
+       pm_runtime_put_autosuspend(port->dev);
+}
+
 /*
  * Work Around for Errata i202 (2430, 3430, 3630, 4430 and 4460)
  * The access to uart register after MDR1 Access
@@ -193,27 +211,10 @@ static void omap8250_set_mctrl(struct uart_port *port, unsigned int mctrl)
 static void omap_8250_mdr1_errataset(struct uart_8250_port *up,
                                     struct omap8250_priv *priv)
 {
-       u8 timeout = 255;
-
        serial_out(up, UART_OMAP_MDR1, priv->mdr1);
        udelay(2);
        serial_out(up, UART_FCR, up->fcr | UART_FCR_CLEAR_XMIT |
                        UART_FCR_CLEAR_RCVR);
-       /*
-        * Wait for FIFO to empty: when empty, RX_FIFO_E bit is 0 and
-        * TX_FIFO_E bit is 1.
-        */
-       while (UART_LSR_THRE != (serial_in(up, UART_LSR) &
-                               (UART_LSR_THRE | UART_LSR_DR))) {
-               timeout--;
-               if (!timeout) {
-                       /* Should *never* happen. we warn and carry on */
-                       dev_crit(up->port.dev, "Errata i202: timedout %x\n",
-                                serial_in(up, UART_LSR));
-                       break;
-               }
-               udelay(1);
-       }
 }
 
 static void omap_8250_get_divisor(struct uart_port *port, unsigned int baud,
@@ -292,6 +293,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
 {
        struct omap8250_priv *priv = up->port.private_data;
        struct uart_8250_dma    *dma = up->dma;
+       u8 mcr = serial8250_in_MCR(up);
 
        if (dma && dma->tx_running) {
                /*
@@ -308,7 +310,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
        serial_out(up, UART_EFR, UART_EFR_ECB);
 
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_A);
-       serial8250_out_MCR(up, UART_MCR_TCRTLR);
+       serial8250_out_MCR(up, mcr | UART_MCR_TCRTLR);
        serial_out(up, UART_FCR, up->fcr);
 
        omap8250_update_scr(up, priv);
@@ -324,7 +326,8 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
        serial_out(up, UART_LCR, 0);
 
        /* drop TCR + TLR access, we setup XON/XOFF later */
-       serial8250_out_MCR(up, up->mcr);
+       serial8250_out_MCR(up, mcr);
+
        serial_out(up, UART_IER, up->ier);
 
        serial_out(up, UART_LCR, UART_LCR_CONF_MODE_B);
@@ -341,7 +344,7 @@ static void omap8250_restore_regs(struct uart_8250_port *up)
 
        omap8250_update_mdr1(up, priv);
 
-       up->port.ops->set_mctrl(&up->port, up->port.mctrl);
+       __omap8250_set_mctrl(&up->port, up->port.mctrl);
 
        if (up->port.rs485.flags & SER_RS485_ENABLED)
                serial8250_em485_stop_tx(up);
@@ -669,7 +672,6 @@ static int omap_8250_startup(struct uart_port *port)
 
        pm_runtime_get_sync(port->dev);
 
-       up->mcr = 0;
        serial_out(up, UART_FCR, UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT);
 
        serial_out(up, UART_LCR, UART_LCR_WLEN8);
@@ -1458,9 +1460,15 @@ err:
 static int omap8250_remove(struct platform_device *pdev)
 {
        struct omap8250_priv *priv = platform_get_drvdata(pdev);
+       int err;
+
+       err = pm_runtime_resume_and_get(&pdev->dev);
+       if (err)
+               return err;
 
        pm_runtime_dont_use_autosuspend(&pdev->dev);
        pm_runtime_put_sync(&pdev->dev);
+       flush_work(&priv->qos_work);
        pm_runtime_disable(&pdev->dev);
        serial8250_unregister_port(priv->line);
        cpu_latency_qos_remove_request(&priv->pm_qos_request);
index fe8662c..3881722 100644 (file)
@@ -1897,10 +1897,13 @@ EXPORT_SYMBOL_GPL(serial8250_modem_status);
 static bool handle_rx_dma(struct uart_8250_port *up, unsigned int iir)
 {
        switch (iir & 0x3f) {
-       case UART_IIR_RX_TIMEOUT:
-               serial8250_rx_dma_flush(up);
+       case UART_IIR_RDI:
+               if (!up->dma->rx_running)
+                       break;
                fallthrough;
        case UART_IIR_RLSI:
+       case UART_IIR_RX_TIMEOUT:
+               serial8250_rx_dma_flush(up);
                return true;
        }
        return up->dma->rx_dma(up);
index 67fa113..888e01f 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/dmaengine.h>
 #include <linux/dmapool.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/irq.h>
 #include <linux/module.h>
 #include <linux/of.h>
@@ -404,33 +405,6 @@ static unsigned int lpuart_get_baud_clk_rate(struct lpuart_port *sport)
 #define lpuart_enable_clks(x)  __lpuart_enable_clks(x, true)
 #define lpuart_disable_clks(x) __lpuart_enable_clks(x, false)
 
-static int lpuart_global_reset(struct lpuart_port *sport)
-{
-       struct uart_port *port = &sport->port;
-       void __iomem *global_addr;
-       int ret;
-
-       if (uart_console(port))
-               return 0;
-
-       ret = clk_prepare_enable(sport->ipg_clk);
-       if (ret) {
-               dev_err(sport->port.dev, "failed to enable uart ipg clk: %d\n", ret);
-               return ret;
-       }
-
-       if (is_imx7ulp_lpuart(sport) || is_imx8qxp_lpuart(sport)) {
-               global_addr = port->membase + UART_GLOBAL - IMX_REG_OFF;
-               writel(UART_GLOBAL_RST, global_addr);
-               usleep_range(GLOBAL_RST_MIN_US, GLOBAL_RST_MAX_US);
-               writel(0, global_addr);
-               usleep_range(GLOBAL_RST_MIN_US, GLOBAL_RST_MAX_US);
-       }
-
-       clk_disable_unprepare(sport->ipg_clk);
-       return 0;
-}
-
 static void lpuart_stop_tx(struct uart_port *port)
 {
        unsigned char temp;
@@ -2636,6 +2610,54 @@ static const struct serial_rs485 lpuart_rs485_supported = {
        /* delay_rts_* and RX_DURING_TX are not supported */
 };
 
+static int lpuart_global_reset(struct lpuart_port *sport)
+{
+       struct uart_port *port = &sport->port;
+       void __iomem *global_addr;
+       unsigned long ctrl, bd;
+       unsigned int val = 0;
+       int ret;
+
+       ret = clk_prepare_enable(sport->ipg_clk);
+       if (ret) {
+               dev_err(sport->port.dev, "failed to enable uart ipg clk: %d\n", ret);
+               return ret;
+       }
+
+       if (is_imx7ulp_lpuart(sport) || is_imx8qxp_lpuart(sport)) {
+               /*
+                * If the transmitter is used by earlycon, wait for transmit engine to
+                * complete and then reset.
+                */
+               ctrl = lpuart32_read(port, UARTCTRL);
+               if (ctrl & UARTCTRL_TE) {
+                       bd = lpuart32_read(&sport->port, UARTBAUD);
+                       if (read_poll_timeout(lpuart32_tx_empty, val, val, 1, 100000, false,
+                                             port)) {
+                               dev_warn(sport->port.dev,
+                                        "timeout waiting for transmit engine to complete\n");
+                               clk_disable_unprepare(sport->ipg_clk);
+                               return 0;
+                       }
+               }
+
+               global_addr = port->membase + UART_GLOBAL - IMX_REG_OFF;
+               writel(UART_GLOBAL_RST, global_addr);
+               usleep_range(GLOBAL_RST_MIN_US, GLOBAL_RST_MAX_US);
+               writel(0, global_addr);
+               usleep_range(GLOBAL_RST_MIN_US, GLOBAL_RST_MAX_US);
+
+               /* Recover the transmitter for earlycon. */
+               if (ctrl & UARTCTRL_TE) {
+                       lpuart32_write(port, bd, UARTBAUD);
+                       lpuart32_write(port, ctrl, UARTCTRL);
+               }
+       }
+
+       clk_disable_unprepare(sport->ipg_clk);
+       return 0;
+}
+
 static int lpuart_probe(struct platform_device *pdev)
 {
        const struct lpuart_soc_data *sdata = of_device_get_match_data(&pdev->dev);
index 05b432d..aadda66 100644 (file)
@@ -2594,6 +2594,7 @@ static const struct dev_pm_ops imx_uart_pm_ops = {
        .suspend_noirq = imx_uart_suspend_noirq,
        .resume_noirq = imx_uart_resume_noirq,
        .freeze_noirq = imx_uart_suspend_noirq,
+       .thaw_noirq = imx_uart_resume_noirq,
        .restore_noirq = imx_uart_resume_noirq,
        .suspend = imx_uart_suspend,
        .resume = imx_uart_resume,
index 9643b90..6164fc4 100644 (file)
 #define CFG_RXDET_P3_EN                BIT(15)
 #define LPM_2_STB_SWITCH_EN    BIT(25)
 
-static int xhci_cdns3_suspend_quirk(struct usb_hcd *hcd);
+static void xhci_cdns3_plat_start(struct usb_hcd *hcd)
+{
+       struct xhci_hcd *xhci = hcd_to_xhci(hcd);
+       u32 value;
+
+       /* set usbcmd.EU3S */
+       value = readl(&xhci->op_regs->command);
+       value |= CMD_PM_INDEX;
+       writel(value, &xhci->op_regs->command);
+
+       if (hcd->regs) {
+               value = readl(hcd->regs + XECP_AUX_CTRL_REG1);
+               value |= CFG_RXDET_P3_EN;
+               writel(value, hcd->regs + XECP_AUX_CTRL_REG1);
+
+               value = readl(hcd->regs + XECP_PORT_CAP_REG);
+               value |= LPM_2_STB_SWITCH_EN;
+               writel(value, hcd->regs + XECP_PORT_CAP_REG);
+       }
+}
+
+static int xhci_cdns3_resume_quirk(struct usb_hcd *hcd)
+{
+       xhci_cdns3_plat_start(hcd);
+       return 0;
+}
 
 static const struct xhci_plat_priv xhci_plat_cdns3_xhci = {
        .quirks = XHCI_SKIP_PHY_INIT | XHCI_AVOID_BEI,
-       .suspend_quirk = xhci_cdns3_suspend_quirk,
+       .plat_start = xhci_cdns3_plat_start,
+       .resume_quirk = xhci_cdns3_resume_quirk,
 };
 
 static int __cdns_host_init(struct cdns *cdns)
@@ -90,32 +116,6 @@ err1:
        return ret;
 }
 
-static int xhci_cdns3_suspend_quirk(struct usb_hcd *hcd)
-{
-       struct xhci_hcd *xhci = hcd_to_xhci(hcd);
-       u32 value;
-
-       if (pm_runtime_status_suspended(hcd->self.controller))
-               return 0;
-
-       /* set usbcmd.EU3S */
-       value = readl(&xhci->op_regs->command);
-       value |= CMD_PM_INDEX;
-       writel(value, &xhci->op_regs->command);
-
-       if (hcd->regs) {
-               value = readl(hcd->regs + XECP_AUX_CTRL_REG1);
-               value |= CFG_RXDET_P3_EN;
-               writel(value, hcd->regs + XECP_AUX_CTRL_REG1);
-
-               value = readl(hcd->regs + XECP_PORT_CAP_REG);
-               value |= LPM_2_STB_SWITCH_EN;
-               writel(value, hcd->regs + XECP_PORT_CAP_REG);
-       }
-
-       return 0;
-}
-
 static void cdns_host_exit(struct cdns *cdns)
 {
        kfree(cdns->xhci_plat_data);
index ada78da..c17516c 100644 (file)
@@ -256,8 +256,10 @@ static void ci_otg_del_timer(struct ci_hdrc *ci, enum otg_fsm_timer t)
        ci->enabled_otg_timer_bits &= ~(1 << t);
        if (ci->next_otg_timer == t) {
                if (ci->enabled_otg_timer_bits == 0) {
+                       spin_unlock_irqrestore(&ci->lock, flags);
                        /* No enabled timers after delete it */
                        hrtimer_cancel(&ci->otg_fsm_hrtimer);
+                       spin_lock_irqsave(&ci->lock, flags);
                        ci->next_otg_timer = NUM_OTG_FSM_TIMERS;
                } else {
                        /* Find the next timer */
index 0722d21..079e183 100644 (file)
@@ -362,6 +362,9 @@ static const struct usb_device_id usb_quirk_list[] = {
        { USB_DEVICE(0x0781, 0x5583), .driver_info = USB_QUIRK_NO_LPM },
        { USB_DEVICE(0x0781, 0x5591), .driver_info = USB_QUIRK_NO_LPM },
 
+       /* Realforce 87U Keyboard */
+       { USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM },
+
        /* M-Systems Flash Disk Pioneers */
        { USB_DEVICE(0x08ec, 0x1000), .driver_info = USB_QUIRK_RESET_RESUME },
 
index c0e7c76..1f348bc 100644 (file)
@@ -1711,6 +1711,16 @@ static struct extcon_dev *dwc3_get_extcon(struct dwc3 *dwc)
                return extcon_get_extcon_dev(name);
 
        /*
+        * Check explicitly if "usb-role-switch" is used since
+        * extcon_find_edev_by_node() can not be used to check the absence of
+        * an extcon device. In the absence of an device it will always return
+        * EPROBE_DEFER.
+        */
+       if (IS_ENABLED(CONFIG_USB_ROLE_SWITCH) &&
+           device_property_read_bool(dev, "usb-role-switch"))
+               return NULL;
+
+       /*
         * Try to get an extcon device from the USB PHY controller's "port"
         * node. Check if it has the "port" node first, to avoid printing the
         * error message from underlying code, as it's a valid case: extcon
index 5fe2d13..026d402 100644 (file)
@@ -1029,7 +1029,7 @@ static int __dwc3_gadget_ep_disable(struct dwc3_ep *dep)
                dep->endpoint.desc = NULL;
        }
 
-       dwc3_remove_requests(dwc, dep, -ECONNRESET);
+       dwc3_remove_requests(dwc, dep, -ESHUTDOWN);
 
        dep->stream_capable = false;
        dep->type = 0;
index a7154fe..f6f13e7 100644 (file)
 #include <linux/of.h>
 #include <linux/platform_device.h>
 
-#include "../host/xhci-plat.h"
 #include "core.h"
 
-static const struct xhci_plat_priv dwc3_xhci_plat_priv = {
-       .quirks = XHCI_SKIP_PHY_INIT,
-};
-
 static void dwc3_host_fill_xhci_irq_res(struct dwc3 *dwc,
                                        int irq, char *name)
 {
@@ -97,11 +92,6 @@ int dwc3_host_init(struct dwc3 *dwc)
                goto err;
        }
 
-       ret = platform_device_add_data(xhci, &dwc3_xhci_plat_priv,
-                                       sizeof(dwc3_xhci_plat_priv));
-       if (ret)
-               goto err;
-
        memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
 
        if (dwc->usb3_lpm_capable)
index 2df52f7..7558cc4 100644 (file)
@@ -285,7 +285,7 @@ static void bcma_hci_platform_power_gpio(struct bcma_device *dev, bool val)
 {
        struct bcma_hcd_device *usb_dev = bcma_get_drvdata(dev);
 
-       if (IS_ERR_OR_NULL(usb_dev->gpio_desc))
+       if (!usb_dev->gpio_desc)
                return;
 
        gpiod_set_value(usb_dev->gpio_desc, val);
@@ -406,9 +406,11 @@ static int bcma_hcd_probe(struct bcma_device *core)
                return -ENOMEM;
        usb_dev->core = core;
 
-       if (core->dev.of_node)
-               usb_dev->gpio_desc = devm_gpiod_get(&core->dev, "vcc",
-                                                   GPIOD_OUT_HIGH);
+       usb_dev->gpio_desc = devm_gpiod_get_optional(&core->dev, "vcc",
+                                                    GPIOD_OUT_HIGH);
+       if (IS_ERR(usb_dev->gpio_desc))
+               return dev_err_probe(&core->dev, PTR_ERR(usb_dev->gpio_desc),
+                                    "error obtaining VCC GPIO");
 
        switch (core->id.id) {
        case BCMA_CORE_USB20_HOST:
index 697683e..c3b7f1d 100644 (file)
@@ -162,6 +162,8 @@ static void option_instat_callback(struct urb *urb);
 #define NOVATELWIRELESS_PRODUCT_G2             0xA010
 #define NOVATELWIRELESS_PRODUCT_MC551          0xB001
 
+#define UBLOX_VENDOR_ID                                0x1546
+
 /* AMOI PRODUCTS */
 #define AMOI_VENDOR_ID                         0x1614
 #define AMOI_PRODUCT_H01                       0x0800
@@ -240,7 +242,6 @@ static void option_instat_callback(struct urb *urb);
 #define QUECTEL_PRODUCT_UC15                   0x9090
 /* These u-blox products use Qualcomm's vendor ID */
 #define UBLOX_PRODUCT_R410M                    0x90b2
-#define UBLOX_PRODUCT_R6XX                     0x90fa
 /* These Yuga products use Qualcomm's vendor ID */
 #define YUGA_PRODUCT_CLM920_NC5                        0x9625
 
@@ -581,6 +582,9 @@ static void option_instat_callback(struct urb *urb);
 #define OPPO_VENDOR_ID                         0x22d9
 #define OPPO_PRODUCT_R11                       0x276c
 
+/* Sierra Wireless products */
+#define SIERRA_VENDOR_ID                       0x1199
+#define SIERRA_PRODUCT_EM9191                  0x90d3
 
 /* Device flags */
 
@@ -1124,8 +1128,16 @@ static const struct usb_device_id option_ids[] = {
        /* u-blox products using Qualcomm vendor ID */
        { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
          .driver_info = RSVD(1) | RSVD(3) },
-       { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX),
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x908b),       /* u-blox LARA-R6 00B */
+         .driver_info = RSVD(4) },
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x90fa),
          .driver_info = RSVD(3) },
+       /* u-blox products */
+       { USB_DEVICE(UBLOX_VENDOR_ID, 0x1341) },        /* u-blox LARA-L6 */
+       { USB_DEVICE(UBLOX_VENDOR_ID, 0x1342),          /* u-blox LARA-L6 (RMNET) */
+         .driver_info = RSVD(4) },
+       { USB_DEVICE(UBLOX_VENDOR_ID, 0x1343),          /* u-blox LARA-L6 (ECM) */
+         .driver_info = RSVD(4) },
        /* Quectel products using Quectel vendor ID */
        { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
          .driver_info = NUMEP2 },
@@ -2167,6 +2179,7 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x010a, 0xff) },                   /* Fibocom MA510 (ECM mode) */
        { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) },    /* Fibocom FG150 Diag */
        { USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0, 0) },          /* Fibocom FG150 AT */
+       { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0111, 0xff) },                   /* Fibocom FM160 (MBIM mode) */
        { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) },                   /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */
        { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a2, 0xff) },                   /* Fibocom FM101-GL (laptop MBIM) */
        { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a4, 0xff),                     /* Fibocom FM101-GL (laptop MBIM) */
@@ -2176,6 +2189,8 @@ static const struct usb_device_id option_ids[] = {
        { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1405, 0xff) },                   /* GosunCn GM500 MBIM */
        { USB_DEVICE_INTERFACE_CLASS(0x305a, 0x1406, 0xff) },                   /* GosunCn GM500 ECM/NCM */
        { USB_DEVICE_AND_INTERFACE_INFO(OPPO_VENDOR_ID, OPPO_PRODUCT_R11, 0xff, 0xff, 0x30) },
+       { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0xff, 0x30) },
+       { USB_DEVICE_AND_INTERFACE_INFO(SIERRA_VENDOR_ID, SIERRA_PRODUCT_EM9191, 0xff, 0, 0) },
        { } /* Terminating entry */
 };
 MODULE_DEVICE_TABLE(usb, option_ids);
index e1f4df7..fdbf369 100644 (file)
@@ -369,13 +369,24 @@ pmc_usb_mux_usb4(struct pmc_usb_port *port, struct typec_mux_state *state)
        return pmc_usb_command(port, (void *)&req, sizeof(req));
 }
 
-static int pmc_usb_mux_safe_state(struct pmc_usb_port *port)
+static int pmc_usb_mux_safe_state(struct pmc_usb_port *port,
+                                 struct typec_mux_state *state)
 {
        u8 msg;
 
        if (IOM_PORT_ACTIVITY_IS(port->iom_status, SAFE_MODE))
                return 0;
 
+       if ((IOM_PORT_ACTIVITY_IS(port->iom_status, DP) ||
+            IOM_PORT_ACTIVITY_IS(port->iom_status, DP_MFD)) &&
+            state->alt && state->alt->svid == USB_TYPEC_DP_SID)
+               return 0;
+
+       if ((IOM_PORT_ACTIVITY_IS(port->iom_status, TBT) ||
+            IOM_PORT_ACTIVITY_IS(port->iom_status, ALT_MODE_TBT_USB)) &&
+            state->alt && state->alt->svid == USB_TYPEC_TBT_SID)
+               return 0;
+
        msg = PMC_USB_SAFE_MODE;
        msg |= port->usb3_port << PMC_USB_MSG_USB3_PORT_SHIFT;
 
@@ -443,7 +454,7 @@ pmc_usb_mux_set(struct typec_mux_dev *mux, struct typec_mux_state *state)
                return 0;
 
        if (state->mode == TYPEC_STATE_SAFE)
-               return pmc_usb_mux_safe_state(port);
+               return pmc_usb_mux_safe_state(port, state);
        if (state->mode == TYPEC_STATE_USB)
                return pmc_usb_connect(port, port->role);
 
index b637e8b..2a77bab 100644 (file)
@@ -474,7 +474,7 @@ static void tps6598x_handle_plug_event(struct tps6598x *tps, u32 status)
 static irqreturn_t cd321x_interrupt(int irq, void *data)
 {
        struct tps6598x *tps = data;
-       u64 event;
+       u64 event = 0;
        u32 status;
        int ret;
 
@@ -519,8 +519,8 @@ err_unlock:
 static irqreturn_t tps6598x_interrupt(int irq, void *data)
 {
        struct tps6598x *tps = data;
-       u64 event1;
-       u64 event2;
+       u64 event1 = 0;
+       u64 event2 = 0;
        u32 status;
        int ret;
 
index badc9d8..e030c21 100644 (file)
@@ -2488,12 +2488,12 @@ static bool vfio_pci_dev_set_needs_reset(struct vfio_device_set *dev_set)
        struct vfio_pci_core_device *cur;
        bool needs_reset = false;
 
-       list_for_each_entry(cur, &dev_set->device_list, vdev.dev_set_list) {
-               /* No VFIO device in the set can have an open device FD */
-               if (cur->vdev.open_count)
-                       return false;
+       /* No other VFIO device in the set can be open. */
+       if (vfio_device_set_open_count(dev_set) > 1)
+               return false;
+
+       list_for_each_entry(cur, &dev_set->device_list, vdev.dev_set_list)
                needs_reset |= cur->needs_reset;
-       }
        return needs_reset;
 }
 
index 2d16879..6e8804f 100644 (file)
@@ -125,6 +125,19 @@ static void vfio_release_device_set(struct vfio_device *device)
        xa_unlock(&vfio_device_set_xa);
 }
 
+unsigned int vfio_device_set_open_count(struct vfio_device_set *dev_set)
+{
+       struct vfio_device *cur;
+       unsigned int open_count = 0;
+
+       lockdep_assert_held(&dev_set->lock);
+
+       list_for_each_entry(cur, &dev_set->device_list, dev_set_list)
+               open_count += cur->open_count;
+       return open_count;
+}
+EXPORT_SYMBOL_GPL(vfio_device_set_open_count);
+
 /*
  * Group objects - create, release, get, put, search
  */
@@ -801,8 +814,9 @@ static struct file *vfio_device_open(struct vfio_device *device)
 err_close_device:
        mutex_lock(&device->dev_set->lock);
        mutex_lock(&device->group->group_lock);
-       if (device->open_count == 1 && device->ops->close_device) {
-               device->ops->close_device(device);
+       if (device->open_count == 1) {
+               if (device->ops->close_device)
+                       device->ops->close_device(device);
 
                vfio_device_container_unregister(device);
        }
@@ -1017,10 +1031,12 @@ static int vfio_device_fops_release(struct inode *inode, struct file *filep)
        mutex_lock(&device->dev_set->lock);
        vfio_assert_device_open(device);
        mutex_lock(&device->group->group_lock);
-       if (device->open_count == 1 && device->ops->close_device)
-               device->ops->close_device(device);
+       if (device->open_count == 1) {
+               if (device->ops->close_device)
+                       device->ops->close_device(device);
 
-       vfio_device_container_unregister(device);
+               vfio_device_container_unregister(device);
+       }
        mutex_unlock(&device->group->group_lock);
        device->open_count--;
        if (device->open_count == 0)
index 47aa3a1..fd3a644 100644 (file)
@@ -228,7 +228,7 @@ static int register_pcpu(struct pcpu *pcpu)
 
        err = device_register(dev);
        if (err) {
-               pcpu_release(dev);
+               put_device(dev);
                return err;
        }
 
index 18f0ed8..cd07e3f 100644 (file)
@@ -54,7 +54,8 @@ static uint64_t get_callback_via(struct pci_dev *pdev)
        pin = pdev->pin;
 
        /* We don't know the GSI. Specify the PCI INTx line instead. */
-       return ((uint64_t)0x01 << HVM_CALLBACK_VIA_TYPE_SHIFT) | /* PCI INTx identifier */
+       return ((uint64_t)HVM_PARAM_CALLBACK_TYPE_PCI_INTX <<
+                         HVM_CALLBACK_VIA_TYPE_SHIFT) |
                ((uint64_t)pci_domain_nr(pdev->bus) << 32) |
                ((uint64_t)pdev->bus->number << 16) |
                ((uint64_t)(pdev->devfn & 0xff) << 8) |
@@ -144,7 +145,7 @@ static int platform_pci_probe(struct pci_dev *pdev,
                if (ret) {
                        dev_warn(&pdev->dev, "Unable to set the evtchn callback "
                                         "err=%d\n", ret);
-                       goto out;
+                       goto irq_out;
                }
        }
 
@@ -152,13 +153,16 @@ static int platform_pci_probe(struct pci_dev *pdev,
        grant_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
        ret = gnttab_setup_auto_xlat_frames(grant_frames);
        if (ret)
-               goto out;
+               goto irq_out;
        ret = gnttab_init();
        if (ret)
                goto grant_out;
        return 0;
 grant_out:
        gnttab_free_auto_xlat_frames();
+irq_out:
+       if (!xen_have_vector_callback)
+               free_irq(pdev->irq, pdev);
 out:
        pci_release_region(pdev, 0);
 mem_out:
index 5e53b48..097316a 100644 (file)
@@ -190,13 +190,16 @@ static const struct config_field caplist_pm[] = {
 };
 
 static struct msi_msix_field_config {
-       u16          enable_bit; /* bit for enabling MSI/MSI-X */
-       unsigned int int_type;   /* interrupt type for exclusiveness check */
+       u16          enable_bit;   /* bit for enabling MSI/MSI-X */
+       u16          allowed_bits; /* bits allowed to be changed */
+       unsigned int int_type;     /* interrupt type for exclusiveness check */
 } msi_field_config = {
        .enable_bit     = PCI_MSI_FLAGS_ENABLE,
+       .allowed_bits   = PCI_MSI_FLAGS_ENABLE,
        .int_type       = INTERRUPT_TYPE_MSI,
 }, msix_field_config = {
        .enable_bit     = PCI_MSIX_FLAGS_ENABLE,
+       .allowed_bits   = PCI_MSIX_FLAGS_ENABLE | PCI_MSIX_FLAGS_MASKALL,
        .int_type       = INTERRUPT_TYPE_MSIX,
 };
 
@@ -229,7 +232,7 @@ static int msi_msix_flags_write(struct pci_dev *dev, int offset, u16 new_value,
                return 0;
 
        if (!dev_data->allow_interrupt_control ||
-           (new_value ^ old_value) & ~field_config->enable_bit)
+           (new_value ^ old_value) & ~field_config->allowed_bits)
                return PCIBIOS_SET_FAILED;
 
        if (new_value & field_config->enable_bit) {
index fb023f9..e54814d 100644 (file)
@@ -2248,7 +2248,6 @@ static int flush_mdlog_and_wait_inode_unsafe_requests(struct inode *inode)
        struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc;
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct ceph_mds_request *req1 = NULL, *req2 = NULL;
-       unsigned int max_sessions;
        int ret, err = 0;
 
        spin_lock(&ci->i_unsafe_lock);
@@ -2267,27 +2266,23 @@ static int flush_mdlog_and_wait_inode_unsafe_requests(struct inode *inode)
        spin_unlock(&ci->i_unsafe_lock);
 
        /*
-        * The mdsc->max_sessions is unlikely to be changed
-        * mostly, here we will retry it by reallocating the
-        * sessions array memory to get rid of the mdsc->mutex
-        * lock.
-        */
-retry:
-       max_sessions = mdsc->max_sessions;
-
-       /*
         * Trigger to flush the journal logs in all the relevant MDSes
         * manually, or in the worst case we must wait at most 5 seconds
         * to wait the journal logs to be flushed by the MDSes periodically.
         */
-       if ((req1 || req2) && likely(max_sessions)) {
-               struct ceph_mds_session **sessions = NULL;
-               struct ceph_mds_session *s;
+       if (req1 || req2) {
                struct ceph_mds_request *req;
+               struct ceph_mds_session **sessions;
+               struct ceph_mds_session *s;
+               unsigned int max_sessions;
                int i;
 
+               mutex_lock(&mdsc->mutex);
+               max_sessions = mdsc->max_sessions;
+
                sessions = kcalloc(max_sessions, sizeof(s), GFP_KERNEL);
                if (!sessions) {
+                       mutex_unlock(&mdsc->mutex);
                        err = -ENOMEM;
                        goto out;
                }
@@ -2299,16 +2294,6 @@ retry:
                                s = req->r_session;
                                if (!s)
                                        continue;
-                               if (unlikely(s->s_mds >= max_sessions)) {
-                                       spin_unlock(&ci->i_unsafe_lock);
-                                       for (i = 0; i < max_sessions; i++) {
-                                               s = sessions[i];
-                                               if (s)
-                                                       ceph_put_mds_session(s);
-                                       }
-                                       kfree(sessions);
-                                       goto retry;
-                               }
                                if (!sessions[s->s_mds]) {
                                        s = ceph_get_mds_session(s);
                                        sessions[s->s_mds] = s;
@@ -2321,16 +2306,6 @@ retry:
                                s = req->r_session;
                                if (!s)
                                        continue;
-                               if (unlikely(s->s_mds >= max_sessions)) {
-                                       spin_unlock(&ci->i_unsafe_lock);
-                                       for (i = 0; i < max_sessions; i++) {
-                                               s = sessions[i];
-                                               if (s)
-                                                       ceph_put_mds_session(s);
-                                       }
-                                       kfree(sessions);
-                                       goto retry;
-                               }
                                if (!sessions[s->s_mds]) {
                                        s = ceph_get_mds_session(s);
                                        sessions[s->s_mds] = s;
@@ -2342,11 +2317,12 @@ retry:
                /* the auth MDS */
                spin_lock(&ci->i_ceph_lock);
                if (ci->i_auth_cap) {
-                     s = ci->i_auth_cap->session;
-                     if (!sessions[s->s_mds])
-                             sessions[s->s_mds] = ceph_get_mds_session(s);
+                       s = ci->i_auth_cap->session;
+                       if (!sessions[s->s_mds])
+                               sessions[s->s_mds] = ceph_get_mds_session(s);
                }
                spin_unlock(&ci->i_ceph_lock);
+               mutex_unlock(&mdsc->mutex);
 
                /* send flush mdlog request to MDSes */
                for (i = 0; i < max_sessions; i++) {
index 4af5e55..bad9eeb 100644 (file)
@@ -2492,7 +2492,7 @@ int ceph_getattr(struct user_namespace *mnt_userns, const struct path *path,
                        struct inode *parent;
 
                        parent = ceph_lookup_inode(sb, ceph_ino(inode));
-                       if (!parent)
+                       if (IS_ERR(parent))
                                return PTR_ERR(parent);
 
                        pci = ceph_inode(parent);
index 864cdaa..e415185 100644 (file)
@@ -763,7 +763,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
        struct ceph_mds_snap_realm *ri;    /* encoded */
        __le64 *snaps;                     /* encoded */
        __le64 *prior_parent_snaps;        /* encoded */
-       struct ceph_snap_realm *realm = NULL;
+       struct ceph_snap_realm *realm;
        struct ceph_snap_realm *first_realm = NULL;
        struct ceph_snap_realm *realm_to_rebuild = NULL;
        int rebuild_snapcs;
@@ -774,6 +774,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
 
        dout("%s deletion=%d\n", __func__, deletion);
 more:
+       realm = NULL;
        rebuild_snapcs = 0;
        ceph_decode_need(&p, e, sizeof(*ri), bad);
        ri = p;
index 1cc47dd..9db9527 100644 (file)
@@ -3855,9 +3855,13 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
        uuid_copy(&cifs_sb->dfs_mount_id, &mnt_ctx.mount_id);
 
 out:
-       free_xid(mnt_ctx.xid);
        cifs_try_adding_channels(cifs_sb, mnt_ctx.ses);
-       return mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       rc = mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       if (rc)
+               goto error;
+
+       free_xid(mnt_ctx.xid);
+       return rc;
 
 error:
        dfs_cache_put_refsrv_sessions(&mnt_ctx.mount_id);
@@ -3884,8 +3888,12 @@ int cifs_mount(struct cifs_sb_info *cifs_sb, struct smb3_fs_context *ctx)
                        goto error;
        }
 
+       rc = mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       if (rc)
+               goto error;
+
        free_xid(mnt_ctx.xid);
-       return mount_setup_tlink(cifs_sb, mnt_ctx.ses, mnt_ctx.tcon);
+       return rc;
 
 error:
        mount_put_conns(&mnt_ctx);
index 89d5fa8..6419ec4 100644 (file)
@@ -343,7 +343,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
                                        rc = put_user(ExtAttrBits &
                                                FS_FL_USER_VISIBLE,
                                                (int __user *)arg);
-                               if (rc != EOPNOTSUPP)
+                               if (rc != -EOPNOTSUPP)
                                        break;
                        }
 #endif /* CONFIG_CIFS_ALLOW_INSECURE_LEGACY */
@@ -373,7 +373,7 @@ long cifs_ioctl(struct file *filep, unsigned int command, unsigned long arg)
                         *                     pSMBFile->fid.netfid,
                         *                     extAttrBits,
                         *                     &ExtAttrMask);
-                        * if (rc != EOPNOTSUPP)
+                        * if (rc != -EOPNOTSUPP)
                         *      break;
                         */
 
index 880cd49..bfaafd0 100644 (file)
@@ -1116,6 +1116,8 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
                                COMPOUND_FID, current->tgid,
                                FILE_FULL_EA_INFORMATION,
                                SMB2_O_INFO_FILE, 0, data, size);
+       if (rc)
+               goto sea_exit;
        smb2_set_next_command(tcon, &rqst[1]);
        smb2_set_related(&rqst[1]);
 
@@ -1126,6 +1128,8 @@ smb2_set_ea(const unsigned int xid, struct cifs_tcon *tcon,
        rqst[2].rq_nvec = 1;
        rc = SMB2_close_init(tcon, server,
                             &rqst[2], COMPOUND_FID, COMPOUND_FID, false);
+       if (rc)
+               goto sea_exit;
        smb2_set_related(&rqst[2]);
 
        rc = compound_send_recv(xid, ses, server,
index fe05bc5..af5ed6b 100644 (file)
@@ -75,11 +75,15 @@ static void erofs_fscache_rreq_unlock_folios(struct netfs_io_request *rreq)
 
        rcu_read_lock();
        xas_for_each(&xas, folio, last_page) {
-               unsigned int pgpos =
-                       (folio_index(folio) - start_page) * PAGE_SIZE;
-               unsigned int pgend = pgpos + folio_size(folio);
+               unsigned int pgpos, pgend;
                bool pg_failed = false;
 
+               if (xas_retry(&xas, folio))
+                       continue;
+
+               pgpos = (folio_index(folio) - start_page) * PAGE_SIZE;
+               pgend = pgpos + folio_size(folio);
+
                for (;;) {
                        if (!subreq) {
                                pg_failed = true;
@@ -287,22 +291,25 @@ static int erofs_fscache_data_read(struct address_space *mapping,
                        return PTR_ERR(src);
 
                iov_iter_xarray(&iter, READ, &mapping->i_pages, pos, PAGE_SIZE);
-               if (copy_to_iter(src + offset, size, &iter) != size)
+               if (copy_to_iter(src + offset, size, &iter) != size) {
+                       erofs_put_metabuf(&buf);
                        return -EFAULT;
+               }
                iov_iter_zero(PAGE_SIZE - size, &iter);
                erofs_put_metabuf(&buf);
                return PAGE_SIZE;
        }
 
-       count = min_t(size_t, map.m_llen - (pos - map.m_la), len);
-       DBG_BUGON(!count || count % PAGE_SIZE);
-
        if (!(map.m_flags & EROFS_MAP_MAPPED)) {
+               count = len;
                iov_iter_xarray(&iter, READ, &mapping->i_pages, pos, count);
                iov_iter_zero(count, &iter);
                return count;
        }
 
+       count = min_t(size_t, map.m_llen - (pos - map.m_la), len);
+       DBG_BUGON(!count || count % PAGE_SIZE);
+
        mdev = (struct erofs_map_dev) {
                .m_deviceid = map.m_deviceid,
                .m_pa = map.m_pa,
@@ -403,13 +410,13 @@ static void erofs_fscache_domain_put(struct erofs_domain *domain)
 static int erofs_fscache_register_volume(struct super_block *sb)
 {
        struct erofs_sb_info *sbi = EROFS_SB(sb);
-       char *domain_id = sbi->opt.domain_id;
+       char *domain_id = sbi->domain_id;
        struct fscache_volume *volume;
        char *name;
        int ret = 0;
 
        name = kasprintf(GFP_KERNEL, "erofs,%s",
-                        domain_id ? domain_id : sbi->opt.fsid);
+                        domain_id ? domain_id : sbi->fsid);
        if (!name)
                return -ENOMEM;
 
@@ -435,7 +442,7 @@ static int erofs_fscache_init_domain(struct super_block *sb)
        if (!domain)
                return -ENOMEM;
 
-       domain->domain_id = kstrdup(sbi->opt.domain_id, GFP_KERNEL);
+       domain->domain_id = kstrdup(sbi->domain_id, GFP_KERNEL);
        if (!domain->domain_id) {
                kfree(domain);
                return -ENOMEM;
@@ -472,7 +479,7 @@ static int erofs_fscache_register_domain(struct super_block *sb)
 
        mutex_lock(&erofs_domain_list_lock);
        list_for_each_entry(domain, &erofs_domain_list, list) {
-               if (!strcmp(domain->domain_id, sbi->opt.domain_id)) {
+               if (!strcmp(domain->domain_id, sbi->domain_id)) {
                        sbi->domain = domain;
                        sbi->volume = domain->volume;
                        refcount_inc(&domain->ref);
@@ -609,7 +616,7 @@ struct erofs_fscache *erofs_domain_register_cookie(struct super_block *sb,
 struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
                                                    char *name, bool need_inode)
 {
-       if (EROFS_SB(sb)->opt.domain_id)
+       if (EROFS_SB(sb)->domain_id)
                return erofs_domain_register_cookie(sb, name, need_inode);
        return erofs_fscache_acquire_cookie(sb, name, need_inode);
 }
@@ -641,7 +648,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
        struct erofs_sb_info *sbi = EROFS_SB(sb);
        struct erofs_fscache *fscache;
 
-       if (sbi->opt.domain_id)
+       if (sbi->domain_id)
                ret = erofs_fscache_register_domain(sb);
        else
                ret = erofs_fscache_register_volume(sb);
@@ -649,7 +656,7 @@ int erofs_fscache_register_fs(struct super_block *sb)
                return ret;
 
        /* acquired domain/volume will be relinquished in kill_sb() on error */
-       fscache = erofs_fscache_register_cookie(sb, sbi->opt.fsid, true);
+       fscache = erofs_fscache_register_cookie(sb, sbi->fsid, true);
        if (IS_ERR(fscache))
                return PTR_ERR(fscache);
 
index 1701df4..05dc686 100644 (file)
@@ -75,8 +75,6 @@ struct erofs_mount_opts {
        unsigned int max_sync_decompress_pages;
 #endif
        unsigned int mount_opt;
-       char *fsid;
-       char *domain_id;
 };
 
 struct erofs_dev_context {
@@ -89,6 +87,8 @@ struct erofs_dev_context {
 struct erofs_fs_context {
        struct erofs_mount_opts opt;
        struct erofs_dev_context *devs;
+       char *fsid;
+       char *domain_id;
 };
 
 /* all filesystem-wide lz4 configurations */
@@ -170,6 +170,8 @@ struct erofs_sb_info {
        struct fscache_volume *volume;
        struct erofs_fscache *s_fscache;
        struct erofs_domain *domain;
+       char *fsid;
+       char *domain_id;
 };
 
 #define EROFS_SB(sb) ((struct erofs_sb_info *)(sb)->s_fs_info)
index 2cf96ce..1c7dcca 100644 (file)
@@ -579,9 +579,9 @@ static int erofs_fc_parse_param(struct fs_context *fc,
                break;
        case Opt_fsid:
 #ifdef CONFIG_EROFS_FS_ONDEMAND
-               kfree(ctx->opt.fsid);
-               ctx->opt.fsid = kstrdup(param->string, GFP_KERNEL);
-               if (!ctx->opt.fsid)
+               kfree(ctx->fsid);
+               ctx->fsid = kstrdup(param->string, GFP_KERNEL);
+               if (!ctx->fsid)
                        return -ENOMEM;
 #else
                errorfc(fc, "fsid option not supported");
@@ -589,9 +589,9 @@ static int erofs_fc_parse_param(struct fs_context *fc,
                break;
        case Opt_domain_id:
 #ifdef CONFIG_EROFS_FS_ONDEMAND
-               kfree(ctx->opt.domain_id);
-               ctx->opt.domain_id = kstrdup(param->string, GFP_KERNEL);
-               if (!ctx->opt.domain_id)
+               kfree(ctx->domain_id);
+               ctx->domain_id = kstrdup(param->string, GFP_KERNEL);
+               if (!ctx->domain_id)
                        return -ENOMEM;
 #else
                errorfc(fc, "domain_id option not supported");
@@ -728,10 +728,12 @@ static int erofs_fc_fill_super(struct super_block *sb, struct fs_context *fc)
 
        sb->s_fs_info = sbi;
        sbi->opt = ctx->opt;
-       ctx->opt.fsid = NULL;
-       ctx->opt.domain_id = NULL;
        sbi->devs = ctx->devs;
        ctx->devs = NULL;
+       sbi->fsid = ctx->fsid;
+       ctx->fsid = NULL;
+       sbi->domain_id = ctx->domain_id;
+       ctx->domain_id = NULL;
 
        if (erofs_is_fscache_mode(sb)) {
                sb->s_blocksize = EROFS_BLKSIZ;
@@ -820,7 +822,7 @@ static int erofs_fc_get_tree(struct fs_context *fc)
 {
        struct erofs_fs_context *ctx = fc->fs_private;
 
-       if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && ctx->opt.fsid)
+       if (IS_ENABLED(CONFIG_EROFS_FS_ONDEMAND) && ctx->fsid)
                return get_tree_nodev(fc, erofs_fc_fill_super);
 
        return get_tree_bdev(fc, erofs_fc_fill_super);
@@ -834,6 +836,9 @@ static int erofs_fc_reconfigure(struct fs_context *fc)
 
        DBG_BUGON(!sb_rdonly(sb));
 
+       if (ctx->fsid || ctx->domain_id)
+               erofs_info(sb, "ignoring reconfiguration for fsid|domain_id.");
+
        if (test_opt(&ctx->opt, POSIX_ACL))
                fc->sb_flags |= SB_POSIXACL;
        else
@@ -873,8 +878,8 @@ static void erofs_fc_free(struct fs_context *fc)
        struct erofs_fs_context *ctx = fc->fs_private;
 
        erofs_free_dev_context(ctx->devs);
-       kfree(ctx->opt.fsid);
-       kfree(ctx->opt.domain_id);
+       kfree(ctx->fsid);
+       kfree(ctx->domain_id);
        kfree(ctx);
 }
 
@@ -944,8 +949,8 @@ static void erofs_kill_sb(struct super_block *sb)
        erofs_free_dev_context(sbi->devs);
        fs_put_dax(sbi->dax_dev, NULL);
        erofs_fscache_unregister_fs(sb);
-       kfree(sbi->opt.fsid);
-       kfree(sbi->opt.domain_id);
+       kfree(sbi->fsid);
+       kfree(sbi->domain_id);
        kfree(sbi);
        sb->s_fs_info = NULL;
 }
@@ -1098,10 +1103,10 @@ static int erofs_show_options(struct seq_file *seq, struct dentry *root)
        if (test_opt(opt, DAX_NEVER))
                seq_puts(seq, ",dax=never");
 #ifdef CONFIG_EROFS_FS_ONDEMAND
-       if (opt->fsid)
-               seq_printf(seq, ",fsid=%s", opt->fsid);
-       if (opt->domain_id)
-               seq_printf(seq, ",domain_id=%s", opt->domain_id);
+       if (sbi->fsid)
+               seq_printf(seq, ",fsid=%s", sbi->fsid);
+       if (sbi->domain_id)
+               seq_printf(seq, ",domain_id=%s", sbi->domain_id);
 #endif
        return 0;
 }
index 783bb7b..fd47696 100644 (file)
@@ -210,14 +210,14 @@ int erofs_register_sysfs(struct super_block *sb)
        int err;
 
        if (erofs_is_fscache_mode(sb)) {
-               if (sbi->opt.domain_id) {
-                       str = kasprintf(GFP_KERNEL, "%s,%s", sbi->opt.domain_id,
-                                       sbi->opt.fsid);
+               if (sbi->domain_id) {
+                       str = kasprintf(GFP_KERNEL, "%s,%s", sbi->domain_id,
+                                       sbi->fsid);
                        if (!str)
                                return -ENOMEM;
                        name = str;
                } else {
-                       name = sbi->opt.fsid;
+                       name = sbi->fsid;
                }
        } else {
                name = sb->s_id;
index 064a166..b792d42 100644 (file)
@@ -660,6 +660,9 @@ static int z_erofs_read_fragment(struct inode *inode, erofs_off_t pos,
        u8 *src, *dst;
        unsigned int i, cnt;
 
+       if (!packed_inode)
+               return -EFSCORRUPTED;
+
        pos += EROFS_I(inode)->z_fragmentoff;
        for (i = 0; i < len; i += cnt) {
                cnt = min_t(unsigned int, len - i,
index 3990f3e..f33b3ba 100644 (file)
@@ -31,10 +31,15 @@ static DEFINE_SPINLOCK(kernfs_idr_lock);    /* root->ino_idr */
 
 #define rb_to_kn(X) rb_entry((X), struct kernfs_node, rb)
 
+static bool __kernfs_active(struct kernfs_node *kn)
+{
+       return atomic_read(&kn->active) >= 0;
+}
+
 static bool kernfs_active(struct kernfs_node *kn)
 {
        lockdep_assert_held(&kernfs_root(kn)->kernfs_rwsem);
-       return atomic_read(&kn->active) >= 0;
+       return __kernfs_active(kn);
 }
 
 static bool kernfs_lockdep(struct kernfs_node *kn)
@@ -705,7 +710,12 @@ struct kernfs_node *kernfs_find_and_get_node_by_id(struct kernfs_root *root,
                        goto err_unlock;
        }
 
-       if (unlikely(!kernfs_active(kn) || !atomic_inc_not_zero(&kn->count)))
+       /*
+        * We should fail if @kn has never been activated and guarantee success
+        * if the caller knows that @kn is active. Both can be achieved by
+        * __kernfs_active() which tests @kn->active without kernfs_rwsem.
+        */
+       if (unlikely(!__kernfs_active(kn) || !atomic_inc_not_zero(&kn->count)))
                goto err_unlock;
 
        spin_unlock(&kernfs_idr_lock);
index 0ce5358..7679a68 100644 (file)
@@ -17,9 +17,9 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
 {
        struct netfs_io_subrequest *subreq;
        struct folio *folio;
-       unsigned int iopos, account = 0;
        pgoff_t start_page = rreq->start / PAGE_SIZE;
        pgoff_t last_page = ((rreq->start + rreq->len) / PAGE_SIZE) - 1;
+       size_t account = 0;
        bool subreq_failed = false;
 
        XA_STATE(xas, &rreq->mapping->i_pages, start_page);
@@ -39,18 +39,23 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
         */
        subreq = list_first_entry(&rreq->subrequests,
                                  struct netfs_io_subrequest, rreq_link);
-       iopos = 0;
        subreq_failed = (subreq->error < 0);
 
        trace_netfs_rreq(rreq, netfs_rreq_trace_unlock);
 
        rcu_read_lock();
        xas_for_each(&xas, folio, last_page) {
-               unsigned int pgpos = (folio_index(folio) - start_page) * PAGE_SIZE;
-               unsigned int pgend = pgpos + folio_size(folio);
+               loff_t pg_end;
                bool pg_failed = false;
 
+               if (xas_retry(&xas, folio))
+                       continue;
+
+               pg_end = folio_pos(folio) + folio_size(folio) - 1;
+
                for (;;) {
+                       loff_t sreq_end;
+
                        if (!subreq) {
                                pg_failed = true;
                                break;
@@ -58,11 +63,11 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
                        if (test_bit(NETFS_SREQ_COPY_TO_CACHE, &subreq->flags))
                                folio_start_fscache(folio);
                        pg_failed |= subreq_failed;
-                       if (pgend < iopos + subreq->len)
+                       sreq_end = subreq->start + subreq->len - 1;
+                       if (pg_end < sreq_end)
                                break;
 
                        account += subreq->transferred;
-                       iopos += subreq->len;
                        if (!list_is_last(&subreq->rreq_link, &rreq->subrequests)) {
                                subreq = list_next_entry(subreq, rreq_link);
                                subreq_failed = (subreq->error < 0);
@@ -70,7 +75,8 @@ void netfs_rreq_unlock_folios(struct netfs_io_request *rreq)
                                subreq = NULL;
                                subreq_failed = false;
                        }
-                       if (pgend == iopos)
+
+                       if (pg_end == sreq_end)
                                break;
                }
 
index 4289258..e374767 100644 (file)
@@ -121,6 +121,9 @@ static void netfs_rreq_unmark_after_write(struct netfs_io_request *rreq,
                XA_STATE(xas, &rreq->mapping->i_pages, subreq->start / PAGE_SIZE);
 
                xas_for_each(&xas, folio, (subreq->start + subreq->len - 1) / PAGE_SIZE) {
+                       if (xas_retry(&xas, folio))
+                               continue;
+
                        /* We might have multiple writes from the same huge
                         * folio, but we mustn't unlock a folio more than once.
                         */
index 06a96e9..d4b6839 100644 (file)
@@ -254,7 +254,10 @@ TRACE_EVENT_CONDITION(nfsd_fh_verify_err,
                                  rqstp->rq_xprt->xpt_remotelen);
                __entry->xid = be32_to_cpu(rqstp->rq_xid);
                __entry->fh_hash = knfsd_fh_hash(&fhp->fh_handle);
-               __entry->inode = d_inode(fhp->fh_dentry);
+               if (fhp->fh_dentry)
+                       __entry->inode = d_inode(fhp->fh_dentry);
+               else
+                       __entry->inode = NULL;
                __entry->type = type;
                __entry->access = access;
                __entry->error = be32_to_cpu(error);
index 860f0b1..abc9a85 100644 (file)
@@ -478,8 +478,7 @@ static void __zonefs_io_error(struct inode *inode, bool write)
        struct super_block *sb = inode->i_sb;
        struct zonefs_sb_info *sbi = ZONEFS_SB(sb);
        unsigned int noio_flag;
-       unsigned int nr_zones =
-               zi->i_zone_size >> (sbi->s_zone_sectors_shift + SECTOR_SHIFT);
+       unsigned int nr_zones = 1;
        struct zonefs_ioerr_data err = {
                .inode = inode,
                .write = write,
@@ -487,6 +486,15 @@ static void __zonefs_io_error(struct inode *inode, bool write)
        int ret;
 
        /*
+        * The only files that have more than one zone are conventional zone
+        * files with aggregated conventional zones, for which the inode zone
+        * size is always larger than the device zone size.
+        */
+       if (zi->i_zone_size > bdev_zone_sectors(sb->s_bdev))
+               nr_zones = zi->i_zone_size >>
+                       (sbi->s_zone_sectors_shift + SECTOR_SHIFT);
+
+       /*
         * Memory allocations in blkdev_report_zones() can trigger a memory
         * reclaim which may in turn cause a recursion into zonefs as well as
         * struct request allocations for the same device. The former case may
@@ -1407,6 +1415,14 @@ static int zonefs_init_file_inode(struct inode *inode, struct blk_zone *zone,
        zi->i_ztype = type;
        zi->i_zsector = zone->start;
        zi->i_zone_size = zone->len << SECTOR_SHIFT;
+       if (zi->i_zone_size > bdev_zone_sectors(sb->s_bdev) << SECTOR_SHIFT &&
+           !(sbi->s_features & ZONEFS_F_AGGRCNV)) {
+               zonefs_err(sb,
+                          "zone size %llu doesn't match device's zone sectors %llu\n",
+                          zi->i_zone_size,
+                          bdev_zone_sectors(sb->s_bdev) << SECTOR_SHIFT);
+               return -EINVAL;
+       }
 
        zi->i_max_size = min_t(loff_t, MAX_LFS_FILESIZE,
                               zone->capacity << SECTOR_SHIFT);
@@ -1456,11 +1472,11 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
        struct inode *dir = d_inode(parent);
        struct dentry *dentry;
        struct inode *inode;
-       int ret;
+       int ret = -ENOMEM;
 
        dentry = d_alloc_name(parent, name);
        if (!dentry)
-               return NULL;
+               return ERR_PTR(ret);
 
        inode = new_inode(parent->d_sb);
        if (!inode)
@@ -1485,7 +1501,7 @@ static struct dentry *zonefs_create_inode(struct dentry *parent,
 dput:
        dput(dentry);
 
-       return NULL;
+       return ERR_PTR(ret);
 }
 
 struct zonefs_zone_data {
@@ -1505,7 +1521,7 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
        struct blk_zone *zone, *next, *end;
        const char *zgroup_name;
        char *file_name;
-       struct dentry *dir;
+       struct dentry *dir, *dent;
        unsigned int n = 0;
        int ret;
 
@@ -1523,8 +1539,8 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
                zgroup_name = "seq";
 
        dir = zonefs_create_inode(sb->s_root, zgroup_name, NULL, type);
-       if (!dir) {
-               ret = -ENOMEM;
+       if (IS_ERR(dir)) {
+               ret = PTR_ERR(dir);
                goto free;
        }
 
@@ -1570,8 +1586,9 @@ static int zonefs_create_zgroup(struct zonefs_zone_data *zd,
                 * Use the file number within its group as file name.
                 */
                snprintf(file_name, ZONEFS_NAME_MAX - 1, "%u", n);
-               if (!zonefs_create_inode(dir, file_name, zone, type)) {
-                       ret = -ENOMEM;
+               dent = zonefs_create_inode(dir, file_name, zone, type);
+               if (IS_ERR(dent)) {
+                       ret = PTR_ERR(dent);
                        goto free;
                }
 
index 9cb6755..9920689 100644 (file)
@@ -15,11 +15,6 @@ struct zonefs_sysfs_attr {
        ssize_t (*show)(struct zonefs_sb_info *sbi, char *buf);
 };
 
-static inline struct zonefs_sysfs_attr *to_attr(struct attribute *attr)
-{
-       return container_of(attr, struct zonefs_sysfs_attr, attr);
-}
-
 #define ZONEFS_SYSFS_ATTR_RO(name) \
 static struct zonefs_sysfs_attr zonefs_sysfs_attr_##name = __ATTR_RO(name)
 
index 50e358a..891f8cb 100644 (file)
@@ -311,6 +311,13 @@ struct queue_limits {
        unsigned char           discard_misaligned;
        unsigned char           raid_partial_stripes_expensive;
        enum blk_zoned_model    zoned;
+
+       /*
+        * Drivers that set dma_alignment to less than 511 must be prepared to
+        * handle individual bvec's that are not a multiple of a SECTOR_SIZE
+        * due to possible offsets.
+        */
+       unsigned int            dma_alignment;
 };
 
 typedef int (*report_zones_cb)(struct blk_zone *zone, unsigned int idx,
@@ -456,12 +463,6 @@ struct request_queue {
        unsigned long           nr_requests;    /* Max # of requests */
 
        unsigned int            dma_pad_mask;
-       /*
-        * Drivers that set dma_alignment to less than 511 must be prepared to
-        * handle individual bvec's that are not a multiple of a SECTOR_SIZE
-        * due to possible offsets.
-        */
-       unsigned int            dma_alignment;
 
 #ifdef CONFIG_BLK_INLINE_ENCRYPTION
        struct blk_crypto_profile *crypto_profile;
@@ -944,7 +945,6 @@ extern void blk_queue_io_min(struct request_queue *q, unsigned int min);
 extern void blk_limits_io_opt(struct queue_limits *limits, unsigned int opt);
 extern void blk_queue_io_opt(struct request_queue *q, unsigned int opt);
 extern void blk_set_queue_depth(struct request_queue *q, unsigned int depth);
-extern void blk_set_default_limits(struct queue_limits *lim);
 extern void blk_set_stacking_limits(struct queue_limits *lim);
 extern int blk_stack_limits(struct queue_limits *t, struct queue_limits *b,
                            sector_t offset);
@@ -1324,7 +1324,7 @@ static inline sector_t bdev_zone_sectors(struct block_device *bdev)
 
 static inline int queue_dma_alignment(const struct request_queue *q)
 {
-       return q ? q->dma_alignment : 511;
+       return q ? q->limits.dma_alignment : 511;
 }
 
 static inline unsigned int bdev_dma_alignment(struct block_device *bdev)
index 0566705..c1bd1bd 100644 (file)
@@ -27,7 +27,7 @@
 #include <linux/bpfptr.h>
 #include <linux/btf.h>
 #include <linux/rcupdate_trace.h>
-#include <linux/init.h>
+#include <linux/static_call.h>
 
 struct bpf_verifier_env;
 struct bpf_verifier_log;
@@ -315,7 +315,7 @@ static inline void __copy_map_value(struct bpf_map *map, void *dst, void *src, b
                u32 next_off = map->off_arr->field_off[i];
 
                memcpy(dst + curr_off, src + curr_off, next_off - curr_off);
-               curr_off += map->off_arr->field_sz[i];
+               curr_off = next_off + map->off_arr->field_sz[i];
        }
        memcpy(dst + curr_off, src + curr_off, map->value_size - curr_off);
 }
@@ -344,7 +344,7 @@ static inline void zero_map_value(struct bpf_map *map, void *dst)
                u32 next_off = map->off_arr->field_off[i];
 
                memset(dst + curr_off, 0, next_off - curr_off);
-               curr_off += map->off_arr->field_sz[i];
+               curr_off = next_off + map->off_arr->field_sz[i];
        }
        memset(dst + curr_off, 0, map->value_size - curr_off);
 }
@@ -954,6 +954,10 @@ struct bpf_dispatcher {
        void *rw_image;
        u32 image_off;
        struct bpf_ksym ksym;
+#ifdef CONFIG_HAVE_STATIC_CALL
+       struct static_call_key *sc_key;
+       void *sc_tramp;
+#endif
 };
 
 static __always_inline __nocfi unsigned int bpf_dispatcher_nop_func(
@@ -971,7 +975,33 @@ struct bpf_trampoline *bpf_trampoline_get(u64 key,
                                          struct bpf_attach_target_info *tgt_info);
 void bpf_trampoline_put(struct bpf_trampoline *tr);
 int arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int num_funcs);
-int __init bpf_arch_init_dispatcher_early(void *ip);
+
+/*
+ * When the architecture supports STATIC_CALL replace the bpf_dispatcher_fn
+ * indirection with a direct call to the bpf program. If the architecture does
+ * not have STATIC_CALL, avoid a double-indirection.
+ */
+#ifdef CONFIG_HAVE_STATIC_CALL
+
+#define __BPF_DISPATCHER_SC_INIT(_name)                                \
+       .sc_key = &STATIC_CALL_KEY(_name),                      \
+       .sc_tramp = STATIC_CALL_TRAMP_ADDR(_name),
+
+#define __BPF_DISPATCHER_SC(name)                              \
+       DEFINE_STATIC_CALL(bpf_dispatcher_##name##_call, bpf_dispatcher_nop_func)
+
+#define __BPF_DISPATCHER_CALL(name)                            \
+       static_call(bpf_dispatcher_##name##_call)(ctx, insnsi, bpf_func)
+
+#define __BPF_DISPATCHER_UPDATE(_d, _new)                      \
+       __static_call_update((_d)->sc_key, (_d)->sc_tramp, (_new))
+
+#else
+#define __BPF_DISPATCHER_SC_INIT(name)
+#define __BPF_DISPATCHER_SC(name)
+#define __BPF_DISPATCHER_CALL(name)            bpf_func(ctx, insnsi)
+#define __BPF_DISPATCHER_UPDATE(_d, _new)
+#endif
 
 #define BPF_DISPATCHER_INIT(_name) {                           \
        .mutex = __MUTEX_INITIALIZER(_name.mutex),              \
@@ -984,34 +1014,21 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
                .name  = #_name,                                \
                .lnode = LIST_HEAD_INIT(_name.ksym.lnode),      \
        },                                                      \
+       __BPF_DISPATCHER_SC_INIT(_name##_call)                  \
 }
 
-#define BPF_DISPATCHER_INIT_CALL(_name)                                        \
-       static int __init _name##_init(void)                            \
-       {                                                               \
-               return bpf_arch_init_dispatcher_early(_name##_func);    \
-       }                                                               \
-       early_initcall(_name##_init)
-
-#ifdef CONFIG_X86_64
-#define BPF_DISPATCHER_ATTRIBUTES __attribute__((patchable_function_entry(5)))
-#else
-#define BPF_DISPATCHER_ATTRIBUTES
-#endif
-
 #define DEFINE_BPF_DISPATCHER(name)                                    \
-       notrace BPF_DISPATCHER_ATTRIBUTES                               \
+       __BPF_DISPATCHER_SC(name);                                      \
        noinline __nocfi unsigned int bpf_dispatcher_##name##_func(     \
                const void *ctx,                                        \
                const struct bpf_insn *insnsi,                          \
                bpf_func_t bpf_func)                                    \
        {                                                               \
-               return bpf_func(ctx, insnsi);                           \
+               return __BPF_DISPATCHER_CALL(name);                     \
        }                                                               \
        EXPORT_SYMBOL(bpf_dispatcher_##name##_func);                    \
        struct bpf_dispatcher bpf_dispatcher_##name =                   \
-               BPF_DISPATCHER_INIT(bpf_dispatcher_##name);             \
-       BPF_DISPATCHER_INIT_CALL(bpf_dispatcher_##name);
+               BPF_DISPATCHER_INIT(bpf_dispatcher_##name);
 
 #define DECLARE_BPF_DISPATCHER(name)                                   \
        unsigned int bpf_dispatcher_##name##_func(                      \
@@ -1019,6 +1036,7 @@ int __init bpf_arch_init_dispatcher_early(void *ip);
                const struct bpf_insn *insnsi,                          \
                bpf_func_t bpf_func);                                   \
        extern struct bpf_dispatcher bpf_dispatcher_##name;
+
 #define BPF_DISPATCHER_FUNC(name) bpf_dispatcher_##name##_func
 #define BPF_DISPATCHER_PTR(name) (&bpf_dispatcher_##name)
 void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,
index 43bc8a2..0ded9e2 100644 (file)
@@ -16,6 +16,9 @@ enum io_uring_cmd_flags {
        IO_URING_F_SQE128               = 4,
        IO_URING_F_CQE32                = 8,
        IO_URING_F_IOPOLL               = 16,
+
+       /* the request is executed from poll, it should not be freed */
+       IO_URING_F_MULTISHOT            = 32,
 };
 
 struct io_uring_cmd {
index e7cebeb..fdd393f 100644 (file)
@@ -189,6 +189,7 @@ int vfio_register_emulated_iommu_dev(struct vfio_device *device);
 void vfio_unregister_group_dev(struct vfio_device *device);
 
 int vfio_assign_device_set(struct vfio_device *device, void *set_id);
+unsigned int vfio_device_set_open_count(struct vfio_device_set *dev_set);
 
 int vfio_mig_get_next_state(struct vfio_device *device,
                            enum vfio_device_mig_state cur_fsm,
index 038097c..144bdfb 100644 (file)
@@ -563,7 +563,7 @@ static inline void iph_to_flow_copy_v4addrs(struct flow_keys *flow,
        BUILD_BUG_ON(offsetof(typeof(flow->addrs), v4addrs.dst) !=
                     offsetof(typeof(flow->addrs), v4addrs.src) +
                              sizeof(flow->addrs.v4addrs.src));
-       memcpy(&flow->addrs.v4addrs, &iph->saddr, sizeof(flow->addrs.v4addrs));
+       memcpy(&flow->addrs.v4addrs, &iph->addrs, sizeof(flow->addrs.v4addrs));
        flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV4_ADDRS;
 }
 
index 37943ba..d383c89 100644 (file)
@@ -897,7 +897,7 @@ static inline void iph_to_flow_copy_v6addrs(struct flow_keys *flow,
        BUILD_BUG_ON(offsetof(typeof(flow->addrs), v6addrs.dst) !=
                     offsetof(typeof(flow->addrs), v6addrs.src) +
                     sizeof(flow->addrs.v6addrs.src));
-       memcpy(&flow->addrs.v6addrs, &iph->saddr, sizeof(flow->addrs.v6addrs));
+       memcpy(&flow->addrs.v6addrs, &iph->addrs, sizeof(flow->addrs.v6addrs));
        flow->control.addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
 }
 
index 5db0254..e0517ec 100644 (file)
@@ -323,7 +323,7 @@ struct sk_filter;
   *    @sk_tskey: counter to disambiguate concurrent tstamp requests
   *    @sk_zckey: counter to order MSG_ZEROCOPY notifications
   *    @sk_socket: Identd and reporting IO signals
-  *    @sk_user_data: RPC layer private data
+  *    @sk_user_data: RPC layer private data. Write-protected by @sk_callback_lock.
   *    @sk_frag: cached page frag
   *    @sk_peek_off: current peek_offset value
   *    @sk_send_head: front of stuff to transmit
index 6ce3bd2..5ad7ac2 100644 (file)
 #define        DDR3PHY_PGSR                            (0x0C)          /* DDR3PHY PHY General Status Register */
 #define                DDR3PHY_PGSR_IDONE              (1 << 0)        /* Initialization Done */
 
-#define DDR3PHY_ACIOCR                         (0x24)          /*  DDR3PHY AC I/O Configuration Register */
+#define        DDR3PHY_ACDLLCR                         (0x14)          /* DDR3PHY AC DLL Control Register */
+#define                DDR3PHY_ACDLLCR_DLLSRST         (1 << 30)       /* DLL Soft Reset */
+
+#define DDR3PHY_ACIOCR                         (0x24)          /* DDR3PHY AC I/O Configuration Register */
 #define                DDR3PHY_ACIOCR_CSPDD_CS0        (1 << 18)       /* CS#[0] Power Down Driver */
 #define                DDR3PHY_ACIOCR_CKPDD_CK0        (1 << 8)        /* CK[0] Power Down Driver */
 #define                DDR3PHY_ACIORC_ACPDD            (1 << 3)        /* AC Power Down Driver */
index 65e86e4..7519385 100644 (file)
@@ -36,6 +36,10 @@ enum sof_ipc_ext_data {
        SOF_IPC_EXT_USER_ABI_INFO       = 4,
 };
 
+/* Build u32 number in format MMmmmppp */
+#define SOF_FW_VER(MAJOR, MINOR, PATCH) ((uint32_t)( \
+       ((MAJOR) << 24) | ((MINOR) << 12) | (PATCH)))
+
 /* FW version - SOF_IPC_GLB_VERSION */
 struct sof_ipc_fw_version {
        struct sof_ipc_hdr hdr;
index 961ec16..874a923 100644 (file)
@@ -100,8 +100,10 @@ struct iphdr {
        __u8    ttl;
        __u8    protocol;
        __sum16 check;
-       __be32  saddr;
-       __be32  daddr;
+       __struct_group(/* no tag */, addrs, /* no attrs */,
+               __be32  saddr;
+               __be32  daddr;
+       );
        /*The options start here. */
 };
 
index 03cdbe7..81f4243 100644 (file)
@@ -130,8 +130,10 @@ struct ipv6hdr {
        __u8                    nexthdr;
        __u8                    hop_limit;
 
-       struct  in6_addr        saddr;
-       struct  in6_addr        daddr;
+       __struct_group(/* no tag */, addrs, /* no attrs */,
+               struct  in6_addr        saddr;
+               struct  in6_addr        daddr;
+       );
 };
 
 
index 4a1e482..8840cf3 100644 (file)
@@ -1768,7 +1768,7 @@ int io_poll_issue(struct io_kiocb *req, bool *locked)
        io_tw_lock(req->ctx, locked);
        if (unlikely(req->task->flags & PF_EXITING))
                return -EFAULT;
-       return io_issue_sqe(req, IO_URING_F_NONBLOCK);
+       return io_issue_sqe(req, IO_URING_F_NONBLOCK|IO_URING_F_MULTISHOT);
 }
 
 struct io_wq_work *io_wq_free_work(struct io_wq_work *work)
index e99a79f..cef5ff9 100644 (file)
@@ -17,8 +17,8 @@ enum {
        IOU_ISSUE_SKIP_COMPLETE = -EIOCBQUEUED,
 
        /*
-        * Intended only when both REQ_F_POLLED and REQ_F_APOLL_MULTISHOT
-        * are set to indicate to the poll runner that multishot should be
+        * Intended only when both IO_URING_F_MULTISHOT is passed
+        * to indicate to the poll runner that multishot should be
         * removed and the result is set on req->cqe.res.
         */
        IOU_STOP_MULTISHOT      = -ECANCELED,
index 15dea91..ab83da7 100644 (file)
@@ -67,8 +67,6 @@ struct io_sr_msg {
        struct io_kiocb                 *notif;
 };
 
-#define IO_APOLL_MULTI_POLLED (REQ_F_APOLL_MULTISHOT | REQ_F_POLLED)
-
 int io_shutdown_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
        struct io_shutdown *shutdown = io_kiocb_to_cmd(req, struct io_shutdown);
@@ -591,7 +589,8 @@ static inline void io_recv_prep_retry(struct io_kiocb *req)
  * again (for multishot).
  */
 static inline bool io_recv_finish(struct io_kiocb *req, int *ret,
-                                 unsigned int cflags, bool mshot_finished)
+                                 unsigned int cflags, bool mshot_finished,
+                                 unsigned issue_flags)
 {
        if (!(req->flags & REQ_F_APOLL_MULTISHOT)) {
                io_req_set_res(req, *ret, cflags);
@@ -614,7 +613,7 @@ static inline bool io_recv_finish(struct io_kiocb *req, int *ret,
 
        io_req_set_res(req, *ret, cflags);
 
-       if (req->flags & REQ_F_POLLED)
+       if (issue_flags & IO_URING_F_MULTISHOT)
                *ret = IOU_STOP_MULTISHOT;
        else
                *ret = IOU_OK;
@@ -773,8 +772,7 @@ retry_multishot:
        if (ret < min_ret) {
                if (ret == -EAGAIN && force_nonblock) {
                        ret = io_setup_async_msg(req, kmsg, issue_flags);
-                       if (ret == -EAGAIN && (req->flags & IO_APOLL_MULTI_POLLED) ==
-                                              IO_APOLL_MULTI_POLLED) {
+                       if (ret == -EAGAIN && (issue_flags & IO_URING_F_MULTISHOT)) {
                                io_kbuf_recycle(req, issue_flags);
                                return IOU_ISSUE_SKIP_COMPLETE;
                        }
@@ -803,7 +801,7 @@ retry_multishot:
        if (kmsg->msg.msg_inq)
                cflags |= IORING_CQE_F_SOCK_NONEMPTY;
 
-       if (!io_recv_finish(req, &ret, cflags, mshot_finished))
+       if (!io_recv_finish(req, &ret, cflags, mshot_finished, issue_flags))
                goto retry_multishot;
 
        if (mshot_finished) {
@@ -869,7 +867,7 @@ retry_multishot:
        ret = sock_recvmsg(sock, &msg, flags);
        if (ret < min_ret) {
                if (ret == -EAGAIN && force_nonblock) {
-                       if ((req->flags & IO_APOLL_MULTI_POLLED) == IO_APOLL_MULTI_POLLED) {
+                       if (issue_flags & IO_URING_F_MULTISHOT) {
                                io_kbuf_recycle(req, issue_flags);
                                return IOU_ISSUE_SKIP_COMPLETE;
                        }
@@ -902,7 +900,7 @@ out_free:
        if (msg.msg_inq)
                cflags |= IORING_CQE_F_SOCK_NONEMPTY;
 
-       if (!io_recv_finish(req, &ret, cflags, ret <= 0))
+       if (!io_recv_finish(req, &ret, cflags, ret <= 0, issue_flags))
                goto retry_multishot;
 
        return ret;
@@ -1289,8 +1287,7 @@ retry:
                         * return EAGAIN to arm the poll infra since it
                         * has already been done
                         */
-                       if ((req->flags & IO_APOLL_MULTI_POLLED) ==
-                           IO_APOLL_MULTI_POLLED)
+                       if (issue_flags & IO_URING_F_MULTISHOT)
                                ret = IOU_ISSUE_SKIP_COMPLETE;
                        return ret;
                }
@@ -1315,9 +1312,7 @@ retry:
                goto retry;
 
        io_req_set_res(req, ret, 0);
-       if (req->flags & REQ_F_POLLED)
-               return IOU_STOP_MULTISHOT;
-       return IOU_OK;
+       return (issue_flags & IO_URING_F_MULTISHOT) ? IOU_STOP_MULTISHOT : IOU_OK;
 }
 
 int io_socket_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
index f500506..055632e 100644 (file)
@@ -228,6 +228,13 @@ static int io_poll_check_events(struct io_kiocb *req, bool *locked)
                        return IOU_POLL_DONE;
                if (v & IO_POLL_CANCEL_FLAG)
                        return -ECANCELED;
+               /*
+                * cqe.res contains only events of the first wake up
+                * and all others are be lost. Redo vfs_poll() to get
+                * up to date state.
+                */
+               if ((v & IO_POLL_REF_MASK) != 1)
+                       req->cqe.res = 0;
 
                /* the mask was stashed in __io_poll_execute */
                if (!req->cqe.res) {
@@ -239,6 +246,8 @@ static int io_poll_check_events(struct io_kiocb *req, bool *locked)
                        continue;
                if (req->apoll_events & EPOLLONESHOT)
                        return IOU_POLL_DONE;
+               if (io_is_uring_fops(req->file))
+                       return IOU_POLL_DONE;
 
                /* multishot, just fill a CQE and proceed */
                if (!(req->flags & REQ_F_APOLL_MULTISHOT)) {
@@ -258,6 +267,9 @@ static int io_poll_check_events(struct io_kiocb *req, bool *locked)
                                return ret;
                }
 
+               /* force the next iteration to vfs_poll() */
+               req->cqe.res = 0;
+
                /*
                 * Release all references, retry if someone tried to restart
                 * task_work while we were executing it.
index 04f0a04..c19719f 100644 (file)
@@ -4,7 +4,7 @@
 #include <linux/hash.h>
 #include <linux/bpf.h>
 #include <linux/filter.h>
-#include <linux/init.h>
+#include <linux/static_call.h>
 
 /* The BPF dispatcher is a multiway branch code generator. The
  * dispatcher is a mechanism to avoid the performance penalty of an
@@ -91,11 +91,6 @@ int __weak arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int n
        return -ENOTSUPP;
 }
 
-int __weak __init bpf_arch_init_dispatcher_early(void *ip)
-{
-       return -ENOTSUPP;
-}
-
 static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *buf)
 {
        s64 ips[BPF_DISPATCHER_MAX] = {}, *ipsp = &ips[0];
@@ -110,17 +105,11 @@ static int bpf_dispatcher_prepare(struct bpf_dispatcher *d, void *image, void *b
 
 static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)
 {
-       void *old, *new, *tmp;
-       u32 noff;
-       int err;
-
-       if (!prev_num_progs) {
-               old = NULL;
-               noff = 0;
-       } else {
-               old = d->image + d->image_off;
+       void *new, *tmp;
+       u32 noff = 0;
+
+       if (prev_num_progs)
                noff = d->image_off ^ (PAGE_SIZE / 2);
-       }
 
        new = d->num_progs ? d->image + noff : NULL;
        tmp = d->num_progs ? d->rw_image + noff : NULL;
@@ -134,11 +123,10 @@ static void bpf_dispatcher_update(struct bpf_dispatcher *d, int prev_num_progs)
                        return;
        }
 
-       err = bpf_arch_text_poke(d->func, BPF_MOD_JUMP, old, new);
-       if (err || !new)
-               return;
+       __BPF_DISPATCHER_UPDATE(d, new ?: (void *)&bpf_dispatcher_nop_func);
 
-       d->image_off = noff;
+       if (new)
+               d->image_off = noff;
 }
 
 void bpf_dispatcher_change_prog(struct bpf_dispatcher *d, struct bpf_prog *from,
index b6e7f5c..034cf87 100644 (file)
@@ -100,22 +100,21 @@ void pcpu_freelist_populate(struct pcpu_freelist *s, void *buf, u32 elem_size,
                            u32 nr_elems)
 {
        struct pcpu_freelist_head *head;
-       int i, cpu, pcpu_entries;
+       unsigned int cpu, cpu_idx, i, j, n, m;
 
-       pcpu_entries = nr_elems / num_possible_cpus() + 1;
-       i = 0;
+       n = nr_elems / num_possible_cpus();
+       m = nr_elems % num_possible_cpus();
 
+       cpu_idx = 0;
        for_each_possible_cpu(cpu) {
-again:
                head = per_cpu_ptr(s->freelist, cpu);
-               /* No locking required as this is not visible yet. */
-               pcpu_freelist_push_node(head, buf);
-               i++;
-               buf += elem_size;
-               if (i == nr_elems)
-                       break;
-               if (i % pcpu_entries)
-                       goto again;
+               j = n + (cpu_idx < m ? 1 : 0);
+               for (i = 0; i < j; i++) {
+                       /* No locking required as this is not visible yet. */
+                       pcpu_freelist_push_node(head, buf);
+                       buf += elem_size;
+               }
+               cpu_idx++;
        }
 }
 
index 2256663..264b3dc 100644 (file)
@@ -6745,11 +6745,11 @@ static int __check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn
        /* Transfer references to the callee */
        err = copy_reference_state(callee, caller);
        if (err)
-               return err;
+               goto err_out;
 
        err = set_callee_state_cb(env, caller, callee, *insn_idx);
        if (err)
-               return err;
+               goto err_out;
 
        clear_caller_saved_regs(env, caller->regs);
 
@@ -6766,6 +6766,11 @@ static int __check_func_call(struct bpf_verifier_env *env, struct bpf_insn *insn
                print_verifier_state(env, callee, true);
        }
        return 0;
+
+err_out:
+       free_func_state(callee);
+       state->frame[state->curframe + 1] = NULL;
+       return err;
 }
 
 int map_set_for_each_callback_args(struct bpf_verifier_env *env,
@@ -6979,8 +6984,7 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
                return -EINVAL;
        }
 
-       state->curframe--;
-       caller = state->frame[state->curframe];
+       caller = state->frame[state->curframe - 1];
        if (callee->in_callback_fn) {
                /* enforce R0 return value range [0, 1]. */
                struct tnum range = callee->callback_ret_range;
@@ -7019,7 +7023,7 @@ static int prepare_func_exit(struct bpf_verifier_env *env, int *insn_idx)
        }
        /* clear everything in the callee */
        free_func_state(callee);
-       state->frame[state->curframe + 1] = NULL;
+       state->frame[state->curframe--] = NULL;
        return 0;
 }
 
index 4ec3717..8848714 100644 (file)
@@ -9306,14 +9306,27 @@ static int __perf_event_overflow(struct perf_event *event,
        }
 
        if (event->attr.sigtrap) {
-               /*
-                * Should not be able to return to user space without processing
-                * pending_sigtrap (kernel events can overflow multiple times).
-                */
-               WARN_ON_ONCE(event->pending_sigtrap && event->attr.exclude_kernel);
+               unsigned int pending_id = 1;
+
+               if (regs)
+                       pending_id = hash32_ptr((void *)instruction_pointer(regs)) ?: 1;
                if (!event->pending_sigtrap) {
-                       event->pending_sigtrap = 1;
+                       event->pending_sigtrap = pending_id;
                        local_inc(&event->ctx->nr_pending);
+               } else if (event->attr.exclude_kernel) {
+                       /*
+                        * Should not be able to return to user space without
+                        * consuming pending_sigtrap; with exceptions:
+                        *
+                        *  1. Where !exclude_kernel, events can overflow again
+                        *     in the kernel without returning to user space.
+                        *
+                        *  2. Events that can overflow again before the IRQ-
+                        *     work without user space progress (e.g. hrtimer).
+                        *     To approximate progress (with false negatives),
+                        *     check 32-bit hash of the current IP.
+                        */
+                       WARN_ON_ONCE(event->pending_sigtrap != pending_id);
                }
                event->pending_addr = data->addr;
                irq_work_queue(&event->pending_irq);
index 5f4d240..074f6b0 100644 (file)
@@ -97,7 +97,7 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
        return src - unsafe_addr;
 Efault:
        pagefault_enable();
-       dst[-1] = '\0';
+       dst[0] = '\0';
        return -EFAULT;
 }
 
index 13d578c..fcb3e6c 100644 (file)
@@ -774,6 +774,7 @@ static void *bpf_test_init(const union bpf_attr *kattr, u32 user_size,
        if (user_size > size)
                return ERR_PTR(-EMSGSIZE);
 
+       size = SKB_DATA_ALIGN(size);
        data = kzalloc(size + headroom + tailroom, GFP_USER);
        if (!data)
                return ERR_PTR(-ENOMEM);
index 6e53dc9..9ffd40b 100644 (file)
@@ -959,6 +959,8 @@ int __br_vlan_set_proto(struct net_bridge *br, __be16 proto,
        list_for_each_entry(p, &br->port_list, list) {
                vg = nbp_vlan_group(p);
                list_for_each_entry(vlan, &vg->vlan_list, vlist) {
+                       if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
+                               continue;
                        err = vlan_vid_add(p->dev, proto, vlan->vid);
                        if (err)
                                goto err_filt;
@@ -973,8 +975,11 @@ int __br_vlan_set_proto(struct net_bridge *br, __be16 proto,
        /* Delete VLANs for the old proto from the device filter. */
        list_for_each_entry(p, &br->port_list, list) {
                vg = nbp_vlan_group(p);
-               list_for_each_entry(vlan, &vg->vlan_list, vlist)
+               list_for_each_entry(vlan, &vg->vlan_list, vlist) {
+                       if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
+                               continue;
                        vlan_vid_del(p->dev, oldproto, vlan->vid);
+               }
        }
 
        return 0;
@@ -983,13 +988,19 @@ err_filt:
        attr.u.vlan_protocol = ntohs(oldproto);
        switchdev_port_attr_set(br->dev, &attr, NULL);
 
-       list_for_each_entry_continue_reverse(vlan, &vg->vlan_list, vlist)
+       list_for_each_entry_continue_reverse(vlan, &vg->vlan_list, vlist) {
+               if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
+                       continue;
                vlan_vid_del(p->dev, proto, vlan->vid);
+       }
 
        list_for_each_entry_continue_reverse(p, &br->port_list, list) {
                vg = nbp_vlan_group(p);
-               list_for_each_entry(vlan, &vg->vlan_list, vlist)
+               list_for_each_entry(vlan, &vg->vlan_list, vlist) {
+                       if (vlan->priv_flags & BR_VLFLAG_ADDED_BY_SWITCHDEV)
+                               continue;
                        vlan_vid_del(p->dev, proto, vlan->vid);
+               }
        }
 
        return err;
index 4d63ef1..f35fc87 100644 (file)
@@ -310,9 +310,6 @@ static int chnl_net_open(struct net_device *dev)
 
        if (result == 0) {
                pr_debug("connect timeout\n");
-               caif_disconnect_client(dev_net(dev), &priv->chnl);
-               priv->state = CAIF_DISCONNECTED;
-               pr_debug("state disconnected\n");
                result = -ETIMEDOUT;
                goto error;
        }
index e504a18..5417f7b 100644 (file)
@@ -864,6 +864,14 @@ disconnect:
        return err;
 }
 
+static void dsa_switch_teardown_tag_protocol(struct dsa_switch *ds)
+{
+       const struct dsa_device_ops *tag_ops = ds->dst->tag_ops;
+
+       if (tag_ops->disconnect)
+               tag_ops->disconnect(ds);
+}
+
 static int dsa_switch_setup(struct dsa_switch *ds)
 {
        struct dsa_devlink_priv *dl_priv;
@@ -953,6 +961,8 @@ static void dsa_switch_teardown(struct dsa_switch *ds)
                ds->slave_mii_bus = NULL;
        }
 
+       dsa_switch_teardown_tag_protocol(ds);
+
        if (ds->ops->teardown)
                ds->ops->teardown(ds);
 
index 6e65c7f..71e9707 100644 (file)
@@ -210,6 +210,7 @@ static inline struct net_device *dsa_master_find_slave(struct net_device *dev,
 extern struct rtnl_link_ops dsa_link_ops __read_mostly;
 
 /* port.c */
+bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr);
 void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
                               const struct dsa_device_ops *tag_ops);
 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age);
index 40367ab..421de16 100644 (file)
@@ -204,8 +204,7 @@ static int dsa_master_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
                 * switch in the tree that is PTP capable.
                 */
                list_for_each_entry(dp, &dst->ports, list)
-                       if (dp->ds->ops->port_hwtstamp_get ||
-                           dp->ds->ops->port_hwtstamp_set)
+                       if (dsa_port_supports_hwtstamp(dp, ifr))
                                return -EBUSY;
                break;
        }
index 2081682..750fe68 100644 (file)
@@ -110,6 +110,22 @@ static bool dsa_port_can_configure_learning(struct dsa_port *dp)
        return !err;
 }
 
+bool dsa_port_supports_hwtstamp(struct dsa_port *dp, struct ifreq *ifr)
+{
+       struct dsa_switch *ds = dp->ds;
+       int err;
+
+       if (!ds->ops->port_hwtstamp_get || !ds->ops->port_hwtstamp_set)
+               return false;
+
+       /* "See through" shim implementations of the "get" method.
+        * This will clobber the ifreq structure, but we will either return an
+        * error, or the master will overwrite it with proper values.
+        */
+       err = ds->ops->port_hwtstamp_get(ds, dp->index, ifr);
+       return err != -EOPNOTSUPP;
+}
+
 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)
 {
        struct dsa_switch *ds = dp->ds;
index e983bb0..2dfb122 100644 (file)
@@ -402,6 +402,16 @@ config INET_IPCOMP
 
          If unsure, say Y.
 
+config INET_TABLE_PERTURB_ORDER
+       int "INET: Source port perturbation table size (as power of 2)" if EXPERT
+       default 16
+       help
+         Source port perturbation table size (as power of 2) for
+         RFC 6056 3.3.4.  Algorithm 4: Double-Hash Port Selection Algorithm.
+
+         The default is almost always what you want.
+         Only change this if you know what you are doing.
+
 config INET_XFRM_TUNNEL
        tristate
        select INET_TUNNEL
index d3dc281..033bf3c 100644 (file)
@@ -906,13 +906,13 @@ EXPORT_SYMBOL_GPL(inet_bhash2_update_saddr);
  * Note that we use 32bit integers (vs RFC 'short integers')
  * because 2^16 is not a multiple of num_ephemeral and this
  * property might be used by clever attacker.
+ *
  * RFC claims using TABLE_LENGTH=10 buckets gives an improvement, though
- * attacks were since demonstrated, thus we use 65536 instead to really
- * give more isolation and privacy, at the expense of 256kB of kernel
- * memory.
+ * attacks were since demonstrated, thus we use 65536 by default instead
+ * to really give more isolation and privacy, at the expense of 256kB
+ * of kernel memory.
  */
-#define INET_TABLE_PERTURB_SHIFT 16
-#define INET_TABLE_PERTURB_SIZE (1 << INET_TABLE_PERTURB_SHIFT)
+#define INET_TABLE_PERTURB_SIZE (1 << CONFIG_INET_TABLE_PERTURB_ORDER)
 static u32 *table_perturb;
 
 int __inet_hash_connect(struct inet_timewait_death_row *death_row,
index a500422..890a242 100644 (file)
@@ -222,7 +222,7 @@ static void requeue_rx_msgs(struct kcm_mux *mux, struct sk_buff_head *head)
        struct sk_buff *skb;
        struct kcm_sock *kcm;
 
-       while ((skb = __skb_dequeue(head))) {
+       while ((skb = skb_dequeue(head))) {
                /* Reset destructor to avoid calling kcm_rcv_ready */
                skb->destructor = sock_rfree;
                skb_orphan(skb);
@@ -1085,53 +1085,17 @@ out_error:
        return err;
 }
 
-static struct sk_buff *kcm_wait_data(struct sock *sk, int flags,
-                                    long timeo, int *err)
-{
-       struct sk_buff *skb;
-
-       while (!(skb = skb_peek(&sk->sk_receive_queue))) {
-               if (sk->sk_err) {
-                       *err = sock_error(sk);
-                       return NULL;
-               }
-
-               if (sock_flag(sk, SOCK_DONE))
-                       return NULL;
-
-               if ((flags & MSG_DONTWAIT) || !timeo) {
-                       *err = -EAGAIN;
-                       return NULL;
-               }
-
-               sk_wait_data(sk, &timeo, NULL);
-
-               /* Handle signals */
-               if (signal_pending(current)) {
-                       *err = sock_intr_errno(timeo);
-                       return NULL;
-               }
-       }
-
-       return skb;
-}
-
 static int kcm_recvmsg(struct socket *sock, struct msghdr *msg,
                       size_t len, int flags)
 {
        struct sock *sk = sock->sk;
        struct kcm_sock *kcm = kcm_sk(sk);
        int err = 0;
-       long timeo;
        struct strp_msg *stm;
        int copied = 0;
        struct sk_buff *skb;
 
-       timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
-
-       lock_sock(sk);
-
-       skb = kcm_wait_data(sk, flags, timeo, &err);
+       skb = skb_recv_datagram(sk, flags, &err);
        if (!skb)
                goto out;
 
@@ -1162,14 +1126,11 @@ msg_finished:
                        /* Finished with message */
                        msg->msg_flags |= MSG_EOR;
                        KCM_STATS_INCR(kcm->stats.rx_msgs);
-                       skb_unlink(skb, &sk->sk_receive_queue);
-                       kfree_skb(skb);
                }
        }
 
 out:
-       release_sock(sk);
-
+       skb_free_datagram(sk, skb);
        return copied ? : err;
 }
 
@@ -1179,7 +1140,6 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
 {
        struct sock *sk = sock->sk;
        struct kcm_sock *kcm = kcm_sk(sk);
-       long timeo;
        struct strp_msg *stm;
        int err = 0;
        ssize_t copied;
@@ -1187,11 +1147,7 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
 
        /* Only support splice for SOCKSEQPACKET */
 
-       timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
-
-       lock_sock(sk);
-
-       skb = kcm_wait_data(sk, flags, timeo, &err);
+       skb = skb_recv_datagram(sk, flags, &err);
        if (!skb)
                goto err_out;
 
@@ -1219,13 +1175,11 @@ static ssize_t kcm_splice_read(struct socket *sock, loff_t *ppos,
         * finish reading the message.
         */
 
-       release_sock(sk);
-
+       skb_free_datagram(sk, skb);
        return copied;
 
 err_out:
-       release_sock(sk);
-
+       skb_free_datagram(sk, skb);
        return err;
 }
 
index 7499c51..754fdda 100644 (file)
@@ -1150,8 +1150,10 @@ static void l2tp_tunnel_destruct(struct sock *sk)
        }
 
        /* Remove hooks into tunnel socket */
+       write_lock_bh(&sk->sk_callback_lock);
        sk->sk_destruct = tunnel->old_sk_destruct;
        sk->sk_user_data = NULL;
+       write_unlock_bh(&sk->sk_callback_lock);
 
        /* Call the original destructor */
        if (sk->sk_destruct)
@@ -1469,16 +1471,18 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
                sock = sockfd_lookup(tunnel->fd, &ret);
                if (!sock)
                        goto err;
-
-               ret = l2tp_validate_socket(sock->sk, net, tunnel->encap);
-               if (ret < 0)
-                       goto err_sock;
        }
 
+       sk = sock->sk;
+       write_lock(&sk->sk_callback_lock);
+
+       ret = l2tp_validate_socket(sk, net, tunnel->encap);
+       if (ret < 0)
+               goto err_sock;
+
        tunnel->l2tp_net = net;
        pn = l2tp_pernet(net);
 
-       sk = sock->sk;
        sock_hold(sk);
        tunnel->sock = sk;
 
@@ -1504,7 +1508,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
 
                setup_udp_tunnel_sock(net, sock, &udp_cfg);
        } else {
-               sk->sk_user_data = tunnel;
+               rcu_assign_sk_user_data(sk, tunnel);
        }
 
        tunnel->old_sk_destruct = sk->sk_destruct;
@@ -1518,6 +1522,7 @@ int l2tp_tunnel_register(struct l2tp_tunnel *tunnel, struct net *net,
        if (tunnel->fd >= 0)
                sockfd_put(sock);
 
+       write_unlock(&sk->sk_callback_lock);
        return 0;
 
 err_sock:
@@ -1525,6 +1530,8 @@ err_sock:
                sock_release(sock);
        else
                sockfd_put(sock);
+
+       write_unlock(&sk->sk_callback_lock);
 err:
        return ret;
 }
index cdb391a..7fbb1d0 100644 (file)
@@ -346,7 +346,7 @@ static struct sk_buff *tls_enc_skb(struct tls_context *tls_ctx,
                salt = tls_ctx->crypto_send.aes_gcm_256.salt;
                break;
        default:
-               return NULL;
+               goto free_req;
        }
        cipher_sz = &tls_cipher_size_desc[tls_ctx->crypto_send.info.cipher_type];
        buf_len = cipher_sz->salt + cipher_sz->iv + TLS_AAD_SPACE_SIZE +
@@ -492,7 +492,8 @@ int tls_sw_fallback_init(struct sock *sk,
                key = ((struct tls12_crypto_info_aes_gcm_256 *)crypto_info)->key;
                break;
        default:
-               return -EINVAL;
+               rc = -EINVAL;
+               goto free_aead;
        }
        cipher_sz = &tls_cipher_size_desc[crypto_info->cipher_type];
 
index 5259ef8..748d863 100644 (file)
@@ -117,7 +117,7 @@ int x25_lapb_receive_frame(struct sk_buff *skb, struct net_device *dev,
 
        if (!pskb_may_pull(skb, 1)) {
                x25_neigh_put(nb);
-               return 0;
+               goto drop;
        }
 
        switch (skb->data[0]) {
index 60a2a63..a3ac5a7 100755 (executable)
@@ -90,7 +90,7 @@ if [ -n "$KDEB_PKGVERSION" ]; then
        packageversion=$KDEB_PKGVERSION
        revision=${packageversion##*-}
 else
-       revision=$(cat .version 2>/dev/null||echo 1)
+       revision=$($srctree/init/build-version)
        packageversion=$version-$revision
 fi
 sourcename=$KDEB_SOURCENAME
index b9eb320..ae31bb1 100644 (file)
@@ -321,6 +321,11 @@ static const struct config_entry config_table[] = {
                }
        },
        {
+               .flags = FLAG_SOF,
+               .device = 0x34c8,
+               .codec_hid =  &essx_83x6,
+       },
+       {
                .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
                .device = 0x34c8,
        },
index e18499d..e5c0363 100644 (file)
@@ -9436,6 +9436,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
        SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
+       SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
+       SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
        SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
        SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
index 6c0f1de..d9715be 100644 (file)
@@ -206,6 +206,13 @@ static const struct dmi_system_id yc_acp_quirk_table[] = {
                        DMI_MATCH(DMI_PRODUCT_NAME, "UM5302TA"),
                }
        },
+       {
+               .driver_data = &acp6x_card,
+               .matches = {
+                       DMI_MATCH(DMI_BOARD_VENDOR, "Alienware"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m17 R5 AMD"),
+               }
+       },
        {}
 };
 
index 1a25a37..362663a 100644 (file)
@@ -298,13 +298,14 @@ static int rt5514_spi_pcm_new(struct snd_soc_component *component,
 }
 
 static const struct snd_soc_component_driver rt5514_spi_component = {
-       .name           = DRV_NAME,
-       .probe          = rt5514_spi_pcm_probe,
-       .open           = rt5514_spi_pcm_open,
-       .hw_params      = rt5514_spi_hw_params,
-       .hw_free        = rt5514_spi_hw_free,
-       .pointer        = rt5514_spi_pcm_pointer,
-       .pcm_construct  = rt5514_spi_pcm_new,
+       .name                   = DRV_NAME,
+       .probe                  = rt5514_spi_pcm_probe,
+       .open                   = rt5514_spi_pcm_open,
+       .hw_params              = rt5514_spi_hw_params,
+       .hw_free                = rt5514_spi_hw_free,
+       .pointer                = rt5514_spi_pcm_pointer,
+       .pcm_construct          = rt5514_spi_pcm_new,
+       .legacy_dai_naming      = 1,
 };
 
 /**
index 8f3993a..d25703d 100644 (file)
@@ -396,15 +396,16 @@ static int rt5677_spi_pcm_probe(struct snd_soc_component *component)
 }
 
 static const struct snd_soc_component_driver rt5677_spi_dai_component = {
-       .name           = DRV_NAME,
-       .probe          = rt5677_spi_pcm_probe,
-       .open           = rt5677_spi_pcm_open,
-       .close          = rt5677_spi_pcm_close,
-       .hw_params      = rt5677_spi_hw_params,
-       .hw_free        = rt5677_spi_hw_free,
-       .prepare        = rt5677_spi_prepare,
-       .pointer        = rt5677_spi_pcm_pointer,
-       .pcm_construct  = rt5677_spi_pcm_new,
+       .name                   = DRV_NAME,
+       .probe                  = rt5677_spi_pcm_probe,
+       .open                   = rt5677_spi_pcm_open,
+       .close                  = rt5677_spi_pcm_close,
+       .hw_params              = rt5677_spi_hw_params,
+       .hw_free                = rt5677_spi_hw_free,
+       .prepare                = rt5677_spi_prepare,
+       .pointer                = rt5677_spi_pcm_pointer,
+       .pcm_construct          = rt5677_spi_pcm_new,
+       .legacy_dai_naming      = 1,
 };
 
 /* Select a suitable transfer command for the next transfer to ensure
index 51b87a9..2e0ed3e 100644 (file)
@@ -438,20 +438,13 @@ static int tas2764_set_dai_tdm_slot(struct snd_soc_dai *dai,
        if (tx_mask == 0 || rx_mask != 0)
                return -EINVAL;
 
-       if (slots == 1) {
-               if (tx_mask != 1)
-                       return -EINVAL;
-               left_slot = 0;
-               right_slot = 0;
+       left_slot = __ffs(tx_mask);
+       tx_mask &= ~(1 << left_slot);
+       if (tx_mask == 0) {
+               right_slot = left_slot;
        } else {
-               left_slot = __ffs(tx_mask);
-               tx_mask &= ~(1 << left_slot);
-               if (tx_mask == 0) {
-                       right_slot = left_slot;
-               } else {
-                       right_slot = __ffs(tx_mask);
-                       tx_mask &= ~(1 << right_slot);
-               }
+               right_slot = __ffs(tx_mask);
+               tx_mask &= ~(1 << right_slot);
        }
 
        if (tx_mask != 0 || left_slot >= slots || right_slot >= slots)
index b676523..8557759 100644 (file)
@@ -395,21 +395,13 @@ static int tas2770_set_dai_tdm_slot(struct snd_soc_dai *dai,
        if (tx_mask == 0 || rx_mask != 0)
                return -EINVAL;
 
-       if (slots == 1) {
-               if (tx_mask != 1)
-                       return -EINVAL;
-
-               left_slot = 0;
-               right_slot = 0;
+       left_slot = __ffs(tx_mask);
+       tx_mask &= ~(1 << left_slot);
+       if (tx_mask == 0) {
+               right_slot = left_slot;
        } else {
-               left_slot = __ffs(tx_mask);
-               tx_mask &= ~(1 << left_slot);
-               if (tx_mask == 0) {
-                       right_slot = left_slot;
-               } else {
-                       right_slot = __ffs(tx_mask);
-                       tx_mask &= ~(1 << right_slot);
-               }
+               right_slot = __ffs(tx_mask);
+               tx_mask &= ~(1 << right_slot);
        }
 
        if (tx_mask != 0 || left_slot >= slots || right_slot >= slots)
index a6db6f0..afdf0c8 100644 (file)
@@ -380,20 +380,13 @@ static int tas2780_set_dai_tdm_slot(struct snd_soc_dai *dai,
        if (tx_mask == 0 || rx_mask != 0)
                return -EINVAL;
 
-       if (slots == 1) {
-               if (tx_mask != 1)
-                       return -EINVAL;
-               left_slot = 0;
-               right_slot = 0;
+       left_slot = __ffs(tx_mask);
+       tx_mask &= ~(1 << left_slot);
+       if (tx_mask == 0) {
+               right_slot = left_slot;
        } else {
-               left_slot = __ffs(tx_mask);
-               tx_mask &= ~(1 << left_slot);
-               if (tx_mask == 0) {
-                       right_slot = left_slot;
-               } else {
-                       right_slot = __ffs(tx_mask);
-                       tx_mask &= ~(1 << right_slot);
-               }
+               right_slot = __ffs(tx_mask);
+               tx_mask &= ~(1 << right_slot);
        }
 
        if (tx_mask != 0 || left_slot >= slots || right_slot >= slots)
index 936aef5..e16e7b3 100644 (file)
@@ -1232,7 +1232,7 @@ static int fsl_asrc_probe(struct platform_device *pdev)
        }
 
        ret = pm_runtime_put_sync(&pdev->dev);
-       if (ret < 0)
+       if (ret < 0 && ret != -ENOSYS)
                goto err_pm_get_sync;
 
        ret = devm_snd_soc_register_component(&pdev->dev, &fsl_asrc_component,
index 5c21fc4..17fefd2 100644 (file)
@@ -1069,7 +1069,7 @@ static int fsl_esai_probe(struct platform_device *pdev)
        regmap_write(esai_priv->regmap, REG_ESAI_RSMB, 0);
 
        ret = pm_runtime_put_sync(&pdev->dev);
-       if (ret < 0)
+       if (ret < 0 && ret != -ENOSYS)
                goto err_pm_get_sync;
 
        /*
index 81f89f6..e60c7b3 100644 (file)
@@ -1446,7 +1446,7 @@ static int fsl_sai_probe(struct platform_device *pdev)
        }
 
        ret = pm_runtime_put_sync(dev);
-       if (ret < 0)
+       if (ret < 0 && ret != -ENOSYS)
                goto err_pm_get_sync;
 
        /*
index 6432b83..a935c5f 100644 (file)
@@ -443,6 +443,13 @@ static const struct dmi_system_id byt_cht_es8316_quirk_table[] = {
                                        | BYT_CHT_ES8316_INTMIC_IN2_MAP
                                        | BYT_CHT_ES8316_JD_INVERTED),
        },
+       {       /* Nanote UMPC-01 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "RWC CO.,LTD"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "UMPC-01"),
+               },
+               .driver_data = (void *)BYT_CHT_ES8316_INTMIC_IN1_MAP,
+       },
        {       /* Teclast X98 Plus II */
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"),
index fbb42e5..70713e4 100644 (file)
@@ -63,6 +63,7 @@ struct sof_es8336_private {
        struct snd_soc_jack jack;
        struct list_head hdmi_pcm_list;
        bool speaker_en;
+       struct delayed_work pcm_pop_work;
 };
 
 struct sof_hdmi_pcm {
@@ -111,6 +112,46 @@ static void log_quirks(struct device *dev)
                dev_info(dev, "quirk headset at mic1 port enabled\n");
 }
 
+static void pcm_pop_work_events(struct work_struct *work)
+{
+       struct sof_es8336_private *priv =
+               container_of(work, struct sof_es8336_private, pcm_pop_work.work);
+
+       gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en);
+
+       if (quirk & SOF_ES8336_HEADPHONE_GPIO)
+               gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en);
+
+}
+
+static int sof_8336_trigger(struct snd_pcm_substream *substream, int cmd)
+{
+       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
+       struct snd_soc_card *card = rtd->card;
+       struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
+
+       switch (cmd) {
+       case SNDRV_PCM_TRIGGER_START:
+       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
+       case SNDRV_PCM_TRIGGER_RESUME:
+               break;
+
+       case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
+       case SNDRV_PCM_TRIGGER_SUSPEND:
+       case SNDRV_PCM_TRIGGER_STOP:
+               if (priv->speaker_en == false)
+                       if (substream->stream == 0) {
+                               cancel_delayed_work(&priv->pcm_pop_work);
+                               gpiod_set_value_cansleep(priv->gpio_speakers, true);
+                       }
+               break;
+       default:
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
                                          struct snd_kcontrol *kcontrol, int event)
 {
@@ -122,19 +163,7 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
 
        priv->speaker_en = !SND_SOC_DAPM_EVENT_ON(event);
 
-       if (SND_SOC_DAPM_EVENT_ON(event))
-               msleep(70);
-
-       gpiod_set_value_cansleep(priv->gpio_speakers, priv->speaker_en);
-
-       if (!(quirk & SOF_ES8336_HEADPHONE_GPIO))
-               return 0;
-
-       if (SND_SOC_DAPM_EVENT_ON(event))
-               msleep(70);
-
-       gpiod_set_value_cansleep(priv->gpio_headphone, priv->speaker_en);
-
+       queue_delayed_work(system_wq, &priv->pcm_pop_work, msecs_to_jiffies(70));
        return 0;
 }
 
@@ -344,6 +373,7 @@ static int sof_es8336_hw_params(struct snd_pcm_substream *substream,
 /* machine stream operations */
 static struct snd_soc_ops sof_es8336_ops = {
        .hw_params = sof_es8336_hw_params,
+       .trigger = sof_8336_trigger,
 };
 
 static struct snd_soc_dai_link_component platform_component[] = {
@@ -723,7 +753,8 @@ static int sof_es8336_probe(struct platform_device *pdev)
        }
 
        INIT_LIST_HEAD(&priv->hdmi_pcm_list);
-
+       INIT_DELAYED_WORK(&priv->pcm_pop_work,
+                               pcm_pop_work_events);
        snd_soc_card_set_drvdata(card, priv);
 
        if (mach->mach_params.dmic_num > 0) {
@@ -752,6 +783,7 @@ static int sof_es8336_remove(struct platform_device *pdev)
        struct snd_soc_card *card = platform_get_drvdata(pdev);
        struct sof_es8336_private *priv = snd_soc_card_get_drvdata(card);
 
+       cancel_delayed_work(&priv->pcm_pop_work);
        gpiod_put(priv->gpio_speakers);
        device_remove_software_node(priv->codec_dev);
        put_device(priv->codec_dev);
index b032bc0..d0062f2 100644 (file)
 #include <sound/soc-acpi-intel-match.h>
 #include "../skylake/skl.h"
 
+static const struct snd_soc_acpi_codecs essx_83x6 = {
+       .num_codecs = 3,
+       .codecs = { "ESSX8316", "ESSX8326", "ESSX8336"},
+};
+
 static struct skl_machine_pdata icl_pdata = {
        .use_tplg_pcm = true,
 };
@@ -27,6 +32,14 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_icl_machines[] = {
                .drv_name = "sof_rt5682",
                .sof_tplg_filename = "sof-icl-rt5682.tplg",
        },
+       {
+               .comp_ids = &essx_83x6,
+               .drv_name = "sof-essx8336",
+               .sof_tplg_filename = "sof-icl-es8336", /* the tplg suffix is added at run time */
+               .tplg_quirk_mask = SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER |
+                                       SND_SOC_ACPI_TPLG_INTEL_SSP_MSB |
+                                       SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER,
+       },
        {},
 };
 EXPORT_SYMBOL_GPL(snd_soc_acpi_intel_icl_machines);
index 12a82f5..a409fbe 100644 (file)
@@ -3477,10 +3477,23 @@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_link_cpus);
 
 static int __init snd_soc_init(void)
 {
+       int ret;
+
        snd_soc_debugfs_init();
-       snd_soc_util_init();
+       ret = snd_soc_util_init();
+       if (ret)
+               goto err_util_init;
 
-       return platform_driver_register(&soc_driver);
+       ret = platform_driver_register(&soc_driver);
+       if (ret)
+               goto err_register;
+       return 0;
+
+err_register:
+       snd_soc_util_exit();
+err_util_init:
+       snd_soc_debugfs_exit();
+       return ret;
 }
 module_init(snd_soc_init);
 
index d515e7a..879cf1b 100644 (file)
@@ -3645,7 +3645,7 @@ snd_soc_dapm_new_control_unlocked(struct snd_soc_dapm_context *dapm,
 
        switch (w->id) {
        case snd_soc_dapm_regulator_supply:
-               w->regulator = devm_regulator_get(dapm->dev, w->name);
+               w->regulator = devm_regulator_get(dapm->dev, widget->name);
                if (IS_ERR(w->regulator)) {
                        ret = PTR_ERR(w->regulator);
                        goto request_failed;
index a3b6df2..a4dba0b 100644 (file)
@@ -264,7 +264,7 @@ int __init snd_soc_util_init(void)
        return ret;
 }
 
-void __exit snd_soc_util_exit(void)
+void snd_soc_util_exit(void)
 {
        platform_driver_unregister(&soc_dummy_driver);
        platform_device_unregister(soc_dummy_dev);
index c148715..0720e1e 100644 (file)
@@ -2275,6 +2275,7 @@ static int sof_ipc3_tear_down_all_pipelines(struct snd_sof_dev *sdev, bool verif
        struct sof_ipc_fw_version *v = &sdev->fw_ready.version;
        struct snd_sof_widget *swidget;
        struct snd_sof_route *sroute;
+       bool dyn_widgets = false;
        int ret;
 
        /*
@@ -2284,12 +2285,14 @@ static int sof_ipc3_tear_down_all_pipelines(struct snd_sof_dev *sdev, bool verif
         * topology loading the sound card unavailable to open PCMs.
         */
        list_for_each_entry(swidget, &sdev->widget_list, list) {
-               if (swidget->dynamic_pipeline_widget)
+               if (swidget->dynamic_pipeline_widget) {
+                       dyn_widgets = true;
                        continue;
+               }
 
-               /* Do not free widgets for static pipelines with FW ABI older than 3.19 */
+               /* Do not free widgets for static pipelines with FW older than SOF2.2 */
                if (!verify && !swidget->dynamic_pipeline_widget &&
-                   v->abi_version < SOF_ABI_VER(3, 19, 0)) {
+                   SOF_FW_VER(v->major, v->minor, v->micro) < SOF_FW_VER(2, 2, 0)) {
                        swidget->use_count = 0;
                        swidget->complete = 0;
                        continue;
@@ -2303,9 +2306,11 @@ static int sof_ipc3_tear_down_all_pipelines(struct snd_sof_dev *sdev, bool verif
        /*
         * Tear down all pipelines associated with PCMs that did not get suspended
         * and unset the prepare flag so that they can be set up again during resume.
-        * Skip this step for older firmware.
+        * Skip this step for older firmware unless topology has any
+        * dynamic pipeline (in which case the step is mandatory).
         */
-       if (!verify && v->abi_version >= SOF_ABI_VER(3, 19, 0)) {
+       if (!verify && (dyn_widgets || SOF_FW_VER(v->major, v->minor, v->micro) >=
+           SOF_FW_VER(2, 2, 0))) {
                ret = sof_tear_down_left_over_pipelines(sdev);
                if (ret < 0) {
                        dev_err(sdev->dev, "failed to tear down paused pipelines\n");
index 38855dd..6a0e7f3 100644 (file)
@@ -1344,16 +1344,6 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
                break;
        }
 
-       if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
-               swidget->core = SOF_DSP_PRIMARY_CORE;
-       } else {
-               int core = sof_get_token_value(SOF_TKN_COMP_CORE_ID, swidget->tuples,
-                                              swidget->num_tuples);
-
-               if (core >= 0)
-                       swidget->core = core;
-       }
-
        /* check token parsing reply */
        if (ret < 0) {
                dev_err(scomp->dev,
@@ -1365,6 +1355,16 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
                return ret;
        }
 
+       if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
+               swidget->core = SOF_DSP_PRIMARY_CORE;
+       } else {
+               int core = sof_get_token_value(SOF_TKN_COMP_CORE_ID, swidget->tuples,
+                                              swidget->num_tuples);
+
+               if (core >= 0)
+                       swidget->core = core;
+       }
+
        /* bind widget to external event */
        if (tw->event_type) {
                if (widget_ops[w->id].bind_event) {
index 643fc8a..837c184 100644 (file)
@@ -304,6 +304,11 @@ static int stm32_adfsdm_dummy_cb(const void *data, void *private)
        return 0;
 }
 
+static void stm32_adfsdm_cleanup(void *data)
+{
+       iio_channel_release_all_cb(data);
+}
+
 static struct snd_soc_component_driver stm32_adfsdm_soc_platform = {
        .open           = stm32_adfsdm_pcm_open,
        .close          = stm32_adfsdm_pcm_close,
@@ -350,6 +355,12 @@ static int stm32_adfsdm_probe(struct platform_device *pdev)
        if (IS_ERR(priv->iio_cb))
                return PTR_ERR(priv->iio_cb);
 
+       ret = devm_add_action_or_reset(&pdev->dev, stm32_adfsdm_cleanup, priv->iio_cb);
+       if (ret < 0)  {
+               dev_err(&pdev->dev, "Unable to add action\n");
+               return ret;
+       }
+
        component = devm_kzalloc(&pdev->dev, sizeof(*component), GFP_KERNEL);
        if (!component)
                return -ENOMEM;
index bbff092..2839f6b 100644 (file)
@@ -1133,10 +1133,8 @@ static int snd_usbmidi_output_open(struct snd_rawmidi_substream *substream)
                                        port = &umidi->endpoints[i].out->ports[j];
                                        break;
                                }
-       if (!port) {
-               snd_BUG();
+       if (!port)
                return -ENXIO;
-       }
 
        substream->runtime->private_data = port;
        port->state = STATE_UNKNOWN;
index 10ac527..f17ade0 100644 (file)
 #define MSR_AMD64_CPUID_FN_1           0xc0011004
 #define MSR_AMD64_LS_CFG               0xc0011020
 #define MSR_AMD64_DC_CFG               0xc0011022
+
+#define MSR_AMD64_DE_CFG               0xc0011029
+#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT  1
+#define MSR_AMD64_DE_CFG_LFENCE_SERIALIZE      BIT_ULL(MSR_AMD64_DE_CFG_LFENCE_SERIALIZE_BIT)
+
 #define MSR_AMD64_BU_CFG2              0xc001102a
 #define MSR_AMD64_IBSFETCHCTL          0xc0011030
 #define MSR_AMD64_IBSFETCHLINAD                0xc0011031
 #define FAM10H_MMIO_CONF_BASE_MASK     0xfffffffULL
 #define FAM10H_MMIO_CONF_BASE_SHIFT    20
 #define MSR_FAM10H_NODE_ID             0xc001100c
-#define MSR_F10H_DECFG                 0xc0011029
-#define MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT    1
-#define MSR_F10H_DECFG_LFENCE_SERIALIZE                BIT_ULL(MSR_F10H_DECFG_LFENCE_SERIALIZE_BIT)
 
 /* K8 MSRs */
 #define MSR_K8_TOP_MEM1                        0xc001001a
index 2491c54..f8deae4 100644 (file)
@@ -715,12 +715,12 @@ int main(int argc, char **argv)
                                continue;
                        }
 
-                       toread = buf_len;
                } else {
                        usleep(timedelay);
-                       toread = 64;
                }
 
+               toread = buf_len;
+
                read_size = read(buf_fd, data, toread * scan_size);
                if (read_size < 0) {
                        if (errno == EAGAIN) {
index dd324b4..4d7056f 100644 (file)
@@ -63,6 +63,13 @@ void test_varlen(void)
        CHECK_VAL(data->total4, size1 + size2);
        CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
              "doesn't match!\n");
+
+       CHECK_VAL(bss->ret_bad_read, -EFAULT);
+       CHECK_VAL(data->payload_bad[0], 0x42);
+       CHECK_VAL(data->payload_bad[1], 0x42);
+       CHECK_VAL(data->payload_bad[2], 0);
+       CHECK_VAL(data->payload_bad[3], 0x42);
+       CHECK_VAL(data->payload_bad[4], 0x42);
 cleanup:
        test_varlen__destroy(skel);
 }
index 3987ff1..20eb7d4 100644 (file)
@@ -19,6 +19,7 @@ __u64 payload1_len1 = 0;
 __u64 payload1_len2 = 0;
 __u64 total1 = 0;
 char payload1[MAX_LEN + MAX_LEN] = {};
+__u64 ret_bad_read = 0;
 
 /* .data */
 int payload2_len1 = -1;
@@ -36,6 +37,8 @@ int payload4_len2 = -1;
 int total4= -1;
 char payload4[MAX_LEN + MAX_LEN] = { 1 };
 
+char payload_bad[5] = { 0x42, 0x42, 0x42, 0x42, 0x42 };
+
 SEC("raw_tp/sys_enter")
 int handler64_unsigned(void *regs)
 {
@@ -61,6 +64,8 @@ int handler64_unsigned(void *regs)
 
        total1 = payload - (void *)payload1;
 
+       ret_bad_read = bpf_probe_read_kernel_str(payload_bad + 2, 1, (void *) -1);
+
        return 0;
 }
 
index 0e9a47f..3fef451 100644 (file)
@@ -1010,7 +1010,7 @@ static inline const char *str_msg(const struct msg *msg, char *buf)
                        msg->subtest_done.have_log);
                break;
        case MSG_TEST_LOG:
-               sprintf(buf, "MSG_TEST_LOG (cnt: %ld, last: %d)",
+               sprintf(buf, "MSG_TEST_LOG (cnt: %zu, last: %d)",
                        strlen(msg->test_log.log_buf),
                        msg->test_log.is_last);
                break;
index 2dbcbf3..b605a70 100644 (file)
@@ -1260,7 +1260,7 @@ static int get_xlated_program(int fd_prog, struct bpf_insn **buf, int *cnt)
 
        bzero(&info, sizeof(info));
        info.xlated_prog_len = xlated_prog_len;
-       info.xlated_prog_insns = (__u64)*buf;
+       info.xlated_prog_insns = (__u64)(unsigned long)*buf;
        if (bpf_obj_get_info_by_fd(fd_prog, &info, &info_len)) {
                perror("second bpf_obj_get_info_by_fd failed");
                goto out_free_buf;