Linux 5.4.103
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.4.103 kernel.
All users of the 5.4 kernel series must upgrade.
The updated 5.4.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.4.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/devicetree/bindings/net/btusb.txt | 2 Documentation/devicetree/bindings/net/ethernet-controller.yaml | 5 Documentation/filesystems/sysfs.txt | 8 Makefile | 2 arch/arm/xen/p2m.c | 35 ++ arch/arm64/kernel/module.lds | 6 arch/mips/include/asm/string.h | 121 -------- arch/mips/vdso/Makefile | 5 arch/parisc/kernel/irq.c | 4 arch/x86/events/intel/core.c | 3 arch/x86/kernel/module.c | 1 arch/x86/kernel/reboot.c | 9 arch/x86/tools/relocs.c | 12 arch/x86/xen/p2m.c | 44 ++ crypto/tcrypt.c | 20 - drivers/block/nbd.c | 32 +- drivers/block/zram/zram_drv.c | 2 drivers/bluetooth/hci_h5.c | 5 drivers/gpu/drm/amd/amdgpu/cz_ih.c | 37 +- drivers/gpu/drm/amd/amdgpu/iceland_ih.c | 36 +- drivers/gpu/drm/amd/amdgpu/tonga_ih.c | 37 +- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 5 drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 1 drivers/gpu/drm/virtio/virtgpu_vq.c | 5 drivers/input/mouse/elantech.c | 99 ++++++ drivers/input/mouse/elantech.h | 4 drivers/media/rc/mceusb.c | 9 drivers/media/usb/uvc/uvc_driver.c | 7 drivers/media/v4l2-core/v4l2-ctrls.c | 3 drivers/media/v4l2-core/v4l2-ioctl.c | 19 - drivers/net/ethernet/atheros/ag71xx.c | 4 drivers/net/tap.c | 7 drivers/net/tun.c | 4 drivers/net/usb/qmi_wwan.c | 1 drivers/net/wireless/ath/ath10k/mac.c | 15 - drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c | 32 ++ drivers/net/wireless/rsi/rsi_91x_hal.c | 3 drivers/net/wireless/rsi/rsi_91x_sdio.c | 6 drivers/net/wireless/rsi/rsi_91x_sdio_ops.c | 52 --- drivers/net/wireless/rsi/rsi_sdio.h | 8 drivers/net/wireless/ti/wl12xx/main.c | 3 drivers/net/wireless/ti/wlcore/main.c | 15 - drivers/net/wireless/ti/wlcore/wlcore.h | 3 drivers/net/xen-netback/netback.c | 12 drivers/nvme/host/core.c | 20 + drivers/nvme/host/nvme.h | 2 drivers/nvme/host/pci.c | 105 ++++--- drivers/nvme/host/rdma.c | 18 + drivers/nvme/host/tcp.c | 18 + drivers/pci/pci.c | 9 drivers/scsi/libiscsi.c | 148 +++++----- drivers/scsi/scsi_transport_iscsi.c | 38 ++ drivers/staging/fwserial/fwserial.c | 2 drivers/staging/most/sound/sound.c | 2 drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c | 6 drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c | 2 drivers/staging/vc04_services/bcm2835-audio/bcm2835.c | 6 drivers/tty/vt/consolemap.c | 2 drivers/video/fbdev/udlfb.c | 1 fs/btrfs/transaction.c | 11 fs/erofs/super.c | 4 fs/f2fs/namei.c | 8 fs/f2fs/segment.h | 4 fs/jfs/jfs_filsys.h | 1 fs/jfs/jfs_mount.c | 10 fs/sysfs/file.c | 55 +++ fs/xfs/xfs_iops.c | 2 include/linux/netdevice.h | 3 include/linux/swap.h | 1 include/linux/sysfs.h | 16 + include/linux/zsmalloc.h | 2 kernel/sched/core.c | 8 kernel/sched/sched.h | 1 mm/hugetlb.c | 22 - mm/page_io.c | 5 mm/swapfile.c | 13 mm/zsmalloc.c | 17 - net/bluetooth/amp.c | 3 net/bridge/br_sysfs_if.c | 9 net/core/dev.c | 42 ++ net/core/dev_ioctl.c | 20 - net/core/pktgen.c | 2 net/core/rtnetlink.c | 2 net/core/skbuff.c | 14 net/iucv/af_iucv.c | 1 security/smack/smackfs.c | 21 + sound/pci/hda/patch_realtek.c | 13 sound/soc/intel/boards/bytcr_rt5640.c | 37 ++ sound/soc/intel/boards/bytcr_rt5651.c | 13 sound/soc/intel/common/soc-intel-quirks.h | 25 + 90 files changed, 992 insertions(+), 515 deletions(-)
Alexander Egorenkov (1):
net/af_iucv: remove WARN_ONCE on malformed RX packets
Ard Biesheuvel (1):
crypto: tcrypt - avoid signed overflow in byte count
Chao Leng (3):
nvme-core: add cancel tagset helpers
nvme-rdma: add clean action for failed reconnection
nvme-tcp: add clean action for failed reconnection
Chao Yu (1):
f2fs: fix to set/clear I_LINKABLE under i_lock
Chris Leech (2):
scsi: iscsi: Ensure sysfs attributes are limited to PAGE_SIZE
scsi: iscsi: Verify lengths on passthrough PDUs
Christian Gromm (1):
staging: most: sound: add sanity check for function argument
Christoph Hellwig (2):
nvme-pci: refactor nvme_unmap_data
nvme-pci: fix error unwind in nvme_map_data
Claire Chang (1):
Bluetooth: hci_h5: Set HCI_QUIRK_SIMULTANEOUS_DISCOVERY for btrtl
Cong Wang (1):
net: fix dev_ifsioc_locked() race condition
DENG Qingfang (1):
net: ag71xx: remove unnecessary MTU reservation
Defang Bo (1):
drm/amdgpu: Add check to prevent IH overflow
Di Zhu (1):
pktgen: fix misuse of BUG_ON() in pktgen_thread_worker()
Dinghao Liu (1):
staging: fwserial: Fix error handling in fwserial_create
Eckhart Mohr (1):
ALSA: hda/realtek: Add quirk for Clevo NH55RZQ
Fangrui Song (1):
x86/build: Treat R_386_PLT32 relocation as R_386_PC32
Gao Xiang (1):
erofs: fix shift-out-of-bounds of blkszbits
Geert Uytterhoeven (1):
dt-bindings: net: btusb: DT fix s/interrupt-name/interrupt-names/
Gopal Tiwari (1):
Bluetooth: Fix null pointer dereference in amp_read_loc_assoc_final_data
Greg Kroah-Hartman (1):
Linux 5.4.103
Hans Verkuil (1):
media: v4l2-ctrls.c: fix shift-out-of-bounds in std_validate
Hans de Goede (7):
brcmfmac: Add DMI nvram filename quirk for Predia Basic tablet
brcmfmac: Add DMI nvram filename quirk for Voyo winpad A15 tablet
ASoC: Intel: Add DMI quirk table to soc_intel_is_byt_cr()
ASoC: Intel: bytcr_rt5640: Add quirk for the Estar Beauty HD MID 7316R tablet
ASoC: Intel: bytcr_rt5640: Add quirk for the Voyo Winpad A15 tablet
ASoC: Intel: bytcr_rt5651: Add quirk for the Jumper EZpad 7 tablet
ASoC: Intel: bytcr_rt5640: Add quirk for the Acer One S1002 tablet
Heiner Kallweit (1):
x86/reboot: Add Zotac ZBOX CI327 nano PCI reboot quirk
Jaegeuk Kim (1):
f2fs: handle unallocated section and zone on pinned/atgc
Jan Beulich (2):
Xen/gnttab: handle p2m update errors on a per-slot basis
xen-netback: respect gnttab_map_refs()'s return value
Jens Axboe (1):
swap: fix swapfile read/write offset
Jim Mattson (1):
perf/x86/kvm: Add Cascade Lake Xeon steppings to isolation_ucodes[]
Jiri Slaby (1):
vt/consolemap: do font sum unsigned
Joe Perches (1):
sysfs: Add sysfs_emit and sysfs_emit_at to format sysfs output
John David Anglin (1):
parisc: Bump 64-bit IRQ stack size to 64 KB
Josef Bacik (2):
nbd: handle device refs for DESTROY_ON_DISCONNECT properly
btrfs: fix error handling in commit_fs_roots
Juerg Haefliger (1):
staging: bcm2835-audio: Replace unsafe strcpy() with strscpy()
Juri Lelli (1):
sched/features: Fix hrtick reprogramming
Lech Perczak (1):
net: usb: qmi_wwan: support ZTE P685M modem
Lee Duncan (1):
scsi: iscsi: Restrict sessions and handles to admin capabilities
Li Xinhai (1):
mm/hugetlb.c: fix unnecessary address expansion of pmd sharing
Marco Elver (1):
net: fix up truesize of cloned skb in skb_prepare_for_shift()
Marek Vasut (2):
rsi: Fix TX EAPOL packet handling against iwlwifi AP
rsi: Move card interrupt handling to RX thread
Miaoqing Pan (1):
ath10k: fix wmi mgmt tx queue full due to race condition
Nathan Chancellor (1):
MIPS: VDSO: Use CLANG_FLAGS instead of filtering out '--target='
Nicholas Kazlauskas (1):
drm/amd/display: Guard against NULL pointer deref when get_i2c_info fails
Nirmoy Das (1):
PCI: Add a REBAR size quirk for Sapphire RX 5600 XT Pulse
Paul Burton (1):
MIPS: Drop 32-bit asm string functions
Randy Dunlap (1):
JFS: more checks for invalid superblock
Ricardo Ribalda (1):
media: uvcvideo: Allow entities with no pads
Rokudo Yan (1):
zsmalloc: account the number of compacted pages correctly
Russell King (1):
dt-bindings: ethernet-controller: fix fixed-link specification
Sabyrzhan Tasbolatov (1):
smackfs: restrict bytes count in smackfs write functions
Sakari Ailus (1):
media: v4l: ioctl: Fix memory leak in video_usercopy
Sean Young (1):
media: mceusb: sanity check for prescaler value
Sergey Senozhatsky (1):
drm/virtio: use kvmalloc for large allocations
Shaoying Xu (1):
arm64 module: set plt* section addresses to 0x0
Takashi Iwai (1):
ALSA: hda/realtek: Apply dual codec quirks for MSI Godlike X570 board
Tian Tao (1):
drm/hisilicon: Fix use-after-free
Tony Lindgren (1):
wlcore: Fix command execute failure 19 for wl12xx
Vladimir Oltean (1):
net: bridge: use switchdev for port flags set through sysfs too
Werner Sembach (1):
ALSA: hda/realtek: Add quirk for Intel NUC 10
Yumei Huang (1):
xfs: Fix assert failure in xfs_setattr_size()
Zqiang (1):
udlfb: Fix memory leak in dlfb_usb_probe
jingle.wu (1):
Input: elantech - fix protocol errors for some trackpoints in SMBus mode
Greg Kroah-Hartman
maintainerDocumentation/devicetree/bindings/net/btusb.txt +1 -1
@@ -38,7 +38,7 @@ Following example uses irq pin number 3 of gpio0 for out of band wake-on-bt: compatible = "usb1286,204e"; reg = <1>; interrupt-parent = <&gpio0>; - interrupt-name = "wakeup"; + interrupt-names = "wakeup"; interrupts = <3 IRQ_TYPE_LEVEL_LOW>; }; };
Documentation/devicetree/bindings/net/ethernet-controller.yaml +5 -0
@@ -190,6 +190,11 @@ properties: Indicates that full-duplex is used. When absent, half duplex is assumed. + pause: + $ref: /schemas/types.yaml#definitions/flag + description: + Indicates that pause should be enabled. + asym-pause: $ref: /schemas/types.yaml#definitions/flag description:
Documentation/filesystems/sysfs.txt +3 -5
@@ -232,12 +232,10 @@ Other notes: is 4096. - show() methods should return the number of bytes printed into the - buffer. This is the return value of scnprintf(). + buffer. -- show() must not use snprintf() when formatting the value to be - returned to user space. If you can guarantee that an overflow - will never happen you can use sprintf() otherwise you must use - scnprintf(). +- show() should only use sysfs_emit() or sysfs_emit_at() when formatting + the value to be returned to user space. - store() should return the number of bytes used from the buffer. If the entire buffer has been used, just return the count argument.
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 4 -SUBLEVEL = 102 +SUBLEVEL = 103 EXTRAVERSION = NAME = Kleptomaniac Octopus
arch/arm/xen/p2m.c +31 -4
@@ -93,12 +93,39 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,int i;for (i =0 ; i < count; i++) { +struct gnttab_unmap_grant_ref unmap; +int rc; +if (map_ops[i].status)continue ; -if (unlikely (!set_phys_to_machine (map_ops[i].host_addr >>XEN_PAGE_SHIFT , - map_ops[i].dev_bus_addr >>XEN_PAGE_SHIFT ))) { -return -ENOMEM ; - } +if (likely (set_phys_to_machine (map_ops[i].host_addr >>XEN_PAGE_SHIFT , + map_ops[i].dev_bus_addr >>XEN_PAGE_SHIFT ))) +continue ; + +/* +* Signal an error for this slot. This in turn requires +* immediate unmapping. +*/ + map_ops[i].status = GNTST_general_error; + unmap.host_addr = map_ops[i].host_addr, + unmap.handle = map_ops[i].handle; + map_ops[i].handle = ~0 ; +if (map_ops[i].flags & GNTMAP_device_map) + unmap.dev_bus_addr = map_ops[i].dev_bus_addr; +else + unmap.dev_bus_addr =0 ; + +/* +* Pre-populate the status field, to be recognizable in +* the log message below. +*/ + unmap.status =1 ; + + rc =HYPERVISOR_grant_table_op (GNTTABOP_unmap_grant_ref, + &unmap,1 ); +if (rc || unmap.status != GNTST_okay) +pr_err_once ("gnttab unmap failed: rc=%d st=%d\n" , + rc, unmap.status); }return 0 ;
arch/arm64/kernel/module.lds +3 -3
@@ -1,5 +1,5 @@ SECTIONS { - .plt (NOLOAD) : { BYTE(0) } - .init.plt (NOLOAD) : { BYTE(0) } - .text.ftrace_trampoline (NOLOAD) : { BYTE(0) } + .plt 0 (NOLOAD) : { BYTE(0) } + .init.plt 0 (NOLOAD) : { BYTE(0) } + .text.ftrace_trampoline 0 (NOLOAD) : { BYTE(0) } }
arch/mips/include/asm/string.h +0 -121
127 lines not on this page · raw message
arch/mips/vdso/Makefile +1 -4
@@ -16,12 +16,9 @@ ccflags-vdso := \ $(filter -march=%,$(KBUILD_CFLAGS)) \ $(filter -m%-float,$(KBUILD_CFLAGS)) \ $(filter -mno-loongson-%,$(KBUILD_CFLAGS)) \ + $(CLANG_FLAGS) \ -D__VDSO__ -ifdef CONFIG_CC_IS_CLANG -ccflags-vdso += $(filter --target=%,$(KBUILD_CFLAGS)) -endif - # # The -fno-jump-tables flag only prevents the compiler from generating # jump tables but does not prevent the compiler from emitting absolute
arch/parisc/kernel/irq.c +4 -0
@@ -376,7 +376,11 @@ static inline int eirr_to_irq(unsigned long eirr)/* * IRQ STACK - used for irq handler */ +#ifdef CONFIG_64BIT +#define IRQ_STACK_SIZE (4096 << 4)/* 64k irq stack size */ +#else #define IRQ_STACK_SIZE (4096 << 3)/* 32k irq stack size */ +#endif union irq_stack_union {unsigned long stack[IRQ_STACK_SIZE /sizeof (unsigned long )];
arch/x86/events/intel/core.c +3 -0
@@ -4002,6 +4002,9 @@ static const struct x86_cpu_desc isolation_ucodes[] = {INTEL_CPU_DESC (INTEL_FAM6_BROADWELL_X ,2 ,0x0b000014 ),INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_X ,3 ,0x00000021 ),INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_X ,4 ,0x00000000 ), +INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_X ,5 ,0x00000000 ), +INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_X ,6 ,0x00000000 ), +INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_X ,7 ,0x00000000 ),INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE_L ,3 ,0x0000007c ),INTEL_CPU_DESC (INTEL_FAM6_SKYLAKE ,3 ,0x0000007c ), INTEL_CPU_DESC(INTEL_FAM6_KABYLAKE, 9, 0x0000004e),
arch/x86/kernel/module.c +1 -0
@@ -114,6 +114,7 @@ int apply_relocate(Elf32_Shdr *sechdrs, *location += sym->st_value;break ;case R_386_PC32 : +case R_386_PLT32 :/* Add the value, subtract its position */ *location += sym->st_value - (uint32_t )location;break ;
arch/x86/kernel/reboot.c +9 -0
@@ -477,6 +477,15 @@ static const struct dmi_system_id reboot_dmi_table[] __initconst = { }, }, + {/* PCIe Wifi card isn't detected after reboot otherwise */ + .callback = set_pci_reboot, + .ident = "Zotac ZBOX CI327 nano", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"NA" ), + DMI_MATCH(DMI_PRODUCT_NAME, "ZBOX-CI327NANO-GS-01"), + }, + }, + /* Sony */ { /* Handle problems with rebooting on Sony VGN-Z540N */ .callback = set_bios_reboot,
arch/x86/tools/relocs.c +8 -4
@@ -867,9 +867,11 @@ static int do_reloc32(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,case R_386_PC32 :case R_386_PC16 :case R_386_PC8 : +case R_386_PLT32 :/* -* NONE can be ignored and PC relative relocations don't -* need to be adjusted. +* NONE can be ignored and PC relative relocations don't need +* to be adjusted. Because sym must be defined, R_386_PLT32 can +* be treated the same way as R_386_PC32. */ break ;
@@ -910,9 +912,11 @@ static int do_reloc_real(struct section *sec, Elf_Rel *rel, Elf_Sym *sym,case R_386_PC32 :case R_386_PC16 :case R_386_PC8 : +case R_386_PLT32 :/* -* NONE can be ignored and PC relative relocations don't -* need to be adjusted. +* NONE can be ignored and PC relative relocations don't need +* to be adjusted. Because sym must be defined, R_386_PLT32 can +* be treated the same way as R_386_PC32. */ break ;
arch/x86/xen/p2m.c +41 -3
57 lines not on this page · raw message
crypto/tcrypt.c +10 -10
@@ -198,8 +198,8 @@ static int test_mb_aead_jiffies(struct test_mb_aead_data *data, int enc, goto out; } -pr_cont ("%d operations in %d seconds (%ld bytes)\n" , - bcount * num_mb, secs, (long )bcount * blen * num_mb); +pr_cont ("%d operations in %d seconds (%llu bytes)\n" , + bcount * num_mb, secs, (u64 )bcount * blen * num_mb); out:kfree (rc);
@@ -468,8 +468,8 @@ static int test_aead_jiffies(struct aead_request *req, int enc,return ret; } -printk ("%d operations in %d seconds (%ld bytes)\n" , - bcount, secs, (long )bcount * blen); +pr_cont ("%d operations in %d seconds (%llu bytes)\n" , + bcount, secs, (u64 )bcount * blen);return 0 ; }
@@ -759,8 +759,8 @@ static int test_mb_ahash_jiffies(struct test_mb_ahash_data *data, int blen, goto out; } -pr_cont ("%d operations in %d seconds (%ld bytes)\n" , - bcount * num_mb, secs, (long )bcount * blen * num_mb); +pr_cont ("%d operations in %d seconds (%llu bytes)\n" , + bcount * num_mb, secs, (u64 )bcount * blen * num_mb); out:kfree (rc);
@@ -1196,8 +1196,8 @@ static int test_mb_acipher_jiffies(struct test_mb_skcipher_data *data, int enc, goto out; } -pr_cont ("%d operations in %d seconds (%ld bytes)\n" , - bcount * num_mb, secs, (long )bcount * blen * num_mb); +pr_cont ("%d operations in %d seconds (%llu bytes)\n" , + bcount * num_mb, secs, (u64 )bcount * blen * num_mb); out:kfree (rc);
@@ -1434,8 +1434,8 @@ static int test_acipher_jiffies(struct skcipher_request *req, int enc,return ret; } -pr_cont ("%d operations in %d seconds (%ld bytes)\n" , - bcount, secs, (long )bcount * blen); +pr_cont ("%d operations in %d seconds (%llu bytes)\n" , + bcount, secs, (u64 )bcount * blen);return 0 ; }
drivers/block/nbd.c +19 -13
@@ -78,8 +78,7 @@ struct link_dead_args {#define NBD_RT_HAS_PID_FILE 3#define NBD_RT_HAS_CONFIG_REF 4#define NBD_RT_BOUND 5 -#define NBD_RT_DESTROY_ON_DISCONNECT 6 -#define NBD_RT_DISCONNECT_ON_CLOSE 7 +#define NBD_RT_DISCONNECT_ON_CLOSE 6#define NBD_DESTROY_ON_DISCONNECT 0#define NBD_DISCONNECT_REQUESTED 1
@@ -1940,12 +1939,21 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)if (info->attrs[NBD_ATTR_CLIENT_FLAGS ]) {u64 flags =nla_get_u64 (info->attrs[NBD_ATTR_CLIENT_FLAGS ]);if (flags &NBD_CFLAG_DESTROY_ON_DISCONNECT ) { -set_bit (NBD_RT_DESTROY_ON_DISCONNECT , - &config->runtime_flags); -set_bit (NBD_DESTROY_ON_DISCONNECT , &nbd->flags); - put_dev = true; +/* +* We have 1 ref to keep the device around, and then 1 +* ref for our current operation here, which will be +* inherited by the config. If we already have +* DESTROY_ON_DISCONNECT set then we know we don't have +* that extra ref already held so we don't need the +* put_dev. +*/ +if (!test_and_set_bit (NBD_DESTROY_ON_DISCONNECT , + &nbd->flags)) + put_dev = true; }else { -clear_bit (NBD_DESTROY_ON_DISCONNECT , &nbd->flags); +if (test_and_clear_bit (NBD_DESTROY_ON_DISCONNECT , + &nbd->flags)) +refcount_inc (&nbd->refs); }if (flags &NBD_CFLAG_DISCONNECT_ON_CLOSE ) { set_bit(NBD_RT_DISCONNECT_ON_CLOSE,
@@ -2116,15 +2124,13 @@ static int nbd_genl_reconfigure(struct sk_buff *skb, struct genl_info *info)if (info->attrs[NBD_ATTR_CLIENT_FLAGS ]) {u64 flags =nla_get_u64 (info->attrs[NBD_ATTR_CLIENT_FLAGS ]);if (flags &NBD_CFLAG_DESTROY_ON_DISCONNECT ) { -if (!test_and_set_bit (NBD_RT_DESTROY_ON_DISCONNECT , - &config->runtime_flags)) +if (!test_and_set_bit (NBD_DESTROY_ON_DISCONNECT , + &nbd->flags)) put_dev = true; -set_bit (NBD_DESTROY_ON_DISCONNECT , &nbd->flags); }else { -if (test_and_clear_bit (NBD_RT_DESTROY_ON_DISCONNECT , - &config->runtime_flags)) +if (test_and_clear_bit (NBD_DESTROY_ON_DISCONNECT , + &nbd->flags))refcount_inc (&nbd->refs); -clear_bit (NBD_DESTROY_ON_DISCONNECT , &nbd->flags); }if (flags &NBD_CFLAG_DISCONNECT_ON_CLOSE ) {
drivers/block/zram/zram_drv.c +1 -1
@@ -1072,7 +1072,7 @@ static ssize_t mm_stat_show(struct device *dev, zram->limit_pages <<PAGE_SHIFT , max_used <<PAGE_SHIFT , (u64 )atomic64_read (&zram->stats.same_pages), - pool_stats.pages_compacted, +atomic_long_read (&pool_stats.pages_compacted), (u64)atomic64_read(&zram->stats.huge_pages));up_read (&zram->init_lock);
drivers/bluetooth/hci_h5.c +5 -0
@@ -894,6 +894,11 @@ static int h5_btrtl_setup(struct h5 *h5)/* Give the device some time before the hci-core sends it a reset */ usleep_range (10000 ,20000 ); +/* Enable controller to do both LE scan and BR/EDR inquiry +* simultaneously. +*/ +set_bit (HCI_QUIRK_SIMULTANEOUS_DISCOVERY , &h5->hu->hdev->quirks); + out_free:btrtl_free (btrtl_dev);
drivers/gpu/drm/amd/amdgpu/cz_ih.c +24 -13
@@ -193,19 +193,30 @@ static u32 cz_ih_get_wptr(struct amdgpu_device *adev, wptr =le32_to_cpu (*ih->wptr_cpu); -if (REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) { - wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); -/* When a ring buffer overflow happen start parsing interrupt -* from the last not overwritten vector (wptr + 16). Hopefully -* this should allow us to catchup. -*/ -dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , - wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); - ih->rptr = (wptr +16 ) & ih->ptr_mask; - tmp =RREG32 (mmIH_RB_CNTL); - tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); -WREG32 (mmIH_RB_CNTL, tmp); - } +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + +/* Double check that the overflow wasn't already cleared. */ + wptr =RREG32 (mmIH_RB_WPTR); + +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + + wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); + +/* When a ring buffer overflow happen start parsing interrupt +* from the last not overwritten vector (wptr + 16). Hopefully +* this should allow us to catchup. +*/ +dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , + wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); + ih->rptr = (wptr +16 ) & ih->ptr_mask; + tmp =RREG32 (mmIH_RB_CNTL); + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); +WREG32 (mmIH_RB_CNTL, tmp); + + +out:return (wptr & ih->ptr_mask); }
drivers/gpu/drm/amd/amdgpu/iceland_ih.c +23 -13
@@ -193,19 +193,29 @@ static u32 iceland_ih_get_wptr(struct amdgpu_device *adev, wptr =le32_to_cpu (*ih->wptr_cpu); -if (REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) { - wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); -/* When a ring buffer overflow happen start parsing interrupt -* from the last not overwritten vector (wptr + 16). Hopefully -* this should allow us to catchup. -*/ -dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , - wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); - ih->rptr = (wptr +16 ) & ih->ptr_mask; - tmp =RREG32 (mmIH_RB_CNTL); - tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); -WREG32 (mmIH_RB_CNTL, tmp); - } +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + +/* Double check that the overflow wasn't already cleared. */ + wptr =RREG32 (mmIH_RB_WPTR); + +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + + wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); +/* When a ring buffer overflow happen start parsing interrupt +* from the last not overwritten vector (wptr + 16). Hopefully +* this should allow us to catchup. +*/ +dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , + wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); + ih->rptr = (wptr +16 ) & ih->ptr_mask; + tmp =RREG32 (mmIH_RB_CNTL); + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); +WREG32 (mmIH_RB_CNTL, tmp); + + +out:return (wptr & ih->ptr_mask); }
drivers/gpu/drm/amd/amdgpu/tonga_ih.c +24 -13
@@ -195,19 +195,30 @@ static u32 tonga_ih_get_wptr(struct amdgpu_device *adev, wptr =le32_to_cpu (*ih->wptr_cpu); -if (REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) { - wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); -/* When a ring buffer overflow happen start parsing interrupt -* from the last not overwritten vector (wptr + 16). Hopefully -* this should allow us to catchup. -*/ -dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , - wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); - ih->rptr = (wptr +16 ) & ih->ptr_mask; - tmp =RREG32 (mmIH_RB_CNTL); - tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); -WREG32 (mmIH_RB_CNTL, tmp); - } +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + +/* Double check that the overflow wasn't already cleared. */ + wptr =RREG32 (mmIH_RB_WPTR); + +if (!REG_GET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW )) + goto out; + + wptr =REG_SET_FIELD (wptr,IH_RB_WPTR ,RB_OVERFLOW ,0 ); + +/* When a ring buffer overflow happen start parsing interrupt +* from the last not overwritten vector (wptr + 16). Hopefully +* this should allow us to catchup. +*/ + +dev_warn (adev->dev,"IH ring buffer overflow (0x%08X, 0x%08X, 0x%08X)\n" , + wptr, ih->rptr, (wptr +16 ) & ih->ptr_mask); + ih->rptr = (wptr +16 ) & ih->ptr_mask; + tmp =RREG32 (mmIH_RB_CNTL); + tmp =REG_SET_FIELD (tmp,IH_RB_CNTL ,WPTR_OVERFLOW_CLEAR ,1 ); +WREG32 (mmIH_RB_CNTL, tmp); + +out:return (wptr & ih->ptr_mask); }
drivers/gpu/drm/amd/display/dc/core/dc_link.c +5 -0
@@ -1303,6 +1303,11 @@ static bool construct( goto ddc_create_fail; } +if (!link->ddc->ddc_pin) { +DC_ERROR ("Failed to get I2C info for connector!\n" ); + goto ddc_create_fail; + } + link->ddc_hw_inst =dal_ddc_get_line (dal_ddc_service_get_ddc_pin (link->ddc));
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c +0 -1
@@ -376,7 +376,6 @@ static void hibmc_pci_remove(struct pci_dev *pdev)drm_dev_unregister (dev);hibmc_unload (dev); -drm_dev_put (dev); }static struct pci_device_id hibmc_pci_table[] = {
drivers/gpu/drm/virtio/virtgpu_vq.c +3 -2
@@ -992,8 +992,9 @@ int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev, }/* gets freed when the ring has consumed it */ - ents =kmalloc_array (nents,sizeof (struct virtio_gpu_mem_entry ), -GFP_KERNEL ); + ents =kvmalloc_array (nents, +sizeof (struct virtio_gpu_mem_entry ), +GFP_KERNEL );if (!ents) {DRM_ERROR ("failed to allocate ent list\n" );return -ENOMEM ;
drivers/input/mouse/elantech.c +97 -2
146 lines not on this page · raw message
drivers/input/mouse/elantech.h +4 -0
@@ -18,6 +18,7 @@#define ETP_CAPABILITIES_QUERY 0x02#define ETP_SAMPLE_QUERY 0x03#define ETP_RESOLUTION_QUERY 0x04 +#define ETP_ICBODY_QUERY 0x05/* * Command values for register reading or writing
@@ -140,7 +141,10 @@ struct elantech_device_info {unsigned char samples[3 ];unsigned char debug;unsigned char hw_version; +unsigned char pattern;unsigned int fw_version; +unsigned int ic_version; +unsigned int product_id;unsigned int x_min;unsigned int y_min;unsigned int x_max;
drivers/media/rc/mceusb.c +8 -1
@@ -701,11 +701,18 @@ static void mceusb_dev_printdata(struct mceusb_dev *ir, u8 *buf, int buf_len, data[0], data[1]);break ;case MCE_RSP_EQIRCFS : +if (!data[0 ] && !data[1 ]) { +dev_dbg (dev,"%s: no carrier" , inout); +break ; + } +// prescaler should make sense +if (data[0 ] >8 ) +break ; period =DIV_ROUND_CLOSEST ((1U << data[0 ] *2 ) * (data[1 ] +1 ),10 );if (!period)break ; - carrier = (1000 *1000 ) / period; + carrier =USEC_PER_SEC / period;dev_dbg (dev,"%s carrier of %u Hz (period %uus)" , inout, carrier, period);break ;
drivers/media/usb/uvc/uvc_driver.c +5 -2
@@ -967,7 +967,10 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,unsigned int i; extra_size =roundup (extra_size,sizeof (*entity->pads)); - num_inputs = (type &UVC_TERM_OUTPUT ) ? num_pads : num_pads -1 ; +if (num_pads) + num_inputs = type &UVC_TERM_OUTPUT ? num_pads : num_pads -1 ; +else + num_inputs =0 ; size =sizeof (*entity) + extra_size +sizeof (*entity->pads) * num_pads + num_inputs; entity =kzalloc (size,GFP_KERNEL );
@@ -983,7 +986,7 @@ static struct uvc_entity *uvc_alloc_entity(u16 type, u8 id,for (i =0 ; i < num_inputs; ++i) entity->pads[i].flags =MEDIA_PAD_FL_SINK ; -if (!UVC_ENTITY_IS_OTERM (entity)) +if (!UVC_ENTITY_IS_OTERM (entity) && num_pads) entity->pads[num_pads-1 ].flags =MEDIA_PAD_FL_SOURCE ; entity->bNrInPins = num_inputs;
drivers/media/v4l2-core/v4l2-ctrls.c +2 -1
@@ -1795,7 +1795,8 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,case V4L2_CTRL_TYPE_INTEGER_MENU :if (ptr.p_s32[idx] < ctrl->minimum || ptr.p_s32[idx] > ctrl->maximum)return -ERANGE ; -if (ctrl->menu_skip_mask & (1ULL << ptr.p_s32[idx])) +if (ptr.p_s32[idx] <BITS_PER_LONG_LONG && + (ctrl->menu_skip_mask &BIT_ULL (ptr.p_s32[idx])))return -EINVAL ;if (ctrl->type ==V4L2_CTRL_TYPE_MENU && ctrl->qmenu[ptr.p_s32[idx]][0 ] =='\0' )
drivers/media/v4l2-core/v4l2-ioctl.c +7 -12
@@ -3016,7 +3016,7 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg, v4l2_kioctl func) {char sbuf[128 ]; -void *mbuf =NULL ; +void *mbuf =NULL , *array_buf =NULL ;void *parg = (void *)arg;long err = -EINVAL ;bool has_array_args;
@@ -3075,20 +3075,14 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg, has_array_args = err;if (has_array_args) { -/* -* When adding new types of array args, make sure that the -* parent argument to ioctl (which contains the pointer to the -* array) fits into sbuf (so that mbuf will still remain -* unused up to here). -*/ - mbuf =kvmalloc (array_size,GFP_KERNEL ); + array_buf =kvmalloc (array_size,GFP_KERNEL ); err = -ENOMEM ; -if (NULL == mbuf) +if (array_buf ==NULL ) goto out_array_args; err = -EFAULT ; -if (copy_from_user (mbuf, user_ptr, array_size)) +if (copy_from_user (array_buf, user_ptr, array_size)) goto out_array_args; - *kernel_ptr = mbuf; + *kernel_ptr = array_buf; }/* Handles IOCTL */
@@ -3107,7 +3101,7 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg,if (has_array_args) { *kernel_ptr = (void __force *)user_ptr; -if (copy_to_user (user_ptr, mbuf, array_size)) +if (copy_to_user (user_ptr, array_buf, array_size)) err = -EFAULT ; goto out_array_args; }
@@ -3129,6 +3123,7 @@ video_usercopy(struct file *file, unsigned int cmd, unsigned long arg, } out: +kvfree (array_buf);kvfree (mbuf);return err; }
drivers/net/ethernet/atheros/ag71xx.c +1 -3
@@ -222,8 +222,6 @@#define AG71XX_REG_RX_SM 0x01b0#define AG71XX_REG_TX_SM 0x01b4 -#define ETH_SWITCH_HEADER_LEN 2 -#define AG71XX_DEFAULT_MSG_ENABLE \ (NETIF_MSG_DRV \ | NETIF_MSG_PROBE \
@@ -784,7 +782,7 @@ static void ag71xx_hw_setup(struct ag71xx *ag)static unsigned int ag71xx_max_frame_len (unsigned int mtu) { -return ETH_SWITCH_HEADER_LEN +ETH_HLEN +VLAN_HLEN + mtu +ETH_FCS_LEN ; +return ETH_HLEN +VLAN_HLEN + mtu +ETH_FCS_LEN ; }static void ag71xx_hw_set_macaddr (struct ag71xx *ag,unsigned char *mac)
drivers/net/tap.c +3 -4
@@ -1095,10 +1095,9 @@ static long tap_ioctl(struct file *file, unsigned int cmd,return -ENOLINK ; } ret =0 ; - u = tap->dev->type; +dev_get_mac_address (&sa,dev_net (tap->dev), tap->dev->name);if (copy_to_user (&ifr->ifr_name, tap->dev->name,IFNAMSIZ ) || -copy_to_user (&ifr->ifr_hwaddr.sa_data, tap->dev->dev_addr,ETH_ALEN ) || -put_user (u, &ifr->ifr_hwaddr.sa_family)) +copy_to_user (&ifr->ifr_hwaddr, &sa,sizeof (sa))) ret = -EFAULT ;tap_put_tap_dev (tap);rtnl_unlock ();
@@ -1113,7 +1112,7 @@ static long tap_ioctl(struct file *file, unsigned int cmd,rtnl_unlock ();return -ENOLINK ; } - ret =dev_set_mac_address (tap->dev, &sa,NULL ); + ret =dev_set_mac_address_user (tap->dev, &sa,NULL );tap_put_tap_dev (tap);rtnl_unlock ();return ret;
drivers/net/tun.c +2 -2
@@ -3224,7 +3224,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,case SIOCGIFHWADDR :/* Get hw address */ memcpy (ifr.ifr_hwaddr.sa_data, tun->dev->dev_addr,ETH_ALEN ); - ifr.ifr_hwaddr.sa_family = tun->dev->type; +dev_get_mac_address (&ifr.ifr_hwaddr, net, tun->dev->name);if (copy_to_user (argp, &ifr, ifreq_len)) ret = -EFAULT ;break ;
@@ -3234,7 +3234,7 @@ static long __tun_chr_ioctl(struct file *file, unsigned int cmd,tun_debug (KERN_DEBUG , tun,"set hw address: %pM\n" , ifr.ifr_hwaddr.sa_data); - ret =dev_set_mac_address (tun->dev, &ifr.ifr_hwaddr,NULL ); + ret =dev_set_mac_address_user (tun->dev, &ifr.ifr_hwaddr,NULL );break ;case TUNGETSNDBUF :
drivers/net/usb/qmi_wwan.c +1 -0
@@ -1280,6 +1280,7 @@ static const struct usb_device_id products[] = { {QMI_FIXED_INTF(0x19d2, 0x1255, 4)}, {QMI_FIXED_INTF(0x19d2, 0x1256, 4)}, {QMI_FIXED_INTF(0x19d2, 0x1270, 5)}, /* ZTE MF667 */ + {QMI_FIXED_INTF(0x19d2, 0x1275, 3)}, /* ZTE P685M */ {QMI_FIXED_INTF(0x19d2, 0x1401, 2)}, {QMI_FIXED_INTF(0x19d2, 0x1402, 2)}, /* ZTE MF60 */ {QMI_FIXED_INTF(0x19d2, 0x1424, 2)},
drivers/net/wireless/ath/ath10k/mac.c +4 -11
@@ -3624,23 +3624,16 @@ bool ath10k_mac_tx_frm_has_freq(struct ath10k *ar)static int ath10k_mac_tx_wmi_mgmt (struct ath10k *ar,struct sk_buff *skb) {struct sk_buff_head *q = &ar->wmi_mgmt_tx_queue; -int ret =0 ; - -spin_lock_bh (&ar->data_lock); -if (skb_queue_len (q) ==ATH10K_MAX_NUM_MGMT_PENDING ) { +if (skb_queue_len_lockless (q) >=ATH10K_MAX_NUM_MGMT_PENDING ) {ath10k_warn (ar,"wmi mgmt tx queue is full\n" ); - ret = -ENOSPC ; - goto unlock; +return -ENOSPC ; } -__skb_queue_tail (q, skb); +skb_queue_tail (q, skb);ieee80211_queue_work (ar->hw, &ar->wmi_mgmt_tx_work); -unlock: -spin_unlock_bh (&ar->data_lock); - -return ret; +return 0 ; } static enum ath10k_mac_tx_path
drivers/net/wireless/broadcom/brcm80211/brcmfmac/dmi.c +32 -0
@@ -40,6 +40,18 @@ static const struct brcmf_dmi_data pov_tab_p1006w_data = {BRCM_CC_43340_CHIP_ID ,2 ,"pov-tab-p1006w-data" }; +static const struct brcmf_dmi_data predia_basic_data = { +BRCM_CC_43341_CHIP_ID ,2 ,"predia-basic" +}; + +/* Note the Voyo winpad A15 tablet uses the same Ampak AP6330 module, with the +* exact same nvram file as the Prowise-PT301 tablet. Since the nvram for the +* Prowise-PT301 is already in linux-firmware we just point to that here. +*/ +static const struct brcmf_dmi_data voyo_winpad_a15_data = { +BRCM_CC_4330_CHIP_ID ,4 ,"Prowise-PT301" +}; +static const struct dmi_system_id dmi_platform_data[] = { {/* ACEPC T8 Cherry Trail Z8350 mini PC */
@@ -111,6 +123,26 @@ static const struct dmi_system_id dmi_platform_data[] = { }, .driver_data = (void *)&pov_tab_p1006w_data, }, + { + /* Predia Basic tablet (+ with keyboard dock) */ + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Insyde"), + DMI_MATCH(DMI_PRODUCT_NAME, "CherryTrail"), + /* Mx.WT107.KUBNGEA02 with the version-nr dropped */ + DMI_MATCH(DMI_BIOS_VERSION, "Mx.WT107.KUBNGEA"), + }, + .driver_data = (void *)&predia_basic_data, + }, + { + /* Voyo winpad A15 tablet */ + .matches = { + DMI_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), + DMI_MATCH(DMI_BOARD_NAME, "Aptio CRB"), + /* Above strings are too generic, also match on BIOS date */ + DMI_MATCH(DMI_BIOS_DATE, "11/20/2014"), + }, + .driver_data = (void *)&voyo_winpad_a15_data, + }, {} };
drivers/net/wireless/rsi/rsi_91x_hal.c +2 -1
@@ -248,7 +248,8 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)rsi_set_len_qno (&data_desc->len_qno, (skb->len -FRAME_DESC_SZ ),RSI_WIFI_MGMT_Q ); -if ((skb->len - header_size) ==EAPOL4_PACKET_LEN ) { +if (((skb->len - header_size) ==EAPOL4_PACKET_LEN ) || + ((skb->len - header_size) ==EAPOL4_PACKET_LEN -2 )) { data_desc->misc_flags |=RSI_DESC_REQUIRE_CFM_TO_HOST ; xtend_desc->confirm_frame_type =EAPOL4_CONFIRM ;
drivers/net/wireless/rsi/rsi_91x_sdio.c +1 -5
@@ -153,9 +153,7 @@ static void rsi_handle_interrupt(struct sdio_func *function)if (adapter->priv->fsm_state ==FSM_FW_NOT_LOADED )return ; - dev->sdio_irq_task = current; -rsi_interrupt_handler (adapter); - dev->sdio_irq_task =NULL ; +rsi_set_event (&dev->rx_thread.event); }/**
@@ -1059,8 +1057,6 @@ static int rsi_probe(struct sdio_func *pfunction,rsi_dbg (ERR_ZONE ,"%s: Unable to init rx thrd\n" , __func__); goto fail_kill_thread; } -skb_queue_head_init (&sdev->rx_q.head); - sdev->rx_q.num_rx_pkts =0 ;sdio_claim_host (pfunction);if (sdio_claim_irq (pfunction, rsi_handle_interrupt)) {
drivers/net/wireless/rsi/rsi_91x_sdio_ops.c +13 -39
96 lines not on this page · raw message
drivers/net/wireless/rsi/rsi_sdio.h +1 -7
@@ -111,11 +111,6 @@ struct receive_info {u32 buf_available_counter; }; -struct rsi_sdio_rx_q { -u8 num_rx_pkts; -struct sk_buff_head head; -}; -struct rsi_91x_sdiodev {struct sdio_func *pfunction;struct task_struct *sdio_irq_task;
@@ -128,11 +123,10 @@ struct rsi_91x_sdiodev {u16 tx_blk_size;u8 write_fail;bool buff_status_updated; -struct rsi_sdio_rx_q rx_q;struct rsi_thread rx_thread; +u8 pktbuffer[8192 ]__aligned(4) ; }; -void rsi_interrupt_handler (struct rsi_hw *adapter);int rsi_init_sdio_slave_regs (struct rsi_hw *adapter);int rsi_sdio_read_register (struct rsi_hw *adapter,u32 addr,u8 *data);int rsi_sdio_host_intf_read_pkt (struct rsi_hw *adapter,u8 *pkt,u32 length);
drivers/net/wireless/ti/wl12xx/main.c +0 -3
@@ -635,7 +635,6 @@ static int wl12xx_identify_chip(struct wl1271 *wl) wl->quirks |=WLCORE_QUIRK_LEGACY_NVS |WLCORE_QUIRK_DUAL_PROBE_TMPL |WLCORE_QUIRK_TKIP_HEADER_SPACE | -WLCORE_QUIRK_START_STA_FAILS |WLCORE_QUIRK_AP_ZERO_SESSION_ID ; wl->sr_fw_name =WL127X_FW_NAME_SINGLE ; wl->mr_fw_name =WL127X_FW_NAME_MULTI ;
@@ -659,7 +658,6 @@ static int wl12xx_identify_chip(struct wl1271 *wl) wl->quirks |=WLCORE_QUIRK_LEGACY_NVS |WLCORE_QUIRK_DUAL_PROBE_TMPL |WLCORE_QUIRK_TKIP_HEADER_SPACE | -WLCORE_QUIRK_START_STA_FAILS |WLCORE_QUIRK_AP_ZERO_SESSION_ID ; wl->plt_fw_name =WL127X_PLT_FW_NAME ; wl->sr_fw_name =WL127X_FW_NAME_SINGLE ;
@@ -688,7 +686,6 @@ static int wl12xx_identify_chip(struct wl1271 *wl) wl->quirks |=WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN |WLCORE_QUIRK_DUAL_PROBE_TMPL |WLCORE_QUIRK_TKIP_HEADER_SPACE | -WLCORE_QUIRK_START_STA_FAILS |WLCORE_QUIRK_AP_ZERO_SESSION_ID ; wlcore_set_min_fw_ver(wl, WL128X_CHIP_VER,
drivers/net/wireless/ti/wlcore/main.c +1 -14
@@ -2862,21 +2862,8 @@ static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)if (is_ibss) ret =wl12xx_cmd_role_start_ibss (wl, wlvif); -else { -if (wl->quirks &WLCORE_QUIRK_START_STA_FAILS ) { -/* -* TODO: this is an ugly workaround for wl12xx fw -* bug - we are not able to tx/rx after the first -* start_sta, so make dummy start+stop calls, -* and then call start_sta again. -* this should be fixed in the fw. -*/ -wl12xx_cmd_role_start_sta (wl, wlvif); -wl12xx_cmd_role_stop_sta (wl, wlvif); - } - +else ret =wl12xx_cmd_role_start_sta (wl, wlvif); - }return ret; }
drivers/net/wireless/ti/wlcore/wlcore.h +0 -3
@@ -547,9 +547,6 @@ wlcore_set_min_fw_ver(struct wl1271 *wl, unsigned int chip,/* Each RX/TX transaction requires an end-of-transaction transfer */ #define WLCORE_QUIRK_END_OF_TRANSACTION BIT(0) -/* the first start_role(sta) sometimes doesn't work on wl12xx */ -#define WLCORE_QUIRK_START_STA_FAILS BIT(1) -/* wl127x and SPI don't support SDIO block size alignment */ #define WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN BIT(2)
drivers/net/xen-netback/netback.c +11 -1
@@ -1335,11 +1335,21 @@ int xenvif_tx_action(struct xenvif_queue *queue, int budget)return 0 ;gnttab_batch_copy (queue->tx_copy_ops, nr_cops); -if (nr_mops !=0 ) +if (nr_mops !=0 ) { ret =gnttab_map_refs (queue->tx_map_ops,NULL , queue->pages_to_map, nr_mops); +if (ret) { +unsigned int i; + +netdev_err (queue->vif->dev,"Map fail: nr %u ret %d\n" , + nr_mops, ret); +for (i =0 ; i < nr_mops; ++i) +WARN_ON_ONCE (queue->tx_map_ops[i].status == + GNTST_okay); + } + } work_done =xenvif_tx_submit (queue);
drivers/nvme/host/core.c +20 -0
@@ -317,6 +317,26 @@ bool nvme_cancel_request(struct request *req, void *data, bool reserved) }EXPORT_SYMBOL_GPL (nvme_cancel_request); +void nvme_cancel_tagset (struct nvme_ctrl *ctrl) +{ +if (ctrl->tagset) { +blk_mq_tagset_busy_iter (ctrl->tagset, + nvme_cancel_request, ctrl); +blk_mq_tagset_wait_completed_request (ctrl->tagset); + } +} +EXPORT_SYMBOL_GPL (nvme_cancel_tagset); + +void nvme_cancel_admin_tagset (struct nvme_ctrl *ctrl) +{ +if (ctrl->admin_tagset) { +blk_mq_tagset_busy_iter (ctrl->admin_tagset, + nvme_cancel_request, ctrl); +blk_mq_tagset_wait_completed_request (ctrl->admin_tagset); + } +} +EXPORT_SYMBOL_GPL (nvme_cancel_admin_tagset); +bool nvme_change_ctrl_state (struct nvme_ctrl *ctrl,enum nvme_ctrl_state new_state) {
drivers/nvme/host/nvme.h +2 -0
@@ -468,6 +468,8 @@ static inline void nvme_put_ctrl(struct nvme_ctrl *ctrl)void nvme_complete_rq (struct request *req);bool nvme_cancel_request (struct request *req,void *data,bool reserved); +void nvme_cancel_tagset (struct nvme_ctrl *ctrl); +void nvme_cancel_admin_tagset (struct nvme_ctrl *ctrl);bool nvme_change_ctrl_state (struct nvme_ctrl *ctrl,enum nvme_ctrl_state new_state);bool nvme_wait_reset (struct nvme_ctrl *ctrl);
drivers/nvme/host/pci.c +67 -38
174 lines not on this page · raw message
drivers/nvme/host/rdma.c +16 -2
@@ -835,12 +835,16 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl, error =nvme_init_identify (&ctrl->ctrl);if (error) - goto out_stop_queue; + goto out_quiesce_queue;return 0 ; +out_quiesce_queue: +blk_mq_quiesce_queue (ctrl->ctrl.admin_q); +blk_sync_queue (ctrl->ctrl.admin_q); out_stop_queue:nvme_rdma_stop_queue (&ctrl->queues[0 ]); +nvme_cancel_admin_tagset (&ctrl->ctrl); out_cleanup_queue:if (new)blk_cleanup_queue (ctrl->ctrl.admin_q);
@@ -917,8 +921,10 @@ static int nvme_rdma_configure_io_queues(struct nvme_rdma_ctrl *ctrl, bool new) out_wait_freeze_timed_out:nvme_stop_queues (&ctrl->ctrl); +nvme_sync_io_queues (&ctrl->ctrl);nvme_rdma_stop_io_queues (ctrl); out_cleanup_connect_q: +nvme_cancel_tagset (&ctrl->ctrl);if (new)blk_cleanup_queue (ctrl->ctrl.connect_q); out_free_tag_set:
@@ -1054,10 +1060,18 @@ static int nvme_rdma_setup_ctrl(struct nvme_rdma_ctrl *ctrl, bool new)return 0 ; destroy_io: -if (ctrl->ctrl.queue_count >1 ) +if (ctrl->ctrl.queue_count >1 ) { +nvme_stop_queues (&ctrl->ctrl); +nvme_sync_io_queues (&ctrl->ctrl); +nvme_rdma_stop_io_queues (ctrl); +nvme_cancel_tagset (&ctrl->ctrl);nvme_rdma_destroy_io_queues (ctrl, new); + } destroy_admin: +blk_mq_quiesce_queue (ctrl->ctrl.admin_q); +blk_sync_queue (ctrl->ctrl.admin_q);nvme_rdma_stop_queue (&ctrl->queues[0 ]); +nvme_cancel_admin_tagset (&ctrl->ctrl);nvme_rdma_destroy_admin_queue (ctrl, new);return ret; }
drivers/nvme/host/tcp.c +16 -2
@@ -1710,8 +1710,10 @@ static int nvme_tcp_configure_io_queues(struct nvme_ctrl *ctrl, bool new) out_wait_freeze_timed_out:nvme_stop_queues (ctrl); +nvme_sync_io_queues (ctrl);nvme_tcp_stop_io_queues (ctrl); out_cleanup_connect_q: +nvme_cancel_tagset (ctrl);if (new)blk_cleanup_queue (ctrl->connect_q); out_free_tag_set:
@@ -1773,12 +1775,16 @@ static int nvme_tcp_configure_admin_queue(struct nvme_ctrl *ctrl, bool new) error =nvme_init_identify (ctrl);if (error) - goto out_stop_queue; + goto out_quiesce_queue;return 0 ; +out_quiesce_queue: +blk_mq_quiesce_queue (ctrl->admin_q); +blk_sync_queue (ctrl->admin_q); out_stop_queue:nvme_tcp_stop_queue (ctrl,0 ); +nvme_cancel_admin_tagset (ctrl); out_cleanup_queue:if (new)blk_cleanup_queue (ctrl->admin_q);
@@ -1892,10 +1898,18 @@ static int nvme_tcp_setup_ctrl(struct nvme_ctrl *ctrl, bool new)return 0 ; destroy_io: -if (ctrl->queue_count >1 ) +if (ctrl->queue_count >1 ) { +nvme_stop_queues (ctrl); +nvme_sync_io_queues (ctrl); +nvme_tcp_stop_io_queues (ctrl); +nvme_cancel_tagset (ctrl);nvme_tcp_destroy_io_queues (ctrl, new); + } destroy_admin: +blk_mq_quiesce_queue (ctrl->admin_q); +blk_sync_queue (ctrl->admin_q);nvme_tcp_stop_queue (ctrl,0 ); +nvme_cancel_admin_tagset (ctrl);nvme_tcp_destroy_admin_queue (ctrl, new);return ret; }
drivers/pci/pci.c +8 -1
@@ -3471,7 +3471,14 @@ u32 pci_rebar_get_possible_sizes(struct pci_dev *pdev, int bar)return 0 ;pci_read_config_dword (pdev, pos +PCI_REBAR_CAP , &cap); -return (cap &PCI_REBAR_CAP_SIZES ) >>4 ; + cap &=PCI_REBAR_CAP_SIZES ; + +/* Sapphire RX 5600 XT Pulse has an invalid cap dword for BAR 0 */ +if (pdev->vendor ==PCI_VENDOR_ID_ATI && pdev->device ==0x731f && + bar ==0 && cap ==0x7000 ) + cap =0x3f000 ; + +return cap >>4 ; }/**
drivers/scsi/libiscsi.c +74 -74
316 lines not on this page · raw message
drivers/scsi/scsi_transport_iscsi.c +30 -8
@@ -124,7 +124,11 @@ show_transport_handle(struct device *dev, struct device_attribute *attr, char *buf) {struct iscsi_internal *priv =dev_to_iscsi_internal (dev); -return sprintf (buf,"%llu\n" , (unsigned long long )iscsi_handle (priv->iscsi_transport)); + +if (!capable (CAP_SYS_ADMIN )) +return -EACCES ; +return sysfs_emit (buf,"%llu\n" , + (unsigned long long )iscsi_handle (priv->iscsi_transport)); } static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
@@ -134,7 +138,7 @@ show_transport_##name(struct device *dev, \ struct device_attribute *attr,char *buf) \ { \ struct iscsi_internal *priv = dev_to_iscsi_internal(dev); \ -return sprintf (buf, format"\n" , priv->iscsi_transport->name); \ +return sysfs_emit (buf, format"\n" , priv->iscsi_transport->name);\ } \ static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
@@ -175,7 +179,7 @@ static ssize_t show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf) { struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev); -return sprintf (buf,"%llu\n" , (unsigned long long ) ep->id); +return sysfs_emit (buf,"%llu\n" , (unsigned long long ) ep->id); } static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
@@ -2765,6 +2769,9 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)struct iscsi_cls_session *session;int err =0 , value =0 ; +if (ev->u.set_param.len >PAGE_SIZE ) +return -EINVAL ; + session =iscsi_session_lookup (ev->u.set_param.sid); conn =iscsi_conn_lookup (ev->u.set_param.sid, ev->u.set_param.cid);if (!conn || !session)
@@ -2912,6 +2919,9 @@ iscsi_set_host_param(struct iscsi_transport *transport,if (!transport->set_host_param)return -ENOSYS ; +if (ev->u.set_host_param.len >PAGE_SIZE ) +return -EINVAL ; + shost =scsi_host_lookup (ev->u.set_host_param.host_no);if (!shost) { printk(KERN_ERR "set_host_param could not find host no %u\n",
@@ -3499,6 +3509,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) {int err =0 ;u32 portid; +u32 pdu_len;struct iscsi_uevent *ev =nlmsg_data (nlh);struct iscsi_transport *transport =NULL ;struct iscsi_internal *priv;
@@ -3506,6 +3517,9 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)struct iscsi_cls_conn *conn;struct iscsi_endpoint *ep =NULL ; +if (!netlink_capable (skb,CAP_SYS_ADMIN )) +return -EPERM ; +if (nlh->nlmsg_type ==ISCSI_UEVENT_PATH_UPDATE ) *group =ISCSI_NL_GRP_UIP ;else
@@ -3613,6 +3627,14 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group) err = -EINVAL ;break ;case ISCSI_UEVENT_SEND_PDU : + pdu_len = nlh->nlmsg_len -sizeof (*nlh) -sizeof (*ev); + +if ((ev->u.send_pdu.hdr_size > pdu_len) || + (ev->u.send_pdu.data_size > (pdu_len - ev->u.send_pdu.hdr_size))) { + err = -EINVAL ; +break ; + } + conn =iscsi_conn_lookup (ev->u.send_pdu.sid, ev->u.send_pdu.cid);if (conn) ev->r.retcode = transport->send_pdu(conn,
@@ -4019,7 +4041,7 @@ show_priv_session_state(struct device *dev, struct device_attribute *attr, char *buf) {struct iscsi_cls_session *session =iscsi_dev_to_session (dev->parent); -return sprintf (buf,"%s\n" ,iscsi_session_state_name (session->state)); +return sysfs_emit (buf,"%s\n" ,iscsi_session_state_name (session->state)); } static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state, NULL);
@@ -4028,7 +4050,7 @@ show_priv_session_creator(struct device *dev, struct device_attribute *attr, char *buf) {struct iscsi_cls_session *session =iscsi_dev_to_session (dev->parent); -return sprintf (buf,"%d\n" , session->creator); +return sysfs_emit (buf,"%d\n" , session->creator); } static ISCSI_CLASS_ATTR(priv_sess, creator, S_IRUGO, show_priv_session_creator, NULL);
@@ -4037,7 +4059,7 @@ show_priv_session_target_id(struct device *dev, struct device_attribute *attr, char *buf) {struct iscsi_cls_session *session =iscsi_dev_to_session (dev->parent); -return sprintf (buf,"%d\n" , session->target_id); +return sysfs_emit (buf,"%d\n" , session->target_id); } static ISCSI_CLASS_ATTR(priv_sess, target_id, S_IRUGO, show_priv_session_target_id, NULL);
@@ -4050,8 +4072,8 @@ show_priv_session_##field(struct device *dev, \struct iscsi_cls_session *session = \iscsi_dev_to_session (dev->parent); \if (session->field ==-1 ) \ -return sprintf (buf,"off\n" ); \ -return sprintf (buf, format"\n" , session->field); \ +return sysfs_emit (buf,"off\n" ); \ +return sysfs_emit (buf, format"\n" , session->field); \ }#define iscsi_priv_session_attr_store (field) \
drivers/staging/fwserial/fwserial.c +2 -0
@@ -2189,6 +2189,7 @@ static int fwserial_create(struct fw_unit *unit) err =fw_core_add_address_handler (&port->rx_handler, &fw_high_memory_region);if (err) { +tty_port_destroy (&port->port);kfree (port); goto free_ports; }
@@ -2271,6 +2272,7 @@ static int fwserial_create(struct fw_unit *unit) free_ports:for (--i; i >=0 ; --i) { +fw_core_remove_address_handler (&serial->ports[i]->rx_handler);tty_port_destroy (&serial->ports[i]->port);kfree (serial->ports[i]); }
drivers/staging/most/sound/sound.c +2 -0
@@ -98,6 +98,8 @@ static void swap_copy24(u8 *dest, const u8 *source, unsigned int bytes) {unsigned int i =0 ; +if (bytes <2 ) +return ;while (i < bytes -2 ) { dest[i] = source[i +2 ]; dest[i +1 ] = source[i +1 ];
drivers/staging/vc04_services/bcm2835-audio/bcm2835-ctl.c +3 -3
@@ -224,7 +224,7 @@ int snd_bcm2835_new_ctl(struct bcm2835_chip *chip) {int err; -strcpy (chip->card->mixername,"Broadcom Mixer" ); +strscpy (chip->card->mixername,"Broadcom Mixer" ,sizeof (chip->card->mixername)); err =create_ctls (chip,ARRAY_SIZE (snd_bcm2835_ctl), snd_bcm2835_ctl);if (err <0 )return err;
@@ -261,7 +261,7 @@ static const struct snd_kcontrol_new snd_bcm2835_headphones_ctl[] = {int snd_bcm2835_new_headphones_ctl (struct bcm2835_chip *chip) { -strcpy (chip->card->mixername,"Broadcom Mixer" ); +strscpy (chip->card->mixername,"Broadcom Mixer" ,sizeof (chip->card->mixername));return create_ctls (chip,ARRAY_SIZE (snd_bcm2835_headphones_ctl), snd_bcm2835_headphones_ctl); }
@@ -295,7 +295,7 @@ static const struct snd_kcontrol_new snd_bcm2835_hdmi[] = {int snd_bcm2835_new_hdmi_ctl (struct bcm2835_chip *chip) { -strcpy (chip->card->mixername,"Broadcom Mixer" ); +strscpy (chip->card->mixername,"Broadcom Mixer" ,sizeof (chip->card->mixername));return create_ctls (chip,ARRAY_SIZE (snd_bcm2835_hdmi), snd_bcm2835_hdmi); }
drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c +1 -1
@@ -351,7 +351,7 @@ int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, const char *name, pcm->private_data = chip; pcm->nonatomic = true; -strcpy (pcm->name, name); +strscpy (pcm->name, name,sizeof (pcm->name));if (!spdif) { chip->dest = route; chip->volume =0 ;
drivers/staging/vc04_services/bcm2835-audio/bcm2835.c +3 -3
@@ -185,9 +185,9 @@ static int snd_add_child_device(struct device *dev, goto error; } -strcpy (card->driver, audio_driver->driver.name); -strcpy (card->shortname, audio_driver->shortname); -strcpy (card->longname, audio_driver->longname); +strscpy (card->driver, audio_driver->driver.name,sizeof (card->driver)); +strscpy (card->shortname, audio_driver->shortname,sizeof (card->shortname)); +strscpy (card->longname, audio_driver->longname,sizeof (card->longname)); err = audio_driver->newpcm(chip, audio_driver->shortname, audio_driver->route,
drivers/tty/vt/consolemap.c +1 -1
@@ -495,7 +495,7 @@ con_insert_unipair(struct uni_pagedir *p, u_short unicode, u_short fontpos) p2[unicode &0x3f ] = fontpos; - p->sum += (fontpos <<20 ) + unicode; + p->sum += (fontpos <<20U ) + unicode;return 0 ; }
drivers/video/fbdev/udlfb.c +1 -0
@@ -1017,6 +1017,7 @@ static void dlfb_ops_destroy(struct fb_info *info) }vfree (dlfb->backing_buffer);kfree (dlfb->edid); +dlfb_free_urb_list (dlfb);usb_put_dev (dlfb->udev);kfree (dlfb);
fs/btrfs/transaction.c +6 -5
@@ -1212,7 +1212,6 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans)struct btrfs_root *gang[8 ];int i;int ret; -int err =0 ;spin_lock (&fs_info->fs_roots_radix_lock);while (1 ) {
@@ -1224,6 +1223,8 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans)break ;for (i =0 ; i < ret; i++) {struct btrfs_root *root = gang[i]; +int ret2; +radix_tree_tag_clear (&fs_info->fs_roots_radix, (unsigned long )root->root_key.objectid,BTRFS_ROOT_TRANS_TAG );
@@ -1245,17 +1246,17 @@ static noinline int commit_fs_roots(struct btrfs_trans_handle *trans) root->node); } - err =btrfs_update_root (trans, fs_info->tree_root, + ret2 =btrfs_update_root (trans, fs_info->tree_root, &root->root_key, &root->root_item); +if (ret2) +return ret2;spin_lock (&fs_info->fs_roots_radix_lock); -if (err) -break ;btrfs_qgroup_free_meta_all_pertrans (root); } }spin_unlock (&fs_info->fs_roots_radix_lock); -return err; +return 0 ; }/*
fs/erofs/super.c +2 -2
@@ -124,8 +124,8 @@ static int erofs_read_superblock(struct super_block *sb) blkszbits = dsb->blkszbits;/* 9(512 bytes) + LOG_SECTORS_PER_BLOCK == LOG_BLOCK_SIZE */ if (blkszbits !=LOG_BLOCK_SIZE ) { -erofs_err (sb,"blksize %u isn't supported on this platform" , -1 << blkszbits); +erofs_err (sb,"blkszbits %u isn't supported on this platform" , + blkszbits); goto out; }
fs/f2fs/namei.c +8 -0
@@ -797,7 +797,11 @@ static int __f2fs_tmpfile(struct inode *dir, struct dentry *dentry,if (whiteout) {f2fs_i_links_write (inode, false); + +spin_lock (&inode->i_lock); inode->i_state |=I_LINKABLE ; +spin_unlock (&inode->i_lock); + *whiteout = inode; }else {d_tmpfile (dentry, inode);
@@ -996,7 +1000,11 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, err =f2fs_add_link (old_dentry, whiteout);if (err) goto put_out_dir; + +spin_lock (&whiteout->i_lock); whiteout->i_state &= ~I_LINKABLE ; +spin_unlock (&whiteout->i_lock); +iput (whiteout); }
fs/f2fs/segment.h +2 -2
@@ -88,11 +88,11 @@#define BLKS_PER_SEC (sbi) \ ((sbi)->segs_per_sec * (sbi)->blocks_per_seg)#define GET_SEC_FROM_SEG (sbi, segno) \ - ((segno) / (sbi)->segs_per_sec) + (((segno) == -1) ? -1: (segno) / (sbi)->segs_per_sec)#define GET_SEG_FROM_SEC (sbi, secno) \ ((secno) * (sbi)->segs_per_sec)#define GET_ZONE_FROM_SEC (sbi, secno) \ - ((secno) / (sbi)->secs_per_zone) + (((secno) == -1) ? -1: (secno) / (sbi)->secs_per_zone)#define GET_ZONE_FROM_SEG (sbi, segno) \ GET_ZONE_FROM_SEC(sbi, GET_SEC_FROM_SEG(sbi, segno))
fs/jfs/jfs_filsys.h +1 -0
@@ -268,5 +268,6 @@* fsck() must be run to repair */ #define FM_EXTENDFS 0x00000008/* file system extendfs() in progress */ +#define FM_STATE_MAX 0x0000000f/* max value of s_state */ #endif /* _H_JFS_FILSYS */
fs/jfs/jfs_mount.c +10 -0
@@ -36,6 +36,7 @@#include <linux/fs.h> #include <linux/buffer_head.h> +#include <linux/log2.h> #include "jfs_incore.h" #include "jfs_filsys.h"
@@ -365,6 +366,15 @@ static int chkSuper(struct super_block *sb) sbi->bsize = bsize; sbi->l2bsize =le16_to_cpu (j_sb->s_l2bsize); +/* check some fields for possible corruption */ +if (sbi->l2bsize !=ilog2 ((u32 )bsize) || + j_sb->pad !=0 || +le32_to_cpu (j_sb->s_state) >FM_STATE_MAX ) { + rc = -EINVAL ; +jfs_err ("jfs_mount: Mount Failure: superblock is corrupt!" ); + goto out; + } +/* * For now, ignore s_pbsize, l2bfactor. All I/O going through buffer * cache.
fs/sysfs/file.c +55 -0
64 lines not on this page · raw message
fs/xfs/xfs_iops.c +1 -1
@@ -839,7 +839,7 @@ xfs_setattr_size(ASSERT (xfs_isilocked (ip,XFS_MMAPLOCK_EXCL ));ASSERT (S_ISREG (inode->i_mode));ASSERT ((iattr->ia_valid & (ATTR_UID |ATTR_GID |ATTR_ATIME |ATTR_ATIME_SET | -ATTR_MTIME_SET |ATTR_KILL_PRIV |ATTR_TIMES_SET )) ==0 ); +ATTR_MTIME_SET |ATTR_TIMES_SET )) ==0 ); oldsize = inode->i_size; newsize = iattr->ia_size;
include/linux/netdevice.h +3 -0
@@ -3679,6 +3679,9 @@ int dev_pre_changeaddr_notify(struct net_device *dev, const char *addr, struct netlink_ext_ack *extack);int dev_set_mac_address (struct net_device *dev,struct sockaddr *sa,struct netlink_ext_ack *extack); +int dev_set_mac_address_user (struct net_device *dev,struct sockaddr *sa, +struct netlink_ext_ack *extack); +int dev_get_mac_address (struct sockaddr *sa,struct net *net,char *dev_name);int dev_change_carrier (struct net_device *,bool new_carrier);int dev_get_phys_port_id (struct net_device *dev,struct netdev_phys_item_id *ppid);
include/linux/swap.h +1 -0
@@ -473,6 +473,7 @@ struct backing_dev_info;extern int init_swap_address_space (unsigned int type,unsigned long nr_pages);extern void exit_swap_address_space (unsigned int type);extern struct swap_info_struct *get_swap_device (swp_entry_t entry); +sector_t swap_page_sector (struct page *page);static inline void put_swap_device (struct swap_info_struct *si) {
include/linux/sysfs.h +16 -0
@@ -310,6 +310,11 @@ static inline void sysfs_enable_ns(struct kernfs_node *kn)return kernfs_enable_ns (kn); } +__printf(2, 3) +int sysfs_emit(char *buf, const char *fmt, ...); +__printf(3, 4) +int sysfs_emit_at (char *buf,int at,const char *fmt, ...); +#else /* CONFIG_SYSFS */ static inline int sysfs_create_dir_ns (struct kobject *kobj,const void *ns)
@@ -522,6 +527,17 @@ static inline void sysfs_enable_ns(struct kernfs_node *kn) { } +__printf(2, 3) +static inline int sysfs_emit (char *buf,const char *fmt, ...) +{ +return 0 ; +} + +__printf(3, 4) +static inline int sysfs_emit_at (char *buf,int at,const char *fmt, ...) +{ +return 0 ; +}#endif /* CONFIG_SYSFS */ static inline int __must_check sysfs_create_file(struct kobject *kobj,
include/linux/zsmalloc.h +1 -1
@@ -35,7 +35,7 @@ enum zs_mapmode {struct zs_pool_stats {/* How many pages were migrated (freed) */ -unsigned long pages_compacted; +atomic_long_t pages_compacted; };struct zs_pool ;
kernel/sched/core.c +3 -5
@@ -254,8 +254,9 @@ static enum hrtimer_restart hrtick(struct hrtimer *timer)static void __hrtick_restart (struct rq *rq) {struct hrtimer *timer = &rq->hrtick_timer; +ktime_t time = rq->hrtick_time; -hrtimer_start_expires (timer,HRTIMER_MODE_ABS_PINNED_HARD ); +hrtimer_start (timer, time,HRTIMER_MODE_ABS_PINNED_HARD ); }/*
@@ -280,7 +281,6 @@ static void __hrtick_start(void *arg)void hrtick_start (struct rq *rq,u64 delay) {struct hrtimer *timer = &rq->hrtick_timer; -ktime_t time;s64 delta;/*
@@ -288,9 +288,7 @@ void hrtick_start(struct rq *rq, u64 delay)* doesn't make sense and can cause timer DoS. */ delta =max_t (s64, delay,10000LL ); - time =ktime_add_ns (timer->base->get_time (), delta); - -hrtimer_set_expires (timer, time); + rq->hrtick_time =ktime_add_ns (timer->base->get_time (), delta);if (rq ==this_rq ()) {__hrtick_restart (rq);
kernel/sched/sched.h +1 -0
@@ -973,6 +973,7 @@ struct rq {call_single_data_t hrtick_csd;#endif struct hrtimer hrtick_timer; +ktime_t hrtick_time;#endif #ifdef CONFIG_SCHEDSTATS
mm/hugetlb.c +12 -10
@@ -4902,21 +4902,23 @@ static bool vma_shareable(struct vm_area_struct *vma, unsigned long addr)void adjust_range_if_pmd_sharing_possible (struct vm_area_struct *vma,unsigned long *start,unsigned long *end) { -unsigned long a_start, a_end; +unsigned long v_start =ALIGN (vma->vm_start,PUD_SIZE ), + v_end =ALIGN_DOWN (vma->vm_end,PUD_SIZE ); -if (!(vma->vm_flags &VM_MAYSHARE )) +/* +* vma need span at least one aligned PUD size and the start,end range +* must at least partialy within it. +*/ +if (!(vma->vm_flags &VM_MAYSHARE ) || !(v_end > v_start) || + (*end <= v_start) || (*start >= v_end))return ;/* Extend the range to be PUD aligned for a worst case scenario */ - a_start =ALIGN_DOWN (*start,PUD_SIZE ); - a_end =ALIGN (*end,PUD_SIZE ); +if (*start > v_start) + *start =ALIGN_DOWN (*start,PUD_SIZE ); -/* -* Intersect the range with the vma range, since pmd sharing won't be -* across vma after all -*/ - *start =max (vma->vm_start, a_start); - *end =min (vma->vm_end, a_end); +if (*end < v_end) + *end =ALIGN (*end,PUD_SIZE ); }/*
mm/page_io.c +0 -5
@@ -260,11 +260,6 @@ int swap_writepage(struct page *page, struct writeback_control *wbc)return ret; } -static sector_t swap_page_sector (struct page *page) -{ -return (sector_t )__page_file_index (page) << (PAGE_SHIFT -9 ); -} -static inline void count_swpout_vm_event (struct page *page) {#ifdef CONFIG_TRANSPARENT_HUGEPAGE
mm/swapfile.c +13 -0
@@ -221,6 +221,19 @@ offset_to_swap_extent(struct swap_info_struct *sis, unsigned long offset)BUG (); } +sector_t swap_page_sector (struct page *page) +{ +struct swap_info_struct *sis =page_swap_info (page); +struct swap_extent *se; +sector_t sector; +pgoff_t offset; + + offset =__page_file_index (page); + se =offset_to_swap_extent (sis, offset); + sector = se->start_block + (offset - se->start_page); +return sector << (PAGE_SHIFT -9 ); +} +/* * swap allocation tell device that a cluster of swap can now be discarded, * to allow the swap device to optimize its wear-levelling.
mm/zsmalloc.c +11 -6
@@ -2216,11 +2216,13 @@ static unsigned long zs_can_compact(struct size_class *class)return obj_wasted * class->pages_per_zspage; } -static void __zs_compact (struct zs_pool *pool,struct size_class *class) +static unsigned long __zs_compact (struct zs_pool *pool, +struct size_class *class) {struct zs_compact_control cc;struct zspage *src_zspage;struct zspage *dst_zspage =NULL ; +unsigned long pages_freed =0 ;spin_lock (&class->lock);while ((src_zspage =isolate_zspage (class, true))) {
@@ -2250,7 +2252,7 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class)putback_zspage (class, dst_zspage);if (putback_zspage (class, src_zspage) ==ZS_EMPTY ) {free_zspage (pool, class, src_zspage); - pool->stats.pages_compacted += class->pages_per_zspage; + pages_freed += class->pages_per_zspage; }spin_unlock (&class->lock);cond_resched ();
@@ -2261,12 +2263,15 @@ static void __zs_compact(struct zs_pool *pool, struct size_class *class)putback_zspage (class, src_zspage);spin_unlock (&class->lock); + +return pages_freed; }unsigned long zs_compact (struct zs_pool *pool) {int i;struct size_class *class; +unsigned long pages_freed =0 ;for (i =ZS_SIZE_CLASSES -1 ; i >=0 ; i--) { class = pool->size_class[i];
@@ -2274,10 +2279,11 @@ unsigned long zs_compact(struct zs_pool *pool)continue ;if (class->index != i)continue ; -__zs_compact (pool, class); + pages_freed +=__zs_compact (pool, class); } +atomic_long_add (pages_freed, &pool->stats.pages_compacted); -return pool->stats.pages_compacted; +return pages_freed; }EXPORT_SYMBOL_GPL (zs_compact);
@@ -2294,13 +2300,12 @@ static unsigned long zs_shrinker_scan(struct shrinker *shrinker, struct zs_pool *pool = container_of(shrinker, struct zs_pool, shrinker); - pages_freed = pool->stats.pages_compacted;/* * Compact classes and calculate compaction delta. * Can run concurrently with a manually triggered * (by user) compaction. */ - pages_freed =zs_compact (pool) - pages_freed; + pages_freed =zs_compact (pool);return pages_freed ? pages_freed :SHRINK_STOP ; }
net/bluetooth/amp.c +3 -0
@@ -297,6 +297,9 @@ void amp_read_loc_assoc_final_data(struct hci_dev *hdev,struct hci_request req;int err; +if (!mgr) +return ; + cp.phy_handle = hcon->handle; cp.len_so_far =cpu_to_le16 (0 ); cp.max_len =cpu_to_le16 (hdev->amp_assoc_size);
net/bridge/br_sysfs_if.c +6 -3
@@ -55,9 +55,8 @@ static BRPORT_ATTR(_name, 0644, \static int store_flag (struct net_bridge_port *p,unsigned long v,unsigned long mask) { -unsigned long flags; - - flags = p->flags; +unsigned long flags = p->flags; +int err;if (v) flags |= mask;
@@ -65,6 +64,10 @@ static int store_flag(struct net_bridge_port *p, unsigned long v, flags &= ~mask;if (flags != p->flags) { + err =br_switchdev_set_port_flag (p, flags, mask); +if (err) +return err; + p->flags = flags;br_port_flags_change (p, mask); }
net/core/dev.c +42 -0
48 lines not on this page · raw message
net/core/dev_ioctl.c +7 -13
@@ -122,17 +122,6 @@ static int dev_ifsioc_locked(struct net *net, struct ifreq *ifr, unsigned int cm ifr->ifr_mtu = dev->mtu;return 0 ; -case SIOCGIFHWADDR : -if (!dev->addr_len) -memset (ifr->ifr_hwaddr.sa_data,0 , -sizeof (ifr->ifr_hwaddr.sa_data)); -else -memcpy (ifr->ifr_hwaddr.sa_data, dev->dev_addr, -min (sizeof (ifr->ifr_hwaddr.sa_data), - (size_t )dev->addr_len)); - ifr->ifr_hwaddr.sa_family = dev->type; -return 0 ; -case SIOCGIFSLAVE : err = -EINVAL ;break ;
@@ -246,7 +235,7 @@ static int dev_ifsioc(struct net *net, struct ifreq *ifr, unsigned int cmd)case SIOCSIFHWADDR :if (dev->addr_len >sizeof (struct sockaddr ))return -EINVAL ; -return dev_set_mac_address (dev, &ifr->ifr_hwaddr,NULL ); +return dev_set_mac_address_user (dev, &ifr->ifr_hwaddr,NULL );case SIOCSIFHWBROADCAST :if (ifr->ifr_hwaddr.sa_family != dev->type)
@@ -396,6 +385,12 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, bool *need_c*/ switch (cmd) { +case SIOCGIFHWADDR : +dev_load (net, ifr->ifr_name); + ret =dev_get_mac_address (&ifr->ifr_hwaddr, net, ifr->ifr_name); +if (colon) + *colon =':' ; +return ret;/* * These ioctl calls: * - can be done by all.
@@ -405,7 +400,6 @@ int dev_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr, bool *need_ccase SIOCGIFFLAGS :case SIOCGIFMETRIC :case SIOCGIFMTU : -case SIOCGIFHWADDR :case SIOCGIFSLAVE :case SIOCGIFMAP :case SIOCGIFINDEX :
net/core/pktgen.c +1 -1
@@ -3465,7 +3465,7 @@ static int pktgen_thread_worker(void *arg)struct pktgen_dev *pkt_dev =NULL ;int cpu = t->cpu; -BUG_ON (smp_processor_id () != cpu); +WARN_ON (smp_processor_id () != cpu);init_waitqueue_head (&t->queue);complete (&t->start_done);
net/core/rtnetlink.c +1 -1
@@ -2471,7 +2471,7 @@ static int do_setlink(const struct sk_buff *skb, sa->sa_family = dev->type;memcpy (sa->sa_data,nla_data (tb[IFLA_ADDRESS ]), dev->addr_len); - err =dev_set_mac_address (dev, sa, extack); + err =dev_set_mac_address_user (dev, sa, extack);kfree (sa);if (err) goto errout;
net/core/skbuff.c +13 -1
@@ -3290,7 +3290,19 @@ EXPORT_SYMBOL(skb_split);*/ static int skb_prepare_for_shift (struct sk_buff *skb) { -return skb_cloned (skb) &&pskb_expand_head (skb,0 ,0 ,GFP_ATOMIC ); +int ret =0 ; + +if (skb_cloned (skb)) { +/* Save and restore truesize: pskb_expand_head() may reallocate +* memory where ksize(kmalloc(S)) != ksize(kmalloc(S)), but we +* cannot change truesize at this point. +*/ +unsigned int save_truesize = skb->truesize; + + ret =pskb_expand_head (skb,0 ,0 ,GFP_ATOMIC ); + skb->truesize = save_truesize; + } +return ret; }/**
net/iucv/af_iucv.c +0 -1
@@ -2176,7 +2176,6 @@ static int afiucv_hs_rcv(struct sk_buff *skb, struct net_device *dev,char nullstring[8 ];if (!pskb_may_pull (skb,sizeof (*trans_hdr))) { -WARN_ONCE (1 ,"AF_IUCV failed to receive skb, len=%u" , skb->len);kfree_skb (skb);return NET_RX_SUCCESS ; }
security/smack/smackfs.c +19 -2
@@ -1163,7 +1163,7 @@ static ssize_t smk_write_net4addr(struct file *file, const char __user *buf,return -EPERM ;if (*ppos !=0 )return -EINVAL ; -if (count <SMK_NETLBLADDRMIN ) +if (count <SMK_NETLBLADDRMIN || count >PAGE_SIZE -1 )return -EINVAL ; data =memdup_user_nul (buf, count);
@@ -1423,7 +1423,7 @@ static ssize_t smk_write_net6addr(struct file *file, const char __user *buf,return -EPERM ;if (*ppos !=0 )return -EINVAL ; -if (count <SMK_NETLBLADDRMIN ) +if (count <SMK_NETLBLADDRMIN || count >PAGE_SIZE -1 )return -EINVAL ; data =memdup_user_nul (buf, count);
@@ -1830,6 +1830,10 @@ static ssize_t smk_write_ambient(struct file *file, const char __user *buf,if (!smack_privileged (CAP_MAC_ADMIN ))return -EPERM ; +/* Enough data must be present */ +if (count ==0 || count >PAGE_SIZE ) +return -EINVAL ; + data =memdup_user_nul (buf, count);if (IS_ERR (data))return PTR_ERR (data);
@@ -2001,6 +2005,9 @@ static ssize_t smk_write_onlycap(struct file *file, const char __user *buf,if (!smack_privileged (CAP_MAC_ADMIN ))return -EPERM ; +if (count >PAGE_SIZE ) +return -EINVAL ; + data =memdup_user_nul (buf, count);if (IS_ERR (data))return PTR_ERR (data);
@@ -2088,6 +2095,9 @@ static ssize_t smk_write_unconfined(struct file *file, const char __user *buf,if (!smack_privileged (CAP_MAC_ADMIN ))return -EPERM ; +if (count >PAGE_SIZE ) +return -EINVAL ; + data =memdup_user_nul (buf, count);if (IS_ERR (data))return PTR_ERR (data);
@@ -2643,6 +2653,10 @@ static ssize_t smk_write_syslog(struct file *file, const char __user *buf,if (!smack_privileged (CAP_MAC_ADMIN ))return -EPERM ; +/* Enough data must be present */ +if (count ==0 || count >PAGE_SIZE ) +return -EINVAL ; + data =memdup_user_nul (buf, count);if (IS_ERR (data))return PTR_ERR (data);
@@ -2735,10 +2749,13 @@ static ssize_t smk_write_relabel_self(struct file *file, const char __user *buf,return -EPERM ;/* +* No partial write. * Enough data must be present. */ if (*ppos !=0 )return -EINVAL ; +if (count ==0 || count >PAGE_SIZE ) +return -EINVAL ; data =memdup_user_nul (buf, count);if (IS_ERR (data))
sound/pci/hda/patch_realtek.c +13 -0
@@ -2522,6 +2522,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {SND_PCI_QUIRK (0x1462 ,0x1276 ,"MSI-GL73" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1462 ,0x1293 ,"MSI-GP65" ,ALC1220_FIXUP_CLEVO_P950 ),SND_PCI_QUIRK (0x1462 ,0x7350 ,"MSI-7350" ,ALC889_FIXUP_CD ), +SND_PCI_QUIRK (0x1462 ,0xcc34 ,"MSI Godlike X570" ,ALC1220_FIXUP_GB_DUAL_CODECS ),SND_PCI_QUIRK (0x1462 ,0xda57 ,"MSI Z270-Gaming" ,ALC1220_FIXUP_GB_DUAL_CODECS ),SND_PCI_QUIRK_VENDOR (0x1462 ,"MSI" ,ALC882_FIXUP_GPIO3 ), SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
@@ -6320,6 +6321,7 @@ enum {ALC269_FIXUP_LEMOTE_A1802 ,ALC269_FIXUP_LEMOTE_A190X ,ALC256_FIXUP_INTEL_NUC8_RUGGED , +ALC256_FIXUP_INTEL_NUC10 ,ALC255_FIXUP_XIAOMI_HEADSET_MIC ,ALC274_FIXUP_HP_MIC , ALC274_FIXUP_HP_HEADSET_MIC,
@@ -7697,6 +7699,15 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE }, + [ALC256_FIXUP_INTEL_NUC10] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x01a1913c },/* use as headset mic, without its own jack detect */ + { } + }, + .chained = true, + .chain_id =ALC269_FIXUP_HEADSET_MODE + }, [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = { .type = HDA_FIXUP_VERBS, .v.verbs = (const struct hda_verb []) {
@@ -8001,6 +8012,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1558 ,0x8551 ,"System76 Gazelle (gaze14)" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x8560 ,"System76 Gazelle (gaze14)" ,ALC269_FIXUP_HEADSET_MIC ),SND_PCI_QUIRK (0x1558 ,0x8561 ,"System76 Gazelle (gaze14)" ,ALC269_FIXUP_HEADSET_MIC ), +SND_PCI_QUIRK (0x1558 ,0x8562 ,"Clevo NH[5|7][0-9]RZ[Q]" ,ALC269_FIXUP_DMIC ),SND_PCI_QUIRK (0x1558 ,0x8668 ,"Clevo NP50B[BE]" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1558 ,0x8680 ,"Clevo NJ50LU" ,ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE ), SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
@@ -8095,6 +8107,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x1c06 ,0x2013 ,"Lemote A1802" ,ALC269_FIXUP_LEMOTE_A1802 ),SND_PCI_QUIRK (0x1c06 ,0x2015 ,"Lemote A190X" ,ALC269_FIXUP_LEMOTE_A190X ),SND_PCI_QUIRK (0x8086 ,0x2080 ,"Intel NUC 8 Rugged" ,ALC256_FIXUP_INTEL_NUC8_RUGGED ), +SND_PCI_QUIRK (0x8086 ,0x2081 ,"Intel NUC 10" ,ALC256_FIXUP_INTEL_NUC10 ), #if 0/* Below is a quirk table taken from the old code.
sound/soc/intel/boards/bytcr_rt5640.c +37 -0
@@ -400,6 +400,19 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {BYT_RT5640_SSP0_AIF1 | BYT_RT5640_MCLK_EN), }, + { /* Acer One 10 S1002 */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Acer" ), + DMI_MATCH(DMI_PRODUCT_NAME, "One S1002"), + }, + .driver_data = (void *)(BYT_RT5640_IN1_MAP | +BYT_RT5640_JD_SRC_JD2_IN4N | +BYT_RT5640_OVCD_TH_2000UA | +BYT_RT5640_OVCD_SF_0P75 | +BYT_RT5640_DIFF_MIC | +BYT_RT5640_SSP0_AIF2 | + BYT_RT5640_MCLK_EN), + }, { .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
@@ -513,6 +526,16 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {BYT_RT5640_MONO_SPEAKER | BYT_RT5640_MCLK_EN), }, + { /* Estar Beauty HD MID 7316R */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Estar" ), + DMI_MATCH(DMI_PRODUCT_NAME, "eSTAR BEAUTY HD Intel Quad core"), + }, + .driver_data = (void *)(BYTCR_INPUT_DEFAULTS | +BYT_RT5640_MONO_SPEAKER | +BYT_RT5640_SSP0_AIF1 | + BYT_RT5640_MCLK_EN), + }, { .matches = { DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
@@ -776,6 +799,20 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = {BYT_RT5640_SSP0_AIF2 | BYT_RT5640_MCLK_EN), }, + { /* Voyo Winpad A15 */ + .matches = { +DMI_MATCH (DMI_BOARD_VENDOR ,"AMI Corporation" ), +DMI_MATCH (DMI_BOARD_NAME ,"Aptio CRB" ), +/* Above strings are too generic, also match on BIOS date */ + DMI_MATCH(DMI_BIOS_DATE, "11/20/2014"), + }, + .driver_data = (void *)(BYT_RT5640_IN1_MAP | +BYT_RT5640_JD_SRC_JD2_IN4N | +BYT_RT5640_OVCD_TH_2000UA | +BYT_RT5640_OVCD_SF_0P75 | +BYT_RT5640_DIFF_MIC | + BYT_RT5640_MCLK_EN), + }, { /* Catch-all for generic Insyde tablets, must be last */ .matches = { DMI_MATCH(DMI_SYS_VENDOR, "Insyde"),
sound/soc/intel/boards/bytcr_rt5651.c +13 -0
@@ -435,6 +435,19 @@ static const struct dmi_system_id byt_rt5651_quirk_table[] = {BYT_RT5651_SSP0_AIF1 | BYT_RT5651_MONO_SPEAKER), }, + { +/* Jumper EZpad 7 */ + .callback = byt_rt5651_quirk_cb, + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Jumper" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"EZpad" ), +/* Jumper12x.WJ2012.bsBKRCP05 with the version dropped */ + DMI_MATCH(DMI_BIOS_VERSION, "Jumper12x.WJ2012.bsBKRCP"), + }, + .driver_data = (void *)(BYT_RT5651_DEFAULT_QUIRKS | +BYT_RT5651_IN2_MAP | + BYT_RT5651_JD_NOT_INV), + }, {/* KIANO SlimNote 14.2 */ .callback = byt_rt5651_quirk_cb,
sound/soc/intel/common/soc-intel-quirks.h +25 -0
@@ -11,6 +11,7 @@#if IS_ENABLED (CONFIG_X86 ) +#include <linux/dmi.h> #include <asm/cpu_device_id.h> #include <asm/intel-family.h> #include <asm/iosf_mbi.h>
@@ -40,12 +41,36 @@ SOC_INTEL_IS_CPU(cml, INTEL_FAM6_KABYLAKE_L);static inline bool soc_intel_is_byt_cr (struct platform_device *pdev) { +/* +* List of systems which: +* 1. Use a non CR version of the Bay Trail SoC +* 2. Contain at least 6 interrupt resources so that the +* platform_get_resource(pdev, IORESOURCE_IRQ, 5) check below +* succeeds +* 3. Despite 1. and 2. still have their IPC IRQ at index 0 rather then 5 +* +* This needs to be here so that it can be shared between the SST and +* SOF drivers. We rely on the compiler to optimize this out in files +* where soc_intel_is_byt_cr is not used. +*/ +static const struct dmi_system_id force_bytcr_table[] = { + {/* Lenovo Yoga Tablet 2 series */ + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"LENOVO" ), +DMI_MATCH (DMI_PRODUCT_FAMILY ,"YOGATablet2" ), + }, + }, + {} + };struct device *dev = &pdev->dev;int status =0 ;if (!soc_intel_is_byt ())return false; +if (dmi_check_system (force_bytcr_table)) +return true; +if (iosf_mbi_available ()) {u32 bios_status;