mirror of
https://github.com/Fishwaldo/build.git
synced 2025-07-23 05:18:55 +00:00
6182 lines
214 KiB
Diff
6182 lines
214 KiB
Diff
diff --git a/Makefile b/Makefile
|
|
index e622e084e7e2..12777a95833f 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 5
|
|
PATCHLEVEL = 7
|
|
-SUBLEVEL = 10
|
|
+SUBLEVEL = 11
|
|
EXTRAVERSION =
|
|
NAME = Kleptomaniac Octopus
|
|
|
|
@@ -549,7 +549,7 @@ ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
|
|
ifneq ($(CROSS_COMPILE),)
|
|
CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%))
|
|
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit))
|
|
-CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)
|
|
+CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE))
|
|
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
|
endif
|
|
ifneq ($(GCC_TOOLCHAIN),)
|
|
@@ -1730,7 +1730,7 @@ PHONY += descend $(build-dirs)
|
|
descend: $(build-dirs)
|
|
$(build-dirs): prepare
|
|
$(Q)$(MAKE) $(build)=$@ \
|
|
- single-build=$(if $(filter-out $@/, $(filter $@/%, $(single-no-ko))),1) \
|
|
+ single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \
|
|
need-builtin=1 need-modorder=1
|
|
|
|
clean-dirs := $(addprefix _clean_, $(clean-dirs))
|
|
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts
|
|
index 4089d97405c9..3dbcae3d60d2 100644
|
|
--- a/arch/arm/boot/dts/omap3-n900.dts
|
|
+++ b/arch/arm/boot/dts/omap3-n900.dts
|
|
@@ -105,6 +105,14 @@
|
|
linux,code = <SW_FRONT_PROXIMITY>;
|
|
linux,can-disable;
|
|
};
|
|
+
|
|
+ machine_cover {
|
|
+ label = "Machine Cover";
|
|
+ gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* 160 */
|
|
+ linux,input-type = <EV_SW>;
|
|
+ linux,code = <SW_MACHINE_COVER>;
|
|
+ linux,can-disable;
|
|
+ };
|
|
};
|
|
|
|
isp1707: isp1707 {
|
|
@@ -819,10 +827,6 @@
|
|
pinctrl-0 = <&mmc1_pins>;
|
|
vmmc-supply = <&vmmc1>;
|
|
bus-width = <4>;
|
|
- /* For debugging, it is often good idea to remove this GPIO.
|
|
- It means you can remove back cover (to reboot by removing
|
|
- battery) and still use the MMC card. */
|
|
- cd-gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* 160 */
|
|
};
|
|
|
|
/* most boards use vaux3, only some old versions use vmmc2 instead */
|
|
diff --git a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts
|
|
index b90d78a5724b..e32a491e909f 100644
|
|
--- a/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts
|
|
+++ b/arch/arm64/boot/dts/marvell/armada-8040-clearfog-gt-8k.dts
|
|
@@ -454,10 +454,7 @@
|
|
status = "okay";
|
|
phy-mode = "2500base-x";
|
|
phys = <&cp1_comphy5 2>;
|
|
- fixed-link {
|
|
- speed = <2500>;
|
|
- full-duplex;
|
|
- };
|
|
+ managed = "in-band-status";
|
|
};
|
|
|
|
&cp1_spi1 {
|
|
diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c
|
|
index 7569deb1eac1..d64a3c1e1b6b 100644
|
|
--- a/arch/arm64/kernel/debug-monitors.c
|
|
+++ b/arch/arm64/kernel/debug-monitors.c
|
|
@@ -396,14 +396,14 @@ void user_rewind_single_step(struct task_struct *task)
|
|
* If single step is active for this thread, then set SPSR.SS
|
|
* to 1 to avoid returning to the active-pending state.
|
|
*/
|
|
- if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP))
|
|
+ if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
|
set_regs_spsr_ss(task_pt_regs(task));
|
|
}
|
|
NOKPROBE_SYMBOL(user_rewind_single_step);
|
|
|
|
void user_fastforward_single_step(struct task_struct *task)
|
|
{
|
|
- if (test_ti_thread_flag(task_thread_info(task), TIF_SINGLESTEP))
|
|
+ if (test_tsk_thread_flag(task, TIF_SINGLESTEP))
|
|
clear_regs_spsr_ss(task_pt_regs(task));
|
|
}
|
|
|
|
diff --git a/arch/arm64/kernel/vdso32/Makefile b/arch/arm64/kernel/vdso32/Makefile
|
|
index 3964738ebbde..0433bb58ce52 100644
|
|
--- a/arch/arm64/kernel/vdso32/Makefile
|
|
+++ b/arch/arm64/kernel/vdso32/Makefile
|
|
@@ -14,7 +14,7 @@ COMPAT_GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE_COMPAT)elfedit))
|
|
COMPAT_GCC_TOOLCHAIN := $(realpath $(COMPAT_GCC_TOOLCHAIN_DIR)/..)
|
|
|
|
CC_COMPAT_CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE_COMPAT:%-=%))
|
|
-CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)
|
|
+CC_COMPAT_CLANG_FLAGS += --prefix=$(COMPAT_GCC_TOOLCHAIN_DIR)$(notdir $(CROSS_COMPILE_COMPAT))
|
|
CC_COMPAT_CLANG_FLAGS += -no-integrated-as -Qunused-arguments
|
|
ifneq ($(COMPAT_GCC_TOOLCHAIN),)
|
|
CC_COMPAT_CLANG_FLAGS += --gcc-toolchain=$(COMPAT_GCC_TOOLCHAIN)
|
|
diff --git a/arch/mips/pci/pci-xtalk-bridge.c b/arch/mips/pci/pci-xtalk-bridge.c
|
|
index 3b2552fb7735..5958217861b8 100644
|
|
--- a/arch/mips/pci/pci-xtalk-bridge.c
|
|
+++ b/arch/mips/pci/pci-xtalk-bridge.c
|
|
@@ -627,9 +627,10 @@ static int bridge_probe(struct platform_device *pdev)
|
|
return -ENOMEM;
|
|
domain = irq_domain_create_hierarchy(parent, 0, 8, fn,
|
|
&bridge_domain_ops, NULL);
|
|
- irq_domain_free_fwnode(fn);
|
|
- if (!domain)
|
|
+ if (!domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
return -ENOMEM;
|
|
+ }
|
|
|
|
pci_set_flags(PCI_PROBE_ONLY);
|
|
|
|
diff --git a/arch/parisc/include/asm/atomic.h b/arch/parisc/include/asm/atomic.h
|
|
index 118953d41763..6dd4171c9530 100644
|
|
--- a/arch/parisc/include/asm/atomic.h
|
|
+++ b/arch/parisc/include/asm/atomic.h
|
|
@@ -212,6 +212,8 @@ atomic64_set(atomic64_t *v, s64 i)
|
|
_atomic_spin_unlock_irqrestore(v, flags);
|
|
}
|
|
|
|
+#define atomic64_set_release(v, i) atomic64_set((v), (i))
|
|
+
|
|
static __inline__ s64
|
|
atomic64_read(const atomic64_t *v)
|
|
{
|
|
diff --git a/arch/riscv/include/asm/barrier.h b/arch/riscv/include/asm/barrier.h
|
|
index 3f1737f301cc..d0e24aaa2aa0 100644
|
|
--- a/arch/riscv/include/asm/barrier.h
|
|
+++ b/arch/riscv/include/asm/barrier.h
|
|
@@ -58,8 +58,16 @@ do { \
|
|
* The AQ/RL pair provides a RCpc critical section, but there's not really any
|
|
* way we can take advantage of that here because the ordering is only enforced
|
|
* on that one lock. Thus, we're just doing a full fence.
|
|
+ *
|
|
+ * Since we allow writeX to be called from preemptive regions we need at least
|
|
+ * an "o" in the predecessor set to ensure device writes are visible before the
|
|
+ * task is marked as available for scheduling on a new hart. While I don't see
|
|
+ * any concrete reason we need a full IO fence, it seems safer to just upgrade
|
|
+ * this in order to avoid any IO crossing a scheduling boundary. In both
|
|
+ * instances the scheduler pairs this with an mb(), so nothing is necessary on
|
|
+ * the new hart.
|
|
*/
|
|
-#define smp_mb__after_spinlock() RISCV_FENCE(rw,rw)
|
|
+#define smp_mb__after_spinlock() RISCV_FENCE(iorw,iorw)
|
|
|
|
#include <asm-generic/barrier.h>
|
|
|
|
diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c
|
|
index fdc772f57edc..81493cee0a16 100644
|
|
--- a/arch/riscv/mm/init.c
|
|
+++ b/arch/riscv/mm/init.c
|
|
@@ -94,19 +94,40 @@ void __init mem_init(void)
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
static void __init setup_initrd(void)
|
|
{
|
|
+ phys_addr_t start;
|
|
unsigned long size;
|
|
|
|
- if (initrd_start >= initrd_end) {
|
|
- pr_info("initrd not found or empty");
|
|
+ /* Ignore the virtul address computed during device tree parsing */
|
|
+ initrd_start = initrd_end = 0;
|
|
+
|
|
+ if (!phys_initrd_size)
|
|
+ return;
|
|
+ /*
|
|
+ * Round the memory region to page boundaries as per free_initrd_mem()
|
|
+ * This allows us to detect whether the pages overlapping the initrd
|
|
+ * are in use, but more importantly, reserves the entire set of pages
|
|
+ * as we don't want these pages allocated for other purposes.
|
|
+ */
|
|
+ start = round_down(phys_initrd_start, PAGE_SIZE);
|
|
+ size = phys_initrd_size + (phys_initrd_start - start);
|
|
+ size = round_up(size, PAGE_SIZE);
|
|
+
|
|
+ if (!memblock_is_region_memory(start, size)) {
|
|
+ pr_err("INITRD: 0x%08llx+0x%08lx is not a memory region",
|
|
+ (u64)start, size);
|
|
goto disable;
|
|
}
|
|
- if (__pa_symbol(initrd_end) > PFN_PHYS(max_low_pfn)) {
|
|
- pr_err("initrd extends beyond end of memory");
|
|
+
|
|
+ if (memblock_is_region_reserved(start, size)) {
|
|
+ pr_err("INITRD: 0x%08llx+0x%08lx overlaps in-use memory region\n",
|
|
+ (u64)start, size);
|
|
goto disable;
|
|
}
|
|
|
|
- size = initrd_end - initrd_start;
|
|
- memblock_reserve(__pa_symbol(initrd_start), size);
|
|
+ memblock_reserve(start, size);
|
|
+ /* Now convert initrd to virtual addresses */
|
|
+ initrd_start = (unsigned long)__va(phys_initrd_start);
|
|
+ initrd_end = initrd_start + phys_initrd_size;
|
|
initrd_below_start_ok = 1;
|
|
|
|
pr_info("Initial ramdisk at: 0x%p (%lu bytes)\n",
|
|
diff --git a/arch/s390/kernel/perf_cpum_cf_events.c b/arch/s390/kernel/perf_cpum_cf_events.c
|
|
index 1e3df52b2b65..37265f551a11 100644
|
|
--- a/arch/s390/kernel/perf_cpum_cf_events.c
|
|
+++ b/arch/s390/kernel/perf_cpum_cf_events.c
|
|
@@ -292,7 +292,7 @@ CPUMF_EVENT_ATTR(cf_z15, TX_C_TABORT_SPECIAL, 0x00f5);
|
|
CPUMF_EVENT_ATTR(cf_z15, DFLT_ACCESS, 0x00f7);
|
|
CPUMF_EVENT_ATTR(cf_z15, DFLT_CYCLES, 0x00fc);
|
|
CPUMF_EVENT_ATTR(cf_z15, DFLT_CC, 0x00108);
|
|
-CPUMF_EVENT_ATTR(cf_z15, DFLT_CCERROR, 0x00109);
|
|
+CPUMF_EVENT_ATTR(cf_z15, DFLT_CCFINISH, 0x00109);
|
|
CPUMF_EVENT_ATTR(cf_z15, MT_DIAG_CYCLES_ONE_THR_ACTIVE, 0x01c0);
|
|
CPUMF_EVENT_ATTR(cf_z15, MT_DIAG_CYCLES_TWO_THR_ACTIVE, 0x01c1);
|
|
|
|
@@ -629,7 +629,7 @@ static struct attribute *cpumcf_z15_pmu_event_attr[] __initdata = {
|
|
CPUMF_EVENT_PTR(cf_z15, DFLT_ACCESS),
|
|
CPUMF_EVENT_PTR(cf_z15, DFLT_CYCLES),
|
|
CPUMF_EVENT_PTR(cf_z15, DFLT_CC),
|
|
- CPUMF_EVENT_PTR(cf_z15, DFLT_CCERROR),
|
|
+ CPUMF_EVENT_PTR(cf_z15, DFLT_CCFINISH),
|
|
CPUMF_EVENT_PTR(cf_z15, MT_DIAG_CYCLES_ONE_THR_ACTIVE),
|
|
CPUMF_EVENT_PTR(cf_z15, MT_DIAG_CYCLES_TWO_THR_ACTIVE),
|
|
NULL,
|
|
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
|
|
index 5f7c262bcc99..20aac9968315 100644
|
|
--- a/arch/x86/boot/compressed/Makefile
|
|
+++ b/arch/x86/boot/compressed/Makefile
|
|
@@ -88,8 +88,8 @@ endif
|
|
|
|
vmlinux-objs-$(CONFIG_ACPI) += $(obj)/acpi.o
|
|
|
|
-vmlinux-objs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
|
|
vmlinux-objs-$(CONFIG_EFI_MIXED) += $(obj)/efi_thunk_$(BITS).o
|
|
+efi-obj-$(CONFIG_EFI_STUB) = $(objtree)/drivers/firmware/efi/libstub/lib.a
|
|
|
|
# The compressed kernel is built with -fPIC/-fPIE so that a boot loader
|
|
# can place it anywhere in memory and it will still run. However, since
|
|
@@ -113,7 +113,7 @@ endef
|
|
quiet_cmd_check-and-link-vmlinux = LD $@
|
|
cmd_check-and-link-vmlinux = $(cmd_check_data_rel); $(cmd_ld)
|
|
|
|
-$(obj)/vmlinux: $(vmlinux-objs-y) FORCE
|
|
+$(obj)/vmlinux: $(vmlinux-objs-y) $(efi-obj-y) FORCE
|
|
$(call if_changed,check-and-link-vmlinux)
|
|
|
|
OBJCOPYFLAGS_vmlinux.bin := -R .comment -S
|
|
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
|
|
index 913c88617848..57447f03ee87 100644
|
|
--- a/arch/x86/kernel/apic/io_apic.c
|
|
+++ b/arch/x86/kernel/apic/io_apic.c
|
|
@@ -2329,12 +2329,12 @@ static int mp_irqdomain_create(int ioapic)
|
|
ip->irqdomain = irq_domain_create_linear(fn, hwirqs, cfg->ops,
|
|
(void *)(long)ioapic);
|
|
|
|
- /* Release fw handle if it was allocated above */
|
|
- if (!cfg->dev)
|
|
- irq_domain_free_fwnode(fn);
|
|
-
|
|
- if (!ip->irqdomain)
|
|
+ if (!ip->irqdomain) {
|
|
+ /* Release fw handle if it was allocated above */
|
|
+ if (!cfg->dev)
|
|
+ irq_domain_free_fwnode(fn);
|
|
return -ENOMEM;
|
|
+ }
|
|
|
|
ip->irqdomain->parent = parent;
|
|
|
|
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
|
|
index 159bd0cb8548..a20873bbbed6 100644
|
|
--- a/arch/x86/kernel/apic/msi.c
|
|
+++ b/arch/x86/kernel/apic/msi.c
|
|
@@ -262,12 +262,13 @@ void __init arch_init_msi_domain(struct irq_domain *parent)
|
|
msi_default_domain =
|
|
pci_msi_create_irq_domain(fn, &pci_msi_domain_info,
|
|
parent);
|
|
- irq_domain_free_fwnode(fn);
|
|
}
|
|
- if (!msi_default_domain)
|
|
+ if (!msi_default_domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n");
|
|
- else
|
|
+ } else {
|
|
msi_default_domain->flags |= IRQ_DOMAIN_MSI_NOMASK_QUIRK;
|
|
+ }
|
|
}
|
|
|
|
#ifdef CONFIG_IRQ_REMAP
|
|
@@ -300,7 +301,8 @@ struct irq_domain *arch_create_remap_msi_irq_domain(struct irq_domain *parent,
|
|
if (!fn)
|
|
return NULL;
|
|
d = pci_msi_create_irq_domain(fn, &pci_msi_ir_domain_info, parent);
|
|
- irq_domain_free_fwnode(fn);
|
|
+ if (!d)
|
|
+ irq_domain_free_fwnode(fn);
|
|
return d;
|
|
}
|
|
#endif
|
|
@@ -363,7 +365,8 @@ static struct irq_domain *dmar_get_irq_domain(void)
|
|
if (fn) {
|
|
dmar_domain = msi_create_irq_domain(fn, &dmar_msi_domain_info,
|
|
x86_vector_domain);
|
|
- irq_domain_free_fwnode(fn);
|
|
+ if (!dmar_domain)
|
|
+ irq_domain_free_fwnode(fn);
|
|
}
|
|
out:
|
|
mutex_unlock(&dmar_lock);
|
|
@@ -488,7 +491,10 @@ struct irq_domain *hpet_create_irq_domain(int hpet_id)
|
|
}
|
|
|
|
d = msi_create_irq_domain(fn, domain_info, parent);
|
|
- irq_domain_free_fwnode(fn);
|
|
+ if (!d) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
+ kfree(domain_info);
|
|
+ }
|
|
return d;
|
|
}
|
|
|
|
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
|
|
index cf8b6ebc6031..410363e60968 100644
|
|
--- a/arch/x86/kernel/apic/vector.c
|
|
+++ b/arch/x86/kernel/apic/vector.c
|
|
@@ -707,7 +707,6 @@ int __init arch_early_irq_init(void)
|
|
x86_vector_domain = irq_domain_create_tree(fn, &x86_vector_domain_ops,
|
|
NULL);
|
|
BUG_ON(x86_vector_domain == NULL);
|
|
- irq_domain_free_fwnode(fn);
|
|
irq_set_default_host(x86_vector_domain);
|
|
|
|
arch_init_msi_domain(x86_vector_domain);
|
|
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
|
|
index 7c35556c7827..1b165813892f 100644
|
|
--- a/arch/x86/kernel/vmlinux.lds.S
|
|
+++ b/arch/x86/kernel/vmlinux.lds.S
|
|
@@ -359,6 +359,7 @@ SECTIONS
|
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) {
|
|
__bss_start = .;
|
|
*(.bss..page_aligned)
|
|
+ . = ALIGN(PAGE_SIZE);
|
|
*(BSS_MAIN)
|
|
BSS_DECRYPTED
|
|
. = ALIGN(PAGE_SIZE);
|
|
diff --git a/arch/x86/math-emu/wm_sqrt.S b/arch/x86/math-emu/wm_sqrt.S
|
|
index 3b2b58164ec1..40526dd85137 100644
|
|
--- a/arch/x86/math-emu/wm_sqrt.S
|
|
+++ b/arch/x86/math-emu/wm_sqrt.S
|
|
@@ -209,7 +209,7 @@ sqrt_stage_2_finish:
|
|
|
|
#ifdef PARANOID
|
|
/* It should be possible to get here only if the arg is ffff....ffff */
|
|
- cmp $0xffffffff,FPU_fsqrt_arg_1
|
|
+ cmpl $0xffffffff,FPU_fsqrt_arg_1
|
|
jnz sqrt_stage_2_error
|
|
#endif /* PARANOID */
|
|
|
|
diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c
|
|
index fc13cbbb2dce..abb6075397f0 100644
|
|
--- a/arch/x86/platform/uv/uv_irq.c
|
|
+++ b/arch/x86/platform/uv/uv_irq.c
|
|
@@ -167,9 +167,10 @@ static struct irq_domain *uv_get_irq_domain(void)
|
|
goto out;
|
|
|
|
uv_domain = irq_domain_create_tree(fn, &uv_domain_ops, NULL);
|
|
- irq_domain_free_fwnode(fn);
|
|
if (uv_domain)
|
|
uv_domain->parent = x86_vector_domain;
|
|
+ else
|
|
+ irq_domain_free_fwnode(fn);
|
|
out:
|
|
mutex_unlock(&uv_lock);
|
|
|
|
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c
|
|
index 3880c765d448..0271e2e47bcd 100644
|
|
--- a/arch/xtensa/kernel/setup.c
|
|
+++ b/arch/xtensa/kernel/setup.c
|
|
@@ -725,7 +725,8 @@ c_start(struct seq_file *f, loff_t *pos)
|
|
static void *
|
|
c_next(struct seq_file *f, void *v, loff_t *pos)
|
|
{
|
|
- return NULL;
|
|
+ ++*pos;
|
|
+ return c_start(f, pos);
|
|
}
|
|
|
|
static void
|
|
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c
|
|
index 4092555828b1..24cf6972eace 100644
|
|
--- a/arch/xtensa/kernel/xtensa_ksyms.c
|
|
+++ b/arch/xtensa/kernel/xtensa_ksyms.c
|
|
@@ -87,13 +87,13 @@ void __xtensa_libgcc_window_spill(void)
|
|
}
|
|
EXPORT_SYMBOL(__xtensa_libgcc_window_spill);
|
|
|
|
-unsigned long __sync_fetch_and_and_4(unsigned long *p, unsigned long v)
|
|
+unsigned int __sync_fetch_and_and_4(volatile void *p, unsigned int v)
|
|
{
|
|
BUG();
|
|
}
|
|
EXPORT_SYMBOL(__sync_fetch_and_and_4);
|
|
|
|
-unsigned long __sync_fetch_and_or_4(unsigned long *p, unsigned long v)
|
|
+unsigned int __sync_fetch_and_or_4(volatile void *p, unsigned int v)
|
|
{
|
|
BUG();
|
|
}
|
|
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c
|
|
index 2d8b9b91dee0..1dadca3d381e 100644
|
|
--- a/drivers/android/binder_alloc.c
|
|
+++ b/drivers/android/binder_alloc.c
|
|
@@ -947,7 +947,7 @@ enum lru_status binder_alloc_free_page(struct list_head *item,
|
|
trace_binder_unmap_user_end(alloc, index);
|
|
}
|
|
up_read(&mm->mmap_sem);
|
|
- mmput(mm);
|
|
+ mmput_async(mm);
|
|
|
|
trace_binder_unmap_kernel_start(alloc, index);
|
|
|
|
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
|
|
index 320d23de02c2..927ebde1607b 100644
|
|
--- a/drivers/base/regmap/regmap.c
|
|
+++ b/drivers/base/regmap/regmap.c
|
|
@@ -1363,7 +1363,7 @@ static int dev_get_regmap_match(struct device *dev, void *res, void *data)
|
|
|
|
/* If the user didn't specify a name match any */
|
|
if (data)
|
|
- return (*r)->name == data;
|
|
+ return !strcmp((*r)->name, data);
|
|
else
|
|
return 1;
|
|
}
|
|
diff --git a/drivers/char/mem.c b/drivers/char/mem.c
|
|
index 31cae88a730b..6b56bff9b68c 100644
|
|
--- a/drivers/char/mem.c
|
|
+++ b/drivers/char/mem.c
|
|
@@ -814,7 +814,8 @@ static struct inode *devmem_inode;
|
|
#ifdef CONFIG_IO_STRICT_DEVMEM
|
|
void revoke_devmem(struct resource *res)
|
|
{
|
|
- struct inode *inode = READ_ONCE(devmem_inode);
|
|
+ /* pairs with smp_store_release() in devmem_init_inode() */
|
|
+ struct inode *inode = smp_load_acquire(&devmem_inode);
|
|
|
|
/*
|
|
* Check that the initialization has completed. Losing the race
|
|
@@ -1028,8 +1029,11 @@ static int devmem_init_inode(void)
|
|
return rc;
|
|
}
|
|
|
|
- /* publish /dev/mem initialized */
|
|
- WRITE_ONCE(devmem_inode, inode);
|
|
+ /*
|
|
+ * Publish /dev/mem initialized.
|
|
+ * Pairs with smp_load_acquire() in revoke_devmem().
|
|
+ */
|
|
+ smp_store_release(&devmem_inode, inode);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/crypto/chelsio/chtls/chtls_io.c b/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
index e1401d9cc756..2e9acae1cba3 100644
|
|
--- a/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
+++ b/drivers/crypto/chelsio/chtls/chtls_io.c
|
|
@@ -1052,14 +1052,15 @@ int chtls_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
|
|
&record_type);
|
|
if (err)
|
|
goto out_err;
|
|
+
|
|
+ /* Avoid appending tls handshake, alert to tls data */
|
|
+ if (skb)
|
|
+ tx_skb_finalize(skb);
|
|
}
|
|
|
|
recordsz = size;
|
|
csk->tlshws.txleft = recordsz;
|
|
csk->tlshws.type = record_type;
|
|
-
|
|
- if (skb)
|
|
- ULP_SKB_CB(skb)->ulp.tls.type = record_type;
|
|
}
|
|
|
|
if (!skb || (ULP_SKB_CB(skb)->flags & ULPCB_FLAG_NO_APPEND) ||
|
|
diff --git a/drivers/dma/fsl-edma-common.c b/drivers/dma/fsl-edma-common.c
|
|
index 5697c3622699..9285884758b2 100644
|
|
--- a/drivers/dma/fsl-edma-common.c
|
|
+++ b/drivers/dma/fsl-edma-common.c
|
|
@@ -352,26 +352,28 @@ static void fsl_edma_set_tcd_regs(struct fsl_edma_chan *fsl_chan,
|
|
/*
|
|
* TCD parameters are stored in struct fsl_edma_hw_tcd in little
|
|
* endian format. However, we need to load the TCD registers in
|
|
- * big- or little-endian obeying the eDMA engine model endian.
|
|
+ * big- or little-endian obeying the eDMA engine model endian,
|
|
+ * and this is performed from specific edma_write functions
|
|
*/
|
|
edma_writew(edma, 0, ®s->tcd[ch].csr);
|
|
- edma_writel(edma, le32_to_cpu(tcd->saddr), ®s->tcd[ch].saddr);
|
|
- edma_writel(edma, le32_to_cpu(tcd->daddr), ®s->tcd[ch].daddr);
|
|
|
|
- edma_writew(edma, le16_to_cpu(tcd->attr), ®s->tcd[ch].attr);
|
|
- edma_writew(edma, le16_to_cpu(tcd->soff), ®s->tcd[ch].soff);
|
|
+ edma_writel(edma, (s32)tcd->saddr, ®s->tcd[ch].saddr);
|
|
+ edma_writel(edma, (s32)tcd->daddr, ®s->tcd[ch].daddr);
|
|
|
|
- edma_writel(edma, le32_to_cpu(tcd->nbytes), ®s->tcd[ch].nbytes);
|
|
- edma_writel(edma, le32_to_cpu(tcd->slast), ®s->tcd[ch].slast);
|
|
+ edma_writew(edma, (s16)tcd->attr, ®s->tcd[ch].attr);
|
|
+ edma_writew(edma, tcd->soff, ®s->tcd[ch].soff);
|
|
|
|
- edma_writew(edma, le16_to_cpu(tcd->citer), ®s->tcd[ch].citer);
|
|
- edma_writew(edma, le16_to_cpu(tcd->biter), ®s->tcd[ch].biter);
|
|
- edma_writew(edma, le16_to_cpu(tcd->doff), ®s->tcd[ch].doff);
|
|
+ edma_writel(edma, (s32)tcd->nbytes, ®s->tcd[ch].nbytes);
|
|
+ edma_writel(edma, (s32)tcd->slast, ®s->tcd[ch].slast);
|
|
|
|
- edma_writel(edma, le32_to_cpu(tcd->dlast_sga),
|
|
+ edma_writew(edma, (s16)tcd->citer, ®s->tcd[ch].citer);
|
|
+ edma_writew(edma, (s16)tcd->biter, ®s->tcd[ch].biter);
|
|
+ edma_writew(edma, (s16)tcd->doff, ®s->tcd[ch].doff);
|
|
+
|
|
+ edma_writel(edma, (s32)tcd->dlast_sga,
|
|
®s->tcd[ch].dlast_sga);
|
|
|
|
- edma_writew(edma, le16_to_cpu(tcd->csr), ®s->tcd[ch].csr);
|
|
+ edma_writew(edma, (s16)tcd->csr, ®s->tcd[ch].csr);
|
|
}
|
|
|
|
static inline
|
|
diff --git a/drivers/dma/ioat/dma.c b/drivers/dma/ioat/dma.c
|
|
index 18c011e57592..8e2a4d1f0be5 100644
|
|
--- a/drivers/dma/ioat/dma.c
|
|
+++ b/drivers/dma/ioat/dma.c
|
|
@@ -26,6 +26,18 @@
|
|
|
|
#include "../dmaengine.h"
|
|
|
|
+int completion_timeout = 200;
|
|
+module_param(completion_timeout, int, 0644);
|
|
+MODULE_PARM_DESC(completion_timeout,
|
|
+ "set ioat completion timeout [msec] (default 200 [msec])");
|
|
+int idle_timeout = 2000;
|
|
+module_param(idle_timeout, int, 0644);
|
|
+MODULE_PARM_DESC(idle_timeout,
|
|
+ "set ioat idel timeout [msec] (default 2000 [msec])");
|
|
+
|
|
+#define IDLE_TIMEOUT msecs_to_jiffies(idle_timeout)
|
|
+#define COMPLETION_TIMEOUT msecs_to_jiffies(completion_timeout)
|
|
+
|
|
static char *chanerr_str[] = {
|
|
"DMA Transfer Source Address Error",
|
|
"DMA Transfer Destination Address Error",
|
|
diff --git a/drivers/dma/ioat/dma.h b/drivers/dma/ioat/dma.h
|
|
index b8e8e0b9693c..4ac9134962f3 100644
|
|
--- a/drivers/dma/ioat/dma.h
|
|
+++ b/drivers/dma/ioat/dma.h
|
|
@@ -99,8 +99,6 @@ struct ioatdma_chan {
|
|
#define IOAT_RUN 5
|
|
#define IOAT_CHAN_ACTIVE 6
|
|
struct timer_list timer;
|
|
- #define COMPLETION_TIMEOUT msecs_to_jiffies(100)
|
|
- #define IDLE_TIMEOUT msecs_to_jiffies(2000)
|
|
#define RESET_DELAY msecs_to_jiffies(100)
|
|
struct ioatdma_device *ioat_dma;
|
|
dma_addr_t completion_dma;
|
|
diff --git a/drivers/dma/tegra210-adma.c b/drivers/dma/tegra210-adma.c
|
|
index db58d7e4f9fe..c5fa2ef74abc 100644
|
|
--- a/drivers/dma/tegra210-adma.c
|
|
+++ b/drivers/dma/tegra210-adma.c
|
|
@@ -658,6 +658,7 @@ static int tegra_adma_alloc_chan_resources(struct dma_chan *dc)
|
|
|
|
ret = pm_runtime_get_sync(tdc2dev(tdc));
|
|
if (ret < 0) {
|
|
+ pm_runtime_put_noidle(tdc2dev(tdc));
|
|
free_irq(tdc->irq, tdc);
|
|
return ret;
|
|
}
|
|
@@ -869,8 +870,10 @@ static int tegra_adma_probe(struct platform_device *pdev)
|
|
pm_runtime_enable(&pdev->dev);
|
|
|
|
ret = pm_runtime_get_sync(&pdev->dev);
|
|
- if (ret < 0)
|
|
+ if (ret < 0) {
|
|
+ pm_runtime_put_noidle(&pdev->dev);
|
|
goto rpm_disable;
|
|
+ }
|
|
|
|
ret = tegra_adma_init(tdma);
|
|
if (ret)
|
|
diff --git a/drivers/dma/ti/k3-udma-private.c b/drivers/dma/ti/k3-udma-private.c
|
|
index 0b8f3dd6b146..77e8e67d995b 100644
|
|
--- a/drivers/dma/ti/k3-udma-private.c
|
|
+++ b/drivers/dma/ti/k3-udma-private.c
|
|
@@ -42,6 +42,7 @@ struct udma_dev *of_xudma_dev_get(struct device_node *np, const char *property)
|
|
ud = platform_get_drvdata(pdev);
|
|
if (!ud) {
|
|
pr_debug("UDMA has not been probed\n");
|
|
+ put_device(&pdev->dev);
|
|
return ERR_PTR(-EPROBE_DEFER);
|
|
}
|
|
|
|
diff --git a/drivers/dma/ti/k3-udma.c b/drivers/dma/ti/k3-udma.c
|
|
index 7cab23fe5c73..b777f1924968 100644
|
|
--- a/drivers/dma/ti/k3-udma.c
|
|
+++ b/drivers/dma/ti/k3-udma.c
|
|
@@ -1773,7 +1773,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
dev_err(ud->ddev.dev,
|
|
"Descriptor pool allocation failed\n");
|
|
uc->use_dma_pool = false;
|
|
- return -ENOMEM;
|
|
+ ret = -ENOMEM;
|
|
+ goto err_cleanup;
|
|
}
|
|
}
|
|
|
|
@@ -1793,16 +1794,18 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
|
|
ret = udma_get_chan_pair(uc);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto err_cleanup;
|
|
|
|
ret = udma_alloc_tx_resources(uc);
|
|
- if (ret)
|
|
- return ret;
|
|
+ if (ret) {
|
|
+ udma_put_rchan(uc);
|
|
+ goto err_cleanup;
|
|
+ }
|
|
|
|
ret = udma_alloc_rx_resources(uc);
|
|
if (ret) {
|
|
udma_free_tx_resources(uc);
|
|
- return ret;
|
|
+ goto err_cleanup;
|
|
}
|
|
|
|
uc->config.src_thread = ud->psil_base + uc->tchan->id;
|
|
@@ -1820,10 +1823,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
uc->id);
|
|
|
|
ret = udma_alloc_tx_resources(uc);
|
|
- if (ret) {
|
|
- uc->config.remote_thread_id = -1;
|
|
- return ret;
|
|
- }
|
|
+ if (ret)
|
|
+ goto err_cleanup;
|
|
|
|
uc->config.src_thread = ud->psil_base + uc->tchan->id;
|
|
uc->config.dst_thread = uc->config.remote_thread_id;
|
|
@@ -1840,10 +1841,8 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
uc->id);
|
|
|
|
ret = udma_alloc_rx_resources(uc);
|
|
- if (ret) {
|
|
- uc->config.remote_thread_id = -1;
|
|
- return ret;
|
|
- }
|
|
+ if (ret)
|
|
+ goto err_cleanup;
|
|
|
|
uc->config.src_thread = uc->config.remote_thread_id;
|
|
uc->config.dst_thread = (ud->psil_base + uc->rchan->id) |
|
|
@@ -1858,7 +1857,9 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
/* Can not happen */
|
|
dev_err(uc->ud->dev, "%s: chan%d invalid direction (%u)\n",
|
|
__func__, uc->id, uc->config.dir);
|
|
- return -EINVAL;
|
|
+ ret = -EINVAL;
|
|
+ goto err_cleanup;
|
|
+
|
|
}
|
|
|
|
/* check if the channel configuration was successful */
|
|
@@ -1867,7 +1868,7 @@ static int udma_alloc_chan_resources(struct dma_chan *chan)
|
|
|
|
if (udma_is_chan_running(uc)) {
|
|
dev_warn(ud->dev, "chan%d: is running!\n", uc->id);
|
|
- udma_stop(uc);
|
|
+ udma_reset_chan(uc, false);
|
|
if (udma_is_chan_running(uc)) {
|
|
dev_err(ud->dev, "chan%d: won't stop!\n", uc->id);
|
|
goto err_res_free;
|
|
@@ -1936,7 +1937,7 @@ err_psi_free:
|
|
err_res_free:
|
|
udma_free_tx_resources(uc);
|
|
udma_free_rx_resources(uc);
|
|
-
|
|
+err_cleanup:
|
|
udma_reset_uchan(uc);
|
|
|
|
if (uc->use_dma_pool) {
|
|
diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
|
|
index c2f1d4e6630b..feb7fe6f2da7 100644
|
|
--- a/drivers/firmware/efi/efi-pstore.c
|
|
+++ b/drivers/firmware/efi/efi-pstore.c
|
|
@@ -356,10 +356,7 @@ static struct pstore_info efi_pstore_info = {
|
|
|
|
static __init int efivars_pstore_init(void)
|
|
{
|
|
- if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
|
|
- return 0;
|
|
-
|
|
- if (!efivars_kobject())
|
|
+ if (!efivars_kobject() || !efivar_supports_writes())
|
|
return 0;
|
|
|
|
if (efivars_pstore_disable)
|
|
diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
|
|
index 20a7ba47a792..99446b384726 100644
|
|
--- a/drivers/firmware/efi/efi.c
|
|
+++ b/drivers/firmware/efi/efi.c
|
|
@@ -176,11 +176,13 @@ static struct efivar_operations generic_ops;
|
|
static int generic_ops_register(void)
|
|
{
|
|
generic_ops.get_variable = efi.get_variable;
|
|
- generic_ops.set_variable = efi.set_variable;
|
|
- generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
|
|
generic_ops.get_next_variable = efi.get_next_variable;
|
|
generic_ops.query_variable_store = efi_query_variable_store;
|
|
|
|
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_SET_VARIABLE)) {
|
|
+ generic_ops.set_variable = efi.set_variable;
|
|
+ generic_ops.set_variable_nonblocking = efi.set_variable_nonblocking;
|
|
+ }
|
|
return efivars_register(&generic_efivars, &generic_ops, efi_kobj);
|
|
}
|
|
|
|
@@ -382,7 +384,8 @@ static int __init efisubsys_init(void)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
- if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES)) {
|
|
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
|
|
+ EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME)) {
|
|
efivar_ssdt_load();
|
|
error = generic_ops_register();
|
|
if (error)
|
|
@@ -416,7 +419,8 @@ static int __init efisubsys_init(void)
|
|
err_remove_group:
|
|
sysfs_remove_group(efi_kobj, &efi_subsys_attr_group);
|
|
err_unregister:
|
|
- if (efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
|
|
+ if (efi_rt_services_supported(EFI_RT_SUPPORTED_GET_VARIABLE |
|
|
+ EFI_RT_SUPPORTED_GET_NEXT_VARIABLE_NAME))
|
|
generic_ops_unregister();
|
|
err_put:
|
|
kobject_put(efi_kobj);
|
|
diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c
|
|
index 26528a46d99e..dcea137142b3 100644
|
|
--- a/drivers/firmware/efi/efivars.c
|
|
+++ b/drivers/firmware/efi/efivars.c
|
|
@@ -680,11 +680,8 @@ int efivars_sysfs_init(void)
|
|
struct kobject *parent_kobj = efivars_kobject();
|
|
int error = 0;
|
|
|
|
- if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
|
|
- return -ENODEV;
|
|
-
|
|
/* No efivars has been registered yet */
|
|
- if (!parent_kobj)
|
|
+ if (!parent_kobj || !efivar_supports_writes())
|
|
return 0;
|
|
|
|
printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION,
|
|
diff --git a/drivers/firmware/efi/vars.c b/drivers/firmware/efi/vars.c
|
|
index 5f2a4d162795..973eef234b36 100644
|
|
--- a/drivers/firmware/efi/vars.c
|
|
+++ b/drivers/firmware/efi/vars.c
|
|
@@ -1229,3 +1229,9 @@ out:
|
|
return rv;
|
|
}
|
|
EXPORT_SYMBOL_GPL(efivars_unregister);
|
|
+
|
|
+int efivar_supports_writes(void)
|
|
+{
|
|
+ return __efivars && __efivars->ops->set_variable;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(efivar_supports_writes);
|
|
diff --git a/drivers/firmware/psci/psci_checker.c b/drivers/firmware/psci/psci_checker.c
|
|
index 873841af8d57..d9b1a2d71223 100644
|
|
--- a/drivers/firmware/psci/psci_checker.c
|
|
+++ b/drivers/firmware/psci/psci_checker.c
|
|
@@ -157,8 +157,10 @@ static int alloc_init_cpu_groups(cpumask_var_t **pcpu_groups)
|
|
|
|
cpu_groups = kcalloc(nb_available_cpus, sizeof(cpu_groups),
|
|
GFP_KERNEL);
|
|
- if (!cpu_groups)
|
|
+ if (!cpu_groups) {
|
|
+ free_cpumask_var(tmp);
|
|
return -ENOMEM;
|
|
+ }
|
|
|
|
cpumask_copy(tmp, cpu_online_mask);
|
|
|
|
@@ -167,6 +169,7 @@ static int alloc_init_cpu_groups(cpumask_var_t **pcpu_groups)
|
|
topology_core_cpumask(cpumask_any(tmp));
|
|
|
|
if (!alloc_cpumask_var(&cpu_groups[num_groups], GFP_KERNEL)) {
|
|
+ free_cpumask_var(tmp);
|
|
free_cpu_groups(num_groups, &cpu_groups);
|
|
return -ENOMEM;
|
|
}
|
|
diff --git a/drivers/fpga/dfl-afu-main.c b/drivers/fpga/dfl-afu-main.c
|
|
index 65437b6a6842..77e257c88a1d 100644
|
|
--- a/drivers/fpga/dfl-afu-main.c
|
|
+++ b/drivers/fpga/dfl-afu-main.c
|
|
@@ -83,7 +83,8 @@ int __afu_port_disable(struct platform_device *pdev)
|
|
* on this port and minimum soft reset pulse width has elapsed.
|
|
* Driver polls port_soft_reset_ack to determine if reset done by HW.
|
|
*/
|
|
- if (readq_poll_timeout(base + PORT_HDR_CTRL, v, v & PORT_CTRL_SFTRST,
|
|
+ if (readq_poll_timeout(base + PORT_HDR_CTRL, v,
|
|
+ v & PORT_CTRL_SFTRST_ACK,
|
|
RST_POLL_INVL, RST_POLL_TIMEOUT)) {
|
|
dev_err(&pdev->dev, "timeout, fail to reset device\n");
|
|
return -ETIMEDOUT;
|
|
diff --git a/drivers/fpga/dfl-pci.c b/drivers/fpga/dfl-pci.c
|
|
index 538755062ab7..a78c409bf2c4 100644
|
|
--- a/drivers/fpga/dfl-pci.c
|
|
+++ b/drivers/fpga/dfl-pci.c
|
|
@@ -227,7 +227,6 @@ static int cci_pci_sriov_configure(struct pci_dev *pcidev, int num_vfs)
|
|
{
|
|
struct cci_drvdata *drvdata = pci_get_drvdata(pcidev);
|
|
struct dfl_fpga_cdev *cdev = drvdata->cdev;
|
|
- int ret = 0;
|
|
|
|
if (!num_vfs) {
|
|
/*
|
|
@@ -239,6 +238,8 @@ static int cci_pci_sriov_configure(struct pci_dev *pcidev, int num_vfs)
|
|
dfl_fpga_cdev_config_ports_pf(cdev);
|
|
|
|
} else {
|
|
+ int ret;
|
|
+
|
|
/*
|
|
* before enable SRIOV, put released ports into VF access mode
|
|
* first of all.
|
|
diff --git a/drivers/gpio/gpio-arizona.c b/drivers/gpio/gpio-arizona.c
|
|
index 5640efe5e750..5bda38e0780f 100644
|
|
--- a/drivers/gpio/gpio-arizona.c
|
|
+++ b/drivers/gpio/gpio-arizona.c
|
|
@@ -64,6 +64,7 @@ static int arizona_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|
ret = pm_runtime_get_sync(chip->parent);
|
|
if (ret < 0) {
|
|
dev_err(chip->parent, "Failed to resume: %d\n", ret);
|
|
+ pm_runtime_put_autosuspend(chip->parent);
|
|
return ret;
|
|
}
|
|
|
|
@@ -72,12 +73,15 @@ static int arizona_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|
if (ret < 0) {
|
|
dev_err(chip->parent, "Failed to drop cache: %d\n",
|
|
ret);
|
|
+ pm_runtime_put_autosuspend(chip->parent);
|
|
return ret;
|
|
}
|
|
|
|
ret = regmap_read(arizona->regmap, reg, &val);
|
|
- if (ret < 0)
|
|
+ if (ret < 0) {
|
|
+ pm_runtime_put_autosuspend(chip->parent);
|
|
return ret;
|
|
+ }
|
|
|
|
pm_runtime_mark_last_busy(chip->parent);
|
|
pm_runtime_put_autosuspend(chip->parent);
|
|
@@ -106,6 +110,7 @@ static int arizona_gpio_direction_out(struct gpio_chip *chip,
|
|
ret = pm_runtime_get_sync(chip->parent);
|
|
if (ret < 0) {
|
|
dev_err(chip->parent, "Failed to resume: %d\n", ret);
|
|
+ pm_runtime_put(chip->parent);
|
|
return ret;
|
|
}
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
|
|
index c0f9a651dc06..92b18c4760e5 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
|
|
@@ -1156,27 +1156,37 @@ static void amdgpu_ib_preempt_job_recovery(struct drm_gpu_scheduler *sched)
|
|
static void amdgpu_ib_preempt_mark_partial_job(struct amdgpu_ring *ring)
|
|
{
|
|
struct amdgpu_job *job;
|
|
- struct drm_sched_job *s_job;
|
|
+ struct drm_sched_job *s_job, *tmp;
|
|
uint32_t preempt_seq;
|
|
struct dma_fence *fence, **ptr;
|
|
struct amdgpu_fence_driver *drv = &ring->fence_drv;
|
|
struct drm_gpu_scheduler *sched = &ring->sched;
|
|
+ bool preempted = true;
|
|
|
|
if (ring->funcs->type != AMDGPU_RING_TYPE_GFX)
|
|
return;
|
|
|
|
preempt_seq = le32_to_cpu(*(drv->cpu_addr + 2));
|
|
- if (preempt_seq <= atomic_read(&drv->last_seq))
|
|
- return;
|
|
+ if (preempt_seq <= atomic_read(&drv->last_seq)) {
|
|
+ preempted = false;
|
|
+ goto no_preempt;
|
|
+ }
|
|
|
|
preempt_seq &= drv->num_fences_mask;
|
|
ptr = &drv->fences[preempt_seq];
|
|
fence = rcu_dereference_protected(*ptr, 1);
|
|
|
|
+no_preempt:
|
|
spin_lock(&sched->job_list_lock);
|
|
- list_for_each_entry(s_job, &sched->ring_mirror_list, node) {
|
|
+ list_for_each_entry_safe(s_job, tmp, &sched->ring_mirror_list, node) {
|
|
+ if (dma_fence_is_signaled(&s_job->s_fence->finished)) {
|
|
+ /* remove job from ring_mirror_list */
|
|
+ list_del_init(&s_job->node);
|
|
+ sched->ops->free_job(s_job);
|
|
+ continue;
|
|
+ }
|
|
job = to_amdgpu_job(s_job);
|
|
- if (job->fence == fence)
|
|
+ if (preempted && job->fence == fence)
|
|
/* mark the job as preempted */
|
|
job->preemption_status |= AMDGPU_IB_PREEMPTED;
|
|
}
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
|
|
index 96b8feb77b15..b14b0b4ffeb2 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
|
|
@@ -775,8 +775,7 @@ static ssize_t amdgpu_set_pp_od_clk_voltage(struct device *dev,
|
|
tmp_str++;
|
|
while (isspace(*++tmp_str));
|
|
|
|
- while (tmp_str[0]) {
|
|
- sub_str = strsep(&tmp_str, delimiter);
|
|
+ while ((sub_str = strsep(&tmp_str, delimiter)) != NULL) {
|
|
ret = kstrtol(sub_str, 0, ¶meter[parameter_size]);
|
|
if (ret)
|
|
return -EINVAL;
|
|
@@ -1036,8 +1035,7 @@ static ssize_t amdgpu_read_mask(const char *buf, size_t count, uint32_t *mask)
|
|
memcpy(buf_cpy, buf, bytes);
|
|
buf_cpy[bytes] = '\0';
|
|
tmp = buf_cpy;
|
|
- while (tmp[0]) {
|
|
- sub_str = strsep(&tmp, delimiter);
|
|
+ while ((sub_str = strsep(&tmp, delimiter)) != NULL) {
|
|
if (strlen(sub_str)) {
|
|
ret = kstrtol(sub_str, 0, &level);
|
|
if (ret)
|
|
@@ -1634,8 +1632,7 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct device *dev,
|
|
i++;
|
|
memcpy(buf_cpy, buf, count-i);
|
|
tmp_str = buf_cpy;
|
|
- while (tmp_str[0]) {
|
|
- sub_str = strsep(&tmp_str, delimiter);
|
|
+ while ((sub_str = strsep(&tmp_str, delimiter)) != NULL) {
|
|
ret = kstrtol(sub_str, 0, ¶meter[parameter_size]);
|
|
if (ret)
|
|
return -EINVAL;
|
|
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
index 0e0daf0021b6..ff94f756978d 100644
|
|
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
|
|
@@ -4746,12 +4746,17 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
|
|
struct amdgpu_device *adev = ring->adev;
|
|
struct amdgpu_kiq *kiq = &adev->gfx.kiq;
|
|
struct amdgpu_ring *kiq_ring = &kiq->ring;
|
|
+ unsigned long flags;
|
|
|
|
if (!kiq->pmf || !kiq->pmf->kiq_unmap_queues)
|
|
return -EINVAL;
|
|
|
|
- if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size))
|
|
+ spin_lock_irqsave(&kiq->ring_lock, flags);
|
|
+
|
|
+ if (amdgpu_ring_alloc(kiq_ring, kiq->pmf->unmap_queues_size)) {
|
|
+ spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
|
return -ENOMEM;
|
|
+ }
|
|
|
|
/* assert preemption condition */
|
|
amdgpu_ring_set_preempt_cond_exec(ring, false);
|
|
@@ -4762,6 +4767,8 @@ static int gfx_v10_0_ring_preempt_ib(struct amdgpu_ring *ring)
|
|
++ring->trail_seq);
|
|
amdgpu_ring_commit(kiq_ring);
|
|
|
|
+ spin_unlock_irqrestore(&kiq->ring_lock, flags);
|
|
+
|
|
/* poll the trailing fence */
|
|
for (i = 0; i < adev->usec_timeout; i++) {
|
|
if (ring->trail_seq ==
|
|
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
index d06fa6380179..837a286469ec 100644
|
|
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
|
|
@@ -1342,9 +1342,14 @@ static int dm_late_init(void *handle)
|
|
struct dmcu_iram_parameters params;
|
|
unsigned int linear_lut[16];
|
|
int i;
|
|
- struct dmcu *dmcu = adev->dm.dc->res_pool->dmcu;
|
|
+ struct dmcu *dmcu = NULL;
|
|
bool ret;
|
|
|
|
+ if (!adev->dm.fw_dmcu && !adev->dm.dmub_fw)
|
|
+ return detect_mst_link_for_all_connectors(adev->ddev);
|
|
+
|
|
+ dmcu = adev->dm.dc->res_pool->dmcu;
|
|
+
|
|
for (i = 0; i < 16; i++)
|
|
linear_lut[i] = 0xFFFF * i / 15;
|
|
|
|
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c b/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
|
|
index b0e0d67cd54b..2a081a792c6b 100644
|
|
--- a/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
|
|
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/vegam_smumgr.c
|
|
@@ -642,9 +642,6 @@ static int vegam_get_dependency_volt_by_clk(struct pp_hwmgr *hwmgr,
|
|
|
|
/* sclk is bigger than max sclk in the dependence table */
|
|
*voltage |= (dep_table->entries[i - 1].vddc * VOLTAGE_SCALE) << VDDC_SHIFT;
|
|
- vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
|
|
- (dep_table->entries[i - 1].vddc -
|
|
- (uint16_t)VDDC_VDDCI_DELTA));
|
|
|
|
if (SMU7_VOLTAGE_CONTROL_NONE == data->vddci_control)
|
|
*voltage |= (data->vbios_boot_state.vddci_bootup_value *
|
|
@@ -652,8 +649,13 @@ static int vegam_get_dependency_volt_by_clk(struct pp_hwmgr *hwmgr,
|
|
else if (dep_table->entries[i - 1].vddci)
|
|
*voltage |= (dep_table->entries[i - 1].vddci *
|
|
VOLTAGE_SCALE) << VDDC_SHIFT;
|
|
- else
|
|
+ else {
|
|
+ vddci = phm_find_closest_vddci(&(data->vddci_voltage_table),
|
|
+ (dep_table->entries[i - 1].vddc -
|
|
+ (uint16_t)VDDC_VDDCI_DELTA));
|
|
+
|
|
*voltage |= (vddci * VOLTAGE_SCALE) << VDDCI_SHIFT;
|
|
+ }
|
|
|
|
if (SMU7_VOLTAGE_CONTROL_NONE == data->mvdd_control)
|
|
*mvdd = data->vbios_boot_state.mvdd_bootup_value * VOLTAGE_SCALE;
|
|
diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c
|
|
index 645fedd77e21..a9ce86740799 100644
|
|
--- a/drivers/gpu/drm/nouveau/nouveau_svm.c
|
|
+++ b/drivers/gpu/drm/nouveau/nouveau_svm.c
|
|
@@ -534,6 +534,7 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm,
|
|
.flags = nouveau_svm_pfn_flags,
|
|
.values = nouveau_svm_pfn_values,
|
|
.pfn_shift = NVIF_VMM_PFNMAP_V0_ADDR_SHIFT,
|
|
+ .dev_private_owner = drm->dev,
|
|
};
|
|
struct mm_struct *mm = notifier->notifier.mm;
|
|
long ret;
|
|
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c
|
|
index c8ab1b5741a3..db7769cb33eb 100644
|
|
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c
|
|
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxg94.c
|
|
@@ -118,10 +118,10 @@ g94_i2c_aux_xfer(struct nvkm_i2c_aux *obj, bool retry,
|
|
if (retries)
|
|
udelay(400);
|
|
|
|
- /* transaction request, wait up to 1ms for it to complete */
|
|
+ /* transaction request, wait up to 2ms for it to complete */
|
|
nvkm_wr32(device, 0x00e4e4 + base, 0x00010000 | ctrl);
|
|
|
|
- timeout = 1000;
|
|
+ timeout = 2000;
|
|
do {
|
|
ctrl = nvkm_rd32(device, 0x00e4e4 + base);
|
|
udelay(1);
|
|
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
|
|
index 7ef60895f43a..edb6148cbca0 100644
|
|
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
|
|
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxgm200.c
|
|
@@ -118,10 +118,10 @@ gm200_i2c_aux_xfer(struct nvkm_i2c_aux *obj, bool retry,
|
|
if (retries)
|
|
udelay(400);
|
|
|
|
- /* transaction request, wait up to 1ms for it to complete */
|
|
+ /* transaction request, wait up to 2ms for it to complete */
|
|
nvkm_wr32(device, 0x00d954 + base, 0x00010000 | ctrl);
|
|
|
|
- timeout = 1000;
|
|
+ timeout = 2000;
|
|
do {
|
|
ctrl = nvkm_rd32(device, 0x00d954 + base);
|
|
udelay(1);
|
|
diff --git a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
|
|
index f07e0c32b93a..4c5072a578bf 100644
|
|
--- a/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
|
|
+++ b/drivers/gpu/drm/sun4i/sun4i_hdmi_enc.c
|
|
@@ -263,7 +263,7 @@ sun4i_hdmi_connector_detect(struct drm_connector *connector, bool force)
|
|
unsigned long reg;
|
|
|
|
reg = readl(hdmi->base + SUN4I_HDMI_HPD_REG);
|
|
- if (reg & SUN4I_HDMI_HPD_HIGH) {
|
|
+ if (!(reg & SUN4I_HDMI_HPD_HIGH)) {
|
|
cec_phys_addr_invalidate(hdmi->cec_adap);
|
|
return connector_status_disconnected;
|
|
}
|
|
diff --git a/drivers/hid/hid-alps.c b/drivers/hid/hid-alps.c
|
|
index b2ad319a74b9..d33f5abc8f64 100644
|
|
--- a/drivers/hid/hid-alps.c
|
|
+++ b/drivers/hid/hid-alps.c
|
|
@@ -25,6 +25,7 @@
|
|
|
|
#define U1_MOUSE_REPORT_ID 0x01 /* Mouse data ReportID */
|
|
#define U1_ABSOLUTE_REPORT_ID 0x03 /* Absolute data ReportID */
|
|
+#define U1_ABSOLUTE_REPORT_ID_SECD 0x02 /* FW-PTP Absolute data ReportID */
|
|
#define U1_FEATURE_REPORT_ID 0x05 /* Feature ReportID */
|
|
#define U1_SP_ABSOLUTE_REPORT_ID 0x06 /* Feature ReportID */
|
|
|
|
@@ -368,6 +369,7 @@ static int u1_raw_event(struct alps_dev *hdata, u8 *data, int size)
|
|
case U1_FEATURE_REPORT_ID:
|
|
break;
|
|
case U1_ABSOLUTE_REPORT_ID:
|
|
+ case U1_ABSOLUTE_REPORT_ID_SECD:
|
|
for (i = 0; i < hdata->max_fingers; i++) {
|
|
u8 *contact = &data[i * 5];
|
|
|
|
diff --git a/drivers/hid/hid-apple.c b/drivers/hid/hid-apple.c
|
|
index d732d1d10caf..6909c045fece 100644
|
|
--- a/drivers/hid/hid-apple.c
|
|
+++ b/drivers/hid/hid-apple.c
|
|
@@ -54,6 +54,7 @@ MODULE_PARM_DESC(swap_opt_cmd, "Swap the Option (\"Alt\") and Command (\"Flag\")
|
|
struct apple_sc {
|
|
unsigned long quirks;
|
|
unsigned int fn_on;
|
|
+ unsigned int fn_found;
|
|
DECLARE_BITMAP(pressed_numlock, KEY_CNT);
|
|
};
|
|
|
|
@@ -339,12 +340,15 @@ static int apple_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
|
struct hid_field *field, struct hid_usage *usage,
|
|
unsigned long **bit, int *max)
|
|
{
|
|
+ struct apple_sc *asc = hid_get_drvdata(hdev);
|
|
+
|
|
if (usage->hid == (HID_UP_CUSTOM | 0x0003) ||
|
|
usage->hid == (HID_UP_MSVENDOR | 0x0003) ||
|
|
usage->hid == (HID_UP_HPVENDOR2 | 0x0003)) {
|
|
/* The fn key on Apple USB keyboards */
|
|
set_bit(EV_REP, hi->input->evbit);
|
|
hid_map_usage_clear(hi, usage, bit, max, EV_KEY, KEY_FN);
|
|
+ asc->fn_found = true;
|
|
apple_setup_input(hi->input);
|
|
return 1;
|
|
}
|
|
@@ -371,6 +375,19 @@ static int apple_input_mapped(struct hid_device *hdev, struct hid_input *hi,
|
|
return 0;
|
|
}
|
|
|
|
+static int apple_input_configured(struct hid_device *hdev,
|
|
+ struct hid_input *hidinput)
|
|
+{
|
|
+ struct apple_sc *asc = hid_get_drvdata(hdev);
|
|
+
|
|
+ if ((asc->quirks & APPLE_HAS_FN) && !asc->fn_found) {
|
|
+ hid_info(hdev, "Fn key not found (Apple Wireless Keyboard clone?), disabling Fn key handling\n");
|
|
+ asc->quirks = 0;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int apple_probe(struct hid_device *hdev,
|
|
const struct hid_device_id *id)
|
|
{
|
|
@@ -585,6 +602,7 @@ static struct hid_driver apple_driver = {
|
|
.event = apple_event,
|
|
.input_mapping = apple_input_mapping,
|
|
.input_mapped = apple_input_mapped,
|
|
+ .input_configured = apple_input_configured,
|
|
};
|
|
module_hid_driver(apple_driver);
|
|
|
|
diff --git a/drivers/hid/hid-steam.c b/drivers/hid/hid-steam.c
|
|
index 6286204d4c56..a3b151b29bd7 100644
|
|
--- a/drivers/hid/hid-steam.c
|
|
+++ b/drivers/hid/hid-steam.c
|
|
@@ -526,7 +526,8 @@ static int steam_register(struct steam_device *steam)
|
|
steam_battery_register(steam);
|
|
|
|
mutex_lock(&steam_devices_lock);
|
|
- list_add(&steam->list, &steam_devices);
|
|
+ if (list_empty(&steam->list))
|
|
+ list_add(&steam->list, &steam_devices);
|
|
mutex_unlock(&steam_devices_lock);
|
|
}
|
|
|
|
@@ -552,7 +553,7 @@ static void steam_unregister(struct steam_device *steam)
|
|
hid_info(steam->hdev, "Steam Controller '%s' disconnected",
|
|
steam->serial_no);
|
|
mutex_lock(&steam_devices_lock);
|
|
- list_del(&steam->list);
|
|
+ list_del_init(&steam->list);
|
|
mutex_unlock(&steam_devices_lock);
|
|
steam->serial_no[0] = 0;
|
|
}
|
|
@@ -738,6 +739,7 @@ static int steam_probe(struct hid_device *hdev,
|
|
mutex_init(&steam->mutex);
|
|
steam->quirks = id->driver_data;
|
|
INIT_WORK(&steam->work_connect, steam_work_connect_cb);
|
|
+ INIT_LIST_HEAD(&steam->list);
|
|
|
|
steam->client_hdev = steam_create_client_hid(hdev);
|
|
if (IS_ERR(steam->client_hdev)) {
|
|
diff --git a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
|
|
index ec142bc8c1da..35f3bfc3e6f5 100644
|
|
--- a/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
|
|
+++ b/drivers/hid/i2c-hid/i2c-hid-dmi-quirks.c
|
|
@@ -373,6 +373,14 @@ static const struct dmi_system_id i2c_hid_dmi_desc_override_table[] = {
|
|
},
|
|
.driver_data = (void *)&sipodev_desc
|
|
},
|
|
+ {
|
|
+ .ident = "Mediacom FlexBook edge 13",
|
|
+ .matches = {
|
|
+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "MEDIACOM"),
|
|
+ DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "FlexBook_edge13-M-FBE13"),
|
|
+ },
|
|
+ .driver_data = (void *)&sipodev_desc
|
|
+ },
|
|
{
|
|
.ident = "Odys Winbook 13",
|
|
.matches = {
|
|
diff --git a/drivers/hwmon/aspeed-pwm-tacho.c b/drivers/hwmon/aspeed-pwm-tacho.c
|
|
index 33fb54845bf6..3d8239fd66ed 100644
|
|
--- a/drivers/hwmon/aspeed-pwm-tacho.c
|
|
+++ b/drivers/hwmon/aspeed-pwm-tacho.c
|
|
@@ -851,6 +851,8 @@ static int aspeed_create_fan(struct device *dev,
|
|
ret = of_property_read_u32(child, "reg", &pwm_port);
|
|
if (ret)
|
|
return ret;
|
|
+ if (pwm_port >= ARRAY_SIZE(pwm_port_params))
|
|
+ return -EINVAL;
|
|
aspeed_create_pwm_port(priv, (u8)pwm_port);
|
|
|
|
ret = of_property_count_u8_elems(child, "cooling-levels");
|
|
diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c
|
|
index 7efa6bfef060..ba9b96973e80 100644
|
|
--- a/drivers/hwmon/nct6775.c
|
|
+++ b/drivers/hwmon/nct6775.c
|
|
@@ -786,13 +786,13 @@ static const char *const nct6798_temp_label[] = {
|
|
"Agent1 Dimm1",
|
|
"BYTE_TEMP0",
|
|
"BYTE_TEMP1",
|
|
- "",
|
|
- "",
|
|
+ "PECI Agent 0 Calibration", /* undocumented */
|
|
+ "PECI Agent 1 Calibration", /* undocumented */
|
|
"",
|
|
"Virtual_TEMP"
|
|
};
|
|
|
|
-#define NCT6798_TEMP_MASK 0x8fff0ffe
|
|
+#define NCT6798_TEMP_MASK 0xbfff0ffe
|
|
#define NCT6798_VIRT_TEMP_MASK 0x80000c00
|
|
|
|
/* NCT6102D/NCT6106D specific data */
|
|
diff --git a/drivers/hwmon/pmbus/adm1275.c b/drivers/hwmon/pmbus/adm1275.c
|
|
index e25f541227da..19317575d1c6 100644
|
|
--- a/drivers/hwmon/pmbus/adm1275.c
|
|
+++ b/drivers/hwmon/pmbus/adm1275.c
|
|
@@ -465,6 +465,7 @@ MODULE_DEVICE_TABLE(i2c, adm1275_id);
|
|
static int adm1275_probe(struct i2c_client *client,
|
|
const struct i2c_device_id *id)
|
|
{
|
|
+ s32 (*config_read_fn)(const struct i2c_client *client, u8 reg);
|
|
u8 block_buffer[I2C_SMBUS_BLOCK_MAX + 1];
|
|
int config, device_config;
|
|
int ret;
|
|
@@ -510,11 +511,16 @@ static int adm1275_probe(struct i2c_client *client,
|
|
"Device mismatch: Configured %s, detected %s\n",
|
|
id->name, mid->name);
|
|
|
|
- config = i2c_smbus_read_byte_data(client, ADM1275_PMON_CONFIG);
|
|
+ if (mid->driver_data == adm1272 || mid->driver_data == adm1278 ||
|
|
+ mid->driver_data == adm1293 || mid->driver_data == adm1294)
|
|
+ config_read_fn = i2c_smbus_read_word_data;
|
|
+ else
|
|
+ config_read_fn = i2c_smbus_read_byte_data;
|
|
+ config = config_read_fn(client, ADM1275_PMON_CONFIG);
|
|
if (config < 0)
|
|
return config;
|
|
|
|
- device_config = i2c_smbus_read_byte_data(client, ADM1275_DEVICE_CONFIG);
|
|
+ device_config = config_read_fn(client, ADM1275_DEVICE_CONFIG);
|
|
if (device_config < 0)
|
|
return device_config;
|
|
|
|
diff --git a/drivers/hwmon/scmi-hwmon.c b/drivers/hwmon/scmi-hwmon.c
|
|
index 286d3cfda7de..d421e691318b 100644
|
|
--- a/drivers/hwmon/scmi-hwmon.c
|
|
+++ b/drivers/hwmon/scmi-hwmon.c
|
|
@@ -147,7 +147,7 @@ static enum hwmon_sensor_types scmi_types[] = {
|
|
[ENERGY] = hwmon_energy,
|
|
};
|
|
|
|
-static u32 hwmon_attributes[] = {
|
|
+static u32 hwmon_attributes[hwmon_max] = {
|
|
[hwmon_chip] = HWMON_C_REGISTER_TZ,
|
|
[hwmon_temp] = HWMON_T_INPUT | HWMON_T_LABEL,
|
|
[hwmon_in] = HWMON_I_INPUT | HWMON_I_LABEL,
|
|
diff --git a/drivers/i2c/busses/i2c-qcom-geni.c b/drivers/i2c/busses/i2c-qcom-geni.c
|
|
index 18d1e4fd4cf3..7f130829bf01 100644
|
|
--- a/drivers/i2c/busses/i2c-qcom-geni.c
|
|
+++ b/drivers/i2c/busses/i2c-qcom-geni.c
|
|
@@ -367,7 +367,6 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
|
|
geni_se_select_mode(se, GENI_SE_FIFO);
|
|
|
|
writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN);
|
|
- geni_se_setup_m_cmd(se, I2C_READ, m_param);
|
|
|
|
if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) {
|
|
geni_se_select_mode(se, GENI_SE_FIFO);
|
|
@@ -375,6 +374,8 @@ static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
|
|
dma_buf = NULL;
|
|
}
|
|
|
|
+ geni_se_setup_m_cmd(se, I2C_READ, m_param);
|
|
+
|
|
time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
|
|
if (!time_left)
|
|
geni_i2c_abort_xfer(gi2c);
|
|
@@ -408,7 +409,6 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
|
|
geni_se_select_mode(se, GENI_SE_FIFO);
|
|
|
|
writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN);
|
|
- geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
|
|
|
|
if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) {
|
|
geni_se_select_mode(se, GENI_SE_FIFO);
|
|
@@ -416,6 +416,8 @@ static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
|
|
dma_buf = NULL;
|
|
}
|
|
|
|
+ geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
|
|
+
|
|
if (!dma_buf) /* Get FIFO IRQ */
|
|
writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
|
|
|
|
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c
|
|
index 3b5397aa4ca6..50dd98803ca0 100644
|
|
--- a/drivers/i2c/busses/i2c-rcar.c
|
|
+++ b/drivers/i2c/busses/i2c-rcar.c
|
|
@@ -868,6 +868,7 @@ static int rcar_unreg_slave(struct i2c_client *slave)
|
|
/* disable irqs and ensure none is running before clearing ptr */
|
|
rcar_i2c_write(priv, ICSIER, 0);
|
|
rcar_i2c_write(priv, ICSCR, 0);
|
|
+ rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
|
|
|
|
synchronize_irq(priv->irq);
|
|
priv->slave = NULL;
|
|
@@ -971,6 +972,8 @@ static int rcar_i2c_probe(struct platform_device *pdev)
|
|
if (ret < 0)
|
|
goto out_pm_put;
|
|
|
|
+ rcar_i2c_write(priv, ICSAR, 0); /* Gen2: must be 0 if not using slave */
|
|
+
|
|
if (priv->devtype == I2C_RCAR_GEN3) {
|
|
priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
|
|
if (!IS_ERR(priv->rstc)) {
|
|
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
|
|
index 1c2bf18cda9f..83b66757c7ae 100644
|
|
--- a/drivers/infiniband/core/cm.c
|
|
+++ b/drivers/infiniband/core/cm.c
|
|
@@ -3723,10 +3723,12 @@ static int cm_send_sidr_rep_locked(struct cm_id_private *cm_id_priv,
|
|
return ret;
|
|
}
|
|
cm_id_priv->id.state = IB_CM_IDLE;
|
|
+ spin_lock_irq(&cm.lock);
|
|
if (!RB_EMPTY_NODE(&cm_id_priv->sidr_id_node)) {
|
|
rb_erase(&cm_id_priv->sidr_id_node, &cm.remote_sidr_table);
|
|
RB_CLEAR_NODE(&cm_id_priv->sidr_id_node);
|
|
}
|
|
+ spin_unlock_irq(&cm.lock);
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/infiniband/core/rdma_core.c b/drivers/infiniband/core/rdma_core.c
|
|
index 75bcbc625616..3ab84fcbaade 100644
|
|
--- a/drivers/infiniband/core/rdma_core.c
|
|
+++ b/drivers/infiniband/core/rdma_core.c
|
|
@@ -638,9 +638,6 @@ void rdma_alloc_commit_uobject(struct ib_uobject *uobj,
|
|
{
|
|
struct ib_uverbs_file *ufile = attrs->ufile;
|
|
|
|
- /* alloc_commit consumes the uobj kref */
|
|
- uobj->uapi_object->type_class->alloc_commit(uobj);
|
|
-
|
|
/* kref is held so long as the uobj is on the uobj list. */
|
|
uverbs_uobject_get(uobj);
|
|
spin_lock_irq(&ufile->uobjects_lock);
|
|
@@ -650,6 +647,9 @@ void rdma_alloc_commit_uobject(struct ib_uobject *uobj,
|
|
/* matches atomic_set(-1) in alloc_uobj */
|
|
atomic_set(&uobj->usecnt, 0);
|
|
|
|
+ /* alloc_commit consumes the uobj kref */
|
|
+ uobj->uapi_object->type_class->alloc_commit(uobj);
|
|
+
|
|
/* Matches the down_read in rdma_alloc_begin_uobject */
|
|
up_read(&ufile->hw_destroy_rwsem);
|
|
}
|
|
diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c
|
|
index 3de7606d4a1a..bdeb6500a919 100644
|
|
--- a/drivers/infiniband/hw/mlx5/odp.c
|
|
+++ b/drivers/infiniband/hw/mlx5/odp.c
|
|
@@ -601,6 +601,23 @@ void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *imr)
|
|
*/
|
|
synchronize_srcu(&dev->odp_srcu);
|
|
|
|
+ /*
|
|
+ * All work on the prefetch list must be completed, xa_erase() prevented
|
|
+ * new work from being created.
|
|
+ */
|
|
+ wait_event(imr->q_deferred_work, !atomic_read(&imr->num_deferred_work));
|
|
+
|
|
+ /*
|
|
+ * At this point it is forbidden for any other thread to enter
|
|
+ * pagefault_mr() on this imr. It is already forbidden to call
|
|
+ * pagefault_mr() on an implicit child. Due to this additions to
|
|
+ * implicit_children are prevented.
|
|
+ */
|
|
+
|
|
+ /*
|
|
+ * Block destroy_unused_implicit_child_mr() from incrementing
|
|
+ * num_deferred_work.
|
|
+ */
|
|
xa_lock(&imr->implicit_children);
|
|
xa_for_each (&imr->implicit_children, idx, mtt) {
|
|
__xa_erase(&imr->implicit_children, idx);
|
|
@@ -609,9 +626,8 @@ void mlx5_ib_free_implicit_mr(struct mlx5_ib_mr *imr)
|
|
xa_unlock(&imr->implicit_children);
|
|
|
|
/*
|
|
- * num_deferred_work can only be incremented inside the odp_srcu, or
|
|
- * under xa_lock while the child is in the xarray. Thus at this point
|
|
- * it is only decreasing, and all work holding it is now on the wq.
|
|
+ * Wait for any concurrent destroy_unused_implicit_child_mr() to
|
|
+ * complete.
|
|
*/
|
|
wait_event(imr->q_deferred_work, !atomic_read(&imr->num_deferred_work));
|
|
|
|
diff --git a/drivers/infiniband/hw/mlx5/srq_cmd.c b/drivers/infiniband/hw/mlx5/srq_cmd.c
|
|
index 8fc3630a9d4c..0224231a2e6f 100644
|
|
--- a/drivers/infiniband/hw/mlx5/srq_cmd.c
|
|
+++ b/drivers/infiniband/hw/mlx5/srq_cmd.c
|
|
@@ -83,11 +83,11 @@ struct mlx5_core_srq *mlx5_cmd_get_srq(struct mlx5_ib_dev *dev, u32 srqn)
|
|
struct mlx5_srq_table *table = &dev->srq_table;
|
|
struct mlx5_core_srq *srq;
|
|
|
|
- xa_lock(&table->array);
|
|
+ xa_lock_irq(&table->array);
|
|
srq = xa_load(&table->array, srqn);
|
|
if (srq)
|
|
refcount_inc(&srq->common.refcount);
|
|
- xa_unlock(&table->array);
|
|
+ xa_unlock_irq(&table->array);
|
|
|
|
return srq;
|
|
}
|
|
diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c
|
|
index 8719da540383..196e8505dd8d 100644
|
|
--- a/drivers/input/mouse/elan_i2c_core.c
|
|
+++ b/drivers/input/mouse/elan_i2c_core.c
|
|
@@ -951,6 +951,8 @@ static void elan_report_absolute(struct elan_tp_data *data, u8 *packet)
|
|
u8 hover_info = packet[ETP_HOVER_INFO_OFFSET];
|
|
bool contact_valid, hover_event;
|
|
|
|
+ pm_wakeup_event(&data->client->dev, 0);
|
|
+
|
|
hover_event = hover_info & 0x40;
|
|
for (i = 0; i < ETP_MAX_FINGERS; i++) {
|
|
contact_valid = tp_info & (1U << (3 + i));
|
|
@@ -974,6 +976,8 @@ static void elan_report_trackpoint(struct elan_tp_data *data, u8 *report)
|
|
u8 *packet = &report[ETP_REPORT_ID_OFFSET + 1];
|
|
int x, y;
|
|
|
|
+ pm_wakeup_event(&data->client->dev, 0);
|
|
+
|
|
if (!data->tp_input) {
|
|
dev_warn_once(&data->client->dev,
|
|
"received a trackpoint report while no trackpoint device has been created. Please report upstream.\n");
|
|
@@ -998,7 +1002,6 @@ static void elan_report_trackpoint(struct elan_tp_data *data, u8 *report)
|
|
static irqreturn_t elan_isr(int irq, void *dev_id)
|
|
{
|
|
struct elan_tp_data *data = dev_id;
|
|
- struct device *dev = &data->client->dev;
|
|
int error;
|
|
u8 report[ETP_MAX_REPORT_LEN];
|
|
|
|
@@ -1016,8 +1019,6 @@ static irqreturn_t elan_isr(int irq, void *dev_id)
|
|
if (error)
|
|
goto out;
|
|
|
|
- pm_wakeup_event(dev, 0);
|
|
-
|
|
switch (report[ETP_REPORT_ID_OFFSET]) {
|
|
case ETP_REPORT_ID:
|
|
elan_report_absolute(data, report);
|
|
@@ -1026,7 +1027,7 @@ static irqreturn_t elan_isr(int irq, void *dev_id)
|
|
elan_report_trackpoint(data, report);
|
|
break;
|
|
default:
|
|
- dev_err(dev, "invalid report id data (%x)\n",
|
|
+ dev_err(&data->client->dev, "invalid report id data (%x)\n",
|
|
report[ETP_REPORT_ID_OFFSET]);
|
|
}
|
|
|
|
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
|
|
index 758dae8d6500..4b81b2d0fe06 100644
|
|
--- a/drivers/input/mouse/synaptics.c
|
|
+++ b/drivers/input/mouse/synaptics.c
|
|
@@ -179,6 +179,7 @@ static const char * const smbus_pnp_ids[] = {
|
|
"LEN0093", /* T480 */
|
|
"LEN0096", /* X280 */
|
|
"LEN0097", /* X280 -> ALPS trackpoint */
|
|
+ "LEN0099", /* X1 Extreme 1st */
|
|
"LEN009b", /* T580 */
|
|
"LEN200f", /* T450s */
|
|
"LEN2044", /* L470 */
|
|
diff --git a/drivers/interconnect/qcom/msm8916.c b/drivers/interconnect/qcom/msm8916.c
|
|
index e94f3c5228b7..42c6c5581662 100644
|
|
--- a/drivers/interconnect/qcom/msm8916.c
|
|
+++ b/drivers/interconnect/qcom/msm8916.c
|
|
@@ -197,13 +197,13 @@ DEFINE_QNODE(pcnoc_int_0, MSM8916_PNOC_INT_0, 8, -1, -1, MSM8916_PNOC_SNOC_MAS,
|
|
DEFINE_QNODE(pcnoc_int_1, MSM8916_PNOC_INT_1, 8, -1, -1, MSM8916_PNOC_SNOC_MAS);
|
|
DEFINE_QNODE(pcnoc_m_0, MSM8916_PNOC_MAS_0, 8, -1, -1, MSM8916_PNOC_INT_0);
|
|
DEFINE_QNODE(pcnoc_m_1, MSM8916_PNOC_MAS_1, 8, -1, -1, MSM8916_PNOC_SNOC_MAS);
|
|
-DEFINE_QNODE(pcnoc_s_0, MSM8916_PNOC_SLV_0, 8, -1, -1, MSM8916_SLAVE_CLK_CTL, MSM8916_SLAVE_TLMM, MSM8916_SLAVE_TCSR, MSM8916_SLAVE_SECURITY, MSM8916_SLAVE_MSS);
|
|
-DEFINE_QNODE(pcnoc_s_1, MSM8916_PNOC_SLV_1, 8, -1, -1, MSM8916_SLAVE_IMEM_CFG, MSM8916_SLAVE_CRYPTO_0_CFG, MSM8916_SLAVE_MSG_RAM, MSM8916_SLAVE_PDM, MSM8916_SLAVE_PRNG);
|
|
-DEFINE_QNODE(pcnoc_s_2, MSM8916_PNOC_SLV_2, 8, -1, -1, MSM8916_SLAVE_SPDM, MSM8916_SLAVE_BOOT_ROM, MSM8916_SLAVE_BIMC_CFG, MSM8916_SLAVE_PNOC_CFG, MSM8916_SLAVE_PMIC_ARB);
|
|
-DEFINE_QNODE(pcnoc_s_3, MSM8916_PNOC_SLV_3, 8, -1, -1, MSM8916_SLAVE_MPM, MSM8916_SLAVE_SNOC_CFG, MSM8916_SLAVE_RBCPR_CFG, MSM8916_SLAVE_QDSS_CFG, MSM8916_SLAVE_DEHR_CFG);
|
|
-DEFINE_QNODE(pcnoc_s_4, MSM8916_PNOC_SLV_4, 8, -1, -1, MSM8916_SLAVE_VENUS_CFG, MSM8916_SLAVE_CAMERA_CFG, MSM8916_SLAVE_DISPLAY_CFG);
|
|
-DEFINE_QNODE(pcnoc_s_8, MSM8916_PNOC_SLV_8, 8, -1, -1, MSM8916_SLAVE_USB_HS, MSM8916_SLAVE_SDCC_1, MSM8916_SLAVE_BLSP_1);
|
|
-DEFINE_QNODE(pcnoc_s_9, MSM8916_PNOC_SLV_9, 8, -1, -1, MSM8916_SLAVE_SDCC_2, MSM8916_SLAVE_LPASS, MSM8916_SLAVE_GRAPHICS_3D_CFG);
|
|
+DEFINE_QNODE(pcnoc_s_0, MSM8916_PNOC_SLV_0, 4, -1, -1, MSM8916_SLAVE_CLK_CTL, MSM8916_SLAVE_TLMM, MSM8916_SLAVE_TCSR, MSM8916_SLAVE_SECURITY, MSM8916_SLAVE_MSS);
|
|
+DEFINE_QNODE(pcnoc_s_1, MSM8916_PNOC_SLV_1, 4, -1, -1, MSM8916_SLAVE_IMEM_CFG, MSM8916_SLAVE_CRYPTO_0_CFG, MSM8916_SLAVE_MSG_RAM, MSM8916_SLAVE_PDM, MSM8916_SLAVE_PRNG);
|
|
+DEFINE_QNODE(pcnoc_s_2, MSM8916_PNOC_SLV_2, 4, -1, -1, MSM8916_SLAVE_SPDM, MSM8916_SLAVE_BOOT_ROM, MSM8916_SLAVE_BIMC_CFG, MSM8916_SLAVE_PNOC_CFG, MSM8916_SLAVE_PMIC_ARB);
|
|
+DEFINE_QNODE(pcnoc_s_3, MSM8916_PNOC_SLV_3, 4, -1, -1, MSM8916_SLAVE_MPM, MSM8916_SLAVE_SNOC_CFG, MSM8916_SLAVE_RBCPR_CFG, MSM8916_SLAVE_QDSS_CFG, MSM8916_SLAVE_DEHR_CFG);
|
|
+DEFINE_QNODE(pcnoc_s_4, MSM8916_PNOC_SLV_4, 4, -1, -1, MSM8916_SLAVE_VENUS_CFG, MSM8916_SLAVE_CAMERA_CFG, MSM8916_SLAVE_DISPLAY_CFG);
|
|
+DEFINE_QNODE(pcnoc_s_8, MSM8916_PNOC_SLV_8, 4, -1, -1, MSM8916_SLAVE_USB_HS, MSM8916_SLAVE_SDCC_1, MSM8916_SLAVE_BLSP_1);
|
|
+DEFINE_QNODE(pcnoc_s_9, MSM8916_PNOC_SLV_9, 4, -1, -1, MSM8916_SLAVE_SDCC_2, MSM8916_SLAVE_LPASS, MSM8916_SLAVE_GRAPHICS_3D_CFG);
|
|
DEFINE_QNODE(pcnoc_snoc_mas, MSM8916_PNOC_SNOC_MAS, 8, 29, -1, MSM8916_PNOC_SNOC_SLV);
|
|
DEFINE_QNODE(pcnoc_snoc_slv, MSM8916_PNOC_SNOC_SLV, 8, -1, 45, MSM8916_SNOC_INT_0, MSM8916_SNOC_INT_BIMC, MSM8916_SNOC_INT_1);
|
|
DEFINE_QNODE(qdss_int, MSM8916_SNOC_QDSS_INT, 8, -1, -1, MSM8916_SNOC_INT_0, MSM8916_SNOC_INT_BIMC);
|
|
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
|
|
index 2883ac389abb..9c2e2ed82826 100644
|
|
--- a/drivers/iommu/amd_iommu.c
|
|
+++ b/drivers/iommu/amd_iommu.c
|
|
@@ -4090,9 +4090,10 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
|
|
if (!fn)
|
|
return -ENOMEM;
|
|
iommu->ir_domain = irq_domain_create_tree(fn, &amd_ir_domain_ops, iommu);
|
|
- irq_domain_free_fwnode(fn);
|
|
- if (!iommu->ir_domain)
|
|
+ if (!iommu->ir_domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
return -ENOMEM;
|
|
+ }
|
|
|
|
iommu->ir_domain->parent = arch_get_ir_parent_domain();
|
|
iommu->msi_domain = arch_create_remap_msi_irq_domain(iommu->ir_domain,
|
|
diff --git a/drivers/iommu/hyperv-iommu.c b/drivers/iommu/hyperv-iommu.c
|
|
index a386b83e0e34..f0fe5030acd3 100644
|
|
--- a/drivers/iommu/hyperv-iommu.c
|
|
+++ b/drivers/iommu/hyperv-iommu.c
|
|
@@ -155,7 +155,10 @@ static int __init hyperv_prepare_irq_remapping(void)
|
|
0, IOAPIC_REMAPPING_ENTRY, fn,
|
|
&hyperv_ir_domain_ops, NULL);
|
|
|
|
- irq_domain_free_fwnode(fn);
|
|
+ if (!ioapic_ir_domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
+ return -ENOMEM;
|
|
+ }
|
|
|
|
/*
|
|
* Hyper-V doesn't provide irq remapping function for
|
|
diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
|
|
index 81e43c1df7ec..982d796b686b 100644
|
|
--- a/drivers/iommu/intel_irq_remapping.c
|
|
+++ b/drivers/iommu/intel_irq_remapping.c
|
|
@@ -563,8 +563,8 @@ static int intel_setup_irq_remapping(struct intel_iommu *iommu)
|
|
0, INTR_REMAP_TABLE_ENTRIES,
|
|
fn, &intel_ir_domain_ops,
|
|
iommu);
|
|
- irq_domain_free_fwnode(fn);
|
|
if (!iommu->ir_domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
pr_err("IR%d: failed to allocate irqdomain\n", iommu->seq_id);
|
|
goto out_free_bitmap;
|
|
}
|
|
diff --git a/drivers/iommu/qcom_iommu.c b/drivers/iommu/qcom_iommu.c
|
|
index 5b3b270972f8..c6277d7398f3 100644
|
|
--- a/drivers/iommu/qcom_iommu.c
|
|
+++ b/drivers/iommu/qcom_iommu.c
|
|
@@ -65,6 +65,7 @@ struct qcom_iommu_domain {
|
|
struct mutex init_mutex; /* Protects iommu pointer */
|
|
struct iommu_domain domain;
|
|
struct qcom_iommu_dev *iommu;
|
|
+ struct iommu_fwspec *fwspec;
|
|
};
|
|
|
|
static struct qcom_iommu_domain *to_qcom_iommu_domain(struct iommu_domain *dom)
|
|
@@ -84,9 +85,9 @@ static struct qcom_iommu_dev * to_iommu(struct device *dev)
|
|
return dev_iommu_priv_get(dev);
|
|
}
|
|
|
|
-static struct qcom_iommu_ctx * to_ctx(struct device *dev, unsigned asid)
|
|
+static struct qcom_iommu_ctx * to_ctx(struct qcom_iommu_domain *d, unsigned asid)
|
|
{
|
|
- struct qcom_iommu_dev *qcom_iommu = to_iommu(dev);
|
|
+ struct qcom_iommu_dev *qcom_iommu = d->iommu;
|
|
if (!qcom_iommu)
|
|
return NULL;
|
|
return qcom_iommu->ctxs[asid - 1];
|
|
@@ -118,14 +119,12 @@ iommu_readq(struct qcom_iommu_ctx *ctx, unsigned reg)
|
|
|
|
static void qcom_iommu_tlb_sync(void *cookie)
|
|
{
|
|
- struct iommu_fwspec *fwspec;
|
|
- struct device *dev = cookie;
|
|
+ struct qcom_iommu_domain *qcom_domain = cookie;
|
|
+ struct iommu_fwspec *fwspec = qcom_domain->fwspec;
|
|
unsigned i;
|
|
|
|
- fwspec = dev_iommu_fwspec_get(dev);
|
|
-
|
|
for (i = 0; i < fwspec->num_ids; i++) {
|
|
- struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
|
|
+ struct qcom_iommu_ctx *ctx = to_ctx(qcom_domain, fwspec->ids[i]);
|
|
unsigned int val, ret;
|
|
|
|
iommu_writel(ctx, ARM_SMMU_CB_TLBSYNC, 0);
|
|
@@ -139,14 +138,12 @@ static void qcom_iommu_tlb_sync(void *cookie)
|
|
|
|
static void qcom_iommu_tlb_inv_context(void *cookie)
|
|
{
|
|
- struct device *dev = cookie;
|
|
- struct iommu_fwspec *fwspec;
|
|
+ struct qcom_iommu_domain *qcom_domain = cookie;
|
|
+ struct iommu_fwspec *fwspec = qcom_domain->fwspec;
|
|
unsigned i;
|
|
|
|
- fwspec = dev_iommu_fwspec_get(dev);
|
|
-
|
|
for (i = 0; i < fwspec->num_ids; i++) {
|
|
- struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
|
|
+ struct qcom_iommu_ctx *ctx = to_ctx(qcom_domain, fwspec->ids[i]);
|
|
iommu_writel(ctx, ARM_SMMU_CB_S1_TLBIASID, ctx->asid);
|
|
}
|
|
|
|
@@ -156,16 +153,14 @@ static void qcom_iommu_tlb_inv_context(void *cookie)
|
|
static void qcom_iommu_tlb_inv_range_nosync(unsigned long iova, size_t size,
|
|
size_t granule, bool leaf, void *cookie)
|
|
{
|
|
- struct device *dev = cookie;
|
|
- struct iommu_fwspec *fwspec;
|
|
+ struct qcom_iommu_domain *qcom_domain = cookie;
|
|
+ struct iommu_fwspec *fwspec = qcom_domain->fwspec;
|
|
unsigned i, reg;
|
|
|
|
reg = leaf ? ARM_SMMU_CB_S1_TLBIVAL : ARM_SMMU_CB_S1_TLBIVA;
|
|
|
|
- fwspec = dev_iommu_fwspec_get(dev);
|
|
-
|
|
for (i = 0; i < fwspec->num_ids; i++) {
|
|
- struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
|
|
+ struct qcom_iommu_ctx *ctx = to_ctx(qcom_domain, fwspec->ids[i]);
|
|
size_t s = size;
|
|
|
|
iova = (iova >> 12) << 12;
|
|
@@ -256,7 +251,9 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
|
|
};
|
|
|
|
qcom_domain->iommu = qcom_iommu;
|
|
- pgtbl_ops = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &pgtbl_cfg, dev);
|
|
+ qcom_domain->fwspec = fwspec;
|
|
+
|
|
+ pgtbl_ops = alloc_io_pgtable_ops(ARM_32_LPAE_S1, &pgtbl_cfg, qcom_domain);
|
|
if (!pgtbl_ops) {
|
|
dev_err(qcom_iommu->dev, "failed to allocate pagetable ops\n");
|
|
ret = -ENOMEM;
|
|
@@ -269,7 +266,7 @@ static int qcom_iommu_init_domain(struct iommu_domain *domain,
|
|
domain->geometry.force_aperture = true;
|
|
|
|
for (i = 0; i < fwspec->num_ids; i++) {
|
|
- struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
|
|
+ struct qcom_iommu_ctx *ctx = to_ctx(qcom_domain, fwspec->ids[i]);
|
|
|
|
if (!ctx->secure_init) {
|
|
ret = qcom_scm_restore_sec_cfg(qcom_iommu->sec_id, ctx->asid);
|
|
@@ -419,7 +416,7 @@ static void qcom_iommu_detach_dev(struct iommu_domain *domain, struct device *de
|
|
|
|
pm_runtime_get_sync(qcom_iommu->dev);
|
|
for (i = 0; i < fwspec->num_ids; i++) {
|
|
- struct qcom_iommu_ctx *ctx = to_ctx(dev, fwspec->ids[i]);
|
|
+ struct qcom_iommu_ctx *ctx = to_ctx(qcom_domain, fwspec->ids[i]);
|
|
|
|
/* Disable the context bank: */
|
|
iommu_writel(ctx, ARM_SMMU_CB_SCTLR, 0);
|
|
diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
|
|
index 4094c47eca7f..8588fb59a3ed 100644
|
|
--- a/drivers/md/dm-integrity.c
|
|
+++ b/drivers/md/dm-integrity.c
|
|
@@ -2424,7 +2424,7 @@ static void integrity_writer(struct work_struct *w)
|
|
unsigned prev_free_sectors;
|
|
|
|
/* the following test is not needed, but it tests the replay code */
|
|
- if (unlikely(dm_suspended(ic->ti)) && !ic->meta_dev)
|
|
+ if (unlikely(dm_post_suspending(ic->ti)) && !ic->meta_dev)
|
|
return;
|
|
|
|
spin_lock_irq(&ic->endio_wait.lock);
|
|
@@ -2485,7 +2485,7 @@ static void integrity_recalc(struct work_struct *w)
|
|
|
|
next_chunk:
|
|
|
|
- if (unlikely(dm_suspended(ic->ti)))
|
|
+ if (unlikely(dm_post_suspending(ic->ti)))
|
|
goto unlock_ret;
|
|
|
|
range.logical_sector = le64_to_cpu(ic->sb->recalc_sector);
|
|
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
|
|
index 05333fc2f8d2..fabcc51b468c 100644
|
|
--- a/drivers/md/dm.c
|
|
+++ b/drivers/md/dm.c
|
|
@@ -142,6 +142,7 @@ EXPORT_SYMBOL_GPL(dm_bio_get_target_bio_nr);
|
|
#define DMF_NOFLUSH_SUSPENDING 5
|
|
#define DMF_DEFERRED_REMOVE 6
|
|
#define DMF_SUSPENDED_INTERNALLY 7
|
|
+#define DMF_POST_SUSPENDING 8
|
|
|
|
#define DM_NUMA_NODE NUMA_NO_NODE
|
|
static int dm_numa_node = DM_NUMA_NODE;
|
|
@@ -1446,9 +1447,6 @@ static int __send_empty_flush(struct clone_info *ci)
|
|
BUG_ON(bio_has_data(ci->bio));
|
|
while ((ti = dm_table_get_target(ci->map, target_nr++)))
|
|
__send_duplicate_bios(ci, ti, ti->num_flush_bios, NULL);
|
|
-
|
|
- bio_disassociate_blkg(ci->bio);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -1636,6 +1634,7 @@ static blk_qc_t __split_and_process_bio(struct mapped_device *md,
|
|
ci.bio = &flush_bio;
|
|
ci.sector_count = 0;
|
|
error = __send_empty_flush(&ci);
|
|
+ bio_uninit(ci.bio);
|
|
/* dec_pending submits any data associated with flush */
|
|
} else if (op_is_zone_mgmt(bio_op(bio))) {
|
|
ci.bio = bio;
|
|
@@ -1710,6 +1709,7 @@ static blk_qc_t __process_bio(struct mapped_device *md, struct dm_table *map,
|
|
ci.bio = &flush_bio;
|
|
ci.sector_count = 0;
|
|
error = __send_empty_flush(&ci);
|
|
+ bio_uninit(ci.bio);
|
|
/* dec_pending submits any data associated with flush */
|
|
} else {
|
|
struct dm_target_io *tio;
|
|
@@ -2399,6 +2399,7 @@ static void __dm_destroy(struct mapped_device *md, bool wait)
|
|
if (!dm_suspended_md(md)) {
|
|
dm_table_presuspend_targets(map);
|
|
set_bit(DMF_SUSPENDED, &md->flags);
|
|
+ set_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
dm_table_postsuspend_targets(map);
|
|
}
|
|
/* dm_put_live_table must be before msleep, otherwise deadlock is possible */
|
|
@@ -2721,7 +2722,9 @@ retry:
|
|
if (r)
|
|
goto out_unlock;
|
|
|
|
+ set_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
dm_table_postsuspend_targets(map);
|
|
+ clear_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
|
|
out_unlock:
|
|
mutex_unlock(&md->suspend_lock);
|
|
@@ -2818,7 +2821,9 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla
|
|
(void) __dm_suspend(md, map, suspend_flags, TASK_UNINTERRUPTIBLE,
|
|
DMF_SUSPENDED_INTERNALLY);
|
|
|
|
+ set_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
dm_table_postsuspend_targets(map);
|
|
+ clear_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
}
|
|
|
|
static void __dm_internal_resume(struct mapped_device *md)
|
|
@@ -2979,6 +2984,11 @@ int dm_suspended_md(struct mapped_device *md)
|
|
return test_bit(DMF_SUSPENDED, &md->flags);
|
|
}
|
|
|
|
+static int dm_post_suspending_md(struct mapped_device *md)
|
|
+{
|
|
+ return test_bit(DMF_POST_SUSPENDING, &md->flags);
|
|
+}
|
|
+
|
|
int dm_suspended_internally_md(struct mapped_device *md)
|
|
{
|
|
return test_bit(DMF_SUSPENDED_INTERNALLY, &md->flags);
|
|
@@ -2995,6 +3005,12 @@ int dm_suspended(struct dm_target *ti)
|
|
}
|
|
EXPORT_SYMBOL_GPL(dm_suspended);
|
|
|
|
+int dm_post_suspending(struct dm_target *ti)
|
|
+{
|
|
+ return dm_post_suspending_md(dm_table_get_md(ti->table));
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(dm_post_suspending);
|
|
+
|
|
int dm_noflush_suspending(struct dm_target *ti)
|
|
{
|
|
return __noflush_suspending(dm_table_get_md(ti->table));
|
|
diff --git a/drivers/mfd/ioc3.c b/drivers/mfd/ioc3.c
|
|
index 02998d4eb74b..74cee7cb0afc 100644
|
|
--- a/drivers/mfd/ioc3.c
|
|
+++ b/drivers/mfd/ioc3.c
|
|
@@ -142,10 +142,11 @@ static int ioc3_irq_domain_setup(struct ioc3_priv_data *ipd, int irq)
|
|
goto err;
|
|
|
|
domain = irq_domain_create_linear(fn, 24, &ioc3_irq_domain_ops, ipd);
|
|
- if (!domain)
|
|
+ if (!domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
goto err;
|
|
+ }
|
|
|
|
- irq_domain_free_fwnode(fn);
|
|
ipd->domain = domain;
|
|
|
|
irq_set_chained_handler_and_data(irq, ioc3_irq_handler, domain);
|
|
diff --git a/drivers/mmc/host/sdhci-of-aspeed.c b/drivers/mmc/host/sdhci-of-aspeed.c
|
|
index 56912e30c47e..a1bcc0f4ba9e 100644
|
|
--- a/drivers/mmc/host/sdhci-of-aspeed.c
|
|
+++ b/drivers/mmc/host/sdhci-of-aspeed.c
|
|
@@ -68,7 +68,7 @@ static void aspeed_sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
|
if (WARN_ON(clock > host->max_clk))
|
|
clock = host->max_clk;
|
|
|
|
- for (div = 1; div < 256; div *= 2) {
|
|
+ for (div = 2; div < 256; div *= 2) {
|
|
if ((parent / div) <= clock)
|
|
break;
|
|
}
|
|
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
|
|
index 2e70e43c5df5..6b40b5ab143a 100644
|
|
--- a/drivers/net/bonding/bond_main.c
|
|
+++ b/drivers/net/bonding/bond_main.c
|
|
@@ -4953,15 +4953,19 @@ int bond_create(struct net *net, const char *name)
|
|
bond_dev->rtnl_link_ops = &bond_link_ops;
|
|
|
|
res = register_netdevice(bond_dev);
|
|
+ if (res < 0) {
|
|
+ free_netdev(bond_dev);
|
|
+ rtnl_unlock();
|
|
+
|
|
+ return res;
|
|
+ }
|
|
|
|
netif_carrier_off(bond_dev);
|
|
|
|
bond_work_init_all(bond);
|
|
|
|
rtnl_unlock();
|
|
- if (res < 0)
|
|
- free_netdev(bond_dev);
|
|
- return res;
|
|
+ return 0;
|
|
}
|
|
|
|
static int __net_init bond_net_init(struct net *net)
|
|
diff --git a/drivers/net/bonding/bond_netlink.c b/drivers/net/bonding/bond_netlink.c
|
|
index b43b51646b11..f0f9138e967f 100644
|
|
--- a/drivers/net/bonding/bond_netlink.c
|
|
+++ b/drivers/net/bonding/bond_netlink.c
|
|
@@ -456,11 +456,10 @@ static int bond_newlink(struct net *src_net, struct net_device *bond_dev,
|
|
return err;
|
|
|
|
err = register_netdevice(bond_dev);
|
|
-
|
|
- netif_carrier_off(bond_dev);
|
|
if (!err) {
|
|
struct bonding *bond = netdev_priv(bond_dev);
|
|
|
|
+ netif_carrier_off(bond_dev);
|
|
bond_work_init_all(bond);
|
|
}
|
|
|
|
diff --git a/drivers/net/dsa/microchip/ksz9477.c b/drivers/net/dsa/microchip/ksz9477.c
|
|
index 65701e65b6c2..95a406e2e373 100644
|
|
--- a/drivers/net/dsa/microchip/ksz9477.c
|
|
+++ b/drivers/net/dsa/microchip/ksz9477.c
|
|
@@ -977,23 +977,6 @@ static void ksz9477_port_mirror_del(struct dsa_switch *ds, int port,
|
|
PORT_MIRROR_SNIFFER, false);
|
|
}
|
|
|
|
-static void ksz9477_phy_setup(struct ksz_device *dev, int port,
|
|
- struct phy_device *phy)
|
|
-{
|
|
- /* Only apply to port with PHY. */
|
|
- if (port >= dev->phy_port_cnt)
|
|
- return;
|
|
-
|
|
- /* The MAC actually cannot run in 1000 half-duplex mode. */
|
|
- phy_remove_link_mode(phy,
|
|
- ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
|
|
-
|
|
- /* PHY does not support gigabit. */
|
|
- if (!(dev->features & GBIT_SUPPORT))
|
|
- phy_remove_link_mode(phy,
|
|
- ETHTOOL_LINK_MODE_1000baseT_Full_BIT);
|
|
-}
|
|
-
|
|
static bool ksz9477_get_gbit(struct ksz_device *dev, u8 data)
|
|
{
|
|
bool gbit;
|
|
@@ -1606,7 +1589,6 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
|
|
.get_port_addr = ksz9477_get_port_addr,
|
|
.cfg_port_member = ksz9477_cfg_port_member,
|
|
.flush_dyn_mac_table = ksz9477_flush_dyn_mac_table,
|
|
- .phy_setup = ksz9477_phy_setup,
|
|
.port_setup = ksz9477_port_setup,
|
|
.r_mib_cnt = ksz9477_r_mib_cnt,
|
|
.r_mib_pkt = ksz9477_r_mib_pkt,
|
|
@@ -1620,7 +1602,29 @@ static const struct ksz_dev_ops ksz9477_dev_ops = {
|
|
|
|
int ksz9477_switch_register(struct ksz_device *dev)
|
|
{
|
|
- return ksz_switch_register(dev, &ksz9477_dev_ops);
|
|
+ int ret, i;
|
|
+ struct phy_device *phydev;
|
|
+
|
|
+ ret = ksz_switch_register(dev, &ksz9477_dev_ops);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+
|
|
+ for (i = 0; i < dev->phy_port_cnt; ++i) {
|
|
+ if (!dsa_is_user_port(dev->ds, i))
|
|
+ continue;
|
|
+
|
|
+ phydev = dsa_to_port(dev->ds, i)->slave->phydev;
|
|
+
|
|
+ /* The MAC actually cannot run in 1000 half-duplex mode. */
|
|
+ phy_remove_link_mode(phydev,
|
|
+ ETHTOOL_LINK_MODE_1000baseT_Half_BIT);
|
|
+
|
|
+ /* PHY does not support gigabit. */
|
|
+ if (!(dev->features & GBIT_SUPPORT))
|
|
+ phy_remove_link_mode(phydev,
|
|
+ ETHTOOL_LINK_MODE_1000baseT_Full_BIT);
|
|
+ }
|
|
+ return ret;
|
|
}
|
|
EXPORT_SYMBOL(ksz9477_switch_register);
|
|
|
|
diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/ksz_common.c
|
|
index fd1d6676ae4f..7b6c0dce7536 100644
|
|
--- a/drivers/net/dsa/microchip/ksz_common.c
|
|
+++ b/drivers/net/dsa/microchip/ksz_common.c
|
|
@@ -358,8 +358,6 @@ int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
|
|
|
|
/* setup slave port */
|
|
dev->dev_ops->port_setup(dev, port, false);
|
|
- if (dev->dev_ops->phy_setup)
|
|
- dev->dev_ops->phy_setup(dev, port, phy);
|
|
|
|
/* port_stp_state_set() will be called after to enable the port so
|
|
* there is no need to do anything.
|
|
diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/ksz_common.h
|
|
index f2c9bb68fd33..7d11dd32ec0d 100644
|
|
--- a/drivers/net/dsa/microchip/ksz_common.h
|
|
+++ b/drivers/net/dsa/microchip/ksz_common.h
|
|
@@ -119,8 +119,6 @@ struct ksz_dev_ops {
|
|
u32 (*get_port_addr)(int port, int offset);
|
|
void (*cfg_port_member)(struct ksz_device *dev, int port, u8 member);
|
|
void (*flush_dyn_mac_table)(struct ksz_device *dev, int port);
|
|
- void (*phy_setup)(struct ksz_device *dev, int port,
|
|
- struct phy_device *phy);
|
|
void (*port_cleanup)(struct ksz_device *dev, int port);
|
|
void (*port_setup)(struct ksz_device *dev, int port, bool cpu_port);
|
|
void (*r_phy)(struct ksz_device *dev, u16 phy, u16 reg, u16 *val);
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
|
|
index 2b4a723c8306..e065be419a03 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/chip.c
|
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.c
|
|
@@ -664,8 +664,11 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
|
|
const struct phylink_link_state *state)
|
|
{
|
|
struct mv88e6xxx_chip *chip = ds->priv;
|
|
+ struct mv88e6xxx_port *p;
|
|
int err;
|
|
|
|
+ p = &chip->ports[port];
|
|
+
|
|
/* FIXME: is this the correct test? If we're in fixed mode on an
|
|
* internal port, why should we process this any different from
|
|
* PHY mode? On the other hand, the port may be automedia between
|
|
@@ -675,10 +678,14 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
|
|
return;
|
|
|
|
mv88e6xxx_reg_lock(chip);
|
|
- /* FIXME: should we force the link down here - but if we do, how
|
|
- * do we restore the link force/unforce state? The driver layering
|
|
- * gets in the way.
|
|
+ /* In inband mode, the link may come up at any time while the link
|
|
+ * is not forced down. Force the link down while we reconfigure the
|
|
+ * interface mode.
|
|
*/
|
|
+ if (mode == MLO_AN_INBAND && p->interface != state->interface &&
|
|
+ chip->info->ops->port_set_link)
|
|
+ chip->info->ops->port_set_link(chip, port, LINK_FORCED_DOWN);
|
|
+
|
|
err = mv88e6xxx_port_config_interface(chip, port, state->interface);
|
|
if (err && err != -EOPNOTSUPP)
|
|
goto err_unlock;
|
|
@@ -691,6 +698,15 @@ static void mv88e6xxx_mac_config(struct dsa_switch *ds, int port,
|
|
if (err > 0)
|
|
err = 0;
|
|
|
|
+ /* Undo the forced down state above after completing configuration
|
|
+ * irrespective of its state on entry, which allows the link to come up.
|
|
+ */
|
|
+ if (mode == MLO_AN_INBAND && p->interface != state->interface &&
|
|
+ chip->info->ops->port_set_link)
|
|
+ chip->info->ops->port_set_link(chip, port, LINK_UNFORCED);
|
|
+
|
|
+ p->interface = state->interface;
|
|
+
|
|
err_unlock:
|
|
mv88e6xxx_reg_unlock(chip);
|
|
|
|
diff --git a/drivers/net/dsa/mv88e6xxx/chip.h b/drivers/net/dsa/mv88e6xxx/chip.h
|
|
index e5430cf2ad71..6476524e8239 100644
|
|
--- a/drivers/net/dsa/mv88e6xxx/chip.h
|
|
+++ b/drivers/net/dsa/mv88e6xxx/chip.h
|
|
@@ -232,6 +232,7 @@ struct mv88e6xxx_port {
|
|
u64 atu_full_violation;
|
|
u64 vtu_member_violation;
|
|
u64 vtu_miss_violation;
|
|
+ phy_interface_t interface;
|
|
u8 cmode;
|
|
bool mirror_ingress;
|
|
bool mirror_egress;
|
|
diff --git a/drivers/net/ethernet/atheros/ag71xx.c b/drivers/net/ethernet/atheros/ag71xx.c
|
|
index 02b7705393ca..37a1cf63d9f7 100644
|
|
--- a/drivers/net/ethernet/atheros/ag71xx.c
|
|
+++ b/drivers/net/ethernet/atheros/ag71xx.c
|
|
@@ -556,7 +556,8 @@ static int ag71xx_mdio_probe(struct ag71xx *ag)
|
|
ag->mdio_reset = of_reset_control_get_exclusive(np, "mdio");
|
|
if (IS_ERR(ag->mdio_reset)) {
|
|
netif_err(ag, probe, ndev, "Failed to get reset mdio.\n");
|
|
- return PTR_ERR(ag->mdio_reset);
|
|
+ err = PTR_ERR(ag->mdio_reset);
|
|
+ goto mdio_err_put_clk;
|
|
}
|
|
|
|
mii_bus->name = "ag71xx_mdio";
|
|
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
index b6fb5a1709c0..1656dc277af4 100644
|
|
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
|
|
@@ -3418,7 +3418,7 @@ void bnxt_set_tpa_flags(struct bnxt *bp)
|
|
*/
|
|
void bnxt_set_ring_params(struct bnxt *bp)
|
|
{
|
|
- u32 ring_size, rx_size, rx_space;
|
|
+ u32 ring_size, rx_size, rx_space, max_rx_cmpl;
|
|
u32 agg_factor = 0, agg_ring_size = 0;
|
|
|
|
/* 8 for CRC and VLAN */
|
|
@@ -3474,7 +3474,15 @@ void bnxt_set_ring_params(struct bnxt *bp)
|
|
bp->tx_nr_pages = bnxt_calc_nr_ring_pages(ring_size, TX_DESC_CNT);
|
|
bp->tx_ring_mask = (bp->tx_nr_pages * TX_DESC_CNT) - 1;
|
|
|
|
- ring_size = bp->rx_ring_size * (2 + agg_factor) + bp->tx_ring_size;
|
|
+ max_rx_cmpl = bp->rx_ring_size;
|
|
+ /* MAX TPA needs to be added because TPA_START completions are
|
|
+ * immediately recycled, so the TPA completions are not bound by
|
|
+ * the RX ring size.
|
|
+ */
|
|
+ if (bp->flags & BNXT_FLAG_TPA)
|
|
+ max_rx_cmpl += bp->max_tpa;
|
|
+ /* RX and TPA completions are 32-byte, all others are 16-byte */
|
|
+ ring_size = max_rx_cmpl * 2 + agg_ring_size + bp->tx_ring_size;
|
|
bp->cp_ring_size = ring_size;
|
|
|
|
bp->cp_nr_pages = bnxt_calc_nr_ring_pages(ring_size, CP_DESC_CNT);
|
|
@@ -10362,15 +10370,15 @@ static void bnxt_sp_task(struct work_struct *work)
|
|
&bp->sp_event))
|
|
bnxt_hwrm_phy_qcaps(bp);
|
|
|
|
- if (test_and_clear_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT,
|
|
- &bp->sp_event))
|
|
- bnxt_init_ethtool_link_settings(bp);
|
|
-
|
|
rc = bnxt_update_link(bp, true);
|
|
- mutex_unlock(&bp->link_lock);
|
|
if (rc)
|
|
netdev_err(bp->dev, "SP task can't update link (rc: %x)\n",
|
|
rc);
|
|
+
|
|
+ if (test_and_clear_bit(BNXT_LINK_CFG_CHANGE_SP_EVENT,
|
|
+ &bp->sp_event))
|
|
+ bnxt_init_ethtool_link_settings(bp);
|
|
+ mutex_unlock(&bp->link_lock);
|
|
}
|
|
if (test_and_clear_bit(BNXT_UPDATE_PHY_SP_EVENT, &bp->sp_event)) {
|
|
int rc;
|
|
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
|
|
index 360f9a95c1d5..21cc2bd12760 100644
|
|
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
|
|
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
|
|
@@ -1687,8 +1687,11 @@ static int bnxt_set_pauseparam(struct net_device *dev,
|
|
if (epause->tx_pause)
|
|
link_info->req_flow_ctrl |= BNXT_LINK_PAUSE_TX;
|
|
|
|
- if (netif_running(dev))
|
|
+ if (netif_running(dev)) {
|
|
+ mutex_lock(&bp->link_lock);
|
|
rc = bnxt_hwrm_set_pause(bp);
|
|
+ mutex_unlock(&bp->link_lock);
|
|
+ }
|
|
return rc;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
index dde1c23c8e39..7b95bb77ad3b 100644
|
|
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
@@ -3522,7 +3522,7 @@ static int bcmgenet_probe(struct platform_device *pdev)
|
|
if (err)
|
|
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
|
|
if (err)
|
|
- goto err;
|
|
+ goto err_clk_disable;
|
|
|
|
/* Mii wait queue */
|
|
init_waitqueue_head(&priv->wq);
|
|
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
index 6bfa7575af94..5f82c1f32f09 100644
|
|
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
|
|
@@ -2938,7 +2938,7 @@ static int dpaa_eth_probe(struct platform_device *pdev)
|
|
DMA_BIT_MASK(40));
|
|
if (err) {
|
|
netdev_err(net_dev, "dma_coerce_mask_and_coherent() failed\n");
|
|
- return err;
|
|
+ goto free_netdev;
|
|
}
|
|
|
|
/* If fsl_fm_max_frm is set to a higher value than the all-common 1500,
|
|
diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
|
|
index 569e06d2bab2..72fa9c4e058f 100644
|
|
--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
|
|
+++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
|
|
@@ -3383,7 +3383,7 @@ static int dpaa2_eth_connect_mac(struct dpaa2_eth_priv *priv)
|
|
|
|
dpni_dev = to_fsl_mc_device(priv->net_dev->dev.parent);
|
|
dpmac_dev = fsl_mc_get_endpoint(dpni_dev);
|
|
- if (IS_ERR(dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type)
|
|
+ if (IS_ERR_OR_NULL(dpmac_dev) || dpmac_dev->dev.type != &fsl_mc_bus_dpmac_type)
|
|
return 0;
|
|
|
|
if (dpaa2_mac_is_type_fixed(dpmac_dev, priv->mc_io))
|
|
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
|
|
index 438648a06f2a..041e19895adf 100644
|
|
--- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c
|
|
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c
|
|
@@ -919,6 +919,7 @@ static int enetc_pf_probe(struct pci_dev *pdev,
|
|
return 0;
|
|
|
|
err_reg_netdev:
|
|
+ enetc_mdio_remove(pf);
|
|
enetc_of_put_phy(priv);
|
|
enetc_free_msix(priv);
|
|
err_alloc_msix:
|
|
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
|
|
index e74dd1f86bba..828eb8ce6631 100644
|
|
--- a/drivers/net/ethernet/freescale/fec.h
|
|
+++ b/drivers/net/ethernet/freescale/fec.h
|
|
@@ -597,6 +597,7 @@ struct fec_enet_private {
|
|
void fec_ptp_init(struct platform_device *pdev, int irq_idx);
|
|
void fec_ptp_stop(struct platform_device *pdev);
|
|
void fec_ptp_start_cyclecounter(struct net_device *ndev);
|
|
+void fec_ptp_disable_hwts(struct net_device *ndev);
|
|
int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr);
|
|
int fec_ptp_get(struct net_device *ndev, struct ifreq *ifr);
|
|
|
|
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
|
|
index dc6f8763a5d4..bf73bc9bf35b 100644
|
|
--- a/drivers/net/ethernet/freescale/fec_main.c
|
|
+++ b/drivers/net/ethernet/freescale/fec_main.c
|
|
@@ -1302,8 +1302,13 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
|
|
ndev->stats.tx_bytes += skb->len;
|
|
}
|
|
|
|
- if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS) &&
|
|
- fep->bufdesc_ex) {
|
|
+ /* NOTE: SKBTX_IN_PROGRESS being set does not imply it's we who
|
|
+ * are to time stamp the packet, so we still need to check time
|
|
+ * stamping enabled flag.
|
|
+ */
|
|
+ if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS &&
|
|
+ fep->hwts_tx_en) &&
|
|
+ fep->bufdesc_ex) {
|
|
struct skb_shared_hwtstamps shhwtstamps;
|
|
struct bufdesc_ex *ebdp = (struct bufdesc_ex *)bdp;
|
|
|
|
@@ -2731,10 +2736,16 @@ static int fec_enet_ioctl(struct net_device *ndev, struct ifreq *rq, int cmd)
|
|
return -ENODEV;
|
|
|
|
if (fep->bufdesc_ex) {
|
|
- if (cmd == SIOCSHWTSTAMP)
|
|
- return fec_ptp_set(ndev, rq);
|
|
- if (cmd == SIOCGHWTSTAMP)
|
|
- return fec_ptp_get(ndev, rq);
|
|
+ bool use_fec_hwts = !phy_has_hwtstamp(phydev);
|
|
+
|
|
+ if (cmd == SIOCSHWTSTAMP) {
|
|
+ if (use_fec_hwts)
|
|
+ return fec_ptp_set(ndev, rq);
|
|
+ fec_ptp_disable_hwts(ndev);
|
|
+ } else if (cmd == SIOCGHWTSTAMP) {
|
|
+ if (use_fec_hwts)
|
|
+ return fec_ptp_get(ndev, rq);
|
|
+ }
|
|
}
|
|
|
|
return phy_mii_ioctl(phydev, rq, cmd);
|
|
diff --git a/drivers/net/ethernet/freescale/fec_ptp.c b/drivers/net/ethernet/freescale/fec_ptp.c
|
|
index 945643c02615..f8a592c96beb 100644
|
|
--- a/drivers/net/ethernet/freescale/fec_ptp.c
|
|
+++ b/drivers/net/ethernet/freescale/fec_ptp.c
|
|
@@ -452,6 +452,18 @@ static int fec_ptp_enable(struct ptp_clock_info *ptp,
|
|
return -EOPNOTSUPP;
|
|
}
|
|
|
|
+/**
|
|
+ * fec_ptp_disable_hwts - disable hardware time stamping
|
|
+ * @ndev: pointer to net_device
|
|
+ */
|
|
+void fec_ptp_disable_hwts(struct net_device *ndev)
|
|
+{
|
|
+ struct fec_enet_private *fep = netdev_priv(ndev);
|
|
+
|
|
+ fep->hwts_tx_en = 0;
|
|
+ fep->hwts_rx_en = 0;
|
|
+}
|
|
+
|
|
int fec_ptp_set(struct net_device *ndev, struct ifreq *ifr)
|
|
{
|
|
struct fec_enet_private *fep = netdev_priv(ndev);
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
index 5587605d6deb..cc45662f77f0 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h
|
|
@@ -77,6 +77,7 @@
|
|
((ring)->p = ((ring)->p - 1 + (ring)->desc_num) % (ring)->desc_num)
|
|
|
|
enum hns_desc_type {
|
|
+ DESC_TYPE_UNKNOWN,
|
|
DESC_TYPE_SKB,
|
|
DESC_TYPE_FRAGLIST_SKB,
|
|
DESC_TYPE_PAGE,
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
index 3003eecd5263..df1cb0441183 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
|
|
@@ -1140,7 +1140,7 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
|
|
}
|
|
|
|
frag_buf_num = hns3_tx_bd_count(size);
|
|
- sizeoflast = size & HNS3_TX_LAST_SIZE_M;
|
|
+ sizeoflast = size % HNS3_MAX_BD_SIZE;
|
|
sizeoflast = sizeoflast ? sizeoflast : HNS3_MAX_BD_SIZE;
|
|
|
|
/* When frag size is bigger than hardware limit, split this frag */
|
|
@@ -1351,6 +1351,10 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < ring->desc_num; i++) {
|
|
+ struct hns3_desc *desc = &ring->desc[ring->next_to_use];
|
|
+
|
|
+ memset(desc, 0, sizeof(*desc));
|
|
+
|
|
/* check if this is where we started */
|
|
if (ring->next_to_use == next_to_use_orig)
|
|
break;
|
|
@@ -1358,6 +1362,9 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
|
/* rollback one */
|
|
ring_ptr_move_bw(ring, next_to_use);
|
|
|
|
+ if (!ring->desc_cb[ring->next_to_use].dma)
|
|
+ continue;
|
|
+
|
|
/* unmap the descriptor dma address */
|
|
if (ring->desc_cb[ring->next_to_use].type == DESC_TYPE_SKB ||
|
|
ring->desc_cb[ring->next_to_use].type ==
|
|
@@ -1374,6 +1381,7 @@ static void hns3_clear_desc(struct hns3_enet_ring *ring, int next_to_use_orig)
|
|
|
|
ring->desc_cb[ring->next_to_use].length = 0;
|
|
ring->desc_cb[ring->next_to_use].dma = 0;
|
|
+ ring->desc_cb[ring->next_to_use].type = DESC_TYPE_UNKNOWN;
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
index abefd7a179f7..e6b29a35cdb2 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.h
|
|
@@ -186,8 +186,6 @@ enum hns3_nic_state {
|
|
#define HNS3_TXD_MSS_S 0
|
|
#define HNS3_TXD_MSS_M (0x3fff << HNS3_TXD_MSS_S)
|
|
|
|
-#define HNS3_TX_LAST_SIZE_M 0xffff
|
|
-
|
|
#define HNS3_VECTOR_TX_IRQ BIT_ULL(0)
|
|
#define HNS3_VECTOR_RX_IRQ BIT_ULL(1)
|
|
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
index 4de268a87958..b66b93f320b4 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
|
|
@@ -2680,11 +2680,10 @@ void hclge_task_schedule(struct hclge_dev *hdev, unsigned long delay_time)
|
|
delay_time);
|
|
}
|
|
|
|
-static int hclge_get_mac_link_status(struct hclge_dev *hdev)
|
|
+static int hclge_get_mac_link_status(struct hclge_dev *hdev, int *link_status)
|
|
{
|
|
struct hclge_link_status_cmd *req;
|
|
struct hclge_desc desc;
|
|
- int link_status;
|
|
int ret;
|
|
|
|
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_LINK_STATUS, true);
|
|
@@ -2696,33 +2695,25 @@ static int hclge_get_mac_link_status(struct hclge_dev *hdev)
|
|
}
|
|
|
|
req = (struct hclge_link_status_cmd *)desc.data;
|
|
- link_status = req->status & HCLGE_LINK_STATUS_UP_M;
|
|
+ *link_status = (req->status & HCLGE_LINK_STATUS_UP_M) > 0 ?
|
|
+ HCLGE_LINK_STATUS_UP : HCLGE_LINK_STATUS_DOWN;
|
|
|
|
- return !!link_status;
|
|
+ return 0;
|
|
}
|
|
|
|
-static int hclge_get_mac_phy_link(struct hclge_dev *hdev)
|
|
+static int hclge_get_mac_phy_link(struct hclge_dev *hdev, int *link_status)
|
|
{
|
|
- unsigned int mac_state;
|
|
- int link_stat;
|
|
+ struct phy_device *phydev = hdev->hw.mac.phydev;
|
|
+
|
|
+ *link_status = HCLGE_LINK_STATUS_DOWN;
|
|
|
|
if (test_bit(HCLGE_STATE_DOWN, &hdev->state))
|
|
return 0;
|
|
|
|
- mac_state = hclge_get_mac_link_status(hdev);
|
|
-
|
|
- if (hdev->hw.mac.phydev) {
|
|
- if (hdev->hw.mac.phydev->state == PHY_RUNNING)
|
|
- link_stat = mac_state &
|
|
- hdev->hw.mac.phydev->link;
|
|
- else
|
|
- link_stat = 0;
|
|
-
|
|
- } else {
|
|
- link_stat = mac_state;
|
|
- }
|
|
+ if (phydev && (phydev->state != PHY_RUNNING || !phydev->link))
|
|
+ return 0;
|
|
|
|
- return !!link_stat;
|
|
+ return hclge_get_mac_link_status(hdev, link_status);
|
|
}
|
|
|
|
static void hclge_update_link_status(struct hclge_dev *hdev)
|
|
@@ -2732,6 +2723,7 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
|
|
struct hnae3_handle *rhandle;
|
|
struct hnae3_handle *handle;
|
|
int state;
|
|
+ int ret;
|
|
int i;
|
|
|
|
if (!client)
|
|
@@ -2740,7 +2732,12 @@ static void hclge_update_link_status(struct hclge_dev *hdev)
|
|
if (test_and_set_bit(HCLGE_STATE_LINK_UPDATING, &hdev->state))
|
|
return;
|
|
|
|
- state = hclge_get_mac_phy_link(hdev);
|
|
+ ret = hclge_get_mac_phy_link(hdev, &state);
|
|
+ if (ret) {
|
|
+ clear_bit(HCLGE_STATE_LINK_UPDATING, &hdev->state);
|
|
+ return;
|
|
+ }
|
|
+
|
|
if (state != hdev->hw.mac.link) {
|
|
for (i = 0; i < hdev->num_vmdq_vport + 1; i++) {
|
|
handle = &hdev->vport[i].nic;
|
|
@@ -6435,14 +6432,15 @@ static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret)
|
|
{
|
|
#define HCLGE_MAC_LINK_STATUS_NUM 100
|
|
|
|
+ int link_status;
|
|
int i = 0;
|
|
int ret;
|
|
|
|
do {
|
|
- ret = hclge_get_mac_link_status(hdev);
|
|
- if (ret < 0)
|
|
+ ret = hclge_get_mac_link_status(hdev, &link_status);
|
|
+ if (ret)
|
|
return ret;
|
|
- else if (ret == link_ret)
|
|
+ if (link_status == link_ret)
|
|
return 0;
|
|
|
|
msleep(HCLGE_LINK_STATUS_MS);
|
|
@@ -6453,9 +6451,6 @@ static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret)
|
|
static int hclge_mac_phy_link_status_wait(struct hclge_dev *hdev, bool en,
|
|
bool is_phy)
|
|
{
|
|
-#define HCLGE_LINK_STATUS_DOWN 0
|
|
-#define HCLGE_LINK_STATUS_UP 1
|
|
-
|
|
int link_ret;
|
|
|
|
link_ret = en ? HCLGE_LINK_STATUS_UP : HCLGE_LINK_STATUS_DOWN;
|
|
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
index 71df23d5f1b4..8784168f8f6f 100644
|
|
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
|
|
@@ -316,6 +316,9 @@ enum hclge_link_fail_code {
|
|
HCLGE_LF_XSFP_ABSENT,
|
|
};
|
|
|
|
+#define HCLGE_LINK_STATUS_DOWN 0
|
|
+#define HCLGE_LINK_STATUS_UP 1
|
|
+
|
|
#define HCLGE_PG_NUM 4
|
|
#define HCLGE_SCH_MODE_SP 0
|
|
#define HCLGE_SCH_MODE_DWRR 1
|
|
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
|
|
index 241f00716979..fe54764caea9 100644
|
|
--- a/drivers/net/ethernet/marvell/sky2.c
|
|
+++ b/drivers/net/ethernet/marvell/sky2.c
|
|
@@ -203,7 +203,7 @@ io_error:
|
|
|
|
static inline u16 gm_phy_read(struct sky2_hw *hw, unsigned port, u16 reg)
|
|
{
|
|
- u16 v;
|
|
+ u16 v = 0;
|
|
__gm_phy_read(hw, port, reg, &v);
|
|
return v;
|
|
}
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core.c b/drivers/net/ethernet/mellanox/mlxsw/core.c
|
|
index e9ccd333f61d..d6d6fe64887b 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/core.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/core.c
|
|
@@ -710,7 +710,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
|
err = mlxsw_core_trap_register(mlxsw_core, &mlxsw_emad_rx_listener,
|
|
mlxsw_core);
|
|
if (err)
|
|
- return err;
|
|
+ goto err_trap_register;
|
|
|
|
err = mlxsw_core->driver->basic_trap_groups_set(mlxsw_core);
|
|
if (err)
|
|
@@ -722,6 +722,7 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
|
|
err_emad_trap_set:
|
|
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
|
|
mlxsw_core);
|
|
+err_trap_register:
|
|
destroy_workqueue(mlxsw_core->emad_wq);
|
|
return err;
|
|
}
|
|
diff --git a/drivers/net/ethernet/mellanox/mlxsw/core_env.c b/drivers/net/ethernet/mellanox/mlxsw/core_env.c
|
|
index 08215fed193d..a7d86df7123f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlxsw/core_env.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlxsw/core_env.c
|
|
@@ -45,7 +45,7 @@ static int mlxsw_env_validate_cable_ident(struct mlxsw_core *core, int id,
|
|
static int
|
|
mlxsw_env_query_module_eeprom(struct mlxsw_core *mlxsw_core, int module,
|
|
u16 offset, u16 size, void *data,
|
|
- unsigned int *p_read_size)
|
|
+ bool qsfp, unsigned int *p_read_size)
|
|
{
|
|
char eeprom_tmp[MLXSW_REG_MCIA_EEPROM_SIZE];
|
|
char mcia_pl[MLXSW_REG_MCIA_LEN];
|
|
@@ -54,6 +54,10 @@ mlxsw_env_query_module_eeprom(struct mlxsw_core *mlxsw_core, int module,
|
|
int status;
|
|
int err;
|
|
|
|
+ /* MCIA register accepts buffer size <= 48. Page of size 128 should be
|
|
+ * read by chunks of size 48, 48, 32. Align the size of the last chunk
|
|
+ * to avoid reading after the end of the page.
|
|
+ */
|
|
size = min_t(u16, size, MLXSW_REG_MCIA_EEPROM_SIZE);
|
|
|
|
if (offset < MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH &&
|
|
@@ -63,18 +67,25 @@ mlxsw_env_query_module_eeprom(struct mlxsw_core *mlxsw_core, int module,
|
|
|
|
i2c_addr = MLXSW_REG_MCIA_I2C_ADDR_LOW;
|
|
if (offset >= MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH) {
|
|
- page = MLXSW_REG_MCIA_PAGE_GET(offset);
|
|
- offset -= MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH * page;
|
|
- /* When reading upper pages 1, 2 and 3 the offset starts at
|
|
- * 128. Please refer to "QSFP+ Memory Map" figure in SFF-8436
|
|
- * specification for graphical depiction.
|
|
- * MCIA register accepts buffer size <= 48. Page of size 128
|
|
- * should be read by chunks of size 48, 48, 32. Align the size
|
|
- * of the last chunk to avoid reading after the end of the
|
|
- * page.
|
|
- */
|
|
- if (offset + size > MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH)
|
|
- size = MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH - offset;
|
|
+ if (qsfp) {
|
|
+ /* When reading upper pages 1, 2 and 3 the offset
|
|
+ * starts at 128. Please refer to "QSFP+ Memory Map"
|
|
+ * figure in SFF-8436 specification for graphical
|
|
+ * depiction.
|
|
+ */
|
|
+ page = MLXSW_REG_MCIA_PAGE_GET(offset);
|
|
+ offset -= MLXSW_REG_MCIA_EEPROM_UP_PAGE_LENGTH * page;
|
|
+ if (offset + size > MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH)
|
|
+ size = MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH - offset;
|
|
+ } else {
|
|
+ /* When reading upper pages 1, 2 and 3 the offset
|
|
+ * starts at 0 and I2C high address is used. Please refer
|
|
+ * refer to "Memory Organization" figure in SFF-8472
|
|
+ * specification for graphical depiction.
|
|
+ */
|
|
+ i2c_addr = MLXSW_REG_MCIA_I2C_ADDR_HIGH;
|
|
+ offset -= MLXSW_REG_MCIA_EEPROM_PAGE_LENGTH;
|
|
+ }
|
|
}
|
|
|
|
mlxsw_reg_mcia_pack(mcia_pl, module, 0, page, offset, size, i2c_addr);
|
|
@@ -166,7 +177,7 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
|
|
int err;
|
|
|
|
err = mlxsw_env_query_module_eeprom(mlxsw_core, module, 0, offset,
|
|
- module_info, &read_size);
|
|
+ module_info, false, &read_size);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -197,7 +208,7 @@ int mlxsw_env_get_module_info(struct mlxsw_core *mlxsw_core, int module,
|
|
/* Verify if transceiver provides diagnostic monitoring page */
|
|
err = mlxsw_env_query_module_eeprom(mlxsw_core, module,
|
|
SFP_DIAGMON, 1, &diag_mon,
|
|
- &read_size);
|
|
+ false, &read_size);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -225,17 +236,22 @@ int mlxsw_env_get_module_eeprom(struct net_device *netdev,
|
|
int offset = ee->offset;
|
|
unsigned int read_size;
|
|
int i = 0;
|
|
+ bool qsfp;
|
|
int err;
|
|
|
|
if (!ee->len)
|
|
return -EINVAL;
|
|
|
|
memset(data, 0, ee->len);
|
|
+ /* Validate module identifier value. */
|
|
+ err = mlxsw_env_validate_cable_ident(mlxsw_core, module, &qsfp);
|
|
+ if (err)
|
|
+ return err;
|
|
|
|
while (i < ee->len) {
|
|
err = mlxsw_env_query_module_eeprom(mlxsw_core, module, offset,
|
|
ee->len - i, data + i,
|
|
- &read_size);
|
|
+ qsfp, &read_size);
|
|
if (err) {
|
|
netdev_err(netdev, "Eeprom query failed\n");
|
|
return err;
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
|
|
index 22430fa911e2..63d78519cbc6 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
|
|
@@ -102,15 +102,18 @@ static void ionic_get_regs(struct net_device *netdev, struct ethtool_regs *regs,
|
|
void *p)
|
|
{
|
|
struct ionic_lif *lif = netdev_priv(netdev);
|
|
+ unsigned int offset;
|
|
unsigned int size;
|
|
|
|
regs->version = IONIC_DEV_CMD_REG_VERSION;
|
|
|
|
+ offset = 0;
|
|
size = IONIC_DEV_INFO_REG_COUNT * sizeof(u32);
|
|
- memcpy_fromio(p, lif->ionic->idev.dev_info_regs->words, size);
|
|
+ memcpy_fromio(p + offset, lif->ionic->idev.dev_info_regs->words, size);
|
|
|
|
+ offset += size;
|
|
size = IONIC_DEV_CMD_REG_COUNT * sizeof(u32);
|
|
- memcpy_fromio(p, lif->ionic->idev.dev_cmd_regs->words, size);
|
|
+ memcpy_fromio(p + offset, lif->ionic->idev.dev_cmd_regs->words, size);
|
|
}
|
|
|
|
static int ionic_get_link_ksettings(struct net_device *netdev,
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.c b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
index 7fea60fc3e08..2c3e9ef22129 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.c
|
|
@@ -85,8 +85,7 @@ static void ionic_link_status_check(struct ionic_lif *lif)
|
|
u16 link_status;
|
|
bool link_up;
|
|
|
|
- if (!test_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state) ||
|
|
- test_bit(IONIC_LIF_F_QUEUE_RESET, lif->state))
|
|
+ if (!test_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state))
|
|
return;
|
|
|
|
if (lif->ionic->is_mgmt_nic)
|
|
@@ -106,16 +105,22 @@ static void ionic_link_status_check(struct ionic_lif *lif)
|
|
netif_carrier_on(netdev);
|
|
}
|
|
|
|
- if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev))
|
|
+ if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
|
|
+ mutex_lock(&lif->queue_lock);
|
|
ionic_start_queues(lif);
|
|
+ mutex_unlock(&lif->queue_lock);
|
|
+ }
|
|
} else {
|
|
if (netif_carrier_ok(netdev)) {
|
|
netdev_info(netdev, "Link down\n");
|
|
netif_carrier_off(netdev);
|
|
}
|
|
|
|
- if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev))
|
|
+ if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
|
|
+ mutex_lock(&lif->queue_lock);
|
|
ionic_stop_queues(lif);
|
|
+ mutex_unlock(&lif->queue_lock);
|
|
+ }
|
|
}
|
|
|
|
clear_bit(IONIC_LIF_F_LINK_CHECK_REQUESTED, lif->state);
|
|
@@ -849,8 +854,7 @@ static int ionic_lif_addr_add(struct ionic_lif *lif, const u8 *addr)
|
|
if (f)
|
|
return 0;
|
|
|
|
- netdev_dbg(lif->netdev, "rx_filter add ADDR %pM (id %d)\n", addr,
|
|
- ctx.comp.rx_filter_add.filter_id);
|
|
+ netdev_dbg(lif->netdev, "rx_filter add ADDR %pM\n", addr);
|
|
|
|
memcpy(ctx.cmd.rx_filter_add.mac.addr, addr, ETH_ALEN);
|
|
err = ionic_adminq_post_wait(lif, &ctx);
|
|
@@ -879,6 +883,9 @@ static int ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr)
|
|
return -ENOENT;
|
|
}
|
|
|
|
+ netdev_dbg(lif->netdev, "rx_filter del ADDR %pM (id %d)\n",
|
|
+ addr, f->filter_id);
|
|
+
|
|
ctx.cmd.rx_filter_del.filter_id = cpu_to_le32(f->filter_id);
|
|
ionic_rx_filter_free(lif, f);
|
|
spin_unlock_bh(&lif->rx_filters.lock);
|
|
@@ -887,9 +894,6 @@ static int ionic_lif_addr_del(struct ionic_lif *lif, const u8 *addr)
|
|
if (err && err != -EEXIST)
|
|
return err;
|
|
|
|
- netdev_dbg(lif->netdev, "rx_filter del ADDR %pM (id %d)\n", addr,
|
|
- ctx.cmd.rx_filter_del.filter_id);
|
|
-
|
|
return 0;
|
|
}
|
|
|
|
@@ -1341,13 +1345,11 @@ static int ionic_vlan_rx_add_vid(struct net_device *netdev, __be16 proto,
|
|
};
|
|
int err;
|
|
|
|
+ netdev_dbg(netdev, "rx_filter add VLAN %d\n", vid);
|
|
err = ionic_adminq_post_wait(lif, &ctx);
|
|
if (err)
|
|
return err;
|
|
|
|
- netdev_dbg(netdev, "rx_filter add VLAN %d (id %d)\n", vid,
|
|
- ctx.comp.rx_filter_add.filter_id);
|
|
-
|
|
return ionic_rx_filter_save(lif, 0, IONIC_RXQ_INDEX_ANY, 0, &ctx);
|
|
}
|
|
|
|
@@ -1372,8 +1374,8 @@ static int ionic_vlan_rx_kill_vid(struct net_device *netdev, __be16 proto,
|
|
return -ENOENT;
|
|
}
|
|
|
|
- netdev_dbg(netdev, "rx_filter del VLAN %d (id %d)\n", vid,
|
|
- le32_to_cpu(ctx.cmd.rx_filter_del.filter_id));
|
|
+ netdev_dbg(netdev, "rx_filter del VLAN %d (id %d)\n",
|
|
+ vid, f->filter_id);
|
|
|
|
ctx.cmd.rx_filter_del.filter_id = cpu_to_le32(f->filter_id);
|
|
ionic_rx_filter_free(lif, f);
|
|
@@ -1951,16 +1953,13 @@ int ionic_reset_queues(struct ionic_lif *lif, ionic_reset_cb cb, void *arg)
|
|
bool running;
|
|
int err = 0;
|
|
|
|
- err = ionic_wait_for_bit(lif, IONIC_LIF_F_QUEUE_RESET);
|
|
- if (err)
|
|
- return err;
|
|
-
|
|
+ mutex_lock(&lif->queue_lock);
|
|
running = netif_running(lif->netdev);
|
|
if (running) {
|
|
netif_device_detach(lif->netdev);
|
|
err = ionic_stop(lif->netdev);
|
|
if (err)
|
|
- goto reset_out;
|
|
+ return err;
|
|
}
|
|
|
|
if (cb)
|
|
@@ -1970,9 +1969,7 @@ int ionic_reset_queues(struct ionic_lif *lif, ionic_reset_cb cb, void *arg)
|
|
err = ionic_open(lif->netdev);
|
|
netif_device_attach(lif->netdev);
|
|
}
|
|
-
|
|
-reset_out:
|
|
- clear_bit(IONIC_LIF_F_QUEUE_RESET, lif->state);
|
|
+ mutex_unlock(&lif->queue_lock);
|
|
|
|
return err;
|
|
}
|
|
@@ -2111,7 +2108,9 @@ static void ionic_lif_handle_fw_down(struct ionic_lif *lif)
|
|
|
|
if (test_bit(IONIC_LIF_F_UP, lif->state)) {
|
|
dev_info(ionic->dev, "Surprise FW stop, stopping queues\n");
|
|
+ mutex_lock(&lif->queue_lock);
|
|
ionic_stop_queues(lif);
|
|
+ mutex_unlock(&lif->queue_lock);
|
|
}
|
|
|
|
if (netif_running(lif->netdev)) {
|
|
@@ -2230,15 +2229,15 @@ static void ionic_lif_deinit(struct ionic_lif *lif)
|
|
cancel_work_sync(&lif->deferred.work);
|
|
cancel_work_sync(&lif->tx_timeout_work);
|
|
ionic_rx_filters_deinit(lif);
|
|
+ if (lif->netdev->features & NETIF_F_RXHASH)
|
|
+ ionic_lif_rss_deinit(lif);
|
|
}
|
|
|
|
- if (lif->netdev->features & NETIF_F_RXHASH)
|
|
- ionic_lif_rss_deinit(lif);
|
|
-
|
|
napi_disable(&lif->adminqcq->napi);
|
|
ionic_lif_qcq_deinit(lif, lif->notifyqcq);
|
|
ionic_lif_qcq_deinit(lif, lif->adminqcq);
|
|
|
|
+ mutex_destroy(&lif->queue_lock);
|
|
ionic_lif_reset(lif);
|
|
}
|
|
|
|
@@ -2414,6 +2413,7 @@ static int ionic_lif_init(struct ionic_lif *lif)
|
|
return err;
|
|
|
|
lif->hw_index = le16_to_cpu(comp.hw_index);
|
|
+ mutex_init(&lif->queue_lock);
|
|
|
|
/* now that we have the hw_index we can figure out our doorbell page */
|
|
lif->dbid_count = le32_to_cpu(lif->ionic->ident.dev.ndbpgs_per_lif);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_lif.h b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
|
|
index 2c65cf6300db..90992614f136 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_lif.h
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_lif.h
|
|
@@ -126,7 +126,6 @@ enum ionic_lif_state_flags {
|
|
IONIC_LIF_F_SW_DEBUG_STATS,
|
|
IONIC_LIF_F_UP,
|
|
IONIC_LIF_F_LINK_CHECK_REQUESTED,
|
|
- IONIC_LIF_F_QUEUE_RESET,
|
|
IONIC_LIF_F_FW_RESET,
|
|
|
|
/* leave this as last */
|
|
@@ -145,6 +144,7 @@ struct ionic_lif {
|
|
unsigned int hw_index;
|
|
unsigned int kern_pid;
|
|
u64 __iomem *kern_dbpage;
|
|
+ struct mutex queue_lock; /* lock for queue structures */
|
|
spinlock_t adminq_lock; /* lock for AdminQ operations */
|
|
struct ionic_qcq *adminqcq;
|
|
struct ionic_qcq *notifyqcq;
|
|
@@ -191,12 +191,6 @@ struct ionic_lif {
|
|
#define lif_to_txq(lif, i) (&lif_to_txqcq((lif), i)->q)
|
|
#define lif_to_rxq(lif, i) (&lif_to_txqcq((lif), i)->q)
|
|
|
|
-/* return 0 if successfully set the bit, else non-zero */
|
|
-static inline int ionic_wait_for_bit(struct ionic_lif *lif, int bitname)
|
|
-{
|
|
- return wait_on_bit_lock(lif->state, bitname, TASK_INTERRUPTIBLE);
|
|
-}
|
|
-
|
|
static inline u32 ionic_coal_usec_to_hw(struct ionic *ionic, u32 usecs)
|
|
{
|
|
u32 mult = le32_to_cpu(ionic->ident.dev.intr_coal_mult);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_rx_filter.c b/drivers/net/ethernet/pensando/ionic/ionic_rx_filter.c
|
|
index 80eeb7696e01..cd0076fc3044 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_rx_filter.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_rx_filter.c
|
|
@@ -21,13 +21,16 @@ void ionic_rx_filter_free(struct ionic_lif *lif, struct ionic_rx_filter *f)
|
|
void ionic_rx_filter_replay(struct ionic_lif *lif)
|
|
{
|
|
struct ionic_rx_filter_add_cmd *ac;
|
|
+ struct hlist_head new_id_list;
|
|
struct ionic_admin_ctx ctx;
|
|
struct ionic_rx_filter *f;
|
|
struct hlist_head *head;
|
|
struct hlist_node *tmp;
|
|
+ unsigned int key;
|
|
unsigned int i;
|
|
int err;
|
|
|
|
+ INIT_HLIST_HEAD(&new_id_list);
|
|
ac = &ctx.cmd.rx_filter_add;
|
|
|
|
for (i = 0; i < IONIC_RX_FILTER_HLISTS; i++) {
|
|
@@ -58,9 +61,30 @@ void ionic_rx_filter_replay(struct ionic_lif *lif)
|
|
ac->mac.addr);
|
|
break;
|
|
}
|
|
+ spin_lock_bh(&lif->rx_filters.lock);
|
|
+ ionic_rx_filter_free(lif, f);
|
|
+ spin_unlock_bh(&lif->rx_filters.lock);
|
|
+
|
|
+ continue;
|
|
}
|
|
+
|
|
+ /* remove from old id list, save new id in tmp list */
|
|
+ spin_lock_bh(&lif->rx_filters.lock);
|
|
+ hlist_del(&f->by_id);
|
|
+ spin_unlock_bh(&lif->rx_filters.lock);
|
|
+ f->filter_id = le32_to_cpu(ctx.comp.rx_filter_add.filter_id);
|
|
+ hlist_add_head(&f->by_id, &new_id_list);
|
|
}
|
|
}
|
|
+
|
|
+ /* rebuild the by_id hash lists with the new filter ids */
|
|
+ spin_lock_bh(&lif->rx_filters.lock);
|
|
+ hlist_for_each_entry_safe(f, tmp, &new_id_list, by_id) {
|
|
+ key = f->filter_id & IONIC_RX_FILTER_HLISTS_MASK;
|
|
+ head = &lif->rx_filters.by_id[key];
|
|
+ hlist_add_head(&f->by_id, head);
|
|
+ }
|
|
+ spin_unlock_bh(&lif->rx_filters.lock);
|
|
}
|
|
|
|
int ionic_rx_filters_init(struct ionic_lif *lif)
|
|
@@ -69,10 +93,12 @@ int ionic_rx_filters_init(struct ionic_lif *lif)
|
|
|
|
spin_lock_init(&lif->rx_filters.lock);
|
|
|
|
+ spin_lock_bh(&lif->rx_filters.lock);
|
|
for (i = 0; i < IONIC_RX_FILTER_HLISTS; i++) {
|
|
INIT_HLIST_HEAD(&lif->rx_filters.by_hash[i]);
|
|
INIT_HLIST_HEAD(&lif->rx_filters.by_id[i]);
|
|
}
|
|
+ spin_unlock_bh(&lif->rx_filters.lock);
|
|
|
|
return 0;
|
|
}
|
|
@@ -84,11 +110,13 @@ void ionic_rx_filters_deinit(struct ionic_lif *lif)
|
|
struct hlist_node *tmp;
|
|
unsigned int i;
|
|
|
|
+ spin_lock_bh(&lif->rx_filters.lock);
|
|
for (i = 0; i < IONIC_RX_FILTER_HLISTS; i++) {
|
|
head = &lif->rx_filters.by_id[i];
|
|
hlist_for_each_entry_safe(f, tmp, head, by_id)
|
|
ionic_rx_filter_free(lif, f);
|
|
}
|
|
+ spin_unlock_bh(&lif->rx_filters.lock);
|
|
}
|
|
|
|
int ionic_rx_filter_save(struct ionic_lif *lif, u32 flow_id, u16 rxq_index,
|
|
@@ -124,6 +152,7 @@ int ionic_rx_filter_save(struct ionic_lif *lif, u32 flow_id, u16 rxq_index,
|
|
f->filter_id = le32_to_cpu(ctx->comp.rx_filter_add.filter_id);
|
|
f->rxq_index = rxq_index;
|
|
memcpy(&f->cmd, ac, sizeof(f->cmd));
|
|
+ netdev_dbg(lif->netdev, "rx_filter add filter_id %d\n", f->filter_id);
|
|
|
|
INIT_HLIST_NODE(&f->by_hash);
|
|
INIT_HLIST_NODE(&f->by_id);
|
|
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
|
|
index d233b6e77b1e..ce8e246cda07 100644
|
|
--- a/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
|
|
+++ b/drivers/net/ethernet/pensando/ionic/ionic_txrx.c
|
|
@@ -157,12 +157,6 @@ static void ionic_rx_clean(struct ionic_queue *q, struct ionic_desc_info *desc_i
|
|
return;
|
|
}
|
|
|
|
- /* no packet processing while resetting */
|
|
- if (unlikely(test_bit(IONIC_LIF_F_QUEUE_RESET, q->lif->state))) {
|
|
- stats->dropped++;
|
|
- return;
|
|
- }
|
|
-
|
|
stats->pkts++;
|
|
stats->bytes += le16_to_cpu(comp->len);
|
|
|
|
diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
|
|
index aeed8939f410..3bbcff5f2621 100644
|
|
--- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c
|
|
+++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
|
|
@@ -1987,8 +1987,8 @@ static void qed_rdma_set_pf_params(struct qed_hwfn *p_hwfn,
|
|
num_srqs = min_t(u32, QED_RDMA_MAX_SRQS, p_params->num_srqs);
|
|
|
|
if (p_hwfn->mcp_info->func_info.protocol == QED_PCI_ETH_RDMA) {
|
|
- DP_NOTICE(p_hwfn,
|
|
- "Current day drivers don't support RoCE & iWARP simultaneously on the same PF. Default to RoCE-only\n");
|
|
+ DP_VERBOSE(p_hwfn, QED_MSG_SP,
|
|
+ "Current day drivers don't support RoCE & iWARP simultaneously on the same PF. Default to RoCE-only\n");
|
|
p_hwfn->hw_info.personality = QED_PCI_ETH_ROCE;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
|
|
index 58913fe4f345..0629dd4e18d9 100644
|
|
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
|
|
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
|
|
@@ -3096,7 +3096,7 @@ int qed_hw_init(struct qed_dev *cdev, struct qed_hw_init_params *p_params)
|
|
}
|
|
|
|
/* Log and clear previous pglue_b errors if such exist */
|
|
- qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_main_ptt);
|
|
+ qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_main_ptt, true);
|
|
|
|
/* Enable the PF's internal FID_enable in the PXP */
|
|
rc = qed_pglueb_set_pfid_enable(p_hwfn, p_hwfn->p_main_ptt,
|
|
diff --git a/drivers/net/ethernet/qlogic/qed/qed_int.c b/drivers/net/ethernet/qlogic/qed/qed_int.c
|
|
index 9f5113639eaf..8d106063e927 100644
|
|
--- a/drivers/net/ethernet/qlogic/qed/qed_int.c
|
|
+++ b/drivers/net/ethernet/qlogic/qed/qed_int.c
|
|
@@ -256,9 +256,10 @@ out:
|
|
#define PGLUE_ATTENTION_ZLR_VALID (1 << 25)
|
|
#define PGLUE_ATTENTION_ILT_VALID (1 << 23)
|
|
|
|
-int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn,
|
|
- struct qed_ptt *p_ptt)
|
|
+int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
+ bool hw_init)
|
|
{
|
|
+ char msg[256];
|
|
u32 tmp;
|
|
|
|
tmp = qed_rd(p_hwfn, p_ptt, PGLUE_B_REG_TX_ERR_WR_DETAILS2);
|
|
@@ -272,22 +273,23 @@ int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn,
|
|
details = qed_rd(p_hwfn, p_ptt,
|
|
PGLUE_B_REG_TX_ERR_WR_DETAILS);
|
|
|
|
- DP_NOTICE(p_hwfn,
|
|
- "Illegal write by chip to [%08x:%08x] blocked.\n"
|
|
- "Details: %08x [PFID %02x, VFID %02x, VF_VALID %02x]\n"
|
|
- "Details2 %08x [Was_error %02x BME deassert %02x FID_enable deassert %02x]\n",
|
|
- addr_hi, addr_lo, details,
|
|
- (u8)GET_FIELD(details, PGLUE_ATTENTION_DETAILS_PFID),
|
|
- (u8)GET_FIELD(details, PGLUE_ATTENTION_DETAILS_VFID),
|
|
- GET_FIELD(details,
|
|
- PGLUE_ATTENTION_DETAILS_VF_VALID) ? 1 : 0,
|
|
- tmp,
|
|
- GET_FIELD(tmp,
|
|
- PGLUE_ATTENTION_DETAILS2_WAS_ERR) ? 1 : 0,
|
|
- GET_FIELD(tmp,
|
|
- PGLUE_ATTENTION_DETAILS2_BME) ? 1 : 0,
|
|
- GET_FIELD(tmp,
|
|
- PGLUE_ATTENTION_DETAILS2_FID_EN) ? 1 : 0);
|
|
+ snprintf(msg, sizeof(msg),
|
|
+ "Illegal write by chip to [%08x:%08x] blocked.\n"
|
|
+ "Details: %08x [PFID %02x, VFID %02x, VF_VALID %02x]\n"
|
|
+ "Details2 %08x [Was_error %02x BME deassert %02x FID_enable deassert %02x]",
|
|
+ addr_hi, addr_lo, details,
|
|
+ (u8)GET_FIELD(details, PGLUE_ATTENTION_DETAILS_PFID),
|
|
+ (u8)GET_FIELD(details, PGLUE_ATTENTION_DETAILS_VFID),
|
|
+ !!GET_FIELD(details, PGLUE_ATTENTION_DETAILS_VF_VALID),
|
|
+ tmp,
|
|
+ !!GET_FIELD(tmp, PGLUE_ATTENTION_DETAILS2_WAS_ERR),
|
|
+ !!GET_FIELD(tmp, PGLUE_ATTENTION_DETAILS2_BME),
|
|
+ !!GET_FIELD(tmp, PGLUE_ATTENTION_DETAILS2_FID_EN));
|
|
+
|
|
+ if (hw_init)
|
|
+ DP_VERBOSE(p_hwfn, NETIF_MSG_INTR, "%s\n", msg);
|
|
+ else
|
|
+ DP_NOTICE(p_hwfn, "%s\n", msg);
|
|
}
|
|
|
|
tmp = qed_rd(p_hwfn, p_ptt, PGLUE_B_REG_TX_ERR_RD_DETAILS2);
|
|
@@ -320,8 +322,14 @@ int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn,
|
|
}
|
|
|
|
tmp = qed_rd(p_hwfn, p_ptt, PGLUE_B_REG_TX_ERR_WR_DETAILS_ICPL);
|
|
- if (tmp & PGLUE_ATTENTION_ICPL_VALID)
|
|
- DP_NOTICE(p_hwfn, "ICPL error - %08x\n", tmp);
|
|
+ if (tmp & PGLUE_ATTENTION_ICPL_VALID) {
|
|
+ snprintf(msg, sizeof(msg), "ICPL error - %08x", tmp);
|
|
+
|
|
+ if (hw_init)
|
|
+ DP_VERBOSE(p_hwfn, NETIF_MSG_INTR, "%s\n", msg);
|
|
+ else
|
|
+ DP_NOTICE(p_hwfn, "%s\n", msg);
|
|
+ }
|
|
|
|
tmp = qed_rd(p_hwfn, p_ptt, PGLUE_B_REG_MASTER_ZLR_ERR_DETAILS);
|
|
if (tmp & PGLUE_ATTENTION_ZLR_VALID) {
|
|
@@ -360,7 +368,7 @@ int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn,
|
|
|
|
static int qed_pglueb_rbc_attn_cb(struct qed_hwfn *p_hwfn)
|
|
{
|
|
- return qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_dpc_ptt);
|
|
+ return qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_dpc_ptt, false);
|
|
}
|
|
|
|
#define QED_DORQ_ATTENTION_REASON_MASK (0xfffff)
|
|
diff --git a/drivers/net/ethernet/qlogic/qed/qed_int.h b/drivers/net/ethernet/qlogic/qed/qed_int.h
|
|
index 9ad568d93ae6..defb0d1bc45a 100644
|
|
--- a/drivers/net/ethernet/qlogic/qed/qed_int.h
|
|
+++ b/drivers/net/ethernet/qlogic/qed/qed_int.h
|
|
@@ -431,7 +431,7 @@ int qed_int_set_timer_res(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
|
|
#define QED_MAPPING_MEMORY_SIZE(dev) (NUM_OF_SBS(dev))
|
|
|
|
-int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn,
|
|
- struct qed_ptt *p_ptt);
|
|
+int qed_pglueb_rbc_attn_handler(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt,
|
|
+ bool hw_init);
|
|
|
|
#endif
|
|
diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c
|
|
index 90410f9d3b1a..1c4fea9c3ec4 100644
|
|
--- a/drivers/net/ethernet/smsc/smc91x.c
|
|
+++ b/drivers/net/ethernet/smsc/smc91x.c
|
|
@@ -2274,7 +2274,7 @@ static int smc_drv_probe(struct platform_device *pdev)
|
|
ret = try_toggle_control_gpio(&pdev->dev, &lp->power_gpio,
|
|
"power", 0, 0, 100);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto out_free_netdev;
|
|
|
|
/*
|
|
* Optional reset GPIO configured? Minimum 100 ns reset needed
|
|
@@ -2283,7 +2283,7 @@ static int smc_drv_probe(struct platform_device *pdev)
|
|
ret = try_toggle_control_gpio(&pdev->dev, &lp->reset_gpio,
|
|
"reset", 0, 0, 100);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto out_free_netdev;
|
|
|
|
/*
|
|
* Need to wait for optional EEPROM to load, max 750 us according
|
|
diff --git a/drivers/net/ethernet/socionext/sni_ave.c b/drivers/net/ethernet/socionext/sni_ave.c
|
|
index 67ddf782d98a..897c895629d0 100644
|
|
--- a/drivers/net/ethernet/socionext/sni_ave.c
|
|
+++ b/drivers/net/ethernet/socionext/sni_ave.c
|
|
@@ -1191,7 +1191,7 @@ static int ave_init(struct net_device *ndev)
|
|
ret = regmap_update_bits(priv->regmap, SG_ETPINMODE,
|
|
priv->pinmode_mask, priv->pinmode_val);
|
|
if (ret)
|
|
- return ret;
|
|
+ goto out_reset_assert;
|
|
|
|
ave_global_reset(ndev);
|
|
|
|
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
|
|
index 4661ef865807..dec52b763d50 100644
|
|
--- a/drivers/net/geneve.c
|
|
+++ b/drivers/net/geneve.c
|
|
@@ -1615,11 +1615,11 @@ static int geneve_changelink(struct net_device *dev, struct nlattr *tb[],
|
|
struct netlink_ext_ack *extack)
|
|
{
|
|
struct geneve_dev *geneve = netdev_priv(dev);
|
|
+ enum ifla_geneve_df df = geneve->df;
|
|
struct geneve_sock *gs4, *gs6;
|
|
struct ip_tunnel_info info;
|
|
bool metadata;
|
|
bool use_udp6_rx_checksums;
|
|
- enum ifla_geneve_df df;
|
|
bool ttl_inherit;
|
|
int err;
|
|
|
|
diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c
|
|
index 2a6ec5394966..a4b3fce69ecd 100644
|
|
--- a/drivers/net/hippi/rrunner.c
|
|
+++ b/drivers/net/hippi/rrunner.c
|
|
@@ -1242,7 +1242,7 @@ static int rr_open(struct net_device *dev)
|
|
rrpriv->info = NULL;
|
|
}
|
|
if (rrpriv->rx_ctrl) {
|
|
- pci_free_consistent(pdev, sizeof(struct ring_ctrl),
|
|
+ pci_free_consistent(pdev, 256 * sizeof(struct ring_ctrl),
|
|
rrpriv->rx_ctrl, rrpriv->rx_ctrl_dma);
|
|
rrpriv->rx_ctrl = NULL;
|
|
}
|
|
diff --git a/drivers/net/ieee802154/adf7242.c b/drivers/net/ieee802154/adf7242.c
|
|
index 5a37514e4234..8dbccec6ac86 100644
|
|
--- a/drivers/net/ieee802154/adf7242.c
|
|
+++ b/drivers/net/ieee802154/adf7242.c
|
|
@@ -1262,7 +1262,7 @@ static int adf7242_probe(struct spi_device *spi)
|
|
WQ_MEM_RECLAIM);
|
|
if (unlikely(!lp->wqueue)) {
|
|
ret = -ENOMEM;
|
|
- goto err_hw_init;
|
|
+ goto err_alloc_wq;
|
|
}
|
|
|
|
ret = adf7242_hw_init(lp);
|
|
@@ -1294,6 +1294,8 @@ static int adf7242_probe(struct spi_device *spi)
|
|
return ret;
|
|
|
|
err_hw_init:
|
|
+ destroy_workqueue(lp->wqueue);
|
|
+err_alloc_wq:
|
|
mutex_destroy(&lp->bmux);
|
|
ieee802154_free_hw(lp->hw);
|
|
|
|
diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
|
|
index 2908e0a0d6e1..23950e7a0f81 100644
|
|
--- a/drivers/net/netdevsim/netdev.c
|
|
+++ b/drivers/net/netdevsim/netdev.c
|
|
@@ -302,7 +302,7 @@ nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port)
|
|
rtnl_lock();
|
|
err = nsim_bpf_init(ns);
|
|
if (err)
|
|
- goto err_free_netdev;
|
|
+ goto err_rtnl_unlock;
|
|
|
|
nsim_ipsec_init(ns);
|
|
|
|
@@ -316,8 +316,8 @@ nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port)
|
|
err_ipsec_teardown:
|
|
nsim_ipsec_teardown(ns);
|
|
nsim_bpf_uninit(ns);
|
|
+err_rtnl_unlock:
|
|
rtnl_unlock();
|
|
-err_free_netdev:
|
|
free_netdev(dev);
|
|
return ERR_PTR(err);
|
|
}
|
|
diff --git a/drivers/net/phy/dp83640.c b/drivers/net/phy/dp83640.c
|
|
index ecbd5e0d685c..acb0aae60755 100644
|
|
--- a/drivers/net/phy/dp83640.c
|
|
+++ b/drivers/net/phy/dp83640.c
|
|
@@ -1260,6 +1260,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
|
|
dp83640->hwts_rx_en = 1;
|
|
dp83640->layer = PTP_CLASS_L4;
|
|
dp83640->version = PTP_CLASS_V1;
|
|
+ cfg.rx_filter = HWTSTAMP_FILTER_PTP_V1_L4_EVENT;
|
|
break;
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_L4_SYNC:
|
|
@@ -1267,6 +1268,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
|
|
dp83640->hwts_rx_en = 1;
|
|
dp83640->layer = PTP_CLASS_L4;
|
|
dp83640->version = PTP_CLASS_V2;
|
|
+ cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L4_EVENT;
|
|
break;
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_L2_SYNC:
|
|
@@ -1274,6 +1276,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
|
|
dp83640->hwts_rx_en = 1;
|
|
dp83640->layer = PTP_CLASS_L2;
|
|
dp83640->version = PTP_CLASS_V2;
|
|
+ cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_L2_EVENT;
|
|
break;
|
|
case HWTSTAMP_FILTER_PTP_V2_EVENT:
|
|
case HWTSTAMP_FILTER_PTP_V2_SYNC:
|
|
@@ -1281,6 +1284,7 @@ static int dp83640_hwtstamp(struct mii_timestamper *mii_ts, struct ifreq *ifr)
|
|
dp83640->hwts_rx_en = 1;
|
|
dp83640->layer = PTP_CLASS_L4 | PTP_CLASS_L2;
|
|
dp83640->version = PTP_CLASS_V2;
|
|
+ cfg.rx_filter = HWTSTAMP_FILTER_PTP_V2_EVENT;
|
|
break;
|
|
default:
|
|
return -ERANGE;
|
|
diff --git a/drivers/net/usb/ax88172a.c b/drivers/net/usb/ax88172a.c
|
|
index 4e514f5d7c6c..fd3a04d98dc1 100644
|
|
--- a/drivers/net/usb/ax88172a.c
|
|
+++ b/drivers/net/usb/ax88172a.c
|
|
@@ -187,6 +187,7 @@ static int ax88172a_bind(struct usbnet *dev, struct usb_interface *intf)
|
|
ret = asix_read_cmd(dev, AX_CMD_READ_NODE_ID, 0, 0, ETH_ALEN, buf, 0);
|
|
if (ret < ETH_ALEN) {
|
|
netdev_err(dev->net, "Failed to read MAC address: %d\n", ret);
|
|
+ ret = -EIO;
|
|
goto free;
|
|
}
|
|
memcpy(dev->net->dev_addr, buf, ETH_ALEN);
|
|
diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c
|
|
index e30d91a38cfb..284832314f31 100644
|
|
--- a/drivers/net/wan/lapbether.c
|
|
+++ b/drivers/net/wan/lapbether.c
|
|
@@ -303,7 +303,6 @@ static void lapbeth_setup(struct net_device *dev)
|
|
dev->netdev_ops = &lapbeth_netdev_ops;
|
|
dev->needs_free_netdev = true;
|
|
dev->type = ARPHRD_X25;
|
|
- dev->hard_header_len = 3;
|
|
dev->mtu = 1000;
|
|
dev->addr_len = 0;
|
|
}
|
|
@@ -324,6 +323,14 @@ static int lapbeth_new_device(struct net_device *dev)
|
|
if (!ndev)
|
|
goto out;
|
|
|
|
+ /* When transmitting data:
|
|
+ * first this driver removes a pseudo header of 1 byte,
|
|
+ * then the lapb module prepends an LAPB header of at most 3 bytes,
|
|
+ * then this driver prepends a length field of 2 bytes,
|
|
+ * then the underlying Ethernet device prepends its own header.
|
|
+ */
|
|
+ ndev->hard_header_len = -1 + 3 + 2 + dev->hard_header_len;
|
|
+
|
|
lapbeth = netdev_priv(ndev);
|
|
lapbeth->axdev = ndev;
|
|
|
|
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
|
|
index 6049d3766c64..3f563e02d17d 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
|
|
@@ -643,9 +643,9 @@ err:
|
|
|
|
static void ath9k_hif_usb_rx_cb(struct urb *urb)
|
|
{
|
|
- struct sk_buff *skb = (struct sk_buff *) urb->context;
|
|
- struct hif_device_usb *hif_dev =
|
|
- usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
|
|
+ struct rx_buf *rx_buf = (struct rx_buf *)urb->context;
|
|
+ struct hif_device_usb *hif_dev = rx_buf->hif_dev;
|
|
+ struct sk_buff *skb = rx_buf->skb;
|
|
int ret;
|
|
|
|
if (!skb)
|
|
@@ -685,14 +685,15 @@ resubmit:
|
|
return;
|
|
free:
|
|
kfree_skb(skb);
|
|
+ kfree(rx_buf);
|
|
}
|
|
|
|
static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
|
|
{
|
|
- struct sk_buff *skb = (struct sk_buff *) urb->context;
|
|
+ struct rx_buf *rx_buf = (struct rx_buf *)urb->context;
|
|
+ struct hif_device_usb *hif_dev = rx_buf->hif_dev;
|
|
+ struct sk_buff *skb = rx_buf->skb;
|
|
struct sk_buff *nskb;
|
|
- struct hif_device_usb *hif_dev =
|
|
- usb_get_intfdata(usb_ifnum_to_if(urb->dev, 0));
|
|
int ret;
|
|
|
|
if (!skb)
|
|
@@ -732,11 +733,13 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb)
|
|
return;
|
|
}
|
|
|
|
+ rx_buf->skb = nskb;
|
|
+
|
|
usb_fill_int_urb(urb, hif_dev->udev,
|
|
usb_rcvintpipe(hif_dev->udev,
|
|
USB_REG_IN_PIPE),
|
|
nskb->data, MAX_REG_IN_BUF_SIZE,
|
|
- ath9k_hif_usb_reg_in_cb, nskb, 1);
|
|
+ ath9k_hif_usb_reg_in_cb, rx_buf, 1);
|
|
}
|
|
|
|
resubmit:
|
|
@@ -750,6 +753,7 @@ resubmit:
|
|
return;
|
|
free:
|
|
kfree_skb(skb);
|
|
+ kfree(rx_buf);
|
|
urb->context = NULL;
|
|
}
|
|
|
|
@@ -795,7 +799,7 @@ static int ath9k_hif_usb_alloc_tx_urbs(struct hif_device_usb *hif_dev)
|
|
init_usb_anchor(&hif_dev->mgmt_submitted);
|
|
|
|
for (i = 0; i < MAX_TX_URB_NUM; i++) {
|
|
- tx_buf = kzalloc(sizeof(struct tx_buf), GFP_KERNEL);
|
|
+ tx_buf = kzalloc(sizeof(*tx_buf), GFP_KERNEL);
|
|
if (!tx_buf)
|
|
goto err;
|
|
|
|
@@ -832,8 +836,9 @@ static void ath9k_hif_usb_dealloc_rx_urbs(struct hif_device_usb *hif_dev)
|
|
|
|
static int ath9k_hif_usb_alloc_rx_urbs(struct hif_device_usb *hif_dev)
|
|
{
|
|
- struct urb *urb = NULL;
|
|
+ struct rx_buf *rx_buf = NULL;
|
|
struct sk_buff *skb = NULL;
|
|
+ struct urb *urb = NULL;
|
|
int i, ret;
|
|
|
|
init_usb_anchor(&hif_dev->rx_submitted);
|
|
@@ -841,6 +846,12 @@ static int ath9k_hif_usb_alloc_rx_urbs(struct hif_device_usb *hif_dev)
|
|
|
|
for (i = 0; i < MAX_RX_URB_NUM; i++) {
|
|
|
|
+ rx_buf = kzalloc(sizeof(*rx_buf), GFP_KERNEL);
|
|
+ if (!rx_buf) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_rxb;
|
|
+ }
|
|
+
|
|
/* Allocate URB */
|
|
urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
if (urb == NULL) {
|
|
@@ -855,11 +866,14 @@ static int ath9k_hif_usb_alloc_rx_urbs(struct hif_device_usb *hif_dev)
|
|
goto err_skb;
|
|
}
|
|
|
|
+ rx_buf->hif_dev = hif_dev;
|
|
+ rx_buf->skb = skb;
|
|
+
|
|
usb_fill_bulk_urb(urb, hif_dev->udev,
|
|
usb_rcvbulkpipe(hif_dev->udev,
|
|
USB_WLAN_RX_PIPE),
|
|
skb->data, MAX_RX_BUF_SIZE,
|
|
- ath9k_hif_usb_rx_cb, skb);
|
|
+ ath9k_hif_usb_rx_cb, rx_buf);
|
|
|
|
/* Anchor URB */
|
|
usb_anchor_urb(urb, &hif_dev->rx_submitted);
|
|
@@ -885,6 +899,8 @@ err_submit:
|
|
err_skb:
|
|
usb_free_urb(urb);
|
|
err_urb:
|
|
+ kfree(rx_buf);
|
|
+err_rxb:
|
|
ath9k_hif_usb_dealloc_rx_urbs(hif_dev);
|
|
return ret;
|
|
}
|
|
@@ -896,14 +912,21 @@ static void ath9k_hif_usb_dealloc_reg_in_urbs(struct hif_device_usb *hif_dev)
|
|
|
|
static int ath9k_hif_usb_alloc_reg_in_urbs(struct hif_device_usb *hif_dev)
|
|
{
|
|
- struct urb *urb = NULL;
|
|
+ struct rx_buf *rx_buf = NULL;
|
|
struct sk_buff *skb = NULL;
|
|
+ struct urb *urb = NULL;
|
|
int i, ret;
|
|
|
|
init_usb_anchor(&hif_dev->reg_in_submitted);
|
|
|
|
for (i = 0; i < MAX_REG_IN_URB_NUM; i++) {
|
|
|
|
+ rx_buf = kzalloc(sizeof(*rx_buf), GFP_KERNEL);
|
|
+ if (!rx_buf) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_rxb;
|
|
+ }
|
|
+
|
|
/* Allocate URB */
|
|
urb = usb_alloc_urb(0, GFP_KERNEL);
|
|
if (urb == NULL) {
|
|
@@ -918,11 +941,14 @@ static int ath9k_hif_usb_alloc_reg_in_urbs(struct hif_device_usb *hif_dev)
|
|
goto err_skb;
|
|
}
|
|
|
|
+ rx_buf->hif_dev = hif_dev;
|
|
+ rx_buf->skb = skb;
|
|
+
|
|
usb_fill_int_urb(urb, hif_dev->udev,
|
|
usb_rcvintpipe(hif_dev->udev,
|
|
USB_REG_IN_PIPE),
|
|
skb->data, MAX_REG_IN_BUF_SIZE,
|
|
- ath9k_hif_usb_reg_in_cb, skb, 1);
|
|
+ ath9k_hif_usb_reg_in_cb, rx_buf, 1);
|
|
|
|
/* Anchor URB */
|
|
usb_anchor_urb(urb, &hif_dev->reg_in_submitted);
|
|
@@ -948,6 +974,8 @@ err_submit:
|
|
err_skb:
|
|
usb_free_urb(urb);
|
|
err_urb:
|
|
+ kfree(rx_buf);
|
|
+err_rxb:
|
|
ath9k_hif_usb_dealloc_reg_in_urbs(hif_dev);
|
|
return ret;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.h b/drivers/net/wireless/ath/ath9k/hif_usb.h
|
|
index a94e7e1c86e9..5985aa15ca93 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/hif_usb.h
|
|
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.h
|
|
@@ -86,6 +86,11 @@ struct tx_buf {
|
|
struct list_head list;
|
|
};
|
|
|
|
+struct rx_buf {
|
|
+ struct sk_buff *skb;
|
|
+ struct hif_device_usb *hif_dev;
|
|
+};
|
|
+
|
|
#define HIF_USB_TX_STOP BIT(0)
|
|
#define HIF_USB_TX_FLUSH BIT(1)
|
|
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
|
|
index 07ca8c91499d..ff49750b8ee7 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/sta.c
|
|
@@ -1184,17 +1184,15 @@ static int iwl_mvm_inactivity_check(struct iwl_mvm *mvm, u8 alloc_for_sta)
|
|
for_each_set_bit(i, &changetid_queues, IWL_MAX_HW_QUEUES)
|
|
iwl_mvm_change_queue_tid(mvm, i);
|
|
|
|
+ rcu_read_unlock();
|
|
+
|
|
if (free_queue >= 0 && alloc_for_sta != IWL_MVM_INVALID_STA) {
|
|
ret = iwl_mvm_free_inactive_queue(mvm, free_queue, queue_owner,
|
|
alloc_for_sta);
|
|
- if (ret) {
|
|
- rcu_read_unlock();
|
|
+ if (ret)
|
|
return ret;
|
|
- }
|
|
}
|
|
|
|
- rcu_read_unlock();
|
|
-
|
|
return free_queue;
|
|
}
|
|
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
index 29971c25dba4..9ea3e5634672 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
|
|
@@ -577,6 +577,8 @@ static const struct iwl_dev_info iwl_dev_info_table[] = {
|
|
IWL_DEV_INFO(0x30DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
|
IWL_DEV_INFO(0x31DC, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
|
|
IWL_DEV_INFO(0x31DC, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
|
+ IWL_DEV_INFO(0xA370, 0x1551, iwl9560_2ac_cfg_soc, iwl9560_killer_1550s_name),
|
|
+ IWL_DEV_INFO(0xA370, 0x1552, iwl9560_2ac_cfg_soc, iwl9560_killer_1550i_name),
|
|
|
|
IWL_DEV_INFO(0x271C, 0x0214, iwl9260_2ac_cfg, iwl9260_1_name),
|
|
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h
|
|
index 37641ad14d49..652dd05af16b 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76.h
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76.h
|
|
@@ -275,6 +275,7 @@ enum {
|
|
MT76_STATE_RUNNING,
|
|
MT76_STATE_MCU_RUNNING,
|
|
MT76_SCANNING,
|
|
+ MT76_RESTART,
|
|
MT76_RESET,
|
|
MT76_MCU_RESET,
|
|
MT76_REMOVED,
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
|
|
index 0b520ae08d01..57091d41eb85 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x0/pci.c
|
|
@@ -29,6 +29,7 @@ static void mt76x0e_stop_hw(struct mt76x02_dev *dev)
|
|
{
|
|
cancel_delayed_work_sync(&dev->cal_work);
|
|
cancel_delayed_work_sync(&dev->mt76.mac_work);
|
|
+ clear_bit(MT76_RESTART, &dev->mphy.state);
|
|
|
|
if (!mt76_poll(dev, MT_WPDMA_GLO_CFG, MT_WPDMA_GLO_CFG_TX_DMA_BUSY,
|
|
0, 1000))
|
|
@@ -83,6 +84,7 @@ static const struct ieee80211_ops mt76x0e_ops = {
|
|
.set_coverage_class = mt76x02_set_coverage_class,
|
|
.set_rts_threshold = mt76x02_set_rts_threshold,
|
|
.get_antenna = mt76_get_antenna,
|
|
+ .reconfig_complete = mt76x02_reconfig_complete,
|
|
};
|
|
|
|
static int mt76x0e_register_device(struct mt76x02_dev *dev)
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02.h b/drivers/net/wireless/mediatek/mt76/mt76x02.h
|
|
index 830532b85b58..6ea210bd3f07 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x02.h
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02.h
|
|
@@ -187,6 +187,8 @@ void mt76x02_sta_ps(struct mt76_dev *dev, struct ieee80211_sta *sta, bool ps);
|
|
void mt76x02_bss_info_changed(struct ieee80211_hw *hw,
|
|
struct ieee80211_vif *vif,
|
|
struct ieee80211_bss_conf *info, u32 changed);
|
|
+void mt76x02_reconfig_complete(struct ieee80211_hw *hw,
|
|
+ enum ieee80211_reconfig_type reconfig_type);
|
|
|
|
struct beacon_bc_data {
|
|
struct mt76x02_dev *dev;
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c
|
|
index 5664749ad6c1..8247611d9b18 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mcu.c
|
|
@@ -20,6 +20,9 @@ int mt76x02_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,
|
|
int ret;
|
|
u8 seq;
|
|
|
|
+ if (mt76_is_mmio(&dev->mt76) && dev->mcu_timeout)
|
|
+ return -EIO;
|
|
+
|
|
skb = mt76x02_mcu_msg_alloc(data, len);
|
|
if (!skb)
|
|
return -ENOMEM;
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
|
|
index 7dcc5d342e9f..7e389dbccfeb 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c
|
|
@@ -520,6 +520,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
|
|
}
|
|
|
|
if (restart) {
|
|
+ set_bit(MT76_RESTART, &dev->mphy.state);
|
|
mt76x02_mcu_function_select(dev, Q_SELECT, 1);
|
|
ieee80211_restart_hw(dev->mt76.hw);
|
|
} else {
|
|
@@ -528,8 +529,23 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)
|
|
}
|
|
}
|
|
|
|
+void mt76x02_reconfig_complete(struct ieee80211_hw *hw,
|
|
+ enum ieee80211_reconfig_type reconfig_type)
|
|
+{
|
|
+ struct mt76x02_dev *dev = hw->priv;
|
|
+
|
|
+ if (reconfig_type != IEEE80211_RECONFIG_TYPE_RESTART)
|
|
+ return;
|
|
+
|
|
+ clear_bit(MT76_RESTART, &dev->mphy.state);
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(mt76x02_reconfig_complete);
|
|
+
|
|
static void mt76x02_check_tx_hang(struct mt76x02_dev *dev)
|
|
{
|
|
+ if (test_bit(MT76_RESTART, &dev->mphy.state))
|
|
+ return;
|
|
+
|
|
if (mt76x02_tx_hang(dev)) {
|
|
if (++dev->tx_hang_check >= MT_TX_HANG_TH)
|
|
goto restart;
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c
|
|
index c69579e5f647..f27774f57438 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c
|
|
@@ -256,6 +256,7 @@ void mt76x2_stop_hardware(struct mt76x02_dev *dev)
|
|
cancel_delayed_work_sync(&dev->cal_work);
|
|
cancel_delayed_work_sync(&dev->mt76.mac_work);
|
|
cancel_delayed_work_sync(&dev->wdt_work);
|
|
+ clear_bit(MT76_RESTART, &dev->mphy.state);
|
|
mt76x02_mcu_set_radio_state(dev, false);
|
|
mt76x2_mac_stop(dev, false);
|
|
}
|
|
diff --git a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
|
|
index 105e5b99b3f9..a74599f7f729 100644
|
|
--- a/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
|
|
+++ b/drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c
|
|
@@ -10,12 +10,9 @@ static int
|
|
mt76x2_start(struct ieee80211_hw *hw)
|
|
{
|
|
struct mt76x02_dev *dev = hw->priv;
|
|
- int ret;
|
|
|
|
mt76x02_mac_start(dev);
|
|
- ret = mt76x2_phy_start(dev);
|
|
- if (ret)
|
|
- return ret;
|
|
+ mt76x2_phy_start(dev);
|
|
|
|
ieee80211_queue_delayed_work(mt76_hw(dev), &dev->mt76.mac_work,
|
|
MT_MAC_WORK_INTERVAL);
|
|
@@ -35,11 +32,9 @@ mt76x2_stop(struct ieee80211_hw *hw)
|
|
mt76x2_stop_hardware(dev);
|
|
}
|
|
|
|
-static int
|
|
+static void
|
|
mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
|
|
{
|
|
- int ret;
|
|
-
|
|
cancel_delayed_work_sync(&dev->cal_work);
|
|
tasklet_disable(&dev->mt76.pre_tbtt_tasklet);
|
|
tasklet_disable(&dev->dfs_pd.dfs_tasklet);
|
|
@@ -50,7 +45,7 @@ mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
|
|
mt76_set_channel(&dev->mphy);
|
|
|
|
mt76x2_mac_stop(dev, true);
|
|
- ret = mt76x2_phy_set_channel(dev, chandef);
|
|
+ mt76x2_phy_set_channel(dev, chandef);
|
|
|
|
mt76x02_mac_cc_reset(dev);
|
|
mt76x02_dfs_init_params(dev);
|
|
@@ -64,15 +59,12 @@ mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)
|
|
tasklet_enable(&dev->mt76.pre_tbtt_tasklet);
|
|
|
|
mt76_txq_schedule_all(&dev->mphy);
|
|
-
|
|
- return ret;
|
|
}
|
|
|
|
static int
|
|
mt76x2_config(struct ieee80211_hw *hw, u32 changed)
|
|
{
|
|
struct mt76x02_dev *dev = hw->priv;
|
|
- int ret = 0;
|
|
|
|
mutex_lock(&dev->mt76.mutex);
|
|
|
|
@@ -101,11 +93,11 @@ mt76x2_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
|
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
|
ieee80211_stop_queues(hw);
|
|
- ret = mt76x2_set_channel(dev, &hw->conf.chandef);
|
|
+ mt76x2_set_channel(dev, &hw->conf.chandef);
|
|
ieee80211_wake_queues(hw);
|
|
}
|
|
|
|
- return ret;
|
|
+ return 0;
|
|
}
|
|
|
|
static void
|
|
@@ -162,5 +154,6 @@ const struct ieee80211_ops mt76x2_ops = {
|
|
.set_antenna = mt76x2_set_antenna,
|
|
.get_antenna = mt76_get_antenna,
|
|
.set_rts_threshold = mt76x02_set_rts_threshold,
|
|
+ .reconfig_complete = mt76x02_reconfig_complete,
|
|
};
|
|
|
|
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
|
|
index e386d4eac407..9a64cf90c291 100644
|
|
--- a/drivers/pci/controller/vmd.c
|
|
+++ b/drivers/pci/controller/vmd.c
|
|
@@ -546,9 +546,10 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
|
|
|
|
vmd->irq_domain = pci_msi_create_irq_domain(fn, &vmd_msi_domain_info,
|
|
x86_vector_domain);
|
|
- irq_domain_free_fwnode(fn);
|
|
- if (!vmd->irq_domain)
|
|
+ if (!vmd->irq_domain) {
|
|
+ irq_domain_free_fwnode(fn);
|
|
return -ENODEV;
|
|
+ }
|
|
|
|
pci_add_resource(&resources, &vmd->resources[0]);
|
|
pci_add_resource_offset(&resources, &vmd->resources[1], offset[0]);
|
|
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
|
|
index d4758518a97b..a4efc7e0061f 100644
|
|
--- a/drivers/pci/pci.c
|
|
+++ b/drivers/pci/pci.c
|
|
@@ -4662,8 +4662,7 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)
|
|
* pcie_wait_for_link_delay - Wait until link is active or inactive
|
|
* @pdev: Bridge device
|
|
* @active: waiting for active or inactive?
|
|
- * @delay: Delay to wait after link has become active (in ms). Specify %0
|
|
- * for no delay.
|
|
+ * @delay: Delay to wait after link has become active (in ms)
|
|
*
|
|
* Use this to wait till link becomes active or inactive.
|
|
*/
|
|
@@ -4704,7 +4703,7 @@ static bool pcie_wait_for_link_delay(struct pci_dev *pdev, bool active,
|
|
msleep(10);
|
|
timeout -= 10;
|
|
}
|
|
- if (active && ret && delay)
|
|
+ if (active && ret)
|
|
msleep(delay);
|
|
else if (ret != active)
|
|
pci_info(pdev, "Data Link Layer Link Active not %s in 1000 msec\n",
|
|
@@ -4825,28 +4824,17 @@ void pci_bridge_wait_for_secondary_bus(struct pci_dev *dev)
|
|
if (!pcie_downstream_port(dev))
|
|
return;
|
|
|
|
- /*
|
|
- * Per PCIe r5.0, sec 6.6.1, for downstream ports that support
|
|
- * speeds > 5 GT/s, we must wait for link training to complete
|
|
- * before the mandatory delay.
|
|
- *
|
|
- * We can only tell when link training completes via DLL Link
|
|
- * Active, which is required for downstream ports that support
|
|
- * speeds > 5 GT/s (sec 7.5.3.6). Unfortunately some common
|
|
- * devices do not implement Link Active reporting even when it's
|
|
- * required, so we'll check for that directly instead of checking
|
|
- * the supported link speed. We assume devices without Link Active
|
|
- * reporting can train in 100 ms regardless of speed.
|
|
- */
|
|
- if (dev->link_active_reporting) {
|
|
- pci_dbg(dev, "waiting for link to train\n");
|
|
- if (!pcie_wait_for_link_delay(dev, true, 0)) {
|
|
+ if (pcie_get_speed_cap(dev) <= PCIE_SPEED_5_0GT) {
|
|
+ pci_dbg(dev, "waiting %d ms for downstream link\n", delay);
|
|
+ msleep(delay);
|
|
+ } else {
|
|
+ pci_dbg(dev, "waiting %d ms for downstream link, after activation\n",
|
|
+ delay);
|
|
+ if (!pcie_wait_for_link_delay(dev, true, delay)) {
|
|
/* Did not train, no need to wait any further */
|
|
return;
|
|
}
|
|
}
|
|
- pci_dbg(child, "waiting %d ms to become accessible\n", delay);
|
|
- msleep(delay);
|
|
|
|
if (!pci_device_is_present(child)) {
|
|
pci_dbg(child, "waiting additional %d ms to become accessible\n", delay);
|
|
diff --git a/drivers/perf/arm-cci.c b/drivers/perf/arm-cci.c
|
|
index 1b8e337a29ca..87c4be9dd412 100644
|
|
--- a/drivers/perf/arm-cci.c
|
|
+++ b/drivers/perf/arm-cci.c
|
|
@@ -1718,6 +1718,7 @@ static struct platform_driver cci_pmu_driver = {
|
|
.driver = {
|
|
.name = DRIVER_NAME,
|
|
.of_match_table = arm_cci_pmu_matches,
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = cci_pmu_probe,
|
|
.remove = cci_pmu_remove,
|
|
diff --git a/drivers/perf/arm-ccn.c b/drivers/perf/arm-ccn.c
|
|
index d50edef91f59..7b7d23f25713 100644
|
|
--- a/drivers/perf/arm-ccn.c
|
|
+++ b/drivers/perf/arm-ccn.c
|
|
@@ -1545,6 +1545,7 @@ static struct platform_driver arm_ccn_driver = {
|
|
.driver = {
|
|
.name = "arm-ccn",
|
|
.of_match_table = arm_ccn_match,
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = arm_ccn_probe,
|
|
.remove = arm_ccn_remove,
|
|
diff --git a/drivers/perf/arm_dsu_pmu.c b/drivers/perf/arm_dsu_pmu.c
|
|
index 70968c8c09d7..4594e2ed13d5 100644
|
|
--- a/drivers/perf/arm_dsu_pmu.c
|
|
+++ b/drivers/perf/arm_dsu_pmu.c
|
|
@@ -759,6 +759,7 @@ static struct platform_driver dsu_pmu_driver = {
|
|
.driver = {
|
|
.name = DRVNAME,
|
|
.of_match_table = of_match_ptr(dsu_pmu_of_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = dsu_pmu_device_probe,
|
|
.remove = dsu_pmu_device_remove,
|
|
diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c
|
|
index 48e28ef93a70..4cdb35d166ac 100644
|
|
--- a/drivers/perf/arm_smmuv3_pmu.c
|
|
+++ b/drivers/perf/arm_smmuv3_pmu.c
|
|
@@ -742,6 +742,7 @@ static int smmu_pmu_probe(struct platform_device *pdev)
|
|
platform_set_drvdata(pdev, smmu_pmu);
|
|
|
|
smmu_pmu->pmu = (struct pmu) {
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.pmu_enable = smmu_pmu_enable,
|
|
.pmu_disable = smmu_pmu_disable,
|
|
@@ -859,6 +860,7 @@ static void smmu_pmu_shutdown(struct platform_device *pdev)
|
|
static struct platform_driver smmu_pmu_driver = {
|
|
.driver = {
|
|
.name = "arm-smmu-v3-pmcg",
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = smmu_pmu_probe,
|
|
.remove = smmu_pmu_remove,
|
|
diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c
|
|
index b72c04852599..c5418fd3122c 100644
|
|
--- a/drivers/perf/arm_spe_pmu.c
|
|
+++ b/drivers/perf/arm_spe_pmu.c
|
|
@@ -1228,6 +1228,7 @@ static struct platform_driver arm_spe_pmu_driver = {
|
|
.driver = {
|
|
.name = DRVNAME,
|
|
.of_match_table = of_match_ptr(arm_spe_pmu_of_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = arm_spe_pmu_device_probe,
|
|
.remove = arm_spe_pmu_device_remove,
|
|
diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c
|
|
index 90884d14f95f..397540a4b799 100644
|
|
--- a/drivers/perf/fsl_imx8_ddr_perf.c
|
|
+++ b/drivers/perf/fsl_imx8_ddr_perf.c
|
|
@@ -512,6 +512,7 @@ static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base,
|
|
{
|
|
*pmu = (struct ddr_pmu) {
|
|
.pmu = (struct pmu) {
|
|
+ .module = THIS_MODULE,
|
|
.capabilities = PERF_PMU_CAP_NO_EXCLUDE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.attr_groups = attr_groups,
|
|
@@ -706,6 +707,7 @@ static struct platform_driver imx_ddr_pmu_driver = {
|
|
.driver = {
|
|
.name = "imx-ddr-pmu",
|
|
.of_match_table = imx_ddr_pmu_dt_ids,
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = ddr_perf_probe,
|
|
.remove = ddr_perf_remove,
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
index 453f1c6a16ca..341852736640 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_ddrc_pmu.c
|
|
@@ -378,6 +378,7 @@ static int hisi_ddrc_pmu_probe(struct platform_device *pdev)
|
|
ddrc_pmu->sccl_id, ddrc_pmu->index_id);
|
|
ddrc_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
@@ -416,6 +417,7 @@ static struct platform_driver hisi_ddrc_pmu_driver = {
|
|
.driver = {
|
|
.name = "hisi_ddrc_pmu",
|
|
.acpi_match_table = ACPI_PTR(hisi_ddrc_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = hisi_ddrc_pmu_probe,
|
|
.remove = hisi_ddrc_pmu_remove,
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
index e5af9d7e6e14..375c4737a088 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_hha_pmu.c
|
|
@@ -390,6 +390,7 @@ static int hisi_hha_pmu_probe(struct platform_device *pdev)
|
|
hha_pmu->sccl_id, hha_pmu->index_id);
|
|
hha_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
@@ -428,6 +429,7 @@ static struct platform_driver hisi_hha_pmu_driver = {
|
|
.driver = {
|
|
.name = "hisi_hha_pmu",
|
|
.acpi_match_table = ACPI_PTR(hisi_hha_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = hisi_hha_pmu_probe,
|
|
.remove = hisi_hha_pmu_remove,
|
|
diff --git a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
index 479de4be99eb..44e8a660c5f5 100644
|
|
--- a/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
+++ b/drivers/perf/hisilicon/hisi_uncore_l3c_pmu.c
|
|
@@ -380,6 +380,7 @@ static int hisi_l3c_pmu_probe(struct platform_device *pdev)
|
|
l3c_pmu->sccl_id, l3c_pmu->index_id);
|
|
l3c_pmu->pmu = (struct pmu) {
|
|
.name = name,
|
|
+ .module = THIS_MODULE,
|
|
.task_ctx_nr = perf_invalid_context,
|
|
.event_init = hisi_uncore_pmu_event_init,
|
|
.pmu_enable = hisi_uncore_pmu_enable,
|
|
@@ -418,6 +419,7 @@ static struct platform_driver hisi_l3c_pmu_driver = {
|
|
.driver = {
|
|
.name = "hisi_l3c_pmu",
|
|
.acpi_match_table = ACPI_PTR(hisi_l3c_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = hisi_l3c_pmu_probe,
|
|
.remove = hisi_l3c_pmu_remove,
|
|
diff --git a/drivers/perf/qcom_l2_pmu.c b/drivers/perf/qcom_l2_pmu.c
|
|
index 21d6991dbe0b..4da37f650f98 100644
|
|
--- a/drivers/perf/qcom_l2_pmu.c
|
|
+++ b/drivers/perf/qcom_l2_pmu.c
|
|
@@ -1028,6 +1028,7 @@ static struct platform_driver l2_cache_pmu_driver = {
|
|
.driver = {
|
|
.name = "qcom-l2cache-pmu",
|
|
.acpi_match_table = ACPI_PTR(l2_cache_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = l2_cache_pmu_probe,
|
|
.remove = l2_cache_pmu_remove,
|
|
diff --git a/drivers/perf/qcom_l3_pmu.c b/drivers/perf/qcom_l3_pmu.c
|
|
index 656e830798d9..9ddb577c542b 100644
|
|
--- a/drivers/perf/qcom_l3_pmu.c
|
|
+++ b/drivers/perf/qcom_l3_pmu.c
|
|
@@ -814,6 +814,7 @@ static struct platform_driver qcom_l3_cache_pmu_driver = {
|
|
.driver = {
|
|
.name = "qcom-l3cache-pmu",
|
|
.acpi_match_table = ACPI_PTR(qcom_l3_cache_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = qcom_l3_cache_pmu_probe,
|
|
};
|
|
diff --git a/drivers/perf/thunderx2_pmu.c b/drivers/perf/thunderx2_pmu.c
|
|
index 51b31d6ff2c4..aac9823b0c6b 100644
|
|
--- a/drivers/perf/thunderx2_pmu.c
|
|
+++ b/drivers/perf/thunderx2_pmu.c
|
|
@@ -1017,6 +1017,7 @@ static struct platform_driver tx2_uncore_driver = {
|
|
.driver = {
|
|
.name = "tx2-uncore-pmu",
|
|
.acpi_match_table = ACPI_PTR(tx2_uncore_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
.probe = tx2_uncore_probe,
|
|
.remove = tx2_uncore_remove,
|
|
diff --git a/drivers/perf/xgene_pmu.c b/drivers/perf/xgene_pmu.c
|
|
index 46ee6807d533..edac28cd25dd 100644
|
|
--- a/drivers/perf/xgene_pmu.c
|
|
+++ b/drivers/perf/xgene_pmu.c
|
|
@@ -1975,6 +1975,7 @@ static struct platform_driver xgene_pmu_driver = {
|
|
.name = "xgene-pmu",
|
|
.of_match_table = xgene_pmu_of_match,
|
|
.acpi_match_table = ACPI_PTR(xgene_pmu_acpi_match),
|
|
+ .suppress_bind_attrs = true,
|
|
},
|
|
};
|
|
|
|
diff --git a/drivers/pinctrl/pinctrl-amd.h b/drivers/pinctrl/pinctrl-amd.h
|
|
index 3e5760f1a715..d4a192df5fab 100644
|
|
--- a/drivers/pinctrl/pinctrl-amd.h
|
|
+++ b/drivers/pinctrl/pinctrl-amd.h
|
|
@@ -252,7 +252,7 @@ static const struct amd_pingroup kerncz_groups[] = {
|
|
{
|
|
.name = "uart0",
|
|
.pins = uart0_pins,
|
|
- .npins = 9,
|
|
+ .npins = 5,
|
|
},
|
|
{
|
|
.name = "uart1",
|
|
diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c
|
|
index cd212ee210e2..537b824a1ae2 100644
|
|
--- a/drivers/platform/x86/asus-wmi.c
|
|
+++ b/drivers/platform/x86/asus-wmi.c
|
|
@@ -432,6 +432,7 @@ static int asus_wmi_battery_add(struct power_supply *battery)
|
|
* battery is named BATT.
|
|
*/
|
|
if (strcmp(battery->desc->name, "BAT0") != 0 &&
|
|
+ strcmp(battery->desc->name, "BAT1") != 0 &&
|
|
strcmp(battery->desc->name, "BATT") != 0)
|
|
return -ENODEV;
|
|
|
|
diff --git a/drivers/platform/x86/intel_speed_select_if/isst_if_common.h b/drivers/platform/x86/intel_speed_select_if/isst_if_common.h
|
|
index 1409a5bb5582..4f6f7f0761fc 100644
|
|
--- a/drivers/platform/x86/intel_speed_select_if/isst_if_common.h
|
|
+++ b/drivers/platform/x86/intel_speed_select_if/isst_if_common.h
|
|
@@ -13,6 +13,9 @@
|
|
#define INTEL_RAPL_PRIO_DEVID_0 0x3451
|
|
#define INTEL_CFG_MBOX_DEVID_0 0x3459
|
|
|
|
+#define INTEL_RAPL_PRIO_DEVID_1 0x3251
|
|
+#define INTEL_CFG_MBOX_DEVID_1 0x3259
|
|
+
|
|
/*
|
|
* Validate maximum commands in a single request.
|
|
* This is enough to handle command to every core in one ioctl, or all
|
|
diff --git a/drivers/platform/x86/intel_speed_select_if/isst_if_mbox_pci.c b/drivers/platform/x86/intel_speed_select_if/isst_if_mbox_pci.c
|
|
index de4169d0796b..9a055fd54053 100644
|
|
--- a/drivers/platform/x86/intel_speed_select_if/isst_if_mbox_pci.c
|
|
+++ b/drivers/platform/x86/intel_speed_select_if/isst_if_mbox_pci.c
|
|
@@ -148,6 +148,7 @@ static long isst_if_mbox_proc_cmd(u8 *cmd_ptr, int *write_only, int resume)
|
|
|
|
static const struct pci_device_id isst_if_mbox_ids[] = {
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_CFG_MBOX_DEVID_0)},
|
|
+ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_CFG_MBOX_DEVID_1)},
|
|
{ 0 },
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, isst_if_mbox_ids);
|
|
diff --git a/drivers/platform/x86/intel_speed_select_if/isst_if_mmio.c b/drivers/platform/x86/intel_speed_select_if/isst_if_mmio.c
|
|
index 3584859fcc42..aa17fd7817f8 100644
|
|
--- a/drivers/platform/x86/intel_speed_select_if/isst_if_mmio.c
|
|
+++ b/drivers/platform/x86/intel_speed_select_if/isst_if_mmio.c
|
|
@@ -72,6 +72,7 @@ static long isst_if_mmio_rd_wr(u8 *cmd_ptr, int *write_only, int resume)
|
|
|
|
static const struct pci_device_id isst_if_ids[] = {
|
|
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_RAPL_PRIO_DEVID_0)},
|
|
+ { PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_RAPL_PRIO_DEVID_1)},
|
|
{ 0 },
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, isst_if_ids);
|
|
diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
index 62e552838565..983e568ff231 100644
|
|
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
|
|
@@ -3145,19 +3145,18 @@ BRM_status_show(struct device *cdev, struct device_attribute *attr,
|
|
if (!ioc->is_warpdrive) {
|
|
ioc_err(ioc, "%s: BRM attribute is only for warpdrive\n",
|
|
__func__);
|
|
- goto out;
|
|
+ return 0;
|
|
}
|
|
/* pci_access_mutex lock acquired by sysfs show path */
|
|
mutex_lock(&ioc->pci_access_mutex);
|
|
- if (ioc->pci_error_recovery || ioc->remove_host) {
|
|
- mutex_unlock(&ioc->pci_access_mutex);
|
|
- return 0;
|
|
- }
|
|
+ if (ioc->pci_error_recovery || ioc->remove_host)
|
|
+ goto out;
|
|
|
|
/* allocate upto GPIOVal 36 entries */
|
|
sz = offsetof(Mpi2IOUnitPage3_t, GPIOVal) + (sizeof(u16) * 36);
|
|
io_unit_pg3 = kzalloc(sz, GFP_KERNEL);
|
|
if (!io_unit_pg3) {
|
|
+ rc = -ENOMEM;
|
|
ioc_err(ioc, "%s: failed allocating memory for iounit_pg3: (%d) bytes\n",
|
|
__func__, sz);
|
|
goto out;
|
|
@@ -3167,6 +3166,7 @@ BRM_status_show(struct device *cdev, struct device_attribute *attr,
|
|
0) {
|
|
ioc_err(ioc, "%s: failed reading iounit_pg3\n",
|
|
__func__);
|
|
+ rc = -EINVAL;
|
|
goto out;
|
|
}
|
|
|
|
@@ -3174,12 +3174,14 @@ BRM_status_show(struct device *cdev, struct device_attribute *attr,
|
|
if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
|
|
ioc_err(ioc, "%s: iounit_pg3 failed with ioc_status(0x%04x)\n",
|
|
__func__, ioc_status);
|
|
+ rc = -EINVAL;
|
|
goto out;
|
|
}
|
|
|
|
if (io_unit_pg3->GPIOCount < 25) {
|
|
ioc_err(ioc, "%s: iounit_pg3->GPIOCount less than 25 entries, detected (%d) entries\n",
|
|
__func__, io_unit_pg3->GPIOCount);
|
|
+ rc = -EINVAL;
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/scsi/scsi_devinfo.c b/drivers/scsi/scsi_devinfo.c
|
|
index eed31021e788..ba84244c1b4f 100644
|
|
--- a/drivers/scsi/scsi_devinfo.c
|
|
+++ b/drivers/scsi/scsi_devinfo.c
|
|
@@ -239,6 +239,7 @@ static struct {
|
|
{"LSI", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
|
|
{"ENGENIO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
|
|
{"LENOVO", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
|
|
+ {"FUJITSU", "Universal Xport", "*", BLIST_NO_ULD_ATTACH},
|
|
{"SanDisk", "Cruzer Blade", NULL, BLIST_TRY_VPD_PAGES |
|
|
BLIST_INQUIRY_36},
|
|
{"SMSC", "USB 2 HS-CF", NULL, BLIST_SPARSELUN | BLIST_INQUIRY_36},
|
|
diff --git a/drivers/scsi/scsi_dh.c b/drivers/scsi/scsi_dh.c
|
|
index 42f0550d6b11..6f41e4b5a2b8 100644
|
|
--- a/drivers/scsi/scsi_dh.c
|
|
+++ b/drivers/scsi/scsi_dh.c
|
|
@@ -63,6 +63,7 @@ static const struct scsi_dh_blist scsi_dh_blist[] = {
|
|
{"LSI", "INF-01-00", "rdac", },
|
|
{"ENGENIO", "INF-01-00", "rdac", },
|
|
{"LENOVO", "DE_Series", "rdac", },
|
|
+ {"FUJITSU", "ETERNUS_AHB", "rdac", },
|
|
{NULL, NULL, NULL },
|
|
};
|
|
|
|
diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c
|
|
index f8661062ef95..f3d5b1bbd5aa 100644
|
|
--- a/drivers/scsi/scsi_transport_spi.c
|
|
+++ b/drivers/scsi/scsi_transport_spi.c
|
|
@@ -339,7 +339,7 @@ store_spi_transport_##field(struct device *dev, \
|
|
struct spi_transport_attrs *tp \
|
|
= (struct spi_transport_attrs *)&starget->starget_data; \
|
|
\
|
|
- if (i->f->set_##field) \
|
|
+ if (!i->f->set_##field) \
|
|
return -EINVAL; \
|
|
val = simple_strtoul(buf, NULL, 0); \
|
|
if (val > tp->max_##field) \
|
|
diff --git a/drivers/soc/amlogic/meson-gx-socinfo.c b/drivers/soc/amlogic/meson-gx-socinfo.c
|
|
index 01fc0d20a70d..6f54bd832c8b 100644
|
|
--- a/drivers/soc/amlogic/meson-gx-socinfo.c
|
|
+++ b/drivers/soc/amlogic/meson-gx-socinfo.c
|
|
@@ -66,10 +66,12 @@ static const struct meson_gx_package_id {
|
|
{ "A113D", 0x25, 0x22, 0xff },
|
|
{ "S905D2", 0x28, 0x10, 0xf0 },
|
|
{ "S905X2", 0x28, 0x40, 0xf0 },
|
|
- { "S922X", 0x29, 0x40, 0xf0 },
|
|
{ "A311D", 0x29, 0x10, 0xf0 },
|
|
- { "S905X3", 0x2b, 0x5, 0xf },
|
|
- { "S905D3", 0x2b, 0xb0, 0xf0 },
|
|
+ { "S922X", 0x29, 0x40, 0xf0 },
|
|
+ { "S905D3", 0x2b, 0x4, 0xf5 },
|
|
+ { "S905X3", 0x2b, 0x5, 0xf5 },
|
|
+ { "S905X3", 0x2b, 0x10, 0x3f },
|
|
+ { "S905D3", 0x2b, 0x30, 0x3f },
|
|
{ "A113L", 0x2c, 0x0, 0xf8 },
|
|
};
|
|
|
|
diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c
|
|
index a75f3df97742..908b74352c1b 100644
|
|
--- a/drivers/soc/qcom/rpmh.c
|
|
+++ b/drivers/soc/qcom/rpmh.c
|
|
@@ -150,10 +150,10 @@ existing:
|
|
break;
|
|
}
|
|
|
|
- ctrlr->dirty = (req->sleep_val != old_sleep_val ||
|
|
- req->wake_val != old_wake_val) &&
|
|
- req->sleep_val != UINT_MAX &&
|
|
- req->wake_val != UINT_MAX;
|
|
+ ctrlr->dirty |= (req->sleep_val != old_sleep_val ||
|
|
+ req->wake_val != old_wake_val) &&
|
|
+ req->sleep_val != UINT_MAX &&
|
|
+ req->wake_val != UINT_MAX;
|
|
|
|
unlock:
|
|
spin_unlock_irqrestore(&ctrlr->cache_lock, flags);
|
|
diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
|
|
index 6783e12c40c2..a556795caeef 100644
|
|
--- a/drivers/spi/spi-mt65xx.c
|
|
+++ b/drivers/spi/spi-mt65xx.c
|
|
@@ -36,7 +36,6 @@
|
|
#define SPI_CFG0_SCK_LOW_OFFSET 8
|
|
#define SPI_CFG0_CS_HOLD_OFFSET 16
|
|
#define SPI_CFG0_CS_SETUP_OFFSET 24
|
|
-#define SPI_ADJUST_CFG0_SCK_LOW_OFFSET 16
|
|
#define SPI_ADJUST_CFG0_CS_HOLD_OFFSET 0
|
|
#define SPI_ADJUST_CFG0_CS_SETUP_OFFSET 16
|
|
|
|
@@ -48,6 +47,8 @@
|
|
#define SPI_CFG1_CS_IDLE_MASK 0xff
|
|
#define SPI_CFG1_PACKET_LOOP_MASK 0xff00
|
|
#define SPI_CFG1_PACKET_LENGTH_MASK 0x3ff0000
|
|
+#define SPI_CFG2_SCK_HIGH_OFFSET 0
|
|
+#define SPI_CFG2_SCK_LOW_OFFSET 16
|
|
|
|
#define SPI_CMD_ACT BIT(0)
|
|
#define SPI_CMD_RESUME BIT(1)
|
|
@@ -283,7 +284,7 @@ static void mtk_spi_set_cs(struct spi_device *spi, bool enable)
|
|
static void mtk_spi_prepare_transfer(struct spi_master *master,
|
|
struct spi_transfer *xfer)
|
|
{
|
|
- u32 spi_clk_hz, div, sck_time, cs_time, reg_val = 0;
|
|
+ u32 spi_clk_hz, div, sck_time, cs_time, reg_val;
|
|
struct mtk_spi *mdata = spi_master_get_devdata(master);
|
|
|
|
spi_clk_hz = clk_get_rate(mdata->spi_clk);
|
|
@@ -296,18 +297,18 @@ static void mtk_spi_prepare_transfer(struct spi_master *master,
|
|
cs_time = sck_time * 2;
|
|
|
|
if (mdata->dev_comp->enhance_timing) {
|
|
+ reg_val = (((sck_time - 1) & 0xffff)
|
|
+ << SPI_CFG2_SCK_HIGH_OFFSET);
|
|
reg_val |= (((sck_time - 1) & 0xffff)
|
|
- << SPI_CFG0_SCK_HIGH_OFFSET);
|
|
- reg_val |= (((sck_time - 1) & 0xffff)
|
|
- << SPI_ADJUST_CFG0_SCK_LOW_OFFSET);
|
|
+ << SPI_CFG2_SCK_LOW_OFFSET);
|
|
writel(reg_val, mdata->base + SPI_CFG2_REG);
|
|
- reg_val |= (((cs_time - 1) & 0xffff)
|
|
+ reg_val = (((cs_time - 1) & 0xffff)
|
|
<< SPI_ADJUST_CFG0_CS_HOLD_OFFSET);
|
|
reg_val |= (((cs_time - 1) & 0xffff)
|
|
<< SPI_ADJUST_CFG0_CS_SETUP_OFFSET);
|
|
writel(reg_val, mdata->base + SPI_CFG0_REG);
|
|
} else {
|
|
- reg_val |= (((sck_time - 1) & 0xff)
|
|
+ reg_val = (((sck_time - 1) & 0xff)
|
|
<< SPI_CFG0_SCK_HIGH_OFFSET);
|
|
reg_val |= (((sck_time - 1) & 0xff) << SPI_CFG0_SCK_LOW_OFFSET);
|
|
reg_val |= (((cs_time - 1) & 0xff) << SPI_CFG0_CS_HOLD_OFFSET);
|
|
diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c
|
|
index 560649be9d13..e035c9f757a1 100644
|
|
--- a/drivers/staging/comedi/drivers/addi_apci_1032.c
|
|
+++ b/drivers/staging/comedi/drivers/addi_apci_1032.c
|
|
@@ -106,14 +106,22 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
|
|
unsigned int *data)
|
|
{
|
|
struct apci1032_private *devpriv = dev->private;
|
|
- unsigned int shift, oldmask;
|
|
+ unsigned int shift, oldmask, himask, lomask;
|
|
|
|
switch (data[0]) {
|
|
case INSN_CONFIG_DIGITAL_TRIG:
|
|
if (data[1] != 0)
|
|
return -EINVAL;
|
|
shift = data[3];
|
|
- oldmask = (1U << shift) - 1;
|
|
+ if (shift < 32) {
|
|
+ oldmask = (1U << shift) - 1;
|
|
+ himask = data[4] << shift;
|
|
+ lomask = data[5] << shift;
|
|
+ } else {
|
|
+ oldmask = 0xffffffffu;
|
|
+ himask = 0;
|
|
+ lomask = 0;
|
|
+ }
|
|
switch (data[2]) {
|
|
case COMEDI_DIGITAL_TRIG_DISABLE:
|
|
devpriv->ctrl = 0;
|
|
@@ -136,8 +144,8 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
|
|
devpriv->mode2 &= oldmask;
|
|
}
|
|
/* configure specified channels */
|
|
- devpriv->mode1 |= data[4] << shift;
|
|
- devpriv->mode2 |= data[5] << shift;
|
|
+ devpriv->mode1 |= himask;
|
|
+ devpriv->mode2 |= lomask;
|
|
break;
|
|
case COMEDI_DIGITAL_TRIG_ENABLE_LEVELS:
|
|
if (devpriv->ctrl != (APCI1032_CTRL_INT_ENA |
|
|
@@ -154,8 +162,8 @@ static int apci1032_cos_insn_config(struct comedi_device *dev,
|
|
devpriv->mode2 &= oldmask;
|
|
}
|
|
/* configure specified channels */
|
|
- devpriv->mode1 |= data[4] << shift;
|
|
- devpriv->mode2 |= data[5] << shift;
|
|
+ devpriv->mode1 |= himask;
|
|
+ devpriv->mode2 |= lomask;
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
diff --git a/drivers/staging/comedi/drivers/addi_apci_1500.c b/drivers/staging/comedi/drivers/addi_apci_1500.c
|
|
index 689acd69a1b9..816dd25b9d0e 100644
|
|
--- a/drivers/staging/comedi/drivers/addi_apci_1500.c
|
|
+++ b/drivers/staging/comedi/drivers/addi_apci_1500.c
|
|
@@ -452,13 +452,14 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,
|
|
struct apci1500_private *devpriv = dev->private;
|
|
unsigned int trig = data[1];
|
|
unsigned int shift = data[3];
|
|
- unsigned int hi_mask = data[4] << shift;
|
|
- unsigned int lo_mask = data[5] << shift;
|
|
- unsigned int chan_mask = hi_mask | lo_mask;
|
|
- unsigned int old_mask = (1 << shift) - 1;
|
|
+ unsigned int hi_mask;
|
|
+ unsigned int lo_mask;
|
|
+ unsigned int chan_mask;
|
|
+ unsigned int old_mask;
|
|
unsigned int pm;
|
|
unsigned int pt;
|
|
unsigned int pp;
|
|
+ unsigned int invalid_chan;
|
|
|
|
if (trig > 1) {
|
|
dev_dbg(dev->class_dev,
|
|
@@ -466,7 +467,20 @@ static int apci1500_di_cfg_trig(struct comedi_device *dev,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- if (chan_mask > 0xffff) {
|
|
+ if (shift <= 16) {
|
|
+ hi_mask = data[4] << shift;
|
|
+ lo_mask = data[5] << shift;
|
|
+ old_mask = (1U << shift) - 1;
|
|
+ invalid_chan = (data[4] | data[5]) >> (16 - shift);
|
|
+ } else {
|
|
+ hi_mask = 0;
|
|
+ lo_mask = 0;
|
|
+ old_mask = 0xffff;
|
|
+ invalid_chan = data[4] | data[5];
|
|
+ }
|
|
+ chan_mask = hi_mask | lo_mask;
|
|
+
|
|
+ if (invalid_chan) {
|
|
dev_dbg(dev->class_dev, "invalid digital trigger channel\n");
|
|
return -EINVAL;
|
|
}
|
|
diff --git a/drivers/staging/comedi/drivers/addi_apci_1564.c b/drivers/staging/comedi/drivers/addi_apci_1564.c
|
|
index 10501fe6bb25..1268ba34be5f 100644
|
|
--- a/drivers/staging/comedi/drivers/addi_apci_1564.c
|
|
+++ b/drivers/staging/comedi/drivers/addi_apci_1564.c
|
|
@@ -331,14 +331,22 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
|
|
unsigned int *data)
|
|
{
|
|
struct apci1564_private *devpriv = dev->private;
|
|
- unsigned int shift, oldmask;
|
|
+ unsigned int shift, oldmask, himask, lomask;
|
|
|
|
switch (data[0]) {
|
|
case INSN_CONFIG_DIGITAL_TRIG:
|
|
if (data[1] != 0)
|
|
return -EINVAL;
|
|
shift = data[3];
|
|
- oldmask = (1U << shift) - 1;
|
|
+ if (shift < 32) {
|
|
+ oldmask = (1U << shift) - 1;
|
|
+ himask = data[4] << shift;
|
|
+ lomask = data[5] << shift;
|
|
+ } else {
|
|
+ oldmask = 0xffffffffu;
|
|
+ himask = 0;
|
|
+ lomask = 0;
|
|
+ }
|
|
switch (data[2]) {
|
|
case COMEDI_DIGITAL_TRIG_DISABLE:
|
|
devpriv->ctrl = 0;
|
|
@@ -362,8 +370,8 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
|
|
devpriv->mode2 &= oldmask;
|
|
}
|
|
/* configure specified channels */
|
|
- devpriv->mode1 |= data[4] << shift;
|
|
- devpriv->mode2 |= data[5] << shift;
|
|
+ devpriv->mode1 |= himask;
|
|
+ devpriv->mode2 |= lomask;
|
|
break;
|
|
case COMEDI_DIGITAL_TRIG_ENABLE_LEVELS:
|
|
if (devpriv->ctrl != (APCI1564_DI_IRQ_ENA |
|
|
@@ -380,8 +388,8 @@ static int apci1564_cos_insn_config(struct comedi_device *dev,
|
|
devpriv->mode2 &= oldmask;
|
|
}
|
|
/* configure specified channels */
|
|
- devpriv->mode1 |= data[4] << shift;
|
|
- devpriv->mode2 |= data[5] << shift;
|
|
+ devpriv->mode1 |= himask;
|
|
+ devpriv->mode2 |= lomask;
|
|
break;
|
|
default:
|
|
return -EINVAL;
|
|
diff --git a/drivers/staging/comedi/drivers/ni_6527.c b/drivers/staging/comedi/drivers/ni_6527.c
|
|
index 4d1eccb5041d..4518c2680b7c 100644
|
|
--- a/drivers/staging/comedi/drivers/ni_6527.c
|
|
+++ b/drivers/staging/comedi/drivers/ni_6527.c
|
|
@@ -332,7 +332,7 @@ static int ni6527_intr_insn_config(struct comedi_device *dev,
|
|
case COMEDI_DIGITAL_TRIG_ENABLE_EDGES:
|
|
/* check shift amount */
|
|
shift = data[3];
|
|
- if (shift >= s->n_chan) {
|
|
+ if (shift >= 32) {
|
|
mask = 0;
|
|
rising = 0;
|
|
falling = 0;
|
|
diff --git a/drivers/staging/wlan-ng/prism2usb.c b/drivers/staging/wlan-ng/prism2usb.c
|
|
index 4689b2170e4f..456603fd26c0 100644
|
|
--- a/drivers/staging/wlan-ng/prism2usb.c
|
|
+++ b/drivers/staging/wlan-ng/prism2usb.c
|
|
@@ -61,11 +61,25 @@ static int prism2sta_probe_usb(struct usb_interface *interface,
|
|
const struct usb_device_id *id)
|
|
{
|
|
struct usb_device *dev;
|
|
-
|
|
+ const struct usb_endpoint_descriptor *epd;
|
|
+ const struct usb_host_interface *iface_desc = interface->cur_altsetting;
|
|
struct wlandevice *wlandev = NULL;
|
|
struct hfa384x *hw = NULL;
|
|
int result = 0;
|
|
|
|
+ if (iface_desc->desc.bNumEndpoints != 2) {
|
|
+ result = -ENODEV;
|
|
+ goto failed;
|
|
+ }
|
|
+
|
|
+ result = -EINVAL;
|
|
+ epd = &iface_desc->endpoint[1].desc;
|
|
+ if (!usb_endpoint_is_bulk_in(epd))
|
|
+ goto failed;
|
|
+ epd = &iface_desc->endpoint[2].desc;
|
|
+ if (!usb_endpoint_is_bulk_out(epd))
|
|
+ goto failed;
|
|
+
|
|
dev = interface_to_usbdev(interface);
|
|
wlandev = create_wlan();
|
|
if (!wlandev) {
|
|
diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c
|
|
index 9548d3f8fc8e..c3beee1f580a 100644
|
|
--- a/drivers/tty/serial/8250/8250_core.c
|
|
+++ b/drivers/tty/serial/8250/8250_core.c
|
|
@@ -524,6 +524,7 @@ static void __init serial8250_isa_init_ports(void)
|
|
*/
|
|
up->mcr_mask = ~ALPHA_KLUDGE_MCR;
|
|
up->mcr_force = ALPHA_KLUDGE_MCR;
|
|
+ serial8250_set_defaults(up);
|
|
}
|
|
|
|
/* chain base port ops to support Remote Supervisor Adapter */
|
|
@@ -547,7 +548,6 @@ static void __init serial8250_isa_init_ports(void)
|
|
port->membase = old_serial_port[i].iomem_base;
|
|
port->iotype = old_serial_port[i].io_type;
|
|
port->regshift = old_serial_port[i].iomem_reg_shift;
|
|
- serial8250_set_defaults(up);
|
|
|
|
port->irqflags |= irqflag;
|
|
if (serial8250_isa_config != NULL)
|
|
diff --git a/drivers/tty/serial/8250/8250_exar.c b/drivers/tty/serial/8250/8250_exar.c
|
|
index 59449b6500cd..9b5da1d43332 100644
|
|
--- a/drivers/tty/serial/8250/8250_exar.c
|
|
+++ b/drivers/tty/serial/8250/8250_exar.c
|
|
@@ -326,7 +326,17 @@ static void setup_gpio(struct pci_dev *pcidev, u8 __iomem *p)
|
|
* devices will export them as GPIOs, so we pre-configure them safely
|
|
* as inputs.
|
|
*/
|
|
- u8 dir = pcidev->vendor == PCI_VENDOR_ID_EXAR ? 0xff : 0x00;
|
|
+
|
|
+ u8 dir = 0x00;
|
|
+
|
|
+ if ((pcidev->vendor == PCI_VENDOR_ID_EXAR) &&
|
|
+ (pcidev->subsystem_vendor != PCI_VENDOR_ID_SEALEVEL)) {
|
|
+ // Configure GPIO as inputs for Commtech adapters
|
|
+ dir = 0xff;
|
|
+ } else {
|
|
+ // Configure GPIO as outputs for SeaLevel adapters
|
|
+ dir = 0x00;
|
|
+ }
|
|
|
|
writeb(0x00, p + UART_EXAR_MPIOINT_7_0);
|
|
writeb(0x00, p + UART_EXAR_MPIOLVL_7_0);
|
|
diff --git a/drivers/tty/serial/8250/8250_mtk.c b/drivers/tty/serial/8250/8250_mtk.c
|
|
index f839380c2f4c..98b8a3e30733 100644
|
|
--- a/drivers/tty/serial/8250/8250_mtk.c
|
|
+++ b/drivers/tty/serial/8250/8250_mtk.c
|
|
@@ -306,8 +306,21 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
}
|
|
#endif
|
|
|
|
+ /*
|
|
+ * Store the requested baud rate before calling the generic 8250
|
|
+ * set_termios method. Standard 8250 port expects bauds to be
|
|
+ * no higher than (uartclk / 16) so the baud will be clamped if it
|
|
+ * gets out of that bound. Mediatek 8250 port supports speed
|
|
+ * higher than that, therefore we'll get original baud rate back
|
|
+ * after calling the generic set_termios method and recalculate
|
|
+ * the speed later in this method.
|
|
+ */
|
|
+ baud = tty_termios_baud_rate(termios);
|
|
+
|
|
serial8250_do_set_termios(port, termios, old);
|
|
|
|
+ tty_termios_encode_baud_rate(termios, baud, baud);
|
|
+
|
|
/*
|
|
* Mediatek UARTs use an extra highspeed register (MTK_UART_HIGHS)
|
|
*
|
|
@@ -339,6 +352,11 @@ mtk8250_set_termios(struct uart_port *port, struct ktermios *termios,
|
|
*/
|
|
spin_lock_irqsave(&port->lock, flags);
|
|
|
|
+ /*
|
|
+ * Update the per-port timeout.
|
|
+ */
|
|
+ uart_update_timeout(port, termios->c_cflag, baud);
|
|
+
|
|
/* set DLAB we have cval saved in up->lcr from the call to the core */
|
|
serial_port_out(port, UART_LCR, up->lcr | UART_LCR_DLAB);
|
|
serial_dl_write(up, quot);
|
|
diff --git a/drivers/tty/serial/serial-tegra.c b/drivers/tty/serial/serial-tegra.c
|
|
index 8de8bac9c6c7..b3bbee6b6702 100644
|
|
--- a/drivers/tty/serial/serial-tegra.c
|
|
+++ b/drivers/tty/serial/serial-tegra.c
|
|
@@ -653,11 +653,14 @@ static void tegra_uart_handle_rx_pio(struct tegra_uart_port *tup,
|
|
ch = (unsigned char) tegra_uart_read(tup, UART_RX);
|
|
tup->uport.icount.rx++;
|
|
|
|
- if (!uart_handle_sysrq_char(&tup->uport, ch) && tty)
|
|
- tty_insert_flip_char(tty, ch, flag);
|
|
+ if (uart_handle_sysrq_char(&tup->uport, ch))
|
|
+ continue;
|
|
|
|
if (tup->uport.ignore_status_mask & UART_LSR_DR)
|
|
continue;
|
|
+
|
|
+ if (tty)
|
|
+ tty_insert_flip_char(tty, ch, flag);
|
|
} while (1);
|
|
}
|
|
|
|
diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c
|
|
index ac137b6a1dc1..56e108902502 100644
|
|
--- a/drivers/tty/serial/xilinx_uartps.c
|
|
+++ b/drivers/tty/serial/xilinx_uartps.c
|
|
@@ -1574,8 +1574,10 @@ static int cdns_uart_probe(struct platform_device *pdev)
|
|
* If register_console() don't assign value, then console_port pointer
|
|
* is cleanup.
|
|
*/
|
|
- if (!console_port)
|
|
+ if (!console_port) {
|
|
+ cdns_uart_console.index = id;
|
|
console_port = port;
|
|
+ }
|
|
#endif
|
|
|
|
rc = uart_add_one_port(&cdns_uart_uart_driver, port);
|
|
@@ -1588,8 +1590,10 @@ static int cdns_uart_probe(struct platform_device *pdev)
|
|
#ifdef CONFIG_SERIAL_XILINX_PS_UART_CONSOLE
|
|
/* This is not port which is used for console that's why clean it up */
|
|
if (console_port == port &&
|
|
- !(cdns_uart_uart_driver.cons->flags & CON_ENABLED))
|
|
+ !(cdns_uart_uart_driver.cons->flags & CON_ENABLED)) {
|
|
console_port = NULL;
|
|
+ cdns_uart_console.index = -1;
|
|
+ }
|
|
#endif
|
|
|
|
cdns_uart_data->cts_override = of_property_read_bool(pdev->dev.of_node,
|
|
diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c
|
|
index 48a8199f7845..42d8c67a481f 100644
|
|
--- a/drivers/tty/vt/vt.c
|
|
+++ b/drivers/tty/vt/vt.c
|
|
@@ -1092,10 +1092,19 @@ static const struct tty_port_operations vc_port_ops = {
|
|
.destruct = vc_port_destruct,
|
|
};
|
|
|
|
+/*
|
|
+ * Change # of rows and columns (0 means unchanged/the size of fg_console)
|
|
+ * [this is to be used together with some user program
|
|
+ * like resize that changes the hardware videomode]
|
|
+ */
|
|
+#define VC_MAXCOL (32767)
|
|
+#define VC_MAXROW (32767)
|
|
+
|
|
int vc_allocate(unsigned int currcons) /* return 0 on success */
|
|
{
|
|
struct vt_notifier_param param;
|
|
struct vc_data *vc;
|
|
+ int err;
|
|
|
|
WARN_CONSOLE_UNLOCKED();
|
|
|
|
@@ -1125,6 +1134,11 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */
|
|
if (!*vc->vc_uni_pagedir_loc)
|
|
con_set_default_unimap(vc);
|
|
|
|
+ err = -EINVAL;
|
|
+ if (vc->vc_cols > VC_MAXCOL || vc->vc_rows > VC_MAXROW ||
|
|
+ vc->vc_screenbuf_size > KMALLOC_MAX_SIZE || !vc->vc_screenbuf_size)
|
|
+ goto err_free;
|
|
+ err = -ENOMEM;
|
|
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_KERNEL);
|
|
if (!vc->vc_screenbuf)
|
|
goto err_free;
|
|
@@ -1143,7 +1157,7 @@ err_free:
|
|
visual_deinit(vc);
|
|
kfree(vc);
|
|
vc_cons[currcons].d = NULL;
|
|
- return -ENOMEM;
|
|
+ return err;
|
|
}
|
|
|
|
static inline int resize_screen(struct vc_data *vc, int width, int height,
|
|
@@ -1158,14 +1172,6 @@ static inline int resize_screen(struct vc_data *vc, int width, int height,
|
|
return err;
|
|
}
|
|
|
|
-/*
|
|
- * Change # of rows and columns (0 means unchanged/the size of fg_console)
|
|
- * [this is to be used together with some user program
|
|
- * like resize that changes the hardware videomode]
|
|
- */
|
|
-#define VC_RESIZE_MAXCOL (32767)
|
|
-#define VC_RESIZE_MAXROW (32767)
|
|
-
|
|
/**
|
|
* vc_do_resize - resizing method for the tty
|
|
* @tty: tty being resized
|
|
@@ -1201,7 +1207,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
|
|
user = vc->vc_resize_user;
|
|
vc->vc_resize_user = 0;
|
|
|
|
- if (cols > VC_RESIZE_MAXCOL || lines > VC_RESIZE_MAXROW)
|
|
+ if (cols > VC_MAXCOL || lines > VC_MAXROW)
|
|
return -EINVAL;
|
|
|
|
new_cols = (cols ? cols : vc->vc_cols);
|
|
@@ -1212,7 +1218,7 @@ static int vc_do_resize(struct tty_struct *tty, struct vc_data *vc,
|
|
if (new_cols == vc->vc_cols && new_rows == vc->vc_rows)
|
|
return 0;
|
|
|
|
- if (new_screen_size > KMALLOC_MAX_SIZE)
|
|
+ if (new_screen_size > KMALLOC_MAX_SIZE || !new_screen_size)
|
|
return -EINVAL;
|
|
newscreen = kzalloc(new_screen_size, GFP_USER);
|
|
if (!newscreen)
|
|
@@ -3393,6 +3399,7 @@ static int __init con_init(void)
|
|
INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK);
|
|
tty_port_init(&vc->port);
|
|
visual_init(vc, currcons, 1);
|
|
+ /* Assuming vc->vc_{cols,rows,screenbuf_size} are sane here. */
|
|
vc->vc_screenbuf = kzalloc(vc->vc_screenbuf_size, GFP_NOWAIT);
|
|
vc_init(vc, vc->vc_rows, vc->vc_cols,
|
|
currcons || !vc->vc_sw->con_save_screen);
|
|
diff --git a/drivers/usb/cdns3/ep0.c b/drivers/usb/cdns3/ep0.c
|
|
index da4c5eb03d7e..666cebd9c5f2 100644
|
|
--- a/drivers/usb/cdns3/ep0.c
|
|
+++ b/drivers/usb/cdns3/ep0.c
|
|
@@ -37,18 +37,18 @@ static void cdns3_ep0_run_transfer(struct cdns3_device *priv_dev,
|
|
struct cdns3_usb_regs __iomem *regs = priv_dev->regs;
|
|
struct cdns3_endpoint *priv_ep = priv_dev->eps[0];
|
|
|
|
- priv_ep->trb_pool[0].buffer = TRB_BUFFER(dma_addr);
|
|
- priv_ep->trb_pool[0].length = TRB_LEN(length);
|
|
+ priv_ep->trb_pool[0].buffer = cpu_to_le32(TRB_BUFFER(dma_addr));
|
|
+ priv_ep->trb_pool[0].length = cpu_to_le32(TRB_LEN(length));
|
|
|
|
if (zlp) {
|
|
- priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_TYPE(TRB_NORMAL);
|
|
- priv_ep->trb_pool[1].buffer = TRB_BUFFER(dma_addr);
|
|
- priv_ep->trb_pool[1].length = TRB_LEN(0);
|
|
- priv_ep->trb_pool[1].control = TRB_CYCLE | TRB_IOC |
|
|
- TRB_TYPE(TRB_NORMAL);
|
|
+ priv_ep->trb_pool[0].control = cpu_to_le32(TRB_CYCLE | TRB_TYPE(TRB_NORMAL));
|
|
+ priv_ep->trb_pool[1].buffer = cpu_to_le32(TRB_BUFFER(dma_addr));
|
|
+ priv_ep->trb_pool[1].length = cpu_to_le32(TRB_LEN(0));
|
|
+ priv_ep->trb_pool[1].control = cpu_to_le32(TRB_CYCLE | TRB_IOC |
|
|
+ TRB_TYPE(TRB_NORMAL));
|
|
} else {
|
|
- priv_ep->trb_pool[0].control = TRB_CYCLE | TRB_IOC |
|
|
- TRB_TYPE(TRB_NORMAL);
|
|
+ priv_ep->trb_pool[0].control = cpu_to_le32(TRB_CYCLE | TRB_IOC |
|
|
+ TRB_TYPE(TRB_NORMAL));
|
|
priv_ep->trb_pool[1].control = 0;
|
|
}
|
|
|
|
@@ -264,11 +264,11 @@ static int cdns3_req_ep0_get_status(struct cdns3_device *priv_dev,
|
|
case USB_RECIP_INTERFACE:
|
|
return cdns3_ep0_delegate_req(priv_dev, ctrl);
|
|
case USB_RECIP_ENDPOINT:
|
|
- index = cdns3_ep_addr_to_index(ctrl->wIndex);
|
|
+ index = cdns3_ep_addr_to_index(le16_to_cpu(ctrl->wIndex));
|
|
priv_ep = priv_dev->eps[index];
|
|
|
|
/* check if endpoint is stalled or stall is pending */
|
|
- cdns3_select_ep(priv_dev, ctrl->wIndex);
|
|
+ cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
|
|
if (EP_STS_STALL(readl(&priv_dev->regs->ep_sts)) ||
|
|
(priv_ep->flags & EP_STALL_PENDING))
|
|
usb_status = BIT(USB_ENDPOINT_HALT);
|
|
@@ -388,10 +388,10 @@ static int cdns3_ep0_feature_handle_endpoint(struct cdns3_device *priv_dev,
|
|
if (!(ctrl->wIndex & ~USB_DIR_IN))
|
|
return 0;
|
|
|
|
- index = cdns3_ep_addr_to_index(ctrl->wIndex);
|
|
+ index = cdns3_ep_addr_to_index(le16_to_cpu(ctrl->wIndex));
|
|
priv_ep = priv_dev->eps[index];
|
|
|
|
- cdns3_select_ep(priv_dev, ctrl->wIndex);
|
|
+ cdns3_select_ep(priv_dev, le16_to_cpu(ctrl->wIndex));
|
|
|
|
if (set)
|
|
__cdns3_gadget_ep_set_halt(priv_ep);
|
|
@@ -452,7 +452,7 @@ static int cdns3_req_ep0_set_sel(struct cdns3_device *priv_dev,
|
|
if (priv_dev->gadget.state < USB_STATE_ADDRESS)
|
|
return -EINVAL;
|
|
|
|
- if (ctrl_req->wLength != 6) {
|
|
+ if (le16_to_cpu(ctrl_req->wLength) != 6) {
|
|
dev_err(priv_dev->dev, "Set SEL should be 6 bytes, got %d\n",
|
|
ctrl_req->wLength);
|
|
return -EINVAL;
|
|
@@ -476,7 +476,7 @@ static int cdns3_req_ep0_set_isoch_delay(struct cdns3_device *priv_dev,
|
|
if (ctrl_req->wIndex || ctrl_req->wLength)
|
|
return -EINVAL;
|
|
|
|
- priv_dev->isoch_delay = ctrl_req->wValue;
|
|
+ priv_dev->isoch_delay = le16_to_cpu(ctrl_req->wValue);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/usb/cdns3/trace.h b/drivers/usb/cdns3/trace.h
|
|
index 755c56582257..0a2a3269bfac 100644
|
|
--- a/drivers/usb/cdns3/trace.h
|
|
+++ b/drivers/usb/cdns3/trace.h
|
|
@@ -404,9 +404,9 @@ DECLARE_EVENT_CLASS(cdns3_log_trb,
|
|
TP_fast_assign(
|
|
__assign_str(name, priv_ep->name);
|
|
__entry->trb = trb;
|
|
- __entry->buffer = trb->buffer;
|
|
- __entry->length = trb->length;
|
|
- __entry->control = trb->control;
|
|
+ __entry->buffer = le32_to_cpu(trb->buffer);
|
|
+ __entry->length = le32_to_cpu(trb->length);
|
|
+ __entry->control = le32_to_cpu(trb->control);
|
|
__entry->type = usb_endpoint_type(priv_ep->endpoint.desc);
|
|
__entry->last_stream_id = priv_ep->last_stream_id;
|
|
),
|
|
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
|
|
index 96c05b121fac..139474c3e77b 100644
|
|
--- a/drivers/usb/dwc3/dwc3-pci.c
|
|
+++ b/drivers/usb/dwc3/dwc3-pci.c
|
|
@@ -38,6 +38,8 @@
|
|
#define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee
|
|
#define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e
|
|
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
|
|
+#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
|
|
+#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
|
|
|
|
#define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"
|
|
#define PCI_INTEL_BXT_FUNC_PMU_PWR 4
|
|
@@ -358,6 +360,12 @@ static const struct pci_device_id dwc3_pci_id_table[] = {
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_properties, },
|
|
|
|
+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPH),
|
|
+ (kernel_ulong_t) &dwc3_pci_intel_properties, },
|
|
+
|
|
+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_JSP),
|
|
+ (kernel_ulong_t) &dwc3_pci_intel_properties, },
|
|
+
|
|
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB),
|
|
(kernel_ulong_t) &dwc3_pci_amd_properties, },
|
|
{ } /* Terminating Entry */
|
|
diff --git a/drivers/usb/gadget/udc/gr_udc.c b/drivers/usb/gadget/udc/gr_udc.c
|
|
index aaf975c809bf..ecf874dee996 100644
|
|
--- a/drivers/usb/gadget/udc/gr_udc.c
|
|
+++ b/drivers/usb/gadget/udc/gr_udc.c
|
|
@@ -1981,9 +1981,12 @@ static int gr_ep_init(struct gr_udc *dev, int num, int is_in, u32 maxplimit)
|
|
|
|
if (num == 0) {
|
|
_req = gr_alloc_request(&ep->ep, GFP_ATOMIC);
|
|
+ if (!_req)
|
|
+ return -ENOMEM;
|
|
+
|
|
buf = devm_kzalloc(dev->dev, PAGE_SIZE, GFP_DMA | GFP_ATOMIC);
|
|
- if (!_req || !buf) {
|
|
- /* possible _req freed by gr_probe via gr_remove */
|
|
+ if (!buf) {
|
|
+ gr_free_request(&ep->ep, _req);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
diff --git a/drivers/usb/host/xhci-mtk-sch.c b/drivers/usb/host/xhci-mtk-sch.c
|
|
index fea555570ad4..45c54d56ecbd 100644
|
|
--- a/drivers/usb/host/xhci-mtk-sch.c
|
|
+++ b/drivers/usb/host/xhci-mtk-sch.c
|
|
@@ -557,6 +557,10 @@ static bool need_bw_sch(struct usb_host_endpoint *ep,
|
|
if (is_fs_or_ls(speed) && !has_tt)
|
|
return false;
|
|
|
|
+ /* skip endpoint with zero maxpkt */
|
|
+ if (usb_endpoint_maxp(&ep->desc) == 0)
|
|
+ return false;
|
|
+
|
|
return true;
|
|
}
|
|
|
|
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
|
|
index 766b74723e64..51251c1be059 100644
|
|
--- a/drivers/usb/host/xhci-pci.c
|
|
+++ b/drivers/usb/host/xhci-pci.c
|
|
@@ -255,6 +255,9 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
|
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
|
pdev->device == 0x1142)
|
|
xhci->quirks |= XHCI_TRUST_TX_LENGTH;
|
|
+ if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
|
+ pdev->device == 0x2142)
|
|
+ xhci->quirks |= XHCI_NO_64BIT_SUPPORT;
|
|
|
|
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
|
|
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI)
|
|
diff --git a/drivers/usb/host/xhci-tegra.c b/drivers/usb/host/xhci-tegra.c
|
|
index 2eaf5c0af80c..ee6bf01775bb 100644
|
|
--- a/drivers/usb/host/xhci-tegra.c
|
|
+++ b/drivers/usb/host/xhci-tegra.c
|
|
@@ -856,7 +856,7 @@ static int tegra_xusb_init_context(struct tegra_xusb *tegra)
|
|
if (!tegra->context.ipfs)
|
|
return -ENOMEM;
|
|
|
|
- tegra->context.fpci = devm_kcalloc(tegra->dev, soc->ipfs.num_offsets,
|
|
+ tegra->context.fpci = devm_kcalloc(tegra->dev, soc->fpci.num_offsets,
|
|
sizeof(u32), GFP_KERNEL);
|
|
if (!tegra->context.fpci)
|
|
return -ENOMEM;
|
|
diff --git a/drivers/video/fbdev/core/bitblit.c b/drivers/video/fbdev/core/bitblit.c
|
|
index ca935c09a261..35ebeeccde4d 100644
|
|
--- a/drivers/video/fbdev/core/bitblit.c
|
|
+++ b/drivers/video/fbdev/core/bitblit.c
|
|
@@ -216,7 +216,7 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
region.color = color;
|
|
region.rop = ROP_COPY;
|
|
|
|
- if (rw && !bottom_only) {
|
|
+ if ((int) rw > 0 && !bottom_only) {
|
|
region.dx = info->var.xoffset + rs;
|
|
region.dy = 0;
|
|
region.width = rw;
|
|
@@ -224,7 +224,7 @@ static void bit_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
info->fbops->fb_fillrect(info, ®ion);
|
|
}
|
|
|
|
- if (bh) {
|
|
+ if ((int) bh > 0) {
|
|
region.dx = info->var.xoffset;
|
|
region.dy = info->var.yoffset + bs;
|
|
region.width = rs;
|
|
diff --git a/drivers/video/fbdev/core/fbcon_ccw.c b/drivers/video/fbdev/core/fbcon_ccw.c
|
|
index dfa9a8aa4509..78f3a5621478 100644
|
|
--- a/drivers/video/fbdev/core/fbcon_ccw.c
|
|
+++ b/drivers/video/fbdev/core/fbcon_ccw.c
|
|
@@ -201,7 +201,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
region.color = color;
|
|
region.rop = ROP_COPY;
|
|
|
|
- if (rw && !bottom_only) {
|
|
+ if ((int) rw > 0 && !bottom_only) {
|
|
region.dx = 0;
|
|
region.dy = info->var.yoffset;
|
|
region.height = rw;
|
|
@@ -209,7 +209,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
info->fbops->fb_fillrect(info, ®ion);
|
|
}
|
|
|
|
- if (bh) {
|
|
+ if ((int) bh > 0) {
|
|
region.dx = info->var.xoffset + bs;
|
|
region.dy = 0;
|
|
region.height = info->var.yres_virtual;
|
|
diff --git a/drivers/video/fbdev/core/fbcon_cw.c b/drivers/video/fbdev/core/fbcon_cw.c
|
|
index ce08251bfd38..fd098ff17574 100644
|
|
--- a/drivers/video/fbdev/core/fbcon_cw.c
|
|
+++ b/drivers/video/fbdev/core/fbcon_cw.c
|
|
@@ -184,7 +184,7 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
region.color = color;
|
|
region.rop = ROP_COPY;
|
|
|
|
- if (rw && !bottom_only) {
|
|
+ if ((int) rw > 0 && !bottom_only) {
|
|
region.dx = 0;
|
|
region.dy = info->var.yoffset + rs;
|
|
region.height = rw;
|
|
@@ -192,7 +192,7 @@ static void cw_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
info->fbops->fb_fillrect(info, ®ion);
|
|
}
|
|
|
|
- if (bh) {
|
|
+ if ((int) bh > 0) {
|
|
region.dx = info->var.xoffset;
|
|
region.dy = info->var.yoffset;
|
|
region.height = info->var.yres;
|
|
diff --git a/drivers/video/fbdev/core/fbcon_ud.c b/drivers/video/fbdev/core/fbcon_ud.c
|
|
index 1936afc78fec..e165a3fad29a 100644
|
|
--- a/drivers/video/fbdev/core/fbcon_ud.c
|
|
+++ b/drivers/video/fbdev/core/fbcon_ud.c
|
|
@@ -231,7 +231,7 @@ static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
region.color = color;
|
|
region.rop = ROP_COPY;
|
|
|
|
- if (rw && !bottom_only) {
|
|
+ if ((int) rw > 0 && !bottom_only) {
|
|
region.dy = 0;
|
|
region.dx = info->var.xoffset;
|
|
region.width = rw;
|
|
@@ -239,7 +239,7 @@ static void ud_clear_margins(struct vc_data *vc, struct fb_info *info,
|
|
info->fbops->fb_fillrect(info, ®ion);
|
|
}
|
|
|
|
- if (bh) {
|
|
+ if ((int) bh > 0) {
|
|
region.dy = info->var.yoffset;
|
|
region.dx = info->var.xoffset;
|
|
region.height = bh;
|
|
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
|
|
index 0cc02577577b..ae5cb94ef191 100644
|
|
--- a/fs/btrfs/backref.c
|
|
+++ b/fs/btrfs/backref.c
|
|
@@ -1465,6 +1465,7 @@ static int btrfs_find_all_roots_safe(struct btrfs_trans_handle *trans,
|
|
if (ret < 0 && ret != -ENOENT) {
|
|
ulist_free(tmp);
|
|
ulist_free(*roots);
|
|
+ *roots = NULL;
|
|
return ret;
|
|
}
|
|
node = ulist_next(tmp, &uiter);
|
|
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
|
|
index f71e4dbe1d8a..f00e64fee5dd 100644
|
|
--- a/fs/btrfs/disk-io.c
|
|
+++ b/fs/btrfs/disk-io.c
|
|
@@ -1998,6 +1998,7 @@ void btrfs_put_root(struct btrfs_root *root)
|
|
|
|
if (refcount_dec_and_test(&root->refs)) {
|
|
WARN_ON(!RB_EMPTY_ROOT(&root->inode_tree));
|
|
+ WARN_ON(test_bit(BTRFS_ROOT_DEAD_RELOC_TREE, &root->state));
|
|
if (root->anon_dev)
|
|
free_anon_bdev(root->anon_dev);
|
|
btrfs_drew_lock_destroy(&root->snapshot_lock);
|
|
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
|
|
index 6e17a92869ad..79196eb1a1b3 100644
|
|
--- a/fs/btrfs/extent_io.c
|
|
+++ b/fs/btrfs/extent_io.c
|
|
@@ -1999,7 +1999,8 @@ static int __process_pages_contig(struct address_space *mapping,
|
|
if (!PageDirty(pages[i]) ||
|
|
pages[i]->mapping != mapping) {
|
|
unlock_page(pages[i]);
|
|
- put_page(pages[i]);
|
|
+ for (; i < ret; i++)
|
|
+ put_page(pages[i]);
|
|
err = -EAGAIN;
|
|
goto out;
|
|
}
|
|
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
|
|
index 157452a5e110..f67d736c27a1 100644
|
|
--- a/fs/btrfs/relocation.c
|
|
+++ b/fs/btrfs/relocation.c
|
|
@@ -2642,6 +2642,8 @@ again:
|
|
root->reloc_root = NULL;
|
|
btrfs_put_root(reloc_root);
|
|
}
|
|
+ clear_bit(BTRFS_ROOT_DEAD_RELOC_TREE,
|
|
+ &root->state);
|
|
btrfs_put_root(root);
|
|
}
|
|
|
|
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
|
|
index 21c7d3d87827..45cf455f906d 100644
|
|
--- a/fs/btrfs/volumes.c
|
|
+++ b/fs/btrfs/volumes.c
|
|
@@ -7055,6 +7055,14 @@ int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info)
|
|
mutex_lock(&uuid_mutex);
|
|
mutex_lock(&fs_info->chunk_mutex);
|
|
|
|
+ /*
|
|
+ * It is possible for mount and umount to race in such a way that
|
|
+ * we execute this code path, but open_fs_devices failed to clear
|
|
+ * total_rw_bytes. We certainly want it cleared before reading the
|
|
+ * device items, so clear it here.
|
|
+ */
|
|
+ fs_info->fs_devices->total_rw_bytes = 0;
|
|
+
|
|
/*
|
|
* Read all device items, and then all the chunk items. All
|
|
* device items are found before any chunk item (their object id
|
|
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
|
|
index 44a57b65915b..15f2cdc71ac9 100644
|
|
--- a/fs/cifs/inode.c
|
|
+++ b/fs/cifs/inode.c
|
|
@@ -1855,7 +1855,6 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
|
|
FILE_UNIX_BASIC_INFO *info_buf_target;
|
|
unsigned int xid;
|
|
int rc, tmprc;
|
|
- bool new_target = d_really_is_negative(target_dentry);
|
|
|
|
if (flags & ~RENAME_NOREPLACE)
|
|
return -EINVAL;
|
|
@@ -1932,13 +1931,8 @@ cifs_rename2(struct inode *source_dir, struct dentry *source_dentry,
|
|
*/
|
|
|
|
unlink_target:
|
|
- /*
|
|
- * If the target dentry was created during the rename, try
|
|
- * unlinking it if it's not negative
|
|
- */
|
|
- if (new_target &&
|
|
- d_really_is_positive(target_dentry) &&
|
|
- (rc == -EACCES || rc == -EEXIST)) {
|
|
+ /* Try unlinking the target dentry if it's not negative */
|
|
+ if (d_really_is_positive(target_dentry) && (rc == -EACCES || rc == -EEXIST)) {
|
|
if (d_is_dir(target_dentry))
|
|
tmprc = cifs_rmdir(target_dir, target_dentry);
|
|
else
|
|
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
|
|
index 12c66f5d92dd..28bb5689333a 100644
|
|
--- a/fs/efivarfs/super.c
|
|
+++ b/fs/efivarfs/super.c
|
|
@@ -201,6 +201,9 @@ static int efivarfs_fill_super(struct super_block *sb, struct fs_context *fc)
|
|
sb->s_d_op = &efivarfs_d_ops;
|
|
sb->s_time_gran = 1;
|
|
|
|
+ if (!efivar_supports_writes())
|
|
+ sb->s_flags |= SB_RDONLY;
|
|
+
|
|
inode = efivarfs_get_inode(sb, NULL, S_IFDIR | 0755, 0, true);
|
|
if (!inode)
|
|
return -ENOMEM;
|
|
@@ -252,9 +255,6 @@ static struct file_system_type efivarfs_type = {
|
|
|
|
static __init int efivarfs_init(void)
|
|
{
|
|
- if (!efi_rt_services_supported(EFI_RT_SUPPORTED_VARIABLE_SERVICES))
|
|
- return -ENODEV;
|
|
-
|
|
if (!efivars_kobject())
|
|
return -ENODEV;
|
|
|
|
diff --git a/fs/exfat/dir.c b/fs/exfat/dir.c
|
|
index 6db302d76d4c..0c244eb706bd 100644
|
|
--- a/fs/exfat/dir.c
|
|
+++ b/fs/exfat/dir.c
|
|
@@ -1160,7 +1160,7 @@ found:
|
|
ret = exfat_get_next_cluster(sb, &clu.dir);
|
|
}
|
|
|
|
- if (ret || clu.dir != EXFAT_EOF_CLUSTER) {
|
|
+ if (ret || clu.dir == EXFAT_EOF_CLUSTER) {
|
|
/* just initialized hint_stat */
|
|
hint_stat->clu = p_dir->dir;
|
|
hint_stat->eidx = 0;
|
|
diff --git a/fs/exfat/exfat_fs.h b/fs/exfat/exfat_fs.h
|
|
index d865050fa6cd..99e9baf2d31d 100644
|
|
--- a/fs/exfat/exfat_fs.h
|
|
+++ b/fs/exfat/exfat_fs.h
|
|
@@ -375,7 +375,7 @@ static inline bool exfat_is_last_sector_in_cluster(struct exfat_sb_info *sbi,
|
|
static inline sector_t exfat_cluster_to_sector(struct exfat_sb_info *sbi,
|
|
unsigned int clus)
|
|
{
|
|
- return ((clus - EXFAT_RESERVED_CLUSTERS) << sbi->sect_per_clus_bits) +
|
|
+ return ((sector_t)(clus - EXFAT_RESERVED_CLUSTERS) << sbi->sect_per_clus_bits) +
|
|
sbi->data_start_sector;
|
|
}
|
|
|
|
diff --git a/fs/exfat/file.c b/fs/exfat/file.c
|
|
index b93aa9e6cb16..04278f3c0adf 100644
|
|
--- a/fs/exfat/file.c
|
|
+++ b/fs/exfat/file.c
|
|
@@ -175,7 +175,7 @@ int __exfat_truncate(struct inode *inode, loff_t new_size)
|
|
ep2->dentry.stream.size = 0;
|
|
} else {
|
|
ep2->dentry.stream.valid_size = cpu_to_le64(new_size);
|
|
- ep2->dentry.stream.size = ep->dentry.stream.valid_size;
|
|
+ ep2->dentry.stream.size = ep2->dentry.stream.valid_size;
|
|
}
|
|
|
|
if (new_size == 0) {
|
|
diff --git a/fs/exfat/nls.c b/fs/exfat/nls.c
|
|
index 6d1c3ae130ff..a647f8127f3b 100644
|
|
--- a/fs/exfat/nls.c
|
|
+++ b/fs/exfat/nls.c
|
|
@@ -495,7 +495,7 @@ static int exfat_utf8_to_utf16(struct super_block *sb,
|
|
struct exfat_uni_name *p_uniname, int *p_lossy)
|
|
{
|
|
int i, unilen, lossy = NLS_NAME_NO_LOSSY;
|
|
- unsigned short upname[MAX_NAME_LENGTH + 1];
|
|
+ __le16 upname[MAX_NAME_LENGTH + 1];
|
|
unsigned short *uniname = p_uniname->name;
|
|
|
|
WARN_ON(!len);
|
|
@@ -523,7 +523,7 @@ static int exfat_utf8_to_utf16(struct super_block *sb,
|
|
exfat_wstrchr(bad_uni_chars, *uniname))
|
|
lossy |= NLS_NAME_LOSSY;
|
|
|
|
- upname[i] = exfat_toupper(sb, *uniname);
|
|
+ upname[i] = cpu_to_le16(exfat_toupper(sb, *uniname));
|
|
uniname++;
|
|
}
|
|
|
|
@@ -614,7 +614,7 @@ static int exfat_nls_to_ucs2(struct super_block *sb,
|
|
struct exfat_uni_name *p_uniname, int *p_lossy)
|
|
{
|
|
int i = 0, unilen = 0, lossy = NLS_NAME_NO_LOSSY;
|
|
- unsigned short upname[MAX_NAME_LENGTH + 1];
|
|
+ __le16 upname[MAX_NAME_LENGTH + 1];
|
|
unsigned short *uniname = p_uniname->name;
|
|
struct nls_table *nls = EXFAT_SB(sb)->nls_io;
|
|
|
|
@@ -628,7 +628,7 @@ static int exfat_nls_to_ucs2(struct super_block *sb,
|
|
exfat_wstrchr(bad_uni_chars, *uniname))
|
|
lossy |= NLS_NAME_LOSSY;
|
|
|
|
- upname[unilen] = exfat_toupper(sb, *uniname);
|
|
+ upname[unilen] = cpu_to_le16(exfat_toupper(sb, *uniname));
|
|
uniname++;
|
|
unilen++;
|
|
}
|
|
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
|
|
index 5c155437a455..ec02c3240176 100644
|
|
--- a/fs/fuse/dev.c
|
|
+++ b/fs/fuse/dev.c
|
|
@@ -771,7 +771,8 @@ static int fuse_check_page(struct page *page)
|
|
1 << PG_uptodate |
|
|
1 << PG_lru |
|
|
1 << PG_active |
|
|
- 1 << PG_reclaim))) {
|
|
+ 1 << PG_reclaim |
|
|
+ 1 << PG_waiters))) {
|
|
pr_warn("trying to steal weird page\n");
|
|
pr_warn(" page=%p index=%li flags=%08lx, count=%i, mapcount=%i, mapping=%p\n", page, page->index, page->flags, page_count(page), page_mapcount(page), page->mapping);
|
|
return 1;
|
|
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
|
|
index f0c3f0123131..d49b1d197908 100644
|
|
--- a/fs/nfs/direct.c
|
|
+++ b/fs/nfs/direct.c
|
|
@@ -267,6 +267,8 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq)
|
|
{
|
|
struct inode *inode = dreq->inode;
|
|
|
|
+ inode_dio_end(inode);
|
|
+
|
|
if (dreq->iocb) {
|
|
long res = (long) dreq->error;
|
|
if (dreq->count != 0) {
|
|
@@ -278,10 +280,7 @@ static void nfs_direct_complete(struct nfs_direct_req *dreq)
|
|
|
|
complete(&dreq->completion);
|
|
|
|
- igrab(inode);
|
|
nfs_direct_req_release(dreq);
|
|
- inode_dio_end(inode);
|
|
- iput(inode);
|
|
}
|
|
|
|
static void nfs_direct_read_completion(struct nfs_pgio_header *hdr)
|
|
@@ -411,10 +410,8 @@ static ssize_t nfs_direct_read_schedule_iovec(struct nfs_direct_req *dreq,
|
|
* generic layer handle the completion.
|
|
*/
|
|
if (requested_bytes == 0) {
|
|
- igrab(inode);
|
|
- nfs_direct_req_release(dreq);
|
|
inode_dio_end(inode);
|
|
- iput(inode);
|
|
+ nfs_direct_req_release(dreq);
|
|
return result < 0 ? result : -EIO;
|
|
}
|
|
|
|
@@ -867,10 +864,8 @@ static ssize_t nfs_direct_write_schedule_iovec(struct nfs_direct_req *dreq,
|
|
* generic layer handle the completion.
|
|
*/
|
|
if (requested_bytes == 0) {
|
|
- igrab(inode);
|
|
- nfs_direct_req_release(dreq);
|
|
inode_dio_end(inode);
|
|
- iput(inode);
|
|
+ nfs_direct_req_release(dreq);
|
|
return result < 0 ? result : -EIO;
|
|
}
|
|
|
|
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
|
|
index ccd6c1637b27..f96367a2463e 100644
|
|
--- a/fs/nfs/file.c
|
|
+++ b/fs/nfs/file.c
|
|
@@ -83,7 +83,6 @@ nfs_file_release(struct inode *inode, struct file *filp)
|
|
dprintk("NFS: release(%pD2)\n", filp);
|
|
|
|
nfs_inc_stats(inode, NFSIOS_VFSRELEASE);
|
|
- inode_dio_wait(inode);
|
|
nfs_file_clear_open_context(filp);
|
|
return 0;
|
|
}
|
|
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
|
|
index bdfae3ba3953..0a201bb074b0 100644
|
|
--- a/fs/nfsd/nfs4state.c
|
|
+++ b/fs/nfsd/nfs4state.c
|
|
@@ -509,6 +509,17 @@ find_any_file(struct nfs4_file *f)
|
|
return ret;
|
|
}
|
|
|
|
+static struct nfsd_file *find_deleg_file(struct nfs4_file *f)
|
|
+{
|
|
+ struct nfsd_file *ret = NULL;
|
|
+
|
|
+ spin_lock(&f->fi_lock);
|
|
+ if (f->fi_deleg_file)
|
|
+ ret = nfsd_file_get(f->fi_deleg_file);
|
|
+ spin_unlock(&f->fi_lock);
|
|
+ return ret;
|
|
+}
|
|
+
|
|
static atomic_long_t num_delegations;
|
|
unsigned long max_delegations;
|
|
|
|
@@ -2436,6 +2447,8 @@ static int nfs4_show_open(struct seq_file *s, struct nfs4_stid *st)
|
|
oo = ols->st_stateowner;
|
|
nf = st->sc_file;
|
|
file = find_any_file(nf);
|
|
+ if (!file)
|
|
+ return 0;
|
|
|
|
seq_printf(s, "- 0x%16phN: { type: open, ", &st->sc_stateid);
|
|
|
|
@@ -2469,6 +2482,8 @@ static int nfs4_show_lock(struct seq_file *s, struct nfs4_stid *st)
|
|
oo = ols->st_stateowner;
|
|
nf = st->sc_file;
|
|
file = find_any_file(nf);
|
|
+ if (!file)
|
|
+ return 0;
|
|
|
|
seq_printf(s, "- 0x%16phN: { type: lock, ", &st->sc_stateid);
|
|
|
|
@@ -2497,7 +2512,9 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
|
|
|
|
ds = delegstateid(st);
|
|
nf = st->sc_file;
|
|
- file = nf->fi_deleg_file;
|
|
+ file = find_deleg_file(nf);
|
|
+ if (!file)
|
|
+ return 0;
|
|
|
|
seq_printf(s, "- 0x%16phN: { type: deleg, ", &st->sc_stateid);
|
|
|
|
@@ -2509,6 +2526,7 @@ static int nfs4_show_deleg(struct seq_file *s, struct nfs4_stid *st)
|
|
|
|
nfs4_show_superblock(s, file);
|
|
seq_printf(s, " }\n");
|
|
+ nfsd_file_put(file);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/include/asm-generic/mmiowb.h b/include/asm-generic/mmiowb.h
|
|
index 9439ff037b2d..5698fca3bf56 100644
|
|
--- a/include/asm-generic/mmiowb.h
|
|
+++ b/include/asm-generic/mmiowb.h
|
|
@@ -27,7 +27,7 @@
|
|
#include <asm/smp.h>
|
|
|
|
DECLARE_PER_CPU(struct mmiowb_state, __mmiowb_state);
|
|
-#define __mmiowb_state() this_cpu_ptr(&__mmiowb_state)
|
|
+#define __mmiowb_state() raw_cpu_ptr(&__mmiowb_state)
|
|
#else
|
|
#define __mmiowb_state() arch_mmiowb_state()
|
|
#endif /* arch_mmiowb_state */
|
|
@@ -35,7 +35,9 @@ DECLARE_PER_CPU(struct mmiowb_state, __mmiowb_state);
|
|
static inline void mmiowb_set_pending(void)
|
|
{
|
|
struct mmiowb_state *ms = __mmiowb_state();
|
|
- ms->mmiowb_pending = ms->nesting_count;
|
|
+
|
|
+ if (likely(ms->nesting_count))
|
|
+ ms->mmiowb_pending = ms->nesting_count;
|
|
}
|
|
|
|
static inline void mmiowb_spin_lock(void)
|
|
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
|
|
index 71e387a5fe90..dc29044d3ed9 100644
|
|
--- a/include/asm-generic/vmlinux.lds.h
|
|
+++ b/include/asm-generic/vmlinux.lds.h
|
|
@@ -341,7 +341,8 @@
|
|
|
|
#define PAGE_ALIGNED_DATA(page_align) \
|
|
. = ALIGN(page_align); \
|
|
- *(.data..page_aligned)
|
|
+ *(.data..page_aligned) \
|
|
+ . = ALIGN(page_align);
|
|
|
|
#define READ_MOSTLY_DATA(align) \
|
|
. = ALIGN(align); \
|
|
@@ -727,7 +728,9 @@
|
|
. = ALIGN(bss_align); \
|
|
.bss : AT(ADDR(.bss) - LOAD_OFFSET) { \
|
|
BSS_FIRST_SECTIONS \
|
|
+ . = ALIGN(PAGE_SIZE); \
|
|
*(.bss..page_aligned) \
|
|
+ . = ALIGN(PAGE_SIZE); \
|
|
*(.dynbss) \
|
|
*(BSS_MAIN) \
|
|
*(COMMON) \
|
|
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h
|
|
index af48d9da3916..2d84ca74cc74 100644
|
|
--- a/include/linux/device-mapper.h
|
|
+++ b/include/linux/device-mapper.h
|
|
@@ -424,6 +424,7 @@ const char *dm_device_name(struct mapped_device *md);
|
|
int dm_copy_name_and_uuid(struct mapped_device *md, char *name, char *uuid);
|
|
struct gendisk *dm_disk(struct mapped_device *md);
|
|
int dm_suspended(struct dm_target *ti);
|
|
+int dm_post_suspending(struct dm_target *ti);
|
|
int dm_noflush_suspending(struct dm_target *ti);
|
|
void dm_accept_partial_bio(struct bio *bio, unsigned n_sectors);
|
|
union map_info *dm_get_rq_mapinfo(struct request *rq);
|
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
|
index 9430d01c0c3d..650794abfa32 100644
|
|
--- a/include/linux/efi.h
|
|
+++ b/include/linux/efi.h
|
|
@@ -991,6 +991,7 @@ int efivars_register(struct efivars *efivars,
|
|
int efivars_unregister(struct efivars *efivars);
|
|
struct kobject *efivars_kobject(void);
|
|
|
|
+int efivar_supports_writes(void);
|
|
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
|
|
void *data, bool duplicates, struct list_head *head);
|
|
|
|
diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h
|
|
index b336622612f3..75eebe7c12f8 100644
|
|
--- a/include/linux/io-mapping.h
|
|
+++ b/include/linux/io-mapping.h
|
|
@@ -107,9 +107,12 @@ io_mapping_init_wc(struct io_mapping *iomap,
|
|
resource_size_t base,
|
|
unsigned long size)
|
|
{
|
|
+ iomap->iomem = ioremap_wc(base, size);
|
|
+ if (!iomap->iomem)
|
|
+ return NULL;
|
|
+
|
|
iomap->base = base;
|
|
iomap->size = size;
|
|
- iomap->iomem = ioremap_wc(base, size);
|
|
#if defined(pgprot_noncached_wc) /* archs can't agree on a name ... */
|
|
iomap->prot = pgprot_noncached_wc(PAGE_KERNEL);
|
|
#elif defined(pgprot_writecombine)
|
|
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
|
|
index 0754b8d71262..8a84f11bf124 100644
|
|
--- a/include/linux/mod_devicetable.h
|
|
+++ b/include/linux/mod_devicetable.h
|
|
@@ -318,7 +318,7 @@ struct pcmcia_device_id {
|
|
#define INPUT_DEVICE_ID_LED_MAX 0x0f
|
|
#define INPUT_DEVICE_ID_SND_MAX 0x07
|
|
#define INPUT_DEVICE_ID_FF_MAX 0x7f
|
|
-#define INPUT_DEVICE_ID_SW_MAX 0x0f
|
|
+#define INPUT_DEVICE_ID_SW_MAX 0x10
|
|
#define INPUT_DEVICE_ID_PROP_MAX 0x1f
|
|
|
|
#define INPUT_DEVICE_ID_MATCH_BUS 1
|
|
diff --git a/include/linux/xattr.h b/include/linux/xattr.h
|
|
index 47eaa34f8761..c5afaf8ca7a2 100644
|
|
--- a/include/linux/xattr.h
|
|
+++ b/include/linux/xattr.h
|
|
@@ -15,6 +15,7 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/types.h>
|
|
#include <linux/spinlock.h>
|
|
+#include <linux/mm.h>
|
|
#include <uapi/linux/xattr.h>
|
|
|
|
struct inode;
|
|
@@ -94,7 +95,7 @@ static inline void simple_xattrs_free(struct simple_xattrs *xattrs)
|
|
|
|
list_for_each_entry_safe(xattr, node, &xattrs->head, list) {
|
|
kfree(xattr->name);
|
|
- kfree(xattr);
|
|
+ kvfree(xattr);
|
|
}
|
|
}
|
|
|
|
diff --git a/include/sound/rt5670.h b/include/sound/rt5670.h
|
|
index f9024c7a1600..02e1d7778354 100644
|
|
--- a/include/sound/rt5670.h
|
|
+++ b/include/sound/rt5670.h
|
|
@@ -12,6 +12,7 @@ struct rt5670_platform_data {
|
|
int jd_mode;
|
|
bool in2_diff;
|
|
bool dev_gpio;
|
|
+ bool gpio1_is_ext_spk_en;
|
|
|
|
bool dmic_en;
|
|
unsigned int dmic1_data_pin;
|
|
diff --git a/include/uapi/linux/idxd.h b/include/uapi/linux/idxd.h
|
|
index 1f412fbf561b..e103c1434e4b 100644
|
|
--- a/include/uapi/linux/idxd.h
|
|
+++ b/include/uapi/linux/idxd.h
|
|
@@ -110,9 +110,12 @@ struct dsa_hw_desc {
|
|
uint16_t rsvd1;
|
|
union {
|
|
uint8_t expected_res;
|
|
+ /* create delta record */
|
|
struct {
|
|
uint64_t delta_addr;
|
|
uint32_t max_delta_size;
|
|
+ uint32_t delt_rsvd;
|
|
+ uint8_t expected_res_mask;
|
|
};
|
|
uint32_t delta_rec_size;
|
|
uint64_t dest2;
|
|
diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
|
|
index b6a835d37826..0c2e27d28e0a 100644
|
|
--- a/include/uapi/linux/input-event-codes.h
|
|
+++ b/include/uapi/linux/input-event-codes.h
|
|
@@ -888,7 +888,8 @@
|
|
#define SW_LINEIN_INSERT 0x0d /* set = inserted */
|
|
#define SW_MUTE_DEVICE 0x0e /* set = device disabled */
|
|
#define SW_PEN_INSERTED 0x0f /* set = pen inserted */
|
|
-#define SW_MAX 0x0f
|
|
+#define SW_MACHINE_COVER 0x10 /* set = cover closed */
|
|
+#define SW_MAX 0x10
|
|
#define SW_CNT (SW_MAX+1)
|
|
|
|
/*
|
|
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
|
|
index 739d9ba3ba6b..eebdd5307713 100644
|
|
--- a/kernel/bpf/verifier.c
|
|
+++ b/kernel/bpf/verifier.c
|
|
@@ -9613,7 +9613,7 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
|
int i, j, subprog_start, subprog_end = 0, len, subprog;
|
|
struct bpf_insn *insn;
|
|
void *old_bpf_func;
|
|
- int err;
|
|
+ int err, num_exentries;
|
|
|
|
if (env->subprog_cnt <= 1)
|
|
return 0;
|
|
@@ -9688,6 +9688,14 @@ static int jit_subprogs(struct bpf_verifier_env *env)
|
|
func[i]->aux->nr_linfo = prog->aux->nr_linfo;
|
|
func[i]->aux->jited_linfo = prog->aux->jited_linfo;
|
|
func[i]->aux->linfo_idx = env->subprog_info[i].linfo_idx;
|
|
+ num_exentries = 0;
|
|
+ insn = func[i]->insnsi;
|
|
+ for (j = 0; j < func[i]->len; j++, insn++) {
|
|
+ if (BPF_CLASS(insn->code) == BPF_LDX &&
|
|
+ BPF_MODE(insn->code) == BPF_PROBE_MEM)
|
|
+ num_exentries++;
|
|
+ }
|
|
+ func[i]->aux->num_exentries = num_exentries;
|
|
func[i] = bpf_int_jit_compile(func[i]);
|
|
if (!func[i]->jited) {
|
|
err = -ENOTSUPP;
|
|
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
|
|
index cc2095607c74..8e1f7165162c 100644
|
|
--- a/kernel/events/uprobes.c
|
|
+++ b/kernel/events/uprobes.c
|
|
@@ -2205,7 +2205,7 @@ static void handle_swbp(struct pt_regs *regs)
|
|
if (!uprobe) {
|
|
if (is_swbp > 0) {
|
|
/* No matching uprobe; signal SIGTRAP. */
|
|
- send_sig(SIGTRAP, current, 0);
|
|
+ force_sig(SIGTRAP);
|
|
} else {
|
|
/*
|
|
* Either we raced with uprobe_unregister() or we can't
|
|
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
|
|
index 4f7cdc55fbe4..461324757c75 100644
|
|
--- a/mm/hugetlb.c
|
|
+++ b/mm/hugetlb.c
|
|
@@ -46,7 +46,10 @@ int hugetlb_max_hstate __read_mostly;
|
|
unsigned int default_hstate_idx;
|
|
struct hstate hstates[HUGE_MAX_HSTATE];
|
|
|
|
+#ifdef CONFIG_CMA
|
|
static struct cma *hugetlb_cma[MAX_NUMNODES];
|
|
+#endif
|
|
+static unsigned long hugetlb_cma_size __initdata;
|
|
|
|
/*
|
|
* Minimum page order among possible hugepage sizes, set to a proper value
|
|
@@ -1236,9 +1239,10 @@ static void free_gigantic_page(struct page *page, unsigned int order)
|
|
* If the page isn't allocated using the cma allocator,
|
|
* cma_release() returns false.
|
|
*/
|
|
- if (IS_ENABLED(CONFIG_CMA) &&
|
|
- cma_release(hugetlb_cma[page_to_nid(page)], page, 1 << order))
|
|
+#ifdef CONFIG_CMA
|
|
+ if (cma_release(hugetlb_cma[page_to_nid(page)], page, 1 << order))
|
|
return;
|
|
+#endif
|
|
|
|
free_contig_range(page_to_pfn(page), 1 << order);
|
|
}
|
|
@@ -1249,7 +1253,8 @@ static struct page *alloc_gigantic_page(struct hstate *h, gfp_t gfp_mask,
|
|
{
|
|
unsigned long nr_pages = 1UL << huge_page_order(h);
|
|
|
|
- if (IS_ENABLED(CONFIG_CMA)) {
|
|
+#ifdef CONFIG_CMA
|
|
+ {
|
|
struct page *page;
|
|
int node;
|
|
|
|
@@ -1263,6 +1268,7 @@ static struct page *alloc_gigantic_page(struct hstate *h, gfp_t gfp_mask,
|
|
return page;
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
return alloc_contig_pages(nr_pages, gfp_mask, nid, nodemask);
|
|
}
|
|
@@ -2572,7 +2578,7 @@ static void __init hugetlb_hstate_alloc_pages(struct hstate *h)
|
|
|
|
for (i = 0; i < h->max_huge_pages; ++i) {
|
|
if (hstate_is_gigantic(h)) {
|
|
- if (IS_ENABLED(CONFIG_CMA) && hugetlb_cma[0]) {
|
|
+ if (hugetlb_cma_size) {
|
|
pr_warn_once("HugeTLB: hugetlb_cma is enabled, skip boot time allocation\n");
|
|
break;
|
|
}
|
|
@@ -5548,7 +5554,6 @@ void move_hugetlb_state(struct page *oldpage, struct page *newpage, int reason)
|
|
}
|
|
|
|
#ifdef CONFIG_CMA
|
|
-static unsigned long hugetlb_cma_size __initdata;
|
|
static bool cma_reserve_called __initdata;
|
|
|
|
static int __init cmdline_parse_hugetlb_cma(char *p)
|
|
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
|
|
index cd280afb246e..e9e7a5659d64 100644
|
|
--- a/mm/khugepaged.c
|
|
+++ b/mm/khugepaged.c
|
|
@@ -873,6 +873,9 @@ static int hugepage_vma_revalidate(struct mm_struct *mm, unsigned long address,
|
|
return SCAN_ADDRESS_RANGE;
|
|
if (!hugepage_vma_check(vma, vma->vm_flags))
|
|
return SCAN_VMA_CHECK;
|
|
+ /* Anon VMA expected */
|
|
+ if (!vma->anon_vma || vma->vm_ops)
|
|
+ return SCAN_VMA_CHECK;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
|
|
index ef0e291a8cf4..9a4a77104d16 100644
|
|
--- a/mm/memcontrol.c
|
|
+++ b/mm/memcontrol.c
|
|
@@ -5658,7 +5658,6 @@ static void __mem_cgroup_clear_mc(void)
|
|
if (!mem_cgroup_is_root(mc.to))
|
|
page_counter_uncharge(&mc.to->memory, mc.moved_swap);
|
|
|
|
- mem_cgroup_id_get_many(mc.to, mc.moved_swap);
|
|
css_put_many(&mc.to->css, mc.moved_swap);
|
|
|
|
mc.moved_swap = 0;
|
|
@@ -5849,7 +5848,8 @@ put: /* get_mctgt_type() gets the page */
|
|
ent = target.ent;
|
|
if (!mem_cgroup_move_swap_account(ent, mc.from, mc.to)) {
|
|
mc.precharge--;
|
|
- /* we fixup refcnts and charges later. */
|
|
+ mem_cgroup_id_get_many(mc.to, 1);
|
|
+ /* we fixup other refcnts and charges later. */
|
|
mc.moved_swap++;
|
|
}
|
|
break;
|
|
diff --git a/mm/mmap.c b/mm/mmap.c
|
|
index f609e9ec4a25..bb1822ac9909 100644
|
|
--- a/mm/mmap.c
|
|
+++ b/mm/mmap.c
|
|
@@ -2620,7 +2620,7 @@ static void unmap_region(struct mm_struct *mm,
|
|
* Create a list of vma's touched by the unmap, removing them from the mm's
|
|
* vma list as we go..
|
|
*/
|
|
-static void
|
|
+static bool
|
|
detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
struct vm_area_struct *prev, unsigned long end)
|
|
{
|
|
@@ -2645,6 +2645,17 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
|
/* Kill the cache */
|
|
vmacache_invalidate(mm);
|
|
+
|
|
+ /*
|
|
+ * Do not downgrade mmap_lock if we are next to VM_GROWSDOWN or
|
|
+ * VM_GROWSUP VMA. Such VMAs can change their size under
|
|
+ * down_read(mmap_lock) and collide with the VMA we are about to unmap.
|
|
+ */
|
|
+ if (vma && (vma->vm_flags & VM_GROWSDOWN))
|
|
+ return false;
|
|
+ if (prev && (prev->vm_flags & VM_GROWSUP))
|
|
+ return false;
|
|
+ return true;
|
|
}
|
|
|
|
/*
|
|
@@ -2825,7 +2836,8 @@ int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len,
|
|
}
|
|
|
|
/* Detach vmas from rbtree */
|
|
- detach_vmas_to_be_unmapped(mm, vma, prev, end);
|
|
+ if (!detach_vmas_to_be_unmapped(mm, vma, prev, end))
|
|
+ downgrade = false;
|
|
|
|
if (downgrade)
|
|
downgrade_write(&mm->mmap_sem);
|
|
diff --git a/mm/shmem.c b/mm/shmem.c
|
|
index bd8840082c94..97b4a47e9767 100644
|
|
--- a/mm/shmem.c
|
|
+++ b/mm/shmem.c
|
|
@@ -3205,7 +3205,7 @@ static int shmem_initxattrs(struct inode *inode,
|
|
new_xattr->name = kmalloc(XATTR_SECURITY_PREFIX_LEN + len,
|
|
GFP_KERNEL);
|
|
if (!new_xattr->name) {
|
|
- kfree(new_xattr);
|
|
+ kvfree(new_xattr);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
diff --git a/mm/slab_common.c b/mm/slab_common.c
|
|
index 37d48a56431d..fe8b68482670 100644
|
|
--- a/mm/slab_common.c
|
|
+++ b/mm/slab_common.c
|
|
@@ -326,6 +326,14 @@ int slab_unmergeable(struct kmem_cache *s)
|
|
if (s->refcount < 0)
|
|
return 1;
|
|
|
|
+#ifdef CONFIG_MEMCG_KMEM
|
|
+ /*
|
|
+ * Skip the dying kmem_cache.
|
|
+ */
|
|
+ if (s->memcg_params.dying)
|
|
+ return 1;
|
|
+#endif
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
@@ -886,12 +894,15 @@ static int shutdown_memcg_caches(struct kmem_cache *s)
|
|
return 0;
|
|
}
|
|
|
|
-static void flush_memcg_workqueue(struct kmem_cache *s)
|
|
+static void memcg_set_kmem_cache_dying(struct kmem_cache *s)
|
|
{
|
|
spin_lock_irq(&memcg_kmem_wq_lock);
|
|
s->memcg_params.dying = true;
|
|
spin_unlock_irq(&memcg_kmem_wq_lock);
|
|
+}
|
|
|
|
+static void flush_memcg_workqueue(struct kmem_cache *s)
|
|
+{
|
|
/*
|
|
* SLAB and SLUB deactivate the kmem_caches through call_rcu. Make
|
|
* sure all registered rcu callbacks have been invoked.
|
|
@@ -923,10 +934,6 @@ static inline int shutdown_memcg_caches(struct kmem_cache *s)
|
|
{
|
|
return 0;
|
|
}
|
|
-
|
|
-static inline void flush_memcg_workqueue(struct kmem_cache *s)
|
|
-{
|
|
-}
|
|
#endif /* CONFIG_MEMCG_KMEM */
|
|
|
|
void slab_kmem_cache_release(struct kmem_cache *s)
|
|
@@ -944,8 +951,6 @@ void kmem_cache_destroy(struct kmem_cache *s)
|
|
if (unlikely(!s))
|
|
return;
|
|
|
|
- flush_memcg_workqueue(s);
|
|
-
|
|
get_online_cpus();
|
|
get_online_mems();
|
|
|
|
@@ -955,6 +960,22 @@ void kmem_cache_destroy(struct kmem_cache *s)
|
|
if (s->refcount)
|
|
goto out_unlock;
|
|
|
|
+#ifdef CONFIG_MEMCG_KMEM
|
|
+ memcg_set_kmem_cache_dying(s);
|
|
+
|
|
+ mutex_unlock(&slab_mutex);
|
|
+
|
|
+ put_online_mems();
|
|
+ put_online_cpus();
|
|
+
|
|
+ flush_memcg_workqueue(s);
|
|
+
|
|
+ get_online_cpus();
|
|
+ get_online_mems();
|
|
+
|
|
+ mutex_lock(&slab_mutex);
|
|
+#endif
|
|
+
|
|
err = shutdown_memcg_caches(s);
|
|
if (!err)
|
|
err = shutdown_cache(s);
|
|
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
|
|
index 91a13aee4378..961f37c0701b 100644
|
|
--- a/net/mac80211/rx.c
|
|
+++ b/net/mac80211/rx.c
|
|
@@ -2357,6 +2357,7 @@ static int ieee80211_802_1x_port_control(struct ieee80211_rx_data *rx)
|
|
|
|
static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
|
|
{
|
|
+ struct ieee80211_hdr *hdr = (void *)rx->skb->data;
|
|
struct sk_buff *skb = rx->skb;
|
|
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
|
|
|
|
@@ -2367,6 +2368,31 @@ static int ieee80211_drop_unencrypted(struct ieee80211_rx_data *rx, __le16 fc)
|
|
if (status->flag & RX_FLAG_DECRYPTED)
|
|
return 0;
|
|
|
|
+ /* check mesh EAPOL frames first */
|
|
+ if (unlikely(rx->sta && ieee80211_vif_is_mesh(&rx->sdata->vif) &&
|
|
+ ieee80211_is_data(fc))) {
|
|
+ struct ieee80211s_hdr *mesh_hdr;
|
|
+ u16 hdr_len = ieee80211_hdrlen(fc);
|
|
+ u16 ethertype_offset;
|
|
+ __be16 ethertype;
|
|
+
|
|
+ if (!ether_addr_equal(hdr->addr1, rx->sdata->vif.addr))
|
|
+ goto drop_check;
|
|
+
|
|
+ /* make sure fixed part of mesh header is there, also checks skb len */
|
|
+ if (!pskb_may_pull(rx->skb, hdr_len + 6))
|
|
+ goto drop_check;
|
|
+
|
|
+ mesh_hdr = (struct ieee80211s_hdr *)(skb->data + hdr_len);
|
|
+ ethertype_offset = hdr_len + ieee80211_get_mesh_hdrlen(mesh_hdr) +
|
|
+ sizeof(rfc1042_header);
|
|
+
|
|
+ if (skb_copy_bits(rx->skb, ethertype_offset, ðertype, 2) == 0 &&
|
|
+ ethertype == rx->sdata->control_port_protocol)
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+drop_check:
|
|
/* Drop unencrypted frames if key is set. */
|
|
if (unlikely(!ieee80211_has_protected(fc) &&
|
|
!ieee80211_is_any_nullfunc(fc) &&
|
|
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
|
|
index 605e0f68f8bd..2b8abbfe018c 100644
|
|
--- a/net/netfilter/ipvs/ip_vs_sync.c
|
|
+++ b/net/netfilter/ipvs/ip_vs_sync.c
|
|
@@ -1717,6 +1717,8 @@ static int sync_thread_backup(void *data)
|
|
{
|
|
struct ip_vs_sync_thread_data *tinfo = data;
|
|
struct netns_ipvs *ipvs = tinfo->ipvs;
|
|
+ struct sock *sk = tinfo->sock->sk;
|
|
+ struct udp_sock *up = udp_sk(sk);
|
|
int len;
|
|
|
|
pr_info("sync thread started: state = BACKUP, mcast_ifn = %s, "
|
|
@@ -1724,12 +1726,14 @@ static int sync_thread_backup(void *data)
|
|
ipvs->bcfg.mcast_ifn, ipvs->bcfg.syncid, tinfo->id);
|
|
|
|
while (!kthread_should_stop()) {
|
|
- wait_event_interruptible(*sk_sleep(tinfo->sock->sk),
|
|
- !skb_queue_empty(&tinfo->sock->sk->sk_receive_queue)
|
|
- || kthread_should_stop());
|
|
+ wait_event_interruptible(*sk_sleep(sk),
|
|
+ !skb_queue_empty_lockless(&sk->sk_receive_queue) ||
|
|
+ !skb_queue_empty_lockless(&up->reader_queue) ||
|
|
+ kthread_should_stop());
|
|
|
|
/* do we have data now? */
|
|
- while (!skb_queue_empty(&(tinfo->sock->sk->sk_receive_queue))) {
|
|
+ while (!skb_queue_empty_lockless(&sk->sk_receive_queue) ||
|
|
+ !skb_queue_empty_lockless(&up->reader_queue)) {
|
|
len = ip_vs_receive(tinfo->sock, tinfo->buf,
|
|
ipvs->bcfg.sync_maxlen);
|
|
if (len <= 0) {
|
|
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
|
|
index 9780bd93b7e4..e1d678af8749 100644
|
|
--- a/net/netfilter/nf_tables_api.c
|
|
+++ b/net/netfilter/nf_tables_api.c
|
|
@@ -188,24 +188,6 @@ static void nft_netdev_unregister_hooks(struct net *net,
|
|
nf_unregister_net_hook(net, &hook->ops);
|
|
}
|
|
|
|
-static int nft_register_basechain_hooks(struct net *net, int family,
|
|
- struct nft_base_chain *basechain)
|
|
-{
|
|
- if (family == NFPROTO_NETDEV)
|
|
- return nft_netdev_register_hooks(net, &basechain->hook_list);
|
|
-
|
|
- return nf_register_net_hook(net, &basechain->ops);
|
|
-}
|
|
-
|
|
-static void nft_unregister_basechain_hooks(struct net *net, int family,
|
|
- struct nft_base_chain *basechain)
|
|
-{
|
|
- if (family == NFPROTO_NETDEV)
|
|
- nft_netdev_unregister_hooks(net, &basechain->hook_list);
|
|
- else
|
|
- nf_unregister_net_hook(net, &basechain->ops);
|
|
-}
|
|
-
|
|
static int nf_tables_register_hook(struct net *net,
|
|
const struct nft_table *table,
|
|
struct nft_chain *chain)
|
|
@@ -223,7 +205,10 @@ static int nf_tables_register_hook(struct net *net,
|
|
if (basechain->type->ops_register)
|
|
return basechain->type->ops_register(net, ops);
|
|
|
|
- return nft_register_basechain_hooks(net, table->family, basechain);
|
|
+ if (table->family == NFPROTO_NETDEV)
|
|
+ return nft_netdev_register_hooks(net, &basechain->hook_list);
|
|
+
|
|
+ return nf_register_net_hook(net, &basechain->ops);
|
|
}
|
|
|
|
static void nf_tables_unregister_hook(struct net *net,
|
|
@@ -242,7 +227,10 @@ static void nf_tables_unregister_hook(struct net *net,
|
|
if (basechain->type->ops_unregister)
|
|
return basechain->type->ops_unregister(net, ops);
|
|
|
|
- nft_unregister_basechain_hooks(net, table->family, basechain);
|
|
+ if (table->family == NFPROTO_NETDEV)
|
|
+ nft_netdev_unregister_hooks(net, &basechain->hook_list);
|
|
+ else
|
|
+ nf_unregister_net_hook(net, &basechain->ops);
|
|
}
|
|
|
|
static int nft_trans_table_add(struct nft_ctx *ctx, int msg_type)
|
|
@@ -832,8 +820,7 @@ static void nft_table_disable(struct net *net, struct nft_table *table, u32 cnt)
|
|
if (cnt && i++ == cnt)
|
|
break;
|
|
|
|
- nft_unregister_basechain_hooks(net, table->family,
|
|
- nft_base_chain(chain));
|
|
+ nf_tables_unregister_hook(net, table, chain);
|
|
}
|
|
}
|
|
|
|
@@ -848,8 +835,7 @@ static int nf_tables_table_enable(struct net *net, struct nft_table *table)
|
|
if (!nft_is_base_chain(chain))
|
|
continue;
|
|
|
|
- err = nft_register_basechain_hooks(net, table->family,
|
|
- nft_base_chain(chain));
|
|
+ err = nf_tables_register_hook(net, table, chain);
|
|
if (err < 0)
|
|
goto err_register_hooks;
|
|
|
|
@@ -894,11 +880,12 @@ static int nf_tables_updtable(struct nft_ctx *ctx)
|
|
nft_trans_table_enable(trans) = false;
|
|
} else if (!(flags & NFT_TABLE_F_DORMANT) &&
|
|
ctx->table->flags & NFT_TABLE_F_DORMANT) {
|
|
+ ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
|
|
ret = nf_tables_table_enable(ctx->net, ctx->table);
|
|
- if (ret >= 0) {
|
|
- ctx->table->flags &= ~NFT_TABLE_F_DORMANT;
|
|
+ if (ret >= 0)
|
|
nft_trans_table_enable(trans) = true;
|
|
- }
|
|
+ else
|
|
+ ctx->table->flags |= NFT_TABLE_F_DORMANT;
|
|
}
|
|
if (ret < 0)
|
|
goto err;
|
|
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
|
|
index dfbaf6bd8b1c..2700a63ab095 100644
|
|
--- a/net/vmw_vsock/virtio_transport.c
|
|
+++ b/net/vmw_vsock/virtio_transport.c
|
|
@@ -22,7 +22,7 @@
|
|
#include <net/af_vsock.h>
|
|
|
|
static struct workqueue_struct *virtio_vsock_workqueue;
|
|
-static struct virtio_vsock *the_virtio_vsock;
|
|
+static struct virtio_vsock __rcu *the_virtio_vsock;
|
|
static DEFINE_MUTEX(the_virtio_vsock_mutex); /* protects the_virtio_vsock */
|
|
|
|
struct virtio_vsock {
|
|
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
|
|
index 13e5fbafdf2f..fe7076fdac8a 100755
|
|
--- a/scripts/decode_stacktrace.sh
|
|
+++ b/scripts/decode_stacktrace.sh
|
|
@@ -84,8 +84,8 @@ parse_symbol() {
|
|
return
|
|
fi
|
|
|
|
- # Strip out the base of the path
|
|
- code=${code#$basepath/}
|
|
+ # Strip out the base of the path on each line
|
|
+ code=$(while read -r line; do echo "${line#$basepath/}"; done <<< "$code")
|
|
|
|
# In the case of inlines, move everything to same line
|
|
code=${code//$'\n'/' '}
|
|
diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py
|
|
index be984aa29b75..1be9763cf8bb 100644
|
|
--- a/scripts/gdb/linux/symbols.py
|
|
+++ b/scripts/gdb/linux/symbols.py
|
|
@@ -96,7 +96,7 @@ lx-symbols command."""
|
|
return ""
|
|
attrs = sect_attrs['attrs']
|
|
section_name_to_address = {
|
|
- attrs[n]['name'].string(): attrs[n]['address']
|
|
+ attrs[n]['battr']['attr']['name'].string(): attrs[n]['address']
|
|
for n in range(int(sect_attrs['nsections']))}
|
|
args = []
|
|
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss",
|
|
diff --git a/sound/core/info.c b/sound/core/info.c
|
|
index 8c6bc5241df5..9fec3070f8ba 100644
|
|
--- a/sound/core/info.c
|
|
+++ b/sound/core/info.c
|
|
@@ -606,7 +606,9 @@ int snd_info_get_line(struct snd_info_buffer *buffer, char *line, int len)
|
|
{
|
|
int c;
|
|
|
|
- if (snd_BUG_ON(!buffer || !buffer->buffer))
|
|
+ if (snd_BUG_ON(!buffer))
|
|
+ return 1;
|
|
+ if (!buffer->buffer)
|
|
return 1;
|
|
if (len <= 0 || buffer->stop || buffer->error)
|
|
return 1;
|
|
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
|
|
index 137d655fed8f..e821c9df8107 100644
|
|
--- a/sound/pci/hda/patch_hdmi.c
|
|
+++ b/sound/pci/hda/patch_hdmi.c
|
|
@@ -1804,33 +1804,43 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
|
|
|
|
static int hdmi_parse_codec(struct hda_codec *codec)
|
|
{
|
|
- hda_nid_t nid;
|
|
+ hda_nid_t start_nid;
|
|
+ unsigned int caps;
|
|
int i, nodes;
|
|
|
|
- nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &nid);
|
|
- if (!nid || nodes < 0) {
|
|
+ nodes = snd_hda_get_sub_nodes(codec, codec->core.afg, &start_nid);
|
|
+ if (!start_nid || nodes < 0) {
|
|
codec_warn(codec, "HDMI: failed to get afg sub nodes\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
- for (i = 0; i < nodes; i++, nid++) {
|
|
- unsigned int caps;
|
|
- unsigned int type;
|
|
+ /*
|
|
+ * hdmi_add_pin() assumes total amount of converters to
|
|
+ * be known, so first discover all converters
|
|
+ */
|
|
+ for (i = 0; i < nodes; i++) {
|
|
+ hda_nid_t nid = start_nid + i;
|
|
|
|
caps = get_wcaps(codec, nid);
|
|
- type = get_wcaps_type(caps);
|
|
|
|
if (!(caps & AC_WCAP_DIGITAL))
|
|
continue;
|
|
|
|
- switch (type) {
|
|
- case AC_WID_AUD_OUT:
|
|
+ if (get_wcaps_type(caps) == AC_WID_AUD_OUT)
|
|
hdmi_add_cvt(codec, nid);
|
|
- break;
|
|
- case AC_WID_PIN:
|
|
+ }
|
|
+
|
|
+ /* discover audio pins */
|
|
+ for (i = 0; i < nodes; i++) {
|
|
+ hda_nid_t nid = start_nid + i;
|
|
+
|
|
+ caps = get_wcaps(codec, nid);
|
|
+
|
|
+ if (!(caps & AC_WCAP_DIGITAL))
|
|
+ continue;
|
|
+
|
|
+ if (get_wcaps_type(caps) == AC_WID_PIN)
|
|
hdmi_add_pin(codec, nid);
|
|
- break;
|
|
- }
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index d80eed2a48a1..27dd8945d6e6 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -7546,11 +7546,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
|
|
SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
|
|
+ SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC225_FIXUP_HEADSET_JACK),
|
|
SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
|
|
SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
|
|
SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
|
SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
|
SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
|
|
+ SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
|
|
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
|
|
SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
|
|
diff --git a/sound/soc/codecs/rt5670.c b/sound/soc/codecs/rt5670.c
|
|
index 70fee6849ab0..f21181734170 100644
|
|
--- a/sound/soc/codecs/rt5670.c
|
|
+++ b/sound/soc/codecs/rt5670.c
|
|
@@ -31,18 +31,19 @@
|
|
#include "rt5670.h"
|
|
#include "rt5670-dsp.h"
|
|
|
|
-#define RT5670_DEV_GPIO BIT(0)
|
|
-#define RT5670_IN2_DIFF BIT(1)
|
|
-#define RT5670_DMIC_EN BIT(2)
|
|
-#define RT5670_DMIC1_IN2P BIT(3)
|
|
-#define RT5670_DMIC1_GPIO6 BIT(4)
|
|
-#define RT5670_DMIC1_GPIO7 BIT(5)
|
|
-#define RT5670_DMIC2_INR BIT(6)
|
|
-#define RT5670_DMIC2_GPIO8 BIT(7)
|
|
-#define RT5670_DMIC3_GPIO5 BIT(8)
|
|
-#define RT5670_JD_MODE1 BIT(9)
|
|
-#define RT5670_JD_MODE2 BIT(10)
|
|
-#define RT5670_JD_MODE3 BIT(11)
|
|
+#define RT5670_DEV_GPIO BIT(0)
|
|
+#define RT5670_IN2_DIFF BIT(1)
|
|
+#define RT5670_DMIC_EN BIT(2)
|
|
+#define RT5670_DMIC1_IN2P BIT(3)
|
|
+#define RT5670_DMIC1_GPIO6 BIT(4)
|
|
+#define RT5670_DMIC1_GPIO7 BIT(5)
|
|
+#define RT5670_DMIC2_INR BIT(6)
|
|
+#define RT5670_DMIC2_GPIO8 BIT(7)
|
|
+#define RT5670_DMIC3_GPIO5 BIT(8)
|
|
+#define RT5670_JD_MODE1 BIT(9)
|
|
+#define RT5670_JD_MODE2 BIT(10)
|
|
+#define RT5670_JD_MODE3 BIT(11)
|
|
+#define RT5670_GPIO1_IS_EXT_SPK_EN BIT(12)
|
|
|
|
static unsigned long rt5670_quirk;
|
|
static unsigned int quirk_override;
|
|
@@ -1447,6 +1448,33 @@ static int rt5670_hp_event(struct snd_soc_dapm_widget *w,
|
|
return 0;
|
|
}
|
|
|
|
+static int rt5670_spk_event(struct snd_soc_dapm_widget *w,
|
|
+ struct snd_kcontrol *kcontrol, int event)
|
|
+{
|
|
+ struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
|
|
+ struct rt5670_priv *rt5670 = snd_soc_component_get_drvdata(component);
|
|
+
|
|
+ if (!rt5670->pdata.gpio1_is_ext_spk_en)
|
|
+ return 0;
|
|
+
|
|
+ switch (event) {
|
|
+ case SND_SOC_DAPM_POST_PMU:
|
|
+ regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
|
|
+ RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_HI);
|
|
+ break;
|
|
+
|
|
+ case SND_SOC_DAPM_PRE_PMD:
|
|
+ regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
|
|
+ RT5670_GP1_OUT_MASK, RT5670_GP1_OUT_LO);
|
|
+ break;
|
|
+
|
|
+ default:
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
static int rt5670_bst1_event(struct snd_soc_dapm_widget *w,
|
|
struct snd_kcontrol *kcontrol, int event)
|
|
{
|
|
@@ -1860,7 +1888,9 @@ static const struct snd_soc_dapm_widget rt5670_specific_dapm_widgets[] = {
|
|
};
|
|
|
|
static const struct snd_soc_dapm_widget rt5672_specific_dapm_widgets[] = {
|
|
- SND_SOC_DAPM_PGA("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0),
|
|
+ SND_SOC_DAPM_PGA_E("SPO Amp", SND_SOC_NOPM, 0, 0, NULL, 0,
|
|
+ rt5670_spk_event, SND_SOC_DAPM_PRE_PMD |
|
|
+ SND_SOC_DAPM_POST_PMU),
|
|
SND_SOC_DAPM_OUTPUT("SPOLP"),
|
|
SND_SOC_DAPM_OUTPUT("SPOLN"),
|
|
SND_SOC_DAPM_OUTPUT("SPORP"),
|
|
@@ -2857,14 +2887,14 @@ static const struct dmi_system_id dmi_platform_intel_quirks[] = {
|
|
},
|
|
{
|
|
.callback = rt5670_quirk_cb,
|
|
- .ident = "Lenovo Thinkpad Tablet 10",
|
|
+ .ident = "Lenovo Miix 2 10",
|
|
.matches = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Miix 2 10"),
|
|
},
|
|
.driver_data = (unsigned long *)(RT5670_DMIC_EN |
|
|
RT5670_DMIC1_IN2P |
|
|
- RT5670_DEV_GPIO |
|
|
+ RT5670_GPIO1_IS_EXT_SPK_EN |
|
|
RT5670_JD_MODE2),
|
|
},
|
|
{
|
|
@@ -2924,6 +2954,10 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
|
|
rt5670->pdata.dev_gpio = true;
|
|
dev_info(&i2c->dev, "quirk dev_gpio\n");
|
|
}
|
|
+ if (rt5670_quirk & RT5670_GPIO1_IS_EXT_SPK_EN) {
|
|
+ rt5670->pdata.gpio1_is_ext_spk_en = true;
|
|
+ dev_info(&i2c->dev, "quirk GPIO1 is external speaker enable\n");
|
|
+ }
|
|
if (rt5670_quirk & RT5670_IN2_DIFF) {
|
|
rt5670->pdata.in2_diff = true;
|
|
dev_info(&i2c->dev, "quirk IN2_DIFF\n");
|
|
@@ -3023,6 +3057,13 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
|
|
RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
|
|
}
|
|
|
|
+ if (rt5670->pdata.gpio1_is_ext_spk_en) {
|
|
+ regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL1,
|
|
+ RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_GPIO1);
|
|
+ regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
|
|
+ RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
|
|
+ }
|
|
+
|
|
if (rt5670->pdata.jd_mode) {
|
|
regmap_update_bits(rt5670->regmap, RT5670_GLB_CLK,
|
|
RT5670_SCLK_SRC_MASK, RT5670_SCLK_SRC_RCCLK);
|
|
diff --git a/sound/soc/codecs/rt5670.h b/sound/soc/codecs/rt5670.h
|
|
index a8c3e44770b8..de0203369b7c 100644
|
|
--- a/sound/soc/codecs/rt5670.h
|
|
+++ b/sound/soc/codecs/rt5670.h
|
|
@@ -757,7 +757,7 @@
|
|
#define RT5670_PWR_VREF2_BIT 4
|
|
#define RT5670_PWR_FV2 (0x1 << 3)
|
|
#define RT5670_PWR_FV2_BIT 3
|
|
-#define RT5670_LDO_SEL_MASK (0x3)
|
|
+#define RT5670_LDO_SEL_MASK (0x7)
|
|
#define RT5670_LDO_SEL_SFT 0
|
|
|
|
/* Power Management for Analog 2 (0x64) */
|
|
diff --git a/sound/soc/intel/boards/bdw-rt5677.c b/sound/soc/intel/boards/bdw-rt5677.c
|
|
index cc41a348295e..fa12a85f535a 100644
|
|
--- a/sound/soc/intel/boards/bdw-rt5677.c
|
|
+++ b/sound/soc/intel/boards/bdw-rt5677.c
|
|
@@ -328,6 +328,7 @@ static struct snd_soc_dai_link bdw_rt5677_dais[] = {
|
|
{
|
|
.name = "Codec DSP",
|
|
.stream_name = "Wake on Voice",
|
|
+ .capture_only = 1,
|
|
.ops = &bdw_rt5677_dsp_ops,
|
|
SND_SOC_DAILINK_REG(dsp),
|
|
},
|
|
diff --git a/sound/soc/intel/boards/bytcht_es8316.c b/sound/soc/intel/boards/bytcht_es8316.c
|
|
index ddcd070100ef..b3fd7de594d7 100644
|
|
--- a/sound/soc/intel/boards/bytcht_es8316.c
|
|
+++ b/sound/soc/intel/boards/bytcht_es8316.c
|
|
@@ -543,8 +543,10 @@ static int snd_byt_cht_es8316_mc_probe(struct platform_device *pdev)
|
|
|
|
if (cnt) {
|
|
ret = device_add_properties(codec_dev, props);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ put_device(codec_dev);
|
|
return ret;
|
|
+ }
|
|
}
|
|
|
|
devm_acpi_dev_add_driver_gpios(codec_dev, byt_cht_es8316_gpios);
|
|
diff --git a/sound/soc/intel/boards/cht_bsw_rt5672.c b/sound/soc/intel/boards/cht_bsw_rt5672.c
|
|
index 097023a3ec14..a3aa2c1f7097 100644
|
|
--- a/sound/soc/intel/boards/cht_bsw_rt5672.c
|
|
+++ b/sound/soc/intel/boards/cht_bsw_rt5672.c
|
|
@@ -253,21 +253,20 @@ static int cht_codec_fixup(struct snd_soc_pcm_runtime *rtd,
|
|
params_set_format(params, SNDRV_PCM_FORMAT_S24_LE);
|
|
|
|
/*
|
|
- * Default mode for SSP configuration is TDM 4 slot
|
|
+ * Default mode for SSP configuration is TDM 4 slot. One board/design,
|
|
+ * the Lenovo Miix 2 10 uses not 1 but 2 codecs connected to SSP2. The
|
|
+ * second piggy-backed, output-only codec is inside the keyboard-dock
|
|
+ * (which has extra speakers). Unlike the main rt5672 codec, we cannot
|
|
+ * configure this codec, it is hard coded to use 2 channel 24 bit I2S.
|
|
+ * Since we only support 2 channels anyways, there is no need for TDM
|
|
+ * on any cht-bsw-rt5672 designs. So we simply use I2S 2ch everywhere.
|
|
*/
|
|
- ret = snd_soc_dai_set_fmt(asoc_rtd_to_codec(rtd, 0),
|
|
- SND_SOC_DAIFMT_DSP_B |
|
|
- SND_SOC_DAIFMT_IB_NF |
|
|
+ ret = snd_soc_dai_set_fmt(asoc_rtd_to_cpu(rtd, 0),
|
|
+ SND_SOC_DAIFMT_I2S |
|
|
+ SND_SOC_DAIFMT_NB_NF |
|
|
SND_SOC_DAIFMT_CBS_CFS);
|
|
if (ret < 0) {
|
|
- dev_err(rtd->dev, "can't set format to TDM %d\n", ret);
|
|
- return ret;
|
|
- }
|
|
-
|
|
- /* TDM 4 slots 24 bit, set Rx & Tx bitmask to 4 active slots */
|
|
- ret = snd_soc_dai_set_tdm_slot(asoc_rtd_to_codec(rtd, 0), 0xF, 0xF, 4, 24);
|
|
- if (ret < 0) {
|
|
- dev_err(rtd->dev, "can't set codec TDM slot %d\n", ret);
|
|
+ dev_err(rtd->dev, "can't set format to I2S, err %d\n", ret);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/sound/soc/qcom/Kconfig b/sound/soc/qcom/Kconfig
|
|
index f51b28d1b94d..92f51d0e9fe2 100644
|
|
--- a/sound/soc/qcom/Kconfig
|
|
+++ b/sound/soc/qcom/Kconfig
|
|
@@ -72,7 +72,7 @@ config SND_SOC_QDSP6_ASM_DAI
|
|
|
|
config SND_SOC_QDSP6
|
|
tristate "SoC ALSA audio driver for QDSP6"
|
|
- depends on QCOM_APR && HAS_DMA
|
|
+ depends on QCOM_APR
|
|
select SND_SOC_QDSP6_COMMON
|
|
select SND_SOC_QDSP6_CORE
|
|
select SND_SOC_QDSP6_AFE
|
|
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
|
|
index 6df3b0d12d87..31250a14c21d 100644
|
|
--- a/sound/soc/soc-topology.c
|
|
+++ b/sound/soc/soc-topology.c
|
|
@@ -1285,17 +1285,29 @@ static int soc_tplg_dapm_graph_elems_load(struct soc_tplg *tplg,
|
|
list_add(&routes[i]->dobj.list, &tplg->comp->dobj_list);
|
|
|
|
ret = soc_tplg_add_route(tplg, routes[i]);
|
|
- if (ret < 0)
|
|
+ if (ret < 0) {
|
|
+ /*
|
|
+ * this route was added to the list, it will
|
|
+ * be freed in remove_route() so increment the
|
|
+ * counter to skip it in the error handling
|
|
+ * below.
|
|
+ */
|
|
+ i++;
|
|
break;
|
|
+ }
|
|
|
|
/* add route, but keep going if some fail */
|
|
snd_soc_dapm_add_routes(dapm, routes[i], 1);
|
|
}
|
|
|
|
- /* free memory allocated for all dapm routes in case of error */
|
|
- if (ret < 0)
|
|
- for (i = 0; i < count ; i++)
|
|
- kfree(routes[i]);
|
|
+ /*
|
|
+ * free memory allocated for all dapm routes not added to the
|
|
+ * list in case of error
|
|
+ */
|
|
+ if (ret < 0) {
|
|
+ while (i < count)
|
|
+ kfree(routes[i++]);
|
|
+ }
|
|
|
|
/*
|
|
* free pointer to array of dapm routes as this is no longer needed.
|
|
@@ -1383,7 +1395,6 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(
|
|
if (err < 0) {
|
|
dev_err(tplg->dev, "ASoC: failed to init %s\n",
|
|
mc->hdr.name);
|
|
- soc_tplg_free_tlv(tplg, &kc[i]);
|
|
goto err_sm;
|
|
}
|
|
}
|
|
@@ -1391,6 +1402,7 @@ static struct snd_kcontrol_new *soc_tplg_dapm_widget_dmixer_create(
|
|
|
|
err_sm:
|
|
for (; i >= 0; i--) {
|
|
+ soc_tplg_free_tlv(tplg, &kc[i]);
|
|
sm = (struct soc_mixer_control *)kc[i].private_value;
|
|
kfree(sm);
|
|
kfree(kc[i].name);
|
|
diff --git a/tools/perf/pmu-events/arch/s390/cf_z15/extended.json b/tools/perf/pmu-events/arch/s390/cf_z15/extended.json
|
|
index 2df2e231e9ee..24c4ba2a9ae5 100644
|
|
--- a/tools/perf/pmu-events/arch/s390/cf_z15/extended.json
|
|
+++ b/tools/perf/pmu-events/arch/s390/cf_z15/extended.json
|
|
@@ -380,7 +380,7 @@
|
|
{
|
|
"Unit": "CPU-M-CF",
|
|
"EventCode": "265",
|
|
- "EventName": "DFLT_CCERROR",
|
|
+ "EventName": "DFLT_CCFINISH",
|
|
"BriefDescription": "Increments by one for every DEFLATE CONVERSION CALL instruction executed that ended in Condition Codes 0, 1 or 2",
|
|
"PublicDescription": "Increments by one for every DEFLATE CONVERSION CALL instruction executed that ended in Condition Codes 0, 1 or 2"
|
|
},
|