mirror of
https://github.com/armbian/build.git
synced 2025-08-13 06:36:58 +02:00
10847 lines
360 KiB
Diff
10847 lines
360 KiB
Diff
diff --git a/Documentation/ABI/testing/evm b/Documentation/ABI/testing/evm
|
|
index 201d10319fa18..1df1177df68ad 100644
|
|
--- a/Documentation/ABI/testing/evm
|
|
+++ b/Documentation/ABI/testing/evm
|
|
@@ -42,8 +42,30 @@ Description:
|
|
modification of EVM-protected metadata and
|
|
disable all further modification of policy
|
|
|
|
- Note that once a key has been loaded, it will no longer be
|
|
- possible to enable metadata modification.
|
|
+ Echoing a value is additive, the new value is added to the
|
|
+ existing initialization flags.
|
|
+
|
|
+ For example, after::
|
|
+
|
|
+ echo 2 ><securityfs>/evm
|
|
+
|
|
+ another echo can be performed::
|
|
+
|
|
+ echo 1 ><securityfs>/evm
|
|
+
|
|
+ and the resulting value will be 3.
|
|
+
|
|
+ Note that once an HMAC key has been loaded, it will no longer
|
|
+ be possible to enable metadata modification. Signaling that an
|
|
+ HMAC key has been loaded will clear the corresponding flag.
|
|
+ For example, if the current value is 6 (2 and 4 set)::
|
|
+
|
|
+ echo 1 ><securityfs>/evm
|
|
+
|
|
+ will set the new value to 3 (4 cleared).
|
|
+
|
|
+ Loading an HMAC key is the only way to disable metadata
|
|
+ modification.
|
|
|
|
Until key loading has been signaled EVM can not create
|
|
or validate the 'security.evm' xattr, but returns
|
|
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
|
|
index a19ae163c0589..dbb68067ba4ea 100644
|
|
--- a/Documentation/admin-guide/kernel-parameters.txt
|
|
+++ b/Documentation/admin-guide/kernel-parameters.txt
|
|
@@ -567,6 +567,12 @@
|
|
loops can be debugged more effectively on production
|
|
systems.
|
|
|
|
+ clocksource.max_cswd_read_retries= [KNL]
|
|
+ Number of clocksource_watchdog() retries due to
|
|
+ external delays before the clock will be marked
|
|
+ unstable. Defaults to three retries, that is,
|
|
+ four attempts to read the clock under test.
|
|
+
|
|
clearcpuid=BITNUM[,BITNUM...] [X86]
|
|
Disable CPUID feature X for the kernel. See
|
|
arch/x86/include/asm/cpufeatures.h for the valid bit
|
|
diff --git a/Documentation/hwmon/max31790.rst b/Documentation/hwmon/max31790.rst
|
|
index 84c62a12ef3a8..f4749c44cfb8b 100644
|
|
--- a/Documentation/hwmon/max31790.rst
|
|
+++ b/Documentation/hwmon/max31790.rst
|
|
@@ -38,6 +38,7 @@ Sysfs entries
|
|
fan[1-12]_input RO fan tachometer speed in RPM
|
|
fan[1-12]_fault RO fan experienced fault
|
|
fan[1-6]_target RW desired fan speed in RPM
|
|
-pwm[1-6]_enable RW regulator mode, 0=disabled, 1=manual mode, 2=rpm mode
|
|
-pwm[1-6] RW fan target duty cycle (0-255)
|
|
+pwm[1-6]_enable RW regulator mode, 0=disabled (duty cycle=0%), 1=manual mode, 2=rpm mode
|
|
+pwm[1-6] RW read: current pwm duty cycle,
|
|
+ write: target pwm duty cycle (0-255)
|
|
================== === =======================================================
|
|
diff --git a/Makefile b/Makefile
|
|
index 5e8716dbbadca..58ea876fa1834 100644
|
|
--- a/Makefile
|
|
+++ b/Makefile
|
|
@@ -1,7 +1,7 @@
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
VERSION = 5
|
|
PATCHLEVEL = 4
|
|
-SUBLEVEL = 131
|
|
+SUBLEVEL = 132
|
|
EXTRAVERSION =
|
|
NAME = Kleptomaniac Octopus
|
|
|
|
@@ -937,7 +937,7 @@ LDFLAGS_vmlinux += $(call ld-option, -X,)
|
|
endif
|
|
|
|
ifeq ($(CONFIG_RELR),y)
|
|
-LDFLAGS_vmlinux += --pack-dyn-relocs=relr
|
|
+LDFLAGS_vmlinux += --pack-dyn-relocs=relr --use-android-relr-tags
|
|
endif
|
|
|
|
# make the checker run with the right architecture
|
|
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi
|
|
index 6ab27a7b388d4..a4cef07c38cbd 100644
|
|
--- a/arch/arm/boot/dts/sama5d4.dtsi
|
|
+++ b/arch/arm/boot/dts/sama5d4.dtsi
|
|
@@ -914,7 +914,7 @@
|
|
0xffffffff 0x3ffcfe7c 0x1c010101 /* pioA */
|
|
0x7fffffff 0xfffccc3a 0x3f00cc3a /* pioB */
|
|
0xffffffff 0x3ff83fff 0xff00ffff /* pioC */
|
|
- 0x0003ff00 0x8002a800 0x00000000 /* pioD */
|
|
+ 0xb003ff00 0x8002a800 0x00000000 /* pioD */
|
|
0xffffffff 0x7fffffff 0x76fff1bf /* pioE */
|
|
>;
|
|
|
|
diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c
|
|
index 2924d7910b106..eb2190477da10 100644
|
|
--- a/arch/arm/kernel/perf_event_v7.c
|
|
+++ b/arch/arm/kernel/perf_event_v7.c
|
|
@@ -773,10 +773,10 @@ static inline void armv7pmu_write_counter(struct perf_event *event, u64 value)
|
|
pr_err("CPU%u writing wrong counter %d\n",
|
|
smp_processor_id(), idx);
|
|
} else if (idx == ARMV7_IDX_CYCLE_COUNTER) {
|
|
- asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" (value));
|
|
+ asm volatile("mcr p15, 0, %0, c9, c13, 0" : : "r" ((u32)value));
|
|
} else {
|
|
armv7_pmnc_select_counter(idx);
|
|
- asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" (value));
|
|
+ asm volatile("mcr p15, 0, %0, c9, c13, 2" : : "r" ((u32)value));
|
|
}
|
|
}
|
|
|
|
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
index 28ad59ee6c34b..6cb1278613c5e 100644
|
|
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
|
|
@@ -134,7 +134,7 @@
|
|
|
|
uart0: serial@12000 {
|
|
compatible = "marvell,armada-3700-uart";
|
|
- reg = <0x12000 0x200>;
|
|
+ reg = <0x12000 0x18>;
|
|
clocks = <&xtalclk>;
|
|
interrupts =
|
|
<GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
|
diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h
|
|
index c764cc8fb3b6a..9bf56e30f4a8d 100644
|
|
--- a/arch/arm64/include/asm/asm-uaccess.h
|
|
+++ b/arch/arm64/include/asm/asm-uaccess.h
|
|
@@ -15,10 +15,10 @@
|
|
.macro __uaccess_ttbr0_disable, tmp1
|
|
mrs \tmp1, ttbr1_el1 // swapper_pg_dir
|
|
bic \tmp1, \tmp1, #TTBR_ASID_MASK
|
|
- sub \tmp1, \tmp1, #RESERVED_TTBR0_SIZE // reserved_ttbr0 just before swapper_pg_dir
|
|
+ sub \tmp1, \tmp1, #PAGE_SIZE // reserved_pg_dir just before swapper_pg_dir
|
|
msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
|
|
isb
|
|
- add \tmp1, \tmp1, #RESERVED_TTBR0_SIZE
|
|
+ add \tmp1, \tmp1, #PAGE_SIZE
|
|
msr ttbr1_el1, \tmp1 // set reserved ASID
|
|
isb
|
|
.endm
|
|
diff --git a/arch/arm64/include/asm/kernel-pgtable.h b/arch/arm64/include/asm/kernel-pgtable.h
|
|
index a6e5da7553597..817efd95d539f 100644
|
|
--- a/arch/arm64/include/asm/kernel-pgtable.h
|
|
+++ b/arch/arm64/include/asm/kernel-pgtable.h
|
|
@@ -89,12 +89,6 @@
|
|
#define INIT_DIR_SIZE (PAGE_SIZE * EARLY_PAGES(KIMAGE_VADDR + TEXT_OFFSET, _end))
|
|
#define IDMAP_DIR_SIZE (IDMAP_PGTABLE_LEVELS * PAGE_SIZE)
|
|
|
|
-#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
|
-#define RESERVED_TTBR0_SIZE (PAGE_SIZE)
|
|
-#else
|
|
-#define RESERVED_TTBR0_SIZE (0)
|
|
-#endif
|
|
-
|
|
/* Initial memory map size */
|
|
#if ARM64_SWAPPER_USES_SECTION_MAPS
|
|
#define SWAPPER_BLOCK_SHIFT SECTION_SHIFT
|
|
diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h
|
|
index 3a5d9f1c91b6d..fb564de90aa7e 100644
|
|
--- a/arch/arm64/include/asm/mmu_context.h
|
|
+++ b/arch/arm64/include/asm/mmu_context.h
|
|
@@ -36,11 +36,11 @@ static inline void contextidr_thread_switch(struct task_struct *next)
|
|
}
|
|
|
|
/*
|
|
- * Set TTBR0 to empty_zero_page. No translations will be possible via TTBR0.
|
|
+ * Set TTBR0 to reserved_pg_dir. No translations will be possible via TTBR0.
|
|
*/
|
|
static inline void cpu_set_reserved_ttbr0(void)
|
|
{
|
|
- unsigned long ttbr = phys_to_ttbr(__pa_symbol(empty_zero_page));
|
|
+ unsigned long ttbr = phys_to_ttbr(__pa_symbol(reserved_pg_dir));
|
|
|
|
write_sysreg(ttbr, ttbr0_el1);
|
|
isb();
|
|
@@ -184,9 +184,9 @@ static inline void update_saved_ttbr0(struct task_struct *tsk,
|
|
return;
|
|
|
|
if (mm == &init_mm)
|
|
- ttbr = __pa_symbol(empty_zero_page);
|
|
+ ttbr = phys_to_ttbr(__pa_symbol(reserved_pg_dir));
|
|
else
|
|
- ttbr = virt_to_phys(mm->pgd) | ASID(mm) << 48;
|
|
+ ttbr = phys_to_ttbr(virt_to_phys(mm->pgd)) | ASID(mm) << 48;
|
|
|
|
WRITE_ONCE(task_thread_info(tsk)->ttbr0, ttbr);
|
|
}
|
|
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h
|
|
index 8c420f916fe2e..a92a187ec8919 100644
|
|
--- a/arch/arm64/include/asm/pgtable.h
|
|
+++ b/arch/arm64/include/asm/pgtable.h
|
|
@@ -466,6 +466,7 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
|
extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
|
|
extern pgd_t idmap_pg_end[];
|
|
extern pgd_t tramp_pg_dir[PTRS_PER_PGD];
|
|
+extern pgd_t reserved_pg_dir[PTRS_PER_PGD];
|
|
|
|
extern void set_swapper_pgd(pgd_t *pgdp, pgd_t pgd);
|
|
|
|
diff --git a/arch/arm64/include/asm/uaccess.h b/arch/arm64/include/asm/uaccess.h
|
|
index 32fc8061aa76f..b9a37a415bf9c 100644
|
|
--- a/arch/arm64/include/asm/uaccess.h
|
|
+++ b/arch/arm64/include/asm/uaccess.h
|
|
@@ -112,8 +112,8 @@ static inline void __uaccess_ttbr0_disable(void)
|
|
local_irq_save(flags);
|
|
ttbr = read_sysreg(ttbr1_el1);
|
|
ttbr &= ~TTBR_ASID_MASK;
|
|
- /* reserved_ttbr0 placed before swapper_pg_dir */
|
|
- write_sysreg(ttbr - RESERVED_TTBR0_SIZE, ttbr0_el1);
|
|
+ /* reserved_pg_dir placed before swapper_pg_dir */
|
|
+ write_sysreg(ttbr - PAGE_SIZE, ttbr0_el1);
|
|
isb();
|
|
/* Set reserved ASID */
|
|
write_sysreg(ttbr, ttbr1_el1);
|
|
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
|
|
index cf3bd2976e574..db137746c6fa3 100644
|
|
--- a/arch/arm64/kernel/entry.S
|
|
+++ b/arch/arm64/kernel/entry.S
|
|
@@ -1018,9 +1018,10 @@ ENDPROC(el0_svc)
|
|
*/
|
|
.pushsection ".entry.tramp.text", "ax"
|
|
|
|
+ // Move from tramp_pg_dir to swapper_pg_dir
|
|
.macro tramp_map_kernel, tmp
|
|
mrs \tmp, ttbr1_el1
|
|
- add \tmp, \tmp, #(PAGE_SIZE + RESERVED_TTBR0_SIZE)
|
|
+ add \tmp, \tmp, #(2 * PAGE_SIZE)
|
|
bic \tmp, \tmp, #USER_ASID_FLAG
|
|
msr ttbr1_el1, \tmp
|
|
#ifdef CONFIG_QCOM_FALKOR_ERRATUM_1003
|
|
@@ -1037,9 +1038,10 @@ alternative_else_nop_endif
|
|
#endif /* CONFIG_QCOM_FALKOR_ERRATUM_1003 */
|
|
.endm
|
|
|
|
+ // Move from swapper_pg_dir to tramp_pg_dir
|
|
.macro tramp_unmap_kernel, tmp
|
|
mrs \tmp, ttbr1_el1
|
|
- sub \tmp, \tmp, #(PAGE_SIZE + RESERVED_TTBR0_SIZE)
|
|
+ sub \tmp, \tmp, #(2 * PAGE_SIZE)
|
|
orr \tmp, \tmp, #USER_ASID_FLAG
|
|
msr ttbr1_el1, \tmp
|
|
/*
|
|
diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
|
|
index d98987b82874f..f55f4a15a905e 100644
|
|
--- a/arch/arm64/kernel/setup.c
|
|
+++ b/arch/arm64/kernel/setup.c
|
|
@@ -356,7 +356,7 @@ void __init setup_arch(char **cmdline_p)
|
|
* faults in case uaccess_enable() is inadvertently called by the init
|
|
* thread.
|
|
*/
|
|
- init_task.thread_info.ttbr0 = __pa_symbol(empty_zero_page);
|
|
+ init_task.thread_info.ttbr0 = phys_to_ttbr(__pa_symbol(reserved_pg_dir));
|
|
#endif
|
|
|
|
#ifdef CONFIG_VT
|
|
diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
|
|
index 0bab37b1acbe9..1f82cf631c3c4 100644
|
|
--- a/arch/arm64/kernel/vmlinux.lds.S
|
|
+++ b/arch/arm64/kernel/vmlinux.lds.S
|
|
@@ -157,13 +157,11 @@ SECTIONS
|
|
. += PAGE_SIZE;
|
|
#endif
|
|
|
|
-#ifdef CONFIG_ARM64_SW_TTBR0_PAN
|
|
- reserved_ttbr0 = .;
|
|
- . += RESERVED_TTBR0_SIZE;
|
|
-#endif
|
|
+ reserved_pg_dir = .;
|
|
+ . += PAGE_SIZE;
|
|
+
|
|
swapper_pg_dir = .;
|
|
. += PAGE_SIZE;
|
|
- swapper_pg_end = .;
|
|
|
|
. = ALIGN(SEGMENT_ALIGN);
|
|
__init_begin = .;
|
|
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S
|
|
index a1e0592d1fbcd..13e78a5d86905 100644
|
|
--- a/arch/arm64/mm/proc.S
|
|
+++ b/arch/arm64/mm/proc.S
|
|
@@ -166,7 +166,7 @@ ENDPROC(cpu_do_switch_mm)
|
|
.pushsection ".idmap.text", "awx"
|
|
|
|
.macro __idmap_cpu_set_reserved_ttbr1, tmp1, tmp2
|
|
- adrp \tmp1, empty_zero_page
|
|
+ adrp \tmp1, reserved_pg_dir
|
|
phys_to_ttbr \tmp2, \tmp1
|
|
offset_ttbr1 \tmp2, \tmp1
|
|
msr ttbr1_el1, \tmp2
|
|
diff --git a/arch/ia64/kernel/mca_drv.c b/arch/ia64/kernel/mca_drv.c
|
|
index 4d0ab323dee8c..2a40268c3d494 100644
|
|
--- a/arch/ia64/kernel/mca_drv.c
|
|
+++ b/arch/ia64/kernel/mca_drv.c
|
|
@@ -343,7 +343,7 @@ init_record_index_pools(void)
|
|
|
|
/* - 2 - */
|
|
sect_min_size = sal_log_sect_min_sizes[0];
|
|
- for (i = 1; i < sizeof sal_log_sect_min_sizes/sizeof(size_t); i++)
|
|
+ for (i = 1; i < ARRAY_SIZE(sal_log_sect_min_sizes); i++)
|
|
if (sect_min_size > sal_log_sect_min_sizes[i])
|
|
sect_min_size = sal_log_sect_min_sizes[i];
|
|
|
|
diff --git a/arch/m68k/Kconfig.machine b/arch/m68k/Kconfig.machine
|
|
index c01e103492fdc..1bbe0dd0c4fe5 100644
|
|
--- a/arch/m68k/Kconfig.machine
|
|
+++ b/arch/m68k/Kconfig.machine
|
|
@@ -23,6 +23,9 @@ config ATARI
|
|
this kernel on an Atari, say Y here and browse the material
|
|
available in <file:Documentation/m68k>; otherwise say N.
|
|
|
|
+config ATARI_KBD_CORE
|
|
+ bool
|
|
+
|
|
config MAC
|
|
bool "Macintosh support"
|
|
depends on MMU
|
|
diff --git a/arch/mips/include/asm/highmem.h b/arch/mips/include/asm/highmem.h
|
|
index 9d84aafc33d05..9a6bf4f011b5f 100644
|
|
--- a/arch/mips/include/asm/highmem.h
|
|
+++ b/arch/mips/include/asm/highmem.h
|
|
@@ -36,7 +36,7 @@ extern pte_t *pkmap_page_table;
|
|
* easily, subsequent pte tables have to be allocated in one physical
|
|
* chunk of RAM.
|
|
*/
|
|
-#ifdef CONFIG_PHYS_ADDR_T_64BIT
|
|
+#if defined(CONFIG_PHYS_ADDR_T_64BIT) || defined(CONFIG_MIPS_HUGE_TLB_SUPPORT)
|
|
#define LAST_PKMAP 512
|
|
#else
|
|
#define LAST_PKMAP 1024
|
|
diff --git a/arch/powerpc/include/asm/cputhreads.h b/arch/powerpc/include/asm/cputhreads.h
|
|
index deb99fd6e060f..51f533b6ece02 100644
|
|
--- a/arch/powerpc/include/asm/cputhreads.h
|
|
+++ b/arch/powerpc/include/asm/cputhreads.h
|
|
@@ -99,6 +99,36 @@ static inline int cpu_last_thread_sibling(int cpu)
|
|
return cpu | (threads_per_core - 1);
|
|
}
|
|
|
|
+/*
|
|
+ * tlb_thread_siblings are siblings which share a TLB. This is not
|
|
+ * architected, is not something a hypervisor could emulate and a future
|
|
+ * CPU may change behaviour even in compat mode, so this should only be
|
|
+ * used on PowerNV, and only with care.
|
|
+ */
|
|
+static inline int cpu_first_tlb_thread_sibling(int cpu)
|
|
+{
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && (threads_per_core == 8))
|
|
+ return cpu & ~0x6; /* Big Core */
|
|
+ else
|
|
+ return cpu_first_thread_sibling(cpu);
|
|
+}
|
|
+
|
|
+static inline int cpu_last_tlb_thread_sibling(int cpu)
|
|
+{
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && (threads_per_core == 8))
|
|
+ return cpu | 0x6; /* Big Core */
|
|
+ else
|
|
+ return cpu_last_thread_sibling(cpu);
|
|
+}
|
|
+
|
|
+static inline int cpu_tlb_thread_sibling_step(void)
|
|
+{
|
|
+ if (cpu_has_feature(CPU_FTR_ARCH_300) && (threads_per_core == 8))
|
|
+ return 2; /* Big Core */
|
|
+ else
|
|
+ return 1;
|
|
+}
|
|
+
|
|
static inline u32 get_tensr(void)
|
|
{
|
|
#ifdef CONFIG_BOOKE
|
|
diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
|
|
index b24d860bbab9b..c06cac543f188 100644
|
|
--- a/arch/powerpc/kernel/smp.c
|
|
+++ b/arch/powerpc/kernel/smp.c
|
|
@@ -588,6 +588,8 @@ static void nmi_stop_this_cpu(struct pt_regs *regs)
|
|
/*
|
|
* IRQs are already hard disabled by the smp_handle_nmi_ipi.
|
|
*/
|
|
+ set_cpu_online(smp_processor_id(), false);
|
|
+
|
|
spin_begin();
|
|
while (1)
|
|
spin_cpu_relax();
|
|
@@ -603,6 +605,15 @@ void smp_send_stop(void)
|
|
static void stop_this_cpu(void *dummy)
|
|
{
|
|
hard_irq_disable();
|
|
+
|
|
+ /*
|
|
+ * Offlining CPUs in stop_this_cpu can result in scheduler warnings,
|
|
+ * (see commit de6e5d38417e), but printk_safe_flush_on_panic() wants
|
|
+ * to know other CPUs are offline before it breaks locks to flush
|
|
+ * printk buffers, in case we panic()ed while holding the lock.
|
|
+ */
|
|
+ set_cpu_online(smp_processor_id(), false);
|
|
+
|
|
spin_begin();
|
|
while (1)
|
|
spin_cpu_relax();
|
|
diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c
|
|
index e2a46cfed5fd1..b13c6213b0d9b 100644
|
|
--- a/arch/powerpc/kernel/stacktrace.c
|
|
+++ b/arch/powerpc/kernel/stacktrace.c
|
|
@@ -19,6 +19,7 @@
|
|
#include <asm/ptrace.h>
|
|
#include <asm/processor.h>
|
|
#include <linux/ftrace.h>
|
|
+#include <linux/delay.h>
|
|
#include <asm/kprobes.h>
|
|
|
|
#include <asm/paca.h>
|
|
@@ -230,17 +231,31 @@ static void handle_backtrace_ipi(struct pt_regs *regs)
|
|
|
|
static void raise_backtrace_ipi(cpumask_t *mask)
|
|
{
|
|
+ struct paca_struct *p;
|
|
unsigned int cpu;
|
|
+ u64 delay_us;
|
|
|
|
for_each_cpu(cpu, mask) {
|
|
- if (cpu == smp_processor_id())
|
|
+ if (cpu == smp_processor_id()) {
|
|
handle_backtrace_ipi(NULL);
|
|
- else
|
|
- smp_send_safe_nmi_ipi(cpu, handle_backtrace_ipi, 5 * USEC_PER_SEC);
|
|
- }
|
|
+ continue;
|
|
+ }
|
|
|
|
- for_each_cpu(cpu, mask) {
|
|
- struct paca_struct *p = paca_ptrs[cpu];
|
|
+ delay_us = 5 * USEC_PER_SEC;
|
|
+
|
|
+ if (smp_send_safe_nmi_ipi(cpu, handle_backtrace_ipi, delay_us)) {
|
|
+ // Now wait up to 5s for the other CPU to do its backtrace
|
|
+ while (cpumask_test_cpu(cpu, mask) && delay_us) {
|
|
+ udelay(1);
|
|
+ delay_us--;
|
|
+ }
|
|
+
|
|
+ // Other CPU cleared itself from the mask
|
|
+ if (delay_us)
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ p = paca_ptrs[cpu];
|
|
|
|
cpumask_clear_cpu(cpu, mask);
|
|
|
|
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
|
|
index 6938b793a0150..9011857c0434d 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv.c
|
|
@@ -2536,7 +2536,7 @@ static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu)
|
|
cpumask_t *cpu_in_guest;
|
|
int i;
|
|
|
|
- cpu = cpu_first_thread_sibling(cpu);
|
|
+ cpu = cpu_first_tlb_thread_sibling(cpu);
|
|
if (nested) {
|
|
cpumask_set_cpu(cpu, &nested->need_tlb_flush);
|
|
cpu_in_guest = &nested->cpu_in_guest;
|
|
@@ -2550,9 +2550,10 @@ static void radix_flush_cpu(struct kvm *kvm, int cpu, struct kvm_vcpu *vcpu)
|
|
* the other side is the first smp_mb() in kvmppc_run_core().
|
|
*/
|
|
smp_mb();
|
|
- for (i = 0; i < threads_per_core; ++i)
|
|
- if (cpumask_test_cpu(cpu + i, cpu_in_guest))
|
|
- smp_call_function_single(cpu + i, do_nothing, NULL, 1);
|
|
+ for (i = cpu; i <= cpu_last_tlb_thread_sibling(cpu);
|
|
+ i += cpu_tlb_thread_sibling_step())
|
|
+ if (cpumask_test_cpu(i, cpu_in_guest))
|
|
+ smp_call_function_single(i, do_nothing, NULL, 1);
|
|
}
|
|
|
|
static void kvmppc_prepare_radix_vcpu(struct kvm_vcpu *vcpu, int pcpu)
|
|
@@ -2583,8 +2584,8 @@ static void kvmppc_prepare_radix_vcpu(struct kvm_vcpu *vcpu, int pcpu)
|
|
*/
|
|
if (prev_cpu != pcpu) {
|
|
if (prev_cpu >= 0 &&
|
|
- cpu_first_thread_sibling(prev_cpu) !=
|
|
- cpu_first_thread_sibling(pcpu))
|
|
+ cpu_first_tlb_thread_sibling(prev_cpu) !=
|
|
+ cpu_first_tlb_thread_sibling(pcpu))
|
|
radix_flush_cpu(kvm, prev_cpu, vcpu);
|
|
if (nested)
|
|
nested->prev_cpu[vcpu->arch.nested_vcpu_id] = pcpu;
|
|
diff --git a/arch/powerpc/kvm/book3s_hv_builtin.c b/arch/powerpc/kvm/book3s_hv_builtin.c
|
|
index 7c1909657b556..4a91b543a8540 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv_builtin.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv_builtin.c
|
|
@@ -847,7 +847,7 @@ void kvmppc_check_need_tlb_flush(struct kvm *kvm, int pcpu,
|
|
* Thus we make all 4 threads use the same bit.
|
|
*/
|
|
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
|
- pcpu = cpu_first_thread_sibling(pcpu);
|
|
+ pcpu = cpu_first_tlb_thread_sibling(pcpu);
|
|
|
|
if (nested)
|
|
need_tlb_flush = &nested->need_tlb_flush;
|
|
diff --git a/arch/powerpc/kvm/book3s_hv_nested.c b/arch/powerpc/kvm/book3s_hv_nested.c
|
|
index cdf30c6eaf542..66fa2c7590aa0 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv_nested.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv_nested.c
|
|
@@ -51,7 +51,8 @@ void kvmhv_save_hv_regs(struct kvm_vcpu *vcpu, struct hv_guest_state *hr)
|
|
hr->ppr = vcpu->arch.ppr;
|
|
}
|
|
|
|
-static void byteswap_pt_regs(struct pt_regs *regs)
|
|
+/* Use noinline_for_stack due to https://bugs.llvm.org/show_bug.cgi?id=49610 */
|
|
+static noinline_for_stack void byteswap_pt_regs(struct pt_regs *regs)
|
|
{
|
|
unsigned long *addr = (unsigned long *) regs;
|
|
|
|
diff --git a/arch/powerpc/kvm/book3s_hv_rm_mmu.c b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
index 220305454c23c..9bf3be438ac58 100644
|
|
--- a/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
+++ b/arch/powerpc/kvm/book3s_hv_rm_mmu.c
|
|
@@ -67,7 +67,7 @@ static int global_invalidates(struct kvm *kvm)
|
|
* so use the bit for the first thread to represent the core.
|
|
*/
|
|
if (cpu_has_feature(CPU_FTR_ARCH_300))
|
|
- cpu = cpu_first_thread_sibling(cpu);
|
|
+ cpu = cpu_first_tlb_thread_sibling(cpu);
|
|
cpumask_clear_cpu(cpu, &kvm->arch.need_tlb_flush);
|
|
}
|
|
|
|
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
|
|
index 43a81d0ad5074..0023b78391f14 100644
|
|
--- a/arch/s390/Kconfig
|
|
+++ b/arch/s390/Kconfig
|
|
@@ -920,7 +920,7 @@ config CMM_IUCV
|
|
config APPLDATA_BASE
|
|
def_bool n
|
|
prompt "Linux - VM Monitor Stream, base infrastructure"
|
|
- depends on PROC_FS
|
|
+ depends on PROC_SYSCTL
|
|
help
|
|
This provides a kernel interface for creating and updating z/VM APPLDATA
|
|
monitor records. The monitor records are updated at certain time
|
|
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
|
|
index d08e13c6dc982..20ba8537dbcc2 100644
|
|
--- a/arch/s390/kvm/kvm-s390.c
|
|
+++ b/arch/s390/kvm/kvm-s390.c
|
|
@@ -318,31 +318,31 @@ static void allow_cpu_feat(unsigned long nr)
|
|
|
|
static inline int plo_test_bit(unsigned char nr)
|
|
{
|
|
- register unsigned long r0 asm("0") = (unsigned long) nr | 0x100;
|
|
+ unsigned long function = (unsigned long)nr | 0x100;
|
|
int cc;
|
|
|
|
asm volatile(
|
|
+ " lgr 0,%[function]\n"
|
|
/* Parameter registers are ignored for "test bit" */
|
|
" plo 0,0,0,0(0)\n"
|
|
" ipm %0\n"
|
|
" srl %0,28\n"
|
|
: "=d" (cc)
|
|
- : "d" (r0)
|
|
- : "cc");
|
|
+ : [function] "d" (function)
|
|
+ : "cc", "0");
|
|
return cc == 0;
|
|
}
|
|
|
|
static __always_inline void __insn32_query(unsigned int opcode, u8 *query)
|
|
{
|
|
- register unsigned long r0 asm("0") = 0; /* query function */
|
|
- register unsigned long r1 asm("1") = (unsigned long) query;
|
|
-
|
|
asm volatile(
|
|
- /* Parameter regs are ignored */
|
|
+ " lghi 0,0\n"
|
|
+ " lgr 1,%[query]\n"
|
|
+ /* Parameter registers are ignored */
|
|
" .insn rrf,%[opc] << 16,2,4,6,0\n"
|
|
:
|
|
- : "d" (r0), "a" (r1), [opc] "i" (opcode)
|
|
- : "cc", "memory");
|
|
+ : [query] "d" ((unsigned long)query), [opc] "i" (opcode)
|
|
+ : "cc", "memory", "0", "1");
|
|
}
|
|
|
|
#define INSN_SORTL 0xb938
|
|
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c
|
|
index 3f63bd7421aca..023bd3e1aa0d2 100644
|
|
--- a/arch/x86/kvm/vmx/nested.c
|
|
+++ b/arch/x86/kvm/vmx/nested.c
|
|
@@ -5099,7 +5099,7 @@ static int handle_vmfunc(struct kvm_vcpu *vcpu)
|
|
}
|
|
|
|
vmcs12 = get_vmcs12(vcpu);
|
|
- if ((vmcs12->vm_function_control & (1 << function)) == 0)
|
|
+ if (!(vmcs12->vm_function_control & BIT_ULL(function)))
|
|
goto fail;
|
|
|
|
switch (function) {
|
|
diff --git a/block/blk-merge.c b/block/blk-merge.c
|
|
index 03959bfe961cf..4b022f0c49d20 100644
|
|
--- a/block/blk-merge.c
|
|
+++ b/block/blk-merge.c
|
|
@@ -571,10 +571,14 @@ static inline unsigned int blk_rq_get_max_segments(struct request *rq)
|
|
static inline int ll_new_hw_segment(struct request *req, struct bio *bio,
|
|
unsigned int nr_phys_segs)
|
|
{
|
|
- if (req->nr_phys_segments + nr_phys_segs > blk_rq_get_max_segments(req))
|
|
+ if (blk_integrity_merge_bio(req->q, req, bio) == false)
|
|
goto no_merge;
|
|
|
|
- if (blk_integrity_merge_bio(req->q, req, bio) == false)
|
|
+ /* discard request merge won't add new segment */
|
|
+ if (req_op(req) == REQ_OP_DISCARD)
|
|
+ return 1;
|
|
+
|
|
+ if (req->nr_phys_segments + nr_phys_segs > blk_rq_get_max_segments(req))
|
|
goto no_merge;
|
|
|
|
/*
|
|
diff --git a/block/blk-rq-qos.h b/block/blk-rq-qos.h
|
|
index 2bc43e94f4c40..2bcb3495e376b 100644
|
|
--- a/block/blk-rq-qos.h
|
|
+++ b/block/blk-rq-qos.h
|
|
@@ -7,6 +7,7 @@
|
|
#include <linux/blk_types.h>
|
|
#include <linux/atomic.h>
|
|
#include <linux/wait.h>
|
|
+#include <linux/blk-mq.h>
|
|
|
|
#include "blk-mq-debugfs.h"
|
|
|
|
@@ -99,8 +100,21 @@ static inline void rq_wait_init(struct rq_wait *rq_wait)
|
|
|
|
static inline void rq_qos_add(struct request_queue *q, struct rq_qos *rqos)
|
|
{
|
|
+ /*
|
|
+ * No IO can be in-flight when adding rqos, so freeze queue, which
|
|
+ * is fine since we only support rq_qos for blk-mq queue.
|
|
+ *
|
|
+ * Reuse ->queue_lock for protecting against other concurrent
|
|
+ * rq_qos adding/deleting
|
|
+ */
|
|
+ blk_mq_freeze_queue(q);
|
|
+
|
|
+ spin_lock_irq(&q->queue_lock);
|
|
rqos->next = q->rq_qos;
|
|
q->rq_qos = rqos;
|
|
+ spin_unlock_irq(&q->queue_lock);
|
|
+
|
|
+ blk_mq_unfreeze_queue(q);
|
|
|
|
if (rqos->ops->debugfs_attrs)
|
|
blk_mq_debugfs_register_rqos(rqos);
|
|
@@ -110,12 +124,22 @@ static inline void rq_qos_del(struct request_queue *q, struct rq_qos *rqos)
|
|
{
|
|
struct rq_qos **cur;
|
|
|
|
+ /*
|
|
+ * See comment in rq_qos_add() about freezing queue & using
|
|
+ * ->queue_lock.
|
|
+ */
|
|
+ blk_mq_freeze_queue(q);
|
|
+
|
|
+ spin_lock_irq(&q->queue_lock);
|
|
for (cur = &q->rq_qos; *cur; cur = &(*cur)->next) {
|
|
if (*cur == rqos) {
|
|
*cur = rqos->next;
|
|
break;
|
|
}
|
|
}
|
|
+ spin_unlock_irq(&q->queue_lock);
|
|
+
|
|
+ blk_mq_unfreeze_queue(q);
|
|
|
|
blk_mq_debugfs_unregister_rqos(rqos);
|
|
}
|
|
diff --git a/block/blk-wbt.c b/block/blk-wbt.c
|
|
index 8641ba9793c5f..ee708c1bc3523 100644
|
|
--- a/block/blk-wbt.c
|
|
+++ b/block/blk-wbt.c
|
|
@@ -77,7 +77,8 @@ enum {
|
|
|
|
static inline bool rwb_enabled(struct rq_wb *rwb)
|
|
{
|
|
- return rwb && rwb->wb_normal != 0;
|
|
+ return rwb && rwb->enable_state != WBT_STATE_OFF_DEFAULT &&
|
|
+ rwb->wb_normal != 0;
|
|
}
|
|
|
|
static void wb_timestamp(struct rq_wb *rwb, unsigned long *var)
|
|
@@ -644,9 +645,13 @@ void wbt_set_write_cache(struct request_queue *q, bool write_cache_on)
|
|
void wbt_enable_default(struct request_queue *q)
|
|
{
|
|
struct rq_qos *rqos = wbt_rq_qos(q);
|
|
+
|
|
/* Throttling already enabled? */
|
|
- if (rqos)
|
|
+ if (rqos) {
|
|
+ if (RQWB(rqos)->enable_state == WBT_STATE_OFF_DEFAULT)
|
|
+ RQWB(rqos)->enable_state = WBT_STATE_ON_DEFAULT;
|
|
return;
|
|
+ }
|
|
|
|
/* Queue not registered? Maybe shutting down... */
|
|
if (!blk_queue_registered(q))
|
|
@@ -710,7 +715,7 @@ void wbt_disable_default(struct request_queue *q)
|
|
rwb = RQWB(rqos);
|
|
if (rwb->enable_state == WBT_STATE_ON_DEFAULT) {
|
|
blk_stat_deactivate(rwb->cb);
|
|
- rwb->wb_normal = 0;
|
|
+ rwb->enable_state = WBT_STATE_OFF_DEFAULT;
|
|
}
|
|
}
|
|
EXPORT_SYMBOL_GPL(wbt_disable_default);
|
|
diff --git a/block/blk-wbt.h b/block/blk-wbt.h
|
|
index 8e4e376609710..d8d9f41b42f9a 100644
|
|
--- a/block/blk-wbt.h
|
|
+++ b/block/blk-wbt.h
|
|
@@ -34,6 +34,7 @@ enum {
|
|
enum {
|
|
WBT_STATE_ON_DEFAULT = 1,
|
|
WBT_STATE_ON_MANUAL = 2,
|
|
+ WBT_STATE_OFF_DEFAULT
|
|
};
|
|
|
|
struct rq_wb {
|
|
diff --git a/crypto/shash.c b/crypto/shash.c
|
|
index e83c5124f6eb1..9c4cdfd8550ef 100644
|
|
--- a/crypto/shash.c
|
|
+++ b/crypto/shash.c
|
|
@@ -20,12 +20,24 @@
|
|
|
|
static const struct crypto_type crypto_shash_type;
|
|
|
|
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
- unsigned int keylen)
|
|
+static int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
+ unsigned int keylen)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(shash_no_setkey);
|
|
+
|
|
+/*
|
|
+ * Check whether an shash algorithm has a setkey function.
|
|
+ *
|
|
+ * For CFI compatibility, this must not be an inline function. This is because
|
|
+ * when CFI is enabled, modules won't get the same address for shash_no_setkey
|
|
+ * (if it were exported, which inlining would require) as the core kernel will.
|
|
+ */
|
|
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
|
|
+{
|
|
+ return alg->setkey != shash_no_setkey;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(crypto_shash_alg_has_setkey);
|
|
|
|
static int shash_setkey_unaligned(struct crypto_shash *tfm, const u8 *key,
|
|
unsigned int keylen)
|
|
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
|
|
index ef1ac4d127dab..1c81504046d4d 100644
|
|
--- a/drivers/acpi/Makefile
|
|
+++ b/drivers/acpi/Makefile
|
|
@@ -8,6 +8,11 @@ ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
|
|
#
|
|
# ACPI Boot-Time Table Parsing
|
|
#
|
|
+ifeq ($(CONFIG_ACPI_CUSTOM_DSDT),y)
|
|
+tables.o: $(src)/../../include/$(subst $\",,$(CONFIG_ACPI_CUSTOM_DSDT_FILE)) ;
|
|
+
|
|
+endif
|
|
+
|
|
obj-$(CONFIG_ACPI) += tables.o
|
|
obj-$(CONFIG_X86) += blacklist.o
|
|
|
|
diff --git a/drivers/acpi/acpi_pad.c b/drivers/acpi/acpi_pad.c
|
|
index e7dc0133f8173..c11d736a8db7e 100644
|
|
--- a/drivers/acpi/acpi_pad.c
|
|
+++ b/drivers/acpi/acpi_pad.c
|
|
@@ -262,7 +262,7 @@ static uint32_t acpi_pad_idle_cpus_num(void)
|
|
return ps_tsk_num;
|
|
}
|
|
|
|
-static ssize_t acpi_pad_rrtime_store(struct device *dev,
|
|
+static ssize_t rrtime_store(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
unsigned long num;
|
|
@@ -276,16 +276,14 @@ static ssize_t acpi_pad_rrtime_store(struct device *dev,
|
|
return count;
|
|
}
|
|
|
|
-static ssize_t acpi_pad_rrtime_show(struct device *dev,
|
|
+static ssize_t rrtime_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
return scnprintf(buf, PAGE_SIZE, "%d\n", round_robin_time);
|
|
}
|
|
-static DEVICE_ATTR(rrtime, S_IRUGO|S_IWUSR,
|
|
- acpi_pad_rrtime_show,
|
|
- acpi_pad_rrtime_store);
|
|
+static DEVICE_ATTR_RW(rrtime);
|
|
|
|
-static ssize_t acpi_pad_idlepct_store(struct device *dev,
|
|
+static ssize_t idlepct_store(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
unsigned long num;
|
|
@@ -299,16 +297,14 @@ static ssize_t acpi_pad_idlepct_store(struct device *dev,
|
|
return count;
|
|
}
|
|
|
|
-static ssize_t acpi_pad_idlepct_show(struct device *dev,
|
|
+static ssize_t idlepct_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
return scnprintf(buf, PAGE_SIZE, "%d\n", idle_pct);
|
|
}
|
|
-static DEVICE_ATTR(idlepct, S_IRUGO|S_IWUSR,
|
|
- acpi_pad_idlepct_show,
|
|
- acpi_pad_idlepct_store);
|
|
+static DEVICE_ATTR_RW(idlepct);
|
|
|
|
-static ssize_t acpi_pad_idlecpus_store(struct device *dev,
|
|
+static ssize_t idlecpus_store(struct device *dev,
|
|
struct device_attribute *attr, const char *buf, size_t count)
|
|
{
|
|
unsigned long num;
|
|
@@ -320,16 +316,14 @@ static ssize_t acpi_pad_idlecpus_store(struct device *dev,
|
|
return count;
|
|
}
|
|
|
|
-static ssize_t acpi_pad_idlecpus_show(struct device *dev,
|
|
+static ssize_t idlecpus_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
return cpumap_print_to_pagebuf(false, buf,
|
|
to_cpumask(pad_busy_cpus_bits));
|
|
}
|
|
|
|
-static DEVICE_ATTR(idlecpus, S_IRUGO|S_IWUSR,
|
|
- acpi_pad_idlecpus_show,
|
|
- acpi_pad_idlecpus_store);
|
|
+static DEVICE_ATTR_RW(idlecpus);
|
|
|
|
static int acpi_pad_add_sysfs(struct acpi_device *device)
|
|
{
|
|
diff --git a/drivers/acpi/acpi_tad.c b/drivers/acpi/acpi_tad.c
|
|
index 33a4bcdaa4d79..bab8583443a61 100644
|
|
--- a/drivers/acpi/acpi_tad.c
|
|
+++ b/drivers/acpi/acpi_tad.c
|
|
@@ -237,7 +237,7 @@ static ssize_t time_show(struct device *dev, struct device_attribute *attr,
|
|
rt.tz, rt.daylight);
|
|
}
|
|
|
|
-static DEVICE_ATTR(time, S_IRUSR | S_IWUSR, time_show, time_store);
|
|
+static DEVICE_ATTR_RW(time);
|
|
|
|
static struct attribute *acpi_tad_time_attrs[] = {
|
|
&dev_attr_time.attr,
|
|
@@ -446,7 +446,7 @@ static ssize_t ac_alarm_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_alarm_read(dev, buf, ACPI_TAD_AC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(ac_alarm, S_IRUSR | S_IWUSR, ac_alarm_show, ac_alarm_store);
|
|
+static DEVICE_ATTR_RW(ac_alarm);
|
|
|
|
static ssize_t ac_policy_store(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
@@ -462,7 +462,7 @@ static ssize_t ac_policy_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_policy_read(dev, buf, ACPI_TAD_AC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(ac_policy, S_IRUSR | S_IWUSR, ac_policy_show, ac_policy_store);
|
|
+static DEVICE_ATTR_RW(ac_policy);
|
|
|
|
static ssize_t ac_status_store(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
@@ -478,7 +478,7 @@ static ssize_t ac_status_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_status_read(dev, buf, ACPI_TAD_AC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(ac_status, S_IRUSR | S_IWUSR, ac_status_show, ac_status_store);
|
|
+static DEVICE_ATTR_RW(ac_status);
|
|
|
|
static struct attribute *acpi_tad_attrs[] = {
|
|
&dev_attr_caps.attr,
|
|
@@ -505,7 +505,7 @@ static ssize_t dc_alarm_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_alarm_read(dev, buf, ACPI_TAD_DC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(dc_alarm, S_IRUSR | S_IWUSR, dc_alarm_show, dc_alarm_store);
|
|
+static DEVICE_ATTR_RW(dc_alarm);
|
|
|
|
static ssize_t dc_policy_store(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
@@ -521,7 +521,7 @@ static ssize_t dc_policy_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_policy_read(dev, buf, ACPI_TAD_DC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(dc_policy, S_IRUSR | S_IWUSR, dc_policy_show, dc_policy_store);
|
|
+static DEVICE_ATTR_RW(dc_policy);
|
|
|
|
static ssize_t dc_status_store(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
@@ -537,7 +537,7 @@ static ssize_t dc_status_show(struct device *dev, struct device_attribute *attr,
|
|
return acpi_tad_status_read(dev, buf, ACPI_TAD_DC_TIMER);
|
|
}
|
|
|
|
-static DEVICE_ATTR(dc_status, S_IRUSR | S_IWUSR, dc_status_show, dc_status_store);
|
|
+static DEVICE_ATTR_RW(dc_status);
|
|
|
|
static struct attribute *acpi_tad_dc_attrs[] = {
|
|
&dev_attr_dc_alarm.attr,
|
|
diff --git a/drivers/acpi/acpica/nsrepair2.c b/drivers/acpi/acpica/nsrepair2.c
|
|
index 663d85e0adba9..b7c408ce340c9 100644
|
|
--- a/drivers/acpi/acpica/nsrepair2.c
|
|
+++ b/drivers/acpi/acpica/nsrepair2.c
|
|
@@ -375,6 +375,13 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
|
|
|
(*element_ptr)->common.reference_count =
|
|
original_ref_count;
|
|
+
|
|
+ /*
|
|
+ * The original_element holds a reference from the package object
|
|
+ * that represents _HID. Since a new element was created by _HID,
|
|
+ * remove the reference from the _CID package.
|
|
+ */
|
|
+ acpi_ut_remove_reference(original_element);
|
|
}
|
|
|
|
element_ptr++;
|
|
diff --git a/drivers/acpi/bgrt.c b/drivers/acpi/bgrt.c
|
|
index 251f961c28cc4..e0d14017706ea 100644
|
|
--- a/drivers/acpi/bgrt.c
|
|
+++ b/drivers/acpi/bgrt.c
|
|
@@ -15,40 +15,19 @@
|
|
static void *bgrt_image;
|
|
static struct kobject *bgrt_kobj;
|
|
|
|
-static ssize_t show_version(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
-{
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.version);
|
|
-}
|
|
-static DEVICE_ATTR(version, S_IRUGO, show_version, NULL);
|
|
-
|
|
-static ssize_t show_status(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
-{
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.status);
|
|
-}
|
|
-static DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
|
|
-
|
|
-static ssize_t show_type(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
-{
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_type);
|
|
-}
|
|
-static DEVICE_ATTR(type, S_IRUGO, show_type, NULL);
|
|
-
|
|
-static ssize_t show_xoffset(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
-{
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_x);
|
|
-}
|
|
-static DEVICE_ATTR(xoffset, S_IRUGO, show_xoffset, NULL);
|
|
-
|
|
-static ssize_t show_yoffset(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
-{
|
|
- return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab.image_offset_y);
|
|
-}
|
|
-static DEVICE_ATTR(yoffset, S_IRUGO, show_yoffset, NULL);
|
|
+#define BGRT_SHOW(_name, _member) \
|
|
+ static ssize_t _name##_show(struct kobject *kobj, \
|
|
+ struct kobj_attribute *attr, char *buf) \
|
|
+ { \
|
|
+ return snprintf(buf, PAGE_SIZE, "%d\n", bgrt_tab._member); \
|
|
+ } \
|
|
+ struct kobj_attribute bgrt_attr_##_name = __ATTR_RO(_name)
|
|
+
|
|
+BGRT_SHOW(version, version);
|
|
+BGRT_SHOW(status, status);
|
|
+BGRT_SHOW(type, image_type);
|
|
+BGRT_SHOW(xoffset, image_offset_x);
|
|
+BGRT_SHOW(yoffset, image_offset_y);
|
|
|
|
static ssize_t image_read(struct file *file, struct kobject *kobj,
|
|
struct bin_attribute *attr, char *buf, loff_t off, size_t count)
|
|
@@ -60,11 +39,11 @@ static ssize_t image_read(struct file *file, struct kobject *kobj,
|
|
static BIN_ATTR_RO(image, 0); /* size gets filled in later */
|
|
|
|
static struct attribute *bgrt_attributes[] = {
|
|
- &dev_attr_version.attr,
|
|
- &dev_attr_status.attr,
|
|
- &dev_attr_type.attr,
|
|
- &dev_attr_xoffset.attr,
|
|
- &dev_attr_yoffset.attr,
|
|
+ &bgrt_attr_version.attr,
|
|
+ &bgrt_attr_status.attr,
|
|
+ &bgrt_attr_type.attr,
|
|
+ &bgrt_attr_xoffset.attr,
|
|
+ &bgrt_attr_yoffset.attr,
|
|
NULL,
|
|
};
|
|
|
|
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
|
|
index 54002670cb7a1..bbd9c93fc4c26 100644
|
|
--- a/drivers/acpi/bus.c
|
|
+++ b/drivers/acpi/bus.c
|
|
@@ -1240,6 +1240,7 @@ static int __init acpi_init(void)
|
|
|
|
result = acpi_bus_init();
|
|
if (result) {
|
|
+ kobject_put(acpi_kobj);
|
|
disable_acpi();
|
|
return result;
|
|
}
|
|
diff --git a/drivers/acpi/device_sysfs.c b/drivers/acpi/device_sysfs.c
|
|
index bfca116482b8b..fe8c7e79f4726 100644
|
|
--- a/drivers/acpi/device_sysfs.c
|
|
+++ b/drivers/acpi/device_sysfs.c
|
|
@@ -325,11 +325,11 @@ int acpi_device_modalias(struct device *dev, char *buf, int size)
|
|
EXPORT_SYMBOL_GPL(acpi_device_modalias);
|
|
|
|
static ssize_t
|
|
-acpi_device_modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
+modalias_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
{
|
|
return __acpi_device_modalias(to_acpi_device(dev), buf, 1024);
|
|
}
|
|
-static DEVICE_ATTR(modalias, 0444, acpi_device_modalias_show, NULL);
|
|
+static DEVICE_ATTR_RO(modalias);
|
|
|
|
static ssize_t real_power_state_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
@@ -358,8 +358,8 @@ static ssize_t power_state_show(struct device *dev,
|
|
static DEVICE_ATTR_RO(power_state);
|
|
|
|
static ssize_t
|
|
-acpi_eject_store(struct device *d, struct device_attribute *attr,
|
|
- const char *buf, size_t count)
|
|
+eject_store(struct device *d, struct device_attribute *attr,
|
|
+ const char *buf, size_t count)
|
|
{
|
|
struct acpi_device *acpi_device = to_acpi_device(d);
|
|
acpi_object_type not_used;
|
|
@@ -387,28 +387,28 @@ acpi_eject_store(struct device *d, struct device_attribute *attr,
|
|
return status == AE_NO_MEMORY ? -ENOMEM : -EAGAIN;
|
|
}
|
|
|
|
-static DEVICE_ATTR(eject, 0200, NULL, acpi_eject_store);
|
|
+static DEVICE_ATTR_WO(eject);
|
|
|
|
static ssize_t
|
|
-acpi_device_hid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
+hid_show(struct device *dev, struct device_attribute *attr, char *buf)
|
|
{
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
|
|
return sprintf(buf, "%s\n", acpi_device_hid(acpi_dev));
|
|
}
|
|
-static DEVICE_ATTR(hid, 0444, acpi_device_hid_show, NULL);
|
|
+static DEVICE_ATTR_RO(hid);
|
|
|
|
-static ssize_t acpi_device_uid_show(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
+static ssize_t uid_show(struct device *dev,
|
|
+ struct device_attribute *attr, char *buf)
|
|
{
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
|
|
return sprintf(buf, "%s\n", acpi_dev->pnp.unique_id);
|
|
}
|
|
-static DEVICE_ATTR(uid, 0444, acpi_device_uid_show, NULL);
|
|
+static DEVICE_ATTR_RO(uid);
|
|
|
|
-static ssize_t acpi_device_adr_show(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
+static ssize_t adr_show(struct device *dev,
|
|
+ struct device_attribute *attr, char *buf)
|
|
{
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
|
|
@@ -417,16 +417,16 @@ static ssize_t acpi_device_adr_show(struct device *dev,
|
|
else
|
|
return sprintf(buf, "0x%08llx\n", acpi_dev->pnp.bus_address);
|
|
}
|
|
-static DEVICE_ATTR(adr, 0444, acpi_device_adr_show, NULL);
|
|
+static DEVICE_ATTR_RO(adr);
|
|
|
|
-static ssize_t acpi_device_path_show(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
+static ssize_t path_show(struct device *dev,
|
|
+ struct device_attribute *attr, char *buf)
|
|
{
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
|
|
return acpi_object_path(acpi_dev->handle, buf);
|
|
}
|
|
-static DEVICE_ATTR(path, 0444, acpi_device_path_show, NULL);
|
|
+static DEVICE_ATTR_RO(path);
|
|
|
|
/* sysfs file that shows description text from the ACPI _STR method */
|
|
static ssize_t description_show(struct device *dev,
|
|
@@ -446,7 +446,7 @@ static ssize_t description_show(struct device *dev,
|
|
(wchar_t *)acpi_dev->pnp.str_obj->buffer.pointer,
|
|
acpi_dev->pnp.str_obj->buffer.length,
|
|
UTF16_LITTLE_ENDIAN, buf,
|
|
- PAGE_SIZE);
|
|
+ PAGE_SIZE - 1);
|
|
|
|
buf[result++] = '\n';
|
|
|
|
@@ -455,8 +455,8 @@ static ssize_t description_show(struct device *dev,
|
|
static DEVICE_ATTR_RO(description);
|
|
|
|
static ssize_t
|
|
-acpi_device_sun_show(struct device *dev, struct device_attribute *attr,
|
|
- char *buf) {
|
|
+sun_show(struct device *dev, struct device_attribute *attr,
|
|
+ char *buf) {
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
acpi_status status;
|
|
unsigned long long sun;
|
|
@@ -467,11 +467,11 @@ acpi_device_sun_show(struct device *dev, struct device_attribute *attr,
|
|
|
|
return sprintf(buf, "%llu\n", sun);
|
|
}
|
|
-static DEVICE_ATTR(sun, 0444, acpi_device_sun_show, NULL);
|
|
+static DEVICE_ATTR_RO(sun);
|
|
|
|
static ssize_t
|
|
-acpi_device_hrv_show(struct device *dev, struct device_attribute *attr,
|
|
- char *buf) {
|
|
+hrv_show(struct device *dev, struct device_attribute *attr,
|
|
+ char *buf) {
|
|
struct acpi_device *acpi_dev = to_acpi_device(dev);
|
|
acpi_status status;
|
|
unsigned long long hrv;
|
|
@@ -482,7 +482,7 @@ acpi_device_hrv_show(struct device *dev, struct device_attribute *attr,
|
|
|
|
return sprintf(buf, "%llu\n", hrv);
|
|
}
|
|
-static DEVICE_ATTR(hrv, 0444, acpi_device_hrv_show, NULL);
|
|
+static DEVICE_ATTR_RO(hrv);
|
|
|
|
static ssize_t status_show(struct device *dev, struct device_attribute *attr,
|
|
char *buf) {
|
|
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
|
|
index e3414131bfcab..9bb42a772bee3 100644
|
|
--- a/drivers/acpi/dock.c
|
|
+++ b/drivers/acpi/dock.c
|
|
@@ -485,7 +485,7 @@ int dock_notify(struct acpi_device *adev, u32 event)
|
|
/*
|
|
* show_docked - read method for "docked" file in sysfs
|
|
*/
|
|
-static ssize_t show_docked(struct device *dev,
|
|
+static ssize_t docked_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
struct dock_station *dock_station = dev->platform_data;
|
|
@@ -494,25 +494,25 @@ static ssize_t show_docked(struct device *dev,
|
|
acpi_bus_get_device(dock_station->handle, &adev);
|
|
return snprintf(buf, PAGE_SIZE, "%u\n", acpi_device_enumerated(adev));
|
|
}
|
|
-static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
|
|
+static DEVICE_ATTR_RO(docked);
|
|
|
|
/*
|
|
* show_flags - read method for flags file in sysfs
|
|
*/
|
|
-static ssize_t show_flags(struct device *dev,
|
|
+static ssize_t flags_show(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
struct dock_station *dock_station = dev->platform_data;
|
|
return snprintf(buf, PAGE_SIZE, "%d\n", dock_station->flags);
|
|
|
|
}
|
|
-static DEVICE_ATTR(flags, S_IRUGO, show_flags, NULL);
|
|
+static DEVICE_ATTR_RO(flags);
|
|
|
|
/*
|
|
* write_undock - write method for "undock" file in sysfs
|
|
*/
|
|
-static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
|
|
- const char *buf, size_t count)
|
|
+static ssize_t undock_store(struct device *dev, struct device_attribute *attr,
|
|
+ const char *buf, size_t count)
|
|
{
|
|
int ret;
|
|
struct dock_station *dock_station = dev->platform_data;
|
|
@@ -526,13 +526,13 @@ static ssize_t write_undock(struct device *dev, struct device_attribute *attr,
|
|
acpi_scan_lock_release();
|
|
return ret ? ret: count;
|
|
}
|
|
-static DEVICE_ATTR(undock, S_IWUSR, NULL, write_undock);
|
|
+static DEVICE_ATTR_WO(undock);
|
|
|
|
/*
|
|
* show_dock_uid - read method for "uid" file in sysfs
|
|
*/
|
|
-static ssize_t show_dock_uid(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
+static ssize_t uid_show(struct device *dev,
|
|
+ struct device_attribute *attr, char *buf)
|
|
{
|
|
unsigned long long lbuf;
|
|
struct dock_station *dock_station = dev->platform_data;
|
|
@@ -543,10 +543,10 @@ static ssize_t show_dock_uid(struct device *dev,
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%llx\n", lbuf);
|
|
}
|
|
-static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
|
|
+static DEVICE_ATTR_RO(uid);
|
|
|
|
-static ssize_t show_dock_type(struct device *dev,
|
|
- struct device_attribute *attr, char *buf)
|
|
+static ssize_t type_show(struct device *dev,
|
|
+ struct device_attribute *attr, char *buf)
|
|
{
|
|
struct dock_station *dock_station = dev->platform_data;
|
|
char *type;
|
|
@@ -562,7 +562,7 @@ static ssize_t show_dock_type(struct device *dev,
|
|
|
|
return snprintf(buf, PAGE_SIZE, "%s\n", type);
|
|
}
|
|
-static DEVICE_ATTR(type, S_IRUGO, show_dock_type, NULL);
|
|
+static DEVICE_ATTR_RO(type);
|
|
|
|
static struct attribute *dock_attributes[] = {
|
|
&dev_attr_docked.attr,
|
|
diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
|
|
index c64001e789ed7..258a8df235cfb 100644
|
|
--- a/drivers/acpi/ec.c
|
|
+++ b/drivers/acpi/ec.c
|
|
@@ -1826,6 +1826,22 @@ static const struct dmi_system_id ec_dmi_table[] __initconst = {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "GL702VMK"),}, NULL},
|
|
{
|
|
+ ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BA", {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "X505BA"),}, NULL},
|
|
+ {
|
|
+ ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X505BP", {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "X505BP"),}, NULL},
|
|
+ {
|
|
+ ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BA", {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "X542BA"),}, NULL},
|
|
+ {
|
|
+ ec_honor_ecdt_gpe, "ASUSTeK COMPUTER INC. X542BP", {
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "X542BP"),}, NULL},
|
|
+ {
|
|
ec_honor_ecdt_gpe, "ASUS X550VXK", {
|
|
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
|
DMI_MATCH(DMI_PRODUCT_NAME, "X550VXK"),}, NULL},
|
|
diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
|
|
index fe1e7bc91a5ea..3261cffdd5e05 100644
|
|
--- a/drivers/acpi/power.c
|
|
+++ b/drivers/acpi/power.c
|
|
@@ -888,15 +888,16 @@ static void acpi_release_power_resource(struct device *dev)
|
|
kfree(resource);
|
|
}
|
|
|
|
-static ssize_t acpi_power_in_use_show(struct device *dev,
|
|
- struct device_attribute *attr,
|
|
- char *buf) {
|
|
+static ssize_t resource_in_use_show(struct device *dev,
|
|
+ struct device_attribute *attr,
|
|
+ char *buf)
|
|
+{
|
|
struct acpi_power_resource *resource;
|
|
|
|
resource = to_power_resource(to_acpi_device(dev));
|
|
return sprintf(buf, "%u\n", !!resource->ref_count);
|
|
}
|
|
-static DEVICE_ATTR(resource_in_use, 0444, acpi_power_in_use_show, NULL);
|
|
+static DEVICE_ATTR_RO(resource_in_use);
|
|
|
|
static void acpi_power_sysfs_remove(struct acpi_device *device)
|
|
{
|
|
diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
|
|
index ed56c6d20b084..53ae679c00f01 100644
|
|
--- a/drivers/acpi/processor_idle.c
|
|
+++ b/drivers/acpi/processor_idle.c
|
|
@@ -16,6 +16,7 @@
|
|
#include <linux/acpi.h>
|
|
#include <linux/dmi.h>
|
|
#include <linux/sched.h> /* need_resched() */
|
|
+#include <linux/sort.h>
|
|
#include <linux/tick.h>
|
|
#include <linux/cpuidle.h>
|
|
#include <linux/cpu.h>
|
|
@@ -540,10 +541,37 @@ static void acpi_processor_power_verify_c3(struct acpi_processor *pr,
|
|
return;
|
|
}
|
|
|
|
+static int acpi_cst_latency_cmp(const void *a, const void *b)
|
|
+{
|
|
+ const struct acpi_processor_cx *x = a, *y = b;
|
|
+
|
|
+ if (!(x->valid && y->valid))
|
|
+ return 0;
|
|
+ if (x->latency > y->latency)
|
|
+ return 1;
|
|
+ if (x->latency < y->latency)
|
|
+ return -1;
|
|
+ return 0;
|
|
+}
|
|
+static void acpi_cst_latency_swap(void *a, void *b, int n)
|
|
+{
|
|
+ struct acpi_processor_cx *x = a, *y = b;
|
|
+ u32 tmp;
|
|
+
|
|
+ if (!(x->valid && y->valid))
|
|
+ return;
|
|
+ tmp = x->latency;
|
|
+ x->latency = y->latency;
|
|
+ y->latency = tmp;
|
|
+}
|
|
+
|
|
static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|
{
|
|
unsigned int i;
|
|
unsigned int working = 0;
|
|
+ unsigned int last_latency = 0;
|
|
+ unsigned int last_type = 0;
|
|
+ bool buggy_latency = false;
|
|
|
|
pr->power.timer_broadcast_on_state = INT_MAX;
|
|
|
|
@@ -567,12 +595,24 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
|
|
}
|
|
if (!cx->valid)
|
|
continue;
|
|
+ if (cx->type >= last_type && cx->latency < last_latency)
|
|
+ buggy_latency = true;
|
|
+ last_latency = cx->latency;
|
|
+ last_type = cx->type;
|
|
|
|
lapic_timer_check_state(i, pr, cx);
|
|
tsc_check_state(cx->type);
|
|
working++;
|
|
}
|
|
|
|
+ if (buggy_latency) {
|
|
+ pr_notice("FW issue: working around C-state latencies out of order\n");
|
|
+ sort(&pr->power.states[1], max_cstate,
|
|
+ sizeof(struct acpi_processor_cx),
|
|
+ acpi_cst_latency_cmp,
|
|
+ acpi_cst_latency_swap);
|
|
+ }
|
|
+
|
|
lapic_timer_propagate_broadcast(pr);
|
|
|
|
return (working);
|
|
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c
|
|
index 48ca9a844f06b..55c57b703ea3c 100644
|
|
--- a/drivers/acpi/resource.c
|
|
+++ b/drivers/acpi/resource.c
|
|
@@ -430,6 +430,13 @@ static void acpi_dev_get_irqresource(struct resource *res, u32 gsi,
|
|
}
|
|
}
|
|
|
|
+static bool irq_is_legacy(struct acpi_resource_irq *irq)
|
|
+{
|
|
+ return irq->triggering == ACPI_EDGE_SENSITIVE &&
|
|
+ irq->polarity == ACPI_ACTIVE_HIGH &&
|
|
+ irq->shareable == ACPI_EXCLUSIVE;
|
|
+}
|
|
+
|
|
/**
|
|
* acpi_dev_resource_interrupt - Extract ACPI interrupt resource information.
|
|
* @ares: Input ACPI resource object.
|
|
@@ -468,7 +475,7 @@ bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,
|
|
}
|
|
acpi_dev_get_irqresource(res, irq->interrupts[index],
|
|
irq->triggering, irq->polarity,
|
|
- irq->shareable, true);
|
|
+ irq->shareable, irq_is_legacy(irq));
|
|
break;
|
|
case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
|
|
ext_irq = &ares->data.extended_irq;
|
|
diff --git a/drivers/ata/pata_ep93xx.c b/drivers/ata/pata_ep93xx.c
|
|
index badab67088935..46208ececbb6a 100644
|
|
--- a/drivers/ata/pata_ep93xx.c
|
|
+++ b/drivers/ata/pata_ep93xx.c
|
|
@@ -928,7 +928,7 @@ static int ep93xx_pata_probe(struct platform_device *pdev)
|
|
/* INT[3] (IRQ_EP93XX_EXT3) line connected as pull down */
|
|
irq = platform_get_irq(pdev, 0);
|
|
if (irq < 0) {
|
|
- err = -ENXIO;
|
|
+ err = irq;
|
|
goto err_rel_gpio;
|
|
}
|
|
|
|
diff --git a/drivers/ata/pata_octeon_cf.c b/drivers/ata/pata_octeon_cf.c
|
|
index d3d851b014a37..ac3b1fda820ff 100644
|
|
--- a/drivers/ata/pata_octeon_cf.c
|
|
+++ b/drivers/ata/pata_octeon_cf.c
|
|
@@ -898,10 +898,11 @@ static int octeon_cf_probe(struct platform_device *pdev)
|
|
return -EINVAL;
|
|
}
|
|
|
|
- irq_handler = octeon_cf_interrupt;
|
|
i = platform_get_irq(dma_dev, 0);
|
|
- if (i > 0)
|
|
+ if (i > 0) {
|
|
irq = i;
|
|
+ irq_handler = octeon_cf_interrupt;
|
|
+ }
|
|
}
|
|
of_node_put(dma_node);
|
|
}
|
|
diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c
|
|
index deae466395de1..1e6d61dc966ad 100644
|
|
--- a/drivers/ata/pata_rb532_cf.c
|
|
+++ b/drivers/ata/pata_rb532_cf.c
|
|
@@ -115,10 +115,12 @@ static int rb532_pata_driver_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0) {
|
|
+ if (irq < 0) {
|
|
dev_err(&pdev->dev, "no IRQ resource found\n");
|
|
- return -ENOENT;
|
|
+ return irq;
|
|
}
|
|
+ if (!irq)
|
|
+ return -EINVAL;
|
|
|
|
gpiod = devm_gpiod_get(&pdev->dev, NULL, GPIOD_IN);
|
|
if (IS_ERR(gpiod)) {
|
|
diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
|
|
index ad3893c62572d..bcf705f512f0f 100644
|
|
--- a/drivers/ata/sata_highbank.c
|
|
+++ b/drivers/ata/sata_highbank.c
|
|
@@ -469,10 +469,12 @@ static int ahci_highbank_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
- if (irq <= 0) {
|
|
+ if (irq < 0) {
|
|
dev_err(dev, "no irq\n");
|
|
- return -EINVAL;
|
|
+ return irq;
|
|
}
|
|
+ if (!irq)
|
|
+ return -EINVAL;
|
|
|
|
hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
|
|
if (!hpriv) {
|
|
diff --git a/drivers/char/hw_random/exynos-trng.c b/drivers/char/hw_random/exynos-trng.c
|
|
index b4b52ab23b6b1..b4e931dbff664 100644
|
|
--- a/drivers/char/hw_random/exynos-trng.c
|
|
+++ b/drivers/char/hw_random/exynos-trng.c
|
|
@@ -134,7 +134,7 @@ static int exynos_trng_probe(struct platform_device *pdev)
|
|
return PTR_ERR(trng->mem);
|
|
|
|
pm_runtime_enable(&pdev->dev);
|
|
- ret = pm_runtime_get_sync(&pdev->dev);
|
|
+ ret = pm_runtime_resume_and_get(&pdev->dev);
|
|
if (ret < 0) {
|
|
dev_err(&pdev->dev, "Could not get runtime PM.\n");
|
|
goto err_pm_get;
|
|
@@ -167,7 +167,7 @@ err_register:
|
|
clk_disable_unprepare(trng->clk);
|
|
|
|
err_clock:
|
|
- pm_runtime_put_sync(&pdev->dev);
|
|
+ pm_runtime_put_noidle(&pdev->dev);
|
|
|
|
err_pm_get:
|
|
pm_runtime_disable(&pdev->dev);
|
|
diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
|
|
index 15bf585af5d38..44117169db919 100644
|
|
--- a/drivers/char/pcmcia/cm4000_cs.c
|
|
+++ b/drivers/char/pcmcia/cm4000_cs.c
|
|
@@ -544,6 +544,10 @@ static int set_protocol(struct cm4000_dev *dev, struct ptsreq *ptsreq)
|
|
io_read_num_rec_bytes(iobase, &num_bytes_read);
|
|
if (num_bytes_read >= 4) {
|
|
DEBUGP(2, dev, "NumRecBytes = %i\n", num_bytes_read);
|
|
+ if (num_bytes_read > 4) {
|
|
+ rc = -EIO;
|
|
+ goto exit_setprotocol;
|
|
+ }
|
|
break;
|
|
}
|
|
usleep_range(10000, 11000);
|
|
diff --git a/drivers/clk/actions/owl-s500.c b/drivers/clk/actions/owl-s500.c
|
|
index 0eb83a0b70bcc..0528536ed9eb7 100644
|
|
--- a/drivers/clk/actions/owl-s500.c
|
|
+++ b/drivers/clk/actions/owl-s500.c
|
|
@@ -125,8 +125,7 @@ static struct clk_factor_table sd_factor_table[] = {
|
|
{ 12, 1, 13 }, { 13, 1, 14 }, { 14, 1, 15 }, { 15, 1, 16 },
|
|
{ 16, 1, 17 }, { 17, 1, 18 }, { 18, 1, 19 }, { 19, 1, 20 },
|
|
{ 20, 1, 21 }, { 21, 1, 22 }, { 22, 1, 23 }, { 23, 1, 24 },
|
|
- { 24, 1, 25 }, { 25, 1, 26 }, { 26, 1, 27 }, { 27, 1, 28 },
|
|
- { 28, 1, 29 }, { 29, 1, 30 }, { 30, 1, 31 }, { 31, 1, 32 },
|
|
+ { 24, 1, 25 },
|
|
|
|
/* bit8: /128 */
|
|
{ 256, 1, 1 * 128 }, { 257, 1, 2 * 128 }, { 258, 1, 3 * 128 }, { 259, 1, 4 * 128 },
|
|
@@ -135,14 +134,20 @@ static struct clk_factor_table sd_factor_table[] = {
|
|
{ 268, 1, 13 * 128 }, { 269, 1, 14 * 128 }, { 270, 1, 15 * 128 }, { 271, 1, 16 * 128 },
|
|
{ 272, 1, 17 * 128 }, { 273, 1, 18 * 128 }, { 274, 1, 19 * 128 }, { 275, 1, 20 * 128 },
|
|
{ 276, 1, 21 * 128 }, { 277, 1, 22 * 128 }, { 278, 1, 23 * 128 }, { 279, 1, 24 * 128 },
|
|
- { 280, 1, 25 * 128 }, { 281, 1, 26 * 128 }, { 282, 1, 27 * 128 }, { 283, 1, 28 * 128 },
|
|
- { 284, 1, 29 * 128 }, { 285, 1, 30 * 128 }, { 286, 1, 31 * 128 }, { 287, 1, 32 * 128 },
|
|
+ { 280, 1, 25 * 128 },
|
|
{ 0, 0, 0 },
|
|
};
|
|
|
|
-static struct clk_factor_table bisp_factor_table[] = {
|
|
- { 0, 1, 1 }, { 1, 1, 2 }, { 2, 1, 3 }, { 3, 1, 4 },
|
|
- { 4, 1, 5 }, { 5, 1, 6 }, { 6, 1, 7 }, { 7, 1, 8 },
|
|
+static struct clk_factor_table de_factor_table[] = {
|
|
+ { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 5 },
|
|
+ { 4, 1, 3 }, { 5, 1, 4 }, { 6, 1, 6 }, { 7, 1, 8 },
|
|
+ { 8, 1, 12 },
|
|
+ { 0, 0, 0 },
|
|
+};
|
|
+
|
|
+static struct clk_factor_table hde_factor_table[] = {
|
|
+ { 0, 1, 1 }, { 1, 2, 3 }, { 2, 1, 2 }, { 3, 2, 5 },
|
|
+ { 4, 1, 3 }, { 5, 1, 4 }, { 6, 1, 6 }, { 7, 1, 8 },
|
|
{ 0, 0, 0 },
|
|
};
|
|
|
|
@@ -156,6 +161,13 @@ static struct clk_div_table rmii_ref_div_table[] = {
|
|
{ 0, 0 },
|
|
};
|
|
|
|
+static struct clk_div_table std12rate_div_table[] = {
|
|
+ { 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 },
|
|
+ { 4, 5 }, { 5, 6 }, { 6, 7 }, { 7, 8 },
|
|
+ { 8, 9 }, { 9, 10 }, { 10, 11 }, { 11, 12 },
|
|
+ { 0, 0 },
|
|
+};
|
|
+
|
|
static struct clk_div_table i2s_div_table[] = {
|
|
{ 0, 1 }, { 1, 2 }, { 2, 3 }, { 3, 4 },
|
|
{ 4, 6 }, { 5, 8 }, { 6, 12 }, { 7, 16 },
|
|
@@ -188,39 +200,39 @@ static OWL_DIVIDER(rmii_ref_clk, "rmii_ref_clk", "ethernet_pll_clk", CMU_ETHERNE
|
|
|
|
/* factor clocks */
|
|
static OWL_FACTOR(ahb_clk, "ahb_clk", "h_clk", CMU_BUSCLK1, 2, 2, ahb_factor_table, 0, 0);
|
|
-static OWL_FACTOR(de1_clk, "de_clk1", "de_clk", CMU_DECLK, 0, 3, bisp_factor_table, 0, 0);
|
|
-static OWL_FACTOR(de2_clk, "de_clk2", "de_clk", CMU_DECLK, 4, 3, bisp_factor_table, 0, 0);
|
|
+static OWL_FACTOR(de1_clk, "de_clk1", "de_clk", CMU_DECLK, 0, 4, de_factor_table, 0, 0);
|
|
+static OWL_FACTOR(de2_clk, "de_clk2", "de_clk", CMU_DECLK, 4, 4, de_factor_table, 0, 0);
|
|
|
|
/* composite clocks */
|
|
static OWL_COMP_FACTOR(vce_clk, "vce_clk", hde_clk_mux_p,
|
|
OWL_MUX_HW(CMU_VCECLK, 4, 2),
|
|
OWL_GATE_HW(CMU_DEVCLKEN0, 26, 0),
|
|
- OWL_FACTOR_HW(CMU_VCECLK, 0, 3, 0, bisp_factor_table),
|
|
+ OWL_FACTOR_HW(CMU_VCECLK, 0, 3, 0, hde_factor_table),
|
|
0);
|
|
|
|
static OWL_COMP_FACTOR(vde_clk, "vde_clk", hde_clk_mux_p,
|
|
OWL_MUX_HW(CMU_VDECLK, 4, 2),
|
|
OWL_GATE_HW(CMU_DEVCLKEN0, 25, 0),
|
|
- OWL_FACTOR_HW(CMU_VDECLK, 0, 3, 0, bisp_factor_table),
|
|
+ OWL_FACTOR_HW(CMU_VDECLK, 0, 3, 0, hde_factor_table),
|
|
0);
|
|
|
|
-static OWL_COMP_FACTOR(bisp_clk, "bisp_clk", bisp_clk_mux_p,
|
|
+static OWL_COMP_DIV(bisp_clk, "bisp_clk", bisp_clk_mux_p,
|
|
OWL_MUX_HW(CMU_BISPCLK, 4, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
|
|
- OWL_FACTOR_HW(CMU_BISPCLK, 0, 3, 0, bisp_factor_table),
|
|
+ OWL_DIVIDER_HW(CMU_BISPCLK, 0, 4, 0, std12rate_div_table),
|
|
0);
|
|
|
|
-static OWL_COMP_FACTOR(sensor0_clk, "sensor0_clk", sensor_clk_mux_p,
|
|
+static OWL_COMP_DIV(sensor0_clk, "sensor0_clk", sensor_clk_mux_p,
|
|
OWL_MUX_HW(CMU_SENSORCLK, 4, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
|
|
- OWL_FACTOR_HW(CMU_SENSORCLK, 0, 3, 0, bisp_factor_table),
|
|
- CLK_IGNORE_UNUSED);
|
|
+ OWL_DIVIDER_HW(CMU_SENSORCLK, 0, 4, 0, std12rate_div_table),
|
|
+ 0);
|
|
|
|
-static OWL_COMP_FACTOR(sensor1_clk, "sensor1_clk", sensor_clk_mux_p,
|
|
+static OWL_COMP_DIV(sensor1_clk, "sensor1_clk", sensor_clk_mux_p,
|
|
OWL_MUX_HW(CMU_SENSORCLK, 4, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN0, 14, 0),
|
|
- OWL_FACTOR_HW(CMU_SENSORCLK, 8, 3, 0, bisp_factor_table),
|
|
- CLK_IGNORE_UNUSED);
|
|
+ OWL_DIVIDER_HW(CMU_SENSORCLK, 8, 4, 0, std12rate_div_table),
|
|
+ 0);
|
|
|
|
static OWL_COMP_FACTOR(sd0_clk, "sd0_clk", sd_clk_mux_p,
|
|
OWL_MUX_HW(CMU_SD0CLK, 9, 1),
|
|
@@ -300,7 +312,7 @@ static OWL_COMP_FIXED_FACTOR(i2c3_clk, "i2c3_clk", "ethernet_pll_clk",
|
|
static OWL_COMP_DIV(uart0_clk, "uart0_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART0CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 6, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART0CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p,
|
|
@@ -312,31 +324,31 @@ static OWL_COMP_DIV(uart1_clk, "uart1_clk", uart_clk_mux_p,
|
|
static OWL_COMP_DIV(uart2_clk, "uart2_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART2CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 8, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART2CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(uart3_clk, "uart3_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART3CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 19, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART3CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(uart4_clk, "uart4_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART4CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 20, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART4CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(uart5_clk, "uart5_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART5CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 21, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART5CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(uart6_clk, "uart6_clk", uart_clk_mux_p,
|
|
OWL_MUX_HW(CMU_UART6CLK, 16, 1),
|
|
OWL_GATE_HW(CMU_DEVCLKEN1, 18, 0),
|
|
- OWL_DIVIDER_HW(CMU_UART1CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
+ OWL_DIVIDER_HW(CMU_UART6CLK, 0, 8, CLK_DIVIDER_ROUND_CLOSEST, NULL),
|
|
CLK_IGNORE_UNUSED);
|
|
|
|
static OWL_COMP_DIV(i2srx_clk, "i2srx_clk", i2s_clk_mux_p,
|
|
diff --git a/drivers/clk/clk-si5341.c b/drivers/clk/clk-si5341.c
|
|
index 6e780c2a9e6ba..8f9f3d4a54fd2 100644
|
|
--- a/drivers/clk/clk-si5341.c
|
|
+++ b/drivers/clk/clk-si5341.c
|
|
@@ -304,6 +304,8 @@ static const struct si5341_reg_default si5341_reg_defaults[] = {
|
|
{ 0x094A, 0x00 }, /* INx_TO_PFD_EN (disabled) */
|
|
{ 0x0A02, 0x00 }, /* Not in datasheet */
|
|
{ 0x0B44, 0x0F }, /* PDIV_ENB (datasheet does not mention what it is) */
|
|
+ { 0x0B57, 0x10 }, /* VCO_RESET_CALCODE (not described in datasheet) */
|
|
+ { 0x0B58, 0x05 }, /* VCO_RESET_CALCODE (not described in datasheet) */
|
|
};
|
|
|
|
/* Read and interpret a 44-bit followed by a 32-bit value in the regmap */
|
|
@@ -482,6 +484,9 @@ static unsigned long si5341_synth_clk_recalc_rate(struct clk_hw *hw,
|
|
SI5341_SYNTH_N_NUM(synth->index), &n_num, &n_den);
|
|
if (err < 0)
|
|
return err;
|
|
+ /* Check for bogus/uninitialized settings */
|
|
+ if (!n_num || !n_den)
|
|
+ return 0;
|
|
|
|
/*
|
|
* n_num and n_den are shifted left as much as possible, so to prevent
|
|
@@ -665,6 +670,9 @@ static long si5341_output_clk_round_rate(struct clk_hw *hw, unsigned long rate,
|
|
{
|
|
unsigned long r;
|
|
|
|
+ if (!rate)
|
|
+ return 0;
|
|
+
|
|
r = *parent_rate >> 1;
|
|
|
|
/* If rate is an even divisor, no changes to parent required */
|
|
@@ -693,11 +701,16 @@ static int si5341_output_clk_set_rate(struct clk_hw *hw, unsigned long rate,
|
|
unsigned long parent_rate)
|
|
{
|
|
struct clk_si5341_output *output = to_clk_si5341_output(hw);
|
|
- /* Frequency divider is (r_div + 1) * 2 */
|
|
- u32 r_div = (parent_rate / rate) >> 1;
|
|
+ u32 r_div;
|
|
int err;
|
|
u8 r[3];
|
|
|
|
+ if (!rate)
|
|
+ return -EINVAL;
|
|
+
|
|
+ /* Frequency divider is (r_div + 1) * 2 */
|
|
+ r_div = (parent_rate / rate) >> 1;
|
|
+
|
|
if (r_div <= 1)
|
|
r_div = 0;
|
|
else if (r_div >= BIT(24))
|
|
@@ -924,7 +937,7 @@ static const struct si5341_reg_default si5341_preamble[] = {
|
|
{ 0x0B25, 0x00 },
|
|
{ 0x0502, 0x01 },
|
|
{ 0x0505, 0x03 },
|
|
- { 0x0957, 0x1F },
|
|
+ { 0x0957, 0x17 },
|
|
{ 0x0B4E, 0x1A },
|
|
};
|
|
|
|
diff --git a/drivers/clk/meson/g12a.c b/drivers/clk/meson/g12a.c
|
|
index 3143e16065de6..a55b22ebf103c 100644
|
|
--- a/drivers/clk/meson/g12a.c
|
|
+++ b/drivers/clk/meson/g12a.c
|
|
@@ -1602,7 +1602,7 @@ static struct clk_regmap g12b_cpub_clk_trace = {
|
|
};
|
|
|
|
static const struct pll_mult_range g12a_gp0_pll_mult_range = {
|
|
- .min = 55,
|
|
+ .min = 125,
|
|
.max = 255,
|
|
};
|
|
|
|
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
|
|
index 194a6587a1de1..c4e928375c40d 100644
|
|
--- a/drivers/cpufreq/cpufreq.c
|
|
+++ b/drivers/cpufreq/cpufreq.c
|
|
@@ -1361,9 +1361,14 @@ static int cpufreq_online(unsigned int cpu)
|
|
goto out_free_policy;
|
|
}
|
|
|
|
+ /*
|
|
+ * The initialization has succeeded and the policy is online.
|
|
+ * If there is a problem with its frequency table, take it
|
|
+ * offline and drop it.
|
|
+ */
|
|
ret = cpufreq_table_validate_and_sort(policy);
|
|
if (ret)
|
|
- goto out_exit_policy;
|
|
+ goto out_offline_policy;
|
|
|
|
/* related_cpus should at least include policy->cpus. */
|
|
cpumask_copy(policy->related_cpus, policy->cpus);
|
|
@@ -1507,6 +1512,10 @@ out_destroy_policy:
|
|
|
|
up_write(&policy->rwsem);
|
|
|
|
+out_offline_policy:
|
|
+ if (cpufreq_driver->offline)
|
|
+ cpufreq_driver->offline(policy);
|
|
+
|
|
out_exit_policy:
|
|
if (cpufreq_driver->exit)
|
|
cpufreq_driver->exit(policy);
|
|
diff --git a/drivers/crypto/cavium/nitrox/nitrox_isr.c b/drivers/crypto/cavium/nitrox/nitrox_isr.c
|
|
index 3dec570a190ad..10e3408bf704c 100644
|
|
--- a/drivers/crypto/cavium/nitrox/nitrox_isr.c
|
|
+++ b/drivers/crypto/cavium/nitrox/nitrox_isr.c
|
|
@@ -306,6 +306,10 @@ int nitrox_register_interrupts(struct nitrox_device *ndev)
|
|
* Entry 192: NPS_CORE_INT_ACTIVE
|
|
*/
|
|
nr_vecs = pci_msix_vec_count(pdev);
|
|
+ if (nr_vecs < 0) {
|
|
+ dev_err(DEV(ndev), "Error in getting vec count %d\n", nr_vecs);
|
|
+ return nr_vecs;
|
|
+ }
|
|
|
|
/* Enable MSI-X */
|
|
ret = pci_alloc_irq_vectors(pdev, nr_vecs, nr_vecs, PCI_IRQ_MSIX);
|
|
diff --git a/drivers/crypto/ccp/sp-pci.c b/drivers/crypto/ccp/sp-pci.c
|
|
index b29d2e663e104..f607b19ff4d23 100644
|
|
--- a/drivers/crypto/ccp/sp-pci.c
|
|
+++ b/drivers/crypto/ccp/sp-pci.c
|
|
@@ -213,7 +213,7 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
if (ret) {
|
|
dev_err(dev, "dma_set_mask_and_coherent failed (%d)\n",
|
|
ret);
|
|
- goto e_err;
|
|
+ goto free_irqs;
|
|
}
|
|
}
|
|
|
|
@@ -221,10 +221,12 @@ static int sp_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
|
|
|
|
ret = sp_init(sp);
|
|
if (ret)
|
|
- goto e_err;
|
|
+ goto free_irqs;
|
|
|
|
return 0;
|
|
|
|
+free_irqs:
|
|
+ sp_free_irqs(sp);
|
|
e_err:
|
|
dev_notice(dev, "initialization failed\n");
|
|
return ret;
|
|
diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
|
|
index acaa504d5a798..e02ff2b205d01 100644
|
|
--- a/drivers/crypto/ixp4xx_crypto.c
|
|
+++ b/drivers/crypto/ixp4xx_crypto.c
|
|
@@ -329,7 +329,7 @@ static void free_buf_chain(struct device *dev, struct buffer_desc *buf,
|
|
|
|
buf1 = buf->next;
|
|
phys1 = buf->phys_next;
|
|
- dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir);
|
|
+ dma_unmap_single(dev, buf->phys_addr, buf->buf_len, buf->dir);
|
|
dma_pool_free(buffer_pool, buf, phys);
|
|
buf = buf1;
|
|
phys = phys1;
|
|
diff --git a/drivers/crypto/nx/nx-842-pseries.c b/drivers/crypto/nx/nx-842-pseries.c
|
|
index 2de5e3672e423..c5ec50a28f30d 100644
|
|
--- a/drivers/crypto/nx/nx-842-pseries.c
|
|
+++ b/drivers/crypto/nx/nx-842-pseries.c
|
|
@@ -538,13 +538,15 @@ static int nx842_OF_set_defaults(struct nx842_devdata *devdata)
|
|
* The status field indicates if the device is enabled when the status
|
|
* is 'okay'. Otherwise the device driver will be disabled.
|
|
*
|
|
- * @prop - struct property point containing the maxsyncop for the update
|
|
+ * @devdata: struct nx842_devdata to use for dev_info
|
|
+ * @prop: struct property point containing the maxsyncop for the update
|
|
*
|
|
* Returns:
|
|
* 0 - Device is available
|
|
* -ENODEV - Device is not available
|
|
*/
|
|
-static int nx842_OF_upd_status(struct property *prop)
|
|
+static int nx842_OF_upd_status(struct nx842_devdata *devdata,
|
|
+ struct property *prop)
|
|
{
|
|
const char *status = (const char *)prop->value;
|
|
|
|
@@ -758,7 +760,7 @@ static int nx842_OF_upd(struct property *new_prop)
|
|
goto out;
|
|
|
|
/* Perform property updates */
|
|
- ret = nx842_OF_upd_status(status);
|
|
+ ret = nx842_OF_upd_status(new_devdata, status);
|
|
if (ret)
|
|
goto error_out;
|
|
|
|
@@ -1071,6 +1073,7 @@ static const struct vio_device_id nx842_vio_driver_ids[] = {
|
|
{"ibm,compression-v1", "ibm,compression"},
|
|
{"", ""},
|
|
};
|
|
+MODULE_DEVICE_TABLE(vio, nx842_vio_driver_ids);
|
|
|
|
static struct vio_driver nx842_vio_driver = {
|
|
.name = KBUILD_MODNAME,
|
|
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
|
|
index d7c0c982ba433..f80db1eb29945 100644
|
|
--- a/drivers/crypto/omap-sham.c
|
|
+++ b/drivers/crypto/omap-sham.c
|
|
@@ -364,7 +364,7 @@ static int omap_sham_hw_init(struct omap_sham_dev *dd)
|
|
{
|
|
int err;
|
|
|
|
- err = pm_runtime_get_sync(dd->dev);
|
|
+ err = pm_runtime_resume_and_get(dd->dev);
|
|
if (err < 0) {
|
|
dev_err(dd->dev, "failed to get sync: %d\n", err);
|
|
return err;
|
|
@@ -2236,7 +2236,7 @@ static int omap_sham_suspend(struct device *dev)
|
|
|
|
static int omap_sham_resume(struct device *dev)
|
|
{
|
|
- int err = pm_runtime_get_sync(dev);
|
|
+ int err = pm_runtime_resume_and_get(dev);
|
|
if (err < 0) {
|
|
dev_err(dev, "failed to get sync: %d\n", err);
|
|
return err;
|
|
diff --git a/drivers/crypto/qat/qat_common/qat_hal.c b/drivers/crypto/qat/qat_common/qat_hal.c
|
|
index dac130bb807ae..eda692271f0c7 100644
|
|
--- a/drivers/crypto/qat/qat_common/qat_hal.c
|
|
+++ b/drivers/crypto/qat/qat_common/qat_hal.c
|
|
@@ -1256,7 +1256,11 @@ static int qat_hal_put_rel_wr_xfer(struct icp_qat_fw_loader_handle *handle,
|
|
pr_err("QAT: bad xfrAddr=0x%x\n", xfr_addr);
|
|
return -EINVAL;
|
|
}
|
|
- qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
|
|
+ status = qat_hal_rd_rel_reg(handle, ae, ctx, ICP_GPB_REL, gprnum, &gprval);
|
|
+ if (status) {
|
|
+ pr_err("QAT: failed to read register");
|
|
+ return status;
|
|
+ }
|
|
gpr_addr = qat_hal_get_reg_addr(ICP_GPB_REL, gprnum);
|
|
data16low = 0xffff & data;
|
|
data16hi = 0xffff & (data >> 0x10);
|
|
diff --git a/drivers/crypto/qat/qat_common/qat_uclo.c b/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
index aeb03081415cb..9542423bb7ca5 100644
|
|
--- a/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
+++ b/drivers/crypto/qat/qat_common/qat_uclo.c
|
|
@@ -385,7 +385,6 @@ static int qat_uclo_init_umem_seg(struct icp_qat_fw_loader_handle *handle,
|
|
return 0;
|
|
}
|
|
|
|
-#define ICP_DH895XCC_PESRAM_BAR_SIZE 0x80000
|
|
static int qat_uclo_init_ae_memory(struct icp_qat_fw_loader_handle *handle,
|
|
struct icp_qat_uof_initmem *init_mem)
|
|
{
|
|
diff --git a/drivers/crypto/ux500/hash/hash_core.c b/drivers/crypto/ux500/hash/hash_core.c
|
|
index c172a69534777..38a66aceca2a7 100644
|
|
--- a/drivers/crypto/ux500/hash/hash_core.c
|
|
+++ b/drivers/crypto/ux500/hash/hash_core.c
|
|
@@ -1009,6 +1009,7 @@ static int hash_hw_final(struct ahash_request *req)
|
|
goto out;
|
|
}
|
|
} else if (req->nbytes == 0 && ctx->keylen > 0) {
|
|
+ ret = -EPERM;
|
|
dev_err(device_data->dev, "%s: Empty message with keylength > 0, NOT supported\n",
|
|
__func__);
|
|
goto out;
|
|
diff --git a/drivers/edac/i10nm_base.c b/drivers/edac/i10nm_base.c
|
|
index dfcde7ed95006..f72be5f94e6fa 100644
|
|
--- a/drivers/edac/i10nm_base.c
|
|
+++ b/drivers/edac/i10nm_base.c
|
|
@@ -249,6 +249,9 @@ static int __init i10nm_init(void)
|
|
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
|
|
return -EBUSY;
|
|
|
|
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
|
+ return -ENODEV;
|
|
+
|
|
id = x86_match_cpu(i10nm_cpuids);
|
|
if (!id)
|
|
return -ENODEV;
|
|
diff --git a/drivers/edac/pnd2_edac.c b/drivers/edac/pnd2_edac.c
|
|
index dac45e2071b3f..e054eb0389037 100644
|
|
--- a/drivers/edac/pnd2_edac.c
|
|
+++ b/drivers/edac/pnd2_edac.c
|
|
@@ -1555,6 +1555,9 @@ static int __init pnd2_init(void)
|
|
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
|
|
return -EBUSY;
|
|
|
|
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
|
+ return -ENODEV;
|
|
+
|
|
id = x86_match_cpu(pnd2_cpuids);
|
|
if (!id)
|
|
return -ENODEV;
|
|
diff --git a/drivers/edac/sb_edac.c b/drivers/edac/sb_edac.c
|
|
index b557a53c75c46..d39f5bfb8bd92 100644
|
|
--- a/drivers/edac/sb_edac.c
|
|
+++ b/drivers/edac/sb_edac.c
|
|
@@ -3512,6 +3512,9 @@ static int __init sbridge_init(void)
|
|
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
|
|
return -EBUSY;
|
|
|
|
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
|
+ return -ENODEV;
|
|
+
|
|
id = x86_match_cpu(sbridge_cpuids);
|
|
if (!id)
|
|
return -ENODEV;
|
|
diff --git a/drivers/edac/skx_base.c b/drivers/edac/skx_base.c
|
|
index 77cd370bd62fe..b1d717cb8df9f 100644
|
|
--- a/drivers/edac/skx_base.c
|
|
+++ b/drivers/edac/skx_base.c
|
|
@@ -605,6 +605,9 @@ static int __init skx_init(void)
|
|
if (owner && strncmp(owner, EDAC_MOD_STR, sizeof(EDAC_MOD_STR)))
|
|
return -EBUSY;
|
|
|
|
+ if (cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
|
+ return -ENODEV;
|
|
+
|
|
id = x86_match_cpu(skx_cpuids);
|
|
if (!id)
|
|
return -ENODEV;
|
|
diff --git a/drivers/edac/ti_edac.c b/drivers/edac/ti_edac.c
|
|
index 3247689467435..9ab9fa0a911bd 100644
|
|
--- a/drivers/edac/ti_edac.c
|
|
+++ b/drivers/edac/ti_edac.c
|
|
@@ -197,6 +197,7 @@ static const struct of_device_id ti_edac_of_match[] = {
|
|
{ .compatible = "ti,emif-dra7xx", .data = (void *)EMIF_TYPE_DRA7 },
|
|
{},
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, ti_edac_of_match);
|
|
|
|
static int _emif_get_id(struct device_node *node)
|
|
{
|
|
diff --git a/drivers/extcon/extcon-max8997.c b/drivers/extcon/extcon-max8997.c
|
|
index 172e116ac1ced..cac36ef59e452 100644
|
|
--- a/drivers/extcon/extcon-max8997.c
|
|
+++ b/drivers/extcon/extcon-max8997.c
|
|
@@ -729,7 +729,7 @@ static int max8997_muic_probe(struct platform_device *pdev)
|
|
2, info->status);
|
|
if (ret) {
|
|
dev_err(info->dev, "failed to read MUIC register\n");
|
|
- return ret;
|
|
+ goto err_irq;
|
|
}
|
|
cable_type = max8997_muic_get_cable_type(info,
|
|
MAX8997_CABLE_GROUP_ADC, &attached);
|
|
@@ -784,3 +784,4 @@ module_platform_driver(max8997_muic_driver);
|
|
MODULE_DESCRIPTION("Maxim MAX8997 Extcon driver");
|
|
MODULE_AUTHOR("Donggeun Kim <dg77.kim@samsung.com>");
|
|
MODULE_LICENSE("GPL");
|
|
+MODULE_ALIAS("platform:max8997-muic");
|
|
diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c
|
|
index b3d93baf4fc58..f883992800b35 100644
|
|
--- a/drivers/extcon/extcon-sm5502.c
|
|
+++ b/drivers/extcon/extcon-sm5502.c
|
|
@@ -88,7 +88,6 @@ static struct reg_data sm5502_reg_data[] = {
|
|
| SM5502_REG_INTM2_MHL_MASK,
|
|
.invert = true,
|
|
},
|
|
- { }
|
|
};
|
|
|
|
/* List of detectable cables */
|
|
diff --git a/drivers/firmware/stratix10-svc.c b/drivers/firmware/stratix10-svc.c
|
|
index b485321189e11..b2b4ba240fb11 100644
|
|
--- a/drivers/firmware/stratix10-svc.c
|
|
+++ b/drivers/firmware/stratix10-svc.c
|
|
@@ -1026,24 +1026,32 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev)
|
|
|
|
/* add svc client device(s) */
|
|
svc = devm_kzalloc(dev, sizeof(*svc), GFP_KERNEL);
|
|
- if (!svc)
|
|
- return -ENOMEM;
|
|
+ if (!svc) {
|
|
+ ret = -ENOMEM;
|
|
+ goto err_free_kfifo;
|
|
+ }
|
|
|
|
svc->stratix10_svc_rsu = platform_device_alloc(STRATIX10_RSU, 0);
|
|
if (!svc->stratix10_svc_rsu) {
|
|
dev_err(dev, "failed to allocate %s device\n", STRATIX10_RSU);
|
|
- return -ENOMEM;
|
|
+ ret = -ENOMEM;
|
|
+ goto err_free_kfifo;
|
|
}
|
|
|
|
ret = platform_device_add(svc->stratix10_svc_rsu);
|
|
- if (ret) {
|
|
- platform_device_put(svc->stratix10_svc_rsu);
|
|
- return ret;
|
|
- }
|
|
+ if (ret)
|
|
+ goto err_put_device;
|
|
+
|
|
dev_set_drvdata(dev, svc);
|
|
|
|
pr_info("Intel Service Layer Driver Initialized\n");
|
|
|
|
+ return 0;
|
|
+
|
|
+err_put_device:
|
|
+ platform_device_put(svc->stratix10_svc_rsu);
|
|
+err_free_kfifo:
|
|
+ kfifo_free(&controller->svc_fifo);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
|
|
index 9282239b4d959..cb980a60af0e8 100644
|
|
--- a/drivers/fsi/fsi-core.c
|
|
+++ b/drivers/fsi/fsi-core.c
|
|
@@ -718,7 +718,7 @@ static ssize_t cfam_read(struct file *filep, char __user *buf, size_t count,
|
|
rc = count;
|
|
fail:
|
|
*offset = off;
|
|
- return count;
|
|
+ return rc;
|
|
}
|
|
|
|
static ssize_t cfam_write(struct file *filep, const char __user *buf,
|
|
@@ -755,7 +755,7 @@ static ssize_t cfam_write(struct file *filep, const char __user *buf,
|
|
rc = count;
|
|
fail:
|
|
*offset = off;
|
|
- return count;
|
|
+ return rc;
|
|
}
|
|
|
|
static loff_t cfam_llseek(struct file *file, loff_t offset, int whence)
|
|
diff --git a/drivers/fsi/fsi-occ.c b/drivers/fsi/fsi-occ.c
|
|
index 7da9c81759ac0..8f16448045705 100644
|
|
--- a/drivers/fsi/fsi-occ.c
|
|
+++ b/drivers/fsi/fsi-occ.c
|
|
@@ -445,6 +445,7 @@ int fsi_occ_submit(struct device *dev, const void *request, size_t req_len,
|
|
goto done;
|
|
|
|
if (resp->return_status == OCC_RESP_CMD_IN_PRG ||
|
|
+ resp->return_status == OCC_RESP_CRIT_INIT ||
|
|
resp->seq_no != seq_no) {
|
|
rc = -ETIMEDOUT;
|
|
|
|
diff --git a/drivers/fsi/fsi-sbefifo.c b/drivers/fsi/fsi-sbefifo.c
|
|
index f54df9ebc8b30..c8ccc99e214fa 100644
|
|
--- a/drivers/fsi/fsi-sbefifo.c
|
|
+++ b/drivers/fsi/fsi-sbefifo.c
|
|
@@ -325,7 +325,8 @@ static int sbefifo_up_write(struct sbefifo *sbefifo, __be32 word)
|
|
static int sbefifo_request_reset(struct sbefifo *sbefifo)
|
|
{
|
|
struct device *dev = &sbefifo->fsi_dev->dev;
|
|
- u32 status, timeout;
|
|
+ unsigned long end_time;
|
|
+ u32 status;
|
|
int rc;
|
|
|
|
dev_dbg(dev, "Requesting FIFO reset\n");
|
|
@@ -341,7 +342,8 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo)
|
|
}
|
|
|
|
/* Wait for it to complete */
|
|
- for (timeout = 0; timeout < SBEFIFO_RESET_TIMEOUT; timeout++) {
|
|
+ end_time = jiffies + msecs_to_jiffies(SBEFIFO_RESET_TIMEOUT);
|
|
+ while (!time_after(jiffies, end_time)) {
|
|
rc = sbefifo_regr(sbefifo, SBEFIFO_UP | SBEFIFO_STS, &status);
|
|
if (rc) {
|
|
dev_err(dev, "Failed to read UP fifo status during reset"
|
|
@@ -355,7 +357,7 @@ static int sbefifo_request_reset(struct sbefifo *sbefifo)
|
|
return 0;
|
|
}
|
|
|
|
- msleep(1);
|
|
+ cond_resched();
|
|
}
|
|
dev_err(dev, "FIFO reset timed out\n");
|
|
|
|
@@ -400,7 +402,7 @@ static int sbefifo_cleanup_hw(struct sbefifo *sbefifo)
|
|
/* The FIFO already contains a reset request from the SBE ? */
|
|
if (down_status & SBEFIFO_STS_RESET_REQ) {
|
|
dev_info(dev, "Cleanup: FIFO reset request set, resetting\n");
|
|
- rc = sbefifo_regw(sbefifo, SBEFIFO_UP, SBEFIFO_PERFORM_RESET);
|
|
+ rc = sbefifo_regw(sbefifo, SBEFIFO_DOWN, SBEFIFO_PERFORM_RESET);
|
|
if (rc) {
|
|
sbefifo->broken = true;
|
|
dev_err(dev, "Cleanup: Reset reg write failed, rc=%d\n", rc);
|
|
diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c
|
|
index 004dc03ccf09c..918367621086c 100644
|
|
--- a/drivers/fsi/fsi-scom.c
|
|
+++ b/drivers/fsi/fsi-scom.c
|
|
@@ -38,9 +38,10 @@
|
|
#define SCOM_STATUS_PIB_RESP_MASK 0x00007000
|
|
#define SCOM_STATUS_PIB_RESP_SHIFT 12
|
|
|
|
-#define SCOM_STATUS_ANY_ERR (SCOM_STATUS_PROTECTION | \
|
|
- SCOM_STATUS_PARITY | \
|
|
- SCOM_STATUS_PIB_ABORT | \
|
|
+#define SCOM_STATUS_FSI2PIB_ERROR (SCOM_STATUS_PROTECTION | \
|
|
+ SCOM_STATUS_PARITY | \
|
|
+ SCOM_STATUS_PIB_ABORT)
|
|
+#define SCOM_STATUS_ANY_ERR (SCOM_STATUS_FSI2PIB_ERROR | \
|
|
SCOM_STATUS_PIB_RESP_MASK)
|
|
/* SCOM address encodings */
|
|
#define XSCOM_ADDR_IND_FLAG BIT_ULL(63)
|
|
@@ -240,13 +241,14 @@ static int handle_fsi2pib_status(struct scom_device *scom, uint32_t status)
|
|
{
|
|
uint32_t dummy = -1;
|
|
|
|
- if (status & SCOM_STATUS_PROTECTION)
|
|
- return -EPERM;
|
|
- if (status & SCOM_STATUS_PARITY) {
|
|
+ if (status & SCOM_STATUS_FSI2PIB_ERROR)
|
|
fsi_device_write(scom->fsi_dev, SCOM_FSI2PIB_RESET_REG, &dummy,
|
|
sizeof(uint32_t));
|
|
+
|
|
+ if (status & SCOM_STATUS_PROTECTION)
|
|
+ return -EPERM;
|
|
+ if (status & SCOM_STATUS_PARITY)
|
|
return -EIO;
|
|
- }
|
|
/* Return -EBUSY on PIB abort to force a retry */
|
|
if (status & SCOM_STATUS_PIB_ABORT)
|
|
return -EBUSY;
|
|
diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
index 272d19b677d8f..4a0dc13480973 100644
|
|
--- a/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
+++ b/drivers/gpu/drm/qxl/qxl_dumb.c
|
|
@@ -58,6 +58,8 @@ int qxl_mode_dumb_create(struct drm_file *file_priv,
|
|
surf.height = args->height;
|
|
surf.stride = pitch;
|
|
surf.format = format;
|
|
+ surf.data = 0;
|
|
+
|
|
r = qxl_gem_object_create_with_handle(qdev, file_priv,
|
|
QXL_GEM_DOMAIN_SURFACE,
|
|
args->size, &surf, &qobj,
|
|
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
index d505ea7d5384f..8f299d76b69b8 100644
|
|
--- a/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
+++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c
|
|
@@ -72,6 +72,7 @@ static int cdn_dp_grf_write(struct cdn_dp_device *dp,
|
|
ret = regmap_write(dp->grf, reg, val);
|
|
if (ret) {
|
|
DRM_DEV_ERROR(dp->dev, "Could not write to GRF: %d\n", ret);
|
|
+ clk_disable_unprepare(dp->grf_clk);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
|
|
index bc073ec5c1839..ecb59dc6c8b8b 100644
|
|
--- a/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
|
|
+++ b/drivers/gpu/drm/rockchip/dw-mipi-dsi-rockchip.c
|
|
@@ -564,13 +564,8 @@ static const struct dw_mipi_dsi_phy_ops dw_mipi_dsi_rockchip_phy_ops = {
|
|
.get_lane_mbps = dw_mipi_dsi_get_lane_mbps,
|
|
};
|
|
|
|
-static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi,
|
|
- int mux)
|
|
+static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi)
|
|
{
|
|
- if (dsi->cdata->lcdsel_grf_reg)
|
|
- regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
|
|
- mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
|
|
-
|
|
if (dsi->cdata->lanecfg1_grf_reg)
|
|
regmap_write(dsi->grf_regmap, dsi->cdata->lanecfg1_grf_reg,
|
|
dsi->cdata->lanecfg1);
|
|
@@ -584,6 +579,13 @@ static void dw_mipi_dsi_rockchip_config(struct dw_mipi_dsi_rockchip *dsi,
|
|
dsi->cdata->enable);
|
|
}
|
|
|
|
+static void dw_mipi_dsi_rockchip_set_lcdsel(struct dw_mipi_dsi_rockchip *dsi,
|
|
+ int mux)
|
|
+{
|
|
+ regmap_write(dsi->grf_regmap, dsi->cdata->lcdsel_grf_reg,
|
|
+ mux ? dsi->cdata->lcdsel_lit : dsi->cdata->lcdsel_big);
|
|
+}
|
|
+
|
|
static int
|
|
dw_mipi_dsi_encoder_atomic_check(struct drm_encoder *encoder,
|
|
struct drm_crtc_state *crtc_state,
|
|
@@ -639,9 +641,9 @@ static void dw_mipi_dsi_encoder_enable(struct drm_encoder *encoder)
|
|
return;
|
|
}
|
|
|
|
- dw_mipi_dsi_rockchip_config(dsi, mux);
|
|
+ dw_mipi_dsi_rockchip_set_lcdsel(dsi, mux);
|
|
if (dsi->slave)
|
|
- dw_mipi_dsi_rockchip_config(dsi->slave, mux);
|
|
+ dw_mipi_dsi_rockchip_set_lcdsel(dsi->slave, mux);
|
|
|
|
clk_disable_unprepare(dsi->grf_clk);
|
|
}
|
|
@@ -800,6 +802,24 @@ static int dw_mipi_dsi_rockchip_bind(struct device *dev,
|
|
return ret;
|
|
}
|
|
|
|
+ /*
|
|
+ * With the GRF clock running, write lane and dual-mode configurations
|
|
+ * that won't change immediately. If we waited until enable() to do
|
|
+ * this, things like panel preparation would not be able to send
|
|
+ * commands over DSI.
|
|
+ */
|
|
+ ret = clk_prepare_enable(dsi->grf_clk);
|
|
+ if (ret) {
|
|
+ DRM_DEV_ERROR(dsi->dev, "Failed to enable grf_clk: %d\n", ret);
|
|
+ return ret;
|
|
+ }
|
|
+
|
|
+ dw_mipi_dsi_rockchip_config(dsi);
|
|
+ if (dsi->slave)
|
|
+ dw_mipi_dsi_rockchip_config(dsi->slave);
|
|
+
|
|
+ clk_disable_unprepare(dsi->grf_clk);
|
|
+
|
|
ret = rockchip_dsi_drm_create_encoder(dsi, drm_dev);
|
|
if (ret) {
|
|
DRM_DEV_ERROR(dev, "Failed to create drm encoder\n");
|
|
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
|
|
index 550fff6e41eca..b6740ad773ee7 100644
|
|
--- a/drivers/hid/hid-core.c
|
|
+++ b/drivers/hid/hid-core.c
|
|
@@ -2299,12 +2299,8 @@ static int hid_device_remove(struct device *dev)
|
|
{
|
|
struct hid_device *hdev = to_hid_device(dev);
|
|
struct hid_driver *hdrv;
|
|
- int ret = 0;
|
|
|
|
- if (down_interruptible(&hdev->driver_input_lock)) {
|
|
- ret = -EINTR;
|
|
- goto end;
|
|
- }
|
|
+ down(&hdev->driver_input_lock);
|
|
hdev->io_started = false;
|
|
|
|
hdrv = hdev->driver;
|
|
@@ -2319,8 +2315,8 @@ static int hid_device_remove(struct device *dev)
|
|
|
|
if (!hdev->io_started)
|
|
up(&hdev->driver_input_lock);
|
|
-end:
|
|
- return ret;
|
|
+
|
|
+ return 0;
|
|
}
|
|
|
|
static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
|
|
diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
|
|
index 195910dd2154e..e3835407e8d23 100644
|
|
--- a/drivers/hid/wacom_wac.h
|
|
+++ b/drivers/hid/wacom_wac.h
|
|
@@ -122,7 +122,7 @@
|
|
#define WACOM_HID_WD_TOUCHONOFF (WACOM_HID_UP_WACOMDIGITIZER | 0x0454)
|
|
#define WACOM_HID_WD_BATTERY_LEVEL (WACOM_HID_UP_WACOMDIGITIZER | 0x043b)
|
|
#define WACOM_HID_WD_EXPRESSKEY00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0910)
|
|
-#define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0950)
|
|
+#define WACOM_HID_WD_EXPRESSKEYCAP00 (WACOM_HID_UP_WACOMDIGITIZER | 0x0940)
|
|
#define WACOM_HID_WD_MODE_CHANGE (WACOM_HID_UP_WACOMDIGITIZER | 0x0980)
|
|
#define WACOM_HID_WD_MUTE_DEVICE (WACOM_HID_UP_WACOMDIGITIZER | 0x0981)
|
|
#define WACOM_HID_WD_CONTROLPANEL (WACOM_HID_UP_WACOMDIGITIZER | 0x0982)
|
|
diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c
|
|
index e32681ee7b9f6..1671f6f9ea80c 100644
|
|
--- a/drivers/hv/hv_util.c
|
|
+++ b/drivers/hv/hv_util.c
|
|
@@ -537,8 +537,8 @@ static int hv_timesync_init(struct hv_util_service *srv)
|
|
*/
|
|
hv_ptp_clock = ptp_clock_register(&ptp_hyperv_info, NULL);
|
|
if (IS_ERR_OR_NULL(hv_ptp_clock)) {
|
|
- pr_err("cannot register PTP clock: %ld\n",
|
|
- PTR_ERR(hv_ptp_clock));
|
|
+ pr_err("cannot register PTP clock: %d\n",
|
|
+ PTR_ERR_OR_ZERO(hv_ptp_clock));
|
|
hv_ptp_clock = NULL;
|
|
}
|
|
|
|
diff --git a/drivers/hwmon/max31722.c b/drivers/hwmon/max31722.c
|
|
index 062eceb7be0db..613338cbcb170 100644
|
|
--- a/drivers/hwmon/max31722.c
|
|
+++ b/drivers/hwmon/max31722.c
|
|
@@ -6,7 +6,6 @@
|
|
* Copyright (c) 2016, Intel Corporation.
|
|
*/
|
|
|
|
-#include <linux/acpi.h>
|
|
#include <linux/hwmon.h>
|
|
#include <linux/hwmon-sysfs.h>
|
|
#include <linux/kernel.h>
|
|
@@ -133,20 +132,12 @@ static const struct spi_device_id max31722_spi_id[] = {
|
|
{"max31723", 0},
|
|
{}
|
|
};
|
|
-
|
|
-static const struct acpi_device_id __maybe_unused max31722_acpi_id[] = {
|
|
- {"MAX31722", 0},
|
|
- {"MAX31723", 0},
|
|
- {}
|
|
-};
|
|
-
|
|
MODULE_DEVICE_TABLE(spi, max31722_spi_id);
|
|
|
|
static struct spi_driver max31722_driver = {
|
|
.driver = {
|
|
.name = "max31722",
|
|
.pm = &max31722_pm_ops,
|
|
- .acpi_match_table = ACPI_PTR(max31722_acpi_id),
|
|
},
|
|
.probe = max31722_probe,
|
|
.remove = max31722_remove,
|
|
diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
|
|
index 117fb79ef294c..2baf88ead0aa8 100644
|
|
--- a/drivers/hwmon/max31790.c
|
|
+++ b/drivers/hwmon/max31790.c
|
|
@@ -27,6 +27,7 @@
|
|
|
|
/* Fan Config register bits */
|
|
#define MAX31790_FAN_CFG_RPM_MODE 0x80
|
|
+#define MAX31790_FAN_CFG_CTRL_MON 0x10
|
|
#define MAX31790_FAN_CFG_TACH_INPUT_EN 0x08
|
|
#define MAX31790_FAN_CFG_TACH_INPUT 0x01
|
|
|
|
@@ -104,7 +105,7 @@ static struct max31790_data *max31790_update_device(struct device *dev)
|
|
data->tach[NR_CHANNEL + i] = rv;
|
|
} else {
|
|
rv = i2c_smbus_read_word_swapped(client,
|
|
- MAX31790_REG_PWMOUT(i));
|
|
+ MAX31790_REG_PWM_DUTY_CYCLE(i));
|
|
if (rv < 0)
|
|
goto abort;
|
|
data->pwm[i] = rv;
|
|
@@ -170,7 +171,7 @@ static int max31790_read_fan(struct device *dev, u32 attr, int channel,
|
|
|
|
switch (attr) {
|
|
case hwmon_fan_input:
|
|
- sr = get_tach_period(data->fan_dynamics[channel]);
|
|
+ sr = get_tach_period(data->fan_dynamics[channel % NR_CHANNEL]);
|
|
rpm = RPM_FROM_REG(data->tach[channel], sr);
|
|
*val = rpm;
|
|
return 0;
|
|
@@ -271,12 +272,12 @@ static int max31790_read_pwm(struct device *dev, u32 attr, int channel,
|
|
*val = data->pwm[channel] >> 8;
|
|
return 0;
|
|
case hwmon_pwm_enable:
|
|
- if (fan_config & MAX31790_FAN_CFG_RPM_MODE)
|
|
+ if (fan_config & MAX31790_FAN_CFG_CTRL_MON)
|
|
+ *val = 0;
|
|
+ else if (fan_config & MAX31790_FAN_CFG_RPM_MODE)
|
|
*val = 2;
|
|
- else if (fan_config & MAX31790_FAN_CFG_TACH_INPUT_EN)
|
|
- *val = 1;
|
|
else
|
|
- *val = 0;
|
|
+ *val = 1;
|
|
return 0;
|
|
default:
|
|
return -EOPNOTSUPP;
|
|
@@ -299,31 +300,41 @@ static int max31790_write_pwm(struct device *dev, u32 attr, int channel,
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
- data->pwm[channel] = val << 8;
|
|
+ data->valid = false;
|
|
err = i2c_smbus_write_word_swapped(client,
|
|
MAX31790_REG_PWMOUT(channel),
|
|
- data->pwm[channel]);
|
|
+ val << 8);
|
|
break;
|
|
case hwmon_pwm_enable:
|
|
fan_config = data->fan_config[channel];
|
|
if (val == 0) {
|
|
- fan_config &= ~(MAX31790_FAN_CFG_TACH_INPUT_EN |
|
|
- MAX31790_FAN_CFG_RPM_MODE);
|
|
+ fan_config |= MAX31790_FAN_CFG_CTRL_MON;
|
|
+ /*
|
|
+ * Disable RPM mode; otherwise disabling fan speed
|
|
+ * monitoring is not possible.
|
|
+ */
|
|
+ fan_config &= ~MAX31790_FAN_CFG_RPM_MODE;
|
|
} else if (val == 1) {
|
|
- fan_config = (fan_config |
|
|
- MAX31790_FAN_CFG_TACH_INPUT_EN) &
|
|
- ~MAX31790_FAN_CFG_RPM_MODE;
|
|
+ fan_config &= ~(MAX31790_FAN_CFG_CTRL_MON | MAX31790_FAN_CFG_RPM_MODE);
|
|
} else if (val == 2) {
|
|
- fan_config |= MAX31790_FAN_CFG_TACH_INPUT_EN |
|
|
- MAX31790_FAN_CFG_RPM_MODE;
|
|
+ fan_config &= ~MAX31790_FAN_CFG_CTRL_MON;
|
|
+ /*
|
|
+ * The chip sets MAX31790_FAN_CFG_TACH_INPUT_EN on its
|
|
+ * own if MAX31790_FAN_CFG_RPM_MODE is set.
|
|
+ * Do it here as well to reflect the actual register
|
|
+ * value in the cache.
|
|
+ */
|
|
+ fan_config |= (MAX31790_FAN_CFG_RPM_MODE | MAX31790_FAN_CFG_TACH_INPUT_EN);
|
|
} else {
|
|
err = -EINVAL;
|
|
break;
|
|
}
|
|
- data->fan_config[channel] = fan_config;
|
|
- err = i2c_smbus_write_byte_data(client,
|
|
- MAX31790_REG_FAN_CONFIG(channel),
|
|
- fan_config);
|
|
+ if (fan_config != data->fan_config[channel]) {
|
|
+ err = i2c_smbus_write_byte_data(client, MAX31790_REG_FAN_CONFIG(channel),
|
|
+ fan_config);
|
|
+ if (!err)
|
|
+ data->fan_config[channel] = fan_config;
|
|
+ }
|
|
break;
|
|
default:
|
|
err = -EOPNOTSUPP;
|
|
diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
|
|
index 1574e4604a4fa..aa301c6063467 100644
|
|
--- a/drivers/iio/accel/bma180.c
|
|
+++ b/drivers/iio/accel/bma180.c
|
|
@@ -119,7 +119,11 @@ struct bma180_data {
|
|
int scale;
|
|
int bw;
|
|
bool pmode;
|
|
- u8 buff[16]; /* 3x 16-bit + 8-bit + padding + timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chan[4];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
enum bma180_chan {
|
|
@@ -675,12 +679,12 @@ static irqreturn_t bma180_trigger_handler(int irq, void *p)
|
|
mutex_unlock(&data->mutex);
|
|
goto err;
|
|
}
|
|
- ((s16 *)data->buff)[i++] = ret;
|
|
+ data->scan.chan[i++] = ret;
|
|
}
|
|
|
|
mutex_unlock(&data->mutex);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buff, time_ns);
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan, time_ns);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
|
|
diff --git a/drivers/iio/accel/bma220_spi.c b/drivers/iio/accel/bma220_spi.c
|
|
index cae905039cb62..71ee42b0266de 100644
|
|
--- a/drivers/iio/accel/bma220_spi.c
|
|
+++ b/drivers/iio/accel/bma220_spi.c
|
|
@@ -73,7 +73,11 @@ static const int bma220_scale_table[][4] = {
|
|
struct bma220_data {
|
|
struct spi_device *spi_device;
|
|
struct mutex lock;
|
|
- s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 8x8 timestamp */
|
|
+ struct {
|
|
+ s8 chans[3];
|
|
+ /* Ensure timestamp is naturally aligned. */
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u8 tx_buf[2] ____cacheline_aligned;
|
|
};
|
|
|
|
@@ -104,12 +108,12 @@ static irqreturn_t bma220_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->lock);
|
|
data->tx_buf[0] = BMA220_REG_ACCEL_X | BMA220_READ_MASK;
|
|
- ret = spi_write_then_read(spi, data->tx_buf, 1, data->buffer,
|
|
+ ret = spi_write_then_read(spi, data->tx_buf, 1, &data->scan.chans,
|
|
ARRAY_SIZE(bma220_channels) - 1);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
mutex_unlock(&data->lock);
|
|
diff --git a/drivers/iio/accel/hid-sensor-accel-3d.c b/drivers/iio/accel/hid-sensor-accel-3d.c
|
|
index 0d9e2def2b257..f908476fa095d 100644
|
|
--- a/drivers/iio/accel/hid-sensor-accel-3d.c
|
|
+++ b/drivers/iio/accel/hid-sensor-accel-3d.c
|
|
@@ -29,8 +29,11 @@ struct accel_3d_state {
|
|
struct hid_sensor_hub_callbacks callbacks;
|
|
struct hid_sensor_common common_attributes;
|
|
struct hid_sensor_hub_attribute_info accel[ACCEL_3D_CHANNEL_MAX];
|
|
- /* Reserve for 3 channels + padding + timestamp */
|
|
- u32 accel_val[ACCEL_3D_CHANNEL_MAX + 3];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u32 accel_val[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
int scale_pre_decml;
|
|
int scale_post_decml;
|
|
int scale_precision;
|
|
@@ -241,8 +244,8 @@ static int accel_3d_proc_event(struct hid_sensor_hub_device *hsdev,
|
|
accel_state->timestamp = iio_get_time_ns(indio_dev);
|
|
|
|
hid_sensor_push_data(indio_dev,
|
|
- accel_state->accel_val,
|
|
- sizeof(accel_state->accel_val),
|
|
+ &accel_state->scan,
|
|
+ sizeof(accel_state->scan),
|
|
accel_state->timestamp);
|
|
|
|
accel_state->timestamp = 0;
|
|
@@ -267,7 +270,7 @@ static int accel_3d_capture_sample(struct hid_sensor_hub_device *hsdev,
|
|
case HID_USAGE_SENSOR_ACCEL_Y_AXIS:
|
|
case HID_USAGE_SENSOR_ACCEL_Z_AXIS:
|
|
offset = usage_id - HID_USAGE_SENSOR_ACCEL_X_AXIS;
|
|
- accel_state->accel_val[CHANNEL_SCAN_INDEX_X + offset] =
|
|
+ accel_state->scan.accel_val[CHANNEL_SCAN_INDEX_X + offset] =
|
|
*(u32 *)raw_data;
|
|
ret = 0;
|
|
break;
|
|
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
|
|
index da9452e811056..57db60bf2d4ca 100644
|
|
--- a/drivers/iio/accel/kxcjk-1013.c
|
|
+++ b/drivers/iio/accel/kxcjk-1013.c
|
|
@@ -132,12 +132,23 @@ enum kx_acpi_type {
|
|
ACPI_KIOX010A,
|
|
};
|
|
|
|
+enum kxcjk1013_axis {
|
|
+ AXIS_X,
|
|
+ AXIS_Y,
|
|
+ AXIS_Z,
|
|
+ AXIS_MAX
|
|
+};
|
|
+
|
|
struct kxcjk1013_data {
|
|
struct i2c_client *client;
|
|
struct iio_trigger *dready_trig;
|
|
struct iio_trigger *motion_trig;
|
|
struct mutex mutex;
|
|
- s16 buffer[8];
|
|
+ /* Ensure timestamp naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[AXIS_MAX];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u8 odr_bits;
|
|
u8 range;
|
|
int wake_thres;
|
|
@@ -151,13 +162,6 @@ struct kxcjk1013_data {
|
|
enum kx_acpi_type acpi_type;
|
|
};
|
|
|
|
-enum kxcjk1013_axis {
|
|
- AXIS_X,
|
|
- AXIS_Y,
|
|
- AXIS_Z,
|
|
- AXIS_MAX,
|
|
-};
|
|
-
|
|
enum kxcjk1013_mode {
|
|
STANDBY,
|
|
OPERATION,
|
|
@@ -1078,12 +1082,12 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
|
|
KXCJK1013_REG_XOUT_L,
|
|
AXIS_MAX * 2,
|
|
- (u8 *)data->buffer);
|
|
+ (u8 *)data->scan.chans);
|
|
mutex_unlock(&data->mutex);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
data->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/accel/mxc4005.c b/drivers/iio/accel/mxc4005.c
|
|
index 3d5bea651923e..d81b02642a0b3 100644
|
|
--- a/drivers/iio/accel/mxc4005.c
|
|
+++ b/drivers/iio/accel/mxc4005.c
|
|
@@ -56,7 +56,11 @@ struct mxc4005_data {
|
|
struct mutex mutex;
|
|
struct regmap *regmap;
|
|
struct iio_trigger *dready_trig;
|
|
- __be16 buffer[8];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ __be16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
bool trigger_enabled;
|
|
};
|
|
|
|
@@ -135,7 +139,7 @@ static int mxc4005_read_xyz(struct mxc4005_data *data)
|
|
int ret;
|
|
|
|
ret = regmap_bulk_read(data->regmap, MXC4005_REG_XOUT_UPPER,
|
|
- (u8 *) data->buffer, sizeof(data->buffer));
|
|
+ data->scan.chans, sizeof(data->scan.chans));
|
|
if (ret < 0) {
|
|
dev_err(data->dev, "failed to read axes\n");
|
|
return ret;
|
|
@@ -150,7 +154,7 @@ static int mxc4005_read_axis(struct mxc4005_data *data,
|
|
__be16 reg;
|
|
int ret;
|
|
|
|
- ret = regmap_bulk_read(data->regmap, addr, (u8 *) ®, sizeof(reg));
|
|
+ ret = regmap_bulk_read(data->regmap, addr, ®, sizeof(reg));
|
|
if (ret < 0) {
|
|
dev_err(data->dev, "failed to read reg %02x\n", addr);
|
|
return ret;
|
|
@@ -301,7 +305,7 @@ static irqreturn_t mxc4005_trigger_handler(int irq, void *private)
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
|
|
err:
|
|
diff --git a/drivers/iio/accel/stk8312.c b/drivers/iio/accel/stk8312.c
|
|
index 58c160ccdee71..be66b85239778 100644
|
|
--- a/drivers/iio/accel/stk8312.c
|
|
+++ b/drivers/iio/accel/stk8312.c
|
|
@@ -103,7 +103,11 @@ struct stk8312_data {
|
|
u8 mode;
|
|
struct iio_trigger *dready_trig;
|
|
bool dready_trigger_on;
|
|
- s8 buffer[16]; /* 3x8-bit channels + 5x8 padding + 64-bit timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s8 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static IIO_CONST_ATTR(in_accel_scale_available, STK8312_SCALE_AVAIL);
|
|
@@ -438,7 +442,7 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data(data->client,
|
|
STK8312_REG_XOUT,
|
|
STK8312_ALL_CHANNEL_SIZE,
|
|
- data->buffer);
|
|
+ data->scan.chans);
|
|
if (ret < STK8312_ALL_CHANNEL_SIZE) {
|
|
dev_err(&data->client->dev, "register read failed\n");
|
|
mutex_unlock(&data->lock);
|
|
@@ -452,12 +456,12 @@ static irqreturn_t stk8312_trigger_handler(int irq, void *p)
|
|
mutex_unlock(&data->lock);
|
|
goto err;
|
|
}
|
|
- data->buffer[i++] = ret;
|
|
+ data->scan.chans[i++] = ret;
|
|
}
|
|
}
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/accel/stk8ba50.c b/drivers/iio/accel/stk8ba50.c
|
|
index c70ddec29eb49..edba3c13a979f 100644
|
|
--- a/drivers/iio/accel/stk8ba50.c
|
|
+++ b/drivers/iio/accel/stk8ba50.c
|
|
@@ -91,12 +91,11 @@ struct stk8ba50_data {
|
|
u8 sample_rate_idx;
|
|
struct iio_trigger *dready_trig;
|
|
bool dready_trigger_on;
|
|
- /*
|
|
- * 3 x 16-bit channels (10-bit data, 6-bit padding) +
|
|
- * 1 x 16 padding +
|
|
- * 4 x 16 64-bit timestamp
|
|
- */
|
|
- s16 buffer[8];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[3];
|
|
+ s64 timetamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define STK8BA50_ACCEL_CHANNEL(index, reg, axis) { \
|
|
@@ -324,7 +323,7 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
|
|
ret = i2c_smbus_read_i2c_block_data(data->client,
|
|
STK8BA50_REG_XOUT,
|
|
STK8BA50_ALL_CHANNEL_SIZE,
|
|
- (u8 *)data->buffer);
|
|
+ (u8 *)data->scan.chans);
|
|
if (ret < STK8BA50_ALL_CHANNEL_SIZE) {
|
|
dev_err(&data->client->dev, "register read failed\n");
|
|
goto err;
|
|
@@ -337,10 +336,10 @@ static irqreturn_t stk8ba50_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- data->buffer[i++] = ret;
|
|
+ data->scan.chans[i++] = ret;
|
|
}
|
|
}
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
mutex_unlock(&data->lock);
|
|
diff --git a/drivers/iio/adc/at91-sama5d2_adc.c b/drivers/iio/adc/at91-sama5d2_adc.c
|
|
index 2c01963a6a5cf..def4abeb47cae 100644
|
|
--- a/drivers/iio/adc/at91-sama5d2_adc.c
|
|
+++ b/drivers/iio/adc/at91-sama5d2_adc.c
|
|
@@ -399,7 +399,9 @@ struct at91_adc_state {
|
|
wait_queue_head_t wq_data_available;
|
|
struct at91_adc_dma dma_st;
|
|
struct at91_adc_touch touch_st;
|
|
- u16 buffer[AT91_BUFFER_MAX_HWORDS];
|
|
+ struct iio_dev *indio_dev;
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ u16 buffer[AT91_BUFFER_MAX_HWORDS] __aligned(8);
|
|
/*
|
|
* lock to prevent concurrent 'single conversion' requests through
|
|
* sysfs.
|
|
@@ -624,13 +626,13 @@ static u16 at91_adc_touch_pos(struct at91_adc_state *st, int reg)
|
|
/* first half of register is the x or y, second half is the scale */
|
|
val = at91_adc_readl(st, reg);
|
|
if (!val)
|
|
- dev_dbg(&iio_priv_to_dev(st)->dev, "pos is 0\n");
|
|
+ dev_dbg(&st->indio_dev->dev, "pos is 0\n");
|
|
|
|
pos = val & AT91_SAMA5D2_XYZ_MASK;
|
|
result = (pos << AT91_SAMA5D2_MAX_POS_BITS) - pos;
|
|
scale = (val >> 16) & AT91_SAMA5D2_XYZ_MASK;
|
|
if (scale == 0) {
|
|
- dev_err(&iio_priv_to_dev(st)->dev, "scale is 0\n");
|
|
+ dev_err(&st->indio_dev->dev, "scale is 0\n");
|
|
return 0;
|
|
}
|
|
result /= scale;
|
|
@@ -1154,9 +1156,9 @@ static unsigned at91_adc_startup_time(unsigned startup_time_min,
|
|
return i;
|
|
}
|
|
|
|
-static void at91_adc_setup_samp_freq(struct at91_adc_state *st, unsigned freq)
|
|
+static void at91_adc_setup_samp_freq(struct iio_dev *indio_dev, unsigned freq)
|
|
{
|
|
- struct iio_dev *indio_dev = iio_priv_to_dev(st);
|
|
+ struct at91_adc_state *st = iio_priv(indio_dev);
|
|
unsigned f_per, prescal, startup, mr;
|
|
|
|
f_per = clk_get_rate(st->per_clk);
|
|
@@ -1225,9 +1227,9 @@ static void at91_adc_pen_detect_interrupt(struct at91_adc_state *st)
|
|
st->touch_st.touching = true;
|
|
}
|
|
|
|
-static void at91_adc_no_pen_detect_interrupt(struct at91_adc_state *st)
|
|
+static void at91_adc_no_pen_detect_interrupt(struct iio_dev *indio_dev)
|
|
{
|
|
- struct iio_dev *indio_dev = iio_priv_to_dev(st);
|
|
+ struct at91_adc_state *st = iio_priv(indio_dev);
|
|
|
|
at91_adc_writel(st, AT91_SAMA5D2_TRGR,
|
|
AT91_SAMA5D2_TRGR_TRGMOD_NO_TRIGGER);
|
|
@@ -1247,7 +1249,7 @@ static void at91_adc_workq_handler(struct work_struct *workq)
|
|
struct at91_adc_touch, workq);
|
|
struct at91_adc_state *st = container_of(touch_st,
|
|
struct at91_adc_state, touch_st);
|
|
- struct iio_dev *indio_dev = iio_priv_to_dev(st);
|
|
+ struct iio_dev *indio_dev = st->indio_dev;
|
|
|
|
iio_push_to_buffers(indio_dev, st->buffer);
|
|
}
|
|
@@ -1268,7 +1270,7 @@ static irqreturn_t at91_adc_interrupt(int irq, void *private)
|
|
at91_adc_pen_detect_interrupt(st);
|
|
} else if ((status & AT91_SAMA5D2_IER_NOPEN)) {
|
|
/* nopen detected IRQ */
|
|
- at91_adc_no_pen_detect_interrupt(st);
|
|
+ at91_adc_no_pen_detect_interrupt(indio);
|
|
} else if ((status & AT91_SAMA5D2_ISR_PENS) &&
|
|
((status & rdy_mask) == rdy_mask)) {
|
|
/* periodic trigger IRQ - during pen sense */
|
|
@@ -1435,7 +1437,7 @@ static int at91_adc_write_raw(struct iio_dev *indio_dev,
|
|
val > st->soc_info.max_sample_rate)
|
|
return -EINVAL;
|
|
|
|
- at91_adc_setup_samp_freq(st, val);
|
|
+ at91_adc_setup_samp_freq(indio_dev, val);
|
|
return 0;
|
|
default:
|
|
return -EINVAL;
|
|
@@ -1573,8 +1575,10 @@ static int at91_adc_update_scan_mode(struct iio_dev *indio_dev,
|
|
return 0;
|
|
}
|
|
|
|
-static void at91_adc_hw_init(struct at91_adc_state *st)
|
|
+static void at91_adc_hw_init(struct iio_dev *indio_dev)
|
|
{
|
|
+ struct at91_adc_state *st = iio_priv(indio_dev);
|
|
+
|
|
at91_adc_writel(st, AT91_SAMA5D2_CR, AT91_SAMA5D2_CR_SWRST);
|
|
at91_adc_writel(st, AT91_SAMA5D2_IDR, 0xffffffff);
|
|
/*
|
|
@@ -1584,7 +1588,7 @@ static void at91_adc_hw_init(struct at91_adc_state *st)
|
|
at91_adc_writel(st, AT91_SAMA5D2_MR,
|
|
AT91_SAMA5D2_MR_TRANSFER(2) | AT91_SAMA5D2_MR_ANACH);
|
|
|
|
- at91_adc_setup_samp_freq(st, st->soc_info.min_sample_rate);
|
|
+ at91_adc_setup_samp_freq(indio_dev, st->soc_info.min_sample_rate);
|
|
|
|
/* configure extended mode register */
|
|
at91_adc_config_emr(st);
|
|
@@ -1667,6 +1671,7 @@ static int at91_adc_probe(struct platform_device *pdev)
|
|
indio_dev->num_channels = ARRAY_SIZE(at91_adc_channels);
|
|
|
|
st = iio_priv(indio_dev);
|
|
+ st->indio_dev = indio_dev;
|
|
|
|
bitmap_set(&st->touch_st.channels_bitmask,
|
|
AT91_SAMA5D2_TOUCH_X_CHAN_IDX, 1);
|
|
@@ -1778,7 +1783,7 @@ static int at91_adc_probe(struct platform_device *pdev)
|
|
goto vref_disable;
|
|
}
|
|
|
|
- at91_adc_hw_init(st);
|
|
+ at91_adc_hw_init(indio_dev);
|
|
|
|
ret = clk_prepare_enable(st->per_clk);
|
|
if (ret)
|
|
@@ -1894,7 +1899,7 @@ static __maybe_unused int at91_adc_resume(struct device *dev)
|
|
if (ret)
|
|
goto vref_disable_resume;
|
|
|
|
- at91_adc_hw_init(st);
|
|
+ at91_adc_hw_init(indio_dev);
|
|
|
|
/* reconfiguring trigger hardware state */
|
|
if (!iio_buffer_enabled(indio_dev))
|
|
diff --git a/drivers/iio/adc/hx711.c b/drivers/iio/adc/hx711.c
|
|
index 62e6c8badd22a..a3265166fd835 100644
|
|
--- a/drivers/iio/adc/hx711.c
|
|
+++ b/drivers/iio/adc/hx711.c
|
|
@@ -85,9 +85,9 @@ struct hx711_data {
|
|
struct mutex lock;
|
|
/*
|
|
* triggered buffer
|
|
- * 2x32-bit channel + 64-bit timestamp
|
|
+ * 2x32-bit channel + 64-bit naturally aligned timestamp
|
|
*/
|
|
- u32 buffer[4];
|
|
+ u32 buffer[4] __aligned(8);
|
|
/*
|
|
* delay after a rising edge on SCK until the data is ready DOUT
|
|
* this is dependent on the hx711 where the datasheet tells a
|
|
diff --git a/drivers/iio/adc/mxs-lradc-adc.c b/drivers/iio/adc/mxs-lradc-adc.c
|
|
index 9d2f74c2489a8..01f85bbe6a2e5 100644
|
|
--- a/drivers/iio/adc/mxs-lradc-adc.c
|
|
+++ b/drivers/iio/adc/mxs-lradc-adc.c
|
|
@@ -115,7 +115,8 @@ struct mxs_lradc_adc {
|
|
struct device *dev;
|
|
|
|
void __iomem *base;
|
|
- u32 buffer[10];
|
|
+ /* Maximum of 8 channels + 8 byte ts */
|
|
+ u32 buffer[10] __aligned(8);
|
|
struct iio_trigger *trig;
|
|
struct completion completion;
|
|
spinlock_t lock;
|
|
diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
|
|
index 871690a476610..7929891f568eb 100644
|
|
--- a/drivers/iio/adc/ti-ads1015.c
|
|
+++ b/drivers/iio/adc/ti-ads1015.c
|
|
@@ -388,10 +388,14 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
|
|
struct iio_poll_func *pf = p;
|
|
struct iio_dev *indio_dev = pf->indio_dev;
|
|
struct ads1015_data *data = iio_priv(indio_dev);
|
|
- s16 buf[8]; /* 1x s16 ADC val + 3x s16 padding + 4x s16 timestamp */
|
|
+ /* Ensure natural alignment of timestamp */
|
|
+ struct {
|
|
+ s16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
int chan, ret, res;
|
|
|
|
- memset(buf, 0, sizeof(buf));
|
|
+ memset(&scan, 0, sizeof(scan));
|
|
|
|
mutex_lock(&data->lock);
|
|
chan = find_first_bit(indio_dev->active_scan_mask,
|
|
@@ -402,10 +406,10 @@ static irqreturn_t ads1015_trigger_handler(int irq, void *p)
|
|
goto err;
|
|
}
|
|
|
|
- buf[0] = res;
|
|
+ scan.chan = res;
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, buf,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
err:
|
|
diff --git a/drivers/iio/adc/ti-ads8688.c b/drivers/iio/adc/ti-ads8688.c
|
|
index 14fe7c320b522..55a2d619d6dda 100644
|
|
--- a/drivers/iio/adc/ti-ads8688.c
|
|
+++ b/drivers/iio/adc/ti-ads8688.c
|
|
@@ -383,7 +383,8 @@ static irqreturn_t ads8688_trigger_handler(int irq, void *p)
|
|
{
|
|
struct iio_poll_func *pf = p;
|
|
struct iio_dev *indio_dev = pf->indio_dev;
|
|
- u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)];
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ u16 buffer[ADS8688_MAX_CHANNELS + sizeof(s64)/sizeof(u16)] __aligned(8);
|
|
int i, j = 0;
|
|
|
|
for (i = 0; i < indio_dev->masklength; i++) {
|
|
diff --git a/drivers/iio/adc/vf610_adc.c b/drivers/iio/adc/vf610_adc.c
|
|
index 98b30475bbc6a..0d29fe974d70e 100644
|
|
--- a/drivers/iio/adc/vf610_adc.c
|
|
+++ b/drivers/iio/adc/vf610_adc.c
|
|
@@ -167,7 +167,11 @@ struct vf610_adc {
|
|
u32 sample_freq_avail[5];
|
|
|
|
struct completion completion;
|
|
- u16 buffer[8];
|
|
+ /* Ensure the timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static const u32 vf610_hw_avgs[] = { 1, 4, 8, 16, 32 };
|
|
@@ -579,9 +583,9 @@ static irqreturn_t vf610_adc_isr(int irq, void *dev_id)
|
|
if (coco & VF610_ADC_HS_COCO0) {
|
|
info->value = vf610_adc_read_data(info);
|
|
if (iio_buffer_enabled(indio_dev)) {
|
|
- info->buffer[0] = info->value;
|
|
+ info->scan.chan = info->value;
|
|
iio_push_to_buffers_with_timestamp(indio_dev,
|
|
- info->buffer,
|
|
+ &info->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
} else
|
|
diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c
|
|
index 428ddfc13acb9..276bed47e8d66 100644
|
|
--- a/drivers/iio/gyro/bmg160_core.c
|
|
+++ b/drivers/iio/gyro/bmg160_core.c
|
|
@@ -96,7 +96,11 @@ struct bmg160_data {
|
|
struct iio_trigger *motion_trig;
|
|
struct iio_mount_matrix orientation;
|
|
struct mutex mutex;
|
|
- s16 buffer[8];
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ struct {
|
|
+ s16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u32 dps_range;
|
|
int ev_enable_state;
|
|
int slope_thres;
|
|
@@ -880,12 +884,12 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->mutex);
|
|
ret = regmap_bulk_read(data->regmap, BMG160_REG_XOUT_L,
|
|
- data->buffer, AXIS_MAX * 2);
|
|
+ data->scan.chans, AXIS_MAX * 2);
|
|
mutex_unlock(&data->mutex);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/humidity/am2315.c b/drivers/iio/humidity/am2315.c
|
|
index 3bac98e731d9c..894922a315fe6 100644
|
|
--- a/drivers/iio/humidity/am2315.c
|
|
+++ b/drivers/iio/humidity/am2315.c
|
|
@@ -33,7 +33,11 @@
|
|
struct am2315_data {
|
|
struct i2c_client *client;
|
|
struct mutex lock;
|
|
- s16 buffer[8]; /* 2x16-bit channels + 2x16 padding + 4x16 timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chans[2];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
struct am2315_sensor_data {
|
|
@@ -167,20 +171,20 @@ static irqreturn_t am2315_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->lock);
|
|
if (*(indio_dev->active_scan_mask) == AM2315_ALL_CHANNEL_MASK) {
|
|
- data->buffer[0] = sensor_data.hum_data;
|
|
- data->buffer[1] = sensor_data.temp_data;
|
|
+ data->scan.chans[0] = sensor_data.hum_data;
|
|
+ data->scan.chans[1] = sensor_data.temp_data;
|
|
} else {
|
|
i = 0;
|
|
for_each_set_bit(bit, indio_dev->active_scan_mask,
|
|
indio_dev->masklength) {
|
|
- data->buffer[i] = (bit ? sensor_data.temp_data :
|
|
- sensor_data.hum_data);
|
|
+ data->scan.chans[i] = (bit ? sensor_data.temp_data :
|
|
+ sensor_data.hum_data);
|
|
i++;
|
|
}
|
|
}
|
|
mutex_unlock(&data->lock);
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
err:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/imu/adis16400.c b/drivers/iio/imu/adis16400.c
|
|
index 59e33302042c5..afa9d26362da2 100644
|
|
--- a/drivers/iio/imu/adis16400.c
|
|
+++ b/drivers/iio/imu/adis16400.c
|
|
@@ -651,9 +651,6 @@ static irqreturn_t adis16400_trigger_handler(int irq, void *p)
|
|
void *buffer;
|
|
int ret;
|
|
|
|
- if (!adis->buffer)
|
|
- return -ENOMEM;
|
|
-
|
|
if (!(st->variant->flags & ADIS16400_NO_BURST) &&
|
|
st->adis.spi->max_speed_hz > ADIS16400_SPI_BURST) {
|
|
st->adis.spi->max_speed_hz = ADIS16400_SPI_BURST;
|
|
diff --git a/drivers/iio/imu/adis_buffer.c b/drivers/iio/imu/adis_buffer.c
|
|
index 4998a89d083d5..8f8c1a87567b2 100644
|
|
--- a/drivers/iio/imu/adis_buffer.c
|
|
+++ b/drivers/iio/imu/adis_buffer.c
|
|
@@ -125,9 +125,6 @@ static irqreturn_t adis_trigger_handler(int irq, void *p)
|
|
struct adis *adis = iio_device_get_drvdata(indio_dev);
|
|
int ret;
|
|
|
|
- if (!adis->buffer)
|
|
- return -ENOMEM;
|
|
-
|
|
if (adis->data->has_paging) {
|
|
mutex_lock(&adis->txrx_lock);
|
|
if (adis->current_page != 0) {
|
|
diff --git a/drivers/iio/light/isl29125.c b/drivers/iio/light/isl29125.c
|
|
index e37894f0ae0b6..15906925e588b 100644
|
|
--- a/drivers/iio/light/isl29125.c
|
|
+++ b/drivers/iio/light/isl29125.c
|
|
@@ -51,7 +51,11 @@
|
|
struct isl29125_data {
|
|
struct i2c_client *client;
|
|
u8 conf1;
|
|
- u16 buffer[8]; /* 3x 16-bit, padding, 8 bytes timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define ISL29125_CHANNEL(_color, _si) { \
|
|
@@ -184,10 +188,10 @@ static irqreturn_t isl29125_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- data->buffer[j++] = ret;
|
|
+ data->scan.chans[j++] = ret;
|
|
}
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
|
|
index ceddb6a3b61bb..8bc01e8a424b0 100644
|
|
--- a/drivers/iio/light/ltr501.c
|
|
+++ b/drivers/iio/light/ltr501.c
|
|
@@ -32,9 +32,12 @@
|
|
#define LTR501_PART_ID 0x86
|
|
#define LTR501_MANUFAC_ID 0x87
|
|
#define LTR501_ALS_DATA1 0x88 /* 16-bit, little endian */
|
|
+#define LTR501_ALS_DATA1_UPPER 0x89 /* upper 8 bits of LTR501_ALS_DATA1 */
|
|
#define LTR501_ALS_DATA0 0x8a /* 16-bit, little endian */
|
|
+#define LTR501_ALS_DATA0_UPPER 0x8b /* upper 8 bits of LTR501_ALS_DATA0 */
|
|
#define LTR501_ALS_PS_STATUS 0x8c
|
|
#define LTR501_PS_DATA 0x8d /* 16-bit, little endian */
|
|
+#define LTR501_PS_DATA_UPPER 0x8e /* upper 8 bits of LTR501_PS_DATA */
|
|
#define LTR501_INTR 0x8f /* output mode, polarity, mode */
|
|
#define LTR501_PS_THRESH_UP 0x90 /* 11 bit, ps upper threshold */
|
|
#define LTR501_PS_THRESH_LOW 0x92 /* 11 bit, ps lower threshold */
|
|
@@ -405,18 +408,19 @@ static int ltr501_read_als(struct ltr501_data *data, __le16 buf[2])
|
|
|
|
static int ltr501_read_ps(struct ltr501_data *data)
|
|
{
|
|
- int ret, status;
|
|
+ __le16 status;
|
|
+ int ret;
|
|
|
|
ret = ltr501_drdy(data, LTR501_STATUS_PS_RDY);
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
ret = regmap_bulk_read(data->regmap, LTR501_PS_DATA,
|
|
- &status, 2);
|
|
+ &status, sizeof(status));
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- return status;
|
|
+ return le16_to_cpu(status);
|
|
}
|
|
|
|
static int ltr501_read_intr_prst(struct ltr501_data *data,
|
|
@@ -1204,7 +1208,7 @@ static struct ltr501_chip_info ltr501_chip_info_tbl[] = {
|
|
.als_gain_tbl_size = ARRAY_SIZE(ltr559_als_gain_tbl),
|
|
.ps_gain = ltr559_ps_gain_tbl,
|
|
.ps_gain_tbl_size = ARRAY_SIZE(ltr559_ps_gain_tbl),
|
|
- .als_mode_active = BIT(1),
|
|
+ .als_mode_active = BIT(0),
|
|
.als_gain_mask = BIT(2) | BIT(3) | BIT(4),
|
|
.als_gain_shift = 2,
|
|
.info = <r501_info,
|
|
@@ -1353,9 +1357,12 @@ static bool ltr501_is_volatile_reg(struct device *dev, unsigned int reg)
|
|
{
|
|
switch (reg) {
|
|
case LTR501_ALS_DATA1:
|
|
+ case LTR501_ALS_DATA1_UPPER:
|
|
case LTR501_ALS_DATA0:
|
|
+ case LTR501_ALS_DATA0_UPPER:
|
|
case LTR501_ALS_PS_STATUS:
|
|
case LTR501_PS_DATA:
|
|
+ case LTR501_PS_DATA_UPPER:
|
|
return true;
|
|
default:
|
|
return false;
|
|
diff --git a/drivers/iio/light/tcs3414.c b/drivers/iio/light/tcs3414.c
|
|
index 7c0291c5fe76e..85bfe3b63f4fe 100644
|
|
--- a/drivers/iio/light/tcs3414.c
|
|
+++ b/drivers/iio/light/tcs3414.c
|
|
@@ -53,7 +53,11 @@ struct tcs3414_data {
|
|
u8 control;
|
|
u8 gain;
|
|
u8 timing;
|
|
- u16 buffer[8]; /* 4x 16-bit + 8 bytes timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chans[4];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
#define TCS3414_CHANNEL(_color, _si, _addr) { \
|
|
@@ -209,10 +213,10 @@ static irqreturn_t tcs3414_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- data->buffer[j++] = ret;
|
|
+ data->scan.chans[j++] = ret;
|
|
}
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
diff --git a/drivers/iio/light/tcs3472.c b/drivers/iio/light/tcs3472.c
|
|
index 12ad344410103..9ea543c5cf5e6 100644
|
|
--- a/drivers/iio/light/tcs3472.c
|
|
+++ b/drivers/iio/light/tcs3472.c
|
|
@@ -64,7 +64,11 @@ struct tcs3472_data {
|
|
u8 control;
|
|
u8 atime;
|
|
u8 apers;
|
|
- u16 buffer[8]; /* 4 16-bit channels + 64-bit timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chans[4];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static const struct iio_event_spec tcs3472_events[] = {
|
|
@@ -386,10 +390,10 @@ static irqreturn_t tcs3472_trigger_handler(int irq, void *p)
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- data->buffer[j++] = ret;
|
|
+ data->scan.chans[j++] = ret;
|
|
}
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
@@ -532,7 +536,8 @@ static int tcs3472_probe(struct i2c_client *client,
|
|
return 0;
|
|
|
|
free_irq:
|
|
- free_irq(client->irq, indio_dev);
|
|
+ if (client->irq)
|
|
+ free_irq(client->irq, indio_dev);
|
|
buffer_cleanup:
|
|
iio_triggered_buffer_cleanup(indio_dev);
|
|
return ret;
|
|
@@ -560,7 +565,8 @@ static int tcs3472_remove(struct i2c_client *client)
|
|
struct iio_dev *indio_dev = i2c_get_clientdata(client);
|
|
|
|
iio_device_unregister(indio_dev);
|
|
- free_irq(client->irq, indio_dev);
|
|
+ if (client->irq)
|
|
+ free_irq(client->irq, indio_dev);
|
|
iio_triggered_buffer_cleanup(indio_dev);
|
|
tcs3472_powerdown(iio_priv(indio_dev));
|
|
|
|
diff --git a/drivers/iio/light/vcnl4035.c b/drivers/iio/light/vcnl4035.c
|
|
index cca4db312bd3f..234623ab38177 100644
|
|
--- a/drivers/iio/light/vcnl4035.c
|
|
+++ b/drivers/iio/light/vcnl4035.c
|
|
@@ -102,7 +102,8 @@ static irqreturn_t vcnl4035_trigger_consumer_handler(int irq, void *p)
|
|
struct iio_poll_func *pf = p;
|
|
struct iio_dev *indio_dev = pf->indio_dev;
|
|
struct vcnl4035_data *data = iio_priv(indio_dev);
|
|
- u8 buffer[ALIGN(sizeof(u16), sizeof(s64)) + sizeof(s64)];
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ u8 buffer[ALIGN(sizeof(u16), sizeof(s64)) + sizeof(s64)] __aligned(8);
|
|
int ret;
|
|
|
|
ret = regmap_read(data->regmap, VCNL4035_ALS_DATA, (int *)buffer);
|
|
diff --git a/drivers/iio/magnetometer/bmc150_magn.c b/drivers/iio/magnetometer/bmc150_magn.c
|
|
index d4de16750b107..48685d785c1b6 100644
|
|
--- a/drivers/iio/magnetometer/bmc150_magn.c
|
|
+++ b/drivers/iio/magnetometer/bmc150_magn.c
|
|
@@ -136,8 +136,11 @@ struct bmc150_magn_data {
|
|
struct mutex mutex;
|
|
struct regmap *regmap;
|
|
struct iio_mount_matrix orientation;
|
|
- /* 4 x 32 bits for x, y z, 4 bytes align, 64 bits timestamp */
|
|
- s32 buffer[6];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s32 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
struct iio_trigger *dready_trig;
|
|
bool dready_trigger_on;
|
|
int max_odr;
|
|
@@ -673,11 +676,11 @@ static irqreturn_t bmc150_magn_trigger_handler(int irq, void *p)
|
|
int ret;
|
|
|
|
mutex_lock(&data->mutex);
|
|
- ret = bmc150_magn_read_xyz(data, data->buffer);
|
|
+ ret = bmc150_magn_read_xyz(data, data->scan.chans);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
pf->timestamp);
|
|
|
|
err:
|
|
diff --git a/drivers/iio/magnetometer/hmc5843.h b/drivers/iio/magnetometer/hmc5843.h
|
|
index b0dee87a8b20e..b68bb55909e13 100644
|
|
--- a/drivers/iio/magnetometer/hmc5843.h
|
|
+++ b/drivers/iio/magnetometer/hmc5843.h
|
|
@@ -33,7 +33,8 @@ enum hmc5843_ids {
|
|
* @lock: update and read regmap data
|
|
* @regmap: hardware access register maps
|
|
* @variant: describe chip variants
|
|
- * @buffer: 3x 16-bit channels + padding + 64-bit timestamp
|
|
+ * @scan: buffer to pack data for passing to
|
|
+ * iio_push_to_buffers_with_timestamp()
|
|
*/
|
|
struct hmc5843_data {
|
|
struct device *dev;
|
|
@@ -41,7 +42,10 @@ struct hmc5843_data {
|
|
struct regmap *regmap;
|
|
const struct hmc5843_chip_info *variant;
|
|
struct iio_mount_matrix orientation;
|
|
- __be16 buffer[8];
|
|
+ struct {
|
|
+ __be16 chans[3];
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
int hmc5843_common_probe(struct device *dev, struct regmap *regmap,
|
|
diff --git a/drivers/iio/magnetometer/hmc5843_core.c b/drivers/iio/magnetometer/hmc5843_core.c
|
|
index c44a4292da924..aef78275260f7 100644
|
|
--- a/drivers/iio/magnetometer/hmc5843_core.c
|
|
+++ b/drivers/iio/magnetometer/hmc5843_core.c
|
|
@@ -446,13 +446,13 @@ static irqreturn_t hmc5843_trigger_handler(int irq, void *p)
|
|
}
|
|
|
|
ret = regmap_bulk_read(data->regmap, HMC5843_DATA_OUT_MSB_REGS,
|
|
- data->buffer, 3 * sizeof(__be16));
|
|
+ data->scan.chans, sizeof(data->scan.chans));
|
|
|
|
mutex_unlock(&data->lock);
|
|
if (ret < 0)
|
|
goto done;
|
|
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
|
|
done:
|
|
diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magnetometer/rm3100-core.c
|
|
index 7c20918d81086..f31ff225fe616 100644
|
|
--- a/drivers/iio/magnetometer/rm3100-core.c
|
|
+++ b/drivers/iio/magnetometer/rm3100-core.c
|
|
@@ -76,7 +76,8 @@ struct rm3100_data {
|
|
bool use_interrupt;
|
|
int conversion_time;
|
|
int scale;
|
|
- u8 buffer[RM3100_SCAN_BYTES];
|
|
+ /* Ensure naturally aligned timestamp */
|
|
+ u8 buffer[RM3100_SCAN_BYTES] __aligned(8);
|
|
struct iio_trigger *drdy_trig;
|
|
|
|
/*
|
|
diff --git a/drivers/iio/potentiostat/lmp91000.c b/drivers/iio/potentiostat/lmp91000.c
|
|
index a0e5f530faa9b..d6db07264a7b3 100644
|
|
--- a/drivers/iio/potentiostat/lmp91000.c
|
|
+++ b/drivers/iio/potentiostat/lmp91000.c
|
|
@@ -71,8 +71,8 @@ struct lmp91000_data {
|
|
|
|
struct completion completion;
|
|
u8 chan_select;
|
|
-
|
|
- u32 buffer[4]; /* 64-bit data + 64-bit timestamp */
|
|
+ /* 64-bit data + 64-bit naturally aligned timestamp */
|
|
+ u32 buffer[4] __aligned(8);
|
|
};
|
|
|
|
static const struct iio_chan_spec lmp91000_channels[] = {
|
|
diff --git a/drivers/iio/proximity/as3935.c b/drivers/iio/proximity/as3935.c
|
|
index b591c63bd6c49..718150a931337 100644
|
|
--- a/drivers/iio/proximity/as3935.c
|
|
+++ b/drivers/iio/proximity/as3935.c
|
|
@@ -61,7 +61,11 @@ struct as3935_state {
|
|
unsigned long noise_tripped;
|
|
u32 tune_cap;
|
|
u32 nflwdth_reg;
|
|
- u8 buffer[16]; /* 8-bit data + 56-bit padding + 64-bit timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u8 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
u8 buf[2] ____cacheline_aligned;
|
|
};
|
|
|
|
@@ -227,8 +231,8 @@ static irqreturn_t as3935_trigger_handler(int irq, void *private)
|
|
if (ret)
|
|
goto err_read;
|
|
|
|
- st->buffer[0] = val & AS3935_DATA_MASK;
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, &st->buffer,
|
|
+ st->scan.chan = val & AS3935_DATA_MASK;
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &st->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
err_read:
|
|
iio_trigger_notify_done(indio_dev->trig);
|
|
diff --git a/drivers/iio/proximity/isl29501.c b/drivers/iio/proximity/isl29501.c
|
|
index 5ae549075b27c..56d6e9f927f40 100644
|
|
--- a/drivers/iio/proximity/isl29501.c
|
|
+++ b/drivers/iio/proximity/isl29501.c
|
|
@@ -938,7 +938,7 @@ static irqreturn_t isl29501_trigger_handler(int irq, void *p)
|
|
struct iio_dev *indio_dev = pf->indio_dev;
|
|
struct isl29501_private *isl29501 = iio_priv(indio_dev);
|
|
const unsigned long *active_mask = indio_dev->active_scan_mask;
|
|
- u32 buffer[4] = {}; /* 1x16-bit + ts */
|
|
+ u32 buffer[4] __aligned(8) = {}; /* 1x16-bit + naturally aligned ts */
|
|
|
|
if (test_bit(ISL29501_DISTANCE_SCAN_INDEX, active_mask))
|
|
isl29501_register_read(isl29501, REG_DISTANCE, buffer);
|
|
diff --git a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
index 67f85268b63db..0c76170224071 100644
|
|
--- a/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
+++ b/drivers/iio/proximity/pulsedlight-lidar-lite-v2.c
|
|
@@ -43,7 +43,11 @@ struct lidar_data {
|
|
int (*xfer)(struct lidar_data *data, u8 reg, u8 *val, int len);
|
|
int i2c_enabled;
|
|
|
|
- u16 buffer[8]; /* 2 byte distance + 8 byte timestamp */
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ u16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
};
|
|
|
|
static const struct iio_chan_spec lidar_channels[] = {
|
|
@@ -228,9 +232,9 @@ static irqreturn_t lidar_trigger_handler(int irq, void *private)
|
|
struct lidar_data *data = iio_priv(indio_dev);
|
|
int ret;
|
|
|
|
- ret = lidar_get_measurement(data, data->buffer);
|
|
+ ret = lidar_get_measurement(data, &data->scan.chan);
|
|
if (!ret) {
|
|
- iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
|
|
+ iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
|
|
iio_get_time_ns(indio_dev));
|
|
} else if (ret != -EINVAL) {
|
|
dev_err(&data->client->dev, "cannot read LIDAR measurement");
|
|
diff --git a/drivers/iio/proximity/srf08.c b/drivers/iio/proximity/srf08.c
|
|
index b23ce446b7be6..c99bc514c5e1e 100644
|
|
--- a/drivers/iio/proximity/srf08.c
|
|
+++ b/drivers/iio/proximity/srf08.c
|
|
@@ -63,11 +63,11 @@ struct srf08_data {
|
|
int range_mm;
|
|
struct mutex lock;
|
|
|
|
- /*
|
|
- * triggered buffer
|
|
- * 1x16-bit channel + 3x16 padding + 4x16 timestamp
|
|
- */
|
|
- s16 buffer[8];
|
|
+ /* Ensure timestamp is naturally aligned */
|
|
+ struct {
|
|
+ s16 chan;
|
|
+ s64 timestamp __aligned(8);
|
|
+ } scan;
|
|
|
|
/* Sensor-Type */
|
|
enum srf08_sensor_type sensor_type;
|
|
@@ -190,9 +190,9 @@ static irqreturn_t srf08_trigger_handler(int irq, void *p)
|
|
|
|
mutex_lock(&data->lock);
|
|
|
|
- data->buffer[0] = sensor_data;
|
|
+ data->scan.chan = sensor_data;
|
|
iio_push_to_buffers_with_timestamp(indio_dev,
|
|
- data->buffer, pf->timestamp);
|
|
+ &data->scan, pf->timestamp);
|
|
|
|
mutex_unlock(&data->lock);
|
|
err:
|
|
diff --git a/drivers/infiniband/core/uverbs_cmd.c b/drivers/infiniband/core/uverbs_cmd.c
|
|
index c398d1a64614c..d413dafb9211d 100644
|
|
--- a/drivers/infiniband/core/uverbs_cmd.c
|
|
+++ b/drivers/infiniband/core/uverbs_cmd.c
|
|
@@ -3031,12 +3031,29 @@ static int ib_uverbs_ex_modify_wq(struct uverbs_attr_bundle *attrs)
|
|
if (!wq)
|
|
return -EINVAL;
|
|
|
|
- wq_attr.curr_wq_state = cmd.curr_wq_state;
|
|
- wq_attr.wq_state = cmd.wq_state;
|
|
if (cmd.attr_mask & IB_WQ_FLAGS) {
|
|
wq_attr.flags = cmd.flags;
|
|
wq_attr.flags_mask = cmd.flags_mask;
|
|
}
|
|
+
|
|
+ if (cmd.attr_mask & IB_WQ_CUR_STATE) {
|
|
+ if (cmd.curr_wq_state > IB_WQS_ERR)
|
|
+ return -EINVAL;
|
|
+
|
|
+ wq_attr.curr_wq_state = cmd.curr_wq_state;
|
|
+ } else {
|
|
+ wq_attr.curr_wq_state = wq->state;
|
|
+ }
|
|
+
|
|
+ if (cmd.attr_mask & IB_WQ_STATE) {
|
|
+ if (cmd.wq_state > IB_WQS_ERR)
|
|
+ return -EINVAL;
|
|
+
|
|
+ wq_attr.wq_state = cmd.wq_state;
|
|
+ } else {
|
|
+ wq_attr.wq_state = wq_attr.curr_wq_state;
|
|
+ }
|
|
+
|
|
ret = wq->device->ops.modify_wq(wq, &wq_attr, cmd.attr_mask,
|
|
&attrs->driver_udata);
|
|
uobj_put_obj_read(wq);
|
|
diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
|
|
index 6e2b3e2f83f16..17ce928e41bde 100644
|
|
--- a/drivers/infiniband/hw/mlx4/qp.c
|
|
+++ b/drivers/infiniband/hw/mlx4/qp.c
|
|
@@ -4294,13 +4294,8 @@ int mlx4_ib_modify_wq(struct ib_wq *ibwq, struct ib_wq_attr *wq_attr,
|
|
if (wq_attr_mask & IB_WQ_FLAGS)
|
|
return -EOPNOTSUPP;
|
|
|
|
- cur_state = wq_attr_mask & IB_WQ_CUR_STATE ? wq_attr->curr_wq_state :
|
|
- ibwq->state;
|
|
- new_state = wq_attr_mask & IB_WQ_STATE ? wq_attr->wq_state : cur_state;
|
|
-
|
|
- if (cur_state < IB_WQS_RESET || cur_state > IB_WQS_ERR ||
|
|
- new_state < IB_WQS_RESET || new_state > IB_WQS_ERR)
|
|
- return -EINVAL;
|
|
+ cur_state = wq_attr->curr_wq_state;
|
|
+ new_state = wq_attr->wq_state;
|
|
|
|
if ((new_state == IB_WQS_RDY) && (cur_state == IB_WQS_ERR))
|
|
return -EINVAL;
|
|
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
|
|
index a173737cb0222..9025086a8932d 100644
|
|
--- a/drivers/infiniband/hw/mlx5/main.c
|
|
+++ b/drivers/infiniband/hw/mlx5/main.c
|
|
@@ -5871,8 +5871,6 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
|
|
|
|
port->mp.mpi = NULL;
|
|
|
|
- list_add_tail(&mpi->list, &mlx5_ib_unaffiliated_port_list);
|
|
-
|
|
spin_unlock(&port->mp.mpi_lock);
|
|
|
|
err = mlx5_nic_vport_unaffiliate_multiport(mpi->mdev);
|
|
@@ -6025,6 +6023,8 @@ static void mlx5_ib_cleanup_multiport_master(struct mlx5_ib_dev *dev)
|
|
dev->port[i].mp.mpi = NULL;
|
|
} else {
|
|
mlx5_ib_dbg(dev, "unbinding port_num: %d\n", i + 1);
|
|
+ list_add_tail(&dev->port[i].mp.mpi->list,
|
|
+ &mlx5_ib_unaffiliated_port_list);
|
|
mlx5_ib_unbind_slave_port(dev, dev->port[i].mp.mpi);
|
|
}
|
|
}
|
|
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
|
|
index 09e29c6cb66dc..4540835e05bda 100644
|
|
--- a/drivers/infiniband/hw/mlx5/qp.c
|
|
+++ b/drivers/infiniband/hw/mlx5/qp.c
|
|
@@ -6317,10 +6317,8 @@ int mlx5_ib_modify_wq(struct ib_wq *wq, struct ib_wq_attr *wq_attr,
|
|
|
|
rqc = MLX5_ADDR_OF(modify_rq_in, in, ctx);
|
|
|
|
- curr_wq_state = (wq_attr_mask & IB_WQ_CUR_STATE) ?
|
|
- wq_attr->curr_wq_state : wq->state;
|
|
- wq_state = (wq_attr_mask & IB_WQ_STATE) ?
|
|
- wq_attr->wq_state : curr_wq_state;
|
|
+ curr_wq_state = wq_attr->curr_wq_state;
|
|
+ wq_state = wq_attr->wq_state;
|
|
if (curr_wq_state == IB_WQS_ERR)
|
|
curr_wq_state = MLX5_RQC_STATE_ERR;
|
|
if (wq_state == IB_WQS_ERR)
|
|
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
|
|
index d411356828911..7d1df737c6558 100644
|
|
--- a/drivers/infiniband/sw/rxe/rxe_net.c
|
|
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
|
|
@@ -251,10 +251,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
|
|
|
|
/* Create UDP socket */
|
|
err = udp_sock_create(net, &udp_cfg, &sock);
|
|
- if (err < 0) {
|
|
- pr_err("failed to create udp socket. err = %d\n", err);
|
|
+ if (err < 0)
|
|
return ERR_PTR(err);
|
|
- }
|
|
|
|
tnl_cfg.encap_type = 1;
|
|
tnl_cfg.encap_rcv = rxe_udp_encap_recv;
|
|
@@ -660,6 +658,12 @@ static int rxe_net_ipv6_init(void)
|
|
|
|
recv_sockets.sk6 = rxe_setup_udp_tunnel(&init_net,
|
|
htons(ROCE_V2_UDP_DPORT), true);
|
|
+ if (PTR_ERR(recv_sockets.sk6) == -EAFNOSUPPORT) {
|
|
+ recv_sockets.sk6 = NULL;
|
|
+ pr_warn("IPv6 is not supported, can not create a UDPv6 socket\n");
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
if (IS_ERR(recv_sockets.sk6)) {
|
|
recv_sockets.sk6 = NULL;
|
|
pr_err("Failed to create IPv6 UDP tunnel\n");
|
|
diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
|
|
index d427a343c09f6..53166b9ae67e5 100644
|
|
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
|
|
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
|
|
@@ -152,7 +152,6 @@ static void free_rd_atomic_resources(struct rxe_qp *qp)
|
|
void free_rd_atomic_resource(struct rxe_qp *qp, struct resp_res *res)
|
|
{
|
|
if (res->type == RXE_ATOMIC_MASK) {
|
|
- rxe_drop_ref(qp);
|
|
kfree_skb(res->atomic.skb);
|
|
} else if (res->type == RXE_READ_MASK) {
|
|
if (res->read.mr)
|
|
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
|
|
index c4a8195bf6709..186152bf79514 100644
|
|
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
|
|
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
|
|
@@ -993,8 +993,6 @@ static int send_atomic_ack(struct rxe_qp *qp, struct rxe_pkt_info *pkt,
|
|
goto out;
|
|
}
|
|
|
|
- rxe_add_ref(qp);
|
|
-
|
|
res = &qp->resp.resources[qp->resp.res_head];
|
|
free_rd_atomic_resource(qp, res);
|
|
rxe_advance_resp_resource(qp);
|
|
diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
|
|
index 430dc69750048..675fcd0952a2d 100644
|
|
--- a/drivers/input/joydev.c
|
|
+++ b/drivers/input/joydev.c
|
|
@@ -500,7 +500,7 @@ static int joydev_handle_JSIOCSBTNMAP(struct joydev *joydev,
|
|
memcpy(joydev->keypam, keypam, len);
|
|
|
|
for (i = 0; i < joydev->nkey; i++)
|
|
- joydev->keymap[keypam[i] - BTN_MISC] = i;
|
|
+ joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;
|
|
|
|
out:
|
|
kfree(keypam);
|
|
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
|
|
index 8911bc2ec42a8..ae0bdc4391059 100644
|
|
--- a/drivers/input/keyboard/Kconfig
|
|
+++ b/drivers/input/keyboard/Kconfig
|
|
@@ -68,9 +68,6 @@ config KEYBOARD_AMIGA
|
|
To compile this driver as a module, choose M here: the
|
|
module will be called amikbd.
|
|
|
|
-config ATARI_KBD_CORE
|
|
- bool
|
|
-
|
|
config KEYBOARD_APPLESPI
|
|
tristate "Apple SPI keyboard and trackpad"
|
|
depends on ACPI && EFI
|
|
diff --git a/drivers/input/keyboard/hil_kbd.c b/drivers/input/keyboard/hil_kbd.c
|
|
index bb29a7c9a1c0c..54afb38601b9f 100644
|
|
--- a/drivers/input/keyboard/hil_kbd.c
|
|
+++ b/drivers/input/keyboard/hil_kbd.c
|
|
@@ -512,6 +512,7 @@ static int hil_dev_connect(struct serio *serio, struct serio_driver *drv)
|
|
HIL_IDD_NUM_AXES_PER_SET(*idd)) {
|
|
printk(KERN_INFO PREFIX
|
|
"combo devices are not supported.\n");
|
|
+ error = -EINVAL;
|
|
goto bail1;
|
|
}
|
|
|
|
diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
|
|
index 397cb1d3f481b..544a8f40b81f1 100644
|
|
--- a/drivers/input/touchscreen/usbtouchscreen.c
|
|
+++ b/drivers/input/touchscreen/usbtouchscreen.c
|
|
@@ -251,7 +251,7 @@ static int e2i_init(struct usbtouch_usb *usbtouch)
|
|
int ret;
|
|
struct usb_device *udev = interface_to_usbdev(usbtouch->interface);
|
|
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
0x01, 0x02, 0x0000, 0x0081,
|
|
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
|
|
@@ -531,7 +531,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
|
if (ret)
|
|
return ret;
|
|
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
MTOUCHUSB_RESET,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
@@ -543,7 +543,7 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
|
msleep(150);
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
- ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
MTOUCHUSB_ASYNC_REPORT,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
1, 1, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
@@ -722,7 +722,7 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
|
}
|
|
|
|
/* start sending data */
|
|
- ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
|
|
+ ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
|
|
TSC10_CMD_DATA1,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
|
|
diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c
|
|
index 76bd2309e0234..9c3e630c6c4c8 100644
|
|
--- a/drivers/iommu/dma-iommu.c
|
|
+++ b/drivers/iommu/dma-iommu.c
|
|
@@ -216,9 +216,11 @@ resv_iova:
|
|
lo = iova_pfn(iovad, start);
|
|
hi = iova_pfn(iovad, end);
|
|
reserve_iova(iovad, lo, hi);
|
|
- } else {
|
|
+ } else if (end < start) {
|
|
/* dma_ranges list should be sorted */
|
|
- dev_err(&dev->dev, "Failed to reserve IOVA\n");
|
|
+ dev_err(&dev->dev,
|
|
+ "Failed to reserve IOVA [%pa-%pa]\n",
|
|
+ &start, &end);
|
|
return -EINVAL;
|
|
}
|
|
|
|
diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig
|
|
index 1988de1d64c05..2cbf66d1c3000 100644
|
|
--- a/drivers/leds/Kconfig
|
|
+++ b/drivers/leds/Kconfig
|
|
@@ -144,6 +144,7 @@ config LEDS_LM3530
|
|
|
|
config LEDS_LM3532
|
|
tristate "LCD Backlight driver for LM3532"
|
|
+ select REGMAP_I2C
|
|
depends on LEDS_CLASS
|
|
depends on I2C
|
|
help
|
|
diff --git a/drivers/leds/leds-as3645a.c b/drivers/leds/leds-as3645a.c
|
|
index b7e0ae1af8fa5..1dc6f1b24ddb5 100644
|
|
--- a/drivers/leds/leds-as3645a.c
|
|
+++ b/drivers/leds/leds-as3645a.c
|
|
@@ -544,6 +544,7 @@ static int as3645a_parse_node(struct as3645a *flash,
|
|
if (!flash->indicator_node) {
|
|
dev_warn(&flash->client->dev,
|
|
"can't find indicator node\n");
|
|
+ rval = -ENODEV;
|
|
goto out_err;
|
|
}
|
|
|
|
diff --git a/drivers/leds/leds-ktd2692.c b/drivers/leds/leds-ktd2692.c
|
|
index 670efee9b1317..cd30b3b46e76c 100644
|
|
--- a/drivers/leds/leds-ktd2692.c
|
|
+++ b/drivers/leds/leds-ktd2692.c
|
|
@@ -256,6 +256,17 @@ static void ktd2692_setup(struct ktd2692_context *led)
|
|
| KTD2692_REG_FLASH_CURRENT_BASE);
|
|
}
|
|
|
|
+static void regulator_disable_action(void *_data)
|
|
+{
|
|
+ struct device *dev = _data;
|
|
+ struct ktd2692_context *led = dev_get_drvdata(dev);
|
|
+ int ret;
|
|
+
|
|
+ ret = regulator_disable(led->regulator);
|
|
+ if (ret)
|
|
+ dev_err(dev, "Failed to disable supply: %d\n", ret);
|
|
+}
|
|
+
|
|
static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
|
|
struct ktd2692_led_config_data *cfg)
|
|
{
|
|
@@ -286,8 +297,14 @@ static int ktd2692_parse_dt(struct ktd2692_context *led, struct device *dev,
|
|
|
|
if (led->regulator) {
|
|
ret = regulator_enable(led->regulator);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
dev_err(dev, "Failed to enable supply: %d\n", ret);
|
|
+ } else {
|
|
+ ret = devm_add_action_or_reset(dev,
|
|
+ regulator_disable_action, dev);
|
|
+ if (ret)
|
|
+ return ret;
|
|
+ }
|
|
}
|
|
|
|
child_node = of_get_next_available_child(np, NULL);
|
|
@@ -377,17 +394,9 @@ static int ktd2692_probe(struct platform_device *pdev)
|
|
static int ktd2692_remove(struct platform_device *pdev)
|
|
{
|
|
struct ktd2692_context *led = platform_get_drvdata(pdev);
|
|
- int ret;
|
|
|
|
led_classdev_flash_unregister(&led->fled_cdev);
|
|
|
|
- if (led->regulator) {
|
|
- ret = regulator_disable(led->regulator);
|
|
- if (ret)
|
|
- dev_err(&pdev->dev,
|
|
- "Failed to disable supply: %d\n", ret);
|
|
- }
|
|
-
|
|
mutex_destroy(&led->lock);
|
|
|
|
return 0;
|
|
diff --git a/drivers/leds/leds-lm36274.c b/drivers/leds/leds-lm36274.c
|
|
index db842eeb7ca20..6c143551f10a6 100644
|
|
--- a/drivers/leds/leds-lm36274.c
|
|
+++ b/drivers/leds/leds-lm36274.c
|
|
@@ -41,37 +41,36 @@ struct lm36274 {
|
|
};
|
|
|
|
static int lm36274_brightness_set(struct led_classdev *led_cdev,
|
|
- enum led_brightness brt_val)
|
|
+ enum led_brightness brt_val)
|
|
{
|
|
- struct lm36274 *led = container_of(led_cdev, struct lm36274, led_dev);
|
|
+ struct lm36274 *chip = container_of(led_cdev, struct lm36274, led_dev);
|
|
|
|
- return ti_lmu_common_set_brightness(&led->lmu_data, brt_val);
|
|
+ return ti_lmu_common_set_brightness(&chip->lmu_data, brt_val);
|
|
}
|
|
|
|
-static int lm36274_init(struct lm36274 *lm36274_data)
|
|
+static int lm36274_init(struct lm36274 *chip)
|
|
{
|
|
int enable_val = 0;
|
|
int i;
|
|
|
|
- for (i = 0; i < lm36274_data->num_leds; i++)
|
|
- enable_val |= (1 << lm36274_data->led_sources[i]);
|
|
+ for (i = 0; i < chip->num_leds; i++)
|
|
+ enable_val |= (1 << chip->led_sources[i]);
|
|
|
|
if (!enable_val) {
|
|
- dev_err(lm36274_data->dev, "No LEDs were enabled\n");
|
|
+ dev_err(chip->dev, "No LEDs were enabled\n");
|
|
return -EINVAL;
|
|
}
|
|
|
|
enable_val |= LM36274_BL_EN;
|
|
|
|
- return regmap_write(lm36274_data->regmap, LM36274_REG_BL_EN,
|
|
- enable_val);
|
|
+ return regmap_write(chip->regmap, LM36274_REG_BL_EN, enable_val);
|
|
}
|
|
|
|
-static int lm36274_parse_dt(struct lm36274 *lm36274_data)
|
|
+static int lm36274_parse_dt(struct lm36274 *chip)
|
|
{
|
|
struct fwnode_handle *child = NULL;
|
|
char label[LED_MAX_NAME_SIZE];
|
|
- struct device *dev = &lm36274_data->pdev->dev;
|
|
+ struct device *dev = &chip->pdev->dev;
|
|
const char *name;
|
|
int child_cnt;
|
|
int ret = -EINVAL;
|
|
@@ -84,37 +83,37 @@ static int lm36274_parse_dt(struct lm36274 *lm36274_data)
|
|
device_for_each_child_node(dev, child) {
|
|
ret = fwnode_property_read_string(child, "label", &name);
|
|
if (ret)
|
|
- snprintf(label, sizeof(label),
|
|
- "%s::", lm36274_data->pdev->name);
|
|
+ snprintf(label, sizeof(label), "%s::",
|
|
+ chip->pdev->name);
|
|
else
|
|
- snprintf(label, sizeof(label),
|
|
- "%s:%s", lm36274_data->pdev->name, name);
|
|
+ snprintf(label, sizeof(label), "%s:%s",
|
|
+ chip->pdev->name, name);
|
|
|
|
- lm36274_data->num_leds = fwnode_property_count_u32(child, "led-sources");
|
|
- if (lm36274_data->num_leds <= 0)
|
|
+ chip->num_leds = fwnode_property_count_u32(child, "led-sources");
|
|
+ if (chip->num_leds <= 0)
|
|
return -ENODEV;
|
|
|
|
ret = fwnode_property_read_u32_array(child, "led-sources",
|
|
- lm36274_data->led_sources,
|
|
- lm36274_data->num_leds);
|
|
+ chip->led_sources,
|
|
+ chip->num_leds);
|
|
if (ret) {
|
|
dev_err(dev, "led-sources property missing\n");
|
|
return ret;
|
|
}
|
|
|
|
fwnode_property_read_string(child, "linux,default-trigger",
|
|
- &lm36274_data->led_dev.default_trigger);
|
|
+ &chip->led_dev.default_trigger);
|
|
|
|
}
|
|
|
|
- lm36274_data->lmu_data.regmap = lm36274_data->regmap;
|
|
- lm36274_data->lmu_data.max_brightness = MAX_BRIGHTNESS_11BIT;
|
|
- lm36274_data->lmu_data.msb_brightness_reg = LM36274_REG_BRT_MSB;
|
|
- lm36274_data->lmu_data.lsb_brightness_reg = LM36274_REG_BRT_LSB;
|
|
+ chip->lmu_data.regmap = chip->regmap;
|
|
+ chip->lmu_data.max_brightness = MAX_BRIGHTNESS_11BIT;
|
|
+ chip->lmu_data.msb_brightness_reg = LM36274_REG_BRT_MSB;
|
|
+ chip->lmu_data.lsb_brightness_reg = LM36274_REG_BRT_LSB;
|
|
|
|
- lm36274_data->led_dev.name = label;
|
|
- lm36274_data->led_dev.max_brightness = MAX_BRIGHTNESS_11BIT;
|
|
- lm36274_data->led_dev.brightness_set_blocking = lm36274_brightness_set;
|
|
+ chip->led_dev.name = label;
|
|
+ chip->led_dev.max_brightness = MAX_BRIGHTNESS_11BIT;
|
|
+ chip->led_dev.brightness_set_blocking = lm36274_brightness_set;
|
|
|
|
return 0;
|
|
}
|
|
@@ -122,39 +121,38 @@ static int lm36274_parse_dt(struct lm36274 *lm36274_data)
|
|
static int lm36274_probe(struct platform_device *pdev)
|
|
{
|
|
struct ti_lmu *lmu = dev_get_drvdata(pdev->dev.parent);
|
|
- struct lm36274 *lm36274_data;
|
|
+ struct lm36274 *chip;
|
|
int ret;
|
|
|
|
- lm36274_data = devm_kzalloc(&pdev->dev, sizeof(*lm36274_data),
|
|
- GFP_KERNEL);
|
|
- if (!lm36274_data)
|
|
+ chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
|
|
+ if (!chip)
|
|
return -ENOMEM;
|
|
|
|
- lm36274_data->pdev = pdev;
|
|
- lm36274_data->dev = lmu->dev;
|
|
- lm36274_data->regmap = lmu->regmap;
|
|
- platform_set_drvdata(pdev, lm36274_data);
|
|
+ chip->pdev = pdev;
|
|
+ chip->dev = lmu->dev;
|
|
+ chip->regmap = lmu->regmap;
|
|
+ platform_set_drvdata(pdev, chip);
|
|
|
|
- ret = lm36274_parse_dt(lm36274_data);
|
|
+ ret = lm36274_parse_dt(chip);
|
|
if (ret) {
|
|
- dev_err(lm36274_data->dev, "Failed to parse DT node\n");
|
|
+ dev_err(chip->dev, "Failed to parse DT node\n");
|
|
return ret;
|
|
}
|
|
|
|
- ret = lm36274_init(lm36274_data);
|
|
+ ret = lm36274_init(chip);
|
|
if (ret) {
|
|
- dev_err(lm36274_data->dev, "Failed to init the device\n");
|
|
+ dev_err(chip->dev, "Failed to init the device\n");
|
|
return ret;
|
|
}
|
|
|
|
- return led_classdev_register(lm36274_data->dev, &lm36274_data->led_dev);
|
|
+ return led_classdev_register(chip->dev, &chip->led_dev);
|
|
}
|
|
|
|
static int lm36274_remove(struct platform_device *pdev)
|
|
{
|
|
- struct lm36274 *lm36274_data = platform_get_drvdata(pdev);
|
|
+ struct lm36274 *chip = platform_get_drvdata(pdev);
|
|
|
|
- led_classdev_unregister(&lm36274_data->led_dev);
|
|
+ led_classdev_unregister(&chip->led_dev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/leds/leds-lm3692x.c b/drivers/leds/leds-lm3692x.c
|
|
index 1ac9a44570eed..cc77ea048d9be 100644
|
|
--- a/drivers/leds/leds-lm3692x.c
|
|
+++ b/drivers/leds/leds-lm3692x.c
|
|
@@ -358,6 +358,7 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
|
|
|
|
ret = fwnode_property_read_u32(child, "reg", &led->led_enable);
|
|
if (ret) {
|
|
+ fwnode_handle_put(child);
|
|
dev_err(&led->client->dev, "reg DT property missing\n");
|
|
return ret;
|
|
}
|
|
@@ -368,12 +369,11 @@ static int lm3692x_probe_dt(struct lm3692x_led *led)
|
|
|
|
ret = devm_led_classdev_register_ext(&led->client->dev, &led->led_dev,
|
|
&init_data);
|
|
- if (ret) {
|
|
+ if (ret)
|
|
dev_err(&led->client->dev, "led register err: %d\n", ret);
|
|
- return ret;
|
|
- }
|
|
|
|
- return 0;
|
|
+ fwnode_handle_put(init_data.fwnode);
|
|
+ return ret;
|
|
}
|
|
|
|
static int lm3692x_probe(struct i2c_client *client,
|
|
diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c
|
|
index 0ba51dacc5808..ce94b5205fd6e 100644
|
|
--- a/drivers/media/common/siano/smscoreapi.c
|
|
+++ b/drivers/media/common/siano/smscoreapi.c
|
|
@@ -908,7 +908,7 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
|
|
void *buffer, size_t size)
|
|
{
|
|
struct sms_firmware *firmware = (struct sms_firmware *) buffer;
|
|
- struct sms_msg_data4 *msg;
|
|
+ struct sms_msg_data5 *msg;
|
|
u32 mem_address, calc_checksum = 0;
|
|
u32 i, *ptr;
|
|
u8 *payload = firmware->payload;
|
|
@@ -989,24 +989,20 @@ static int smscore_load_firmware_family2(struct smscore_device_t *coredev,
|
|
goto exit_fw_download;
|
|
|
|
if (coredev->mode == DEVICE_MODE_NONE) {
|
|
- struct sms_msg_data *trigger_msg =
|
|
- (struct sms_msg_data *) msg;
|
|
-
|
|
pr_debug("sending MSG_SMS_SWDOWNLOAD_TRIGGER_REQ\n");
|
|
SMS_INIT_MSG(&msg->x_msg_header,
|
|
MSG_SMS_SWDOWNLOAD_TRIGGER_REQ,
|
|
- sizeof(struct sms_msg_hdr) +
|
|
- sizeof(u32) * 5);
|
|
+ sizeof(*msg));
|
|
|
|
- trigger_msg->msg_data[0] = firmware->start_address;
|
|
+ msg->msg_data[0] = firmware->start_address;
|
|
/* Entry point */
|
|
- trigger_msg->msg_data[1] = 6; /* Priority */
|
|
- trigger_msg->msg_data[2] = 0x200; /* Stack size */
|
|
- trigger_msg->msg_data[3] = 0; /* Parameter */
|
|
- trigger_msg->msg_data[4] = 4; /* Task ID */
|
|
+ msg->msg_data[1] = 6; /* Priority */
|
|
+ msg->msg_data[2] = 0x200; /* Stack size */
|
|
+ msg->msg_data[3] = 0; /* Parameter */
|
|
+ msg->msg_data[4] = 4; /* Task ID */
|
|
|
|
- rc = smscore_sendrequest_and_wait(coredev, trigger_msg,
|
|
- trigger_msg->x_msg_header.msg_length,
|
|
+ rc = smscore_sendrequest_and_wait(coredev, msg,
|
|
+ msg->x_msg_header.msg_length,
|
|
&coredev->trigger_done);
|
|
} else {
|
|
SMS_INIT_MSG(&msg->x_msg_header, MSG_SW_RELOAD_EXEC_REQ,
|
|
diff --git a/drivers/media/common/siano/smscoreapi.h b/drivers/media/common/siano/smscoreapi.h
|
|
index a2f95f4899c22..cd6c981eb1f96 100644
|
|
--- a/drivers/media/common/siano/smscoreapi.h
|
|
+++ b/drivers/media/common/siano/smscoreapi.h
|
|
@@ -629,9 +629,9 @@ struct sms_msg_data2 {
|
|
u32 msg_data[2];
|
|
};
|
|
|
|
-struct sms_msg_data4 {
|
|
+struct sms_msg_data5 {
|
|
struct sms_msg_hdr x_msg_header;
|
|
- u32 msg_data[4];
|
|
+ u32 msg_data[5];
|
|
};
|
|
|
|
struct sms_data_download {
|
|
diff --git a/drivers/media/common/siano/smsdvb-main.c b/drivers/media/common/siano/smsdvb-main.c
|
|
index ae17407e477a4..7cc654bc52d37 100644
|
|
--- a/drivers/media/common/siano/smsdvb-main.c
|
|
+++ b/drivers/media/common/siano/smsdvb-main.c
|
|
@@ -1176,6 +1176,10 @@ static int smsdvb_hotplug(struct smscore_device_t *coredev,
|
|
return 0;
|
|
|
|
media_graph_error:
|
|
+ mutex_lock(&g_smsdvb_clientslock);
|
|
+ list_del(&client->entry);
|
|
+ mutex_unlock(&g_smsdvb_clientslock);
|
|
+
|
|
smsdvb_debugfs_release(client);
|
|
|
|
client_error:
|
|
diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c
|
|
index 630509ecee205..9fed06ba88efb 100644
|
|
--- a/drivers/media/dvb-core/dvb_net.c
|
|
+++ b/drivers/media/dvb-core/dvb_net.c
|
|
@@ -45,6 +45,7 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/netdevice.h>
|
|
+#include <linux/nospec.h>
|
|
#include <linux/etherdevice.h>
|
|
#include <linux/dvb/net.h>
|
|
#include <linux/uio.h>
|
|
@@ -1462,14 +1463,20 @@ static int dvb_net_do_ioctl(struct file *file,
|
|
struct net_device *netdev;
|
|
struct dvb_net_priv *priv_data;
|
|
struct dvb_net_if *dvbnetif = parg;
|
|
+ int if_num = dvbnetif->if_num;
|
|
|
|
- if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
|
- !dvbnet->state[dvbnetif->if_num]) {
|
|
+ if (if_num >= DVB_NET_DEVICES_MAX) {
|
|
ret = -EINVAL;
|
|
goto ioctl_error;
|
|
}
|
|
+ if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
|
|
|
|
- netdev = dvbnet->device[dvbnetif->if_num];
|
|
+ if (!dvbnet->state[if_num]) {
|
|
+ ret = -EINVAL;
|
|
+ goto ioctl_error;
|
|
+ }
|
|
+
|
|
+ netdev = dvbnet->device[if_num];
|
|
|
|
priv_data = netdev_priv(netdev);
|
|
dvbnetif->pid=priv_data->pid;
|
|
@@ -1522,14 +1529,20 @@ static int dvb_net_do_ioctl(struct file *file,
|
|
struct net_device *netdev;
|
|
struct dvb_net_priv *priv_data;
|
|
struct __dvb_net_if_old *dvbnetif = parg;
|
|
+ int if_num = dvbnetif->if_num;
|
|
+
|
|
+ if (if_num >= DVB_NET_DEVICES_MAX) {
|
|
+ ret = -EINVAL;
|
|
+ goto ioctl_error;
|
|
+ }
|
|
+ if_num = array_index_nospec(if_num, DVB_NET_DEVICES_MAX);
|
|
|
|
- if (dvbnetif->if_num >= DVB_NET_DEVICES_MAX ||
|
|
- !dvbnet->state[dvbnetif->if_num]) {
|
|
+ if (!dvbnet->state[if_num]) {
|
|
ret = -EINVAL;
|
|
goto ioctl_error;
|
|
}
|
|
|
|
- netdev = dvbnet->device[dvbnetif->if_num];
|
|
+ netdev = dvbnet->device[if_num];
|
|
|
|
priv_data = netdev_priv(netdev);
|
|
dvbnetif->pid=priv_data->pid;
|
|
diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c
|
|
index e8119ad0bc71d..92376592455ee 100644
|
|
--- a/drivers/media/i2c/ir-kbd-i2c.c
|
|
+++ b/drivers/media/i2c/ir-kbd-i2c.c
|
|
@@ -678,8 +678,8 @@ static int zilog_tx(struct rc_dev *rcdev, unsigned int *txbuf,
|
|
goto out_unlock;
|
|
}
|
|
|
|
- i = i2c_master_recv(ir->tx_c, buf, 1);
|
|
- if (i != 1) {
|
|
+ ret = i2c_master_recv(ir->tx_c, buf, 1);
|
|
+ if (ret != 1) {
|
|
dev_err(&ir->rc->dev, "i2c_master_recv failed with %d\n", ret);
|
|
ret = -EIO;
|
|
goto out_unlock;
|
|
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3-core.c b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
index 5b4c4a3547c93..71804a70bc6d7 100644
|
|
--- a/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
+++ b/drivers/media/i2c/s5c73m3/s5c73m3-core.c
|
|
@@ -1386,7 +1386,7 @@ static int __s5c73m3_power_on(struct s5c73m3 *state)
|
|
s5c73m3_gpio_deassert(state, STBY);
|
|
usleep_range(100, 200);
|
|
|
|
- s5c73m3_gpio_deassert(state, RST);
|
|
+ s5c73m3_gpio_deassert(state, RSET);
|
|
usleep_range(50, 100);
|
|
|
|
return 0;
|
|
@@ -1401,7 +1401,7 @@ static int __s5c73m3_power_off(struct s5c73m3 *state)
|
|
{
|
|
int i, ret;
|
|
|
|
- if (s5c73m3_gpio_assert(state, RST))
|
|
+ if (s5c73m3_gpio_assert(state, RSET))
|
|
usleep_range(10, 50);
|
|
|
|
if (s5c73m3_gpio_assert(state, STBY))
|
|
@@ -1606,7 +1606,7 @@ static int s5c73m3_get_platform_data(struct s5c73m3 *state)
|
|
|
|
state->mclk_frequency = pdata->mclk_frequency;
|
|
state->gpio[STBY] = pdata->gpio_stby;
|
|
- state->gpio[RST] = pdata->gpio_reset;
|
|
+ state->gpio[RSET] = pdata->gpio_reset;
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/media/i2c/s5c73m3/s5c73m3.h b/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
index ef7e85b34263b..c3fcfdd3ea66d 100644
|
|
--- a/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
+++ b/drivers/media/i2c/s5c73m3/s5c73m3.h
|
|
@@ -353,7 +353,7 @@ struct s5c73m3_ctrls {
|
|
|
|
enum s5c73m3_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
diff --git a/drivers/media/i2c/s5k4ecgx.c b/drivers/media/i2c/s5k4ecgx.c
|
|
index b2d53417badf6..4e97309a67f41 100644
|
|
--- a/drivers/media/i2c/s5k4ecgx.c
|
|
+++ b/drivers/media/i2c/s5k4ecgx.c
|
|
@@ -173,7 +173,7 @@ static const char * const s5k4ecgx_supply_names[] = {
|
|
|
|
enum s5k4ecgx_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
@@ -476,7 +476,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
|
|
if (s5k4ecgx_gpio_set_value(priv, STBY, priv->gpio[STBY].level))
|
|
usleep_range(30, 50);
|
|
|
|
- if (s5k4ecgx_gpio_set_value(priv, RST, priv->gpio[RST].level))
|
|
+ if (s5k4ecgx_gpio_set_value(priv, RSET, priv->gpio[RSET].level))
|
|
usleep_range(30, 50);
|
|
|
|
return 0;
|
|
@@ -484,7 +484,7 @@ static int __s5k4ecgx_power_on(struct s5k4ecgx *priv)
|
|
|
|
static int __s5k4ecgx_power_off(struct s5k4ecgx *priv)
|
|
{
|
|
- if (s5k4ecgx_gpio_set_value(priv, RST, !priv->gpio[RST].level))
|
|
+ if (s5k4ecgx_gpio_set_value(priv, RSET, !priv->gpio[RSET].level))
|
|
usleep_range(30, 50);
|
|
|
|
if (s5k4ecgx_gpio_set_value(priv, STBY, !priv->gpio[STBY].level))
|
|
@@ -872,7 +872,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
|
|
int ret;
|
|
|
|
priv->gpio[STBY].gpio = -EINVAL;
|
|
- priv->gpio[RST].gpio = -EINVAL;
|
|
+ priv->gpio[RSET].gpio = -EINVAL;
|
|
|
|
ret = s5k4ecgx_config_gpio(gpio->gpio, gpio->level, "S5K4ECGX_STBY");
|
|
|
|
@@ -891,7 +891,7 @@ static int s5k4ecgx_config_gpios(struct s5k4ecgx *priv,
|
|
s5k4ecgx_free_gpios(priv);
|
|
return ret;
|
|
}
|
|
- priv->gpio[RST] = *gpio;
|
|
+ priv->gpio[RSET] = *gpio;
|
|
if (gpio_is_valid(gpio->gpio))
|
|
gpio_set_value(gpio->gpio, 0);
|
|
|
|
diff --git a/drivers/media/i2c/s5k5baf.c b/drivers/media/i2c/s5k5baf.c
|
|
index cdfe008ba39f8..ac5ab3392073a 100644
|
|
--- a/drivers/media/i2c/s5k5baf.c
|
|
+++ b/drivers/media/i2c/s5k5baf.c
|
|
@@ -235,7 +235,7 @@ struct s5k5baf_gpio {
|
|
|
|
enum s5k5baf_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
NUM_GPIOS,
|
|
};
|
|
|
|
@@ -970,7 +970,7 @@ static int s5k5baf_power_on(struct s5k5baf *state)
|
|
|
|
s5k5baf_gpio_deassert(state, STBY);
|
|
usleep_range(50, 100);
|
|
- s5k5baf_gpio_deassert(state, RST);
|
|
+ s5k5baf_gpio_deassert(state, RSET);
|
|
return 0;
|
|
|
|
err_reg_dis:
|
|
@@ -988,7 +988,7 @@ static int s5k5baf_power_off(struct s5k5baf *state)
|
|
state->apply_cfg = 0;
|
|
state->apply_crop = 0;
|
|
|
|
- s5k5baf_gpio_assert(state, RST);
|
|
+ s5k5baf_gpio_assert(state, RSET);
|
|
s5k5baf_gpio_assert(state, STBY);
|
|
|
|
if (!IS_ERR(state->clock))
|
|
diff --git a/drivers/media/i2c/s5k6aa.c b/drivers/media/i2c/s5k6aa.c
|
|
index 72439fae7968b..6516e205e9a3d 100644
|
|
--- a/drivers/media/i2c/s5k6aa.c
|
|
+++ b/drivers/media/i2c/s5k6aa.c
|
|
@@ -177,7 +177,7 @@ static const char * const s5k6aa_supply_names[] = {
|
|
|
|
enum s5k6aa_gpio_id {
|
|
STBY,
|
|
- RST,
|
|
+ RSET,
|
|
GPIO_NUM,
|
|
};
|
|
|
|
@@ -841,7 +841,7 @@ static int __s5k6aa_power_on(struct s5k6aa *s5k6aa)
|
|
ret = s5k6aa->s_power(1);
|
|
usleep_range(4000, 5000);
|
|
|
|
- if (s5k6aa_gpio_deassert(s5k6aa, RST))
|
|
+ if (s5k6aa_gpio_deassert(s5k6aa, RSET))
|
|
msleep(20);
|
|
|
|
return ret;
|
|
@@ -851,7 +851,7 @@ static int __s5k6aa_power_off(struct s5k6aa *s5k6aa)
|
|
{
|
|
int ret;
|
|
|
|
- if (s5k6aa_gpio_assert(s5k6aa, RST))
|
|
+ if (s5k6aa_gpio_assert(s5k6aa, RSET))
|
|
usleep_range(100, 150);
|
|
|
|
if (s5k6aa->s_power) {
|
|
@@ -1510,7 +1510,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
|
|
int ret;
|
|
|
|
s5k6aa->gpio[STBY].gpio = -EINVAL;
|
|
- s5k6aa->gpio[RST].gpio = -EINVAL;
|
|
+ s5k6aa->gpio[RSET].gpio = -EINVAL;
|
|
|
|
gpio = &pdata->gpio_stby;
|
|
if (gpio_is_valid(gpio->gpio)) {
|
|
@@ -1533,7 +1533,7 @@ static int s5k6aa_configure_gpios(struct s5k6aa *s5k6aa,
|
|
if (ret < 0)
|
|
return ret;
|
|
|
|
- s5k6aa->gpio[RST] = *gpio;
|
|
+ s5k6aa->gpio[RSET] = *gpio;
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/media/i2c/tc358743.c b/drivers/media/i2c/tc358743.c
|
|
index 114c084c4aec1..76c443067ec2d 100644
|
|
--- a/drivers/media/i2c/tc358743.c
|
|
+++ b/drivers/media/i2c/tc358743.c
|
|
@@ -1973,6 +1973,7 @@ static int tc358743_probe_of(struct tc358743_state *state)
|
|
bps_pr_lane = 2 * endpoint.link_frequencies[0];
|
|
if (bps_pr_lane < 62500000U || bps_pr_lane > 1000000000U) {
|
|
dev_err(dev, "unsupported bps per lane: %u bps\n", bps_pr_lane);
|
|
+ ret = -EINVAL;
|
|
goto disable_clk;
|
|
}
|
|
|
|
diff --git a/drivers/media/mc/Makefile b/drivers/media/mc/Makefile
|
|
index 119037f0e686d..2b7af42ba59c1 100644
|
|
--- a/drivers/media/mc/Makefile
|
|
+++ b/drivers/media/mc/Makefile
|
|
@@ -3,7 +3,7 @@
|
|
mc-objs := mc-device.o mc-devnode.o mc-entity.o \
|
|
mc-request.o
|
|
|
|
-ifeq ($(CONFIG_USB),y)
|
|
+ifneq ($(CONFIG_USB),)
|
|
mc-objs += mc-dev-allocator.o
|
|
endif
|
|
|
|
diff --git a/drivers/media/pci/bt8xx/bt878.c b/drivers/media/pci/bt8xx/bt878.c
|
|
index 53af26ad1dfb5..1a741b47eaa19 100644
|
|
--- a/drivers/media/pci/bt8xx/bt878.c
|
|
+++ b/drivers/media/pci/bt8xx/bt878.c
|
|
@@ -477,6 +477,9 @@ static int bt878_probe(struct pci_dev *dev, const struct pci_device_id *pci_id)
|
|
btwrite(0, BT878_AINT_MASK);
|
|
bt878_num++;
|
|
|
|
+ if (!bt->tasklet.func)
|
|
+ tasklet_disable(&bt->tasklet);
|
|
+
|
|
return 0;
|
|
|
|
fail2:
|
|
diff --git a/drivers/media/pci/cobalt/cobalt-driver.c b/drivers/media/pci/cobalt/cobalt-driver.c
|
|
index 0695078ef8125..1bd8bbe57a30e 100644
|
|
--- a/drivers/media/pci/cobalt/cobalt-driver.c
|
|
+++ b/drivers/media/pci/cobalt/cobalt-driver.c
|
|
@@ -667,6 +667,7 @@ static int cobalt_probe(struct pci_dev *pci_dev,
|
|
return -ENOMEM;
|
|
cobalt->pci_dev = pci_dev;
|
|
cobalt->instance = i;
|
|
+ mutex_init(&cobalt->pci_lock);
|
|
|
|
retval = v4l2_device_register(&pci_dev->dev, &cobalt->v4l2_dev);
|
|
if (retval) {
|
|
diff --git a/drivers/media/pci/cobalt/cobalt-driver.h b/drivers/media/pci/cobalt/cobalt-driver.h
|
|
index bca68572b3242..12c33e035904c 100644
|
|
--- a/drivers/media/pci/cobalt/cobalt-driver.h
|
|
+++ b/drivers/media/pci/cobalt/cobalt-driver.h
|
|
@@ -251,6 +251,8 @@ struct cobalt {
|
|
int instance;
|
|
struct pci_dev *pci_dev;
|
|
struct v4l2_device v4l2_dev;
|
|
+ /* serialize PCI access in cobalt_s_bit_sysctrl() */
|
|
+ struct mutex pci_lock;
|
|
|
|
void __iomem *bar0, *bar1;
|
|
|
|
@@ -320,10 +322,13 @@ static inline u32 cobalt_g_sysctrl(struct cobalt *cobalt)
|
|
static inline void cobalt_s_bit_sysctrl(struct cobalt *cobalt,
|
|
int bit, int val)
|
|
{
|
|
- u32 ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
|
|
+ u32 ctrl;
|
|
|
|
+ mutex_lock(&cobalt->pci_lock);
|
|
+ ctrl = cobalt_read_bar1(cobalt, COBALT_SYS_CTRL_BASE);
|
|
cobalt_write_bar1(cobalt, COBALT_SYS_CTRL_BASE,
|
|
(ctrl & ~(1UL << bit)) | (val << bit));
|
|
+ mutex_unlock(&cobalt->pci_lock);
|
|
}
|
|
|
|
static inline u32 cobalt_g_sysstat(struct cobalt *cobalt)
|
|
diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
index 35a1d0d6dd660..42d1e4496efa1 100644
|
|
--- a/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
+++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
@@ -56,10 +56,8 @@ static void __gsc_m2m_job_abort(struct gsc_ctx *ctx)
|
|
static int gsc_m2m_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
{
|
|
struct gsc_ctx *ctx = q->drv_priv;
|
|
- int ret;
|
|
|
|
- ret = pm_runtime_get_sync(&ctx->gsc_dev->pdev->dev);
|
|
- return ret > 0 ? 0 : ret;
|
|
+ return pm_runtime_resume_and_get(&ctx->gsc_dev->pdev->dev);
|
|
}
|
|
|
|
static void __gsc_m2m_cleanup_queue(struct gsc_ctx *ctx)
|
|
diff --git a/drivers/media/platform/exynos4-is/fimc-isp-video.c b/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
index d2cbcdca0463d..370cdf0070128 100644
|
|
--- a/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
+++ b/drivers/media/platform/exynos4-is/fimc-isp-video.c
|
|
@@ -305,17 +305,20 @@ static int isp_video_release(struct file *file)
|
|
struct fimc_is_video *ivc = &isp->video_capture;
|
|
struct media_entity *entity = &ivc->ve.vdev.entity;
|
|
struct media_device *mdev = entity->graph_obj.mdev;
|
|
+ bool is_singular_file;
|
|
|
|
mutex_lock(&isp->video_lock);
|
|
|
|
- if (v4l2_fh_is_singular_file(file) && ivc->streaming) {
|
|
+ is_singular_file = v4l2_fh_is_singular_file(file);
|
|
+
|
|
+ if (is_singular_file && ivc->streaming) {
|
|
media_pipeline_stop(entity);
|
|
ivc->streaming = 0;
|
|
}
|
|
|
|
_vb2_fop_release(file, NULL);
|
|
|
|
- if (v4l2_fh_is_singular_file(file)) {
|
|
+ if (is_singular_file) {
|
|
fimc_pipeline_call(&ivc->ve, close);
|
|
|
|
mutex_lock(&mdev->graph_mutex);
|
|
diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
index 7c9e2d69e21a0..34bc2949e1d67 100644
|
|
--- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
+++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
@@ -402,12 +402,12 @@ static int mtk_mdp_m2m_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
struct mtk_mdp_ctx *ctx = q->drv_priv;
|
|
int ret;
|
|
|
|
- ret = pm_runtime_get_sync(&ctx->mdp_dev->pdev->dev);
|
|
+ ret = pm_runtime_resume_and_get(&ctx->mdp_dev->pdev->dev);
|
|
if (ret < 0)
|
|
- mtk_mdp_dbg(1, "[%d] pm_runtime_get_sync failed:%d",
|
|
+ mtk_mdp_dbg(1, "[%d] pm_runtime_resume_and_get failed:%d",
|
|
ctx->id, ret);
|
|
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
|
|
static void *mtk_mdp_m2m_buf_remove(struct mtk_mdp_ctx *ctx,
|
|
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
|
|
index 00d090df11bbe..4cde1a54e7252 100644
|
|
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
|
|
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_drv.c
|
|
@@ -142,7 +142,9 @@ static int fops_vcodec_open(struct file *file)
|
|
mtk_vcodec_dec_set_default_params(ctx);
|
|
|
|
if (v4l2_fh_is_singular(&ctx->fh)) {
|
|
- mtk_vcodec_dec_pw_on(&dev->pm);
|
|
+ ret = mtk_vcodec_dec_pw_on(&dev->pm);
|
|
+ if (ret < 0)
|
|
+ goto err_load_fw;
|
|
/*
|
|
* vpu_load_firmware checks if it was loaded already and
|
|
* does nothing in that case
|
|
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
|
|
index f9bbd0000bf3e..34e9e067de206 100644
|
|
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
|
|
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.c
|
|
@@ -89,13 +89,15 @@ void mtk_vcodec_release_dec_pm(struct mtk_vcodec_dev *dev)
|
|
put_device(dev->pm.larbvdec);
|
|
}
|
|
|
|
-void mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm)
|
|
+int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm)
|
|
{
|
|
int ret;
|
|
|
|
- ret = pm_runtime_get_sync(pm->dev);
|
|
+ ret = pm_runtime_resume_and_get(pm->dev);
|
|
if (ret)
|
|
- mtk_v4l2_err("pm_runtime_get_sync fail %d", ret);
|
|
+ mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
|
|
+
|
|
+ return ret;
|
|
}
|
|
|
|
void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm)
|
|
diff --git a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h
|
|
index 872d8bf8cfaf3..280aeaefdb651 100644
|
|
--- a/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h
|
|
+++ b/drivers/media/platform/mtk-vcodec/mtk_vcodec_dec_pm.h
|
|
@@ -12,7 +12,7 @@
|
|
int mtk_vcodec_init_dec_pm(struct mtk_vcodec_dev *dev);
|
|
void mtk_vcodec_release_dec_pm(struct mtk_vcodec_dev *dev);
|
|
|
|
-void mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm);
|
|
+int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm);
|
|
void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm);
|
|
void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm);
|
|
void mtk_vcodec_dec_clock_off(struct mtk_vcodec_pm *pm);
|
|
diff --git a/drivers/media/platform/s5p-cec/s5p_cec.c b/drivers/media/platform/s5p-cec/s5p_cec.c
|
|
index 6ddcc35b0bbda..828792b854f5c 100644
|
|
--- a/drivers/media/platform/s5p-cec/s5p_cec.c
|
|
+++ b/drivers/media/platform/s5p-cec/s5p_cec.c
|
|
@@ -35,10 +35,13 @@ MODULE_PARM_DESC(debug, "debug level (0-2)");
|
|
|
|
static int s5p_cec_adap_enable(struct cec_adapter *adap, bool enable)
|
|
{
|
|
+ int ret;
|
|
struct s5p_cec_dev *cec = cec_get_drvdata(adap);
|
|
|
|
if (enable) {
|
|
- pm_runtime_get_sync(cec->dev);
|
|
+ ret = pm_runtime_resume_and_get(cec->dev);
|
|
+ if (ret < 0)
|
|
+ return ret;
|
|
|
|
s5p_cec_reset(cec);
|
|
|
|
@@ -51,7 +54,7 @@ static int s5p_cec_adap_enable(struct cec_adapter *adap, bool enable)
|
|
} else {
|
|
s5p_cec_mask_tx_interrupts(cec);
|
|
s5p_cec_mask_rx_interrupts(cec);
|
|
- pm_runtime_disable(cec->dev);
|
|
+ pm_runtime_put(cec->dev);
|
|
}
|
|
|
|
return 0;
|
|
diff --git a/drivers/media/platform/s5p-g2d/g2d.c b/drivers/media/platform/s5p-g2d/g2d.c
|
|
index f5f05ea9f5213..6cfc2debfd9a0 100644
|
|
--- a/drivers/media/platform/s5p-g2d/g2d.c
|
|
+++ b/drivers/media/platform/s5p-g2d/g2d.c
|
|
@@ -276,6 +276,9 @@ static int g2d_release(struct file *file)
|
|
struct g2d_dev *dev = video_drvdata(file);
|
|
struct g2d_ctx *ctx = fh2ctx(file->private_data);
|
|
|
|
+ mutex_lock(&dev->mutex);
|
|
+ v4l2_m2m_ctx_release(ctx->fh.m2m_ctx);
|
|
+ mutex_unlock(&dev->mutex);
|
|
v4l2_ctrl_handler_free(&ctx->ctrl_handler);
|
|
v4l2_fh_del(&ctx->fh);
|
|
v4l2_fh_exit(&ctx->fh);
|
|
diff --git a/drivers/media/platform/s5p-jpeg/jpeg-core.c b/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
index 8dbbd5f2a40a0..06e17946bbb64 100644
|
|
--- a/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
+++ b/drivers/media/platform/s5p-jpeg/jpeg-core.c
|
|
@@ -2579,11 +2579,8 @@ static void s5p_jpeg_buf_queue(struct vb2_buffer *vb)
|
|
static int s5p_jpeg_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
{
|
|
struct s5p_jpeg_ctx *ctx = vb2_get_drv_priv(q);
|
|
- int ret;
|
|
-
|
|
- ret = pm_runtime_get_sync(ctx->jpeg->dev);
|
|
|
|
- return ret > 0 ? 0 : ret;
|
|
+ return pm_runtime_resume_and_get(ctx->jpeg->dev);
|
|
}
|
|
|
|
static void s5p_jpeg_stop_streaming(struct vb2_queue *q)
|
|
diff --git a/drivers/media/platform/sh_vou.c b/drivers/media/platform/sh_vou.c
|
|
index 2236702c21b43..84c4b19fb107f 100644
|
|
--- a/drivers/media/platform/sh_vou.c
|
|
+++ b/drivers/media/platform/sh_vou.c
|
|
@@ -1133,7 +1133,11 @@ static int sh_vou_open(struct file *file)
|
|
if (v4l2_fh_is_singular_file(file) &&
|
|
vou_dev->status == SH_VOU_INITIALISING) {
|
|
/* First open */
|
|
- pm_runtime_get_sync(vou_dev->v4l2_dev.dev);
|
|
+ err = pm_runtime_resume_and_get(vou_dev->v4l2_dev.dev);
|
|
+ if (err < 0) {
|
|
+ v4l2_fh_release(file);
|
|
+ goto done_open;
|
|
+ }
|
|
err = sh_vou_hw_init(vou_dev);
|
|
if (err < 0) {
|
|
pm_runtime_put(vou_dev->v4l2_dev.dev);
|
|
diff --git a/drivers/media/platform/sti/bdisp/Makefile b/drivers/media/platform/sti/bdisp/Makefile
|
|
index caf7ccd193eaa..39ade0a347236 100644
|
|
--- a/drivers/media/platform/sti/bdisp/Makefile
|
|
+++ b/drivers/media/platform/sti/bdisp/Makefile
|
|
@@ -1,4 +1,4 @@
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
-obj-$(CONFIG_VIDEO_STI_BDISP) := bdisp.o
|
|
+obj-$(CONFIG_VIDEO_STI_BDISP) += bdisp.o
|
|
|
|
bdisp-objs := bdisp-v4l2.o bdisp-hw.o bdisp-debug.o
|
|
diff --git a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
|
|
index a55ddf8d185d5..16a097f93b423 100644
|
|
--- a/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
|
|
+++ b/drivers/media/platform/sti/bdisp/bdisp-v4l2.c
|
|
@@ -499,7 +499,7 @@ static int bdisp_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
{
|
|
struct bdisp_ctx *ctx = q->drv_priv;
|
|
struct vb2_v4l2_buffer *buf;
|
|
- int ret = pm_runtime_get_sync(ctx->bdisp_dev->dev);
|
|
+ int ret = pm_runtime_resume_and_get(ctx->bdisp_dev->dev);
|
|
|
|
if (ret < 0) {
|
|
dev_err(ctx->bdisp_dev->dev, "failed to set runtime PM\n");
|
|
@@ -1364,10 +1364,10 @@ static int bdisp_probe(struct platform_device *pdev)
|
|
|
|
/* Power management */
|
|
pm_runtime_enable(dev);
|
|
- ret = pm_runtime_get_sync(dev);
|
|
+ ret = pm_runtime_resume_and_get(dev);
|
|
if (ret < 0) {
|
|
dev_err(dev, "failed to set PM\n");
|
|
- goto err_pm;
|
|
+ goto err_remove;
|
|
}
|
|
|
|
/* Filters */
|
|
@@ -1395,6 +1395,7 @@ err_filter:
|
|
bdisp_hw_free_filters(bdisp->dev);
|
|
err_pm:
|
|
pm_runtime_put(dev);
|
|
+err_remove:
|
|
bdisp_debugfs_remove(bdisp);
|
|
err_v4l2:
|
|
v4l2_device_unregister(&bdisp->v4l2_dev);
|
|
diff --git a/drivers/media/platform/sti/delta/Makefile b/drivers/media/platform/sti/delta/Makefile
|
|
index 92b37e216f004..32412fa4c6328 100644
|
|
--- a/drivers/media/platform/sti/delta/Makefile
|
|
+++ b/drivers/media/platform/sti/delta/Makefile
|
|
@@ -1,5 +1,5 @@
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
-obj-$(CONFIG_VIDEO_STI_DELTA_DRIVER) := st-delta.o
|
|
+obj-$(CONFIG_VIDEO_STI_DELTA_DRIVER) += st-delta.o
|
|
st-delta-y := delta-v4l2.o delta-mem.o delta-ipc.o delta-debug.o
|
|
|
|
# MJPEG support
|
|
diff --git a/drivers/media/platform/sti/hva/Makefile b/drivers/media/platform/sti/hva/Makefile
|
|
index 74b41ec52f976..b5a5478bdd016 100644
|
|
--- a/drivers/media/platform/sti/hva/Makefile
|
|
+++ b/drivers/media/platform/sti/hva/Makefile
|
|
@@ -1,4 +1,4 @@
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
-obj-$(CONFIG_VIDEO_STI_HVA) := st-hva.o
|
|
+obj-$(CONFIG_VIDEO_STI_HVA) += st-hva.o
|
|
st-hva-y := hva-v4l2.o hva-hw.o hva-mem.o hva-h264.o
|
|
st-hva-$(CONFIG_VIDEO_STI_HVA_DEBUGFS) += hva-debugfs.o
|
|
diff --git a/drivers/media/platform/sti/hva/hva-hw.c b/drivers/media/platform/sti/hva/hva-hw.c
|
|
index 43f279e2a6a38..cf4c891bf619a 100644
|
|
--- a/drivers/media/platform/sti/hva/hva-hw.c
|
|
+++ b/drivers/media/platform/sti/hva/hva-hw.c
|
|
@@ -130,8 +130,7 @@ static irqreturn_t hva_hw_its_irq_thread(int irq, void *arg)
|
|
ctx_id = (hva->sts_reg & 0xFF00) >> 8;
|
|
if (ctx_id >= HVA_MAX_INSTANCES) {
|
|
dev_err(dev, "%s %s: bad context identifier: %d\n",
|
|
- ctx->name, __func__, ctx_id);
|
|
- ctx->hw_err = true;
|
|
+ HVA_PREFIX, __func__, ctx_id);
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c
|
|
index a8a72d5fbd129..caefac07af927 100644
|
|
--- a/drivers/media/usb/au0828/au0828-core.c
|
|
+++ b/drivers/media/usb/au0828/au0828-core.c
|
|
@@ -199,8 +199,8 @@ static int au0828_media_device_init(struct au0828_dev *dev,
|
|
struct media_device *mdev;
|
|
|
|
mdev = media_device_usb_allocate(udev, KBUILD_MODNAME, THIS_MODULE);
|
|
- if (!mdev)
|
|
- return -ENOMEM;
|
|
+ if (IS_ERR(mdev))
|
|
+ return PTR_ERR(mdev);
|
|
|
|
dev->media_dev = mdev;
|
|
#endif
|
|
diff --git a/drivers/media/usb/cpia2/cpia2.h b/drivers/media/usb/cpia2/cpia2.h
|
|
index 50835f5f7512c..57b7f1ea68da5 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2.h
|
|
+++ b/drivers/media/usb/cpia2/cpia2.h
|
|
@@ -429,6 +429,7 @@ int cpia2_send_command(struct camera_data *cam, struct cpia2_command *cmd);
|
|
int cpia2_do_command(struct camera_data *cam,
|
|
unsigned int command,
|
|
unsigned char direction, unsigned char param);
|
|
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf);
|
|
struct camera_data *cpia2_init_camera_struct(struct usb_interface *intf);
|
|
int cpia2_init_camera(struct camera_data *cam);
|
|
int cpia2_allocate_buffers(struct camera_data *cam);
|
|
diff --git a/drivers/media/usb/cpia2/cpia2_core.c b/drivers/media/usb/cpia2/cpia2_core.c
|
|
index 20c50c2d042e6..f8c6e0b211a51 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2_core.c
|
|
+++ b/drivers/media/usb/cpia2/cpia2_core.c
|
|
@@ -2163,6 +2163,18 @@ static void reset_camera_struct(struct camera_data *cam)
|
|
cam->height = cam->params.roi.height;
|
|
}
|
|
|
|
+/******************************************************************************
|
|
+ *
|
|
+ * cpia2_init_camera_struct
|
|
+ *
|
|
+ * Deinitialize camera struct
|
|
+ *****************************************************************************/
|
|
+void cpia2_deinit_camera_struct(struct camera_data *cam, struct usb_interface *intf)
|
|
+{
|
|
+ v4l2_device_unregister(&cam->v4l2_dev);
|
|
+ kfree(cam);
|
|
+}
|
|
+
|
|
/******************************************************************************
|
|
*
|
|
* cpia2_init_camera_struct
|
|
diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c
|
|
index 3ab80a7b44985..76aac06f9fb8e 100644
|
|
--- a/drivers/media/usb/cpia2/cpia2_usb.c
|
|
+++ b/drivers/media/usb/cpia2/cpia2_usb.c
|
|
@@ -844,15 +844,13 @@ static int cpia2_usb_probe(struct usb_interface *intf,
|
|
ret = set_alternate(cam, USBIF_CMDONLY);
|
|
if (ret < 0) {
|
|
ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
|
|
|
|
if((ret = cpia2_init_camera(cam)) < 0) {
|
|
ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
LOG(" CPiA Version: %d.%02d (%d.%d)\n",
|
|
cam->params.version.firmware_revision_hi,
|
|
@@ -872,11 +870,14 @@ static int cpia2_usb_probe(struct usb_interface *intf,
|
|
ret = cpia2_register_camera(cam);
|
|
if (ret < 0) {
|
|
ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret);
|
|
- kfree(cam);
|
|
- return ret;
|
|
+ goto alt_err;
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
+alt_err:
|
|
+ cpia2_deinit_camera_struct(cam, intf);
|
|
+ return ret;
|
|
}
|
|
|
|
/******************************************************************************
|
|
diff --git a/drivers/media/usb/dvb-usb/cinergyT2-core.c b/drivers/media/usb/dvb-usb/cinergyT2-core.c
|
|
index 969a7ec71dff7..4116ba5c45fcb 100644
|
|
--- a/drivers/media/usb/dvb-usb/cinergyT2-core.c
|
|
+++ b/drivers/media/usb/dvb-usb/cinergyT2-core.c
|
|
@@ -78,6 +78,8 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
|
|
|
|
ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 3, 0);
|
|
if (ret < 0) {
|
|
+ if (adap->fe_adap[0].fe)
|
|
+ adap->fe_adap[0].fe->ops.release(adap->fe_adap[0].fe);
|
|
deb_rc("cinergyt2_power_ctrl() Failed to retrieve sleep state info\n");
|
|
}
|
|
mutex_unlock(&d->data_mutex);
|
|
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c
|
|
index fac19ec460895..06bd827ef4619 100644
|
|
--- a/drivers/media/usb/dvb-usb/cxusb.c
|
|
+++ b/drivers/media/usb/dvb-usb/cxusb.c
|
|
@@ -1950,7 +1950,7 @@ static struct dvb_usb_device_properties cxusb_bluebird_lgz201_properties = {
|
|
|
|
.size_of_priv = sizeof(struct cxusb_state),
|
|
|
|
- .num_adapters = 2,
|
|
+ .num_adapters = 1,
|
|
.adapter = {
|
|
{
|
|
.num_frontends = 1,
|
|
diff --git a/drivers/media/usb/em28xx/em28xx-input.c b/drivers/media/usb/em28xx/em28xx-input.c
|
|
index 5aa15a7a49def..59529cbf9cd0b 100644
|
|
--- a/drivers/media/usb/em28xx/em28xx-input.c
|
|
+++ b/drivers/media/usb/em28xx/em28xx-input.c
|
|
@@ -720,7 +720,8 @@ static int em28xx_ir_init(struct em28xx *dev)
|
|
dev->board.has_ir_i2c = 0;
|
|
dev_warn(&dev->intf->dev,
|
|
"No i2c IR remote control device found.\n");
|
|
- return -ENODEV;
|
|
+ err = -ENODEV;
|
|
+ goto ref_put;
|
|
}
|
|
}
|
|
|
|
@@ -735,7 +736,7 @@ static int em28xx_ir_init(struct em28xx *dev)
|
|
|
|
ir = kzalloc(sizeof(*ir), GFP_KERNEL);
|
|
if (!ir)
|
|
- return -ENOMEM;
|
|
+ goto ref_put;
|
|
rc = rc_allocate_device(RC_DRIVER_SCANCODE);
|
|
if (!rc)
|
|
goto error;
|
|
@@ -839,6 +840,9 @@ error:
|
|
dev->ir = NULL;
|
|
rc_free_device(rc);
|
|
kfree(ir);
|
|
+ref_put:
|
|
+ em28xx_shutdown_buttons(dev);
|
|
+ kref_put(&dev->ref, em28xx_free_device);
|
|
return err;
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/gspca/gl860/gl860.c b/drivers/media/usb/gspca/gl860/gl860.c
|
|
index 2c05ea2598e76..ce4ee8bc75c85 100644
|
|
--- a/drivers/media/usb/gspca/gl860/gl860.c
|
|
+++ b/drivers/media/usb/gspca/gl860/gl860.c
|
|
@@ -561,8 +561,8 @@ int gl860_RTx(struct gspca_dev *gspca_dev,
|
|
len, 400 + 200 * (len > 1));
|
|
memcpy(pdata, gspca_dev->usb_buf, len);
|
|
} else {
|
|
- r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
|
|
- req, pref, val, index, NULL, len, 400);
|
|
+ gspca_err(gspca_dev, "zero-length read request\n");
|
|
+ r = -EINVAL;
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
index 1cfb7cf64131a..4c991eae53cdf 100644
|
|
--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
+++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c
|
|
@@ -2677,9 +2677,8 @@ void pvr2_hdw_destroy(struct pvr2_hdw *hdw)
|
|
pvr2_stream_destroy(hdw->vid_stream);
|
|
hdw->vid_stream = NULL;
|
|
}
|
|
- pvr2_i2c_core_done(hdw);
|
|
v4l2_device_unregister(&hdw->v4l2_dev);
|
|
- pvr2_hdw_remove_usb_stuff(hdw);
|
|
+ pvr2_hdw_disconnect(hdw);
|
|
mutex_lock(&pvr2_unit_mtx);
|
|
do {
|
|
if ((hdw->unit_number >= 0) &&
|
|
@@ -2706,6 +2705,7 @@ void pvr2_hdw_disconnect(struct pvr2_hdw *hdw)
|
|
{
|
|
pvr2_trace(PVR2_TRACE_INIT,"pvr2_hdw_disconnect(hdw=%p)",hdw);
|
|
LOCK_TAKE(hdw->big_lock);
|
|
+ pvr2_i2c_core_done(hdw);
|
|
LOCK_TAKE(hdw->ctl_lock);
|
|
pvr2_hdw_remove_usb_stuff(hdw);
|
|
LOCK_GIVE(hdw->ctl_lock);
|
|
diff --git a/drivers/media/v4l2-core/v4l2-fh.c b/drivers/media/v4l2-core/v4l2-fh.c
|
|
index 684574f58e82d..90eec79ee995a 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-fh.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-fh.c
|
|
@@ -96,6 +96,7 @@ int v4l2_fh_release(struct file *filp)
|
|
v4l2_fh_del(fh);
|
|
v4l2_fh_exit(fh);
|
|
kfree(fh);
|
|
+ filp->private_data = NULL;
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/memstick/host/rtsx_usb_ms.c b/drivers/memstick/host/rtsx_usb_ms.c
|
|
index 102dbb8080da5..29271ad4728a2 100644
|
|
--- a/drivers/memstick/host/rtsx_usb_ms.c
|
|
+++ b/drivers/memstick/host/rtsx_usb_ms.c
|
|
@@ -799,9 +799,9 @@ static int rtsx_usb_ms_drv_probe(struct platform_device *pdev)
|
|
|
|
return 0;
|
|
err_out:
|
|
- memstick_free_host(msh);
|
|
pm_runtime_disable(ms_dev(host));
|
|
pm_runtime_put_noidle(ms_dev(host));
|
|
+ memstick_free_host(msh);
|
|
return err;
|
|
}
|
|
|
|
@@ -828,9 +828,6 @@ static int rtsx_usb_ms_drv_remove(struct platform_device *pdev)
|
|
}
|
|
mutex_unlock(&host->host_mutex);
|
|
|
|
- memstick_remove_host(msh);
|
|
- memstick_free_host(msh);
|
|
-
|
|
/* Balance possible unbalanced usage count
|
|
* e.g. unconditional module removal
|
|
*/
|
|
@@ -838,10 +835,11 @@ static int rtsx_usb_ms_drv_remove(struct platform_device *pdev)
|
|
pm_runtime_put(ms_dev(host));
|
|
|
|
pm_runtime_disable(ms_dev(host));
|
|
- platform_set_drvdata(pdev, NULL);
|
|
-
|
|
+ memstick_remove_host(msh);
|
|
dev_dbg(ms_dev(host),
|
|
": Realtek USB Memstick controller has been removed\n");
|
|
+ memstick_free_host(msh);
|
|
+ platform_set_drvdata(pdev, NULL);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/misc/eeprom/idt_89hpesx.c b/drivers/misc/eeprom/idt_89hpesx.c
|
|
index 81c70e5bc168f..3e4a594c110b3 100644
|
|
--- a/drivers/misc/eeprom/idt_89hpesx.c
|
|
+++ b/drivers/misc/eeprom/idt_89hpesx.c
|
|
@@ -1126,11 +1126,10 @@ static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
|
|
|
|
device_for_each_child_node(dev, fwnode) {
|
|
ee_id = idt_ee_match_id(fwnode);
|
|
- if (!ee_id) {
|
|
- dev_warn(dev, "Skip unsupported EEPROM device");
|
|
- continue;
|
|
- } else
|
|
+ if (ee_id)
|
|
break;
|
|
+
|
|
+ dev_warn(dev, "Skip unsupported EEPROM device %pfw\n", fwnode);
|
|
}
|
|
|
|
/* If there is no fwnode EEPROM device, then set zero size */
|
|
@@ -1161,6 +1160,7 @@ static void idt_get_fw_data(struct idt_89hpesx_dev *pdev)
|
|
else /* if (!fwnode_property_read_bool(node, "read-only")) */
|
|
pdev->eero = false;
|
|
|
|
+ fwnode_handle_put(fwnode);
|
|
dev_info(dev, "EEPROM of %d bytes found by 0x%x",
|
|
pdev->eesize, pdev->eeaddr);
|
|
}
|
|
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
|
|
index 39f2864455a60..8322d22a59c45 100644
|
|
--- a/drivers/mmc/core/block.c
|
|
+++ b/drivers/mmc/core/block.c
|
|
@@ -1053,6 +1053,12 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
|
|
|
|
switch (mq_rq->drv_op) {
|
|
case MMC_DRV_OP_IOCTL:
|
|
+ if (card->ext_csd.cmdq_en) {
|
|
+ ret = mmc_cmdq_disable(card);
|
|
+ if (ret)
|
|
+ break;
|
|
+ }
|
|
+ fallthrough;
|
|
case MMC_DRV_OP_IOCTL_RPMB:
|
|
idata = mq_rq->drv_op_data;
|
|
for (i = 0, ret = 0; i < mq_rq->ioc_count; i++) {
|
|
@@ -1063,6 +1069,8 @@ static void mmc_blk_issue_drv_op(struct mmc_queue *mq, struct request *req)
|
|
/* Always switch back to main area after RPMB access */
|
|
if (rpmb_ioctl)
|
|
mmc_blk_part_switch(card, 0);
|
|
+ else if (card->reenable_cmdq && !card->ext_csd.cmdq_en)
|
|
+ mmc_cmdq_enable(card);
|
|
break;
|
|
case MMC_DRV_OP_BOOT_WP:
|
|
ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BOOT_WP,
|
|
diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c
|
|
index 10705e5fa90ee..a999d2089d3de 100644
|
|
--- a/drivers/mmc/host/sdhci-sprd.c
|
|
+++ b/drivers/mmc/host/sdhci-sprd.c
|
|
@@ -382,6 +382,7 @@ static unsigned int sdhci_sprd_get_ro(struct sdhci_host *host)
|
|
static struct sdhci_ops sdhci_sprd_ops = {
|
|
.read_l = sdhci_sprd_readl,
|
|
.write_l = sdhci_sprd_writel,
|
|
+ .write_w = sdhci_sprd_writew,
|
|
.write_b = sdhci_sprd_writeb,
|
|
.set_clock = sdhci_sprd_set_clock,
|
|
.get_max_clock = sdhci_sprd_get_max_clock,
|
|
diff --git a/drivers/mmc/host/usdhi6rol0.c b/drivers/mmc/host/usdhi6rol0.c
|
|
index 6eba2441c7efd..96b0f81a20322 100644
|
|
--- a/drivers/mmc/host/usdhi6rol0.c
|
|
+++ b/drivers/mmc/host/usdhi6rol0.c
|
|
@@ -1803,6 +1803,7 @@ static int usdhi6_probe(struct platform_device *pdev)
|
|
|
|
version = usdhi6_read(host, USDHI6_VERSION);
|
|
if ((version & 0xfff) != 0xa0d) {
|
|
+ ret = -EPERM;
|
|
dev_err(dev, "Version not recognized %x\n", version);
|
|
goto e_clk_off;
|
|
}
|
|
diff --git a/drivers/mmc/host/via-sdmmc.c b/drivers/mmc/host/via-sdmmc.c
|
|
index d12a068b0f9ed..721e5dd1eb7de 100644
|
|
--- a/drivers/mmc/host/via-sdmmc.c
|
|
+++ b/drivers/mmc/host/via-sdmmc.c
|
|
@@ -857,6 +857,9 @@ static void via_sdc_data_isr(struct via_crdr_mmc_host *host, u16 intmask)
|
|
{
|
|
BUG_ON(intmask == 0);
|
|
|
|
+ if (!host->data)
|
|
+ return;
|
|
+
|
|
if (intmask & VIA_CRDR_SDSTS_DT)
|
|
host->data->error = -ETIMEDOUT;
|
|
else if (intmask & (VIA_CRDR_SDSTS_RC | VIA_CRDR_SDSTS_WC))
|
|
diff --git a/drivers/mmc/host/vub300.c b/drivers/mmc/host/vub300.c
|
|
index a3680c9006892..156046e56a584 100644
|
|
--- a/drivers/mmc/host/vub300.c
|
|
+++ b/drivers/mmc/host/vub300.c
|
|
@@ -2286,7 +2286,7 @@ static int vub300_probe(struct usb_interface *interface,
|
|
if (retval < 0)
|
|
goto error5;
|
|
retval =
|
|
- usb_control_msg(vub300->udev, usb_rcvctrlpipe(vub300->udev, 0),
|
|
+ usb_control_msg(vub300->udev, usb_sndctrlpipe(vub300->udev, 0),
|
|
SET_ROM_WAIT_STATES,
|
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
|
|
firmware_rom_wait_states, 0x0000, NULL, 0, HZ);
|
|
diff --git a/drivers/mtd/nand/raw/marvell_nand.c b/drivers/mtd/nand/raw/marvell_nand.c
|
|
index ee4afa17d8a3a..ef163ff1edf76 100644
|
|
--- a/drivers/mtd/nand/raw/marvell_nand.c
|
|
+++ b/drivers/mtd/nand/raw/marvell_nand.c
|
|
@@ -2980,8 +2980,10 @@ static int __maybe_unused marvell_nfc_resume(struct device *dev)
|
|
return ret;
|
|
|
|
ret = clk_prepare_enable(nfc->reg_clk);
|
|
- if (ret < 0)
|
|
+ if (ret < 0) {
|
|
+ clk_disable_unprepare(nfc->core_clk);
|
|
return ret;
|
|
+ }
|
|
|
|
/*
|
|
* Reset nfc->selected_chip so the next command will cause the timing
|
|
diff --git a/drivers/mtd/parsers/redboot.c b/drivers/mtd/parsers/redboot.c
|
|
index 91146bdc47132..3ccd6363ee8cb 100644
|
|
--- a/drivers/mtd/parsers/redboot.c
|
|
+++ b/drivers/mtd/parsers/redboot.c
|
|
@@ -45,6 +45,7 @@ static inline int redboot_checksum(struct fis_image_desc *img)
|
|
static void parse_redboot_of(struct mtd_info *master)
|
|
{
|
|
struct device_node *np;
|
|
+ struct device_node *npart;
|
|
u32 dirblock;
|
|
int ret;
|
|
|
|
@@ -52,7 +53,11 @@ static void parse_redboot_of(struct mtd_info *master)
|
|
if (!np)
|
|
return;
|
|
|
|
- ret = of_property_read_u32(np, "fis-index-block", &dirblock);
|
|
+ npart = of_get_child_by_name(np, "partitions");
|
|
+ if (!npart)
|
|
+ return;
|
|
+
|
|
+ ret = of_property_read_u32(npart, "fis-index-block", &dirblock);
|
|
if (ret)
|
|
return;
|
|
|
|
diff --git a/drivers/net/can/peak_canfd/peak_canfd.c b/drivers/net/can/peak_canfd/peak_canfd.c
|
|
index 91b156b2123a3..d0bdcc43b8eeb 100644
|
|
--- a/drivers/net/can/peak_canfd/peak_canfd.c
|
|
+++ b/drivers/net/can/peak_canfd/peak_canfd.c
|
|
@@ -338,8 +338,8 @@ static int pucan_handle_status(struct peak_canfd_priv *priv,
|
|
return err;
|
|
}
|
|
|
|
- /* start network queue (echo_skb array is empty) */
|
|
- netif_start_queue(ndev);
|
|
+ /* wake network queue up (echo_skb array is empty) */
|
|
+ netif_wake_queue(ndev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/can/usb/ems_usb.c b/drivers/net/can/usb/ems_usb.c
|
|
index 4f52810bebf89..db9f15f17610b 100644
|
|
--- a/drivers/net/can/usb/ems_usb.c
|
|
+++ b/drivers/net/can/usb/ems_usb.c
|
|
@@ -1053,7 +1053,6 @@ static void ems_usb_disconnect(struct usb_interface *intf)
|
|
|
|
if (dev) {
|
|
unregister_netdev(dev->netdev);
|
|
- free_candev(dev->netdev);
|
|
|
|
unlink_all_urbs(dev);
|
|
|
|
@@ -1061,6 +1060,8 @@ static void ems_usb_disconnect(struct usb_interface *intf)
|
|
|
|
kfree(dev->intr_in_buffer);
|
|
kfree(dev->tx_msg_buffer);
|
|
+
|
|
+ free_candev(dev->netdev);
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/aeroflex/greth.c b/drivers/net/ethernet/aeroflex/greth.c
|
|
index 2a9f8643629c0..907904c0a2888 100644
|
|
--- a/drivers/net/ethernet/aeroflex/greth.c
|
|
+++ b/drivers/net/ethernet/aeroflex/greth.c
|
|
@@ -1541,10 +1541,11 @@ static int greth_of_remove(struct platform_device *of_dev)
|
|
mdiobus_unregister(greth->mdio);
|
|
|
|
unregister_netdev(ndev);
|
|
- free_netdev(ndev);
|
|
|
|
of_iounmap(&of_dev->resource[0], greth->regs, resource_size(&of_dev->resource[0]));
|
|
|
|
+ free_netdev(ndev);
|
|
+
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
index b27da024aa9d9..21669a42718c8 100644
|
|
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
|
|
@@ -3741,3 +3741,4 @@ MODULE_AUTHOR("Broadcom Corporation");
|
|
MODULE_DESCRIPTION("Broadcom GENET Ethernet controller driver");
|
|
MODULE_ALIAS("platform:bcmgenet");
|
|
MODULE_LICENSE("GPL");
|
|
+MODULE_SOFTDEP("pre: mdio-bcm-unimac");
|
|
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
|
|
index 701c12c9e0337..649c5c429bd7c 100644
|
|
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
|
|
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
|
|
@@ -550,7 +550,7 @@ int be_process_mcc(struct be_adapter *adapter)
|
|
int num = 0, status = 0;
|
|
struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
|
|
|
|
- spin_lock_bh(&adapter->mcc_cq_lock);
|
|
+ spin_lock(&adapter->mcc_cq_lock);
|
|
|
|
while ((compl = be_mcc_compl_get(adapter))) {
|
|
if (compl->flags & CQE_FLAGS_ASYNC_MASK) {
|
|
@@ -566,7 +566,7 @@ int be_process_mcc(struct be_adapter *adapter)
|
|
if (num)
|
|
be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num);
|
|
|
|
- spin_unlock_bh(&adapter->mcc_cq_lock);
|
|
+ spin_unlock(&adapter->mcc_cq_lock);
|
|
return status;
|
|
}
|
|
|
|
@@ -581,7 +581,9 @@ static int be_mcc_wait_compl(struct be_adapter *adapter)
|
|
if (be_check_error(adapter, BE_ERROR_ANY))
|
|
return -EIO;
|
|
|
|
+ local_bh_disable();
|
|
status = be_process_mcc(adapter);
|
|
+ local_bh_enable();
|
|
|
|
if (atomic_read(&mcc_obj->q.used) == 0)
|
|
break;
|
|
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
|
|
index 9aebb121365f5..552877590a8ab 100644
|
|
--- a/drivers/net/ethernet/emulex/benet/be_main.c
|
|
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
|
|
@@ -5631,7 +5631,9 @@ static void be_worker(struct work_struct *work)
|
|
* mcc completions
|
|
*/
|
|
if (!netif_running(adapter->netdev)) {
|
|
+ local_bh_disable();
|
|
be_process_mcc(adapter);
|
|
+ local_bh_enable();
|
|
goto reschedule;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/ezchip/nps_enet.c b/drivers/net/ethernet/ezchip/nps_enet.c
|
|
index 815fb62c4b02e..3d74401b4f102 100644
|
|
--- a/drivers/net/ethernet/ezchip/nps_enet.c
|
|
+++ b/drivers/net/ethernet/ezchip/nps_enet.c
|
|
@@ -610,7 +610,7 @@ static s32 nps_enet_probe(struct platform_device *pdev)
|
|
|
|
/* Get IRQ number */
|
|
priv->irq = platform_get_irq(pdev, 0);
|
|
- if (!priv->irq) {
|
|
+ if (priv->irq < 0) {
|
|
dev_err(dev, "failed to retrieve <irq Rx-Tx> value from device tree\n");
|
|
err = -ENODEV;
|
|
goto out_netdev;
|
|
@@ -645,8 +645,8 @@ static s32 nps_enet_remove(struct platform_device *pdev)
|
|
struct nps_enet_priv *priv = netdev_priv(ndev);
|
|
|
|
unregister_netdev(ndev);
|
|
- free_netdev(ndev);
|
|
netif_napi_del(&priv->napi);
|
|
+ free_netdev(ndev);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/ethernet/faraday/ftgmac100.c b/drivers/net/ethernet/faraday/ftgmac100.c
|
|
index 4050f81f788c3..2c06cdcd3e751 100644
|
|
--- a/drivers/net/ethernet/faraday/ftgmac100.c
|
|
+++ b/drivers/net/ethernet/faraday/ftgmac100.c
|
|
@@ -1821,14 +1821,17 @@ static int ftgmac100_probe(struct platform_device *pdev)
|
|
if (np && of_get_property(np, "use-ncsi", NULL)) {
|
|
if (!IS_ENABLED(CONFIG_NET_NCSI)) {
|
|
dev_err(&pdev->dev, "NCSI stack not enabled\n");
|
|
+ err = -EINVAL;
|
|
goto err_ncsi_dev;
|
|
}
|
|
|
|
dev_info(&pdev->dev, "Using NCSI interface\n");
|
|
priv->use_ncsi = true;
|
|
priv->ndev = ncsi_register_dev(netdev, ftgmac100_ncsi_handler);
|
|
- if (!priv->ndev)
|
|
+ if (!priv->ndev) {
|
|
+ err = -EINVAL;
|
|
goto err_ncsi_dev;
|
|
+ }
|
|
} else if (np && of_get_property(np, "phy-handle", NULL)) {
|
|
struct phy_device *phy;
|
|
|
|
@@ -1836,6 +1839,7 @@ static int ftgmac100_probe(struct platform_device *pdev)
|
|
&ftgmac100_adjust_link);
|
|
if (!phy) {
|
|
dev_err(&pdev->dev, "Failed to connect to phy\n");
|
|
+ err = -EINVAL;
|
|
goto err_setup_mdio;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/google/gve/gve_main.c b/drivers/net/ethernet/google/gve/gve_main.c
|
|
index 6ea0975d74a1f..1c4b35b1b3590 100644
|
|
--- a/drivers/net/ethernet/google/gve/gve_main.c
|
|
+++ b/drivers/net/ethernet/google/gve/gve_main.c
|
|
@@ -1118,8 +1118,8 @@ static int gve_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
|
gve_write_version(®_bar->driver_version);
|
|
/* Get max queues to alloc etherdev */
|
|
- max_rx_queues = ioread32be(®_bar->max_tx_queues);
|
|
- max_tx_queues = ioread32be(®_bar->max_rx_queues);
|
|
+ max_tx_queues = ioread32be(®_bar->max_tx_queues);
|
|
+ max_rx_queues = ioread32be(®_bar->max_rx_queues);
|
|
/* Alloc and setup the netdev and priv */
|
|
dev = alloc_etherdev_mqs(sizeof(*priv), max_tx_queues, max_rx_queues);
|
|
if (!dev) {
|
|
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
index 13e30eba5349e..1fd2b84e2e912 100644
|
|
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c
|
|
@@ -2617,10 +2617,8 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
u16 dummy16 = 0;
|
|
|
|
cb0 = (void *)get_zeroed_page(GFP_KERNEL);
|
|
- if (!cb0) {
|
|
- ret = -ENOMEM;
|
|
- goto out;
|
|
- }
|
|
+ if (!cb0)
|
|
+ return -ENOMEM;
|
|
|
|
for (i = 0; i < (port->num_def_qps); i++) {
|
|
struct ehea_port_res *pr = &port->port_res[i];
|
|
@@ -2640,6 +2638,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
cb0);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "query_ehea_qp failed (1)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
@@ -2652,6 +2651,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
&dummy64, &dummy16, &dummy16);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "modify_ehea_qp failed (1)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
@@ -2660,6 +2660,7 @@ static int ehea_restart_qps(struct net_device *dev)
|
|
cb0);
|
|
if (hret != H_SUCCESS) {
|
|
netdev_err(dev, "query_ehea_qp failed (2)\n");
|
|
+ ret = -EFAULT;
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
index a2b7b982ee290..ecfe588f330ef 100644
|
|
--- a/drivers/net/ethernet/ibm/ibmvnic.c
|
|
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
@@ -694,8 +694,11 @@ static int init_tx_pools(struct net_device *netdev)
|
|
|
|
adapter->tso_pool = kcalloc(tx_subcrqs,
|
|
sizeof(struct ibmvnic_tx_pool), GFP_KERNEL);
|
|
- if (!adapter->tso_pool)
|
|
+ if (!adapter->tso_pool) {
|
|
+ kfree(adapter->tx_pool);
|
|
+ adapter->tx_pool = NULL;
|
|
return -1;
|
|
+ }
|
|
|
|
adapter->num_active_tx_pools = tx_subcrqs;
|
|
|
|
@@ -1088,6 +1091,11 @@ static int __ibmvnic_open(struct net_device *netdev)
|
|
|
|
netif_tx_start_all_queues(netdev);
|
|
|
|
+ if (prev_state == VNIC_CLOSED) {
|
|
+ for (i = 0; i < adapter->req_rx_queues; i++)
|
|
+ napi_schedule(&adapter->napi[i]);
|
|
+ }
|
|
+
|
|
adapter->state = VNIC_OPEN;
|
|
return rc;
|
|
}
|
|
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
index c2feedfd321dc..a06d514215ede 100644
|
|
--- a/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
+++ b/drivers/net/ethernet/intel/e1000e/netdev.c
|
|
@@ -5199,18 +5199,20 @@ static void e1000_watchdog_task(struct work_struct *work)
|
|
pm_runtime_resume(netdev->dev.parent);
|
|
|
|
/* Checking if MAC is in DMoff state*/
|
|
- pcim_state = er32(STATUS);
|
|
- while (pcim_state & E1000_STATUS_PCIM_STATE) {
|
|
- if (tries++ == dmoff_exit_timeout) {
|
|
- e_dbg("Error in exiting dmoff\n");
|
|
- break;
|
|
- }
|
|
- usleep_range(10000, 20000);
|
|
+ if (er32(FWSM) & E1000_ICH_FWSM_FW_VALID) {
|
|
pcim_state = er32(STATUS);
|
|
-
|
|
- /* Checking if MAC exited DMoff state */
|
|
- if (!(pcim_state & E1000_STATUS_PCIM_STATE))
|
|
- e1000_phy_hw_reset(&adapter->hw);
|
|
+ while (pcim_state & E1000_STATUS_PCIM_STATE) {
|
|
+ if (tries++ == dmoff_exit_timeout) {
|
|
+ e_dbg("Error in exiting dmoff\n");
|
|
+ break;
|
|
+ }
|
|
+ usleep_range(10000, 20000);
|
|
+ pcim_state = er32(STATUS);
|
|
+
|
|
+ /* Checking if MAC exited DMoff state */
|
|
+ if (!(pcim_state & E1000_STATUS_PCIM_STATE))
|
|
+ e1000_phy_hw_reset(&adapter->hw);
|
|
+ }
|
|
}
|
|
|
|
/* update snapshot of PHY registers on LSC */
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
|
|
index e4d0b7747e84d..2288a3855e522 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
|
|
@@ -1259,8 +1259,7 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
|
|
if (ethtool_link_ksettings_test_link_mode(&safe_ks,
|
|
supported,
|
|
Autoneg) &&
|
|
- hw->phy.link_info.phy_type !=
|
|
- I40E_PHY_TYPE_10GBASE_T) {
|
|
+ hw->phy.media_type != I40E_MEDIA_TYPE_BASET) {
|
|
netdev_info(netdev, "Autoneg cannot be disabled on this phy\n");
|
|
err = -EINVAL;
|
|
goto done;
|
|
diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
index a1b4e995f2b7e..4f4ec1f166ef4 100644
|
|
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
|
|
@@ -8292,6 +8292,8 @@ int i40e_vsi_open(struct i40e_vsi *vsi)
|
|
dev_driver_string(&pf->pdev->dev),
|
|
dev_name(&pf->pdev->dev));
|
|
err = i40e_vsi_request_irq(vsi, int_name);
|
|
+ if (err)
|
|
+ goto err_setup_rx;
|
|
|
|
} else {
|
|
err = -EINVAL;
|
|
diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
index 491bcfd36ac25..7857ebff92e82 100644
|
|
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
|
|
@@ -5910,6 +5910,8 @@ static int mvpp2_probe(struct platform_device *pdev)
|
|
return 0;
|
|
|
|
err_port_probe:
|
|
+ fwnode_handle_put(port_fwnode);
|
|
+
|
|
i = 0;
|
|
fwnode_for_each_available_child_node(fwnode, port_fwnode) {
|
|
if (priv->port_list[i])
|
|
diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
index 18e6d87c607bd..f1269fe4ac721 100644
|
|
--- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
+++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c
|
|
@@ -2535,9 +2535,13 @@ static int pch_gbe_probe(struct pci_dev *pdev,
|
|
adapter->pdev = pdev;
|
|
adapter->hw.back = adapter;
|
|
adapter->hw.reg = pcim_iomap_table(pdev)[PCH_GBE_PCI_BAR];
|
|
+
|
|
adapter->pdata = (struct pch_gbe_privdata *)pci_id->driver_data;
|
|
- if (adapter->pdata && adapter->pdata->platform_init)
|
|
- adapter->pdata->platform_init(pdev);
|
|
+ if (adapter->pdata && adapter->pdata->platform_init) {
|
|
+ ret = adapter->pdata->platform_init(pdev);
|
|
+ if (ret)
|
|
+ goto err_free_netdev;
|
|
+ }
|
|
|
|
adapter->ptp_pdev =
|
|
pci_get_domain_bus_and_slot(pci_domain_nr(adapter->pdev->bus),
|
|
@@ -2632,7 +2636,7 @@ err_free_netdev:
|
|
*/
|
|
static int pch_gbe_minnow_platform_init(struct pci_dev *pdev)
|
|
{
|
|
- unsigned long flags = GPIOF_DIR_OUT | GPIOF_INIT_HIGH | GPIOF_EXPORT;
|
|
+ unsigned long flags = GPIOF_OUT_INIT_HIGH;
|
|
unsigned gpio = MINNOW_PHY_RESET_GPIO;
|
|
int ret;
|
|
|
|
diff --git a/drivers/net/ieee802154/mac802154_hwsim.c b/drivers/net/ieee802154/mac802154_hwsim.c
|
|
index c20e7ef18bc95..79d74763cf24a 100644
|
|
--- a/drivers/net/ieee802154/mac802154_hwsim.c
|
|
+++ b/drivers/net/ieee802154/mac802154_hwsim.c
|
|
@@ -480,7 +480,7 @@ static int hwsim_del_edge_nl(struct sk_buff *msg, struct genl_info *info)
|
|
struct hwsim_edge *e;
|
|
u32 v0, v1;
|
|
|
|
- if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] &&
|
|
+ if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID] ||
|
|
!info->attrs[MAC802154_HWSIM_ATTR_RADIO_EDGE])
|
|
return -EINVAL;
|
|
|
|
@@ -715,6 +715,8 @@ static int hwsim_subscribe_all_others(struct hwsim_phy *phy)
|
|
|
|
return 0;
|
|
|
|
+sub_fail:
|
|
+ hwsim_edge_unsubscribe_me(phy);
|
|
me_fail:
|
|
rcu_read_lock();
|
|
list_for_each_entry_rcu(e, &phy->edges, list) {
|
|
@@ -722,8 +724,6 @@ me_fail:
|
|
hwsim_free_edge(e);
|
|
}
|
|
rcu_read_unlock();
|
|
-sub_fail:
|
|
- hwsim_edge_unsubscribe_me(phy);
|
|
return -ENOMEM;
|
|
}
|
|
|
|
@@ -824,12 +824,17 @@ err_pib:
|
|
static void hwsim_del(struct hwsim_phy *phy)
|
|
{
|
|
struct hwsim_pib *pib;
|
|
+ struct hwsim_edge *e;
|
|
|
|
hwsim_edge_unsubscribe_me(phy);
|
|
|
|
list_del(&phy->list);
|
|
|
|
rcu_read_lock();
|
|
+ list_for_each_entry_rcu(e, &phy->edges, list) {
|
|
+ list_del_rcu(&e->list);
|
|
+ hwsim_free_edge(e);
|
|
+ }
|
|
pib = rcu_dereference(phy->pib);
|
|
rcu_read_unlock();
|
|
|
|
diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c
|
|
index 1267786d2931b..f08ed52d51f3f 100644
|
|
--- a/drivers/net/vrf.c
|
|
+++ b/drivers/net/vrf.c
|
|
@@ -1035,22 +1035,22 @@ static struct sk_buff *vrf_ip6_rcv(struct net_device *vrf_dev,
|
|
int orig_iif = skb->skb_iif;
|
|
bool need_strict = rt6_need_strict(&ipv6_hdr(skb)->daddr);
|
|
bool is_ndisc = ipv6_ndisc_frame(skb);
|
|
- bool is_ll_src;
|
|
|
|
/* loopback, multicast & non-ND link-local traffic; do not push through
|
|
* packet taps again. Reset pkt_type for upper layers to process skb.
|
|
- * for packets with lladdr src, however, skip so that the dst can be
|
|
- * determine at input using original ifindex in the case that daddr
|
|
- * needs strict
|
|
+ * For strict packets with a source LLA, determine the dst using the
|
|
+ * original ifindex.
|
|
*/
|
|
- is_ll_src = ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL;
|
|
- if (skb->pkt_type == PACKET_LOOPBACK ||
|
|
- (need_strict && !is_ndisc && !is_ll_src)) {
|
|
+ if (skb->pkt_type == PACKET_LOOPBACK || (need_strict && !is_ndisc)) {
|
|
skb->dev = vrf_dev;
|
|
skb->skb_iif = vrf_dev->ifindex;
|
|
IP6CB(skb)->flags |= IP6SKB_L3SLAVE;
|
|
+
|
|
if (skb->pkt_type == PACKET_LOOPBACK)
|
|
skb->pkt_type = PACKET_HOST;
|
|
+ else if (ipv6_addr_type(&ipv6_hdr(skb)->saddr) & IPV6_ADDR_LINKLOCAL)
|
|
+ vrf_ip6_input_dst(skb, vrf_dev, orig_iif);
|
|
+
|
|
goto out;
|
|
}
|
|
|
|
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
|
|
index 8443df79fabc7..c5991e31c557e 100644
|
|
--- a/drivers/net/vxlan.c
|
|
+++ b/drivers/net/vxlan.c
|
|
@@ -1995,6 +1995,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
|
|
struct neighbour *n;
|
|
struct nd_msg *msg;
|
|
|
|
+ rcu_read_lock();
|
|
in6_dev = __in6_dev_get(dev);
|
|
if (!in6_dev)
|
|
goto out;
|
|
@@ -2046,6 +2047,7 @@ static int neigh_reduce(struct net_device *dev, struct sk_buff *skb, __be32 vni)
|
|
}
|
|
|
|
out:
|
|
+ rcu_read_unlock();
|
|
consume_skb(skb);
|
|
return NETDEV_TX_OK;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
|
|
index 47b733fdf4fcb..20e248fd43642 100644
|
|
--- a/drivers/net/wireless/ath/ath10k/mac.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/mac.c
|
|
@@ -5267,6 +5267,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
|
|
|
|
if (arvif->nohwcrypt &&
|
|
!test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
|
|
+ ret = -EINVAL;
|
|
ath10k_warn(ar, "cryptmode module param needed for sw crypto\n");
|
|
goto err;
|
|
}
|
|
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
|
|
index fd49d3419e791..0f055e5777490 100644
|
|
--- a/drivers/net/wireless/ath/ath10k/pci.c
|
|
+++ b/drivers/net/wireless/ath/ath10k/pci.c
|
|
@@ -3647,8 +3647,10 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
|
|
if (bus_params.chip_id != 0xffffffff) {
|
|
if (!ath10k_pci_chip_is_supported(pdev->device,
|
|
- bus_params.chip_id))
|
|
+ bus_params.chip_id)) {
|
|
+ ret = -ENODEV;
|
|
goto err_unsupported;
|
|
+ }
|
|
}
|
|
}
|
|
|
|
@@ -3659,11 +3661,15 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
|
}
|
|
|
|
bus_params.chip_id = ath10k_pci_soc_read32(ar, SOC_CHIP_ID_ADDRESS);
|
|
- if (bus_params.chip_id == 0xffffffff)
|
|
+ if (bus_params.chip_id == 0xffffffff) {
|
|
+ ret = -ENODEV;
|
|
goto err_unsupported;
|
|
+ }
|
|
|
|
- if (!ath10k_pci_chip_is_supported(pdev->device, bus_params.chip_id))
|
|
- goto err_free_irq;
|
|
+ if (!ath10k_pci_chip_is_supported(pdev->device, bus_params.chip_id)) {
|
|
+ ret = -ENODEV;
|
|
+ goto err_unsupported;
|
|
+ }
|
|
|
|
ret = ath10k_core_register(ar, &bus_params);
|
|
if (ret) {
|
|
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
|
|
index bd7e757a0f92d..d14e01da3c312 100644
|
|
--- a/drivers/net/wireless/ath/ath9k/main.c
|
|
+++ b/drivers/net/wireless/ath/ath9k/main.c
|
|
@@ -304,6 +304,11 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan)
|
|
hchan = ah->curchan;
|
|
}
|
|
|
|
+ if (!hchan) {
|
|
+ fastcc = false;
|
|
+ hchan = ath9k_cmn_get_channel(sc->hw, ah, &sc->cur_chan->chandef);
|
|
+ }
|
|
+
|
|
if (!ath_prepare_reset(sc))
|
|
fastcc = false;
|
|
|
|
diff --git a/drivers/net/wireless/ath/carl9170/Kconfig b/drivers/net/wireless/ath/carl9170/Kconfig
|
|
index b1bce7aad3999..c2641edab0bcb 100644
|
|
--- a/drivers/net/wireless/ath/carl9170/Kconfig
|
|
+++ b/drivers/net/wireless/ath/carl9170/Kconfig
|
|
@@ -16,13 +16,11 @@ config CARL9170
|
|
|
|
config CARL9170_LEDS
|
|
bool "SoftLED Support"
|
|
- depends on CARL9170
|
|
- select MAC80211_LEDS
|
|
- select LEDS_CLASS
|
|
- select NEW_LEDS
|
|
default y
|
|
+ depends on CARL9170
|
|
+ depends on MAC80211_LEDS
|
|
help
|
|
- This option is necessary, if you want your device' LEDs to blink
|
|
+ This option is necessary, if you want your device's LEDs to blink.
|
|
|
|
Say Y, unless you need the LEDs for firmware debugging.
|
|
|
|
diff --git a/drivers/net/wireless/ath/wcn36xx/main.c b/drivers/net/wireless/ath/wcn36xx/main.c
|
|
index 46ae4ec4ad47d..556ba3c6c5d8e 100644
|
|
--- a/drivers/net/wireless/ath/wcn36xx/main.c
|
|
+++ b/drivers/net/wireless/ath/wcn36xx/main.c
|
|
@@ -293,23 +293,16 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
|
|
goto out_free_dxe_pool;
|
|
}
|
|
|
|
- wcn->hal_buf = kmalloc(WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
|
|
- if (!wcn->hal_buf) {
|
|
- wcn36xx_err("Failed to allocate smd buf\n");
|
|
- ret = -ENOMEM;
|
|
- goto out_free_dxe_ctl;
|
|
- }
|
|
-
|
|
ret = wcn36xx_smd_load_nv(wcn);
|
|
if (ret) {
|
|
wcn36xx_err("Failed to push NV to chip\n");
|
|
- goto out_free_smd_buf;
|
|
+ goto out_free_dxe_ctl;
|
|
}
|
|
|
|
ret = wcn36xx_smd_start(wcn);
|
|
if (ret) {
|
|
wcn36xx_err("Failed to start chip\n");
|
|
- goto out_free_smd_buf;
|
|
+ goto out_free_dxe_ctl;
|
|
}
|
|
|
|
if (!wcn36xx_is_fw_version(wcn, 1, 2, 2, 24)) {
|
|
@@ -336,8 +329,6 @@ static int wcn36xx_start(struct ieee80211_hw *hw)
|
|
|
|
out_smd_stop:
|
|
wcn36xx_smd_stop(wcn);
|
|
-out_free_smd_buf:
|
|
- kfree(wcn->hal_buf);
|
|
out_free_dxe_ctl:
|
|
wcn36xx_dxe_free_ctl_blks(wcn);
|
|
out_free_dxe_pool:
|
|
@@ -374,8 +365,6 @@ static void wcn36xx_stop(struct ieee80211_hw *hw)
|
|
|
|
wcn36xx_dxe_free_mem_pools(wcn);
|
|
wcn36xx_dxe_free_ctl_blks(wcn);
|
|
-
|
|
- kfree(wcn->hal_buf);
|
|
}
|
|
|
|
static int wcn36xx_config(struct ieee80211_hw *hw, u32 changed)
|
|
@@ -1322,6 +1311,12 @@ static int wcn36xx_probe(struct platform_device *pdev)
|
|
mutex_init(&wcn->hal_mutex);
|
|
mutex_init(&wcn->scan_lock);
|
|
|
|
+ wcn->hal_buf = devm_kmalloc(wcn->dev, WCN36XX_HAL_BUF_SIZE, GFP_KERNEL);
|
|
+ if (!wcn->hal_buf) {
|
|
+ ret = -ENOMEM;
|
|
+ goto out_wq;
|
|
+ }
|
|
+
|
|
ret = dma_set_mask_and_coherent(wcn->dev, DMA_BIT_MASK(32));
|
|
if (ret < 0) {
|
|
wcn36xx_err("failed to set DMA mask: %d\n", ret);
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
index cd813c69a1781..6439adcd2f995 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
|
|
@@ -2612,8 +2612,9 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
|
|
struct brcmf_sta_info_le sta_info_le;
|
|
u32 sta_flags;
|
|
u32 is_tdls_peer;
|
|
- s32 total_rssi;
|
|
- s32 count_rssi;
|
|
+ s32 total_rssi_avg = 0;
|
|
+ s32 total_rssi = 0;
|
|
+ s32 count_rssi = 0;
|
|
int rssi;
|
|
u32 i;
|
|
|
|
@@ -2679,25 +2680,27 @@ brcmf_cfg80211_get_station(struct wiphy *wiphy, struct net_device *ndev,
|
|
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES);
|
|
sinfo->rx_bytes = le64_to_cpu(sta_info_le.rx_tot_bytes);
|
|
}
|
|
- total_rssi = 0;
|
|
- count_rssi = 0;
|
|
for (i = 0; i < BRCMF_ANT_MAX; i++) {
|
|
- if (sta_info_le.rssi[i]) {
|
|
- sinfo->chain_signal_avg[count_rssi] =
|
|
- sta_info_le.rssi[i];
|
|
- sinfo->chain_signal[count_rssi] =
|
|
- sta_info_le.rssi[i];
|
|
- total_rssi += sta_info_le.rssi[i];
|
|
- count_rssi++;
|
|
- }
|
|
+ if (sta_info_le.rssi[i] == 0 ||
|
|
+ sta_info_le.rx_lastpkt_rssi[i] == 0)
|
|
+ continue;
|
|
+ sinfo->chains |= BIT(count_rssi);
|
|
+ sinfo->chain_signal[count_rssi] =
|
|
+ sta_info_le.rx_lastpkt_rssi[i];
|
|
+ sinfo->chain_signal_avg[count_rssi] =
|
|
+ sta_info_le.rssi[i];
|
|
+ total_rssi += sta_info_le.rx_lastpkt_rssi[i];
|
|
+ total_rssi_avg += sta_info_le.rssi[i];
|
|
+ count_rssi++;
|
|
}
|
|
if (count_rssi) {
|
|
- sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
|
|
- sinfo->chains = count_rssi;
|
|
-
|
|
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
|
|
- total_rssi /= count_rssi;
|
|
- sinfo->signal = total_rssi;
|
|
+ sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL_AVG);
|
|
+ sinfo->filled |= BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL);
|
|
+ sinfo->filled |=
|
|
+ BIT_ULL(NL80211_STA_INFO_CHAIN_SIGNAL_AVG);
|
|
+ sinfo->signal = total_rssi / count_rssi;
|
|
+ sinfo->signal_avg = total_rssi_avg / count_rssi;
|
|
} else if (test_bit(BRCMF_VIF_STATUS_CONNECTED,
|
|
&ifp->vif->sme_state)) {
|
|
memset(&scb_val, 0, sizeof(scb_val));
|
|
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
index 6188275b17e5a..288d4d4d44548 100644
|
|
--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
|
|
@@ -1223,6 +1223,7 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
|
|
{
|
|
struct brcms_info *wl;
|
|
struct ieee80211_hw *hw;
|
|
+ int ret;
|
|
|
|
dev_info(&pdev->dev, "mfg %x core %x rev %d class %d irq %d\n",
|
|
pdev->id.manuf, pdev->id.id, pdev->id.rev, pdev->id.class,
|
|
@@ -1247,11 +1248,16 @@ static int brcms_bcma_probe(struct bcma_device *pdev)
|
|
wl = brcms_attach(pdev);
|
|
if (!wl) {
|
|
pr_err("%s: brcms_attach failed!\n", __func__);
|
|
- return -ENODEV;
|
|
+ ret = -ENODEV;
|
|
+ goto err_free_ieee80211;
|
|
}
|
|
brcms_led_register(wl);
|
|
|
|
return 0;
|
|
+
|
|
+err_free_ieee80211:
|
|
+ ieee80211_free_hw(hw);
|
|
+ return ret;
|
|
}
|
|
|
|
static int brcms_suspend(struct bcma_device *pdev)
|
|
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
index 2b92980a49e68..d46e606b7b025 100644
|
|
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
|
|
@@ -1091,6 +1091,9 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|
if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_INVALID_STA))
|
|
return -1;
|
|
|
|
+ if (unlikely(ieee80211_is_any_nullfunc(fc)) && sta->he_cap.has_he)
|
|
+ return -1;
|
|
+
|
|
if (unlikely(ieee80211_is_probe_resp(fc)))
|
|
iwl_mvm_probe_resp_set_noa(mvm, skb);
|
|
|
|
diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
index 58c9623c3a916..bc46a0aa06eb7 100644
|
|
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
@@ -1080,7 +1080,7 @@ static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
|
|
static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
|
|
{
|
|
struct pcie_service_card *card = adapter->card;
|
|
- u32 tmp;
|
|
+ u32 *cookie;
|
|
|
|
card->sleep_cookie_vbase = pci_alloc_consistent(card->dev, sizeof(u32),
|
|
&card->sleep_cookie_pbase);
|
|
@@ -1089,13 +1089,11 @@ static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
|
|
"pci_alloc_consistent failed!\n");
|
|
return -ENOMEM;
|
|
}
|
|
+ cookie = (u32 *)card->sleep_cookie_vbase;
|
|
/* Init val of Sleep Cookie */
|
|
- tmp = FW_AWAKE_COOKIE;
|
|
- put_unaligned(tmp, card->sleep_cookie_vbase);
|
|
+ *cookie = FW_AWAKE_COOKIE;
|
|
|
|
- mwifiex_dbg(adapter, INFO,
|
|
- "alloc_scook: sleep cookie=0x%x\n",
|
|
- get_unaligned(card->sleep_cookie_vbase));
|
|
+ mwifiex_dbg(adapter, INFO, "alloc_scook: sleep cookie=0x%x\n", *cookie);
|
|
|
|
return 0;
|
|
}
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c b/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
index a07304405b2cc..03791f3fe480c 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
|
|
@@ -203,7 +203,7 @@ int rsi_prepare_data_desc(struct rsi_common *common, struct sk_buff *skb)
|
|
wh->frame_control |= cpu_to_le16(RSI_SET_PS_ENABLE);
|
|
|
|
if ((!(info->flags & IEEE80211_TX_INTFL_DONT_ENCRYPT)) &&
|
|
- (common->secinfo.security_enable)) {
|
|
+ info->control.hw_key) {
|
|
if (rsi_is_cipher_wep(common))
|
|
ieee80211_size += 4;
|
|
else
|
|
@@ -470,9 +470,9 @@ int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb)
|
|
}
|
|
|
|
if (common->band == NL80211_BAND_2GHZ)
|
|
- bcn_frm->bbp_info |= cpu_to_le16(RSI_RATE_1);
|
|
+ bcn_frm->rate_info |= cpu_to_le16(RSI_RATE_1);
|
|
else
|
|
- bcn_frm->bbp_info |= cpu_to_le16(RSI_RATE_6);
|
|
+ bcn_frm->rate_info |= cpu_to_le16(RSI_RATE_6);
|
|
|
|
if (mac_bcn->data[tim_offset + 2] == 0)
|
|
bcn_frm->frame_info |= cpu_to_le16(RSI_DATA_DESC_DTIM_BEACON);
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_mac80211.c b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
|
|
index ce5e92d82efc8..ca1e609f637e4 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_mac80211.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_mac80211.c
|
|
@@ -1027,7 +1027,6 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
|
|
mutex_lock(&common->mutex);
|
|
switch (cmd) {
|
|
case SET_KEY:
|
|
- secinfo->security_enable = true;
|
|
status = rsi_hal_key_config(hw, vif, key, sta);
|
|
if (status) {
|
|
mutex_unlock(&common->mutex);
|
|
@@ -1046,8 +1045,6 @@ static int rsi_mac80211_set_key(struct ieee80211_hw *hw,
|
|
break;
|
|
|
|
case DISABLE_KEY:
|
|
- if (vif->type == NL80211_IFTYPE_STATION)
|
|
- secinfo->security_enable = false;
|
|
rsi_dbg(ERR_ZONE, "%s: RSI del key\n", __func__);
|
|
memset(key, 0, sizeof(struct ieee80211_key_conf));
|
|
status = rsi_hal_key_config(hw, vif, key, sta);
|
|
diff --git a/drivers/net/wireless/rsi/rsi_91x_mgmt.c b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
|
|
index 9cc8a335d519d..ed67f65986775 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_91x_mgmt.c
|
|
+++ b/drivers/net/wireless/rsi/rsi_91x_mgmt.c
|
|
@@ -1788,8 +1788,7 @@ int rsi_send_wowlan_request(struct rsi_common *common, u16 flags,
|
|
RSI_WIFI_MGMT_Q);
|
|
cmd_frame->desc.desc_dword0.frame_type = WOWLAN_CONFIG_PARAMS;
|
|
cmd_frame->host_sleep_status = sleep_status;
|
|
- if (common->secinfo.security_enable &&
|
|
- common->secinfo.gtk_cipher)
|
|
+ if (common->secinfo.gtk_cipher)
|
|
flags |= RSI_WOW_GTK_REKEY;
|
|
if (sleep_status)
|
|
cmd_frame->wow_flags = flags;
|
|
diff --git a/drivers/net/wireless/rsi/rsi_main.h b/drivers/net/wireless/rsi/rsi_main.h
|
|
index 73a19e43106b1..b3e25bc28682c 100644
|
|
--- a/drivers/net/wireless/rsi/rsi_main.h
|
|
+++ b/drivers/net/wireless/rsi/rsi_main.h
|
|
@@ -151,7 +151,6 @@ enum edca_queue {
|
|
};
|
|
|
|
struct security_info {
|
|
- bool security_enable;
|
|
u32 ptk_cipher;
|
|
u32 gtk_cipher;
|
|
};
|
|
diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
|
|
index fc35f7ae67b0a..9b07e8c7689ab 100644
|
|
--- a/drivers/nvme/target/fc.c
|
|
+++ b/drivers/nvme/target/fc.c
|
|
@@ -2151,13 +2151,6 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
|
|
u32 xfrlen = be32_to_cpu(cmdiu->data_len);
|
|
int ret;
|
|
|
|
- /*
|
|
- * if there is no nvmet mapping to the targetport there
|
|
- * shouldn't be requests. just terminate them.
|
|
- */
|
|
- if (!tgtport->pe)
|
|
- goto transport_error;
|
|
-
|
|
/*
|
|
* Fused commands are currently not supported in the linux
|
|
* implementation.
|
|
@@ -2185,7 +2178,8 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
|
|
|
|
fod->req.cmd = &fod->cmdiubuf.sqe;
|
|
fod->req.cqe = &fod->rspiubuf.cqe;
|
|
- fod->req.port = tgtport->pe->port;
|
|
+ if (tgtport->pe)
|
|
+ fod->req.port = tgtport->pe->port;
|
|
|
|
/* clear any response payload */
|
|
memset(&fod->rspiubuf, 0, sizeof(fod->rspiubuf));
|
|
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
|
|
index 223d617ecfe17..943d2a60bfdf9 100644
|
|
--- a/drivers/of/fdt.c
|
|
+++ b/drivers/of/fdt.c
|
|
@@ -501,11 +501,11 @@ static int __init __reserved_mem_reserve_reg(unsigned long node,
|
|
|
|
if (size &&
|
|
early_init_dt_reserve_memory_arch(base, size, nomap) == 0)
|
|
- pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_debug("Reserved memory: reserved region for node '%s': base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
else
|
|
- pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_info("Reserved memory: failed to reserve memory for node '%s': base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
|
|
len -= t_len;
|
|
if (first) {
|
|
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
|
|
index 3fb5d8caffd53..6ed3ffd0a6295 100644
|
|
--- a/drivers/of/of_reserved_mem.c
|
|
+++ b/drivers/of/of_reserved_mem.c
|
|
@@ -134,9 +134,9 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
|
|
ret = early_init_dt_alloc_reserved_memory_arch(size,
|
|
align, start, end, nomap, &base);
|
|
if (ret == 0) {
|
|
- pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
|
|
+ pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
|
|
uname, &base,
|
|
- (unsigned long)size / SZ_1M);
|
|
+ (unsigned long)(size / SZ_1M));
|
|
break;
|
|
}
|
|
len -= t_len;
|
|
@@ -146,8 +146,8 @@ static int __init __reserved_mem_alloc_size(unsigned long node,
|
|
ret = early_init_dt_alloc_reserved_memory_arch(size, align,
|
|
0, 0, nomap, &base);
|
|
if (ret == 0)
|
|
- pr_debug("allocated memory for '%s' node: base %pa, size %ld MiB\n",
|
|
- uname, &base, (unsigned long)size / SZ_1M);
|
|
+ pr_debug("allocated memory for '%s' node: base %pa, size %lu MiB\n",
|
|
+ uname, &base, (unsigned long)(size / SZ_1M));
|
|
}
|
|
|
|
if (base == 0) {
|
|
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
|
|
index f1f300218fab8..8c45d6c32c30e 100644
|
|
--- a/drivers/pci/controller/pci-hyperv.c
|
|
+++ b/drivers/pci/controller/pci-hyperv.c
|
|
@@ -3121,6 +3121,9 @@ static void __exit exit_hv_pci_drv(void)
|
|
|
|
static int __init init_hv_pci_drv(void)
|
|
{
|
|
+ if (!hv_is_hyperv_initialized())
|
|
+ return -ENODEV;
|
|
+
|
|
/* Set the invalid domain number's bit, so it will not be used */
|
|
set_bit(HVPCI_DOM_INVALID, hvpci_dom_map);
|
|
|
|
diff --git a/drivers/perf/arm_smmuv3_pmu.c b/drivers/perf/arm_smmuv3_pmu.c
|
|
index 9cdd89b29334e..6a3fa1f69e68a 100644
|
|
--- a/drivers/perf/arm_smmuv3_pmu.c
|
|
+++ b/drivers/perf/arm_smmuv3_pmu.c
|
|
@@ -275,7 +275,7 @@ static int smmu_pmu_apply_event_filter(struct smmu_pmu *smmu_pmu,
|
|
struct perf_event *event, int idx)
|
|
{
|
|
u32 span, sid;
|
|
- unsigned int num_ctrs = smmu_pmu->num_counters;
|
|
+ unsigned int cur_idx, num_ctrs = smmu_pmu->num_counters;
|
|
bool filter_en = !!get_filter_enable(event);
|
|
|
|
span = filter_en ? get_filter_span(event) :
|
|
@@ -283,17 +283,19 @@ static int smmu_pmu_apply_event_filter(struct smmu_pmu *smmu_pmu,
|
|
sid = filter_en ? get_filter_stream_id(event) :
|
|
SMMU_PMCG_DEFAULT_FILTER_SID;
|
|
|
|
- /* Support individual filter settings */
|
|
- if (!smmu_pmu->global_filter) {
|
|
+ cur_idx = find_first_bit(smmu_pmu->used_counters, num_ctrs);
|
|
+ /*
|
|
+ * Per-counter filtering, or scheduling the first globally-filtered
|
|
+ * event into an empty PMU so idx == 0 and it works out equivalent.
|
|
+ */
|
|
+ if (!smmu_pmu->global_filter || cur_idx == num_ctrs) {
|
|
smmu_pmu_set_event_filter(event, idx, span, sid);
|
|
return 0;
|
|
}
|
|
|
|
- /* Requested settings same as current global settings*/
|
|
- idx = find_first_bit(smmu_pmu->used_counters, num_ctrs);
|
|
- if (idx == num_ctrs ||
|
|
- smmu_pmu_check_global_filter(smmu_pmu->events[idx], event)) {
|
|
- smmu_pmu_set_event_filter(event, 0, span, sid);
|
|
+ /* Otherwise, must match whatever's currently scheduled */
|
|
+ if (smmu_pmu_check_global_filter(smmu_pmu->events[cur_idx], event)) {
|
|
+ smmu_pmu_set_evtyper(smmu_pmu, idx, get_event(event));
|
|
return 0;
|
|
}
|
|
|
|
diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c
|
|
index 09f44c6e2eaf6..726ed8f59868c 100644
|
|
--- a/drivers/perf/fsl_imx8_ddr_perf.c
|
|
+++ b/drivers/perf/fsl_imx8_ddr_perf.c
|
|
@@ -562,8 +562,10 @@ static int ddr_perf_probe(struct platform_device *pdev)
|
|
|
|
name = devm_kasprintf(&pdev->dev, GFP_KERNEL, DDR_PERF_DEV_NAME "%d",
|
|
num);
|
|
- if (!name)
|
|
- return -ENOMEM;
|
|
+ if (!name) {
|
|
+ ret = -ENOMEM;
|
|
+ goto cpuhp_state_err;
|
|
+ }
|
|
|
|
pmu->devtype_data = of_device_get_match_data(&pdev->dev);
|
|
|
|
diff --git a/drivers/phy/socionext/phy-uniphier-pcie.c b/drivers/phy/socionext/phy-uniphier-pcie.c
|
|
index 93ffbd2940fa4..0bad0e01279a1 100644
|
|
--- a/drivers/phy/socionext/phy-uniphier-pcie.c
|
|
+++ b/drivers/phy/socionext/phy-uniphier-pcie.c
|
|
@@ -20,11 +20,13 @@
|
|
|
|
/* PHY */
|
|
#define PCL_PHY_TEST_I 0x2000
|
|
-#define PCL_PHY_TEST_O 0x2004
|
|
#define TESTI_DAT_MASK GENMASK(13, 6)
|
|
#define TESTI_ADR_MASK GENMASK(5, 1)
|
|
#define TESTI_WR_EN BIT(0)
|
|
|
|
+#define PCL_PHY_TEST_O 0x2004
|
|
+#define TESTO_DAT_MASK GENMASK(7, 0)
|
|
+
|
|
#define PCL_PHY_RESET 0x200c
|
|
#define PCL_PHY_RESET_N_MNMODE BIT(8) /* =1:manual */
|
|
#define PCL_PHY_RESET_N BIT(0) /* =1:deasssert */
|
|
@@ -72,11 +74,12 @@ static void uniphier_pciephy_set_param(struct uniphier_pciephy_priv *priv,
|
|
val = FIELD_PREP(TESTI_DAT_MASK, 1);
|
|
val |= FIELD_PREP(TESTI_ADR_MASK, reg);
|
|
uniphier_pciephy_testio_write(priv, val);
|
|
- val = readl(priv->base + PCL_PHY_TEST_O);
|
|
+ val = readl(priv->base + PCL_PHY_TEST_O) & TESTO_DAT_MASK;
|
|
|
|
/* update value */
|
|
- val &= ~FIELD_PREP(TESTI_DAT_MASK, mask);
|
|
- val = FIELD_PREP(TESTI_DAT_MASK, mask & param);
|
|
+ val &= ~mask;
|
|
+ val |= mask & param;
|
|
+ val = FIELD_PREP(TESTI_DAT_MASK, val);
|
|
val |= FIELD_PREP(TESTI_ADR_MASK, reg);
|
|
uniphier_pciephy_testio_write(priv, val);
|
|
uniphier_pciephy_testio_write(priv, val | TESTI_WR_EN);
|
|
diff --git a/drivers/phy/ti/phy-dm816x-usb.c b/drivers/phy/ti/phy-dm816x-usb.c
|
|
index cbcce7cf0028e..2ed5fe20d7792 100644
|
|
--- a/drivers/phy/ti/phy-dm816x-usb.c
|
|
+++ b/drivers/phy/ti/phy-dm816x-usb.c
|
|
@@ -246,19 +246,28 @@ static int dm816x_usb_phy_probe(struct platform_device *pdev)
|
|
|
|
pm_runtime_enable(phy->dev);
|
|
generic_phy = devm_phy_create(phy->dev, NULL, &ops);
|
|
- if (IS_ERR(generic_phy))
|
|
- return PTR_ERR(generic_phy);
|
|
+ if (IS_ERR(generic_phy)) {
|
|
+ error = PTR_ERR(generic_phy);
|
|
+ goto clk_unprepare;
|
|
+ }
|
|
|
|
phy_set_drvdata(generic_phy, phy);
|
|
|
|
phy_provider = devm_of_phy_provider_register(phy->dev,
|
|
of_phy_simple_xlate);
|
|
- if (IS_ERR(phy_provider))
|
|
- return PTR_ERR(phy_provider);
|
|
+ if (IS_ERR(phy_provider)) {
|
|
+ error = PTR_ERR(phy_provider);
|
|
+ goto clk_unprepare;
|
|
+ }
|
|
|
|
usb_add_phy_dev(&phy->phy);
|
|
|
|
return 0;
|
|
+
|
|
+clk_unprepare:
|
|
+ pm_runtime_disable(phy->dev);
|
|
+ clk_unprepare(phy->refclk);
|
|
+ return error;
|
|
}
|
|
|
|
static int dm816x_usb_phy_remove(struct platform_device *pdev)
|
|
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a7796.c b/drivers/pinctrl/sh-pfc/pfc-r8a7796.c
|
|
index 61db7c7a35ec9..60d35a2c14ba5 100644
|
|
--- a/drivers/pinctrl/sh-pfc/pfc-r8a7796.c
|
|
+++ b/drivers/pinctrl/sh-pfc/pfc-r8a7796.c
|
|
@@ -68,6 +68,7 @@
|
|
PIN_NOGP_CFG(QSPI1_MOSI_IO0, "QSPI1_MOSI_IO0", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(QSPI1_SPCLK, "QSPI1_SPCLK", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(QSPI1_SSL, "QSPI1_SSL", fn, CFG_FLAGS), \
|
|
+ PIN_NOGP_CFG(PRESET_N, "PRESET#", fn, SH_PFC_PIN_CFG_PULL_DOWN),\
|
|
PIN_NOGP_CFG(RPC_INT_N, "RPC_INT#", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(RPC_RESET_N, "RPC_RESET#", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(RPC_WP_N, "RPC_WP#", fn, CFG_FLAGS), \
|
|
@@ -6109,7 +6110,7 @@ static const struct pinmux_bias_reg pinmux_bias_regs[] = {
|
|
[ 4] = RCAR_GP_PIN(6, 29), /* USB30_OVC */
|
|
[ 5] = RCAR_GP_PIN(6, 30), /* GP6_30 */
|
|
[ 6] = RCAR_GP_PIN(6, 31), /* GP6_31 */
|
|
- [ 7] = SH_PFC_PIN_NONE,
|
|
+ [ 7] = PIN_PRESET_N, /* PRESET# */
|
|
[ 8] = SH_PFC_PIN_NONE,
|
|
[ 9] = SH_PFC_PIN_NONE,
|
|
[10] = SH_PFC_PIN_NONE,
|
|
diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c
|
|
index 5200dadd6b3ef..f4b51e5e7e020 100644
|
|
--- a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c
|
|
+++ b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c
|
|
@@ -54,10 +54,10 @@
|
|
PIN_NOGP_CFG(FSCLKST_N, "FSCLKST_N", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(MLB_REF, "MLB_REF", fn, CFG_FLAGS), \
|
|
PIN_NOGP_CFG(PRESETOUT_N, "PRESETOUT_N", fn, CFG_FLAGS), \
|
|
- PIN_NOGP_CFG(TCK, "TCK", fn, CFG_FLAGS), \
|
|
- PIN_NOGP_CFG(TDI, "TDI", fn, CFG_FLAGS), \
|
|
- PIN_NOGP_CFG(TMS, "TMS", fn, CFG_FLAGS), \
|
|
- PIN_NOGP_CFG(TRST_N, "TRST_N", fn, CFG_FLAGS)
|
|
+ PIN_NOGP_CFG(TCK, "TCK", fn, SH_PFC_PIN_CFG_PULL_UP), \
|
|
+ PIN_NOGP_CFG(TDI, "TDI", fn, SH_PFC_PIN_CFG_PULL_UP), \
|
|
+ PIN_NOGP_CFG(TMS, "TMS", fn, SH_PFC_PIN_CFG_PULL_UP), \
|
|
+ PIN_NOGP_CFG(TRST_N, "TRST_N", fn, SH_PFC_PIN_CFG_PULL_UP)
|
|
|
|
/*
|
|
* F_() : just information
|
|
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
|
|
index 71a969fc3b206..f202fc0dd1ff2 100644
|
|
--- a/drivers/platform/x86/toshiba_acpi.c
|
|
+++ b/drivers/platform/x86/toshiba_acpi.c
|
|
@@ -2841,6 +2841,7 @@ static int toshiba_acpi_setup_keyboard(struct toshiba_acpi_dev *dev)
|
|
|
|
if (!dev->info_supported && !dev->system_event_supported) {
|
|
pr_warn("No hotkey query interface found\n");
|
|
+ error = -EINVAL;
|
|
goto err_remove_filter;
|
|
}
|
|
|
|
diff --git a/drivers/regulator/da9052-regulator.c b/drivers/regulator/da9052-regulator.c
|
|
index e18d291c7f21c..23fa429ebe760 100644
|
|
--- a/drivers/regulator/da9052-regulator.c
|
|
+++ b/drivers/regulator/da9052-regulator.c
|
|
@@ -250,7 +250,8 @@ static int da9052_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
|
|
case DA9052_ID_BUCK3:
|
|
case DA9052_ID_LDO2:
|
|
case DA9052_ID_LDO3:
|
|
- ret = (new_sel - old_sel) * info->step_uV / 6250;
|
|
+ ret = DIV_ROUND_UP(abs(new_sel - old_sel) * info->step_uV,
|
|
+ 6250);
|
|
break;
|
|
}
|
|
|
|
diff --git a/drivers/regulator/hi655x-regulator.c b/drivers/regulator/hi655x-regulator.c
|
|
index ac2ee2030211a..b44f492a2b832 100644
|
|
--- a/drivers/regulator/hi655x-regulator.c
|
|
+++ b/drivers/regulator/hi655x-regulator.c
|
|
@@ -72,7 +72,7 @@ enum hi655x_regulator_id {
|
|
static int hi655x_is_enabled(struct regulator_dev *rdev)
|
|
{
|
|
unsigned int value = 0;
|
|
- struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
|
|
+ const struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
|
|
|
|
regmap_read(rdev->regmap, regulator->status_reg, &value);
|
|
return (value & rdev->desc->enable_mask);
|
|
@@ -80,7 +80,7 @@ static int hi655x_is_enabled(struct regulator_dev *rdev)
|
|
|
|
static int hi655x_disable(struct regulator_dev *rdev)
|
|
{
|
|
- struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
|
|
+ const struct hi655x_regulator *regulator = rdev_get_drvdata(rdev);
|
|
|
|
return regmap_write(rdev->regmap, regulator->disable_reg,
|
|
rdev->desc->enable_mask);
|
|
@@ -169,7 +169,6 @@ static const struct hi655x_regulator regulators[] = {
|
|
static int hi655x_regulator_probe(struct platform_device *pdev)
|
|
{
|
|
unsigned int i;
|
|
- struct hi655x_regulator *regulator;
|
|
struct hi655x_pmic *pmic;
|
|
struct regulator_config config = { };
|
|
struct regulator_dev *rdev;
|
|
@@ -180,22 +179,17 @@ static int hi655x_regulator_probe(struct platform_device *pdev)
|
|
return -ENODEV;
|
|
}
|
|
|
|
- regulator = devm_kzalloc(&pdev->dev, sizeof(*regulator), GFP_KERNEL);
|
|
- if (!regulator)
|
|
- return -ENOMEM;
|
|
-
|
|
- platform_set_drvdata(pdev, regulator);
|
|
-
|
|
config.dev = pdev->dev.parent;
|
|
config.regmap = pmic->regmap;
|
|
- config.driver_data = regulator;
|
|
for (i = 0; i < ARRAY_SIZE(regulators); i++) {
|
|
+ config.driver_data = (void *) ®ulators[i];
|
|
+
|
|
rdev = devm_regulator_register(&pdev->dev,
|
|
®ulators[i].rdesc,
|
|
&config);
|
|
if (IS_ERR(rdev)) {
|
|
dev_err(&pdev->dev, "failed to register regulator %s\n",
|
|
- regulator->rdesc.name);
|
|
+ regulators[i].rdesc.name);
|
|
return PTR_ERR(rdev);
|
|
}
|
|
}
|
|
diff --git a/drivers/regulator/mt6358-regulator.c b/drivers/regulator/mt6358-regulator.c
|
|
index ba42682e06f36..40e09b1d323dd 100644
|
|
--- a/drivers/regulator/mt6358-regulator.c
|
|
+++ b/drivers/regulator/mt6358-regulator.c
|
|
@@ -457,7 +457,7 @@ static struct mt6358_regulator_info mt6358_regulators[] = {
|
|
MT6358_REG_FIXED("ldo_vaud28", VAUD28,
|
|
MT6358_LDO_VAUD28_CON0, 0, 2800000),
|
|
MT6358_LDO("ldo_vdram2", VDRAM2, vdram2_voltages, vdram2_idx,
|
|
- MT6358_LDO_VDRAM2_CON0, 0, MT6358_LDO_VDRAM2_ELR0, 0x10, 0),
|
|
+ MT6358_LDO_VDRAM2_CON0, 0, MT6358_LDO_VDRAM2_ELR0, 0xf, 0),
|
|
MT6358_LDO("ldo_vsim1", VSIM1, vsim_voltages, vsim_idx,
|
|
MT6358_LDO_VSIM1_CON0, 0, MT6358_VSIM1_ANA_CON0, 0xf00, 8),
|
|
MT6358_LDO("ldo_vibr", VIBR, vibr_voltages, vibr_idx,
|
|
diff --git a/drivers/regulator/uniphier-regulator.c b/drivers/regulator/uniphier-regulator.c
|
|
index 2311924c31039..2904c7bb4767c 100644
|
|
--- a/drivers/regulator/uniphier-regulator.c
|
|
+++ b/drivers/regulator/uniphier-regulator.c
|
|
@@ -203,6 +203,7 @@ static const struct of_device_id uniphier_regulator_match[] = {
|
|
},
|
|
{ /* Sentinel */ },
|
|
};
|
|
+MODULE_DEVICE_TABLE(of, uniphier_regulator_match);
|
|
|
|
static struct platform_driver uniphier_regulator_driver = {
|
|
.probe = uniphier_regulator_probe,
|
|
diff --git a/drivers/rtc/rtc-stm32.c b/drivers/rtc/rtc-stm32.c
|
|
index 2999e33a7e376..d28e7597dc050 100644
|
|
--- a/drivers/rtc/rtc-stm32.c
|
|
+++ b/drivers/rtc/rtc-stm32.c
|
|
@@ -756,7 +756,7 @@ static int stm32_rtc_probe(struct platform_device *pdev)
|
|
|
|
ret = clk_prepare_enable(rtc->rtc_ck);
|
|
if (ret)
|
|
- goto err;
|
|
+ goto err_no_rtc_ck;
|
|
|
|
if (rtc->data->need_dbp)
|
|
regmap_update_bits(rtc->dbp, rtc->dbp_reg,
|
|
@@ -832,10 +832,12 @@ static int stm32_rtc_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
return 0;
|
|
+
|
|
err:
|
|
+ clk_disable_unprepare(rtc->rtc_ck);
|
|
+err_no_rtc_ck:
|
|
if (rtc->data->has_pclk)
|
|
clk_disable_unprepare(rtc->pclk);
|
|
- clk_disable_unprepare(rtc->rtc_ck);
|
|
|
|
if (rtc->data->need_dbp)
|
|
regmap_update_bits(rtc->dbp, rtc->dbp_reg, rtc->dbp_mask, 0);
|
|
diff --git a/drivers/s390/cio/chp.c b/drivers/s390/cio/chp.c
|
|
index 51038ec309c12..1fd982b4d64bd 100644
|
|
--- a/drivers/s390/cio/chp.c
|
|
+++ b/drivers/s390/cio/chp.c
|
|
@@ -255,6 +255,9 @@ static ssize_t chp_status_write(struct device *dev,
|
|
if (!num_args)
|
|
return count;
|
|
|
|
+ /* Wait until previous actions have settled. */
|
|
+ css_wait_for_slow_path();
|
|
+
|
|
if (!strncasecmp(cmd, "on", 2) || !strcmp(cmd, "1")) {
|
|
mutex_lock(&cp->lock);
|
|
error = s390_vary_chpid(cp->chpid, 1);
|
|
diff --git a/drivers/s390/cio/chsc.c b/drivers/s390/cio/chsc.c
|
|
index 6392a1b95b028..980a78d3d81b6 100644
|
|
--- a/drivers/s390/cio/chsc.c
|
|
+++ b/drivers/s390/cio/chsc.c
|
|
@@ -753,8 +753,6 @@ int chsc_chp_vary(struct chp_id chpid, int on)
|
|
{
|
|
struct channel_path *chp = chpid_to_chp(chpid);
|
|
|
|
- /* Wait until previous actions have settled. */
|
|
- css_wait_for_slow_path();
|
|
/*
|
|
* Redo PathVerification on the devices the chpid connects to
|
|
*/
|
|
diff --git a/drivers/scsi/FlashPoint.c b/drivers/scsi/FlashPoint.c
|
|
index 0f17bd51088ac..3b15fb25b5e69 100644
|
|
--- a/drivers/scsi/FlashPoint.c
|
|
+++ b/drivers/scsi/FlashPoint.c
|
|
@@ -40,7 +40,7 @@ struct sccb_mgr_info {
|
|
u16 si_per_targ_ultra_nego;
|
|
u16 si_per_targ_no_disc;
|
|
u16 si_per_targ_wide_nego;
|
|
- u16 si_flags;
|
|
+ u16 si_mflags;
|
|
unsigned char si_card_family;
|
|
unsigned char si_bustype;
|
|
unsigned char si_card_model[3];
|
|
@@ -1070,22 +1070,22 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
ScamFlg =
|
|
(unsigned char)FPT_utilEERead(ioport, SCAM_CONFIG / 2);
|
|
|
|
- pCardInfo->si_flags = 0x0000;
|
|
+ pCardInfo->si_mflags = 0x0000;
|
|
|
|
if (i & 0x01)
|
|
- pCardInfo->si_flags |= SCSI_PARITY_ENA;
|
|
+ pCardInfo->si_mflags |= SCSI_PARITY_ENA;
|
|
|
|
if (!(i & 0x02))
|
|
- pCardInfo->si_flags |= SOFT_RESET;
|
|
+ pCardInfo->si_mflags |= SOFT_RESET;
|
|
|
|
if (i & 0x10)
|
|
- pCardInfo->si_flags |= EXTENDED_TRANSLATION;
|
|
+ pCardInfo->si_mflags |= EXTENDED_TRANSLATION;
|
|
|
|
if (ScamFlg & SCAM_ENABLED)
|
|
- pCardInfo->si_flags |= FLAG_SCAM_ENABLED;
|
|
+ pCardInfo->si_mflags |= FLAG_SCAM_ENABLED;
|
|
|
|
if (ScamFlg & SCAM_LEVEL2)
|
|
- pCardInfo->si_flags |= FLAG_SCAM_LEVEL2;
|
|
+ pCardInfo->si_mflags |= FLAG_SCAM_LEVEL2;
|
|
|
|
j = (RD_HARPOON(ioport + hp_bm_ctrl) & ~SCSI_TERM_ENA_L);
|
|
if (i & 0x04) {
|
|
@@ -1101,7 +1101,7 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
|
|
if (!(RD_HARPOON(ioport + hp_page_ctrl) & NARROW_SCSI_CARD))
|
|
|
|
- pCardInfo->si_flags |= SUPPORT_16TAR_32LUN;
|
|
+ pCardInfo->si_mflags |= SUPPORT_16TAR_32LUN;
|
|
|
|
pCardInfo->si_card_family = HARPOON_FAMILY;
|
|
pCardInfo->si_bustype = BUSTYPE_PCI;
|
|
@@ -1137,15 +1137,15 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
|
|
if (pCardInfo->si_card_model[1] == '3') {
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
} else if (pCardInfo->si_card_model[2] == '0') {
|
|
temp = RD_HARPOON(ioport + hp_xfer_pad);
|
|
WR_HARPOON(ioport + hp_xfer_pad, (temp & ~BIT(4)));
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
WR_HARPOON(ioport + hp_xfer_pad, (temp | BIT(4)));
|
|
if (RD_HARPOON(ioport + hp_ee_ctrl) & BIT(7))
|
|
- pCardInfo->si_flags |= HIGH_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= HIGH_BYTE_TERM;
|
|
WR_HARPOON(ioport + hp_xfer_pad, temp);
|
|
} else {
|
|
temp = RD_HARPOON(ioport + hp_ee_ctrl);
|
|
@@ -1163,9 +1163,9 @@ static int FlashPoint_ProbeHostAdapter(struct sccb_mgr_info *pCardInfo)
|
|
WR_HARPOON(ioport + hp_ee_ctrl, temp);
|
|
WR_HARPOON(ioport + hp_xfer_pad, temp2);
|
|
if (!(temp3 & BIT(7)))
|
|
- pCardInfo->si_flags |= LOW_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= LOW_BYTE_TERM;
|
|
if (!(temp3 & BIT(6)))
|
|
- pCardInfo->si_flags |= HIGH_BYTE_TERM;
|
|
+ pCardInfo->si_mflags |= HIGH_BYTE_TERM;
|
|
}
|
|
|
|
ARAM_ACCESS(ioport);
|
|
@@ -1272,7 +1272,7 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
|
|
WR_HARPOON(ioport + hp_arb_id, pCardInfo->si_id);
|
|
CurrCard->ourId = pCardInfo->si_id;
|
|
|
|
- i = (unsigned char)pCardInfo->si_flags;
|
|
+ i = (unsigned char)pCardInfo->si_mflags;
|
|
if (i & SCSI_PARITY_ENA)
|
|
WR_HARPOON(ioport + hp_portctrl_1, (HOST_MODE8 | CHK_SCSI_P));
|
|
|
|
@@ -1286,14 +1286,14 @@ static void *FlashPoint_HardwareResetHostAdapter(struct sccb_mgr_info
|
|
j |= SCSI_TERM_ENA_H;
|
|
WR_HARPOON(ioport + hp_ee_ctrl, j);
|
|
|
|
- if (!(pCardInfo->si_flags & SOFT_RESET)) {
|
|
+ if (!(pCardInfo->si_mflags & SOFT_RESET)) {
|
|
|
|
FPT_sresb(ioport, thisCard);
|
|
|
|
FPT_scini(thisCard, pCardInfo->si_id, 0);
|
|
}
|
|
|
|
- if (pCardInfo->si_flags & POST_ALL_UNDERRRUNS)
|
|
+ if (pCardInfo->si_mflags & POST_ALL_UNDERRRUNS)
|
|
CurrCard->globalFlags |= F_NO_FILTER;
|
|
|
|
if (pCurrNvRam) {
|
|
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
index aff630fccb07e..3654cfc4376fa 100644
|
|
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
|
|
@@ -5728,8 +5728,10 @@ _scsih_expander_add(struct MPT3SAS_ADAPTER *ioc, u16 handle)
|
|
handle, parent_handle,
|
|
(u64)sas_expander->sas_address, sas_expander->num_phys);
|
|
|
|
- if (!sas_expander->num_phys)
|
|
+ if (!sas_expander->num_phys) {
|
|
+ rc = -1;
|
|
goto out_fail;
|
|
+ }
|
|
sas_expander->phy = kcalloc(sas_expander->num_phys,
|
|
sizeof(struct _sas_phy), GFP_KERNEL);
|
|
if (!sas_expander->phy) {
|
|
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
|
|
index b5867e1566f42..8e6d7ba95df14 100644
|
|
--- a/drivers/scsi/scsi_lib.c
|
|
+++ b/drivers/scsi/scsi_lib.c
|
|
@@ -762,6 +762,7 @@ static void scsi_io_completion_action(struct scsi_cmnd *cmd, int result)
|
|
case 0x07: /* operation in progress */
|
|
case 0x08: /* Long write in progress */
|
|
case 0x09: /* self test in progress */
|
|
+ case 0x11: /* notify (enable spinup) required */
|
|
case 0x14: /* space allocation in progress */
|
|
case 0x1a: /* start stop unit in progress */
|
|
case 0x1b: /* sanitize in progress */
|
|
diff --git a/drivers/soundwire/stream.c b/drivers/soundwire/stream.c
|
|
index 23accfedbf4d1..f7ca1f7a68f00 100644
|
|
--- a/drivers/soundwire/stream.c
|
|
+++ b/drivers/soundwire/stream.c
|
|
@@ -420,7 +420,6 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
|
|
struct completion *port_ready;
|
|
struct sdw_dpn_prop *dpn_prop;
|
|
struct sdw_prepare_ch prep_ch;
|
|
- unsigned int time_left;
|
|
bool intr = false;
|
|
int ret = 0, val;
|
|
u32 addr;
|
|
@@ -477,15 +476,15 @@ static int sdw_prep_deprep_slave_ports(struct sdw_bus *bus,
|
|
|
|
/* Wait for completion on port ready */
|
|
port_ready = &s_rt->slave->port_ready[prep_ch.num];
|
|
- time_left = wait_for_completion_timeout(port_ready,
|
|
- msecs_to_jiffies(dpn_prop->ch_prep_timeout));
|
|
+ wait_for_completion_timeout(port_ready,
|
|
+ msecs_to_jiffies(dpn_prop->ch_prep_timeout));
|
|
|
|
val = sdw_read(s_rt->slave, SDW_DPN_PREPARESTATUS(p_rt->num));
|
|
- val &= p_rt->ch_mask;
|
|
- if (!time_left || val) {
|
|
+ if ((val < 0) || (val & p_rt->ch_mask)) {
|
|
+ ret = (val < 0) ? val : -ETIMEDOUT;
|
|
dev_err(&s_rt->slave->dev,
|
|
- "Chn prep failed for port:%d\n", prep_ch.num);
|
|
- return -ETIMEDOUT;
|
|
+ "Chn prep failed for port %d: %d\n", prep_ch.num, ret);
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
diff --git a/drivers/spi/spi-loopback-test.c b/drivers/spi/spi-loopback-test.c
|
|
index 51633b2b64371..69a9df2cbbcf2 100644
|
|
--- a/drivers/spi/spi-loopback-test.c
|
|
+++ b/drivers/spi/spi-loopback-test.c
|
|
@@ -868,7 +868,7 @@ static int spi_test_run_iter(struct spi_device *spi,
|
|
test.transfers[i].len = len;
|
|
if (test.transfers[i].tx_buf)
|
|
test.transfers[i].tx_buf += tx_off;
|
|
- if (test.transfers[i].tx_buf)
|
|
+ if (test.transfers[i].rx_buf)
|
|
test.transfers[i].rx_buf += rx_off;
|
|
}
|
|
|
|
diff --git a/drivers/spi/spi-omap-100k.c b/drivers/spi/spi-omap-100k.c
|
|
index b8e201c094843..f64d030c760ae 100644
|
|
--- a/drivers/spi/spi-omap-100k.c
|
|
+++ b/drivers/spi/spi-omap-100k.c
|
|
@@ -242,7 +242,7 @@ static int omap1_spi100k_setup_transfer(struct spi_device *spi,
|
|
else
|
|
word_len = spi->bits_per_word;
|
|
|
|
- if (spi->bits_per_word > 32)
|
|
+ if (word_len > 32)
|
|
return -EINVAL;
|
|
cs->word_len = word_len;
|
|
|
|
diff --git a/drivers/spi/spi-sun6i.c b/drivers/spi/spi-sun6i.c
|
|
index 956df79035d56..3a8acd78308f6 100644
|
|
--- a/drivers/spi/spi-sun6i.c
|
|
+++ b/drivers/spi/spi-sun6i.c
|
|
@@ -297,6 +297,10 @@ static int sun6i_spi_transfer_one(struct spi_master *master,
|
|
}
|
|
|
|
sun6i_spi_write(sspi, SUN6I_CLK_CTL_REG, reg);
|
|
+ /* Finally enable the bus - doing so before might raise SCK to HIGH */
|
|
+ reg = sun6i_spi_read(sspi, SUN6I_GBL_CTL_REG);
|
|
+ reg |= SUN6I_GBL_CTL_BUS_ENABLE;
|
|
+ sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG, reg);
|
|
|
|
/* Setup the transfer now... */
|
|
if (sspi->tx_buf)
|
|
@@ -405,7 +409,7 @@ static int sun6i_spi_runtime_resume(struct device *dev)
|
|
}
|
|
|
|
sun6i_spi_write(sspi, SUN6I_GBL_CTL_REG,
|
|
- SUN6I_GBL_CTL_BUS_ENABLE | SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
|
|
+ SUN6I_GBL_CTL_MASTER | SUN6I_GBL_CTL_TP);
|
|
|
|
return 0;
|
|
|
|
diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c
|
|
index f88cbb94ce122..181ea30c416a2 100644
|
|
--- a/drivers/spi/spi-topcliff-pch.c
|
|
+++ b/drivers/spi/spi-topcliff-pch.c
|
|
@@ -576,8 +576,10 @@ static void pch_spi_set_tx(struct pch_spi_data *data, int *bpw)
|
|
data->pkt_tx_buff = kzalloc(size, GFP_KERNEL);
|
|
if (data->pkt_tx_buff != NULL) {
|
|
data->pkt_rx_buff = kzalloc(size, GFP_KERNEL);
|
|
- if (!data->pkt_rx_buff)
|
|
+ if (!data->pkt_rx_buff) {
|
|
kfree(data->pkt_tx_buff);
|
|
+ data->pkt_tx_buff = NULL;
|
|
+ }
|
|
}
|
|
|
|
if (!data->pkt_rx_buff) {
|
|
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
|
|
index f8f3434d5ab1e..ac05c9c864884 100644
|
|
--- a/drivers/spi/spi.c
|
|
+++ b/drivers/spi/spi.c
|
|
@@ -1849,6 +1849,7 @@ of_register_spi_device(struct spi_controller *ctlr, struct device_node *nc)
|
|
/* Store a pointer to the node in the device structure */
|
|
of_node_get(nc);
|
|
spi->dev.of_node = nc;
|
|
+ spi->dev.fwnode = of_fwnode_handle(nc);
|
|
|
|
/* Register the new device */
|
|
rc = spi_add_device(spi);
|
|
diff --git a/drivers/ssb/scan.c b/drivers/ssb/scan.c
|
|
index 6ceee98ed6ff2..5c7e61cafd195 100644
|
|
--- a/drivers/ssb/scan.c
|
|
+++ b/drivers/ssb/scan.c
|
|
@@ -325,6 +325,7 @@ int ssb_bus_scan(struct ssb_bus *bus,
|
|
if (bus->nr_devices > ARRAY_SIZE(bus->devices)) {
|
|
pr_err("More than %d ssb cores found (%d)\n",
|
|
SSB_MAX_NR_CORES, bus->nr_devices);
|
|
+ err = -EINVAL;
|
|
goto err_unmap;
|
|
}
|
|
if (bus->bustype == SSB_BUSTYPE_SSB) {
|
|
diff --git a/drivers/ssb/sdio.c b/drivers/ssb/sdio.c
|
|
index 7fe0afb42234f..66c5c2169704b 100644
|
|
--- a/drivers/ssb/sdio.c
|
|
+++ b/drivers/ssb/sdio.c
|
|
@@ -411,7 +411,6 @@ static void ssb_sdio_block_write(struct ssb_device *dev, const void *buffer,
|
|
sdio_claim_host(bus->host_sdio);
|
|
if (unlikely(ssb_sdio_switch_core(bus, dev))) {
|
|
error = -EIO;
|
|
- memset((void *)buffer, 0xff, count);
|
|
goto err_out;
|
|
}
|
|
offset |= bus->sdio_sbaddr & 0xffff;
|
|
diff --git a/drivers/staging/fbtft/fb_agm1264k-fl.c b/drivers/staging/fbtft/fb_agm1264k-fl.c
|
|
index eeeeec97ad278..b545c2ca80a41 100644
|
|
--- a/drivers/staging/fbtft/fb_agm1264k-fl.c
|
|
+++ b/drivers/staging/fbtft/fb_agm1264k-fl.c
|
|
@@ -84,9 +84,9 @@ static void reset(struct fbtft_par *par)
|
|
|
|
dev_dbg(par->info->device, "%s()\n", __func__);
|
|
|
|
- gpiod_set_value(par->gpio.reset, 0);
|
|
- udelay(20);
|
|
gpiod_set_value(par->gpio.reset, 1);
|
|
+ udelay(20);
|
|
+ gpiod_set_value(par->gpio.reset, 0);
|
|
mdelay(120);
|
|
}
|
|
|
|
@@ -194,12 +194,12 @@ static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
|
|
/* select chip */
|
|
if (*buf) {
|
|
/* cs1 */
|
|
- gpiod_set_value(par->CS0, 1);
|
|
- gpiod_set_value(par->CS1, 0);
|
|
- } else {
|
|
- /* cs0 */
|
|
gpiod_set_value(par->CS0, 0);
|
|
gpiod_set_value(par->CS1, 1);
|
|
+ } else {
|
|
+ /* cs0 */
|
|
+ gpiod_set_value(par->CS0, 1);
|
|
+ gpiod_set_value(par->CS1, 0);
|
|
}
|
|
|
|
gpiod_set_value(par->RS, 0); /* RS->0 (command mode) */
|
|
@@ -397,8 +397,8 @@ static int write_vmem(struct fbtft_par *par, size_t offset, size_t len)
|
|
}
|
|
kfree(convert_buf);
|
|
|
|
- gpiod_set_value(par->CS0, 1);
|
|
- gpiod_set_value(par->CS1, 1);
|
|
+ gpiod_set_value(par->CS0, 0);
|
|
+ gpiod_set_value(par->CS1, 0);
|
|
|
|
return ret;
|
|
}
|
|
@@ -419,10 +419,10 @@ static int write(struct fbtft_par *par, void *buf, size_t len)
|
|
for (i = 0; i < 8; ++i)
|
|
gpiod_set_value(par->gpio.db[i], data & (1 << i));
|
|
/* set E */
|
|
- gpiod_set_value(par->EPIN, 1);
|
|
+ gpiod_set_value(par->EPIN, 0);
|
|
udelay(5);
|
|
/* unset E - write */
|
|
- gpiod_set_value(par->EPIN, 0);
|
|
+ gpiod_set_value(par->EPIN, 1);
|
|
udelay(1);
|
|
}
|
|
|
|
diff --git a/drivers/staging/fbtft/fb_bd663474.c b/drivers/staging/fbtft/fb_bd663474.c
|
|
index e2c7646588f8c..1629c2c440a97 100644
|
|
--- a/drivers/staging/fbtft/fb_bd663474.c
|
|
+++ b/drivers/staging/fbtft/fb_bd663474.c
|
|
@@ -12,7 +12,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
@@ -24,9 +23,6 @@
|
|
|
|
static int init_display(struct fbtft_par *par)
|
|
{
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
par->fbtftops.reset(par);
|
|
|
|
/* Initialization sequence from Lib_UTFT */
|
|
diff --git a/drivers/staging/fbtft/fb_ili9163.c b/drivers/staging/fbtft/fb_ili9163.c
|
|
index 05648c3ffe474..6582a2c90aafc 100644
|
|
--- a/drivers/staging/fbtft/fb_ili9163.c
|
|
+++ b/drivers/staging/fbtft/fb_ili9163.c
|
|
@@ -11,7 +11,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
#include <video/mipi_display.h>
|
|
|
|
@@ -77,9 +76,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
write_reg(par, MIPI_DCS_SOFT_RESET); /* software reset */
|
|
mdelay(500);
|
|
write_reg(par, MIPI_DCS_EXIT_SLEEP_MODE); /* exit sleep */
|
|
diff --git a/drivers/staging/fbtft/fb_ili9320.c b/drivers/staging/fbtft/fb_ili9320.c
|
|
index f2e72d14431db..a8f4c618b754c 100644
|
|
--- a/drivers/staging/fbtft/fb_ili9320.c
|
|
+++ b/drivers/staging/fbtft/fb_ili9320.c
|
|
@@ -8,7 +8,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/delay.h>
|
|
|
|
diff --git a/drivers/staging/fbtft/fb_ili9325.c b/drivers/staging/fbtft/fb_ili9325.c
|
|
index c9aa4cb431236..16d3b17ca2798 100644
|
|
--- a/drivers/staging/fbtft/fb_ili9325.c
|
|
+++ b/drivers/staging/fbtft/fb_ili9325.c
|
|
@@ -10,7 +10,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
@@ -85,9 +84,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
bt &= 0x07;
|
|
vc &= 0x07;
|
|
vrh &= 0x0f;
|
|
diff --git a/drivers/staging/fbtft/fb_ili9340.c b/drivers/staging/fbtft/fb_ili9340.c
|
|
index 415183c7054a8..704236bcaf3ff 100644
|
|
--- a/drivers/staging/fbtft/fb_ili9340.c
|
|
+++ b/drivers/staging/fbtft/fb_ili9340.c
|
|
@@ -8,7 +8,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
#include <video/mipi_display.h>
|
|
|
|
diff --git a/drivers/staging/fbtft/fb_s6d1121.c b/drivers/staging/fbtft/fb_s6d1121.c
|
|
index 8c7de32903434..62f27172f8449 100644
|
|
--- a/drivers/staging/fbtft/fb_s6d1121.c
|
|
+++ b/drivers/staging/fbtft/fb_s6d1121.c
|
|
@@ -12,7 +12,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
@@ -29,9 +28,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
/* Initialization sequence from Lib_UTFT */
|
|
|
|
write_reg(par, 0x0011, 0x2004);
|
|
diff --git a/drivers/staging/fbtft/fb_sh1106.c b/drivers/staging/fbtft/fb_sh1106.c
|
|
index 6f7249493ea3b..7b9ab39e1c1a8 100644
|
|
--- a/drivers/staging/fbtft/fb_sh1106.c
|
|
+++ b/drivers/staging/fbtft/fb_sh1106.c
|
|
@@ -9,7 +9,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
diff --git a/drivers/staging/fbtft/fb_ssd1289.c b/drivers/staging/fbtft/fb_ssd1289.c
|
|
index 7a3fe022cc69d..f27bab38b3ec4 100644
|
|
--- a/drivers/staging/fbtft/fb_ssd1289.c
|
|
+++ b/drivers/staging/fbtft/fb_ssd1289.c
|
|
@@ -10,7 +10,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
|
|
#include "fbtft.h"
|
|
|
|
@@ -28,9 +27,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
write_reg(par, 0x00, 0x0001);
|
|
write_reg(par, 0x03, 0xA8A4);
|
|
write_reg(par, 0x0C, 0x0000);
|
|
diff --git a/drivers/staging/fbtft/fb_ssd1325.c b/drivers/staging/fbtft/fb_ssd1325.c
|
|
index 8a3140d41d8bb..796a2ac3e1948 100644
|
|
--- a/drivers/staging/fbtft/fb_ssd1325.c
|
|
+++ b/drivers/staging/fbtft/fb_ssd1325.c
|
|
@@ -35,8 +35,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- gpiod_set_value(par->gpio.cs, 0);
|
|
-
|
|
write_reg(par, 0xb3);
|
|
write_reg(par, 0xf0);
|
|
write_reg(par, 0xae);
|
|
diff --git a/drivers/staging/fbtft/fb_ssd1331.c b/drivers/staging/fbtft/fb_ssd1331.c
|
|
index 37622c9462aa7..ec5eced7f8cbd 100644
|
|
--- a/drivers/staging/fbtft/fb_ssd1331.c
|
|
+++ b/drivers/staging/fbtft/fb_ssd1331.c
|
|
@@ -81,8 +81,7 @@ static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
|
|
va_start(args, len);
|
|
|
|
*buf = (u8)va_arg(args, unsigned int);
|
|
- if (par->gpio.dc)
|
|
- gpiod_set_value(par->gpio.dc, 0);
|
|
+ gpiod_set_value(par->gpio.dc, 0);
|
|
ret = par->fbtftops.write(par, par->buf, sizeof(u8));
|
|
if (ret < 0) {
|
|
va_end(args);
|
|
@@ -104,8 +103,7 @@ static void write_reg8_bus8(struct fbtft_par *par, int len, ...)
|
|
return;
|
|
}
|
|
}
|
|
- if (par->gpio.dc)
|
|
- gpiod_set_value(par->gpio.dc, 1);
|
|
+ gpiod_set_value(par->gpio.dc, 1);
|
|
va_end(args);
|
|
}
|
|
|
|
diff --git a/drivers/staging/fbtft/fb_ssd1351.c b/drivers/staging/fbtft/fb_ssd1351.c
|
|
index 900b28d826b28..cf263a58a1489 100644
|
|
--- a/drivers/staging/fbtft/fb_ssd1351.c
|
|
+++ b/drivers/staging/fbtft/fb_ssd1351.c
|
|
@@ -2,7 +2,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/spi/spi.h>
|
|
#include <linux/delay.h>
|
|
|
|
diff --git a/drivers/staging/fbtft/fb_upd161704.c b/drivers/staging/fbtft/fb_upd161704.c
|
|
index c77832ae5e5ba..c680160d63807 100644
|
|
--- a/drivers/staging/fbtft/fb_upd161704.c
|
|
+++ b/drivers/staging/fbtft/fb_upd161704.c
|
|
@@ -12,7 +12,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
@@ -26,9 +25,6 @@ static int init_display(struct fbtft_par *par)
|
|
{
|
|
par->fbtftops.reset(par);
|
|
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
-
|
|
/* Initialization sequence from Lib_UTFT */
|
|
|
|
/* register reset */
|
|
diff --git a/drivers/staging/fbtft/fb_watterott.c b/drivers/staging/fbtft/fb_watterott.c
|
|
index 27cc8eabcbe9d..fc65ce8761558 100644
|
|
--- a/drivers/staging/fbtft/fb_watterott.c
|
|
+++ b/drivers/staging/fbtft/fb_watterott.c
|
|
@@ -8,7 +8,6 @@
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/init.h>
|
|
-#include <linux/gpio/consumer.h>
|
|
#include <linux/delay.h>
|
|
|
|
#include "fbtft.h"
|
|
diff --git a/drivers/staging/fbtft/fbtft-bus.c b/drivers/staging/fbtft/fbtft-bus.c
|
|
index 63c65dd67b175..3d422bc116411 100644
|
|
--- a/drivers/staging/fbtft/fbtft-bus.c
|
|
+++ b/drivers/staging/fbtft/fbtft-bus.c
|
|
@@ -135,8 +135,7 @@ int fbtft_write_vmem16_bus8(struct fbtft_par *par, size_t offset, size_t len)
|
|
remain = len / 2;
|
|
vmem16 = (u16 *)(par->info->screen_buffer + offset);
|
|
|
|
- if (par->gpio.dc)
|
|
- gpiod_set_value(par->gpio.dc, 1);
|
|
+ gpiod_set_value(par->gpio.dc, 1);
|
|
|
|
/* non buffered write */
|
|
if (!par->txbuf.buf)
|
|
diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c
|
|
index 61f0286fb157e..bc53d68bfcaa3 100644
|
|
--- a/drivers/staging/fbtft/fbtft-core.c
|
|
+++ b/drivers/staging/fbtft/fbtft-core.c
|
|
@@ -37,8 +37,7 @@ int fbtft_write_buf_dc(struct fbtft_par *par, void *buf, size_t len, int dc)
|
|
{
|
|
int ret;
|
|
|
|
- if (par->gpio.dc)
|
|
- gpiod_set_value(par->gpio.dc, dc);
|
|
+ gpiod_set_value(par->gpio.dc, dc);
|
|
|
|
ret = par->fbtftops.write(par, buf, len);
|
|
if (ret < 0)
|
|
@@ -79,7 +78,7 @@ static int fbtft_request_one_gpio(struct fbtft_par *par,
|
|
int ret = 0;
|
|
|
|
*gpiop = devm_gpiod_get_index_optional(dev, name, index,
|
|
- GPIOD_OUT_HIGH);
|
|
+ GPIOD_OUT_LOW);
|
|
if (IS_ERR(*gpiop)) {
|
|
ret = PTR_ERR(*gpiop);
|
|
dev_err(dev,
|
|
@@ -230,11 +229,15 @@ static void fbtft_reset(struct fbtft_par *par)
|
|
{
|
|
if (!par->gpio.reset)
|
|
return;
|
|
+
|
|
fbtft_par_dbg(DEBUG_RESET, par, "%s()\n", __func__);
|
|
+
|
|
gpiod_set_value_cansleep(par->gpio.reset, 1);
|
|
usleep_range(20, 40);
|
|
gpiod_set_value_cansleep(par->gpio.reset, 0);
|
|
msleep(120);
|
|
+
|
|
+ gpiod_set_value_cansleep(par->gpio.cs, 1); /* Activate chip */
|
|
}
|
|
|
|
static void fbtft_update_display(struct fbtft_par *par, unsigned int start_line,
|
|
@@ -921,8 +924,6 @@ static int fbtft_init_display_dt(struct fbtft_par *par)
|
|
return -EINVAL;
|
|
|
|
par->fbtftops.reset(par);
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
|
|
while (p) {
|
|
if (val & FBTFT_OF_INIT_CMD) {
|
|
@@ -1012,8 +1013,6 @@ int fbtft_init_display(struct fbtft_par *par)
|
|
}
|
|
|
|
par->fbtftops.reset(par);
|
|
- if (par->gpio.cs)
|
|
- gpiod_set_value(par->gpio.cs, 0); /* Activate chip */
|
|
|
|
i = 0;
|
|
while (i < FBTFT_MAX_INIT_SEQUENCE) {
|
|
diff --git a/drivers/staging/fbtft/fbtft-io.c b/drivers/staging/fbtft/fbtft-io.c
|
|
index 0863d257d7620..de1904a443c27 100644
|
|
--- a/drivers/staging/fbtft/fbtft-io.c
|
|
+++ b/drivers/staging/fbtft/fbtft-io.c
|
|
@@ -142,12 +142,12 @@ int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len)
|
|
data = *(u8 *)buf;
|
|
|
|
/* Start writing by pulling down /WR */
|
|
- gpiod_set_value(par->gpio.wr, 0);
|
|
+ gpiod_set_value(par->gpio.wr, 1);
|
|
|
|
/* Set data */
|
|
#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
|
|
if (data == prev_data) {
|
|
- gpiod_set_value(par->gpio.wr, 0); /* used as delay */
|
|
+ gpiod_set_value(par->gpio.wr, 1); /* used as delay */
|
|
} else {
|
|
for (i = 0; i < 8; i++) {
|
|
if ((data & 1) != (prev_data & 1))
|
|
@@ -165,7 +165,7 @@ int fbtft_write_gpio8_wr(struct fbtft_par *par, void *buf, size_t len)
|
|
#endif
|
|
|
|
/* Pullup /WR */
|
|
- gpiod_set_value(par->gpio.wr, 1);
|
|
+ gpiod_set_value(par->gpio.wr, 0);
|
|
|
|
#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
|
|
prev_data = *(u8 *)buf;
|
|
@@ -192,12 +192,12 @@ int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len)
|
|
data = *(u16 *)buf;
|
|
|
|
/* Start writing by pulling down /WR */
|
|
- gpiod_set_value(par->gpio.wr, 0);
|
|
+ gpiod_set_value(par->gpio.wr, 1);
|
|
|
|
/* Set data */
|
|
#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
|
|
if (data == prev_data) {
|
|
- gpiod_set_value(par->gpio.wr, 0); /* used as delay */
|
|
+ gpiod_set_value(par->gpio.wr, 1); /* used as delay */
|
|
} else {
|
|
for (i = 0; i < 16; i++) {
|
|
if ((data & 1) != (prev_data & 1))
|
|
@@ -215,7 +215,7 @@ int fbtft_write_gpio16_wr(struct fbtft_par *par, void *buf, size_t len)
|
|
#endif
|
|
|
|
/* Pullup /WR */
|
|
- gpiod_set_value(par->gpio.wr, 1);
|
|
+ gpiod_set_value(par->gpio.wr, 0);
|
|
|
|
#ifndef DO_NOT_OPTIMIZE_FBTFT_WRITE_GPIO
|
|
prev_data = *(u16 *)buf;
|
|
diff --git a/drivers/staging/gdm724x/gdm_lte.c b/drivers/staging/gdm724x/gdm_lte.c
|
|
index db11498f6fc7d..8093d06086388 100644
|
|
--- a/drivers/staging/gdm724x/gdm_lte.c
|
|
+++ b/drivers/staging/gdm724x/gdm_lte.c
|
|
@@ -611,10 +611,12 @@ static void gdm_lte_netif_rx(struct net_device *dev, char *buf,
|
|
* bytes (99,130,83,99 dec)
|
|
*/
|
|
} __packed;
|
|
- void *addr = buf + sizeof(struct iphdr) +
|
|
- sizeof(struct udphdr) +
|
|
- offsetof(struct dhcp_packet, chaddr);
|
|
- ether_addr_copy(nic->dest_mac_addr, addr);
|
|
+ int offset = sizeof(struct iphdr) +
|
|
+ sizeof(struct udphdr) +
|
|
+ offsetof(struct dhcp_packet, chaddr);
|
|
+ if (offset + ETH_ALEN > len)
|
|
+ return;
|
|
+ ether_addr_copy(nic->dest_mac_addr, buf + offset);
|
|
}
|
|
}
|
|
|
|
@@ -677,6 +679,7 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
struct sdu *sdu = NULL;
|
|
u8 endian = phy_dev->get_endian(phy_dev->priv_dev);
|
|
u8 *data = (u8 *)multi_sdu->data;
|
|
+ int copied;
|
|
u16 i = 0;
|
|
u16 num_packet;
|
|
u16 hci_len;
|
|
@@ -688,6 +691,12 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
num_packet = gdm_dev16_to_cpu(endian, multi_sdu->num_packet);
|
|
|
|
for (i = 0; i < num_packet; i++) {
|
|
+ copied = data - multi_sdu->data;
|
|
+ if (len < copied + sizeof(*sdu)) {
|
|
+ pr_err("rx prevent buffer overflow");
|
|
+ return;
|
|
+ }
|
|
+
|
|
sdu = (struct sdu *)data;
|
|
|
|
cmd_evt = gdm_dev16_to_cpu(endian, sdu->cmd_evt);
|
|
@@ -698,7 +707,8 @@ static void gdm_lte_multi_sdu_pkt(struct phy_dev *phy_dev, char *buf, int len)
|
|
pr_err("rx sdu wrong hci %04x\n", cmd_evt);
|
|
return;
|
|
}
|
|
- if (hci_len < 12) {
|
|
+ if (hci_len < 12 ||
|
|
+ len < copied + sizeof(*sdu) + (hci_len - 12)) {
|
|
pr_err("rx sdu invalid len %d\n", hci_len);
|
|
return;
|
|
}
|
|
diff --git a/drivers/staging/media/imx/imx-media-csi.c b/drivers/staging/media/imx/imx-media-csi.c
|
|
index 367e39f5b382b..40b7e60f4a472 100644
|
|
--- a/drivers/staging/media/imx/imx-media-csi.c
|
|
+++ b/drivers/staging/media/imx/imx-media-csi.c
|
|
@@ -753,9 +753,10 @@ static int csi_setup(struct csi_priv *priv)
|
|
|
|
static int csi_start(struct csi_priv *priv)
|
|
{
|
|
- struct v4l2_fract *output_fi;
|
|
+ struct v4l2_fract *input_fi, *output_fi;
|
|
int ret;
|
|
|
|
+ input_fi = &priv->frame_interval[CSI_SINK_PAD];
|
|
output_fi = &priv->frame_interval[priv->active_output_pad];
|
|
|
|
/* start upstream */
|
|
@@ -764,6 +765,17 @@ static int csi_start(struct csi_priv *priv)
|
|
if (ret)
|
|
return ret;
|
|
|
|
+ /* Skip first few frames from a BT.656 source */
|
|
+ if (priv->upstream_ep.bus_type == V4L2_MBUS_BT656) {
|
|
+ u32 delay_usec, bad_frames = 20;
|
|
+
|
|
+ delay_usec = DIV_ROUND_UP_ULL((u64)USEC_PER_SEC *
|
|
+ input_fi->numerator * bad_frames,
|
|
+ input_fi->denominator);
|
|
+
|
|
+ usleep_range(delay_usec, delay_usec + 1000);
|
|
+ }
|
|
+
|
|
if (priv->dest == IPU_CSI_DEST_IDMAC) {
|
|
ret = csi_idmac_start(priv);
|
|
if (ret)
|
|
diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c b/drivers/staging/media/imx/imx7-mipi-csis.c
|
|
index 021bbd4203907..63bc78e4cac8f 100644
|
|
--- a/drivers/staging/media/imx/imx7-mipi-csis.c
|
|
+++ b/drivers/staging/media/imx/imx7-mipi-csis.c
|
|
@@ -528,13 +528,15 @@ static void mipi_csis_clear_counters(struct csi_state *state)
|
|
|
|
static void mipi_csis_log_counters(struct csi_state *state, bool non_errors)
|
|
{
|
|
- int i = non_errors ? MIPI_CSIS_NUM_EVENTS : MIPI_CSIS_NUM_EVENTS - 4;
|
|
+ unsigned int num_events = non_errors ? MIPI_CSIS_NUM_EVENTS
|
|
+ : MIPI_CSIS_NUM_EVENTS - 6;
|
|
struct device *dev = &state->pdev->dev;
|
|
unsigned long flags;
|
|
+ unsigned int i;
|
|
|
|
spin_lock_irqsave(&state->slock, flags);
|
|
|
|
- for (i--; i >= 0; i--) {
|
|
+ for (i = 0; i < num_events; ++i) {
|
|
if (state->events[i].counter > 0 || state->debug)
|
|
dev_info(dev, "%s events: %d\n", state->events[i].name,
|
|
state->events[i].counter);
|
|
diff --git a/drivers/staging/mt7621-dts/mt7621.dtsi b/drivers/staging/mt7621-dts/mt7621.dtsi
|
|
index a4c08110094b3..5ca8607c5dbbe 100644
|
|
--- a/drivers/staging/mt7621-dts/mt7621.dtsi
|
|
+++ b/drivers/staging/mt7621-dts/mt7621.dtsi
|
|
@@ -520,7 +520,7 @@
|
|
|
|
bus-range = <0 255>;
|
|
ranges = <
|
|
- 0x02000000 0 0x00000000 0x60000000 0 0x10000000 /* pci memory */
|
|
+ 0x02000000 0 0x60000000 0x60000000 0 0x10000000 /* pci memory */
|
|
0x01000000 0 0x00000000 0x1e160000 0 0x00010000 /* io space */
|
|
>;
|
|
|
|
diff --git a/drivers/staging/rtl8712/hal_init.c b/drivers/staging/rtl8712/hal_init.c
|
|
index 42c0a3c947f19..301b99060bc27 100644
|
|
--- a/drivers/staging/rtl8712/hal_init.c
|
|
+++ b/drivers/staging/rtl8712/hal_init.c
|
|
@@ -40,7 +40,10 @@ static void rtl871x_load_fw_cb(const struct firmware *firmware, void *context)
|
|
dev_err(&udev->dev, "r8712u: Firmware request failed\n");
|
|
usb_put_dev(udev);
|
|
usb_set_intfdata(usb_intf, NULL);
|
|
+ r8712_free_drv_sw(adapter);
|
|
+ adapter->dvobj_deinit(adapter);
|
|
complete(&adapter->rtl8712_fw_ready);
|
|
+ free_netdev(adapter->pnetdev);
|
|
return;
|
|
}
|
|
adapter->fw = firmware;
|
|
diff --git a/drivers/staging/rtl8712/usb_intf.c b/drivers/staging/rtl8712/usb_intf.c
|
|
index 2fcd65260f4c1..bc421925e84c2 100644
|
|
--- a/drivers/staging/rtl8712/usb_intf.c
|
|
+++ b/drivers/staging/rtl8712/usb_intf.c
|
|
@@ -380,13 +380,11 @@ static int r871xu_drv_init(struct usb_interface *pusb_intf,
|
|
/* step 3.
|
|
* initialize the dvobj_priv
|
|
*/
|
|
- if (!padapter->dvobj_init) {
|
|
+
|
|
+ status = padapter->dvobj_init(padapter);
|
|
+ if (status != _SUCCESS)
|
|
goto error;
|
|
- } else {
|
|
- status = padapter->dvobj_init(padapter);
|
|
- if (status != _SUCCESS)
|
|
- goto error;
|
|
- }
|
|
+
|
|
/* step 4. */
|
|
status = r8712_init_drv_sw(padapter);
|
|
if (status)
|
|
diff --git a/drivers/target/iscsi/cxgbit/cxgbit_ddp.c b/drivers/target/iscsi/cxgbit/cxgbit_ddp.c
|
|
index 54bb1ebd8eb5c..1814c19f5bf62 100644
|
|
--- a/drivers/target/iscsi/cxgbit/cxgbit_ddp.c
|
|
+++ b/drivers/target/iscsi/cxgbit/cxgbit_ddp.c
|
|
@@ -265,12 +265,13 @@ void cxgbit_unmap_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
|
struct cxgbit_cmd *ccmd = iscsit_priv_cmd(cmd);
|
|
|
|
if (ccmd->release) {
|
|
- struct cxgbi_task_tag_info *ttinfo = &ccmd->ttinfo;
|
|
-
|
|
- if (ttinfo->sgl) {
|
|
+ if (cmd->se_cmd.se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) {
|
|
+ put_page(sg_page(&ccmd->sg));
|
|
+ } else {
|
|
struct cxgbit_sock *csk = conn->context;
|
|
struct cxgbit_device *cdev = csk->com.cdev;
|
|
struct cxgbi_ppm *ppm = cdev2ppm(cdev);
|
|
+ struct cxgbi_task_tag_info *ttinfo = &ccmd->ttinfo;
|
|
|
|
/* Abort the TCP conn if DDP is not complete to
|
|
* avoid any possibility of DDP after freeing
|
|
@@ -280,14 +281,14 @@ void cxgbit_unmap_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
|
cmd->se_cmd.data_length))
|
|
cxgbit_abort_conn(csk);
|
|
|
|
+ if (unlikely(ttinfo->sgl)) {
|
|
+ dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl,
|
|
+ ttinfo->nents, DMA_FROM_DEVICE);
|
|
+ ttinfo->nents = 0;
|
|
+ ttinfo->sgl = NULL;
|
|
+ }
|
|
cxgbi_ppm_ppod_release(ppm, ttinfo->idx);
|
|
-
|
|
- dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl,
|
|
- ttinfo->nents, DMA_FROM_DEVICE);
|
|
- } else {
|
|
- put_page(sg_page(&ccmd->sg));
|
|
}
|
|
-
|
|
ccmd->release = false;
|
|
}
|
|
}
|
|
diff --git a/drivers/target/iscsi/cxgbit/cxgbit_target.c b/drivers/target/iscsi/cxgbit/cxgbit_target.c
|
|
index 45a1bfa2f7351..c083a69105be6 100644
|
|
--- a/drivers/target/iscsi/cxgbit/cxgbit_target.c
|
|
+++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c
|
|
@@ -1013,17 +1013,18 @@ static int cxgbit_handle_iscsi_dataout(struct cxgbit_sock *csk)
|
|
struct scatterlist *sg_start;
|
|
struct iscsi_conn *conn = csk->conn;
|
|
struct iscsi_cmd *cmd = NULL;
|
|
+ struct cxgbit_cmd *ccmd;
|
|
+ struct cxgbi_task_tag_info *ttinfo;
|
|
struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_rx_pdu_cb(csk->skb);
|
|
struct iscsi_data *hdr = (struct iscsi_data *)pdu_cb->hdr;
|
|
u32 data_offset = be32_to_cpu(hdr->offset);
|
|
- u32 data_len = pdu_cb->dlen;
|
|
+ u32 data_len = ntoh24(hdr->dlength);
|
|
int rc, sg_nents, sg_off;
|
|
bool dcrc_err = false;
|
|
|
|
if (pdu_cb->flags & PDUCBF_RX_DDP_CMP) {
|
|
u32 offset = be32_to_cpu(hdr->offset);
|
|
u32 ddp_data_len;
|
|
- u32 payload_length = ntoh24(hdr->dlength);
|
|
bool success = false;
|
|
|
|
cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, 0);
|
|
@@ -1038,7 +1039,7 @@ static int cxgbit_handle_iscsi_dataout(struct cxgbit_sock *csk)
|
|
cmd->data_sn = be32_to_cpu(hdr->datasn);
|
|
|
|
rc = __iscsit_check_dataout_hdr(conn, (unsigned char *)hdr,
|
|
- cmd, payload_length, &success);
|
|
+ cmd, data_len, &success);
|
|
if (rc < 0)
|
|
return rc;
|
|
else if (!success)
|
|
@@ -1076,6 +1077,20 @@ static int cxgbit_handle_iscsi_dataout(struct cxgbit_sock *csk)
|
|
cxgbit_skb_copy_to_sg(csk->skb, sg_start, sg_nents, skip);
|
|
}
|
|
|
|
+ ccmd = iscsit_priv_cmd(cmd);
|
|
+ ttinfo = &ccmd->ttinfo;
|
|
+
|
|
+ if (ccmd->release && ttinfo->sgl &&
|
|
+ (cmd->se_cmd.data_length == (cmd->write_data_done + data_len))) {
|
|
+ struct cxgbit_device *cdev = csk->com.cdev;
|
|
+ struct cxgbi_ppm *ppm = cdev2ppm(cdev);
|
|
+
|
|
+ dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, ttinfo->nents,
|
|
+ DMA_FROM_DEVICE);
|
|
+ ttinfo->nents = 0;
|
|
+ ttinfo->sgl = NULL;
|
|
+ }
|
|
+
|
|
check_payload:
|
|
|
|
rc = iscsit_check_dataout_payload(cmd, hdr, dcrc_err);
|
|
diff --git a/drivers/tty/nozomi.c b/drivers/tty/nozomi.c
|
|
index ed99948f3b7f7..af9b00918e4eb 100644
|
|
--- a/drivers/tty/nozomi.c
|
|
+++ b/drivers/tty/nozomi.c
|
|
@@ -1395,7 +1395,7 @@ static int nozomi_card_init(struct pci_dev *pdev,
|
|
NOZOMI_NAME, dc);
|
|
if (unlikely(ret)) {
|
|
dev_err(&pdev->dev, "can't request irq %d\n", pdev->irq);
|
|
- goto err_free_kfifo;
|
|
+ goto err_free_all_kfifo;
|
|
}
|
|
|
|
DBG1("base_addr: %p", dc->base_addr);
|
|
@@ -1433,12 +1433,15 @@ static int nozomi_card_init(struct pci_dev *pdev,
|
|
return 0;
|
|
|
|
err_free_tty:
|
|
- for (i = 0; i < MAX_PORT; ++i) {
|
|
+ for (i--; i >= 0; i--) {
|
|
tty_unregister_device(ntty_driver, dc->index_start + i);
|
|
tty_port_destroy(&dc->port[i].port);
|
|
}
|
|
+ free_irq(pdev->irq, dc);
|
|
+err_free_all_kfifo:
|
|
+ i = MAX_PORT;
|
|
err_free_kfifo:
|
|
- for (i = 0; i < MAX_PORT; i++)
|
|
+ for (i--; i >= PORT_MDM; i--)
|
|
kfifo_free(&dc->port[i].fifo_ul);
|
|
err_free_sbuf:
|
|
kfree(dc->send_buf);
|
|
diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c
|
|
index 5b673077639ba..6e93aa3623d9b 100644
|
|
--- a/drivers/tty/serial/8250/8250_port.c
|
|
+++ b/drivers/tty/serial/8250/8250_port.c
|
|
@@ -2557,6 +2557,21 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
|
|
struct ktermios *old)
|
|
{
|
|
unsigned int tolerance = port->uartclk / 100;
|
|
+ unsigned int min;
|
|
+ unsigned int max;
|
|
+
|
|
+ /*
|
|
+ * Handle magic divisors for baud rates above baud_base on SMSC
|
|
+ * Super I/O chips. Enable custom rates of clk/4 and clk/8, but
|
|
+ * disable divisor values beyond 32767, which are unavailable.
|
|
+ */
|
|
+ if (port->flags & UPF_MAGIC_MULTIPLIER) {
|
|
+ min = port->uartclk / 16 / UART_DIV_MAX >> 1;
|
|
+ max = (port->uartclk + tolerance) / 4;
|
|
+ } else {
|
|
+ min = port->uartclk / 16 / UART_DIV_MAX;
|
|
+ max = (port->uartclk + tolerance) / 16;
|
|
+ }
|
|
|
|
/*
|
|
* Ask the core to calculate the divisor for us.
|
|
@@ -2564,9 +2579,7 @@ static unsigned int serial8250_get_baud_rate(struct uart_port *port,
|
|
* slower than nominal still match standard baud rates without
|
|
* causing transmission errors.
|
|
*/
|
|
- return uart_get_baud_rate(port, termios, old,
|
|
- port->uartclk / 16 / UART_DIV_MAX,
|
|
- (port->uartclk + tolerance) / 16);
|
|
+ return uart_get_baud_rate(port, termios, old, min, max);
|
|
}
|
|
|
|
void
|
|
diff --git a/drivers/tty/serial/8250/serial_cs.c b/drivers/tty/serial/8250/serial_cs.c
|
|
index c8186a05a453c..ccd1a615305b5 100644
|
|
--- a/drivers/tty/serial/8250/serial_cs.c
|
|
+++ b/drivers/tty/serial/8250/serial_cs.c
|
|
@@ -780,6 +780,7 @@ static const struct pcmcia_device_id serial_ids[] = {
|
|
PCMCIA_DEVICE_PROD_ID12("Multi-Tech", "MT2834LT", 0x5f73be51, 0x4cd7c09e),
|
|
PCMCIA_DEVICE_PROD_ID12("OEM ", "C288MX ", 0xb572d360, 0xd2385b7a),
|
|
PCMCIA_DEVICE_PROD_ID12("Option International", "V34bis GSM/PSTN Data/Fax Modem", 0x9d7cd6f5, 0x5cb8bf41),
|
|
+ PCMCIA_DEVICE_PROD_ID12("Option International", "GSM-Ready 56K/ISDN", 0x9d7cd6f5, 0xb23844aa),
|
|
PCMCIA_DEVICE_PROD_ID12("PCMCIA ", "C336MX ", 0x99bcafe9, 0xaa25bcab),
|
|
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "PCMCIA Dual RS-232 Serial Port Card", 0xc4420b35, 0x92abc92f),
|
|
PCMCIA_DEVICE_PROD_ID12("Quatech Inc", "Dual RS-232 Serial Port PC Card", 0xc4420b35, 0x031a380d),
|
|
@@ -807,7 +808,6 @@ static const struct pcmcia_device_id serial_ids[] = {
|
|
PCMCIA_DEVICE_CIS_PROD_ID12("ADVANTECH", "COMpad-32/85B-4", 0x96913a85, 0xcec8f102, "cis/COMpad4.cis"),
|
|
PCMCIA_DEVICE_CIS_PROD_ID123("ADVANTECH", "COMpad-32/85", "1.0", 0x96913a85, 0x8fbe92ae, 0x0877b627, "cis/COMpad2.cis"),
|
|
PCMCIA_DEVICE_CIS_PROD_ID2("RS-COM 2P", 0xad20b156, "cis/RS-COM-2P.cis"),
|
|
- PCMCIA_DEVICE_CIS_MANF_CARD(0x0013, 0x0000, "cis/GLOBETROTTER.cis"),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100 1.00.", 0x19ca78af, 0xf964f42b),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL100", 0x19ca78af, 0x71d98e83),
|
|
PCMCIA_DEVICE_PROD_ID12("ELAN DIGITAL SYSTEMS LTD, c1997.", "SERIAL CARD: SL232 1.00.", 0x19ca78af, 0x69fb7490),
|
|
diff --git a/drivers/tty/serial/mvebu-uart.c b/drivers/tty/serial/mvebu-uart.c
|
|
index 5e6f661943eb1..51b4d8d1dcaca 100644
|
|
--- a/drivers/tty/serial/mvebu-uart.c
|
|
+++ b/drivers/tty/serial/mvebu-uart.c
|
|
@@ -445,12 +445,11 @@ static void mvebu_uart_shutdown(struct uart_port *port)
|
|
|
|
static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
|
|
{
|
|
- struct mvebu_uart *mvuart = to_mvuart(port);
|
|
unsigned int d_divisor, m_divisor;
|
|
u32 brdv, osamp;
|
|
|
|
- if (IS_ERR(mvuart->clk))
|
|
- return -PTR_ERR(mvuart->clk);
|
|
+ if (!port->uartclk)
|
|
+ return -EOPNOTSUPP;
|
|
|
|
/*
|
|
* The baudrate is derived from the UART clock thanks to two divisors:
|
|
@@ -463,7 +462,7 @@ static int mvebu_uart_baud_rate_set(struct uart_port *port, unsigned int baud)
|
|
* makes use of D to configure the desired baudrate.
|
|
*/
|
|
m_divisor = OSAMP_DEFAULT_DIVISOR;
|
|
- d_divisor = DIV_ROUND_UP(port->uartclk, baud * m_divisor);
|
|
+ d_divisor = DIV_ROUND_CLOSEST(port->uartclk, baud * m_divisor);
|
|
|
|
brdv = readl(port->membase + UART_BRDV);
|
|
brdv &= ~BRDV_BAUD_MASK;
|
|
@@ -482,7 +481,7 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
|
struct ktermios *old)
|
|
{
|
|
unsigned long flags;
|
|
- unsigned int baud;
|
|
+ unsigned int baud, min_baud, max_baud;
|
|
|
|
spin_lock_irqsave(&port->lock, flags);
|
|
|
|
@@ -501,16 +500,21 @@ static void mvebu_uart_set_termios(struct uart_port *port,
|
|
port->ignore_status_mask |= STAT_RX_RDY(port) | STAT_BRK_ERR;
|
|
|
|
/*
|
|
+ * Maximal divisor is 1023 * 16 when using default (x16) scheme.
|
|
* Maximum achievable frequency with simple baudrate divisor is 230400.
|
|
* Since the error per bit frame would be of more than 15%, achieving
|
|
* higher frequencies would require to implement the fractional divisor
|
|
* feature.
|
|
*/
|
|
- baud = uart_get_baud_rate(port, termios, old, 0, 230400);
|
|
+ min_baud = DIV_ROUND_UP(port->uartclk, 1023 * 16);
|
|
+ max_baud = 230400;
|
|
+
|
|
+ baud = uart_get_baud_rate(port, termios, old, min_baud, max_baud);
|
|
if (mvebu_uart_baud_rate_set(port, baud)) {
|
|
/* No clock available, baudrate cannot be changed */
|
|
if (old)
|
|
- baud = uart_get_baud_rate(port, old, NULL, 0, 230400);
|
|
+ baud = uart_get_baud_rate(port, old, NULL,
|
|
+ min_baud, max_baud);
|
|
} else {
|
|
tty_termios_encode_baud_rate(termios, baud, baud);
|
|
uart_update_timeout(port, termios->c_cflag, baud);
|
|
diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
|
|
index de86e9021a8ff..97ee1fc1cd247 100644
|
|
--- a/drivers/tty/serial/sh-sci.c
|
|
+++ b/drivers/tty/serial/sh-sci.c
|
|
@@ -613,6 +613,14 @@ static void sci_stop_tx(struct uart_port *port)
|
|
ctrl &= ~SCSCR_TIE;
|
|
|
|
serial_port_out(port, SCSCR, ctrl);
|
|
+
|
|
+#ifdef CONFIG_SERIAL_SH_SCI_DMA
|
|
+ if (to_sci_port(port)->chan_tx &&
|
|
+ !dma_submit_error(to_sci_port(port)->cookie_tx)) {
|
|
+ dmaengine_terminate_async(to_sci_port(port)->chan_tx);
|
|
+ to_sci_port(port)->cookie_tx = -EINVAL;
|
|
+ }
|
|
+#endif
|
|
}
|
|
|
|
static void sci_start_rx(struct uart_port *port)
|
|
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
|
|
index 1e9aab6118f51..c0604c60ebd01 100644
|
|
--- a/drivers/usb/class/cdc-acm.c
|
|
+++ b/drivers/usb/class/cdc-acm.c
|
|
@@ -1960,6 +1960,11 @@ static const struct usb_device_id acm_ids[] = {
|
|
.driver_info = IGNORE_DEVICE,
|
|
},
|
|
|
|
+ /* Exclude Heimann Sensor GmbH USB appset demo */
|
|
+ { USB_DEVICE(0x32a7, 0x0000),
|
|
+ .driver_info = IGNORE_DEVICE,
|
|
+ },
|
|
+
|
|
/* control interfaces without any protocol set */
|
|
{ USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
|
|
USB_CDC_PROTO_NONE) },
|
|
diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
|
|
index 78a4925aa1185..093980481c4d6 100644
|
|
--- a/drivers/usb/dwc2/core.c
|
|
+++ b/drivers/usb/dwc2/core.c
|
|
@@ -1152,15 +1152,6 @@ static int dwc2_hs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
|
|
usbcfg &= ~(GUSBCFG_ULPI_UTMI_SEL | GUSBCFG_PHYIF16);
|
|
if (hsotg->params.phy_utmi_width == 16)
|
|
usbcfg |= GUSBCFG_PHYIF16;
|
|
-
|
|
- /* Set turnaround time */
|
|
- if (dwc2_is_device_mode(hsotg)) {
|
|
- usbcfg &= ~GUSBCFG_USBTRDTIM_MASK;
|
|
- if (hsotg->params.phy_utmi_width == 16)
|
|
- usbcfg |= 5 << GUSBCFG_USBTRDTIM_SHIFT;
|
|
- else
|
|
- usbcfg |= 9 << GUSBCFG_USBTRDTIM_SHIFT;
|
|
- }
|
|
break;
|
|
default:
|
|
dev_err(hsotg->dev, "FS PHY selected at HS!\n");
|
|
@@ -1182,6 +1173,24 @@ static int dwc2_hs_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
|
|
return retval;
|
|
}
|
|
|
|
+static void dwc2_set_turnaround_time(struct dwc2_hsotg *hsotg)
|
|
+{
|
|
+ u32 usbcfg;
|
|
+
|
|
+ if (hsotg->params.phy_type != DWC2_PHY_TYPE_PARAM_UTMI)
|
|
+ return;
|
|
+
|
|
+ usbcfg = dwc2_readl(hsotg, GUSBCFG);
|
|
+
|
|
+ usbcfg &= ~GUSBCFG_USBTRDTIM_MASK;
|
|
+ if (hsotg->params.phy_utmi_width == 16)
|
|
+ usbcfg |= 5 << GUSBCFG_USBTRDTIM_SHIFT;
|
|
+ else
|
|
+ usbcfg |= 9 << GUSBCFG_USBTRDTIM_SHIFT;
|
|
+
|
|
+ dwc2_writel(hsotg, usbcfg, GUSBCFG);
|
|
+}
|
|
+
|
|
int dwc2_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
|
|
{
|
|
u32 usbcfg;
|
|
@@ -1199,6 +1208,9 @@ int dwc2_phy_init(struct dwc2_hsotg *hsotg, bool select_phy)
|
|
retval = dwc2_hs_phy_init(hsotg, select_phy);
|
|
if (retval)
|
|
return retval;
|
|
+
|
|
+ if (dwc2_is_device_mode(hsotg))
|
|
+ dwc2_set_turnaround_time(hsotg);
|
|
}
|
|
|
|
if (hsotg->hw_params.hs_phy_type == GHWCFG2_HS_PHY_TYPE_ULPI &&
|
|
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
|
|
index b9d4fc636b329..2c68ec60d39a3 100644
|
|
--- a/drivers/usb/dwc3/core.c
|
|
+++ b/drivers/usb/dwc3/core.c
|
|
@@ -1523,17 +1523,18 @@ static int dwc3_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
dwc3_check_params(dwc);
|
|
+ dwc3_debugfs_init(dwc);
|
|
|
|
ret = dwc3_core_init_mode(dwc);
|
|
if (ret)
|
|
goto err5;
|
|
|
|
- dwc3_debugfs_init(dwc);
|
|
pm_runtime_put(dev);
|
|
|
|
return 0;
|
|
|
|
err5:
|
|
+ dwc3_debugfs_exit(dwc);
|
|
dwc3_event_buffers_cleanup(dwc);
|
|
|
|
usb_phy_shutdown(dwc->usb2_phy);
|
|
diff --git a/drivers/usb/gadget/function/f_eem.c b/drivers/usb/gadget/function/f_eem.c
|
|
index 801090de1f7b3..95ef8bc726868 100644
|
|
--- a/drivers/usb/gadget/function/f_eem.c
|
|
+++ b/drivers/usb/gadget/function/f_eem.c
|
|
@@ -30,6 +30,11 @@ struct f_eem {
|
|
u8 ctrl_id;
|
|
};
|
|
|
|
+struct in_context {
|
|
+ struct sk_buff *skb;
|
|
+ struct usb_ep *ep;
|
|
+};
|
|
+
|
|
static inline struct f_eem *func_to_eem(struct usb_function *f)
|
|
{
|
|
return container_of(f, struct f_eem, port.func);
|
|
@@ -322,9 +327,12 @@ fail:
|
|
|
|
static void eem_cmd_complete(struct usb_ep *ep, struct usb_request *req)
|
|
{
|
|
- struct sk_buff *skb = (struct sk_buff *)req->context;
|
|
+ struct in_context *ctx = req->context;
|
|
|
|
- dev_kfree_skb_any(skb);
|
|
+ dev_kfree_skb_any(ctx->skb);
|
|
+ kfree(req->buf);
|
|
+ usb_ep_free_request(ctx->ep, req);
|
|
+ kfree(ctx);
|
|
}
|
|
|
|
/*
|
|
@@ -412,7 +420,9 @@ static int eem_unwrap(struct gether *port,
|
|
* b15: bmType (0 == data, 1 == command)
|
|
*/
|
|
if (header & BIT(15)) {
|
|
- struct usb_request *req = cdev->req;
|
|
+ struct usb_request *req;
|
|
+ struct in_context *ctx;
|
|
+ struct usb_ep *ep;
|
|
u16 bmEEMCmd;
|
|
|
|
/* EEM command packet format:
|
|
@@ -441,11 +451,36 @@ static int eem_unwrap(struct gether *port,
|
|
skb_trim(skb2, len);
|
|
put_unaligned_le16(BIT(15) | BIT(11) | len,
|
|
skb_push(skb2, 2));
|
|
+
|
|
+ ep = port->in_ep;
|
|
+ req = usb_ep_alloc_request(ep, GFP_ATOMIC);
|
|
+ if (!req) {
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+
|
|
+ req->buf = kmalloc(skb2->len, GFP_KERNEL);
|
|
+ if (!req->buf) {
|
|
+ usb_ep_free_request(ep, req);
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+
|
|
+ ctx = kmalloc(sizeof(*ctx), GFP_KERNEL);
|
|
+ if (!ctx) {
|
|
+ kfree(req->buf);
|
|
+ usb_ep_free_request(ep, req);
|
|
+ dev_kfree_skb_any(skb2);
|
|
+ goto next;
|
|
+ }
|
|
+ ctx->skb = skb2;
|
|
+ ctx->ep = ep;
|
|
+
|
|
skb_copy_bits(skb2, 0, req->buf, skb2->len);
|
|
req->length = skb2->len;
|
|
req->complete = eem_cmd_complete;
|
|
req->zero = 1;
|
|
- req->context = skb2;
|
|
+ req->context = ctx;
|
|
if (usb_ep_queue(port->in_ep, req, GFP_ATOMIC))
|
|
DBG(cdev, "echo response queue fail\n");
|
|
break;
|
|
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
|
|
index 3126f5b08bd4f..94ccf43368dfc 100644
|
|
--- a/drivers/usb/gadget/function/f_fs.c
|
|
+++ b/drivers/usb/gadget/function/f_fs.c
|
|
@@ -250,8 +250,8 @@ EXPORT_SYMBOL_GPL(ffs_lock);
|
|
static struct ffs_dev *_ffs_find_dev(const char *name);
|
|
static struct ffs_dev *_ffs_alloc_dev(void);
|
|
static void _ffs_free_dev(struct ffs_dev *dev);
|
|
-static void *ffs_acquire_dev(const char *dev_name);
|
|
-static void ffs_release_dev(struct ffs_data *ffs_data);
|
|
+static int ffs_acquire_dev(const char *dev_name, struct ffs_data *ffs_data);
|
|
+static void ffs_release_dev(struct ffs_dev *ffs_dev);
|
|
static int ffs_ready(struct ffs_data *ffs);
|
|
static void ffs_closed(struct ffs_data *ffs);
|
|
|
|
@@ -1572,8 +1572,8 @@ unmapped_value:
|
|
static int ffs_fs_get_tree(struct fs_context *fc)
|
|
{
|
|
struct ffs_sb_fill_data *ctx = fc->fs_private;
|
|
- void *ffs_dev;
|
|
struct ffs_data *ffs;
|
|
+ int ret;
|
|
|
|
ENTER();
|
|
|
|
@@ -1592,13 +1592,12 @@ static int ffs_fs_get_tree(struct fs_context *fc)
|
|
return -ENOMEM;
|
|
}
|
|
|
|
- ffs_dev = ffs_acquire_dev(ffs->dev_name);
|
|
- if (IS_ERR(ffs_dev)) {
|
|
+ ret = ffs_acquire_dev(ffs->dev_name, ffs);
|
|
+ if (ret) {
|
|
ffs_data_put(ffs);
|
|
- return PTR_ERR(ffs_dev);
|
|
+ return ret;
|
|
}
|
|
|
|
- ffs->private_data = ffs_dev;
|
|
ctx->ffs_data = ffs;
|
|
return get_tree_nodev(fc, ffs_sb_fill);
|
|
}
|
|
@@ -1609,7 +1608,6 @@ static void ffs_fs_free_fc(struct fs_context *fc)
|
|
|
|
if (ctx) {
|
|
if (ctx->ffs_data) {
|
|
- ffs_release_dev(ctx->ffs_data);
|
|
ffs_data_put(ctx->ffs_data);
|
|
}
|
|
|
|
@@ -1648,10 +1646,8 @@ ffs_fs_kill_sb(struct super_block *sb)
|
|
ENTER();
|
|
|
|
kill_litter_super(sb);
|
|
- if (sb->s_fs_info) {
|
|
- ffs_release_dev(sb->s_fs_info);
|
|
+ if (sb->s_fs_info)
|
|
ffs_data_closed(sb->s_fs_info);
|
|
- }
|
|
}
|
|
|
|
static struct file_system_type ffs_fs_type = {
|
|
@@ -1721,6 +1717,7 @@ static void ffs_data_put(struct ffs_data *ffs)
|
|
if (unlikely(refcount_dec_and_test(&ffs->ref))) {
|
|
pr_info("%s(): freeing\n", __func__);
|
|
ffs_data_clear(ffs);
|
|
+ ffs_release_dev(ffs->private_data);
|
|
BUG_ON(waitqueue_active(&ffs->ev.waitq) ||
|
|
waitqueue_active(&ffs->ep0req_completion.wait) ||
|
|
waitqueue_active(&ffs->wait));
|
|
@@ -3050,6 +3047,7 @@ static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f,
|
|
struct ffs_function *func = ffs_func_from_usb(f);
|
|
struct f_fs_opts *ffs_opts =
|
|
container_of(f->fi, struct f_fs_opts, func_inst);
|
|
+ struct ffs_data *ffs_data;
|
|
int ret;
|
|
|
|
ENTER();
|
|
@@ -3064,12 +3062,13 @@ static inline struct f_fs_opts *ffs_do_functionfs_bind(struct usb_function *f,
|
|
if (!ffs_opts->no_configfs)
|
|
ffs_dev_lock();
|
|
ret = ffs_opts->dev->desc_ready ? 0 : -ENODEV;
|
|
- func->ffs = ffs_opts->dev->ffs_data;
|
|
+ ffs_data = ffs_opts->dev->ffs_data;
|
|
if (!ffs_opts->no_configfs)
|
|
ffs_dev_unlock();
|
|
if (ret)
|
|
return ERR_PTR(ret);
|
|
|
|
+ func->ffs = ffs_data;
|
|
func->conf = c;
|
|
func->gadget = c->cdev->gadget;
|
|
|
|
@@ -3524,6 +3523,7 @@ static void ffs_free_inst(struct usb_function_instance *f)
|
|
struct f_fs_opts *opts;
|
|
|
|
opts = to_f_fs_opts(f);
|
|
+ ffs_release_dev(opts->dev);
|
|
ffs_dev_lock();
|
|
_ffs_free_dev(opts->dev);
|
|
ffs_dev_unlock();
|
|
@@ -3711,47 +3711,48 @@ static void _ffs_free_dev(struct ffs_dev *dev)
|
|
{
|
|
list_del(&dev->entry);
|
|
|
|
- /* Clear the private_data pointer to stop incorrect dev access */
|
|
- if (dev->ffs_data)
|
|
- dev->ffs_data->private_data = NULL;
|
|
-
|
|
kfree(dev);
|
|
if (list_empty(&ffs_devices))
|
|
functionfs_cleanup();
|
|
}
|
|
|
|
-static void *ffs_acquire_dev(const char *dev_name)
|
|
+static int ffs_acquire_dev(const char *dev_name, struct ffs_data *ffs_data)
|
|
{
|
|
+ int ret = 0;
|
|
struct ffs_dev *ffs_dev;
|
|
|
|
ENTER();
|
|
ffs_dev_lock();
|
|
|
|
ffs_dev = _ffs_find_dev(dev_name);
|
|
- if (!ffs_dev)
|
|
- ffs_dev = ERR_PTR(-ENOENT);
|
|
- else if (ffs_dev->mounted)
|
|
- ffs_dev = ERR_PTR(-EBUSY);
|
|
- else if (ffs_dev->ffs_acquire_dev_callback &&
|
|
- ffs_dev->ffs_acquire_dev_callback(ffs_dev))
|
|
- ffs_dev = ERR_PTR(-ENOENT);
|
|
- else
|
|
+ if (!ffs_dev) {
|
|
+ ret = -ENOENT;
|
|
+ } else if (ffs_dev->mounted) {
|
|
+ ret = -EBUSY;
|
|
+ } else if (ffs_dev->ffs_acquire_dev_callback &&
|
|
+ ffs_dev->ffs_acquire_dev_callback(ffs_dev)) {
|
|
+ ret = -ENOENT;
|
|
+ } else {
|
|
ffs_dev->mounted = true;
|
|
+ ffs_dev->ffs_data = ffs_data;
|
|
+ ffs_data->private_data = ffs_dev;
|
|
+ }
|
|
|
|
ffs_dev_unlock();
|
|
- return ffs_dev;
|
|
+ return ret;
|
|
}
|
|
|
|
-static void ffs_release_dev(struct ffs_data *ffs_data)
|
|
+static void ffs_release_dev(struct ffs_dev *ffs_dev)
|
|
{
|
|
- struct ffs_dev *ffs_dev;
|
|
-
|
|
ENTER();
|
|
ffs_dev_lock();
|
|
|
|
- ffs_dev = ffs_data->private_data;
|
|
- if (ffs_dev) {
|
|
+ if (ffs_dev && ffs_dev->mounted) {
|
|
ffs_dev->mounted = false;
|
|
+ if (ffs_dev->ffs_data) {
|
|
+ ffs_dev->ffs_data->private_data = NULL;
|
|
+ ffs_dev->ffs_data = NULL;
|
|
+ }
|
|
|
|
if (ffs_dev->ffs_release_dev_callback)
|
|
ffs_dev->ffs_release_dev_callback(ffs_dev);
|
|
@@ -3779,7 +3780,6 @@ static int ffs_ready(struct ffs_data *ffs)
|
|
}
|
|
|
|
ffs_obj->desc_ready = true;
|
|
- ffs_obj->ffs_data = ffs;
|
|
|
|
if (ffs_obj->ffs_ready_callback) {
|
|
ret = ffs_obj->ffs_ready_callback(ffs);
|
|
@@ -3807,7 +3807,6 @@ static void ffs_closed(struct ffs_data *ffs)
|
|
goto done;
|
|
|
|
ffs_obj->desc_ready = false;
|
|
- ffs_obj->ffs_data = NULL;
|
|
|
|
if (test_and_clear_bit(FFS_FL_CALL_CLOSED_CALLBACK, &ffs->flags) &&
|
|
ffs_obj->ffs_closed_callback)
|
|
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
|
|
index 7f9f302a73cdf..160caef09c5ea 100644
|
|
--- a/drivers/usb/host/xhci-mem.c
|
|
+++ b/drivers/usb/host/xhci-mem.c
|
|
@@ -1929,6 +1929,7 @@ no_bw:
|
|
xhci->hw_ports = NULL;
|
|
xhci->rh_bw = NULL;
|
|
xhci->ext_caps = NULL;
|
|
+ xhci->port_caps = NULL;
|
|
|
|
xhci->page_size = 0;
|
|
xhci->page_shift = 0;
|
|
diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c
|
|
index a400b65cf17bb..526509ed92e5c 100644
|
|
--- a/drivers/usb/typec/class.c
|
|
+++ b/drivers/usb/typec/class.c
|
|
@@ -487,8 +487,10 @@ typec_register_altmode(struct device *parent,
|
|
int ret;
|
|
|
|
alt = kzalloc(sizeof(*alt), GFP_KERNEL);
|
|
- if (!alt)
|
|
+ if (!alt) {
|
|
+ altmode_id_remove(parent, id);
|
|
return ERR_PTR(-ENOMEM);
|
|
+ }
|
|
|
|
alt->adev.svid = desc->svid;
|
|
alt->adev.mode = desc->mode;
|
|
diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
|
|
index a603f363835c4..b06d76216599e 100644
|
|
--- a/drivers/vfio/pci/vfio_pci.c
|
|
+++ b/drivers/vfio/pci/vfio_pci.c
|
|
@@ -1430,6 +1430,7 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
|
|
{
|
|
struct vm_area_struct *vma = vmf->vma;
|
|
struct vfio_pci_device *vdev = vma->vm_private_data;
|
|
+ struct vfio_pci_mmap_vma *mmap_vma;
|
|
vm_fault_t ret = VM_FAULT_NOPAGE;
|
|
|
|
mutex_lock(&vdev->vma_lock);
|
|
@@ -1437,24 +1438,36 @@ static vm_fault_t vfio_pci_mmap_fault(struct vm_fault *vmf)
|
|
|
|
if (!__vfio_pci_memory_enabled(vdev)) {
|
|
ret = VM_FAULT_SIGBUS;
|
|
- mutex_unlock(&vdev->vma_lock);
|
|
goto up_out;
|
|
}
|
|
|
|
- if (__vfio_pci_add_vma(vdev, vma)) {
|
|
- ret = VM_FAULT_OOM;
|
|
- mutex_unlock(&vdev->vma_lock);
|
|
- goto up_out;
|
|
+ /*
|
|
+ * We populate the whole vma on fault, so we need to test whether
|
|
+ * the vma has already been mapped, such as for concurrent faults
|
|
+ * to the same vma. io_remap_pfn_range() will trigger a BUG_ON if
|
|
+ * we ask it to fill the same range again.
|
|
+ */
|
|
+ list_for_each_entry(mmap_vma, &vdev->vma_list, vma_next) {
|
|
+ if (mmap_vma->vma == vma)
|
|
+ goto up_out;
|
|
}
|
|
|
|
- mutex_unlock(&vdev->vma_lock);
|
|
-
|
|
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
|
|
- vma->vm_end - vma->vm_start, vma->vm_page_prot))
|
|
+ vma->vm_end - vma->vm_start,
|
|
+ vma->vm_page_prot)) {
|
|
ret = VM_FAULT_SIGBUS;
|
|
+ zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start);
|
|
+ goto up_out;
|
|
+ }
|
|
+
|
|
+ if (__vfio_pci_add_vma(vdev, vma)) {
|
|
+ ret = VM_FAULT_OOM;
|
|
+ zap_vma_ptes(vma, vma->vm_start, vma->vm_end - vma->vm_start);
|
|
+ }
|
|
|
|
up_out:
|
|
up_read(&vdev->memory_lock);
|
|
+ mutex_unlock(&vdev->vma_lock);
|
|
return ret;
|
|
}
|
|
|
|
diff --git a/drivers/video/backlight/lm3630a_bl.c b/drivers/video/backlight/lm3630a_bl.c
|
|
index 2d8e8192e4e29..f03ffe2bb2376 100644
|
|
--- a/drivers/video/backlight/lm3630a_bl.c
|
|
+++ b/drivers/video/backlight/lm3630a_bl.c
|
|
@@ -480,8 +480,10 @@ static int lm3630a_parse_node(struct lm3630a_chip *pchip,
|
|
|
|
device_for_each_child_node(pchip->dev, node) {
|
|
ret = lm3630a_parse_bank(pdata, node, &seen_led_sources);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ fwnode_handle_put(node);
|
|
return ret;
|
|
+ }
|
|
}
|
|
|
|
return ret;
|
|
diff --git a/drivers/video/fbdev/imxfb.c b/drivers/video/fbdev/imxfb.c
|
|
index b3286d1fa5439..ffde3107104bc 100644
|
|
--- a/drivers/video/fbdev/imxfb.c
|
|
+++ b/drivers/video/fbdev/imxfb.c
|
|
@@ -977,7 +977,7 @@ static int imxfb_probe(struct platform_device *pdev)
|
|
info->screen_buffer = dma_alloc_wc(&pdev->dev, fbi->map_size,
|
|
&fbi->map_dma, GFP_KERNEL);
|
|
if (!info->screen_buffer) {
|
|
- dev_err(&pdev->dev, "Failed to allocate video RAM: %d\n", ret);
|
|
+ dev_err(&pdev->dev, "Failed to allocate video RAM\n");
|
|
ret = -ENOMEM;
|
|
goto failed_map;
|
|
}
|
|
diff --git a/drivers/visorbus/visorchipset.c b/drivers/visorbus/visorchipset.c
|
|
index cb1eb7e05f871..5668cad86e374 100644
|
|
--- a/drivers/visorbus/visorchipset.c
|
|
+++ b/drivers/visorbus/visorchipset.c
|
|
@@ -1561,7 +1561,7 @@ schedule_out:
|
|
|
|
static int visorchipset_init(struct acpi_device *acpi_device)
|
|
{
|
|
- int err = -ENODEV;
|
|
+ int err = -ENOMEM;
|
|
struct visorchannel *controlvm_channel;
|
|
|
|
chipset_dev = kzalloc(sizeof(*chipset_dev), GFP_KERNEL);
|
|
@@ -1584,8 +1584,10 @@ static int visorchipset_init(struct acpi_device *acpi_device)
|
|
"controlvm",
|
|
sizeof(struct visor_controlvm_channel),
|
|
VISOR_CONTROLVM_CHANNEL_VERSIONID,
|
|
- VISOR_CHANNEL_SIGNATURE))
|
|
+ VISOR_CHANNEL_SIGNATURE)) {
|
|
+ err = -ENODEV;
|
|
goto error_delete_groups;
|
|
+ }
|
|
/* if booting in a crash kernel */
|
|
if (is_kdump_kernel())
|
|
INIT_DELAYED_WORK(&chipset_dev->periodic_controlvm_work,
|
|
diff --git a/fs/btrfs/Kconfig b/fs/btrfs/Kconfig
|
|
index 38651fae7f21a..0aa1bee24d807 100644
|
|
--- a/fs/btrfs/Kconfig
|
|
+++ b/fs/btrfs/Kconfig
|
|
@@ -14,6 +14,8 @@ config BTRFS_FS
|
|
select RAID6_PQ
|
|
select XOR_BLOCKS
|
|
select SRCU
|
|
+ depends on !PPC_256K_PAGES # powerpc
|
|
+ depends on !PAGE_SIZE_256KB # hexagon
|
|
|
|
help
|
|
Btrfs is a general purpose copy-on-write filesystem with extents,
|
|
diff --git a/fs/btrfs/delayed-inode.c b/fs/btrfs/delayed-inode.c
|
|
index 7dad8794ee388..3dccbbe4a6585 100644
|
|
--- a/fs/btrfs/delayed-inode.c
|
|
+++ b/fs/btrfs/delayed-inode.c
|
|
@@ -1033,12 +1033,10 @@ static int __btrfs_update_delayed_inode(struct btrfs_trans_handle *trans,
|
|
nofs_flag = memalloc_nofs_save();
|
|
ret = btrfs_lookup_inode(trans, root, path, &key, mod);
|
|
memalloc_nofs_restore(nofs_flag);
|
|
- if (ret > 0) {
|
|
- btrfs_release_path(path);
|
|
- return -ENOENT;
|
|
- } else if (ret < 0) {
|
|
- return ret;
|
|
- }
|
|
+ if (ret > 0)
|
|
+ ret = -ENOENT;
|
|
+ if (ret < 0)
|
|
+ goto out;
|
|
|
|
leaf = path->nodes[0];
|
|
inode_item = btrfs_item_ptr(leaf, path->slots[0],
|
|
@@ -1076,6 +1074,14 @@ err_out:
|
|
btrfs_delayed_inode_release_metadata(fs_info, node, (ret < 0));
|
|
btrfs_release_delayed_inode(node);
|
|
|
|
+ /*
|
|
+ * If we fail to update the delayed inode we need to abort the
|
|
+ * transaction, because we could leave the inode with the improper
|
|
+ * counts behind.
|
|
+ */
|
|
+ if (ret && ret != -ENOENT)
|
|
+ btrfs_abort_transaction(trans, ret);
|
|
+
|
|
return ret;
|
|
|
|
search:
|
|
diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c
|
|
index ecdefa7262d2b..fc688af57c231 100644
|
|
--- a/fs/btrfs/send.c
|
|
+++ b/fs/btrfs/send.c
|
|
@@ -4087,6 +4087,17 @@ static int process_recorded_refs(struct send_ctx *sctx, int *pending_move)
|
|
if (ret < 0)
|
|
goto out;
|
|
} else {
|
|
+ /*
|
|
+ * If we previously orphanized a directory that
|
|
+ * collided with a new reference that we already
|
|
+ * processed, recompute the current path because
|
|
+ * that directory may be part of the path.
|
|
+ */
|
|
+ if (orphanized_dir) {
|
|
+ ret = refresh_ref_path(sctx, cur);
|
|
+ if (ret < 0)
|
|
+ goto out;
|
|
+ }
|
|
ret = send_unlink(sctx, cur->full_path);
|
|
if (ret < 0)
|
|
goto out;
|
|
diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c
|
|
index aca6c467d7761..d8e4e0bf3fc2d 100644
|
|
--- a/fs/btrfs/transaction.c
|
|
+++ b/fs/btrfs/transaction.c
|
|
@@ -1274,8 +1274,10 @@ int btrfs_defrag_root(struct btrfs_root *root)
|
|
|
|
while (1) {
|
|
trans = btrfs_start_transaction(root, 0);
|
|
- if (IS_ERR(trans))
|
|
- return PTR_ERR(trans);
|
|
+ if (IS_ERR(trans)) {
|
|
+ ret = PTR_ERR(trans);
|
|
+ break;
|
|
+ }
|
|
|
|
ret = btrfs_defrag_leaves(trans, root);
|
|
|
|
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
|
|
index 4ff381c23cefc..afc6731bb692c 100644
|
|
--- a/fs/btrfs/tree-log.c
|
|
+++ b/fs/btrfs/tree-log.c
|
|
@@ -6327,6 +6327,7 @@ next:
|
|
error:
|
|
if (wc.trans)
|
|
btrfs_end_transaction(wc.trans);
|
|
+ clear_bit(BTRFS_FS_LOG_RECOVERING, &fs_info->flags);
|
|
btrfs_free_path(path);
|
|
return ret;
|
|
}
|
|
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
|
|
index b16c994414ab0..9c0e348cb00f7 100644
|
|
--- a/fs/cifs/cifsglob.h
|
|
+++ b/fs/cifs/cifsglob.h
|
|
@@ -964,7 +964,7 @@ struct cifs_ses {
|
|
struct mutex session_mutex;
|
|
struct TCP_Server_Info *server; /* pointer to server info */
|
|
int ses_count; /* reference counter */
|
|
- enum statusEnum status;
|
|
+ enum statusEnum status; /* updates protected by GlobalMid_Lock */
|
|
unsigned overrideSecFlg; /* if non-zero override global sec flags */
|
|
char *serverOS; /* name of operating system underlying server */
|
|
char *serverNOS; /* name of network operating system of server */
|
|
@@ -1814,6 +1814,7 @@ require use of the stronger protocol */
|
|
* list operations on pending_mid_q and oplockQ
|
|
* updates to XID counters, multiplex id and SMB sequence numbers
|
|
* list operations on global DnotifyReqList
|
|
+ * updates to ses->status
|
|
* tcp_ses_lock protects:
|
|
* list operations on tcp and SMB session lists
|
|
* tcon->open_file_lock protects the list of open files hanging off the tcon
|
|
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
|
|
index ab9eeb5ff8e57..da0720f41ebcb 100644
|
|
--- a/fs/cifs/connect.c
|
|
+++ b/fs/cifs/connect.c
|
|
@@ -3049,9 +3049,12 @@ void cifs_put_smb_ses(struct cifs_ses *ses)
|
|
spin_unlock(&cifs_tcp_ses_lock);
|
|
return;
|
|
}
|
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
|
+
|
|
+ spin_lock(&GlobalMid_Lock);
|
|
if (ses->status == CifsGood)
|
|
ses->status = CifsExiting;
|
|
- spin_unlock(&cifs_tcp_ses_lock);
|
|
+ spin_unlock(&GlobalMid_Lock);
|
|
|
|
cifs_free_ipc(ses);
|
|
|
|
diff --git a/fs/configfs/file.c b/fs/configfs/file.c
|
|
index 84b4d58fc65f7..66fae1853d998 100644
|
|
--- a/fs/configfs/file.c
|
|
+++ b/fs/configfs/file.c
|
|
@@ -482,13 +482,13 @@ static int configfs_release_bin_file(struct inode *inode, struct file *file)
|
|
buffer->bin_buffer_size);
|
|
}
|
|
up_read(&frag->frag_sem);
|
|
- /* vfree on NULL is safe */
|
|
- vfree(buffer->bin_buffer);
|
|
- buffer->bin_buffer = NULL;
|
|
- buffer->bin_buffer_size = 0;
|
|
- buffer->needs_read_fill = 1;
|
|
}
|
|
|
|
+ vfree(buffer->bin_buffer);
|
|
+ buffer->bin_buffer = NULL;
|
|
+ buffer->bin_buffer_size = 0;
|
|
+ buffer->needs_read_fill = 1;
|
|
+
|
|
configfs_release(inode, file);
|
|
return 0;
|
|
}
|
|
diff --git a/fs/dax.c b/fs/dax.c
|
|
index 3b0e5da96d541..12953e892bb25 100644
|
|
--- a/fs/dax.c
|
|
+++ b/fs/dax.c
|
|
@@ -477,10 +477,11 @@ static void *grab_mapping_entry(struct xa_state *xas,
|
|
struct address_space *mapping, unsigned int order)
|
|
{
|
|
unsigned long index = xas->xa_index;
|
|
- bool pmd_downgrade = false; /* splitting PMD entry into PTE entries? */
|
|
+ bool pmd_downgrade; /* splitting PMD entry into PTE entries? */
|
|
void *entry;
|
|
|
|
retry:
|
|
+ pmd_downgrade = false;
|
|
xas_lock_irq(xas);
|
|
entry = get_unlocked_entry(xas, order);
|
|
|
|
diff --git a/fs/dlm/config.c b/fs/dlm/config.c
|
|
index 3b1012a3c4396..b7e288cf3f5f3 100644
|
|
--- a/fs/dlm/config.c
|
|
+++ b/fs/dlm/config.c
|
|
@@ -78,6 +78,9 @@ struct dlm_cluster {
|
|
unsigned int cl_new_rsb_count;
|
|
unsigned int cl_recover_callbacks;
|
|
char cl_cluster_name[DLM_LOCKSPACE_LEN];
|
|
+
|
|
+ struct dlm_spaces *sps;
|
|
+ struct dlm_comms *cms;
|
|
};
|
|
|
|
static struct dlm_cluster *config_item_to_cluster(struct config_item *i)
|
|
@@ -354,6 +357,9 @@ static struct config_group *make_cluster(struct config_group *g,
|
|
if (!cl || !sps || !cms)
|
|
goto fail;
|
|
|
|
+ cl->sps = sps;
|
|
+ cl->cms = cms;
|
|
+
|
|
config_group_init_type_name(&cl->group, name, &cluster_type);
|
|
config_group_init_type_name(&sps->ss_group, "spaces", &spaces_type);
|
|
config_group_init_type_name(&cms->cs_group, "comms", &comms_type);
|
|
@@ -403,6 +409,9 @@ static void drop_cluster(struct config_group *g, struct config_item *i)
|
|
static void release_cluster(struct config_item *i)
|
|
{
|
|
struct dlm_cluster *cl = config_item_to_cluster(i);
|
|
+
|
|
+ kfree(cl->sps);
|
|
+ kfree(cl->cms);
|
|
kfree(cl);
|
|
}
|
|
|
|
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
|
|
index 3951d39b9b759..d9202ba665cef 100644
|
|
--- a/fs/dlm/lowcomms.c
|
|
+++ b/fs/dlm/lowcomms.c
|
|
@@ -607,7 +607,7 @@ static void close_connection(struct connection *con, bool and_other,
|
|
}
|
|
if (con->othercon && and_other) {
|
|
/* Will only re-enter once. */
|
|
- close_connection(con->othercon, false, true, true);
|
|
+ close_connection(con->othercon, false, tx, rx);
|
|
}
|
|
if (con->rx_page) {
|
|
__free_page(con->rx_page);
|
|
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
|
|
index dbd0d7a101541..ae73e67936832 100644
|
|
--- a/fs/ext4/extents.c
|
|
+++ b/fs/ext4/extents.c
|
|
@@ -862,6 +862,7 @@ int ext4_ext_tree_init(handle_t *handle, struct inode *inode)
|
|
eh->eh_entries = 0;
|
|
eh->eh_magic = EXT4_EXT_MAGIC;
|
|
eh->eh_max = cpu_to_le16(ext4_ext_space_root(inode, 0));
|
|
+ eh->eh_generation = 0;
|
|
ext4_mark_inode_dirty(handle, inode);
|
|
return 0;
|
|
}
|
|
@@ -1118,6 +1119,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
|
neh->eh_max = cpu_to_le16(ext4_ext_space_block(inode, 0));
|
|
neh->eh_magic = EXT4_EXT_MAGIC;
|
|
neh->eh_depth = 0;
|
|
+ neh->eh_generation = 0;
|
|
|
|
/* move remainder of path[depth] to the new leaf */
|
|
if (unlikely(path[depth].p_hdr->eh_entries !=
|
|
@@ -1195,6 +1197,7 @@ static int ext4_ext_split(handle_t *handle, struct inode *inode,
|
|
neh->eh_magic = EXT4_EXT_MAGIC;
|
|
neh->eh_max = cpu_to_le16(ext4_ext_space_block_idx(inode, 0));
|
|
neh->eh_depth = cpu_to_le16(depth - i);
|
|
+ neh->eh_generation = 0;
|
|
fidx = EXT_FIRST_INDEX(neh);
|
|
fidx->ei_block = border;
|
|
ext4_idx_store_pblock(fidx, oldblock);
|
|
diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
|
|
index d996b44d2265b..43fba01da6c3d 100644
|
|
--- a/fs/ext4/extents_status.c
|
|
+++ b/fs/ext4/extents_status.c
|
|
@@ -1553,11 +1553,9 @@ static unsigned long ext4_es_scan(struct shrinker *shrink,
|
|
ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
|
|
trace_ext4_es_shrink_scan_enter(sbi->s_sb, nr_to_scan, ret);
|
|
|
|
- if (!nr_to_scan)
|
|
- return ret;
|
|
-
|
|
nr_shrunk = __es_shrink(sbi, nr_to_scan, NULL);
|
|
|
|
+ ret = percpu_counter_read_positive(&sbi->s_es_stats.es_stats_shk_cnt);
|
|
trace_ext4_es_shrink_scan_exit(sbi->s_sb, nr_shrunk, ret);
|
|
return nr_shrunk;
|
|
}
|
|
diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
|
|
index dd2c23d1483cc..83846cc814850 100644
|
|
--- a/fs/ext4/ialloc.c
|
|
+++ b/fs/ext4/ialloc.c
|
|
@@ -394,7 +394,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
|
*
|
|
* We always try to spread first-level directories.
|
|
*
|
|
- * If there are blockgroups with both free inodes and free blocks counts
|
|
+ * If there are blockgroups with both free inodes and free clusters counts
|
|
* not worse than average we return one with smallest directory count.
|
|
* Otherwise we simply return a random group.
|
|
*
|
|
@@ -403,7 +403,7 @@ static void get_orlov_stats(struct super_block *sb, ext4_group_t g,
|
|
* It's OK to put directory into a group unless
|
|
* it has too many directories already (max_dirs) or
|
|
* it has too few free inodes left (min_inodes) or
|
|
- * it has too few free blocks left (min_blocks) or
|
|
+ * it has too few free clusters left (min_clusters) or
|
|
* Parent's group is preferred, if it doesn't satisfy these
|
|
* conditions we search cyclically through the rest. If none
|
|
* of the groups look good we just look for a group with more
|
|
@@ -419,7 +419,7 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
|
ext4_group_t real_ngroups = ext4_get_groups_count(sb);
|
|
int inodes_per_group = EXT4_INODES_PER_GROUP(sb);
|
|
unsigned int freei, avefreei, grp_free;
|
|
- ext4_fsblk_t freeb, avefreec;
|
|
+ ext4_fsblk_t freec, avefreec;
|
|
unsigned int ndirs;
|
|
int max_dirs, min_inodes;
|
|
ext4_grpblk_t min_clusters;
|
|
@@ -438,9 +438,8 @@ static int find_group_orlov(struct super_block *sb, struct inode *parent,
|
|
|
|
freei = percpu_counter_read_positive(&sbi->s_freeinodes_counter);
|
|
avefreei = freei / ngroups;
|
|
- freeb = EXT4_C2B(sbi,
|
|
- percpu_counter_read_positive(&sbi->s_freeclusters_counter));
|
|
- avefreec = freeb;
|
|
+ freec = percpu_counter_read_positive(&sbi->s_freeclusters_counter);
|
|
+ avefreec = freec;
|
|
do_div(avefreec, ngroups);
|
|
ndirs = percpu_counter_read_positive(&sbi->s_dirs_counter);
|
|
|
|
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
|
|
index cd69510f29472..b67ea979f0cf7 100644
|
|
--- a/fs/ext4/mballoc.c
|
|
+++ b/fs/ext4/mballoc.c
|
|
@@ -1542,10 +1542,11 @@ static int mb_find_extent(struct ext4_buddy *e4b, int block,
|
|
if (ex->fe_start + ex->fe_len > EXT4_CLUSTERS_PER_GROUP(e4b->bd_sb)) {
|
|
/* Should never happen! (but apparently sometimes does?!?) */
|
|
WARN_ON(1);
|
|
- ext4_error(e4b->bd_sb, "corruption or bug in mb_find_extent "
|
|
- "block=%d, order=%d needed=%d ex=%u/%d/%d@%u",
|
|
- block, order, needed, ex->fe_group, ex->fe_start,
|
|
- ex->fe_len, ex->fe_logical);
|
|
+ ext4_grp_locked_error(e4b->bd_sb, e4b->bd_group, 0, 0,
|
|
+ "corruption or bug in mb_find_extent "
|
|
+ "block=%d, order=%d needed=%d ex=%u/%d/%d@%u",
|
|
+ block, order, needed, ex->fe_group, ex->fe_start,
|
|
+ ex->fe_len, ex->fe_logical);
|
|
ex->fe_len = 0;
|
|
ex->fe_start = 0;
|
|
ex->fe_group = 0;
|
|
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
|
|
index 0b364f5e6fdf9..ce8372ceaa43e 100644
|
|
--- a/fs/ext4/super.c
|
|
+++ b/fs/ext4/super.c
|
|
@@ -2735,8 +2735,15 @@ static void ext4_orphan_cleanup(struct super_block *sb,
|
|
inode_lock(inode);
|
|
truncate_inode_pages(inode->i_mapping, inode->i_size);
|
|
ret = ext4_truncate(inode);
|
|
- if (ret)
|
|
+ if (ret) {
|
|
+ /*
|
|
+ * We need to clean up the in-core orphan list
|
|
+ * manually if ext4_truncate() failed to get a
|
|
+ * transaction handle.
|
|
+ */
|
|
+ ext4_orphan_del(NULL, inode);
|
|
ext4_std_error(inode->i_sb, ret);
|
|
+ }
|
|
inode_unlock(inode);
|
|
nr_truncates++;
|
|
} else {
|
|
@@ -4611,6 +4618,7 @@ no_journal:
|
|
ext4_msg(sb, KERN_ERR,
|
|
"unable to initialize "
|
|
"flex_bg meta info!");
|
|
+ ret = -ENOMEM;
|
|
goto failed_mount6;
|
|
}
|
|
|
|
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
|
|
index a2cf2db0d3def..22e9c88f3960a 100644
|
|
--- a/fs/fs-writeback.c
|
|
+++ b/fs/fs-writeback.c
|
|
@@ -505,12 +505,19 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)
|
|
if (!isw)
|
|
return;
|
|
|
|
+ atomic_inc(&isw_nr_in_flight);
|
|
+
|
|
/* find and pin the new wb */
|
|
rcu_read_lock();
|
|
memcg_css = css_from_id(new_wb_id, &memory_cgrp_subsys);
|
|
- if (memcg_css)
|
|
- isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
|
|
+ if (memcg_css && !css_tryget(memcg_css))
|
|
+ memcg_css = NULL;
|
|
rcu_read_unlock();
|
|
+ if (!memcg_css)
|
|
+ goto out_free;
|
|
+
|
|
+ isw->new_wb = wb_get_create(bdi, memcg_css, GFP_ATOMIC);
|
|
+ css_put(memcg_css);
|
|
if (!isw->new_wb)
|
|
goto out_free;
|
|
|
|
@@ -535,11 +542,10 @@ static void inode_switch_wbs(struct inode *inode, int new_wb_id)
|
|
* Let's continue after I_WB_SWITCH is guaranteed to be visible.
|
|
*/
|
|
call_rcu(&isw->rcu_head, inode_switch_wbs_rcu_fn);
|
|
-
|
|
- atomic_inc(&isw_nr_in_flight);
|
|
return;
|
|
|
|
out_free:
|
|
+ atomic_dec(&isw_nr_in_flight);
|
|
if (isw->new_wb)
|
|
wb_put(isw->new_wb);
|
|
kfree(isw);
|
|
@@ -2196,28 +2202,6 @@ int dirtytime_interval_handler(struct ctl_table *table, int write,
|
|
return ret;
|
|
}
|
|
|
|
-static noinline void block_dump___mark_inode_dirty(struct inode *inode)
|
|
-{
|
|
- if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) {
|
|
- struct dentry *dentry;
|
|
- const char *name = "?";
|
|
-
|
|
- dentry = d_find_alias(inode);
|
|
- if (dentry) {
|
|
- spin_lock(&dentry->d_lock);
|
|
- name = (const char *) dentry->d_name.name;
|
|
- }
|
|
- printk(KERN_DEBUG
|
|
- "%s(%d): dirtied inode %lu (%s) on %s\n",
|
|
- current->comm, task_pid_nr(current), inode->i_ino,
|
|
- name, inode->i_sb->s_id);
|
|
- if (dentry) {
|
|
- spin_unlock(&dentry->d_lock);
|
|
- dput(dentry);
|
|
- }
|
|
- }
|
|
-}
|
|
-
|
|
/**
|
|
* __mark_inode_dirty - internal function
|
|
*
|
|
@@ -2277,9 +2261,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
|
|
(dirtytime && (inode->i_state & I_DIRTY_INODE)))
|
|
return;
|
|
|
|
- if (unlikely(block_dump))
|
|
- block_dump___mark_inode_dirty(inode);
|
|
-
|
|
spin_lock(&inode->i_lock);
|
|
if (dirtytime && (inode->i_state & I_DIRTY_INODE))
|
|
goto out_unlock_inode;
|
|
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
|
|
index 40c262b3f9ff5..16aa55b73ccf5 100644
|
|
--- a/fs/fuse/dev.c
|
|
+++ b/fs/fuse/dev.c
|
|
@@ -770,6 +770,7 @@ static int fuse_check_page(struct page *page)
|
|
1 << PG_uptodate |
|
|
1 << PG_lru |
|
|
1 << PG_active |
|
|
+ 1 << PG_workingset |
|
|
1 << PG_reclaim |
|
|
1 << PG_waiters))) {
|
|
pr_warn("trying to steal weird page\n");
|
|
@@ -1263,6 +1264,15 @@ static ssize_t fuse_dev_do_read(struct fuse_dev *fud, struct file *file,
|
|
goto restart;
|
|
}
|
|
spin_lock(&fpq->lock);
|
|
+ /*
|
|
+ * Must not put request on fpq->io queue after having been shut down by
|
|
+ * fuse_abort_conn()
|
|
+ */
|
|
+ if (!fpq->connected) {
|
|
+ req->out.h.error = err = -ECONNABORTED;
|
|
+ goto out_end;
|
|
+
|
|
+ }
|
|
list_add(&req->list, &fpq->io);
|
|
spin_unlock(&fpq->lock);
|
|
cs->req = req;
|
|
@@ -1859,7 +1869,7 @@ static ssize_t fuse_dev_do_write(struct fuse_dev *fud,
|
|
}
|
|
|
|
err = -EINVAL;
|
|
- if (oh.error <= -1000 || oh.error > 0)
|
|
+ if (oh.error <= -512 || oh.error > 0)
|
|
goto copy_finish;
|
|
|
|
spin_lock(&fpq->lock);
|
|
diff --git a/fs/ntfs/inode.c b/fs/ntfs/inode.c
|
|
index 672feb96e250e..46dc16e01fe20 100644
|
|
--- a/fs/ntfs/inode.c
|
|
+++ b/fs/ntfs/inode.c
|
|
@@ -476,7 +476,7 @@ err_corrupt_attr:
|
|
}
|
|
file_name_attr = (FILE_NAME_ATTR*)((u8*)attr +
|
|
le16_to_cpu(attr->data.resident.value_offset));
|
|
- p2 = (u8*)attr + le32_to_cpu(attr->data.resident.value_length);
|
|
+ p2 = (u8 *)file_name_attr + le32_to_cpu(attr->data.resident.value_length);
|
|
if (p2 < (u8*)attr || p2 > p)
|
|
goto err_corrupt_attr;
|
|
/* This attribute is ok, but is it in the $Extend directory? */
|
|
diff --git a/fs/ocfs2/filecheck.c b/fs/ocfs2/filecheck.c
|
|
index 50f11bfdc8c2d..82a3edc4aea4b 100644
|
|
--- a/fs/ocfs2/filecheck.c
|
|
+++ b/fs/ocfs2/filecheck.c
|
|
@@ -328,11 +328,7 @@ static ssize_t ocfs2_filecheck_attr_show(struct kobject *kobj,
|
|
ret = snprintf(buf + total, remain, "%lu\t\t%u\t%s\n",
|
|
p->fe_ino, p->fe_done,
|
|
ocfs2_filecheck_error(p->fe_status));
|
|
- if (ret < 0) {
|
|
- total = ret;
|
|
- break;
|
|
- }
|
|
- if (ret == remain) {
|
|
+ if (ret >= remain) {
|
|
/* snprintf() didn't fit */
|
|
total = -E2BIG;
|
|
break;
|
|
diff --git a/fs/ocfs2/stackglue.c b/fs/ocfs2/stackglue.c
|
|
index 8aa6a667860c9..1880387601361 100644
|
|
--- a/fs/ocfs2/stackglue.c
|
|
+++ b/fs/ocfs2/stackglue.c
|
|
@@ -502,11 +502,7 @@ static ssize_t ocfs2_loaded_cluster_plugins_show(struct kobject *kobj,
|
|
list_for_each_entry(p, &ocfs2_stack_list, sp_list) {
|
|
ret = snprintf(buf, remain, "%s\n",
|
|
p->sp_name);
|
|
- if (ret < 0) {
|
|
- total = ret;
|
|
- break;
|
|
- }
|
|
- if (ret == remain) {
|
|
+ if (ret >= remain) {
|
|
/* snprintf() didn't fit */
|
|
total = -E2BIG;
|
|
break;
|
|
@@ -533,7 +529,7 @@ static ssize_t ocfs2_active_cluster_plugin_show(struct kobject *kobj,
|
|
if (active_stack) {
|
|
ret = snprintf(buf, PAGE_SIZE, "%s\n",
|
|
active_stack->sp_name);
|
|
- if (ret == PAGE_SIZE)
|
|
+ if (ret >= PAGE_SIZE)
|
|
ret = -E2BIG;
|
|
}
|
|
spin_unlock(&ocfs2_stack_lock);
|
|
diff --git a/include/crypto/internal/hash.h b/include/crypto/internal/hash.h
|
|
index bfc9db7b100d6..9cc7f1c02d270 100644
|
|
--- a/include/crypto/internal/hash.h
|
|
+++ b/include/crypto/internal/hash.h
|
|
@@ -77,13 +77,7 @@ int ahash_register_instance(struct crypto_template *tmpl,
|
|
struct ahash_instance *inst);
|
|
void ahash_free_instance(struct crypto_instance *inst);
|
|
|
|
-int shash_no_setkey(struct crypto_shash *tfm, const u8 *key,
|
|
- unsigned int keylen);
|
|
-
|
|
-static inline bool crypto_shash_alg_has_setkey(struct shash_alg *alg)
|
|
-{
|
|
- return alg->setkey != shash_no_setkey;
|
|
-}
|
|
+bool crypto_shash_alg_has_setkey(struct shash_alg *alg);
|
|
|
|
bool crypto_hash_alg_has_setkey(struct hash_alg_common *halg);
|
|
|
|
diff --git a/include/linux/bio.h b/include/linux/bio.h
|
|
index 853d92ceee64e..b0927b27a8a88 100644
|
|
--- a/include/linux/bio.h
|
|
+++ b/include/linux/bio.h
|
|
@@ -40,9 +40,6 @@
|
|
#define bio_offset(bio) bio_iter_offset((bio), (bio)->bi_iter)
|
|
#define bio_iovec(bio) bio_iter_iovec((bio), (bio)->bi_iter)
|
|
|
|
-#define bio_multiple_segments(bio) \
|
|
- ((bio)->bi_iter.bi_size != bio_iovec(bio).bv_len)
|
|
-
|
|
#define bvec_iter_sectors(iter) ((iter).bi_size >> 9)
|
|
#define bvec_iter_end_sector(iter) ((iter).bi_sector + bvec_iter_sectors((iter)))
|
|
|
|
@@ -246,7 +243,7 @@ static inline void bio_clear_flag(struct bio *bio, unsigned int bit)
|
|
|
|
static inline void bio_get_first_bvec(struct bio *bio, struct bio_vec *bv)
|
|
{
|
|
- *bv = bio_iovec(bio);
|
|
+ *bv = mp_bvec_iter_bvec(bio->bi_io_vec, bio->bi_iter);
|
|
}
|
|
|
|
static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv)
|
|
@@ -254,10 +251,9 @@ static inline void bio_get_last_bvec(struct bio *bio, struct bio_vec *bv)
|
|
struct bvec_iter iter = bio->bi_iter;
|
|
int idx;
|
|
|
|
- if (unlikely(!bio_multiple_segments(bio))) {
|
|
- *bv = bio_iovec(bio);
|
|
- return;
|
|
- }
|
|
+ bio_get_first_bvec(bio, bv);
|
|
+ if (bv->bv_len == bio->bi_iter.bi_size)
|
|
+ return; /* this bio only has a single bvec */
|
|
|
|
bio_advance_iter(bio, &iter, iter.bi_size);
|
|
|
|
diff --git a/include/linux/iio/common/cros_ec_sensors_core.h b/include/linux/iio/common/cros_ec_sensors_core.h
|
|
index bb331e6356a9c..a321531539dd1 100644
|
|
--- a/include/linux/iio/common/cros_ec_sensors_core.h
|
|
+++ b/include/linux/iio/common/cros_ec_sensors_core.h
|
|
@@ -68,7 +68,7 @@ struct cros_ec_sensors_core_state {
|
|
u16 scale;
|
|
} calib[CROS_EC_SENSOR_MAX_AXIS];
|
|
s8 sign[CROS_EC_SENSOR_MAX_AXIS];
|
|
- u8 samples[CROS_EC_SAMPLE_SIZE];
|
|
+ u8 samples[CROS_EC_SAMPLE_SIZE] __aligned(8);
|
|
|
|
int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
|
|
unsigned long scan_mask, s16 *data);
|
|
diff --git a/include/linux/prandom.h b/include/linux/prandom.h
|
|
index cc1e71334e53c..e20339c78a84c 100644
|
|
--- a/include/linux/prandom.h
|
|
+++ b/include/linux/prandom.h
|
|
@@ -93,7 +93,7 @@ static inline u32 __seed(u32 x, u32 m)
|
|
*/
|
|
static inline void prandom_seed_state(struct rnd_state *state, u64 seed)
|
|
{
|
|
- u32 i = (seed >> 32) ^ (seed << 10) ^ seed;
|
|
+ u32 i = ((seed >> 32) ^ (seed << 10) ^ seed) & 0xffffffffUL;
|
|
|
|
state->s1 = __seed(i, 2U);
|
|
state->s2 = __seed(i, 8U);
|
|
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
|
|
index 57ce5af258a3b..eede1a7c81955 100644
|
|
--- a/include/linux/tracepoint.h
|
|
+++ b/include/linux/tracepoint.h
|
|
@@ -40,7 +40,17 @@ extern int
|
|
tracepoint_probe_register_prio(struct tracepoint *tp, void *probe, void *data,
|
|
int prio);
|
|
extern int
|
|
+tracepoint_probe_register_prio_may_exist(struct tracepoint *tp, void *probe, void *data,
|
|
+ int prio);
|
|
+extern int
|
|
tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
|
|
+static inline int
|
|
+tracepoint_probe_register_may_exist(struct tracepoint *tp, void *probe,
|
|
+ void *data)
|
|
+{
|
|
+ return tracepoint_probe_register_prio_may_exist(tp, probe, data,
|
|
+ TRACEPOINT_DEFAULT_PRIO);
|
|
+}
|
|
extern void
|
|
for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
|
|
void *priv);
|
|
diff --git a/include/media/media-dev-allocator.h b/include/media/media-dev-allocator.h
|
|
index b35ea6062596b..2ab54d426c644 100644
|
|
--- a/include/media/media-dev-allocator.h
|
|
+++ b/include/media/media-dev-allocator.h
|
|
@@ -19,7 +19,7 @@
|
|
|
|
struct usb_device;
|
|
|
|
-#if defined(CONFIG_MEDIA_CONTROLLER) && defined(CONFIG_USB)
|
|
+#if defined(CONFIG_MEDIA_CONTROLLER) && IS_ENABLED(CONFIG_USB)
|
|
/**
|
|
* media_device_usb_allocate() - Allocate and return struct &media device
|
|
*
|
|
diff --git a/include/net/ip.h b/include/net/ip.h
|
|
index 0278d63c15274..52abfc00b5e3d 100644
|
|
--- a/include/net/ip.h
|
|
+++ b/include/net/ip.h
|
|
@@ -30,6 +30,7 @@
|
|
#include <net/flow.h>
|
|
#include <net/flow_dissector.h>
|
|
#include <net/netns/hash.h>
|
|
+#include <net/lwtunnel.h>
|
|
|
|
#define IPV4_MAX_PMTU 65535U /* RFC 2675, Section 5.1 */
|
|
#define IPV4_MIN_MTU 68 /* RFC 791 */
|
|
@@ -448,22 +449,25 @@ static inline unsigned int ip_dst_mtu_maybe_forward(const struct dst_entry *dst,
|
|
|
|
/* 'forwarding = true' case should always honour route mtu */
|
|
mtu = dst_metric_raw(dst, RTAX_MTU);
|
|
- if (mtu)
|
|
- return mtu;
|
|
+ if (!mtu)
|
|
+ mtu = min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
|
|
|
|
- return min(READ_ONCE(dst->dev->mtu), IP_MAX_MTU);
|
|
+ return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
|
|
}
|
|
|
|
static inline unsigned int ip_skb_dst_mtu(struct sock *sk,
|
|
const struct sk_buff *skb)
|
|
{
|
|
+ unsigned int mtu;
|
|
+
|
|
if (!sk || !sk_fullsock(sk) || ip_sk_use_pmtu(sk)) {
|
|
bool forwarding = IPCB(skb)->flags & IPSKB_FORWARDED;
|
|
|
|
return ip_dst_mtu_maybe_forward(skb_dst(skb), forwarding);
|
|
}
|
|
|
|
- return min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU);
|
|
+ mtu = min(READ_ONCE(skb_dst(skb)->dev->mtu), IP_MAX_MTU);
|
|
+ return mtu - lwtunnel_headroom(skb_dst(skb)->lwtstate, mtu);
|
|
}
|
|
|
|
struct dst_metrics *ip_fib_metrics_init(struct net *net, struct nlattr *fc_mx,
|
|
diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
|
|
index 2d0d91070268c..40602def3fe76 100644
|
|
--- a/include/net/ip6_route.h
|
|
+++ b/include/net/ip6_route.h
|
|
@@ -263,11 +263,18 @@ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
|
|
|
|
static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
|
|
{
|
|
+ int mtu;
|
|
+
|
|
struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ?
|
|
inet6_sk(skb->sk) : NULL;
|
|
|
|
- return (np && np->pmtudisc >= IPV6_PMTUDISC_PROBE) ?
|
|
- skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb));
|
|
+ if (np && np->pmtudisc >= IPV6_PMTUDISC_PROBE) {
|
|
+ mtu = READ_ONCE(skb_dst(skb)->dev->mtu);
|
|
+ mtu -= lwtunnel_headroom(skb_dst(skb)->lwtstate, mtu);
|
|
+ } else
|
|
+ mtu = dst_mtu(skb_dst(skb));
|
|
+
|
|
+ return mtu;
|
|
}
|
|
|
|
static inline bool ip6_sk_accept_pmtu(const struct sock *sk)
|
|
@@ -315,7 +322,7 @@ static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
|
|
if (dst_metric_locked(dst, RTAX_MTU)) {
|
|
mtu = dst_metric_raw(dst, RTAX_MTU);
|
|
if (mtu)
|
|
- return mtu;
|
|
+ goto out;
|
|
}
|
|
|
|
mtu = IPV6_MIN_MTU;
|
|
@@ -325,7 +332,8 @@ static inline unsigned int ip6_dst_mtu_forward(const struct dst_entry *dst)
|
|
mtu = idev->cnf.mtu6;
|
|
rcu_read_unlock();
|
|
|
|
- return mtu;
|
|
+out:
|
|
+ return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
|
|
}
|
|
|
|
u32 ip6_mtu_from_fib6(const struct fib6_result *res,
|
|
diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
|
|
index 0852f3e51360a..0cb0a4bcb5447 100644
|
|
--- a/include/net/sch_generic.h
|
|
+++ b/include/net/sch_generic.h
|
|
@@ -160,6 +160,12 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc)
|
|
if (spin_trylock(&qdisc->seqlock))
|
|
goto nolock_empty;
|
|
|
|
+ /* Paired with smp_mb__after_atomic() to make sure
|
|
+ * STATE_MISSED checking is synchronized with clearing
|
|
+ * in pfifo_fast_dequeue().
|
|
+ */
|
|
+ smp_mb__before_atomic();
|
|
+
|
|
/* If the MISSED flag is set, it means other thread has
|
|
* set the MISSED flag before second spin_trylock(), so
|
|
* we can return false here to avoid multi cpus doing
|
|
@@ -177,6 +183,12 @@ static inline bool qdisc_run_begin(struct Qdisc *qdisc)
|
|
*/
|
|
set_bit(__QDISC_STATE_MISSED, &qdisc->state);
|
|
|
|
+ /* spin_trylock() only has load-acquire semantic, so use
|
|
+ * smp_mb__after_atomic() to ensure STATE_MISSED is set
|
|
+ * before doing the second spin_trylock().
|
|
+ */
|
|
+ smp_mb__after_atomic();
|
|
+
|
|
/* Retry again in case other CPU may not see the new flag
|
|
* after it releases the lock at the end of qdisc_run_end().
|
|
*/
|
|
diff --git a/include/net/tc_act/tc_vlan.h b/include/net/tc_act/tc_vlan.h
|
|
index 4e2502408c316..add6fb50dd330 100644
|
|
--- a/include/net/tc_act/tc_vlan.h
|
|
+++ b/include/net/tc_act/tc_vlan.h
|
|
@@ -14,6 +14,7 @@ struct tcf_vlan_params {
|
|
u16 tcfv_push_vid;
|
|
__be16 tcfv_push_proto;
|
|
u8 tcfv_push_prio;
|
|
+ bool tcfv_push_prio_exists;
|
|
struct rcu_head rcu;
|
|
};
|
|
|
|
diff --git a/include/net/xfrm.h b/include/net/xfrm.h
|
|
index 614f19bbad74f..8ce63850d6d01 100644
|
|
--- a/include/net/xfrm.h
|
|
+++ b/include/net/xfrm.h
|
|
@@ -1543,6 +1543,7 @@ void xfrm_sad_getinfo(struct net *net, struct xfrmk_sadinfo *si);
|
|
void xfrm_spd_getinfo(struct net *net, struct xfrmk_spdinfo *si);
|
|
u32 xfrm_replay_seqhi(struct xfrm_state *x, __be32 net_seq);
|
|
int xfrm_init_replay(struct xfrm_state *x);
|
|
+u32 __xfrm_state_mtu(struct xfrm_state *x, int mtu);
|
|
u32 xfrm_state_mtu(struct xfrm_state *x, int mtu);
|
|
int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload);
|
|
int xfrm_init_state(struct xfrm_state *x);
|
|
diff --git a/kernel/kthread.c b/kernel/kthread.c
|
|
index 2eb8d7550324b..b2bac5d929d2b 100644
|
|
--- a/kernel/kthread.c
|
|
+++ b/kernel/kthread.c
|
|
@@ -1083,14 +1083,14 @@ static bool __kthread_cancel_work(struct kthread_work *work)
|
|
* modify @dwork's timer so that it expires after @delay. If @delay is zero,
|
|
* @work is guaranteed to be queued immediately.
|
|
*
|
|
- * Return: %true if @dwork was pending and its timer was modified,
|
|
- * %false otherwise.
|
|
+ * Return: %false if @dwork was idle and queued, %true otherwise.
|
|
*
|
|
* A special case is when the work is being canceled in parallel.
|
|
* It might be caused either by the real kthread_cancel_delayed_work_sync()
|
|
* or yet another kthread_mod_delayed_work() call. We let the other command
|
|
- * win and return %false here. The caller is supposed to synchronize these
|
|
- * operations a reasonable way.
|
|
+ * win and return %true here. The return value can be used for reference
|
|
+ * counting and the number of queued works stays the same. Anyway, the caller
|
|
+ * is supposed to synchronize these operations a reasonable way.
|
|
*
|
|
* This function is safe to call from any context including IRQ handler.
|
|
* See __kthread_cancel_work() and kthread_delayed_work_timer_fn()
|
|
@@ -1102,13 +1102,15 @@ bool kthread_mod_delayed_work(struct kthread_worker *worker,
|
|
{
|
|
struct kthread_work *work = &dwork->work;
|
|
unsigned long flags;
|
|
- int ret = false;
|
|
+ int ret;
|
|
|
|
raw_spin_lock_irqsave(&worker->lock, flags);
|
|
|
|
/* Do not bother with canceling when never queued. */
|
|
- if (!work->worker)
|
|
+ if (!work->worker) {
|
|
+ ret = false;
|
|
goto fast_queue;
|
|
+ }
|
|
|
|
/* Work must not be used with >1 worker, see kthread_queue_work() */
|
|
WARN_ON_ONCE(work->worker != worker);
|
|
@@ -1126,8 +1128,11 @@ bool kthread_mod_delayed_work(struct kthread_worker *worker,
|
|
* be used for reference counting.
|
|
*/
|
|
kthread_cancel_delayed_work_timer(work, &flags);
|
|
- if (work->canceling)
|
|
+ if (work->canceling) {
|
|
+ /* The number of works in the queue does not change. */
|
|
+ ret = true;
|
|
goto out;
|
|
+ }
|
|
ret = __kthread_cancel_work(work);
|
|
|
|
fast_queue:
|
|
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
|
|
index 7429f15717559..3ec8fd2e80e53 100644
|
|
--- a/kernel/locking/lockdep.c
|
|
+++ b/kernel/locking/lockdep.c
|
|
@@ -1941,7 +1941,56 @@ static void print_lock_class_header(struct lock_class *class, int depth)
|
|
}
|
|
|
|
/*
|
|
- * printk the shortest lock dependencies from @start to @end in reverse order:
|
|
+ * Dependency path printing:
|
|
+ *
|
|
+ * After BFS we get a lock dependency path (linked via ->parent of lock_list),
|
|
+ * printing out each lock in the dependency path will help on understanding how
|
|
+ * the deadlock could happen. Here are some details about dependency path
|
|
+ * printing:
|
|
+ *
|
|
+ * 1) A lock_list can be either forwards or backwards for a lock dependency,
|
|
+ * for a lock dependency A -> B, there are two lock_lists:
|
|
+ *
|
|
+ * a) lock_list in the ->locks_after list of A, whose ->class is B and
|
|
+ * ->links_to is A. In this case, we can say the lock_list is
|
|
+ * "A -> B" (forwards case).
|
|
+ *
|
|
+ * b) lock_list in the ->locks_before list of B, whose ->class is A
|
|
+ * and ->links_to is B. In this case, we can say the lock_list is
|
|
+ * "B <- A" (bacwards case).
|
|
+ *
|
|
+ * The ->trace of both a) and b) point to the call trace where B was
|
|
+ * acquired with A held.
|
|
+ *
|
|
+ * 2) A "helper" lock_list is introduced during BFS, this lock_list doesn't
|
|
+ * represent a certain lock dependency, it only provides an initial entry
|
|
+ * for BFS. For example, BFS may introduce a "helper" lock_list whose
|
|
+ * ->class is A, as a result BFS will search all dependencies starting with
|
|
+ * A, e.g. A -> B or A -> C.
|
|
+ *
|
|
+ * The notation of a forwards helper lock_list is like "-> A", which means
|
|
+ * we should search the forwards dependencies starting with "A", e.g A -> B
|
|
+ * or A -> C.
|
|
+ *
|
|
+ * The notation of a bacwards helper lock_list is like "<- B", which means
|
|
+ * we should search the backwards dependencies ending with "B", e.g.
|
|
+ * B <- A or B <- C.
|
|
+ */
|
|
+
|
|
+/*
|
|
+ * printk the shortest lock dependencies from @root to @leaf in reverse order.
|
|
+ *
|
|
+ * We have a lock dependency path as follow:
|
|
+ *
|
|
+ * @root @leaf
|
|
+ * | |
|
|
+ * V V
|
|
+ * ->parent ->parent
|
|
+ * | lock_list | <--------- | lock_list | ... | lock_list | <--------- | lock_list |
|
|
+ * | -> L1 | | L1 -> L2 | ... |Ln-2 -> Ln-1| | Ln-1 -> Ln|
|
|
+ *
|
|
+ * , so it's natural that we start from @leaf and print every ->class and
|
|
+ * ->trace until we reach the @root.
|
|
*/
|
|
static void __used
|
|
print_shortest_lock_dependencies(struct lock_list *leaf,
|
|
@@ -1969,6 +2018,61 @@ print_shortest_lock_dependencies(struct lock_list *leaf,
|
|
} while (entry && (depth >= 0));
|
|
}
|
|
|
|
+/*
|
|
+ * printk the shortest lock dependencies from @leaf to @root.
|
|
+ *
|
|
+ * We have a lock dependency path (from a backwards search) as follow:
|
|
+ *
|
|
+ * @leaf @root
|
|
+ * | |
|
|
+ * V V
|
|
+ * ->parent ->parent
|
|
+ * | lock_list | ---------> | lock_list | ... | lock_list | ---------> | lock_list |
|
|
+ * | L2 <- L1 | | L3 <- L2 | ... | Ln <- Ln-1 | | <- Ln |
|
|
+ *
|
|
+ * , so when we iterate from @leaf to @root, we actually print the lock
|
|
+ * dependency path L1 -> L2 -> .. -> Ln in the non-reverse order.
|
|
+ *
|
|
+ * Another thing to notice here is that ->class of L2 <- L1 is L1, while the
|
|
+ * ->trace of L2 <- L1 is the call trace of L2, in fact we don't have the call
|
|
+ * trace of L1 in the dependency path, which is alright, because most of the
|
|
+ * time we can figure out where L1 is held from the call trace of L2.
|
|
+ */
|
|
+static void __used
|
|
+print_shortest_lock_dependencies_backwards(struct lock_list *leaf,
|
|
+ struct lock_list *root)
|
|
+{
|
|
+ struct lock_list *entry = leaf;
|
|
+ const struct lock_trace *trace = NULL;
|
|
+ int depth;
|
|
+
|
|
+ /*compute depth from generated tree by BFS*/
|
|
+ depth = get_lock_depth(leaf);
|
|
+
|
|
+ do {
|
|
+ print_lock_class_header(entry->class, depth);
|
|
+ if (trace) {
|
|
+ printk("%*s ... acquired at:\n", depth, "");
|
|
+ print_lock_trace(trace, 2);
|
|
+ printk("\n");
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * Record the pointer to the trace for the next lock_list
|
|
+ * entry, see the comments for the function.
|
|
+ */
|
|
+ trace = entry->trace;
|
|
+
|
|
+ if (depth == 0 && (entry != root)) {
|
|
+ printk("lockdep:%s bad path found in chain graph\n", __func__);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ entry = get_lock_parent(entry);
|
|
+ depth--;
|
|
+ } while (entry && (depth >= 0));
|
|
+}
|
|
+
|
|
static void
|
|
print_irq_lock_scenario(struct lock_list *safe_entry,
|
|
struct lock_list *unsafe_entry,
|
|
@@ -2086,7 +2190,7 @@ print_bad_irq_dependency(struct task_struct *curr,
|
|
prev_root->trace = save_trace();
|
|
if (!prev_root->trace)
|
|
return;
|
|
- print_shortest_lock_dependencies(backwards_entry, prev_root);
|
|
+ print_shortest_lock_dependencies_backwards(backwards_entry, prev_root);
|
|
|
|
pr_warn("\nthe dependencies between the lock to be acquired");
|
|
pr_warn(" and %s-irq-unsafe lock:\n", irqclass);
|
|
@@ -2273,8 +2377,18 @@ static int check_irq_usage(struct task_struct *curr, struct held_lock *prev,
|
|
* Step 3: we found a bad match! Now retrieve a lock from the backward
|
|
* list whose usage mask matches the exclusive usage mask from the
|
|
* lock found on the forward list.
|
|
+ *
|
|
+ * Note, we should only keep the LOCKF_ENABLED_IRQ_ALL bits, considering
|
|
+ * the follow case:
|
|
+ *
|
|
+ * When trying to add A -> B to the graph, we find that there is a
|
|
+ * hardirq-safe L, that L -> ... -> A, and another hardirq-unsafe M,
|
|
+ * that B -> ... -> M. However M is **softirq-safe**, if we use exact
|
|
+ * invert bits of M's usage_mask, we will find another lock N that is
|
|
+ * **softirq-unsafe** and N -> ... -> A, however N -> .. -> M will not
|
|
+ * cause a inversion deadlock.
|
|
*/
|
|
- backward_mask = original_mask(target_entry1->class->usage_mask);
|
|
+ backward_mask = original_mask(target_entry1->class->usage_mask & LOCKF_ENABLED_IRQ_ALL);
|
|
|
|
ret = find_usage_backwards(&this, backward_mask, &target_entry);
|
|
if (ret < 0) {
|
|
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
|
|
index 4dfa9dd47223a..fd37827eca5b0 100644
|
|
--- a/kernel/rcu/tree.c
|
|
+++ b/kernel/rcu/tree.c
|
|
@@ -2498,7 +2498,6 @@ static int __init rcu_spawn_core_kthreads(void)
|
|
"%s: Could not start rcuc kthread, OOM is now expected behavior\n", __func__);
|
|
return 0;
|
|
}
|
|
-early_initcall(rcu_spawn_core_kthreads);
|
|
|
|
/*
|
|
* Handle any core-RCU processing required by a call_rcu() invocation.
|
|
@@ -3315,6 +3314,7 @@ static int __init rcu_spawn_gp_kthread(void)
|
|
wake_up_process(t);
|
|
rcu_spawn_nocb_kthreads();
|
|
rcu_spawn_boost_kthreads();
|
|
+ rcu_spawn_core_kthreads();
|
|
return 0;
|
|
}
|
|
early_initcall(rcu_spawn_gp_kthread);
|
|
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
|
|
index a3e95d7779e15..8294debf68c4d 100644
|
|
--- a/kernel/sched/core.c
|
|
+++ b/kernel/sched/core.c
|
|
@@ -894,9 +894,10 @@ unsigned int uclamp_rq_max_value(struct rq *rq, enum uclamp_id clamp_id,
|
|
static inline struct uclamp_se
|
|
uclamp_tg_restrict(struct task_struct *p, enum uclamp_id clamp_id)
|
|
{
|
|
+ /* Copy by value as we could modify it */
|
|
struct uclamp_se uc_req = p->uclamp_req[clamp_id];
|
|
#ifdef CONFIG_UCLAMP_TASK_GROUP
|
|
- struct uclamp_se uc_max;
|
|
+ unsigned int tg_min, tg_max, value;
|
|
|
|
/*
|
|
* Tasks in autogroups or root task group will be
|
|
@@ -907,9 +908,11 @@ uclamp_tg_restrict(struct task_struct *p, enum uclamp_id clamp_id)
|
|
if (task_group(p) == &root_task_group)
|
|
return uc_req;
|
|
|
|
- uc_max = task_group(p)->uclamp[clamp_id];
|
|
- if (uc_req.value > uc_max.value || !uc_req.user_defined)
|
|
- return uc_max;
|
|
+ tg_min = task_group(p)->uclamp[UCLAMP_MIN].value;
|
|
+ tg_max = task_group(p)->uclamp[UCLAMP_MAX].value;
|
|
+ value = uc_req.value;
|
|
+ value = clamp(value, tg_min, tg_max);
|
|
+ uclamp_se_set(&uc_req, value, false);
|
|
#endif
|
|
|
|
return uc_req;
|
|
@@ -1108,8 +1111,9 @@ static inline void uclamp_rq_dec(struct rq *rq, struct task_struct *p)
|
|
}
|
|
|
|
static inline void
|
|
-uclamp_update_active(struct task_struct *p, enum uclamp_id clamp_id)
|
|
+uclamp_update_active(struct task_struct *p)
|
|
{
|
|
+ enum uclamp_id clamp_id;
|
|
struct rq_flags rf;
|
|
struct rq *rq;
|
|
|
|
@@ -1129,9 +1133,11 @@ uclamp_update_active(struct task_struct *p, enum uclamp_id clamp_id)
|
|
* affecting a valid clamp bucket, the next time it's enqueued,
|
|
* it will already see the updated clamp bucket value.
|
|
*/
|
|
- if (p->uclamp[clamp_id].active) {
|
|
- uclamp_rq_dec_id(rq, p, clamp_id);
|
|
- uclamp_rq_inc_id(rq, p, clamp_id);
|
|
+ for_each_clamp_id(clamp_id) {
|
|
+ if (p->uclamp[clamp_id].active) {
|
|
+ uclamp_rq_dec_id(rq, p, clamp_id);
|
|
+ uclamp_rq_inc_id(rq, p, clamp_id);
|
|
+ }
|
|
}
|
|
|
|
task_rq_unlock(rq, p, &rf);
|
|
@@ -1139,20 +1145,14 @@ uclamp_update_active(struct task_struct *p, enum uclamp_id clamp_id)
|
|
|
|
#ifdef CONFIG_UCLAMP_TASK_GROUP
|
|
static inline void
|
|
-uclamp_update_active_tasks(struct cgroup_subsys_state *css,
|
|
- unsigned int clamps)
|
|
+uclamp_update_active_tasks(struct cgroup_subsys_state *css)
|
|
{
|
|
- enum uclamp_id clamp_id;
|
|
struct css_task_iter it;
|
|
struct task_struct *p;
|
|
|
|
css_task_iter_start(css, 0, &it);
|
|
- while ((p = css_task_iter_next(&it))) {
|
|
- for_each_clamp_id(clamp_id) {
|
|
- if ((0x1 << clamp_id) & clamps)
|
|
- uclamp_update_active(p, clamp_id);
|
|
- }
|
|
- }
|
|
+ while ((p = css_task_iter_next(&it)))
|
|
+ uclamp_update_active(p);
|
|
css_task_iter_end(&it);
|
|
}
|
|
|
|
@@ -7186,7 +7186,11 @@ static int cpu_cgroup_css_online(struct cgroup_subsys_state *css)
|
|
|
|
#ifdef CONFIG_UCLAMP_TASK_GROUP
|
|
/* Propagate the effective uclamp value for the new group */
|
|
+ mutex_lock(&uclamp_mutex);
|
|
+ rcu_read_lock();
|
|
cpu_util_update_eff(css);
|
|
+ rcu_read_unlock();
|
|
+ mutex_unlock(&uclamp_mutex);
|
|
#endif
|
|
|
|
return 0;
|
|
@@ -7276,6 +7280,9 @@ static void cpu_util_update_eff(struct cgroup_subsys_state *css)
|
|
enum uclamp_id clamp_id;
|
|
unsigned int clamps;
|
|
|
|
+ lockdep_assert_held(&uclamp_mutex);
|
|
+ SCHED_WARN_ON(!rcu_read_lock_held());
|
|
+
|
|
css_for_each_descendant_pre(css, top_css) {
|
|
uc_parent = css_tg(css)->parent
|
|
? css_tg(css)->parent->uclamp : NULL;
|
|
@@ -7308,7 +7315,7 @@ static void cpu_util_update_eff(struct cgroup_subsys_state *css)
|
|
}
|
|
|
|
/* Immediately update descendants RUNNABLE tasks */
|
|
- uclamp_update_active_tasks(css, clamps);
|
|
+ uclamp_update_active_tasks(css);
|
|
}
|
|
}
|
|
|
|
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c
|
|
index 4ce8c11e5e4ae..3cf776d5bce8f 100644
|
|
--- a/kernel/sched/deadline.c
|
|
+++ b/kernel/sched/deadline.c
|
|
@@ -2392,6 +2392,8 @@ static void switched_to_dl(struct rq *rq, struct task_struct *p)
|
|
check_preempt_curr_dl(rq, p, 0);
|
|
else
|
|
resched_curr(rq);
|
|
+ } else {
|
|
+ update_dl_rq_load_avg(rq_clock_pelt(rq), rq, 0);
|
|
}
|
|
}
|
|
|
|
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
|
|
index d3f4113e87ded..d2ba080ea7425 100644
|
|
--- a/kernel/sched/fair.c
|
|
+++ b/kernel/sched/fair.c
|
|
@@ -2927,7 +2927,7 @@ void reweight_task(struct task_struct *p, int prio)
|
|
*
|
|
* tg->weight * grq->load.weight
|
|
* ge->load.weight = ----------------------------- (1)
|
|
- * \Sum grq->load.weight
|
|
+ * \Sum grq->load.weight
|
|
*
|
|
* Now, because computing that sum is prohibitively expensive to compute (been
|
|
* there, done that) we approximate it with this average stuff. The average
|
|
@@ -2941,7 +2941,7 @@ void reweight_task(struct task_struct *p, int prio)
|
|
*
|
|
* tg->weight * grq->avg.load_avg
|
|
* ge->load.weight = ------------------------------ (3)
|
|
- * tg->load_avg
|
|
+ * tg->load_avg
|
|
*
|
|
* Where: tg->load_avg ~= \Sum grq->avg.load_avg
|
|
*
|
|
@@ -2957,7 +2957,7 @@ void reweight_task(struct task_struct *p, int prio)
|
|
*
|
|
* tg->weight * grq->load.weight
|
|
* ge->load.weight = ----------------------------- = tg->weight (4)
|
|
- * grp->load.weight
|
|
+ * grp->load.weight
|
|
*
|
|
* That is, the sum collapses because all other CPUs are idle; the UP scenario.
|
|
*
|
|
@@ -2976,7 +2976,7 @@ void reweight_task(struct task_struct *p, int prio)
|
|
*
|
|
* tg->weight * grq->load.weight
|
|
* ge->load.weight = ----------------------------- (6)
|
|
- * tg_load_avg'
|
|
+ * tg_load_avg'
|
|
*
|
|
* Where:
|
|
*
|
|
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c
|
|
index 5b04bba4500db..2dffb8762e16b 100644
|
|
--- a/kernel/sched/rt.c
|
|
+++ b/kernel/sched/rt.c
|
|
@@ -2221,13 +2221,20 @@ void __init init_sched_rt_class(void)
|
|
static void switched_to_rt(struct rq *rq, struct task_struct *p)
|
|
{
|
|
/*
|
|
- * If we are already running, then there's nothing
|
|
- * that needs to be done. But if we are not running
|
|
- * we may need to preempt the current running task.
|
|
- * If that current running task is also an RT task
|
|
+ * If we are running, update the avg_rt tracking, as the running time
|
|
+ * will now on be accounted into the latter.
|
|
+ */
|
|
+ if (task_current(rq, p)) {
|
|
+ update_rt_rq_load_avg(rq_clock_pelt(rq), rq, 0);
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ /*
|
|
+ * If we are not running we may need to preempt the current
|
|
+ * running task. If that current running task is also an RT task
|
|
* then see if we can move to another run queue.
|
|
*/
|
|
- if (task_on_rq_queued(p) && rq->curr != p) {
|
|
+ if (task_on_rq_queued(p)) {
|
|
#ifdef CONFIG_SMP
|
|
if (p->nr_cpus_allowed > 1 && rq->rt.overloaded)
|
|
rt_queue_push_tasks(rq);
|
|
diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c
|
|
index 428beb69426a8..6863a054c9701 100644
|
|
--- a/kernel/time/clocksource.c
|
|
+++ b/kernel/time/clocksource.c
|
|
@@ -124,6 +124,13 @@ static void __clocksource_change_rating(struct clocksource *cs, int rating);
|
|
#define WATCHDOG_INTERVAL (HZ >> 1)
|
|
#define WATCHDOG_THRESHOLD (NSEC_PER_SEC >> 4)
|
|
|
|
+/*
|
|
+ * Maximum permissible delay between two readouts of the watchdog
|
|
+ * clocksource surrounding a read of the clocksource being validated.
|
|
+ * This delay could be due to SMIs, NMIs, or to VCPU preemptions.
|
|
+ */
|
|
+#define WATCHDOG_MAX_SKEW (100 * NSEC_PER_USEC)
|
|
+
|
|
static void clocksource_watchdog_work(struct work_struct *work)
|
|
{
|
|
/*
|
|
@@ -184,12 +191,45 @@ void clocksource_mark_unstable(struct clocksource *cs)
|
|
spin_unlock_irqrestore(&watchdog_lock, flags);
|
|
}
|
|
|
|
+static ulong max_cswd_read_retries = 3;
|
|
+module_param(max_cswd_read_retries, ulong, 0644);
|
|
+
|
|
+static bool cs_watchdog_read(struct clocksource *cs, u64 *csnow, u64 *wdnow)
|
|
+{
|
|
+ unsigned int nretries;
|
|
+ u64 wd_end, wd_delta;
|
|
+ int64_t wd_delay;
|
|
+
|
|
+ for (nretries = 0; nretries <= max_cswd_read_retries; nretries++) {
|
|
+ local_irq_disable();
|
|
+ *wdnow = watchdog->read(watchdog);
|
|
+ *csnow = cs->read(cs);
|
|
+ wd_end = watchdog->read(watchdog);
|
|
+ local_irq_enable();
|
|
+
|
|
+ wd_delta = clocksource_delta(wd_end, *wdnow, watchdog->mask);
|
|
+ wd_delay = clocksource_cyc2ns(wd_delta, watchdog->mult,
|
|
+ watchdog->shift);
|
|
+ if (wd_delay <= WATCHDOG_MAX_SKEW) {
|
|
+ if (nretries > 1 || nretries >= max_cswd_read_retries) {
|
|
+ pr_warn("timekeeping watchdog on CPU%d: %s retried %d times before success\n",
|
|
+ smp_processor_id(), watchdog->name, nretries);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ pr_warn("timekeeping watchdog on CPU%d: %s read-back delay of %lldns, attempt %d, marking unstable\n",
|
|
+ smp_processor_id(), watchdog->name, wd_delay, nretries);
|
|
+ return false;
|
|
+}
|
|
+
|
|
static void clocksource_watchdog(struct timer_list *unused)
|
|
{
|
|
- struct clocksource *cs;
|
|
u64 csnow, wdnow, cslast, wdlast, delta;
|
|
- int64_t wd_nsec, cs_nsec;
|
|
int next_cpu, reset_pending;
|
|
+ int64_t wd_nsec, cs_nsec;
|
|
+ struct clocksource *cs;
|
|
|
|
spin_lock(&watchdog_lock);
|
|
if (!watchdog_running)
|
|
@@ -206,10 +246,11 @@ static void clocksource_watchdog(struct timer_list *unused)
|
|
continue;
|
|
}
|
|
|
|
- local_irq_disable();
|
|
- csnow = cs->read(cs);
|
|
- wdnow = watchdog->read(watchdog);
|
|
- local_irq_enable();
|
|
+ if (!cs_watchdog_read(cs, &csnow, &wdnow)) {
|
|
+ /* Clock readout unreliable, so give it up. */
|
|
+ __clocksource_unstable(cs);
|
|
+ continue;
|
|
+ }
|
|
|
|
/* Clocksource initialized ? */
|
|
if (!(cs->flags & CLOCK_SOURCE_WATCHDOG) ||
|
|
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
|
|
index 74c1db7178cff..4d9f818029112 100644
|
|
--- a/kernel/trace/bpf_trace.c
|
|
+++ b/kernel/trace/bpf_trace.c
|
|
@@ -1397,7 +1397,8 @@ static int __bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *
|
|
if (prog->aux->max_tp_access > btp->writable_size)
|
|
return -EINVAL;
|
|
|
|
- return tracepoint_probe_register(tp, (void *)btp->bpf_func, prog);
|
|
+ return tracepoint_probe_register_may_exist(tp, (void *)btp->bpf_func,
|
|
+ prog);
|
|
}
|
|
|
|
int bpf_probe_register(struct bpf_raw_event_map *btp, struct bpf_prog *prog)
|
|
diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
|
|
index a616b314fb7ab..b05376a01091d 100644
|
|
--- a/kernel/trace/trace_events_hist.c
|
|
+++ b/kernel/trace/trace_events_hist.c
|
|
@@ -2437,6 +2437,13 @@ static int contains_operator(char *str)
|
|
|
|
switch (*op) {
|
|
case '-':
|
|
+ /*
|
|
+ * Unfortunately, the modifier ".sym-offset"
|
|
+ * can confuse things.
|
|
+ */
|
|
+ if (op - str >= 4 && !strncmp(op - 4, ".sym-offset", 11))
|
|
+ return FIELD_OP_NONE;
|
|
+
|
|
if (*str == '-')
|
|
field_op = FIELD_OP_UNARY_MINUS;
|
|
else
|
|
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
|
|
index be51df4508cbe..5d87b21ba1301 100644
|
|
--- a/kernel/tracepoint.c
|
|
+++ b/kernel/tracepoint.c
|
|
@@ -271,7 +271,8 @@ static void *func_remove(struct tracepoint_func **funcs,
|
|
* Add the probe function to a tracepoint.
|
|
*/
|
|
static int tracepoint_add_func(struct tracepoint *tp,
|
|
- struct tracepoint_func *func, int prio)
|
|
+ struct tracepoint_func *func, int prio,
|
|
+ bool warn)
|
|
{
|
|
struct tracepoint_func *old, *tp_funcs;
|
|
int ret;
|
|
@@ -286,7 +287,7 @@ static int tracepoint_add_func(struct tracepoint *tp,
|
|
lockdep_is_held(&tracepoints_mutex));
|
|
old = func_add(&tp_funcs, func, prio);
|
|
if (IS_ERR(old)) {
|
|
- WARN_ON_ONCE(PTR_ERR(old) != -ENOMEM);
|
|
+ WARN_ON_ONCE(warn && PTR_ERR(old) != -ENOMEM);
|
|
return PTR_ERR(old);
|
|
}
|
|
|
|
@@ -337,6 +338,32 @@ static int tracepoint_remove_func(struct tracepoint *tp,
|
|
return 0;
|
|
}
|
|
|
|
+/**
|
|
+ * tracepoint_probe_register_prio_may_exist - Connect a probe to a tracepoint with priority
|
|
+ * @tp: tracepoint
|
|
+ * @probe: probe handler
|
|
+ * @data: tracepoint data
|
|
+ * @prio: priority of this function over other registered functions
|
|
+ *
|
|
+ * Same as tracepoint_probe_register_prio() except that it will not warn
|
|
+ * if the tracepoint is already registered.
|
|
+ */
|
|
+int tracepoint_probe_register_prio_may_exist(struct tracepoint *tp, void *probe,
|
|
+ void *data, int prio)
|
|
+{
|
|
+ struct tracepoint_func tp_func;
|
|
+ int ret;
|
|
+
|
|
+ mutex_lock(&tracepoints_mutex);
|
|
+ tp_func.func = probe;
|
|
+ tp_func.data = data;
|
|
+ tp_func.prio = prio;
|
|
+ ret = tracepoint_add_func(tp, &tp_func, prio, false);
|
|
+ mutex_unlock(&tracepoints_mutex);
|
|
+ return ret;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(tracepoint_probe_register_prio_may_exist);
|
|
+
|
|
/**
|
|
* tracepoint_probe_register_prio - Connect a probe to a tracepoint with priority
|
|
* @tp: tracepoint
|
|
@@ -360,7 +387,7 @@ int tracepoint_probe_register_prio(struct tracepoint *tp, void *probe,
|
|
tp_func.func = probe;
|
|
tp_func.data = data;
|
|
tp_func.prio = prio;
|
|
- ret = tracepoint_add_func(tp, &tp_func, prio);
|
|
+ ret = tracepoint_add_func(tp, &tp_func, prio, true);
|
|
mutex_unlock(&tracepoints_mutex);
|
|
return ret;
|
|
}
|
|
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
|
|
index 9ea6f7bb83095..41b06af195368 100644
|
|
--- a/lib/iov_iter.c
|
|
+++ b/lib/iov_iter.c
|
|
@@ -422,7 +422,7 @@ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
|
|
int err;
|
|
struct iovec v;
|
|
|
|
- if (!(i->type & (ITER_BVEC|ITER_KVEC))) {
|
|
+ if (iter_is_iovec(i)) {
|
|
iterate_iovec(i, bytes, v, iov, skip, ({
|
|
err = fault_in_pages_readable(v.iov_base, v.iov_len);
|
|
if (unlikely(err))
|
|
@@ -896,9 +896,12 @@ size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes,
|
|
size_t wanted = copy_to_iter(kaddr + offset, bytes, i);
|
|
kunmap_atomic(kaddr);
|
|
return wanted;
|
|
- } else if (unlikely(iov_iter_is_discard(i)))
|
|
+ } else if (unlikely(iov_iter_is_discard(i))) {
|
|
+ if (unlikely(i->count < bytes))
|
|
+ bytes = i->count;
|
|
+ i->count -= bytes;
|
|
return bytes;
|
|
- else if (likely(!iov_iter_is_pipe(i)))
|
|
+ } else if (likely(!iov_iter_is_pipe(i)))
|
|
return copy_page_to_iter_iovec(page, offset, bytes, i);
|
|
else
|
|
return copy_page_to_iter_pipe(page, offset, bytes, i);
|
|
diff --git a/lib/kstrtox.c b/lib/kstrtox.c
|
|
index 1006bf70bf74c..95c7234ad4677 100644
|
|
--- a/lib/kstrtox.c
|
|
+++ b/lib/kstrtox.c
|
|
@@ -39,20 +39,22 @@ const char *_parse_integer_fixup_radix(const char *s, unsigned int *base)
|
|
|
|
/*
|
|
* Convert non-negative integer string representation in explicitly given radix
|
|
- * to an integer.
|
|
+ * to an integer. A maximum of max_chars characters will be converted.
|
|
+ *
|
|
* Return number of characters consumed maybe or-ed with overflow bit.
|
|
* If overflow occurs, result integer (incorrect) is still returned.
|
|
*
|
|
* Don't you dare use this function.
|
|
*/
|
|
-unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p)
|
|
+unsigned int _parse_integer_limit(const char *s, unsigned int base, unsigned long long *p,
|
|
+ size_t max_chars)
|
|
{
|
|
unsigned long long res;
|
|
unsigned int rv;
|
|
|
|
res = 0;
|
|
rv = 0;
|
|
- while (1) {
|
|
+ while (max_chars--) {
|
|
unsigned int c = *s;
|
|
unsigned int lc = c | 0x20; /* don't tolower() this line */
|
|
unsigned int val;
|
|
@@ -82,6 +84,11 @@ unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long
|
|
return rv;
|
|
}
|
|
|
|
+unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *p)
|
|
+{
|
|
+ return _parse_integer_limit(s, base, p, INT_MAX);
|
|
+}
|
|
+
|
|
static int _kstrtoull(const char *s, unsigned int base, unsigned long long *res)
|
|
{
|
|
unsigned long long _res;
|
|
diff --git a/lib/kstrtox.h b/lib/kstrtox.h
|
|
index 3b4637bcd2540..158c400ca8658 100644
|
|
--- a/lib/kstrtox.h
|
|
+++ b/lib/kstrtox.h
|
|
@@ -4,6 +4,8 @@
|
|
|
|
#define KSTRTOX_OVERFLOW (1U << 31)
|
|
const char *_parse_integer_fixup_radix(const char *s, unsigned int *base);
|
|
+unsigned int _parse_integer_limit(const char *s, unsigned int base, unsigned long long *res,
|
|
+ size_t max_chars);
|
|
unsigned int _parse_integer(const char *s, unsigned int base, unsigned long long *res);
|
|
|
|
#endif
|
|
diff --git a/lib/seq_buf.c b/lib/seq_buf.c
|
|
index bd807f545a9d7..b15dbb6f061a5 100644
|
|
--- a/lib/seq_buf.c
|
|
+++ b/lib/seq_buf.c
|
|
@@ -242,12 +242,14 @@ int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
|
|
break;
|
|
|
|
/* j increments twice per loop */
|
|
- len -= j / 2;
|
|
hex[j++] = ' ';
|
|
|
|
seq_buf_putmem(s, hex, j);
|
|
if (seq_buf_has_overflowed(s))
|
|
return -1;
|
|
+
|
|
+ len -= start_len;
|
|
+ data += start_len;
|
|
}
|
|
return 0;
|
|
}
|
|
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
|
|
index fb4af73142b42..2766d1b2c301d 100644
|
|
--- a/lib/vsprintf.c
|
|
+++ b/lib/vsprintf.c
|
|
@@ -50,6 +50,31 @@
|
|
#include <linux/string_helpers.h>
|
|
#include "kstrtox.h"
|
|
|
|
+static unsigned long long simple_strntoull(const char *startp, size_t max_chars,
|
|
+ char **endp, unsigned int base)
|
|
+{
|
|
+ const char *cp;
|
|
+ unsigned long long result = 0ULL;
|
|
+ size_t prefix_chars;
|
|
+ unsigned int rv;
|
|
+
|
|
+ cp = _parse_integer_fixup_radix(startp, &base);
|
|
+ prefix_chars = cp - startp;
|
|
+ if (prefix_chars < max_chars) {
|
|
+ rv = _parse_integer_limit(cp, base, &result, max_chars - prefix_chars);
|
|
+ /* FIXME */
|
|
+ cp += (rv & ~KSTRTOX_OVERFLOW);
|
|
+ } else {
|
|
+ /* Field too short for prefix + digit, skip over without converting */
|
|
+ cp = startp + max_chars;
|
|
+ }
|
|
+
|
|
+ if (endp)
|
|
+ *endp = (char *)cp;
|
|
+
|
|
+ return result;
|
|
+}
|
|
+
|
|
/**
|
|
* simple_strtoull - convert a string to an unsigned long long
|
|
* @cp: The start of the string
|
|
@@ -60,18 +85,7 @@
|
|
*/
|
|
unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
|
|
{
|
|
- unsigned long long result;
|
|
- unsigned int rv;
|
|
-
|
|
- cp = _parse_integer_fixup_radix(cp, &base);
|
|
- rv = _parse_integer(cp, base, &result);
|
|
- /* FIXME */
|
|
- cp += (rv & ~KSTRTOX_OVERFLOW);
|
|
-
|
|
- if (endp)
|
|
- *endp = (char *)cp;
|
|
-
|
|
- return result;
|
|
+ return simple_strntoull(cp, INT_MAX, endp, base);
|
|
}
|
|
EXPORT_SYMBOL(simple_strtoull);
|
|
|
|
@@ -106,6 +120,21 @@ long simple_strtol(const char *cp, char **endp, unsigned int base)
|
|
}
|
|
EXPORT_SYMBOL(simple_strtol);
|
|
|
|
+static long long simple_strntoll(const char *cp, size_t max_chars, char **endp,
|
|
+ unsigned int base)
|
|
+{
|
|
+ /*
|
|
+ * simple_strntoull() safely handles receiving max_chars==0 in the
|
|
+ * case cp[0] == '-' && max_chars == 1.
|
|
+ * If max_chars == 0 we can drop through and pass it to simple_strntoull()
|
|
+ * and the content of *cp is irrelevant.
|
|
+ */
|
|
+ if (*cp == '-' && max_chars > 0)
|
|
+ return -simple_strntoull(cp + 1, max_chars - 1, endp, base);
|
|
+
|
|
+ return simple_strntoull(cp, max_chars, endp, base);
|
|
+}
|
|
+
|
|
/**
|
|
* simple_strtoll - convert a string to a signed long long
|
|
* @cp: The start of the string
|
|
@@ -116,10 +145,7 @@ EXPORT_SYMBOL(simple_strtol);
|
|
*/
|
|
long long simple_strtoll(const char *cp, char **endp, unsigned int base)
|
|
{
|
|
- if (*cp == '-')
|
|
- return -simple_strtoull(cp + 1, endp, base);
|
|
-
|
|
- return simple_strtoull(cp, endp, base);
|
|
+ return simple_strntoll(cp, INT_MAX, endp, base);
|
|
}
|
|
EXPORT_SYMBOL(simple_strtoll);
|
|
|
|
@@ -3343,25 +3369,13 @@ int vsscanf(const char *buf, const char *fmt, va_list args)
|
|
break;
|
|
|
|
if (is_sign)
|
|
- val.s = qualifier != 'L' ?
|
|
- simple_strtol(str, &next, base) :
|
|
- simple_strtoll(str, &next, base);
|
|
+ val.s = simple_strntoll(str,
|
|
+ field_width >= 0 ? field_width : INT_MAX,
|
|
+ &next, base);
|
|
else
|
|
- val.u = qualifier != 'L' ?
|
|
- simple_strtoul(str, &next, base) :
|
|
- simple_strtoull(str, &next, base);
|
|
-
|
|
- if (field_width > 0 && next - str > field_width) {
|
|
- if (base == 0)
|
|
- _parse_integer_fixup_radix(str, &base);
|
|
- while (next - str > field_width) {
|
|
- if (is_sign)
|
|
- val.s = div_s64(val.s, base);
|
|
- else
|
|
- val.u = div_u64(val.u, base);
|
|
- --next;
|
|
- }
|
|
- }
|
|
+ val.u = simple_strntoull(str,
|
|
+ field_width >= 0 ? field_width : INT_MAX,
|
|
+ &next, base);
|
|
|
|
switch (qualifier) {
|
|
case 'H': /* that's 'hh' in format */
|
|
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
|
|
index 87a07aa61be0d..e50799d7002e5 100644
|
|
--- a/mm/huge_memory.c
|
|
+++ b/mm/huge_memory.c
|
|
@@ -1723,7 +1723,7 @@ bool madvise_free_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
|
|
* If other processes are mapping this page, we couldn't discard
|
|
* the page unless they all do MADV_FREE so let's skip the page.
|
|
*/
|
|
- if (page_mapcount(page) != 1)
|
|
+ if (total_mapcount(page) != 1)
|
|
goto out;
|
|
|
|
if (!trylock_page(page))
|
|
diff --git a/mm/z3fold.c b/mm/z3fold.c
|
|
index 6d3d3f698ebb9..e97143713021e 100644
|
|
--- a/mm/z3fold.c
|
|
+++ b/mm/z3fold.c
|
|
@@ -839,6 +839,7 @@ static void z3fold_destroy_pool(struct z3fold_pool *pool)
|
|
destroy_workqueue(pool->compact_wq);
|
|
destroy_workqueue(pool->release_wq);
|
|
z3fold_unregister_migration(pool);
|
|
+ free_percpu(pool->unbuddied);
|
|
kfree(pool);
|
|
}
|
|
|
|
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
|
|
index bd678ffdaef73..e8e7f108b0161 100644
|
|
--- a/net/bluetooth/hci_event.c
|
|
+++ b/net/bluetooth/hci_event.c
|
|
@@ -5101,8 +5101,19 @@ static void hci_le_ext_adv_term_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
|
|
|
BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
|
|
|
|
- if (ev->status)
|
|
+ if (ev->status) {
|
|
+ struct adv_info *adv;
|
|
+
|
|
+ adv = hci_find_adv_instance(hdev, ev->handle);
|
|
+ if (!adv)
|
|
+ return;
|
|
+
|
|
+ /* Remove advertising as it has been terminated */
|
|
+ hci_remove_adv_instance(hdev, ev->handle);
|
|
+ mgmt_advertising_removed(NULL, hdev, ev->handle);
|
|
+
|
|
return;
|
|
+ }
|
|
|
|
conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->conn_handle));
|
|
if (conn) {
|
|
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
|
|
index 5fce559a61bf5..db525321da1f8 100644
|
|
--- a/net/bluetooth/mgmt.c
|
|
+++ b/net/bluetooth/mgmt.c
|
|
@@ -6461,6 +6461,9 @@ static bool tlv_data_is_valid(struct hci_dev *hdev, u32 adv_flags, u8 *data,
|
|
for (i = 0, cur_len = 0; i < len; i += (cur_len + 1)) {
|
|
cur_len = data[i];
|
|
|
|
+ if (!cur_len)
|
|
+ continue;
|
|
+
|
|
if (data[i + 1] == EIR_FLAGS &&
|
|
(!is_adv_data || flags_managed(adv_flags)))
|
|
return false;
|
|
diff --git a/net/bpfilter/main.c b/net/bpfilter/main.c
|
|
index 05e1cfc1e5cd1..291a925462463 100644
|
|
--- a/net/bpfilter/main.c
|
|
+++ b/net/bpfilter/main.c
|
|
@@ -57,7 +57,7 @@ int main(void)
|
|
{
|
|
debug_f = fopen("/dev/kmsg", "w");
|
|
setvbuf(debug_f, 0, _IOLBF, 0);
|
|
- fprintf(debug_f, "Started bpfilter\n");
|
|
+ fprintf(debug_f, "<5>Started bpfilter\n");
|
|
loop();
|
|
fclose(debug_f);
|
|
return 0;
|
|
diff --git a/net/can/bcm.c b/net/can/bcm.c
|
|
index a7abced793765..1e17778d5ceeb 100644
|
|
--- a/net/can/bcm.c
|
|
+++ b/net/can/bcm.c
|
|
@@ -787,6 +787,7 @@ static int bcm_delete_rx_op(struct list_head *ops, struct bcm_msg_head *mh,
|
|
bcm_rx_handler, op);
|
|
|
|
list_del(&op->list);
|
|
+ synchronize_rcu();
|
|
bcm_remove_op(op);
|
|
return 1; /* done */
|
|
}
|
|
@@ -1535,9 +1536,13 @@ static int bcm_release(struct socket *sock)
|
|
REGMASK(op->can_id),
|
|
bcm_rx_handler, op);
|
|
|
|
- bcm_remove_op(op);
|
|
}
|
|
|
|
+ synchronize_rcu();
|
|
+
|
|
+ list_for_each_entry_safe(op, next, &bo->rx_ops, list)
|
|
+ bcm_remove_op(op);
|
|
+
|
|
#if IS_ENABLED(CONFIG_PROC_FS)
|
|
/* remove procfs entry */
|
|
if (net->can.bcmproc_dir && bo->bcm_proc_read)
|
|
diff --git a/net/can/gw.c b/net/can/gw.c
|
|
index 65d60c93af294..ac2a5f11a7668 100644
|
|
--- a/net/can/gw.c
|
|
+++ b/net/can/gw.c
|
|
@@ -535,6 +535,7 @@ static int cgw_notifier(struct notifier_block *nb,
|
|
if (gwj->src.dev == dev || gwj->dst.dev == dev) {
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(net, gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
}
|
|
}
|
|
@@ -1093,6 +1094,7 @@ static void cgw_remove_all_jobs(struct net *net)
|
|
hlist_for_each_entry_safe(gwj, nx, &net->can.cgw_list, list) {
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(net, gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
}
|
|
}
|
|
@@ -1161,6 +1163,7 @@ static int cgw_remove_job(struct sk_buff *skb, struct nlmsghdr *nlh,
|
|
|
|
hlist_del(&gwj->list);
|
|
cgw_unregister_filter(net, gwj);
|
|
+ synchronize_rcu();
|
|
kmem_cache_free(cgw_cache, gwj);
|
|
err = 0;
|
|
break;
|
|
diff --git a/net/can/j1939/main.c b/net/can/j1939/main.c
|
|
index e52330f628c9f..6884d18f919c7 100644
|
|
--- a/net/can/j1939/main.c
|
|
+++ b/net/can/j1939/main.c
|
|
@@ -193,6 +193,10 @@ static void j1939_can_rx_unregister(struct j1939_priv *priv)
|
|
can_rx_unregister(dev_net(ndev), ndev, J1939_CAN_ID, J1939_CAN_MASK,
|
|
j1939_can_recv, priv);
|
|
|
|
+ /* The last reference of priv is dropped by the RCU deferred
|
|
+ * j1939_sk_sock_destruct() of the last socket, so we can
|
|
+ * safely drop this reference here.
|
|
+ */
|
|
j1939_priv_put(priv);
|
|
}
|
|
|
|
diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c
|
|
index d57475c8ba07f..51bfb220fad85 100644
|
|
--- a/net/can/j1939/socket.c
|
|
+++ b/net/can/j1939/socket.c
|
|
@@ -398,6 +398,9 @@ static int j1939_sk_init(struct sock *sk)
|
|
atomic_set(&jsk->skb_pending, 0);
|
|
spin_lock_init(&jsk->sk_session_queue_lock);
|
|
INIT_LIST_HEAD(&jsk->sk_session_queue);
|
|
+
|
|
+ /* j1939_sk_sock_destruct() depends on SOCK_RCU_FREE flag */
|
|
+ sock_set_flag(sk, SOCK_RCU_FREE);
|
|
sk->sk_destruct = j1939_sk_sock_destruct;
|
|
sk->sk_protocol = CAN_J1939;
|
|
|
|
diff --git a/net/core/filter.c b/net/core/filter.c
|
|
index 108bcf6000529..0e161a6dff7e5 100644
|
|
--- a/net/core/filter.c
|
|
+++ b/net/core/filter.c
|
|
@@ -2861,8 +2861,6 @@ static int bpf_skb_proto_4_to_6(struct sk_buff *skb)
|
|
shinfo->gso_type |= SKB_GSO_TCPV6;
|
|
}
|
|
|
|
- /* Due to IPv6 header, MSS needs to be downgraded. */
|
|
- skb_decrease_gso_size(shinfo, len_diff);
|
|
/* Header must be checked, and gso_segs recomputed. */
|
|
shinfo->gso_type |= SKB_GSO_DODGY;
|
|
shinfo->gso_segs = 0;
|
|
@@ -2902,8 +2900,6 @@ static int bpf_skb_proto_6_to_4(struct sk_buff *skb)
|
|
shinfo->gso_type |= SKB_GSO_TCPV4;
|
|
}
|
|
|
|
- /* Due to IPv4 header, MSS can be upgraded. */
|
|
- skb_increase_gso_size(shinfo, len_diff);
|
|
/* Header must be checked, and gso_segs recomputed. */
|
|
shinfo->gso_type |= SKB_GSO_DODGY;
|
|
shinfo->gso_segs = 0;
|
|
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
|
|
index 00210e55b4cd1..86c836fa21459 100644
|
|
--- a/net/ipv4/esp4.c
|
|
+++ b/net/ipv4/esp4.c
|
|
@@ -499,7 +499,7 @@ static int esp_output(struct xfrm_state *x, struct sk_buff *skb)
|
|
struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb);
|
|
u32 padto;
|
|
|
|
- padto = min(x->tfcpad, xfrm_state_mtu(x, dst->child_mtu_cached));
|
|
+ padto = min(x->tfcpad, __xfrm_state_mtu(x, dst->child_mtu_cached));
|
|
if (skb->len < padto)
|
|
esp.tfclen = padto - skb->len;
|
|
}
|
|
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
|
|
index 2ce191019526e..b875b98820ede 100644
|
|
--- a/net/ipv4/fib_frontend.c
|
|
+++ b/net/ipv4/fib_frontend.c
|
|
@@ -381,6 +381,8 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
|
|
fl4.flowi4_proto = 0;
|
|
fl4.fl4_sport = 0;
|
|
fl4.fl4_dport = 0;
|
|
+ } else {
|
|
+ swap(fl4.fl4_sport, fl4.fl4_dport);
|
|
}
|
|
|
|
if (fib_lookup(net, &fl4, &res, 0))
|
|
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
|
|
index 3ff702380b629..0e976848d4bb9 100644
|
|
--- a/net/ipv4/route.c
|
|
+++ b/net/ipv4/route.c
|
|
@@ -1321,7 +1321,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
|
|
mtu = dst_metric_raw(dst, RTAX_MTU);
|
|
|
|
if (mtu)
|
|
- return mtu;
|
|
+ goto out;
|
|
|
|
mtu = READ_ONCE(dst->dev->mtu);
|
|
|
|
@@ -1330,6 +1330,7 @@ static unsigned int ipv4_mtu(const struct dst_entry *dst)
|
|
mtu = 576;
|
|
}
|
|
|
|
+out:
|
|
mtu = min_t(unsigned int, mtu, IP_MAX_MTU);
|
|
|
|
return mtu - lwtunnel_headroom(dst->lwtstate, mtu);
|
|
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
|
|
index 7a739f16d82b2..12570a73def80 100644
|
|
--- a/net/ipv6/esp6.c
|
|
+++ b/net/ipv6/esp6.c
|
|
@@ -440,7 +440,7 @@ static int esp6_output(struct xfrm_state *x, struct sk_buff *skb)
|
|
struct xfrm_dst *dst = (struct xfrm_dst *)skb_dst(skb);
|
|
u32 padto;
|
|
|
|
- padto = min(x->tfcpad, xfrm_state_mtu(x, dst->child_mtu_cached));
|
|
+ padto = min(x->tfcpad, __xfrm_state_mtu(x, dst->child_mtu_cached));
|
|
if (skb->len < padto)
|
|
esp.tfclen = padto - skb->len;
|
|
}
|
|
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c
|
|
index ab5add0fe6b49..69128000bc31b 100644
|
|
--- a/net/ipv6/exthdrs.c
|
|
+++ b/net/ipv6/exthdrs.c
|
|
@@ -134,18 +134,23 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
|
|
len -= 2;
|
|
|
|
while (len > 0) {
|
|
- int optlen = nh[off + 1] + 2;
|
|
- int i;
|
|
+ int optlen, i;
|
|
|
|
- switch (nh[off]) {
|
|
- case IPV6_TLV_PAD1:
|
|
- optlen = 1;
|
|
+ if (nh[off] == IPV6_TLV_PAD1) {
|
|
padlen++;
|
|
if (padlen > 7)
|
|
goto bad;
|
|
- break;
|
|
+ off++;
|
|
+ len--;
|
|
+ continue;
|
|
+ }
|
|
+ if (len < 2)
|
|
+ goto bad;
|
|
+ optlen = nh[off + 1] + 2;
|
|
+ if (optlen > len)
|
|
+ goto bad;
|
|
|
|
- case IPV6_TLV_PADN:
|
|
+ if (nh[off] == IPV6_TLV_PADN) {
|
|
/* RFC 2460 states that the purpose of PadN is
|
|
* to align the containing header to multiples
|
|
* of 8. 7 is therefore the highest valid value.
|
|
@@ -162,12 +167,7 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
|
|
if (nh[off + i] != 0)
|
|
goto bad;
|
|
}
|
|
- break;
|
|
-
|
|
- default: /* Other TLV code so scan list */
|
|
- if (optlen > len)
|
|
- goto bad;
|
|
-
|
|
+ } else {
|
|
tlv_count++;
|
|
if (tlv_count > max_count)
|
|
goto bad;
|
|
@@ -187,7 +187,6 @@ static bool ip6_parse_tlv(const struct tlvtype_proc *procs,
|
|
return false;
|
|
|
|
padlen = 0;
|
|
- break;
|
|
}
|
|
off += optlen;
|
|
len -= optlen;
|
|
@@ -305,7 +304,7 @@ fail_and_free:
|
|
#endif
|
|
|
|
if (ip6_parse_tlv(tlvprocdestopt_lst, skb,
|
|
- init_net.ipv6.sysctl.max_dst_opts_cnt)) {
|
|
+ net->ipv6.sysctl.max_dst_opts_cnt)) {
|
|
skb->transport_header += extlen;
|
|
opt = IP6CB(skb);
|
|
#if IS_ENABLED(CONFIG_IPV6_MIP6)
|
|
@@ -844,7 +843,7 @@ fail_and_free:
|
|
|
|
opt->flags |= IP6SKB_HOPBYHOP;
|
|
if (ip6_parse_tlv(tlvprochopopt_lst, skb,
|
|
- init_net.ipv6.sysctl.max_hbh_opts_cnt)) {
|
|
+ net->ipv6.sysctl.max_hbh_opts_cnt)) {
|
|
skb->transport_header += extlen;
|
|
opt = IP6CB(skb);
|
|
opt->nhoff = sizeof(struct ipv6hdr);
|
|
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
|
|
index 44fd922cc32af..ccaf2389ccc1d 100644
|
|
--- a/net/mac80211/mlme.c
|
|
+++ b/net/mac80211/mlme.c
|
|
@@ -1014,11 +1014,6 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
|
|
struct ieee80211_hdr_3addr *nullfunc;
|
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
|
|
|
- /* Don't send NDPs when STA is connected HE */
|
|
- if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
|
- !(ifmgd->flags & IEEE80211_STA_DISABLE_HE))
|
|
- return;
|
|
-
|
|
skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif,
|
|
!ieee80211_hw_check(&local->hw, DOESNT_SUPPORT_QOS_NDP));
|
|
if (!skb)
|
|
@@ -1050,10 +1045,6 @@ static void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
|
|
if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
|
|
return;
|
|
|
|
- /* Don't send NDPs when connected HE */
|
|
- if (!(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
|
|
- return;
|
|
-
|
|
skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30);
|
|
if (!skb)
|
|
return;
|
|
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
|
|
index 82a1dd7b7d689..7b2e8c890381a 100644
|
|
--- a/net/mac80211/sta_info.c
|
|
+++ b/net/mac80211/sta_info.c
|
|
@@ -1395,11 +1395,6 @@ static void ieee80211_send_null_response(struct sta_info *sta, int tid,
|
|
struct ieee80211_tx_info *info;
|
|
struct ieee80211_chanctx_conf *chanctx_conf;
|
|
|
|
- /* Don't send NDPs when STA is connected HE */
|
|
- if (sdata->vif.type == NL80211_IFTYPE_STATION &&
|
|
- !(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
|
|
- return;
|
|
-
|
|
if (qos) {
|
|
fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
|
|
IEEE80211_STYPE_QOS_NULLFUNC |
|
|
diff --git a/net/netfilter/nft_exthdr.c b/net/netfilter/nft_exthdr.c
|
|
index 427d77b111b17..00f4323cfeb87 100644
|
|
--- a/net/netfilter/nft_exthdr.c
|
|
+++ b/net/netfilter/nft_exthdr.c
|
|
@@ -42,6 +42,9 @@ static void nft_exthdr_ipv6_eval(const struct nft_expr *expr,
|
|
unsigned int offset = 0;
|
|
int err;
|
|
|
|
+ if (pkt->skb->protocol != htons(ETH_P_IPV6))
|
|
+ goto err;
|
|
+
|
|
err = ipv6_find_hdr(pkt->skb, &offset, priv->type, NULL, NULL);
|
|
if (priv->flags & NFT_EXTHDR_F_PRESENT) {
|
|
nft_reg_store8(dest, err >= 0);
|
|
diff --git a/net/netfilter/nft_osf.c b/net/netfilter/nft_osf.c
|
|
index b42247aa48a9e..4911f8eb394ff 100644
|
|
--- a/net/netfilter/nft_osf.c
|
|
+++ b/net/netfilter/nft_osf.c
|
|
@@ -28,6 +28,11 @@ static void nft_osf_eval(const struct nft_expr *expr, struct nft_regs *regs,
|
|
struct nf_osf_data data;
|
|
struct tcphdr _tcph;
|
|
|
|
+ if (pkt->tprot != IPPROTO_TCP) {
|
|
+ regs->verdict.code = NFT_BREAK;
|
|
+ return;
|
|
+ }
|
|
+
|
|
tcp = skb_header_pointer(skb, ip_hdrlen(skb),
|
|
sizeof(struct tcphdr), &_tcph);
|
|
if (!tcp) {
|
|
diff --git a/net/netfilter/nft_tproxy.c b/net/netfilter/nft_tproxy.c
|
|
index 95980154ef02c..b97ab1198b03f 100644
|
|
--- a/net/netfilter/nft_tproxy.c
|
|
+++ b/net/netfilter/nft_tproxy.c
|
|
@@ -30,6 +30,12 @@ static void nft_tproxy_eval_v4(const struct nft_expr *expr,
|
|
__be16 tport = 0;
|
|
struct sock *sk;
|
|
|
|
+ if (pkt->tprot != IPPROTO_TCP &&
|
|
+ pkt->tprot != IPPROTO_UDP) {
|
|
+ regs->verdict.code = NFT_BREAK;
|
|
+ return;
|
|
+ }
|
|
+
|
|
hp = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_hdr), &_hdr);
|
|
if (!hp) {
|
|
regs->verdict.code = NFT_BREAK;
|
|
@@ -91,7 +97,8 @@ static void nft_tproxy_eval_v6(const struct nft_expr *expr,
|
|
|
|
memset(&taddr, 0, sizeof(taddr));
|
|
|
|
- if (!pkt->tprot_set) {
|
|
+ if (pkt->tprot != IPPROTO_TCP &&
|
|
+ pkt->tprot != IPPROTO_UDP) {
|
|
regs->verdict.code = NFT_BREAK;
|
|
return;
|
|
}
|
|
diff --git a/net/netlabel/netlabel_mgmt.c b/net/netlabel/netlabel_mgmt.c
|
|
index e7a25fbfaf8b4..a92ed37d09226 100644
|
|
--- a/net/netlabel/netlabel_mgmt.c
|
|
+++ b/net/netlabel/netlabel_mgmt.c
|
|
@@ -76,6 +76,7 @@ static const struct nla_policy netlbl_mgmt_genl_policy[NLBL_MGMT_A_MAX + 1] = {
|
|
static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
struct netlbl_audit *audit_info)
|
|
{
|
|
+ void *pmap = NULL;
|
|
int ret_val = -EINVAL;
|
|
struct netlbl_domaddr_map *addrmap = NULL;
|
|
struct cipso_v4_doi *cipsov4 = NULL;
|
|
@@ -175,6 +176,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
ret_val = -ENOMEM;
|
|
goto add_free_addrmap;
|
|
}
|
|
+ pmap = map;
|
|
map->list.addr = addr->s_addr & mask->s_addr;
|
|
map->list.mask = mask->s_addr;
|
|
map->list.valid = 1;
|
|
@@ -183,10 +185,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
map->def.cipso = cipsov4;
|
|
|
|
ret_val = netlbl_af4list_add(&map->list, &addrmap->list4);
|
|
- if (ret_val != 0) {
|
|
- kfree(map);
|
|
- goto add_free_addrmap;
|
|
- }
|
|
+ if (ret_val != 0)
|
|
+ goto add_free_map;
|
|
|
|
entry->family = AF_INET;
|
|
entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
|
|
@@ -223,6 +223,7 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
ret_val = -ENOMEM;
|
|
goto add_free_addrmap;
|
|
}
|
|
+ pmap = map;
|
|
map->list.addr = *addr;
|
|
map->list.addr.s6_addr32[0] &= mask->s6_addr32[0];
|
|
map->list.addr.s6_addr32[1] &= mask->s6_addr32[1];
|
|
@@ -235,10 +236,8 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
map->def.calipso = calipso;
|
|
|
|
ret_val = netlbl_af6list_add(&map->list, &addrmap->list6);
|
|
- if (ret_val != 0) {
|
|
- kfree(map);
|
|
- goto add_free_addrmap;
|
|
- }
|
|
+ if (ret_val != 0)
|
|
+ goto add_free_map;
|
|
|
|
entry->family = AF_INET6;
|
|
entry->def.type = NETLBL_NLTYPE_ADDRSELECT;
|
|
@@ -248,10 +247,12 @@ static int netlbl_mgmt_add_common(struct genl_info *info,
|
|
|
|
ret_val = netlbl_domhsh_add(entry, audit_info);
|
|
if (ret_val != 0)
|
|
- goto add_free_addrmap;
|
|
+ goto add_free_map;
|
|
|
|
return 0;
|
|
|
|
+add_free_map:
|
|
+ kfree(pmap);
|
|
add_free_addrmap:
|
|
kfree(addrmap);
|
|
add_doi_put_def:
|
|
diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c
|
|
index 3c26042f4ea6d..7dc76c68ec52d 100644
|
|
--- a/net/sched/act_vlan.c
|
|
+++ b/net/sched/act_vlan.c
|
|
@@ -70,7 +70,7 @@ static int tcf_vlan_act(struct sk_buff *skb, const struct tc_action *a,
|
|
/* replace the vid */
|
|
tci = (tci & ~VLAN_VID_MASK) | p->tcfv_push_vid;
|
|
/* replace prio bits, if tcfv_push_prio specified */
|
|
- if (p->tcfv_push_prio) {
|
|
+ if (p->tcfv_push_prio_exists) {
|
|
tci &= ~VLAN_PRIO_MASK;
|
|
tci |= p->tcfv_push_prio << VLAN_PRIO_SHIFT;
|
|
}
|
|
@@ -107,6 +107,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla,
|
|
struct tc_action_net *tn = net_generic(net, vlan_net_id);
|
|
struct nlattr *tb[TCA_VLAN_MAX + 1];
|
|
struct tcf_chain *goto_ch = NULL;
|
|
+ bool push_prio_exists = false;
|
|
struct tcf_vlan_params *p;
|
|
struct tc_vlan *parm;
|
|
struct tcf_vlan *v;
|
|
@@ -175,7 +176,8 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla,
|
|
push_proto = htons(ETH_P_8021Q);
|
|
}
|
|
|
|
- if (tb[TCA_VLAN_PUSH_VLAN_PRIORITY])
|
|
+ push_prio_exists = !!tb[TCA_VLAN_PUSH_VLAN_PRIORITY];
|
|
+ if (push_prio_exists)
|
|
push_prio = nla_get_u8(tb[TCA_VLAN_PUSH_VLAN_PRIORITY]);
|
|
break;
|
|
default:
|
|
@@ -216,6 +218,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla,
|
|
p->tcfv_action = action;
|
|
p->tcfv_push_vid = push_vid;
|
|
p->tcfv_push_prio = push_prio;
|
|
+ p->tcfv_push_prio_exists = push_prio_exists || action == TCA_VLAN_ACT_PUSH;
|
|
p->tcfv_push_proto = push_proto;
|
|
|
|
spin_lock_bh(&v->tcf_lock);
|
|
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
|
|
index c9399e81c5059..3e81f87d0c89f 100644
|
|
--- a/net/sched/cls_tcindex.c
|
|
+++ b/net/sched/cls_tcindex.c
|
|
@@ -304,7 +304,7 @@ static int tcindex_alloc_perfect_hash(struct net *net, struct tcindex_data *cp)
|
|
int i, err = 0;
|
|
|
|
cp->perfect = kcalloc(cp->hash, sizeof(struct tcindex_filter_result),
|
|
- GFP_KERNEL);
|
|
+ GFP_KERNEL | __GFP_NOWARN);
|
|
if (!cp->perfect)
|
|
return -ENOMEM;
|
|
|
|
diff --git a/net/sched/sch_qfq.c b/net/sched/sch_qfq.c
|
|
index 0b05ac7c848eb..b046fd3cac2cf 100644
|
|
--- a/net/sched/sch_qfq.c
|
|
+++ b/net/sched/sch_qfq.c
|
|
@@ -485,11 +485,6 @@ static int qfq_change_class(struct Qdisc *sch, u32 classid, u32 parentid,
|
|
|
|
if (cl->qdisc != &noop_qdisc)
|
|
qdisc_hash_add(cl->qdisc, true);
|
|
- sch_tree_lock(sch);
|
|
- qdisc_class_hash_insert(&q->clhash, &cl->common);
|
|
- sch_tree_unlock(sch);
|
|
-
|
|
- qdisc_class_hash_grow(sch, &q->clhash);
|
|
|
|
set_change_agg:
|
|
sch_tree_lock(sch);
|
|
@@ -507,8 +502,11 @@ set_change_agg:
|
|
}
|
|
if (existing)
|
|
qfq_deact_rm_from_agg(q, cl);
|
|
+ else
|
|
+ qdisc_class_hash_insert(&q->clhash, &cl->common);
|
|
qfq_add_to_agg(q, new_agg, cl);
|
|
sch_tree_unlock(sch);
|
|
+ qdisc_class_hash_grow(sch, &q->clhash);
|
|
|
|
*arg = (unsigned long)cl;
|
|
return 0;
|
|
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c
|
|
index 4beb6d2957c33..8fc4a6b3422f4 100644
|
|
--- a/net/sunrpc/sched.c
|
|
+++ b/net/sunrpc/sched.c
|
|
@@ -613,11 +613,21 @@ static struct rpc_task *__rpc_find_next_queued_priority(struct rpc_wait_queue *q
|
|
struct list_head *q;
|
|
struct rpc_task *task;
|
|
|
|
+ /*
|
|
+ * Service the privileged queue.
|
|
+ */
|
|
+ q = &queue->tasks[RPC_NR_PRIORITY - 1];
|
|
+ if (queue->maxpriority > RPC_PRIORITY_PRIVILEGED && !list_empty(q)) {
|
|
+ task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
/*
|
|
* Service a batch of tasks from a single owner.
|
|
*/
|
|
q = &queue->tasks[queue->priority];
|
|
- if (!list_empty(q) && --queue->nr) {
|
|
+ if (!list_empty(q) && queue->nr) {
|
|
+ queue->nr--;
|
|
task = list_first_entry(q, struct rpc_task, u.tk_wait.list);
|
|
goto out;
|
|
}
|
|
diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
|
|
index cdb65aa54be70..7fb5c067f4293 100644
|
|
--- a/net/tls/tls_sw.c
|
|
+++ b/net/tls/tls_sw.c
|
|
@@ -1150,7 +1150,7 @@ static int tls_sw_do_sendpage(struct sock *sk, struct page *page,
|
|
int ret = 0;
|
|
bool eor;
|
|
|
|
- eor = !(flags & (MSG_MORE | MSG_SENDPAGE_NOTLAST));
|
|
+ eor = !(flags & MSG_SENDPAGE_NOTLAST);
|
|
sk_clear_bit(SOCKWQ_ASYNC_NOSPACE, sk);
|
|
|
|
/* Call the sk_stream functions to manage the sndbuf mem. */
|
|
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
|
|
index 1423e2b7cb42a..c6b2c99b501b9 100644
|
|
--- a/net/xfrm/xfrm_state.c
|
|
+++ b/net/xfrm/xfrm_state.c
|
|
@@ -2440,7 +2440,7 @@ void xfrm_state_delete_tunnel(struct xfrm_state *x)
|
|
}
|
|
EXPORT_SYMBOL(xfrm_state_delete_tunnel);
|
|
|
|
-u32 xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
|
+u32 __xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
|
{
|
|
const struct xfrm_type *type = READ_ONCE(x->type);
|
|
struct crypto_aead *aead;
|
|
@@ -2471,7 +2471,17 @@ u32 xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
|
return ((mtu - x->props.header_len - crypto_aead_authsize(aead) -
|
|
net_adj) & ~(blksize - 1)) + net_adj - 2;
|
|
}
|
|
-EXPORT_SYMBOL_GPL(xfrm_state_mtu);
|
|
+EXPORT_SYMBOL_GPL(__xfrm_state_mtu);
|
|
+
|
|
+u32 xfrm_state_mtu(struct xfrm_state *x, int mtu)
|
|
+{
|
|
+ mtu = __xfrm_state_mtu(x, mtu);
|
|
+
|
|
+ if (x->props.family == AF_INET6 && mtu < IPV6_MIN_MTU)
|
|
+ return IPV6_MIN_MTU;
|
|
+
|
|
+ return mtu;
|
|
+}
|
|
|
|
int __xfrm_init_state(struct xfrm_state *x, bool init_replay, bool offload)
|
|
{
|
|
diff --git a/samples/bpf/xdp_redirect_user.c b/samples/bpf/xdp_redirect_user.c
|
|
index 5440cd620607f..b7bc2a339d77c 100644
|
|
--- a/samples/bpf/xdp_redirect_user.c
|
|
+++ b/samples/bpf/xdp_redirect_user.c
|
|
@@ -216,5 +216,5 @@ int main(int argc, char **argv)
|
|
poll_stats(2, ifindex_out);
|
|
|
|
out:
|
|
- return 0;
|
|
+ return ret;
|
|
}
|
|
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
|
|
index 9c689d011bced..1261f75cb4e77 100644
|
|
--- a/scripts/Makefile.build
|
|
+++ b/scripts/Makefile.build
|
|
@@ -240,9 +240,9 @@ undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "",
|
|
endif
|
|
|
|
define rule_cc_o_c
|
|
- $(call cmd,checksrc)
|
|
$(call cmd_and_fixdep,cc_o_c)
|
|
$(call cmd,gen_ksymdeps)
|
|
+ $(call cmd,checksrc)
|
|
$(call cmd,checkdoc)
|
|
$(call cmd,objtool)
|
|
$(call cmd,modversions_c)
|
|
@@ -257,9 +257,10 @@ define rule_as_o_S
|
|
endef
|
|
|
|
# Built-in and composite module parts
|
|
-$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
|
|
- $(call cmd,force_checksrc)
|
|
+.SECONDEXPANSION:
|
|
+$(obj)/%.o: $(src)/%.c $(recordmcount_source) $$(objtool_dep) FORCE
|
|
$(call if_changed_rule,cc_o_c)
|
|
+ $(call cmd,force_checksrc)
|
|
|
|
cmd_mod = { \
|
|
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
|
@@ -340,7 +341,7 @@ cmd_modversions_S = \
|
|
fi
|
|
endif
|
|
|
|
-$(obj)/%.o: $(src)/%.S $(objtool_dep) FORCE
|
|
+$(obj)/%.o: $(src)/%.S $$(objtool_dep) FORCE
|
|
$(call if_changed_rule,as_o_S)
|
|
|
|
targets += $(filter-out $(subdir-obj-y), $(real-obj-y)) $(real-obj-m) $(lib-y)
|
|
diff --git a/scripts/tools-support-relr.sh b/scripts/tools-support-relr.sh
|
|
index 45e8aa360b457..cb55878bd5b81 100755
|
|
--- a/scripts/tools-support-relr.sh
|
|
+++ b/scripts/tools-support-relr.sh
|
|
@@ -7,7 +7,8 @@ trap "rm -f $tmp_file.o $tmp_file $tmp_file.bin" EXIT
|
|
cat << "END" | $CC -c -x c - -o $tmp_file.o >/dev/null 2>&1
|
|
void *p = &p;
|
|
END
|
|
-$LD $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr -o $tmp_file
|
|
+$LD $tmp_file.o -shared -Bsymbolic --pack-dyn-relocs=relr \
|
|
+ --use-android-relr-tags -o $tmp_file
|
|
|
|
# Despite printing an error message, GNU nm still exits with exit code 0 if it
|
|
# sees a relr section. So we need to check that nothing is printed to stderr.
|
|
diff --git a/security/integrity/evm/evm_main.c b/security/integrity/evm/evm_main.c
|
|
index 615094eda36d6..81e3245aec86c 100644
|
|
--- a/security/integrity/evm/evm_main.c
|
|
+++ b/security/integrity/evm/evm_main.c
|
|
@@ -520,7 +520,7 @@ void evm_inode_post_setattr(struct dentry *dentry, int ia_valid)
|
|
}
|
|
|
|
/*
|
|
- * evm_inode_init_security - initializes security.evm
|
|
+ * evm_inode_init_security - initializes security.evm HMAC value
|
|
*/
|
|
int evm_inode_init_security(struct inode *inode,
|
|
const struct xattr *lsm_xattr,
|
|
@@ -529,7 +529,8 @@ int evm_inode_init_security(struct inode *inode,
|
|
struct evm_xattr *xattr_data;
|
|
int rc;
|
|
|
|
- if (!evm_key_loaded() || !evm_protected_xattr(lsm_xattr->name))
|
|
+ if (!(evm_initialized & EVM_INIT_HMAC) ||
|
|
+ !evm_protected_xattr(lsm_xattr->name))
|
|
return 0;
|
|
|
|
xattr_data = kzalloc(sizeof(*xattr_data), GFP_NOFS);
|
|
diff --git a/security/integrity/evm/evm_secfs.c b/security/integrity/evm/evm_secfs.c
|
|
index 0f37ef27268de..d7f12ed191837 100644
|
|
--- a/security/integrity/evm/evm_secfs.c
|
|
+++ b/security/integrity/evm/evm_secfs.c
|
|
@@ -68,12 +68,13 @@ static ssize_t evm_read_key(struct file *filp, char __user *buf,
|
|
static ssize_t evm_write_key(struct file *file, const char __user *buf,
|
|
size_t count, loff_t *ppos)
|
|
{
|
|
- int i, ret;
|
|
+ unsigned int i;
|
|
+ int ret;
|
|
|
|
if (!capable(CAP_SYS_ADMIN) || (evm_initialized & EVM_SETUP_COMPLETE))
|
|
return -EPERM;
|
|
|
|
- ret = kstrtoint_from_user(buf, count, 0, &i);
|
|
+ ret = kstrtouint_from_user(buf, count, 0, &i);
|
|
|
|
if (ret)
|
|
return ret;
|
|
@@ -82,12 +83,12 @@ static ssize_t evm_write_key(struct file *file, const char __user *buf,
|
|
if (!i || (i & ~EVM_INIT_MASK) != 0)
|
|
return -EINVAL;
|
|
|
|
- /* Don't allow a request to freshly enable metadata writes if
|
|
- * keys are loaded.
|
|
+ /*
|
|
+ * Don't allow a request to enable metadata writes if
|
|
+ * an HMAC key is loaded.
|
|
*/
|
|
if ((i & EVM_ALLOW_METADATA_WRITES) &&
|
|
- ((evm_initialized & EVM_KEY_MASK) != 0) &&
|
|
- !(evm_initialized & EVM_ALLOW_METADATA_WRITES))
|
|
+ (evm_initialized & EVM_INIT_HMAC) != 0)
|
|
return -EPERM;
|
|
|
|
if (i & EVM_INIT_HMAC) {
|
|
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
|
|
index de40bb99b6793..f5606036b6a29 100644
|
|
--- a/sound/pci/hda/patch_realtek.c
|
|
+++ b/sound/pci/hda/patch_realtek.c
|
|
@@ -375,6 +375,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
|
|
alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
|
|
/* fallthrough */
|
|
case 0x10ec0215:
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0233:
|
|
case 0x10ec0235:
|
|
case 0x10ec0236:
|
|
@@ -3143,6 +3144,7 @@ static void alc_disable_headset_jack_key(struct hda_codec *codec)
|
|
alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
|
|
alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_write_coef_idx(codec, 0x48, 0x0);
|
|
@@ -3170,6 +3172,7 @@ static void alc_enable_headset_jack_key(struct hda_codec *codec)
|
|
alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
|
|
alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_write_coef_idx(codec, 0x48, 0xd011);
|
|
@@ -4630,6 +4633,7 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
|
|
case 0x10ec0255:
|
|
alc_process_coef_fw(codec, coef0255);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_process_coef_fw(codec, coef0256);
|
|
@@ -4744,6 +4748,7 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
|
|
alc_process_coef_fw(codec, coef0255);
|
|
snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_write_coef_idx(codec, 0x45, 0xc489);
|
|
@@ -4893,6 +4898,7 @@ static void alc_headset_mode_default(struct hda_codec *codec)
|
|
case 0x10ec0255:
|
|
alc_process_coef_fw(codec, coef0255);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_write_coef_idx(codec, 0x1b, 0x0e4b);
|
|
@@ -4991,6 +4997,7 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
|
|
case 0x10ec0255:
|
|
alc_process_coef_fw(codec, coef0255);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_process_coef_fw(codec, coef0256);
|
|
@@ -5104,6 +5111,7 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
|
|
case 0x10ec0255:
|
|
alc_process_coef_fw(codec, coef0255);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_process_coef_fw(codec, coef0256);
|
|
@@ -5199,6 +5207,7 @@ static void alc_determine_headset_type(struct hda_codec *codec)
|
|
val = alc_read_coef_idx(codec, 0x46);
|
|
is_ctia = (val & 0x0070) == 0x0070;
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_write_coef_idx(codec, 0x1b, 0x0e4b);
|
|
@@ -5492,6 +5501,7 @@ static void alc255_set_default_jack_type(struct hda_codec *codec)
|
|
case 0x10ec0255:
|
|
alc_process_coef_fw(codec, alc255fw);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
alc_process_coef_fw(codec, alc256fw);
|
|
@@ -6092,6 +6102,7 @@ static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
|
|
alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
|
|
alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0235:
|
|
case 0x10ec0236:
|
|
case 0x10ec0255:
|
|
@@ -6207,6 +6218,24 @@ static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
|
|
}
|
|
}
|
|
|
|
+static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
|
|
+ const struct hda_fixup *fix, int action)
|
|
+{
|
|
+ static const hda_nid_t conn[] = { 0x02 };
|
|
+ static const struct hda_pintbl pincfgs[] = {
|
|
+ { 0x14, 0x90170110 }, /* rear speaker */
|
|
+ { }
|
|
+ };
|
|
+
|
|
+ switch (action) {
|
|
+ case HDA_FIXUP_ACT_PRE_PROBE:
|
|
+ snd_hda_apply_pincfgs(codec, pincfgs);
|
|
+ /* force front speaker to DAC1 */
|
|
+ snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
|
|
+ break;
|
|
+ }
|
|
+}
|
|
+
|
|
/* for hda_fixup_thinkpad_acpi() */
|
|
#include "thinkpad_helper.c"
|
|
|
|
@@ -7652,6 +7681,8 @@ static const struct hda_fixup alc269_fixups[] = {
|
|
{ 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
|
|
{ }
|
|
},
|
|
+ .chained = true,
|
|
+ .chain_id = ALC289_FIXUP_ASUS_GA401,
|
|
},
|
|
[ALC285_FIXUP_HP_GPIO_LED] = {
|
|
.type = HDA_FIXUP_FUNC,
|
|
@@ -7905,13 +7936,8 @@ static const struct hda_fixup alc269_fixups[] = {
|
|
.chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
|
|
},
|
|
[ALC285_FIXUP_HP_SPECTRE_X360] = {
|
|
- .type = HDA_FIXUP_PINS,
|
|
- .v.pins = (const struct hda_pintbl[]) {
|
|
- { 0x14, 0x90170110 }, /* enable top speaker */
|
|
- {}
|
|
- },
|
|
- .chained = true,
|
|
- .chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1,
|
|
+ .type = HDA_FIXUP_FUNC,
|
|
+ .v.func = alc285_fixup_hp_spectre_x360,
|
|
},
|
|
};
|
|
|
|
@@ -8067,6 +8093,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
|
|
SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
|
|
SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
|
|
+ SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
|
SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
|
|
SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
|
|
SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
|
|
@@ -9063,6 +9090,7 @@ static int patch_alc269(struct hda_codec *codec)
|
|
spec->shutup = alc256_shutup;
|
|
spec->init_hook = alc256_init;
|
|
break;
|
|
+ case 0x10ec0230:
|
|
case 0x10ec0236:
|
|
case 0x10ec0256:
|
|
spec->codec_variant = ALC269_TYPE_ALC256;
|
|
@@ -10354,6 +10382,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = {
|
|
HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
|
|
+ HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
|
|
HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
|
|
diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
|
|
index 2a73fc4fd019f..5150e8d38975e 100644
|
|
--- a/sound/pci/intel8x0.c
|
|
+++ b/sound/pci/intel8x0.c
|
|
@@ -715,7 +715,7 @@ static inline void snd_intel8x0_update(struct intel8x0 *chip, struct ichdev *ich
|
|
int status, civ, i, step;
|
|
int ack = 0;
|
|
|
|
- if (!ichdev->prepared || ichdev->suspended)
|
|
+ if (!(ichdev->prepared || chip->in_measurement) || ichdev->suspended)
|
|
return;
|
|
|
|
spin_lock_irqsave(&chip->reg_lock, flags);
|
|
diff --git a/sound/soc/atmel/atmel-i2s.c b/sound/soc/atmel/atmel-i2s.c
|
|
index bbe2b638abb58..d870f56c44cfc 100644
|
|
--- a/sound/soc/atmel/atmel-i2s.c
|
|
+++ b/sound/soc/atmel/atmel-i2s.c
|
|
@@ -200,6 +200,7 @@ struct atmel_i2s_dev {
|
|
unsigned int fmt;
|
|
const struct atmel_i2s_gck_param *gck_param;
|
|
const struct atmel_i2s_caps *caps;
|
|
+ int clk_use_no;
|
|
};
|
|
|
|
static irqreturn_t atmel_i2s_interrupt(int irq, void *dev_id)
|
|
@@ -321,9 +322,16 @@ static int atmel_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
{
|
|
struct atmel_i2s_dev *dev = snd_soc_dai_get_drvdata(dai);
|
|
bool is_playback = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK);
|
|
- unsigned int mr = 0;
|
|
+ unsigned int mr = 0, mr_mask;
|
|
int ret;
|
|
|
|
+ mr_mask = ATMEL_I2SC_MR_FORMAT_MASK | ATMEL_I2SC_MR_MODE_MASK |
|
|
+ ATMEL_I2SC_MR_DATALENGTH_MASK;
|
|
+ if (is_playback)
|
|
+ mr_mask |= ATMEL_I2SC_MR_TXMONO;
|
|
+ else
|
|
+ mr_mask |= ATMEL_I2SC_MR_RXMONO;
|
|
+
|
|
switch (dev->fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
|
|
case SND_SOC_DAIFMT_I2S:
|
|
mr |= ATMEL_I2SC_MR_FORMAT_I2S;
|
|
@@ -402,7 +410,7 @@ static int atmel_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
return -EINVAL;
|
|
}
|
|
|
|
- return regmap_write(dev->regmap, ATMEL_I2SC_MR, mr);
|
|
+ return regmap_update_bits(dev->regmap, ATMEL_I2SC_MR, mr_mask, mr);
|
|
}
|
|
|
|
static int atmel_i2s_switch_mck_generator(struct atmel_i2s_dev *dev,
|
|
@@ -495,18 +503,28 @@ static int atmel_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
|
|
is_master = (mr & ATMEL_I2SC_MR_MODE_MASK) == ATMEL_I2SC_MR_MODE_MASTER;
|
|
|
|
/* If master starts, enable the audio clock. */
|
|
- if (is_master && mck_enabled)
|
|
- err = atmel_i2s_switch_mck_generator(dev, true);
|
|
- if (err)
|
|
- return err;
|
|
+ if (is_master && mck_enabled) {
|
|
+ if (!dev->clk_use_no) {
|
|
+ err = atmel_i2s_switch_mck_generator(dev, true);
|
|
+ if (err)
|
|
+ return err;
|
|
+ }
|
|
+ dev->clk_use_no++;
|
|
+ }
|
|
|
|
err = regmap_write(dev->regmap, ATMEL_I2SC_CR, cr);
|
|
if (err)
|
|
return err;
|
|
|
|
/* If master stops, disable the audio clock. */
|
|
- if (is_master && !mck_enabled)
|
|
- err = atmel_i2s_switch_mck_generator(dev, false);
|
|
+ if (is_master && !mck_enabled) {
|
|
+ if (dev->clk_use_no == 1) {
|
|
+ err = atmel_i2s_switch_mck_generator(dev, false);
|
|
+ if (err)
|
|
+ return err;
|
|
+ }
|
|
+ dev->clk_use_no--;
|
|
+ }
|
|
|
|
return err;
|
|
}
|
|
diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h
|
|
index 866d7c873e3c9..ca2019732013e 100644
|
|
--- a/sound/soc/codecs/cs42l42.h
|
|
+++ b/sound/soc/codecs/cs42l42.h
|
|
@@ -77,7 +77,7 @@
|
|
#define CS42L42_HP_PDN_SHIFT 3
|
|
#define CS42L42_HP_PDN_MASK (1 << CS42L42_HP_PDN_SHIFT)
|
|
#define CS42L42_ADC_PDN_SHIFT 2
|
|
-#define CS42L42_ADC_PDN_MASK (1 << CS42L42_HP_PDN_SHIFT)
|
|
+#define CS42L42_ADC_PDN_MASK (1 << CS42L42_ADC_PDN_SHIFT)
|
|
#define CS42L42_PDN_ALL_SHIFT 0
|
|
#define CS42L42_PDN_ALL_MASK (1 << CS42L42_PDN_ALL_SHIFT)
|
|
|
|
diff --git a/sound/soc/codecs/rk3328_codec.c b/sound/soc/codecs/rk3328_codec.c
|
|
index 287c962ba00d7..514ebe16bbfad 100644
|
|
--- a/sound/soc/codecs/rk3328_codec.c
|
|
+++ b/sound/soc/codecs/rk3328_codec.c
|
|
@@ -472,7 +472,8 @@ static int rk3328_platform_probe(struct platform_device *pdev)
|
|
rk3328->pclk = devm_clk_get(&pdev->dev, "pclk");
|
|
if (IS_ERR(rk3328->pclk)) {
|
|
dev_err(&pdev->dev, "can't get acodec pclk\n");
|
|
- return PTR_ERR(rk3328->pclk);
|
|
+ ret = PTR_ERR(rk3328->pclk);
|
|
+ goto err_unprepare_mclk;
|
|
}
|
|
|
|
ret = clk_prepare_enable(rk3328->pclk);
|
|
@@ -482,19 +483,34 @@ static int rk3328_platform_probe(struct platform_device *pdev)
|
|
}
|
|
|
|
base = devm_platform_ioremap_resource(pdev, 0);
|
|
- if (IS_ERR(base))
|
|
- return PTR_ERR(base);
|
|
+ if (IS_ERR(base)) {
|
|
+ ret = PTR_ERR(base);
|
|
+ goto err_unprepare_pclk;
|
|
+ }
|
|
|
|
rk3328->regmap = devm_regmap_init_mmio(&pdev->dev, base,
|
|
&rk3328_codec_regmap_config);
|
|
- if (IS_ERR(rk3328->regmap))
|
|
- return PTR_ERR(rk3328->regmap);
|
|
+ if (IS_ERR(rk3328->regmap)) {
|
|
+ ret = PTR_ERR(rk3328->regmap);
|
|
+ goto err_unprepare_pclk;
|
|
+ }
|
|
|
|
platform_set_drvdata(pdev, rk3328);
|
|
|
|
- return devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328,
|
|
+ ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_rk3328,
|
|
rk3328_dai,
|
|
ARRAY_SIZE(rk3328_dai));
|
|
+ if (ret)
|
|
+ goto err_unprepare_pclk;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+err_unprepare_pclk:
|
|
+ clk_disable_unprepare(rk3328->pclk);
|
|
+
|
|
+err_unprepare_mclk:
|
|
+ clk_disable_unprepare(rk3328->mclk);
|
|
+ return ret;
|
|
}
|
|
|
|
static const struct of_device_id rk3328_codec_of_match[] = {
|
|
diff --git a/sound/soc/hisilicon/hi6210-i2s.c b/sound/soc/hisilicon/hi6210-i2s.c
|
|
index ab3b76d298b34..03470e8f30083 100644
|
|
--- a/sound/soc/hisilicon/hi6210-i2s.c
|
|
+++ b/sound/soc/hisilicon/hi6210-i2s.c
|
|
@@ -102,18 +102,15 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream,
|
|
|
|
for (n = 0; n < i2s->clocks; n++) {
|
|
ret = clk_prepare_enable(i2s->clk[n]);
|
|
- if (ret) {
|
|
- while (n--)
|
|
- clk_disable_unprepare(i2s->clk[n]);
|
|
- return ret;
|
|
- }
|
|
+ if (ret)
|
|
+ goto err_unprepare_clk;
|
|
}
|
|
|
|
ret = clk_set_rate(i2s->clk[CLK_I2S_BASE], 49152000);
|
|
if (ret) {
|
|
dev_err(i2s->dev, "%s: setting 49.152MHz base rate failed %d\n",
|
|
__func__, ret);
|
|
- return ret;
|
|
+ goto err_unprepare_clk;
|
|
}
|
|
|
|
/* enable clock before frequency division */
|
|
@@ -165,6 +162,11 @@ static int hi6210_i2s_startup(struct snd_pcm_substream *substream,
|
|
hi6210_write_reg(i2s, HII2S_SW_RST_N, val);
|
|
|
|
return 0;
|
|
+
|
|
+err_unprepare_clk:
|
|
+ while (n--)
|
|
+ clk_disable_unprepare(i2s->clk[n]);
|
|
+ return ret;
|
|
}
|
|
|
|
static void hi6210_i2s_shutdown(struct snd_pcm_substream *substream,
|
|
diff --git a/sound/soc/mediatek/common/mtk-btcvsd.c b/sound/soc/mediatek/common/mtk-btcvsd.c
|
|
index d00608c73c6ec..b66f7dee1e149 100644
|
|
--- a/sound/soc/mediatek/common/mtk-btcvsd.c
|
|
+++ b/sound/soc/mediatek/common/mtk-btcvsd.c
|
|
@@ -1302,7 +1302,7 @@ static const struct snd_soc_component_driver mtk_btcvsd_snd_platform = {
|
|
|
|
static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
|
|
{
|
|
- int ret = 0;
|
|
+ int ret;
|
|
int irq_id;
|
|
u32 offset[5] = {0, 0, 0, 0, 0};
|
|
struct mtk_btcvsd_snd *btcvsd;
|
|
@@ -1358,7 +1358,8 @@ static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
|
|
btcvsd->bt_sram_bank2_base = of_iomap(dev->of_node, 1);
|
|
if (!btcvsd->bt_sram_bank2_base) {
|
|
dev_err(dev, "iomap bt_sram_bank2_base fail\n");
|
|
- return -EIO;
|
|
+ ret = -EIO;
|
|
+ goto unmap_pkv_err;
|
|
}
|
|
|
|
btcvsd->infra = syscon_regmap_lookup_by_phandle(dev->of_node,
|
|
@@ -1366,7 +1367,8 @@ static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
|
|
if (IS_ERR(btcvsd->infra)) {
|
|
dev_err(dev, "cannot find infra controller: %ld\n",
|
|
PTR_ERR(btcvsd->infra));
|
|
- return PTR_ERR(btcvsd->infra);
|
|
+ ret = PTR_ERR(btcvsd->infra);
|
|
+ goto unmap_bank2_err;
|
|
}
|
|
|
|
/* get offset */
|
|
@@ -1375,7 +1377,7 @@ static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
|
|
ARRAY_SIZE(offset));
|
|
if (ret) {
|
|
dev_warn(dev, "%s(), get offset fail, ret %d\n", __func__, ret);
|
|
- return ret;
|
|
+ goto unmap_bank2_err;
|
|
}
|
|
btcvsd->infra_misc_offset = offset[0];
|
|
btcvsd->conn_bt_cvsd_mask = offset[1];
|
|
@@ -1394,8 +1396,18 @@ static int mtk_btcvsd_snd_probe(struct platform_device *pdev)
|
|
mtk_btcvsd_snd_set_state(btcvsd, btcvsd->tx, BT_SCO_STATE_IDLE);
|
|
mtk_btcvsd_snd_set_state(btcvsd, btcvsd->rx, BT_SCO_STATE_IDLE);
|
|
|
|
- return devm_snd_soc_register_component(dev, &mtk_btcvsd_snd_platform,
|
|
- NULL, 0);
|
|
+ ret = devm_snd_soc_register_component(dev, &mtk_btcvsd_snd_platform,
|
|
+ NULL, 0);
|
|
+ if (ret)
|
|
+ goto unmap_bank2_err;
|
|
+
|
|
+ return 0;
|
|
+
|
|
+unmap_bank2_err:
|
|
+ iounmap(btcvsd->bt_sram_bank2_base);
|
|
+unmap_pkv_err:
|
|
+ iounmap(btcvsd->bt_pkv_base);
|
|
+ return ret;
|
|
}
|
|
|
|
static int mtk_btcvsd_snd_remove(struct platform_device *pdev)
|
|
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
|
|
index b9aacf3d3b29c..7532ab27a48df 100644
|
|
--- a/sound/soc/sh/rcar/adg.c
|
|
+++ b/sound/soc/sh/rcar/adg.c
|
|
@@ -289,7 +289,6 @@ static void rsnd_adg_set_ssi_clk(struct rsnd_mod *ssi_mod, u32 val)
|
|
int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
|
|
{
|
|
struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
|
|
- struct clk *clk;
|
|
int i;
|
|
int sel_table[] = {
|
|
[CLKA] = 0x1,
|
|
@@ -302,10 +301,9 @@ int rsnd_adg_clk_query(struct rsnd_priv *priv, unsigned int rate)
|
|
* find suitable clock from
|
|
* AUDIO_CLKA/AUDIO_CLKB/AUDIO_CLKC/AUDIO_CLKI.
|
|
*/
|
|
- for_each_rsnd_clk(clk, adg, i) {
|
|
+ for (i = 0; i < CLKMAX; i++)
|
|
if (rate == adg->clk_rate[i])
|
|
return sel_table[i];
|
|
- }
|
|
|
|
/*
|
|
* find divided clock from BRGA/BRGB
|
|
diff --git a/sound/usb/format.c b/sound/usb/format.c
|
|
index 9e9d4c10dfac6..84b66f7c627c4 100644
|
|
--- a/sound/usb/format.c
|
|
+++ b/sound/usb/format.c
|
|
@@ -195,9 +195,11 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
|
|
continue;
|
|
/* C-Media CM6501 mislabels its 96 kHz altsetting */
|
|
/* Terratec Aureon 7.1 USB C-Media 6206, too */
|
|
+ /* Ozone Z90 USB C-Media, too */
|
|
if (rate == 48000 && nr_rates == 1 &&
|
|
(chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
|
|
chip->usb_id == USB_ID(0x0d8c, 0x0102) ||
|
|
+ chip->usb_id == USB_ID(0x0d8c, 0x0078) ||
|
|
chip->usb_id == USB_ID(0x0ccd, 0x00b1)) &&
|
|
fp->altsetting == 5 && fp->maxpacksize == 392)
|
|
rate = 96000;
|
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
|
index f4f8778e907a9..22841ed2411e2 100644
|
|
--- a/sound/usb/mixer.c
|
|
+++ b/sound/usb/mixer.c
|
|
@@ -3241,8 +3241,9 @@ static void snd_usb_mixer_dump_cval(struct snd_info_buffer *buffer,
|
|
struct usb_mixer_elem_list *list)
|
|
{
|
|
struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list);
|
|
- static const char * const val_types[] = {"BOOLEAN", "INV_BOOLEAN",
|
|
- "S8", "U8", "S16", "U16"};
|
|
+ static const char * const val_types[] = {
|
|
+ "BOOLEAN", "INV_BOOLEAN", "S8", "U8", "S16", "U16", "S32", "U32",
|
|
+ };
|
|
snd_iprintf(buffer, " Info: id=%i, control=%i, cmask=0x%x, "
|
|
"channels=%i, type=\"%s\"\n", cval->head.id,
|
|
cval->control, cval->cmask, cval->channels,
|
|
@@ -3598,6 +3599,9 @@ static int restore_mixer_value(struct usb_mixer_elem_list *list)
|
|
struct usb_mixer_elem_info *cval = mixer_elem_list_to_info(list);
|
|
int c, err, idx;
|
|
|
|
+ if (cval->val_type == USB_MIXER_BESPOKEN)
|
|
+ return 0;
|
|
+
|
|
if (cval->cmask) {
|
|
idx = 0;
|
|
for (c = 0; c < MAX_CHANNELS; c++) {
|
|
diff --git a/sound/usb/mixer.h b/sound/usb/mixer.h
|
|
index 01b5e5cc22210..0e813cd85bee7 100644
|
|
--- a/sound/usb/mixer.h
|
|
+++ b/sound/usb/mixer.h
|
|
@@ -55,6 +55,7 @@ enum {
|
|
USB_MIXER_U16,
|
|
USB_MIXER_S32,
|
|
USB_MIXER_U32,
|
|
+ USB_MIXER_BESPOKEN, /* non-standard type */
|
|
};
|
|
|
|
typedef void (*usb_mixer_elem_dump_func_t)(struct snd_info_buffer *buffer,
|
|
diff --git a/sound/usb/mixer_scarlett_gen2.c b/sound/usb/mixer_scarlett_gen2.c
|
|
index 7a10c9e22c46c..54bcf1c14bc24 100644
|
|
--- a/sound/usb/mixer_scarlett_gen2.c
|
|
+++ b/sound/usb/mixer_scarlett_gen2.c
|
|
@@ -949,10 +949,15 @@ static int scarlett2_add_new_ctl(struct usb_mixer_interface *mixer,
|
|
if (!elem)
|
|
return -ENOMEM;
|
|
|
|
+ /* We set USB_MIXER_BESPOKEN type, so that the core USB mixer code
|
|
+ * ignores them for resume and other operations.
|
|
+ * Also, the head.id field is set to 0, as we don't use this field.
|
|
+ */
|
|
elem->head.mixer = mixer;
|
|
elem->control = index;
|
|
- elem->head.id = index;
|
|
+ elem->head.id = 0;
|
|
elem->channels = channels;
|
|
+ elem->val_type = USB_MIXER_BESPOKEN;
|
|
|
|
kctl = snd_ctl_new1(ncontrol, elem);
|
|
if (!kctl) {
|
|
diff --git a/tools/bpf/bpftool/main.c b/tools/bpf/bpftool/main.c
|
|
index 93d008687020c..7d3cfb0ccbe61 100644
|
|
--- a/tools/bpf/bpftool/main.c
|
|
+++ b/tools/bpf/bpftool/main.c
|
|
@@ -303,8 +303,10 @@ static int do_batch(int argc, char **argv)
|
|
n_argc = make_args(buf, n_argv, BATCH_ARG_NB_MAX, lines);
|
|
if (!n_argc)
|
|
continue;
|
|
- if (n_argc < 0)
|
|
+ if (n_argc < 0) {
|
|
+ err = n_argc;
|
|
goto err_close;
|
|
+ }
|
|
|
|
if (json_output) {
|
|
jsonw_start_object(json_wtr);
|
|
diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c
|
|
index 8b14e4a7f1dc7..e7c7e3232fc5a 100644
|
|
--- a/tools/perf/util/llvm-utils.c
|
|
+++ b/tools/perf/util/llvm-utils.c
|
|
@@ -502,6 +502,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
|
|
goto errout;
|
|
}
|
|
|
|
+ err = -ENOMEM;
|
|
if (asprintf(&pipe_template, "%s -emit-llvm | %s -march=bpf %s -filetype=obj -o -",
|
|
template, llc_path, opts) < 0) {
|
|
pr_err("ERROR:\tnot enough memory to setup command line\n");
|
|
@@ -522,6 +523,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf,
|
|
|
|
pr_debug("llvm compiling command template: %s\n", template);
|
|
|
|
+ err = -ENOMEM;
|
|
if (asprintf(&command_echo, "echo -n \"%s\"", template) < 0)
|
|
goto errout;
|
|
|
|
diff --git a/tools/testing/selftests/tc-testing/plugin-lib/scapyPlugin.py b/tools/testing/selftests/tc-testing/plugin-lib/scapyPlugin.py
|
|
index 229ee185b27e1..a7b21658af9b4 100644
|
|
--- a/tools/testing/selftests/tc-testing/plugin-lib/scapyPlugin.py
|
|
+++ b/tools/testing/selftests/tc-testing/plugin-lib/scapyPlugin.py
|
|
@@ -36,7 +36,7 @@ class SubPlugin(TdcPlugin):
|
|
for k in scapy_keys:
|
|
if k not in scapyinfo:
|
|
keyfail = True
|
|
- missing_keys.add(k)
|
|
+ missing_keys.append(k)
|
|
if keyfail:
|
|
print('{}: Scapy block present in the test, but is missing info:'
|
|
.format(self.sub_class))
|
|
diff --git a/tools/testing/selftests/x86/protection_keys.c b/tools/testing/selftests/x86/protection_keys.c
|
|
index 47191af466174..a3602148e2ea9 100644
|
|
--- a/tools/testing/selftests/x86/protection_keys.c
|
|
+++ b/tools/testing/selftests/x86/protection_keys.c
|
|
@@ -613,7 +613,6 @@ int alloc_random_pkey(void)
|
|
int nr_alloced = 0;
|
|
int random_index;
|
|
memset(alloced_pkeys, 0, sizeof(alloced_pkeys));
|
|
- srand((unsigned int)time(NULL));
|
|
|
|
/* allocate every possible key and make a note of which ones we got */
|
|
max_nr_pkey_allocs = NR_PKEYS;
|
|
@@ -1479,6 +1478,8 @@ int main(void)
|
|
{
|
|
int nr_iterations = 22;
|
|
|
|
+ srand((unsigned int)time(NULL));
|
|
+
|
|
setup_handlers();
|
|
|
|
printf("has pku: %d\n", cpu_has_pku());
|