Merge tag 'android14-6.1.118_r00' into android14-6.1

This merges up to the 6.1.118 LTS release into the android14-6.1 branch.
Changes included in here are:

*   2f2512ac10 Merge 6.1.118 into android14-6.1-lts
|\
| * b67dc5c9ad Linux 6.1.118
| * 6a8d39ee34 9p: fix slab cache name creation for real
| * 509c1c6b49 fs/ntfs3: Fix general protection fault in run_is_mapped_full
| * ba0b09a2f3 platform/x86: x86-android-tablets: Fix use after free on platform_device_register() errors
| * 486aeb5f18 mm: krealloc: Fix MTE false alarm in __do_krealloc
| * b22346eec4 Bluetooth: L2CAP: Fix uaf in l2cap_connect
| * cf3196e5e2 ext4: fix timer use-after-free on failed mount
| * e7831613cb drm/amdkfd: amdkfd_free_gtt_mem clear the correct pointer
| * 0dc3ad9ad2 uprobe: avoid out-of-bounds memory access of fetching args
| * 02079f0922 uprobes: encapsulate preparation of uprobe args buffer
| * fdacd09f2d io_uring: fix possible deadlock in io_register_iowq_max_workers()
| * 9478355c63 md/raid10: improve code of mrdev in raid10_sync_request
| * d4b003f720 net: usb: qmi_wwan: add Fibocom FG132 0x0112 composition
| * 8118551b4f LoongArch: Use "Exception return address" to comment ERA
| * 807692abc6 HID: lenovo: Add support for Thinkpad X1 Tablet Gen 3 keyboard
| * 5622881cf0 HID: multitouch: Add quirk for Logitech Bolt receiver w/ Casa touchpad
| * 5a72b0d349 fs: Fix uninitialized value issue in from_kuid and from_kgid
| * cdd28621bb bpf: Fix mismatched RCU unlock flavour in bpf_out_neigh_v6
| * 32c982b520 vDPA/ifcvf: Fix pci_read_config_byte() return code handling
| * afa2294653 nvme: make keep-alive synchronous operation
| * ffdebf3da1 powerpc/powernv: Free name on error in opal_event_init()
| * 60de2e03f9 nvme-multipath: defer partition scanning
| * f17c880a47 drm/vmwgfx: Limit display layout ioctl array size to VMWGFX_NUM_DISPLAY_UNITS
| * b8d1f4d383 sound: Make CONFIG_SND depend on INDIRECT_IOMEM instead of UML
| * 75a1b35dcc crypto: marvell/cesa - Disable hash algorithms
| * 1bc59a7c07 crypto: api - Fix liveliness check in crypto_alg_tested
| * 911c9bc048 bpf: use kvzmalloc to allocate BPF verifier environment
| * ccf7d31481 nvme: disable CC.CRIME (NVME_CC_CRIME)
| * eb6751a26a HID: multitouch: Add quirk for HONOR MagicBook Art 14 touchpad
| * c2242ebafd HID: multitouch: Add support for B2402FVA track point
| * 77b0a8b062 block: Fix elevator_get_default() checking for NULL q->tag_set
| * 4f946479b3 nvme: tcp: avoid race between queue_lock lock and destroy
| * 94a4d966f7 irqchip/ocelot: Fix trigger register address
| * af39f19c71 9p: Avoid creating multiple slab caches with the same name
| * 903227b616 Revert "Bluetooth: hci_conn: Consolidate code for aborting connections"
| * 4c69abb4d4 Revert "Bluetooth: hci_core: Fix possible buffer overflow"
* | 27e7205cf2 Merge 0625d7c240 ("Revert "Bluetooth: af_bluetooth: Fix deadlock"") into android14-6.1-lts
|\|
| * 0625d7c240 Revert "Bluetooth: af_bluetooth: Fix deadlock"
| * 0337fb0928 Revert "Bluetooth: hci_sync: Fix overwriting request callback"
| * 21b39fa205 Revert "Bluetooth: fix use-after-free in accessing skb after sending it"
* | bb58b1f9bf Merge 6.1.117 into android14-6.1-lts
|\|
| * 59d7b1a710 Linux 6.1.117
| * 178379985e media: amphion: Fix VPU core alias name
| * 44d29897ea vsock/virtio: Initialization of the dangling pointer occurring in vsk->trans
| * 98d8dde923 hv_sock: Initializing vsk->trans to NULL to prevent a dangling pointer
| * b911fa9e92 net: sched: use RCU read-side critical section in taprio_dump()
| * 7f6c3c7f8d ASoC: amd: yc: fix internal mic on Xiaomi Book Pro 14 2022
| * 7bce2c7ac8 ucounts: fix counter leak in inc_rlimit_get_ucounts()
| * 86dd0e8d42 ocfs2: remove entry once instead of null-ptr-dereference in ocfs2_xa_remove()
| * 8525160ea2 irqchip/gic-v3: Force propagation of the active state with a read-back
| * ded5200f83 USB: serial: option: add Quectel RG650V
| * 9b298c819a USB: serial: option: add Fibocom FG132 0x0112 composition
| * 5a4a73a6e6 USB: serial: qcserial: add support for Sierra Wireless EM86xx
| * 275258c30b USB: serial: io_edgeport: fix use after free in debug printk
| * 604314ecd6 usb: typec: fix potential out of bounds in ucsi_ccg_update_set_new_cam_cmd()
| * 562804b156 usb: dwc3: fix fault at system suspend if device was already runtime suspended
| * ccd811c304 usb: musb: sunxi: Fix accessing an released usb phy
| * 012f4d5d25 signal: restore the override_rlimit logic
| * 190911cebd fs/proc: fix compile warning about variable 'vmcore_mmap_ops'
| * 26530b757c filemap: Fix bounds checking in filemap_read()
| * beced2cb09 media: uvcvideo: Skip parsing frames of type UVC_VS_UNDEFINED in uvc_parse_format
| * c8ec4e437a kselftest/arm64: Initialise current at build time in signal tests
| * a60db84f77 net: do not delay dst_entries_add() in dst_release()
| * 5cf45281a6 Revert "wifi: mac80211: fix RCU list iterations"
| * 84d2f29152 bnxt_re: avoid shift undefined behavior in bnxt_qplib_alloc_init_hwq
| * 10ffafb456 riscv/purgatory: align riscv_kernel_entry
| * 2cb1a73d1d btrfs: reinitialize delayed ref list after deleting it from the list
| * ba884534f1 arm64: Kconfig: Make SME depend on BROKEN for now
| * aa3e68bd45 mptcp: use sock_kfree_s instead of kfree
| * 2cf0e77f5a net: vertexcom: mse102x: Fix possible double free of TX skb
| * 424c4acb33 net: wwan: t7xx: Fix off-by-one error in t7xx_dpmaif_rx_buf_alloc()
| * f6b2b2b981 nfs: Fix KMSAN warning in decode_getfattr_attrs()
| * d3bcf4069d posix-cpu-timers: Clear TICK_DEP_BIT_POSIX_TIMER on clone
| * 1ced986a37 ALSA: hda/realtek: Fix headset mic on TUXEDO Gemini 17 Gen3
| * 4fee0ad11a ALSA: usb-audio: Add quirk for HP 320 FHD Webcam
| * 80342c5876 dm-unstriped: cast an operand to sector_t to prevent potential uint32_t overflow
| * c52ec00cb2 dm cache: fix potential out-of-bounds access on the first resume
| * 011450c2f9 dm cache: optimize dirty bit checking with find_next_bit when resizing
| * 56507203e1 dm cache: fix out-of-bounds access to the dirty bitset when resizing
| * 5a754d3c77 dm cache: fix flushing uninitialized delayed_work on cache_ctr error
| * ffaf0f6eab dm cache: correct the number of origin blocks to match the target length
| * 66ada34425 thermal/drivers/qcom/lmh: Remove false lockdep backtrace
| * 1a9f55ed5b drm/amdgpu: prevent NULL pointer dereference if ATIF is not supported
| * 25d7e84343 drm/amdgpu: add missing size check in amdgpu_debugfs_gprwave_read()
| * 91139f33b0 drm/amdgpu: Adjust debugfs eviction and IB access permissions
| * 284e213f0e pwm: imx-tpm: Use correct MODULO value for EPWM mode
| * f7557bbca4 ksmbd: fix slab-use-after-free in smb3_preauth_hash_rsp
| * d8664ce789 ksmbd: Fix the missing xa_store error check
| * f56446ba53 ksmbd: fix slab-use-after-free in ksmbd_smb2_session_create
| * 49500cfd14 can: mcp251xfd: mcp251xfd_ring_alloc(): fix coalescing configuration when switching CAN modes
| * 4ee68cf530 can: mcp251xfd: mcp251xfd_get_tef_len(): fix length calculation
| * f7503fd2d7 media: v4l2-ctrls-api: fix error handling for v4l2_g_ctrl()
| * c63c30c9d9 media: v4l2-tpg: prevent the risk of a division by zero
| * 4b132a464f media: pulse8-cec: fix data timestamp at pulse8_setup()
| * fbefe31e45 media: cx24116: prevent overflows on SNR calculus
| * c85db2d443 media: s5p-jpeg: prevent buffer overflows
| * 5e1523076a media: ar0521: don't overflow when checking PLL values
| * 4f1d74f747 ASoC: stm32: spdifrx: fix dma channel release in stm32_spdifrx_remove
| * 2e9a53eef2 thermal/of: support thermal zones w/o trips subnode
| * 648e7f59e8 tools/lib/thermal: Fix sampling handler context ptr
| * 42a26e971e ALSA: firewire-lib: fix return value on fail in amdtp_tscm_init()
| * 3b4f6966d7 scsi: sd_zbc: Use kvzalloc() to allocate REPORT ZONES buffer
| * d98c63c00c media: adv7604: prevent underflow condition when reporting colorspace
| * fd6d84b8ee media: dvb_frontend: don't play tricks with underflow values
| * b751a96025 media: dvbdev: prevent the risk of out of memory access
| * d6386b279d media: stb0899_algo: initialize cfr before using it
| * 3f8f470f31 Revert "ALSA: hda/conexant: Mute speakers at suspend / shutdown"
| * 98ffd58530 net: arc: rockchip: fix emac mdio node support
| * fd4e062fbc net: arc: fix the device for dma_map_single/dma_unmap_single
| * f3401e3c8d virtio_net: Add hash_key_length check
| * 2af6499260 net: stmmac: Fix unbalanced IRQ wake disable warning on single irq case
| * 7efd9a10b8 net: phy: ti: add PHY_RST_AFTER_CLK_EN flag
| * 76b155e14d net: hns3: fix kernel crash when uninstalling driver
| * 7ad3fb3bfd i40e: fix race condition by adding filter's intermediate sync state
| * 64aa077114 ice: change q_index variable type to s16 to store -1 value
| * dac989c2a3 can: c_can: fix {rx,tx}_errors statistics
| * bf9bff1322 sctp: properly validate chunk size in sctp_sf_ootb()
| * 12a3977538 net: enetc: set MAC address to the VF net_device
| * bbad2d5b6c security/keys: fix slab-out-of-bounds in key_task_permission
| * 99659d2345 nfs: avoid i_lock contention in nfs_clear_invalid_mapping
| * ba5634feb2 NFSv3: handle out-of-order write replies.
| * 9a65be8111 NFSv3: only use NFS timeout for MOUNT when protocols are compatible
| * f22232160e sunrpc: handle -ENOTCONN in xs_tcp_setup_socket()
| * a50863dd1f platform/x86/amd/pmc: Detect when STB is not available
| * 1884ab3d22 HID: core: zero-initialize the report buffer
| * 5d739ad16c ARM: dts: rockchip: Fix the realtek audio codec on rk3036-kylin
| * 89e601bd73 ARM: dts: rockchip: Fix the spi controller on rk3036
| * 44c3b97a1c ARM: dts: rockchip: drop grf reference from rk3036 hdmi
| * f7539956d7 ARM: dts: rockchip: fix rk3036 acodec node
| * a45a7930f4 arm64: dts: imx8mp: correct sdhc ipg clk
| * 65af08b542 arm64: dts: imx8-ss-vpu: Fix imx8qm VPU IRQs
| * 272abcefdb arm64: dts: imx8qxp: Add VPU subsystem file
| * ed5268f3e8 arm64: dts: imx8qm: Fix VPU core alias name
| * 7219ff9791 arm64: dts: rockchip: Fix LED triggers on rk3308-roc-cc
| * 3746e8b25a arm64: dts: rockchip: Remove #cooling-cells from fan on Theobroma lion
| * 72b96b794d arm64: dts: rockchip: Fix bluetooth properties on Rock960 boards
| * d6477a9858 arm64: dts: rockchip: Fix wakeup prop names on PineNote BT node
| * 8db0adaefe arm64: dts: rockchip: Remove hdmi's 2nd interrupt on rk3328
| * 89b30d16db arm64: dts: rockchip: Fix rt5651 compatible value on rk3399-sapphire-excavator
| * d7b0f08fd6 arm64: dts: rockchip: Fix rt5651 compatible value on rk3399-eaidk-610
* | 98a32bd6ec Merge 6.1.116 into android14-6.1-lts
|\|
| * d7039b844a Linux 6.1.116
| * 7dcd620416 migrate_pages_batch: fix statistics for longterm pin retry
| * b3660228db mm: avoid gcc complaint about pointer casting
| * 23c4cb8a56 vt: prevent kernel-infoleak in con_font_get()
| * 87de0a741e drm/amd/display: Skip on writeback when it's not applicable
| * 5e84eda48f drm/amd/display: Add null checks for 'stream' and 'plane' before dereferencing
| * a207af9bfe mtd: spi-nor: winbond: fix w25q128 regression
| * 1c2f04ce02 LoongArch: Fix build errors due to backported TIMENS
| * 82cae1e30b mm: shmem: fix data-race in shmem_getattr()
| * cde8a7eb5c wifi: iwlwifi: mvm: fix 6 GHz scan construction
| * cd0cdb51b1 nilfs2: fix kernel bug due to missing clearing of checked flag
| * 0acaf4a502 wifi: mac80211: fix NULL dereference at band check in starting tx ba session
| * 38c5fe74f3 x86/bugs: Use code segment selector for VERW operand
| * 9f5a834715 io_uring: always lock __io_cqring_overflow_flush
| * 79a727a9b8 vmscan,migrate: fix page count imbalance on node stats when demoting pages
| * 8ca5f0ea52 migrate_pages: split unmap_and_move() to _unmap() and _move()
| * f9e9725daf migrate_pages: restrict number of pages to migrate in batch
| * 1145493ce5 migrate_pages: separate hugetlb folios migration
| * 6058d02a81 migrate_pages: organize stats with struct migrate_pages_stats
| * de0a1554a4 mm/migrate.c: stop using 0 as NULL pointer
| * 2a4b092d91 migrate: convert migrate_pages() to use folios
| * b0030b8699 migrate: convert unmap_and_move() to use folios
| * 01a0c92883 mm: migrate: try again if THP split is failed due to page refcnt
| * 9e8debb8e5 io_uring/rw: fix missing NOWAIT check for O_DIRECT start write
| * 0ed78d3a29 io_uring: use kiocb_{start,end}_write() helpers
| * 6d42982ad0 fs: create kiocb_{start,end}_write() helpers
| * 45676b8299 io_uring: rename kiocb_end_write() local helper
| * 8f6a0b1f41 kasan: remove vmalloc_percpu test
| * c94e965f76 nvmet-auth: assign dh_key to NULL after kfree_sensitive
| * 618d193924 ALSA: hda/realtek: Fix headset mic on TUXEDO Stellaris 16 Gen6 mb1
| * 4707893315 mctp i2c: handle NULL header address
| * 2fe5d62e12 ocfs2: pass u64 to ocfs2_truncate_inline maybe overflow
| * 189b954469 mm/page_alloc: let GFP_ATOMIC order-0 allocs access highatomic reserves
| * bb414b7f41 mm/page_alloc: explicitly define how __GFP_HIGH non-blocking allocations accesses reserves
| * 1cf970483e mm/page_alloc: explicitly define what alloc flags deplete min reserves
* | 64e5459c98 Merge 7468bd2c6e ("mm/page_alloc: explicitly record high-order atomic allocations in alloc_flags") into android14-6.1-lts
|/
* 7468bd2c6e mm/page_alloc: explicitly record high-order atomic allocations in alloc_flags

Change-Id: I7e9c61362ad083dba825e399db297a3d91328d31
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2024-12-11 16:21:53 +00:00
committed by Treehugger Robot
155 changed files with 1450 additions and 642 deletions

View File

@@ -1,7 +1,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
VERSION = 6 VERSION = 6
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 115 SUBLEVEL = 118
EXTRAVERSION = EXTRAVERSION =
NAME = Curry Ramen NAME = Curry Ramen

View File

@@ -304,8 +304,8 @@
&i2c2 { &i2c2 {
status = "okay"; status = "okay";
rt5616: rt5616@1b { rt5616: audio-codec@1b {
compatible = "rt5616"; compatible = "realtek,rt5616";
reg = <0x1b>; reg = <0x1b>;
clocks = <&cru SCLK_I2S_OUT>; clocks = <&cru SCLK_I2S_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -382,12 +382,13 @@
}; };
}; };
acodec: acodec-ana@20030000 { acodec: audio-codec@20030000 {
compatible = "rk3036-codec"; compatible = "rockchip,rk3036-codec";
reg = <0x20030000 0x4000>; reg = <0x20030000 0x4000>;
rockchip,grf = <&grf>;
clock-names = "acodec_pclk"; clock-names = "acodec_pclk";
clocks = <&cru PCLK_ACODEC>; clocks = <&cru PCLK_ACODEC>;
rockchip,grf = <&grf>;
#sound-dai-cells = <0>;
status = "disabled"; status = "disabled";
}; };
@@ -397,7 +398,6 @@
interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 45 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI>; clocks = <&cru PCLK_HDMI>;
clock-names = "pclk"; clock-names = "pclk";
rockchip,grf = <&grf>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&hdmi_ctl>; pinctrl-0 = <&hdmi_ctl>;
status = "disabled"; status = "disabled";
@@ -550,11 +550,11 @@
}; };
spi: spi@20074000 { spi: spi@20074000 {
compatible = "rockchip,rockchip-spi"; compatible = "rockchip,rk3036-spi";
reg = <0x20074000 0x1000>; reg = <0x20074000 0x1000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_SPI>, <&cru SCLK_SPI>; clocks = <&cru SCLK_SPI>, <&cru PCLK_SPI>;
clock-names = "apb-pclk","spi_pclk"; clock-names = "spiclk", "apb_pclk";
dmas = <&pdma 8>, <&pdma 9>; dmas = <&pdma 8>, <&pdma 9>;
dma-names = "tx", "rx"; dma-names = "tx", "rx";
pinctrl-names = "default"; pinctrl-names = "default";

View File

@@ -2117,6 +2117,7 @@ config ARM64_SME
bool "ARM Scalable Matrix Extension support" bool "ARM Scalable Matrix Extension support"
default y default y
depends on ARM64_SVE depends on ARM64_SVE
depends on BROKEN
help help
The Scalable Matrix Extension (SME) is an extension to the AArch64 The Scalable Matrix Extension (SME) is an extension to the AArch64
execution state which utilises a substantial subset of the SVE execution state which utilises a substantial subset of the SVE

View File

@@ -15,7 +15,7 @@ vpu: vpu@2c000000 {
mu_m0: mailbox@2d000000 { mu_m0: mailbox@2d000000 {
compatible = "fsl,imx6sx-mu"; compatible = "fsl,imx6sx-mu";
reg = <0x2d000000 0x20000>; reg = <0x2d000000 0x20000>;
interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 472 IRQ_TYPE_LEVEL_HIGH>;
#mbox-cells = <2>; #mbox-cells = <2>;
power-domains = <&pd IMX_SC_R_VPU_MU_0>; power-domains = <&pd IMX_SC_R_VPU_MU_0>;
status = "disabled"; status = "disabled";
@@ -24,7 +24,7 @@ vpu: vpu@2c000000 {
mu1_m0: mailbox@2d020000 { mu1_m0: mailbox@2d020000 {
compatible = "fsl,imx6sx-mu"; compatible = "fsl,imx6sx-mu";
reg = <0x2d020000 0x20000>; reg = <0x2d020000 0x20000>;
interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 473 IRQ_TYPE_LEVEL_HIGH>;
#mbox-cells = <2>; #mbox-cells = <2>;
power-domains = <&pd IMX_SC_R_VPU_MU_1>; power-domains = <&pd IMX_SC_R_VPU_MU_1>;
status = "disabled"; status = "disabled";

View File

@@ -934,7 +934,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b40000 0x10000>; reg = <0x30b40000 0x10000>;
interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC1_ROOT>; <&clk IMX8MP_CLK_USDHC1_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";
@@ -948,7 +948,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b50000 0x10000>; reg = <0x30b50000 0x10000>;
interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC2_ROOT>; <&clk IMX8MP_CLK_USDHC2_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";
@@ -962,7 +962,7 @@
compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc"; compatible = "fsl,imx8mp-usdhc", "fsl,imx8mm-usdhc", "fsl,imx7d-usdhc";
reg = <0x30b60000 0x10000>; reg = <0x30b60000 0x10000>;
interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>; interrupts = <GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk IMX8MP_CLK_DUMMY>, clocks = <&clk IMX8MP_CLK_IPG_ROOT>,
<&clk IMX8MP_CLK_NAND_USDHC_BUS>, <&clk IMX8MP_CLK_NAND_USDHC_BUS>,
<&clk IMX8MP_CLK_USDHC3_ROOT>; <&clk IMX8MP_CLK_USDHC3_ROOT>;
clock-names = "ipg", "ahb", "per"; clock-names = "ipg", "ahb", "per";

View File

@@ -0,0 +1,25 @@
// SPDX-License-Identifier: (GPL-2.0-or-later OR X11)
/*
* Copyright 2023 TQ-Systems GmbH <linux@ew.tq-group.com>,
* D-82229 Seefeld, Germany.
* Author: Alexander Stein
*/
&mu_m0 {
interrupts = <GIC_SPI 469 IRQ_TYPE_LEVEL_HIGH>;
};
&mu1_m0 {
interrupts = <GIC_SPI 470 IRQ_TYPE_LEVEL_HIGH>;
};
&vpu_core0 {
reg = <0x2d040000 0x10000>;
};
&vpu_core1 {
reg = <0x2d050000 0x10000>;
};
/delete-node/ &mu2_m0;
/delete-node/ &vpu_core2;

View File

@@ -46,9 +46,8 @@
serial1 = &lpuart1; serial1 = &lpuart1;
serial2 = &lpuart2; serial2 = &lpuart2;
serial3 = &lpuart3; serial3 = &lpuart3;
vpu_core0 = &vpu_core0; vpu-core0 = &vpu_core0;
vpu_core1 = &vpu_core1; vpu-core1 = &vpu_core1;
vpu_core2 = &vpu_core2;
}; };
cpus { cpus {
@@ -316,6 +315,7 @@
}; };
#include "imx8qxp-ss-img.dtsi" #include "imx8qxp-ss-img.dtsi"
#include "imx8qxp-ss-vpu.dtsi"
#include "imx8qxp-ss-adma.dtsi" #include "imx8qxp-ss-adma.dtsi"
#include "imx8qxp-ss-conn.dtsi" #include "imx8qxp-ss-conn.dtsi"
#include "imx8qxp-ss-lsio.dtsi" #include "imx8qxp-ss-lsio.dtsi"

View File

@@ -36,14 +36,14 @@
power_led: led-0 { power_led: led-0 {
label = "firefly:red:power"; label = "firefly:red:power";
linux,default-trigger = "ir-power-click"; linux,default-trigger = "default-on";
default-state = "on"; default-state = "on";
gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
}; };
user_led: led-1 { user_led: led-1 {
label = "firefly:blue:user"; label = "firefly:blue:user";
linux,default-trigger = "ir-user-click"; linux,default-trigger = "rc-feedback";
default-state = "off"; default-state = "off";
gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>; gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;
}; };

View File

@@ -724,8 +724,7 @@
compatible = "rockchip,rk3328-dw-hdmi"; compatible = "rockchip,rk3328-dw-hdmi";
reg = <0x0 0xff3c0000 0x0 0x20000>; reg = <0x0 0xff3c0000 0x0 0x20000>;
reg-io-width = <4>; reg-io-width = <4>;
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
<GIC_SPI 71 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru PCLK_HDMI>, clocks = <&cru PCLK_HDMI>,
<&cru SCLK_HDMI_SFC>, <&cru SCLK_HDMI_SFC>,
<&cru SCLK_RTC32K>; <&cru SCLK_RTC32K>;

View File

@@ -60,7 +60,6 @@
fan: fan@18 { fan: fan@18 {
compatible = "ti,amc6821"; compatible = "ti,amc6821";
reg = <0x18>; reg = <0x18>;
#cooling-cells = <2>;
}; };
rtc_twi: rtc@6f { rtc_twi: rtc@6f {

View File

@@ -541,7 +541,7 @@
status = "okay"; status = "okay";
rt5651: audio-codec@1a { rt5651: audio-codec@1a {
compatible = "rockchip,rt5651"; compatible = "realtek,rt5651";
reg = <0x1a>; reg = <0x1a>;
clocks = <&cru SCLK_I2S_8CH_OUT>; clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -575,7 +575,7 @@
bluetooth { bluetooth {
compatible = "brcm,bcm43438-bt"; compatible = "brcm,bcm43438-bt";
clocks = <&rk808 1>; clocks = <&rk808 1>;
clock-names = "ext_clock"; clock-names = "txco";
device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>; device-wakeup-gpios = <&gpio2 RK_PD3 GPIO_ACTIVE_HIGH>;
host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>; host-wakeup-gpios = <&gpio0 RK_PA4 GPIO_ACTIVE_HIGH>;
shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>; shutdown-gpios = <&gpio0 RK_PB1 GPIO_ACTIVE_HIGH>;

View File

@@ -163,7 +163,7 @@
status = "okay"; status = "okay";
rt5651: rt5651@1a { rt5651: rt5651@1a {
compatible = "rockchip,rt5651"; compatible = "realtek,rt5651";
reg = <0x1a>; reg = <0x1a>;
clocks = <&cru SCLK_I2S_8CH_OUT>; clocks = <&cru SCLK_I2S_8CH_OUT>;
clock-names = "mclk"; clock-names = "mclk";

View File

@@ -685,8 +685,8 @@
compatible = "brcm,bcm43438-bt"; compatible = "brcm,bcm43438-bt";
clocks = <&rk817 1>; clocks = <&rk817 1>;
clock-names = "lpo"; clock-names = "lpo";
device-wake-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>; device-wakeup-gpios = <&gpio0 RK_PC2 GPIO_ACTIVE_HIGH>;
host-wake-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; host-wakeup-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>;
reset-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio0 RK_PC4 GPIO_ACTIVE_LOW>;
pinctrl-0 = <&bt_enable_h>, <&bt_host_wake_l>, <&bt_wake_h>; pinctrl-0 = <&bt_enable_h>, <&bt_host_wake_l>, <&bt_wake_h>;
pinctrl-names = "default"; pinctrl-names = "default";

View File

@@ -325,7 +325,7 @@ static __always_inline void iocsr_write64(u64 val, u32 reg)
#define CSR_ESTAT_IS_WIDTH 15 #define CSR_ESTAT_IS_WIDTH 15
#define CSR_ESTAT_IS (_ULCAST_(0x7fff) << CSR_ESTAT_IS_SHIFT) #define CSR_ESTAT_IS (_ULCAST_(0x7fff) << CSR_ESTAT_IS_SHIFT)
#define LOONGARCH_CSR_ERA 0x6 /* ERA */ #define LOONGARCH_CSR_ERA 0x6 /* Exception return address */
#define LOONGARCH_CSR_BADV 0x7 /* Bad virtual address */ #define LOONGARCH_CSR_BADV 0x7 /* Bad virtual address */

View File

@@ -40,6 +40,8 @@ static struct page *vdso_pages[] = { NULL };
struct vdso_data *vdso_data = generic_vdso_data.data; struct vdso_data *vdso_data = generic_vdso_data.data;
struct vdso_pcpu_data *vdso_pdata = loongarch_vdso_data.vdata.pdata; struct vdso_pcpu_data *vdso_pdata = loongarch_vdso_data.vdata.pdata;
static struct page *find_timens_vvar_page(struct vm_area_struct *vma);
static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma) static int vdso_mremap(const struct vm_special_mapping *sm, struct vm_area_struct *new_vma)
{ {
current->mm->context.vdso = (void *)(new_vma->vm_start); current->mm->context.vdso = (void *)(new_vma->vm_start);
@@ -139,13 +141,37 @@ int vdso_join_timens(struct task_struct *task, struct time_namespace *ns)
mmap_read_lock(mm); mmap_read_lock(mm);
for_each_vma(vmi, vma) { for_each_vma(vmi, vma) {
unsigned long size = vma->vm_end - vma->vm_start;
if (vma_is_special_mapping(vma, &vdso_info.data_mapping)) if (vma_is_special_mapping(vma, &vdso_info.data_mapping))
zap_vma_pages(vma); zap_page_range(vma, vma->vm_start, size);
} }
mmap_read_unlock(mm); mmap_read_unlock(mm);
return 0; return 0;
} }
static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
{
if (likely(vma->vm_mm == current->mm))
return current->nsproxy->time_ns->vvar_page;
/*
* VM_PFNMAP | VM_IO protect .fault() handler from being called
* through interfaces like /proc/$pid/mem or
* process_vm_{readv,writev}() as long as there's no .access()
* in special_mapping_vmops.
* For more details check_vma_flags() and __access_remote_vm()
*/
WARN(1, "vvar_page accessed remotely");
return NULL;
}
#else
static struct page *find_timens_vvar_page(struct vm_area_struct *vma)
{
return NULL;
}
#endif #endif
static unsigned long vdso_base(void) static unsigned long vdso_base(void)

View File

@@ -282,6 +282,7 @@ int __init opal_event_init(void)
name, NULL); name, NULL);
if (rc) { if (rc) {
pr_warn("Error %d requesting OPAL irq %d\n", rc, (int)r->start); pr_warn("Error %d requesting OPAL irq %d\n", rc, (int)r->start);
kfree(name);
continue; continue;
} }
} }

View File

@@ -11,6 +11,8 @@
.macro size, sym:req .macro size, sym:req
.size \sym, . - \sym .size \sym, . - \sym
.endm .endm
#include <asm/asm.h>
#include <linux/linkage.h>
.text .text
@@ -39,6 +41,7 @@ size purgatory_start
.data .data
.align LGREG
.globl riscv_kernel_entry .globl riscv_kernel_entry
riscv_kernel_entry: riscv_kernel_entry:
.quad 0 .quad 0

View File

@@ -211,7 +211,16 @@
*/ */
.macro CLEAR_CPU_BUFFERS .macro CLEAR_CPU_BUFFERS
ALTERNATIVE "jmp .Lskip_verw_\@", "", X86_FEATURE_CLEAR_CPU_BUF ALTERNATIVE "jmp .Lskip_verw_\@", "", X86_FEATURE_CLEAR_CPU_BUF
verw _ASM_RIP(mds_verw_sel) #ifdef CONFIG_X86_64
verw mds_verw_sel(%rip)
#else
/*
* In 32bit mode, the memory operand must be a %cs reference. The data
* segments may not be usable (vm86 mode), and the stack segment may not
* be flat (ESPFIX32).
*/
verw %cs:mds_verw_sel
#endif
.Lskip_verw_\@: .Lskip_verw_\@:
.endm .endm

View File

@@ -624,7 +624,7 @@ out:
static inline bool elv_support_iosched(struct request_queue *q) static inline bool elv_support_iosched(struct request_queue *q)
{ {
if (!queue_is_mq(q) || if (!queue_is_mq(q) ||
(q->tag_set && (q->tag_set->flags & BLK_MQ_F_NO_SCHED))) (q->tag_set->flags & BLK_MQ_F_NO_SCHED))
return false; return false;
return true; return true;
} }
@@ -635,7 +635,7 @@ static inline bool elv_support_iosched(struct request_queue *q)
*/ */
static struct elevator_type *elevator_get_default(struct request_queue *q) static struct elevator_type *elevator_get_default(struct request_queue *q)
{ {
if (q->tag_set && q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT) if (q->tag_set->flags & BLK_MQ_F_NO_SCHED_BY_DEFAULT)
return NULL; return NULL;
if (q->nr_hw_queues != 1 && if (q->nr_hw_queues != 1 &&

View File

@@ -385,7 +385,7 @@ found:
q->cra_flags |= CRYPTO_ALG_DEAD; q->cra_flags |= CRYPTO_ALG_DEAD;
alg = test->adult; alg = test->adult;
if (list_empty(&alg->cra_list)) if (crypto_is_dead(alg))
goto complete; goto complete;
if (err == -ECANCELED) if (err == -ECANCELED)

View File

@@ -947,7 +947,7 @@ struct ahash_alg mv_md5_alg = {
.base = { .base = {
.cra_name = "md5", .cra_name = "md5",
.cra_driver_name = "mv-md5", .cra_driver_name = "mv-md5",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,
@@ -1018,7 +1018,7 @@ struct ahash_alg mv_sha1_alg = {
.base = { .base = {
.cra_name = "sha1", .cra_name = "sha1",
.cra_driver_name = "mv-sha1", .cra_driver_name = "mv-sha1",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,
@@ -1092,7 +1092,7 @@ struct ahash_alg mv_sha256_alg = {
.base = { .base = {
.cra_name = "sha256", .cra_name = "sha256",
.cra_driver_name = "mv-sha256", .cra_driver_name = "mv-sha256",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,
@@ -1327,7 +1327,7 @@ struct ahash_alg mv_ahmac_md5_alg = {
.base = { .base = {
.cra_name = "hmac(md5)", .cra_name = "hmac(md5)",
.cra_driver_name = "mv-hmac-md5", .cra_driver_name = "mv-hmac-md5",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,
@@ -1398,7 +1398,7 @@ struct ahash_alg mv_ahmac_sha1_alg = {
.base = { .base = {
.cra_name = "hmac(sha1)", .cra_name = "hmac(sha1)",
.cra_driver_name = "mv-hmac-sha1", .cra_driver_name = "mv-hmac-sha1",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,
@@ -1469,7 +1469,7 @@ struct ahash_alg mv_ahmac_sha256_alg = {
.base = { .base = {
.cra_name = "hmac(sha256)", .cra_name = "hmac(sha256)",
.cra_driver_name = "mv-hmac-sha256", .cra_driver_name = "mv-hmac-sha256",
.cra_priority = 300, .cra_priority = 0,
.cra_flags = CRYPTO_ALG_ASYNC | .cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_ALLOCATES_MEMORY | CRYPTO_ALG_ALLOCATES_MEMORY |
CRYPTO_ALG_KERN_DRIVER_ONLY, CRYPTO_ALG_KERN_DRIVER_ONLY,

View File

@@ -132,8 +132,8 @@ static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif,
&buffer); &buffer);
obj = (union acpi_object *)buffer.pointer; obj = (union acpi_object *)buffer.pointer;
/* Fail if calling the method fails and ATIF is supported */ /* Fail if calling the method fails */
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { if (ACPI_FAILURE(status)) {
DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n", DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
acpi_format_exception(status)); acpi_format_exception(status));
kfree(obj); kfree(obj);

View File

@@ -344,15 +344,15 @@ allocate_mem_reserve_bo_failed:
return r; return r;
} }
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj) void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)
{ {
struct amdgpu_bo *bo = (struct amdgpu_bo *) mem_obj; struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;
amdgpu_bo_reserve(bo, true); amdgpu_bo_reserve(*bo, true);
amdgpu_bo_kunmap(bo); amdgpu_bo_kunmap(*bo);
amdgpu_bo_unpin(bo); amdgpu_bo_unpin(*bo);
amdgpu_bo_unreserve(bo); amdgpu_bo_unreserve(*bo);
amdgpu_bo_unref(&(bo)); amdgpu_bo_unref(bo);
} }
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size, int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,

View File

@@ -210,7 +210,7 @@ int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm)
int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size, int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
void **mem_obj, uint64_t *gpu_addr, void **mem_obj, uint64_t *gpu_addr,
void **cpu_ptr, bool mqd_gfx9); void **cpu_ptr, bool mqd_gfx9);
void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj); void amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj);
int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size, int amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
void **mem_obj); void **mem_obj);
void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj); void amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj);

View File

@@ -419,7 +419,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
ssize_t result = 0; ssize_t result = 0;
int r; int r;
if (size & 0x3 || *pos & 0x3) if (size > 4096 || size & 0x3 || *pos & 0x3)
return -EINVAL; return -EINVAL;
r = pm_runtime_get_sync(adev_to_drm(adev)->dev); r = pm_runtime_get_sync(adev_to_drm(adev)->dev);
@@ -2009,11 +2009,11 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)
amdgpu_securedisplay_debugfs_init(adev); amdgpu_securedisplay_debugfs_init(adev);
amdgpu_fw_attestation_debugfs_init(adev); amdgpu_fw_attestation_debugfs_init(adev);
debugfs_create_file("amdgpu_evict_vram", 0444, root, adev, debugfs_create_file("amdgpu_evict_vram", 0400, root, adev,
&amdgpu_evict_vram_fops); &amdgpu_evict_vram_fops);
debugfs_create_file("amdgpu_evict_gtt", 0444, root, adev, debugfs_create_file("amdgpu_evict_gtt", 0400, root, adev,
&amdgpu_evict_gtt_fops); &amdgpu_evict_gtt_fops);
debugfs_create_file("amdgpu_test_ib", 0444, root, adev, debugfs_create_file("amdgpu_test_ib", 0400, root, adev,
&amdgpu_debugfs_test_ib_fops); &amdgpu_debugfs_test_ib_fops);
debugfs_create_file("amdgpu_vm_info", 0444, root, adev, debugfs_create_file("amdgpu_vm_info", 0444, root, adev,
&amdgpu_debugfs_vm_info_fops); &amdgpu_debugfs_vm_info_fops);

View File

@@ -408,7 +408,7 @@ static int kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p,
err_create_queue: err_create_queue:
if (wptr_bo) if (wptr_bo)
amdgpu_amdkfd_free_gtt_mem(dev->adev, wptr_bo); amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&wptr_bo);
err_wptr_map_gart: err_wptr_map_gart:
err_alloc_doorbells: err_alloc_doorbells:
err_bind_process: err_bind_process:

View File

@@ -673,7 +673,7 @@ kfd_interrupt_error:
kfd_doorbell_error: kfd_doorbell_error:
kfd_gtt_sa_fini(kfd); kfd_gtt_sa_fini(kfd);
kfd_gtt_sa_init_error: kfd_gtt_sa_init_error:
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem); amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
alloc_gtt_mem_failure: alloc_gtt_mem_failure:
if (kfd->gws) if (kfd->gws)
amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws); amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);
@@ -693,7 +693,7 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
kfd_doorbell_fini(kfd); kfd_doorbell_fini(kfd);
ida_destroy(&kfd->doorbell_ida); ida_destroy(&kfd->doorbell_ida);
kfd_gtt_sa_fini(kfd); kfd_gtt_sa_fini(kfd);
amdgpu_amdkfd_free_gtt_mem(kfd->adev, kfd->gtt_mem); amdgpu_amdkfd_free_gtt_mem(kfd->adev, &kfd->gtt_mem);
if (kfd->gws) if (kfd->gws)
amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws); amdgpu_amdkfd_free_gws(kfd->adev, kfd->gws);
} }

View File

@@ -2392,7 +2392,7 @@ static void deallocate_hiq_sdma_mqd(struct kfd_dev *dev,
{ {
WARN(!mqd, "No hiq sdma mqd trunk to free"); WARN(!mqd, "No hiq sdma mqd trunk to free");
amdgpu_amdkfd_free_gtt_mem(dev->adev, mqd->gtt_mem); amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
} }
void device_queue_manager_uninit(struct device_queue_manager *dqm) void device_queue_manager_uninit(struct device_queue_manager *dqm)

View File

@@ -204,7 +204,7 @@ void kfd_free_mqd_cp(struct mqd_manager *mm, void *mqd,
struct kfd_mem_obj *mqd_mem_obj) struct kfd_mem_obj *mqd_mem_obj)
{ {
if (mqd_mem_obj->gtt_mem) { if (mqd_mem_obj->gtt_mem) {
amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, mqd_mem_obj->gtt_mem); amdgpu_amdkfd_free_gtt_mem(mm->dev->adev, &mqd_mem_obj->gtt_mem);
kfree(mqd_mem_obj); kfree(mqd_mem_obj);
} else { } else {
kfd_gtt_sa_free(mm->dev, mqd_mem_obj); kfd_gtt_sa_free(mm->dev, mqd_mem_obj);

View File

@@ -1052,7 +1052,7 @@ static void kfd_process_destroy_pdds(struct kfd_process *p)
if (pdd->dev->shared_resources.enable_mes) if (pdd->dev->shared_resources.enable_mes)
amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev, amdgpu_amdkfd_free_gtt_mem(pdd->dev->adev,
pdd->proc_ctx_bo); &pdd->proc_ctx_bo);
/* /*
* before destroying pdd, make sure to report availability * before destroying pdd, make sure to report availability
* for auto suspend * for auto suspend

View File

@@ -441,9 +441,9 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)
if (dev->shared_resources.enable_mes) { if (dev->shared_resources.enable_mes) {
amdgpu_amdkfd_free_gtt_mem(dev->adev, amdgpu_amdkfd_free_gtt_mem(dev->adev,
pqn->q->gang_ctx_bo); &pqn->q->gang_ctx_bo);
if (pqn->q->wptr_bo) if (pqn->q->wptr_bo)
amdgpu_amdkfd_free_gtt_mem(dev->adev, pqn->q->wptr_bo); amdgpu_amdkfd_free_gtt_mem(dev->adev, (void **)&pqn->q->wptr_bo);
} }
uninit_queue(pqn->q); uninit_queue(pqn->q);

View File

@@ -2990,6 +2990,10 @@ static int dm_resume(void *handle)
/* Do mst topology probing after resuming cached state*/ /* Do mst topology probing after resuming cached state*/
drm_connector_list_iter_begin(ddev, &iter); drm_connector_list_iter_begin(ddev, &iter);
drm_for_each_connector_iter(connector, &iter) { drm_for_each_connector_iter(connector, &iter) {
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
if (aconnector->dc_link->type != dc_connection_mst_branch || if (aconnector->dc_link->type != dc_connection_mst_branch ||
aconnector->mst_port) aconnector->mst_port)
@@ -5722,6 +5726,9 @@ get_highest_refresh_rate_mode(struct amdgpu_dm_connector *aconnector,
&aconnector->base.probed_modes : &aconnector->base.probed_modes :
&aconnector->base.modes; &aconnector->base.modes;
if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
return NULL;
if (aconnector->freesync_vid_base.clock != 0) if (aconnector->freesync_vid_base.clock != 0)
return &aconnector->freesync_vid_base; return &aconnector->freesync_vid_base;
@@ -8242,6 +8249,9 @@ static void amdgpu_dm_commit_audio(struct drm_device *dev,
continue; continue;
notify: notify:
if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
continue;
aconnector = to_amdgpu_dm_connector(connector); aconnector = to_amdgpu_dm_connector(connector);
mutex_lock(&adev->dm.audio_lock); mutex_lock(&adev->dm.audio_lock);

View File

@@ -762,6 +762,9 @@ bool dcn30_apply_idle_power_optimizations(struct dc *dc, bool enable)
stream = dc->current_state->streams[0]; stream = dc->current_state->streams[0];
plane = (stream ? dc->current_state->stream_status[0].plane_states[0] : NULL); plane = (stream ? dc->current_state->stream_status[0].plane_states[0] : NULL);
if (!stream || !plane)
return false;
if (stream && plane) { if (stream && plane) {
cursor_cache_enable = stream->cursor_position.enable && cursor_cache_enable = stream->cursor_position.enable &&
plane->address.grph.cursor_cache_addr.quad_part; plane->address.grph.cursor_cache_addr.quad_part;

View File

@@ -59,7 +59,7 @@
#define VMWGFX_DRIVER_MINOR 20 #define VMWGFX_DRIVER_MINOR 20
#define VMWGFX_DRIVER_PATCHLEVEL 0 #define VMWGFX_DRIVER_PATCHLEVEL 0
#define VMWGFX_FIFO_STATIC_SIZE (1024*1024) #define VMWGFX_FIFO_STATIC_SIZE (1024*1024)
#define VMWGFX_MAX_DISPLAYS 16 #define VMWGFX_NUM_DISPLAY_UNITS 8
#define VMWGFX_CMD_BOUNCE_INIT_SIZE 32768 #define VMWGFX_CMD_BOUNCE_INIT_SIZE 32768
#define VMWGFX_MIN_INITIAL_WIDTH 1280 #define VMWGFX_MIN_INITIAL_WIDTH 1280
@@ -79,7 +79,7 @@
#define VMWGFX_NUM_GB_CONTEXT 256 #define VMWGFX_NUM_GB_CONTEXT 256
#define VMWGFX_NUM_GB_SHADER 20000 #define VMWGFX_NUM_GB_SHADER 20000
#define VMWGFX_NUM_GB_SURFACE 32768 #define VMWGFX_NUM_GB_SURFACE 32768
#define VMWGFX_NUM_GB_SCREEN_TARGET VMWGFX_MAX_DISPLAYS #define VMWGFX_NUM_GB_SCREEN_TARGET VMWGFX_NUM_DISPLAY_UNITS
#define VMWGFX_NUM_DXCONTEXT 256 #define VMWGFX_NUM_DXCONTEXT 256
#define VMWGFX_NUM_DXQUERY 512 #define VMWGFX_NUM_DXQUERY 512
#define VMWGFX_NUM_MOB (VMWGFX_NUM_GB_CONTEXT +\ #define VMWGFX_NUM_MOB (VMWGFX_NUM_GB_CONTEXT +\

View File

@@ -2261,7 +2261,7 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
struct drm_mode_config *mode_config = &dev->mode_config; struct drm_mode_config *mode_config = &dev->mode_config;
struct drm_vmw_update_layout_arg *arg = struct drm_vmw_update_layout_arg *arg =
(struct drm_vmw_update_layout_arg *)data; (struct drm_vmw_update_layout_arg *)data;
void __user *user_rects; const void __user *user_rects;
struct drm_vmw_rect *rects; struct drm_vmw_rect *rects;
struct drm_rect *drm_rects; struct drm_rect *drm_rects;
unsigned rects_size; unsigned rects_size;
@@ -2273,6 +2273,8 @@ int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data,
VMWGFX_MIN_INITIAL_HEIGHT}; VMWGFX_MIN_INITIAL_HEIGHT};
vmw_du_update_layout(dev_priv, 1, &def_rect); vmw_du_update_layout(dev_priv, 1, &def_rect);
return 0; return 0;
} else if (arg->num_outputs > VMWGFX_NUM_DISPLAY_UNITS) {
return -E2BIG;
} }
rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect); rects_size = arg->num_outputs * sizeof(struct drm_vmw_rect);

View File

@@ -199,9 +199,6 @@ struct vmw_kms_dirty {
s32 unit_y2; s32 unit_y2;
}; };
#define VMWGFX_NUM_DISPLAY_UNITS 8
#define vmw_framebuffer_to_vfb(x) \ #define vmw_framebuffer_to_vfb(x) \
container_of(x, struct vmw_framebuffer, base) container_of(x, struct vmw_framebuffer, base)
#define vmw_framebuffer_to_vfbs(x) \ #define vmw_framebuffer_to_vfbs(x) \

View File

@@ -859,6 +859,7 @@
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1 0xc539 #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1 0xc539
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_LIGHTSPEED_1_1 0xc53f
#define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY 0xc53a #define USB_DEVICE_ID_LOGITECH_NANO_RECEIVER_POWERPLAY 0xc53a
#define USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER 0xc548
#define USB_DEVICE_ID_SPACETRAVELLER 0xc623 #define USB_DEVICE_ID_SPACETRAVELLER 0xc623
#define USB_DEVICE_ID_SPACENAVIGATOR 0xc626 #define USB_DEVICE_ID_SPACENAVIGATOR 0xc626
#define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704 #define USB_DEVICE_ID_DINOVO_DESKTOP 0xc704

View File

@@ -473,6 +473,7 @@ static int lenovo_input_mapping(struct hid_device *hdev,
return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field, return lenovo_input_mapping_tp10_ultrabook_kbd(hdev, hi, field,
usage, bit, max); usage, bit, max);
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max); return lenovo_input_mapping_x1_tab_kbd(hdev, hi, field, usage, bit, max);
default: default:
return 0; return 0;
@@ -583,6 +584,7 @@ static ssize_t attr_fn_lock_store(struct device *dev,
break; break;
case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_TP10UBKBD:
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value); ret = lenovo_led_set_tp10ubkbd(hdev, TP10UBKBD_FN_LOCK_LED, value);
if (ret) if (ret)
return ret; return ret;
@@ -777,6 +779,7 @@ static int lenovo_event(struct hid_device *hdev, struct hid_field *field,
return lenovo_event_cptkbd(hdev, field, usage, value); return lenovo_event_cptkbd(hdev, field, usage, value);
case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_TP10UBKBD:
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
return lenovo_event_tp10ubkbd(hdev, field, usage, value); return lenovo_event_tp10ubkbd(hdev, field, usage, value);
default: default:
return 0; return 0;
@@ -1059,6 +1062,7 @@ static int lenovo_led_brightness_set(struct led_classdev *led_cdev,
break; break;
case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_TP10UBKBD:
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value); ret = lenovo_led_set_tp10ubkbd(hdev, tp10ubkbd_led[led_nr], value);
break; break;
} }
@@ -1289,6 +1293,7 @@ static int lenovo_probe(struct hid_device *hdev,
break; break;
case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_TP10UBKBD:
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
ret = lenovo_probe_tp10ubkbd(hdev); ret = lenovo_probe_tp10ubkbd(hdev);
break; break;
default: default:
@@ -1375,6 +1380,7 @@ static void lenovo_remove(struct hid_device *hdev)
break; break;
case USB_DEVICE_ID_LENOVO_TP10UBKBD: case USB_DEVICE_ID_LENOVO_TP10UBKBD:
case USB_DEVICE_ID_LENOVO_X1_TAB: case USB_DEVICE_ID_LENOVO_X1_TAB:
case USB_DEVICE_ID_LENOVO_X1_TAB3:
lenovo_remove_tp10ubkbd(hdev); lenovo_remove_tp10ubkbd(hdev);
break; break;
} }
@@ -1424,6 +1430,8 @@ static const struct hid_device_id lenovo_devices[] = {
*/ */
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC, { HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) }, USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB) },
{ HID_DEVICE(BUS_USB, HID_GROUP_GENERIC,
USB_VENDOR_ID_LENOVO, USB_DEVICE_ID_LENOVO_X1_TAB3) },
{ } { }
}; };

View File

@@ -2020,6 +2020,10 @@ static const struct hid_device_id mt_devices[] = {
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_ELAN, 0x3148) }, USB_VENDOR_ID_ELAN, 0x3148) },
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_ELAN, 0x32ae) },
/* Elitegroup panel */ /* Elitegroup panel */
{ .driver_data = MT_CLS_SERIAL, { .driver_data = MT_CLS_SERIAL,
MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP, MT_USB_DEVICE(USB_VENDOR_ID_ELITEGROUP,
@@ -2089,6 +2093,11 @@ static const struct hid_device_id mt_devices[] = {
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8, HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
0x347d, 0x7853) }, 0x347d, 0x7853) },
/* HONOR MagicBook Art 14 touchpad */
{ .driver_data = MT_CLS_VTL,
HID_DEVICE(BUS_I2C, HID_GROUP_MULTITOUCH_WIN_8,
0x35cc, 0x0104) },
/* Ilitek dual touch panel */ /* Ilitek dual touch panel */
{ .driver_data = MT_CLS_NSMU, { .driver_data = MT_CLS_NSMU,
MT_USB_DEVICE(USB_VENDOR_ID_ILITEK, MT_USB_DEVICE(USB_VENDOR_ID_ILITEK,
@@ -2131,6 +2140,10 @@ static const struct hid_device_id mt_devices[] = {
HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8, HID_DEVICE(BUS_BLUETOOTH, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_LOGITECH, USB_VENDOR_ID_LOGITECH,
USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD) }, USB_DEVICE_ID_LOGITECH_CASA_TOUCHPAD) },
{ .driver_data = MT_CLS_WIN_8_FORCE_MULTI_INPUT_NSMU,
HID_DEVICE(BUS_USB, HID_GROUP_MULTITOUCH_WIN_8,
USB_VENDOR_ID_LOGITECH,
USB_DEVICE_ID_LOGITECH_BOLT_RECEIVER) },
/* MosArt panels */ /* MosArt panels */
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,

View File

@@ -1014,7 +1014,8 @@ int bnxt_qplib_create_qp(struct bnxt_qplib_res *res, struct bnxt_qplib_qp *qp)
hwq_attr.stride = sizeof(struct sq_sge); hwq_attr.stride = sizeof(struct sq_sge);
hwq_attr.depth = bnxt_qplib_get_depth(sq); hwq_attr.depth = bnxt_qplib_get_depth(sq);
hwq_attr.aux_stride = psn_sz; hwq_attr.aux_stride = psn_sz;
hwq_attr.aux_depth = bnxt_qplib_set_sq_size(sq, qp->wqe_mode); hwq_attr.aux_depth = psn_sz ? bnxt_qplib_set_sq_size(sq, qp->wqe_mode)
: 0;
hwq_attr.type = HWQ_TYPE_QUEUE; hwq_attr.type = HWQ_TYPE_QUEUE;
rc = bnxt_qplib_alloc_init_hwq(&sq->hwq, &hwq_attr); rc = bnxt_qplib_alloc_init_hwq(&sq->hwq, &hwq_attr);
if (rc) if (rc)

View File

@@ -425,6 +425,13 @@ static int gic_irq_set_irqchip_state(struct irq_data *d,
} }
gic_poke_irq(d, reg); gic_poke_irq(d, reg);
/*
* Force read-back to guarantee that the active state has taken
* effect, and won't race with a guest-driven deactivation.
*/
if (reg == GICD_ISACTIVER)
gic_peek_irq(d, reg);
return 0; return 0;
} }

View File

@@ -37,7 +37,7 @@ static struct chip_props ocelot_props = {
.reg_off_ena_clr = 0x1c, .reg_off_ena_clr = 0x1c,
.reg_off_ena_set = 0x20, .reg_off_ena_set = 0x20,
.reg_off_ident = 0x38, .reg_off_ident = 0x38,
.reg_off_trigger = 0x5c, .reg_off_trigger = 0x4,
.n_irq = 24, .n_irq = 24,
}; };
@@ -70,7 +70,7 @@ static struct chip_props jaguar2_props = {
.reg_off_ena_clr = 0x1c, .reg_off_ena_clr = 0x1c,
.reg_off_ena_set = 0x20, .reg_off_ena_set = 0x20,
.reg_off_ident = 0x38, .reg_off_ident = 0x38,
.reg_off_trigger = 0x5c, .reg_off_trigger = 0x4,
.n_irq = 29, .n_irq = 29,
}; };

View File

@@ -1882,16 +1882,13 @@ static void check_migrations(struct work_struct *ws)
* This function gets called on the error paths of the constructor, so we * This function gets called on the error paths of the constructor, so we
* have to cope with a partially initialised struct. * have to cope with a partially initialised struct.
*/ */
static void destroy(struct cache *cache) static void __destroy(struct cache *cache)
{ {
unsigned int i;
mempool_exit(&cache->migration_pool); mempool_exit(&cache->migration_pool);
if (cache->prison) if (cache->prison)
dm_bio_prison_destroy_v2(cache->prison); dm_bio_prison_destroy_v2(cache->prison);
cancel_delayed_work_sync(&cache->waker);
if (cache->wq) if (cache->wq)
destroy_workqueue(cache->wq); destroy_workqueue(cache->wq);
@@ -1919,13 +1916,22 @@ static void destroy(struct cache *cache)
if (cache->policy) if (cache->policy)
dm_cache_policy_destroy(cache->policy); dm_cache_policy_destroy(cache->policy);
bioset_exit(&cache->bs);
kfree(cache);
}
static void destroy(struct cache *cache)
{
unsigned int i;
cancel_delayed_work_sync(&cache->waker);
for (i = 0; i < cache->nr_ctr_args ; i++) for (i = 0; i < cache->nr_ctr_args ; i++)
kfree(cache->ctr_args[i]); kfree(cache->ctr_args[i]);
kfree(cache->ctr_args); kfree(cache->ctr_args);
bioset_exit(&cache->bs); __destroy(cache);
kfree(cache);
} }
static void cache_dtr(struct dm_target *ti) static void cache_dtr(struct dm_target *ti)
@@ -1980,7 +1986,6 @@ struct cache_args {
sector_t cache_sectors; sector_t cache_sectors;
struct dm_dev *origin_dev; struct dm_dev *origin_dev;
sector_t origin_sectors;
uint32_t block_size; uint32_t block_size;
@@ -2061,6 +2066,7 @@ static int parse_cache_dev(struct cache_args *ca, struct dm_arg_set *as,
static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as, static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as,
char **error) char **error)
{ {
sector_t origin_sectors;
int r; int r;
if (!at_least_one_arg(as, error)) if (!at_least_one_arg(as, error))
@@ -2073,8 +2079,8 @@ static int parse_origin_dev(struct cache_args *ca, struct dm_arg_set *as,
return r; return r;
} }
ca->origin_sectors = get_dev_size(ca->origin_dev); origin_sectors = get_dev_size(ca->origin_dev);
if (ca->ti->len > ca->origin_sectors) { if (ca->ti->len > origin_sectors) {
*error = "Device size larger than cached device"; *error = "Device size larger than cached device";
return -EINVAL; return -EINVAL;
} }
@@ -2384,7 +2390,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)
ca->metadata_dev = ca->origin_dev = ca->cache_dev = NULL; ca->metadata_dev = ca->origin_dev = ca->cache_dev = NULL;
origin_blocks = cache->origin_sectors = ca->origin_sectors; origin_blocks = cache->origin_sectors = ti->len;
origin_blocks = block_div(origin_blocks, ca->block_size); origin_blocks = block_div(origin_blocks, ca->block_size);
cache->origin_blocks = to_oblock(origin_blocks); cache->origin_blocks = to_oblock(origin_blocks);
@@ -2538,7 +2544,7 @@ static int cache_create(struct cache_args *ca, struct cache **result)
*result = cache; *result = cache;
return 0; return 0;
bad: bad:
destroy(cache); __destroy(cache);
return r; return r;
} }
@@ -2589,7 +2595,7 @@ static int cache_ctr(struct dm_target *ti, unsigned int argc, char **argv)
r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3); r = copy_ctr_args(cache, argc - 3, (const char **)argv + 3);
if (r) { if (r) {
destroy(cache); __destroy(cache);
goto out; goto out;
} }
@@ -2872,19 +2878,19 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
static bool can_resize(struct cache *cache, dm_cblock_t new_size) static bool can_resize(struct cache *cache, dm_cblock_t new_size)
{ {
if (from_cblock(new_size) > from_cblock(cache->cache_size)) { if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
if (cache->sized) { DMERR("%s: unable to extend cache due to missing cache table reload",
DMERR("%s: unable to extend cache due to missing cache table reload", cache_device_name(cache));
cache_device_name(cache)); return false;
return false;
}
} }
/* /*
* We can't drop a dirty block when shrinking the cache. * We can't drop a dirty block when shrinking the cache.
*/ */
while (from_cblock(new_size) < from_cblock(cache->cache_size)) { if (cache->loaded_mappings) {
new_size = to_cblock(from_cblock(new_size) + 1); new_size = to_cblock(find_next_bit(cache->dirty_bitset,
if (is_dirty(cache, new_size)) { from_cblock(cache->cache_size),
from_cblock(new_size)));
if (new_size != cache->cache_size) {
DMERR("%s: unable to shrink cache; cache block %llu is dirty", DMERR("%s: unable to shrink cache; cache block %llu is dirty",
cache_device_name(cache), cache_device_name(cache),
(unsigned long long) from_cblock(new_size)); (unsigned long long) from_cblock(new_size));
@@ -2920,20 +2926,15 @@ static int cache_preresume(struct dm_target *ti)
/* /*
* Check to see if the cache has resized. * Check to see if the cache has resized.
*/ */
if (!cache->sized) { if (!cache->sized || csize != cache->cache_size) {
r = resize_cache_dev(cache, csize);
if (r)
return r;
cache->sized = true;
} else if (csize != cache->cache_size) {
if (!can_resize(cache, csize)) if (!can_resize(cache, csize))
return -EINVAL; return -EINVAL;
r = resize_cache_dev(cache, csize); r = resize_cache_dev(cache, csize);
if (r) if (r)
return r; return r;
cache->sized = true;
} }
if (!cache->loaded_mappings) { if (!cache->loaded_mappings) {

View File

@@ -84,8 +84,8 @@ static int unstripe_ctr(struct dm_target *ti, unsigned int argc, char **argv)
} }
uc->physical_start = start; uc->physical_start = start;
uc->unstripe_offset = uc->unstripe * uc->chunk_size; uc->unstripe_offset = (sector_t)uc->unstripe * uc->chunk_size;
uc->unstripe_width = (uc->stripes - 1) * uc->chunk_size; uc->unstripe_width = (sector_t)(uc->stripes - 1) * uc->chunk_size;
uc->chunk_shift = is_power_of_2(uc->chunk_size) ? fls(uc->chunk_size) - 1 : 0; uc->chunk_shift = is_power_of_2(uc->chunk_size) ? fls(uc->chunk_size) - 1 : 0;
tmp_len = ti->len; tmp_len = ti->len;

View File

@@ -3432,7 +3432,6 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
sector_t sect; sector_t sect;
int must_sync; int must_sync;
int any_working; int any_working;
int need_recover = 0;
struct raid10_info *mirror = &conf->mirrors[i]; struct raid10_info *mirror = &conf->mirrors[i];
struct md_rdev *mrdev, *mreplace; struct md_rdev *mrdev, *mreplace;
@@ -3440,14 +3439,13 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
mrdev = rcu_dereference(mirror->rdev); mrdev = rcu_dereference(mirror->rdev);
mreplace = rcu_dereference(mirror->replacement); mreplace = rcu_dereference(mirror->replacement);
if (mrdev != NULL && if (mrdev && (test_bit(Faulty, &mrdev->flags) ||
!test_bit(Faulty, &mrdev->flags) && test_bit(In_sync, &mrdev->flags)))
!test_bit(In_sync, &mrdev->flags)) mrdev = NULL;
need_recover = 1;
if (mreplace && test_bit(Faulty, &mreplace->flags)) if (mreplace && test_bit(Faulty, &mreplace->flags))
mreplace = NULL; mreplace = NULL;
if (!need_recover && !mreplace) { if (!mrdev && !mreplace) {
rcu_read_unlock(); rcu_read_unlock();
continue; continue;
} }
@@ -3481,7 +3479,8 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
rcu_read_unlock(); rcu_read_unlock();
continue; continue;
} }
atomic_inc(&mrdev->nr_pending); if (mrdev)
atomic_inc(&mrdev->nr_pending);
if (mreplace) if (mreplace)
atomic_inc(&mreplace->nr_pending); atomic_inc(&mreplace->nr_pending);
rcu_read_unlock(); rcu_read_unlock();
@@ -3568,7 +3567,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
r10_bio->devs[1].devnum = i; r10_bio->devs[1].devnum = i;
r10_bio->devs[1].addr = to_addr; r10_bio->devs[1].addr = to_addr;
if (need_recover) { if (mrdev) {
bio = r10_bio->devs[1].bio; bio = r10_bio->devs[1].bio;
bio->bi_next = biolist; bio->bi_next = biolist;
biolist = bio; biolist = bio;
@@ -3613,7 +3612,7 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
for (k = 0; k < conf->copies; k++) for (k = 0; k < conf->copies; k++)
if (r10_bio->devs[k].devnum == i) if (r10_bio->devs[k].devnum == i)
break; break;
if (!test_bit(In_sync, if (mrdev && !test_bit(In_sync,
&mrdev->flags) &mrdev->flags)
&& !rdev_set_badblocks( && !rdev_set_badblocks(
mrdev, mrdev,
@@ -3639,12 +3638,14 @@ static sector_t raid10_sync_request(struct mddev *mddev, sector_t sector_nr,
if (rb2) if (rb2)
atomic_dec(&rb2->remaining); atomic_dec(&rb2->remaining);
r10_bio = rb2; r10_bio = rb2;
rdev_dec_pending(mrdev, mddev); if (mrdev)
rdev_dec_pending(mrdev, mddev);
if (mreplace) if (mreplace)
rdev_dec_pending(mreplace, mddev); rdev_dec_pending(mreplace, mddev);
break; break;
} }
rdev_dec_pending(mrdev, mddev); if (mrdev)
rdev_dec_pending(mrdev, mddev);
if (mreplace) if (mreplace)
rdev_dec_pending(mreplace, mddev); rdev_dec_pending(mreplace, mddev);
if (r10_bio->devs[0].bio->bi_opf & MD_FAILFAST) { if (r10_bio->devs[0].bio->bi_opf & MD_FAILFAST) {

View File

@@ -685,7 +685,7 @@ static int pulse8_setup(struct pulse8 *pulse8, struct serio *serio,
err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4); err = pulse8_send_and_wait(pulse8, cmd, 1, cmd[0], 4);
if (err) if (err)
return err; return err;
date = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; date = ((unsigned)data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];
dev_info(pulse8->dev, "Firmware build date %ptT\n", &date); dev_info(pulse8->dev, "Firmware build date %ptT\n", &date);
dev_dbg(pulse8->dev, "Persistent config:\n"); dev_dbg(pulse8->dev, "Persistent config:\n");

View File

@@ -1795,6 +1795,9 @@ static void tpg_precalculate_line(struct tpg_data *tpg)
unsigned p; unsigned p;
unsigned x; unsigned x;
if (WARN_ON_ONCE(!tpg->src_width || !tpg->scaled_width))
return;
switch (tpg->pattern) { switch (tpg->pattern) {
case TPG_PAT_GREEN: case TPG_PAT_GREEN:
contrast = TPG_COLOR_100_RED; contrast = TPG_COLOR_100_RED;

View File

@@ -443,8 +443,8 @@ static int dvb_frontend_swzigzag_autotune(struct dvb_frontend *fe, int check_wra
default: default:
fepriv->auto_step++; fepriv->auto_step++;
fepriv->auto_sub_step = -1; /* it'll be incremented to 0 in a moment */ fepriv->auto_sub_step = 0;
break; continue;
} }
if (!ready) fepriv->auto_sub_step++; if (!ready) fepriv->auto_sub_step++;

View File

@@ -86,10 +86,15 @@ static DECLARE_RWSEM(minor_rwsem);
static int dvb_device_open(struct inode *inode, struct file *file) static int dvb_device_open(struct inode *inode, struct file *file)
{ {
struct dvb_device *dvbdev; struct dvb_device *dvbdev;
unsigned int minor = iminor(inode);
if (minor >= MAX_DVB_MINORS)
return -ENODEV;
mutex_lock(&dvbdev_mutex); mutex_lock(&dvbdev_mutex);
down_read(&minor_rwsem); down_read(&minor_rwsem);
dvbdev = dvb_minors[iminor(inode)];
dvbdev = dvb_minors[minor];
if (dvbdev && dvbdev->fops) { if (dvbdev && dvbdev->fops) {
int err = 0; int err = 0;
@@ -529,7 +534,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
for (minor = 0; minor < MAX_DVB_MINORS; minor++) for (minor = 0; minor < MAX_DVB_MINORS; minor++)
if (dvb_minors[minor] == NULL) if (dvb_minors[minor] == NULL)
break; break;
if (minor == MAX_DVB_MINORS) { if (minor >= MAX_DVB_MINORS) {
if (new_node) { if (new_node) {
list_del (&new_node->list_head); list_del (&new_node->list_head);
kfree(dvbdevfops); kfree(dvbdevfops);
@@ -544,6 +549,14 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
} }
#else #else
minor = nums2minor(adap->num, type, id); minor = nums2minor(adap->num, type, id);
if (minor >= MAX_DVB_MINORS) {
dvb_media_device_free(dvbdev);
list_del(&dvbdev->list_head);
kfree(dvbdev);
*pdvbdev = NULL;
mutex_unlock(&dvbdev_register_lock);
return ret;
}
#endif #endif
dvbdev->minor = minor; dvbdev->minor = minor;
dvb_minors[minor] = dvb_device_get(dvbdev); dvb_minors[minor] = dvb_device_get(dvbdev);

View File

@@ -741,6 +741,7 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
{ {
struct cx24116_state *state = fe->demodulator_priv; struct cx24116_state *state = fe->demodulator_priv;
u8 snr_reading; u8 snr_reading;
int ret;
static const u32 snr_tab[] = { /* 10 x Table (rounded up) */ static const u32 snr_tab[] = { /* 10 x Table (rounded up) */
0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667, 0x00000, 0x0199A, 0x03333, 0x04ccD, 0x06667,
0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667, 0x08000, 0x0999A, 0x0b333, 0x0cccD, 0x0e667,
@@ -749,7 +750,11 @@ static int cx24116_read_snr_pct(struct dvb_frontend *fe, u16 *snr)
dprintk("%s()\n", __func__); dprintk("%s()\n", __func__);
snr_reading = cx24116_readreg(state, CX24116_REG_QUALITY0); ret = cx24116_readreg(state, CX24116_REG_QUALITY0);
if (ret < 0)
return ret;
snr_reading = ret;
if (snr_reading >= 0xa0 /* 100% */) if (snr_reading >= 0xa0 /* 100% */)
*snr = 0xffff; *snr = 0xffff;

View File

@@ -269,7 +269,7 @@ static enum stb0899_status stb0899_search_carrier(struct stb0899_state *state)
short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3; short int derot_freq = 0, last_derot_freq = 0, derot_limit, next_loop = 3;
int index = 0; int index = 0;
u8 cfr[2]; u8 cfr[2] = {0};
u8 reg; u8 reg;
internal->status = NOCARRIER; internal->status = NOCARRIER;

View File

@@ -2516,10 +2516,10 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
const struct adv76xx_chip_info *info = state->info; const struct adv76xx_chip_info *info = state->info;
struct v4l2_dv_timings timings; struct v4l2_dv_timings timings;
struct stdi_readback stdi; struct stdi_readback stdi;
u8 reg_io_0x02 = io_read(sd, 0x02); int ret;
u8 reg_io_0x02;
u8 edid_enabled; u8 edid_enabled;
u8 cable_det; u8 cable_det;
static const char * const csc_coeff_sel_rb[16] = { static const char * const csc_coeff_sel_rb[16] = {
"bypassed", "YPbPr601 -> RGB", "reserved", "YPbPr709 -> RGB", "bypassed", "YPbPr601 -> RGB", "reserved", "YPbPr709 -> RGB",
"reserved", "RGB -> YPbPr601", "reserved", "RGB -> YPbPr709", "reserved", "RGB -> YPbPr601", "reserved", "RGB -> YPbPr709",
@@ -2618,13 +2618,21 @@ static int adv76xx_log_status(struct v4l2_subdev *sd)
v4l2_info(sd, "-----Color space-----\n"); v4l2_info(sd, "-----Color space-----\n");
v4l2_info(sd, "RGB quantization range ctrl: %s\n", v4l2_info(sd, "RGB quantization range ctrl: %s\n",
rgb_quantization_range_txt[state->rgb_quantization_range]); rgb_quantization_range_txt[state->rgb_quantization_range]);
v4l2_info(sd, "Input color space: %s\n",
input_color_space_txt[reg_io_0x02 >> 4]); ret = io_read(sd, 0x02);
v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n", if (ret < 0) {
(reg_io_0x02 & 0x02) ? "RGB" : "YCbCr", v4l2_info(sd, "Can't read Input/Output color space\n");
(((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 0x01)) ? } else {
"(16-235)" : "(0-255)", reg_io_0x02 = ret;
(reg_io_0x02 & 0x08) ? "enabled" : "disabled");
v4l2_info(sd, "Input color space: %s\n",
input_color_space_txt[reg_io_0x02 >> 4]);
v4l2_info(sd, "Output color space: %s %s, alt-gamma %s\n",
(reg_io_0x02 & 0x02) ? "RGB" : "YCbCr",
(((reg_io_0x02 >> 2) & 0x01) ^ (reg_io_0x02 & 0x01)) ?
"(16-235)" : "(0-255)",
(reg_io_0x02 & 0x08) ? "enabled" : "disabled");
}
v4l2_info(sd, "Color space conversion: %s\n", v4l2_info(sd, "Color space conversion: %s\n",
csc_coeff_sel_rb[cp_read(sd, info->cp_csc) >> 4]); csc_coeff_sel_rb[cp_read(sd, info->cp_csc) >> 4]);

View File

@@ -223,10 +223,10 @@ static u32 calc_pll(struct ar0521_dev *sensor, int num, u32 freq, u16 *pre_ptr,
continue; /* Minimum value */ continue; /* Minimum value */
if (new_mult > 254) if (new_mult > 254)
break; /* Maximum, larger pre won't work either */ break; /* Maximum, larger pre won't work either */
if (sensor->extclk_freq * (u64)new_mult < AR0521_PLL_MIN * if (sensor->extclk_freq * (u64)new_mult < (u64)AR0521_PLL_MIN *
new_pre) new_pre)
continue; continue;
if (sensor->extclk_freq * (u64)new_mult > AR0521_PLL_MAX * if (sensor->extclk_freq * (u64)new_mult > (u64)AR0521_PLL_MAX *
new_pre) new_pre)
break; /* Larger pre won't work either */ break; /* Larger pre won't work either */
new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult, new_pll = div64_round_up(sensor->extclk_freq * (u64)new_mult,

View File

@@ -642,7 +642,7 @@ static int vpu_core_probe(struct platform_device *pdev)
return -ENODEV; return -ENODEV;
core->type = core->res->type; core->type = core->res->type;
core->id = of_alias_get_id(dev->of_node, "vpu_core"); core->id = of_alias_get_id(dev->of_node, "vpu-core");
if (core->id < 0) { if (core->id < 0) {
dev_err(dev, "can't get vpu core id\n"); dev_err(dev, "can't get vpu core id\n");
return core->id; return core->id;

View File

@@ -775,11 +775,14 @@ static void exynos4_jpeg_parse_decode_h_tbl(struct s5p_jpeg_ctx *ctx)
(unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2; (unsigned long)vb2_plane_vaddr(&vb->vb2_buf, 0) + ctx->out_q.sos + 2;
jpeg_buffer.curr = 0; jpeg_buffer.curr = 0;
word = 0;
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
return; return;
jpeg_buffer.size = (long)word - 2;
if (word < 2)
jpeg_buffer.size = 0;
else
jpeg_buffer.size = (long)word - 2;
jpeg_buffer.data += 2; jpeg_buffer.data += 2;
jpeg_buffer.curr = 0; jpeg_buffer.curr = 0;
@@ -1058,6 +1061,7 @@ static int get_word_be(struct s5p_jpeg_buffer *buf, unsigned int *word)
if (byte == -1) if (byte == -1)
return -1; return -1;
*word = (unsigned int)byte | temp; *word = (unsigned int)byte | temp;
return 0; return 0;
} }
@@ -1145,7 +1149,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
sof = jpeg_buffer.curr; /* after 0xffc0 */ sof = jpeg_buffer.curr; /* after 0xffc0 */
sof_len = length; sof_len = length;
@@ -1176,7 +1180,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
if (n_dqt >= S5P_JPEG_MAX_MARKER) if (n_dqt >= S5P_JPEG_MAX_MARKER)
return false; return false;
@@ -1189,7 +1193,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
if (!length) if (length <= 0)
return false; return false;
if (n_dht >= S5P_JPEG_MAX_MARKER) if (n_dht >= S5P_JPEG_MAX_MARKER)
return false; return false;
@@ -1214,6 +1218,7 @@ static bool s5p_jpeg_parse_hdr(struct s5p_jpeg_q_data *result,
if (get_word_be(&jpeg_buffer, &word)) if (get_word_be(&jpeg_buffer, &word))
break; break;
length = (long)word - 2; length = (long)word - 2;
/* No need to check underflows as skip() does it */
skip(&jpeg_buffer, length); skip(&jpeg_buffer, length);
break; break;
} }

View File

@@ -753,9 +753,10 @@ static int get_ctrl(struct v4l2_ctrl *ctrl, struct v4l2_ext_control *c)
for (i = 0; i < master->ncontrols; i++) for (i = 0; i < master->ncontrols; i++)
cur_to_new(master->cluster[i]); cur_to_new(master->cluster[i]);
ret = call_op(master, g_volatile_ctrl); ret = call_op(master, g_volatile_ctrl);
new_to_user(c, ctrl); if (!ret)
ret = new_to_user(c, ctrl);
} else { } else {
cur_to_user(c, ctrl); ret = cur_to_user(c, ctrl);
} }
v4l2_ctrl_unlock(master); v4l2_ctrl_unlock(master);
return ret; return ret;
@@ -770,7 +771,10 @@ int v4l2_g_ctrl(struct v4l2_ctrl_handler *hdl, struct v4l2_control *control)
if (!ctrl || !ctrl->is_int) if (!ctrl || !ctrl->is_int)
return -EINVAL; return -EINVAL;
ret = get_ctrl(ctrl, &c); ret = get_ctrl(ctrl, &c);
control->value = c.value;
if (!ret)
control->value = c.value;
return ret; return ret;
} }
EXPORT_SYMBOL(v4l2_g_ctrl); EXPORT_SYMBOL(v4l2_g_ctrl);
@@ -811,10 +815,11 @@ static int set_ctrl_lock(struct v4l2_fh *fh, struct v4l2_ctrl *ctrl,
int ret; int ret;
v4l2_ctrl_lock(ctrl); v4l2_ctrl_lock(ctrl);
user_to_new(c, ctrl); ret = user_to_new(c, ctrl);
ret = set_ctrl(fh, ctrl, 0);
if (!ret) if (!ret)
cur_to_user(c, ctrl); ret = set_ctrl(fh, ctrl, 0);
if (!ret)
ret = cur_to_user(c, ctrl);
v4l2_ctrl_unlock(ctrl); v4l2_ctrl_unlock(ctrl);
return ret; return ret;
} }

View File

@@ -120,9 +120,10 @@ static const struct flash_info winbond_nor_parts[] = {
NO_SFDP_FLAGS(SECT_4K) }, NO_SFDP_FLAGS(SECT_4K) },
{ "w25q80bl", INFO(0xef4014, 0, 64 * 1024, 16) { "w25q80bl", INFO(0xef4014, 0, 64 * 1024, 16)
NO_SFDP_FLAGS(SECT_4K) }, NO_SFDP_FLAGS(SECT_4K) },
{ "w25q128", INFO(0xef4018, 0, 0, 0) { "w25q128", INFO(0xef4018, 0, 64 * 1024, 256)
PARSE_SFDP FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB)
FLAGS(SPI_NOR_HAS_LOCK | SPI_NOR_HAS_TB) }, NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ |
SPI_NOR_QUAD_READ) },
{ "w25q256", INFO(0xef4019, 0, 64 * 1024, 512) { "w25q256", INFO(0xef4019, 0, 64 * 1024, 512)
NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ) NO_SFDP_FLAGS(SECT_4K | SPI_NOR_DUAL_READ | SPI_NOR_QUAD_READ)
.fixups = &w25q256_fixups }, .fixups = &w25q256_fixups },

View File

@@ -1011,7 +1011,6 @@ static int c_can_handle_bus_err(struct net_device *dev,
/* common for all type of bus errors */ /* common for all type of bus errors */
priv->can.can_stats.bus_error++; priv->can.can_stats.bus_error++;
stats->rx_errors++;
/* propagate the error condition to the CAN stack */ /* propagate the error condition to the CAN stack */
skb = alloc_can_err_skb(dev, &cf); skb = alloc_can_err_skb(dev, &cf);
@@ -1027,26 +1026,32 @@ static int c_can_handle_bus_err(struct net_device *dev,
case LEC_STUFF_ERROR: case LEC_STUFF_ERROR:
netdev_dbg(dev, "stuff error\n"); netdev_dbg(dev, "stuff error\n");
cf->data[2] |= CAN_ERR_PROT_STUFF; cf->data[2] |= CAN_ERR_PROT_STUFF;
stats->rx_errors++;
break; break;
case LEC_FORM_ERROR: case LEC_FORM_ERROR:
netdev_dbg(dev, "form error\n"); netdev_dbg(dev, "form error\n");
cf->data[2] |= CAN_ERR_PROT_FORM; cf->data[2] |= CAN_ERR_PROT_FORM;
stats->rx_errors++;
break; break;
case LEC_ACK_ERROR: case LEC_ACK_ERROR:
netdev_dbg(dev, "ack error\n"); netdev_dbg(dev, "ack error\n");
cf->data[3] = CAN_ERR_PROT_LOC_ACK; cf->data[3] = CAN_ERR_PROT_LOC_ACK;
stats->tx_errors++;
break; break;
case LEC_BIT1_ERROR: case LEC_BIT1_ERROR:
netdev_dbg(dev, "bit1 error\n"); netdev_dbg(dev, "bit1 error\n");
cf->data[2] |= CAN_ERR_PROT_BIT1; cf->data[2] |= CAN_ERR_PROT_BIT1;
stats->tx_errors++;
break; break;
case LEC_BIT0_ERROR: case LEC_BIT0_ERROR:
netdev_dbg(dev, "bit0 error\n"); netdev_dbg(dev, "bit0 error\n");
cf->data[2] |= CAN_ERR_PROT_BIT0; cf->data[2] |= CAN_ERR_PROT_BIT0;
stats->tx_errors++;
break; break;
case LEC_CRC_ERROR: case LEC_CRC_ERROR:
netdev_dbg(dev, "CRC error\n"); netdev_dbg(dev, "CRC error\n");
cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ; cf->data[3] = CAN_ERR_PROT_LOC_CRC_SEQ;
stats->rx_errors++;
break; break;
default: default:
break; break;

View File

@@ -2,7 +2,7 @@
// //
// mcp251xfd - Microchip MCP251xFD Family CAN controller driver // mcp251xfd - Microchip MCP251xFD Family CAN controller driver
// //
// Copyright (c) 2019, 2020, 2021 Pengutronix, // Copyright (c) 2019, 2020, 2021, 2024 Pengutronix,
// Marc Kleine-Budde <kernel@pengutronix.de> // Marc Kleine-Budde <kernel@pengutronix.de>
// //
// Based on: // Based on:
@@ -473,9 +473,11 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
}; };
const struct ethtool_coalesce ec = { const struct ethtool_coalesce ec = {
.rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq, .rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq,
.rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq, .rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq == 0 ?
1 : priv->rx_obj_num_coalesce_irq,
.tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq, .tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq,
.tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq, .tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq == 0 ?
1 : priv->tx_obj_num_coalesce_irq,
}; };
struct can_ram_layout layout; struct can_ram_layout layout;

View File

@@ -16,9 +16,9 @@
#include "mcp251xfd.h" #include "mcp251xfd.h"
static inline bool mcp251xfd_tx_fifo_sta_full(u32 fifo_sta) static inline bool mcp251xfd_tx_fifo_sta_empty(u32 fifo_sta)
{ {
return !(fifo_sta & MCP251XFD_REG_FIFOSTA_TFNRFNIF); return fifo_sta & MCP251XFD_REG_FIFOSTA_TFERFFIF;
} }
static inline int static inline int
@@ -122,7 +122,11 @@ mcp251xfd_get_tef_len(struct mcp251xfd_priv *priv, u8 *len_p)
if (err) if (err)
return err; return err;
if (mcp251xfd_tx_fifo_sta_full(fifo_sta)) { /* If the chip says the TX-FIFO is empty, but there are no TX
* buffers free in the ring, we assume all have been sent.
*/
if (mcp251xfd_tx_fifo_sta_empty(fifo_sta) &&
mcp251xfd_get_tx_free(tx_ring) == 0) {
*len_p = tx_ring->obj_num; *len_p = tx_ring->obj_num;
return 0; return 0;
} }

View File

@@ -111,6 +111,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct net_device_stats *stats = &ndev->stats; struct net_device_stats *stats = &ndev->stats;
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < TX_BD_NUM; i++) { for (i = 0; i < TX_BD_NUM; i++) {
@@ -140,7 +141,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
stats->tx_bytes += skb->len; stats->tx_bytes += skb->len;
} }
dma_unmap_single(&ndev->dev, dma_unmap_addr(tx_buff, addr), dma_unmap_single(dev, dma_unmap_addr(tx_buff, addr),
dma_unmap_len(tx_buff, len), DMA_TO_DEVICE); dma_unmap_len(tx_buff, len), DMA_TO_DEVICE);
/* return the sk_buff to system */ /* return the sk_buff to system */
@@ -174,6 +175,7 @@ static void arc_emac_tx_clean(struct net_device *ndev)
static int arc_emac_rx(struct net_device *ndev, int budget) static int arc_emac_rx(struct net_device *ndev, int budget)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int work_done; unsigned int work_done;
for (work_done = 0; work_done < budget; work_done++) { for (work_done = 0; work_done < budget; work_done++) {
@@ -223,9 +225,9 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
continue; continue;
} }
addr = dma_map_single(&ndev->dev, (void *)skb->data, addr = dma_map_single(dev, (void *)skb->data,
EMAC_BUFFER_SIZE, DMA_FROM_DEVICE); EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
if (dma_mapping_error(&ndev->dev, addr)) { if (dma_mapping_error(dev, addr)) {
if (net_ratelimit()) if (net_ratelimit())
netdev_err(ndev, "cannot map dma buffer\n"); netdev_err(ndev, "cannot map dma buffer\n");
dev_kfree_skb(skb); dev_kfree_skb(skb);
@@ -237,7 +239,7 @@ static int arc_emac_rx(struct net_device *ndev, int budget)
} }
/* unmap previosly mapped skb */ /* unmap previosly mapped skb */
dma_unmap_single(&ndev->dev, dma_unmap_addr(rx_buff, addr), dma_unmap_single(dev, dma_unmap_addr(rx_buff, addr),
dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE); dma_unmap_len(rx_buff, len), DMA_FROM_DEVICE);
pktlen = info & LEN_MASK; pktlen = info & LEN_MASK;
@@ -423,6 +425,7 @@ static int arc_emac_open(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct phy_device *phy_dev = ndev->phydev; struct phy_device *phy_dev = ndev->phydev;
struct device *dev = ndev->dev.parent;
int i; int i;
phy_dev->autoneg = AUTONEG_ENABLE; phy_dev->autoneg = AUTONEG_ENABLE;
@@ -445,9 +448,9 @@ static int arc_emac_open(struct net_device *ndev)
if (unlikely(!rx_buff->skb)) if (unlikely(!rx_buff->skb))
return -ENOMEM; return -ENOMEM;
addr = dma_map_single(&ndev->dev, (void *)rx_buff->skb->data, addr = dma_map_single(dev, (void *)rx_buff->skb->data,
EMAC_BUFFER_SIZE, DMA_FROM_DEVICE); EMAC_BUFFER_SIZE, DMA_FROM_DEVICE);
if (dma_mapping_error(&ndev->dev, addr)) { if (dma_mapping_error(dev, addr)) {
netdev_err(ndev, "cannot dma map\n"); netdev_err(ndev, "cannot dma map\n");
dev_kfree_skb(rx_buff->skb); dev_kfree_skb(rx_buff->skb);
return -ENOMEM; return -ENOMEM;
@@ -548,6 +551,7 @@ static void arc_emac_set_rx_mode(struct net_device *ndev)
static void arc_free_tx_queue(struct net_device *ndev) static void arc_free_tx_queue(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < TX_BD_NUM; i++) { for (i = 0; i < TX_BD_NUM; i++) {
@@ -555,7 +559,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
struct buffer_state *tx_buff = &priv->tx_buff[i]; struct buffer_state *tx_buff = &priv->tx_buff[i];
if (tx_buff->skb) { if (tx_buff->skb) {
dma_unmap_single(&ndev->dev, dma_unmap_single(dev,
dma_unmap_addr(tx_buff, addr), dma_unmap_addr(tx_buff, addr),
dma_unmap_len(tx_buff, len), dma_unmap_len(tx_buff, len),
DMA_TO_DEVICE); DMA_TO_DEVICE);
@@ -579,6 +583,7 @@ static void arc_free_tx_queue(struct net_device *ndev)
static void arc_free_rx_queue(struct net_device *ndev) static void arc_free_rx_queue(struct net_device *ndev)
{ {
struct arc_emac_priv *priv = netdev_priv(ndev); struct arc_emac_priv *priv = netdev_priv(ndev);
struct device *dev = ndev->dev.parent;
unsigned int i; unsigned int i;
for (i = 0; i < RX_BD_NUM; i++) { for (i = 0; i < RX_BD_NUM; i++) {
@@ -586,7 +591,7 @@ static void arc_free_rx_queue(struct net_device *ndev)
struct buffer_state *rx_buff = &priv->rx_buff[i]; struct buffer_state *rx_buff = &priv->rx_buff[i];
if (rx_buff->skb) { if (rx_buff->skb) {
dma_unmap_single(&ndev->dev, dma_unmap_single(dev,
dma_unmap_addr(rx_buff, addr), dma_unmap_addr(rx_buff, addr),
dma_unmap_len(rx_buff, len), dma_unmap_len(rx_buff, len),
DMA_FROM_DEVICE); DMA_FROM_DEVICE);
@@ -679,6 +684,7 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
unsigned int len, *txbd_curr = &priv->txbd_curr; unsigned int len, *txbd_curr = &priv->txbd_curr;
struct net_device_stats *stats = &ndev->stats; struct net_device_stats *stats = &ndev->stats;
__le32 *info = &priv->txbd[*txbd_curr].info; __le32 *info = &priv->txbd[*txbd_curr].info;
struct device *dev = ndev->dev.parent;
dma_addr_t addr; dma_addr_t addr;
if (skb_padto(skb, ETH_ZLEN)) if (skb_padto(skb, ETH_ZLEN))
@@ -692,10 +698,9 @@ static netdev_tx_t arc_emac_tx(struct sk_buff *skb, struct net_device *ndev)
return NETDEV_TX_BUSY; return NETDEV_TX_BUSY;
} }
addr = dma_map_single(&ndev->dev, (void *)skb->data, len, addr = dma_map_single(dev, (void *)skb->data, len, DMA_TO_DEVICE);
DMA_TO_DEVICE);
if (unlikely(dma_mapping_error(&ndev->dev, addr))) { if (unlikely(dma_mapping_error(dev, addr))) {
stats->tx_dropped++; stats->tx_dropped++;
stats->tx_errors++; stats->tx_errors++;
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);

View File

@@ -133,6 +133,7 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
struct arc_emac_mdio_bus_data *data = &priv->bus_data; struct arc_emac_mdio_bus_data *data = &priv->bus_data;
struct device_node *np = priv->dev->of_node; struct device_node *np = priv->dev->of_node;
const char *name = "Synopsys MII Bus"; const char *name = "Synopsys MII Bus";
struct device_node *mdio_node;
struct mii_bus *bus; struct mii_bus *bus;
int error; int error;
@@ -164,7 +165,13 @@ int arc_mdio_probe(struct arc_emac_priv *priv)
snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name); snprintf(bus->id, MII_BUS_ID_SIZE, "%s", bus->name);
error = of_mdiobus_register(bus, priv->dev->of_node); /* Backwards compatibility for EMAC nodes without MDIO subnode. */
mdio_node = of_get_child_by_name(np, "mdio");
if (!mdio_node)
mdio_node = of_node_get(np);
error = of_mdiobus_register(bus, mdio_node);
of_node_put(mdio_node);
if (error) { if (error) {
mdiobus_free(bus); mdiobus_free(bus);
return dev_err_probe(priv->dev, error, return dev_err_probe(priv->dev, error,

View File

@@ -78,11 +78,18 @@ static int enetc_vf_set_mac_addr(struct net_device *ndev, void *addr)
{ {
struct enetc_ndev_priv *priv = netdev_priv(ndev); struct enetc_ndev_priv *priv = netdev_priv(ndev);
struct sockaddr *saddr = addr; struct sockaddr *saddr = addr;
int err;
if (!is_valid_ether_addr(saddr->sa_data)) if (!is_valid_ether_addr(saddr->sa_data))
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
return enetc_msg_vsi_set_primary_mac_addr(priv, saddr); err = enetc_msg_vsi_set_primary_mac_addr(priv, saddr);
if (err)
return err;
eth_hw_addr_set(ndev, saddr->sa_data);
return 0;
} }
static int enetc_vf_set_features(struct net_device *ndev, static int enetc_vf_set_features(struct net_device *ndev,

View File

@@ -25,8 +25,11 @@ void hnae3_unregister_ae_algo_prepare(struct hnae3_ae_algo *ae_algo)
pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev); pci_id = pci_match_id(ae_algo->pdev_id_table, ae_dev->pdev);
if (!pci_id) if (!pci_id)
continue; continue;
if (IS_ENABLED(CONFIG_PCI_IOV)) if (IS_ENABLED(CONFIG_PCI_IOV)) {
device_lock(&ae_dev->pdev->dev);
pci_disable_sriov(ae_dev->pdev); pci_disable_sriov(ae_dev->pdev);
device_unlock(&ae_dev->pdev->dev);
}
} }
} }
EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare); EXPORT_SYMBOL(hnae3_unregister_ae_algo_prepare);

View File

@@ -790,6 +790,7 @@ enum i40e_filter_state {
I40E_FILTER_ACTIVE, /* Added to switch by FW */ I40E_FILTER_ACTIVE, /* Added to switch by FW */
I40E_FILTER_FAILED, /* Rejected by FW */ I40E_FILTER_FAILED, /* Rejected by FW */
I40E_FILTER_REMOVE, /* To be removed */ I40E_FILTER_REMOVE, /* To be removed */
I40E_FILTER_NEW_SYNC, /* New, not sent yet, is in i40e_sync_vsi_filters() */
/* There is no 'removed' state; the filter struct is freed */ /* There is no 'removed' state; the filter struct is freed */
}; };
struct i40e_mac_filter { struct i40e_mac_filter {

View File

@@ -105,6 +105,7 @@ static char *i40e_filter_state_string[] = {
"ACTIVE", "ACTIVE",
"FAILED", "FAILED",
"REMOVE", "REMOVE",
"NEW_SYNC",
}; };
/** /**

View File

@@ -1251,6 +1251,7 @@ int i40e_count_filters(struct i40e_vsi *vsi)
hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) { hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {
if (f->state == I40E_FILTER_NEW || if (f->state == I40E_FILTER_NEW ||
f->state == I40E_FILTER_NEW_SYNC ||
f->state == I40E_FILTER_ACTIVE) f->state == I40E_FILTER_ACTIVE)
++cnt; ++cnt;
} }
@@ -1437,6 +1438,8 @@ static int i40e_correct_mac_vlan_filters(struct i40e_vsi *vsi,
new->f = add_head; new->f = add_head;
new->state = add_head->state; new->state = add_head->state;
if (add_head->state == I40E_FILTER_NEW)
add_head->state = I40E_FILTER_NEW_SYNC;
/* Add the new filter to the tmp list */ /* Add the new filter to the tmp list */
hlist_add_head(&new->hlist, tmp_add_list); hlist_add_head(&new->hlist, tmp_add_list);
@@ -1546,6 +1549,8 @@ static int i40e_correct_vf_mac_vlan_filters(struct i40e_vsi *vsi,
return -ENOMEM; return -ENOMEM;
new_mac->f = add_head; new_mac->f = add_head;
new_mac->state = add_head->state; new_mac->state = add_head->state;
if (add_head->state == I40E_FILTER_NEW)
add_head->state = I40E_FILTER_NEW_SYNC;
/* Add the new filter to the tmp list */ /* Add the new filter to the tmp list */
hlist_add_head(&new_mac->hlist, tmp_add_list); hlist_add_head(&new_mac->hlist, tmp_add_list);
@@ -2437,7 +2442,8 @@ static int
i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name, i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name,
struct i40e_mac_filter *f) struct i40e_mac_filter *f)
{ {
bool enable = f->state == I40E_FILTER_NEW; bool enable = f->state == I40E_FILTER_NEW ||
f->state == I40E_FILTER_NEW_SYNC;
struct i40e_hw *hw = &vsi->back->hw; struct i40e_hw *hw = &vsi->back->hw;
int aq_ret; int aq_ret;
@@ -2611,6 +2617,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
/* Add it to the hash list */ /* Add it to the hash list */
hlist_add_head(&new->hlist, &tmp_add_list); hlist_add_head(&new->hlist, &tmp_add_list);
f->state = I40E_FILTER_NEW_SYNC;
} }
/* Count the number of active (current and new) VLAN /* Count the number of active (current and new) VLAN
@@ -2762,7 +2769,8 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)
spin_lock_bh(&vsi->mac_filter_hash_lock); spin_lock_bh(&vsi->mac_filter_hash_lock);
hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) { hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) {
/* Only update the state if we're still NEW */ /* Only update the state if we're still NEW */
if (new->f->state == I40E_FILTER_NEW) if (new->f->state == I40E_FILTER_NEW ||
new->f->state == I40E_FILTER_NEW_SYNC)
new->f->state = new->state; new->f->state = new->state;
hlist_del(&new->hlist); hlist_del(&new->hlist);
netdev_hw_addr_refcnt(new->f, vsi->netdev, -1); netdev_hw_addr_refcnt(new->f, vsi->netdev, -1);

View File

@@ -1694,11 +1694,12 @@ static int
ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp, ice_set_fdir_input_set(struct ice_vsi *vsi, struct ethtool_rx_flow_spec *fsp,
struct ice_fdir_fltr *input) struct ice_fdir_fltr *input)
{ {
u16 dest_vsi, q_index = 0; s16 q_index = ICE_FDIR_NO_QUEUE_IDX;
u16 orig_q_index = 0; u16 orig_q_index = 0;
struct ice_pf *pf; struct ice_pf *pf;
struct ice_hw *hw; struct ice_hw *hw;
int flow_type; int flow_type;
u16 dest_vsi;
u8 dest_ctl; u8 dest_ctl;
if (!vsi || !fsp || !input) if (!vsi || !fsp || !input)

View File

@@ -50,6 +50,8 @@
*/ */
#define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20 #define ICE_FDIR_IPV4_PKT_FLAG_MF 0x20
#define ICE_FDIR_NO_QUEUE_IDX -1
enum ice_fltr_prgm_desc_dest { enum ice_fltr_prgm_desc_dest {
ICE_FLTR_PRGM_DESC_DEST_DROP_PKT, ICE_FLTR_PRGM_DESC_DEST_DROP_PKT,
ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX, ICE_FLTR_PRGM_DESC_DEST_DIRECT_PKT_QINDEX,
@@ -181,7 +183,7 @@ struct ice_fdir_fltr {
u16 flex_fltr; u16 flex_fltr;
/* filter control */ /* filter control */
u16 q_index; s16 q_index;
u16 orig_q_index; u16 orig_q_index;
u16 dest_vsi; u16 dest_vsi;
u8 dest_ctl; u8 dest_ctl;

View File

@@ -3665,6 +3665,7 @@ static int stmmac_request_irq_single(struct net_device *dev)
/* Request the Wake IRQ in case of another line /* Request the Wake IRQ in case of another line
* is used for WoL * is used for WoL
*/ */
priv->wol_irq_disabled = true;
if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) { if (priv->wol_irq > 0 && priv->wol_irq != dev->irq) {
ret = request_irq(priv->wol_irq, stmmac_interrupt, ret = request_irq(priv->wol_irq, stmmac_interrupt,
IRQF_SHARED, dev->name, dev); IRQF_SHARED, dev->name, dev);

View File

@@ -222,7 +222,7 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
struct mse102x_net_spi *mses = to_mse102x_spi(mse); struct mse102x_net_spi *mses = to_mse102x_spi(mse);
struct spi_transfer *xfer = &mses->spi_xfer; struct spi_transfer *xfer = &mses->spi_xfer;
struct spi_message *msg = &mses->spi_msg; struct spi_message *msg = &mses->spi_msg;
struct sk_buff *tskb; struct sk_buff *tskb = NULL;
int ret; int ret;
netif_dbg(mse, tx_queued, mse->ndev, "%s: skb %p, %d@%p\n", netif_dbg(mse, tx_queued, mse->ndev, "%s: skb %p, %d@%p\n",
@@ -235,7 +235,6 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
if (!tskb) if (!tskb)
return -ENOMEM; return -ENOMEM;
dev_kfree_skb(txp);
txp = tskb; txp = tskb;
} }
@@ -257,6 +256,8 @@ static int mse102x_tx_frame_spi(struct mse102x_net *mse, struct sk_buff *txp,
mse->stats.xfer_err++; mse->stats.xfer_err++;
} }
dev_kfree_skb(tskb);
return ret; return ret;
} }

View File

@@ -547,6 +547,9 @@ static int mctp_i2c_header_create(struct sk_buff *skb, struct net_device *dev,
if (len > MCTP_I2C_MAXMTU) if (len > MCTP_I2C_MAXMTU)
return -EMSGSIZE; return -EMSGSIZE;
if (!daddr || !saddr)
return -EINVAL;
lldst = *((u8 *)daddr); lldst = *((u8 *)daddr);
llsrc = *((u8 *)saddr); llsrc = *((u8 *)saddr);

View File

@@ -147,6 +147,8 @@ MODULE_DEVICE_TABLE(mdio, dp83848_tbl);
/* IRQ related */ \ /* IRQ related */ \
.config_intr = dp83848_config_intr, \ .config_intr = dp83848_config_intr, \
.handle_interrupt = dp83848_handle_interrupt, \ .handle_interrupt = dp83848_handle_interrupt, \
\
.flags = PHY_RST_AFTER_CLK_EN, \
} }
static struct phy_driver dp83848_driver[] = { static struct phy_driver dp83848_driver[] = {

View File

@@ -1431,6 +1431,7 @@ static const struct usb_device_id products[] = {
{QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */ {QMI_FIXED_INTF(0x2c7c, 0x0296, 4)}, /* Quectel BG96 */
{QMI_QUIRK_SET_DTR(0x2c7c, 0x030e, 4)}, /* Quectel EM05GV2 */ {QMI_QUIRK_SET_DTR(0x2c7c, 0x030e, 4)}, /* Quectel EM05GV2 */
{QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */ {QMI_QUIRK_SET_DTR(0x2cb7, 0x0104, 4)}, /* Fibocom NL678 series */
{QMI_QUIRK_SET_DTR(0x2cb7, 0x0112, 0)}, /* Fibocom FG132 */
{QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */ {QMI_FIXED_INTF(0x0489, 0xe0b4, 0)}, /* Foxconn T77W968 LTE */
{QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/ {QMI_FIXED_INTF(0x0489, 0xe0b5, 0)}, /* Foxconn T77W968 LTE with eSIM support*/
{QMI_FIXED_INTF(0x2692, 0x9025, 4)}, /* Cellient MPL200 (rebranded Qualcomm 05c6:9025) */ {QMI_FIXED_INTF(0x2692, 0x9025, 4)}, /* Cellient MPL200 (rebranded Qualcomm 05c6:9025) */

View File

@@ -3887,6 +3887,12 @@ static int virtnet_probe(struct virtio_device *vdev)
if (vi->has_rss || vi->has_rss_hash_report) { if (vi->has_rss || vi->has_rss_hash_report) {
vi->rss_key_size = vi->rss_key_size =
virtio_cread8(vdev, offsetof(struct virtio_net_config, rss_max_key_size)); virtio_cread8(vdev, offsetof(struct virtio_net_config, rss_max_key_size));
if (vi->rss_key_size > VIRTIO_NET_RSS_MAX_KEY_SIZE) {
dev_err(&vdev->dev, "rss_max_key_size=%u exceeds the limit %u.\n",
vi->rss_key_size, VIRTIO_NET_RSS_MAX_KEY_SIZE);
err = -EINVAL;
goto free;
}
vi->rss_hash_types_supported = vi->rss_hash_types_supported =
virtio_cread32(vdev, offsetof(struct virtio_net_config, supported_hash_types)); virtio_cread32(vdev, offsetof(struct virtio_net_config, supported_hash_types));

View File

@@ -1739,7 +1739,8 @@ iwl_mvm_umac_scan_cfg_channels_v6_6g(struct iwl_mvm *mvm,
&cp->channel_config[ch_cnt]; &cp->channel_config[ch_cnt];
u32 s_ssid_bitmap = 0, bssid_bitmap = 0, flags = 0; u32 s_ssid_bitmap = 0, bssid_bitmap = 0, flags = 0;
u8 j, k, s_max = 0, b_max = 0, n_used_bssid_entries; u8 k, s_max = 0, b_max = 0, n_used_bssid_entries;
u32 j;
bool force_passive, found = false, allow_passive = true, bool force_passive, found = false, allow_passive = true,
unsolicited_probe_on_chan = false, psc_no_listen = false; unsolicited_probe_on_chan = false, psc_no_listen = false;

View File

@@ -262,7 +262,7 @@ int t7xx_dpmaif_rx_buf_alloc(struct dpmaif_ctrl *dpmaif_ctrl,
return 0; return 0;
err_unmap_skbs: err_unmap_skbs:
while (--i > 0) while (i--)
t7xx_unmap_bat_skb(dpmaif_ctrl->dev, bat_req->bat_skb, i); t7xx_unmap_bat_skb(dpmaif_ctrl->dev, bat_req->bat_skb, i);
return ret; return ret;

View File

@@ -1231,10 +1231,9 @@ static void nvme_queue_keep_alive_work(struct nvme_ctrl *ctrl)
nvme_keep_alive_work_period(ctrl)); nvme_keep_alive_work_period(ctrl));
} }
static enum rq_end_io_ret nvme_keep_alive_end_io(struct request *rq, static void nvme_keep_alive_finish(struct request *rq,
blk_status_t status) blk_status_t status, struct nvme_ctrl *ctrl)
{ {
struct nvme_ctrl *ctrl = rq->end_io_data;
unsigned long flags; unsigned long flags;
bool startka = false; bool startka = false;
unsigned long rtt = jiffies - (rq->deadline - rq->timeout); unsigned long rtt = jiffies - (rq->deadline - rq->timeout);
@@ -1252,13 +1251,11 @@ static enum rq_end_io_ret nvme_keep_alive_end_io(struct request *rq,
delay = 0; delay = 0;
} }
blk_mq_free_request(rq);
if (status) { if (status) {
dev_err(ctrl->device, dev_err(ctrl->device,
"failed nvme_keep_alive_end_io error=%d\n", "failed nvme_keep_alive_end_io error=%d\n",
status); status);
return RQ_END_IO_NONE; return;
} }
ctrl->ka_last_check_time = jiffies; ctrl->ka_last_check_time = jiffies;
@@ -1270,7 +1267,6 @@ static enum rq_end_io_ret nvme_keep_alive_end_io(struct request *rq,
spin_unlock_irqrestore(&ctrl->lock, flags); spin_unlock_irqrestore(&ctrl->lock, flags);
if (startka) if (startka)
queue_delayed_work(nvme_wq, &ctrl->ka_work, delay); queue_delayed_work(nvme_wq, &ctrl->ka_work, delay);
return RQ_END_IO_NONE;
} }
static void nvme_keep_alive_work(struct work_struct *work) static void nvme_keep_alive_work(struct work_struct *work)
@@ -1279,6 +1275,7 @@ static void nvme_keep_alive_work(struct work_struct *work)
struct nvme_ctrl, ka_work); struct nvme_ctrl, ka_work);
bool comp_seen = ctrl->comp_seen; bool comp_seen = ctrl->comp_seen;
struct request *rq; struct request *rq;
blk_status_t status;
ctrl->ka_last_check_time = jiffies; ctrl->ka_last_check_time = jiffies;
@@ -1301,9 +1298,9 @@ static void nvme_keep_alive_work(struct work_struct *work)
nvme_init_request(rq, &ctrl->ka_cmd); nvme_init_request(rq, &ctrl->ka_cmd);
rq->timeout = ctrl->kato * HZ; rq->timeout = ctrl->kato * HZ;
rq->end_io = nvme_keep_alive_end_io; status = blk_execute_rq(rq, false);
rq->end_io_data = ctrl; nvme_keep_alive_finish(rq, status, ctrl);
blk_execute_rq_nowait(rq, false); blk_mq_free_request(rq);
} }
static void nvme_start_keep_alive(struct nvme_ctrl *ctrl) static void nvme_start_keep_alive(struct nvme_ctrl *ctrl)
@@ -2394,8 +2391,13 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
else else
ctrl->ctrl_config = NVME_CC_CSS_NVM; ctrl->ctrl_config = NVME_CC_CSS_NVM;
if (ctrl->cap & NVME_CAP_CRMS_CRWMS && ctrl->cap & NVME_CAP_CRMS_CRIMS) /*
ctrl->ctrl_config |= NVME_CC_CRIME; * Setting CRIME results in CSTS.RDY before the media is ready. This
* makes it possible for media related commands to return the error
* NVME_SC_ADMIN_COMMAND_MEDIA_NOT_READY. Until the driver is
* restructured to handle retries, disable CC.CRIME.
*/
ctrl->ctrl_config &= ~NVME_CC_CRIME;
ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT; ctrl->ctrl_config |= (NVME_CTRL_PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT;
ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE; ctrl->ctrl_config |= NVME_CC_AMS_RR | NVME_CC_SHN_NONE;
@@ -2430,10 +2432,7 @@ int nvme_enable_ctrl(struct nvme_ctrl *ctrl)
* devices are known to get this wrong. Use the larger of the * devices are known to get this wrong. Use the larger of the
* two values. * two values.
*/ */
if (ctrl->ctrl_config & NVME_CC_CRIME) ready_timeout = NVME_CRTO_CRWMT(crto);
ready_timeout = NVME_CRTO_CRIMT(crto);
else
ready_timeout = NVME_CRTO_CRWMT(crto);
if (ready_timeout < timeout) if (ready_timeout < timeout)
dev_warn_once(ctrl->device, "bad crto:%x cap:%llx\n", dev_warn_once(ctrl->device, "bad crto:%x cap:%llx\n",

View File

@@ -463,6 +463,20 @@ static int nvme_add_ns_head_cdev(struct nvme_ns_head *head)
return ret; return ret;
} }
static void nvme_partition_scan_work(struct work_struct *work)
{
struct nvme_ns_head *head =
container_of(work, struct nvme_ns_head, partition_scan_work);
if (WARN_ON_ONCE(!test_and_clear_bit(GD_SUPPRESS_PART_SCAN,
&head->disk->state)))
return;
mutex_lock(&head->disk->open_mutex);
bdev_disk_changed(head->disk, false);
mutex_unlock(&head->disk->open_mutex);
}
static void nvme_requeue_work(struct work_struct *work) static void nvme_requeue_work(struct work_struct *work)
{ {
struct nvme_ns_head *head = struct nvme_ns_head *head =
@@ -489,6 +503,7 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
bio_list_init(&head->requeue_list); bio_list_init(&head->requeue_list);
spin_lock_init(&head->requeue_lock); spin_lock_init(&head->requeue_lock);
INIT_WORK(&head->requeue_work, nvme_requeue_work); INIT_WORK(&head->requeue_work, nvme_requeue_work);
INIT_WORK(&head->partition_scan_work, nvme_partition_scan_work);
/* /*
* Add a multipath node if the subsystems supports multiple controllers. * Add a multipath node if the subsystems supports multiple controllers.
@@ -504,6 +519,16 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
return -ENOMEM; return -ENOMEM;
head->disk->fops = &nvme_ns_head_ops; head->disk->fops = &nvme_ns_head_ops;
head->disk->private_data = head; head->disk->private_data = head;
/*
* We need to suppress the partition scan from occuring within the
* controller's scan_work context. If a path error occurs here, the IO
* will wait until a path becomes available or all paths are torn down,
* but that action also occurs within scan_work, so it would deadlock.
* Defer the partion scan to a different context that does not block
* scan_work.
*/
set_bit(GD_SUPPRESS_PART_SCAN, &head->disk->state);
sprintf(head->disk->disk_name, "nvme%dn%d", sprintf(head->disk->disk_name, "nvme%dn%d",
ctrl->subsys->instance, head->instance); ctrl->subsys->instance, head->instance);
@@ -552,6 +577,7 @@ static void nvme_mpath_set_live(struct nvme_ns *ns)
return; return;
} }
nvme_add_ns_head_cdev(head); nvme_add_ns_head_cdev(head);
kblockd_schedule_work(&head->partition_scan_work);
} }
mutex_lock(&head->lock); mutex_lock(&head->lock);
@@ -851,6 +877,12 @@ void nvme_mpath_shutdown_disk(struct nvme_ns_head *head)
kblockd_schedule_work(&head->requeue_work); kblockd_schedule_work(&head->requeue_work);
if (test_bit(NVME_NSHEAD_DISK_LIVE, &head->flags)) { if (test_bit(NVME_NSHEAD_DISK_LIVE, &head->flags)) {
nvme_cdev_del(&head->cdev, &head->cdev_device); nvme_cdev_del(&head->cdev, &head->cdev_device);
/*
* requeue I/O after NVME_NSHEAD_DISK_LIVE has been cleared
* to allow multipath to fail all I/O.
*/
synchronize_srcu(&head->srcu);
kblockd_schedule_work(&head->requeue_work);
del_gendisk(head->disk); del_gendisk(head->disk);
} }
} }
@@ -862,6 +894,7 @@ void nvme_mpath_remove_disk(struct nvme_ns_head *head)
/* make sure all pending bios are cleaned up */ /* make sure all pending bios are cleaned up */
kblockd_schedule_work(&head->requeue_work); kblockd_schedule_work(&head->requeue_work);
flush_work(&head->requeue_work); flush_work(&head->requeue_work);
flush_work(&head->partition_scan_work);
put_disk(head->disk); put_disk(head->disk);
} }

View File

@@ -460,6 +460,7 @@ struct nvme_ns_head {
struct bio_list requeue_list; struct bio_list requeue_list;
spinlock_t requeue_lock; spinlock_t requeue_lock;
struct work_struct requeue_work; struct work_struct requeue_work;
struct work_struct partition_scan_work;
struct mutex lock; struct mutex lock;
unsigned long flags; unsigned long flags;
#define NVME_NSHEAD_DISK_LIVE 0 #define NVME_NSHEAD_DISK_LIVE 0

View File

@@ -2495,10 +2495,11 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size)
len = nvmf_get_address(ctrl, buf, size); len = nvmf_get_address(ctrl, buf, size);
if (!test_bit(NVME_TCP_Q_LIVE, &queue->flags))
return len;
mutex_lock(&queue->queue_lock); mutex_lock(&queue->queue_lock);
if (!test_bit(NVME_TCP_Q_LIVE, &queue->flags))
goto done;
ret = kernel_getsockname(queue->sock, (struct sockaddr *)&src_addr); ret = kernel_getsockname(queue->sock, (struct sockaddr *)&src_addr);
if (ret > 0) { if (ret > 0) {
if (len > 0) if (len > 0)
@@ -2506,7 +2507,7 @@ static int nvme_tcp_get_address(struct nvme_ctrl *ctrl, char *buf, int size)
len += scnprintf(buf + len, size - len, "%ssrc_addr=%pISc\n", len += scnprintf(buf + len, size - len, "%ssrc_addr=%pISc\n",
(len) ? "," : "", &src_addr); (len) ? "," : "", &src_addr);
} }
done:
mutex_unlock(&queue->queue_lock); mutex_unlock(&queue->queue_lock);
return len; return len;

View File

@@ -101,6 +101,7 @@ int nvmet_setup_dhgroup(struct nvmet_ctrl *ctrl, u8 dhgroup_id)
pr_debug("%s: ctrl %d failed to generate private key, err %d\n", pr_debug("%s: ctrl %d failed to generate private key, err %d\n",
__func__, ctrl->cntlid, ret); __func__, ctrl->cntlid, ret);
kfree_sensitive(ctrl->dh_key); kfree_sensitive(ctrl->dh_key);
ctrl->dh_key = NULL;
return ret; return ret;
} }
ctrl->dh_keysize = crypto_kpp_maxsize(ctrl->dh_tfm); ctrl->dh_keysize = crypto_kpp_maxsize(ctrl->dh_tfm);

View File

@@ -878,6 +878,11 @@ static int amd_pmc_s2d_init(struct amd_pmc_dev *dev)
amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, STB_SPILL_TO_DRAM, 1); amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_LOW, &phys_addr_low, STB_SPILL_TO_DRAM, 1);
amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, STB_SPILL_TO_DRAM, 1); amd_pmc_send_cmd(dev, S2D_PHYS_ADDR_HIGH, &phys_addr_hi, STB_SPILL_TO_DRAM, 1);
if (!phys_addr_hi && !phys_addr_low) {
dev_err(dev->dev, "STB is not enabled on the system; disable enable_stb or contact system vendor\n");
return -EINVAL;
}
stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low); stb_phys_addr = ((u64)phys_addr_hi << 32 | phys_addr_low);
/* Clear msg_port for other SMU operation */ /* Clear msg_port for other SMU operation */

View File

@@ -1853,8 +1853,9 @@ static __init int x86_android_tablet_init(void)
for (i = 0; i < pdev_count; i++) { for (i = 0; i < pdev_count; i++) {
pdevs[i] = platform_device_register_full(&dev_info->pdev_info[i]); pdevs[i] = platform_device_register_full(&dev_info->pdev_info[i]);
if (IS_ERR(pdevs[i])) { if (IS_ERR(pdevs[i])) {
ret = PTR_ERR(pdevs[i]);
x86_android_tablet_cleanup(); x86_android_tablet_cleanup();
return PTR_ERR(pdevs[i]); return ret;
} }
} }

View File

@@ -106,7 +106,9 @@ static int pwm_imx_tpm_round_state(struct pwm_chip *chip,
p->prescale = prescale; p->prescale = prescale;
period_count = (clock_unit + ((1 << prescale) >> 1)) >> prescale; period_count = (clock_unit + ((1 << prescale) >> 1)) >> prescale;
p->mod = period_count; if (period_count == 0)
return -EINVAL;
p->mod = period_count - 1;
/* calculate real period HW can support */ /* calculate real period HW can support */
tmp = (u64)period_count << prescale; tmp = (u64)period_count << prescale;

View File

@@ -218,8 +218,7 @@ static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp,
bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT); bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
while (bufsize >= SECTOR_SIZE) { while (bufsize >= SECTOR_SIZE) {
buf = __vmalloc(bufsize, buf = kvzalloc(bufsize, GFP_KERNEL | __GFP_NORETRY);
GFP_KERNEL | __GFP_ZERO | __GFP_NORETRY);
if (buf) { if (buf) {
*buflen = bufsize; *buflen = bufsize;
return buf; return buf;

View File

@@ -73,7 +73,14 @@ static struct irq_chip lmh_irq_chip = {
static int lmh_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw) static int lmh_irq_map(struct irq_domain *d, unsigned int irq, irq_hw_number_t hw)
{ {
struct lmh_hw_data *lmh_data = d->host_data; struct lmh_hw_data *lmh_data = d->host_data;
static struct lock_class_key lmh_lock_key;
static struct lock_class_key lmh_request_key;
/*
* This lock class tells lockdep that GPIO irqs are in a different
* category than their parents, so it won't report false recursion.
*/
irq_set_lockdep_class(irq, &lmh_lock_key, &lmh_request_key);
irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq); irq_set_chip_and_handler(irq, &lmh_irq_chip, handle_simple_irq);
irq_set_chip_data(irq, lmh_data); irq_set_chip_data(irq, lmh_data);

View File

@@ -238,18 +238,15 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
struct device_node *trips; struct device_node *trips;
int ret, count; int ret, count;
*ntrips = 0;
trips = of_get_child_by_name(np, "trips"); trips = of_get_child_by_name(np, "trips");
if (!trips) { if (!trips)
pr_err("Failed to find 'trips' node\n"); return NULL;
return ERR_PTR(-EINVAL);
}
count = of_get_child_count(trips); count = of_get_child_count(trips);
if (!count) { if (!count)
pr_err("No trip point defined\n"); return NULL;
ret = -EINVAL;
goto out_of_node_put;
}
tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL); tt = kzalloc(sizeof(*tt) * count, GFP_KERNEL);
if (!tt) { if (!tt) {
@@ -272,7 +269,6 @@ static struct thermal_trip *thermal_of_trips_init(struct device_node *np, int *n
out_kfree: out_kfree:
kfree(tt); kfree(tt);
*ntrips = 0;
out_of_node_put: out_of_node_put:
of_node_put(trips); of_node_put(trips);
@@ -619,11 +615,14 @@ struct thermal_zone_device *thermal_of_zone_register(struct device_node *sensor,
trips = thermal_of_trips_init(np, &ntrips); trips = thermal_of_trips_init(np, &ntrips);
if (IS_ERR(trips)) { if (IS_ERR(trips)) {
pr_err("Failed to find trip points for %pOFn id=%d\n", sensor, id); pr_err("Failed to parse trip points for %pOFn id=%d\n", sensor, id);
ret = PTR_ERR(trips); ret = PTR_ERR(trips);
goto out_kfree_of_ops; goto out_kfree_of_ops;
} }
if (!trips)
pr_info("No trip points found for %pOFn id=%d\n", sensor, id);
ret = thermal_of_monitor_init(np, &delay, &pdelay); ret = thermal_of_monitor_init(np, &delay, &pdelay);
if (ret) { if (ret) {
pr_err("Failed to initialize monitoring delays from %pOFn\n", np); pr_err("Failed to initialize monitoring delays from %pOFn\n", np);

View File

@@ -4593,7 +4593,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
int c; int c;
if (op->data) { if (op->data) {
font.data = kmalloc(max_font_size, GFP_KERNEL); font.data = kzalloc(max_font_size, GFP_KERNEL);
if (!font.data) if (!font.data)
return -ENOMEM; return -ENOMEM;
} else } else

View File

@@ -286,8 +286,6 @@ static int sunxi_musb_exit(struct musb *musb)
if (test_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags)) if (test_bit(SUNXI_MUSB_FL_HAS_SRAM, &glue->flags))
sunxi_sram_release(musb->controller->parent); sunxi_sram_release(musb->controller->parent);
devm_usb_put_phy(glue->dev, glue->xceiv);
return 0; return 0;
} }

View File

@@ -770,11 +770,12 @@ static void edge_bulk_out_data_callback(struct urb *urb)
static void edge_bulk_out_cmd_callback(struct urb *urb) static void edge_bulk_out_cmd_callback(struct urb *urb)
{ {
struct edgeport_port *edge_port = urb->context; struct edgeport_port *edge_port = urb->context;
struct device *dev = &urb->dev->dev;
int status = urb->status; int status = urb->status;
atomic_dec(&CmdUrbs); atomic_dec(&CmdUrbs);
dev_dbg(&urb->dev->dev, "%s - FREE URB %p (outstanding %d)\n", dev_dbg(dev, "%s - FREE URB %p (outstanding %d)\n", __func__, urb,
__func__, urb, atomic_read(&CmdUrbs)); atomic_read(&CmdUrbs));
/* clean up the transfer buffer */ /* clean up the transfer buffer */
@@ -784,8 +785,7 @@ static void edge_bulk_out_cmd_callback(struct urb *urb)
usb_free_urb(urb); usb_free_urb(urb);
if (status) { if (status) {
dev_dbg(&urb->dev->dev, dev_dbg(dev, "%s - nonzero write bulk status received: %d\n",
"%s - nonzero write bulk status received: %d\n",
__func__, status); __func__, status);
return; return;
} }

View File

@@ -251,6 +251,7 @@ static void option_instat_callback(struct urb *urb);
#define QUECTEL_VENDOR_ID 0x2c7c #define QUECTEL_VENDOR_ID 0x2c7c
/* These Quectel products use Quectel's vendor ID */ /* These Quectel products use Quectel's vendor ID */
#define QUECTEL_PRODUCT_EC21 0x0121 #define QUECTEL_PRODUCT_EC21 0x0121
#define QUECTEL_PRODUCT_RG650V 0x0122
#define QUECTEL_PRODUCT_EM061K_LTA 0x0123 #define QUECTEL_PRODUCT_EM061K_LTA 0x0123
#define QUECTEL_PRODUCT_EM061K_LMS 0x0124 #define QUECTEL_PRODUCT_EM061K_LMS 0x0124
#define QUECTEL_PRODUCT_EC25 0x0125 #define QUECTEL_PRODUCT_EC25 0x0125
@@ -1273,6 +1274,8 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG912Y, 0xff, 0, 0) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG916Q, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) }, { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RM500K, 0xff, 0x00, 0x00) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0xff, 0x30) },
{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_RG650V, 0xff, 0, 0) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) },
{ USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) },
@@ -2320,6 +2323,9 @@ static const struct usb_device_id option_ids[] = {
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x010b, 0xff, 0xff, 0x30) }, /* Fibocom FG150 Diag */ { 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_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, 0x0111, 0xff) }, /* Fibocom FM160 (MBIM mode) */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x30) }, /* Fibocom FG132 Diag */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0xff, 0x40) }, /* Fibocom FG132 AT */
{ USB_DEVICE_AND_INTERFACE_INFO(0x2cb7, 0x0112, 0xff, 0, 0) }, /* Fibocom FG132 NMEA */
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x0115, 0xff), /* Fibocom FM135 (laptop MBIM) */
.driver_info = RSVD(5) }, .driver_info = RSVD(5) },
{ USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */ { USB_DEVICE_INTERFACE_CLASS(0x2cb7, 0x01a0, 0xff) }, /* Fibocom NL668-AM/NL652-EU (laptop MBIM) */

View File

@@ -166,6 +166,8 @@ static const struct usb_device_id id_table[] = {
{DEVICE_SWI(0x1199, 0x9090)}, /* Sierra Wireless EM7565 QDL */ {DEVICE_SWI(0x1199, 0x9090)}, /* Sierra Wireless EM7565 QDL */
{DEVICE_SWI(0x1199, 0x9091)}, /* Sierra Wireless EM7565 */ {DEVICE_SWI(0x1199, 0x9091)}, /* Sierra Wireless EM7565 */
{DEVICE_SWI(0x1199, 0x90d2)}, /* Sierra Wireless EM9191 QDL */ {DEVICE_SWI(0x1199, 0x90d2)}, /* Sierra Wireless EM9191 QDL */
{DEVICE_SWI(0x1199, 0x90e4)}, /* Sierra Wireless EM86xx QDL*/
{DEVICE_SWI(0x1199, 0x90e5)}, /* Sierra Wireless EM86xx */
{DEVICE_SWI(0x1199, 0xc080)}, /* Sierra Wireless EM7590 QDL */ {DEVICE_SWI(0x1199, 0xc080)}, /* Sierra Wireless EM7590 QDL */
{DEVICE_SWI(0x1199, 0xc081)}, /* Sierra Wireless EM7590 */ {DEVICE_SWI(0x1199, 0xc081)}, /* Sierra Wireless EM7590 */
{DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */ {DEVICE_SWI(0x413c, 0x81a2)}, /* Dell Wireless 5806 Gobi(TM) 4G LTE Mobile Broadband Card */

View File

@@ -441,6 +441,8 @@ static void ucsi_ccg_update_set_new_cam_cmd(struct ucsi_ccg *uc,
port = uc->orig; port = uc->orig;
new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd); new_cam = UCSI_SET_NEW_CAM_GET_AM(*cmd);
if (new_cam >= ARRAY_SIZE(uc->updated))
return;
new_port = &uc->updated[new_cam]; new_port = &uc->updated[new_cam];
cam = new_port->linked_idx; cam = new_port->linked_idx;
enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd); enter_new_mode = UCSI_SET_NEW_CAM_ENTER(*cmd);

View File

@@ -78,7 +78,7 @@ int ifcvf_init_hw(struct ifcvf_hw *hw, struct pci_dev *pdev)
u32 i; u32 i;
ret = pci_read_config_byte(pdev, PCI_CAPABILITY_LIST, &pos); ret = pci_read_config_byte(pdev, PCI_CAPABILITY_LIST, &pos);
if (ret < 0) { if (ret) {
IFCVF_ERR(pdev, "Failed to read PCI capability list\n"); IFCVF_ERR(pdev, "Failed to read PCI capability list\n");
return -EIO; return -EIO;
} }

View File

@@ -622,7 +622,7 @@ static int insert_delayed_ref(struct btrfs_trans_handle *trans,
&href->ref_add_list); &href->ref_add_list);
else if (ref->action == BTRFS_DROP_DELAYED_REF) { else if (ref->action == BTRFS_DROP_DELAYED_REF) {
ASSERT(!list_empty(&exist->add_list)); ASSERT(!list_empty(&exist->add_list));
list_del(&exist->add_list); list_del_init(&exist->add_list);
} else { } else {
ASSERT(0); ASSERT(0);
} }

View File

@@ -5604,8 +5604,8 @@ failed_mount3a:
failed_mount3: failed_mount3:
/* flush s_error_work before sbi destroy */ /* flush s_error_work before sbi destroy */
flush_work(&sbi->s_error_work); flush_work(&sbi->s_error_work);
del_timer_sync(&sbi->s_err_report);
ext4_stop_mmpd(sbi); ext4_stop_mmpd(sbi);
del_timer_sync(&sbi->s_err_report);
ext4_group_desc_free(sbi); ext4_group_desc_free(sbi);
failed_mount: failed_mount:
if (sbi->s_chksum_driver) if (sbi->s_chksum_driver)

View File

@@ -206,13 +206,17 @@ void nfs_set_cache_invalid(struct inode *inode, unsigned long flags)
nfs_fscache_invalidate(inode, 0); nfs_fscache_invalidate(inode, 0);
flags &= ~NFS_INO_REVAL_FORCED; flags &= ~NFS_INO_REVAL_FORCED;
nfsi->cache_validity |= flags; flags |= nfsi->cache_validity;
if (inode->i_mapping->nrpages == 0) if (inode->i_mapping->nrpages == 0)
nfsi->cache_validity &= ~(NFS_INO_INVALID_DATA | flags &= ~NFS_INO_INVALID_DATA;
NFS_INO_DATA_INVAL_DEFER);
else if (nfsi->cache_validity & NFS_INO_INVALID_DATA) /* pairs with nfs_clear_invalid_mapping()'s smp_load_acquire() */
nfsi->cache_validity &= ~NFS_INO_DATA_INVAL_DEFER; smp_store_release(&nfsi->cache_validity, flags);
if (inode->i_mapping->nrpages == 0 ||
nfsi->cache_validity & NFS_INO_INVALID_DATA) {
nfs_ooo_clear(nfsi);
}
trace_nfs_set_cache_invalid(inode, 0); trace_nfs_set_cache_invalid(inode, 0);
} }
EXPORT_SYMBOL_GPL(nfs_set_cache_invalid); EXPORT_SYMBOL_GPL(nfs_set_cache_invalid);
@@ -677,9 +681,10 @@ static int nfs_vmtruncate(struct inode * inode, loff_t offset)
trace_nfs_size_truncate(inode, offset); trace_nfs_size_truncate(inode, offset);
i_size_write(inode, offset); i_size_write(inode, offset);
/* Optimisation */ /* Optimisation */
if (offset == 0) if (offset == 0) {
NFS_I(inode)->cache_validity &= ~(NFS_INO_INVALID_DATA | NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_DATA;
NFS_INO_DATA_INVAL_DEFER); nfs_ooo_clear(NFS_I(inode));
}
NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE; NFS_I(inode)->cache_validity &= ~NFS_INO_INVALID_SIZE;
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@@ -1099,7 +1104,7 @@ void nfs_inode_attach_open_context(struct nfs_open_context *ctx)
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (list_empty(&nfsi->open_files) && if (list_empty(&nfsi->open_files) &&
(nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)) nfs_ooo_test(nfsi))
nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA | nfs_set_cache_invalid(inode, NFS_INO_INVALID_DATA |
NFS_INO_REVAL_FORCED); NFS_INO_REVAL_FORCED);
list_add_tail_rcu(&ctx->list, &nfsi->open_files); list_add_tail_rcu(&ctx->list, &nfsi->open_files);
@@ -1329,6 +1334,13 @@ int nfs_clear_invalid_mapping(struct address_space *mapping)
TASK_KILLABLE|TASK_FREEZABLE_UNSAFE); TASK_KILLABLE|TASK_FREEZABLE_UNSAFE);
if (ret) if (ret)
goto out; goto out;
smp_rmb(); /* pairs with smp_wmb() below */
if (test_bit(NFS_INO_INVALIDATING, bitlock))
continue;
/* pairs with nfs_set_cache_invalid()'s smp_store_release() */
if (!(smp_load_acquire(&nfsi->cache_validity) & NFS_INO_INVALID_DATA))
goto out;
/* Slow-path that double-checks with spinlock held */
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (test_bit(NFS_INO_INVALIDATING, bitlock)) { if (test_bit(NFS_INO_INVALIDATING, bitlock)) {
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
@@ -1342,8 +1354,8 @@ int nfs_clear_invalid_mapping(struct address_space *mapping)
set_bit(NFS_INO_INVALIDATING, bitlock); set_bit(NFS_INO_INVALIDATING, bitlock);
smp_wmb(); smp_wmb();
nfsi->cache_validity &= nfsi->cache_validity &= ~NFS_INO_INVALID_DATA;
~(NFS_INO_INVALID_DATA | NFS_INO_DATA_INVAL_DEFER); nfs_ooo_clear(nfsi);
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
trace_nfs_invalidate_mapping_enter(inode); trace_nfs_invalidate_mapping_enter(inode);
ret = nfs_invalidate_mapping(inode, mapping); ret = nfs_invalidate_mapping(inode, mapping);
@@ -1554,6 +1566,7 @@ void nfs_fattr_init(struct nfs_fattr *fattr)
fattr->gencount = nfs_inc_attr_generation_counter(); fattr->gencount = nfs_inc_attr_generation_counter();
fattr->owner_name = NULL; fattr->owner_name = NULL;
fattr->group_name = NULL; fattr->group_name = NULL;
fattr->mdsthreshold = NULL;
} }
EXPORT_SYMBOL_GPL(nfs_fattr_init); EXPORT_SYMBOL_GPL(nfs_fattr_init);
@@ -1805,6 +1818,66 @@ static int nfs_inode_finish_partial_attr_update(const struct nfs_fattr *fattr,
return 0; return 0;
} }
static void nfs_ooo_merge(struct nfs_inode *nfsi,
u64 start, u64 end)
{
int i, cnt;
if (nfsi->cache_validity & NFS_INO_DATA_INVAL_DEFER)
/* No point merging anything */
return;
if (!nfsi->ooo) {
nfsi->ooo = kmalloc(sizeof(*nfsi->ooo), GFP_ATOMIC);
if (!nfsi->ooo) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
return;
}
nfsi->ooo->cnt = 0;
}
/* add this range, merging if possible */
cnt = nfsi->ooo->cnt;
for (i = 0; i < cnt; i++) {
if (end == nfsi->ooo->gap[i].start)
end = nfsi->ooo->gap[i].end;
else if (start == nfsi->ooo->gap[i].end)
start = nfsi->ooo->gap[i].start;
else
continue;
/* Remove 'i' from table and loop to insert the new range */
cnt -= 1;
nfsi->ooo->gap[i] = nfsi->ooo->gap[cnt];
i = -1;
}
if (start != end) {
if (cnt >= ARRAY_SIZE(nfsi->ooo->gap)) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER;
kfree(nfsi->ooo);
nfsi->ooo = NULL;
return;
}
nfsi->ooo->gap[cnt].start = start;
nfsi->ooo->gap[cnt].end = end;
cnt += 1;
}
nfsi->ooo->cnt = cnt;
}
static void nfs_ooo_record(struct nfs_inode *nfsi,
struct nfs_fattr *fattr)
{
/* This reply was out-of-order, so record in the
* pre/post change id, possibly cancelling
* gaps created when iversion was jumpped forward.
*/
if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) &&
(fattr->valid & NFS_ATTR_FATTR_PRECHANGE))
nfs_ooo_merge(nfsi,
fattr->change_attr,
fattr->pre_change_attr);
}
static int nfs_refresh_inode_locked(struct inode *inode, static int nfs_refresh_inode_locked(struct inode *inode,
struct nfs_fattr *fattr) struct nfs_fattr *fattr)
{ {
@@ -1815,8 +1888,12 @@ static int nfs_refresh_inode_locked(struct inode *inode,
if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode)) if (attr_cmp > 0 || nfs_inode_finish_partial_attr_update(fattr, inode))
ret = nfs_update_inode(inode, fattr); ret = nfs_update_inode(inode, fattr);
else if (attr_cmp == 0) else {
ret = nfs_check_inode_attributes(inode, fattr); nfs_ooo_record(NFS_I(inode), fattr);
if (attr_cmp == 0)
ret = nfs_check_inode_attributes(inode, fattr);
}
trace_nfs_refresh_inode_exit(inode, ret); trace_nfs_refresh_inode_exit(inode, ret);
return ret; return ret;
@@ -1907,6 +1984,8 @@ int nfs_post_op_update_inode_force_wcc_locked(struct inode *inode, struct nfs_fa
if (attr_cmp < 0) if (attr_cmp < 0)
return 0; return 0;
if ((fattr->valid & NFS_ATTR_FATTR) == 0 || !attr_cmp) { if ((fattr->valid & NFS_ATTR_FATTR) == 0 || !attr_cmp) {
/* Record the pre/post change info before clearing PRECHANGE */
nfs_ooo_record(NFS_I(inode), fattr);
fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE fattr->valid &= ~(NFS_ATTR_FATTR_PRECHANGE
| NFS_ATTR_FATTR_PRESIZE | NFS_ATTR_FATTR_PRESIZE
| NFS_ATTR_FATTR_PREMTIME | NFS_ATTR_FATTR_PREMTIME
@@ -2061,6 +2140,15 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
/* More cache consistency checks */ /* More cache consistency checks */
if (fattr->valid & NFS_ATTR_FATTR_CHANGE) { if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
if (!have_writers && nfsi->ooo && nfsi->ooo->cnt == 1 &&
nfsi->ooo->gap[0].end == inode_peek_iversion_raw(inode)) {
/* There is one remaining gap that hasn't been
* merged into iversion - do that now.
*/
inode_set_iversion_raw(inode, nfsi->ooo->gap[0].start);
kfree(nfsi->ooo);
nfsi->ooo = NULL;
}
if (!inode_eq_iversion_raw(inode, fattr->change_attr)) { if (!inode_eq_iversion_raw(inode, fattr->change_attr)) {
/* Could it be a race with writeback? */ /* Could it be a race with writeback? */
if (!(have_writers || have_delegation)) { if (!(have_writers || have_delegation)) {
@@ -2082,8 +2170,11 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
dprintk("NFS: change_attr change on server for file %s/%ld\n", dprintk("NFS: change_attr change on server for file %s/%ld\n",
inode->i_sb->s_id, inode->i_sb->s_id,
inode->i_ino); inode->i_ino);
} else if (!have_delegation) } else if (!have_delegation) {
nfsi->cache_validity |= NFS_INO_DATA_INVAL_DEFER; nfs_ooo_record(nfsi, fattr);
nfs_ooo_merge(nfsi, inode_peek_iversion_raw(inode),
fattr->change_attr);
}
inode_set_iversion_raw(inode, fattr->change_attr); inode_set_iversion_raw(inode, fattr->change_attr);
} }
} else { } else {
@@ -2237,6 +2328,7 @@ struct inode *nfs_alloc_inode(struct super_block *sb)
return NULL; return NULL;
nfsi->flags = 0UL; nfsi->flags = 0UL;
nfsi->cache_validity = 0UL; nfsi->cache_validity = 0UL;
nfsi->ooo = NULL;
#if IS_ENABLED(CONFIG_NFS_V4) #if IS_ENABLED(CONFIG_NFS_V4)
nfsi->nfs4_acl = NULL; nfsi->nfs4_acl = NULL;
#endif /* CONFIG_NFS_V4 */ #endif /* CONFIG_NFS_V4 */
@@ -2249,6 +2341,7 @@ EXPORT_SYMBOL_GPL(nfs_alloc_inode);
void nfs_free_inode(struct inode *inode) void nfs_free_inode(struct inode *inode)
{ {
kfree(NFS_I(inode)->ooo);
kmem_cache_free(nfs_inode_cachep, NFS_I(inode)); kmem_cache_free(nfs_inode_cachep, NFS_I(inode));
} }
EXPORT_SYMBOL_GPL(nfs_free_inode); EXPORT_SYMBOL_GPL(nfs_free_inode);

Some files were not shown because too many files have changed in this diff Show More