Annotation of /trunk/kernel-alx/patches-5.4/0106-5.4.7-all-fixes.patch
Parent Directory | Revision Log
Revision 3487 -
(hide annotations)
(download)
Mon May 11 14:36:01 2020 UTC (4 years, 4 months ago) by niro
File size: 474321 byte(s)
Mon May 11 14:36:01 2020 UTC (4 years, 4 months ago) by niro
File size: 474321 byte(s)
-linux-5.4.7
1 | niro | 3487 | diff --git a/Makefile b/Makefile |
2 | index 20ec7c20279e..0e2e0a034064 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,7 +1,7 @@ | ||
6 | # SPDX-License-Identifier: GPL-2.0 | ||
7 | VERSION = 5 | ||
8 | PATCHLEVEL = 4 | ||
9 | -SUBLEVEL = 6 | ||
10 | +SUBLEVEL = 7 | ||
11 | EXTRAVERSION = | ||
12 | NAME = Kleptomaniac Octopus | ||
13 | |||
14 | diff --git a/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi b/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi | ||
15 | index d1eae47b83f6..82f7ae030600 100644 | ||
16 | --- a/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi | ||
17 | +++ b/arch/arm/boot/dts/motorola-cpcap-mapphone.dtsi | ||
18 | @@ -160,12 +160,12 @@ | ||
19 | regulator-enable-ramp-delay = <1000>; | ||
20 | }; | ||
21 | |||
22 | - /* Used by DSS */ | ||
23 | + /* Used by DSS and is the "zerov_regulator" trigger for SoC off mode */ | ||
24 | vcsi: VCSI { | ||
25 | regulator-min-microvolt = <1800000>; | ||
26 | regulator-max-microvolt = <1800000>; | ||
27 | regulator-enable-ramp-delay = <1000>; | ||
28 | - regulator-boot-on; | ||
29 | + regulator-always-on; | ||
30 | }; | ||
31 | |||
32 | vdac: VDAC { | ||
33 | diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c | ||
34 | index c9f72b2665f1..43ae4e0c968f 100644 | ||
35 | --- a/arch/arm64/kernel/psci.c | ||
36 | +++ b/arch/arm64/kernel/psci.c | ||
37 | @@ -81,7 +81,8 @@ static void cpu_psci_cpu_die(unsigned int cpu) | ||
38 | |||
39 | static int cpu_psci_cpu_kill(unsigned int cpu) | ||
40 | { | ||
41 | - int err, i; | ||
42 | + int err; | ||
43 | + unsigned long start, end; | ||
44 | |||
45 | if (!psci_ops.affinity_info) | ||
46 | return 0; | ||
47 | @@ -91,16 +92,18 @@ static int cpu_psci_cpu_kill(unsigned int cpu) | ||
48 | * while it is dying. So, try again a few times. | ||
49 | */ | ||
50 | |||
51 | - for (i = 0; i < 10; i++) { | ||
52 | + start = jiffies; | ||
53 | + end = start + msecs_to_jiffies(100); | ||
54 | + do { | ||
55 | err = psci_ops.affinity_info(cpu_logical_map(cpu), 0); | ||
56 | if (err == PSCI_0_2_AFFINITY_LEVEL_OFF) { | ||
57 | - pr_info("CPU%d killed.\n", cpu); | ||
58 | + pr_info("CPU%d killed (polled %d ms)\n", cpu, | ||
59 | + jiffies_to_msecs(jiffies - start)); | ||
60 | return 0; | ||
61 | } | ||
62 | |||
63 | - msleep(10); | ||
64 | - pr_info("Retrying again to check for CPU kill\n"); | ||
65 | - } | ||
66 | + usleep_range(100, 1000); | ||
67 | + } while (time_before(jiffies, end)); | ||
68 | |||
69 | pr_warn("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n", | ||
70 | cpu, err); | ||
71 | diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c | ||
72 | index 46822afc57e0..01a515e0171e 100644 | ||
73 | --- a/arch/arm64/kvm/sys_regs.c | ||
74 | +++ b/arch/arm64/kvm/sys_regs.c | ||
75 | @@ -2360,8 +2360,11 @@ static const struct sys_reg_desc *index_to_sys_reg_desc(struct kvm_vcpu *vcpu, | ||
76 | if ((id & KVM_REG_ARM_COPROC_MASK) != KVM_REG_ARM64_SYSREG) | ||
77 | return NULL; | ||
78 | |||
79 | + if (!index_to_params(id, ¶ms)) | ||
80 | + return NULL; | ||
81 | + | ||
82 | table = get_target_table(vcpu->arch.target, true, &num); | ||
83 | - r = find_reg_by_id(id, ¶ms, table, num); | ||
84 | + r = find_reg(¶ms, table, num); | ||
85 | if (!r) | ||
86 | r = find_reg(¶ms, sys_reg_descs, ARRAY_SIZE(sys_reg_descs)); | ||
87 | |||
88 | diff --git a/arch/mips/include/asm/barrier.h b/arch/mips/include/asm/barrier.h | ||
89 | index 9228f7386220..fb842965d541 100644 | ||
90 | --- a/arch/mips/include/asm/barrier.h | ||
91 | +++ b/arch/mips/include/asm/barrier.h | ||
92 | @@ -218,13 +218,14 @@ | ||
93 | * ordering will be done by smp_llsc_mb() and friends. | ||
94 | */ | ||
95 | #if defined(CONFIG_WEAK_REORDERING_BEYOND_LLSC) && defined(CONFIG_SMP) | ||
96 | -#define __WEAK_LLSC_MB " sync \n" | ||
97 | -#define smp_llsc_mb() __asm__ __volatile__(__WEAK_LLSC_MB : : :"memory") | ||
98 | -#define __LLSC_CLOBBER | ||
99 | +# define __WEAK_LLSC_MB sync | ||
100 | +# define smp_llsc_mb() \ | ||
101 | + __asm__ __volatile__(__stringify(__WEAK_LLSC_MB) : : :"memory") | ||
102 | +# define __LLSC_CLOBBER | ||
103 | #else | ||
104 | -#define __WEAK_LLSC_MB " \n" | ||
105 | -#define smp_llsc_mb() do { } while (0) | ||
106 | -#define __LLSC_CLOBBER "memory" | ||
107 | +# define __WEAK_LLSC_MB | ||
108 | +# define smp_llsc_mb() do { } while (0) | ||
109 | +# define __LLSC_CLOBBER "memory" | ||
110 | #endif | ||
111 | |||
112 | #ifdef CONFIG_CPU_CAVIUM_OCTEON | ||
113 | diff --git a/arch/mips/include/asm/futex.h b/arch/mips/include/asm/futex.h | ||
114 | index b83b0397462d..110220705e97 100644 | ||
115 | --- a/arch/mips/include/asm/futex.h | ||
116 | +++ b/arch/mips/include/asm/futex.h | ||
117 | @@ -16,6 +16,7 @@ | ||
118 | #include <asm/barrier.h> | ||
119 | #include <asm/compiler.h> | ||
120 | #include <asm/errno.h> | ||
121 | +#include <asm/sync.h> | ||
122 | #include <asm/war.h> | ||
123 | |||
124 | #define __futex_atomic_op(insn, ret, oldval, uaddr, oparg) \ | ||
125 | @@ -32,7 +33,7 @@ | ||
126 | " .set arch=r4000 \n" \ | ||
127 | "2: sc $1, %2 \n" \ | ||
128 | " beqzl $1, 1b \n" \ | ||
129 | - __WEAK_LLSC_MB \ | ||
130 | + __stringify(__WEAK_LLSC_MB) " \n" \ | ||
131 | "3: \n" \ | ||
132 | " .insn \n" \ | ||
133 | " .set pop \n" \ | ||
134 | @@ -50,19 +51,19 @@ | ||
135 | "i" (-EFAULT) \ | ||
136 | : "memory"); \ | ||
137 | } else if (cpu_has_llsc) { \ | ||
138 | - loongson_llsc_mb(); \ | ||
139 | __asm__ __volatile__( \ | ||
140 | " .set push \n" \ | ||
141 | " .set noat \n" \ | ||
142 | " .set push \n" \ | ||
143 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ | ||
144 | + " " __SYNC(full, loongson3_war) " \n" \ | ||
145 | "1: "user_ll("%1", "%4")" # __futex_atomic_op\n" \ | ||
146 | " .set pop \n" \ | ||
147 | " " insn " \n" \ | ||
148 | " .set "MIPS_ISA_ARCH_LEVEL" \n" \ | ||
149 | "2: "user_sc("$1", "%2")" \n" \ | ||
150 | " beqz $1, 1b \n" \ | ||
151 | - __WEAK_LLSC_MB \ | ||
152 | + __stringify(__WEAK_LLSC_MB) " \n" \ | ||
153 | "3: \n" \ | ||
154 | " .insn \n" \ | ||
155 | " .set pop \n" \ | ||
156 | @@ -147,7 +148,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
157 | " .set arch=r4000 \n" | ||
158 | "2: sc $1, %2 \n" | ||
159 | " beqzl $1, 1b \n" | ||
160 | - __WEAK_LLSC_MB | ||
161 | + __stringify(__WEAK_LLSC_MB) " \n" | ||
162 | "3: \n" | ||
163 | " .insn \n" | ||
164 | " .set pop \n" | ||
165 | @@ -164,13 +165,13 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
166 | "i" (-EFAULT) | ||
167 | : "memory"); | ||
168 | } else if (cpu_has_llsc) { | ||
169 | - loongson_llsc_mb(); | ||
170 | __asm__ __volatile__( | ||
171 | "# futex_atomic_cmpxchg_inatomic \n" | ||
172 | " .set push \n" | ||
173 | " .set noat \n" | ||
174 | " .set push \n" | ||
175 | " .set "MIPS_ISA_ARCH_LEVEL" \n" | ||
176 | + " " __SYNC(full, loongson3_war) " \n" | ||
177 | "1: "user_ll("%1", "%3")" \n" | ||
178 | " bne %1, %z4, 3f \n" | ||
179 | " .set pop \n" | ||
180 | @@ -178,8 +179,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
181 | " .set "MIPS_ISA_ARCH_LEVEL" \n" | ||
182 | "2: "user_sc("$1", "%2")" \n" | ||
183 | " beqz $1, 1b \n" | ||
184 | - __WEAK_LLSC_MB | ||
185 | - "3: \n" | ||
186 | + "3: " __SYNC_ELSE(full, loongson3_war, __WEAK_LLSC_MB) "\n" | ||
187 | " .insn \n" | ||
188 | " .set pop \n" | ||
189 | " .section .fixup,\"ax\" \n" | ||
190 | @@ -194,7 +194,6 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
191 | : GCC_OFF_SMALL_ASM() (*uaddr), "Jr" (oldval), "Jr" (newval), | ||
192 | "i" (-EFAULT) | ||
193 | : "memory"); | ||
194 | - loongson_llsc_mb(); | ||
195 | } else | ||
196 | return -ENOSYS; | ||
197 | |||
198 | diff --git a/arch/mips/include/asm/pgtable-64.h b/arch/mips/include/asm/pgtable-64.h | ||
199 | index 93a9dce31f25..813dfe5f45a5 100644 | ||
200 | --- a/arch/mips/include/asm/pgtable-64.h | ||
201 | +++ b/arch/mips/include/asm/pgtable-64.h | ||
202 | @@ -18,10 +18,12 @@ | ||
203 | #include <asm/fixmap.h> | ||
204 | |||
205 | #define __ARCH_USE_5LEVEL_HACK | ||
206 | -#if defined(CONFIG_PAGE_SIZE_64KB) && !defined(CONFIG_MIPS_VA_BITS_48) | ||
207 | +#if CONFIG_PGTABLE_LEVELS == 2 | ||
208 | #include <asm-generic/pgtable-nopmd.h> | ||
209 | -#elif !(defined(CONFIG_PAGE_SIZE_4KB) && defined(CONFIG_MIPS_VA_BITS_48)) | ||
210 | +#elif CONFIG_PGTABLE_LEVELS == 3 | ||
211 | #include <asm-generic/pgtable-nopud.h> | ||
212 | +#else | ||
213 | +#include <asm-generic/5level-fixup.h> | ||
214 | #endif | ||
215 | |||
216 | /* | ||
217 | @@ -216,6 +218,9 @@ static inline unsigned long pgd_page_vaddr(pgd_t pgd) | ||
218 | return pgd_val(pgd); | ||
219 | } | ||
220 | |||
221 | +#define pgd_phys(pgd) virt_to_phys((void *)pgd_val(pgd)) | ||
222 | +#define pgd_page(pgd) (pfn_to_page(pgd_phys(pgd) >> PAGE_SHIFT)) | ||
223 | + | ||
224 | static inline pud_t *pud_offset(pgd_t *pgd, unsigned long address) | ||
225 | { | ||
226 | return (pud_t *)pgd_page_vaddr(*pgd) + pud_index(address); | ||
227 | diff --git a/arch/mips/ralink/Kconfig b/arch/mips/ralink/Kconfig | ||
228 | index 1434fa60f3db..94e9ce994494 100644 | ||
229 | --- a/arch/mips/ralink/Kconfig | ||
230 | +++ b/arch/mips/ralink/Kconfig | ||
231 | @@ -51,6 +51,7 @@ choice | ||
232 | select MIPS_GIC | ||
233 | select COMMON_CLK | ||
234 | select CLKSRC_MIPS_GIC | ||
235 | + select HAVE_PCI if PCI_MT7621 | ||
236 | endchoice | ||
237 | |||
238 | choice | ||
239 | diff --git a/arch/powerpc/include/asm/spinlock.h b/arch/powerpc/include/asm/spinlock.h | ||
240 | index e9a960e28f3c..cac95a3f30c2 100644 | ||
241 | --- a/arch/powerpc/include/asm/spinlock.h | ||
242 | +++ b/arch/powerpc/include/asm/spinlock.h | ||
243 | @@ -36,10 +36,12 @@ | ||
244 | #endif | ||
245 | |||
246 | #ifdef CONFIG_PPC_PSERIES | ||
247 | +DECLARE_STATIC_KEY_FALSE(shared_processor); | ||
248 | + | ||
249 | #define vcpu_is_preempted vcpu_is_preempted | ||
250 | static inline bool vcpu_is_preempted(int cpu) | ||
251 | { | ||
252 | - if (!firmware_has_feature(FW_FEATURE_SPLPAR)) | ||
253 | + if (!static_branch_unlikely(&shared_processor)) | ||
254 | return false; | ||
255 | return !!(be32_to_cpu(lppaca_of(cpu).yield_count) & 1); | ||
256 | } | ||
257 | diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c | ||
258 | index 5645bc9cbc09..add67498c126 100644 | ||
259 | --- a/arch/powerpc/kernel/irq.c | ||
260 | +++ b/arch/powerpc/kernel/irq.c | ||
261 | @@ -619,8 +619,6 @@ void __do_irq(struct pt_regs *regs) | ||
262 | |||
263 | trace_irq_entry(regs); | ||
264 | |||
265 | - check_stack_overflow(); | ||
266 | - | ||
267 | /* | ||
268 | * Query the platform PIC for the interrupt & ack it. | ||
269 | * | ||
270 | @@ -652,6 +650,8 @@ void do_IRQ(struct pt_regs *regs) | ||
271 | irqsp = hardirq_ctx[raw_smp_processor_id()]; | ||
272 | sirqsp = softirq_ctx[raw_smp_processor_id()]; | ||
273 | |||
274 | + check_stack_overflow(); | ||
275 | + | ||
276 | /* Already there ? */ | ||
277 | if (unlikely(cursp == irqsp || cursp == sirqsp)) { | ||
278 | __do_irq(regs); | ||
279 | diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
280 | index 0496e66aaa56..c6fbbd29bd87 100644 | ||
281 | --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
282 | +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S | ||
283 | @@ -1117,7 +1117,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | ||
284 | ld r7, VCPU_GPR(R7)(r4) | ||
285 | bne ret_to_ultra | ||
286 | |||
287 | - lwz r0, VCPU_CR(r4) | ||
288 | + ld r0, VCPU_CR(r4) | ||
289 | mtcr r0 | ||
290 | |||
291 | ld r0, VCPU_GPR(R0)(r4) | ||
292 | @@ -1137,7 +1137,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) | ||
293 | * R3 = UV_RETURN | ||
294 | */ | ||
295 | ret_to_ultra: | ||
296 | - lwz r0, VCPU_CR(r4) | ||
297 | + ld r0, VCPU_CR(r4) | ||
298 | mtcr r0 | ||
299 | |||
300 | ld r0, VCPU_GPR(R3)(r4) | ||
301 | diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c | ||
302 | index 0a40201f315f..0c8421dd01ab 100644 | ||
303 | --- a/arch/powerpc/platforms/pseries/setup.c | ||
304 | +++ b/arch/powerpc/platforms/pseries/setup.c | ||
305 | @@ -74,6 +74,9 @@ | ||
306 | #include "pseries.h" | ||
307 | #include "../../../../drivers/pci/pci.h" | ||
308 | |||
309 | +DEFINE_STATIC_KEY_FALSE(shared_processor); | ||
310 | +EXPORT_SYMBOL_GPL(shared_processor); | ||
311 | + | ||
312 | int CMO_PrPSP = -1; | ||
313 | int CMO_SecPSP = -1; | ||
314 | unsigned long CMO_PageSize = (ASM_CONST(1) << IOMMU_PAGE_SHIFT_4K); | ||
315 | @@ -758,6 +761,10 @@ static void __init pSeries_setup_arch(void) | ||
316 | |||
317 | if (firmware_has_feature(FW_FEATURE_LPAR)) { | ||
318 | vpa_init(boot_cpuid); | ||
319 | + | ||
320 | + if (lppaca_shared_proc(get_lppaca())) | ||
321 | + static_branch_enable(&shared_processor); | ||
322 | + | ||
323 | ppc_md.power_save = pseries_lpar_idle; | ||
324 | ppc_md.enable_pmcs = pseries_lpar_enable_pmcs; | ||
325 | #ifdef CONFIG_PCI_IOV | ||
326 | diff --git a/arch/s390/crypto/sha_common.c b/arch/s390/crypto/sha_common.c | ||
327 | index d39e0f079217..686fe7aa192f 100644 | ||
328 | --- a/arch/s390/crypto/sha_common.c | ||
329 | +++ b/arch/s390/crypto/sha_common.c | ||
330 | @@ -74,14 +74,17 @@ int s390_sha_final(struct shash_desc *desc, u8 *out) | ||
331 | struct s390_sha_ctx *ctx = shash_desc_ctx(desc); | ||
332 | unsigned int bsize = crypto_shash_blocksize(desc->tfm); | ||
333 | u64 bits; | ||
334 | - unsigned int n, mbl_offset; | ||
335 | + unsigned int n; | ||
336 | + int mbl_offset; | ||
337 | |||
338 | n = ctx->count % bsize; | ||
339 | bits = ctx->count * 8; | ||
340 | - mbl_offset = s390_crypto_shash_parmsize(ctx->func) / sizeof(u32); | ||
341 | + mbl_offset = s390_crypto_shash_parmsize(ctx->func); | ||
342 | if (mbl_offset < 0) | ||
343 | return -EINVAL; | ||
344 | |||
345 | + mbl_offset = mbl_offset / sizeof(u32); | ||
346 | + | ||
347 | /* set total msg bit length (mbl) in CPACF parmblock */ | ||
348 | switch (ctx->func) { | ||
349 | case CPACF_KLMD_SHA_1: | ||
350 | diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h | ||
351 | index bccb8f4a63e2..77606c4acd58 100644 | ||
352 | --- a/arch/s390/include/asm/pgalloc.h | ||
353 | +++ b/arch/s390/include/asm/pgalloc.h | ||
354 | @@ -56,7 +56,12 @@ static inline p4d_t *p4d_alloc_one(struct mm_struct *mm, unsigned long address) | ||
355 | crst_table_init(table, _REGION2_ENTRY_EMPTY); | ||
356 | return (p4d_t *) table; | ||
357 | } | ||
358 | -#define p4d_free(mm, p4d) crst_table_free(mm, (unsigned long *) p4d) | ||
359 | + | ||
360 | +static inline void p4d_free(struct mm_struct *mm, p4d_t *p4d) | ||
361 | +{ | ||
362 | + if (!mm_p4d_folded(mm)) | ||
363 | + crst_table_free(mm, (unsigned long *) p4d); | ||
364 | +} | ||
365 | |||
366 | static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) | ||
367 | { | ||
368 | @@ -65,7 +70,12 @@ static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address) | ||
369 | crst_table_init(table, _REGION3_ENTRY_EMPTY); | ||
370 | return (pud_t *) table; | ||
371 | } | ||
372 | -#define pud_free(mm, pud) crst_table_free(mm, (unsigned long *) pud) | ||
373 | + | ||
374 | +static inline void pud_free(struct mm_struct *mm, pud_t *pud) | ||
375 | +{ | ||
376 | + if (!mm_pud_folded(mm)) | ||
377 | + crst_table_free(mm, (unsigned long *) pud); | ||
378 | +} | ||
379 | |||
380 | static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | ||
381 | { | ||
382 | @@ -83,6 +93,8 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long vmaddr) | ||
383 | |||
384 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) | ||
385 | { | ||
386 | + if (mm_pmd_folded(mm)) | ||
387 | + return; | ||
388 | pgtable_pmd_page_dtor(virt_to_page(pmd)); | ||
389 | crst_table_free(mm, (unsigned long *) pmd); | ||
390 | } | ||
391 | diff --git a/arch/s390/include/asm/timex.h b/arch/s390/include/asm/timex.h | ||
392 | index 64539c221672..2dc9eb4e1acc 100644 | ||
393 | --- a/arch/s390/include/asm/timex.h | ||
394 | +++ b/arch/s390/include/asm/timex.h | ||
395 | @@ -10,8 +10,9 @@ | ||
396 | #ifndef _ASM_S390_TIMEX_H | ||
397 | #define _ASM_S390_TIMEX_H | ||
398 | |||
399 | -#include <asm/lowcore.h> | ||
400 | +#include <linux/preempt.h> | ||
401 | #include <linux/time64.h> | ||
402 | +#include <asm/lowcore.h> | ||
403 | |||
404 | /* The value of the TOD clock for 1.1.1970. */ | ||
405 | #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL | ||
406 | @@ -186,15 +187,18 @@ extern unsigned char tod_clock_base[16] __aligned(8); | ||
407 | /** | ||
408 | * get_clock_monotonic - returns current time in clock rate units | ||
409 | * | ||
410 | - * The caller must ensure that preemption is disabled. | ||
411 | * The clock and tod_clock_base get changed via stop_machine. | ||
412 | - * Therefore preemption must be disabled when calling this | ||
413 | - * function, otherwise the returned value is not guaranteed to | ||
414 | - * be monotonic. | ||
415 | + * Therefore preemption must be disabled, otherwise the returned | ||
416 | + * value is not guaranteed to be monotonic. | ||
417 | */ | ||
418 | static inline unsigned long long get_tod_clock_monotonic(void) | ||
419 | { | ||
420 | - return get_tod_clock() - *(unsigned long long *) &tod_clock_base[1]; | ||
421 | + unsigned long long tod; | ||
422 | + | ||
423 | + preempt_disable_notrace(); | ||
424 | + tod = get_tod_clock() - *(unsigned long long *) &tod_clock_base[1]; | ||
425 | + preempt_enable_notrace(); | ||
426 | + return tod; | ||
427 | } | ||
428 | |||
429 | /** | ||
430 | diff --git a/arch/s390/kernel/dis.c b/arch/s390/kernel/dis.c | ||
431 | index 7abe6ae261b4..f304802ecf7b 100644 | ||
432 | --- a/arch/s390/kernel/dis.c | ||
433 | +++ b/arch/s390/kernel/dis.c | ||
434 | @@ -461,10 +461,11 @@ static int print_insn(char *buffer, unsigned char *code, unsigned long addr) | ||
435 | ptr += sprintf(ptr, "%%c%i", value); | ||
436 | else if (operand->flags & OPERAND_VR) | ||
437 | ptr += sprintf(ptr, "%%v%i", value); | ||
438 | - else if (operand->flags & OPERAND_PCREL) | ||
439 | - ptr += sprintf(ptr, "%lx", (signed int) value | ||
440 | - + addr); | ||
441 | - else if (operand->flags & OPERAND_SIGNED) | ||
442 | + else if (operand->flags & OPERAND_PCREL) { | ||
443 | + void *pcrel = (void *)((int)value + addr); | ||
444 | + | ||
445 | + ptr += sprintf(ptr, "%px", pcrel); | ||
446 | + } else if (operand->flags & OPERAND_SIGNED) | ||
447 | ptr += sprintf(ptr, "%i", value); | ||
448 | else | ||
449 | ptr += sprintf(ptr, "%u", value); | ||
450 | @@ -536,7 +537,7 @@ void show_code(struct pt_regs *regs) | ||
451 | else | ||
452 | *ptr++ = ' '; | ||
453 | addr = regs->psw.addr + start - 32; | ||
454 | - ptr += sprintf(ptr, "%016lx: ", addr); | ||
455 | + ptr += sprintf(ptr, "%px: ", (void *)addr); | ||
456 | if (start + opsize >= end) | ||
457 | break; | ||
458 | for (i = 0; i < opsize; i++) | ||
459 | @@ -564,7 +565,7 @@ void print_fn_code(unsigned char *code, unsigned long len) | ||
460 | opsize = insn_length(*code); | ||
461 | if (opsize > len) | ||
462 | break; | ||
463 | - ptr += sprintf(ptr, "%p: ", code); | ||
464 | + ptr += sprintf(ptr, "%px: ", code); | ||
465 | for (i = 0; i < opsize; i++) | ||
466 | ptr += sprintf(ptr, "%02x", code[i]); | ||
467 | *ptr++ = '\t'; | ||
468 | diff --git a/arch/s390/kernel/perf_cpum_cf.c b/arch/s390/kernel/perf_cpum_cf.c | ||
469 | index 48d48b6187c0..0eb1d1cc53a8 100644 | ||
470 | --- a/arch/s390/kernel/perf_cpum_cf.c | ||
471 | +++ b/arch/s390/kernel/perf_cpum_cf.c | ||
472 | @@ -199,7 +199,7 @@ static const int cpumf_generic_events_user[] = { | ||
473 | [PERF_COUNT_HW_BUS_CYCLES] = -1, | ||
474 | }; | ||
475 | |||
476 | -static int __hw_perf_event_init(struct perf_event *event) | ||
477 | +static int __hw_perf_event_init(struct perf_event *event, unsigned int type) | ||
478 | { | ||
479 | struct perf_event_attr *attr = &event->attr; | ||
480 | struct hw_perf_event *hwc = &event->hw; | ||
481 | @@ -207,7 +207,7 @@ static int __hw_perf_event_init(struct perf_event *event) | ||
482 | int err = 0; | ||
483 | u64 ev; | ||
484 | |||
485 | - switch (attr->type) { | ||
486 | + switch (type) { | ||
487 | case PERF_TYPE_RAW: | ||
488 | /* Raw events are used to access counters directly, | ||
489 | * hence do not permit excludes */ | ||
490 | @@ -294,17 +294,16 @@ static int __hw_perf_event_init(struct perf_event *event) | ||
491 | |||
492 | static int cpumf_pmu_event_init(struct perf_event *event) | ||
493 | { | ||
494 | + unsigned int type = event->attr.type; | ||
495 | int err; | ||
496 | |||
497 | - switch (event->attr.type) { | ||
498 | - case PERF_TYPE_HARDWARE: | ||
499 | - case PERF_TYPE_HW_CACHE: | ||
500 | - case PERF_TYPE_RAW: | ||
501 | - err = __hw_perf_event_init(event); | ||
502 | - break; | ||
503 | - default: | ||
504 | + if (type == PERF_TYPE_HARDWARE || type == PERF_TYPE_RAW) | ||
505 | + err = __hw_perf_event_init(event, type); | ||
506 | + else if (event->pmu->type == type) | ||
507 | + /* Registered as unknown PMU */ | ||
508 | + err = __hw_perf_event_init(event, PERF_TYPE_RAW); | ||
509 | + else | ||
510 | return -ENOENT; | ||
511 | - } | ||
512 | |||
513 | if (unlikely(err) && event->destroy) | ||
514 | event->destroy(event); | ||
515 | @@ -553,7 +552,7 @@ static int __init cpumf_pmu_init(void) | ||
516 | return -ENODEV; | ||
517 | |||
518 | cpumf_pmu.attr_groups = cpumf_cf_event_group(); | ||
519 | - rc = perf_pmu_register(&cpumf_pmu, "cpum_cf", PERF_TYPE_RAW); | ||
520 | + rc = perf_pmu_register(&cpumf_pmu, "cpum_cf", -1); | ||
521 | if (rc) | ||
522 | pr_err("Registering the cpum_cf PMU failed with rc=%i\n", rc); | ||
523 | return rc; | ||
524 | diff --git a/arch/s390/kernel/perf_cpum_cf_diag.c b/arch/s390/kernel/perf_cpum_cf_diag.c | ||
525 | index 2654e348801a..e949ab832ed7 100644 | ||
526 | --- a/arch/s390/kernel/perf_cpum_cf_diag.c | ||
527 | +++ b/arch/s390/kernel/perf_cpum_cf_diag.c | ||
528 | @@ -243,13 +243,13 @@ static int cf_diag_event_init(struct perf_event *event) | ||
529 | int err = -ENOENT; | ||
530 | |||
531 | debug_sprintf_event(cf_diag_dbg, 5, | ||
532 | - "%s event %p cpu %d config %#llx " | ||
533 | + "%s event %p cpu %d config %#llx type:%u " | ||
534 | "sample_type %#llx cf_diag_events %d\n", __func__, | ||
535 | - event, event->cpu, attr->config, attr->sample_type, | ||
536 | - atomic_read(&cf_diag_events)); | ||
537 | + event, event->cpu, attr->config, event->pmu->type, | ||
538 | + attr->sample_type, atomic_read(&cf_diag_events)); | ||
539 | |||
540 | if (event->attr.config != PERF_EVENT_CPUM_CF_DIAG || | ||
541 | - event->attr.type != PERF_TYPE_RAW) | ||
542 | + event->attr.type != event->pmu->type) | ||
543 | goto out; | ||
544 | |||
545 | /* Raw events are used to access counters directly, | ||
546 | @@ -693,7 +693,7 @@ static int __init cf_diag_init(void) | ||
547 | } | ||
548 | debug_register_view(cf_diag_dbg, &debug_sprintf_view); | ||
549 | |||
550 | - rc = perf_pmu_register(&cf_diag, "cpum_cf_diag", PERF_TYPE_RAW); | ||
551 | + rc = perf_pmu_register(&cf_diag, "cpum_cf_diag", -1); | ||
552 | if (rc) { | ||
553 | debug_unregister_view(cf_diag_dbg, &debug_sprintf_view); | ||
554 | debug_unregister(cf_diag_dbg); | ||
555 | diff --git a/arch/s390/kernel/perf_event.c b/arch/s390/kernel/perf_event.c | ||
556 | index fcb6c2e92b07..1e75cc983546 100644 | ||
557 | --- a/arch/s390/kernel/perf_event.c | ||
558 | +++ b/arch/s390/kernel/perf_event.c | ||
559 | @@ -224,9 +224,13 @@ void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, | ||
560 | struct pt_regs *regs) | ||
561 | { | ||
562 | struct unwind_state state; | ||
563 | + unsigned long addr; | ||
564 | |||
565 | - unwind_for_each_frame(&state, current, regs, 0) | ||
566 | - perf_callchain_store(entry, state.ip); | ||
567 | + unwind_for_each_frame(&state, current, regs, 0) { | ||
568 | + addr = unwind_get_return_address(&state); | ||
569 | + if (!addr || perf_callchain_store(entry, addr)) | ||
570 | + return; | ||
571 | + } | ||
572 | } | ||
573 | |||
574 | /* Perf definitions for PMU event attributes in sysfs */ | ||
575 | diff --git a/arch/s390/mm/maccess.c b/arch/s390/mm/maccess.c | ||
576 | index 1864a8bb9622..59ad7997fed1 100644 | ||
577 | --- a/arch/s390/mm/maccess.c | ||
578 | +++ b/arch/s390/mm/maccess.c | ||
579 | @@ -70,7 +70,7 @@ void notrace s390_kernel_write(void *dst, const void *src, size_t size) | ||
580 | spin_unlock_irqrestore(&s390_kernel_write_lock, flags); | ||
581 | } | ||
582 | |||
583 | -static int __memcpy_real(void *dest, void *src, size_t count) | ||
584 | +static int __no_sanitize_address __memcpy_real(void *dest, void *src, size_t count) | ||
585 | { | ||
586 | register unsigned long _dest asm("2") = (unsigned long) dest; | ||
587 | register unsigned long _len1 asm("3") = (unsigned long) count; | ||
588 | @@ -91,19 +91,23 @@ static int __memcpy_real(void *dest, void *src, size_t count) | ||
589 | return rc; | ||
590 | } | ||
591 | |||
592 | -static unsigned long _memcpy_real(unsigned long dest, unsigned long src, | ||
593 | - unsigned long count) | ||
594 | +static unsigned long __no_sanitize_address _memcpy_real(unsigned long dest, | ||
595 | + unsigned long src, | ||
596 | + unsigned long count) | ||
597 | { | ||
598 | int irqs_disabled, rc; | ||
599 | unsigned long flags; | ||
600 | |||
601 | if (!count) | ||
602 | return 0; | ||
603 | - flags = __arch_local_irq_stnsm(0xf8UL); | ||
604 | + flags = arch_local_irq_save(); | ||
605 | irqs_disabled = arch_irqs_disabled_flags(flags); | ||
606 | if (!irqs_disabled) | ||
607 | trace_hardirqs_off(); | ||
608 | + __arch_local_irq_stnsm(0xf8); // disable DAT | ||
609 | rc = __memcpy_real((void *) dest, (void *) src, (size_t) count); | ||
610 | + if (flags & PSW_MASK_DAT) | ||
611 | + __arch_local_irq_stosm(0x04); // enable DAT | ||
612 | if (!irqs_disabled) | ||
613 | trace_hardirqs_on(); | ||
614 | __arch_local_irq_ssm(flags); | ||
615 | diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c | ||
616 | index ce88211b9c6c..c8c16b5eed6b 100644 | ||
617 | --- a/arch/s390/net/bpf_jit_comp.c | ||
618 | +++ b/arch/s390/net/bpf_jit_comp.c | ||
619 | @@ -23,6 +23,7 @@ | ||
620 | #include <linux/filter.h> | ||
621 | #include <linux/init.h> | ||
622 | #include <linux/bpf.h> | ||
623 | +#include <linux/mm.h> | ||
624 | #include <asm/cacheflush.h> | ||
625 | #include <asm/dis.h> | ||
626 | #include <asm/facility.h> | ||
627 | @@ -1369,7 +1370,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) | ||
628 | } | ||
629 | |||
630 | memset(&jit, 0, sizeof(jit)); | ||
631 | - jit.addrs = kcalloc(fp->len + 1, sizeof(*jit.addrs), GFP_KERNEL); | ||
632 | + jit.addrs = kvcalloc(fp->len + 1, sizeof(*jit.addrs), GFP_KERNEL); | ||
633 | if (jit.addrs == NULL) { | ||
634 | fp = orig_fp; | ||
635 | goto out; | ||
636 | @@ -1422,7 +1423,7 @@ skip_init_ctx: | ||
637 | if (!fp->is_func || extra_pass) { | ||
638 | bpf_prog_fill_jited_linfo(fp, jit.addrs + 1); | ||
639 | free_addrs: | ||
640 | - kfree(jit.addrs); | ||
641 | + kvfree(jit.addrs); | ||
642 | kfree(jit_data); | ||
643 | fp->aux->jit_data = NULL; | ||
644 | } | ||
645 | diff --git a/arch/sh/include/cpu-sh4/cpu/sh7734.h b/arch/sh/include/cpu-sh4/cpu/sh7734.h | ||
646 | index 96f0246ad2f2..82b63208135a 100644 | ||
647 | --- a/arch/sh/include/cpu-sh4/cpu/sh7734.h | ||
648 | +++ b/arch/sh/include/cpu-sh4/cpu/sh7734.h | ||
649 | @@ -134,7 +134,7 @@ enum { | ||
650 | GPIO_FN_EX_WAIT1, GPIO_FN_SD1_DAT0_A, GPIO_FN_DREQ2, GPIO_FN_CAN1_TX_C, | ||
651 | GPIO_FN_ET0_LINK_C, GPIO_FN_ET0_ETXD5_A, | ||
652 | GPIO_FN_EX_WAIT0, GPIO_FN_TCLK1_B, | ||
653 | - GPIO_FN_RD_WR, GPIO_FN_TCLK0, | ||
654 | + GPIO_FN_RD_WR, GPIO_FN_TCLK0, GPIO_FN_CAN_CLK_B, GPIO_FN_ET0_ETXD4, | ||
655 | GPIO_FN_EX_CS5, GPIO_FN_SD1_CMD_A, GPIO_FN_ATADIR, GPIO_FN_QSSL_B, | ||
656 | GPIO_FN_ET0_ETXD3_A, | ||
657 | GPIO_FN_EX_CS4, GPIO_FN_SD1_WP_A, GPIO_FN_ATAWR, GPIO_FN_QMI_QIO1_B, | ||
658 | diff --git a/arch/x86/include/asm/crash.h b/arch/x86/include/asm/crash.h | ||
659 | index 0acf5ee45a21..ef5638f641f2 100644 | ||
660 | --- a/arch/x86/include/asm/crash.h | ||
661 | +++ b/arch/x86/include/asm/crash.h | ||
662 | @@ -2,6 +2,8 @@ | ||
663 | #ifndef _ASM_X86_CRASH_H | ||
664 | #define _ASM_X86_CRASH_H | ||
665 | |||
666 | +struct kimage; | ||
667 | + | ||
668 | int crash_load_segments(struct kimage *image); | ||
669 | int crash_copy_backup_region(struct kimage *image); | ||
670 | int crash_setup_memmap_entries(struct kimage *image, | ||
671 | diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h | ||
672 | index 0c47aa82e2e2..28183ee3cc42 100644 | ||
673 | --- a/arch/x86/include/asm/fixmap.h | ||
674 | +++ b/arch/x86/include/asm/fixmap.h | ||
675 | @@ -156,7 +156,7 @@ extern pte_t *kmap_pte; | ||
676 | extern pte_t *pkmap_page_table; | ||
677 | |||
678 | void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); | ||
679 | -void native_set_fixmap(enum fixed_addresses idx, | ||
680 | +void native_set_fixmap(unsigned /* enum fixed_addresses */ idx, | ||
681 | phys_addr_t phys, pgprot_t flags); | ||
682 | |||
683 | #ifndef CONFIG_PARAVIRT_XXL | ||
684 | diff --git a/arch/x86/include/asm/syscall_wrapper.h b/arch/x86/include/asm/syscall_wrapper.h | ||
685 | index e046a405743d..90eb70df0b18 100644 | ||
686 | --- a/arch/x86/include/asm/syscall_wrapper.h | ||
687 | +++ b/arch/x86/include/asm/syscall_wrapper.h | ||
688 | @@ -48,12 +48,13 @@ | ||
689 | * To keep the naming coherent, re-define SYSCALL_DEFINE0 to create an alias | ||
690 | * named __ia32_sys_*() | ||
691 | */ | ||
692 | -#define SYSCALL_DEFINE0(sname) \ | ||
693 | - SYSCALL_METADATA(_##sname, 0); \ | ||
694 | - asmlinkage long __x64_sys_##sname(void); \ | ||
695 | - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ | ||
696 | - SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ | ||
697 | - asmlinkage long __x64_sys_##sname(void) | ||
698 | + | ||
699 | +#define SYSCALL_DEFINE0(sname) \ | ||
700 | + SYSCALL_METADATA(_##sname, 0); \ | ||
701 | + asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ | ||
702 | + ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ | ||
703 | + SYSCALL_ALIAS(__ia32_sys_##sname, __x64_sys_##sname); \ | ||
704 | + asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) | ||
705 | |||
706 | #define COND_SYSCALL(name) \ | ||
707 | cond_syscall(__x64_sys_##name); \ | ||
708 | @@ -181,11 +182,11 @@ | ||
709 | * macros to work correctly. | ||
710 | */ | ||
711 | #ifndef SYSCALL_DEFINE0 | ||
712 | -#define SYSCALL_DEFINE0(sname) \ | ||
713 | - SYSCALL_METADATA(_##sname, 0); \ | ||
714 | - asmlinkage long __x64_sys_##sname(void); \ | ||
715 | - ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ | ||
716 | - asmlinkage long __x64_sys_##sname(void) | ||
717 | +#define SYSCALL_DEFINE0(sname) \ | ||
718 | + SYSCALL_METADATA(_##sname, 0); \ | ||
719 | + asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused);\ | ||
720 | + ALLOW_ERROR_INJECTION(__x64_sys_##sname, ERRNO); \ | ||
721 | + asmlinkage long __x64_sys_##sname(const struct pt_regs *__unused) | ||
722 | #endif | ||
723 | |||
724 | #ifndef COND_SYSCALL | ||
725 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c | ||
726 | index d6af97fd170a..f0262cb5657a 100644 | ||
727 | --- a/arch/x86/kernel/apic/io_apic.c | ||
728 | +++ b/arch/x86/kernel/apic/io_apic.c | ||
729 | @@ -1727,9 +1727,10 @@ static bool io_apic_level_ack_pending(struct mp_chip_data *data) | ||
730 | |||
731 | static inline bool ioapic_irqd_mask(struct irq_data *data) | ||
732 | { | ||
733 | - /* If we are moving the irq we need to mask it */ | ||
734 | + /* If we are moving the IRQ we need to mask it */ | ||
735 | if (unlikely(irqd_is_setaffinity_pending(data))) { | ||
736 | - mask_ioapic_irq(data); | ||
737 | + if (!irqd_irq_masked(data)) | ||
738 | + mask_ioapic_irq(data); | ||
739 | return true; | ||
740 | } | ||
741 | return false; | ||
742 | @@ -1766,7 +1767,9 @@ static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked) | ||
743 | */ | ||
744 | if (!io_apic_level_ack_pending(data->chip_data)) | ||
745 | irq_move_masked_irq(data); | ||
746 | - unmask_ioapic_irq(data); | ||
747 | + /* If the IRQ is masked in the core, leave it: */ | ||
748 | + if (!irqd_irq_masked(data)) | ||
749 | + unmask_ioapic_irq(data); | ||
750 | } | ||
751 | } | ||
752 | #else | ||
753 | diff --git a/arch/x86/kernel/cpu/mce/amd.c b/arch/x86/kernel/cpu/mce/amd.c | ||
754 | index 6ea7fdc82f3c..259f3f4e2e5f 100644 | ||
755 | --- a/arch/x86/kernel/cpu/mce/amd.c | ||
756 | +++ b/arch/x86/kernel/cpu/mce/amd.c | ||
757 | @@ -266,10 +266,10 @@ static void smca_configure(unsigned int bank, unsigned int cpu) | ||
758 | smca_set_misc_banks_map(bank, cpu); | ||
759 | |||
760 | /* Return early if this bank was already initialized. */ | ||
761 | - if (smca_banks[bank].hwid) | ||
762 | + if (smca_banks[bank].hwid && smca_banks[bank].hwid->hwid_mcatype != 0) | ||
763 | return; | ||
764 | |||
765 | - if (rdmsr_safe_on_cpu(cpu, MSR_AMD64_SMCA_MCx_IPID(bank), &low, &high)) { | ||
766 | + if (rdmsr_safe(MSR_AMD64_SMCA_MCx_IPID(bank), &low, &high)) { | ||
767 | pr_warn("Failed to read MCA_IPID for bank %d\n", bank); | ||
768 | return; | ||
769 | } | ||
770 | diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c | ||
771 | index 743370ee4983..aecb15ba66cd 100644 | ||
772 | --- a/arch/x86/kernel/cpu/mce/core.c | ||
773 | +++ b/arch/x86/kernel/cpu/mce/core.c | ||
774 | @@ -814,8 +814,8 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp, | ||
775 | if (quirk_no_way_out) | ||
776 | quirk_no_way_out(i, m, regs); | ||
777 | |||
778 | + m->bank = i; | ||
779 | if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) { | ||
780 | - m->bank = i; | ||
781 | mce_read_aux(m, i); | ||
782 | *msg = tmp; | ||
783 | return 1; | ||
784 | diff --git a/arch/x86/kernel/cpu/mce/therm_throt.c b/arch/x86/kernel/cpu/mce/therm_throt.c | ||
785 | index 6e2becf547c5..bc441d68d060 100644 | ||
786 | --- a/arch/x86/kernel/cpu/mce/therm_throt.c | ||
787 | +++ b/arch/x86/kernel/cpu/mce/therm_throt.c | ||
788 | @@ -188,7 +188,7 @@ static void therm_throt_process(bool new_event, int event, int level) | ||
789 | /* if we just entered the thermal event */ | ||
790 | if (new_event) { | ||
791 | if (event == THERMAL_THROTTLING_EVENT) | ||
792 | - pr_crit("CPU%d: %s temperature above threshold, cpu clock throttled (total events = %lu)\n", | ||
793 | + pr_warn("CPU%d: %s temperature above threshold, cpu clock throttled (total events = %lu)\n", | ||
794 | this_cpu, | ||
795 | level == CORE_LEVEL ? "Core" : "Package", | ||
796 | state->count); | ||
797 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c | ||
798 | index 4cba91ec8049..606711f5ebf8 100644 | ||
799 | --- a/arch/x86/kernel/early-quirks.c | ||
800 | +++ b/arch/x86/kernel/early-quirks.c | ||
801 | @@ -710,6 +710,8 @@ static struct chipset early_qrk[] __initdata = { | ||
802 | */ | ||
803 | { PCI_VENDOR_ID_INTEL, 0x0f00, | ||
804 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
805 | + { PCI_VENDOR_ID_INTEL, 0x3e20, | ||
806 | + PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
807 | { PCI_VENDOR_ID_INTEL, 0x3ec4, | ||
808 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, | ||
809 | { PCI_VENDOR_ID_BROADCOM, 0x4331, | ||
810 | diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c | ||
811 | index 53dbcca9af09..b1d5a8c94a57 100644 | ||
812 | --- a/arch/x86/kvm/cpuid.c | ||
813 | +++ b/arch/x86/kvm/cpuid.c | ||
814 | @@ -402,7 +402,8 @@ static inline void do_cpuid_7_mask(struct kvm_cpuid_entry2 *entry, int index) | ||
815 | entry->edx |= F(SPEC_CTRL); | ||
816 | if (boot_cpu_has(X86_FEATURE_STIBP)) | ||
817 | entry->edx |= F(INTEL_STIBP); | ||
818 | - if (boot_cpu_has(X86_FEATURE_SSBD)) | ||
819 | + if (boot_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) || | ||
820 | + boot_cpu_has(X86_FEATURE_AMD_SSBD)) | ||
821 | entry->edx |= F(SPEC_CTRL_SSBD); | ||
822 | /* | ||
823 | * We emulate ARCH_CAPABILITIES in software even | ||
824 | @@ -759,7 +760,8 @@ static inline int __do_cpuid_func(struct kvm_cpuid_entry2 *entry, u32 function, | ||
825 | entry->ebx |= F(AMD_IBRS); | ||
826 | if (boot_cpu_has(X86_FEATURE_STIBP)) | ||
827 | entry->ebx |= F(AMD_STIBP); | ||
828 | - if (boot_cpu_has(X86_FEATURE_SSBD)) | ||
829 | + if (boot_cpu_has(X86_FEATURE_SPEC_CTRL_SSBD) || | ||
830 | + boot_cpu_has(X86_FEATURE_AMD_SSBD)) | ||
831 | entry->ebx |= F(AMD_SSBD); | ||
832 | if (!boot_cpu_has_bug(X86_BUG_SPEC_STORE_BYPASS)) | ||
833 | entry->ebx |= F(AMD_SSB_NO); | ||
834 | diff --git a/arch/x86/lib/x86-opcode-map.txt b/arch/x86/lib/x86-opcode-map.txt | ||
835 | index e0b85930dd77..0a0e9112f284 100644 | ||
836 | --- a/arch/x86/lib/x86-opcode-map.txt | ||
837 | +++ b/arch/x86/lib/x86-opcode-map.txt | ||
838 | @@ -333,7 +333,7 @@ AVXcode: 1 | ||
839 | 06: CLTS | ||
840 | 07: SYSRET (o64) | ||
841 | 08: INVD | ||
842 | -09: WBINVD | ||
843 | +09: WBINVD | WBNOINVD (F3) | ||
844 | 0a: | ||
845 | 0b: UD2 (1B) | ||
846 | 0c: | ||
847 | @@ -364,7 +364,7 @@ AVXcode: 1 | ||
848 | # a ModR/M byte. | ||
849 | 1a: BNDCL Gv,Ev (F3) | BNDCU Gv,Ev (F2) | BNDMOV Gv,Ev (66) | BNDLDX Gv,Ev | ||
850 | 1b: BNDCN Gv,Ev (F2) | BNDMOV Ev,Gv (66) | BNDMK Gv,Ev (F3) | BNDSTX Ev,Gv | ||
851 | -1c: | ||
852 | +1c: Grp20 (1A),(1C) | ||
853 | 1d: | ||
854 | 1e: | ||
855 | 1f: NOP Ev | ||
856 | @@ -792,6 +792,8 @@ f3: Grp17 (1A) | ||
857 | f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) | ||
858 | f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v) | ||
859 | f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) | ||
860 | +f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3) | ||
861 | +f9: MOVDIRI My,Gy | ||
862 | EndTable | ||
863 | |||
864 | Table: 3-byte opcode 2 (0x0f 0x3a) | ||
865 | @@ -943,9 +945,9 @@ GrpTable: Grp6 | ||
866 | EndTable | ||
867 | |||
868 | GrpTable: Grp7 | ||
869 | -0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | ||
870 | -1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ||
871 | -2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ||
872 | +0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | ||
873 | +1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B) | ||
874 | +2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B) | ||
875 | 3: LIDT Ms | ||
876 | 4: SMSW Mw/Rv | ||
877 | 5: rdpkru (110),(11B) | wrpkru (111),(11B) | ||
878 | @@ -1020,7 +1022,7 @@ GrpTable: Grp15 | ||
879 | 3: vstmxcsr Md (v1) | WRGSBASE Ry (F3),(11B) | ||
880 | 4: XSAVE | ptwrite Ey (F3),(11B) | ||
881 | 5: XRSTOR | lfence (11B) | ||
882 | -6: XSAVEOPT | clwb (66) | mfence (11B) | ||
883 | +6: XSAVEOPT | clwb (66) | mfence (11B) | TPAUSE Rd (66),(11B) | UMONITOR Rv (F3),(11B) | UMWAIT Rd (F2),(11B) | ||
884 | 7: clflush | clflushopt (66) | sfence (11B) | ||
885 | EndTable | ||
886 | |||
887 | @@ -1051,6 +1053,10 @@ GrpTable: Grp19 | ||
888 | 6: vscatterpf1qps/d Wx (66),(ev) | ||
889 | EndTable | ||
890 | |||
891 | +GrpTable: Grp20 | ||
892 | +0: cldemote Mb | ||
893 | +EndTable | ||
894 | + | ||
895 | # AMD's Prefetch Group | ||
896 | GrpTable: GrpP | ||
897 | 0: PREFETCH | ||
898 | diff --git a/arch/x86/math-emu/fpu_system.h b/arch/x86/math-emu/fpu_system.h | ||
899 | index f98a0c956764..9b41391867dc 100644 | ||
900 | --- a/arch/x86/math-emu/fpu_system.h | ||
901 | +++ b/arch/x86/math-emu/fpu_system.h | ||
902 | @@ -107,6 +107,8 @@ static inline bool seg_writable(struct desc_struct *d) | ||
903 | #define FPU_access_ok(y,z) if ( !access_ok(y,z) ) \ | ||
904 | math_abort(FPU_info,SIGSEGV) | ||
905 | #define FPU_abort math_abort(FPU_info, SIGSEGV) | ||
906 | +#define FPU_copy_from_user(to, from, n) \ | ||
907 | + do { if (copy_from_user(to, from, n)) FPU_abort; } while (0) | ||
908 | |||
909 | #undef FPU_IGNORE_CODE_SEGV | ||
910 | #ifdef FPU_IGNORE_CODE_SEGV | ||
911 | @@ -122,7 +124,7 @@ static inline bool seg_writable(struct desc_struct *d) | ||
912 | #define FPU_code_access_ok(z) FPU_access_ok((void __user *)FPU_EIP,z) | ||
913 | #endif | ||
914 | |||
915 | -#define FPU_get_user(x,y) get_user((x),(y)) | ||
916 | -#define FPU_put_user(x,y) put_user((x),(y)) | ||
917 | +#define FPU_get_user(x,y) do { if (get_user((x),(y))) FPU_abort; } while (0) | ||
918 | +#define FPU_put_user(x,y) do { if (put_user((x),(y))) FPU_abort; } while (0) | ||
919 | |||
920 | #endif | ||
921 | diff --git a/arch/x86/math-emu/reg_ld_str.c b/arch/x86/math-emu/reg_ld_str.c | ||
922 | index f3779743d15e..fe6246ff9887 100644 | ||
923 | --- a/arch/x86/math-emu/reg_ld_str.c | ||
924 | +++ b/arch/x86/math-emu/reg_ld_str.c | ||
925 | @@ -85,7 +85,7 @@ int FPU_load_extended(long double __user *s, int stnr) | ||
926 | |||
927 | RE_ENTRANT_CHECK_OFF; | ||
928 | FPU_access_ok(s, 10); | ||
929 | - __copy_from_user(sti_ptr, s, 10); | ||
930 | + FPU_copy_from_user(sti_ptr, s, 10); | ||
931 | RE_ENTRANT_CHECK_ON; | ||
932 | |||
933 | return FPU_tagof(sti_ptr); | ||
934 | @@ -1126,9 +1126,9 @@ void frstor(fpu_addr_modes addr_modes, u_char __user *data_address) | ||
935 | /* Copy all registers in stack order. */ | ||
936 | RE_ENTRANT_CHECK_OFF; | ||
937 | FPU_access_ok(s, 80); | ||
938 | - __copy_from_user(register_base + offset, s, other); | ||
939 | + FPU_copy_from_user(register_base + offset, s, other); | ||
940 | if (offset) | ||
941 | - __copy_from_user(register_base, s + other, offset); | ||
942 | + FPU_copy_from_user(register_base, s + other, offset); | ||
943 | RE_ENTRANT_CHECK_ON; | ||
944 | |||
945 | for (i = 0; i < 8; i++) { | ||
946 | diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c | ||
947 | index 3e4b9035bb9a..7bd2c3a52297 100644 | ||
948 | --- a/arch/x86/mm/pgtable.c | ||
949 | +++ b/arch/x86/mm/pgtable.c | ||
950 | @@ -643,8 +643,8 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte) | ||
951 | fixmaps_set++; | ||
952 | } | ||
953 | |||
954 | -void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys, | ||
955 | - pgprot_t flags) | ||
956 | +void native_set_fixmap(unsigned /* enum fixed_addresses */ idx, | ||
957 | + phys_addr_t phys, pgprot_t flags) | ||
958 | { | ||
959 | /* Sanitize 'prot' against any unsupported bits: */ | ||
960 | pgprot_val(flags) &= __default_kernel_pte_mask; | ||
961 | diff --git a/block/blk-iocost.c b/block/blk-iocost.c | ||
962 | index e01267f99183..27ca68621137 100644 | ||
963 | --- a/block/blk-iocost.c | ||
964 | +++ b/block/blk-iocost.c | ||
965 | @@ -1212,7 +1212,7 @@ static enum hrtimer_restart iocg_waitq_timer_fn(struct hrtimer *timer) | ||
966 | return HRTIMER_NORESTART; | ||
967 | } | ||
968 | |||
969 | -static void iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now, u64 cost) | ||
970 | +static bool iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now, u64 cost) | ||
971 | { | ||
972 | struct ioc *ioc = iocg->ioc; | ||
973 | struct blkcg_gq *blkg = iocg_to_blkg(iocg); | ||
974 | @@ -1229,11 +1229,11 @@ static void iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now, u64 cost) | ||
975 | /* clear or maintain depending on the overage */ | ||
976 | if (time_before_eq64(vtime, now->vnow)) { | ||
977 | blkcg_clear_delay(blkg); | ||
978 | - return; | ||
979 | + return false; | ||
980 | } | ||
981 | if (!atomic_read(&blkg->use_delay) && | ||
982 | time_before_eq64(vtime, now->vnow + vmargin)) | ||
983 | - return; | ||
984 | + return false; | ||
985 | |||
986 | /* use delay */ | ||
987 | if (cost) { | ||
988 | @@ -1250,10 +1250,11 @@ static void iocg_kick_delay(struct ioc_gq *iocg, struct ioc_now *now, u64 cost) | ||
989 | oexpires = ktime_to_ns(hrtimer_get_softexpires(&iocg->delay_timer)); | ||
990 | if (hrtimer_is_queued(&iocg->delay_timer) && | ||
991 | abs(oexpires - expires) <= margin_ns / 4) | ||
992 | - return; | ||
993 | + return true; | ||
994 | |||
995 | hrtimer_start_range_ns(&iocg->delay_timer, ns_to_ktime(expires), | ||
996 | margin_ns / 4, HRTIMER_MODE_ABS); | ||
997 | + return true; | ||
998 | } | ||
999 | |||
1000 | static enum hrtimer_restart iocg_delay_timer_fn(struct hrtimer *timer) | ||
1001 | @@ -1739,7 +1740,9 @@ static void ioc_rqos_throttle(struct rq_qos *rqos, struct bio *bio) | ||
1002 | */ | ||
1003 | if (bio_issue_as_root_blkg(bio) || fatal_signal_pending(current)) { | ||
1004 | atomic64_add(abs_cost, &iocg->abs_vdebt); | ||
1005 | - iocg_kick_delay(iocg, &now, cost); | ||
1006 | + if (iocg_kick_delay(iocg, &now, cost)) | ||
1007 | + blkcg_schedule_throttle(rqos->q, | ||
1008 | + (bio->bi_opf & REQ_SWAP) == REQ_SWAP); | ||
1009 | return; | ||
1010 | } | ||
1011 | |||
1012 | diff --git a/crypto/Kconfig b/crypto/Kconfig | ||
1013 | index 9e524044d312..29472fb795f3 100644 | ||
1014 | --- a/crypto/Kconfig | ||
1015 | +++ b/crypto/Kconfig | ||
1016 | @@ -309,6 +309,7 @@ config CRYPTO_AEGIS128 | ||
1017 | config CRYPTO_AEGIS128_SIMD | ||
1018 | bool "Support SIMD acceleration for AEGIS-128" | ||
1019 | depends on CRYPTO_AEGIS128 && ((ARM || ARM64) && KERNEL_MODE_NEON) | ||
1020 | + depends on !ARM || CC_IS_CLANG || GCC_VERSION >= 40800 | ||
1021 | default y | ||
1022 | |||
1023 | config CRYPTO_AEGIS128_AESNI_SSE2 | ||
1024 | diff --git a/crypto/Makefile b/crypto/Makefile | ||
1025 | index fcb1ee679782..aa740c8492b9 100644 | ||
1026 | --- a/crypto/Makefile | ||
1027 | +++ b/crypto/Makefile | ||
1028 | @@ -93,7 +93,7 @@ obj-$(CONFIG_CRYPTO_AEGIS128) += aegis128.o | ||
1029 | aegis128-y := aegis128-core.o | ||
1030 | |||
1031 | ifeq ($(ARCH),arm) | ||
1032 | -CFLAGS_aegis128-neon-inner.o += -ffreestanding -march=armv7-a -mfloat-abi=softfp | ||
1033 | +CFLAGS_aegis128-neon-inner.o += -ffreestanding -march=armv8-a -mfloat-abi=softfp | ||
1034 | CFLAGS_aegis128-neon-inner.o += -mfpu=crypto-neon-fp-armv8 | ||
1035 | aegis128-$(CONFIG_CRYPTO_AEGIS128_SIMD) += aegis128-neon.o aegis128-neon-inner.o | ||
1036 | endif | ||
1037 | diff --git a/crypto/asymmetric_keys/asym_tpm.c b/crypto/asymmetric_keys/asym_tpm.c | ||
1038 | index 76d2ce3a1b5b..5154e280ada2 100644 | ||
1039 | --- a/crypto/asymmetric_keys/asym_tpm.c | ||
1040 | +++ b/crypto/asymmetric_keys/asym_tpm.c | ||
1041 | @@ -486,6 +486,7 @@ static int tpm_key_encrypt(struct tpm_key *tk, | ||
1042 | if (ret < 0) | ||
1043 | goto error_free_tfm; | ||
1044 | |||
1045 | + ret = -ENOMEM; | ||
1046 | req = akcipher_request_alloc(tfm, GFP_KERNEL); | ||
1047 | if (!req) | ||
1048 | goto error_free_tfm; | ||
1049 | diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c | ||
1050 | index 364b9df9d631..d7f43d4ea925 100644 | ||
1051 | --- a/crypto/asymmetric_keys/public_key.c | ||
1052 | +++ b/crypto/asymmetric_keys/public_key.c | ||
1053 | @@ -184,6 +184,7 @@ static int software_key_eds_op(struct kernel_pkey_params *params, | ||
1054 | if (IS_ERR(tfm)) | ||
1055 | return PTR_ERR(tfm); | ||
1056 | |||
1057 | + ret = -ENOMEM; | ||
1058 | req = akcipher_request_alloc(tfm, GFP_KERNEL); | ||
1059 | if (!req) | ||
1060 | goto error_free_tfm; | ||
1061 | diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c | ||
1062 | index 4a2cde2c536a..ce93a355bd1c 100644 | ||
1063 | --- a/drivers/acpi/button.c | ||
1064 | +++ b/drivers/acpi/button.c | ||
1065 | @@ -78,6 +78,17 @@ static const struct dmi_system_id lid_blacklst[] = { | ||
1066 | DMI_MATCH(DMI_BIOS_VERSION, "BYT70A.YNCHENG.WIN.007"), | ||
1067 | }, | ||
1068 | }, | ||
1069 | + { | ||
1070 | + /* | ||
1071 | + * Medion Akoya E2215T, notification of the LID device only | ||
1072 | + * happens on close, not on open and _LID always returns closed. | ||
1073 | + */ | ||
1074 | + .matches = { | ||
1075 | + DMI_MATCH(DMI_SYS_VENDOR, "MEDION"), | ||
1076 | + DMI_MATCH(DMI_PRODUCT_NAME, "E2215T MD60198"), | ||
1077 | + }, | ||
1078 | + .driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN, | ||
1079 | + }, | ||
1080 | {} | ||
1081 | }; | ||
1082 | |||
1083 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c | ||
1084 | index 28c492be0a57..74c9b3032d46 100644 | ||
1085 | --- a/drivers/ata/libata-core.c | ||
1086 | +++ b/drivers/ata/libata-core.c | ||
1087 | @@ -6708,6 +6708,9 @@ void ata_host_detach(struct ata_host *host) | ||
1088 | { | ||
1089 | int i; | ||
1090 | |||
1091 | + /* Ensure ata_port probe has completed */ | ||
1092 | + async_synchronize_full(); | ||
1093 | + | ||
1094 | for (i = 0; i < host->n_ports; i++) | ||
1095 | ata_port_detach(host->ports[i]); | ||
1096 | |||
1097 | diff --git a/drivers/base/firmware_loader/builtin/Makefile b/drivers/base/firmware_loader/builtin/Makefile | ||
1098 | index 37e5ae387400..4a66888e7253 100644 | ||
1099 | --- a/drivers/base/firmware_loader/builtin/Makefile | ||
1100 | +++ b/drivers/base/firmware_loader/builtin/Makefile | ||
1101 | @@ -8,7 +8,8 @@ fwdir := $(addprefix $(srctree)/,$(filter-out /%,$(fwdir)))$(filter /%,$(fwdir)) | ||
1102 | obj-y := $(addsuffix .gen.o, $(subst $(quote),,$(CONFIG_EXTRA_FIRMWARE))) | ||
1103 | |||
1104 | FWNAME = $(patsubst $(obj)/%.gen.S,%,$@) | ||
1105 | -FWSTR = $(subst /,_,$(subst .,_,$(subst -,_,$(FWNAME)))) | ||
1106 | +comma := , | ||
1107 | +FWSTR = $(subst $(comma),_,$(subst /,_,$(subst .,_,$(subst -,_,$(FWNAME))))) | ||
1108 | ASM_WORD = $(if $(CONFIG_64BIT),.quad,.long) | ||
1109 | ASM_ALIGN = $(if $(CONFIG_64BIT),3,2) | ||
1110 | PROGBITS = $(if $(CONFIG_ARM),%,@)progbits | ||
1111 | diff --git a/drivers/block/loop.c b/drivers/block/loop.c | ||
1112 | index f6f77eaa7217..ef6e251857c8 100644 | ||
1113 | --- a/drivers/block/loop.c | ||
1114 | +++ b/drivers/block/loop.c | ||
1115 | @@ -417,18 +417,20 @@ out_free_page: | ||
1116 | return ret; | ||
1117 | } | ||
1118 | |||
1119 | -static int lo_discard(struct loop_device *lo, struct request *rq, loff_t pos) | ||
1120 | +static int lo_fallocate(struct loop_device *lo, struct request *rq, loff_t pos, | ||
1121 | + int mode) | ||
1122 | { | ||
1123 | /* | ||
1124 | - * We use punch hole to reclaim the free space used by the | ||
1125 | - * image a.k.a. discard. However we do not support discard if | ||
1126 | - * encryption is enabled, because it may give an attacker | ||
1127 | - * useful information. | ||
1128 | + * We use fallocate to manipulate the space mappings used by the image | ||
1129 | + * a.k.a. discard/zerorange. However we do not support this if | ||
1130 | + * encryption is enabled, because it may give an attacker useful | ||
1131 | + * information. | ||
1132 | */ | ||
1133 | struct file *file = lo->lo_backing_file; | ||
1134 | - int mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE; | ||
1135 | int ret; | ||
1136 | |||
1137 | + mode |= FALLOC_FL_KEEP_SIZE; | ||
1138 | + | ||
1139 | if ((!file->f_op->fallocate) || lo->lo_encrypt_key_size) { | ||
1140 | ret = -EOPNOTSUPP; | ||
1141 | goto out; | ||
1142 | @@ -596,9 +598,17 @@ static int do_req_filebacked(struct loop_device *lo, struct request *rq) | ||
1143 | switch (req_op(rq)) { | ||
1144 | case REQ_OP_FLUSH: | ||
1145 | return lo_req_flush(lo, rq); | ||
1146 | - case REQ_OP_DISCARD: | ||
1147 | case REQ_OP_WRITE_ZEROES: | ||
1148 | - return lo_discard(lo, rq, pos); | ||
1149 | + /* | ||
1150 | + * If the caller doesn't want deallocation, call zeroout to | ||
1151 | + * write zeroes the range. Otherwise, punch them out. | ||
1152 | + */ | ||
1153 | + return lo_fallocate(lo, rq, pos, | ||
1154 | + (rq->cmd_flags & REQ_NOUNMAP) ? | ||
1155 | + FALLOC_FL_ZERO_RANGE : | ||
1156 | + FALLOC_FL_PUNCH_HOLE); | ||
1157 | + case REQ_OP_DISCARD: | ||
1158 | + return lo_fallocate(lo, rq, pos, FALLOC_FL_PUNCH_HOLE); | ||
1159 | case REQ_OP_WRITE: | ||
1160 | if (lo->transfer) | ||
1161 | return lo_write_transfer(lo, rq, pos); | ||
1162 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c | ||
1163 | index 57532465fb83..b4607dd96185 100644 | ||
1164 | --- a/drivers/block/nbd.c | ||
1165 | +++ b/drivers/block/nbd.c | ||
1166 | @@ -1296,10 +1296,10 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b | ||
1167 | mutex_unlock(&nbd->config_lock); | ||
1168 | ret = wait_event_interruptible(config->recv_wq, | ||
1169 | atomic_read(&config->recv_threads) == 0); | ||
1170 | - if (ret) { | ||
1171 | + if (ret) | ||
1172 | sock_shutdown(nbd); | ||
1173 | - flush_workqueue(nbd->recv_workq); | ||
1174 | - } | ||
1175 | + flush_workqueue(nbd->recv_workq); | ||
1176 | + | ||
1177 | mutex_lock(&nbd->config_lock); | ||
1178 | nbd_bdev_reset(bdev); | ||
1179 | /* user requested, ignore socket errors */ | ||
1180 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
1181 | index a9c35ebb30f8..23e606aaaea4 100644 | ||
1182 | --- a/drivers/bluetooth/btusb.c | ||
1183 | +++ b/drivers/bluetooth/btusb.c | ||
1184 | @@ -3807,8 +3807,8 @@ static int btusb_probe(struct usb_interface *intf, | ||
1185 | btusb_check_needs_reset_resume(intf); | ||
1186 | } | ||
1187 | |||
1188 | -#ifdef CONFIG_BT_HCIBTUSB_RTL | ||
1189 | - if (id->driver_info & BTUSB_REALTEK) { | ||
1190 | + if (IS_ENABLED(CONFIG_BT_HCIBTUSB_RTL) && | ||
1191 | + (id->driver_info & BTUSB_REALTEK)) { | ||
1192 | hdev->setup = btrtl_setup_realtek; | ||
1193 | hdev->shutdown = btrtl_shutdown_realtek; | ||
1194 | hdev->cmd_timeout = btusb_rtl_cmd_timeout; | ||
1195 | @@ -3819,7 +3819,6 @@ static int btusb_probe(struct usb_interface *intf, | ||
1196 | */ | ||
1197 | set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); | ||
1198 | } | ||
1199 | -#endif | ||
1200 | |||
1201 | if (id->driver_info & BTUSB_AMP) { | ||
1202 | /* AMP controllers do not support SCO packets */ | ||
1203 | diff --git a/drivers/char/hw_random/omap3-rom-rng.c b/drivers/char/hw_random/omap3-rom-rng.c | ||
1204 | index 38b719017186..648e39ce6bd9 100644 | ||
1205 | --- a/drivers/char/hw_random/omap3-rom-rng.c | ||
1206 | +++ b/drivers/char/hw_random/omap3-rom-rng.c | ||
1207 | @@ -121,7 +121,8 @@ static int omap3_rom_rng_remove(struct platform_device *pdev) | ||
1208 | { | ||
1209 | cancel_delayed_work_sync(&idle_work); | ||
1210 | hwrng_unregister(&omap3_rom_rng_ops); | ||
1211 | - clk_disable_unprepare(rng_clk); | ||
1212 | + if (!rng_idle) | ||
1213 | + clk_disable_unprepare(rng_clk); | ||
1214 | return 0; | ||
1215 | } | ||
1216 | |||
1217 | diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c | ||
1218 | index 2aab80e19ae0..3c8a559506e8 100644 | ||
1219 | --- a/drivers/char/ipmi/ipmi_msghandler.c | ||
1220 | +++ b/drivers/char/ipmi/ipmi_msghandler.c | ||
1221 | @@ -448,6 +448,8 @@ enum ipmi_stat_indexes { | ||
1222 | |||
1223 | #define IPMI_IPMB_NUM_SEQ 64 | ||
1224 | struct ipmi_smi { | ||
1225 | + struct module *owner; | ||
1226 | + | ||
1227 | /* What interface number are we? */ | ||
1228 | int intf_num; | ||
1229 | |||
1230 | @@ -1220,6 +1222,11 @@ int ipmi_create_user(unsigned int if_num, | ||
1231 | if (rv) | ||
1232 | goto out_kfree; | ||
1233 | |||
1234 | + if (!try_module_get(intf->owner)) { | ||
1235 | + rv = -ENODEV; | ||
1236 | + goto out_kfree; | ||
1237 | + } | ||
1238 | + | ||
1239 | /* Note that each existing user holds a refcount to the interface. */ | ||
1240 | kref_get(&intf->refcount); | ||
1241 | |||
1242 | @@ -1349,6 +1356,7 @@ static void _ipmi_destroy_user(struct ipmi_user *user) | ||
1243 | } | ||
1244 | |||
1245 | kref_put(&intf->refcount, intf_free); | ||
1246 | + module_put(intf->owner); | ||
1247 | } | ||
1248 | |||
1249 | int ipmi_destroy_user(struct ipmi_user *user) | ||
1250 | @@ -2459,7 +2467,7 @@ static int __get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc) | ||
1251 | * been recently fetched, this will just use the cached data. Otherwise | ||
1252 | * it will run a new fetch. | ||
1253 | * | ||
1254 | - * Except for the first time this is called (in ipmi_register_smi()), | ||
1255 | + * Except for the first time this is called (in ipmi_add_smi()), | ||
1256 | * this will always return good data; | ||
1257 | */ | ||
1258 | static int __bmc_get_device_id(struct ipmi_smi *intf, struct bmc_device *bmc, | ||
1259 | @@ -3377,10 +3385,11 @@ static void redo_bmc_reg(struct work_struct *work) | ||
1260 | kref_put(&intf->refcount, intf_free); | ||
1261 | } | ||
1262 | |||
1263 | -int ipmi_register_smi(const struct ipmi_smi_handlers *handlers, | ||
1264 | - void *send_info, | ||
1265 | - struct device *si_dev, | ||
1266 | - unsigned char slave_addr) | ||
1267 | +int ipmi_add_smi(struct module *owner, | ||
1268 | + const struct ipmi_smi_handlers *handlers, | ||
1269 | + void *send_info, | ||
1270 | + struct device *si_dev, | ||
1271 | + unsigned char slave_addr) | ||
1272 | { | ||
1273 | int i, j; | ||
1274 | int rv; | ||
1275 | @@ -3406,7 +3415,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers, | ||
1276 | return rv; | ||
1277 | } | ||
1278 | |||
1279 | - | ||
1280 | + intf->owner = owner; | ||
1281 | intf->bmc = &intf->tmp_bmc; | ||
1282 | INIT_LIST_HEAD(&intf->bmc->intfs); | ||
1283 | mutex_init(&intf->bmc->dyn_mutex); | ||
1284 | @@ -3514,7 +3523,7 @@ int ipmi_register_smi(const struct ipmi_smi_handlers *handlers, | ||
1285 | |||
1286 | return rv; | ||
1287 | } | ||
1288 | -EXPORT_SYMBOL(ipmi_register_smi); | ||
1289 | +EXPORT_SYMBOL(ipmi_add_smi); | ||
1290 | |||
1291 | static void deliver_smi_err_response(struct ipmi_smi *intf, | ||
1292 | struct ipmi_smi_msg *msg, | ||
1293 | diff --git a/drivers/char/tpm/tpm-dev-common.c b/drivers/char/tpm/tpm-dev-common.c | ||
1294 | index 2ec47a69a2a6..b23b0b999232 100644 | ||
1295 | --- a/drivers/char/tpm/tpm-dev-common.c | ||
1296 | +++ b/drivers/char/tpm/tpm-dev-common.c | ||
1297 | @@ -61,6 +61,12 @@ static void tpm_dev_async_work(struct work_struct *work) | ||
1298 | |||
1299 | mutex_lock(&priv->buffer_mutex); | ||
1300 | priv->command_enqueued = false; | ||
1301 | + ret = tpm_try_get_ops(priv->chip); | ||
1302 | + if (ret) { | ||
1303 | + priv->response_length = ret; | ||
1304 | + goto out; | ||
1305 | + } | ||
1306 | + | ||
1307 | ret = tpm_dev_transmit(priv->chip, priv->space, priv->data_buffer, | ||
1308 | sizeof(priv->data_buffer)); | ||
1309 | tpm_put_ops(priv->chip); | ||
1310 | @@ -68,6 +74,7 @@ static void tpm_dev_async_work(struct work_struct *work) | ||
1311 | priv->response_length = ret; | ||
1312 | mod_timer(&priv->user_read_timer, jiffies + (120 * HZ)); | ||
1313 | } | ||
1314 | +out: | ||
1315 | mutex_unlock(&priv->buffer_mutex); | ||
1316 | wake_up_interruptible(&priv->async_wait); | ||
1317 | } | ||
1318 | @@ -204,6 +211,7 @@ ssize_t tpm_common_write(struct file *file, const char __user *buf, | ||
1319 | if (file->f_flags & O_NONBLOCK) { | ||
1320 | priv->command_enqueued = true; | ||
1321 | queue_work(tpm_dev_wq, &priv->async_work); | ||
1322 | + tpm_put_ops(priv->chip); | ||
1323 | mutex_unlock(&priv->buffer_mutex); | ||
1324 | return size; | ||
1325 | } | ||
1326 | diff --git a/drivers/char/tpm/tpm_tis_core.c b/drivers/char/tpm/tpm_tis_core.c | ||
1327 | index 270f43acbb77..f528fc39ea6b 100644 | ||
1328 | --- a/drivers/char/tpm/tpm_tis_core.c | ||
1329 | +++ b/drivers/char/tpm/tpm_tis_core.c | ||
1330 | @@ -899,13 +899,13 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
1331 | |||
1332 | if (wait_startup(chip, 0) != 0) { | ||
1333 | rc = -ENODEV; | ||
1334 | - goto out_err; | ||
1335 | + goto err_start; | ||
1336 | } | ||
1337 | |||
1338 | /* Take control of the TPM's interrupt hardware and shut it off */ | ||
1339 | rc = tpm_tis_read32(priv, TPM_INT_ENABLE(priv->locality), &intmask); | ||
1340 | if (rc < 0) | ||
1341 | - goto out_err; | ||
1342 | + goto err_start; | ||
1343 | |||
1344 | intmask |= TPM_INTF_CMD_READY_INT | TPM_INTF_LOCALITY_CHANGE_INT | | ||
1345 | TPM_INTF_DATA_AVAIL_INT | TPM_INTF_STS_VALID_INT; | ||
1346 | @@ -914,21 +914,21 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
1347 | |||
1348 | rc = tpm_chip_start(chip); | ||
1349 | if (rc) | ||
1350 | - goto out_err; | ||
1351 | + goto err_start; | ||
1352 | + | ||
1353 | rc = tpm2_probe(chip); | ||
1354 | - tpm_chip_stop(chip); | ||
1355 | if (rc) | ||
1356 | - goto out_err; | ||
1357 | + goto err_probe; | ||
1358 | |||
1359 | rc = tpm_tis_read32(priv, TPM_DID_VID(0), &vendor); | ||
1360 | if (rc < 0) | ||
1361 | - goto out_err; | ||
1362 | + goto err_probe; | ||
1363 | |||
1364 | priv->manufacturer_id = vendor; | ||
1365 | |||
1366 | rc = tpm_tis_read8(priv, TPM_RID(0), &rid); | ||
1367 | if (rc < 0) | ||
1368 | - goto out_err; | ||
1369 | + goto err_probe; | ||
1370 | |||
1371 | dev_info(dev, "%s TPM (device-id 0x%X, rev-id %d)\n", | ||
1372 | (chip->flags & TPM_CHIP_FLAG_TPM2) ? "2.0" : "1.2", | ||
1373 | @@ -937,13 +937,13 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
1374 | probe = probe_itpm(chip); | ||
1375 | if (probe < 0) { | ||
1376 | rc = -ENODEV; | ||
1377 | - goto out_err; | ||
1378 | + goto err_probe; | ||
1379 | } | ||
1380 | |||
1381 | /* Figure out the capabilities */ | ||
1382 | rc = tpm_tis_read32(priv, TPM_INTF_CAPS(priv->locality), &intfcaps); | ||
1383 | if (rc < 0) | ||
1384 | - goto out_err; | ||
1385 | + goto err_probe; | ||
1386 | |||
1387 | dev_dbg(dev, "TPM interface capabilities (0x%x):\n", | ||
1388 | intfcaps); | ||
1389 | @@ -977,10 +977,9 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
1390 | if (tpm_get_timeouts(chip)) { | ||
1391 | dev_err(dev, "Could not get TPM timeouts and durations\n"); | ||
1392 | rc = -ENODEV; | ||
1393 | - goto out_err; | ||
1394 | + goto err_probe; | ||
1395 | } | ||
1396 | |||
1397 | - tpm_chip_start(chip); | ||
1398 | chip->flags |= TPM_CHIP_FLAG_IRQ; | ||
1399 | if (irq) { | ||
1400 | tpm_tis_probe_irq_single(chip, intmask, IRQF_SHARED, | ||
1401 | @@ -991,18 +990,20 @@ int tpm_tis_core_init(struct device *dev, struct tpm_tis_data *priv, int irq, | ||
1402 | } else { | ||
1403 | tpm_tis_probe_irq(chip, intmask); | ||
1404 | } | ||
1405 | - tpm_chip_stop(chip); | ||
1406 | } | ||
1407 | |||
1408 | + tpm_chip_stop(chip); | ||
1409 | + | ||
1410 | rc = tpm_chip_register(chip); | ||
1411 | if (rc) | ||
1412 | - goto out_err; | ||
1413 | - | ||
1414 | - if (chip->ops->clk_enable != NULL) | ||
1415 | - chip->ops->clk_enable(chip, false); | ||
1416 | + goto err_start; | ||
1417 | |||
1418 | return 0; | ||
1419 | -out_err: | ||
1420 | + | ||
1421 | +err_probe: | ||
1422 | + tpm_chip_stop(chip); | ||
1423 | + | ||
1424 | +err_start: | ||
1425 | if ((chip->ops != NULL) && (chip->ops->clk_enable != NULL)) | ||
1426 | chip->ops->clk_enable(chip, false); | ||
1427 | |||
1428 | diff --git a/drivers/clk/imx/clk-composite-8m.c b/drivers/clk/imx/clk-composite-8m.c | ||
1429 | index 388bdb94f841..d3486ee79ab5 100644 | ||
1430 | --- a/drivers/clk/imx/clk-composite-8m.c | ||
1431 | +++ b/drivers/clk/imx/clk-composite-8m.c | ||
1432 | @@ -142,6 +142,7 @@ struct clk *imx8m_clk_composite_flags(const char *name, | ||
1433 | mux->reg = reg; | ||
1434 | mux->shift = PCG_PCS_SHIFT; | ||
1435 | mux->mask = PCG_PCS_MASK; | ||
1436 | + mux->lock = &imx_ccm_lock; | ||
1437 | |||
1438 | div = kzalloc(sizeof(*div), GFP_KERNEL); | ||
1439 | if (!div) | ||
1440 | @@ -161,6 +162,7 @@ struct clk *imx8m_clk_composite_flags(const char *name, | ||
1441 | gate_hw = &gate->hw; | ||
1442 | gate->reg = reg; | ||
1443 | gate->bit_idx = PCG_CGC_SHIFT; | ||
1444 | + gate->lock = &imx_ccm_lock; | ||
1445 | |||
1446 | hw = clk_hw_register_composite(NULL, name, parent_names, num_parents, | ||
1447 | mux_hw, &clk_mux_ops, div_hw, | ||
1448 | diff --git a/drivers/clk/imx/clk-imx7ulp.c b/drivers/clk/imx/clk-imx7ulp.c | ||
1449 | index 2022d9bead91..a0f650150367 100644 | ||
1450 | --- a/drivers/clk/imx/clk-imx7ulp.c | ||
1451 | +++ b/drivers/clk/imx/clk-imx7ulp.c | ||
1452 | @@ -40,6 +40,7 @@ static const struct clk_div_table ulp_div_table[] = { | ||
1453 | { .val = 5, .div = 16, }, | ||
1454 | { .val = 6, .div = 32, }, | ||
1455 | { .val = 7, .div = 64, }, | ||
1456 | + { /* sentinel */ }, | ||
1457 | }; | ||
1458 | |||
1459 | static const int pcc2_uart_clk_ids[] __initconst = { | ||
1460 | diff --git a/drivers/clk/imx/clk-pll14xx.c b/drivers/clk/imx/clk-pll14xx.c | ||
1461 | index 7a815ec76aa5..d43b4a3c0de8 100644 | ||
1462 | --- a/drivers/clk/imx/clk-pll14xx.c | ||
1463 | +++ b/drivers/clk/imx/clk-pll14xx.c | ||
1464 | @@ -153,7 +153,7 @@ static int clk_pll14xx_wait_lock(struct clk_pll14xx *pll) | ||
1465 | { | ||
1466 | u32 val; | ||
1467 | |||
1468 | - return readl_poll_timeout(pll->base, val, val & LOCK_TIMEOUT_US, 0, | ||
1469 | + return readl_poll_timeout(pll->base, val, val & LOCK_STATUS, 0, | ||
1470 | LOCK_TIMEOUT_US); | ||
1471 | } | ||
1472 | |||
1473 | diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c | ||
1474 | index bc19d6c16aaa..a7db4f22a077 100644 | ||
1475 | --- a/drivers/cpufreq/cpufreq.c | ||
1476 | +++ b/drivers/cpufreq/cpufreq.c | ||
1477 | @@ -2634,6 +2634,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data) | ||
1478 | if (cpufreq_disabled()) | ||
1479 | return -ENODEV; | ||
1480 | |||
1481 | + /* | ||
1482 | + * The cpufreq core depends heavily on the availability of device | ||
1483 | + * structure, make sure they are available before proceeding further. | ||
1484 | + */ | ||
1485 | + if (!get_cpu_device(0)) | ||
1486 | + return -EPROBE_DEFER; | ||
1487 | + | ||
1488 | if (!driver_data || !driver_data->verify || !driver_data->init || | ||
1489 | !(driver_data->setpolicy || driver_data->target_index || | ||
1490 | driver_data->target) || | ||
1491 | diff --git a/drivers/cpufreq/sun50i-cpufreq-nvmem.c b/drivers/cpufreq/sun50i-cpufreq-nvmem.c | ||
1492 | index eca32e443716..9907a165135b 100644 | ||
1493 | --- a/drivers/cpufreq/sun50i-cpufreq-nvmem.c | ||
1494 | +++ b/drivers/cpufreq/sun50i-cpufreq-nvmem.c | ||
1495 | @@ -25,7 +25,7 @@ | ||
1496 | static struct platform_device *cpufreq_dt_pdev, *sun50i_cpufreq_pdev; | ||
1497 | |||
1498 | /** | ||
1499 | - * sun50i_cpufreq_get_efuse() - Parse and return efuse value present on SoC | ||
1500 | + * sun50i_cpufreq_get_efuse() - Determine speed grade from efuse value | ||
1501 | * @versions: Set to the value parsed from efuse | ||
1502 | * | ||
1503 | * Returns 0 if success. | ||
1504 | @@ -69,21 +69,16 @@ static int sun50i_cpufreq_get_efuse(u32 *versions) | ||
1505 | return PTR_ERR(speedbin); | ||
1506 | |||
1507 | efuse_value = (*speedbin >> NVMEM_SHIFT) & NVMEM_MASK; | ||
1508 | - switch (efuse_value) { | ||
1509 | - case 0b0001: | ||
1510 | - *versions = 1; | ||
1511 | - break; | ||
1512 | - case 0b0011: | ||
1513 | - *versions = 2; | ||
1514 | - break; | ||
1515 | - default: | ||
1516 | - /* | ||
1517 | - * For other situations, we treat it as bin0. | ||
1518 | - * This vf table can be run for any good cpu. | ||
1519 | - */ | ||
1520 | + | ||
1521 | + /* | ||
1522 | + * We treat unexpected efuse values as if the SoC was from | ||
1523 | + * the slowest bin. Expected efuse values are 1-3, slowest | ||
1524 | + * to fastest. | ||
1525 | + */ | ||
1526 | + if (efuse_value >= 1 && efuse_value <= 3) | ||
1527 | + *versions = efuse_value - 1; | ||
1528 | + else | ||
1529 | *versions = 0; | ||
1530 | - break; | ||
1531 | - } | ||
1532 | |||
1533 | kfree(speedbin); | ||
1534 | return 0; | ||
1535 | diff --git a/drivers/crypto/atmel-aes.c b/drivers/crypto/atmel-aes.c | ||
1536 | index 00920a2b95ce..db99cee1991c 100644 | ||
1537 | --- a/drivers/crypto/atmel-aes.c | ||
1538 | +++ b/drivers/crypto/atmel-aes.c | ||
1539 | @@ -145,7 +145,7 @@ struct atmel_aes_xts_ctx { | ||
1540 | u32 key2[AES_KEYSIZE_256 / sizeof(u32)]; | ||
1541 | }; | ||
1542 | |||
1543 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1544 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1545 | struct atmel_aes_authenc_ctx { | ||
1546 | struct atmel_aes_base_ctx base; | ||
1547 | struct atmel_sha_authenc_ctx *auth; | ||
1548 | @@ -157,7 +157,7 @@ struct atmel_aes_reqctx { | ||
1549 | u32 lastc[AES_BLOCK_SIZE / sizeof(u32)]; | ||
1550 | }; | ||
1551 | |||
1552 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1553 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1554 | struct atmel_aes_authenc_reqctx { | ||
1555 | struct atmel_aes_reqctx base; | ||
1556 | |||
1557 | @@ -486,7 +486,7 @@ static inline bool atmel_aes_is_encrypt(const struct atmel_aes_dev *dd) | ||
1558 | return (dd->flags & AES_FLAGS_ENCRYPT); | ||
1559 | } | ||
1560 | |||
1561 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1562 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1563 | static void atmel_aes_authenc_complete(struct atmel_aes_dev *dd, int err); | ||
1564 | #endif | ||
1565 | |||
1566 | @@ -515,7 +515,7 @@ static void atmel_aes_set_iv_as_last_ciphertext_block(struct atmel_aes_dev *dd) | ||
1567 | |||
1568 | static inline int atmel_aes_complete(struct atmel_aes_dev *dd, int err) | ||
1569 | { | ||
1570 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1571 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1572 | if (dd->ctx->is_aead) | ||
1573 | atmel_aes_authenc_complete(dd, err); | ||
1574 | #endif | ||
1575 | @@ -1980,7 +1980,7 @@ static struct crypto_alg aes_xts_alg = { | ||
1576 | } | ||
1577 | }; | ||
1578 | |||
1579 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1580 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1581 | /* authenc aead functions */ | ||
1582 | |||
1583 | static int atmel_aes_authenc_start(struct atmel_aes_dev *dd); | ||
1584 | @@ -2467,7 +2467,7 @@ static void atmel_aes_unregister_algs(struct atmel_aes_dev *dd) | ||
1585 | { | ||
1586 | int i; | ||
1587 | |||
1588 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1589 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1590 | if (dd->caps.has_authenc) | ||
1591 | for (i = 0; i < ARRAY_SIZE(aes_authenc_algs); i++) | ||
1592 | crypto_unregister_aead(&aes_authenc_algs[i]); | ||
1593 | @@ -2514,7 +2514,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd) | ||
1594 | goto err_aes_xts_alg; | ||
1595 | } | ||
1596 | |||
1597 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1598 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1599 | if (dd->caps.has_authenc) { | ||
1600 | for (i = 0; i < ARRAY_SIZE(aes_authenc_algs); i++) { | ||
1601 | err = crypto_register_aead(&aes_authenc_algs[i]); | ||
1602 | @@ -2526,7 +2526,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd) | ||
1603 | |||
1604 | return 0; | ||
1605 | |||
1606 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1607 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1608 | /* i = ARRAY_SIZE(aes_authenc_algs); */ | ||
1609 | err_aes_authenc_alg: | ||
1610 | for (j = 0; j < i; j++) | ||
1611 | @@ -2716,7 +2716,7 @@ static int atmel_aes_probe(struct platform_device *pdev) | ||
1612 | |||
1613 | atmel_aes_get_cap(aes_dd); | ||
1614 | |||
1615 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1616 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1617 | if (aes_dd->caps.has_authenc && !atmel_sha_authenc_is_ready()) { | ||
1618 | err = -EPROBE_DEFER; | ||
1619 | goto iclk_unprepare; | ||
1620 | diff --git a/drivers/crypto/atmel-authenc.h b/drivers/crypto/atmel-authenc.h | ||
1621 | index cbd37a2edada..d6de810df44f 100644 | ||
1622 | --- a/drivers/crypto/atmel-authenc.h | ||
1623 | +++ b/drivers/crypto/atmel-authenc.h | ||
1624 | @@ -12,7 +12,7 @@ | ||
1625 | #ifndef __ATMEL_AUTHENC_H__ | ||
1626 | #define __ATMEL_AUTHENC_H__ | ||
1627 | |||
1628 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1629 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1630 | |||
1631 | #include <crypto/authenc.h> | ||
1632 | #include <crypto/hash.h> | ||
1633 | diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c | ||
1634 | index 84cb8748a795..d32626458e67 100644 | ||
1635 | --- a/drivers/crypto/atmel-sha.c | ||
1636 | +++ b/drivers/crypto/atmel-sha.c | ||
1637 | @@ -2212,7 +2212,7 @@ static struct ahash_alg sha_hmac_algs[] = { | ||
1638 | }, | ||
1639 | }; | ||
1640 | |||
1641 | -#ifdef CONFIG_CRYPTO_DEV_ATMEL_AUTHENC | ||
1642 | +#if IS_ENABLED(CONFIG_CRYPTO_DEV_ATMEL_AUTHENC) | ||
1643 | /* authenc functions */ | ||
1644 | |||
1645 | static int atmel_sha_authenc_init2(struct atmel_sha_dev *dd); | ||
1646 | diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c | ||
1647 | index 294debd435b6..991a4425f006 100644 | ||
1648 | --- a/drivers/crypto/inside-secure/safexcel.c | ||
1649 | +++ b/drivers/crypto/inside-secure/safexcel.c | ||
1650 | @@ -1120,6 +1120,8 @@ static int safexcel_request_ring_irq(void *pdev, int irqid, | ||
1651 | irq_name, irq); | ||
1652 | return irq; | ||
1653 | } | ||
1654 | + } else { | ||
1655 | + return -ENXIO; | ||
1656 | } | ||
1657 | |||
1658 | ret = devm_request_threaded_irq(dev, irq, handler, | ||
1659 | diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-cipher.c b/drivers/crypto/sunxi-ss/sun4i-ss-cipher.c | ||
1660 | index 6536fd4bee65..7e5e092a23b3 100644 | ||
1661 | --- a/drivers/crypto/sunxi-ss/sun4i-ss-cipher.c | ||
1662 | +++ b/drivers/crypto/sunxi-ss/sun4i-ss-cipher.c | ||
1663 | @@ -72,7 +72,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) | ||
1664 | oi = 0; | ||
1665 | oo = 0; | ||
1666 | do { | ||
1667 | - todo = min3(rx_cnt, ileft, (mi.length - oi) / 4); | ||
1668 | + todo = min(rx_cnt, ileft); | ||
1669 | + todo = min_t(size_t, todo, (mi.length - oi) / 4); | ||
1670 | if (todo) { | ||
1671 | ileft -= todo; | ||
1672 | writesl(ss->base + SS_RXFIFO, mi.addr + oi, todo); | ||
1673 | @@ -87,7 +88,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq) | ||
1674 | rx_cnt = SS_RXFIFO_SPACES(spaces); | ||
1675 | tx_cnt = SS_TXFIFO_SPACES(spaces); | ||
1676 | |||
1677 | - todo = min3(tx_cnt, oleft, (mo.length - oo) / 4); | ||
1678 | + todo = min(tx_cnt, oleft); | ||
1679 | + todo = min_t(size_t, todo, (mo.length - oo) / 4); | ||
1680 | if (todo) { | ||
1681 | oleft -= todo; | ||
1682 | readsl(ss->base + SS_TXFIFO, mo.addr + oo, todo); | ||
1683 | @@ -239,7 +241,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) | ||
1684 | * todo is the number of consecutive 4byte word that we | ||
1685 | * can read from current SG | ||
1686 | */ | ||
1687 | - todo = min3(rx_cnt, ileft / 4, (mi.length - oi) / 4); | ||
1688 | + todo = min(rx_cnt, ileft / 4); | ||
1689 | + todo = min_t(size_t, todo, (mi.length - oi) / 4); | ||
1690 | if (todo && !ob) { | ||
1691 | writesl(ss->base + SS_RXFIFO, mi.addr + oi, | ||
1692 | todo); | ||
1693 | @@ -253,8 +256,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) | ||
1694 | * we need to be able to write all buf in one | ||
1695 | * pass, so it is why we min() with rx_cnt | ||
1696 | */ | ||
1697 | - todo = min3(rx_cnt * 4 - ob, ileft, | ||
1698 | - mi.length - oi); | ||
1699 | + todo = min(rx_cnt * 4 - ob, ileft); | ||
1700 | + todo = min_t(size_t, todo, mi.length - oi); | ||
1701 | memcpy(buf + ob, mi.addr + oi, todo); | ||
1702 | ileft -= todo; | ||
1703 | oi += todo; | ||
1704 | @@ -274,7 +277,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) | ||
1705 | spaces = readl(ss->base + SS_FCSR); | ||
1706 | rx_cnt = SS_RXFIFO_SPACES(spaces); | ||
1707 | tx_cnt = SS_TXFIFO_SPACES(spaces); | ||
1708 | - dev_dbg(ss->dev, "%x %u/%u %u/%u cnt=%u %u/%u %u/%u cnt=%u %u\n", | ||
1709 | + dev_dbg(ss->dev, | ||
1710 | + "%x %u/%zu %u/%u cnt=%u %u/%zu %u/%u cnt=%u %u\n", | ||
1711 | mode, | ||
1712 | oi, mi.length, ileft, areq->cryptlen, rx_cnt, | ||
1713 | oo, mo.length, oleft, areq->cryptlen, tx_cnt, ob); | ||
1714 | @@ -282,7 +286,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) | ||
1715 | if (!tx_cnt) | ||
1716 | continue; | ||
1717 | /* todo in 4bytes word */ | ||
1718 | - todo = min3(tx_cnt, oleft / 4, (mo.length - oo) / 4); | ||
1719 | + todo = min(tx_cnt, oleft / 4); | ||
1720 | + todo = min_t(size_t, todo, (mo.length - oo) / 4); | ||
1721 | if (todo) { | ||
1722 | readsl(ss->base + SS_TXFIFO, mo.addr + oo, todo); | ||
1723 | oleft -= todo * 4; | ||
1724 | @@ -308,7 +313,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq) | ||
1725 | * no more than remaining buffer | ||
1726 | * no need to test against oleft | ||
1727 | */ | ||
1728 | - todo = min(mo.length - oo, obl - obo); | ||
1729 | + todo = min_t(size_t, | ||
1730 | + mo.length - oo, obl - obo); | ||
1731 | memcpy(mo.addr + oo, bufo + obo, todo); | ||
1732 | oleft -= todo; | ||
1733 | obo += todo; | ||
1734 | diff --git a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c | ||
1735 | index fcffba5ef927..1369c5fa3087 100644 | ||
1736 | --- a/drivers/crypto/sunxi-ss/sun4i-ss-hash.c | ||
1737 | +++ b/drivers/crypto/sunxi-ss/sun4i-ss-hash.c | ||
1738 | @@ -272,8 +272,8 @@ static int sun4i_hash(struct ahash_request *areq) | ||
1739 | */ | ||
1740 | while (op->len < 64 && i < end) { | ||
1741 | /* how many bytes we can read from current SG */ | ||
1742 | - in_r = min3(mi.length - in_i, end - i, | ||
1743 | - 64 - op->len); | ||
1744 | + in_r = min(end - i, 64 - op->len); | ||
1745 | + in_r = min_t(size_t, mi.length - in_i, in_r); | ||
1746 | memcpy(op->buf + op->len, mi.addr + in_i, in_r); | ||
1747 | op->len += in_r; | ||
1748 | i += in_r; | ||
1749 | @@ -293,8 +293,8 @@ static int sun4i_hash(struct ahash_request *areq) | ||
1750 | } | ||
1751 | if (mi.length - in_i > 3 && i < end) { | ||
1752 | /* how many bytes we can read from current SG */ | ||
1753 | - in_r = min3(mi.length - in_i, areq->nbytes - i, | ||
1754 | - ((mi.length - in_i) / 4) * 4); | ||
1755 | + in_r = min_t(size_t, mi.length - in_i, areq->nbytes - i); | ||
1756 | + in_r = min_t(size_t, ((mi.length - in_i) / 4) * 4, in_r); | ||
1757 | /* how many bytes we can write in the device*/ | ||
1758 | todo = min3((u32)(end - i) / 4, rx_cnt, (u32)in_r / 4); | ||
1759 | writesl(ss->base + SS_RXFIFO, mi.addr + in_i, todo); | ||
1760 | @@ -320,8 +320,8 @@ static int sun4i_hash(struct ahash_request *areq) | ||
1761 | if ((areq->nbytes - i) < 64) { | ||
1762 | while (i < areq->nbytes && in_i < mi.length && op->len < 64) { | ||
1763 | /* how many bytes we can read from current SG */ | ||
1764 | - in_r = min3(mi.length - in_i, areq->nbytes - i, | ||
1765 | - 64 - op->len); | ||
1766 | + in_r = min(areq->nbytes - i, 64 - op->len); | ||
1767 | + in_r = min_t(size_t, mi.length - in_i, in_r); | ||
1768 | memcpy(op->buf + op->len, mi.addr + in_i, in_r); | ||
1769 | op->len += in_r; | ||
1770 | i += in_r; | ||
1771 | diff --git a/drivers/crypto/virtio/virtio_crypto_algs.c b/drivers/crypto/virtio/virtio_crypto_algs.c | ||
1772 | index 42d19205166b..673fb29fda53 100644 | ||
1773 | --- a/drivers/crypto/virtio/virtio_crypto_algs.c | ||
1774 | +++ b/drivers/crypto/virtio/virtio_crypto_algs.c | ||
1775 | @@ -105,8 +105,6 @@ virtio_crypto_alg_validate_key(int key_len, uint32_t *alg) | ||
1776 | *alg = VIRTIO_CRYPTO_CIPHER_AES_CBC; | ||
1777 | break; | ||
1778 | default: | ||
1779 | - pr_err("virtio_crypto: Unsupported key length: %d\n", | ||
1780 | - key_len); | ||
1781 | return -EINVAL; | ||
1782 | } | ||
1783 | return 0; | ||
1784 | @@ -484,6 +482,11 @@ static int virtio_crypto_ablkcipher_encrypt(struct ablkcipher_request *req) | ||
1785 | /* Use the first data virtqueue as default */ | ||
1786 | struct data_queue *data_vq = &vcrypto->data_vq[0]; | ||
1787 | |||
1788 | + if (!req->nbytes) | ||
1789 | + return 0; | ||
1790 | + if (req->nbytes % AES_BLOCK_SIZE) | ||
1791 | + return -EINVAL; | ||
1792 | + | ||
1793 | vc_req->dataq = data_vq; | ||
1794 | vc_req->alg_cb = virtio_crypto_dataq_sym_callback; | ||
1795 | vc_sym_req->ablkcipher_ctx = ctx; | ||
1796 | @@ -504,6 +507,11 @@ static int virtio_crypto_ablkcipher_decrypt(struct ablkcipher_request *req) | ||
1797 | /* Use the first data virtqueue as default */ | ||
1798 | struct data_queue *data_vq = &vcrypto->data_vq[0]; | ||
1799 | |||
1800 | + if (!req->nbytes) | ||
1801 | + return 0; | ||
1802 | + if (req->nbytes % AES_BLOCK_SIZE) | ||
1803 | + return -EINVAL; | ||
1804 | + | ||
1805 | vc_req->dataq = data_vq; | ||
1806 | vc_req->alg_cb = virtio_crypto_dataq_sym_callback; | ||
1807 | vc_sym_req->ablkcipher_ctx = ctx; | ||
1808 | diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile | ||
1809 | index cab32cfec9c4..709670d2b553 100644 | ||
1810 | --- a/drivers/crypto/vmx/Makefile | ||
1811 | +++ b/drivers/crypto/vmx/Makefile | ||
1812 | @@ -3,13 +3,13 @@ obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o | ||
1813 | vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o | ||
1814 | |||
1815 | ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) | ||
1816 | -TARGET := linux-ppc64le | ||
1817 | +override flavour := linux-ppc64le | ||
1818 | else | ||
1819 | -TARGET := linux-ppc64 | ||
1820 | +override flavour := linux-ppc64 | ||
1821 | endif | ||
1822 | |||
1823 | quiet_cmd_perl = PERL $@ | ||
1824 | - cmd_perl = $(PERL) $(<) $(TARGET) > $(@) | ||
1825 | + cmd_perl = $(PERL) $(<) $(flavour) > $(@) | ||
1826 | |||
1827 | targets += aesp8-ppc.S ghashp8-ppc.S | ||
1828 | |||
1829 | diff --git a/drivers/edac/amd64_edac.c b/drivers/edac/amd64_edac.c | ||
1830 | index c1d4536ae466..cc5e56d752c8 100644 | ||
1831 | --- a/drivers/edac/amd64_edac.c | ||
1832 | +++ b/drivers/edac/amd64_edac.c | ||
1833 | @@ -2936,6 +2936,7 @@ static int init_csrows_df(struct mem_ctl_info *mci) | ||
1834 | dimm->mtype = pvt->dram_type; | ||
1835 | dimm->edac_mode = edac_mode; | ||
1836 | dimm->dtype = dev_type; | ||
1837 | + dimm->grain = 64; | ||
1838 | } | ||
1839 | } | ||
1840 | |||
1841 | @@ -3012,6 +3013,7 @@ static int init_csrows(struct mem_ctl_info *mci) | ||
1842 | dimm = csrow->channels[j]->dimm; | ||
1843 | dimm->mtype = pvt->dram_type; | ||
1844 | dimm->edac_mode = edac_mode; | ||
1845 | + dimm->grain = 64; | ||
1846 | } | ||
1847 | } | ||
1848 | |||
1849 | diff --git a/drivers/edac/ghes_edac.c b/drivers/edac/ghes_edac.c | ||
1850 | index 296e714bf553..523dd56a798c 100644 | ||
1851 | --- a/drivers/edac/ghes_edac.c | ||
1852 | +++ b/drivers/edac/ghes_edac.c | ||
1853 | @@ -231,6 +231,7 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err) | ||
1854 | /* Cleans the error report buffer */ | ||
1855 | memset(e, 0, sizeof (*e)); | ||
1856 | e->error_count = 1; | ||
1857 | + e->grain = 1; | ||
1858 | strcpy(e->label, "unknown label"); | ||
1859 | e->msg = pvt->msg; | ||
1860 | e->other_detail = pvt->other_detail; | ||
1861 | @@ -326,7 +327,7 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err) | ||
1862 | |||
1863 | /* Error grain */ | ||
1864 | if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK) | ||
1865 | - e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK); | ||
1866 | + e->grain = ~mem_err->physical_addr_mask + 1; | ||
1867 | |||
1868 | /* Memory error location, mapped on e->location */ | ||
1869 | p = e->location; | ||
1870 | @@ -442,8 +443,13 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err) | ||
1871 | if (p > pvt->other_detail) | ||
1872 | *(p - 1) = '\0'; | ||
1873 | |||
1874 | + /* Sanity-check driver-supplied grain value. */ | ||
1875 | + if (WARN_ON_ONCE(!e->grain)) | ||
1876 | + e->grain = 1; | ||
1877 | + | ||
1878 | + grain_bits = fls_long(e->grain - 1); | ||
1879 | + | ||
1880 | /* Generate the trace event */ | ||
1881 | - grain_bits = fls_long(e->grain); | ||
1882 | snprintf(pvt->detail_location, sizeof(pvt->detail_location), | ||
1883 | "APEI location: %s %s", e->location, e->other_detail); | ||
1884 | trace_mc_event(type, e->msg, e->label, e->error_count, | ||
1885 | diff --git a/drivers/extcon/extcon-sm5502.c b/drivers/extcon/extcon-sm5502.c | ||
1886 | index dc43847ad2b0..b3d93baf4fc5 100644 | ||
1887 | --- a/drivers/extcon/extcon-sm5502.c | ||
1888 | +++ b/drivers/extcon/extcon-sm5502.c | ||
1889 | @@ -65,6 +65,10 @@ struct sm5502_muic_info { | ||
1890 | /* Default value of SM5502 register to bring up MUIC device. */ | ||
1891 | static struct reg_data sm5502_reg_data[] = { | ||
1892 | { | ||
1893 | + .reg = SM5502_REG_RESET, | ||
1894 | + .val = SM5502_REG_RESET_MASK, | ||
1895 | + .invert = true, | ||
1896 | + }, { | ||
1897 | .reg = SM5502_REG_CONTROL, | ||
1898 | .val = SM5502_REG_CONTROL_MASK_INT_MASK, | ||
1899 | .invert = false, | ||
1900 | diff --git a/drivers/extcon/extcon-sm5502.h b/drivers/extcon/extcon-sm5502.h | ||
1901 | index 9dbb634d213b..ce1f1ec310c4 100644 | ||
1902 | --- a/drivers/extcon/extcon-sm5502.h | ||
1903 | +++ b/drivers/extcon/extcon-sm5502.h | ||
1904 | @@ -237,6 +237,8 @@ enum sm5502_reg { | ||
1905 | #define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \ | ||
1906 | | (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT)) | ||
1907 | |||
1908 | +#define SM5502_REG_RESET_MASK (0x1) | ||
1909 | + | ||
1910 | /* SM5502 Interrupts */ | ||
1911 | enum sm5502_irq { | ||
1912 | /* INT1 */ | ||
1913 | diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c | ||
1914 | index e98bbf8e56d9..34d41f67b54d 100644 | ||
1915 | --- a/drivers/firmware/efi/efi.c | ||
1916 | +++ b/drivers/firmware/efi/efi.c | ||
1917 | @@ -970,6 +970,24 @@ static int __init efi_memreserve_map_root(void) | ||
1918 | return 0; | ||
1919 | } | ||
1920 | |||
1921 | +static int efi_mem_reserve_iomem(phys_addr_t addr, u64 size) | ||
1922 | +{ | ||
1923 | + struct resource *res, *parent; | ||
1924 | + | ||
1925 | + res = kzalloc(sizeof(struct resource), GFP_ATOMIC); | ||
1926 | + if (!res) | ||
1927 | + return -ENOMEM; | ||
1928 | + | ||
1929 | + res->name = "reserved"; | ||
1930 | + res->flags = IORESOURCE_MEM; | ||
1931 | + res->start = addr; | ||
1932 | + res->end = addr + size - 1; | ||
1933 | + | ||
1934 | + /* we expect a conflict with a 'System RAM' region */ | ||
1935 | + parent = request_resource_conflict(&iomem_resource, res); | ||
1936 | + return parent ? request_resource(parent, res) : 0; | ||
1937 | +} | ||
1938 | + | ||
1939 | int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) | ||
1940 | { | ||
1941 | struct linux_efi_memreserve *rsv; | ||
1942 | @@ -994,7 +1012,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) | ||
1943 | rsv->entry[index].size = size; | ||
1944 | |||
1945 | memunmap(rsv); | ||
1946 | - return 0; | ||
1947 | + return efi_mem_reserve_iomem(addr, size); | ||
1948 | } | ||
1949 | memunmap(rsv); | ||
1950 | } | ||
1951 | @@ -1004,6 +1022,12 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) | ||
1952 | if (!rsv) | ||
1953 | return -ENOMEM; | ||
1954 | |||
1955 | + rc = efi_mem_reserve_iomem(__pa(rsv), SZ_4K); | ||
1956 | + if (rc) { | ||
1957 | + free_page((unsigned long)rsv); | ||
1958 | + return rc; | ||
1959 | + } | ||
1960 | + | ||
1961 | /* | ||
1962 | * The memremap() call above assumes that a linux_efi_memreserve entry | ||
1963 | * never crosses a page boundary, so let's ensure that this remains true | ||
1964 | @@ -1020,7 +1044,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size) | ||
1965 | efi_memreserve_root->next = __pa(rsv); | ||
1966 | spin_unlock(&efi_mem_reserve_persistent_lock); | ||
1967 | |||
1968 | - return 0; | ||
1969 | + return efi_mem_reserve_iomem(addr, size); | ||
1970 | } | ||
1971 | |||
1972 | static int __init efi_memreserve_root_init(void) | ||
1973 | diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c | ||
1974 | index 1f76740f33b6..9282239b4d95 100644 | ||
1975 | --- a/drivers/fsi/fsi-core.c | ||
1976 | +++ b/drivers/fsi/fsi-core.c | ||
1977 | @@ -544,6 +544,31 @@ static int fsi_slave_scan(struct fsi_slave *slave) | ||
1978 | return 0; | ||
1979 | } | ||
1980 | |||
1981 | +static unsigned long aligned_access_size(size_t offset, size_t count) | ||
1982 | +{ | ||
1983 | + unsigned long offset_unit, count_unit; | ||
1984 | + | ||
1985 | + /* Criteria: | ||
1986 | + * | ||
1987 | + * 1. Access size must be less than or equal to the maximum access | ||
1988 | + * width or the highest power-of-two factor of offset | ||
1989 | + * 2. Access size must be less than or equal to the amount specified by | ||
1990 | + * count | ||
1991 | + * | ||
1992 | + * The access width is optimal if we can calculate 1 to be strictly | ||
1993 | + * equal while still satisfying 2. | ||
1994 | + */ | ||
1995 | + | ||
1996 | + /* Find 1 by the bottom bit of offset (with a 4 byte access cap) */ | ||
1997 | + offset_unit = BIT(__builtin_ctzl(offset | 4)); | ||
1998 | + | ||
1999 | + /* Find 2 by the top bit of count */ | ||
2000 | + count_unit = BIT(8 * sizeof(unsigned long) - 1 - __builtin_clzl(count)); | ||
2001 | + | ||
2002 | + /* Constrain the maximum access width to the minimum of both criteria */ | ||
2003 | + return BIT(__builtin_ctzl(offset_unit | count_unit)); | ||
2004 | +} | ||
2005 | + | ||
2006 | static ssize_t fsi_slave_sysfs_raw_read(struct file *file, | ||
2007 | struct kobject *kobj, struct bin_attribute *attr, char *buf, | ||
2008 | loff_t off, size_t count) | ||
2009 | @@ -559,8 +584,7 @@ static ssize_t fsi_slave_sysfs_raw_read(struct file *file, | ||
2010 | return -EINVAL; | ||
2011 | |||
2012 | for (total_len = 0; total_len < count; total_len += read_len) { | ||
2013 | - read_len = min_t(size_t, count, 4); | ||
2014 | - read_len -= off & 0x3; | ||
2015 | + read_len = aligned_access_size(off, count - total_len); | ||
2016 | |||
2017 | rc = fsi_slave_read(slave, off, buf + total_len, read_len); | ||
2018 | if (rc) | ||
2019 | @@ -587,8 +611,7 @@ static ssize_t fsi_slave_sysfs_raw_write(struct file *file, | ||
2020 | return -EINVAL; | ||
2021 | |||
2022 | for (total_len = 0; total_len < count; total_len += write_len) { | ||
2023 | - write_len = min_t(size_t, count, 4); | ||
2024 | - write_len -= off & 0x3; | ||
2025 | + write_len = aligned_access_size(off, count - total_len); | ||
2026 | |||
2027 | rc = fsi_slave_write(slave, off, buf + total_len, write_len); | ||
2028 | if (rc) | ||
2029 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | ||
2030 | index 5652cc72ed3a..81842ba8cd75 100644 | ||
2031 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | ||
2032 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | ||
2033 | @@ -859,6 +859,9 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) | ||
2034 | struct amdgpu_device *adev = dev->dev_private; | ||
2035 | int r = 0, i; | ||
2036 | |||
2037 | + /* Avoid accidently unparking the sched thread during GPU reset */ | ||
2038 | + mutex_lock(&adev->lock_reset); | ||
2039 | + | ||
2040 | /* hold on the scheduler */ | ||
2041 | for (i = 0; i < AMDGPU_MAX_RINGS; i++) { | ||
2042 | struct amdgpu_ring *ring = adev->rings[i]; | ||
2043 | @@ -884,6 +887,8 @@ static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) | ||
2044 | kthread_unpark(ring->sched.thread); | ||
2045 | } | ||
2046 | |||
2047 | + mutex_unlock(&adev->lock_reset); | ||
2048 | + | ||
2049 | return 0; | ||
2050 | } | ||
2051 | |||
2052 | @@ -1036,6 +1041,9 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val) | ||
2053 | if (!fences) | ||
2054 | return -ENOMEM; | ||
2055 | |||
2056 | + /* Avoid accidently unparking the sched thread during GPU reset */ | ||
2057 | + mutex_lock(&adev->lock_reset); | ||
2058 | + | ||
2059 | /* stop the scheduler */ | ||
2060 | kthread_park(ring->sched.thread); | ||
2061 | |||
2062 | @@ -1075,6 +1083,8 @@ failure: | ||
2063 | /* restart the scheduler */ | ||
2064 | kthread_unpark(ring->sched.thread); | ||
2065 | |||
2066 | + mutex_unlock(&adev->lock_reset); | ||
2067 | + | ||
2068 | ttm_bo_unlock_delayed_workqueue(&adev->mman.bdev, resched); | ||
2069 | |||
2070 | if (fences) | ||
2071 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | ||
2072 | index b66d29d5ffa2..b158230af8db 100644 | ||
2073 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | ||
2074 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c | ||
2075 | @@ -138,6 +138,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev) | ||
2076 | } | ||
2077 | |||
2078 | dma_fence_put(fence); | ||
2079 | + fence = NULL; | ||
2080 | |||
2081 | r = amdgpu_bo_kmap(vram_obj, &vram_map); | ||
2082 | if (r) { | ||
2083 | @@ -183,6 +184,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev) | ||
2084 | } | ||
2085 | |||
2086 | dma_fence_put(fence); | ||
2087 | + fence = NULL; | ||
2088 | |||
2089 | r = amdgpu_bo_kmap(gtt_obj[i], >t_map); | ||
2090 | if (r) { | ||
2091 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | ||
2092 | index 77674a7b9616..91899d28fa72 100644 | ||
2093 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | ||
2094 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | ||
2095 | @@ -170,7 +170,7 @@ TRACE_EVENT(amdgpu_cs_ioctl, | ||
2096 | __field(unsigned int, context) | ||
2097 | __field(unsigned int, seqno) | ||
2098 | __field(struct dma_fence *, fence) | ||
2099 | - __field(char *, ring_name) | ||
2100 | + __string(ring, to_amdgpu_ring(job->base.sched)->name) | ||
2101 | __field(u32, num_ibs) | ||
2102 | ), | ||
2103 | |||
2104 | @@ -179,12 +179,12 @@ TRACE_EVENT(amdgpu_cs_ioctl, | ||
2105 | __assign_str(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) | ||
2106 | __entry->context = job->base.s_fence->finished.context; | ||
2107 | __entry->seqno = job->base.s_fence->finished.seqno; | ||
2108 | - __entry->ring_name = to_amdgpu_ring(job->base.sched)->name; | ||
2109 | + __assign_str(ring, to_amdgpu_ring(job->base.sched)->name) | ||
2110 | __entry->num_ibs = job->num_ibs; | ||
2111 | ), | ||
2112 | TP_printk("sched_job=%llu, timeline=%s, context=%u, seqno=%u, ring_name=%s, num_ibs=%u", | ||
2113 | __entry->sched_job_id, __get_str(timeline), __entry->context, | ||
2114 | - __entry->seqno, __entry->ring_name, __entry->num_ibs) | ||
2115 | + __entry->seqno, __get_str(ring), __entry->num_ibs) | ||
2116 | ); | ||
2117 | |||
2118 | TRACE_EVENT(amdgpu_sched_run_job, | ||
2119 | @@ -195,7 +195,7 @@ TRACE_EVENT(amdgpu_sched_run_job, | ||
2120 | __string(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) | ||
2121 | __field(unsigned int, context) | ||
2122 | __field(unsigned int, seqno) | ||
2123 | - __field(char *, ring_name) | ||
2124 | + __string(ring, to_amdgpu_ring(job->base.sched)->name) | ||
2125 | __field(u32, num_ibs) | ||
2126 | ), | ||
2127 | |||
2128 | @@ -204,12 +204,12 @@ TRACE_EVENT(amdgpu_sched_run_job, | ||
2129 | __assign_str(timeline, AMDGPU_JOB_GET_TIMELINE_NAME(job)) | ||
2130 | __entry->context = job->base.s_fence->finished.context; | ||
2131 | __entry->seqno = job->base.s_fence->finished.seqno; | ||
2132 | - __entry->ring_name = to_amdgpu_ring(job->base.sched)->name; | ||
2133 | + __assign_str(ring, to_amdgpu_ring(job->base.sched)->name) | ||
2134 | __entry->num_ibs = job->num_ibs; | ||
2135 | ), | ||
2136 | TP_printk("sched_job=%llu, timeline=%s, context=%u, seqno=%u, ring_name=%s, num_ibs=%u", | ||
2137 | __entry->sched_job_id, __get_str(timeline), __entry->context, | ||
2138 | - __entry->seqno, __entry->ring_name, __entry->num_ibs) | ||
2139 | + __entry->seqno, __get_str(ring), __entry->num_ibs) | ||
2140 | ); | ||
2141 | |||
2142 | |||
2143 | @@ -468,7 +468,7 @@ TRACE_EVENT(amdgpu_ib_pipe_sync, | ||
2144 | TP_PROTO(struct amdgpu_job *sched_job, struct dma_fence *fence), | ||
2145 | TP_ARGS(sched_job, fence), | ||
2146 | TP_STRUCT__entry( | ||
2147 | - __field(const char *,name) | ||
2148 | + __string(ring, sched_job->base.sched->name); | ||
2149 | __field(uint64_t, id) | ||
2150 | __field(struct dma_fence *, fence) | ||
2151 | __field(uint64_t, ctx) | ||
2152 | @@ -476,14 +476,14 @@ TRACE_EVENT(amdgpu_ib_pipe_sync, | ||
2153 | ), | ||
2154 | |||
2155 | TP_fast_assign( | ||
2156 | - __entry->name = sched_job->base.sched->name; | ||
2157 | + __assign_str(ring, sched_job->base.sched->name) | ||
2158 | __entry->id = sched_job->base.id; | ||
2159 | __entry->fence = fence; | ||
2160 | __entry->ctx = fence->context; | ||
2161 | __entry->seqno = fence->seqno; | ||
2162 | ), | ||
2163 | TP_printk("job ring=%s, id=%llu, need pipe sync to fence=%p, context=%llu, seq=%u", | ||
2164 | - __entry->name, __entry->id, | ||
2165 | + __get_str(ring), __entry->id, | ||
2166 | __entry->fence, __entry->ctx, | ||
2167 | __entry->seqno) | ||
2168 | ); | ||
2169 | diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
2170 | index 5251352f5922..c7514f743409 100644 | ||
2171 | --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
2172 | +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | ||
2173 | @@ -1034,10 +1034,8 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ | ||
2174 | id->oa_base != job->oa_base || | ||
2175 | id->oa_size != job->oa_size); | ||
2176 | bool vm_flush_needed = job->vm_needs_flush; | ||
2177 | - bool pasid_mapping_needed = id->pasid != job->pasid || | ||
2178 | - !id->pasid_mapping || | ||
2179 | - !dma_fence_is_signaled(id->pasid_mapping); | ||
2180 | struct dma_fence *fence = NULL; | ||
2181 | + bool pasid_mapping_needed = false; | ||
2182 | unsigned patch_offset = 0; | ||
2183 | int r; | ||
2184 | |||
2185 | @@ -1047,6 +1045,12 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ | ||
2186 | pasid_mapping_needed = true; | ||
2187 | } | ||
2188 | |||
2189 | + mutex_lock(&id_mgr->lock); | ||
2190 | + if (id->pasid != job->pasid || !id->pasid_mapping || | ||
2191 | + !dma_fence_is_signaled(id->pasid_mapping)) | ||
2192 | + pasid_mapping_needed = true; | ||
2193 | + mutex_unlock(&id_mgr->lock); | ||
2194 | + | ||
2195 | gds_switch_needed &= !!ring->funcs->emit_gds_switch; | ||
2196 | vm_flush_needed &= !!ring->funcs->emit_vm_flush && | ||
2197 | job->vm_pd_addr != AMDGPU_BO_INVALID_OFFSET; | ||
2198 | @@ -1086,9 +1090,11 @@ int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_ | ||
2199 | } | ||
2200 | |||
2201 | if (pasid_mapping_needed) { | ||
2202 | + mutex_lock(&id_mgr->lock); | ||
2203 | id->pasid = job->pasid; | ||
2204 | dma_fence_put(id->pasid_mapping); | ||
2205 | id->pasid_mapping = dma_fence_get(fence); | ||
2206 | + mutex_unlock(&id_mgr->lock); | ||
2207 | } | ||
2208 | dma_fence_put(fence); | ||
2209 | |||
2210 | diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
2211 | index 97cf0b536873..c9ba2ec6d038 100644 | ||
2212 | --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
2213 | +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | ||
2214 | @@ -2930,7 +2930,8 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev) | ||
2215 | * And it's needed by gfxoff feature. | ||
2216 | */ | ||
2217 | if (adev->gfx.rlc.is_rlc_v2_1) { | ||
2218 | - gfx_v9_1_init_rlc_save_restore_list(adev); | ||
2219 | + if (adev->asic_type == CHIP_VEGA12) | ||
2220 | + gfx_v9_1_init_rlc_save_restore_list(adev); | ||
2221 | gfx_v9_0_enable_save_restore_machine(adev); | ||
2222 | } | ||
2223 | |||
2224 | diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | ||
2225 | index 10166104b8a3..d483684db95b 100644 | ||
2226 | --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | ||
2227 | +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | ||
2228 | @@ -398,6 +398,34 @@ static bool psp_v11_0_support_vmr_ring(struct psp_context *psp) | ||
2229 | return false; | ||
2230 | } | ||
2231 | |||
2232 | +static int psp_v11_0_ring_stop(struct psp_context *psp, | ||
2233 | + enum psp_ring_type ring_type) | ||
2234 | +{ | ||
2235 | + int ret = 0; | ||
2236 | + struct amdgpu_device *adev = psp->adev; | ||
2237 | + | ||
2238 | + /* Write the ring destroy command*/ | ||
2239 | + if (psp_v11_0_support_vmr_ring(psp)) | ||
2240 | + WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, | ||
2241 | + GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING); | ||
2242 | + else | ||
2243 | + WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, | ||
2244 | + GFX_CTRL_CMD_ID_DESTROY_RINGS); | ||
2245 | + | ||
2246 | + /* there might be handshake issue with hardware which needs delay */ | ||
2247 | + mdelay(20); | ||
2248 | + | ||
2249 | + /* Wait for response flag (bit 31) */ | ||
2250 | + if (psp_v11_0_support_vmr_ring(psp)) | ||
2251 | + ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101), | ||
2252 | + 0x80000000, 0x80000000, false); | ||
2253 | + else | ||
2254 | + ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), | ||
2255 | + 0x80000000, 0x80000000, false); | ||
2256 | + | ||
2257 | + return ret; | ||
2258 | +} | ||
2259 | + | ||
2260 | static int psp_v11_0_ring_create(struct psp_context *psp, | ||
2261 | enum psp_ring_type ring_type) | ||
2262 | { | ||
2263 | @@ -407,6 +435,12 @@ static int psp_v11_0_ring_create(struct psp_context *psp, | ||
2264 | struct amdgpu_device *adev = psp->adev; | ||
2265 | |||
2266 | if (psp_v11_0_support_vmr_ring(psp)) { | ||
2267 | + ret = psp_v11_0_ring_stop(psp, ring_type); | ||
2268 | + if (ret) { | ||
2269 | + DRM_ERROR("psp_v11_0_ring_stop_sriov failed!\n"); | ||
2270 | + return ret; | ||
2271 | + } | ||
2272 | + | ||
2273 | /* Write low address of the ring to C2PMSG_102 */ | ||
2274 | psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr); | ||
2275 | WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg); | ||
2276 | @@ -451,33 +485,6 @@ static int psp_v11_0_ring_create(struct psp_context *psp, | ||
2277 | return ret; | ||
2278 | } | ||
2279 | |||
2280 | -static int psp_v11_0_ring_stop(struct psp_context *psp, | ||
2281 | - enum psp_ring_type ring_type) | ||
2282 | -{ | ||
2283 | - int ret = 0; | ||
2284 | - struct amdgpu_device *adev = psp->adev; | ||
2285 | - | ||
2286 | - /* Write the ring destroy command*/ | ||
2287 | - if (psp_v11_0_support_vmr_ring(psp)) | ||
2288 | - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, | ||
2289 | - GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING); | ||
2290 | - else | ||
2291 | - WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, | ||
2292 | - GFX_CTRL_CMD_ID_DESTROY_RINGS); | ||
2293 | - | ||
2294 | - /* there might be handshake issue with hardware which needs delay */ | ||
2295 | - mdelay(20); | ||
2296 | - | ||
2297 | - /* Wait for response flag (bit 31) */ | ||
2298 | - if (psp_v11_0_support_vmr_ring(psp)) | ||
2299 | - ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101), | ||
2300 | - 0x80000000, 0x80000000, false); | ||
2301 | - else | ||
2302 | - ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), | ||
2303 | - 0x80000000, 0x80000000, false); | ||
2304 | - | ||
2305 | - return ret; | ||
2306 | -} | ||
2307 | |||
2308 | static int psp_v11_0_ring_destroy(struct psp_context *psp, | ||
2309 | enum psp_ring_type ring_type) | ||
2310 | diff --git a/drivers/gpu/drm/amd/amdgpu/si_ih.c b/drivers/gpu/drm/amd/amdgpu/si_ih.c | ||
2311 | index 57bb5f9e08b2..88ae27a5a03d 100644 | ||
2312 | --- a/drivers/gpu/drm/amd/amdgpu/si_ih.c | ||
2313 | +++ b/drivers/gpu/drm/amd/amdgpu/si_ih.c | ||
2314 | @@ -64,7 +64,8 @@ static int si_ih_irq_init(struct amdgpu_device *adev) | ||
2315 | u32 interrupt_cntl, ih_cntl, ih_rb_cntl; | ||
2316 | |||
2317 | si_ih_disable_interrupts(adev); | ||
2318 | - WREG32(INTERRUPT_CNTL2, adev->irq.ih.gpu_addr >> 8); | ||
2319 | + /* set dummy read address to dummy page address */ | ||
2320 | + WREG32(INTERRUPT_CNTL2, adev->dummy_page_addr >> 8); | ||
2321 | interrupt_cntl = RREG32(INTERRUPT_CNTL); | ||
2322 | interrupt_cntl &= ~IH_DUMMY_RD_OVERRIDE; | ||
2323 | interrupt_cntl &= ~IH_REQ_NONSNOOP_EN; | ||
2324 | diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | ||
2325 | index d985e31fcc1e..f335f73919d1 100644 | ||
2326 | --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | ||
2327 | +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | ||
2328 | @@ -1676,7 +1676,8 @@ static int allocate_hiq_sdma_mqd(struct device_queue_manager *dqm) | ||
2329 | struct kfd_dev *dev = dqm->dev; | ||
2330 | struct kfd_mem_obj *mem_obj = &dqm->hiq_sdma_mqd; | ||
2331 | uint32_t size = dqm->mqd_mgrs[KFD_MQD_TYPE_SDMA]->mqd_size * | ||
2332 | - dev->device_info->num_sdma_engines * | ||
2333 | + (dev->device_info->num_sdma_engines + | ||
2334 | + dev->device_info->num_xgmi_sdma_engines) * | ||
2335 | dev->device_info->num_sdma_queues_per_engine + | ||
2336 | dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size; | ||
2337 | |||
2338 | diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | ||
2339 | index c56ac47cd318..bc47f6a44456 100644 | ||
2340 | --- a/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | ||
2341 | +++ b/drivers/gpu/drm/amd/amdkfd/kfd_interrupt.c | ||
2342 | @@ -62,6 +62,11 @@ int kfd_interrupt_init(struct kfd_dev *kfd) | ||
2343 | } | ||
2344 | |||
2345 | kfd->ih_wq = alloc_workqueue("KFD IH", WQ_HIGHPRI, 1); | ||
2346 | + if (unlikely(!kfd->ih_wq)) { | ||
2347 | + kfifo_free(&kfd->ih_fifo); | ||
2348 | + dev_err(kfd_chardev(), "Failed to allocate KFD IH workqueue\n"); | ||
2349 | + return -ENOMEM; | ||
2350 | + } | ||
2351 | spin_lock_init(&kfd->interrupt_lock); | ||
2352 | |||
2353 | INIT_WORK(&kfd->interrupt_work, interrupt_wq); | ||
2354 | diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2355 | index 4139f129eafb..4e9c15c409ba 100644 | ||
2356 | --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2357 | +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | ||
2358 | @@ -940,6 +940,11 @@ static int dm_late_init(void *handle) | ||
2359 | params.backlight_lut_array_size = 16; | ||
2360 | params.backlight_lut_array = linear_lut; | ||
2361 | |||
2362 | + /* Min backlight level after ABM reduction, Don't allow below 1% | ||
2363 | + * 0xFFFF x 0.01 = 0x28F | ||
2364 | + */ | ||
2365 | + params.min_abm_backlight = 0x28F; | ||
2366 | + | ||
2367 | /* todo will enable for navi10 */ | ||
2368 | if (adev->asic_type <= CHIP_RAVEN) { | ||
2369 | ret = dmcu_load_iram(dmcu, params); | ||
2370 | diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c | ||
2371 | index 3e8ac303bd52..23ec283eb07b 100644 | ||
2372 | --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c | ||
2373 | +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn20/dcn20_clk_mgr.c | ||
2374 | @@ -320,6 +320,8 @@ void dcn2_update_clocks_fpga(struct clk_mgr *clk_mgr, | ||
2375 | struct dc_state *context, | ||
2376 | bool safe_to_lower) | ||
2377 | { | ||
2378 | + struct clk_mgr_internal *clk_mgr_int = TO_CLK_MGR_INTERNAL(clk_mgr); | ||
2379 | + | ||
2380 | struct dc_clocks *new_clocks = &context->bw_ctx.bw.dcn.clk; | ||
2381 | /* Min fclk = 1.2GHz since all the extra scemi logic seems to run off of it */ | ||
2382 | int fclk_adj = new_clocks->fclk_khz > 1200000 ? new_clocks->fclk_khz : 1200000; | ||
2383 | @@ -357,14 +359,18 @@ void dcn2_update_clocks_fpga(struct clk_mgr *clk_mgr, | ||
2384 | clk_mgr->clks.dispclk_khz = new_clocks->dispclk_khz; | ||
2385 | } | ||
2386 | |||
2387 | - /* Both fclk and dppclk ref are run on the same scemi clock so we | ||
2388 | - * need to keep the same value for both | ||
2389 | + /* Both fclk and ref_dppclk run on the same scemi clock. | ||
2390 | + * So take the higher value since the DPP DTO is typically programmed | ||
2391 | + * such that max dppclk is 1:1 with ref_dppclk. | ||
2392 | */ | ||
2393 | if (clk_mgr->clks.fclk_khz > clk_mgr->clks.dppclk_khz) | ||
2394 | clk_mgr->clks.dppclk_khz = clk_mgr->clks.fclk_khz; | ||
2395 | if (clk_mgr->clks.dppclk_khz > clk_mgr->clks.fclk_khz) | ||
2396 | clk_mgr->clks.fclk_khz = clk_mgr->clks.dppclk_khz; | ||
2397 | |||
2398 | + // Both fclk and ref_dppclk run on the same scemi clock. | ||
2399 | + clk_mgr_int->dccg->ref_dppclk = clk_mgr->clks.fclk_khz; | ||
2400 | + | ||
2401 | dm_set_dcn_clocks(clk_mgr->ctx, &clk_mgr->clks); | ||
2402 | } | ||
2403 | |||
2404 | diff --git a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c | ||
2405 | index 50984c1811bb..468c6bb0e311 100644 | ||
2406 | --- a/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c | ||
2407 | +++ b/drivers/gpu/drm/amd/display/dc/clk_mgr/dcn21/rn_clk_mgr_vbios_smu.c | ||
2408 | @@ -33,7 +33,7 @@ | ||
2409 | #include "mp/mp_12_0_0_sh_mask.h" | ||
2410 | |||
2411 | #define REG(reg_name) \ | ||
2412 | - (MP1_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name) | ||
2413 | + (MP0_BASE.instance[0].segment[mm ## reg_name ## _BASE_IDX] + mm ## reg_name) | ||
2414 | |||
2415 | #define FN(reg_name, field) \ | ||
2416 | FD(reg_name##__##field) | ||
2417 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2418 | index ca20b150afcc..067f5579f452 100644 | ||
2419 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2420 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c | ||
2421 | @@ -2169,8 +2169,10 @@ static void disable_link(struct dc_link *link, enum signal_type signal) | ||
2422 | dp_set_fec_ready(link, false); | ||
2423 | } | ||
2424 | #endif | ||
2425 | - } else | ||
2426 | - link->link_enc->funcs->disable_output(link->link_enc, signal); | ||
2427 | + } else { | ||
2428 | + if (signal != SIGNAL_TYPE_VIRTUAL) | ||
2429 | + link->link_enc->funcs->disable_output(link->link_enc, signal); | ||
2430 | + } | ||
2431 | |||
2432 | if (signal == SIGNAL_TYPE_DISPLAY_PORT_MST) { | ||
2433 | /* MST disable link only when no stream use the link */ | ||
2434 | @@ -2217,7 +2219,7 @@ static bool dp_active_dongle_validate_timing( | ||
2435 | break; | ||
2436 | } | ||
2437 | |||
2438 | - if (dongle_caps->dongle_type != DISPLAY_DONGLE_DP_HDMI_CONVERTER || | ||
2439 | + if (dpcd_caps->dongle_type != DISPLAY_DONGLE_DP_HDMI_CONVERTER || | ||
2440 | dongle_caps->extendedCapValid == false) | ||
2441 | return true; | ||
2442 | |||
2443 | @@ -2767,6 +2769,15 @@ void core_link_enable_stream( | ||
2444 | CONTROLLER_DP_TEST_PATTERN_VIDEOMODE, | ||
2445 | COLOR_DEPTH_UNDEFINED); | ||
2446 | |||
2447 | + /* This second call is needed to reconfigure the DIG | ||
2448 | + * as a workaround for the incorrect value being applied | ||
2449 | + * from transmitter control. | ||
2450 | + */ | ||
2451 | + if (!dc_is_virtual_signal(pipe_ctx->stream->signal)) | ||
2452 | + stream->link->link_enc->funcs->setup( | ||
2453 | + stream->link->link_enc, | ||
2454 | + pipe_ctx->stream->signal); | ||
2455 | + | ||
2456 | #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT | ||
2457 | if (pipe_ctx->stream->timing.flags.DSC) { | ||
2458 | if (dc_is_dp_signal(pipe_ctx->stream->signal) || | ||
2459 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | ||
2460 | index f5742719b5d9..5a583707d198 100644 | ||
2461 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | ||
2462 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | ||
2463 | @@ -2545,6 +2545,7 @@ static void get_active_converter_info( | ||
2464 | uint8_t data, struct dc_link *link) | ||
2465 | { | ||
2466 | union dp_downstream_port_present ds_port = { .byte = data }; | ||
2467 | + memset(&link->dpcd_caps.dongle_caps, 0, sizeof(link->dpcd_caps.dongle_caps)); | ||
2468 | |||
2469 | /* decode converter info*/ | ||
2470 | if (!ds_port.fields.PORT_PRESENT) { | ||
2471 | @@ -2691,6 +2692,7 @@ static void dp_wa_power_up_0010FA(struct dc_link *link, uint8_t *dpcd_data, | ||
2472 | * keep receiver powered all the time.*/ | ||
2473 | case DP_BRANCH_DEVICE_ID_0010FA: | ||
2474 | case DP_BRANCH_DEVICE_ID_0080E1: | ||
2475 | + case DP_BRANCH_DEVICE_ID_00E04C: | ||
2476 | link->wa_flags.dp_keep_receiver_powered = true; | ||
2477 | break; | ||
2478 | |||
2479 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | ||
2480 | index 79438c4f1e20..a519dbc5ecb6 100644 | ||
2481 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | ||
2482 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_hwss.c | ||
2483 | @@ -277,7 +277,8 @@ void dp_retrain_link_dp_test(struct dc_link *link, | ||
2484 | if (pipes[i].stream != NULL && | ||
2485 | !pipes[i].top_pipe && !pipes[i].prev_odm_pipe && | ||
2486 | pipes[i].stream->link != NULL && | ||
2487 | - pipes[i].stream_res.stream_enc != NULL) { | ||
2488 | + pipes[i].stream_res.stream_enc != NULL && | ||
2489 | + pipes[i].stream->link == link) { | ||
2490 | udelay(100); | ||
2491 | |||
2492 | pipes[i].stream_res.stream_enc->funcs->dp_blank( | ||
2493 | diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c | ||
2494 | index bf1d7bb90e0f..bb09243758fe 100644 | ||
2495 | --- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c | ||
2496 | +++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c | ||
2497 | @@ -423,10 +423,10 @@ bool dc_stream_add_writeback(struct dc *dc, | ||
2498 | |||
2499 | if (dwb->funcs->is_enabled(dwb)) { | ||
2500 | /* writeback pipe already enabled, only need to update */ | ||
2501 | - dc->hwss.update_writeback(dc, stream_status, wb_info); | ||
2502 | + dc->hwss.update_writeback(dc, stream_status, wb_info, dc->current_state); | ||
2503 | } else { | ||
2504 | /* Enable writeback pipe from scratch*/ | ||
2505 | - dc->hwss.enable_writeback(dc, stream_status, wb_info); | ||
2506 | + dc->hwss.enable_writeback(dc, stream_status, wb_info, dc->current_state); | ||
2507 | } | ||
2508 | } | ||
2509 | |||
2510 | diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c | ||
2511 | index 58bd131d5b48..7700a855d77c 100644 | ||
2512 | --- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c | ||
2513 | +++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c | ||
2514 | @@ -77,6 +77,9 @@ static bool dce_abm_set_pipe(struct abm *abm, uint32_t controller_id) | ||
2515 | /* notifyDMCUMsg */ | ||
2516 | REG_UPDATE(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 1); | ||
2517 | |||
2518 | + REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, 0, | ||
2519 | + 1, 80000); | ||
2520 | + | ||
2521 | return true; | ||
2522 | } | ||
2523 | |||
2524 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | ||
2525 | index b3ae1c41fc69..937a8ba81160 100644 | ||
2526 | --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | ||
2527 | +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | ||
2528 | @@ -1356,7 +1356,8 @@ bool dcn20_update_bandwidth( | ||
2529 | static void dcn20_enable_writeback( | ||
2530 | struct dc *dc, | ||
2531 | const struct dc_stream_status *stream_status, | ||
2532 | - struct dc_writeback_info *wb_info) | ||
2533 | + struct dc_writeback_info *wb_info, | ||
2534 | + struct dc_state *context) | ||
2535 | { | ||
2536 | struct dwbc *dwb; | ||
2537 | struct mcif_wb *mcif_wb; | ||
2538 | @@ -1373,7 +1374,7 @@ static void dcn20_enable_writeback( | ||
2539 | optc->funcs->set_dwb_source(optc, wb_info->dwb_pipe_inst); | ||
2540 | /* set MCIF_WB buffer and arbitration configuration */ | ||
2541 | mcif_wb->funcs->config_mcif_buf(mcif_wb, &wb_info->mcif_buf_params, wb_info->dwb_params.dest_height); | ||
2542 | - mcif_wb->funcs->config_mcif_arb(mcif_wb, &dc->current_state->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[wb_info->dwb_pipe_inst]); | ||
2543 | + mcif_wb->funcs->config_mcif_arb(mcif_wb, &context->bw_ctx.bw.dcn.bw_writeback.mcif_wb_arb[wb_info->dwb_pipe_inst]); | ||
2544 | /* Enable MCIF_WB */ | ||
2545 | mcif_wb->funcs->enable_mcif(mcif_wb); | ||
2546 | /* Enable DWB */ | ||
2547 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | ||
2548 | index 2137e2be2140..dda90995ba93 100644 | ||
2549 | --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | ||
2550 | +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_optc.c | ||
2551 | @@ -287,6 +287,10 @@ void optc2_get_optc_source(struct timing_generator *optc, | ||
2552 | *num_of_src_opp = 2; | ||
2553 | else | ||
2554 | *num_of_src_opp = 1; | ||
2555 | + | ||
2556 | + /* Work around VBIOS not updating OPTC_NUM_OF_INPUT_SEGMENT */ | ||
2557 | + if (*src_opp_id_1 == 0xf) | ||
2558 | + *num_of_src_opp = 1; | ||
2559 | } | ||
2560 | |||
2561 | void optc2_set_dwb_source(struct timing_generator *optc, | ||
2562 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | ||
2563 | index 6b2f2f1a1c9c..78b2cc2e122f 100644 | ||
2564 | --- a/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | ||
2565 | +++ b/drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c | ||
2566 | @@ -1765,7 +1765,7 @@ int dcn20_populate_dml_pipes_from_context( | ||
2567 | pipe_cnt = i; | ||
2568 | continue; | ||
2569 | } | ||
2570 | - if (!resource_are_streams_timing_synchronizable( | ||
2571 | + if (dc->debug.disable_timing_sync || !resource_are_streams_timing_synchronizable( | ||
2572 | res_ctx->pipe_ctx[pipe_cnt].stream, | ||
2573 | res_ctx->pipe_ctx[i].stream)) { | ||
2574 | synchronized_vblank = false; | ||
2575 | @@ -2474,6 +2474,7 @@ bool dcn20_fast_validate_bw( | ||
2576 | &context->res_ctx, dc->res_pool, | ||
2577 | pipe, hsplit_pipe)) | ||
2578 | goto validate_fail; | ||
2579 | + dcn20_build_mapped_resource(dc, context, pipe->stream); | ||
2580 | } else | ||
2581 | dcn20_split_stream_for_mpc( | ||
2582 | &context->res_ctx, dc->res_pool, | ||
2583 | @@ -3040,7 +3041,7 @@ static void cap_soc_clocks( | ||
2584 | static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_st *bb, | ||
2585 | struct pp_smu_nv_clock_table *max_clocks, unsigned int *uclk_states, unsigned int num_states) | ||
2586 | { | ||
2587 | - struct _vcs_dpi_voltage_scaling_st calculated_states[MAX_CLOCK_LIMIT_STATES] = {0}; | ||
2588 | + struct _vcs_dpi_voltage_scaling_st calculated_states[MAX_CLOCK_LIMIT_STATES]; | ||
2589 | int i; | ||
2590 | int num_calculated_states = 0; | ||
2591 | int min_dcfclk = 0; | ||
2592 | @@ -3048,6 +3049,8 @@ static void update_bounding_box(struct dc *dc, struct _vcs_dpi_soc_bounding_box_ | ||
2593 | if (num_states == 0) | ||
2594 | return; | ||
2595 | |||
2596 | + memset(calculated_states, 0, sizeof(calculated_states)); | ||
2597 | + | ||
2598 | if (dc->bb_overrides.min_dcfclk_mhz > 0) | ||
2599 | min_dcfclk = dc->bb_overrides.min_dcfclk_mhz; | ||
2600 | else | ||
2601 | diff --git a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c | ||
2602 | index d1266741763b..f5f6b4a0f0aa 100644 | ||
2603 | --- a/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c | ||
2604 | +++ b/drivers/gpu/drm/amd/display/dc/dcn21/dcn21_hubbub.c | ||
2605 | @@ -22,6 +22,7 @@ | ||
2606 | * Authors: AMD | ||
2607 | * | ||
2608 | */ | ||
2609 | +#include <linux/delay.h> | ||
2610 | #include "dm_services.h" | ||
2611 | #include "dcn20/dcn20_hubbub.h" | ||
2612 | #include "dcn21_hubbub.h" | ||
2613 | @@ -71,30 +72,39 @@ static uint32_t convert_and_clamp( | ||
2614 | void dcn21_dchvm_init(struct hubbub *hubbub) | ||
2615 | { | ||
2616 | struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub); | ||
2617 | + uint32_t riommu_active; | ||
2618 | + int i; | ||
2619 | |||
2620 | //Init DCHVM block | ||
2621 | REG_UPDATE(DCHVM_CTRL0, HOSTVM_INIT_REQ, 1); | ||
2622 | |||
2623 | //Poll until RIOMMU_ACTIVE = 1 | ||
2624 | - //TODO: Figure out interval us and retry count | ||
2625 | - REG_WAIT(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, 1, 5, 100); | ||
2626 | + for (i = 0; i < 100; i++) { | ||
2627 | + REG_GET(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, &riommu_active); | ||
2628 | |||
2629 | - //Reflect the power status of DCHUBBUB | ||
2630 | - REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1); | ||
2631 | + if (riommu_active) | ||
2632 | + break; | ||
2633 | + else | ||
2634 | + udelay(5); | ||
2635 | + } | ||
2636 | + | ||
2637 | + if (riommu_active) { | ||
2638 | + //Reflect the power status of DCHUBBUB | ||
2639 | + REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1); | ||
2640 | |||
2641 | - //Start rIOMMU prefetching | ||
2642 | - REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_PREFETCH_REQ, 1); | ||
2643 | + //Start rIOMMU prefetching | ||
2644 | + REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_PREFETCH_REQ, 1); | ||
2645 | |||
2646 | - // Enable dynamic clock gating | ||
2647 | - REG_UPDATE_4(DCHVM_CLK_CTRL, | ||
2648 | - HVM_DISPCLK_R_GATE_DIS, 0, | ||
2649 | - HVM_DISPCLK_G_GATE_DIS, 0, | ||
2650 | - HVM_DCFCLK_R_GATE_DIS, 0, | ||
2651 | - HVM_DCFCLK_G_GATE_DIS, 0); | ||
2652 | + // Enable dynamic clock gating | ||
2653 | + REG_UPDATE_4(DCHVM_CLK_CTRL, | ||
2654 | + HVM_DISPCLK_R_GATE_DIS, 0, | ||
2655 | + HVM_DISPCLK_G_GATE_DIS, 0, | ||
2656 | + HVM_DCFCLK_R_GATE_DIS, 0, | ||
2657 | + HVM_DCFCLK_G_GATE_DIS, 0); | ||
2658 | |||
2659 | - //Poll until HOSTVM_PREFETCH_DONE = 1 | ||
2660 | - //TODO: Figure out interval us and retry count | ||
2661 | - REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100); | ||
2662 | + //Poll until HOSTVM_PREFETCH_DONE = 1 | ||
2663 | + REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100); | ||
2664 | + } | ||
2665 | } | ||
2666 | |||
2667 | static int hubbub21_init_dchub(struct hubbub *hubbub, | ||
2668 | diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | ||
2669 | index 3a938cd414ea..f6cc2d6f576d 100644 | ||
2670 | --- a/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | ||
2671 | +++ b/drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h | ||
2672 | @@ -321,10 +321,12 @@ struct hw_sequencer_funcs { | ||
2673 | struct dc_state *context); | ||
2674 | void (*update_writeback)(struct dc *dc, | ||
2675 | const struct dc_stream_status *stream_status, | ||
2676 | - struct dc_writeback_info *wb_info); | ||
2677 | + struct dc_writeback_info *wb_info, | ||
2678 | + struct dc_state *context); | ||
2679 | void (*enable_writeback)(struct dc *dc, | ||
2680 | const struct dc_stream_status *stream_status, | ||
2681 | - struct dc_writeback_info *wb_info); | ||
2682 | + struct dc_writeback_info *wb_info, | ||
2683 | + struct dc_state *context); | ||
2684 | void (*disable_writeback)(struct dc *dc, | ||
2685 | unsigned int dwb_pipe_inst); | ||
2686 | #endif | ||
2687 | diff --git a/drivers/gpu/drm/amd/display/include/ddc_service_types.h b/drivers/gpu/drm/amd/display/include/ddc_service_types.h | ||
2688 | index 18961707db23..9ad49da50a17 100644 | ||
2689 | --- a/drivers/gpu/drm/amd/display/include/ddc_service_types.h | ||
2690 | +++ b/drivers/gpu/drm/amd/display/include/ddc_service_types.h | ||
2691 | @@ -31,6 +31,8 @@ | ||
2692 | #define DP_BRANCH_DEVICE_ID_0022B9 0x0022B9 | ||
2693 | #define DP_BRANCH_DEVICE_ID_00001A 0x00001A | ||
2694 | #define DP_BRANCH_DEVICE_ID_0080E1 0x0080e1 | ||
2695 | +#define DP_BRANCH_DEVICE_ID_90CC24 0x90CC24 | ||
2696 | +#define DP_BRANCH_DEVICE_ID_00E04C 0x00E04C | ||
2697 | |||
2698 | enum ddc_result { | ||
2699 | DDC_RESULT_UNKNOWN = 0, | ||
2700 | diff --git a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c | ||
2701 | index ec70c9b12e1a..0978c698f0f8 100644 | ||
2702 | --- a/drivers/gpu/drm/amd/display/modules/freesync/freesync.c | ||
2703 | +++ b/drivers/gpu/drm/amd/display/modules/freesync/freesync.c | ||
2704 | @@ -743,6 +743,10 @@ void mod_freesync_build_vrr_params(struct mod_freesync *mod_freesync, | ||
2705 | nominal_field_rate_in_uhz = | ||
2706 | mod_freesync_calc_nominal_field_rate(stream); | ||
2707 | |||
2708 | + /* Rounded to the nearest Hz */ | ||
2709 | + nominal_field_rate_in_uhz = 1000000ULL * | ||
2710 | + div_u64(nominal_field_rate_in_uhz + 500000, 1000000); | ||
2711 | + | ||
2712 | min_refresh_in_uhz = in_config->min_refresh_in_uhz; | ||
2713 | max_refresh_in_uhz = in_config->max_refresh_in_uhz; | ||
2714 | |||
2715 | @@ -996,14 +1000,13 @@ unsigned long long mod_freesync_calc_nominal_field_rate( | ||
2716 | const struct dc_stream_state *stream) | ||
2717 | { | ||
2718 | unsigned long long nominal_field_rate_in_uhz = 0; | ||
2719 | + unsigned int total = stream->timing.h_total * stream->timing.v_total; | ||
2720 | |||
2721 | - /* Calculate nominal field rate for stream */ | ||
2722 | + /* Calculate nominal field rate for stream, rounded up to nearest integer */ | ||
2723 | nominal_field_rate_in_uhz = stream->timing.pix_clk_100hz / 10; | ||
2724 | nominal_field_rate_in_uhz *= 1000ULL * 1000ULL * 1000ULL; | ||
2725 | - nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, | ||
2726 | - stream->timing.h_total); | ||
2727 | - nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, | ||
2728 | - stream->timing.v_total); | ||
2729 | + | ||
2730 | + nominal_field_rate_in_uhz = div_u64(nominal_field_rate_in_uhz, total); | ||
2731 | |||
2732 | return nominal_field_rate_in_uhz; | ||
2733 | } | ||
2734 | diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c | ||
2735 | index 05e2be856037..ba1aafe40512 100644 | ||
2736 | --- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.c | ||
2737 | +++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.c | ||
2738 | @@ -115,7 +115,7 @@ static const struct abm_parameters * const abm_settings[] = { | ||
2739 | /* NOTE: iRAM is 256B in size */ | ||
2740 | struct iram_table_v_2 { | ||
2741 | /* flags */ | ||
2742 | - uint16_t flags; /* 0x00 U16 */ | ||
2743 | + uint16_t min_abm_backlight; /* 0x00 U16 */ | ||
2744 | |||
2745 | /* parameters for ABM2.0 algorithm */ | ||
2746 | uint8_t min_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x02 U0.8 */ | ||
2747 | @@ -140,10 +140,10 @@ struct iram_table_v_2 { | ||
2748 | |||
2749 | /* For reading PSR State directly from IRAM */ | ||
2750 | uint8_t psr_state; /* 0xf0 */ | ||
2751 | - uint8_t dmcu_mcp_interface_version; /* 0xf1 */ | ||
2752 | - uint8_t dmcu_abm_feature_version; /* 0xf2 */ | ||
2753 | - uint8_t dmcu_psr_feature_version; /* 0xf3 */ | ||
2754 | - uint16_t dmcu_version; /* 0xf4 */ | ||
2755 | + uint8_t dmcu_mcp_interface_version; /* 0xf1 */ | ||
2756 | + uint8_t dmcu_abm_feature_version; /* 0xf2 */ | ||
2757 | + uint8_t dmcu_psr_feature_version; /* 0xf3 */ | ||
2758 | + uint16_t dmcu_version; /* 0xf4 */ | ||
2759 | uint8_t dmcu_state; /* 0xf6 */ | ||
2760 | |||
2761 | uint16_t blRampReduction; /* 0xf7 */ | ||
2762 | @@ -164,42 +164,43 @@ struct iram_table_v_2_2 { | ||
2763 | uint8_t max_reduction[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x16 U0.8 */ | ||
2764 | uint8_t bright_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x2a U2.6 */ | ||
2765 | uint8_t dark_pos_gain[NUM_AMBI_LEVEL][NUM_AGGR_LEVEL]; /* 0x3e U2.6 */ | ||
2766 | - uint8_t hybrid_factor[NUM_AGGR_LEVEL]; /* 0x52 U0.8 */ | ||
2767 | - uint8_t contrast_factor[NUM_AGGR_LEVEL]; /* 0x56 U0.8 */ | ||
2768 | - uint8_t deviation_gain[NUM_AGGR_LEVEL]; /* 0x5a U0.8 */ | ||
2769 | - uint8_t iir_curve[NUM_AMBI_LEVEL]; /* 0x5e U0.8 */ | ||
2770 | - uint8_t min_knee[NUM_AGGR_LEVEL]; /* 0x63 U0.8 */ | ||
2771 | - uint8_t max_knee[NUM_AGGR_LEVEL]; /* 0x67 U0.8 */ | ||
2772 | - uint8_t pad[21]; /* 0x6b U0.8 */ | ||
2773 | + uint8_t hybrid_factor[NUM_AGGR_LEVEL]; /* 0x52 U0.8 */ | ||
2774 | + uint8_t contrast_factor[NUM_AGGR_LEVEL]; /* 0x56 U0.8 */ | ||
2775 | + uint8_t deviation_gain[NUM_AGGR_LEVEL]; /* 0x5a U0.8 */ | ||
2776 | + uint8_t iir_curve[NUM_AMBI_LEVEL]; /* 0x5e U0.8 */ | ||
2777 | + uint8_t min_knee[NUM_AGGR_LEVEL]; /* 0x63 U0.8 */ | ||
2778 | + uint8_t max_knee[NUM_AGGR_LEVEL]; /* 0x67 U0.8 */ | ||
2779 | + uint16_t min_abm_backlight; /* 0x6b U16 */ | ||
2780 | + uint8_t pad[19]; /* 0x6d U0.8 */ | ||
2781 | |||
2782 | /* parameters for crgb conversion */ | ||
2783 | - uint16_t crgb_thresh[NUM_POWER_FN_SEGS]; /* 0x80 U3.13 */ | ||
2784 | - uint16_t crgb_offset[NUM_POWER_FN_SEGS]; /* 0x90 U1.15 */ | ||
2785 | - uint16_t crgb_slope[NUM_POWER_FN_SEGS]; /* 0xa0 U4.12 */ | ||
2786 | + uint16_t crgb_thresh[NUM_POWER_FN_SEGS]; /* 0x80 U3.13 */ | ||
2787 | + uint16_t crgb_offset[NUM_POWER_FN_SEGS]; /* 0x90 U1.15 */ | ||
2788 | + uint16_t crgb_slope[NUM_POWER_FN_SEGS]; /* 0xa0 U4.12 */ | ||
2789 | |||
2790 | /* parameters for custom curve */ | ||
2791 | /* thresholds for brightness --> backlight */ | ||
2792 | - uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; /* 0xb0 U16.0 */ | ||
2793 | + uint16_t backlight_thresholds[NUM_BL_CURVE_SEGS]; /* 0xb0 U16.0 */ | ||
2794 | /* offsets for brightness --> backlight */ | ||
2795 | - uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; /* 0xd0 U16.0 */ | ||
2796 | + uint16_t backlight_offsets[NUM_BL_CURVE_SEGS]; /* 0xd0 U16.0 */ | ||
2797 | |||
2798 | /* For reading PSR State directly from IRAM */ | ||
2799 | - uint8_t psr_state; /* 0xf0 */ | ||
2800 | - uint8_t dmcu_mcp_interface_version; /* 0xf1 */ | ||
2801 | - uint8_t dmcu_abm_feature_version; /* 0xf2 */ | ||
2802 | - uint8_t dmcu_psr_feature_version; /* 0xf3 */ | ||
2803 | - uint16_t dmcu_version; /* 0xf4 */ | ||
2804 | - uint8_t dmcu_state; /* 0xf6 */ | ||
2805 | - | ||
2806 | - uint8_t dummy1; /* 0xf7 */ | ||
2807 | - uint8_t dummy2; /* 0xf8 */ | ||
2808 | - uint8_t dummy3; /* 0xf9 */ | ||
2809 | - uint8_t dummy4; /* 0xfa */ | ||
2810 | - uint8_t dummy5; /* 0xfb */ | ||
2811 | - uint8_t dummy6; /* 0xfc */ | ||
2812 | - uint8_t dummy7; /* 0xfd */ | ||
2813 | - uint8_t dummy8; /* 0xfe */ | ||
2814 | - uint8_t dummy9; /* 0xff */ | ||
2815 | + uint8_t psr_state; /* 0xf0 */ | ||
2816 | + uint8_t dmcu_mcp_interface_version; /* 0xf1 */ | ||
2817 | + uint8_t dmcu_abm_feature_version; /* 0xf2 */ | ||
2818 | + uint8_t dmcu_psr_feature_version; /* 0xf3 */ | ||
2819 | + uint16_t dmcu_version; /* 0xf4 */ | ||
2820 | + uint8_t dmcu_state; /* 0xf6 */ | ||
2821 | + | ||
2822 | + uint8_t dummy1; /* 0xf7 */ | ||
2823 | + uint8_t dummy2; /* 0xf8 */ | ||
2824 | + uint8_t dummy3; /* 0xf9 */ | ||
2825 | + uint8_t dummy4; /* 0xfa */ | ||
2826 | + uint8_t dummy5; /* 0xfb */ | ||
2827 | + uint8_t dummy6; /* 0xfc */ | ||
2828 | + uint8_t dummy7; /* 0xfd */ | ||
2829 | + uint8_t dummy8; /* 0xfe */ | ||
2830 | + uint8_t dummy9; /* 0xff */ | ||
2831 | }; | ||
2832 | #pragma pack(pop) | ||
2833 | |||
2834 | @@ -271,7 +272,8 @@ void fill_iram_v_2(struct iram_table_v_2 *ram_table, struct dmcu_iram_parameters | ||
2835 | { | ||
2836 | unsigned int set = params.set; | ||
2837 | |||
2838 | - ram_table->flags = 0x0; | ||
2839 | + ram_table->min_abm_backlight = | ||
2840 | + cpu_to_be16(params.min_abm_backlight); | ||
2841 | ram_table->deviation_gain = 0xb3; | ||
2842 | |||
2843 | ram_table->blRampReduction = | ||
2844 | @@ -445,6 +447,9 @@ void fill_iram_v_2_2(struct iram_table_v_2_2 *ram_table, struct dmcu_iram_parame | ||
2845 | |||
2846 | ram_table->flags = 0x0; | ||
2847 | |||
2848 | + ram_table->min_abm_backlight = | ||
2849 | + cpu_to_be16(params.min_abm_backlight); | ||
2850 | + | ||
2851 | ram_table->deviation_gain[0] = 0xb3; | ||
2852 | ram_table->deviation_gain[1] = 0xa8; | ||
2853 | ram_table->deviation_gain[2] = 0x98; | ||
2854 | @@ -588,6 +593,10 @@ void fill_iram_v_2_3(struct iram_table_v_2_2 *ram_table, struct dmcu_iram_parame | ||
2855 | unsigned int set = params.set; | ||
2856 | |||
2857 | ram_table->flags = 0x0; | ||
2858 | + | ||
2859 | + ram_table->min_abm_backlight = | ||
2860 | + cpu_to_be16(params.min_abm_backlight); | ||
2861 | + | ||
2862 | for (i = 0; i < NUM_AGGR_LEVEL; i++) { | ||
2863 | ram_table->hybrid_factor[i] = abm_settings[set][i].brightness_gain; | ||
2864 | ram_table->contrast_factor[i] = abm_settings[set][i].contrast_factor; | ||
2865 | diff --git a/drivers/gpu/drm/amd/display/modules/power/power_helpers.h b/drivers/gpu/drm/amd/display/modules/power/power_helpers.h | ||
2866 | index da5df00fedce..e54157026330 100644 | ||
2867 | --- a/drivers/gpu/drm/amd/display/modules/power/power_helpers.h | ||
2868 | +++ b/drivers/gpu/drm/amd/display/modules/power/power_helpers.h | ||
2869 | @@ -38,6 +38,7 @@ struct dmcu_iram_parameters { | ||
2870 | unsigned int backlight_lut_array_size; | ||
2871 | unsigned int backlight_ramping_reduction; | ||
2872 | unsigned int backlight_ramping_start; | ||
2873 | + unsigned int min_abm_backlight; | ||
2874 | unsigned int set; | ||
2875 | }; | ||
2876 | |||
2877 | diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | ||
2878 | index 4acf139ea014..58c091ab67b2 100644 | ||
2879 | --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | ||
2880 | +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | ||
2881 | @@ -1344,7 +1344,10 @@ static int smu_suspend(void *handle) | ||
2882 | int ret; | ||
2883 | struct amdgpu_device *adev = (struct amdgpu_device *)handle; | ||
2884 | struct smu_context *smu = &adev->smu; | ||
2885 | - bool baco_feature_is_enabled = smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT); | ||
2886 | + bool baco_feature_is_enabled = false; | ||
2887 | + | ||
2888 | + if(!(adev->flags & AMD_IS_APU)) | ||
2889 | + baco_feature_is_enabled = smu_feature_is_enabled(smu, SMU_FEATURE_BACO_BIT); | ||
2890 | |||
2891 | ret = smu_system_features_control(smu, false); | ||
2892 | if (ret) | ||
2893 | diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c | ||
2894 | index df6ff9252401..b068d1c7b44d 100644 | ||
2895 | --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c | ||
2896 | +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega20_baco.c | ||
2897 | @@ -29,7 +29,7 @@ | ||
2898 | #include "vega20_baco.h" | ||
2899 | #include "vega20_smumgr.h" | ||
2900 | |||
2901 | - | ||
2902 | +#include "amdgpu_ras.h" | ||
2903 | |||
2904 | static const struct soc15_baco_cmd_entry clean_baco_tbl[] = | ||
2905 | { | ||
2906 | @@ -74,6 +74,7 @@ int vega20_baco_get_state(struct pp_hwmgr *hwmgr, enum BACO_STATE *state) | ||
2907 | int vega20_baco_set_state(struct pp_hwmgr *hwmgr, enum BACO_STATE state) | ||
2908 | { | ||
2909 | struct amdgpu_device *adev = (struct amdgpu_device *)(hwmgr->adev); | ||
2910 | + struct amdgpu_ras *ras = amdgpu_ras_get_context(adev); | ||
2911 | enum BACO_STATE cur_state; | ||
2912 | uint32_t data; | ||
2913 | |||
2914 | @@ -84,10 +85,11 @@ int vega20_baco_set_state(struct pp_hwmgr *hwmgr, enum BACO_STATE state) | ||
2915 | return 0; | ||
2916 | |||
2917 | if (state == BACO_STATE_IN) { | ||
2918 | - data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL); | ||
2919 | - data |= 0x80000000; | ||
2920 | - WREG32_SOC15(THM, 0, mmTHM_BACO_CNTL, data); | ||
2921 | - | ||
2922 | + if (!ras || !ras->supported) { | ||
2923 | + data = RREG32_SOC15(THM, 0, mmTHM_BACO_CNTL); | ||
2924 | + data |= 0x80000000; | ||
2925 | + WREG32_SOC15(THM, 0, mmTHM_BACO_CNTL, data); | ||
2926 | + } | ||
2927 | |||
2928 | if(smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_EnterBaco, 0)) | ||
2929 | return -EINVAL; | ||
2930 | diff --git a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c | ||
2931 | index e62bfba51562..e5283dafc414 100644 | ||
2932 | --- a/drivers/gpu/drm/amd/powerplay/renoir_ppt.c | ||
2933 | +++ b/drivers/gpu/drm/amd/powerplay/renoir_ppt.c | ||
2934 | @@ -183,11 +183,13 @@ static int renoir_print_clk_levels(struct smu_context *smu, | ||
2935 | int i, size = 0, ret = 0; | ||
2936 | uint32_t cur_value = 0, value = 0, count = 0, min = 0, max = 0; | ||
2937 | DpmClocks_t *clk_table = smu->smu_table.clocks_table; | ||
2938 | - SmuMetrics_t metrics = {0}; | ||
2939 | + SmuMetrics_t metrics; | ||
2940 | |||
2941 | if (!clk_table || clk_type >= SMU_CLK_COUNT) | ||
2942 | return -EINVAL; | ||
2943 | |||
2944 | + memset(&metrics, 0, sizeof(metrics)); | ||
2945 | + | ||
2946 | ret = smu_update_table(smu, SMU_TABLE_SMU_METRICS, 0, | ||
2947 | (void *)&metrics, false); | ||
2948 | if (ret) | ||
2949 | diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c | ||
2950 | index 624d257da20f..52c42569a111 100644 | ||
2951 | --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c | ||
2952 | +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c | ||
2953 | @@ -250,6 +250,7 @@ komeda_crtc_atomic_enable(struct drm_crtc *crtc, | ||
2954 | { | ||
2955 | komeda_crtc_prepare(to_kcrtc(crtc)); | ||
2956 | drm_crtc_vblank_on(crtc); | ||
2957 | + WARN_ON(drm_crtc_vblank_get(crtc)); | ||
2958 | komeda_crtc_do_flush(crtc, old); | ||
2959 | } | ||
2960 | |||
2961 | @@ -319,6 +320,7 @@ komeda_crtc_atomic_disable(struct drm_crtc *crtc, | ||
2962 | } | ||
2963 | } | ||
2964 | |||
2965 | + drm_crtc_vblank_put(crtc); | ||
2966 | drm_crtc_vblank_off(crtc); | ||
2967 | komeda_crtc_unprepare(kcrtc); | ||
2968 | } | ||
2969 | diff --git a/drivers/gpu/drm/bridge/analogix-anx78xx.c b/drivers/gpu/drm/bridge/analogix-anx78xx.c | ||
2970 | index 3c7cc5af735c..56df07cdab68 100644 | ||
2971 | --- a/drivers/gpu/drm/bridge/analogix-anx78xx.c | ||
2972 | +++ b/drivers/gpu/drm/bridge/analogix-anx78xx.c | ||
2973 | @@ -715,7 +715,9 @@ static int anx78xx_init_pdata(struct anx78xx *anx78xx) | ||
2974 | /* 1.0V digital core power regulator */ | ||
2975 | pdata->dvdd10 = devm_regulator_get(dev, "dvdd10"); | ||
2976 | if (IS_ERR(pdata->dvdd10)) { | ||
2977 | - DRM_ERROR("DVDD10 regulator not found\n"); | ||
2978 | + if (PTR_ERR(pdata->dvdd10) != -EPROBE_DEFER) | ||
2979 | + DRM_ERROR("DVDD10 regulator not found\n"); | ||
2980 | + | ||
2981 | return PTR_ERR(pdata->dvdd10); | ||
2982 | } | ||
2983 | |||
2984 | @@ -1332,7 +1334,9 @@ static int anx78xx_i2c_probe(struct i2c_client *client, | ||
2985 | |||
2986 | err = anx78xx_init_pdata(anx78xx); | ||
2987 | if (err) { | ||
2988 | - DRM_ERROR("Failed to initialize pdata: %d\n", err); | ||
2989 | + if (err != -EPROBE_DEFER) | ||
2990 | + DRM_ERROR("Failed to initialize pdata: %d\n", err); | ||
2991 | + | ||
2992 | return err; | ||
2993 | } | ||
2994 | |||
2995 | diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | ||
2996 | index 521d689413c8..1326f2c734bf 100644 | ||
2997 | --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | ||
2998 | +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | ||
2999 | @@ -36,6 +36,7 @@ | ||
3000 | #include "dw-hdmi-cec.h" | ||
3001 | #include "dw-hdmi.h" | ||
3002 | |||
3003 | +#define DDC_CI_ADDR 0x37 | ||
3004 | #define DDC_SEGMENT_ADDR 0x30 | ||
3005 | |||
3006 | #define HDMI_EDID_LEN 512 | ||
3007 | @@ -398,6 +399,15 @@ static int dw_hdmi_i2c_xfer(struct i2c_adapter *adap, | ||
3008 | u8 addr = msgs[0].addr; | ||
3009 | int i, ret = 0; | ||
3010 | |||
3011 | + if (addr == DDC_CI_ADDR) | ||
3012 | + /* | ||
3013 | + * The internal I2C controller does not support the multi-byte | ||
3014 | + * read and write operations needed for DDC/CI. | ||
3015 | + * TOFIX: Blacklist the DDC/CI address until we filter out | ||
3016 | + * unsupported I2C operations. | ||
3017 | + */ | ||
3018 | + return -EOPNOTSUPP; | ||
3019 | + | ||
3020 | dev_dbg(hdmi->dev, "xfer: num: %d, addr: %#x\n", num, addr); | ||
3021 | |||
3022 | for (i = 0; i < num; i++) { | ||
3023 | @@ -2023,7 +2033,7 @@ static int dw_hdmi_setup(struct dw_hdmi *hdmi, struct drm_display_mode *mode) | ||
3024 | |||
3025 | /* HDMI Initialization Step E - Configure audio */ | ||
3026 | hdmi_clk_regenerator_update_pixel_clock(hdmi); | ||
3027 | - hdmi_enable_audio_clk(hdmi, true); | ||
3028 | + hdmi_enable_audio_clk(hdmi, hdmi->audio_enable); | ||
3029 | } | ||
3030 | |||
3031 | /* not for DVI mode */ | ||
3032 | diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c | ||
3033 | index 6b0177112e18..3f50b8865db4 100644 | ||
3034 | --- a/drivers/gpu/drm/drm_edid.c | ||
3035 | +++ b/drivers/gpu/drm/drm_edid.c | ||
3036 | @@ -3722,7 +3722,7 @@ cea_db_offsets(const u8 *cea, int *start, int *end) | ||
3037 | if (*end < 4 || *end > 127) | ||
3038 | return -ERANGE; | ||
3039 | } else { | ||
3040 | - return -ENOTSUPP; | ||
3041 | + return -EOPNOTSUPP; | ||
3042 | } | ||
3043 | |||
3044 | return 0; | ||
3045 | @@ -4191,7 +4191,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads) | ||
3046 | |||
3047 | if (cea_revision(cea) < 3) { | ||
3048 | DRM_DEBUG_KMS("SAD: wrong CEA revision\n"); | ||
3049 | - return -ENOTSUPP; | ||
3050 | + return -EOPNOTSUPP; | ||
3051 | } | ||
3052 | |||
3053 | if (cea_db_offsets(cea, &start, &end)) { | ||
3054 | @@ -4252,7 +4252,7 @@ int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb) | ||
3055 | |||
3056 | if (cea_revision(cea) < 3) { | ||
3057 | DRM_DEBUG_KMS("SAD: wrong CEA revision\n"); | ||
3058 | - return -ENOTSUPP; | ||
3059 | + return -EOPNOTSUPP; | ||
3060 | } | ||
3061 | |||
3062 | if (cea_db_offsets(cea, &start, &end)) { | ||
3063 | diff --git a/drivers/gpu/drm/drm_mipi_dbi.c b/drivers/gpu/drm/drm_mipi_dbi.c | ||
3064 | index 1961f713aaab..f8154316a3b0 100644 | ||
3065 | --- a/drivers/gpu/drm/drm_mipi_dbi.c | ||
3066 | +++ b/drivers/gpu/drm/drm_mipi_dbi.c | ||
3067 | @@ -955,7 +955,7 @@ static int mipi_dbi_typec1_command(struct mipi_dbi *dbi, u8 *cmd, | ||
3068 | int ret; | ||
3069 | |||
3070 | if (mipi_dbi_command_is_read(dbi, *cmd)) | ||
3071 | - return -ENOTSUPP; | ||
3072 | + return -EOPNOTSUPP; | ||
3073 | |||
3074 | MIPI_DBI_DEBUG_COMMAND(*cmd, parameters, num); | ||
3075 | |||
3076 | @@ -1187,8 +1187,7 @@ static ssize_t mipi_dbi_debugfs_command_write(struct file *file, | ||
3077 | struct mipi_dbi_dev *dbidev = m->private; | ||
3078 | u8 val, cmd = 0, parameters[64]; | ||
3079 | char *buf, *pos, *token; | ||
3080 | - unsigned int i; | ||
3081 | - int ret, idx; | ||
3082 | + int i, ret, idx; | ||
3083 | |||
3084 | if (!drm_dev_enter(&dbidev->drm, &idx)) | ||
3085 | return -ENODEV; | ||
3086 | diff --git a/drivers/gpu/drm/drm_vblank.c b/drivers/gpu/drm/drm_vblank.c | ||
3087 | index fd1fbc77871f..552ec82e9bc5 100644 | ||
3088 | --- a/drivers/gpu/drm/drm_vblank.c | ||
3089 | +++ b/drivers/gpu/drm/drm_vblank.c | ||
3090 | @@ -1581,7 +1581,7 @@ int drm_wait_vblank_ioctl(struct drm_device *dev, void *data, | ||
3091 | unsigned int flags, pipe, high_pipe; | ||
3092 | |||
3093 | if (!dev->irq_enabled) | ||
3094 | - return -EINVAL; | ||
3095 | + return -EOPNOTSUPP; | ||
3096 | |||
3097 | if (vblwait->request.type & _DRM_VBLANK_SIGNAL) | ||
3098 | return -EINVAL; | ||
3099 | @@ -1838,7 +1838,7 @@ int drm_crtc_get_sequence_ioctl(struct drm_device *dev, void *data, | ||
3100 | return -EOPNOTSUPP; | ||
3101 | |||
3102 | if (!dev->irq_enabled) | ||
3103 | - return -EINVAL; | ||
3104 | + return -EOPNOTSUPP; | ||
3105 | |||
3106 | crtc = drm_crtc_find(dev, file_priv, get_seq->crtc_id); | ||
3107 | if (!crtc) | ||
3108 | @@ -1896,7 +1896,7 @@ int drm_crtc_queue_sequence_ioctl(struct drm_device *dev, void *data, | ||
3109 | return -EOPNOTSUPP; | ||
3110 | |||
3111 | if (!dev->irq_enabled) | ||
3112 | - return -EINVAL; | ||
3113 | + return -EOPNOTSUPP; | ||
3114 | |||
3115 | crtc = drm_crtc_find(dev, file_priv, queue_seq->crtc_id); | ||
3116 | if (!crtc) | ||
3117 | diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c | ||
3118 | index bc1565f1822a..09aa73c0f2ad 100644 | ||
3119 | --- a/drivers/gpu/drm/exynos/exynos_hdmi.c | ||
3120 | +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | ||
3121 | @@ -852,6 +852,10 @@ static enum drm_connector_status hdmi_detect(struct drm_connector *connector, | ||
3122 | |||
3123 | static void hdmi_connector_destroy(struct drm_connector *connector) | ||
3124 | { | ||
3125 | + struct hdmi_context *hdata = connector_to_hdmi(connector); | ||
3126 | + | ||
3127 | + cec_notifier_conn_unregister(hdata->notifier); | ||
3128 | + | ||
3129 | drm_connector_unregister(connector); | ||
3130 | drm_connector_cleanup(connector); | ||
3131 | } | ||
3132 | @@ -935,6 +939,7 @@ static int hdmi_create_connector(struct drm_encoder *encoder) | ||
3133 | { | ||
3134 | struct hdmi_context *hdata = encoder_to_hdmi(encoder); | ||
3135 | struct drm_connector *connector = &hdata->connector; | ||
3136 | + struct cec_connector_info conn_info; | ||
3137 | int ret; | ||
3138 | |||
3139 | connector->interlace_allowed = true; | ||
3140 | @@ -957,6 +962,15 @@ static int hdmi_create_connector(struct drm_encoder *encoder) | ||
3141 | DRM_DEV_ERROR(hdata->dev, "Failed to attach bridge\n"); | ||
3142 | } | ||
3143 | |||
3144 | + cec_fill_conn_info_from_drm(&conn_info, connector); | ||
3145 | + | ||
3146 | + hdata->notifier = cec_notifier_conn_register(hdata->dev, NULL, | ||
3147 | + &conn_info); | ||
3148 | + if (!hdata->notifier) { | ||
3149 | + ret = -ENOMEM; | ||
3150 | + DRM_DEV_ERROR(hdata->dev, "Failed to allocate CEC notifier\n"); | ||
3151 | + } | ||
3152 | + | ||
3153 | return ret; | ||
3154 | } | ||
3155 | |||
3156 | @@ -1528,8 +1542,8 @@ static void hdmi_disable(struct drm_encoder *encoder) | ||
3157 | */ | ||
3158 | mutex_unlock(&hdata->mutex); | ||
3159 | cancel_delayed_work(&hdata->hotplug_work); | ||
3160 | - cec_notifier_set_phys_addr(hdata->notifier, | ||
3161 | - CEC_PHYS_ADDR_INVALID); | ||
3162 | + if (hdata->notifier) | ||
3163 | + cec_notifier_phys_addr_invalidate(hdata->notifier); | ||
3164 | return; | ||
3165 | } | ||
3166 | |||
3167 | @@ -2006,12 +2020,6 @@ static int hdmi_probe(struct platform_device *pdev) | ||
3168 | } | ||
3169 | } | ||
3170 | |||
3171 | - hdata->notifier = cec_notifier_get(&pdev->dev); | ||
3172 | - if (hdata->notifier == NULL) { | ||
3173 | - ret = -ENOMEM; | ||
3174 | - goto err_hdmiphy; | ||
3175 | - } | ||
3176 | - | ||
3177 | pm_runtime_enable(dev); | ||
3178 | |||
3179 | audio_infoframe = &hdata->audio.infoframe; | ||
3180 | @@ -2023,7 +2031,7 @@ static int hdmi_probe(struct platform_device *pdev) | ||
3181 | |||
3182 | ret = hdmi_register_audio_device(hdata); | ||
3183 | if (ret) | ||
3184 | - goto err_notifier_put; | ||
3185 | + goto err_rpm_disable; | ||
3186 | |||
3187 | ret = component_add(&pdev->dev, &hdmi_component_ops); | ||
3188 | if (ret) | ||
3189 | @@ -2034,8 +2042,7 @@ static int hdmi_probe(struct platform_device *pdev) | ||
3190 | err_unregister_audio: | ||
3191 | platform_device_unregister(hdata->audio.pdev); | ||
3192 | |||
3193 | -err_notifier_put: | ||
3194 | - cec_notifier_put(hdata->notifier); | ||
3195 | +err_rpm_disable: | ||
3196 | pm_runtime_disable(dev); | ||
3197 | |||
3198 | err_hdmiphy: | ||
3199 | @@ -2054,12 +2061,10 @@ static int hdmi_remove(struct platform_device *pdev) | ||
3200 | struct hdmi_context *hdata = platform_get_drvdata(pdev); | ||
3201 | |||
3202 | cancel_delayed_work_sync(&hdata->hotplug_work); | ||
3203 | - cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID); | ||
3204 | |||
3205 | component_del(&pdev->dev, &hdmi_component_ops); | ||
3206 | platform_device_unregister(hdata->audio.pdev); | ||
3207 | |||
3208 | - cec_notifier_put(hdata->notifier); | ||
3209 | pm_runtime_disable(&pdev->dev); | ||
3210 | |||
3211 | if (!IS_ERR(hdata->reg_hdmi_en)) | ||
3212 | diff --git a/drivers/gpu/drm/gma500/oaktrail_crtc.c b/drivers/gpu/drm/gma500/oaktrail_crtc.c | ||
3213 | index 167c10767dd4..900e5499249d 100644 | ||
3214 | --- a/drivers/gpu/drm/gma500/oaktrail_crtc.c | ||
3215 | +++ b/drivers/gpu/drm/gma500/oaktrail_crtc.c | ||
3216 | @@ -129,6 +129,7 @@ static bool mrst_sdvo_find_best_pll(const struct gma_limit_t *limit, | ||
3217 | s32 freq_error, min_error = 100000; | ||
3218 | |||
3219 | memset(best_clock, 0, sizeof(*best_clock)); | ||
3220 | + memset(&clock, 0, sizeof(clock)); | ||
3221 | |||
3222 | for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) { | ||
3223 | for (clock.n = limit->n.min; clock.n <= limit->n.max; | ||
3224 | @@ -185,6 +186,7 @@ static bool mrst_lvds_find_best_pll(const struct gma_limit_t *limit, | ||
3225 | int err = target; | ||
3226 | |||
3227 | memset(best_clock, 0, sizeof(*best_clock)); | ||
3228 | + memset(&clock, 0, sizeof(clock)); | ||
3229 | |||
3230 | for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) { | ||
3231 | for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max; | ||
3232 | diff --git a/drivers/gpu/drm/meson/meson_vclk.c b/drivers/gpu/drm/meson/meson_vclk.c | ||
3233 | index ac491a781952..f690793ae2d5 100644 | ||
3234 | --- a/drivers/gpu/drm/meson/meson_vclk.c | ||
3235 | +++ b/drivers/gpu/drm/meson/meson_vclk.c | ||
3236 | @@ -638,13 +638,18 @@ static bool meson_hdmi_pll_validate_params(struct meson_drm *priv, | ||
3237 | if (frac >= HDMI_FRAC_MAX_GXBB) | ||
3238 | return false; | ||
3239 | } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXM) || | ||
3240 | - meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL) || | ||
3241 | - meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { | ||
3242 | + meson_vpu_is_compatible(priv, VPU_COMPATIBLE_GXL)) { | ||
3243 | /* Empiric supported min/max dividers */ | ||
3244 | if (m < 106 || m > 247) | ||
3245 | return false; | ||
3246 | if (frac >= HDMI_FRAC_MAX_GXL) | ||
3247 | return false; | ||
3248 | + } else if (meson_vpu_is_compatible(priv, VPU_COMPATIBLE_G12A)) { | ||
3249 | + /* Empiric supported min/max dividers */ | ||
3250 | + if (m < 106 || m > 247) | ||
3251 | + return false; | ||
3252 | + if (frac >= HDMI_FRAC_MAX_G12A) | ||
3253 | + return false; | ||
3254 | } | ||
3255 | |||
3256 | return true; | ||
3257 | diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
3258 | index e686331fa089..691c1a277d91 100644 | ||
3259 | --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
3260 | +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c | ||
3261 | @@ -352,26 +352,26 @@ static void a6xx_get_debugbus(struct msm_gpu *gpu, | ||
3262 | cxdbg = ioremap(res->start, resource_size(res)); | ||
3263 | |||
3264 | if (cxdbg) { | ||
3265 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_CNTLT, | ||
3266 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLT, | ||
3267 | A6XX_DBGC_CFG_DBGBUS_CNTLT_SEGT(0xf)); | ||
3268 | |||
3269 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_CNTLM, | ||
3270 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_CNTLM, | ||
3271 | A6XX_DBGC_CFG_DBGBUS_CNTLM_ENABLE(0xf)); | ||
3272 | |||
3273 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_0, 0); | ||
3274 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_1, 0); | ||
3275 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_2, 0); | ||
3276 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_IVTL_3, 0); | ||
3277 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_0, 0); | ||
3278 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_1, 0); | ||
3279 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_2, 0); | ||
3280 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_IVTL_3, 0); | ||
3281 | |||
3282 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_0, | ||
3283 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_0, | ||
3284 | 0x76543210); | ||
3285 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_BYTEL_1, | ||
3286 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_BYTEL_1, | ||
3287 | 0xFEDCBA98); | ||
3288 | |||
3289 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_0, 0); | ||
3290 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_1, 0); | ||
3291 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_2, 0); | ||
3292 | - cxdbg_write(cxdbg, REG_A6XX_DBGC_CFG_DBGBUS_MASKL_3, 0); | ||
3293 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_0, 0); | ||
3294 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_1, 0); | ||
3295 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_2, 0); | ||
3296 | + cxdbg_write(cxdbg, REG_A6XX_CX_DBGC_CFG_DBGBUS_MASKL_3, 0); | ||
3297 | } | ||
3298 | |||
3299 | a6xx_state->debugbus = state_kcalloc(a6xx_state, | ||
3300 | diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c | ||
3301 | index 94dfa2e5a9ab..a442a955f98c 100644 | ||
3302 | --- a/drivers/gpu/drm/nouveau/nouveau_connector.c | ||
3303 | +++ b/drivers/gpu/drm/nouveau/nouveau_connector.c | ||
3304 | @@ -1131,6 +1131,16 @@ nouveau_connector_hotplug(struct nvif_notify *notify) | ||
3305 | const char *name = connector->name; | ||
3306 | struct nouveau_encoder *nv_encoder; | ||
3307 | int ret; | ||
3308 | + bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG); | ||
3309 | + | ||
3310 | + if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) { | ||
3311 | + NV_DEBUG(drm, "service %s\n", name); | ||
3312 | + drm_dp_cec_irq(&nv_connector->aux); | ||
3313 | + if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) | ||
3314 | + nv50_mstm_service(nv_encoder->dp.mstm); | ||
3315 | + | ||
3316 | + return NVIF_NOTIFY_KEEP; | ||
3317 | + } | ||
3318 | |||
3319 | ret = pm_runtime_get(drm->dev->dev); | ||
3320 | if (ret == 0) { | ||
3321 | @@ -1151,25 +1161,16 @@ nouveau_connector_hotplug(struct nvif_notify *notify) | ||
3322 | return NVIF_NOTIFY_DROP; | ||
3323 | } | ||
3324 | |||
3325 | - if (rep->mask & NVIF_NOTIFY_CONN_V0_IRQ) { | ||
3326 | - NV_DEBUG(drm, "service %s\n", name); | ||
3327 | - drm_dp_cec_irq(&nv_connector->aux); | ||
3328 | - if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) | ||
3329 | - nv50_mstm_service(nv_encoder->dp.mstm); | ||
3330 | - } else { | ||
3331 | - bool plugged = (rep->mask != NVIF_NOTIFY_CONN_V0_UNPLUG); | ||
3332 | - | ||
3333 | + if (!plugged) | ||
3334 | + drm_dp_cec_unset_edid(&nv_connector->aux); | ||
3335 | + NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name); | ||
3336 | + if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) { | ||
3337 | if (!plugged) | ||
3338 | - drm_dp_cec_unset_edid(&nv_connector->aux); | ||
3339 | - NV_DEBUG(drm, "%splugged %s\n", plugged ? "" : "un", name); | ||
3340 | - if ((nv_encoder = find_encoder(connector, DCB_OUTPUT_DP))) { | ||
3341 | - if (!plugged) | ||
3342 | - nv50_mstm_remove(nv_encoder->dp.mstm); | ||
3343 | - } | ||
3344 | - | ||
3345 | - drm_helper_hpd_irq_event(connector->dev); | ||
3346 | + nv50_mstm_remove(nv_encoder->dp.mstm); | ||
3347 | } | ||
3348 | |||
3349 | + drm_helper_hpd_irq_event(connector->dev); | ||
3350 | + | ||
3351 | pm_runtime_mark_last_busy(drm->dev->dev); | ||
3352 | pm_runtime_put_autosuspend(drm->dev->dev); | ||
3353 | return NVIF_NOTIFY_KEEP; | ||
3354 | diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | ||
3355 | index b5b14aa059ea..2aa89eaecf6f 100644 | ||
3356 | --- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | ||
3357 | +++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c | ||
3358 | @@ -426,6 +426,7 @@ static int rpi_touchscreen_probe(struct i2c_client *i2c, | ||
3359 | return PTR_ERR(ts->dsi); | ||
3360 | } | ||
3361 | |||
3362 | + drm_panel_init(&ts->base); | ||
3363 | ts->base.dev = dev; | ||
3364 | ts->base.funcs = &rpi_touchscreen_funcs; | ||
3365 | |||
3366 | diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c | ||
3367 | index 5e3e92ea9ea6..3b2612ae931e 100644 | ||
3368 | --- a/drivers/gpu/drm/panel/panel-sitronix-st7789v.c | ||
3369 | +++ b/drivers/gpu/drm/panel/panel-sitronix-st7789v.c | ||
3370 | @@ -381,6 +381,7 @@ static int st7789v_probe(struct spi_device *spi) | ||
3371 | spi_set_drvdata(spi, ctx); | ||
3372 | ctx->spi = spi; | ||
3373 | |||
3374 | + drm_panel_init(&ctx->panel); | ||
3375 | ctx->panel.dev = &spi->dev; | ||
3376 | ctx->panel.funcs = &st7789v_drm_funcs; | ||
3377 | |||
3378 | diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c | ||
3379 | index f39b97ed4ade..2af64459b3d7 100644 | ||
3380 | --- a/drivers/gpu/drm/scheduler/sched_main.c | ||
3381 | +++ b/drivers/gpu/drm/scheduler/sched_main.c | ||
3382 | @@ -632,43 +632,41 @@ static void drm_sched_process_job(struct dma_fence *f, struct dma_fence_cb *cb) | ||
3383 | } | ||
3384 | |||
3385 | /** | ||
3386 | - * drm_sched_cleanup_jobs - destroy finished jobs | ||
3387 | + * drm_sched_get_cleanup_job - fetch the next finished job to be destroyed | ||
3388 | * | ||
3389 | * @sched: scheduler instance | ||
3390 | * | ||
3391 | - * Remove all finished jobs from the mirror list and destroy them. | ||
3392 | + * Returns the next finished job from the mirror list (if there is one) | ||
3393 | + * ready for it to be destroyed. | ||
3394 | */ | ||
3395 | -static void drm_sched_cleanup_jobs(struct drm_gpu_scheduler *sched) | ||
3396 | +static struct drm_sched_job * | ||
3397 | +drm_sched_get_cleanup_job(struct drm_gpu_scheduler *sched) | ||
3398 | { | ||
3399 | + struct drm_sched_job *job; | ||
3400 | unsigned long flags; | ||
3401 | |||
3402 | /* Don't destroy jobs while the timeout worker is running */ | ||
3403 | if (sched->timeout != MAX_SCHEDULE_TIMEOUT && | ||
3404 | !cancel_delayed_work(&sched->work_tdr)) | ||
3405 | - return; | ||
3406 | - | ||
3407 | + return NULL; | ||
3408 | |||
3409 | - while (!list_empty(&sched->ring_mirror_list)) { | ||
3410 | - struct drm_sched_job *job; | ||
3411 | + spin_lock_irqsave(&sched->job_list_lock, flags); | ||
3412 | |||
3413 | - job = list_first_entry(&sched->ring_mirror_list, | ||
3414 | + job = list_first_entry_or_null(&sched->ring_mirror_list, | ||
3415 | struct drm_sched_job, node); | ||
3416 | - if (!dma_fence_is_signaled(&job->s_fence->finished)) | ||
3417 | - break; | ||
3418 | |||
3419 | - spin_lock_irqsave(&sched->job_list_lock, flags); | ||
3420 | + if (job && dma_fence_is_signaled(&job->s_fence->finished)) { | ||
3421 | /* remove job from ring_mirror_list */ | ||
3422 | list_del_init(&job->node); | ||
3423 | - spin_unlock_irqrestore(&sched->job_list_lock, flags); | ||
3424 | - | ||
3425 | - sched->ops->free_job(job); | ||
3426 | + } else { | ||
3427 | + job = NULL; | ||
3428 | + /* queue timeout for next job */ | ||
3429 | + drm_sched_start_timeout(sched); | ||
3430 | } | ||
3431 | |||
3432 | - /* queue timeout for next job */ | ||
3433 | - spin_lock_irqsave(&sched->job_list_lock, flags); | ||
3434 | - drm_sched_start_timeout(sched); | ||
3435 | spin_unlock_irqrestore(&sched->job_list_lock, flags); | ||
3436 | |||
3437 | + return job; | ||
3438 | } | ||
3439 | |||
3440 | /** | ||
3441 | @@ -708,12 +706,19 @@ static int drm_sched_main(void *param) | ||
3442 | struct drm_sched_fence *s_fence; | ||
3443 | struct drm_sched_job *sched_job; | ||
3444 | struct dma_fence *fence; | ||
3445 | + struct drm_sched_job *cleanup_job = NULL; | ||
3446 | |||
3447 | wait_event_interruptible(sched->wake_up_worker, | ||
3448 | - (drm_sched_cleanup_jobs(sched), | ||
3449 | + (cleanup_job = drm_sched_get_cleanup_job(sched)) || | ||
3450 | (!drm_sched_blocked(sched) && | ||
3451 | (entity = drm_sched_select_entity(sched))) || | ||
3452 | - kthread_should_stop())); | ||
3453 | + kthread_should_stop()); | ||
3454 | + | ||
3455 | + if (cleanup_job) { | ||
3456 | + sched->ops->free_job(cleanup_job); | ||
3457 | + /* queue timeout for next job */ | ||
3458 | + drm_sched_start_timeout(sched); | ||
3459 | + } | ||
3460 | |||
3461 | if (!entity) | ||
3462 | continue; | ||
3463 | diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | ||
3464 | index 1636344ba9ec..f83522717488 100644 | ||
3465 | --- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | ||
3466 | +++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | ||
3467 | @@ -437,9 +437,9 @@ static void sun6i_dsi_setup_burst(struct sun6i_dsi *dsi, | ||
3468 | SUN6I_DSI_BURST_LINE_SYNC_POINT(SUN6I_DSI_SYNC_POINT)); | ||
3469 | |||
3470 | val = SUN6I_DSI_TCON_DRQ_ENABLE_MODE; | ||
3471 | - } else if ((mode->hsync_end - mode->hdisplay) > 20) { | ||
3472 | + } else if ((mode->hsync_start - mode->hdisplay) > 20) { | ||
3473 | /* Maaaaaagic */ | ||
3474 | - u16 drq = (mode->hsync_end - mode->hdisplay) - 20; | ||
3475 | + u16 drq = (mode->hsync_start - mode->hdisplay) - 20; | ||
3476 | |||
3477 | drq *= mipi_dsi_pixel_format_to_bpp(device->format); | ||
3478 | drq /= 32; | ||
3479 | diff --git a/drivers/gpu/drm/tegra/sor.c b/drivers/gpu/drm/tegra/sor.c | ||
3480 | index e1669ada0a40..75e65d9536d5 100644 | ||
3481 | --- a/drivers/gpu/drm/tegra/sor.c | ||
3482 | +++ b/drivers/gpu/drm/tegra/sor.c | ||
3483 | @@ -3200,6 +3200,11 @@ static int tegra_sor_parse_dt(struct tegra_sor *sor) | ||
3484 | * earlier | ||
3485 | */ | ||
3486 | sor->pad = TEGRA_IO_PAD_HDMI_DP0 + sor->index; | ||
3487 | + } else { | ||
3488 | + if (sor->soc->supports_edp) | ||
3489 | + sor->index = 0; | ||
3490 | + else | ||
3491 | + sor->index = 1; | ||
3492 | } | ||
3493 | |||
3494 | err = of_property_read_u32_array(np, "nvidia,xbar-cfg", xbar_cfg, 5); | ||
3495 | diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c | ||
3496 | index 98819462f025..f07803699809 100644 | ||
3497 | --- a/drivers/gpu/drm/ttm/ttm_bo.c | ||
3498 | +++ b/drivers/gpu/drm/ttm/ttm_bo.c | ||
3499 | @@ -926,7 +926,8 @@ EXPORT_SYMBOL(ttm_bo_mem_put); | ||
3500 | */ | ||
3501 | static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo, | ||
3502 | struct ttm_mem_type_manager *man, | ||
3503 | - struct ttm_mem_reg *mem) | ||
3504 | + struct ttm_mem_reg *mem, | ||
3505 | + bool no_wait_gpu) | ||
3506 | { | ||
3507 | struct dma_fence *fence; | ||
3508 | int ret; | ||
3509 | @@ -935,19 +936,22 @@ static int ttm_bo_add_move_fence(struct ttm_buffer_object *bo, | ||
3510 | fence = dma_fence_get(man->move); | ||
3511 | spin_unlock(&man->move_lock); | ||
3512 | |||
3513 | - if (fence) { | ||
3514 | - dma_resv_add_shared_fence(bo->base.resv, fence); | ||
3515 | + if (!fence) | ||
3516 | + return 0; | ||
3517 | |||
3518 | - ret = dma_resv_reserve_shared(bo->base.resv, 1); | ||
3519 | - if (unlikely(ret)) { | ||
3520 | - dma_fence_put(fence); | ||
3521 | - return ret; | ||
3522 | - } | ||
3523 | + if (no_wait_gpu) | ||
3524 | + return -EBUSY; | ||
3525 | + | ||
3526 | + dma_resv_add_shared_fence(bo->base.resv, fence); | ||
3527 | |||
3528 | - dma_fence_put(bo->moving); | ||
3529 | - bo->moving = fence; | ||
3530 | + ret = dma_resv_reserve_shared(bo->base.resv, 1); | ||
3531 | + if (unlikely(ret)) { | ||
3532 | + dma_fence_put(fence); | ||
3533 | + return ret; | ||
3534 | } | ||
3535 | |||
3536 | + dma_fence_put(bo->moving); | ||
3537 | + bo->moving = fence; | ||
3538 | return 0; | ||
3539 | } | ||
3540 | |||
3541 | @@ -978,7 +982,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo, | ||
3542 | return ret; | ||
3543 | } while (1); | ||
3544 | |||
3545 | - return ttm_bo_add_move_fence(bo, man, mem); | ||
3546 | + return ttm_bo_add_move_fence(bo, man, mem, ctx->no_wait_gpu); | ||
3547 | } | ||
3548 | |||
3549 | static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man, | ||
3550 | @@ -1120,14 +1124,18 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo, | ||
3551 | if (unlikely(ret)) | ||
3552 | goto error; | ||
3553 | |||
3554 | - if (mem->mm_node) { | ||
3555 | - ret = ttm_bo_add_move_fence(bo, man, mem); | ||
3556 | - if (unlikely(ret)) { | ||
3557 | - (*man->func->put_node)(man, mem); | ||
3558 | - goto error; | ||
3559 | - } | ||
3560 | - return 0; | ||
3561 | + if (!mem->mm_node) | ||
3562 | + continue; | ||
3563 | + | ||
3564 | + ret = ttm_bo_add_move_fence(bo, man, mem, ctx->no_wait_gpu); | ||
3565 | + if (unlikely(ret)) { | ||
3566 | + (*man->func->put_node)(man, mem); | ||
3567 | + if (ret == -EBUSY) | ||
3568 | + continue; | ||
3569 | + | ||
3570 | + goto error; | ||
3571 | } | ||
3572 | + return 0; | ||
3573 | } | ||
3574 | |||
3575 | for (i = 0; i < placement->num_busy_placement; ++i) { | ||
3576 | diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c | ||
3577 | index ee7d4e7b0ee3..0853b980bcb3 100644 | ||
3578 | --- a/drivers/gpu/drm/vc4/vc4_hdmi.c | ||
3579 | +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c | ||
3580 | @@ -1285,6 +1285,9 @@ static const struct cec_adap_ops vc4_hdmi_cec_adap_ops = { | ||
3581 | |||
3582 | static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) | ||
3583 | { | ||
3584 | +#ifdef CONFIG_DRM_VC4_HDMI_CEC | ||
3585 | + struct cec_connector_info conn_info; | ||
3586 | +#endif | ||
3587 | struct platform_device *pdev = to_platform_device(dev); | ||
3588 | struct drm_device *drm = dev_get_drvdata(master); | ||
3589 | struct vc4_dev *vc4 = drm->dev_private; | ||
3590 | @@ -1403,13 +1406,15 @@ static int vc4_hdmi_bind(struct device *dev, struct device *master, void *data) | ||
3591 | #ifdef CONFIG_DRM_VC4_HDMI_CEC | ||
3592 | hdmi->cec_adap = cec_allocate_adapter(&vc4_hdmi_cec_adap_ops, | ||
3593 | vc4, "vc4", | ||
3594 | - CEC_CAP_TRANSMIT | | ||
3595 | - CEC_CAP_LOG_ADDRS | | ||
3596 | - CEC_CAP_PASSTHROUGH | | ||
3597 | - CEC_CAP_RC, 1); | ||
3598 | + CEC_CAP_DEFAULTS | | ||
3599 | + CEC_CAP_CONNECTOR_INFO, 1); | ||
3600 | ret = PTR_ERR_OR_ZERO(hdmi->cec_adap); | ||
3601 | if (ret < 0) | ||
3602 | goto err_destroy_conn; | ||
3603 | + | ||
3604 | + cec_fill_conn_info_from_drm(&conn_info, hdmi->connector); | ||
3605 | + cec_s_conn_info(hdmi->cec_adap, &conn_info); | ||
3606 | + | ||
3607 | HDMI_WRITE(VC4_HDMI_CPU_MASK_SET, 0xffffffff); | ||
3608 | value = HDMI_READ(VC4_HDMI_CEC_CNTRL_1); | ||
3609 | value &= ~VC4_HDMI_CEC_DIV_CLK_CNT_MASK; | ||
3610 | diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c | ||
3611 | index 0a88ef11b9d3..a662394f6892 100644 | ||
3612 | --- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c | ||
3613 | +++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c | ||
3614 | @@ -463,25 +463,29 @@ out: | ||
3615 | } | ||
3616 | |||
3617 | static int virtio_gpu_wait_ioctl(struct drm_device *dev, void *data, | ||
3618 | - struct drm_file *file) | ||
3619 | + struct drm_file *file) | ||
3620 | { | ||
3621 | struct drm_virtgpu_3d_wait *args = data; | ||
3622 | - struct drm_gem_object *gobj = NULL; | ||
3623 | - struct virtio_gpu_object *qobj = NULL; | ||
3624 | + struct drm_gem_object *obj; | ||
3625 | + long timeout = 15 * HZ; | ||
3626 | int ret; | ||
3627 | - bool nowait = false; | ||
3628 | |||
3629 | - gobj = drm_gem_object_lookup(file, args->handle); | ||
3630 | - if (gobj == NULL) | ||
3631 | + obj = drm_gem_object_lookup(file, args->handle); | ||
3632 | + if (obj == NULL) | ||
3633 | return -ENOENT; | ||
3634 | |||
3635 | - qobj = gem_to_virtio_gpu_obj(gobj); | ||
3636 | - | ||
3637 | - if (args->flags & VIRTGPU_WAIT_NOWAIT) | ||
3638 | - nowait = true; | ||
3639 | - ret = virtio_gpu_object_wait(qobj, nowait); | ||
3640 | + if (args->flags & VIRTGPU_WAIT_NOWAIT) { | ||
3641 | + ret = dma_resv_test_signaled_rcu(obj->resv, true); | ||
3642 | + } else { | ||
3643 | + ret = dma_resv_wait_timeout_rcu(obj->resv, true, true, | ||
3644 | + timeout); | ||
3645 | + } | ||
3646 | + if (ret == 0) | ||
3647 | + ret = -EBUSY; | ||
3648 | + else if (ret > 0) | ||
3649 | + ret = 0; | ||
3650 | |||
3651 | - drm_gem_object_put_unlocked(gobj); | ||
3652 | + drm_gem_object_put_unlocked(obj); | ||
3653 | return ret; | ||
3654 | } | ||
3655 | |||
3656 | diff --git a/drivers/gpu/host1x/job.c b/drivers/gpu/host1x/job.c | ||
3657 | index eaa5c3352c13..22559670faee 100644 | ||
3658 | --- a/drivers/gpu/host1x/job.c | ||
3659 | +++ b/drivers/gpu/host1x/job.c | ||
3660 | @@ -436,7 +436,8 @@ out: | ||
3661 | return err; | ||
3662 | } | ||
3663 | |||
3664 | -static inline int copy_gathers(struct host1x_job *job, struct device *dev) | ||
3665 | +static inline int copy_gathers(struct device *host, struct host1x_job *job, | ||
3666 | + struct device *dev) | ||
3667 | { | ||
3668 | struct host1x_firewall fw; | ||
3669 | size_t size = 0; | ||
3670 | @@ -459,12 +460,12 @@ static inline int copy_gathers(struct host1x_job *job, struct device *dev) | ||
3671 | * Try a non-blocking allocation from a higher priority pools first, | ||
3672 | * as awaiting for the allocation here is a major performance hit. | ||
3673 | */ | ||
3674 | - job->gather_copy_mapped = dma_alloc_wc(dev, size, &job->gather_copy, | ||
3675 | + job->gather_copy_mapped = dma_alloc_wc(host, size, &job->gather_copy, | ||
3676 | GFP_NOWAIT); | ||
3677 | |||
3678 | /* the higher priority allocation failed, try the generic-blocking */ | ||
3679 | if (!job->gather_copy_mapped) | ||
3680 | - job->gather_copy_mapped = dma_alloc_wc(dev, size, | ||
3681 | + job->gather_copy_mapped = dma_alloc_wc(host, size, | ||
3682 | &job->gather_copy, | ||
3683 | GFP_KERNEL); | ||
3684 | if (!job->gather_copy_mapped) | ||
3685 | @@ -512,7 +513,7 @@ int host1x_job_pin(struct host1x_job *job, struct device *dev) | ||
3686 | goto out; | ||
3687 | |||
3688 | if (IS_ENABLED(CONFIG_TEGRA_HOST1X_FIREWALL)) { | ||
3689 | - err = copy_gathers(job, dev); | ||
3690 | + err = copy_gathers(host->dev, job, dev); | ||
3691 | if (err) | ||
3692 | goto out; | ||
3693 | } | ||
3694 | @@ -573,7 +574,7 @@ void host1x_job_unpin(struct host1x_job *job) | ||
3695 | job->num_unpins = 0; | ||
3696 | |||
3697 | if (job->gather_copy_size) | ||
3698 | - dma_free_wc(job->channel->dev, job->gather_copy_size, | ||
3699 | + dma_free_wc(host->dev, job->gather_copy_size, | ||
3700 | job->gather_copy_mapped, job->gather_copy); | ||
3701 | } | ||
3702 | EXPORT_SYMBOL(host1x_job_unpin); | ||
3703 | diff --git a/drivers/hwtracing/intel_th/core.c b/drivers/hwtracing/intel_th/core.c | ||
3704 | index 0dfd97bbde9e..ca232ec565e8 100644 | ||
3705 | --- a/drivers/hwtracing/intel_th/core.c | ||
3706 | +++ b/drivers/hwtracing/intel_th/core.c | ||
3707 | @@ -834,9 +834,6 @@ static irqreturn_t intel_th_irq(int irq, void *data) | ||
3708 | ret |= d->irq(th->thdev[i]); | ||
3709 | } | ||
3710 | |||
3711 | - if (ret == IRQ_NONE) | ||
3712 | - pr_warn_ratelimited("nobody cared for irq\n"); | ||
3713 | - | ||
3714 | return ret; | ||
3715 | } | ||
3716 | |||
3717 | @@ -887,6 +884,7 @@ intel_th_alloc(struct device *dev, struct intel_th_drvdata *drvdata, | ||
3718 | |||
3719 | if (th->irq == -1) | ||
3720 | th->irq = devres[r].start; | ||
3721 | + th->num_irqs++; | ||
3722 | break; | ||
3723 | default: | ||
3724 | dev_warn(dev, "Unknown resource type %lx\n", | ||
3725 | @@ -940,6 +938,9 @@ void intel_th_free(struct intel_th *th) | ||
3726 | |||
3727 | th->num_thdevs = 0; | ||
3728 | |||
3729 | + for (i = 0; i < th->num_irqs; i++) | ||
3730 | + devm_free_irq(th->dev, th->irq + i, th); | ||
3731 | + | ||
3732 | pm_runtime_get_sync(th->dev); | ||
3733 | pm_runtime_forbid(th->dev); | ||
3734 | |||
3735 | diff --git a/drivers/hwtracing/intel_th/intel_th.h b/drivers/hwtracing/intel_th/intel_th.h | ||
3736 | index 0df480072b6c..6f4f5486fe6d 100644 | ||
3737 | --- a/drivers/hwtracing/intel_th/intel_th.h | ||
3738 | +++ b/drivers/hwtracing/intel_th/intel_th.h | ||
3739 | @@ -261,6 +261,7 @@ enum th_mmio_idx { | ||
3740 | * @num_thdevs: number of devices in the @thdev array | ||
3741 | * @num_resources: number of resources in the @resource array | ||
3742 | * @irq: irq number | ||
3743 | + * @num_irqs: number of IRQs is use | ||
3744 | * @id: this Intel TH controller's device ID in the system | ||
3745 | * @major: device node major for output devices | ||
3746 | */ | ||
3747 | @@ -277,6 +278,7 @@ struct intel_th { | ||
3748 | unsigned int num_thdevs; | ||
3749 | unsigned int num_resources; | ||
3750 | int irq; | ||
3751 | + int num_irqs; | ||
3752 | |||
3753 | int id; | ||
3754 | int major; | ||
3755 | diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c | ||
3756 | index 6d240dfae9d9..8e48c7458aa3 100644 | ||
3757 | --- a/drivers/hwtracing/intel_th/msu.c | ||
3758 | +++ b/drivers/hwtracing/intel_th/msu.c | ||
3759 | @@ -1676,10 +1676,13 @@ static int intel_th_msc_init(struct msc *msc) | ||
3760 | return 0; | ||
3761 | } | ||
3762 | |||
3763 | -static void msc_win_switch(struct msc *msc) | ||
3764 | +static int msc_win_switch(struct msc *msc) | ||
3765 | { | ||
3766 | struct msc_window *first; | ||
3767 | |||
3768 | + if (list_empty(&msc->win_list)) | ||
3769 | + return -EINVAL; | ||
3770 | + | ||
3771 | first = list_first_entry(&msc->win_list, struct msc_window, entry); | ||
3772 | |||
3773 | if (msc_is_last_win(msc->cur_win)) | ||
3774 | @@ -1691,6 +1694,8 @@ static void msc_win_switch(struct msc *msc) | ||
3775 | msc->base_addr = msc_win_base_dma(msc->cur_win); | ||
3776 | |||
3777 | intel_th_trace_switch(msc->thdev); | ||
3778 | + | ||
3779 | + return 0; | ||
3780 | } | ||
3781 | |||
3782 | /** | ||
3783 | @@ -2025,16 +2030,15 @@ win_switch_store(struct device *dev, struct device_attribute *attr, | ||
3784 | if (val != 1) | ||
3785 | return -EINVAL; | ||
3786 | |||
3787 | + ret = -EINVAL; | ||
3788 | mutex_lock(&msc->buf_mutex); | ||
3789 | /* | ||
3790 | * Window switch can only happen in the "multi" mode. | ||
3791 | * If a external buffer is engaged, they have the full | ||
3792 | * control over window switching. | ||
3793 | */ | ||
3794 | - if (msc->mode != MSC_MODE_MULTI || msc->mbuf) | ||
3795 | - ret = -ENOTSUPP; | ||
3796 | - else | ||
3797 | - msc_win_switch(msc); | ||
3798 | + if (msc->mode == MSC_MODE_MULTI && !msc->mbuf) | ||
3799 | + ret = msc_win_switch(msc); | ||
3800 | mutex_unlock(&msc->buf_mutex); | ||
3801 | |||
3802 | return ret ? ret : size; | ||
3803 | diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c | ||
3804 | index ebf3e30e989a..e9d90b53bbc4 100644 | ||
3805 | --- a/drivers/hwtracing/intel_th/pci.c | ||
3806 | +++ b/drivers/hwtracing/intel_th/pci.c | ||
3807 | @@ -204,6 +204,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { | ||
3808 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), | ||
3809 | .driver_data = (kernel_ulong_t)&intel_th_2x, | ||
3810 | }, | ||
3811 | + { | ||
3812 | + /* Comet Lake PCH-V */ | ||
3813 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6), | ||
3814 | + .driver_data = (kernel_ulong_t)&intel_th_2x, | ||
3815 | + }, | ||
3816 | { | ||
3817 | /* Ice Lake NNPI */ | ||
3818 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), | ||
3819 | @@ -229,6 +234,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { | ||
3820 | PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), | ||
3821 | .driver_data = (kernel_ulong_t)&intel_th_2x, | ||
3822 | }, | ||
3823 | + { | ||
3824 | + /* Elkhart Lake */ | ||
3825 | + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26), | ||
3826 | + .driver_data = (kernel_ulong_t)&intel_th_2x, | ||
3827 | + }, | ||
3828 | { 0 }, | ||
3829 | }; | ||
3830 | |||
3831 | diff --git a/drivers/iio/adc/dln2-adc.c b/drivers/iio/adc/dln2-adc.c | ||
3832 | index 5fa78c273a25..65c7c9329b1c 100644 | ||
3833 | --- a/drivers/iio/adc/dln2-adc.c | ||
3834 | +++ b/drivers/iio/adc/dln2-adc.c | ||
3835 | @@ -524,6 +524,10 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev) | ||
3836 | u16 conflict; | ||
3837 | unsigned int trigger_chan; | ||
3838 | |||
3839 | + ret = iio_triggered_buffer_postenable(indio_dev); | ||
3840 | + if (ret) | ||
3841 | + return ret; | ||
3842 | + | ||
3843 | mutex_lock(&dln2->mutex); | ||
3844 | |||
3845 | /* Enable ADC */ | ||
3846 | @@ -537,6 +541,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev) | ||
3847 | (int)conflict); | ||
3848 | ret = -EBUSY; | ||
3849 | } | ||
3850 | + iio_triggered_buffer_predisable(indio_dev); | ||
3851 | return ret; | ||
3852 | } | ||
3853 | |||
3854 | @@ -550,6 +555,7 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev) | ||
3855 | mutex_unlock(&dln2->mutex); | ||
3856 | if (ret < 0) { | ||
3857 | dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__); | ||
3858 | + iio_triggered_buffer_predisable(indio_dev); | ||
3859 | return ret; | ||
3860 | } | ||
3861 | } else { | ||
3862 | @@ -557,12 +563,12 @@ static int dln2_adc_triggered_buffer_postenable(struct iio_dev *indio_dev) | ||
3863 | mutex_unlock(&dln2->mutex); | ||
3864 | } | ||
3865 | |||
3866 | - return iio_triggered_buffer_postenable(indio_dev); | ||
3867 | + return 0; | ||
3868 | } | ||
3869 | |||
3870 | static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev) | ||
3871 | { | ||
3872 | - int ret; | ||
3873 | + int ret, ret2; | ||
3874 | struct dln2_adc *dln2 = iio_priv(indio_dev); | ||
3875 | |||
3876 | mutex_lock(&dln2->mutex); | ||
3877 | @@ -577,12 +583,14 @@ static int dln2_adc_triggered_buffer_predisable(struct iio_dev *indio_dev) | ||
3878 | ret = dln2_adc_set_port_enabled(dln2, false, NULL); | ||
3879 | |||
3880 | mutex_unlock(&dln2->mutex); | ||
3881 | - if (ret < 0) { | ||
3882 | + if (ret < 0) | ||
3883 | dev_dbg(&dln2->pdev->dev, "Problem in %s\n", __func__); | ||
3884 | - return ret; | ||
3885 | - } | ||
3886 | |||
3887 | - return iio_triggered_buffer_predisable(indio_dev); | ||
3888 | + ret2 = iio_triggered_buffer_predisable(indio_dev); | ||
3889 | + if (ret == 0) | ||
3890 | + ret = ret2; | ||
3891 | + | ||
3892 | + return ret; | ||
3893 | } | ||
3894 | |||
3895 | static const struct iio_buffer_setup_ops dln2_adc_buffer_setup_ops = { | ||
3896 | diff --git a/drivers/iio/adc/max1027.c b/drivers/iio/adc/max1027.c | ||
3897 | index 214883458582..e3be8eedd773 100644 | ||
3898 | --- a/drivers/iio/adc/max1027.c | ||
3899 | +++ b/drivers/iio/adc/max1027.c | ||
3900 | @@ -458,6 +458,14 @@ static int max1027_probe(struct spi_device *spi) | ||
3901 | return ret; | ||
3902 | } | ||
3903 | |||
3904 | + /* Internal reset */ | ||
3905 | + st->reg = MAX1027_RST_REG; | ||
3906 | + ret = spi_write(st->spi, &st->reg, 1); | ||
3907 | + if (ret < 0) { | ||
3908 | + dev_err(&indio_dev->dev, "Failed to reset the ADC\n"); | ||
3909 | + return ret; | ||
3910 | + } | ||
3911 | + | ||
3912 | /* Disable averaging */ | ||
3913 | st->reg = MAX1027_AVG_REG; | ||
3914 | ret = spi_write(st->spi, &st->reg, 1); | ||
3915 | diff --git a/drivers/iio/dac/Kconfig b/drivers/iio/dac/Kconfig | ||
3916 | index cc42219a64f7..979070196da9 100644 | ||
3917 | --- a/drivers/iio/dac/Kconfig | ||
3918 | +++ b/drivers/iio/dac/Kconfig | ||
3919 | @@ -60,8 +60,8 @@ config AD5446 | ||
3920 | help | ||
3921 | Say yes here to build support for Analog Devices AD5300, AD5301, AD5310, | ||
3922 | AD5311, AD5320, AD5321, AD5444, AD5446, AD5450, AD5451, AD5452, AD5453, | ||
3923 | - AD5512A, AD5541A, AD5542A, AD5543, AD5553, AD5601, AD5602, AD5611, AD5612, | ||
3924 | - AD5620, AD5621, AD5622, AD5640, AD5641, AD5660, AD5662 DACs | ||
3925 | + AD5512A, AD5541A, AD5542A, AD5543, AD5553, AD5600, AD5601, AD5602, AD5611, | ||
3926 | + AD5612, AD5620, AD5621, AD5622, AD5640, AD5641, AD5660, AD5662 DACs | ||
3927 | as well as Texas Instruments DAC081S101, DAC101S101, DAC121S101. | ||
3928 | |||
3929 | To compile this driver as a module, choose M here: the | ||
3930 | diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c | ||
3931 | index 7df8b4cc295d..61c670f7fc5f 100644 | ||
3932 | --- a/drivers/iio/dac/ad5446.c | ||
3933 | +++ b/drivers/iio/dac/ad5446.c | ||
3934 | @@ -327,6 +327,7 @@ enum ad5446_supported_spi_device_ids { | ||
3935 | ID_AD5541A, | ||
3936 | ID_AD5512A, | ||
3937 | ID_AD5553, | ||
3938 | + ID_AD5600, | ||
3939 | ID_AD5601, | ||
3940 | ID_AD5611, | ||
3941 | ID_AD5621, | ||
3942 | @@ -381,6 +382,10 @@ static const struct ad5446_chip_info ad5446_spi_chip_info[] = { | ||
3943 | .channel = AD5446_CHANNEL(14, 16, 0), | ||
3944 | .write = ad5446_write, | ||
3945 | }, | ||
3946 | + [ID_AD5600] = { | ||
3947 | + .channel = AD5446_CHANNEL(16, 16, 0), | ||
3948 | + .write = ad5446_write, | ||
3949 | + }, | ||
3950 | [ID_AD5601] = { | ||
3951 | .channel = AD5446_CHANNEL_POWERDOWN(8, 16, 6), | ||
3952 | .write = ad5446_write, | ||
3953 | @@ -448,6 +453,7 @@ static const struct spi_device_id ad5446_spi_ids[] = { | ||
3954 | {"ad5542a", ID_AD5541A}, /* ad5541a and ad5542a are compatible */ | ||
3955 | {"ad5543", ID_AD5541A}, /* ad5541a and ad5543 are compatible */ | ||
3956 | {"ad5553", ID_AD5553}, | ||
3957 | + {"ad5600", ID_AD5600}, | ||
3958 | {"ad5601", ID_AD5601}, | ||
3959 | {"ad5611", ID_AD5611}, | ||
3960 | {"ad5621", ID_AD5621}, | ||
3961 | diff --git a/drivers/iio/light/bh1750.c b/drivers/iio/light/bh1750.c | ||
3962 | index 28347df78cff..adb5ab9e3439 100644 | ||
3963 | --- a/drivers/iio/light/bh1750.c | ||
3964 | +++ b/drivers/iio/light/bh1750.c | ||
3965 | @@ -59,9 +59,9 @@ struct bh1750_chip_info { | ||
3966 | |||
3967 | u16 int_time_low_mask; | ||
3968 | u16 int_time_high_mask; | ||
3969 | -} | ||
3970 | +}; | ||
3971 | |||
3972 | -static const bh1750_chip_info_tbl[] = { | ||
3973 | +static const struct bh1750_chip_info bh1750_chip_info_tbl[] = { | ||
3974 | [BH1710] = { 140, 1022, 300, 400, 250000000, 2, 0x001F, 0x03E0 }, | ||
3975 | [BH1721] = { 140, 1020, 300, 400, 250000000, 2, 0x0010, 0x03E0 }, | ||
3976 | [BH1750] = { 31, 254, 69, 1740, 57500000, 1, 0x001F, 0x00E0 }, | ||
3977 | diff --git a/drivers/iio/pressure/cros_ec_baro.c b/drivers/iio/pressure/cros_ec_baro.c | ||
3978 | index 2354302375de..52f53f3123b1 100644 | ||
3979 | --- a/drivers/iio/pressure/cros_ec_baro.c | ||
3980 | +++ b/drivers/iio/pressure/cros_ec_baro.c | ||
3981 | @@ -114,6 +114,7 @@ static int cros_ec_baro_write(struct iio_dev *indio_dev, | ||
3982 | static const struct iio_info cros_ec_baro_info = { | ||
3983 | .read_raw = &cros_ec_baro_read, | ||
3984 | .write_raw = &cros_ec_baro_write, | ||
3985 | + .read_avail = &cros_ec_sensors_core_read_avail, | ||
3986 | }; | ||
3987 | |||
3988 | static int cros_ec_baro_probe(struct platform_device *pdev) | ||
3989 | @@ -149,6 +150,8 @@ static int cros_ec_baro_probe(struct platform_device *pdev) | ||
3990 | BIT(IIO_CHAN_INFO_SCALE) | | ||
3991 | BIT(IIO_CHAN_INFO_SAMP_FREQ) | | ||
3992 | BIT(IIO_CHAN_INFO_FREQUENCY); | ||
3993 | + channel->info_mask_shared_by_all_available = | ||
3994 | + BIT(IIO_CHAN_INFO_SAMP_FREQ); | ||
3995 | channel->scan_type.realbits = CROS_EC_SENSOR_BITS; | ||
3996 | channel->scan_type.storagebits = CROS_EC_SENSOR_BITS; | ||
3997 | channel->scan_type.shift = 0; | ||
3998 | diff --git a/drivers/iio/temperature/max31856.c b/drivers/iio/temperature/max31856.c | ||
3999 | index f184ba5601d9..73ed550e3fc9 100644 | ||
4000 | --- a/drivers/iio/temperature/max31856.c | ||
4001 | +++ b/drivers/iio/temperature/max31856.c | ||
4002 | @@ -284,6 +284,8 @@ static int max31856_probe(struct spi_device *spi) | ||
4003 | spi_set_drvdata(spi, indio_dev); | ||
4004 | |||
4005 | indio_dev->info = &max31856_info; | ||
4006 | + indio_dev->dev.parent = &spi->dev; | ||
4007 | + indio_dev->dev.of_node = spi->dev.of_node; | ||
4008 | indio_dev->name = id->name; | ||
4009 | indio_dev->modes = INDIO_DIRECT_MODE; | ||
4010 | indio_dev->channels = max31856_channels; | ||
4011 | diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c | ||
4012 | index 50a92442c4f7..2b5bd7206fc6 100644 | ||
4013 | --- a/drivers/infiniband/core/device.c | ||
4014 | +++ b/drivers/infiniband/core/device.c | ||
4015 | @@ -1199,9 +1199,21 @@ static void setup_dma_device(struct ib_device *device) | ||
4016 | WARN_ON_ONCE(!parent); | ||
4017 | device->dma_device = parent; | ||
4018 | } | ||
4019 | - /* Setup default max segment size for all IB devices */ | ||
4020 | - dma_set_max_seg_size(device->dma_device, SZ_2G); | ||
4021 | |||
4022 | + if (!device->dev.dma_parms) { | ||
4023 | + if (parent) { | ||
4024 | + /* | ||
4025 | + * The caller did not provide DMA parameters, so | ||
4026 | + * 'parent' probably represents a PCI device. The PCI | ||
4027 | + * core sets the maximum segment size to 64 | ||
4028 | + * KB. Increase this parameter to 2 GB. | ||
4029 | + */ | ||
4030 | + device->dev.dma_parms = parent->dma_parms; | ||
4031 | + dma_set_max_seg_size(device->dma_device, SZ_2G); | ||
4032 | + } else { | ||
4033 | + WARN_ON_ONCE(true); | ||
4034 | + } | ||
4035 | + } | ||
4036 | } | ||
4037 | |||
4038 | /* | ||
4039 | @@ -2397,8 +2409,12 @@ int ib_modify_port(struct ib_device *device, | ||
4040 | rc = device->ops.modify_port(device, port_num, | ||
4041 | port_modify_mask, | ||
4042 | port_modify); | ||
4043 | + else if (rdma_protocol_roce(device, port_num) && | ||
4044 | + ((port_modify->set_port_cap_mask & ~IB_PORT_CM_SUP) == 0 || | ||
4045 | + (port_modify->clr_port_cap_mask & ~IB_PORT_CM_SUP) == 0)) | ||
4046 | + rc = 0; | ||
4047 | else | ||
4048 | - rc = rdma_protocol_roce(device, port_num) ? 0 : -ENOSYS; | ||
4049 | + rc = -EOPNOTSUPP; | ||
4050 | return rc; | ||
4051 | } | ||
4052 | EXPORT_SYMBOL(ib_modify_port); | ||
4053 | diff --git a/drivers/infiniband/hw/bnxt_re/main.c b/drivers/infiniband/hw/bnxt_re/main.c | ||
4054 | index 30a54f8aa42c..27e2df44d043 100644 | ||
4055 | --- a/drivers/infiniband/hw/bnxt_re/main.c | ||
4056 | +++ b/drivers/infiniband/hw/bnxt_re/main.c | ||
4057 | @@ -477,6 +477,7 @@ static int bnxt_re_net_stats_ctx_alloc(struct bnxt_re_dev *rdev, | ||
4058 | bnxt_re_init_hwrm_hdr(rdev, (void *)&req, HWRM_STAT_CTX_ALLOC, -1, -1); | ||
4059 | req.update_period_ms = cpu_to_le32(1000); | ||
4060 | req.stats_dma_addr = cpu_to_le64(dma_map); | ||
4061 | + req.stats_dma_length = cpu_to_le16(sizeof(struct ctx_hw_stats_ext)); | ||
4062 | req.stat_ctx_flags = STAT_CTX_ALLOC_REQ_STAT_CTX_FLAGS_ROCE; | ||
4063 | bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp, | ||
4064 | sizeof(resp), DFLT_HWRM_CMD_TIMEOUT); | ||
4065 | @@ -1270,10 +1271,10 @@ static void bnxt_re_query_hwrm_intf_version(struct bnxt_re_dev *rdev) | ||
4066 | return; | ||
4067 | } | ||
4068 | rdev->qplib_ctx.hwrm_intf_ver = | ||
4069 | - (u64)resp.hwrm_intf_major << 48 | | ||
4070 | - (u64)resp.hwrm_intf_minor << 32 | | ||
4071 | - (u64)resp.hwrm_intf_build << 16 | | ||
4072 | - resp.hwrm_intf_patch; | ||
4073 | + (u64)le16_to_cpu(resp.hwrm_intf_major) << 48 | | ||
4074 | + (u64)le16_to_cpu(resp.hwrm_intf_minor) << 32 | | ||
4075 | + (u64)le16_to_cpu(resp.hwrm_intf_build) << 16 | | ||
4076 | + le16_to_cpu(resp.hwrm_intf_patch); | ||
4077 | } | ||
4078 | |||
4079 | static void bnxt_re_ib_unreg(struct bnxt_re_dev *rdev) | ||
4080 | diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h | ||
4081 | index fbda11a7ab1a..aaa76d792185 100644 | ||
4082 | --- a/drivers/infiniband/hw/bnxt_re/qplib_res.h | ||
4083 | +++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h | ||
4084 | @@ -186,7 +186,9 @@ struct bnxt_qplib_chip_ctx { | ||
4085 | u8 chip_metal; | ||
4086 | }; | ||
4087 | |||
4088 | -#define CHIP_NUM_57500 0x1750 | ||
4089 | +#define CHIP_NUM_57508 0x1750 | ||
4090 | +#define CHIP_NUM_57504 0x1751 | ||
4091 | +#define CHIP_NUM_57502 0x1752 | ||
4092 | |||
4093 | struct bnxt_qplib_res { | ||
4094 | struct pci_dev *pdev; | ||
4095 | @@ -203,7 +205,9 @@ struct bnxt_qplib_res { | ||
4096 | |||
4097 | static inline bool bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx *cctx) | ||
4098 | { | ||
4099 | - return (cctx->chip_num == CHIP_NUM_57500); | ||
4100 | + return (cctx->chip_num == CHIP_NUM_57508 || | ||
4101 | + cctx->chip_num == CHIP_NUM_57504 || | ||
4102 | + cctx->chip_num == CHIP_NUM_57502); | ||
4103 | } | ||
4104 | |||
4105 | static inline u8 bnxt_qplib_get_hwq_type(struct bnxt_qplib_res *res) | ||
4106 | diff --git a/drivers/infiniband/hw/efa/efa_com.c b/drivers/infiniband/hw/efa/efa_com.c | ||
4107 | index 3c412bc5b94f..0778f4f7dccd 100644 | ||
4108 | --- a/drivers/infiniband/hw/efa/efa_com.c | ||
4109 | +++ b/drivers/infiniband/hw/efa/efa_com.c | ||
4110 | @@ -317,6 +317,7 @@ static struct efa_comp_ctx *__efa_com_submit_admin_cmd(struct efa_com_admin_queu | ||
4111 | struct efa_admin_acq_entry *comp, | ||
4112 | size_t comp_size_in_bytes) | ||
4113 | { | ||
4114 | + struct efa_admin_aq_entry *aqe; | ||
4115 | struct efa_comp_ctx *comp_ctx; | ||
4116 | u16 queue_size_mask; | ||
4117 | u16 cmd_id; | ||
4118 | @@ -350,7 +351,9 @@ static struct efa_comp_ctx *__efa_com_submit_admin_cmd(struct efa_com_admin_queu | ||
4119 | |||
4120 | reinit_completion(&comp_ctx->wait_event); | ||
4121 | |||
4122 | - memcpy(&aq->sq.entries[pi], cmd, cmd_size_in_bytes); | ||
4123 | + aqe = &aq->sq.entries[pi]; | ||
4124 | + memset(aqe, 0, sizeof(*aqe)); | ||
4125 | + memcpy(aqe, cmd, cmd_size_in_bytes); | ||
4126 | |||
4127 | aq->sq.pc++; | ||
4128 | atomic64_inc(&aq->stats.submitted_cmd); | ||
4129 | diff --git a/drivers/infiniband/hw/hns/hns_roce_restrack.c b/drivers/infiniband/hw/hns/hns_roce_restrack.c | ||
4130 | index 0a31d0a3d657..06871731ac43 100644 | ||
4131 | --- a/drivers/infiniband/hw/hns/hns_roce_restrack.c | ||
4132 | +++ b/drivers/infiniband/hw/hns/hns_roce_restrack.c | ||
4133 | @@ -98,11 +98,15 @@ static int hns_roce_fill_res_cq_entry(struct sk_buff *msg, | ||
4134 | goto err; | ||
4135 | |||
4136 | table_attr = nla_nest_start(msg, RDMA_NLDEV_ATTR_DRIVER); | ||
4137 | - if (!table_attr) | ||
4138 | + if (!table_attr) { | ||
4139 | + ret = -EMSGSIZE; | ||
4140 | goto err; | ||
4141 | + } | ||
4142 | |||
4143 | - if (hns_roce_fill_cq(msg, context)) | ||
4144 | + if (hns_roce_fill_cq(msg, context)) { | ||
4145 | + ret = -EMSGSIZE; | ||
4146 | goto err_cancel_table; | ||
4147 | + } | ||
4148 | |||
4149 | nla_nest_end(msg, table_attr); | ||
4150 | kfree(context); | ||
4151 | @@ -113,7 +117,7 @@ err_cancel_table: | ||
4152 | nla_nest_cancel(msg, table_attr); | ||
4153 | err: | ||
4154 | kfree(context); | ||
4155 | - return -EMSGSIZE; | ||
4156 | + return ret; | ||
4157 | } | ||
4158 | |||
4159 | int hns_roce_fill_res_entry(struct sk_buff *msg, | ||
4160 | diff --git a/drivers/infiniband/hw/hns/hns_roce_srq.c b/drivers/infiniband/hw/hns/hns_roce_srq.c | ||
4161 | index 43ea2c13b212..108667ae6b14 100644 | ||
4162 | --- a/drivers/infiniband/hw/hns/hns_roce_srq.c | ||
4163 | +++ b/drivers/infiniband/hw/hns/hns_roce_srq.c | ||
4164 | @@ -180,8 +180,7 @@ static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata, | ||
4165 | { | ||
4166 | struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device); | ||
4167 | struct hns_roce_ib_create_srq ucmd; | ||
4168 | - u32 page_shift; | ||
4169 | - u32 npages; | ||
4170 | + struct hns_roce_buf *buf; | ||
4171 | int ret; | ||
4172 | |||
4173 | if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) | ||
4174 | @@ -191,11 +190,13 @@ static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata, | ||
4175 | if (IS_ERR(srq->umem)) | ||
4176 | return PTR_ERR(srq->umem); | ||
4177 | |||
4178 | - npages = (ib_umem_page_count(srq->umem) + | ||
4179 | - (1 << hr_dev->caps.srqwqe_buf_pg_sz) - 1) / | ||
4180 | - (1 << hr_dev->caps.srqwqe_buf_pg_sz); | ||
4181 | - page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; | ||
4182 | - ret = hns_roce_mtt_init(hr_dev, npages, page_shift, &srq->mtt); | ||
4183 | + buf = &srq->buf; | ||
4184 | + buf->npages = (ib_umem_page_count(srq->umem) + | ||
4185 | + (1 << hr_dev->caps.srqwqe_buf_pg_sz) - 1) / | ||
4186 | + (1 << hr_dev->caps.srqwqe_buf_pg_sz); | ||
4187 | + buf->page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; | ||
4188 | + ret = hns_roce_mtt_init(hr_dev, buf->npages, buf->page_shift, | ||
4189 | + &srq->mtt); | ||
4190 | if (ret) | ||
4191 | goto err_user_buf; | ||
4192 | |||
4193 | @@ -212,9 +213,12 @@ static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata, | ||
4194 | goto err_user_srq_mtt; | ||
4195 | } | ||
4196 | |||
4197 | - ret = hns_roce_mtt_init(hr_dev, ib_umem_page_count(srq->idx_que.umem), | ||
4198 | - PAGE_SHIFT, &srq->idx_que.mtt); | ||
4199 | - | ||
4200 | + buf = &srq->idx_que.idx_buf; | ||
4201 | + buf->npages = DIV_ROUND_UP(ib_umem_page_count(srq->idx_que.umem), | ||
4202 | + 1 << hr_dev->caps.idx_buf_pg_sz); | ||
4203 | + buf->page_shift = PAGE_SHIFT + hr_dev->caps.idx_buf_pg_sz; | ||
4204 | + ret = hns_roce_mtt_init(hr_dev, buf->npages, buf->page_shift, | ||
4205 | + &srq->idx_que.mtt); | ||
4206 | if (ret) { | ||
4207 | dev_err(hr_dev->dev, "hns_roce_mtt_init error for idx que\n"); | ||
4208 | goto err_user_idx_mtt; | ||
4209 | diff --git a/drivers/infiniband/hw/qedr/main.c b/drivers/infiniband/hw/qedr/main.c | ||
4210 | index dc71b6e16a07..b462eaca1ee3 100644 | ||
4211 | --- a/drivers/infiniband/hw/qedr/main.c | ||
4212 | +++ b/drivers/infiniband/hw/qedr/main.c | ||
4213 | @@ -357,6 +357,7 @@ static int qedr_alloc_resources(struct qedr_dev *dev) | ||
4214 | return -ENOMEM; | ||
4215 | |||
4216 | spin_lock_init(&dev->sgid_lock); | ||
4217 | + xa_init_flags(&dev->srqs, XA_FLAGS_LOCK_IRQ); | ||
4218 | |||
4219 | if (IS_IWARP(dev)) { | ||
4220 | xa_init_flags(&dev->qps, XA_FLAGS_LOCK_IRQ); | ||
4221 | diff --git a/drivers/infiniband/hw/qedr/verbs.c b/drivers/infiniband/hw/qedr/verbs.c | ||
4222 | index 6f3ce86019b7..a7ccca3c4f89 100644 | ||
4223 | --- a/drivers/infiniband/hw/qedr/verbs.c | ||
4224 | +++ b/drivers/infiniband/hw/qedr/verbs.c | ||
4225 | @@ -1577,6 +1577,14 @@ static void qedr_cleanup_user(struct qedr_dev *dev, struct qedr_qp *qp) | ||
4226 | |||
4227 | ib_umem_release(qp->urq.umem); | ||
4228 | qp->urq.umem = NULL; | ||
4229 | + | ||
4230 | + if (rdma_protocol_roce(&dev->ibdev, 1)) { | ||
4231 | + qedr_free_pbl(dev, &qp->usq.pbl_info, qp->usq.pbl_tbl); | ||
4232 | + qedr_free_pbl(dev, &qp->urq.pbl_info, qp->urq.pbl_tbl); | ||
4233 | + } else { | ||
4234 | + kfree(qp->usq.pbl_tbl); | ||
4235 | + kfree(qp->urq.pbl_tbl); | ||
4236 | + } | ||
4237 | } | ||
4238 | |||
4239 | static int qedr_create_user_qp(struct qedr_dev *dev, | ||
4240 | @@ -2673,8 +2681,8 @@ int qedr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata) | ||
4241 | |||
4242 | dev->ops->rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid); | ||
4243 | |||
4244 | - if ((mr->type != QEDR_MR_DMA) && (mr->type != QEDR_MR_FRMR)) | ||
4245 | - qedr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table); | ||
4246 | + if (mr->type != QEDR_MR_DMA) | ||
4247 | + free_mr_info(dev, &mr->info); | ||
4248 | |||
4249 | /* it could be user registered memory. */ | ||
4250 | ib_umem_release(mr->umem); | ||
4251 | diff --git a/drivers/infiniband/sw/siw/siw_main.c b/drivers/infiniband/sw/siw/siw_main.c | ||
4252 | index 05a92f997f60..fb01407a310f 100644 | ||
4253 | --- a/drivers/infiniband/sw/siw/siw_main.c | ||
4254 | +++ b/drivers/infiniband/sw/siw/siw_main.c | ||
4255 | @@ -248,24 +248,6 @@ static struct ib_qp *siw_get_base_qp(struct ib_device *base_dev, int id) | ||
4256 | return NULL; | ||
4257 | } | ||
4258 | |||
4259 | -static void siw_verbs_sq_flush(struct ib_qp *base_qp) | ||
4260 | -{ | ||
4261 | - struct siw_qp *qp = to_siw_qp(base_qp); | ||
4262 | - | ||
4263 | - down_write(&qp->state_lock); | ||
4264 | - siw_sq_flush(qp); | ||
4265 | - up_write(&qp->state_lock); | ||
4266 | -} | ||
4267 | - | ||
4268 | -static void siw_verbs_rq_flush(struct ib_qp *base_qp) | ||
4269 | -{ | ||
4270 | - struct siw_qp *qp = to_siw_qp(base_qp); | ||
4271 | - | ||
4272 | - down_write(&qp->state_lock); | ||
4273 | - siw_rq_flush(qp); | ||
4274 | - up_write(&qp->state_lock); | ||
4275 | -} | ||
4276 | - | ||
4277 | static const struct ib_device_ops siw_device_ops = { | ||
4278 | .owner = THIS_MODULE, | ||
4279 | .uverbs_abi_ver = SIW_ABI_VERSION, | ||
4280 | @@ -284,8 +266,6 @@ static const struct ib_device_ops siw_device_ops = { | ||
4281 | .destroy_cq = siw_destroy_cq, | ||
4282 | .destroy_qp = siw_destroy_qp, | ||
4283 | .destroy_srq = siw_destroy_srq, | ||
4284 | - .drain_rq = siw_verbs_rq_flush, | ||
4285 | - .drain_sq = siw_verbs_sq_flush, | ||
4286 | .get_dma_mr = siw_get_dma_mr, | ||
4287 | .get_port_immutable = siw_get_port_immutable, | ||
4288 | .iw_accept = siw_accept, | ||
4289 | diff --git a/drivers/infiniband/sw/siw/siw_verbs.c b/drivers/infiniband/sw/siw/siw_verbs.c | ||
4290 | index b18a677832e1..1b1a40db529c 100644 | ||
4291 | --- a/drivers/infiniband/sw/siw/siw_verbs.c | ||
4292 | +++ b/drivers/infiniband/sw/siw/siw_verbs.c | ||
4293 | @@ -685,6 +685,47 @@ static int siw_copy_inline_sgl(const struct ib_send_wr *core_wr, | ||
4294 | return bytes; | ||
4295 | } | ||
4296 | |||
4297 | +/* Complete SQ WR's without processing */ | ||
4298 | +static int siw_sq_flush_wr(struct siw_qp *qp, const struct ib_send_wr *wr, | ||
4299 | + const struct ib_send_wr **bad_wr) | ||
4300 | +{ | ||
4301 | + struct siw_sqe sqe = {}; | ||
4302 | + int rv = 0; | ||
4303 | + | ||
4304 | + while (wr) { | ||
4305 | + sqe.id = wr->wr_id; | ||
4306 | + sqe.opcode = wr->opcode; | ||
4307 | + rv = siw_sqe_complete(qp, &sqe, 0, SIW_WC_WR_FLUSH_ERR); | ||
4308 | + if (rv) { | ||
4309 | + if (bad_wr) | ||
4310 | + *bad_wr = wr; | ||
4311 | + break; | ||
4312 | + } | ||
4313 | + wr = wr->next; | ||
4314 | + } | ||
4315 | + return rv; | ||
4316 | +} | ||
4317 | + | ||
4318 | +/* Complete RQ WR's without processing */ | ||
4319 | +static int siw_rq_flush_wr(struct siw_qp *qp, const struct ib_recv_wr *wr, | ||
4320 | + const struct ib_recv_wr **bad_wr) | ||
4321 | +{ | ||
4322 | + struct siw_rqe rqe = {}; | ||
4323 | + int rv = 0; | ||
4324 | + | ||
4325 | + while (wr) { | ||
4326 | + rqe.id = wr->wr_id; | ||
4327 | + rv = siw_rqe_complete(qp, &rqe, 0, 0, SIW_WC_WR_FLUSH_ERR); | ||
4328 | + if (rv) { | ||
4329 | + if (bad_wr) | ||
4330 | + *bad_wr = wr; | ||
4331 | + break; | ||
4332 | + } | ||
4333 | + wr = wr->next; | ||
4334 | + } | ||
4335 | + return rv; | ||
4336 | +} | ||
4337 | + | ||
4338 | /* | ||
4339 | * siw_post_send() | ||
4340 | * | ||
4341 | @@ -703,26 +744,54 @@ int siw_post_send(struct ib_qp *base_qp, const struct ib_send_wr *wr, | ||
4342 | unsigned long flags; | ||
4343 | int rv = 0; | ||
4344 | |||
4345 | + if (wr && !qp->kernel_verbs) { | ||
4346 | + siw_dbg_qp(qp, "wr must be empty for user mapped sq\n"); | ||
4347 | + *bad_wr = wr; | ||
4348 | + return -EINVAL; | ||
4349 | + } | ||
4350 | + | ||
4351 | /* | ||
4352 | * Try to acquire QP state lock. Must be non-blocking | ||
4353 | * to accommodate kernel clients needs. | ||
4354 | */ | ||
4355 | if (!down_read_trylock(&qp->state_lock)) { | ||
4356 | - *bad_wr = wr; | ||
4357 | - siw_dbg_qp(qp, "QP locked, state %d\n", qp->attrs.state); | ||
4358 | - return -ENOTCONN; | ||
4359 | + if (qp->attrs.state == SIW_QP_STATE_ERROR) { | ||
4360 | + /* | ||
4361 | + * ERROR state is final, so we can be sure | ||
4362 | + * this state will not change as long as the QP | ||
4363 | + * exists. | ||
4364 | + * | ||
4365 | + * This handles an ib_drain_sq() call with | ||
4366 | + * a concurrent request to set the QP state | ||
4367 | + * to ERROR. | ||
4368 | + */ | ||
4369 | + rv = siw_sq_flush_wr(qp, wr, bad_wr); | ||
4370 | + } else { | ||
4371 | + siw_dbg_qp(qp, "QP locked, state %d\n", | ||
4372 | + qp->attrs.state); | ||
4373 | + *bad_wr = wr; | ||
4374 | + rv = -ENOTCONN; | ||
4375 | + } | ||
4376 | + return rv; | ||
4377 | } | ||
4378 | if (unlikely(qp->attrs.state != SIW_QP_STATE_RTS)) { | ||
4379 | + if (qp->attrs.state == SIW_QP_STATE_ERROR) { | ||
4380 | + /* | ||
4381 | + * Immediately flush this WR to CQ, if QP | ||
4382 | + * is in ERROR state. SQ is guaranteed to | ||
4383 | + * be empty, so WR complets in-order. | ||
4384 | + * | ||
4385 | + * Typically triggered by ib_drain_sq(). | ||
4386 | + */ | ||
4387 | + rv = siw_sq_flush_wr(qp, wr, bad_wr); | ||
4388 | + } else { | ||
4389 | + siw_dbg_qp(qp, "QP out of state %d\n", | ||
4390 | + qp->attrs.state); | ||
4391 | + *bad_wr = wr; | ||
4392 | + rv = -ENOTCONN; | ||
4393 | + } | ||
4394 | up_read(&qp->state_lock); | ||
4395 | - *bad_wr = wr; | ||
4396 | - siw_dbg_qp(qp, "QP out of state %d\n", qp->attrs.state); | ||
4397 | - return -ENOTCONN; | ||
4398 | - } | ||
4399 | - if (wr && !qp->kernel_verbs) { | ||
4400 | - siw_dbg_qp(qp, "wr must be empty for user mapped sq\n"); | ||
4401 | - up_read(&qp->state_lock); | ||
4402 | - *bad_wr = wr; | ||
4403 | - return -EINVAL; | ||
4404 | + return rv; | ||
4405 | } | ||
4406 | spin_lock_irqsave(&qp->sq_lock, flags); | ||
4407 | |||
4408 | @@ -917,24 +986,54 @@ int siw_post_receive(struct ib_qp *base_qp, const struct ib_recv_wr *wr, | ||
4409 | *bad_wr = wr; | ||
4410 | return -EOPNOTSUPP; /* what else from errno.h? */ | ||
4411 | } | ||
4412 | + if (!qp->kernel_verbs) { | ||
4413 | + siw_dbg_qp(qp, "no kernel post_recv for user mapped sq\n"); | ||
4414 | + *bad_wr = wr; | ||
4415 | + return -EINVAL; | ||
4416 | + } | ||
4417 | + | ||
4418 | /* | ||
4419 | * Try to acquire QP state lock. Must be non-blocking | ||
4420 | * to accommodate kernel clients needs. | ||
4421 | */ | ||
4422 | if (!down_read_trylock(&qp->state_lock)) { | ||
4423 | - *bad_wr = wr; | ||
4424 | - return -ENOTCONN; | ||
4425 | - } | ||
4426 | - if (!qp->kernel_verbs) { | ||
4427 | - siw_dbg_qp(qp, "no kernel post_recv for user mapped sq\n"); | ||
4428 | - up_read(&qp->state_lock); | ||
4429 | - *bad_wr = wr; | ||
4430 | - return -EINVAL; | ||
4431 | + if (qp->attrs.state == SIW_QP_STATE_ERROR) { | ||
4432 | + /* | ||
4433 | + * ERROR state is final, so we can be sure | ||
4434 | + * this state will not change as long as the QP | ||
4435 | + * exists. | ||
4436 | + * | ||
4437 | + * This handles an ib_drain_rq() call with | ||
4438 | + * a concurrent request to set the QP state | ||
4439 | + * to ERROR. | ||
4440 | + */ | ||
4441 | + rv = siw_rq_flush_wr(qp, wr, bad_wr); | ||
4442 | + } else { | ||
4443 | + siw_dbg_qp(qp, "QP locked, state %d\n", | ||
4444 | + qp->attrs.state); | ||
4445 | + *bad_wr = wr; | ||
4446 | + rv = -ENOTCONN; | ||
4447 | + } | ||
4448 | + return rv; | ||
4449 | } | ||
4450 | if (qp->attrs.state > SIW_QP_STATE_RTS) { | ||
4451 | + if (qp->attrs.state == SIW_QP_STATE_ERROR) { | ||
4452 | + /* | ||
4453 | + * Immediately flush this WR to CQ, if QP | ||
4454 | + * is in ERROR state. RQ is guaranteed to | ||
4455 | + * be empty, so WR complets in-order. | ||
4456 | + * | ||
4457 | + * Typically triggered by ib_drain_rq(). | ||
4458 | + */ | ||
4459 | + rv = siw_rq_flush_wr(qp, wr, bad_wr); | ||
4460 | + } else { | ||
4461 | + siw_dbg_qp(qp, "QP out of state %d\n", | ||
4462 | + qp->attrs.state); | ||
4463 | + *bad_wr = wr; | ||
4464 | + rv = -ENOTCONN; | ||
4465 | + } | ||
4466 | up_read(&qp->state_lock); | ||
4467 | - *bad_wr = wr; | ||
4468 | - return -EINVAL; | ||
4469 | + return rv; | ||
4470 | } | ||
4471 | /* | ||
4472 | * Serialize potentially multiple producers. | ||
4473 | diff --git a/drivers/infiniband/ulp/iser/iscsi_iser.c b/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
4474 | index 2e72fc5af157..c4c015c60446 100644 | ||
4475 | --- a/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
4476 | +++ b/drivers/infiniband/ulp/iser/iscsi_iser.c | ||
4477 | @@ -646,6 +646,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep, | ||
4478 | if (ib_conn->pi_support) { | ||
4479 | u32 sig_caps = ib_dev->attrs.sig_prot_cap; | ||
4480 | |||
4481 | + shost->sg_prot_tablesize = shost->sg_tablesize; | ||
4482 | scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps)); | ||
4483 | scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP | | ||
4484 | SHOST_DIX_GUARD_CRC); | ||
4485 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
4486 | index 6db6d969e31c..4ce797d4259f 100644 | ||
4487 | --- a/drivers/iommu/intel-iommu.c | ||
4488 | +++ b/drivers/iommu/intel-iommu.c | ||
4489 | @@ -5447,9 +5447,6 @@ static int intel_iommu_map(struct iommu_domain *domain, | ||
4490 | int prot = 0; | ||
4491 | int ret; | ||
4492 | |||
4493 | - if (dmar_domain->flags & DOMAIN_FLAG_LOSE_CHILDREN) | ||
4494 | - return -EINVAL; | ||
4495 | - | ||
4496 | if (iommu_prot & IOMMU_READ) | ||
4497 | prot |= DMA_PTE_READ; | ||
4498 | if (iommu_prot & IOMMU_WRITE) | ||
4499 | @@ -5492,8 +5489,6 @@ static size_t intel_iommu_unmap(struct iommu_domain *domain, | ||
4500 | /* Cope with horrid API which requires us to unmap more than the | ||
4501 | size argument if it happens to be a large-page mapping. */ | ||
4502 | BUG_ON(!pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level)); | ||
4503 | - if (dmar_domain->flags & DOMAIN_FLAG_LOSE_CHILDREN) | ||
4504 | - return 0; | ||
4505 | |||
4506 | if (size < VTD_PAGE_SIZE << level_to_offset_bits(level)) | ||
4507 | size = VTD_PAGE_SIZE << level_to_offset_bits(level); | ||
4508 | @@ -5525,9 +5520,6 @@ static phys_addr_t intel_iommu_iova_to_phys(struct iommu_domain *domain, | ||
4509 | int level = 0; | ||
4510 | u64 phys = 0; | ||
4511 | |||
4512 | - if (dmar_domain->flags & DOMAIN_FLAG_LOSE_CHILDREN) | ||
4513 | - return 0; | ||
4514 | - | ||
4515 | pte = pfn_to_dma_pte(dmar_domain, iova >> VTD_PAGE_SHIFT, &level); | ||
4516 | if (pte) | ||
4517 | phys = dma_pte_addr(pte); | ||
4518 | @@ -5705,8 +5697,8 @@ static void intel_iommu_get_resv_regions(struct device *device, | ||
4519 | struct pci_dev *pdev = to_pci_dev(device); | ||
4520 | |||
4521 | if ((pdev->class >> 8) == PCI_CLASS_BRIDGE_ISA) { | ||
4522 | - reg = iommu_alloc_resv_region(0, 1UL << 24, 0, | ||
4523 | - IOMMU_RESV_DIRECT); | ||
4524 | + reg = iommu_alloc_resv_region(0, 1UL << 24, prot, | ||
4525 | + IOMMU_RESV_DIRECT_RELAXABLE); | ||
4526 | if (reg) | ||
4527 | list_add_tail(®->list, head); | ||
4528 | } | ||
4529 | diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c | ||
4530 | index d658c7c6a2ab..24248aa8a7e5 100644 | ||
4531 | --- a/drivers/iommu/iommu.c | ||
4532 | +++ b/drivers/iommu/iommu.c | ||
4533 | @@ -312,8 +312,8 @@ int iommu_insert_resv_region(struct iommu_resv_region *new, | ||
4534 | list_for_each_entry_safe(iter, tmp, regions, list) { | ||
4535 | phys_addr_t top_end, iter_end = iter->start + iter->length - 1; | ||
4536 | |||
4537 | - /* no merge needed on elements of different types than @nr */ | ||
4538 | - if (iter->type != nr->type) { | ||
4539 | + /* no merge needed on elements of different types than @new */ | ||
4540 | + if (iter->type != new->type) { | ||
4541 | list_move_tail(&iter->list, &stack); | ||
4542 | continue; | ||
4543 | } | ||
4544 | @@ -2221,13 +2221,13 @@ request_default_domain_for_dev(struct device *dev, unsigned long type) | ||
4545 | goto out; | ||
4546 | } | ||
4547 | |||
4548 | - iommu_group_create_direct_mappings(group, dev); | ||
4549 | - | ||
4550 | /* Make the domain the default for this group */ | ||
4551 | if (group->default_domain) | ||
4552 | iommu_domain_free(group->default_domain); | ||
4553 | group->default_domain = domain; | ||
4554 | |||
4555 | + iommu_group_create_direct_mappings(group, dev); | ||
4556 | + | ||
4557 | dev_info(dev, "Using iommu %s mapping\n", | ||
4558 | type == IOMMU_DOMAIN_DMA ? "dma" : "direct"); | ||
4559 | |||
4560 | diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c | ||
4561 | index 6f776823b9ba..a1df0d95151c 100644 | ||
4562 | --- a/drivers/md/bcache/alloc.c | ||
4563 | +++ b/drivers/md/bcache/alloc.c | ||
4564 | @@ -377,7 +377,10 @@ retry_invalidate: | ||
4565 | if (!fifo_full(&ca->free_inc)) | ||
4566 | goto retry_invalidate; | ||
4567 | |||
4568 | - bch_prio_write(ca); | ||
4569 | + if (bch_prio_write(ca, false) < 0) { | ||
4570 | + ca->invalidate_needs_gc = 1; | ||
4571 | + wake_up_gc(ca->set); | ||
4572 | + } | ||
4573 | } | ||
4574 | } | ||
4575 | out: | ||
4576 | diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h | ||
4577 | index 013e35a9e317..deb924e1d790 100644 | ||
4578 | --- a/drivers/md/bcache/bcache.h | ||
4579 | +++ b/drivers/md/bcache/bcache.h | ||
4580 | @@ -977,7 +977,7 @@ bool bch_cached_dev_error(struct cached_dev *dc); | ||
4581 | __printf(2, 3) | ||
4582 | bool bch_cache_set_error(struct cache_set *c, const char *fmt, ...); | ||
4583 | |||
4584 | -void bch_prio_write(struct cache *ca); | ||
4585 | +int bch_prio_write(struct cache *ca, bool wait); | ||
4586 | void bch_write_bdev_super(struct cached_dev *dc, struct closure *parent); | ||
4587 | |||
4588 | extern struct workqueue_struct *bcache_wq; | ||
4589 | diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c | ||
4590 | index 20ed838e9413..64999c7a8033 100644 | ||
4591 | --- a/drivers/md/bcache/super.c | ||
4592 | +++ b/drivers/md/bcache/super.c | ||
4593 | @@ -529,12 +529,29 @@ static void prio_io(struct cache *ca, uint64_t bucket, int op, | ||
4594 | closure_sync(cl); | ||
4595 | } | ||
4596 | |||
4597 | -void bch_prio_write(struct cache *ca) | ||
4598 | +int bch_prio_write(struct cache *ca, bool wait) | ||
4599 | { | ||
4600 | int i; | ||
4601 | struct bucket *b; | ||
4602 | struct closure cl; | ||
4603 | |||
4604 | + pr_debug("free_prio=%zu, free_none=%zu, free_inc=%zu", | ||
4605 | + fifo_used(&ca->free[RESERVE_PRIO]), | ||
4606 | + fifo_used(&ca->free[RESERVE_NONE]), | ||
4607 | + fifo_used(&ca->free_inc)); | ||
4608 | + | ||
4609 | + /* | ||
4610 | + * Pre-check if there are enough free buckets. In the non-blocking | ||
4611 | + * scenario it's better to fail early rather than starting to allocate | ||
4612 | + * buckets and do a cleanup later in case of failure. | ||
4613 | + */ | ||
4614 | + if (!wait) { | ||
4615 | + size_t avail = fifo_used(&ca->free[RESERVE_PRIO]) + | ||
4616 | + fifo_used(&ca->free[RESERVE_NONE]); | ||
4617 | + if (prio_buckets(ca) > avail) | ||
4618 | + return -ENOMEM; | ||
4619 | + } | ||
4620 | + | ||
4621 | closure_init_stack(&cl); | ||
4622 | |||
4623 | lockdep_assert_held(&ca->set->bucket_lock); | ||
4624 | @@ -544,9 +561,6 @@ void bch_prio_write(struct cache *ca) | ||
4625 | atomic_long_add(ca->sb.bucket_size * prio_buckets(ca), | ||
4626 | &ca->meta_sectors_written); | ||
4627 | |||
4628 | - //pr_debug("free %zu, free_inc %zu, unused %zu", fifo_used(&ca->free), | ||
4629 | - // fifo_used(&ca->free_inc), fifo_used(&ca->unused)); | ||
4630 | - | ||
4631 | for (i = prio_buckets(ca) - 1; i >= 0; --i) { | ||
4632 | long bucket; | ||
4633 | struct prio_set *p = ca->disk_buckets; | ||
4634 | @@ -564,7 +578,7 @@ void bch_prio_write(struct cache *ca) | ||
4635 | p->magic = pset_magic(&ca->sb); | ||
4636 | p->csum = bch_crc64(&p->magic, bucket_bytes(ca) - 8); | ||
4637 | |||
4638 | - bucket = bch_bucket_alloc(ca, RESERVE_PRIO, true); | ||
4639 | + bucket = bch_bucket_alloc(ca, RESERVE_PRIO, wait); | ||
4640 | BUG_ON(bucket == -1); | ||
4641 | |||
4642 | mutex_unlock(&ca->set->bucket_lock); | ||
4643 | @@ -593,6 +607,7 @@ void bch_prio_write(struct cache *ca) | ||
4644 | |||
4645 | ca->prio_last_buckets[i] = ca->prio_buckets[i]; | ||
4646 | } | ||
4647 | + return 0; | ||
4648 | } | ||
4649 | |||
4650 | static void prio_read(struct cache *ca, uint64_t bucket) | ||
4651 | @@ -761,20 +776,28 @@ static inline int idx_to_first_minor(int idx) | ||
4652 | |||
4653 | static void bcache_device_free(struct bcache_device *d) | ||
4654 | { | ||
4655 | + struct gendisk *disk = d->disk; | ||
4656 | + | ||
4657 | lockdep_assert_held(&bch_register_lock); | ||
4658 | |||
4659 | - pr_info("%s stopped", d->disk->disk_name); | ||
4660 | + if (disk) | ||
4661 | + pr_info("%s stopped", disk->disk_name); | ||
4662 | + else | ||
4663 | + pr_err("bcache device (NULL gendisk) stopped"); | ||
4664 | |||
4665 | if (d->c) | ||
4666 | bcache_device_detach(d); | ||
4667 | - if (d->disk && d->disk->flags & GENHD_FL_UP) | ||
4668 | - del_gendisk(d->disk); | ||
4669 | - if (d->disk && d->disk->queue) | ||
4670 | - blk_cleanup_queue(d->disk->queue); | ||
4671 | - if (d->disk) { | ||
4672 | + | ||
4673 | + if (disk) { | ||
4674 | + if (disk->flags & GENHD_FL_UP) | ||
4675 | + del_gendisk(disk); | ||
4676 | + | ||
4677 | + if (disk->queue) | ||
4678 | + blk_cleanup_queue(disk->queue); | ||
4679 | + | ||
4680 | ida_simple_remove(&bcache_device_idx, | ||
4681 | - first_minor_to_idx(d->disk->first_minor)); | ||
4682 | - put_disk(d->disk); | ||
4683 | + first_minor_to_idx(disk->first_minor)); | ||
4684 | + put_disk(disk); | ||
4685 | } | ||
4686 | |||
4687 | bioset_exit(&d->bio_split); | ||
4688 | @@ -1954,7 +1977,7 @@ static int run_cache_set(struct cache_set *c) | ||
4689 | |||
4690 | mutex_lock(&c->bucket_lock); | ||
4691 | for_each_cache(ca, c, i) | ||
4692 | - bch_prio_write(ca); | ||
4693 | + bch_prio_write(ca, true); | ||
4694 | mutex_unlock(&c->bucket_lock); | ||
4695 | |||
4696 | err = "cannot allocate new UUID bucket"; | ||
4697 | diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c | ||
4698 | index b092c7b5282f..3ad18246fcb3 100644 | ||
4699 | --- a/drivers/md/md-bitmap.c | ||
4700 | +++ b/drivers/md/md-bitmap.c | ||
4701 | @@ -2139,6 +2139,7 @@ int md_bitmap_resize(struct bitmap *bitmap, sector_t blocks, | ||
4702 | memcpy(page_address(store.sb_page), | ||
4703 | page_address(bitmap->storage.sb_page), | ||
4704 | sizeof(bitmap_super_t)); | ||
4705 | + spin_lock_irq(&bitmap->counts.lock); | ||
4706 | md_bitmap_file_unmap(&bitmap->storage); | ||
4707 | bitmap->storage = store; | ||
4708 | |||
4709 | @@ -2154,7 +2155,6 @@ int md_bitmap_resize(struct bitmap *bitmap, sector_t blocks, | ||
4710 | blocks = min(old_counts.chunks << old_counts.chunkshift, | ||
4711 | chunks << chunkshift); | ||
4712 | |||
4713 | - spin_lock_irq(&bitmap->counts.lock); | ||
4714 | /* For cluster raid, need to pre-allocate bitmap */ | ||
4715 | if (mddev_is_clustered(bitmap->mddev)) { | ||
4716 | unsigned long page; | ||
4717 | diff --git a/drivers/md/md.c b/drivers/md/md.c | ||
4718 | index b8dd56b746da..805b33e27496 100644 | ||
4719 | --- a/drivers/md/md.c | ||
4720 | +++ b/drivers/md/md.c | ||
4721 | @@ -1105,6 +1105,7 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor | ||
4722 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; | ||
4723 | mdp_super_t *sb; | ||
4724 | int ret; | ||
4725 | + bool spare_disk = true; | ||
4726 | |||
4727 | /* | ||
4728 | * Calculate the position of the superblock (512byte sectors), | ||
4729 | @@ -1155,8 +1156,18 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor | ||
4730 | else | ||
4731 | rdev->desc_nr = sb->this_disk.number; | ||
4732 | |||
4733 | + /* not spare disk, or LEVEL_MULTIPATH */ | ||
4734 | + if (sb->level == LEVEL_MULTIPATH || | ||
4735 | + (rdev->desc_nr >= 0 && | ||
4736 | + sb->disks[rdev->desc_nr].state & | ||
4737 | + ((1<<MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE)))) | ||
4738 | + spare_disk = false; | ||
4739 | + | ||
4740 | if (!refdev) { | ||
4741 | - ret = 1; | ||
4742 | + if (!spare_disk) | ||
4743 | + ret = 1; | ||
4744 | + else | ||
4745 | + ret = 0; | ||
4746 | } else { | ||
4747 | __u64 ev1, ev2; | ||
4748 | mdp_super_t *refsb = page_address(refdev->sb_page); | ||
4749 | @@ -1172,7 +1183,8 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor | ||
4750 | } | ||
4751 | ev1 = md_event(sb); | ||
4752 | ev2 = md_event(refsb); | ||
4753 | - if (ev1 > ev2) | ||
4754 | + | ||
4755 | + if (!spare_disk && ev1 > ev2) | ||
4756 | ret = 1; | ||
4757 | else | ||
4758 | ret = 0; | ||
4759 | @@ -1532,6 +1544,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ | ||
4760 | sector_t sectors; | ||
4761 | char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE]; | ||
4762 | int bmask; | ||
4763 | + bool spare_disk = true; | ||
4764 | |||
4765 | /* | ||
4766 | * Calculate the position of the superblock in 512byte sectors. | ||
4767 | @@ -1665,8 +1678,19 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ | ||
4768 | sb->level != 0) | ||
4769 | return -EINVAL; | ||
4770 | |||
4771 | + /* not spare disk, or LEVEL_MULTIPATH */ | ||
4772 | + if (sb->level == cpu_to_le32(LEVEL_MULTIPATH) || | ||
4773 | + (rdev->desc_nr >= 0 && | ||
4774 | + rdev->desc_nr < le32_to_cpu(sb->max_dev) && | ||
4775 | + (le16_to_cpu(sb->dev_roles[rdev->desc_nr]) < MD_DISK_ROLE_MAX || | ||
4776 | + le16_to_cpu(sb->dev_roles[rdev->desc_nr]) == MD_DISK_ROLE_JOURNAL))) | ||
4777 | + spare_disk = false; | ||
4778 | + | ||
4779 | if (!refdev) { | ||
4780 | - ret = 1; | ||
4781 | + if (!spare_disk) | ||
4782 | + ret = 1; | ||
4783 | + else | ||
4784 | + ret = 0; | ||
4785 | } else { | ||
4786 | __u64 ev1, ev2; | ||
4787 | struct mdp_superblock_1 *refsb = page_address(refdev->sb_page); | ||
4788 | @@ -1683,7 +1707,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_ | ||
4789 | ev1 = le64_to_cpu(sb->events); | ||
4790 | ev2 = le64_to_cpu(refsb->events); | ||
4791 | |||
4792 | - if (ev1 > ev2) | ||
4793 | + if (!spare_disk && ev1 > ev2) | ||
4794 | ret = 1; | ||
4795 | else | ||
4796 | ret = 0; | ||
4797 | @@ -3604,7 +3628,7 @@ abort_free: | ||
4798 | * Check a full RAID array for plausibility | ||
4799 | */ | ||
4800 | |||
4801 | -static void analyze_sbs(struct mddev *mddev) | ||
4802 | +static int analyze_sbs(struct mddev *mddev) | ||
4803 | { | ||
4804 | int i; | ||
4805 | struct md_rdev *rdev, *freshest, *tmp; | ||
4806 | @@ -3625,6 +3649,12 @@ static void analyze_sbs(struct mddev *mddev) | ||
4807 | md_kick_rdev_from_array(rdev); | ||
4808 | } | ||
4809 | |||
4810 | + /* Cannot find a valid fresh disk */ | ||
4811 | + if (!freshest) { | ||
4812 | + pr_warn("md: cannot find a valid disk\n"); | ||
4813 | + return -EINVAL; | ||
4814 | + } | ||
4815 | + | ||
4816 | super_types[mddev->major_version]. | ||
4817 | validate_super(mddev, freshest); | ||
4818 | |||
4819 | @@ -3659,6 +3689,8 @@ static void analyze_sbs(struct mddev *mddev) | ||
4820 | clear_bit(In_sync, &rdev->flags); | ||
4821 | } | ||
4822 | } | ||
4823 | + | ||
4824 | + return 0; | ||
4825 | } | ||
4826 | |||
4827 | /* Read a fixed-point number. | ||
4828 | @@ -5577,7 +5609,9 @@ int md_run(struct mddev *mddev) | ||
4829 | if (!mddev->raid_disks) { | ||
4830 | if (!mddev->persistent) | ||
4831 | return -EINVAL; | ||
4832 | - analyze_sbs(mddev); | ||
4833 | + err = analyze_sbs(mddev); | ||
4834 | + if (err) | ||
4835 | + return -EINVAL; | ||
4836 | } | ||
4837 | |||
4838 | if (mddev->level != LEVEL_NONE) | ||
4839 | diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig | ||
4840 | index 7eee1812bba3..fcffcc31d168 100644 | ||
4841 | --- a/drivers/media/i2c/Kconfig | ||
4842 | +++ b/drivers/media/i2c/Kconfig | ||
4843 | @@ -1113,6 +1113,7 @@ comment "SDR tuner chips" | ||
4844 | config SDR_MAX2175 | ||
4845 | tristate "Maxim 2175 RF to Bits tuner" | ||
4846 | depends on VIDEO_V4L2 && MEDIA_SDR_SUPPORT && I2C | ||
4847 | + select REGMAP_I2C | ||
4848 | help | ||
4849 | Support for Maxim 2175 tuner. It is an advanced analog/digital | ||
4850 | radio receiver with RF-to-Bits front-end designed for SDR solutions. | ||
4851 | diff --git a/drivers/media/i2c/ad5820.c b/drivers/media/i2c/ad5820.c | ||
4852 | index 925c171e7797..7a49651f4d1f 100644 | ||
4853 | --- a/drivers/media/i2c/ad5820.c | ||
4854 | +++ b/drivers/media/i2c/ad5820.c | ||
4855 | @@ -309,6 +309,7 @@ static int ad5820_probe(struct i2c_client *client, | ||
4856 | v4l2_i2c_subdev_init(&coil->subdev, client, &ad5820_ops); | ||
4857 | coil->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; | ||
4858 | coil->subdev.internal_ops = &ad5820_internal_ops; | ||
4859 | + coil->subdev.entity.function = MEDIA_ENT_F_LENS; | ||
4860 | strscpy(coil->subdev.name, "ad5820 focus", sizeof(coil->subdev.name)); | ||
4861 | |||
4862 | ret = media_entity_pads_init(&coil->subdev.entity, 0, NULL); | ||
4863 | diff --git a/drivers/media/i2c/ov2659.c b/drivers/media/i2c/ov2659.c | ||
4864 | index f4ded0669ff9..e1ff38009cf0 100644 | ||
4865 | --- a/drivers/media/i2c/ov2659.c | ||
4866 | +++ b/drivers/media/i2c/ov2659.c | ||
4867 | @@ -419,10 +419,14 @@ static struct sensor_register ov2659_720p[] = { | ||
4868 | { REG_TIMING_YINC, 0x11 }, | ||
4869 | { REG_TIMING_VERT_FORMAT, 0x80 }, | ||
4870 | { REG_TIMING_HORIZ_FORMAT, 0x00 }, | ||
4871 | + { 0x370a, 0x12 }, | ||
4872 | { 0x3a03, 0xe8 }, | ||
4873 | { 0x3a09, 0x6f }, | ||
4874 | { 0x3a0b, 0x5d }, | ||
4875 | { 0x3a15, 0x9a }, | ||
4876 | + { REG_VFIFO_READ_START_H, 0x00 }, | ||
4877 | + { REG_VFIFO_READ_START_L, 0x80 }, | ||
4878 | + { REG_ISP_CTRL02, 0x00 }, | ||
4879 | { REG_NULL, 0x00 }, | ||
4880 | }; | ||
4881 | |||
4882 | @@ -1201,11 +1205,15 @@ static int ov2659_s_stream(struct v4l2_subdev *sd, int on) | ||
4883 | goto unlock; | ||
4884 | } | ||
4885 | |||
4886 | - ov2659_set_pixel_clock(ov2659); | ||
4887 | - ov2659_set_frame_size(ov2659); | ||
4888 | - ov2659_set_format(ov2659); | ||
4889 | - ov2659_set_streaming(ov2659, 1); | ||
4890 | - ov2659->streaming = on; | ||
4891 | + ret = ov2659_set_pixel_clock(ov2659); | ||
4892 | + if (!ret) | ||
4893 | + ret = ov2659_set_frame_size(ov2659); | ||
4894 | + if (!ret) | ||
4895 | + ret = ov2659_set_format(ov2659); | ||
4896 | + if (!ret) { | ||
4897 | + ov2659_set_streaming(ov2659, 1); | ||
4898 | + ov2659->streaming = on; | ||
4899 | + } | ||
4900 | |||
4901 | unlock: | ||
4902 | mutex_unlock(&ov2659->lock); | ||
4903 | diff --git a/drivers/media/i2c/ov5640.c b/drivers/media/i2c/ov5640.c | ||
4904 | index 500d9bbff10b..18dd2d717088 100644 | ||
4905 | --- a/drivers/media/i2c/ov5640.c | ||
4906 | +++ b/drivers/media/i2c/ov5640.c | ||
4907 | @@ -1611,6 +1611,11 @@ ov5640_find_mode(struct ov5640_dev *sensor, enum ov5640_frame_rate fr, | ||
4908 | !(mode->hact == 640 && mode->vact == 480)) | ||
4909 | return NULL; | ||
4910 | |||
4911 | + /* 2592x1944 only works at 15fps max */ | ||
4912 | + if ((mode->hact == 2592 && mode->vact == 1944) && | ||
4913 | + fr > OV5640_15_FPS) | ||
4914 | + return NULL; | ||
4915 | + | ||
4916 | return mode; | ||
4917 | } | ||
4918 | |||
4919 | diff --git a/drivers/media/i2c/ov6650.c b/drivers/media/i2c/ov6650.c | ||
4920 | index 5b9af5e5b7f1..a5b2448c0abc 100644 | ||
4921 | --- a/drivers/media/i2c/ov6650.c | ||
4922 | +++ b/drivers/media/i2c/ov6650.c | ||
4923 | @@ -130,6 +130,7 @@ | ||
4924 | #define CLKRC_24MHz 0xc0 | ||
4925 | #define CLKRC_DIV_MASK 0x3f | ||
4926 | #define GET_CLKRC_DIV(x) (((x) & CLKRC_DIV_MASK) + 1) | ||
4927 | +#define DEF_CLKRC 0x00 | ||
4928 | |||
4929 | #define COMA_RESET BIT(7) | ||
4930 | #define COMA_QCIF BIT(5) | ||
4931 | @@ -465,38 +466,39 @@ static int ov6650_set_selection(struct v4l2_subdev *sd, | ||
4932 | { | ||
4933 | struct i2c_client *client = v4l2_get_subdevdata(sd); | ||
4934 | struct ov6650 *priv = to_ov6650(client); | ||
4935 | - struct v4l2_rect rect = sel->r; | ||
4936 | int ret; | ||
4937 | |||
4938 | if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE || | ||
4939 | sel->target != V4L2_SEL_TGT_CROP) | ||
4940 | return -EINVAL; | ||
4941 | |||
4942 | - v4l_bound_align_image(&rect.width, 2, W_CIF, 1, | ||
4943 | - &rect.height, 2, H_CIF, 1, 0); | ||
4944 | - v4l_bound_align_image(&rect.left, DEF_HSTRT << 1, | ||
4945 | - (DEF_HSTRT << 1) + W_CIF - (__s32)rect.width, 1, | ||
4946 | - &rect.top, DEF_VSTRT << 1, | ||
4947 | - (DEF_VSTRT << 1) + H_CIF - (__s32)rect.height, 1, | ||
4948 | - 0); | ||
4949 | + v4l_bound_align_image(&sel->r.width, 2, W_CIF, 1, | ||
4950 | + &sel->r.height, 2, H_CIF, 1, 0); | ||
4951 | + v4l_bound_align_image(&sel->r.left, DEF_HSTRT << 1, | ||
4952 | + (DEF_HSTRT << 1) + W_CIF - (__s32)sel->r.width, 1, | ||
4953 | + &sel->r.top, DEF_VSTRT << 1, | ||
4954 | + (DEF_VSTRT << 1) + H_CIF - (__s32)sel->r.height, | ||
4955 | + 1, 0); | ||
4956 | |||
4957 | - ret = ov6650_reg_write(client, REG_HSTRT, rect.left >> 1); | ||
4958 | + ret = ov6650_reg_write(client, REG_HSTRT, sel->r.left >> 1); | ||
4959 | if (!ret) { | ||
4960 | - priv->rect.left = rect.left; | ||
4961 | + priv->rect.width += priv->rect.left - sel->r.left; | ||
4962 | + priv->rect.left = sel->r.left; | ||
4963 | ret = ov6650_reg_write(client, REG_HSTOP, | ||
4964 | - (rect.left + rect.width) >> 1); | ||
4965 | + (sel->r.left + sel->r.width) >> 1); | ||
4966 | } | ||
4967 | if (!ret) { | ||
4968 | - priv->rect.width = rect.width; | ||
4969 | - ret = ov6650_reg_write(client, REG_VSTRT, rect.top >> 1); | ||
4970 | + priv->rect.width = sel->r.width; | ||
4971 | + ret = ov6650_reg_write(client, REG_VSTRT, sel->r.top >> 1); | ||
4972 | } | ||
4973 | if (!ret) { | ||
4974 | - priv->rect.top = rect.top; | ||
4975 | + priv->rect.height += priv->rect.top - sel->r.top; | ||
4976 | + priv->rect.top = sel->r.top; | ||
4977 | ret = ov6650_reg_write(client, REG_VSTOP, | ||
4978 | - (rect.top + rect.height) >> 1); | ||
4979 | + (sel->r.top + sel->r.height) >> 1); | ||
4980 | } | ||
4981 | if (!ret) | ||
4982 | - priv->rect.height = rect.height; | ||
4983 | + priv->rect.height = sel->r.height; | ||
4984 | |||
4985 | return ret; | ||
4986 | } | ||
4987 | @@ -610,7 +612,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) | ||
4988 | dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code); | ||
4989 | return -EINVAL; | ||
4990 | } | ||
4991 | - priv->code = code; | ||
4992 | |||
4993 | if (code == MEDIA_BUS_FMT_Y8_1X8 || | ||
4994 | code == MEDIA_BUS_FMT_SBGGR8_1X8) { | ||
4995 | @@ -636,7 +637,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) | ||
4996 | dev_dbg(&client->dev, "max resolution: CIF\n"); | ||
4997 | coma_mask |= COMA_QCIF; | ||
4998 | } | ||
4999 | - priv->half_scale = half_scale; | ||
5000 | |||
5001 | clkrc = CLKRC_12MHz; | ||
5002 | mclk = 12000000; | ||
5003 | @@ -654,8 +654,13 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf) | ||
5004 | ret = ov6650_reg_rmw(client, REG_COMA, coma_set, coma_mask); | ||
5005 | if (!ret) | ||
5006 | ret = ov6650_reg_write(client, REG_CLKRC, clkrc); | ||
5007 | - if (!ret) | ||
5008 | + if (!ret) { | ||
5009 | + priv->half_scale = half_scale; | ||
5010 | + | ||
5011 | ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask); | ||
5012 | + } | ||
5013 | + if (!ret) | ||
5014 | + priv->code = code; | ||
5015 | |||
5016 | if (!ret) { | ||
5017 | mf->colorspace = priv->colorspace; | ||
5018 | @@ -754,19 +759,17 @@ static int ov6650_s_frame_interval(struct v4l2_subdev *sd, | ||
5019 | else if (div > GET_CLKRC_DIV(CLKRC_DIV_MASK)) | ||
5020 | div = GET_CLKRC_DIV(CLKRC_DIV_MASK); | ||
5021 | |||
5022 | - /* | ||
5023 | - * Keep result to be used as tpf limit | ||
5024 | - * for subsequent clock divider calculations | ||
5025 | - */ | ||
5026 | - priv->tpf.numerator = div; | ||
5027 | - priv->tpf.denominator = FRAME_RATE_MAX; | ||
5028 | + tpf->numerator = div; | ||
5029 | + tpf->denominator = FRAME_RATE_MAX; | ||
5030 | |||
5031 | - clkrc = to_clkrc(&priv->tpf, priv->pclk_limit, priv->pclk_max); | ||
5032 | + clkrc = to_clkrc(tpf, priv->pclk_limit, priv->pclk_max); | ||
5033 | |||
5034 | ret = ov6650_reg_rmw(client, REG_CLKRC, clkrc, CLKRC_DIV_MASK); | ||
5035 | if (!ret) { | ||
5036 | - tpf->numerator = GET_CLKRC_DIV(clkrc); | ||
5037 | - tpf->denominator = FRAME_RATE_MAX; | ||
5038 | + priv->tpf.numerator = GET_CLKRC_DIV(clkrc); | ||
5039 | + priv->tpf.denominator = FRAME_RATE_MAX; | ||
5040 | + | ||
5041 | + *tpf = priv->tpf; | ||
5042 | } | ||
5043 | |||
5044 | return ret; | ||
5045 | @@ -989,8 +992,10 @@ static int ov6650_probe(struct i2c_client *client, | ||
5046 | V4L2_CID_GAMMA, 0, 0xff, 1, 0x12); | ||
5047 | |||
5048 | priv->subdev.ctrl_handler = &priv->hdl; | ||
5049 | - if (priv->hdl.error) | ||
5050 | - return priv->hdl.error; | ||
5051 | + if (priv->hdl.error) { | ||
5052 | + ret = priv->hdl.error; | ||
5053 | + goto ectlhdlfree; | ||
5054 | + } | ||
5055 | |||
5056 | v4l2_ctrl_auto_cluster(2, &priv->autogain, 0, true); | ||
5057 | v4l2_ctrl_auto_cluster(3, &priv->autowb, 0, true); | ||
5058 | @@ -1005,11 +1010,17 @@ static int ov6650_probe(struct i2c_client *client, | ||
5059 | priv->code = MEDIA_BUS_FMT_YUYV8_2X8; | ||
5060 | priv->colorspace = V4L2_COLORSPACE_JPEG; | ||
5061 | |||
5062 | + /* Hardware default frame interval */ | ||
5063 | + priv->tpf.numerator = GET_CLKRC_DIV(DEF_CLKRC); | ||
5064 | + priv->tpf.denominator = FRAME_RATE_MAX; | ||
5065 | + | ||
5066 | priv->subdev.internal_ops = &ov6650_internal_ops; | ||
5067 | |||
5068 | ret = v4l2_async_register_subdev(&priv->subdev); | ||
5069 | - if (ret) | ||
5070 | - v4l2_ctrl_handler_free(&priv->hdl); | ||
5071 | + if (!ret) | ||
5072 | + return 0; | ||
5073 | +ectlhdlfree: | ||
5074 | + v4l2_ctrl_handler_free(&priv->hdl); | ||
5075 | |||
5076 | return ret; | ||
5077 | } | ||
5078 | diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c | ||
5079 | index 9adf8e034e7d..42805dfbffeb 100644 | ||
5080 | --- a/drivers/media/i2c/smiapp/smiapp-core.c | ||
5081 | +++ b/drivers/media/i2c/smiapp/smiapp-core.c | ||
5082 | @@ -3101,19 +3101,23 @@ static int smiapp_probe(struct i2c_client *client) | ||
5083 | if (rval < 0) | ||
5084 | goto out_media_entity_cleanup; | ||
5085 | |||
5086 | - rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd); | ||
5087 | - if (rval < 0) | ||
5088 | - goto out_media_entity_cleanup; | ||
5089 | - | ||
5090 | pm_runtime_set_active(&client->dev); | ||
5091 | pm_runtime_get_noresume(&client->dev); | ||
5092 | pm_runtime_enable(&client->dev); | ||
5093 | + | ||
5094 | + rval = v4l2_async_register_subdev_sensor_common(&sensor->src->sd); | ||
5095 | + if (rval < 0) | ||
5096 | + goto out_disable_runtime_pm; | ||
5097 | + | ||
5098 | pm_runtime_set_autosuspend_delay(&client->dev, 1000); | ||
5099 | pm_runtime_use_autosuspend(&client->dev); | ||
5100 | pm_runtime_put_autosuspend(&client->dev); | ||
5101 | |||
5102 | return 0; | ||
5103 | |||
5104 | +out_disable_runtime_pm: | ||
5105 | + pm_runtime_disable(&client->dev); | ||
5106 | + | ||
5107 | out_media_entity_cleanup: | ||
5108 | media_entity_cleanup(&sensor->src->sd.entity); | ||
5109 | |||
5110 | diff --git a/drivers/media/i2c/st-mipid02.c b/drivers/media/i2c/st-mipid02.c | ||
5111 | index 81285b8d5cfb..003ba22334cd 100644 | ||
5112 | --- a/drivers/media/i2c/st-mipid02.c | ||
5113 | +++ b/drivers/media/i2c/st-mipid02.c | ||
5114 | @@ -971,6 +971,11 @@ static int mipid02_probe(struct i2c_client *client) | ||
5115 | bridge->reset_gpio = devm_gpiod_get_optional(dev, "reset", | ||
5116 | GPIOD_OUT_HIGH); | ||
5117 | |||
5118 | + if (IS_ERR(bridge->reset_gpio)) { | ||
5119 | + dev_err(dev, "failed to get reset GPIO\n"); | ||
5120 | + return PTR_ERR(bridge->reset_gpio); | ||
5121 | + } | ||
5122 | + | ||
5123 | ret = mipid02_get_regulators(bridge); | ||
5124 | if (ret) { | ||
5125 | dev_err(dev, "failed to get regulators %d", ret); | ||
5126 | diff --git a/drivers/media/pci/cx88/cx88-video.c b/drivers/media/pci/cx88/cx88-video.c | ||
5127 | index dcc0f02aeb70..b8abcd550604 100644 | ||
5128 | --- a/drivers/media/pci/cx88/cx88-video.c | ||
5129 | +++ b/drivers/media/pci/cx88/cx88-video.c | ||
5130 | @@ -1277,7 +1277,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev, | ||
5131 | core = cx88_core_get(dev->pci); | ||
5132 | if (!core) { | ||
5133 | err = -EINVAL; | ||
5134 | - goto fail_free; | ||
5135 | + goto fail_disable; | ||
5136 | } | ||
5137 | dev->core = core; | ||
5138 | |||
5139 | @@ -1323,7 +1323,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev, | ||
5140 | cc->step, cc->default_value); | ||
5141 | if (!vc) { | ||
5142 | err = core->audio_hdl.error; | ||
5143 | - goto fail_core; | ||
5144 | + goto fail_irq; | ||
5145 | } | ||
5146 | vc->priv = (void *)cc; | ||
5147 | } | ||
5148 | @@ -1337,7 +1337,7 @@ static int cx8800_initdev(struct pci_dev *pci_dev, | ||
5149 | cc->step, cc->default_value); | ||
5150 | if (!vc) { | ||
5151 | err = core->video_hdl.error; | ||
5152 | - goto fail_core; | ||
5153 | + goto fail_irq; | ||
5154 | } | ||
5155 | vc->priv = (void *)cc; | ||
5156 | if (vc->id == V4L2_CID_CHROMA_AGC) | ||
5157 | @@ -1509,11 +1509,14 @@ static int cx8800_initdev(struct pci_dev *pci_dev, | ||
5158 | |||
5159 | fail_unreg: | ||
5160 | cx8800_unregister_video(dev); | ||
5161 | - free_irq(pci_dev->irq, dev); | ||
5162 | mutex_unlock(&core->lock); | ||
5163 | +fail_irq: | ||
5164 | + free_irq(pci_dev->irq, dev); | ||
5165 | fail_core: | ||
5166 | core->v4ldev = NULL; | ||
5167 | cx88_core_put(core, dev->pci); | ||
5168 | +fail_disable: | ||
5169 | + pci_disable_device(pci_dev); | ||
5170 | fail_free: | ||
5171 | kfree(dev); | ||
5172 | return err; | ||
5173 | diff --git a/drivers/media/platform/am437x/am437x-vpfe.c b/drivers/media/platform/am437x/am437x-vpfe.c | ||
5174 | index 2b42ba1f5949..e13dbf27a9c2 100644 | ||
5175 | --- a/drivers/media/platform/am437x/am437x-vpfe.c | ||
5176 | +++ b/drivers/media/platform/am437x/am437x-vpfe.c | ||
5177 | @@ -1830,6 +1830,10 @@ static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id) | ||
5178 | if (!(sdinfo->inputs[0].capabilities & V4L2_IN_CAP_STD)) | ||
5179 | return -ENODATA; | ||
5180 | |||
5181 | + /* if trying to set the same std then nothing to do */ | ||
5182 | + if (vpfe_standards[vpfe->std_index].std_id == std_id) | ||
5183 | + return 0; | ||
5184 | + | ||
5185 | /* If streaming is started, return error */ | ||
5186 | if (vb2_is_busy(&vpfe->buffer_queue)) { | ||
5187 | vpfe_err(vpfe, "%s device busy\n", __func__); | ||
5188 | diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c | ||
5189 | index eb12f3793062..096a7c9a8963 100644 | ||
5190 | --- a/drivers/media/platform/aspeed-video.c | ||
5191 | +++ b/drivers/media/platform/aspeed-video.c | ||
5192 | @@ -606,6 +606,16 @@ static irqreturn_t aspeed_video_irq(int irq, void *arg) | ||
5193 | aspeed_video_start_frame(video); | ||
5194 | } | ||
5195 | |||
5196 | + /* | ||
5197 | + * CAPTURE_COMPLETE and FRAME_COMPLETE interrupts come even when these | ||
5198 | + * are disabled in the VE_INTERRUPT_CTRL register so clear them to | ||
5199 | + * prevent unnecessary interrupt calls. | ||
5200 | + */ | ||
5201 | + if (sts & VE_INTERRUPT_CAPTURE_COMPLETE) | ||
5202 | + sts &= ~VE_INTERRUPT_CAPTURE_COMPLETE; | ||
5203 | + if (sts & VE_INTERRUPT_FRAME_COMPLETE) | ||
5204 | + sts &= ~VE_INTERRUPT_FRAME_COMPLETE; | ||
5205 | + | ||
5206 | return sts ? IRQ_NONE : IRQ_HANDLED; | ||
5207 | } | ||
5208 | |||
5209 | @@ -741,6 +751,8 @@ static void aspeed_video_get_resolution(struct aspeed_video *video) | ||
5210 | } | ||
5211 | |||
5212 | set_bit(VIDEO_RES_DETECT, &video->flags); | ||
5213 | + aspeed_video_update(video, VE_CTRL, | ||
5214 | + VE_CTRL_VSYNC_POL | VE_CTRL_HSYNC_POL, 0); | ||
5215 | aspeed_video_enable_mode_detect(video); | ||
5216 | |||
5217 | rc = wait_event_interruptible_timeout(video->wait, | ||
5218 | diff --git a/drivers/media/platform/exynos4-is/media-dev.c b/drivers/media/platform/exynos4-is/media-dev.c | ||
5219 | index a838189d4490..9aaf3b8060d5 100644 | ||
5220 | --- a/drivers/media/platform/exynos4-is/media-dev.c | ||
5221 | +++ b/drivers/media/platform/exynos4-is/media-dev.c | ||
5222 | @@ -1457,12 +1457,12 @@ static int fimc_md_probe(struct platform_device *pdev) | ||
5223 | ret = v4l2_device_register(dev, &fmd->v4l2_dev); | ||
5224 | if (ret < 0) { | ||
5225 | v4l2_err(v4l2_dev, "Failed to register v4l2_device: %d\n", ret); | ||
5226 | - return ret; | ||
5227 | + goto err_md; | ||
5228 | } | ||
5229 | |||
5230 | ret = fimc_md_get_clocks(fmd); | ||
5231 | if (ret) | ||
5232 | - goto err_md; | ||
5233 | + goto err_v4l2dev; | ||
5234 | |||
5235 | ret = fimc_md_get_pinctrl(fmd); | ||
5236 | if (ret < 0) { | ||
5237 | @@ -1519,9 +1519,10 @@ err_m_ent: | ||
5238 | fimc_md_unregister_entities(fmd); | ||
5239 | err_clk: | ||
5240 | fimc_md_put_clocks(fmd); | ||
5241 | +err_v4l2dev: | ||
5242 | + v4l2_device_unregister(&fmd->v4l2_dev); | ||
5243 | err_md: | ||
5244 | media_device_cleanup(&fmd->media_dev); | ||
5245 | - v4l2_device_unregister(&fmd->v4l2_dev); | ||
5246 | return ret; | ||
5247 | } | ||
5248 | |||
5249 | diff --git a/drivers/media/platform/meson/ao-cec-g12a.c b/drivers/media/platform/meson/ao-cec-g12a.c | ||
5250 | index 3b39e875292e..3d8fe854feb0 100644 | ||
5251 | --- a/drivers/media/platform/meson/ao-cec-g12a.c | ||
5252 | +++ b/drivers/media/platform/meson/ao-cec-g12a.c | ||
5253 | @@ -662,34 +662,27 @@ static int meson_ao_cec_g12a_probe(struct platform_device *pdev) | ||
5254 | if (IS_ERR(ao_cec->adap)) | ||
5255 | return PTR_ERR(ao_cec->adap); | ||
5256 | |||
5257 | - ao_cec->notify = cec_notifier_cec_adap_register(hdmi_dev, NULL, | ||
5258 | - ao_cec->adap); | ||
5259 | - if (!ao_cec->notify) { | ||
5260 | - ret = -ENOMEM; | ||
5261 | - goto out_probe_adapter; | ||
5262 | - } | ||
5263 | - | ||
5264 | ao_cec->adap->owner = THIS_MODULE; | ||
5265 | |||
5266 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
5267 | base = devm_ioremap_resource(&pdev->dev, res); | ||
5268 | if (IS_ERR(base)) { | ||
5269 | ret = PTR_ERR(base); | ||
5270 | - goto out_probe_notify; | ||
5271 | + goto out_probe_adapter; | ||
5272 | } | ||
5273 | |||
5274 | ao_cec->regmap = devm_regmap_init_mmio(&pdev->dev, base, | ||
5275 | &meson_ao_cec_g12a_regmap_conf); | ||
5276 | if (IS_ERR(ao_cec->regmap)) { | ||
5277 | ret = PTR_ERR(ao_cec->regmap); | ||
5278 | - goto out_probe_notify; | ||
5279 | + goto out_probe_adapter; | ||
5280 | } | ||
5281 | |||
5282 | ao_cec->regmap_cec = devm_regmap_init(&pdev->dev, NULL, ao_cec, | ||
5283 | &meson_ao_cec_g12a_cec_regmap_conf); | ||
5284 | if (IS_ERR(ao_cec->regmap_cec)) { | ||
5285 | ret = PTR_ERR(ao_cec->regmap_cec); | ||
5286 | - goto out_probe_notify; | ||
5287 | + goto out_probe_adapter; | ||
5288 | } | ||
5289 | |||
5290 | irq = platform_get_irq(pdev, 0); | ||
5291 | @@ -699,45 +692,52 @@ static int meson_ao_cec_g12a_probe(struct platform_device *pdev) | ||
5292 | 0, NULL, ao_cec); | ||
5293 | if (ret) { | ||
5294 | dev_err(&pdev->dev, "irq request failed\n"); | ||
5295 | - goto out_probe_notify; | ||
5296 | + goto out_probe_adapter; | ||
5297 | } | ||
5298 | |||
5299 | ao_cec->oscin = devm_clk_get(&pdev->dev, "oscin"); | ||
5300 | if (IS_ERR(ao_cec->oscin)) { | ||
5301 | dev_err(&pdev->dev, "oscin clock request failed\n"); | ||
5302 | ret = PTR_ERR(ao_cec->oscin); | ||
5303 | - goto out_probe_notify; | ||
5304 | + goto out_probe_adapter; | ||
5305 | } | ||
5306 | |||
5307 | ret = meson_ao_cec_g12a_setup_clk(ao_cec); | ||
5308 | if (ret) | ||
5309 | - goto out_probe_notify; | ||
5310 | + goto out_probe_adapter; | ||
5311 | |||
5312 | ret = clk_prepare_enable(ao_cec->core); | ||
5313 | if (ret) { | ||
5314 | dev_err(&pdev->dev, "core clock enable failed\n"); | ||
5315 | - goto out_probe_notify; | ||
5316 | + goto out_probe_adapter; | ||
5317 | } | ||
5318 | |||
5319 | device_reset_optional(&pdev->dev); | ||
5320 | |||
5321 | platform_set_drvdata(pdev, ao_cec); | ||
5322 | |||
5323 | + ao_cec->notify = cec_notifier_cec_adap_register(hdmi_dev, NULL, | ||
5324 | + ao_cec->adap); | ||
5325 | + if (!ao_cec->notify) { | ||
5326 | + ret = -ENOMEM; | ||
5327 | + goto out_probe_core_clk; | ||
5328 | + } | ||
5329 | + | ||
5330 | ret = cec_register_adapter(ao_cec->adap, &pdev->dev); | ||
5331 | if (ret < 0) | ||
5332 | - goto out_probe_core_clk; | ||
5333 | + goto out_probe_notify; | ||
5334 | |||
5335 | /* Setup Hardware */ | ||
5336 | regmap_write(ao_cec->regmap, CECB_GEN_CNTL_REG, CECB_GEN_CNTL_RESET); | ||
5337 | |||
5338 | return 0; | ||
5339 | |||
5340 | -out_probe_core_clk: | ||
5341 | - clk_disable_unprepare(ao_cec->core); | ||
5342 | - | ||
5343 | out_probe_notify: | ||
5344 | cec_notifier_cec_adap_unregister(ao_cec->notify); | ||
5345 | |||
5346 | +out_probe_core_clk: | ||
5347 | + clk_disable_unprepare(ao_cec->core); | ||
5348 | + | ||
5349 | out_probe_adapter: | ||
5350 | cec_delete_adapter(ao_cec->adap); | ||
5351 | |||
5352 | diff --git a/drivers/media/platform/meson/ao-cec.c b/drivers/media/platform/meson/ao-cec.c | ||
5353 | index 64ed549bf012..03600e8b3ef0 100644 | ||
5354 | --- a/drivers/media/platform/meson/ao-cec.c | ||
5355 | +++ b/drivers/media/platform/meson/ao-cec.c | ||
5356 | @@ -624,20 +624,13 @@ static int meson_ao_cec_probe(struct platform_device *pdev) | ||
5357 | if (IS_ERR(ao_cec->adap)) | ||
5358 | return PTR_ERR(ao_cec->adap); | ||
5359 | |||
5360 | - ao_cec->notify = cec_notifier_cec_adap_register(hdmi_dev, NULL, | ||
5361 | - ao_cec->adap); | ||
5362 | - if (!ao_cec->notify) { | ||
5363 | - ret = -ENOMEM; | ||
5364 | - goto out_probe_adapter; | ||
5365 | - } | ||
5366 | - | ||
5367 | ao_cec->adap->owner = THIS_MODULE; | ||
5368 | |||
5369 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
5370 | ao_cec->base = devm_ioremap_resource(&pdev->dev, res); | ||
5371 | if (IS_ERR(ao_cec->base)) { | ||
5372 | ret = PTR_ERR(ao_cec->base); | ||
5373 | - goto out_probe_notify; | ||
5374 | + goto out_probe_adapter; | ||
5375 | } | ||
5376 | |||
5377 | irq = platform_get_irq(pdev, 0); | ||
5378 | @@ -647,20 +640,20 @@ static int meson_ao_cec_probe(struct platform_device *pdev) | ||
5379 | 0, NULL, ao_cec); | ||
5380 | if (ret) { | ||
5381 | dev_err(&pdev->dev, "irq request failed\n"); | ||
5382 | - goto out_probe_notify; | ||
5383 | + goto out_probe_adapter; | ||
5384 | } | ||
5385 | |||
5386 | ao_cec->core = devm_clk_get(&pdev->dev, "core"); | ||
5387 | if (IS_ERR(ao_cec->core)) { | ||
5388 | dev_err(&pdev->dev, "core clock request failed\n"); | ||
5389 | ret = PTR_ERR(ao_cec->core); | ||
5390 | - goto out_probe_notify; | ||
5391 | + goto out_probe_adapter; | ||
5392 | } | ||
5393 | |||
5394 | ret = clk_prepare_enable(ao_cec->core); | ||
5395 | if (ret) { | ||
5396 | dev_err(&pdev->dev, "core clock enable failed\n"); | ||
5397 | - goto out_probe_notify; | ||
5398 | + goto out_probe_adapter; | ||
5399 | } | ||
5400 | |||
5401 | ret = clk_set_rate(ao_cec->core, CEC_CLK_RATE); | ||
5402 | @@ -674,9 +667,16 @@ static int meson_ao_cec_probe(struct platform_device *pdev) | ||
5403 | ao_cec->pdev = pdev; | ||
5404 | platform_set_drvdata(pdev, ao_cec); | ||
5405 | |||
5406 | + ao_cec->notify = cec_notifier_cec_adap_register(hdmi_dev, NULL, | ||
5407 | + ao_cec->adap); | ||
5408 | + if (!ao_cec->notify) { | ||
5409 | + ret = -ENOMEM; | ||
5410 | + goto out_probe_clk; | ||
5411 | + } | ||
5412 | + | ||
5413 | ret = cec_register_adapter(ao_cec->adap, &pdev->dev); | ||
5414 | if (ret < 0) | ||
5415 | - goto out_probe_clk; | ||
5416 | + goto out_probe_notify; | ||
5417 | |||
5418 | /* Setup Hardware */ | ||
5419 | writel_relaxed(CEC_GEN_CNTL_RESET, | ||
5420 | @@ -684,12 +684,12 @@ static int meson_ao_cec_probe(struct platform_device *pdev) | ||
5421 | |||
5422 | return 0; | ||
5423 | |||
5424 | -out_probe_clk: | ||
5425 | - clk_disable_unprepare(ao_cec->core); | ||
5426 | - | ||
5427 | out_probe_notify: | ||
5428 | cec_notifier_cec_adap_unregister(ao_cec->notify); | ||
5429 | |||
5430 | +out_probe_clk: | ||
5431 | + clk_disable_unprepare(ao_cec->core); | ||
5432 | + | ||
5433 | out_probe_adapter: | ||
5434 | cec_delete_adapter(ao_cec->adap); | ||
5435 | |||
5436 | diff --git a/drivers/media/platform/qcom/venus/core.c b/drivers/media/platform/qcom/venus/core.c | ||
5437 | index e6eff512a8a1..84e982f259a0 100644 | ||
5438 | --- a/drivers/media/platform/qcom/venus/core.c | ||
5439 | +++ b/drivers/media/platform/qcom/venus/core.c | ||
5440 | @@ -427,10 +427,11 @@ static const struct venus_resources msm8916_res = { | ||
5441 | }; | ||
5442 | |||
5443 | static const struct freq_tbl msm8996_freq_table[] = { | ||
5444 | - { 1944000, 490000000 }, /* 4k UHD @ 60 */ | ||
5445 | - { 972000, 320000000 }, /* 4k UHD @ 30 */ | ||
5446 | - { 489600, 150000000 }, /* 1080p @ 60 */ | ||
5447 | - { 244800, 75000000 }, /* 1080p @ 30 */ | ||
5448 | + { 1944000, 520000000 }, /* 4k UHD @ 60 (decode only) */ | ||
5449 | + { 972000, 520000000 }, /* 4k UHD @ 30 */ | ||
5450 | + { 489600, 346666667 }, /* 1080p @ 60 */ | ||
5451 | + { 244800, 150000000 }, /* 1080p @ 30 */ | ||
5452 | + { 108000, 75000000 }, /* 720p @ 30 */ | ||
5453 | }; | ||
5454 | |||
5455 | static const struct reg_val msm8996_reg_preset[] = { | ||
5456 | diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c | ||
5457 | index 7129a2aea09a..0d8855014ab3 100644 | ||
5458 | --- a/drivers/media/platform/qcom/venus/hfi_venus.c | ||
5459 | +++ b/drivers/media/platform/qcom/venus/hfi_venus.c | ||
5460 | @@ -1472,6 +1472,7 @@ static int venus_suspend_3xx(struct venus_core *core) | ||
5461 | { | ||
5462 | struct venus_hfi_device *hdev = to_hfi_priv(core); | ||
5463 | struct device *dev = core->dev; | ||
5464 | + u32 ctrl_status; | ||
5465 | bool val; | ||
5466 | int ret; | ||
5467 | |||
5468 | @@ -1487,6 +1488,10 @@ static int venus_suspend_3xx(struct venus_core *core) | ||
5469 | return -EINVAL; | ||
5470 | } | ||
5471 | |||
5472 | + ctrl_status = venus_readl(hdev, CPU_CS_SCIACMDARG0); | ||
5473 | + if (ctrl_status & CPU_CS_SCIACMDARG0_PC_READY) | ||
5474 | + goto power_off; | ||
5475 | + | ||
5476 | /* | ||
5477 | * Power collapse sequence for Venus 3xx and 4xx versions: | ||
5478 | * 1. Check for ARM9 and video core to be idle by checking WFI bit | ||
5479 | @@ -1511,6 +1516,7 @@ static int venus_suspend_3xx(struct venus_core *core) | ||
5480 | if (ret) | ||
5481 | return ret; | ||
5482 | |||
5483 | +power_off: | ||
5484 | mutex_lock(&hdev->lock); | ||
5485 | |||
5486 | ret = venus_power_off(hdev); | ||
5487 | diff --git a/drivers/media/platform/rcar_drif.c b/drivers/media/platform/rcar_drif.c | ||
5488 | index 608e5217ccd5..0f267a237b42 100644 | ||
5489 | --- a/drivers/media/platform/rcar_drif.c | ||
5490 | +++ b/drivers/media/platform/rcar_drif.c | ||
5491 | @@ -912,6 +912,7 @@ static int rcar_drif_g_fmt_sdr_cap(struct file *file, void *priv, | ||
5492 | { | ||
5493 | struct rcar_drif_sdr *sdr = video_drvdata(file); | ||
5494 | |||
5495 | + memset(f->fmt.sdr.reserved, 0, sizeof(f->fmt.sdr.reserved)); | ||
5496 | f->fmt.sdr.pixelformat = sdr->fmt->pixelformat; | ||
5497 | f->fmt.sdr.buffersize = sdr->fmt->buffersize; | ||
5498 | |||
5499 | diff --git a/drivers/media/platform/seco-cec/seco-cec.c b/drivers/media/platform/seco-cec/seco-cec.c | ||
5500 | index 9cd60fe1867c..a86b6e8f9196 100644 | ||
5501 | --- a/drivers/media/platform/seco-cec/seco-cec.c | ||
5502 | +++ b/drivers/media/platform/seco-cec/seco-cec.c | ||
5503 | @@ -675,6 +675,7 @@ err_notifier: | ||
5504 | err_delete_adapter: | ||
5505 | cec_delete_adapter(secocec->cec_adap); | ||
5506 | err: | ||
5507 | + release_region(BRA_SMB_BASE_ADDR, 7); | ||
5508 | dev_err(dev, "%s device probe failed\n", dev_name(dev)); | ||
5509 | |||
5510 | return ret; | ||
5511 | diff --git a/drivers/media/platform/ti-vpe/vpdma.h b/drivers/media/platform/ti-vpe/vpdma.h | ||
5512 | index 28bc94129348..9bacfd603250 100644 | ||
5513 | --- a/drivers/media/platform/ti-vpe/vpdma.h | ||
5514 | +++ b/drivers/media/platform/ti-vpe/vpdma.h | ||
5515 | @@ -57,6 +57,7 @@ struct vpdma_data_format { | ||
5516 | * line stride of source and dest | ||
5517 | * buffers should be 16 byte aligned | ||
5518 | */ | ||
5519 | +#define VPDMA_MAX_STRIDE 65520 /* Max line stride 16 byte aligned */ | ||
5520 | #define VPDMA_DTD_DESC_SIZE 32 /* 8 words */ | ||
5521 | #define VPDMA_CFD_CTD_DESC_SIZE 16 /* 4 words */ | ||
5522 | |||
5523 | diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c | ||
5524 | index 60b575bb44c4..8b14ba4a3d9e 100644 | ||
5525 | --- a/drivers/media/platform/ti-vpe/vpe.c | ||
5526 | +++ b/drivers/media/platform/ti-vpe/vpe.c | ||
5527 | @@ -338,20 +338,25 @@ enum { | ||
5528 | }; | ||
5529 | |||
5530 | /* find our format description corresponding to the passed v4l2_format */ | ||
5531 | -static struct vpe_fmt *find_format(struct v4l2_format *f) | ||
5532 | +static struct vpe_fmt *__find_format(u32 fourcc) | ||
5533 | { | ||
5534 | struct vpe_fmt *fmt; | ||
5535 | unsigned int k; | ||
5536 | |||
5537 | for (k = 0; k < ARRAY_SIZE(vpe_formats); k++) { | ||
5538 | fmt = &vpe_formats[k]; | ||
5539 | - if (fmt->fourcc == f->fmt.pix.pixelformat) | ||
5540 | + if (fmt->fourcc == fourcc) | ||
5541 | return fmt; | ||
5542 | } | ||
5543 | |||
5544 | return NULL; | ||
5545 | } | ||
5546 | |||
5547 | +static struct vpe_fmt *find_format(struct v4l2_format *f) | ||
5548 | +{ | ||
5549 | + return __find_format(f->fmt.pix.pixelformat); | ||
5550 | +} | ||
5551 | + | ||
5552 | /* | ||
5553 | * there is one vpe_dev structure in the driver, it is shared by | ||
5554 | * all instances. | ||
5555 | @@ -1013,11 +1018,14 @@ static void add_out_dtd(struct vpe_ctx *ctx, int port) | ||
5556 | dma_addr_t dma_addr; | ||
5557 | u32 flags = 0; | ||
5558 | u32 offset = 0; | ||
5559 | + u32 stride; | ||
5560 | |||
5561 | if (port == VPE_PORT_MV_OUT) { | ||
5562 | vpdma_fmt = &vpdma_misc_fmts[VPDMA_DATA_FMT_MV]; | ||
5563 | dma_addr = ctx->mv_buf_dma[mv_buf_selector]; | ||
5564 | q_data = &ctx->q_data[Q_DATA_SRC]; | ||
5565 | + stride = ALIGN((q_data->width * vpdma_fmt->depth) >> 3, | ||
5566 | + VPDMA_STRIDE_ALIGN); | ||
5567 | } else { | ||
5568 | /* to incorporate interleaved formats */ | ||
5569 | int plane = fmt->coplanar ? p_data->vb_part : 0; | ||
5570 | @@ -1044,6 +1052,7 @@ static void add_out_dtd(struct vpe_ctx *ctx, int port) | ||
5571 | } | ||
5572 | /* Apply the offset */ | ||
5573 | dma_addr += offset; | ||
5574 | + stride = q_data->bytesperline[VPE_LUMA]; | ||
5575 | } | ||
5576 | |||
5577 | if (q_data->flags & Q_DATA_FRAME_1D) | ||
5578 | @@ -1055,7 +1064,7 @@ static void add_out_dtd(struct vpe_ctx *ctx, int port) | ||
5579 | MAX_W, MAX_H); | ||
5580 | |||
5581 | vpdma_add_out_dtd(&ctx->desc_list, q_data->width, | ||
5582 | - q_data->bytesperline[VPE_LUMA], &q_data->c_rect, | ||
5583 | + stride, &q_data->c_rect, | ||
5584 | vpdma_fmt, dma_addr, MAX_OUT_WIDTH_REG1, | ||
5585 | MAX_OUT_HEIGHT_REG1, p_data->channel, flags); | ||
5586 | } | ||
5587 | @@ -1074,10 +1083,13 @@ static void add_in_dtd(struct vpe_ctx *ctx, int port) | ||
5588 | dma_addr_t dma_addr; | ||
5589 | u32 flags = 0; | ||
5590 | u32 offset = 0; | ||
5591 | + u32 stride; | ||
5592 | |||
5593 | if (port == VPE_PORT_MV_IN) { | ||
5594 | vpdma_fmt = &vpdma_misc_fmts[VPDMA_DATA_FMT_MV]; | ||
5595 | dma_addr = ctx->mv_buf_dma[mv_buf_selector]; | ||
5596 | + stride = ALIGN((q_data->width * vpdma_fmt->depth) >> 3, | ||
5597 | + VPDMA_STRIDE_ALIGN); | ||
5598 | } else { | ||
5599 | /* to incorporate interleaved formats */ | ||
5600 | int plane = fmt->coplanar ? p_data->vb_part : 0; | ||
5601 | @@ -1104,6 +1116,7 @@ static void add_in_dtd(struct vpe_ctx *ctx, int port) | ||
5602 | } | ||
5603 | /* Apply the offset */ | ||
5604 | dma_addr += offset; | ||
5605 | + stride = q_data->bytesperline[VPE_LUMA]; | ||
5606 | |||
5607 | if (q_data->flags & Q_DATA_INTERLACED_SEQ_TB) { | ||
5608 | /* | ||
5609 | @@ -1139,10 +1152,10 @@ static void add_in_dtd(struct vpe_ctx *ctx, int port) | ||
5610 | if (p_data->vb_part && fmt->fourcc == V4L2_PIX_FMT_NV12) | ||
5611 | frame_height /= 2; | ||
5612 | |||
5613 | - vpdma_add_in_dtd(&ctx->desc_list, q_data->width, | ||
5614 | - q_data->bytesperline[VPE_LUMA], &q_data->c_rect, | ||
5615 | - vpdma_fmt, dma_addr, p_data->channel, field, flags, frame_width, | ||
5616 | - frame_height, 0, 0); | ||
5617 | + vpdma_add_in_dtd(&ctx->desc_list, q_data->width, stride, | ||
5618 | + &q_data->c_rect, vpdma_fmt, dma_addr, | ||
5619 | + p_data->channel, field, flags, frame_width, | ||
5620 | + frame_height, 0, 0); | ||
5621 | } | ||
5622 | |||
5623 | /* | ||
5624 | @@ -1391,9 +1404,6 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data) | ||
5625 | /* the previous dst mv buffer becomes the next src mv buffer */ | ||
5626 | ctx->src_mv_buf_selector = !ctx->src_mv_buf_selector; | ||
5627 | |||
5628 | - if (ctx->aborting) | ||
5629 | - goto finished; | ||
5630 | - | ||
5631 | s_vb = ctx->src_vbs[0]; | ||
5632 | d_vb = ctx->dst_vb; | ||
5633 | |||
5634 | @@ -1404,6 +1414,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data) | ||
5635 | d_vb->timecode = s_vb->timecode; | ||
5636 | |||
5637 | d_vb->sequence = ctx->sequence; | ||
5638 | + s_vb->sequence = ctx->sequence; | ||
5639 | |||
5640 | d_q_data = &ctx->q_data[Q_DATA_DST]; | ||
5641 | if (d_q_data->flags & Q_IS_INTERLACED) { | ||
5642 | @@ -1457,6 +1468,9 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data) | ||
5643 | ctx->src_vbs[0] = NULL; | ||
5644 | ctx->dst_vb = NULL; | ||
5645 | |||
5646 | + if (ctx->aborting) | ||
5647 | + goto finished; | ||
5648 | + | ||
5649 | ctx->bufs_completed++; | ||
5650 | if (ctx->bufs_completed < ctx->bufs_per_job && job_ready(ctx)) { | ||
5651 | device_run(ctx); | ||
5652 | @@ -1566,9 +1580,9 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f, | ||
5653 | unsigned int stride = 0; | ||
5654 | |||
5655 | if (!fmt || !(fmt->types & type)) { | ||
5656 | - vpe_err(ctx->dev, "Fourcc format (0x%08x) invalid.\n", | ||
5657 | + vpe_dbg(ctx->dev, "Fourcc format (0x%08x) invalid.\n", | ||
5658 | pix->pixelformat); | ||
5659 | - return -EINVAL; | ||
5660 | + fmt = __find_format(V4L2_PIX_FMT_YUYV); | ||
5661 | } | ||
5662 | |||
5663 | if (pix->field != V4L2_FIELD_NONE && pix->field != V4L2_FIELD_ALTERNATE | ||
5664 | @@ -1615,7 +1629,7 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f, | ||
5665 | &pix->height, MIN_H, MAX_H, H_ALIGN, | ||
5666 | S_ALIGN); | ||
5667 | |||
5668 | - if (!pix->num_planes) | ||
5669 | + if (!pix->num_planes || pix->num_planes > 2) | ||
5670 | pix->num_planes = fmt->coplanar ? 2 : 1; | ||
5671 | else if (pix->num_planes > 1 && !fmt->coplanar) | ||
5672 | pix->num_planes = 1; | ||
5673 | @@ -1654,6 +1668,10 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f, | ||
5674 | if (stride > plane_fmt->bytesperline) | ||
5675 | plane_fmt->bytesperline = stride; | ||
5676 | |||
5677 | + plane_fmt->bytesperline = clamp_t(u32, plane_fmt->bytesperline, | ||
5678 | + stride, | ||
5679 | + VPDMA_MAX_STRIDE); | ||
5680 | + | ||
5681 | plane_fmt->bytesperline = ALIGN(plane_fmt->bytesperline, | ||
5682 | VPDMA_STRIDE_ALIGN); | ||
5683 | |||
5684 | @@ -2274,7 +2292,7 @@ static int vpe_open(struct file *file) | ||
5685 | v4l2_ctrl_handler_setup(hdl); | ||
5686 | |||
5687 | s_q_data = &ctx->q_data[Q_DATA_SRC]; | ||
5688 | - s_q_data->fmt = &vpe_formats[2]; | ||
5689 | + s_q_data->fmt = __find_format(V4L2_PIX_FMT_YUYV); | ||
5690 | s_q_data->width = 1920; | ||
5691 | s_q_data->height = 1080; | ||
5692 | s_q_data->nplanes = 1; | ||
5693 | @@ -2352,6 +2370,12 @@ static int vpe_release(struct file *file) | ||
5694 | |||
5695 | mutex_lock(&dev->dev_mutex); | ||
5696 | free_mv_buffers(ctx); | ||
5697 | + | ||
5698 | + vpdma_unmap_desc_buf(dev->vpdma, &ctx->desc_list.buf); | ||
5699 | + vpdma_unmap_desc_buf(dev->vpdma, &ctx->mmr_adb); | ||
5700 | + vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_h); | ||
5701 | + vpdma_unmap_desc_buf(dev->vpdma, &ctx->sc_coeff_v); | ||
5702 | + | ||
5703 | vpdma_free_desc_list(&ctx->desc_list); | ||
5704 | vpdma_free_desc_buf(&ctx->mmr_adb); | ||
5705 | |||
5706 | diff --git a/drivers/media/platform/vicodec/vicodec-core.c b/drivers/media/platform/vicodec/vicodec-core.c | ||
5707 | index 0ee143ae0f6b..82350097503e 100644 | ||
5708 | --- a/drivers/media/platform/vicodec/vicodec-core.c | ||
5709 | +++ b/drivers/media/platform/vicodec/vicodec-core.c | ||
5710 | @@ -2139,6 +2139,9 @@ static void vicodec_v4l2_dev_release(struct v4l2_device *v4l2_dev) | ||
5711 | v4l2_m2m_release(dev->stateful_enc.m2m_dev); | ||
5712 | v4l2_m2m_release(dev->stateful_dec.m2m_dev); | ||
5713 | v4l2_m2m_release(dev->stateless_dec.m2m_dev); | ||
5714 | +#ifdef CONFIG_MEDIA_CONTROLLER | ||
5715 | + media_device_cleanup(&dev->mdev); | ||
5716 | +#endif | ||
5717 | kfree(dev); | ||
5718 | } | ||
5719 | |||
5720 | @@ -2250,7 +2253,6 @@ static int vicodec_remove(struct platform_device *pdev) | ||
5721 | v4l2_m2m_unregister_media_controller(dev->stateful_enc.m2m_dev); | ||
5722 | v4l2_m2m_unregister_media_controller(dev->stateful_dec.m2m_dev); | ||
5723 | v4l2_m2m_unregister_media_controller(dev->stateless_dec.m2m_dev); | ||
5724 | - media_device_cleanup(&dev->mdev); | ||
5725 | #endif | ||
5726 | |||
5727 | video_unregister_device(&dev->stateful_enc.vfd); | ||
5728 | diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c | ||
5729 | index acd3bd48c7e2..8d6b09623d88 100644 | ||
5730 | --- a/drivers/media/platform/vim2m.c | ||
5731 | +++ b/drivers/media/platform/vim2m.c | ||
5732 | @@ -1073,6 +1073,9 @@ static int vim2m_start_streaming(struct vb2_queue *q, unsigned int count) | ||
5733 | if (!q_data) | ||
5734 | return -EINVAL; | ||
5735 | |||
5736 | + if (V4L2_TYPE_IS_OUTPUT(q->type)) | ||
5737 | + ctx->aborting = 0; | ||
5738 | + | ||
5739 | q_data->sequence = 0; | ||
5740 | return 0; | ||
5741 | } | ||
5742 | @@ -1272,6 +1275,9 @@ static void vim2m_device_release(struct video_device *vdev) | ||
5743 | |||
5744 | v4l2_device_unregister(&dev->v4l2_dev); | ||
5745 | v4l2_m2m_release(dev->m2m_dev); | ||
5746 | +#ifdef CONFIG_MEDIA_CONTROLLER | ||
5747 | + media_device_cleanup(&dev->mdev); | ||
5748 | +#endif | ||
5749 | kfree(dev); | ||
5750 | } | ||
5751 | |||
5752 | @@ -1343,6 +1349,7 @@ static int vim2m_probe(struct platform_device *pdev) | ||
5753 | if (IS_ERR(dev->m2m_dev)) { | ||
5754 | v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem device\n"); | ||
5755 | ret = PTR_ERR(dev->m2m_dev); | ||
5756 | + dev->m2m_dev = NULL; | ||
5757 | goto error_dev; | ||
5758 | } | ||
5759 | |||
5760 | @@ -1395,7 +1402,6 @@ static int vim2m_remove(struct platform_device *pdev) | ||
5761 | #ifdef CONFIG_MEDIA_CONTROLLER | ||
5762 | media_device_unregister(&dev->mdev); | ||
5763 | v4l2_m2m_unregister_media_controller(dev->m2m_dev); | ||
5764 | - media_device_cleanup(&dev->mdev); | ||
5765 | #endif | ||
5766 | video_unregister_device(&dev->vfd); | ||
5767 | |||
5768 | diff --git a/drivers/media/platform/vimc/vimc-common.c b/drivers/media/platform/vimc/vimc-common.c | ||
5769 | index 7e1ae0b12f1e..a3120f4f7a90 100644 | ||
5770 | --- a/drivers/media/platform/vimc/vimc-common.c | ||
5771 | +++ b/drivers/media/platform/vimc/vimc-common.c | ||
5772 | @@ -375,7 +375,7 @@ int vimc_ent_sd_register(struct vimc_ent_device *ved, | ||
5773 | { | ||
5774 | int ret; | ||
5775 | |||
5776 | - /* Allocate the pads */ | ||
5777 | + /* Allocate the pads. Should be released from the sd_int_op release */ | ||
5778 | ved->pads = vimc_pads_init(num_pads, pads_flag); | ||
5779 | if (IS_ERR(ved->pads)) | ||
5780 | return PTR_ERR(ved->pads); | ||
5781 | @@ -424,7 +424,6 @@ EXPORT_SYMBOL_GPL(vimc_ent_sd_register); | ||
5782 | void vimc_ent_sd_unregister(struct vimc_ent_device *ved, struct v4l2_subdev *sd) | ||
5783 | { | ||
5784 | media_entity_cleanup(ved->ent); | ||
5785 | - vimc_pads_cleanup(ved->pads); | ||
5786 | v4l2_device_unregister_subdev(sd); | ||
5787 | } | ||
5788 | EXPORT_SYMBOL_GPL(vimc_ent_sd_unregister); | ||
5789 | diff --git a/drivers/media/platform/vimc/vimc-debayer.c b/drivers/media/platform/vimc/vimc-debayer.c | ||
5790 | index b72b8385067b..baafd9d7fb2c 100644 | ||
5791 | --- a/drivers/media/platform/vimc/vimc-debayer.c | ||
5792 | +++ b/drivers/media/platform/vimc/vimc-debayer.c | ||
5793 | @@ -484,6 +484,7 @@ static void vimc_deb_release(struct v4l2_subdev *sd) | ||
5794 | struct vimc_deb_device *vdeb = | ||
5795 | container_of(sd, struct vimc_deb_device, sd); | ||
5796 | |||
5797 | + vimc_pads_cleanup(vdeb->ved.pads); | ||
5798 | kfree(vdeb); | ||
5799 | } | ||
5800 | |||
5801 | diff --git a/drivers/media/platform/vimc/vimc-scaler.c b/drivers/media/platform/vimc/vimc-scaler.c | ||
5802 | index 49ab8d9dd9c9..c0d9f43d5777 100644 | ||
5803 | --- a/drivers/media/platform/vimc/vimc-scaler.c | ||
5804 | +++ b/drivers/media/platform/vimc/vimc-scaler.c | ||
5805 | @@ -343,6 +343,7 @@ static void vimc_sca_release(struct v4l2_subdev *sd) | ||
5806 | struct vimc_sca_device *vsca = | ||
5807 | container_of(sd, struct vimc_sca_device, sd); | ||
5808 | |||
5809 | + vimc_pads_cleanup(vsca->ved.pads); | ||
5810 | kfree(vsca); | ||
5811 | } | ||
5812 | |||
5813 | diff --git a/drivers/media/platform/vimc/vimc-sensor.c b/drivers/media/platform/vimc/vimc-sensor.c | ||
5814 | index 4a6a7e8e66c2..420573e5f6d6 100644 | ||
5815 | --- a/drivers/media/platform/vimc/vimc-sensor.c | ||
5816 | +++ b/drivers/media/platform/vimc/vimc-sensor.c | ||
5817 | @@ -292,6 +292,7 @@ static void vimc_sen_release(struct v4l2_subdev *sd) | ||
5818 | |||
5819 | v4l2_ctrl_handler_free(&vsen->hdl); | ||
5820 | tpg_free(&vsen->tpg); | ||
5821 | + vimc_pads_cleanup(vsen->ved.pads); | ||
5822 | kfree(vsen); | ||
5823 | } | ||
5824 | |||
5825 | diff --git a/drivers/media/platform/vivid/vivid-core.c b/drivers/media/platform/vivid/vivid-core.c | ||
5826 | index 53315c8dd2bb..f6a5cdbd74e7 100644 | ||
5827 | --- a/drivers/media/platform/vivid/vivid-core.c | ||
5828 | +++ b/drivers/media/platform/vivid/vivid-core.c | ||
5829 | @@ -616,6 +616,9 @@ static void vivid_dev_release(struct v4l2_device *v4l2_dev) | ||
5830 | |||
5831 | vivid_free_controls(dev); | ||
5832 | v4l2_device_unregister(&dev->v4l2_dev); | ||
5833 | +#ifdef CONFIG_MEDIA_CONTROLLER | ||
5834 | + media_device_cleanup(&dev->mdev); | ||
5835 | +#endif | ||
5836 | vfree(dev->scaled_line); | ||
5837 | vfree(dev->blended_line); | ||
5838 | vfree(dev->edid); | ||
5839 | @@ -1580,7 +1583,6 @@ static int vivid_remove(struct platform_device *pdev) | ||
5840 | |||
5841 | #ifdef CONFIG_MEDIA_CONTROLLER | ||
5842 | media_device_unregister(&dev->mdev); | ||
5843 | - media_device_cleanup(&dev->mdev); | ||
5844 | #endif | ||
5845 | |||
5846 | if (dev->has_vid_cap) { | ||
5847 | diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c b/drivers/media/radio/si470x/radio-si470x-i2c.c | ||
5848 | index 7541698a0be1..f491420d7b53 100644 | ||
5849 | --- a/drivers/media/radio/si470x/radio-si470x-i2c.c | ||
5850 | +++ b/drivers/media/radio/si470x/radio-si470x-i2c.c | ||
5851 | @@ -482,6 +482,8 @@ static int si470x_i2c_remove(struct i2c_client *client) | ||
5852 | if (radio->gpio_reset) | ||
5853 | gpiod_set_value(radio->gpio_reset, 0); | ||
5854 | |||
5855 | + v4l2_ctrl_handler_free(&radio->hdl); | ||
5856 | + v4l2_device_unregister(&radio->v4l2_dev); | ||
5857 | return 0; | ||
5858 | } | ||
5859 | |||
5860 | diff --git a/drivers/media/usb/b2c2/flexcop-usb.c b/drivers/media/usb/b2c2/flexcop-usb.c | ||
5861 | index 1a801dc286f8..d1331f828108 100644 | ||
5862 | --- a/drivers/media/usb/b2c2/flexcop-usb.c | ||
5863 | +++ b/drivers/media/usb/b2c2/flexcop-usb.c | ||
5864 | @@ -504,7 +504,13 @@ urb_error: | ||
5865 | static int flexcop_usb_init(struct flexcop_usb *fc_usb) | ||
5866 | { | ||
5867 | /* use the alternate setting with the larges buffer */ | ||
5868 | - usb_set_interface(fc_usb->udev,0,1); | ||
5869 | + int ret = usb_set_interface(fc_usb->udev, 0, 1); | ||
5870 | + | ||
5871 | + if (ret) { | ||
5872 | + err("set interface failed."); | ||
5873 | + return ret; | ||
5874 | + } | ||
5875 | + | ||
5876 | switch (fc_usb->udev->speed) { | ||
5877 | case USB_SPEED_LOW: | ||
5878 | err("cannot handle USB speed because it is too slow."); | ||
5879 | diff --git a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | ||
5880 | index a34717eba409..eaa08c7999d4 100644 | ||
5881 | --- a/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | ||
5882 | +++ b/drivers/media/usb/pvrusb2/pvrusb2-v4l2.c | ||
5883 | @@ -898,8 +898,12 @@ static void pvr2_v4l2_internal_check(struct pvr2_channel *chp) | ||
5884 | pvr2_v4l2_dev_disassociate_parent(vp->dev_video); | ||
5885 | pvr2_v4l2_dev_disassociate_parent(vp->dev_radio); | ||
5886 | if (!list_empty(&vp->dev_video->devbase.fh_list) || | ||
5887 | - !list_empty(&vp->dev_radio->devbase.fh_list)) | ||
5888 | + (vp->dev_radio && | ||
5889 | + !list_empty(&vp->dev_radio->devbase.fh_list))) { | ||
5890 | + pvr2_trace(PVR2_TRACE_STRUCT, | ||
5891 | + "pvr2_v4l2 internal_check exit-empty id=%p", vp); | ||
5892 | return; | ||
5893 | + } | ||
5894 | pvr2_v4l2_destroy_no_lock(vp); | ||
5895 | } | ||
5896 | |||
5897 | @@ -935,7 +939,8 @@ static int pvr2_v4l2_release(struct file *file) | ||
5898 | kfree(fhp); | ||
5899 | if (vp->channel.mc_head->disconnect_flag && | ||
5900 | list_empty(&vp->dev_video->devbase.fh_list) && | ||
5901 | - list_empty(&vp->dev_radio->devbase.fh_list)) { | ||
5902 | + (!vp->dev_radio || | ||
5903 | + list_empty(&vp->dev_radio->devbase.fh_list))) { | ||
5904 | pvr2_v4l2_destroy_no_lock(vp); | ||
5905 | } | ||
5906 | return 0; | ||
5907 | diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c | ||
5908 | index 1d8f38824631..cd84dbbf6a89 100644 | ||
5909 | --- a/drivers/media/v4l2-core/v4l2-ctrls.c | ||
5910 | +++ b/drivers/media/v4l2-core/v4l2-ctrls.c | ||
5911 | @@ -3144,6 +3144,7 @@ static void v4l2_ctrl_request_queue(struct media_request_object *obj) | ||
5912 | struct v4l2_ctrl_handler *prev_hdl = NULL; | ||
5913 | struct v4l2_ctrl_ref *ref_ctrl, *ref_ctrl_prev = NULL; | ||
5914 | |||
5915 | + mutex_lock(main_hdl->lock); | ||
5916 | if (list_empty(&main_hdl->requests_queued)) | ||
5917 | goto queue; | ||
5918 | |||
5919 | @@ -3175,18 +3176,22 @@ static void v4l2_ctrl_request_queue(struct media_request_object *obj) | ||
5920 | queue: | ||
5921 | list_add_tail(&hdl->requests_queued, &main_hdl->requests_queued); | ||
5922 | hdl->request_is_queued = true; | ||
5923 | + mutex_unlock(main_hdl->lock); | ||
5924 | } | ||
5925 | |||
5926 | static void v4l2_ctrl_request_unbind(struct media_request_object *obj) | ||
5927 | { | ||
5928 | struct v4l2_ctrl_handler *hdl = | ||
5929 | container_of(obj, struct v4l2_ctrl_handler, req_obj); | ||
5930 | + struct v4l2_ctrl_handler *main_hdl = obj->priv; | ||
5931 | |||
5932 | list_del_init(&hdl->requests); | ||
5933 | + mutex_lock(main_hdl->lock); | ||
5934 | if (hdl->request_is_queued) { | ||
5935 | list_del_init(&hdl->requests_queued); | ||
5936 | hdl->request_is_queued = false; | ||
5937 | } | ||
5938 | + mutex_unlock(main_hdl->lock); | ||
5939 | } | ||
5940 | |||
5941 | static void v4l2_ctrl_request_release(struct media_request_object *obj) | ||
5942 | @@ -4128,9 +4133,11 @@ void v4l2_ctrl_request_complete(struct media_request *req, | ||
5943 | v4l2_ctrl_unlock(ctrl); | ||
5944 | } | ||
5945 | |||
5946 | + mutex_lock(main_hdl->lock); | ||
5947 | WARN_ON(!hdl->request_is_queued); | ||
5948 | list_del_init(&hdl->requests_queued); | ||
5949 | hdl->request_is_queued = false; | ||
5950 | + mutex_unlock(main_hdl->lock); | ||
5951 | media_request_object_complete(obj); | ||
5952 | media_request_object_put(obj); | ||
5953 | } | ||
5954 | diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c | ||
5955 | index 51b912743f0f..21bb96ce4cd6 100644 | ||
5956 | --- a/drivers/media/v4l2-core/v4l2-ioctl.c | ||
5957 | +++ b/drivers/media/v4l2-core/v4l2-ioctl.c | ||
5958 | @@ -1466,10 +1466,26 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, | ||
5959 | return ret; | ||
5960 | } | ||
5961 | |||
5962 | +static void v4l_pix_format_touch(struct v4l2_pix_format *p) | ||
5963 | +{ | ||
5964 | + /* | ||
5965 | + * The v4l2_pix_format structure contains fields that make no sense for | ||
5966 | + * touch. Set them to default values in this case. | ||
5967 | + */ | ||
5968 | + | ||
5969 | + p->field = V4L2_FIELD_NONE; | ||
5970 | + p->colorspace = V4L2_COLORSPACE_RAW; | ||
5971 | + p->flags = 0; | ||
5972 | + p->ycbcr_enc = 0; | ||
5973 | + p->quantization = 0; | ||
5974 | + p->xfer_func = 0; | ||
5975 | +} | ||
5976 | + | ||
5977 | static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, | ||
5978 | struct file *file, void *fh, void *arg) | ||
5979 | { | ||
5980 | struct v4l2_format *p = arg; | ||
5981 | + struct video_device *vfd = video_devdata(file); | ||
5982 | int ret = check_fmt(file, p->type); | ||
5983 | |||
5984 | if (ret) | ||
5985 | @@ -1507,6 +1523,8 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, | ||
5986 | ret = ops->vidioc_g_fmt_vid_cap(file, fh, arg); | ||
5987 | /* just in case the driver zeroed it again */ | ||
5988 | p->fmt.pix.priv = V4L2_PIX_FMT_PRIV_MAGIC; | ||
5989 | + if (vfd->vfl_type == VFL_TYPE_TOUCH) | ||
5990 | + v4l_pix_format_touch(&p->fmt.pix); | ||
5991 | return ret; | ||
5992 | case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: | ||
5993 | return ops->vidioc_g_fmt_vid_cap_mplane(file, fh, arg); | ||
5994 | @@ -1544,21 +1562,6 @@ static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, | ||
5995 | return -EINVAL; | ||
5996 | } | ||
5997 | |||
5998 | -static void v4l_pix_format_touch(struct v4l2_pix_format *p) | ||
5999 | -{ | ||
6000 | - /* | ||
6001 | - * The v4l2_pix_format structure contains fields that make no sense for | ||
6002 | - * touch. Set them to default values in this case. | ||
6003 | - */ | ||
6004 | - | ||
6005 | - p->field = V4L2_FIELD_NONE; | ||
6006 | - p->colorspace = V4L2_COLORSPACE_RAW; | ||
6007 | - p->flags = 0; | ||
6008 | - p->ycbcr_enc = 0; | ||
6009 | - p->quantization = 0; | ||
6010 | - p->xfer_func = 0; | ||
6011 | -} | ||
6012 | - | ||
6013 | static int v4l_s_fmt(const struct v4l2_ioctl_ops *ops, | ||
6014 | struct file *file, void *fh, void *arg) | ||
6015 | { | ||
6016 | diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c | ||
6017 | index 1b1a794d639d..842f2210dc7e 100644 | ||
6018 | --- a/drivers/misc/fastrpc.c | ||
6019 | +++ b/drivers/misc/fastrpc.c | ||
6020 | @@ -1430,8 +1430,8 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev) | ||
6021 | return -ENOMEM; | ||
6022 | |||
6023 | data->miscdev.minor = MISC_DYNAMIC_MINOR; | ||
6024 | - data->miscdev.name = kasprintf(GFP_KERNEL, "fastrpc-%s", | ||
6025 | - domains[domain_id]); | ||
6026 | + data->miscdev.name = devm_kasprintf(rdev, GFP_KERNEL, "fastrpc-%s", | ||
6027 | + domains[domain_id]); | ||
6028 | data->miscdev.fops = &fastrpc_fops; | ||
6029 | err = misc_register(&data->miscdev); | ||
6030 | if (err) | ||
6031 | diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c | ||
6032 | index 2870c25da166..4d1b44de1492 100644 | ||
6033 | --- a/drivers/misc/ocxl/file.c | ||
6034 | +++ b/drivers/misc/ocxl/file.c | ||
6035 | @@ -18,18 +18,15 @@ static struct class *ocxl_class; | ||
6036 | static struct mutex minors_idr_lock; | ||
6037 | static struct idr minors_idr; | ||
6038 | |||
6039 | -static struct ocxl_file_info *find_file_info(dev_t devno) | ||
6040 | +static struct ocxl_file_info *find_and_get_file_info(dev_t devno) | ||
6041 | { | ||
6042 | struct ocxl_file_info *info; | ||
6043 | |||
6044 | - /* | ||
6045 | - * We don't declare an RCU critical section here, as our AFU | ||
6046 | - * is protected by a reference counter on the device. By the time the | ||
6047 | - * info reference is removed from the idr, the ref count of | ||
6048 | - * the device is already at 0, so no user API will access that AFU and | ||
6049 | - * this function can't return it. | ||
6050 | - */ | ||
6051 | + mutex_lock(&minors_idr_lock); | ||
6052 | info = idr_find(&minors_idr, MINOR(devno)); | ||
6053 | + if (info) | ||
6054 | + get_device(&info->dev); | ||
6055 | + mutex_unlock(&minors_idr_lock); | ||
6056 | return info; | ||
6057 | } | ||
6058 | |||
6059 | @@ -58,14 +55,16 @@ static int afu_open(struct inode *inode, struct file *file) | ||
6060 | |||
6061 | pr_debug("%s for device %x\n", __func__, inode->i_rdev); | ||
6062 | |||
6063 | - info = find_file_info(inode->i_rdev); | ||
6064 | + info = find_and_get_file_info(inode->i_rdev); | ||
6065 | if (!info) | ||
6066 | return -ENODEV; | ||
6067 | |||
6068 | rc = ocxl_context_alloc(&ctx, info->afu, inode->i_mapping); | ||
6069 | - if (rc) | ||
6070 | + if (rc) { | ||
6071 | + put_device(&info->dev); | ||
6072 | return rc; | ||
6073 | - | ||
6074 | + } | ||
6075 | + put_device(&info->dev); | ||
6076 | file->private_data = ctx; | ||
6077 | return 0; | ||
6078 | } | ||
6079 | @@ -487,7 +486,6 @@ static void info_release(struct device *dev) | ||
6080 | { | ||
6081 | struct ocxl_file_info *info = container_of(dev, struct ocxl_file_info, dev); | ||
6082 | |||
6083 | - free_minor(info); | ||
6084 | ocxl_afu_put(info->afu); | ||
6085 | kfree(info); | ||
6086 | } | ||
6087 | @@ -577,6 +575,7 @@ void ocxl_file_unregister_afu(struct ocxl_afu *afu) | ||
6088 | |||
6089 | ocxl_file_make_invisible(info); | ||
6090 | ocxl_sysfs_unregister_afu(info); | ||
6091 | + free_minor(info); | ||
6092 | device_unregister(&info->dev); | ||
6093 | } | ||
6094 | |||
6095 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c | ||
6096 | index 189e42674d85..010fe29a4888 100644 | ||
6097 | --- a/drivers/mmc/host/mtk-sd.c | ||
6098 | +++ b/drivers/mmc/host/mtk-sd.c | ||
6099 | @@ -228,6 +228,7 @@ | ||
6100 | #define MSDC_PATCH_BIT_SPCPUSH (0x1 << 29) /* RW */ | ||
6101 | #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ | ||
6102 | |||
6103 | +#define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ | ||
6104 | #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ | ||
6105 | |||
6106 | #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ | ||
6107 | @@ -1881,6 +1882,7 @@ static int hs400_tune_response(struct mmc_host *mmc, u32 opcode) | ||
6108 | |||
6109 | /* select EMMC50 PAD CMD tune */ | ||
6110 | sdr_set_bits(host->base + PAD_CMD_TUNE, BIT(0)); | ||
6111 | + sdr_set_field(host->base + MSDC_PATCH_BIT1, MSDC_PATCH_BIT1_CMDTA, 2); | ||
6112 | |||
6113 | if (mmc->ios.timing == MMC_TIMING_MMC_HS200 || | ||
6114 | mmc->ios.timing == MMC_TIMING_UHS_SDR104) | ||
6115 | diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c | ||
6116 | index b75c82d8d6c1..3d0bb5e2e09b 100644 | ||
6117 | --- a/drivers/mmc/host/sdhci-msm.c | ||
6118 | +++ b/drivers/mmc/host/sdhci-msm.c | ||
6119 | @@ -99,7 +99,7 @@ | ||
6120 | |||
6121 | #define CORE_PWRSAVE_DLL BIT(3) | ||
6122 | |||
6123 | -#define DDR_CONFIG_POR_VAL 0x80040853 | ||
6124 | +#define DDR_CONFIG_POR_VAL 0x80040873 | ||
6125 | |||
6126 | |||
6127 | #define INVALID_TUNING_PHASE -1 | ||
6128 | @@ -148,8 +148,9 @@ struct sdhci_msm_offset { | ||
6129 | u32 core_ddr_200_cfg; | ||
6130 | u32 core_vendor_spec3; | ||
6131 | u32 core_dll_config_2; | ||
6132 | + u32 core_dll_config_3; | ||
6133 | + u32 core_ddr_config_old; /* Applicable to sdcc minor ver < 0x49 */ | ||
6134 | u32 core_ddr_config; | ||
6135 | - u32 core_ddr_config_2; | ||
6136 | }; | ||
6137 | |||
6138 | static const struct sdhci_msm_offset sdhci_msm_v5_offset = { | ||
6139 | @@ -177,8 +178,8 @@ static const struct sdhci_msm_offset sdhci_msm_v5_offset = { | ||
6140 | .core_ddr_200_cfg = 0x224, | ||
6141 | .core_vendor_spec3 = 0x250, | ||
6142 | .core_dll_config_2 = 0x254, | ||
6143 | - .core_ddr_config = 0x258, | ||
6144 | - .core_ddr_config_2 = 0x25c, | ||
6145 | + .core_dll_config_3 = 0x258, | ||
6146 | + .core_ddr_config = 0x25c, | ||
6147 | }; | ||
6148 | |||
6149 | static const struct sdhci_msm_offset sdhci_msm_mci_offset = { | ||
6150 | @@ -207,8 +208,8 @@ static const struct sdhci_msm_offset sdhci_msm_mci_offset = { | ||
6151 | .core_ddr_200_cfg = 0x184, | ||
6152 | .core_vendor_spec3 = 0x1b0, | ||
6153 | .core_dll_config_2 = 0x1b4, | ||
6154 | - .core_ddr_config = 0x1b8, | ||
6155 | - .core_ddr_config_2 = 0x1bc, | ||
6156 | + .core_ddr_config_old = 0x1b8, | ||
6157 | + .core_ddr_config = 0x1bc, | ||
6158 | }; | ||
6159 | |||
6160 | struct sdhci_msm_variant_ops { | ||
6161 | @@ -253,6 +254,7 @@ struct sdhci_msm_host { | ||
6162 | const struct sdhci_msm_offset *offset; | ||
6163 | bool use_cdr; | ||
6164 | u32 transfer_mode; | ||
6165 | + bool updated_ddr_cfg; | ||
6166 | }; | ||
6167 | |||
6168 | static const struct sdhci_msm_offset *sdhci_priv_msm_offset(struct sdhci_host *host) | ||
6169 | @@ -924,8 +926,10 @@ out: | ||
6170 | static int sdhci_msm_cm_dll_sdc4_calibration(struct sdhci_host *host) | ||
6171 | { | ||
6172 | struct mmc_host *mmc = host->mmc; | ||
6173 | - u32 dll_status, config; | ||
6174 | + u32 dll_status, config, ddr_cfg_offset; | ||
6175 | int ret; | ||
6176 | + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); | ||
6177 | + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); | ||
6178 | const struct sdhci_msm_offset *msm_offset = | ||
6179 | sdhci_priv_msm_offset(host); | ||
6180 | |||
6181 | @@ -938,8 +942,11 @@ static int sdhci_msm_cm_dll_sdc4_calibration(struct sdhci_host *host) | ||
6182 | * bootloaders. In the future, if this changes, then the desired | ||
6183 | * values will need to be programmed appropriately. | ||
6184 | */ | ||
6185 | - writel_relaxed(DDR_CONFIG_POR_VAL, host->ioaddr + | ||
6186 | - msm_offset->core_ddr_config); | ||
6187 | + if (msm_host->updated_ddr_cfg) | ||
6188 | + ddr_cfg_offset = msm_offset->core_ddr_config; | ||
6189 | + else | ||
6190 | + ddr_cfg_offset = msm_offset->core_ddr_config_old; | ||
6191 | + writel_relaxed(DDR_CONFIG_POR_VAL, host->ioaddr + ddr_cfg_offset); | ||
6192 | |||
6193 | if (mmc->ios.enhanced_strobe) { | ||
6194 | config = readl_relaxed(host->ioaddr + | ||
6195 | @@ -1899,6 +1906,9 @@ static int sdhci_msm_probe(struct platform_device *pdev) | ||
6196 | msm_offset->core_vendor_spec_capabilities0); | ||
6197 | } | ||
6198 | |||
6199 | + if (core_major == 1 && core_minor >= 0x49) | ||
6200 | + msm_host->updated_ddr_cfg = true; | ||
6201 | + | ||
6202 | /* | ||
6203 | * Power on reset state may trigger power irq if previous status of | ||
6204 | * PWRCTL was either BUS_ON or IO_HIGH_V. So before enabling pwr irq | ||
6205 | diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c | ||
6206 | index 1d1953dfc54b..889ed98ec0e7 100644 | ||
6207 | --- a/drivers/mmc/host/sdhci-of-esdhc.c | ||
6208 | +++ b/drivers/mmc/host/sdhci-of-esdhc.c | ||
6209 | @@ -710,9 +710,6 @@ static void esdhc_reset(struct sdhci_host *host, u8 mask) | ||
6210 | sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); | ||
6211 | sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); | ||
6212 | |||
6213 | - if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) | ||
6214 | - mdelay(5); | ||
6215 | - | ||
6216 | if (mask & SDHCI_RESET_ALL) { | ||
6217 | val = sdhci_readl(host, ESDHC_TBCTL); | ||
6218 | val &= ~ESDHC_TB_EN; | ||
6219 | @@ -1126,8 +1123,8 @@ static int sdhci_esdhc_probe(struct platform_device *pdev) | ||
6220 | host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ; | ||
6221 | |||
6222 | if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) { | ||
6223 | - host->quirks2 |= SDHCI_QUIRK_RESET_AFTER_REQUEST; | ||
6224 | - host->quirks2 |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; | ||
6225 | + host->quirks |= SDHCI_QUIRK_RESET_AFTER_REQUEST; | ||
6226 | + host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL; | ||
6227 | } | ||
6228 | |||
6229 | if (of_device_is_compatible(np, "fsl,p5040-esdhc") || | ||
6230 | diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c | ||
6231 | index eaffa85bc728..642a9667db4d 100644 | ||
6232 | --- a/drivers/mmc/host/sdhci-pci-core.c | ||
6233 | +++ b/drivers/mmc/host/sdhci-pci-core.c | ||
6234 | @@ -26,6 +26,7 @@ | ||
6235 | #include <linux/mmc/slot-gpio.h> | ||
6236 | #include <linux/mmc/sdhci-pci-data.h> | ||
6237 | #include <linux/acpi.h> | ||
6238 | +#include <linux/dmi.h> | ||
6239 | |||
6240 | #ifdef CONFIG_X86 | ||
6241 | #include <asm/iosf_mbi.h> | ||
6242 | @@ -782,11 +783,18 @@ static int byt_emmc_probe_slot(struct sdhci_pci_slot *slot) | ||
6243 | return 0; | ||
6244 | } | ||
6245 | |||
6246 | +static bool glk_broken_cqhci(struct sdhci_pci_slot *slot) | ||
6247 | +{ | ||
6248 | + return slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_GLK_EMMC && | ||
6249 | + dmi_match(DMI_BIOS_VENDOR, "LENOVO"); | ||
6250 | +} | ||
6251 | + | ||
6252 | static int glk_emmc_probe_slot(struct sdhci_pci_slot *slot) | ||
6253 | { | ||
6254 | int ret = byt_emmc_probe_slot(slot); | ||
6255 | |||
6256 | - slot->host->mmc->caps2 |= MMC_CAP2_CQE; | ||
6257 | + if (!glk_broken_cqhci(slot)) | ||
6258 | + slot->host->mmc->caps2 |= MMC_CAP2_CQE; | ||
6259 | |||
6260 | if (slot->chip->pdev->device != PCI_DEVICE_ID_INTEL_GLK_EMMC) { | ||
6261 | slot->host->mmc->caps2 |= MMC_CAP2_HS400_ES, | ||
6262 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
6263 | index b056400e34b1..5f9df2dbde06 100644 | ||
6264 | --- a/drivers/mmc/host/sdhci.c | ||
6265 | +++ b/drivers/mmc/host/sdhci.c | ||
6266 | @@ -1871,9 +1871,7 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing) | ||
6267 | ctrl_2 |= SDHCI_CTRL_UHS_SDR104; | ||
6268 | else if (timing == MMC_TIMING_UHS_SDR12) | ||
6269 | ctrl_2 |= SDHCI_CTRL_UHS_SDR12; | ||
6270 | - else if (timing == MMC_TIMING_SD_HS || | ||
6271 | - timing == MMC_TIMING_MMC_HS || | ||
6272 | - timing == MMC_TIMING_UHS_SDR25) | ||
6273 | + else if (timing == MMC_TIMING_UHS_SDR25) | ||
6274 | ctrl_2 |= SDHCI_CTRL_UHS_SDR25; | ||
6275 | else if (timing == MMC_TIMING_UHS_SDR50) | ||
6276 | ctrl_2 |= SDHCI_CTRL_UHS_SDR50; | ||
6277 | @@ -2408,8 +2406,8 @@ static int __sdhci_execute_tuning(struct sdhci_host *host, u32 opcode) | ||
6278 | sdhci_send_tuning(host, opcode); | ||
6279 | |||
6280 | if (!host->tuning_done) { | ||
6281 | - pr_info("%s: Tuning timeout, falling back to fixed sampling clock\n", | ||
6282 | - mmc_hostname(host->mmc)); | ||
6283 | + pr_debug("%s: Tuning timeout, falling back to fixed sampling clock\n", | ||
6284 | + mmc_hostname(host->mmc)); | ||
6285 | sdhci_abort_tuning(host, opcode); | ||
6286 | return -ETIMEDOUT; | ||
6287 | } | ||
6288 | @@ -3758,6 +3756,9 @@ int sdhci_setup_host(struct sdhci_host *host) | ||
6289 | mmc_hostname(mmc), host->version); | ||
6290 | } | ||
6291 | |||
6292 | + if (host->quirks & SDHCI_QUIRK_BROKEN_CQE) | ||
6293 | + mmc->caps2 &= ~MMC_CAP2_CQE; | ||
6294 | + | ||
6295 | if (host->quirks & SDHCI_QUIRK_FORCE_DMA) | ||
6296 | host->flags |= SDHCI_USE_SDMA; | ||
6297 | else if (!(host->caps & SDHCI_CAN_DO_SDMA)) | ||
6298 | diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h | ||
6299 | index 0ed3e0eaef5f..fe83ece6965b 100644 | ||
6300 | --- a/drivers/mmc/host/sdhci.h | ||
6301 | +++ b/drivers/mmc/host/sdhci.h | ||
6302 | @@ -409,6 +409,8 @@ struct sdhci_host { | ||
6303 | #define SDHCI_QUIRK_BROKEN_CARD_DETECTION (1<<15) | ||
6304 | /* Controller reports inverted write-protect state */ | ||
6305 | #define SDHCI_QUIRK_INVERTED_WRITE_PROTECT (1<<16) | ||
6306 | +/* Controller has unusable command queue engine */ | ||
6307 | +#define SDHCI_QUIRK_BROKEN_CQE (1<<17) | ||
6308 | /* Controller does not like fast PIO transfers */ | ||
6309 | #define SDHCI_QUIRK_PIO_NEEDS_DELAY (1<<18) | ||
6310 | /* Controller does not have a LED */ | ||
6311 | diff --git a/drivers/mmc/host/tmio_mmc_core.c b/drivers/mmc/host/tmio_mmc_core.c | ||
6312 | index 9b6e1001e77c..dec5a99f52cf 100644 | ||
6313 | --- a/drivers/mmc/host/tmio_mmc_core.c | ||
6314 | +++ b/drivers/mmc/host/tmio_mmc_core.c | ||
6315 | @@ -1184,7 +1184,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host) | ||
6316 | if (ret == -EPROBE_DEFER) | ||
6317 | return ret; | ||
6318 | |||
6319 | - mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities; | ||
6320 | + mmc->caps |= MMC_CAP_ERASE | MMC_CAP_4_BIT_DATA | pdata->capabilities; | ||
6321 | mmc->caps2 |= pdata->capabilities2; | ||
6322 | mmc->max_segs = pdata->max_segs ? : 32; | ||
6323 | mmc->max_blk_size = TMIO_MAX_BLK_SIZE; | ||
6324 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
6325 | index 62f65573eb04..face00c622ed 100644 | ||
6326 | --- a/drivers/net/bonding/bond_main.c | ||
6327 | +++ b/drivers/net/bonding/bond_main.c | ||
6328 | @@ -3612,32 +3612,35 @@ static int bond_neigh_init(struct neighbour *n) | ||
6329 | const struct net_device_ops *slave_ops; | ||
6330 | struct neigh_parms parms; | ||
6331 | struct slave *slave; | ||
6332 | - int ret; | ||
6333 | + int ret = 0; | ||
6334 | |||
6335 | - slave = bond_first_slave(bond); | ||
6336 | + rcu_read_lock(); | ||
6337 | + slave = bond_first_slave_rcu(bond); | ||
6338 | if (!slave) | ||
6339 | - return 0; | ||
6340 | + goto out; | ||
6341 | slave_ops = slave->dev->netdev_ops; | ||
6342 | if (!slave_ops->ndo_neigh_setup) | ||
6343 | - return 0; | ||
6344 | - | ||
6345 | - parms.neigh_setup = NULL; | ||
6346 | - parms.neigh_cleanup = NULL; | ||
6347 | - ret = slave_ops->ndo_neigh_setup(slave->dev, &parms); | ||
6348 | - if (ret) | ||
6349 | - return ret; | ||
6350 | + goto out; | ||
6351 | |||
6352 | - /* Assign slave's neigh_cleanup to neighbour in case cleanup is called | ||
6353 | - * after the last slave has been detached. Assumes that all slaves | ||
6354 | - * utilize the same neigh_cleanup (true at this writing as only user | ||
6355 | - * is ipoib). | ||
6356 | + /* TODO: find another way [1] to implement this. | ||
6357 | + * Passing a zeroed structure is fragile, | ||
6358 | + * but at least we do not pass garbage. | ||
6359 | + * | ||
6360 | + * [1] One way would be that ndo_neigh_setup() never touch | ||
6361 | + * struct neigh_parms, but propagate the new neigh_setup() | ||
6362 | + * back to ___neigh_create() / neigh_parms_alloc() | ||
6363 | */ | ||
6364 | - n->parms->neigh_cleanup = parms.neigh_cleanup; | ||
6365 | + memset(&parms, 0, sizeof(parms)); | ||
6366 | + ret = slave_ops->ndo_neigh_setup(slave->dev, &parms); | ||
6367 | |||
6368 | - if (!parms.neigh_setup) | ||
6369 | - return 0; | ||
6370 | + if (ret) | ||
6371 | + goto out; | ||
6372 | |||
6373 | - return parms.neigh_setup(n); | ||
6374 | + if (parms.neigh_setup) | ||
6375 | + ret = parms.neigh_setup(n); | ||
6376 | +out: | ||
6377 | + rcu_read_unlock(); | ||
6378 | + return ret; | ||
6379 | } | ||
6380 | |||
6381 | /* The bonding ndo_neigh_setup is called at init time beofre any | ||
6382 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c | ||
6383 | index 57f9a2f51085..e5c207ad3c77 100644 | ||
6384 | --- a/drivers/net/can/flexcan.c | ||
6385 | +++ b/drivers/net/can/flexcan.c | ||
6386 | @@ -389,6 +389,34 @@ static struct flexcan_mb __iomem *flexcan_get_mb(const struct flexcan_priv *priv | ||
6387 | (&priv->regs->mb[bank][priv->mb_size * mb_index]); | ||
6388 | } | ||
6389 | |||
6390 | +static int flexcan_low_power_enter_ack(struct flexcan_priv *priv) | ||
6391 | +{ | ||
6392 | + struct flexcan_regs __iomem *regs = priv->regs; | ||
6393 | + unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
6394 | + | ||
6395 | + while (timeout-- && !(priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6396 | + udelay(10); | ||
6397 | + | ||
6398 | + if (!(priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6399 | + return -ETIMEDOUT; | ||
6400 | + | ||
6401 | + return 0; | ||
6402 | +} | ||
6403 | + | ||
6404 | +static int flexcan_low_power_exit_ack(struct flexcan_priv *priv) | ||
6405 | +{ | ||
6406 | + struct flexcan_regs __iomem *regs = priv->regs; | ||
6407 | + unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
6408 | + | ||
6409 | + while (timeout-- && (priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6410 | + udelay(10); | ||
6411 | + | ||
6412 | + if (priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK) | ||
6413 | + return -ETIMEDOUT; | ||
6414 | + | ||
6415 | + return 0; | ||
6416 | +} | ||
6417 | + | ||
6418 | static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable) | ||
6419 | { | ||
6420 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6421 | @@ -407,7 +435,6 @@ static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable) | ||
6422 | static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv) | ||
6423 | { | ||
6424 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6425 | - unsigned int ackval; | ||
6426 | u32 reg_mcr; | ||
6427 | |||
6428 | reg_mcr = priv->read(®s->mcr); | ||
6429 | @@ -418,36 +445,24 @@ static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv) | ||
6430 | regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, | ||
6431 | 1 << priv->stm.req_bit, 1 << priv->stm.req_bit); | ||
6432 | |||
6433 | - /* get stop acknowledgment */ | ||
6434 | - if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, | ||
6435 | - ackval, ackval & (1 << priv->stm.ack_bit), | ||
6436 | - 0, FLEXCAN_TIMEOUT_US)) | ||
6437 | - return -ETIMEDOUT; | ||
6438 | - | ||
6439 | - return 0; | ||
6440 | + return flexcan_low_power_enter_ack(priv); | ||
6441 | } | ||
6442 | |||
6443 | static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv) | ||
6444 | { | ||
6445 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6446 | - unsigned int ackval; | ||
6447 | u32 reg_mcr; | ||
6448 | |||
6449 | /* remove stop request */ | ||
6450 | regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, | ||
6451 | 1 << priv->stm.req_bit, 0); | ||
6452 | |||
6453 | - /* get stop acknowledgment */ | ||
6454 | - if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, | ||
6455 | - ackval, !(ackval & (1 << priv->stm.ack_bit)), | ||
6456 | - 0, FLEXCAN_TIMEOUT_US)) | ||
6457 | - return -ETIMEDOUT; | ||
6458 | |||
6459 | reg_mcr = priv->read(®s->mcr); | ||
6460 | reg_mcr &= ~FLEXCAN_MCR_SLF_WAK; | ||
6461 | priv->write(reg_mcr, ®s->mcr); | ||
6462 | |||
6463 | - return 0; | ||
6464 | + return flexcan_low_power_exit_ack(priv); | ||
6465 | } | ||
6466 | |||
6467 | static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv) | ||
6468 | @@ -506,39 +521,25 @@ static inline int flexcan_transceiver_disable(const struct flexcan_priv *priv) | ||
6469 | static int flexcan_chip_enable(struct flexcan_priv *priv) | ||
6470 | { | ||
6471 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6472 | - unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
6473 | u32 reg; | ||
6474 | |||
6475 | reg = priv->read(®s->mcr); | ||
6476 | reg &= ~FLEXCAN_MCR_MDIS; | ||
6477 | priv->write(reg, ®s->mcr); | ||
6478 | |||
6479 | - while (timeout-- && (priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6480 | - udelay(10); | ||
6481 | - | ||
6482 | - if (priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK) | ||
6483 | - return -ETIMEDOUT; | ||
6484 | - | ||
6485 | - return 0; | ||
6486 | + return flexcan_low_power_exit_ack(priv); | ||
6487 | } | ||
6488 | |||
6489 | static int flexcan_chip_disable(struct flexcan_priv *priv) | ||
6490 | { | ||
6491 | struct flexcan_regs __iomem *regs = priv->regs; | ||
6492 | - unsigned int timeout = FLEXCAN_TIMEOUT_US / 10; | ||
6493 | u32 reg; | ||
6494 | |||
6495 | reg = priv->read(®s->mcr); | ||
6496 | reg |= FLEXCAN_MCR_MDIS; | ||
6497 | priv->write(reg, ®s->mcr); | ||
6498 | |||
6499 | - while (timeout-- && !(priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6500 | - udelay(10); | ||
6501 | - | ||
6502 | - if (!(priv->read(®s->mcr) & FLEXCAN_MCR_LPM_ACK)) | ||
6503 | - return -ETIMEDOUT; | ||
6504 | - | ||
6505 | - return 0; | ||
6506 | + return flexcan_low_power_enter_ack(priv); | ||
6507 | } | ||
6508 | |||
6509 | static int flexcan_chip_freeze(struct flexcan_priv *priv) | ||
6510 | @@ -1703,6 +1704,9 @@ static int __maybe_unused flexcan_resume(struct device *device) | ||
6511 | netif_start_queue(dev); | ||
6512 | if (device_may_wakeup(device)) { | ||
6513 | disable_irq_wake(dev->irq); | ||
6514 | + err = flexcan_exit_stop_mode(priv); | ||
6515 | + if (err) | ||
6516 | + return err; | ||
6517 | } else { | ||
6518 | err = pm_runtime_force_resume(device); | ||
6519 | if (err) | ||
6520 | @@ -1748,14 +1752,9 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device) | ||
6521 | { | ||
6522 | struct net_device *dev = dev_get_drvdata(device); | ||
6523 | struct flexcan_priv *priv = netdev_priv(dev); | ||
6524 | - int err; | ||
6525 | |||
6526 | - if (netif_running(dev) && device_may_wakeup(device)) { | ||
6527 | + if (netif_running(dev) && device_may_wakeup(device)) | ||
6528 | flexcan_enable_wakeup_irq(priv, false); | ||
6529 | - err = flexcan_exit_stop_mode(priv); | ||
6530 | - if (err) | ||
6531 | - return err; | ||
6532 | - } | ||
6533 | |||
6534 | return 0; | ||
6535 | } | ||
6536 | diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c | ||
6537 | index 3db619209fe1..d5d4bfa9c8fd 100644 | ||
6538 | --- a/drivers/net/can/m_can/tcan4x5x.c | ||
6539 | +++ b/drivers/net/can/m_can/tcan4x5x.c | ||
6540 | @@ -354,6 +354,8 @@ static int tcan4x5x_parse_config(struct m_can_classdev *cdev) | ||
6541 | if (IS_ERR(tcan4x5x->reset_gpio)) | ||
6542 | tcan4x5x->reset_gpio = NULL; | ||
6543 | |||
6544 | + usleep_range(700, 1000); | ||
6545 | + | ||
6546 | tcan4x5x->device_state_gpio = devm_gpiod_get_optional(cdev->dev, | ||
6547 | "device-state", | ||
6548 | GPIOD_IN); | ||
6549 | diff --git a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
6550 | index 07d2f3aa2c02..ae4c37e1bb75 100644 | ||
6551 | --- a/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
6552 | +++ b/drivers/net/can/usb/kvaser_usb/kvaser_usb_leaf.c | ||
6553 | @@ -608,7 +608,7 @@ static int kvaser_usb_leaf_simple_cmd_async(struct kvaser_usb_net_priv *priv, | ||
6554 | struct kvaser_cmd *cmd; | ||
6555 | int err; | ||
6556 | |||
6557 | - cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC); | ||
6558 | + cmd = kzalloc(sizeof(*cmd), GFP_ATOMIC); | ||
6559 | if (!cmd) | ||
6560 | return -ENOMEM; | ||
6561 | |||
6562 | @@ -1140,7 +1140,7 @@ static int kvaser_usb_leaf_set_opt_mode(const struct kvaser_usb_net_priv *priv) | ||
6563 | struct kvaser_cmd *cmd; | ||
6564 | int rc; | ||
6565 | |||
6566 | - cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); | ||
6567 | + cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | ||
6568 | if (!cmd) | ||
6569 | return -ENOMEM; | ||
6570 | |||
6571 | @@ -1206,7 +1206,7 @@ static int kvaser_usb_leaf_flush_queue(struct kvaser_usb_net_priv *priv) | ||
6572 | struct kvaser_cmd *cmd; | ||
6573 | int rc; | ||
6574 | |||
6575 | - cmd = kmalloc(sizeof(*cmd), GFP_KERNEL); | ||
6576 | + cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); | ||
6577 | if (!cmd) | ||
6578 | return -ENOMEM; | ||
6579 | |||
6580 | diff --git a/drivers/net/can/xilinx_can.c b/drivers/net/can/xilinx_can.c | ||
6581 | index 7c482b2d78d2..2be846ee627d 100644 | ||
6582 | --- a/drivers/net/can/xilinx_can.c | ||
6583 | +++ b/drivers/net/can/xilinx_can.c | ||
6584 | @@ -60,6 +60,8 @@ enum xcan_reg { | ||
6585 | XCAN_TXMSG_BASE_OFFSET = 0x0100, /* TX Message Space */ | ||
6586 | XCAN_RXMSG_BASE_OFFSET = 0x1100, /* RX Message Space */ | ||
6587 | XCAN_RXMSG_2_BASE_OFFSET = 0x2100, /* RX Message Space */ | ||
6588 | + XCAN_AFR_2_MASK_OFFSET = 0x0A00, /* Acceptance Filter MASK */ | ||
6589 | + XCAN_AFR_2_ID_OFFSET = 0x0A04, /* Acceptance Filter ID */ | ||
6590 | }; | ||
6591 | |||
6592 | #define XCAN_FRAME_ID_OFFSET(frame_base) ((frame_base) + 0x00) | ||
6593 | @@ -1803,6 +1805,11 @@ static int xcan_probe(struct platform_device *pdev) | ||
6594 | |||
6595 | pm_runtime_put(&pdev->dev); | ||
6596 | |||
6597 | + if (priv->devtype.flags & XCAN_FLAG_CANFD_2) { | ||
6598 | + priv->write_reg(priv, XCAN_AFR_2_ID_OFFSET, 0x00000000); | ||
6599 | + priv->write_reg(priv, XCAN_AFR_2_MASK_OFFSET, 0x00000000); | ||
6600 | + } | ||
6601 | + | ||
6602 | netdev_dbg(ndev, "reg_base=0x%p irq=%d clock=%d, tx buffers: actual %d, using %d\n", | ||
6603 | priv->reg_base, ndev->irq, priv->can.clock.freq, | ||
6604 | hw_tx_max, priv->tx_max); | ||
6605 | diff --git a/drivers/net/dsa/Kconfig b/drivers/net/dsa/Kconfig | ||
6606 | index f6232ce8481f..685e12b05a7c 100644 | ||
6607 | --- a/drivers/net/dsa/Kconfig | ||
6608 | +++ b/drivers/net/dsa/Kconfig | ||
6609 | @@ -77,6 +77,7 @@ config NET_DSA_REALTEK_SMI | ||
6610 | config NET_DSA_SMSC_LAN9303 | ||
6611 | tristate | ||
6612 | select NET_DSA_TAG_LAN9303 | ||
6613 | + select REGMAP | ||
6614 | ---help--- | ||
6615 | This enables support for the SMSC/Microchip LAN9303 3 port ethernet | ||
6616 | switch chips. | ||
6617 | diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c | ||
6618 | index cc3536315eff..a7132c1593c3 100644 | ||
6619 | --- a/drivers/net/dsa/b53/b53_common.c | ||
6620 | +++ b/drivers/net/dsa/b53/b53_common.c | ||
6621 | @@ -347,7 +347,7 @@ static void b53_set_forwarding(struct b53_device *dev, int enable) | ||
6622 | * frames should be flooded or not. | ||
6623 | */ | ||
6624 | b53_read8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, &mgmt); | ||
6625 | - mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN; | ||
6626 | + mgmt |= B53_UC_FWD_EN | B53_MC_FWD_EN | B53_IPMC_FWD_EN; | ||
6627 | b53_write8(dev, B53_CTRL_PAGE, B53_IP_MULTICAST_CTRL, mgmt); | ||
6628 | } | ||
6629 | |||
6630 | @@ -526,6 +526,8 @@ int b53_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy) | ||
6631 | |||
6632 | cpu_port = ds->ports[port].cpu_dp->index; | ||
6633 | |||
6634 | + b53_br_egress_floods(ds, port, true, true); | ||
6635 | + | ||
6636 | if (dev->ops->irq_enable) | ||
6637 | ret = dev->ops->irq_enable(dev, port); | ||
6638 | if (ret) | ||
6639 | @@ -641,6 +643,8 @@ static void b53_enable_cpu_port(struct b53_device *dev, int port) | ||
6640 | b53_write8(dev, B53_CTRL_PAGE, B53_PORT_CTRL(port), port_ctrl); | ||
6641 | |||
6642 | b53_brcm_hdr_setup(dev->ds, port); | ||
6643 | + | ||
6644 | + b53_br_egress_floods(dev->ds, port, true, true); | ||
6645 | } | ||
6646 | |||
6647 | static void b53_enable_mib(struct b53_device *dev) | ||
6648 | @@ -1766,19 +1770,26 @@ int b53_br_egress_floods(struct dsa_switch *ds, int port, | ||
6649 | struct b53_device *dev = ds->priv; | ||
6650 | u16 uc, mc; | ||
6651 | |||
6652 | - b53_read16(dev, B53_CTRL_PAGE, B53_UC_FWD_EN, &uc); | ||
6653 | + b53_read16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, &uc); | ||
6654 | if (unicast) | ||
6655 | uc |= BIT(port); | ||
6656 | else | ||
6657 | uc &= ~BIT(port); | ||
6658 | - b53_write16(dev, B53_CTRL_PAGE, B53_UC_FWD_EN, uc); | ||
6659 | + b53_write16(dev, B53_CTRL_PAGE, B53_UC_FLOOD_MASK, uc); | ||
6660 | + | ||
6661 | + b53_read16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, &mc); | ||
6662 | + if (multicast) | ||
6663 | + mc |= BIT(port); | ||
6664 | + else | ||
6665 | + mc &= ~BIT(port); | ||
6666 | + b53_write16(dev, B53_CTRL_PAGE, B53_MC_FLOOD_MASK, mc); | ||
6667 | |||
6668 | - b53_read16(dev, B53_CTRL_PAGE, B53_MC_FWD_EN, &mc); | ||
6669 | + b53_read16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, &mc); | ||
6670 | if (multicast) | ||
6671 | mc |= BIT(port); | ||
6672 | else | ||
6673 | mc &= ~BIT(port); | ||
6674 | - b53_write16(dev, B53_CTRL_PAGE, B53_MC_FWD_EN, mc); | ||
6675 | + b53_write16(dev, B53_CTRL_PAGE, B53_IPMC_FLOOD_MASK, mc); | ||
6676 | |||
6677 | return 0; | ||
6678 | |||
6679 | diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c | ||
6680 | index aa140662c7c2..4e5a428ab1a4 100644 | ||
6681 | --- a/drivers/net/dsa/sja1105/sja1105_main.c | ||
6682 | +++ b/drivers/net/dsa/sja1105/sja1105_main.c | ||
6683 | @@ -1389,6 +1389,8 @@ int sja1105_static_config_reload(struct sja1105_private *priv) | ||
6684 | int speed_mbps[SJA1105_NUM_PORTS]; | ||
6685 | int rc, i; | ||
6686 | |||
6687 | + mutex_lock(&priv->mgmt_lock); | ||
6688 | + | ||
6689 | mac = priv->static_config.tables[BLK_IDX_MAC_CONFIG].entries; | ||
6690 | |||
6691 | /* Back up the dynamic link speed changed by sja1105_adjust_port_config | ||
6692 | @@ -1420,6 +1422,8 @@ int sja1105_static_config_reload(struct sja1105_private *priv) | ||
6693 | goto out; | ||
6694 | } | ||
6695 | out: | ||
6696 | + mutex_unlock(&priv->mgmt_lock); | ||
6697 | + | ||
6698 | return rc; | ||
6699 | } | ||
6700 | |||
6701 | diff --git a/drivers/net/ethernet/amazon/ena/ena_com.h b/drivers/net/ethernet/amazon/ena/ena_com.h | ||
6702 | index 7c941eba0bc9..0ce37d54ed10 100644 | ||
6703 | --- a/drivers/net/ethernet/amazon/ena/ena_com.h | ||
6704 | +++ b/drivers/net/ethernet/amazon/ena/ena_com.h | ||
6705 | @@ -72,7 +72,7 @@ | ||
6706 | /*****************************************************************************/ | ||
6707 | /* ENA adaptive interrupt moderation settings */ | ||
6708 | |||
6709 | -#define ENA_INTR_INITIAL_TX_INTERVAL_USECS 196 | ||
6710 | +#define ENA_INTR_INITIAL_TX_INTERVAL_USECS 64 | ||
6711 | #define ENA_INTR_INITIAL_RX_INTERVAL_USECS 0 | ||
6712 | #define ENA_DEFAULT_INTR_DELAY_RESOLUTION 1 | ||
6713 | |||
6714 | diff --git a/drivers/net/ethernet/amazon/ena/ena_ethtool.c b/drivers/net/ethernet/amazon/ena/ena_ethtool.c | ||
6715 | index 16553d92fad2..8c1c73b0ced7 100644 | ||
6716 | --- a/drivers/net/ethernet/amazon/ena/ena_ethtool.c | ||
6717 | +++ b/drivers/net/ethernet/amazon/ena/ena_ethtool.c | ||
6718 | @@ -315,10 +315,9 @@ static int ena_get_coalesce(struct net_device *net_dev, | ||
6719 | ena_com_get_nonadaptive_moderation_interval_tx(ena_dev) * | ||
6720 | ena_dev->intr_delay_resolution; | ||
6721 | |||
6722 | - if (!ena_com_get_adaptive_moderation_enabled(ena_dev)) | ||
6723 | - coalesce->rx_coalesce_usecs = | ||
6724 | - ena_com_get_nonadaptive_moderation_interval_rx(ena_dev) | ||
6725 | - * ena_dev->intr_delay_resolution; | ||
6726 | + coalesce->rx_coalesce_usecs = | ||
6727 | + ena_com_get_nonadaptive_moderation_interval_rx(ena_dev) | ||
6728 | + * ena_dev->intr_delay_resolution; | ||
6729 | |||
6730 | coalesce->use_adaptive_rx_coalesce = | ||
6731 | ena_com_get_adaptive_moderation_enabled(ena_dev); | ||
6732 | @@ -367,12 +366,6 @@ static int ena_set_coalesce(struct net_device *net_dev, | ||
6733 | |||
6734 | ena_update_tx_rings_intr_moderation(adapter); | ||
6735 | |||
6736 | - if (coalesce->use_adaptive_rx_coalesce) { | ||
6737 | - if (!ena_com_get_adaptive_moderation_enabled(ena_dev)) | ||
6738 | - ena_com_enable_adaptive_moderation(ena_dev); | ||
6739 | - return 0; | ||
6740 | - } | ||
6741 | - | ||
6742 | rc = ena_com_update_nonadaptive_moderation_interval_rx(ena_dev, | ||
6743 | coalesce->rx_coalesce_usecs); | ||
6744 | if (rc) | ||
6745 | @@ -380,10 +373,13 @@ static int ena_set_coalesce(struct net_device *net_dev, | ||
6746 | |||
6747 | ena_update_rx_rings_intr_moderation(adapter); | ||
6748 | |||
6749 | - if (!coalesce->use_adaptive_rx_coalesce) { | ||
6750 | - if (ena_com_get_adaptive_moderation_enabled(ena_dev)) | ||
6751 | - ena_com_disable_adaptive_moderation(ena_dev); | ||
6752 | - } | ||
6753 | + if (coalesce->use_adaptive_rx_coalesce && | ||
6754 | + !ena_com_get_adaptive_moderation_enabled(ena_dev)) | ||
6755 | + ena_com_enable_adaptive_moderation(ena_dev); | ||
6756 | + | ||
6757 | + if (!coalesce->use_adaptive_rx_coalesce && | ||
6758 | + ena_com_get_adaptive_moderation_enabled(ena_dev)) | ||
6759 | + ena_com_disable_adaptive_moderation(ena_dev); | ||
6760 | |||
6761 | return 0; | ||
6762 | } | ||
6763 | diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | ||
6764 | index 0edbb0a76847..5097a44686b3 100644 | ||
6765 | --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | ||
6766 | +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c | ||
6767 | @@ -2397,15 +2397,21 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable) | ||
6768 | /* send the ramrod on all the queues of the PF */ | ||
6769 | for_each_eth_queue(bp, i) { | ||
6770 | struct bnx2x_fastpath *fp = &bp->fp[i]; | ||
6771 | + int tx_idx; | ||
6772 | |||
6773 | /* Set the appropriate Queue object */ | ||
6774 | q_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj; | ||
6775 | |||
6776 | - /* Update the Queue state */ | ||
6777 | - rc = bnx2x_queue_state_change(bp, &q_params); | ||
6778 | - if (rc) { | ||
6779 | - BNX2X_ERR("Failed to configure Tx switching\n"); | ||
6780 | - return rc; | ||
6781 | + for (tx_idx = FIRST_TX_COS_INDEX; | ||
6782 | + tx_idx < fp->max_cos; tx_idx++) { | ||
6783 | + q_params.params.update.cid_index = tx_idx; | ||
6784 | + | ||
6785 | + /* Update the Queue state */ | ||
6786 | + rc = bnx2x_queue_state_change(bp, &q_params); | ||
6787 | + if (rc) { | ||
6788 | + BNX2X_ERR("Failed to configure Tx switching\n"); | ||
6789 | + return rc; | ||
6790 | + } | ||
6791 | } | ||
6792 | } | ||
6793 | |||
6794 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
6795 | index 04ec909e06df..527e1bf93116 100644 | ||
6796 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
6797 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
6798 | @@ -1767,8 +1767,12 @@ static int bnxt_rx_pkt(struct bnxt *bp, struct bnxt_cp_ring_info *cpr, | ||
6799 | |||
6800 | rc = -EIO; | ||
6801 | if (rx_err & RX_CMPL_ERRORS_BUFFER_ERROR_MASK) { | ||
6802 | - netdev_warn(bp->dev, "RX buffer error %x\n", rx_err); | ||
6803 | - bnxt_sched_reset(bp, rxr); | ||
6804 | + bnapi->cp_ring.rx_buf_errors++; | ||
6805 | + if (!(bp->flags & BNXT_FLAG_CHIP_P5)) { | ||
6806 | + netdev_warn(bp->dev, "RX buffer error %x\n", | ||
6807 | + rx_err); | ||
6808 | + bnxt_sched_reset(bp, rxr); | ||
6809 | + } | ||
6810 | } | ||
6811 | goto next_rx_no_len; | ||
6812 | } | ||
6813 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
6814 | index d333589811a5..5163bb848618 100644 | ||
6815 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
6816 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h | ||
6817 | @@ -927,6 +927,7 @@ struct bnxt_cp_ring_info { | ||
6818 | dma_addr_t hw_stats_map; | ||
6819 | u32 hw_stats_ctx_id; | ||
6820 | u64 rx_l4_csum_errors; | ||
6821 | + u64 rx_buf_errors; | ||
6822 | u64 missed_irqs; | ||
6823 | |||
6824 | struct bnxt_ring_struct cp_ring_struct; | ||
6825 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | ||
6826 | index 7151244f8c7d..7d2cfea05737 100644 | ||
6827 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | ||
6828 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c | ||
6829 | @@ -311,10 +311,17 @@ static int bnxt_hwrm_nvm_req(struct bnxt *bp, u32 param_id, void *msg, | ||
6830 | } else { | ||
6831 | rc = hwrm_send_message_silent(bp, msg, msg_len, | ||
6832 | HWRM_CMD_TIMEOUT); | ||
6833 | - if (!rc) | ||
6834 | + if (!rc) { | ||
6835 | bnxt_copy_from_nvm_data(val, data, | ||
6836 | nvm_param.nvm_num_bits, | ||
6837 | nvm_param.dl_num_bytes); | ||
6838 | + } else { | ||
6839 | + struct hwrm_err_output *resp = bp->hwrm_cmd_resp_addr; | ||
6840 | + | ||
6841 | + if (resp->cmd_err == | ||
6842 | + NVM_GET_VARIABLE_CMD_ERR_CODE_VAR_NOT_EXIST) | ||
6843 | + rc = -EOPNOTSUPP; | ||
6844 | + } | ||
6845 | } | ||
6846 | dma_free_coherent(&bp->pdev->dev, sizeof(*data), data, data_dma_addr); | ||
6847 | if (rc == -EACCES) | ||
6848 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
6849 | index 51c140476717..89f95428556e 100644 | ||
6850 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
6851 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c | ||
6852 | @@ -173,6 +173,7 @@ static const char * const bnxt_ring_tpa2_stats_str[] = { | ||
6853 | |||
6854 | static const char * const bnxt_ring_sw_stats_str[] = { | ||
6855 | "rx_l4_csum_errors", | ||
6856 | + "rx_buf_errors", | ||
6857 | "missed_irqs", | ||
6858 | }; | ||
6859 | |||
6860 | @@ -552,6 +553,7 @@ static void bnxt_get_ethtool_stats(struct net_device *dev, | ||
6861 | for (k = 0; k < stat_fields; j++, k++) | ||
6862 | buf[j] = le64_to_cpu(hw_stats[k]); | ||
6863 | buf[j++] = cpr->rx_l4_csum_errors; | ||
6864 | + buf[j++] = cpr->rx_buf_errors; | ||
6865 | buf[j++] = cpr->missed_irqs; | ||
6866 | |||
6867 | bnxt_sw_func_stats[RX_TOTAL_DISCARDS].counter += | ||
6868 | diff --git a/drivers/net/ethernet/cortina/gemini.c b/drivers/net/ethernet/cortina/gemini.c | ||
6869 | index a8f4c69252ff..2814b96751b4 100644 | ||
6870 | --- a/drivers/net/ethernet/cortina/gemini.c | ||
6871 | +++ b/drivers/net/ethernet/cortina/gemini.c | ||
6872 | @@ -576,6 +576,8 @@ static int gmac_setup_txqs(struct net_device *netdev) | ||
6873 | |||
6874 | if (port->txq_dma_base & ~DMA_Q_BASE_MASK) { | ||
6875 | dev_warn(geth->dev, "TX queue base is not aligned\n"); | ||
6876 | + dma_free_coherent(geth->dev, len * sizeof(*desc_ring), | ||
6877 | + desc_ring, port->txq_dma_base); | ||
6878 | kfree(skb_tab); | ||
6879 | return -ENOMEM; | ||
6880 | } | ||
6881 | diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c | ||
6882 | index a9503aea527f..6437fe6b9abf 100644 | ||
6883 | --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c | ||
6884 | +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ptp.c | ||
6885 | @@ -160,10 +160,10 @@ static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev) | ||
6886 | irq = mc_dev->irqs[0]; | ||
6887 | ptp_qoriq->irq = irq->msi_desc->irq; | ||
6888 | |||
6889 | - err = devm_request_threaded_irq(dev, ptp_qoriq->irq, NULL, | ||
6890 | - dpaa2_ptp_irq_handler_thread, | ||
6891 | - IRQF_NO_SUSPEND | IRQF_ONESHOT, | ||
6892 | - dev_name(dev), ptp_qoriq); | ||
6893 | + err = request_threaded_irq(ptp_qoriq->irq, NULL, | ||
6894 | + dpaa2_ptp_irq_handler_thread, | ||
6895 | + IRQF_NO_SUSPEND | IRQF_ONESHOT, | ||
6896 | + dev_name(dev), ptp_qoriq); | ||
6897 | if (err < 0) { | ||
6898 | dev_err(dev, "devm_request_threaded_irq(): %d\n", err); | ||
6899 | goto err_free_mc_irq; | ||
6900 | @@ -173,18 +173,20 @@ static int dpaa2_ptp_probe(struct fsl_mc_device *mc_dev) | ||
6901 | DPRTC_IRQ_INDEX, 1); | ||
6902 | if (err < 0) { | ||
6903 | dev_err(dev, "dprtc_set_irq_enable(): %d\n", err); | ||
6904 | - goto err_free_mc_irq; | ||
6905 | + goto err_free_threaded_irq; | ||
6906 | } | ||
6907 | |||
6908 | err = ptp_qoriq_init(ptp_qoriq, base, &dpaa2_ptp_caps); | ||
6909 | if (err) | ||
6910 | - goto err_free_mc_irq; | ||
6911 | + goto err_free_threaded_irq; | ||
6912 | |||
6913 | dpaa2_phc_index = ptp_qoriq->phc_index; | ||
6914 | dev_set_drvdata(dev, ptp_qoriq); | ||
6915 | |||
6916 | return 0; | ||
6917 | |||
6918 | +err_free_threaded_irq: | ||
6919 | + free_irq(ptp_qoriq->irq, ptp_qoriq); | ||
6920 | err_free_mc_irq: | ||
6921 | fsl_mc_free_irqs(mc_dev); | ||
6922 | err_unmap: | ||
6923 | diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c | ||
6924 | index 4606a7e4a6d1..2ffe035e96d6 100644 | ||
6925 | --- a/drivers/net/ethernet/hisilicon/hip04_eth.c | ||
6926 | +++ b/drivers/net/ethernet/hisilicon/hip04_eth.c | ||
6927 | @@ -543,9 +543,9 @@ hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev) | ||
6928 | skb_tx_timestamp(skb); | ||
6929 | |||
6930 | hip04_set_xmit_desc(priv, phys); | ||
6931 | - priv->tx_head = TX_NEXT(tx_head); | ||
6932 | count++; | ||
6933 | netdev_sent_queue(ndev, skb->len); | ||
6934 | + priv->tx_head = TX_NEXT(tx_head); | ||
6935 | |||
6936 | stats->tx_bytes += skb->len; | ||
6937 | stats->tx_packets++; | ||
6938 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
6939 | index 616cad0faa21..84d8816c8681 100644 | ||
6940 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
6941 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
6942 | @@ -1692,6 +1692,9 @@ static bool hns3_get_tx_timeo_queue_info(struct net_device *ndev) | ||
6943 | time_after(jiffies, | ||
6944 | (trans_start + ndev->watchdog_timeo))) { | ||
6945 | timeout_queue = i; | ||
6946 | + netdev_info(ndev, "queue state: 0x%lx, delta msecs: %u\n", | ||
6947 | + q->state, | ||
6948 | + jiffies_to_msecs(jiffies - trans_start)); | ||
6949 | break; | ||
6950 | } | ||
6951 | } | ||
6952 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
6953 | index c052bb33b3d3..162881005a6d 100644 | ||
6954 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
6955 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
6956 | @@ -9443,6 +9443,9 @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev) | ||
6957 | return ret; | ||
6958 | } | ||
6959 | |||
6960 | + /* Log and clear the hw errors those already occurred */ | ||
6961 | + hclge_handle_all_hns_hw_errors(ae_dev); | ||
6962 | + | ||
6963 | /* Re-enable the hw error interrupts because | ||
6964 | * the interrupts get disabled on global reset. | ||
6965 | */ | ||
6966 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
6967 | index 0686ded7ad3a..e1ab2feeae53 100644 | ||
6968 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
6969 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
6970 | @@ -176,7 +176,7 @@ static int alloc_long_term_buff(struct ibmvnic_adapter *adapter, | ||
6971 | ltb->map_id = adapter->map_id; | ||
6972 | adapter->map_id++; | ||
6973 | |||
6974 | - init_completion(&adapter->fw_done); | ||
6975 | + reinit_completion(&adapter->fw_done); | ||
6976 | rc = send_request_map(adapter, ltb->addr, | ||
6977 | ltb->size, ltb->map_id); | ||
6978 | if (rc) { | ||
6979 | @@ -215,7 +215,7 @@ static int reset_long_term_buff(struct ibmvnic_adapter *adapter, | ||
6980 | |||
6981 | memset(ltb->buff, 0, ltb->size); | ||
6982 | |||
6983 | - init_completion(&adapter->fw_done); | ||
6984 | + reinit_completion(&adapter->fw_done); | ||
6985 | rc = send_request_map(adapter, ltb->addr, ltb->size, ltb->map_id); | ||
6986 | if (rc) | ||
6987 | return rc; | ||
6988 | @@ -943,7 +943,7 @@ static int ibmvnic_get_vpd(struct ibmvnic_adapter *adapter) | ||
6989 | if (adapter->vpd->buff) | ||
6990 | len = adapter->vpd->len; | ||
6991 | |||
6992 | - init_completion(&adapter->fw_done); | ||
6993 | + reinit_completion(&adapter->fw_done); | ||
6994 | crq.get_vpd_size.first = IBMVNIC_CRQ_CMD; | ||
6995 | crq.get_vpd_size.cmd = GET_VPD_SIZE; | ||
6996 | rc = ibmvnic_send_crq(adapter, &crq); | ||
6997 | @@ -1689,7 +1689,7 @@ static int __ibmvnic_set_mac(struct net_device *netdev, u8 *dev_addr) | ||
6998 | crq.change_mac_addr.cmd = CHANGE_MAC_ADDR; | ||
6999 | ether_addr_copy(&crq.change_mac_addr.mac_addr[0], dev_addr); | ||
7000 | |||
7001 | - init_completion(&adapter->fw_done); | ||
7002 | + reinit_completion(&adapter->fw_done); | ||
7003 | rc = ibmvnic_send_crq(adapter, &crq); | ||
7004 | if (rc) { | ||
7005 | rc = -EIO; | ||
7006 | @@ -2316,7 +2316,7 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter) | ||
7007 | adapter->fallback.rx_entries = adapter->req_rx_add_entries_per_subcrq; | ||
7008 | adapter->fallback.tx_entries = adapter->req_tx_entries_per_subcrq; | ||
7009 | |||
7010 | - init_completion(&adapter->reset_done); | ||
7011 | + reinit_completion(&adapter->reset_done); | ||
7012 | adapter->wait_for_reset = true; | ||
7013 | rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); | ||
7014 | if (rc) | ||
7015 | @@ -2332,7 +2332,7 @@ static int wait_for_reset(struct ibmvnic_adapter *adapter) | ||
7016 | adapter->desired.rx_entries = adapter->fallback.rx_entries; | ||
7017 | adapter->desired.tx_entries = adapter->fallback.tx_entries; | ||
7018 | |||
7019 | - init_completion(&adapter->reset_done); | ||
7020 | + reinit_completion(&adapter->reset_done); | ||
7021 | adapter->wait_for_reset = true; | ||
7022 | rc = ibmvnic_reset(adapter, VNIC_RESET_CHANGE_PARAM); | ||
7023 | if (rc) | ||
7024 | @@ -2603,7 +2603,7 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev, | ||
7025 | cpu_to_be32(sizeof(struct ibmvnic_statistics)); | ||
7026 | |||
7027 | /* Wait for data to be written */ | ||
7028 | - init_completion(&adapter->stats_done); | ||
7029 | + reinit_completion(&adapter->stats_done); | ||
7030 | rc = ibmvnic_send_crq(adapter, &crq); | ||
7031 | if (rc) | ||
7032 | return; | ||
7033 | @@ -4408,7 +4408,7 @@ static int send_query_phys_parms(struct ibmvnic_adapter *adapter) | ||
7034 | memset(&crq, 0, sizeof(crq)); | ||
7035 | crq.query_phys_parms.first = IBMVNIC_CRQ_CMD; | ||
7036 | crq.query_phys_parms.cmd = QUERY_PHYS_PARMS; | ||
7037 | - init_completion(&adapter->fw_done); | ||
7038 | + reinit_completion(&adapter->fw_done); | ||
7039 | rc = ibmvnic_send_crq(adapter, &crq); | ||
7040 | if (rc) | ||
7041 | return rc; | ||
7042 | @@ -4960,6 +4960,9 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id) | ||
7043 | INIT_LIST_HEAD(&adapter->rwi_list); | ||
7044 | spin_lock_init(&adapter->rwi_lock); | ||
7045 | init_completion(&adapter->init_done); | ||
7046 | + init_completion(&adapter->fw_done); | ||
7047 | + init_completion(&adapter->reset_done); | ||
7048 | + init_completion(&adapter->stats_done); | ||
7049 | clear_bit(0, &adapter->resetting); | ||
7050 | |||
7051 | do { | ||
7052 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c | ||
7053 | index 7560f06768e0..3160b5bbe672 100644 | ||
7054 | --- a/drivers/net/ethernet/intel/i40e/i40e_common.c | ||
7055 | +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c | ||
7056 | @@ -2571,9 +2571,16 @@ noinline_for_stack i40e_status i40e_update_link_info(struct i40e_hw *hw) | ||
7057 | if (status) | ||
7058 | return status; | ||
7059 | |||
7060 | - hw->phy.link_info.req_fec_info = | ||
7061 | - abilities.fec_cfg_curr_mod_ext_info & | ||
7062 | - (I40E_AQ_REQUEST_FEC_KR | I40E_AQ_REQUEST_FEC_RS); | ||
7063 | + if (abilities.fec_cfg_curr_mod_ext_info & | ||
7064 | + I40E_AQ_ENABLE_FEC_AUTO) | ||
7065 | + hw->phy.link_info.req_fec_info = | ||
7066 | + (I40E_AQ_REQUEST_FEC_KR | | ||
7067 | + I40E_AQ_REQUEST_FEC_RS); | ||
7068 | + else | ||
7069 | + hw->phy.link_info.req_fec_info = | ||
7070 | + abilities.fec_cfg_curr_mod_ext_info & | ||
7071 | + (I40E_AQ_REQUEST_FEC_KR | | ||
7072 | + I40E_AQ_REQUEST_FEC_RS); | ||
7073 | |||
7074 | memcpy(hw->phy.link_info.module_type, &abilities.module_type, | ||
7075 | sizeof(hw->phy.link_info.module_type)); | ||
7076 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c | ||
7077 | index 41e1240acaea..b577e6adf3bf 100644 | ||
7078 | --- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c | ||
7079 | +++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c | ||
7080 | @@ -722,7 +722,14 @@ static void i40e_get_settings_link_up_fec(u8 req_fec_info, | ||
7081 | ethtool_link_ksettings_add_link_mode(ks, supported, FEC_RS); | ||
7082 | ethtool_link_ksettings_add_link_mode(ks, supported, FEC_BASER); | ||
7083 | |||
7084 | - if (I40E_AQ_SET_FEC_REQUEST_RS & req_fec_info) { | ||
7085 | + if ((I40E_AQ_SET_FEC_REQUEST_RS & req_fec_info) && | ||
7086 | + (I40E_AQ_SET_FEC_REQUEST_KR & req_fec_info)) { | ||
7087 | + ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7088 | + FEC_NONE); | ||
7089 | + ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7090 | + FEC_BASER); | ||
7091 | + ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_RS); | ||
7092 | + } else if (I40E_AQ_SET_FEC_REQUEST_RS & req_fec_info) { | ||
7093 | ethtool_link_ksettings_add_link_mode(ks, advertising, FEC_RS); | ||
7094 | } else if (I40E_AQ_SET_FEC_REQUEST_KR & req_fec_info) { | ||
7095 | ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7096 | @@ -730,12 +737,6 @@ static void i40e_get_settings_link_up_fec(u8 req_fec_info, | ||
7097 | } else { | ||
7098 | ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7099 | FEC_NONE); | ||
7100 | - if (I40E_AQ_SET_FEC_AUTO & req_fec_info) { | ||
7101 | - ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7102 | - FEC_RS); | ||
7103 | - ethtool_link_ksettings_add_link_mode(ks, advertising, | ||
7104 | - FEC_BASER); | ||
7105 | - } | ||
7106 | } | ||
7107 | } | ||
7108 | |||
7109 | @@ -1437,6 +1438,7 @@ static int i40e_get_fec_param(struct net_device *netdev, | ||
7110 | struct i40e_hw *hw = &pf->hw; | ||
7111 | i40e_status status = 0; | ||
7112 | int err = 0; | ||
7113 | + u8 fec_cfg; | ||
7114 | |||
7115 | /* Get the current phy config */ | ||
7116 | memset(&abilities, 0, sizeof(abilities)); | ||
7117 | @@ -1448,18 +1450,16 @@ static int i40e_get_fec_param(struct net_device *netdev, | ||
7118 | } | ||
7119 | |||
7120 | fecparam->fec = 0; | ||
7121 | - if (abilities.fec_cfg_curr_mod_ext_info & I40E_AQ_SET_FEC_AUTO) | ||
7122 | + fec_cfg = abilities.fec_cfg_curr_mod_ext_info; | ||
7123 | + if (fec_cfg & I40E_AQ_SET_FEC_AUTO) | ||
7124 | fecparam->fec |= ETHTOOL_FEC_AUTO; | ||
7125 | - if ((abilities.fec_cfg_curr_mod_ext_info & | ||
7126 | - I40E_AQ_SET_FEC_REQUEST_RS) || | ||
7127 | - (abilities.fec_cfg_curr_mod_ext_info & | ||
7128 | - I40E_AQ_SET_FEC_ABILITY_RS)) | ||
7129 | + else if (fec_cfg & (I40E_AQ_SET_FEC_REQUEST_RS | | ||
7130 | + I40E_AQ_SET_FEC_ABILITY_RS)) | ||
7131 | fecparam->fec |= ETHTOOL_FEC_RS; | ||
7132 | - if ((abilities.fec_cfg_curr_mod_ext_info & | ||
7133 | - I40E_AQ_SET_FEC_REQUEST_KR) || | ||
7134 | - (abilities.fec_cfg_curr_mod_ext_info & I40E_AQ_SET_FEC_ABILITY_KR)) | ||
7135 | + else if (fec_cfg & (I40E_AQ_SET_FEC_REQUEST_KR | | ||
7136 | + I40E_AQ_SET_FEC_ABILITY_KR)) | ||
7137 | fecparam->fec |= ETHTOOL_FEC_BASER; | ||
7138 | - if (abilities.fec_cfg_curr_mod_ext_info == 0) | ||
7139 | + if (fec_cfg == 0) | ||
7140 | fecparam->fec |= ETHTOOL_FEC_OFF; | ||
7141 | |||
7142 | if (hw->phy.link_info.fec_info & I40E_AQ_CONFIG_FEC_KR_ENA) | ||
7143 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7144 | index 6031223eafab..339925af0206 100644 | ||
7145 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7146 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
7147 | @@ -3534,14 +3534,14 @@ static void i40e_vsi_configure_msix(struct i40e_vsi *vsi) | ||
7148 | q_vector->rx.target_itr = | ||
7149 | ITR_TO_REG(vsi->rx_rings[i]->itr_setting); | ||
7150 | wr32(hw, I40E_PFINT_ITRN(I40E_RX_ITR, vector - 1), | ||
7151 | - q_vector->rx.target_itr); | ||
7152 | + q_vector->rx.target_itr >> 1); | ||
7153 | q_vector->rx.current_itr = q_vector->rx.target_itr; | ||
7154 | |||
7155 | q_vector->tx.next_update = jiffies + 1; | ||
7156 | q_vector->tx.target_itr = | ||
7157 | ITR_TO_REG(vsi->tx_rings[i]->itr_setting); | ||
7158 | wr32(hw, I40E_PFINT_ITRN(I40E_TX_ITR, vector - 1), | ||
7159 | - q_vector->tx.target_itr); | ||
7160 | + q_vector->tx.target_itr >> 1); | ||
7161 | q_vector->tx.current_itr = q_vector->tx.target_itr; | ||
7162 | |||
7163 | wr32(hw, I40E_PFINT_RATEN(vector - 1), | ||
7164 | @@ -3646,11 +3646,11 @@ static void i40e_configure_msi_and_legacy(struct i40e_vsi *vsi) | ||
7165 | /* set the ITR configuration */ | ||
7166 | q_vector->rx.next_update = jiffies + 1; | ||
7167 | q_vector->rx.target_itr = ITR_TO_REG(vsi->rx_rings[0]->itr_setting); | ||
7168 | - wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr); | ||
7169 | + wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), q_vector->rx.target_itr >> 1); | ||
7170 | q_vector->rx.current_itr = q_vector->rx.target_itr; | ||
7171 | q_vector->tx.next_update = jiffies + 1; | ||
7172 | q_vector->tx.target_itr = ITR_TO_REG(vsi->tx_rings[0]->itr_setting); | ||
7173 | - wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr); | ||
7174 | + wr32(hw, I40E_PFINT_ITR0(I40E_TX_ITR), q_vector->tx.target_itr >> 1); | ||
7175 | q_vector->tx.current_itr = q_vector->tx.target_itr; | ||
7176 | |||
7177 | i40e_enable_misc_int_causes(pf); | ||
7178 | @@ -11396,7 +11396,7 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf) | ||
7179 | |||
7180 | /* associate no queues to the misc vector */ | ||
7181 | wr32(hw, I40E_PFINT_LNKLST0, I40E_QUEUE_END_OF_LIST); | ||
7182 | - wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), I40E_ITR_8K); | ||
7183 | + wr32(hw, I40E_PFINT_ITR0(I40E_RX_ITR), I40E_ITR_8K >> 1); | ||
7184 | |||
7185 | i40e_flush(hw); | ||
7186 | |||
7187 | diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c | ||
7188 | index 2353166c654e..c68709c7ef81 100644 | ||
7189 | --- a/drivers/net/ethernet/intel/ice/ice_controlq.c | ||
7190 | +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c | ||
7191 | @@ -948,7 +948,7 @@ ice_sq_send_cmd(struct ice_hw *hw, struct ice_ctl_q_info *cq, | ||
7192 | if (ice_sq_done(hw, cq)) | ||
7193 | break; | ||
7194 | |||
7195 | - mdelay(1); | ||
7196 | + udelay(ICE_CTL_Q_SQ_CMD_USEC); | ||
7197 | total_delay++; | ||
7198 | } while (total_delay < cq->sq_cmd_timeout); | ||
7199 | |||
7200 | diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.h b/drivers/net/ethernet/intel/ice/ice_controlq.h | ||
7201 | index 44945c2165d8..4df9da359135 100644 | ||
7202 | --- a/drivers/net/ethernet/intel/ice/ice_controlq.h | ||
7203 | +++ b/drivers/net/ethernet/intel/ice/ice_controlq.h | ||
7204 | @@ -31,8 +31,9 @@ enum ice_ctl_q { | ||
7205 | ICE_CTL_Q_MAILBOX, | ||
7206 | }; | ||
7207 | |||
7208 | -/* Control Queue default settings */ | ||
7209 | -#define ICE_CTL_Q_SQ_CMD_TIMEOUT 250 /* msecs */ | ||
7210 | +/* Control Queue timeout settings - max delay 250ms */ | ||
7211 | +#define ICE_CTL_Q_SQ_CMD_TIMEOUT 2500 /* Count 2500 times */ | ||
7212 | +#define ICE_CTL_Q_SQ_CMD_USEC 100 /* Check every 100usec */ | ||
7213 | |||
7214 | struct ice_ctl_q_ring { | ||
7215 | void *dma_head; /* Virtual address to DMA head */ | ||
7216 | diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c | ||
7217 | index 7e23034df955..1fe9f6050635 100644 | ||
7218 | --- a/drivers/net/ethernet/intel/ice/ice_ethtool.c | ||
7219 | +++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c | ||
7220 | @@ -3368,10 +3368,17 @@ __ice_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *ec, | ||
7221 | struct ice_vsi *vsi = np->vsi; | ||
7222 | |||
7223 | if (q_num < 0) { | ||
7224 | - int i; | ||
7225 | + int v_idx; | ||
7226 | + | ||
7227 | + ice_for_each_q_vector(vsi, v_idx) { | ||
7228 | + /* In some cases if DCB is configured the num_[rx|tx]q | ||
7229 | + * can be less than vsi->num_q_vectors. This check | ||
7230 | + * accounts for that so we don't report a false failure | ||
7231 | + */ | ||
7232 | + if (v_idx >= vsi->num_rxq && v_idx >= vsi->num_txq) | ||
7233 | + goto set_complete; | ||
7234 | |||
7235 | - ice_for_each_q_vector(vsi, i) { | ||
7236 | - if (ice_set_q_coalesce(vsi, ec, i)) | ||
7237 | + if (ice_set_q_coalesce(vsi, ec, v_idx)) | ||
7238 | return -EINVAL; | ||
7239 | } | ||
7240 | goto set_complete; | ||
7241 | diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c | ||
7242 | index 214cd6eca405..2408f0de95fc 100644 | ||
7243 | --- a/drivers/net/ethernet/intel/ice/ice_main.c | ||
7244 | +++ b/drivers/net/ethernet/intel/ice/ice_main.c | ||
7245 | @@ -3970,8 +3970,13 @@ int ice_vsi_setup_tx_rings(struct ice_vsi *vsi) | ||
7246 | } | ||
7247 | |||
7248 | ice_for_each_txq(vsi, i) { | ||
7249 | - vsi->tx_rings[i]->netdev = vsi->netdev; | ||
7250 | - err = ice_setup_tx_ring(vsi->tx_rings[i]); | ||
7251 | + struct ice_ring *ring = vsi->tx_rings[i]; | ||
7252 | + | ||
7253 | + if (!ring) | ||
7254 | + return -EINVAL; | ||
7255 | + | ||
7256 | + ring->netdev = vsi->netdev; | ||
7257 | + err = ice_setup_tx_ring(ring); | ||
7258 | if (err) | ||
7259 | break; | ||
7260 | } | ||
7261 | @@ -3996,8 +4001,13 @@ int ice_vsi_setup_rx_rings(struct ice_vsi *vsi) | ||
7262 | } | ||
7263 | |||
7264 | ice_for_each_rxq(vsi, i) { | ||
7265 | - vsi->rx_rings[i]->netdev = vsi->netdev; | ||
7266 | - err = ice_setup_rx_ring(vsi->rx_rings[i]); | ||
7267 | + struct ice_ring *ring = vsi->rx_rings[i]; | ||
7268 | + | ||
7269 | + if (!ring) | ||
7270 | + return -EINVAL; | ||
7271 | + | ||
7272 | + ring->netdev = vsi->netdev; | ||
7273 | + err = ice_setup_rx_ring(ring); | ||
7274 | if (err) | ||
7275 | break; | ||
7276 | } | ||
7277 | diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | ||
7278 | index b45797f39b2f..c0637a0cbfe8 100644 | ||
7279 | --- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | ||
7280 | +++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c | ||
7281 | @@ -317,8 +317,9 @@ void ice_free_vfs(struct ice_pf *pf) | ||
7282 | pf->num_alloc_vfs = 0; | ||
7283 | for (i = 0; i < tmp; i++) { | ||
7284 | if (test_bit(ICE_VF_STATE_INIT, pf->vf[i].vf_states)) { | ||
7285 | - /* disable VF qp mappings */ | ||
7286 | + /* disable VF qp mappings and set VF disable state */ | ||
7287 | ice_dis_vf_mappings(&pf->vf[i]); | ||
7288 | + set_bit(ICE_VF_STATE_DIS, pf->vf[i].vf_states); | ||
7289 | ice_free_vf_res(&pf->vf[i]); | ||
7290 | } | ||
7291 | } | ||
7292 | @@ -1287,9 +1288,12 @@ static void ice_vc_notify_vf_reset(struct ice_vf *vf) | ||
7293 | if (!vf || vf->vf_id >= vf->pf->num_alloc_vfs) | ||
7294 | return; | ||
7295 | |||
7296 | - /* verify if the VF is in either init or active before proceeding */ | ||
7297 | - if (!test_bit(ICE_VF_STATE_INIT, vf->vf_states) && | ||
7298 | - !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) | ||
7299 | + /* Bail out if VF is in disabled state, neither initialized, nor active | ||
7300 | + * state - otherwise proceed with notifications | ||
7301 | + */ | ||
7302 | + if ((!test_bit(ICE_VF_STATE_INIT, vf->vf_states) && | ||
7303 | + !test_bit(ICE_VF_STATE_ACTIVE, vf->vf_states)) || | ||
7304 | + test_bit(ICE_VF_STATE_DIS, vf->vf_states)) | ||
7305 | return; | ||
7306 | |||
7307 | pfe.event = VIRTCHNL_EVENT_RESET_IMPENDING; | ||
7308 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
7309 | index 91b3780ddb04..1a7203fede12 100644 | ||
7310 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
7311 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | ||
7312 | @@ -8639,7 +8639,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, | ||
7313 | |||
7314 | if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && | ||
7315 | adapter->ptp_clock) { | ||
7316 | - if (!test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS, | ||
7317 | + if (adapter->tstamp_config.tx_type == HWTSTAMP_TX_ON && | ||
7318 | + !test_and_set_bit_lock(__IXGBE_PTP_TX_IN_PROGRESS, | ||
7319 | &adapter->state)) { | ||
7320 | skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; | ||
7321 | tx_flags |= IXGBE_TX_FLAGS_TSTAMP; | ||
7322 | diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7323 | index c2c7f214a56a..814a4ba4e7fa 100644 | ||
7324 | --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7325 | +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | ||
7326 | @@ -3443,6 +3443,12 @@ static int parse_tc_fdb_actions(struct mlx5e_priv *priv, | ||
7327 | attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST; | ||
7328 | } | ||
7329 | |||
7330 | + if (!(attr->action & | ||
7331 | + (MLX5_FLOW_CONTEXT_ACTION_FWD_DEST | MLX5_FLOW_CONTEXT_ACTION_DROP))) { | ||
7332 | + NL_SET_ERR_MSG(extack, "Rule must have at least one forward/drop action"); | ||
7333 | + return -EOPNOTSUPP; | ||
7334 | + } | ||
7335 | + | ||
7336 | if (attr->split_count > 0 && !mlx5_esw_has_fwd_fdb(priv->mdev)) { | ||
7337 | NL_SET_ERR_MSG_MOD(extack, | ||
7338 | "current firmware doesn't support split rule for port mirroring"); | ||
7339 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | ||
7340 | index 39d600c8b92d..210ebc91d3d6 100644 | ||
7341 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | ||
7342 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c | ||
7343 | @@ -5637,8 +5637,13 @@ static void mlxsw_sp_router_fib6_del(struct mlxsw_sp *mlxsw_sp, | ||
7344 | if (mlxsw_sp_fib6_rt_should_ignore(rt)) | ||
7345 | return; | ||
7346 | |||
7347 | + /* Multipath routes are first added to the FIB trie and only then | ||
7348 | + * notified. If we vetoed the addition, we will get a delete | ||
7349 | + * notification for a route we do not have. Therefore, do not warn if | ||
7350 | + * route was not found. | ||
7351 | + */ | ||
7352 | fib6_entry = mlxsw_sp_fib6_entry_lookup(mlxsw_sp, rt); | ||
7353 | - if (WARN_ON(!fib6_entry)) | ||
7354 | + if (!fib6_entry) | ||
7355 | return; | ||
7356 | |||
7357 | /* If not all the nexthops are deleted, then only reduce the nexthop | ||
7358 | diff --git a/drivers/net/ethernet/netronome/nfp/flower/metadata.c b/drivers/net/ethernet/netronome/nfp/flower/metadata.c | ||
7359 | index 7c4a15e967df..5defd31d481c 100644 | ||
7360 | --- a/drivers/net/ethernet/netronome/nfp/flower/metadata.c | ||
7361 | +++ b/drivers/net/ethernet/netronome/nfp/flower/metadata.c | ||
7362 | @@ -65,17 +65,17 @@ static int nfp_get_stats_entry(struct nfp_app *app, u32 *stats_context_id) | ||
7363 | freed_stats_id = priv->stats_ring_size; | ||
7364 | /* Check for unallocated entries first. */ | ||
7365 | if (priv->stats_ids.init_unalloc > 0) { | ||
7366 | - if (priv->active_mem_unit == priv->total_mem_units) { | ||
7367 | - priv->stats_ids.init_unalloc--; | ||
7368 | - priv->active_mem_unit = 0; | ||
7369 | - } | ||
7370 | - | ||
7371 | *stats_context_id = | ||
7372 | FIELD_PREP(NFP_FL_STAT_ID_STAT, | ||
7373 | priv->stats_ids.init_unalloc - 1) | | ||
7374 | FIELD_PREP(NFP_FL_STAT_ID_MU_NUM, | ||
7375 | priv->active_mem_unit); | ||
7376 | - priv->active_mem_unit++; | ||
7377 | + | ||
7378 | + if (++priv->active_mem_unit == priv->total_mem_units) { | ||
7379 | + priv->stats_ids.init_unalloc--; | ||
7380 | + priv->active_mem_unit = 0; | ||
7381 | + } | ||
7382 | + | ||
7383 | return 0; | ||
7384 | } | ||
7385 | |||
7386 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_filter.c b/drivers/net/ethernet/qlogic/qede/qede_filter.c | ||
7387 | index 9a6a9a008714..c8bdbf057d5a 100644 | ||
7388 | --- a/drivers/net/ethernet/qlogic/qede/qede_filter.c | ||
7389 | +++ b/drivers/net/ethernet/qlogic/qede/qede_filter.c | ||
7390 | @@ -1230,7 +1230,7 @@ qede_configure_mcast_filtering(struct net_device *ndev, | ||
7391 | netif_addr_lock_bh(ndev); | ||
7392 | |||
7393 | mc_count = netdev_mc_count(ndev); | ||
7394 | - if (mc_count < 64) { | ||
7395 | + if (mc_count <= 64) { | ||
7396 | netdev_for_each_mc_addr(ha, ndev) { | ||
7397 | ether_addr_copy(temp, ha->addr); | ||
7398 | temp += ETH_ALEN; | ||
7399 | diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
7400 | index a220cc7c947a..ba53612ae0df 100644 | ||
7401 | --- a/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
7402 | +++ b/drivers/net/ethernet/qlogic/qede/qede_main.c | ||
7403 | @@ -1406,6 +1406,7 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) | ||
7404 | rxq->rx_buf_seg_size = roundup_pow_of_two(size); | ||
7405 | } else { | ||
7406 | rxq->rx_buf_seg_size = PAGE_SIZE; | ||
7407 | + edev->ndev->features &= ~NETIF_F_GRO_HW; | ||
7408 | } | ||
7409 | |||
7410 | /* Allocate the parallel driver ring for Rx buffers */ | ||
7411 | @@ -1450,6 +1451,7 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) | ||
7412 | } | ||
7413 | } | ||
7414 | |||
7415 | + edev->gro_disable = !(edev->ndev->features & NETIF_F_GRO_HW); | ||
7416 | if (!edev->gro_disable) | ||
7417 | qede_set_tpa_param(rxq); | ||
7418 | err: | ||
7419 | @@ -1702,8 +1704,6 @@ static void qede_init_fp(struct qede_dev *edev) | ||
7420 | snprintf(fp->name, sizeof(fp->name), "%s-fp-%d", | ||
7421 | edev->ndev->name, queue_id); | ||
7422 | } | ||
7423 | - | ||
7424 | - edev->gro_disable = !(edev->ndev->features & NETIF_F_GRO_HW); | ||
7425 | } | ||
7426 | |||
7427 | static int qede_set_real_num_queues(struct qede_dev *edev) | ||
7428 | diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
7429 | index b4b8ba00ee01..986f26578d34 100644 | ||
7430 | --- a/drivers/net/ethernet/qlogic/qla3xxx.c | ||
7431 | +++ b/drivers/net/ethernet/qlogic/qla3xxx.c | ||
7432 | @@ -2756,6 +2756,9 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev) | ||
7433 | int err; | ||
7434 | |||
7435 | for (i = 0; i < qdev->num_large_buffers; i++) { | ||
7436 | + lrg_buf_cb = &qdev->lrg_buf[i]; | ||
7437 | + memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb)); | ||
7438 | + | ||
7439 | skb = netdev_alloc_skb(qdev->ndev, | ||
7440 | qdev->lrg_buffer_len); | ||
7441 | if (unlikely(!skb)) { | ||
7442 | @@ -2766,11 +2769,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev) | ||
7443 | ql_free_large_buffers(qdev); | ||
7444 | return -ENOMEM; | ||
7445 | } else { | ||
7446 | - | ||
7447 | - lrg_buf_cb = &qdev->lrg_buf[i]; | ||
7448 | - memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb)); | ||
7449 | lrg_buf_cb->index = i; | ||
7450 | - lrg_buf_cb->skb = skb; | ||
7451 | /* | ||
7452 | * We save some space to copy the ethhdr from first | ||
7453 | * buffer | ||
7454 | @@ -2792,6 +2791,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev) | ||
7455 | return -ENOMEM; | ||
7456 | } | ||
7457 | |||
7458 | + lrg_buf_cb->skb = skb; | ||
7459 | dma_unmap_addr_set(lrg_buf_cb, mapaddr, map); | ||
7460 | dma_unmap_len_set(lrg_buf_cb, maplen, | ||
7461 | qdev->lrg_buffer_len - | ||
7462 | diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c | ||
7463 | index 4fe0977d01fa..5ae0b5663d54 100644 | ||
7464 | --- a/drivers/net/ethernet/realtek/r8169_main.c | ||
7465 | +++ b/drivers/net/ethernet/realtek/r8169_main.c | ||
7466 | @@ -680,6 +680,7 @@ struct rtl8169_private { | ||
7467 | struct rtl8169_counters *counters; | ||
7468 | struct rtl8169_tc_offsets tc_offset; | ||
7469 | u32 saved_wolopts; | ||
7470 | + int eee_adv; | ||
7471 | |||
7472 | const char *fw_name; | ||
7473 | struct rtl_fw *rtl_fw; | ||
7474 | @@ -2075,6 +2076,10 @@ static int rtl8169_set_eee(struct net_device *dev, struct ethtool_eee *data) | ||
7475 | } | ||
7476 | |||
7477 | ret = phy_ethtool_set_eee(tp->phydev, data); | ||
7478 | + | ||
7479 | + if (!ret) | ||
7480 | + tp->eee_adv = phy_read_mmd(dev->phydev, MDIO_MMD_AN, | ||
7481 | + MDIO_AN_EEE_ADV); | ||
7482 | out: | ||
7483 | pm_runtime_put_noidle(d); | ||
7484 | return ret; | ||
7485 | @@ -2105,10 +2110,16 @@ static const struct ethtool_ops rtl8169_ethtool_ops = { | ||
7486 | static void rtl_enable_eee(struct rtl8169_private *tp) | ||
7487 | { | ||
7488 | struct phy_device *phydev = tp->phydev; | ||
7489 | - int supported = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); | ||
7490 | + int adv; | ||
7491 | + | ||
7492 | + /* respect EEE advertisement the user may have set */ | ||
7493 | + if (tp->eee_adv >= 0) | ||
7494 | + adv = tp->eee_adv; | ||
7495 | + else | ||
7496 | + adv = phy_read_mmd(phydev, MDIO_MMD_PCS, MDIO_PCS_EEE_ABLE); | ||
7497 | |||
7498 | - if (supported > 0) | ||
7499 | - phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, supported); | ||
7500 | + if (adv >= 0) | ||
7501 | + phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv); | ||
7502 | } | ||
7503 | |||
7504 | static void rtl8169_get_mac_version(struct rtl8169_private *tp) | ||
7505 | @@ -7064,6 +7075,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
7506 | tp->pci_dev = pdev; | ||
7507 | tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT); | ||
7508 | tp->supports_gmii = ent->driver_data == RTL_CFG_NO_GBIT ? 0 : 1; | ||
7509 | + tp->eee_adv = -1; | ||
7510 | |||
7511 | /* Get the *optional* external "ether_clk" used on some boards */ | ||
7512 | rc = rtl_get_ether_clk(tp); | ||
7513 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
7514 | index 170c3a052b14..1f230bd854c4 100644 | ||
7515 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
7516 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c | ||
7517 | @@ -320,7 +320,7 @@ out: | ||
7518 | static int stmmac_dt_phy(struct plat_stmmacenet_data *plat, | ||
7519 | struct device_node *np, struct device *dev) | ||
7520 | { | ||
7521 | - bool mdio = true; | ||
7522 | + bool mdio = false; | ||
7523 | static const struct of_device_id need_mdio_ids[] = { | ||
7524 | { .compatible = "snps,dwc-qos-ethernet-4.10" }, | ||
7525 | {}, | ||
7526 | diff --git a/drivers/net/ethernet/ti/Kconfig b/drivers/net/ethernet/ti/Kconfig | ||
7527 | index 834afca3a019..137632b09c72 100644 | ||
7528 | --- a/drivers/net/ethernet/ti/Kconfig | ||
7529 | +++ b/drivers/net/ethernet/ti/Kconfig | ||
7530 | @@ -22,6 +22,7 @@ config TI_DAVINCI_EMAC | ||
7531 | depends on ARM && ( ARCH_DAVINCI || ARCH_OMAP3 ) || COMPILE_TEST | ||
7532 | select TI_DAVINCI_MDIO | ||
7533 | select PHYLIB | ||
7534 | + select GENERIC_ALLOCATOR | ||
7535 | ---help--- | ||
7536 | This driver supports TI's DaVinci Ethernet . | ||
7537 | |||
7538 | diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c | ||
7539 | index 84025dcc78d5..e7c24396933e 100644 | ||
7540 | --- a/drivers/net/ethernet/ti/cpsw_ale.c | ||
7541 | +++ b/drivers/net/ethernet/ti/cpsw_ale.c | ||
7542 | @@ -779,6 +779,7 @@ void cpsw_ale_start(struct cpsw_ale *ale) | ||
7543 | void cpsw_ale_stop(struct cpsw_ale *ale) | ||
7544 | { | ||
7545 | del_timer_sync(&ale->timer); | ||
7546 | + cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); | ||
7547 | cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0); | ||
7548 | } | ||
7549 | |||
7550 | @@ -862,6 +863,7 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params) | ||
7551 | ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS; | ||
7552 | } | ||
7553 | |||
7554 | + cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1); | ||
7555 | return ale; | ||
7556 | } | ||
7557 | |||
7558 | diff --git a/drivers/net/ethernet/ti/davinci_cpdma.c b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
7559 | index 37ba708ac781..6614fa3089b2 100644 | ||
7560 | --- a/drivers/net/ethernet/ti/davinci_cpdma.c | ||
7561 | +++ b/drivers/net/ethernet/ti/davinci_cpdma.c | ||
7562 | @@ -1018,7 +1018,6 @@ static int cpdma_chan_submit_si(struct submit_info *si) | ||
7563 | struct cpdma_chan *chan = si->chan; | ||
7564 | struct cpdma_ctlr *ctlr = chan->ctlr; | ||
7565 | int len = si->len; | ||
7566 | - int swlen = len; | ||
7567 | struct cpdma_desc __iomem *desc; | ||
7568 | dma_addr_t buffer; | ||
7569 | u32 mode; | ||
7570 | @@ -1046,7 +1045,6 @@ static int cpdma_chan_submit_si(struct submit_info *si) | ||
7571 | if (si->data_dma) { | ||
7572 | buffer = si->data_dma; | ||
7573 | dma_sync_single_for_device(ctlr->dev, buffer, len, chan->dir); | ||
7574 | - swlen |= CPDMA_DMA_EXT_MAP; | ||
7575 | } else { | ||
7576 | buffer = dma_map_single(ctlr->dev, si->data_virt, len, chan->dir); | ||
7577 | ret = dma_mapping_error(ctlr->dev, buffer); | ||
7578 | @@ -1065,7 +1063,8 @@ static int cpdma_chan_submit_si(struct submit_info *si) | ||
7579 | writel_relaxed(mode | len, &desc->hw_mode); | ||
7580 | writel_relaxed((uintptr_t)si->token, &desc->sw_token); | ||
7581 | writel_relaxed(buffer, &desc->sw_buffer); | ||
7582 | - writel_relaxed(swlen, &desc->sw_len); | ||
7583 | + writel_relaxed(si->data_dma ? len | CPDMA_DMA_EXT_MAP : len, | ||
7584 | + &desc->sw_len); | ||
7585 | desc_read(desc, sw_len); | ||
7586 | |||
7587 | __cpdma_chan_submit(chan, desc); | ||
7588 | diff --git a/drivers/net/fjes/fjes_main.c b/drivers/net/fjes/fjes_main.c | ||
7589 | index b517c1af9de0..91a1059517f5 100644 | ||
7590 | --- a/drivers/net/fjes/fjes_main.c | ||
7591 | +++ b/drivers/net/fjes/fjes_main.c | ||
7592 | @@ -166,6 +166,9 @@ static int fjes_acpi_add(struct acpi_device *device) | ||
7593 | /* create platform_device */ | ||
7594 | plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource, | ||
7595 | ARRAY_SIZE(fjes_resource)); | ||
7596 | + if (IS_ERR(plat_dev)) | ||
7597 | + return PTR_ERR(plat_dev); | ||
7598 | + | ||
7599 | device->driver_data = plat_dev; | ||
7600 | |||
7601 | return 0; | ||
7602 | diff --git a/drivers/net/phy/dp83867.c b/drivers/net/phy/dp83867.c | ||
7603 | index 37fceaf9fa10..cf4455bbf888 100644 | ||
7604 | --- a/drivers/net/phy/dp83867.c | ||
7605 | +++ b/drivers/net/phy/dp83867.c | ||
7606 | @@ -95,6 +95,10 @@ | ||
7607 | #define DP83867_IO_MUX_CFG_CLK_O_SEL_MASK (0x1f << 8) | ||
7608 | #define DP83867_IO_MUX_CFG_CLK_O_SEL_SHIFT 8 | ||
7609 | |||
7610 | +/* CFG3 bits */ | ||
7611 | +#define DP83867_CFG3_INT_OE BIT(7) | ||
7612 | +#define DP83867_CFG3_ROBUST_AUTO_MDIX BIT(9) | ||
7613 | + | ||
7614 | /* CFG4 bits */ | ||
7615 | #define DP83867_CFG4_PORT_MIRROR_EN BIT(0) | ||
7616 | |||
7617 | @@ -410,12 +414,13 @@ static int dp83867_config_init(struct phy_device *phydev) | ||
7618 | phy_write_mmd(phydev, DP83867_DEVADDR, DP83867_SGMIICTL, val); | ||
7619 | } | ||
7620 | |||
7621 | + val = phy_read(phydev, DP83867_CFG3); | ||
7622 | /* Enable Interrupt output INT_OE in CFG3 register */ | ||
7623 | - if (phy_interrupt_is_valid(phydev)) { | ||
7624 | - val = phy_read(phydev, DP83867_CFG3); | ||
7625 | - val |= BIT(7); | ||
7626 | - phy_write(phydev, DP83867_CFG3, val); | ||
7627 | - } | ||
7628 | + if (phy_interrupt_is_valid(phydev)) | ||
7629 | + val |= DP83867_CFG3_INT_OE; | ||
7630 | + | ||
7631 | + val |= DP83867_CFG3_ROBUST_AUTO_MDIX; | ||
7632 | + phy_write(phydev, DP83867_CFG3, val); | ||
7633 | |||
7634 | if (dp83867->port_mirroring != DP83867_PORT_MIRROING_KEEP) | ||
7635 | dp83867_config_port_mirroring(phydev); | ||
7636 | diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c | ||
7637 | index adb66a2fae18..2bf0fda209a8 100644 | ||
7638 | --- a/drivers/net/phy/phy_device.c | ||
7639 | +++ b/drivers/net/phy/phy_device.c | ||
7640 | @@ -488,7 +488,7 @@ static int phy_bus_match(struct device *dev, struct device_driver *drv) | ||
7641 | |||
7642 | if (phydev->is_c45) { | ||
7643 | for (i = 1; i < num_ids; i++) { | ||
7644 | - if (!(phydev->c45_ids.devices_in_package & (1 << i))) | ||
7645 | + if (phydev->c45_ids.device_ids[i] == 0xffffffff) | ||
7646 | continue; | ||
7647 | |||
7648 | if ((phydrv->phy_id & phydrv->phy_id_mask) == | ||
7649 | @@ -552,7 +552,7 @@ static const struct device_type mdio_bus_phy_type = { | ||
7650 | .pm = MDIO_BUS_PHY_PM_OPS, | ||
7651 | }; | ||
7652 | |||
7653 | -static int phy_request_driver_module(struct phy_device *dev, int phy_id) | ||
7654 | +static int phy_request_driver_module(struct phy_device *dev, u32 phy_id) | ||
7655 | { | ||
7656 | int ret; | ||
7657 | |||
7658 | @@ -564,15 +564,15 @@ static int phy_request_driver_module(struct phy_device *dev, int phy_id) | ||
7659 | * then modprobe isn't available. | ||
7660 | */ | ||
7661 | if (IS_ENABLED(CONFIG_MODULES) && ret < 0 && ret != -ENOENT) { | ||
7662 | - phydev_err(dev, "error %d loading PHY driver module for ID 0x%08x\n", | ||
7663 | - ret, phy_id); | ||
7664 | + phydev_err(dev, "error %d loading PHY driver module for ID 0x%08lx\n", | ||
7665 | + ret, (unsigned long)phy_id); | ||
7666 | return ret; | ||
7667 | } | ||
7668 | |||
7669 | return 0; | ||
7670 | } | ||
7671 | |||
7672 | -struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||
7673 | +struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id, | ||
7674 | bool is_c45, | ||
7675 | struct phy_c45_device_ids *c45_ids) | ||
7676 | { | ||
7677 | @@ -596,8 +596,8 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||
7678 | mdiodev->device_free = phy_mdio_device_free; | ||
7679 | mdiodev->device_remove = phy_mdio_device_remove; | ||
7680 | |||
7681 | - dev->speed = 0; | ||
7682 | - dev->duplex = -1; | ||
7683 | + dev->speed = SPEED_UNKNOWN; | ||
7684 | + dev->duplex = DUPLEX_UNKNOWN; | ||
7685 | dev->pause = 0; | ||
7686 | dev->asym_pause = 0; | ||
7687 | dev->link = 0; | ||
7688 | @@ -632,7 +632,7 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||
7689 | int i; | ||
7690 | |||
7691 | for (i = 1; i < num_ids; i++) { | ||
7692 | - if (!(c45_ids->devices_in_package & (1 << i))) | ||
7693 | + if (c45_ids->device_ids[i] == 0xffffffff) | ||
7694 | continue; | ||
7695 | |||
7696 | ret = phy_request_driver_module(dev, | ||
7697 | @@ -812,10 +812,13 @@ static int get_phy_id(struct mii_bus *bus, int addr, u32 *phy_id, | ||
7698 | */ | ||
7699 | struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45) | ||
7700 | { | ||
7701 | - struct phy_c45_device_ids c45_ids = {0}; | ||
7702 | + struct phy_c45_device_ids c45_ids; | ||
7703 | u32 phy_id = 0; | ||
7704 | int r; | ||
7705 | |||
7706 | + c45_ids.devices_in_package = 0; | ||
7707 | + memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids)); | ||
7708 | + | ||
7709 | r = get_phy_id(bus, addr, &phy_id, is_c45, &c45_ids); | ||
7710 | if (r) | ||
7711 | return ERR_PTR(r); | ||
7712 | diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c | ||
7713 | index 8156b33ee3e7..ca70a1d840eb 100644 | ||
7714 | --- a/drivers/net/team/team.c | ||
7715 | +++ b/drivers/net/team/team.c | ||
7716 | @@ -2074,7 +2074,8 @@ static int team_ethtool_get_link_ksettings(struct net_device *dev, | ||
7717 | cmd->base.duplex = DUPLEX_UNKNOWN; | ||
7718 | cmd->base.port = PORT_OTHER; | ||
7719 | |||
7720 | - list_for_each_entry(port, &team->port_list, list) { | ||
7721 | + rcu_read_lock(); | ||
7722 | + list_for_each_entry_rcu(port, &team->port_list, list) { | ||
7723 | if (team_port_txable(port)) { | ||
7724 | if (port->state.speed != SPEED_UNKNOWN) | ||
7725 | speed += port->state.speed; | ||
7726 | @@ -2083,6 +2084,8 @@ static int team_ethtool_get_link_ksettings(struct net_device *dev, | ||
7727 | cmd->base.duplex = port->state.duplex; | ||
7728 | } | ||
7729 | } | ||
7730 | + rcu_read_unlock(); | ||
7731 | + | ||
7732 | cmd->base.speed = speed ? : SPEED_UNKNOWN; | ||
7733 | |||
7734 | return 0; | ||
7735 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
7736 | index a8d3141582a5..16564ebcde50 100644 | ||
7737 | --- a/drivers/net/tun.c | ||
7738 | +++ b/drivers/net/tun.c | ||
7739 | @@ -313,8 +313,8 @@ static void tun_napi_init(struct tun_struct *tun, struct tun_file *tfile, | ||
7740 | tfile->napi_enabled = napi_en; | ||
7741 | tfile->napi_frags_enabled = napi_en && napi_frags; | ||
7742 | if (napi_en) { | ||
7743 | - netif_napi_add(tun->dev, &tfile->napi, tun_napi_poll, | ||
7744 | - NAPI_POLL_WEIGHT); | ||
7745 | + netif_tx_napi_add(tun->dev, &tfile->napi, tun_napi_poll, | ||
7746 | + NAPI_POLL_WEIGHT); | ||
7747 | napi_enable(&tfile->napi); | ||
7748 | } | ||
7749 | } | ||
7750 | diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c | ||
7751 | index f24a1b0b801f..0becc79fd431 100644 | ||
7752 | --- a/drivers/net/usb/lan78xx.c | ||
7753 | +++ b/drivers/net/usb/lan78xx.c | ||
7754 | @@ -1808,6 +1808,7 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev) | ||
7755 | dev->mdiobus->read = lan78xx_mdiobus_read; | ||
7756 | dev->mdiobus->write = lan78xx_mdiobus_write; | ||
7757 | dev->mdiobus->name = "lan78xx-mdiobus"; | ||
7758 | + dev->mdiobus->parent = &dev->udev->dev; | ||
7759 | |||
7760 | snprintf(dev->mdiobus->id, MII_BUS_ID_SIZE, "usb-%03d:%03d", | ||
7761 | dev->udev->bus->busnum, dev->udev->devnum); | ||
7762 | diff --git a/drivers/net/wireless/ath/ath10k/coredump.c b/drivers/net/wireless/ath/ath10k/coredump.c | ||
7763 | index b6d2932383cf..1cfe75a2d0c3 100644 | ||
7764 | --- a/drivers/net/wireless/ath/ath10k/coredump.c | ||
7765 | +++ b/drivers/net/wireless/ath/ath10k/coredump.c | ||
7766 | @@ -1208,9 +1208,11 @@ static struct ath10k_dump_file_data *ath10k_coredump_build(struct ath10k *ar) | ||
7767 | dump_tlv = (struct ath10k_tlv_dump_data *)(buf + sofar); | ||
7768 | dump_tlv->type = cpu_to_le32(ATH10K_FW_CRASH_DUMP_RAM_DATA); | ||
7769 | dump_tlv->tlv_len = cpu_to_le32(crash_data->ramdump_buf_len); | ||
7770 | - memcpy(dump_tlv->tlv_data, crash_data->ramdump_buf, | ||
7771 | - crash_data->ramdump_buf_len); | ||
7772 | - sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len; | ||
7773 | + if (crash_data->ramdump_buf_len) { | ||
7774 | + memcpy(dump_tlv->tlv_data, crash_data->ramdump_buf, | ||
7775 | + crash_data->ramdump_buf_len); | ||
7776 | + sofar += sizeof(*dump_tlv) + crash_data->ramdump_buf_len; | ||
7777 | + } | ||
7778 | } | ||
7779 | |||
7780 | mutex_unlock(&ar->dump_mutex); | ||
7781 | @@ -1257,6 +1259,9 @@ int ath10k_coredump_register(struct ath10k *ar) | ||
7782 | if (test_bit(ATH10K_FW_CRASH_DUMP_RAM_DATA, &ath10k_coredump_mask)) { | ||
7783 | crash_data->ramdump_buf_len = ath10k_coredump_get_ramdump_size(ar); | ||
7784 | |||
7785 | + if (!crash_data->ramdump_buf_len) | ||
7786 | + return 0; | ||
7787 | + | ||
7788 | crash_data->ramdump_buf = vzalloc(crash_data->ramdump_buf_len); | ||
7789 | if (!crash_data->ramdump_buf) | ||
7790 | return -ENOMEM; | ||
7791 | diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7792 | index 53f1095de8ff..9f0e7b4943ec 100644 | ||
7793 | --- a/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7794 | +++ b/drivers/net/wireless/ath/ath10k/htt_rx.c | ||
7795 | @@ -2726,7 +2726,7 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar, | ||
7796 | spin_lock_bh(&ar->data_lock); | ||
7797 | |||
7798 | peer = ath10k_peer_find_by_id(ar, peer_id); | ||
7799 | - if (!peer) { | ||
7800 | + if (!peer || !peer->sta) { | ||
7801 | spin_unlock_bh(&ar->data_lock); | ||
7802 | rcu_read_unlock(); | ||
7803 | continue; | ||
7804 | diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c | ||
7805 | index a6d21856b7e7..36d24ea126a2 100644 | ||
7806 | --- a/drivers/net/wireless/ath/ath10k/mac.c | ||
7807 | +++ b/drivers/net/wireless/ath/ath10k/mac.c | ||
7808 | @@ -3708,7 +3708,7 @@ static int ath10k_mac_tx(struct ath10k *ar, | ||
7809 | struct ieee80211_vif *vif, | ||
7810 | enum ath10k_hw_txrx_mode txmode, | ||
7811 | enum ath10k_mac_tx_path txpath, | ||
7812 | - struct sk_buff *skb) | ||
7813 | + struct sk_buff *skb, bool noque_offchan) | ||
7814 | { | ||
7815 | struct ieee80211_hw *hw = ar->hw; | ||
7816 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | ||
7817 | @@ -3738,10 +3738,10 @@ static int ath10k_mac_tx(struct ath10k *ar, | ||
7818 | } | ||
7819 | } | ||
7820 | |||
7821 | - if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { | ||
7822 | + if (!noque_offchan && info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) { | ||
7823 | if (!ath10k_mac_tx_frm_has_freq(ar)) { | ||
7824 | - ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %pK\n", | ||
7825 | - skb); | ||
7826 | + ath10k_dbg(ar, ATH10K_DBG_MAC, "mac queued offchannel skb %pK len %d\n", | ||
7827 | + skb, skb->len); | ||
7828 | |||
7829 | skb_queue_tail(&ar->offchan_tx_queue, skb); | ||
7830 | ieee80211_queue_work(hw, &ar->offchan_tx_work); | ||
7831 | @@ -3803,8 +3803,8 @@ void ath10k_offchan_tx_work(struct work_struct *work) | ||
7832 | |||
7833 | mutex_lock(&ar->conf_mutex); | ||
7834 | |||
7835 | - ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK\n", | ||
7836 | - skb); | ||
7837 | + ath10k_dbg(ar, ATH10K_DBG_MAC, "mac offchannel skb %pK len %d\n", | ||
7838 | + skb, skb->len); | ||
7839 | |||
7840 | hdr = (struct ieee80211_hdr *)skb->data; | ||
7841 | peer_addr = ieee80211_get_DA(hdr); | ||
7842 | @@ -3850,7 +3850,7 @@ void ath10k_offchan_tx_work(struct work_struct *work) | ||
7843 | txmode = ath10k_mac_tx_h_get_txmode(ar, vif, sta, skb); | ||
7844 | txpath = ath10k_mac_tx_h_get_txpath(ar, skb, txmode); | ||
7845 | |||
7846 | - ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); | ||
7847 | + ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, true); | ||
7848 | if (ret) { | ||
7849 | ath10k_warn(ar, "failed to transmit offchannel frame: %d\n", | ||
7850 | ret); | ||
7851 | @@ -3860,8 +3860,8 @@ void ath10k_offchan_tx_work(struct work_struct *work) | ||
7852 | time_left = | ||
7853 | wait_for_completion_timeout(&ar->offchan_tx_completed, 3 * HZ); | ||
7854 | if (time_left == 0) | ||
7855 | - ath10k_warn(ar, "timed out waiting for offchannel skb %pK\n", | ||
7856 | - skb); | ||
7857 | + ath10k_warn(ar, "timed out waiting for offchannel skb %pK, len: %d\n", | ||
7858 | + skb, skb->len); | ||
7859 | |||
7860 | if (!peer && tmp_peer_created) { | ||
7861 | ret = ath10k_peer_delete(ar, vdev_id, peer_addr); | ||
7862 | @@ -3903,8 +3903,10 @@ void ath10k_mgmt_over_wmi_tx_work(struct work_struct *work) | ||
7863 | ar->running_fw->fw_file.fw_features)) { | ||
7864 | paddr = dma_map_single(ar->dev, skb->data, | ||
7865 | skb->len, DMA_TO_DEVICE); | ||
7866 | - if (!paddr) | ||
7867 | + if (dma_mapping_error(ar->dev, paddr)) { | ||
7868 | + ieee80211_free_txskb(ar->hw, skb); | ||
7869 | continue; | ||
7870 | + } | ||
7871 | ret = ath10k_wmi_mgmt_tx_send(ar, skb, paddr); | ||
7872 | if (ret) { | ||
7873 | ath10k_warn(ar, "failed to transmit management frame by ref via WMI: %d\n", | ||
7874 | @@ -4097,7 +4099,7 @@ int ath10k_mac_tx_push_txq(struct ieee80211_hw *hw, | ||
7875 | spin_unlock_bh(&ar->htt.tx_lock); | ||
7876 | } | ||
7877 | |||
7878 | - ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); | ||
7879 | + ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false); | ||
7880 | if (unlikely(ret)) { | ||
7881 | ath10k_warn(ar, "failed to push frame: %d\n", ret); | ||
7882 | |||
7883 | @@ -4378,7 +4380,7 @@ static void ath10k_mac_op_tx(struct ieee80211_hw *hw, | ||
7884 | spin_unlock_bh(&ar->htt.tx_lock); | ||
7885 | } | ||
7886 | |||
7887 | - ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb); | ||
7888 | + ret = ath10k_mac_tx(ar, vif, txmode, txpath, skb, false); | ||
7889 | if (ret) { | ||
7890 | ath10k_warn(ar, "failed to transmit frame: %d\n", ret); | ||
7891 | if (is_htt) { | ||
7892 | diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c | ||
7893 | index 4102df016931..39abf8b12903 100644 | ||
7894 | --- a/drivers/net/wireless/ath/ath10k/txrx.c | ||
7895 | +++ b/drivers/net/wireless/ath/ath10k/txrx.c | ||
7896 | @@ -95,6 +95,8 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt, | ||
7897 | |||
7898 | info = IEEE80211_SKB_CB(msdu); | ||
7899 | memset(&info->status, 0, sizeof(info->status)); | ||
7900 | + info->status.rates[0].idx = -1; | ||
7901 | + | ||
7902 | trace_ath10k_txrx_tx_unref(ar, tx_done->msdu_id); | ||
7903 | |||
7904 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) | ||
7905 | diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7906 | index 406b367c284c..85cf96461dde 100644 | ||
7907 | --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7908 | +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | ||
7909 | @@ -1350,6 +1350,11 @@ void brcmf_detach(struct device *dev) | ||
7910 | brcmf_fweh_detach(drvr); | ||
7911 | brcmf_proto_detach(drvr); | ||
7912 | |||
7913 | + if (drvr->mon_if) { | ||
7914 | + brcmf_net_detach(drvr->mon_if->ndev, false); | ||
7915 | + drvr->mon_if = NULL; | ||
7916 | + } | ||
7917 | + | ||
7918 | /* make sure primary interface removed last */ | ||
7919 | for (i = BRCMF_MAX_IFS - 1; i > -1; i--) { | ||
7920 | if (drvr->iflist[i]) | ||
7921 | diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/led.c b/drivers/net/wireless/intel/iwlwifi/dvm/led.c | ||
7922 | index dd387aba3317..e8a4d604b910 100644 | ||
7923 | --- a/drivers/net/wireless/intel/iwlwifi/dvm/led.c | ||
7924 | +++ b/drivers/net/wireless/intel/iwlwifi/dvm/led.c | ||
7925 | @@ -171,6 +171,9 @@ void iwl_leds_init(struct iwl_priv *priv) | ||
7926 | |||
7927 | priv->led.name = kasprintf(GFP_KERNEL, "%s-led", | ||
7928 | wiphy_name(priv->hw->wiphy)); | ||
7929 | + if (!priv->led.name) | ||
7930 | + return; | ||
7931 | + | ||
7932 | priv->led.brightness_set = iwl_led_brightness_set; | ||
7933 | priv->led.blink_set = iwl_led_blink_set; | ||
7934 | priv->led.max_brightness = 1; | ||
7935 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/led.c b/drivers/net/wireless/intel/iwlwifi/mvm/led.c | ||
7936 | index d104da9170ca..72c4b2b8399d 100644 | ||
7937 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/led.c | ||
7938 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/led.c | ||
7939 | @@ -129,6 +129,9 @@ int iwl_mvm_leds_init(struct iwl_mvm *mvm) | ||
7940 | |||
7941 | mvm->led.name = kasprintf(GFP_KERNEL, "%s-led", | ||
7942 | wiphy_name(mvm->hw->wiphy)); | ||
7943 | + if (!mvm->led.name) | ||
7944 | + return -ENOMEM; | ||
7945 | + | ||
7946 | mvm->led.brightness_set = iwl_led_brightness_set; | ||
7947 | mvm->led.max_brightness = 1; | ||
7948 | |||
7949 | diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c | ||
7950 | index 0ad8ed23a455..5ee33c8ae9d2 100644 | ||
7951 | --- a/drivers/net/wireless/intel/iwlwifi/mvm/rx.c | ||
7952 | +++ b/drivers/net/wireless/intel/iwlwifi/mvm/rx.c | ||
7953 | @@ -60,6 +60,7 @@ | ||
7954 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
7955 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
7956 | *****************************************************************************/ | ||
7957 | +#include <asm/unaligned.h> | ||
7958 | #include <linux/etherdevice.h> | ||
7959 | #include <linux/skbuff.h> | ||
7960 | #include "iwl-trans.h" | ||
7961 | @@ -357,7 +358,7 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi, | ||
7962 | rx_res = (struct iwl_rx_mpdu_res_start *)pkt->data; | ||
7963 | hdr = (struct ieee80211_hdr *)(pkt->data + sizeof(*rx_res)); | ||
7964 | len = le16_to_cpu(rx_res->byte_count); | ||
7965 | - rx_pkt_status = le32_to_cpup((__le32 *) | ||
7966 | + rx_pkt_status = get_unaligned_le32((__le32 *) | ||
7967 | (pkt->data + sizeof(*rx_res) + len)); | ||
7968 | |||
7969 | /* Dont use dev_alloc_skb(), we'll have enough headroom once | ||
7970 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
7971 | index 19dd075f2f63..041dd75ac72b 100644 | ||
7972 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
7973 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c | ||
7974 | @@ -1429,6 +1429,7 @@ out_err: | ||
7975 | static void iwl_pcie_rx_handle(struct iwl_trans *trans, int queue) | ||
7976 | { | ||
7977 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
7978 | + struct napi_struct *napi; | ||
7979 | struct iwl_rxq *rxq; | ||
7980 | u32 r, i, count = 0; | ||
7981 | bool emergency = false; | ||
7982 | @@ -1534,8 +1535,16 @@ out: | ||
7983 | if (unlikely(emergency && count)) | ||
7984 | iwl_pcie_rxq_alloc_rbs(trans, GFP_ATOMIC, rxq); | ||
7985 | |||
7986 | - if (rxq->napi.poll) | ||
7987 | - napi_gro_flush(&rxq->napi, false); | ||
7988 | + napi = &rxq->napi; | ||
7989 | + if (napi->poll) { | ||
7990 | + if (napi->rx_count) { | ||
7991 | + netif_receive_skb_list(&napi->rx_list); | ||
7992 | + INIT_LIST_HEAD(&napi->rx_list); | ||
7993 | + napi->rx_count = 0; | ||
7994 | + } | ||
7995 | + | ||
7996 | + napi_gro_flush(napi, false); | ||
7997 | + } | ||
7998 | |||
7999 | iwl_pcie_rxq_restock(trans, rxq); | ||
8000 | } | ||
8001 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
8002 | index ca3bb4d65b00..df8455f14e4d 100644 | ||
8003 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
8004 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c | ||
8005 | @@ -57,24 +57,6 @@ | ||
8006 | #include "internal.h" | ||
8007 | #include "fw/dbg.h" | ||
8008 | |||
8009 | -static int iwl_pcie_gen2_force_power_gating(struct iwl_trans *trans) | ||
8010 | -{ | ||
8011 | - iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8012 | - HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE); | ||
8013 | - udelay(20); | ||
8014 | - iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8015 | - HPM_HIPM_GEN_CFG_CR_PG_EN | | ||
8016 | - HPM_HIPM_GEN_CFG_CR_SLP_EN); | ||
8017 | - udelay(20); | ||
8018 | - iwl_clear_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8019 | - HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE); | ||
8020 | - | ||
8021 | - iwl_trans_sw_reset(trans); | ||
8022 | - iwl_clear_bit(trans, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); | ||
8023 | - | ||
8024 | - return 0; | ||
8025 | -} | ||
8026 | - | ||
8027 | /* | ||
8028 | * Start up NIC's basic functionality after it has been reset | ||
8029 | * (e.g. after platform boot, or shutdown via iwl_pcie_apm_stop()) | ||
8030 | @@ -110,13 +92,6 @@ int iwl_pcie_gen2_apm_init(struct iwl_trans *trans) | ||
8031 | |||
8032 | iwl_pcie_apm_config(trans); | ||
8033 | |||
8034 | - if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 && | ||
8035 | - trans->cfg->integrated) { | ||
8036 | - ret = iwl_pcie_gen2_force_power_gating(trans); | ||
8037 | - if (ret) | ||
8038 | - return ret; | ||
8039 | - } | ||
8040 | - | ||
8041 | ret = iwl_finish_nic_init(trans, trans->trans_cfg); | ||
8042 | if (ret) | ||
8043 | return ret; | ||
8044 | diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
8045 | index 6961f00ff812..d3db38c3095b 100644 | ||
8046 | --- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
8047 | +++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c | ||
8048 | @@ -1783,6 +1783,29 @@ static int iwl_trans_pcie_clear_persistence_bit(struct iwl_trans *trans) | ||
8049 | return 0; | ||
8050 | } | ||
8051 | |||
8052 | +static int iwl_pcie_gen2_force_power_gating(struct iwl_trans *trans) | ||
8053 | +{ | ||
8054 | + int ret; | ||
8055 | + | ||
8056 | + ret = iwl_finish_nic_init(trans, trans->trans_cfg); | ||
8057 | + if (ret < 0) | ||
8058 | + return ret; | ||
8059 | + | ||
8060 | + iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8061 | + HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE); | ||
8062 | + udelay(20); | ||
8063 | + iwl_set_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8064 | + HPM_HIPM_GEN_CFG_CR_PG_EN | | ||
8065 | + HPM_HIPM_GEN_CFG_CR_SLP_EN); | ||
8066 | + udelay(20); | ||
8067 | + iwl_clear_bits_prph(trans, HPM_HIPM_GEN_CFG, | ||
8068 | + HPM_HIPM_GEN_CFG_CR_FORCE_ACTIVE); | ||
8069 | + | ||
8070 | + iwl_trans_pcie_sw_reset(trans); | ||
8071 | + | ||
8072 | + return 0; | ||
8073 | +} | ||
8074 | + | ||
8075 | static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans) | ||
8076 | { | ||
8077 | struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); | ||
8078 | @@ -1802,6 +1825,13 @@ static int _iwl_trans_pcie_start_hw(struct iwl_trans *trans) | ||
8079 | |||
8080 | iwl_trans_pcie_sw_reset(trans); | ||
8081 | |||
8082 | + if (trans->trans_cfg->device_family == IWL_DEVICE_FAMILY_22000 && | ||
8083 | + trans->cfg->integrated) { | ||
8084 | + err = iwl_pcie_gen2_force_power_gating(trans); | ||
8085 | + if (err) | ||
8086 | + return err; | ||
8087 | + } | ||
8088 | + | ||
8089 | err = iwl_pcie_apm_init(trans); | ||
8090 | if (err) | ||
8091 | return err; | ||
8092 | diff --git a/drivers/net/wireless/marvell/libertas/if_sdio.c b/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
8093 | index 242d8845da3f..30f1025ecb9b 100644 | ||
8094 | --- a/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
8095 | +++ b/drivers/net/wireless/marvell/libertas/if_sdio.c | ||
8096 | @@ -1179,6 +1179,10 @@ static int if_sdio_probe(struct sdio_func *func, | ||
8097 | |||
8098 | spin_lock_init(&card->lock); | ||
8099 | card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0); | ||
8100 | + if (unlikely(!card->workqueue)) { | ||
8101 | + ret = -ENOMEM; | ||
8102 | + goto err_queue; | ||
8103 | + } | ||
8104 | INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker); | ||
8105 | init_waitqueue_head(&card->pwron_waitq); | ||
8106 | |||
8107 | @@ -1230,6 +1234,7 @@ err_activate_card: | ||
8108 | lbs_remove_card(priv); | ||
8109 | free: | ||
8110 | destroy_workqueue(card->workqueue); | ||
8111 | +err_queue: | ||
8112 | while (card->packets) { | ||
8113 | packet = card->packets; | ||
8114 | card->packets = card->packets->next; | ||
8115 | diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
8116 | index eff06d59e9df..096334e941a1 100644 | ||
8117 | --- a/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
8118 | +++ b/drivers/net/wireless/marvell/mwifiex/pcie.c | ||
8119 | @@ -687,8 +687,11 @@ static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter) | ||
8120 | skb_put(skb, MAX_EVENT_SIZE); | ||
8121 | |||
8122 | if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE, | ||
8123 | - PCI_DMA_FROMDEVICE)) | ||
8124 | + PCI_DMA_FROMDEVICE)) { | ||
8125 | + kfree_skb(skb); | ||
8126 | + kfree(card->evtbd_ring_vbase); | ||
8127 | return -1; | ||
8128 | + } | ||
8129 | |||
8130 | buf_pa = MWIFIEX_SKB_DMA_ADDR(skb); | ||
8131 | |||
8132 | diff --git a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c | ||
8133 | index c328192307c4..ff3f3d98b625 100644 | ||
8134 | --- a/drivers/net/wireless/mediatek/mt76/mt7603/mac.c | ||
8135 | +++ b/drivers/net/wireless/mediatek/mt76/mt7603/mac.c | ||
8136 | @@ -1032,8 +1032,10 @@ mt7603_fill_txs(struct mt7603_dev *dev, struct mt7603_sta *sta, | ||
8137 | if (idx && (cur_rate->idx != info->status.rates[i].idx || | ||
8138 | cur_rate->flags != info->status.rates[i].flags)) { | ||
8139 | i++; | ||
8140 | - if (i == ARRAY_SIZE(info->status.rates)) | ||
8141 | + if (i == ARRAY_SIZE(info->status.rates)) { | ||
8142 | + i--; | ||
8143 | break; | ||
8144 | + } | ||
8145 | |||
8146 | info->status.rates[i] = *cur_rate; | ||
8147 | info->status.rates[i].count = 0; | ||
8148 | diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c | ||
8149 | index e07ce2c10013..111e38ff954a 100644 | ||
8150 | --- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c | ||
8151 | +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c | ||
8152 | @@ -914,8 +914,10 @@ static bool mt7615_fill_txs(struct mt7615_dev *dev, struct mt7615_sta *sta, | ||
8153 | if (idx && (cur_rate->idx != info->status.rates[i].idx || | ||
8154 | cur_rate->flags != info->status.rates[i].flags)) { | ||
8155 | i++; | ||
8156 | - if (i == ARRAY_SIZE(info->status.rates)) | ||
8157 | + if (i == ARRAY_SIZE(info->status.rates)) { | ||
8158 | + i--; | ||
8159 | break; | ||
8160 | + } | ||
8161 | |||
8162 | info->status.rates[i] = *cur_rate; | ||
8163 | info->status.rates[i].count = 0; | ||
8164 | diff --git a/drivers/net/wireless/quantenna/qtnfmac/commands.c b/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
8165 | index dc0c7244b60e..c0c32805fb8d 100644 | ||
8166 | --- a/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
8167 | +++ b/drivers/net/wireless/quantenna/qtnfmac/commands.c | ||
8168 | @@ -83,6 +83,7 @@ static int qtnf_cmd_send_with_reply(struct qtnf_bus *bus, | ||
8169 | struct qlink_cmd *cmd; | ||
8170 | struct qlink_resp *resp = NULL; | ||
8171 | struct sk_buff *resp_skb = NULL; | ||
8172 | + int resp_res = 0; | ||
8173 | u16 cmd_id; | ||
8174 | u8 mac_id; | ||
8175 | u8 vif_id; | ||
8176 | @@ -113,6 +114,7 @@ static int qtnf_cmd_send_with_reply(struct qtnf_bus *bus, | ||
8177 | } | ||
8178 | |||
8179 | resp = (struct qlink_resp *)resp_skb->data; | ||
8180 | + resp_res = le16_to_cpu(resp->result); | ||
8181 | ret = qtnf_cmd_check_reply_header(resp, cmd_id, mac_id, vif_id, | ||
8182 | const_resp_size); | ||
8183 | if (ret) | ||
8184 | @@ -128,8 +130,8 @@ out: | ||
8185 | else | ||
8186 | consume_skb(resp_skb); | ||
8187 | |||
8188 | - if (!ret && resp) | ||
8189 | - return qtnf_cmd_resp_result_decode(le16_to_cpu(resp->result)); | ||
8190 | + if (!ret) | ||
8191 | + return qtnf_cmd_resp_result_decode(resp_res); | ||
8192 | |||
8193 | pr_warn("VIF%u.%u: cmd 0x%.4X failed: %d\n", | ||
8194 | mac_id, vif_id, cmd_id, ret); | ||
8195 | diff --git a/drivers/net/wireless/quantenna/qtnfmac/event.c b/drivers/net/wireless/quantenna/qtnfmac/event.c | ||
8196 | index b57c8c18a8d0..7846383c8828 100644 | ||
8197 | --- a/drivers/net/wireless/quantenna/qtnfmac/event.c | ||
8198 | +++ b/drivers/net/wireless/quantenna/qtnfmac/event.c | ||
8199 | @@ -171,8 +171,9 @@ qtnf_event_handle_bss_join(struct qtnf_vif *vif, | ||
8200 | return -EPROTO; | ||
8201 | } | ||
8202 | |||
8203 | - pr_debug("VIF%u.%u: BSSID:%pM status:%u\n", | ||
8204 | - vif->mac->macid, vif->vifid, join_info->bssid, status); | ||
8205 | + pr_debug("VIF%u.%u: BSSID:%pM chan:%u status:%u\n", | ||
8206 | + vif->mac->macid, vif->vifid, join_info->bssid, | ||
8207 | + le16_to_cpu(join_info->chan.chan.center_freq), status); | ||
8208 | |||
8209 | if (status != WLAN_STATUS_SUCCESS) | ||
8210 | goto done; | ||
8211 | @@ -181,7 +182,7 @@ qtnf_event_handle_bss_join(struct qtnf_vif *vif, | ||
8212 | if (!cfg80211_chandef_valid(&chandef)) { | ||
8213 | pr_warn("MAC%u.%u: bad channel freq=%u cf1=%u cf2=%u bw=%u\n", | ||
8214 | vif->mac->macid, vif->vifid, | ||
8215 | - chandef.chan->center_freq, | ||
8216 | + chandef.chan ? chandef.chan->center_freq : 0, | ||
8217 | chandef.center_freq1, | ||
8218 | chandef.center_freq2, | ||
8219 | chandef.width); | ||
8220 | diff --git a/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c b/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c | ||
8221 | index 8ae318b5fe54..4824be0c6231 100644 | ||
8222 | --- a/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c | ||
8223 | +++ b/drivers/net/wireless/quantenna/qtnfmac/pcie/pcie.c | ||
8224 | @@ -130,6 +130,8 @@ static int qtnf_dbg_shm_stats(struct seq_file *s, void *data) | ||
8225 | |||
8226 | int qtnf_pcie_fw_boot_done(struct qtnf_bus *bus) | ||
8227 | { | ||
8228 | + struct qtnf_pcie_bus_priv *priv = get_bus_priv(bus); | ||
8229 | + char card_id[64]; | ||
8230 | int ret; | ||
8231 | |||
8232 | bus->fw_state = QTNF_FW_STATE_BOOT_DONE; | ||
8233 | @@ -137,7 +139,9 @@ int qtnf_pcie_fw_boot_done(struct qtnf_bus *bus) | ||
8234 | if (ret) { | ||
8235 | pr_err("failed to attach core\n"); | ||
8236 | } else { | ||
8237 | - qtnf_debugfs_init(bus, DRV_NAME); | ||
8238 | + snprintf(card_id, sizeof(card_id), "%s:%s", | ||
8239 | + DRV_NAME, pci_name(priv->pdev)); | ||
8240 | + qtnf_debugfs_init(bus, card_id); | ||
8241 | qtnf_debugfs_add_entry(bus, "mps", qtnf_dbg_mps_show); | ||
8242 | qtnf_debugfs_add_entry(bus, "msi_enabled", qtnf_dbg_msi_show); | ||
8243 | qtnf_debugfs_add_entry(bus, "shm_stats", qtnf_dbg_shm_stats); | ||
8244 | diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | ||
8245 | index ade057d868f7..5e9ce03067de 100644 | ||
8246 | --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | ||
8247 | +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | ||
8248 | @@ -1341,6 +1341,7 @@ struct rtl8xxxu_fileops { | ||
8249 | u8 has_s0s1:1; | ||
8250 | u8 has_tx_report:1; | ||
8251 | u8 gen2_thermal_meter:1; | ||
8252 | + u8 needs_full_init:1; | ||
8253 | u32 adda_1t_init; | ||
8254 | u32 adda_1t_path_on; | ||
8255 | u32 adda_2t_path_on_a; | ||
8256 | diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c | ||
8257 | index ceffe05bd65b..f3cd314d1a9c 100644 | ||
8258 | --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c | ||
8259 | +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c | ||
8260 | @@ -1670,6 +1670,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = { | ||
8261 | .has_s0s1 = 1, | ||
8262 | .has_tx_report = 1, | ||
8263 | .gen2_thermal_meter = 1, | ||
8264 | + .needs_full_init = 1, | ||
8265 | .adda_1t_init = 0x01c00014, | ||
8266 | .adda_1t_path_on = 0x01c00014, | ||
8267 | .adda_2t_path_on_a = 0x01c00014, | ||
8268 | diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
8269 | index c6c41fb962ff..361248e97568 100644 | ||
8270 | --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
8271 | +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | ||
8272 | @@ -3902,6 +3902,9 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw) | ||
8273 | else | ||
8274 | macpower = true; | ||
8275 | |||
8276 | + if (fops->needs_full_init) | ||
8277 | + macpower = false; | ||
8278 | + | ||
8279 | ret = fops->power_on(priv); | ||
8280 | if (ret < 0) { | ||
8281 | dev_warn(dev, "%s: Failed power on\n", __func__); | ||
8282 | diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | ||
8283 | index 56cc3bc30860..f070f25bb735 100644 | ||
8284 | --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | ||
8285 | +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/hw.c | ||
8286 | @@ -1540,6 +1540,8 @@ static bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb) | ||
8287 | * This is maybe necessary: | ||
8288 | * rtlpriv->cfg->ops->fill_tx_cmddesc(hw, buffer, 1, 1, skb); | ||
8289 | */ | ||
8290 | + dev_kfree_skb(skb); | ||
8291 | + | ||
8292 | return true; | ||
8293 | } | ||
8294 | |||
8295 | diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c b/drivers/net/wireless/realtek/rtlwifi/usb.c | ||
8296 | index 4b59f3b46b28..348b0072cdd6 100644 | ||
8297 | --- a/drivers/net/wireless/realtek/rtlwifi/usb.c | ||
8298 | +++ b/drivers/net/wireless/realtek/rtlwifi/usb.c | ||
8299 | @@ -1021,8 +1021,10 @@ int rtl_usb_probe(struct usb_interface *intf, | ||
8300 | rtlpriv->hw = hw; | ||
8301 | rtlpriv->usb_data = kcalloc(RTL_USB_MAX_RX_COUNT, sizeof(u32), | ||
8302 | GFP_KERNEL); | ||
8303 | - if (!rtlpriv->usb_data) | ||
8304 | + if (!rtlpriv->usb_data) { | ||
8305 | + ieee80211_free_hw(hw); | ||
8306 | return -ENOMEM; | ||
8307 | + } | ||
8308 | |||
8309 | /* this spin lock must be initialized early */ | ||
8310 | spin_lock_init(&rtlpriv->locks.usb_lock); | ||
8311 | @@ -1083,6 +1085,7 @@ error_out2: | ||
8312 | _rtl_usb_io_handler_release(hw); | ||
8313 | usb_put_dev(udev); | ||
8314 | complete(&rtlpriv->firmware_loading_complete); | ||
8315 | + kfree(rtlpriv->usb_data); | ||
8316 | return -ENODEV; | ||
8317 | } | ||
8318 | EXPORT_SYMBOL(rtl_usb_probe); | ||
8319 | diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c | ||
8320 | index 793b40bdbf7c..3e95ad198912 100644 | ||
8321 | --- a/drivers/net/wireless/realtek/rtw88/coex.c | ||
8322 | +++ b/drivers/net/wireless/realtek/rtw88/coex.c | ||
8323 | @@ -1308,6 +1308,7 @@ static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev) | ||
8324 | struct rtw_chip_info *chip = rtwdev->chip; | ||
8325 | bool wl_hi_pri = false; | ||
8326 | u8 table_case, tdma_case; | ||
8327 | + u32 slot_type = 0; | ||
8328 | |||
8329 | if (coex_stat->wl_linkscan_proc || coex_stat->wl_hi_pri_task1 || | ||
8330 | coex_stat->wl_hi_pri_task2) | ||
8331 | @@ -1318,14 +1319,16 @@ static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev) | ||
8332 | if (wl_hi_pri) { | ||
8333 | table_case = 15; | ||
8334 | if (coex_stat->bt_a2dp_exist && | ||
8335 | - !coex_stat->bt_pan_exist) | ||
8336 | + !coex_stat->bt_pan_exist) { | ||
8337 | + slot_type = TDMA_4SLOT; | ||
8338 | tdma_case = 11; | ||
8339 | - else if (coex_stat->wl_hi_pri_task1) | ||
8340 | + } else if (coex_stat->wl_hi_pri_task1) { | ||
8341 | tdma_case = 6; | ||
8342 | - else if (!coex_stat->bt_page) | ||
8343 | + } else if (!coex_stat->bt_page) { | ||
8344 | tdma_case = 8; | ||
8345 | - else | ||
8346 | + } else { | ||
8347 | tdma_case = 9; | ||
8348 | + } | ||
8349 | } else if (coex_stat->wl_connected) { | ||
8350 | table_case = 10; | ||
8351 | tdma_case = 10; | ||
8352 | @@ -1361,7 +1364,7 @@ static void rtw_coex_action_bt_inquiry(struct rtw_dev *rtwdev) | ||
8353 | rtw_coex_set_ant_path(rtwdev, false, COEX_SET_ANT_2G); | ||
8354 | rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]); | ||
8355 | rtw_coex_table(rtwdev, table_case); | ||
8356 | - rtw_coex_tdma(rtwdev, false, tdma_case); | ||
8357 | + rtw_coex_tdma(rtwdev, false, tdma_case | slot_type); | ||
8358 | } | ||
8359 | |||
8360 | static void rtw_coex_action_bt_hfp(struct rtw_dev *rtwdev) | ||
8361 | @@ -1475,13 +1478,13 @@ static void rtw_coex_action_bt_a2dp(struct rtw_dev *rtwdev) | ||
8362 | |||
8363 | if (efuse->share_ant) { | ||
8364 | /* Shared-Ant */ | ||
8365 | + slot_type = TDMA_4SLOT; | ||
8366 | + | ||
8367 | if (coex_stat->wl_gl_busy && coex_stat->wl_noisy_level == 0) | ||
8368 | table_case = 10; | ||
8369 | else | ||
8370 | table_case = 9; | ||
8371 | |||
8372 | - slot_type = TDMA_4SLOT; | ||
8373 | - | ||
8374 | if (coex_stat->wl_gl_busy) | ||
8375 | tdma_case = 13; | ||
8376 | else | ||
8377 | @@ -1585,13 +1588,14 @@ static void rtw_coex_action_bt_a2dp_hid(struct rtw_dev *rtwdev) | ||
8378 | |||
8379 | if (efuse->share_ant) { | ||
8380 | /* Shared-Ant */ | ||
8381 | + slot_type = TDMA_4SLOT; | ||
8382 | + | ||
8383 | if (coex_stat->bt_ble_exist) | ||
8384 | table_case = 26; | ||
8385 | else | ||
8386 | table_case = 9; | ||
8387 | |||
8388 | if (coex_stat->wl_gl_busy) { | ||
8389 | - slot_type = TDMA_4SLOT; | ||
8390 | tdma_case = 13; | ||
8391 | } else { | ||
8392 | tdma_case = 14; | ||
8393 | @@ -1794,10 +1798,12 @@ static void rtw_coex_action_wl_linkscan(struct rtw_dev *rtwdev) | ||
8394 | struct rtw_efuse *efuse = &rtwdev->efuse; | ||
8395 | struct rtw_chip_info *chip = rtwdev->chip; | ||
8396 | u8 table_case, tdma_case; | ||
8397 | + u32 slot_type = 0; | ||
8398 | |||
8399 | if (efuse->share_ant) { | ||
8400 | /* Shared-Ant */ | ||
8401 | if (coex_stat->bt_a2dp_exist) { | ||
8402 | + slot_type = TDMA_4SLOT; | ||
8403 | table_case = 9; | ||
8404 | tdma_case = 11; | ||
8405 | } else { | ||
8406 | @@ -1818,7 +1824,7 @@ static void rtw_coex_action_wl_linkscan(struct rtw_dev *rtwdev) | ||
8407 | rtw_coex_set_ant_path(rtwdev, true, COEX_SET_ANT_2G); | ||
8408 | rtw_coex_set_rf_para(rtwdev, chip->wl_rf_para_rx[0]); | ||
8409 | rtw_coex_table(rtwdev, table_case); | ||
8410 | - rtw_coex_tdma(rtwdev, false, tdma_case); | ||
8411 | + rtw_coex_tdma(rtwdev, false, tdma_case | slot_type); | ||
8412 | } | ||
8413 | |||
8414 | static void rtw_coex_action_wl_not_connected(struct rtw_dev *rtwdev) | ||
8415 | diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c | ||
8416 | index 6dd457741b15..7a3a4911bde2 100644 | ||
8417 | --- a/drivers/net/wireless/realtek/rtw88/main.c | ||
8418 | +++ b/drivers/net/wireless/realtek/rtw88/main.c | ||
8419 | @@ -1020,7 +1020,8 @@ static int rtw_dump_hw_feature(struct rtw_dev *rtwdev) | ||
8420 | |||
8421 | rtw_hw_config_rf_ant_num(rtwdev, efuse->hw_cap.ant_num); | ||
8422 | |||
8423 | - if (efuse->hw_cap.nss == EFUSE_HW_CAP_IGNORE) | ||
8424 | + if (efuse->hw_cap.nss == EFUSE_HW_CAP_IGNORE || | ||
8425 | + efuse->hw_cap.nss > rtwdev->hal.rf_path_num) | ||
8426 | efuse->hw_cap.nss = rtwdev->hal.rf_path_num; | ||
8427 | |||
8428 | rtw_dbg(rtwdev, RTW_DBG_EFUSE, | ||
8429 | diff --git a/drivers/nfc/nxp-nci/i2c.c b/drivers/nfc/nxp-nci/i2c.c | ||
8430 | index 4d1909aecd6c..9f60e4dc5a90 100644 | ||
8431 | --- a/drivers/nfc/nxp-nci/i2c.c | ||
8432 | +++ b/drivers/nfc/nxp-nci/i2c.c | ||
8433 | @@ -278,7 +278,7 @@ static int nxp_nci_i2c_probe(struct i2c_client *client, | ||
8434 | |||
8435 | r = devm_acpi_dev_add_driver_gpios(dev, acpi_nxp_nci_gpios); | ||
8436 | if (r) | ||
8437 | - return r; | ||
8438 | + dev_dbg(dev, "Unable to add GPIO mapping table\n"); | ||
8439 | |||
8440 | phy->gpiod_en = devm_gpiod_get(dev, "enable", GPIOD_OUT_LOW); | ||
8441 | if (IS_ERR(phy->gpiod_en)) { | ||
8442 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
8443 | index af3212aec871..a6b7b242d516 100644 | ||
8444 | --- a/drivers/nvme/host/core.c | ||
8445 | +++ b/drivers/nvme/host/core.c | ||
8446 | @@ -313,7 +313,7 @@ bool nvme_cancel_request(struct request *req, void *data, bool reserved) | ||
8447 | if (blk_mq_request_completed(req)) | ||
8448 | return true; | ||
8449 | |||
8450 | - nvme_req(req)->status = NVME_SC_HOST_PATH_ERROR; | ||
8451 | + nvme_req(req)->status = NVME_SC_HOST_ABORTED_CMD; | ||
8452 | blk_mq_complete_request(req); | ||
8453 | return true; | ||
8454 | } | ||
8455 | @@ -611,8 +611,14 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, | ||
8456 | struct nvme_dsm_range *range; | ||
8457 | struct bio *bio; | ||
8458 | |||
8459 | - range = kmalloc_array(segments, sizeof(*range), | ||
8460 | - GFP_ATOMIC | __GFP_NOWARN); | ||
8461 | + /* | ||
8462 | + * Some devices do not consider the DSM 'Number of Ranges' field when | ||
8463 | + * determining how much data to DMA. Always allocate memory for maximum | ||
8464 | + * number of segments to prevent device reading beyond end of buffer. | ||
8465 | + */ | ||
8466 | + static const size_t alloc_size = sizeof(*range) * NVME_DSM_MAX_RANGES; | ||
8467 | + | ||
8468 | + range = kzalloc(alloc_size, GFP_ATOMIC | __GFP_NOWARN); | ||
8469 | if (!range) { | ||
8470 | /* | ||
8471 | * If we fail allocation our range, fallback to the controller | ||
8472 | @@ -652,7 +658,7 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, | ||
8473 | |||
8474 | req->special_vec.bv_page = virt_to_page(range); | ||
8475 | req->special_vec.bv_offset = offset_in_page(range); | ||
8476 | - req->special_vec.bv_len = sizeof(*range) * segments; | ||
8477 | + req->special_vec.bv_len = alloc_size; | ||
8478 | req->rq_flags |= RQF_SPECIAL_PAYLOAD; | ||
8479 | |||
8480 | return BLK_STS_OK; | ||
8481 | diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c | ||
8482 | index e0f064dcbd02..132ade51ee87 100644 | ||
8483 | --- a/drivers/nvme/host/multipath.c | ||
8484 | +++ b/drivers/nvme/host/multipath.c | ||
8485 | @@ -95,6 +95,7 @@ void nvme_failover_req(struct request *req) | ||
8486 | } | ||
8487 | break; | ||
8488 | case NVME_SC_HOST_PATH_ERROR: | ||
8489 | + case NVME_SC_HOST_ABORTED_CMD: | ||
8490 | /* | ||
8491 | * Temporary transport disruption in talking to the controller. | ||
8492 | * Try to send on a new path. | ||
8493 | diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c | ||
8494 | index dff2f3c357f5..fc40555ca4cd 100644 | ||
8495 | --- a/drivers/nvmem/imx-ocotp.c | ||
8496 | +++ b/drivers/nvmem/imx-ocotp.c | ||
8497 | @@ -521,6 +521,10 @@ static int imx_ocotp_probe(struct platform_device *pdev) | ||
8498 | if (IS_ERR(priv->clk)) | ||
8499 | return PTR_ERR(priv->clk); | ||
8500 | |||
8501 | + clk_prepare_enable(priv->clk); | ||
8502 | + imx_ocotp_clr_err_if_set(priv->base); | ||
8503 | + clk_disable_unprepare(priv->clk); | ||
8504 | + | ||
8505 | priv->params = of_device_get_match_data(&pdev->dev); | ||
8506 | imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; | ||
8507 | imx_ocotp_nvmem_config.dev = dev; | ||
8508 | diff --git a/drivers/parport/share.c b/drivers/parport/share.c | ||
8509 | index 7b4ee33c1935..15c81cffd2de 100644 | ||
8510 | --- a/drivers/parport/share.c | ||
8511 | +++ b/drivers/parport/share.c | ||
8512 | @@ -230,6 +230,18 @@ static int port_check(struct device *dev, void *dev_drv) | ||
8513 | return 0; | ||
8514 | } | ||
8515 | |||
8516 | +/* | ||
8517 | + * Iterates through all the devices connected to the bus and return 1 | ||
8518 | + * if the device is a parallel port. | ||
8519 | + */ | ||
8520 | + | ||
8521 | +static int port_detect(struct device *dev, void *dev_drv) | ||
8522 | +{ | ||
8523 | + if (is_parport(dev)) | ||
8524 | + return 1; | ||
8525 | + return 0; | ||
8526 | +} | ||
8527 | + | ||
8528 | /** | ||
8529 | * parport_register_driver - register a parallel port device driver | ||
8530 | * @drv: structure describing the driver | ||
8531 | @@ -282,6 +294,15 @@ int __parport_register_driver(struct parport_driver *drv, struct module *owner, | ||
8532 | if (ret) | ||
8533 | return ret; | ||
8534 | |||
8535 | + /* | ||
8536 | + * check if bus has any parallel port registered, if | ||
8537 | + * none is found then load the lowlevel driver. | ||
8538 | + */ | ||
8539 | + ret = bus_for_each_dev(&parport_bus_type, NULL, NULL, | ||
8540 | + port_detect); | ||
8541 | + if (!ret) | ||
8542 | + get_lowlevel_driver(); | ||
8543 | + | ||
8544 | mutex_lock(®istration_lock); | ||
8545 | if (drv->match_port) | ||
8546 | bus_for_each_dev(&parport_bus_type, NULL, drv, | ||
8547 | diff --git a/drivers/phy/qualcomm/phy-qcom-usb-hs.c b/drivers/phy/qualcomm/phy-qcom-usb-hs.c | ||
8548 | index b163b3a1558d..61054272a7c8 100644 | ||
8549 | --- a/drivers/phy/qualcomm/phy-qcom-usb-hs.c | ||
8550 | +++ b/drivers/phy/qualcomm/phy-qcom-usb-hs.c | ||
8551 | @@ -158,8 +158,8 @@ static int qcom_usb_hs_phy_power_on(struct phy *phy) | ||
8552 | /* setup initial state */ | ||
8553 | qcom_usb_hs_phy_vbus_notifier(&uphy->vbus_notify, state, | ||
8554 | uphy->vbus_edev); | ||
8555 | - ret = devm_extcon_register_notifier(&ulpi->dev, uphy->vbus_edev, | ||
8556 | - EXTCON_USB, &uphy->vbus_notify); | ||
8557 | + ret = extcon_register_notifier(uphy->vbus_edev, EXTCON_USB, | ||
8558 | + &uphy->vbus_notify); | ||
8559 | if (ret) | ||
8560 | goto err_ulpi; | ||
8561 | } | ||
8562 | @@ -180,6 +180,9 @@ static int qcom_usb_hs_phy_power_off(struct phy *phy) | ||
8563 | { | ||
8564 | struct qcom_usb_hs_phy *uphy = phy_get_drvdata(phy); | ||
8565 | |||
8566 | + if (uphy->vbus_edev) | ||
8567 | + extcon_unregister_notifier(uphy->vbus_edev, EXTCON_USB, | ||
8568 | + &uphy->vbus_notify); | ||
8569 | regulator_disable(uphy->v3p3); | ||
8570 | regulator_disable(uphy->v1p8); | ||
8571 | clk_disable_unprepare(uphy->sleep_clk); | ||
8572 | diff --git a/drivers/phy/renesas/phy-rcar-gen2.c b/drivers/phy/renesas/phy-rcar-gen2.c | ||
8573 | index 2926e4937301..2e279ac0fa4d 100644 | ||
8574 | --- a/drivers/phy/renesas/phy-rcar-gen2.c | ||
8575 | +++ b/drivers/phy/renesas/phy-rcar-gen2.c | ||
8576 | @@ -71,6 +71,7 @@ struct rcar_gen2_phy_driver { | ||
8577 | struct rcar_gen2_phy_data { | ||
8578 | const struct phy_ops *gen2_phy_ops; | ||
8579 | const u32 (*select_value)[PHYS_PER_CHANNEL]; | ||
8580 | + const u32 num_channels; | ||
8581 | }; | ||
8582 | |||
8583 | static int rcar_gen2_phy_init(struct phy *p) | ||
8584 | @@ -271,11 +272,13 @@ static const u32 usb20_select_value[][PHYS_PER_CHANNEL] = { | ||
8585 | static const struct rcar_gen2_phy_data rcar_gen2_usb_phy_data = { | ||
8586 | .gen2_phy_ops = &rcar_gen2_phy_ops, | ||
8587 | .select_value = pci_select_value, | ||
8588 | + .num_channels = ARRAY_SIZE(pci_select_value), | ||
8589 | }; | ||
8590 | |||
8591 | static const struct rcar_gen2_phy_data rz_g1c_usb_phy_data = { | ||
8592 | .gen2_phy_ops = &rz_g1c_phy_ops, | ||
8593 | .select_value = usb20_select_value, | ||
8594 | + .num_channels = ARRAY_SIZE(usb20_select_value), | ||
8595 | }; | ||
8596 | |||
8597 | static const struct of_device_id rcar_gen2_phy_match_table[] = { | ||
8598 | @@ -389,7 +392,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev) | ||
8599 | channel->selected_phy = -1; | ||
8600 | |||
8601 | error = of_property_read_u32(np, "reg", &channel_num); | ||
8602 | - if (error || channel_num > 2) { | ||
8603 | + if (error || channel_num >= data->num_channels) { | ||
8604 | dev_err(dev, "Invalid \"reg\" property\n"); | ||
8605 | of_node_put(np); | ||
8606 | return error; | ||
8607 | diff --git a/drivers/pinctrl/devicetree.c b/drivers/pinctrl/devicetree.c | ||
8608 | index 5d6d8b1e9062..dbaacde1b36a 100644 | ||
8609 | --- a/drivers/pinctrl/devicetree.c | ||
8610 | +++ b/drivers/pinctrl/devicetree.c | ||
8611 | @@ -29,6 +29,13 @@ struct pinctrl_dt_map { | ||
8612 | static void dt_free_map(struct pinctrl_dev *pctldev, | ||
8613 | struct pinctrl_map *map, unsigned num_maps) | ||
8614 | { | ||
8615 | + int i; | ||
8616 | + | ||
8617 | + for (i = 0; i < num_maps; ++i) { | ||
8618 | + kfree_const(map[i].dev_name); | ||
8619 | + map[i].dev_name = NULL; | ||
8620 | + } | ||
8621 | + | ||
8622 | if (pctldev) { | ||
8623 | const struct pinctrl_ops *ops = pctldev->desc->pctlops; | ||
8624 | if (ops->dt_free_map) | ||
8625 | @@ -63,7 +70,13 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename, | ||
8626 | |||
8627 | /* Initialize common mapping table entry fields */ | ||
8628 | for (i = 0; i < num_maps; i++) { | ||
8629 | - map[i].dev_name = dev_name(p->dev); | ||
8630 | + const char *devname; | ||
8631 | + | ||
8632 | + devname = kstrdup_const(dev_name(p->dev), GFP_KERNEL); | ||
8633 | + if (!devname) | ||
8634 | + goto err_free_map; | ||
8635 | + | ||
8636 | + map[i].dev_name = devname; | ||
8637 | map[i].name = statename; | ||
8638 | if (pctldev) | ||
8639 | map[i].ctrl_dev_name = dev_name(pctldev->dev); | ||
8640 | @@ -71,10 +84,8 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename, | ||
8641 | |||
8642 | /* Remember the converted mapping table entries */ | ||
8643 | dt_map = kzalloc(sizeof(*dt_map), GFP_KERNEL); | ||
8644 | - if (!dt_map) { | ||
8645 | - dt_free_map(pctldev, map, num_maps); | ||
8646 | - return -ENOMEM; | ||
8647 | - } | ||
8648 | + if (!dt_map) | ||
8649 | + goto err_free_map; | ||
8650 | |||
8651 | dt_map->pctldev = pctldev; | ||
8652 | dt_map->map = map; | ||
8653 | @@ -82,6 +93,10 @@ static int dt_remember_or_free_map(struct pinctrl *p, const char *statename, | ||
8654 | list_add_tail(&dt_map->node, &p->dt_maps); | ||
8655 | |||
8656 | return pinctrl_register_map(map, num_maps, false); | ||
8657 | + | ||
8658 | +err_free_map: | ||
8659 | + dt_free_map(pctldev, map, num_maps); | ||
8660 | + return -ENOMEM; | ||
8661 | } | ||
8662 | |||
8663 | struct pinctrl_dev *of_pinctrl_get(struct device_node *np) | ||
8664 | diff --git a/drivers/pinctrl/intel/pinctrl-baytrail.c b/drivers/pinctrl/intel/pinctrl-baytrail.c | ||
8665 | index 9ffb22211d2b..7d658e6627e7 100644 | ||
8666 | --- a/drivers/pinctrl/intel/pinctrl-baytrail.c | ||
8667 | +++ b/drivers/pinctrl/intel/pinctrl-baytrail.c | ||
8668 | @@ -110,7 +110,6 @@ struct byt_gpio { | ||
8669 | struct platform_device *pdev; | ||
8670 | struct pinctrl_dev *pctl_dev; | ||
8671 | struct pinctrl_desc pctl_desc; | ||
8672 | - raw_spinlock_t lock; | ||
8673 | const struct intel_pinctrl_soc_data *soc_data; | ||
8674 | struct intel_community *communities_copy; | ||
8675 | struct byt_gpio_pin_context *saved_context; | ||
8676 | @@ -549,6 +548,8 @@ static const struct intel_pinctrl_soc_data *byt_soc_data[] = { | ||
8677 | NULL | ||
8678 | }; | ||
8679 | |||
8680 | +static DEFINE_RAW_SPINLOCK(byt_lock); | ||
8681 | + | ||
8682 | static struct intel_community *byt_get_community(struct byt_gpio *vg, | ||
8683 | unsigned int pin) | ||
8684 | { | ||
8685 | @@ -658,7 +659,7 @@ static void byt_set_group_simple_mux(struct byt_gpio *vg, | ||
8686 | unsigned long flags; | ||
8687 | int i; | ||
8688 | |||
8689 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8690 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8691 | |||
8692 | for (i = 0; i < group.npins; i++) { | ||
8693 | void __iomem *padcfg0; | ||
8694 | @@ -678,7 +679,7 @@ static void byt_set_group_simple_mux(struct byt_gpio *vg, | ||
8695 | writel(value, padcfg0); | ||
8696 | } | ||
8697 | |||
8698 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8699 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8700 | } | ||
8701 | |||
8702 | static void byt_set_group_mixed_mux(struct byt_gpio *vg, | ||
8703 | @@ -688,7 +689,7 @@ static void byt_set_group_mixed_mux(struct byt_gpio *vg, | ||
8704 | unsigned long flags; | ||
8705 | int i; | ||
8706 | |||
8707 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8708 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8709 | |||
8710 | for (i = 0; i < group.npins; i++) { | ||
8711 | void __iomem *padcfg0; | ||
8712 | @@ -708,7 +709,7 @@ static void byt_set_group_mixed_mux(struct byt_gpio *vg, | ||
8713 | writel(value, padcfg0); | ||
8714 | } | ||
8715 | |||
8716 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8717 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8718 | } | ||
8719 | |||
8720 | static int byt_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector, | ||
8721 | @@ -749,11 +750,11 @@ static void byt_gpio_clear_triggering(struct byt_gpio *vg, unsigned int offset) | ||
8722 | unsigned long flags; | ||
8723 | u32 value; | ||
8724 | |||
8725 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8726 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8727 | value = readl(reg); | ||
8728 | value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL); | ||
8729 | writel(value, reg); | ||
8730 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8731 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8732 | } | ||
8733 | |||
8734 | static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev, | ||
8735 | @@ -765,7 +766,7 @@ static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev, | ||
8736 | u32 value, gpio_mux; | ||
8737 | unsigned long flags; | ||
8738 | |||
8739 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8740 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8741 | |||
8742 | /* | ||
8743 | * In most cases, func pin mux 000 means GPIO function. | ||
8744 | @@ -787,7 +788,7 @@ static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev, | ||
8745 | "pin %u forcibly re-configured as GPIO\n", offset); | ||
8746 | } | ||
8747 | |||
8748 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8749 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8750 | |||
8751 | pm_runtime_get(&vg->pdev->dev); | ||
8752 | |||
8753 | @@ -815,7 +816,7 @@ static int byt_gpio_set_direction(struct pinctrl_dev *pctl_dev, | ||
8754 | unsigned long flags; | ||
8755 | u32 value; | ||
8756 | |||
8757 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8758 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8759 | |||
8760 | value = readl(val_reg); | ||
8761 | value &= ~BYT_DIR_MASK; | ||
8762 | @@ -832,7 +833,7 @@ static int byt_gpio_set_direction(struct pinctrl_dev *pctl_dev, | ||
8763 | "Potential Error: Setting GPIO with direct_irq_en to output"); | ||
8764 | writel(value, val_reg); | ||
8765 | |||
8766 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8767 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8768 | |||
8769 | return 0; | ||
8770 | } | ||
8771 | @@ -901,11 +902,11 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset, | ||
8772 | u32 conf, pull, val, debounce; | ||
8773 | u16 arg = 0; | ||
8774 | |||
8775 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8776 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8777 | conf = readl(conf_reg); | ||
8778 | pull = conf & BYT_PULL_ASSIGN_MASK; | ||
8779 | val = readl(val_reg); | ||
8780 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8781 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8782 | |||
8783 | switch (param) { | ||
8784 | case PIN_CONFIG_BIAS_DISABLE: | ||
8785 | @@ -932,9 +933,9 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset, | ||
8786 | if (!(conf & BYT_DEBOUNCE_EN)) | ||
8787 | return -EINVAL; | ||
8788 | |||
8789 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8790 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8791 | debounce = readl(db_reg); | ||
8792 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8793 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8794 | |||
8795 | switch (debounce & BYT_DEBOUNCE_PULSE_MASK) { | ||
8796 | case BYT_DEBOUNCE_PULSE_375US: | ||
8797 | @@ -986,7 +987,7 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, | ||
8798 | u32 conf, val, debounce; | ||
8799 | int i, ret = 0; | ||
8800 | |||
8801 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8802 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8803 | |||
8804 | conf = readl(conf_reg); | ||
8805 | val = readl(val_reg); | ||
8806 | @@ -1094,7 +1095,7 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, | ||
8807 | if (!ret) | ||
8808 | writel(conf, conf_reg); | ||
8809 | |||
8810 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8811 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8812 | |||
8813 | return ret; | ||
8814 | } | ||
8815 | @@ -1119,9 +1120,9 @@ static int byt_gpio_get(struct gpio_chip *chip, unsigned int offset) | ||
8816 | unsigned long flags; | ||
8817 | u32 val; | ||
8818 | |||
8819 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8820 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8821 | val = readl(reg); | ||
8822 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8823 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8824 | |||
8825 | return !!(val & BYT_LEVEL); | ||
8826 | } | ||
8827 | @@ -1136,13 +1137,13 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned int offset, int value) | ||
8828 | if (!reg) | ||
8829 | return; | ||
8830 | |||
8831 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8832 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8833 | old_val = readl(reg); | ||
8834 | if (value) | ||
8835 | writel(old_val | BYT_LEVEL, reg); | ||
8836 | else | ||
8837 | writel(old_val & ~BYT_LEVEL, reg); | ||
8838 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8839 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8840 | } | ||
8841 | |||
8842 | static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset) | ||
8843 | @@ -1155,9 +1156,9 @@ static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset) | ||
8844 | if (!reg) | ||
8845 | return -EINVAL; | ||
8846 | |||
8847 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8848 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8849 | value = readl(reg); | ||
8850 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8851 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8852 | |||
8853 | if (!(value & BYT_OUTPUT_EN)) | ||
8854 | return 0; | ||
8855 | @@ -1200,14 +1201,14 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | ||
8856 | const char *label; | ||
8857 | unsigned int pin; | ||
8858 | |||
8859 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8860 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8861 | pin = vg->soc_data->pins[i].number; | ||
8862 | reg = byt_gpio_reg(vg, pin, BYT_CONF0_REG); | ||
8863 | if (!reg) { | ||
8864 | seq_printf(s, | ||
8865 | "Could not retrieve pin %i conf0 reg\n", | ||
8866 | pin); | ||
8867 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8868 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8869 | continue; | ||
8870 | } | ||
8871 | conf0 = readl(reg); | ||
8872 | @@ -1216,11 +1217,11 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip) | ||
8873 | if (!reg) { | ||
8874 | seq_printf(s, | ||
8875 | "Could not retrieve pin %i val reg\n", pin); | ||
8876 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8877 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8878 | continue; | ||
8879 | } | ||
8880 | val = readl(reg); | ||
8881 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8882 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8883 | |||
8884 | comm = byt_get_community(vg, pin); | ||
8885 | if (!comm) { | ||
8886 | @@ -1304,9 +1305,9 @@ static void byt_irq_ack(struct irq_data *d) | ||
8887 | if (!reg) | ||
8888 | return; | ||
8889 | |||
8890 | - raw_spin_lock(&vg->lock); | ||
8891 | + raw_spin_lock(&byt_lock); | ||
8892 | writel(BIT(offset % 32), reg); | ||
8893 | - raw_spin_unlock(&vg->lock); | ||
8894 | + raw_spin_unlock(&byt_lock); | ||
8895 | } | ||
8896 | |||
8897 | static void byt_irq_mask(struct irq_data *d) | ||
8898 | @@ -1330,7 +1331,7 @@ static void byt_irq_unmask(struct irq_data *d) | ||
8899 | if (!reg) | ||
8900 | return; | ||
8901 | |||
8902 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8903 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8904 | value = readl(reg); | ||
8905 | |||
8906 | switch (irqd_get_trigger_type(d)) { | ||
8907 | @@ -1353,7 +1354,7 @@ static void byt_irq_unmask(struct irq_data *d) | ||
8908 | |||
8909 | writel(value, reg); | ||
8910 | |||
8911 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8912 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8913 | } | ||
8914 | |||
8915 | static int byt_irq_type(struct irq_data *d, unsigned int type) | ||
8916 | @@ -1367,7 +1368,7 @@ static int byt_irq_type(struct irq_data *d, unsigned int type) | ||
8917 | if (!reg || offset >= vg->chip.ngpio) | ||
8918 | return -EINVAL; | ||
8919 | |||
8920 | - raw_spin_lock_irqsave(&vg->lock, flags); | ||
8921 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8922 | value = readl(reg); | ||
8923 | |||
8924 | WARN(value & BYT_DIRECT_IRQ_EN, | ||
8925 | @@ -1389,7 +1390,7 @@ static int byt_irq_type(struct irq_data *d, unsigned int type) | ||
8926 | else if (type & IRQ_TYPE_LEVEL_MASK) | ||
8927 | irq_set_handler_locked(d, handle_level_irq); | ||
8928 | |||
8929 | - raw_spin_unlock_irqrestore(&vg->lock, flags); | ||
8930 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8931 | |||
8932 | return 0; | ||
8933 | } | ||
8934 | @@ -1425,9 +1426,9 @@ static void byt_gpio_irq_handler(struct irq_desc *desc) | ||
8935 | continue; | ||
8936 | } | ||
8937 | |||
8938 | - raw_spin_lock(&vg->lock); | ||
8939 | + raw_spin_lock(&byt_lock); | ||
8940 | pending = readl(reg); | ||
8941 | - raw_spin_unlock(&vg->lock); | ||
8942 | + raw_spin_unlock(&byt_lock); | ||
8943 | for_each_set_bit(pin, &pending, 32) { | ||
8944 | virq = irq_find_mapping(vg->chip.irq.domain, base + pin); | ||
8945 | generic_handle_irq(virq); | ||
8946 | @@ -1638,8 +1639,6 @@ static int byt_pinctrl_probe(struct platform_device *pdev) | ||
8947 | return PTR_ERR(vg->pctl_dev); | ||
8948 | } | ||
8949 | |||
8950 | - raw_spin_lock_init(&vg->lock); | ||
8951 | - | ||
8952 | ret = byt_gpio_probe(vg); | ||
8953 | if (ret) | ||
8954 | return ret; | ||
8955 | @@ -1654,8 +1653,11 @@ static int byt_pinctrl_probe(struct platform_device *pdev) | ||
8956 | static int byt_gpio_suspend(struct device *dev) | ||
8957 | { | ||
8958 | struct byt_gpio *vg = dev_get_drvdata(dev); | ||
8959 | + unsigned long flags; | ||
8960 | int i; | ||
8961 | |||
8962 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8963 | + | ||
8964 | for (i = 0; i < vg->soc_data->npins; i++) { | ||
8965 | void __iomem *reg; | ||
8966 | u32 value; | ||
8967 | @@ -1676,14 +1678,18 @@ static int byt_gpio_suspend(struct device *dev) | ||
8968 | vg->saved_context[i].val = value; | ||
8969 | } | ||
8970 | |||
8971 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8972 | return 0; | ||
8973 | } | ||
8974 | |||
8975 | static int byt_gpio_resume(struct device *dev) | ||
8976 | { | ||
8977 | struct byt_gpio *vg = dev_get_drvdata(dev); | ||
8978 | + unsigned long flags; | ||
8979 | int i; | ||
8980 | |||
8981 | + raw_spin_lock_irqsave(&byt_lock, flags); | ||
8982 | + | ||
8983 | for (i = 0; i < vg->soc_data->npins; i++) { | ||
8984 | void __iomem *reg; | ||
8985 | u32 value; | ||
8986 | @@ -1721,6 +1727,7 @@ static int byt_gpio_resume(struct device *dev) | ||
8987 | } | ||
8988 | } | ||
8989 | |||
8990 | + raw_spin_unlock_irqrestore(&byt_lock, flags); | ||
8991 | return 0; | ||
8992 | } | ||
8993 | #endif | ||
8994 | diff --git a/drivers/pinctrl/pinctrl-amd.c b/drivers/pinctrl/pinctrl-amd.c | ||
8995 | index 2c61141519f8..eab078244a4c 100644 | ||
8996 | --- a/drivers/pinctrl/pinctrl-amd.c | ||
8997 | +++ b/drivers/pinctrl/pinctrl-amd.c | ||
8998 | @@ -540,7 +540,8 @@ static irqreturn_t amd_gpio_irq_handler(int irq, void *dev_id) | ||
8999 | irqreturn_t ret = IRQ_NONE; | ||
9000 | unsigned int i, irqnr; | ||
9001 | unsigned long flags; | ||
9002 | - u32 *regs, regval; | ||
9003 | + u32 __iomem *regs; | ||
9004 | + u32 regval; | ||
9005 | u64 status, mask; | ||
9006 | |||
9007 | /* Read the wake status */ | ||
9008 | diff --git a/drivers/pinctrl/qcom/pinctrl-sc7180.c b/drivers/pinctrl/qcom/pinctrl-sc7180.c | ||
9009 | index 6399c8a2bc22..d6cfad7417b1 100644 | ||
9010 | --- a/drivers/pinctrl/qcom/pinctrl-sc7180.c | ||
9011 | +++ b/drivers/pinctrl/qcom/pinctrl-sc7180.c | ||
9012 | @@ -77,6 +77,7 @@ enum { | ||
9013 | .intr_cfg_reg = 0, \ | ||
9014 | .intr_status_reg = 0, \ | ||
9015 | .intr_target_reg = 0, \ | ||
9016 | + .tile = SOUTH, \ | ||
9017 | .mux_bit = -1, \ | ||
9018 | .pull_bit = pull, \ | ||
9019 | .drv_bit = drv, \ | ||
9020 | @@ -102,6 +103,7 @@ enum { | ||
9021 | .intr_cfg_reg = 0, \ | ||
9022 | .intr_status_reg = 0, \ | ||
9023 | .intr_target_reg = 0, \ | ||
9024 | + .tile = SOUTH, \ | ||
9025 | .mux_bit = -1, \ | ||
9026 | .pull_bit = 3, \ | ||
9027 | .drv_bit = 0, \ | ||
9028 | @@ -1087,14 +1089,14 @@ static const struct msm_pingroup sc7180_groups[] = { | ||
9029 | [116] = PINGROUP(116, WEST, qup04, qup04, _, _, _, _, _, _, _), | ||
9030 | [117] = PINGROUP(117, WEST, dp_hot, _, _, _, _, _, _, _, _), | ||
9031 | [118] = PINGROUP(118, WEST, _, _, _, _, _, _, _, _, _), | ||
9032 | - [119] = UFS_RESET(ufs_reset, 0x97f000), | ||
9033 | - [120] = SDC_QDSD_PINGROUP(sdc1_rclk, 0x97a000, 15, 0), | ||
9034 | - [121] = SDC_QDSD_PINGROUP(sdc1_clk, 0x97a000, 13, 6), | ||
9035 | - [122] = SDC_QDSD_PINGROUP(sdc1_cmd, 0x97a000, 11, 3), | ||
9036 | - [123] = SDC_QDSD_PINGROUP(sdc1_data, 0x97a000, 9, 0), | ||
9037 | - [124] = SDC_QDSD_PINGROUP(sdc2_clk, 0x97b000, 14, 6), | ||
9038 | - [125] = SDC_QDSD_PINGROUP(sdc2_cmd, 0x97b000, 11, 3), | ||
9039 | - [126] = SDC_QDSD_PINGROUP(sdc2_data, 0x97b000, 9, 0), | ||
9040 | + [119] = UFS_RESET(ufs_reset, 0x7f000), | ||
9041 | + [120] = SDC_QDSD_PINGROUP(sdc1_rclk, 0x7a000, 15, 0), | ||
9042 | + [121] = SDC_QDSD_PINGROUP(sdc1_clk, 0x7a000, 13, 6), | ||
9043 | + [122] = SDC_QDSD_PINGROUP(sdc1_cmd, 0x7a000, 11, 3), | ||
9044 | + [123] = SDC_QDSD_PINGROUP(sdc1_data, 0x7a000, 9, 0), | ||
9045 | + [124] = SDC_QDSD_PINGROUP(sdc2_clk, 0x7b000, 14, 6), | ||
9046 | + [125] = SDC_QDSD_PINGROUP(sdc2_cmd, 0x7b000, 11, 3), | ||
9047 | + [126] = SDC_QDSD_PINGROUP(sdc2_data, 0x7b000, 9, 0), | ||
9048 | }; | ||
9049 | |||
9050 | static const struct msm_pinctrl_soc_data sc7180_pinctrl = { | ||
9051 | diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
9052 | index 2dfb8d9cfda1..5200dadd6b3e 100644 | ||
9053 | --- a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
9054 | +++ b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c | ||
9055 | @@ -448,6 +448,8 @@ FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM | ||
9056 | #define MOD_SEL0_1_0 REV4(FM(SEL_SPEED_PULSE_IF_0), FM(SEL_SPEED_PULSE_IF_1), FM(SEL_SPEED_PULSE_IF_2), F_(0, 0)) | ||
9057 | |||
9058 | /* MOD_SEL1 */ /* 0 */ /* 1 */ /* 2 */ /* 3 */ /* 4 */ /* 5 */ /* 6 */ /* 7 */ | ||
9059 | +#define MOD_SEL1_31 FM(SEL_SIMCARD_0) FM(SEL_SIMCARD_1) | ||
9060 | +#define MOD_SEL1_30 FM(SEL_SSI2_0) FM(SEL_SSI2_1) | ||
9061 | #define MOD_SEL1_29 FM(SEL_TIMER_TMU_0) FM(SEL_TIMER_TMU_1) | ||
9062 | #define MOD_SEL1_28 FM(SEL_USB_20_CH0_0) FM(SEL_USB_20_CH0_1) | ||
9063 | #define MOD_SEL1_26 FM(SEL_DRIF2_0) FM(SEL_DRIF2_1) | ||
9064 | @@ -468,7 +470,8 @@ FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM | ||
9065 | |||
9066 | #define PINMUX_MOD_SELS \ | ||
9067 | \ | ||
9068 | -MOD_SEL0_30_29 \ | ||
9069 | + MOD_SEL1_31 \ | ||
9070 | +MOD_SEL0_30_29 MOD_SEL1_30 \ | ||
9071 | MOD_SEL1_29 \ | ||
9072 | MOD_SEL0_28 MOD_SEL1_28 \ | ||
9073 | MOD_SEL0_27_26 \ | ||
9074 | @@ -1058,7 +1061,7 @@ static const u16 pinmux_data[] = { | ||
9075 | PINMUX_IPSR_MSEL(IP10_27_24, RIF0_CLK_B, SEL_DRIF0_1), | ||
9076 | PINMUX_IPSR_MSEL(IP10_27_24, SCL2_B, SEL_I2C2_1), | ||
9077 | PINMUX_IPSR_MSEL(IP10_27_24, TCLK1_A, SEL_TIMER_TMU_0), | ||
9078 | - PINMUX_IPSR_GPSR(IP10_27_24, SSI_SCK2_B), | ||
9079 | + PINMUX_IPSR_MSEL(IP10_27_24, SSI_SCK2_B, SEL_SSI2_1), | ||
9080 | PINMUX_IPSR_GPSR(IP10_27_24, TS_SCK0), | ||
9081 | |||
9082 | PINMUX_IPSR_GPSR(IP10_31_28, SD0_WP), | ||
9083 | @@ -1067,7 +1070,7 @@ static const u16 pinmux_data[] = { | ||
9084 | PINMUX_IPSR_MSEL(IP10_31_28, RIF0_D0_B, SEL_DRIF0_1), | ||
9085 | PINMUX_IPSR_MSEL(IP10_31_28, SDA2_B, SEL_I2C2_1), | ||
9086 | PINMUX_IPSR_MSEL(IP10_31_28, TCLK2_A, SEL_TIMER_TMU_0), | ||
9087 | - PINMUX_IPSR_GPSR(IP10_31_28, SSI_WS2_B), | ||
9088 | + PINMUX_IPSR_MSEL(IP10_31_28, SSI_WS2_B, SEL_SSI2_1), | ||
9089 | PINMUX_IPSR_GPSR(IP10_31_28, TS_SDAT0), | ||
9090 | |||
9091 | /* IPSR11 */ | ||
9092 | @@ -1085,13 +1088,13 @@ static const u16 pinmux_data[] = { | ||
9093 | |||
9094 | PINMUX_IPSR_MSEL(IP11_11_8, RX0_A, SEL_SCIF0_0), | ||
9095 | PINMUX_IPSR_MSEL(IP11_11_8, HRX1_A, SEL_HSCIF1_0), | ||
9096 | - PINMUX_IPSR_GPSR(IP11_11_8, SSI_SCK2_A), | ||
9097 | + PINMUX_IPSR_MSEL(IP11_11_8, SSI_SCK2_A, SEL_SSI2_0), | ||
9098 | PINMUX_IPSR_GPSR(IP11_11_8, RIF1_SYNC), | ||
9099 | PINMUX_IPSR_GPSR(IP11_11_8, TS_SCK1), | ||
9100 | |||
9101 | PINMUX_IPSR_MSEL(IP11_15_12, TX0_A, SEL_SCIF0_0), | ||
9102 | PINMUX_IPSR_GPSR(IP11_15_12, HTX1_A), | ||
9103 | - PINMUX_IPSR_GPSR(IP11_15_12, SSI_WS2_A), | ||
9104 | + PINMUX_IPSR_MSEL(IP11_15_12, SSI_WS2_A, SEL_SSI2_0), | ||
9105 | PINMUX_IPSR_GPSR(IP11_15_12, RIF1_D0), | ||
9106 | PINMUX_IPSR_GPSR(IP11_15_12, TS_SDAT1), | ||
9107 | |||
9108 | @@ -1196,7 +1199,7 @@ static const u16 pinmux_data[] = { | ||
9109 | PINMUX_IPSR_MSEL(IP13_19_16, RIF0_D1_A, SEL_DRIF0_0), | ||
9110 | PINMUX_IPSR_MSEL(IP13_19_16, SDA1_B, SEL_I2C1_1), | ||
9111 | PINMUX_IPSR_MSEL(IP13_19_16, TCLK2_B, SEL_TIMER_TMU_1), | ||
9112 | - PINMUX_IPSR_GPSR(IP13_19_16, SIM0_D_A), | ||
9113 | + PINMUX_IPSR_MSEL(IP13_19_16, SIM0_D_A, SEL_SIMCARD_0), | ||
9114 | |||
9115 | PINMUX_IPSR_GPSR(IP13_23_20, MLB_DAT), | ||
9116 | PINMUX_IPSR_MSEL(IP13_23_20, TX0_B, SEL_SCIF0_1), | ||
9117 | @@ -1264,7 +1267,7 @@ static const u16 pinmux_data[] = { | ||
9118 | PINMUX_IPSR_GPSR(IP15_15_12, TPU0TO2), | ||
9119 | PINMUX_IPSR_MSEL(IP15_15_12, SDA1_D, SEL_I2C1_3), | ||
9120 | PINMUX_IPSR_MSEL(IP15_15_12, FSO_CFE_1_N_B, SEL_FSO_1), | ||
9121 | - PINMUX_IPSR_GPSR(IP15_15_12, SIM0_D_B), | ||
9122 | + PINMUX_IPSR_MSEL(IP15_15_12, SIM0_D_B, SEL_SIMCARD_1), | ||
9123 | |||
9124 | PINMUX_IPSR_GPSR(IP15_19_16, SSI_SDATA6), | ||
9125 | PINMUX_IPSR_MSEL(IP15_19_16, HRTS2_N_A, SEL_HSCIF2_0), | ||
9126 | @@ -4957,11 +4960,11 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { | ||
9127 | MOD_SEL0_1_0 )) | ||
9128 | }, | ||
9129 | { PINMUX_CFG_REG_VAR("MOD_SEL1", 0xe6060504, 32, | ||
9130 | - GROUP(2, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, 1, | ||
9131 | - 2, 2, 2, 1, 1, 2, 1, 4), | ||
9132 | + GROUP(1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, | ||
9133 | + 1, 2, 2, 2, 1, 1, 2, 1, 4), | ||
9134 | GROUP( | ||
9135 | - /* RESERVED 31, 30 */ | ||
9136 | - 0, 0, 0, 0, | ||
9137 | + MOD_SEL1_31 | ||
9138 | + MOD_SEL1_30 | ||
9139 | MOD_SEL1_29 | ||
9140 | MOD_SEL1_28 | ||
9141 | /* RESERVED 27 */ | ||
9142 | diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c | ||
9143 | index 5dfd991ffdaa..dbc36079c381 100644 | ||
9144 | --- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c | ||
9145 | +++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c | ||
9146 | @@ -1450,7 +1450,7 @@ static const struct pinmux_func pinmux_func_gpios[] = { | ||
9147 | GPIO_FN(ET0_ETXD2_A), | ||
9148 | GPIO_FN(EX_CS5), GPIO_FN(SD1_CMD_A), GPIO_FN(ATADIR), GPIO_FN(QSSL_B), | ||
9149 | GPIO_FN(ET0_ETXD3_A), | ||
9150 | - GPIO_FN(RD_WR), GPIO_FN(TCLK1_B), | ||
9151 | + GPIO_FN(RD_WR), GPIO_FN(TCLK0), GPIO_FN(CAN_CLK_B), GPIO_FN(ET0_ETXD4), | ||
9152 | GPIO_FN(EX_WAIT0), GPIO_FN(TCLK1_B), | ||
9153 | GPIO_FN(EX_WAIT1), GPIO_FN(SD1_DAT0_A), GPIO_FN(DREQ2), | ||
9154 | GPIO_FN(CAN1_TX_C), GPIO_FN(ET0_LINK_C), GPIO_FN(ET0_ETXD5_A), | ||
9155 | @@ -1949,7 +1949,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { | ||
9156 | /* IP3_20 [1] */ | ||
9157 | FN_EX_WAIT0, FN_TCLK1_B, | ||
9158 | /* IP3_19_18 [2] */ | ||
9159 | - FN_RD_WR, FN_TCLK1_B, 0, 0, | ||
9160 | + FN_RD_WR, FN_TCLK0, FN_CAN_CLK_B, FN_ET0_ETXD4, | ||
9161 | /* IP3_17_15 [3] */ | ||
9162 | FN_EX_CS5, FN_SD1_CMD_A, FN_ATADIR, FN_QSSL_B, | ||
9163 | FN_ET0_ETXD3_A, 0, 0, 0, | ||
9164 | diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c | ||
9165 | index 9579a706fc08..a881b709af25 100644 | ||
9166 | --- a/drivers/platform/x86/hp-wmi.c | ||
9167 | +++ b/drivers/platform/x86/hp-wmi.c | ||
9168 | @@ -300,7 +300,7 @@ static int __init hp_wmi_bios_2008_later(void) | ||
9169 | |||
9170 | static int __init hp_wmi_bios_2009_later(void) | ||
9171 | { | ||
9172 | - int state = 0; | ||
9173 | + u8 state[128]; | ||
9174 | int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, HPWMI_READ, &state, | ||
9175 | sizeof(state), sizeof(state)); | ||
9176 | if (!ret) | ||
9177 | diff --git a/drivers/power/supply/cpcap-battery.c b/drivers/power/supply/cpcap-battery.c | ||
9178 | index 61d6447d1966..00a96e4a1cdc 100644 | ||
9179 | --- a/drivers/power/supply/cpcap-battery.c | ||
9180 | +++ b/drivers/power/supply/cpcap-battery.c | ||
9181 | @@ -562,12 +562,14 @@ static irqreturn_t cpcap_battery_irq_thread(int irq, void *data) | ||
9182 | switch (d->action) { | ||
9183 | case CPCAP_BATTERY_IRQ_ACTION_BATTERY_LOW: | ||
9184 | if (latest->current_ua >= 0) | ||
9185 | - dev_warn(ddata->dev, "Battery low at 3.3V!\n"); | ||
9186 | + dev_warn(ddata->dev, "Battery low at %imV!\n", | ||
9187 | + latest->voltage / 1000); | ||
9188 | break; | ||
9189 | case CPCAP_BATTERY_IRQ_ACTION_POWEROFF: | ||
9190 | - if (latest->current_ua >= 0) { | ||
9191 | + if (latest->current_ua >= 0 && latest->voltage <= 3200000) { | ||
9192 | dev_emerg(ddata->dev, | ||
9193 | - "Battery empty at 3.1V, powering off\n"); | ||
9194 | + "Battery empty at %imV, powering off\n", | ||
9195 | + latest->voltage / 1000); | ||
9196 | orderly_poweroff(true); | ||
9197 | } | ||
9198 | break; | ||
9199 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c | ||
9200 | index a46be221dbdc..87bc06b386a0 100644 | ||
9201 | --- a/drivers/regulator/core.c | ||
9202 | +++ b/drivers/regulator/core.c | ||
9203 | @@ -1403,7 +1403,9 @@ static int set_machine_constraints(struct regulator_dev *rdev, | ||
9204 | rdev_err(rdev, "failed to enable\n"); | ||
9205 | return ret; | ||
9206 | } | ||
9207 | - rdev->use_count++; | ||
9208 | + | ||
9209 | + if (rdev->constraints->always_on) | ||
9210 | + rdev->use_count++; | ||
9211 | } | ||
9212 | |||
9213 | print_constraints(rdev); | ||
9214 | @@ -5198,6 +5200,7 @@ unset_supplies: | ||
9215 | regulator_remove_coupling(rdev); | ||
9216 | mutex_unlock(®ulator_list_mutex); | ||
9217 | wash: | ||
9218 | + kfree(rdev->coupling_desc.coupled_rdevs); | ||
9219 | kfree(rdev->constraints); | ||
9220 | mutex_lock(®ulator_list_mutex); | ||
9221 | regulator_ena_gpio_free(rdev); | ||
9222 | diff --git a/drivers/regulator/max8907-regulator.c b/drivers/regulator/max8907-regulator.c | ||
9223 | index 76152aaa330b..96dc0eea7659 100644 | ||
9224 | --- a/drivers/regulator/max8907-regulator.c | ||
9225 | +++ b/drivers/regulator/max8907-regulator.c | ||
9226 | @@ -296,7 +296,10 @@ static int max8907_regulator_probe(struct platform_device *pdev) | ||
9227 | memcpy(pmic->desc, max8907_regulators, sizeof(pmic->desc)); | ||
9228 | |||
9229 | /* Backwards compatibility with MAX8907B; SD1 uses different voltages */ | ||
9230 | - regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val); | ||
9231 | + ret = regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val); | ||
9232 | + if (ret) | ||
9233 | + return ret; | ||
9234 | + | ||
9235 | if ((val & MAX8907_II2RR_VERSION_MASK) == | ||
9236 | MAX8907_II2RR_VERSION_REV_B) { | ||
9237 | pmic->desc[MAX8907_SD1].min_uV = 637500; | ||
9238 | @@ -333,14 +336,20 @@ static int max8907_regulator_probe(struct platform_device *pdev) | ||
9239 | } | ||
9240 | |||
9241 | if (pmic->desc[i].ops == &max8907_ldo_ops) { | ||
9242 | - regmap_read(config.regmap, pmic->desc[i].enable_reg, | ||
9243 | + ret = regmap_read(config.regmap, pmic->desc[i].enable_reg, | ||
9244 | &val); | ||
9245 | + if (ret) | ||
9246 | + return ret; | ||
9247 | + | ||
9248 | if ((val & MAX8907_MASK_LDO_SEQ) != | ||
9249 | MAX8907_MASK_LDO_SEQ) | ||
9250 | pmic->desc[i].ops = &max8907_ldo_hwctl_ops; | ||
9251 | } else if (pmic->desc[i].ops == &max8907_out5v_ops) { | ||
9252 | - regmap_read(config.regmap, pmic->desc[i].enable_reg, | ||
9253 | + ret = regmap_read(config.regmap, pmic->desc[i].enable_reg, | ||
9254 | &val); | ||
9255 | + if (ret) | ||
9256 | + return ret; | ||
9257 | + | ||
9258 | if ((val & (MAX8907_MASK_OUT5V_VINEN | | ||
9259 | MAX8907_MASK_OUT5V_ENSRC)) != | ||
9260 | MAX8907_MASK_OUT5V_ENSRC) | ||
9261 | diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c | ||
9262 | index 13c54eac0cc3..d1839707128a 100644 | ||
9263 | --- a/drivers/soundwire/intel.c | ||
9264 | +++ b/drivers/soundwire/intel.c | ||
9265 | @@ -479,7 +479,10 @@ intel_pdi_shim_configure(struct sdw_intel *sdw, struct sdw_cdns_pdi *pdi) | ||
9266 | unsigned int link_id = sdw->instance; | ||
9267 | int pdi_conf = 0; | ||
9268 | |||
9269 | - pdi->intel_alh_id = (link_id * 16) + pdi->num + 5; | ||
9270 | + /* the Bulk and PCM streams are not contiguous */ | ||
9271 | + pdi->intel_alh_id = (link_id * 16) + pdi->num + 3; | ||
9272 | + if (pdi->num >= 2) | ||
9273 | + pdi->intel_alh_id += 2; | ||
9274 | |||
9275 | /* | ||
9276 | * Program stream parameters to stream SHIM register | ||
9277 | @@ -508,7 +511,10 @@ intel_pdi_alh_configure(struct sdw_intel *sdw, struct sdw_cdns_pdi *pdi) | ||
9278 | unsigned int link_id = sdw->instance; | ||
9279 | unsigned int conf; | ||
9280 | |||
9281 | - pdi->intel_alh_id = (link_id * 16) + pdi->num + 5; | ||
9282 | + /* the Bulk and PCM streams are not contiguous */ | ||
9283 | + pdi->intel_alh_id = (link_id * 16) + pdi->num + 3; | ||
9284 | + if (pdi->num >= 2) | ||
9285 | + pdi->intel_alh_id += 2; | ||
9286 | |||
9287 | /* Program Stream config ALH register */ | ||
9288 | conf = intel_readl(alh, SDW_ALH_STRMZCFG(pdi->intel_alh_id)); | ||
9289 | diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c | ||
9290 | index c36587b42e95..82a0ee09cbe1 100644 | ||
9291 | --- a/drivers/spi/spi-cadence.c | ||
9292 | +++ b/drivers/spi/spi-cadence.c | ||
9293 | @@ -168,16 +168,16 @@ static void cdns_spi_init_hw(struct cdns_spi *xspi) | ||
9294 | /** | ||
9295 | * cdns_spi_chipselect - Select or deselect the chip select line | ||
9296 | * @spi: Pointer to the spi_device structure | ||
9297 | - * @enable: Select (1) or deselect (0) the chip select line | ||
9298 | + * @is_high: Select(0) or deselect (1) the chip select line | ||
9299 | */ | ||
9300 | -static void cdns_spi_chipselect(struct spi_device *spi, bool enable) | ||
9301 | +static void cdns_spi_chipselect(struct spi_device *spi, bool is_high) | ||
9302 | { | ||
9303 | struct cdns_spi *xspi = spi_master_get_devdata(spi->master); | ||
9304 | u32 ctrl_reg; | ||
9305 | |||
9306 | ctrl_reg = cdns_spi_read(xspi, CDNS_SPI_CR); | ||
9307 | |||
9308 | - if (!enable) { | ||
9309 | + if (is_high) { | ||
9310 | /* Deselect the slave */ | ||
9311 | ctrl_reg |= CDNS_SPI_CR_SSCTRL; | ||
9312 | } else { | ||
9313 | diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c | ||
9314 | index 9a49e073e8b7..45972056ed8c 100644 | ||
9315 | --- a/drivers/spi/spi-dw.c | ||
9316 | +++ b/drivers/spi/spi-dw.c | ||
9317 | @@ -129,10 +129,11 @@ void dw_spi_set_cs(struct spi_device *spi, bool enable) | ||
9318 | struct dw_spi *dws = spi_controller_get_devdata(spi->controller); | ||
9319 | struct chip_data *chip = spi_get_ctldata(spi); | ||
9320 | |||
9321 | + /* Chip select logic is inverted from spi_set_cs() */ | ||
9322 | if (chip && chip->cs_control) | ||
9323 | - chip->cs_control(enable); | ||
9324 | + chip->cs_control(!enable); | ||
9325 | |||
9326 | - if (enable) | ||
9327 | + if (!enable) | ||
9328 | dw_writel(dws, DW_SPI_SER, BIT(spi->chip_select)); | ||
9329 | else if (dws->cs_override) | ||
9330 | dw_writel(dws, DW_SPI_SER, 0); | ||
9331 | @@ -308,7 +309,8 @@ static int dw_spi_transfer_one(struct spi_controller *master, | ||
9332 | cr0 = (transfer->bits_per_word - 1) | ||
9333 | | (chip->type << SPI_FRF_OFFSET) | ||
9334 | | ((((spi->mode & SPI_CPOL) ? 1 : 0) << SPI_SCOL_OFFSET) | | ||
9335 | - (((spi->mode & SPI_CPHA) ? 1 : 0) << SPI_SCPH_OFFSET)) | ||
9336 | + (((spi->mode & SPI_CPHA) ? 1 : 0) << SPI_SCPH_OFFSET) | | ||
9337 | + (((spi->mode & SPI_LOOP) ? 1 : 0) << SPI_SRL_OFFSET)) | ||
9338 | | (chip->tmode << SPI_TMOD_OFFSET); | ||
9339 | |||
9340 | /* | ||
9341 | diff --git a/drivers/spi/spi-fsl-spi.c b/drivers/spi/spi-fsl-spi.c | ||
9342 | index 4b80ace1d137..2d563874b4ac 100644 | ||
9343 | --- a/drivers/spi/spi-fsl-spi.c | ||
9344 | +++ b/drivers/spi/spi-fsl-spi.c | ||
9345 | @@ -736,9 +736,9 @@ static int of_fsl_spi_probe(struct platform_device *ofdev) | ||
9346 | if (ret) | ||
9347 | goto err; | ||
9348 | |||
9349 | - irq = irq_of_parse_and_map(np, 0); | ||
9350 | - if (!irq) { | ||
9351 | - ret = -EINVAL; | ||
9352 | + irq = platform_get_irq(ofdev, 0); | ||
9353 | + if (irq < 0) { | ||
9354 | + ret = irq; | ||
9355 | goto err; | ||
9356 | } | ||
9357 | |||
9358 | @@ -751,7 +751,6 @@ static int of_fsl_spi_probe(struct platform_device *ofdev) | ||
9359 | return 0; | ||
9360 | |||
9361 | err: | ||
9362 | - irq_dispose_mapping(irq); | ||
9363 | return ret; | ||
9364 | } | ||
9365 | |||
9366 | diff --git a/drivers/spi/spi-gpio.c b/drivers/spi/spi-gpio.c | ||
9367 | index 1d3e23ec20a6..f9c5bbb74714 100644 | ||
9368 | --- a/drivers/spi/spi-gpio.c | ||
9369 | +++ b/drivers/spi/spi-gpio.c | ||
9370 | @@ -371,8 +371,10 @@ static int spi_gpio_probe(struct platform_device *pdev) | ||
9371 | return -ENOMEM; | ||
9372 | |||
9373 | status = devm_add_action_or_reset(&pdev->dev, spi_gpio_put, master); | ||
9374 | - if (status) | ||
9375 | + if (status) { | ||
9376 | + spi_master_put(master); | ||
9377 | return status; | ||
9378 | + } | ||
9379 | |||
9380 | if (of_id) | ||
9381 | status = spi_gpio_probe_dt(pdev, master); | ||
9382 | diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c | ||
9383 | index 439b01e4a2c8..f4a8f470aecc 100644 | ||
9384 | --- a/drivers/spi/spi-img-spfi.c | ||
9385 | +++ b/drivers/spi/spi-img-spfi.c | ||
9386 | @@ -673,6 +673,8 @@ static int img_spfi_probe(struct platform_device *pdev) | ||
9387 | dma_release_channel(spfi->tx_ch); | ||
9388 | if (spfi->rx_ch) | ||
9389 | dma_release_channel(spfi->rx_ch); | ||
9390 | + spfi->tx_ch = NULL; | ||
9391 | + spfi->rx_ch = NULL; | ||
9392 | dev_warn(spfi->dev, "Failed to get DMA channels, falling back to PIO mode\n"); | ||
9393 | } else { | ||
9394 | master->dma_tx = spfi->tx_ch; | ||
9395 | diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c | ||
9396 | index bb6a14d1ab0f..2e73d75a6ac5 100644 | ||
9397 | --- a/drivers/spi/spi-pxa2xx.c | ||
9398 | +++ b/drivers/spi/spi-pxa2xx.c | ||
9399 | @@ -1565,7 +1565,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev) | ||
9400 | #endif | ||
9401 | |||
9402 | ssp->clk = devm_clk_get(&pdev->dev, NULL); | ||
9403 | + if (IS_ERR(ssp->clk)) | ||
9404 | + return NULL; | ||
9405 | + | ||
9406 | ssp->irq = platform_get_irq(pdev, 0); | ||
9407 | + if (ssp->irq < 0) | ||
9408 | + return NULL; | ||
9409 | + | ||
9410 | ssp->type = type; | ||
9411 | ssp->pdev = pdev; | ||
9412 | ssp->port_id = pxa2xx_spi_get_port_id(adev); | ||
9413 | diff --git a/drivers/spi/spi-sifive.c b/drivers/spi/spi-sifive.c | ||
9414 | index 35254bdc42c4..f7c1e20432e0 100644 | ||
9415 | --- a/drivers/spi/spi-sifive.c | ||
9416 | +++ b/drivers/spi/spi-sifive.c | ||
9417 | @@ -357,14 +357,14 @@ static int sifive_spi_probe(struct platform_device *pdev) | ||
9418 | if (!cs_bits) { | ||
9419 | dev_err(&pdev->dev, "Could not auto probe CS lines\n"); | ||
9420 | ret = -EINVAL; | ||
9421 | - goto put_master; | ||
9422 | + goto disable_clk; | ||
9423 | } | ||
9424 | |||
9425 | num_cs = ilog2(cs_bits) + 1; | ||
9426 | if (num_cs > SIFIVE_SPI_MAX_CS) { | ||
9427 | dev_err(&pdev->dev, "Invalid number of spi slaves\n"); | ||
9428 | ret = -EINVAL; | ||
9429 | - goto put_master; | ||
9430 | + goto disable_clk; | ||
9431 | } | ||
9432 | |||
9433 | /* Define our master */ | ||
9434 | @@ -393,7 +393,7 @@ static int sifive_spi_probe(struct platform_device *pdev) | ||
9435 | dev_name(&pdev->dev), spi); | ||
9436 | if (ret) { | ||
9437 | dev_err(&pdev->dev, "Unable to bind to interrupt\n"); | ||
9438 | - goto put_master; | ||
9439 | + goto disable_clk; | ||
9440 | } | ||
9441 | |||
9442 | dev_info(&pdev->dev, "mapped; irq=%d, cs=%d\n", | ||
9443 | @@ -402,11 +402,13 @@ static int sifive_spi_probe(struct platform_device *pdev) | ||
9444 | ret = devm_spi_register_master(&pdev->dev, master); | ||
9445 | if (ret < 0) { | ||
9446 | dev_err(&pdev->dev, "spi_register_master failed\n"); | ||
9447 | - goto put_master; | ||
9448 | + goto disable_clk; | ||
9449 | } | ||
9450 | |||
9451 | return 0; | ||
9452 | |||
9453 | +disable_clk: | ||
9454 | + clk_disable_unprepare(spi->clk); | ||
9455 | put_master: | ||
9456 | spi_master_put(master); | ||
9457 | |||
9458 | @@ -420,6 +422,7 @@ static int sifive_spi_remove(struct platform_device *pdev) | ||
9459 | |||
9460 | /* Disable all the interrupts just in case */ | ||
9461 | sifive_spi_write(spi, SIFIVE_SPI_REG_IE, 0); | ||
9462 | + clk_disable_unprepare(spi->clk); | ||
9463 | |||
9464 | return 0; | ||
9465 | } | ||
9466 | diff --git a/drivers/spi/spi-sprd-adi.c b/drivers/spi/spi-sprd-adi.c | ||
9467 | index 9a051286f120..9613cfe3c0a2 100644 | ||
9468 | --- a/drivers/spi/spi-sprd-adi.c | ||
9469 | +++ b/drivers/spi/spi-sprd-adi.c | ||
9470 | @@ -393,6 +393,9 @@ static int sprd_adi_restart_handler(struct notifier_block *this, | ||
9471 | val |= BIT_WDG_RUN | BIT_WDG_RST; | ||
9472 | sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_CTRL, val); | ||
9473 | |||
9474 | + /* Lock the watchdog */ | ||
9475 | + sprd_adi_write(sadi, sadi->slave_pbase + REG_WDG_LOCK, ~WDG_UNLOCK_KEY); | ||
9476 | + | ||
9477 | mdelay(1000); | ||
9478 | |||
9479 | dev_emerg(sadi->dev, "Unable to restart system\n"); | ||
9480 | diff --git a/drivers/spi/spi-st-ssc4.c b/drivers/spi/spi-st-ssc4.c | ||
9481 | index 0c24c494f386..77d26d64541a 100644 | ||
9482 | --- a/drivers/spi/spi-st-ssc4.c | ||
9483 | +++ b/drivers/spi/spi-st-ssc4.c | ||
9484 | @@ -381,6 +381,7 @@ static int spi_st_probe(struct platform_device *pdev) | ||
9485 | return 0; | ||
9486 | |||
9487 | clk_disable: | ||
9488 | + pm_runtime_disable(&pdev->dev); | ||
9489 | clk_disable_unprepare(spi_st->clk); | ||
9490 | put_master: | ||
9491 | spi_master_put(master); | ||
9492 | @@ -392,6 +393,8 @@ static int spi_st_remove(struct platform_device *pdev) | ||
9493 | struct spi_master *master = platform_get_drvdata(pdev); | ||
9494 | struct spi_st *spi_st = spi_master_get_devdata(master); | ||
9495 | |||
9496 | + pm_runtime_disable(&pdev->dev); | ||
9497 | + | ||
9498 | clk_disable_unprepare(spi_st->clk); | ||
9499 | |||
9500 | pinctrl_pm_select_sleep_state(&pdev->dev); | ||
9501 | diff --git a/drivers/spi/spi-tegra20-slink.c b/drivers/spi/spi-tegra20-slink.c | ||
9502 | index 111fffc91435..374a2a32edcd 100644 | ||
9503 | --- a/drivers/spi/spi-tegra20-slink.c | ||
9504 | +++ b/drivers/spi/spi-tegra20-slink.c | ||
9505 | @@ -1073,7 +1073,7 @@ static int tegra_slink_probe(struct platform_device *pdev) | ||
9506 | ret = clk_enable(tspi->clk); | ||
9507 | if (ret < 0) { | ||
9508 | dev_err(&pdev->dev, "Clock enable failed %d\n", ret); | ||
9509 | - goto exit_free_master; | ||
9510 | + goto exit_clk_unprepare; | ||
9511 | } | ||
9512 | |||
9513 | spi_irq = platform_get_irq(pdev, 0); | ||
9514 | @@ -1146,6 +1146,8 @@ exit_free_irq: | ||
9515 | free_irq(spi_irq, tspi); | ||
9516 | exit_clk_disable: | ||
9517 | clk_disable(tspi->clk); | ||
9518 | +exit_clk_unprepare: | ||
9519 | + clk_unprepare(tspi->clk); | ||
9520 | exit_free_master: | ||
9521 | spi_master_put(master); | ||
9522 | return ret; | ||
9523 | @@ -1159,6 +1161,7 @@ static int tegra_slink_remove(struct platform_device *pdev) | ||
9524 | free_irq(tspi->irq, tspi); | ||
9525 | |||
9526 | clk_disable(tspi->clk); | ||
9527 | + clk_unprepare(tspi->clk); | ||
9528 | |||
9529 | if (tspi->tx_dma_chan) | ||
9530 | tegra_slink_deinit_dma_param(tspi, false); | ||
9531 | diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c | ||
9532 | index 255786f2e844..3ea9d8a3e6e8 100644 | ||
9533 | --- a/drivers/spi/spidev.c | ||
9534 | +++ b/drivers/spi/spidev.c | ||
9535 | @@ -627,6 +627,9 @@ static int spidev_release(struct inode *inode, struct file *filp) | ||
9536 | if (dofree) | ||
9537 | kfree(spidev); | ||
9538 | } | ||
9539 | +#ifdef CONFIG_SPI_SLAVE | ||
9540 | + spi_slave_abort(spidev->spi); | ||
9541 | +#endif | ||
9542 | mutex_unlock(&device_list_lock); | ||
9543 | |||
9544 | return 0; | ||
9545 | diff --git a/drivers/staging/comedi/drivers/gsc_hpdi.c b/drivers/staging/comedi/drivers/gsc_hpdi.c | ||
9546 | index 4bdf44d82879..dc62db1ee1dd 100644 | ||
9547 | --- a/drivers/staging/comedi/drivers/gsc_hpdi.c | ||
9548 | +++ b/drivers/staging/comedi/drivers/gsc_hpdi.c | ||
9549 | @@ -623,6 +623,11 @@ static int gsc_hpdi_auto_attach(struct comedi_device *dev, | ||
9550 | dma_alloc_coherent(&pcidev->dev, DMA_BUFFER_SIZE, | ||
9551 | &devpriv->dio_buffer_phys_addr[i], | ||
9552 | GFP_KERNEL); | ||
9553 | + if (!devpriv->dio_buffer[i]) { | ||
9554 | + dev_warn(dev->class_dev, | ||
9555 | + "failed to allocate DMA buffer\n"); | ||
9556 | + return -ENOMEM; | ||
9557 | + } | ||
9558 | } | ||
9559 | /* allocate dma descriptors */ | ||
9560 | devpriv->dma_desc = dma_alloc_coherent(&pcidev->dev, | ||
9561 | @@ -630,6 +635,11 @@ static int gsc_hpdi_auto_attach(struct comedi_device *dev, | ||
9562 | NUM_DMA_DESCRIPTORS, | ||
9563 | &devpriv->dma_desc_phys_addr, | ||
9564 | GFP_KERNEL); | ||
9565 | + if (!devpriv->dma_desc) { | ||
9566 | + dev_warn(dev->class_dev, | ||
9567 | + "failed to allocate DMA descriptors\n"); | ||
9568 | + return -ENOMEM; | ||
9569 | + } | ||
9570 | if (devpriv->dma_desc_phys_addr & 0xf) { | ||
9571 | dev_warn(dev->class_dev, | ||
9572 | " dma descriptors not quad-word aligned (bug)\n"); | ||
9573 | diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c | ||
9574 | index a0a67aa517f0..61f0286fb157 100644 | ||
9575 | --- a/drivers/staging/fbtft/fbtft-core.c | ||
9576 | +++ b/drivers/staging/fbtft/fbtft-core.c | ||
9577 | @@ -666,7 +666,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display, | ||
9578 | fbdefio->deferred_io = fbtft_deferred_io; | ||
9579 | fb_deferred_io_init(info); | ||
9580 | |||
9581 | - strncpy(info->fix.id, dev->driver->name, 16); | ||
9582 | + snprintf(info->fix.id, sizeof(info->fix.id), "%s", dev->driver->name); | ||
9583 | info->fix.type = FB_TYPE_PACKED_PIXELS; | ||
9584 | info->fix.visual = FB_VISUAL_TRUECOLOR; | ||
9585 | info->fix.xpanstep = 0; | ||
9586 | diff --git a/drivers/staging/iio/frequency/ad9834.c b/drivers/staging/iio/frequency/ad9834.c | ||
9587 | index 038d6732c3fd..23026978a5a5 100644 | ||
9588 | --- a/drivers/staging/iio/frequency/ad9834.c | ||
9589 | +++ b/drivers/staging/iio/frequency/ad9834.c | ||
9590 | @@ -417,6 +417,10 @@ static int ad9834_probe(struct spi_device *spi) | ||
9591 | st = iio_priv(indio_dev); | ||
9592 | mutex_init(&st->lock); | ||
9593 | st->mclk = devm_clk_get(&spi->dev, NULL); | ||
9594 | + if (IS_ERR(st->mclk)) { | ||
9595 | + ret = PTR_ERR(st->mclk); | ||
9596 | + goto error_disable_reg; | ||
9597 | + } | ||
9598 | |||
9599 | ret = clk_prepare_enable(st->mclk); | ||
9600 | if (ret) { | ||
9601 | diff --git a/drivers/staging/media/imx/imx-media-capture.c b/drivers/staging/media/imx/imx-media-capture.c | ||
9602 | index b33a07bc9105..46576e32581f 100644 | ||
9603 | --- a/drivers/staging/media/imx/imx-media-capture.c | ||
9604 | +++ b/drivers/staging/media/imx/imx-media-capture.c | ||
9605 | @@ -26,6 +26,8 @@ | ||
9606 | #include <media/imx.h> | ||
9607 | #include "imx-media.h" | ||
9608 | |||
9609 | +#define IMX_CAPTURE_NAME "imx-capture" | ||
9610 | + | ||
9611 | struct capture_priv { | ||
9612 | struct imx_media_video_dev vdev; | ||
9613 | |||
9614 | @@ -69,8 +71,8 @@ static int vidioc_querycap(struct file *file, void *fh, | ||
9615 | { | ||
9616 | struct capture_priv *priv = video_drvdata(file); | ||
9617 | |||
9618 | - strscpy(cap->driver, "imx-media-capture", sizeof(cap->driver)); | ||
9619 | - strscpy(cap->card, "imx-media-capture", sizeof(cap->card)); | ||
9620 | + strscpy(cap->driver, IMX_CAPTURE_NAME, sizeof(cap->driver)); | ||
9621 | + strscpy(cap->card, IMX_CAPTURE_NAME, sizeof(cap->card)); | ||
9622 | snprintf(cap->bus_info, sizeof(cap->bus_info), | ||
9623 | "platform:%s", priv->src_sd->name); | ||
9624 | |||
9625 | diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c b/drivers/staging/media/imx/imx7-mipi-csis.c | ||
9626 | index 73d8354e618c..e50b1f88e25b 100644 | ||
9627 | --- a/drivers/staging/media/imx/imx7-mipi-csis.c | ||
9628 | +++ b/drivers/staging/media/imx/imx7-mipi-csis.c | ||
9629 | @@ -350,6 +350,8 @@ static void mipi_csis_sw_reset(struct csi_state *state) | ||
9630 | static int mipi_csis_phy_init(struct csi_state *state) | ||
9631 | { | ||
9632 | state->mipi_phy_regulator = devm_regulator_get(state->dev, "phy"); | ||
9633 | + if (IS_ERR(state->mipi_phy_regulator)) | ||
9634 | + return PTR_ERR(state->mipi_phy_regulator); | ||
9635 | |||
9636 | return regulator_set_voltage(state->mipi_phy_regulator, 1000000, | ||
9637 | 1000000); | ||
9638 | @@ -966,7 +968,10 @@ static int mipi_csis_probe(struct platform_device *pdev) | ||
9639 | return ret; | ||
9640 | } | ||
9641 | |||
9642 | - mipi_csis_phy_init(state); | ||
9643 | + ret = mipi_csis_phy_init(state); | ||
9644 | + if (ret < 0) | ||
9645 | + return ret; | ||
9646 | + | ||
9647 | mipi_csis_phy_reset(state); | ||
9648 | |||
9649 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
9650 | diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c | ||
9651 | index 2d3ea8b74dfd..3439f6ad6338 100644 | ||
9652 | --- a/drivers/staging/media/sunxi/cedrus/cedrus.c | ||
9653 | +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c | ||
9654 | @@ -357,6 +357,8 @@ static int cedrus_probe(struct platform_device *pdev) | ||
9655 | |||
9656 | dev->mdev.dev = &pdev->dev; | ||
9657 | strscpy(dev->mdev.model, CEDRUS_NAME, sizeof(dev->mdev.model)); | ||
9658 | + strscpy(dev->mdev.bus_info, "platform:" CEDRUS_NAME, | ||
9659 | + sizeof(dev->mdev.bus_info)); | ||
9660 | |||
9661 | media_device_init(&dev->mdev); | ||
9662 | dev->mdev.ops = &cedrus_m2m_media_ops; | ||
9663 | diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h | ||
9664 | index 2f017a651848..3758a1c4e2d0 100644 | ||
9665 | --- a/drivers/staging/media/sunxi/cedrus/cedrus.h | ||
9666 | +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h | ||
9667 | @@ -179,12 +179,16 @@ static inline dma_addr_t cedrus_buf_addr(struct vb2_buffer *buf, | ||
9668 | static inline dma_addr_t cedrus_dst_buf_addr(struct cedrus_ctx *ctx, | ||
9669 | int index, unsigned int plane) | ||
9670 | { | ||
9671 | - struct vb2_buffer *buf; | ||
9672 | + struct vb2_buffer *buf = NULL; | ||
9673 | + struct vb2_queue *vq; | ||
9674 | |||
9675 | if (index < 0) | ||
9676 | return 0; | ||
9677 | |||
9678 | - buf = ctx->fh.m2m_ctx->cap_q_ctx.q.bufs[index]; | ||
9679 | + vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); | ||
9680 | + if (vq) | ||
9681 | + buf = vb2_get_buffer(vq, index); | ||
9682 | + | ||
9683 | return buf ? cedrus_buf_addr(buf, &ctx->dst_fmt, plane) : 0; | ||
9684 | } | ||
9685 | |||
9686 | diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c | ||
9687 | index d6a782703c9b..08c6c9c410cc 100644 | ||
9688 | --- a/drivers/staging/media/sunxi/cedrus/cedrus_h264.c | ||
9689 | +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h264.c | ||
9690 | @@ -96,7 +96,7 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, | ||
9691 | const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; | ||
9692 | const struct v4l2_ctrl_h264_slice_params *slice = run->h264.slice_params; | ||
9693 | const struct v4l2_ctrl_h264_sps *sps = run->h264.sps; | ||
9694 | - struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; | ||
9695 | + struct vb2_queue *cap_q; | ||
9696 | struct cedrus_buffer *output_buf; | ||
9697 | struct cedrus_dev *dev = ctx->dev; | ||
9698 | unsigned long used_dpbs = 0; | ||
9699 | @@ -104,6 +104,8 @@ static void cedrus_write_frame_list(struct cedrus_ctx *ctx, | ||
9700 | unsigned int output = 0; | ||
9701 | unsigned int i; | ||
9702 | |||
9703 | + cap_q = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); | ||
9704 | + | ||
9705 | memset(pic_list, 0, sizeof(pic_list)); | ||
9706 | |||
9707 | for (i = 0; i < ARRAY_SIZE(decode->dpb); i++) { | ||
9708 | @@ -167,12 +169,14 @@ static void _cedrus_write_ref_list(struct cedrus_ctx *ctx, | ||
9709 | enum cedrus_h264_sram_off sram) | ||
9710 | { | ||
9711 | const struct v4l2_ctrl_h264_decode_params *decode = run->h264.decode_params; | ||
9712 | - struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; | ||
9713 | + struct vb2_queue *cap_q; | ||
9714 | struct cedrus_dev *dev = ctx->dev; | ||
9715 | u8 sram_array[CEDRUS_MAX_REF_IDX]; | ||
9716 | unsigned int i; | ||
9717 | size_t size; | ||
9718 | |||
9719 | + cap_q = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE); | ||
9720 | + | ||
9721 | memset(sram_array, 0, sizeof(sram_array)); | ||
9722 | |||
9723 | for (i = 0; i < num_ref; i++) { | ||
9724 | diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h | ||
9725 | index ddd29788d685..f9dd8cbf3458 100644 | ||
9726 | --- a/drivers/staging/media/sunxi/cedrus/cedrus_regs.h | ||
9727 | +++ b/drivers/staging/media/sunxi/cedrus/cedrus_regs.h | ||
9728 | @@ -10,6 +10,9 @@ | ||
9729 | #ifndef _CEDRUS_REGS_H_ | ||
9730 | #define _CEDRUS_REGS_H_ | ||
9731 | |||
9732 | +#define SHIFT_AND_MASK_BITS(v, h, l) \ | ||
9733 | + (((unsigned long)(v) << (l)) & GENMASK(h, l)) | ||
9734 | + | ||
9735 | /* | ||
9736 | * Common acronyms and contractions used in register descriptions: | ||
9737 | * * VLD : Variable-Length Decoder | ||
9738 | @@ -37,8 +40,8 @@ | ||
9739 | #define VE_PRIMARY_CHROMA_BUF_LEN 0xc4 | ||
9740 | #define VE_PRIMARY_FB_LINE_STRIDE 0xc8 | ||
9741 | |||
9742 | -#define VE_PRIMARY_FB_LINE_STRIDE_CHROMA(s) (((s) << 16) & GENMASK(31, 16)) | ||
9743 | -#define VE_PRIMARY_FB_LINE_STRIDE_LUMA(s) (((s) << 0) & GENMASK(15, 0)) | ||
9744 | +#define VE_PRIMARY_FB_LINE_STRIDE_CHROMA(s) SHIFT_AND_MASK_BITS(s, 31, 16) | ||
9745 | +#define VE_PRIMARY_FB_LINE_STRIDE_LUMA(s) SHIFT_AND_MASK_BITS(s, 15, 0) | ||
9746 | |||
9747 | #define VE_CHROMA_BUF_LEN 0xe8 | ||
9748 | |||
9749 | @@ -46,7 +49,7 @@ | ||
9750 | #define VE_SECONDARY_OUT_FMT_EXT (0x01 << 30) | ||
9751 | #define VE_SECONDARY_OUT_FMT_YU12 (0x02 << 30) | ||
9752 | #define VE_SECONDARY_OUT_FMT_YV12 (0x03 << 30) | ||
9753 | -#define VE_CHROMA_BUF_LEN_SDRT(l) ((l) & GENMASK(27, 0)) | ||
9754 | +#define VE_CHROMA_BUF_LEN_SDRT(l) SHIFT_AND_MASK_BITS(l, 27, 0) | ||
9755 | |||
9756 | #define VE_PRIMARY_OUT_FMT 0xec | ||
9757 | |||
9758 | @@ -69,15 +72,15 @@ | ||
9759 | |||
9760 | #define VE_DEC_MPEG_MP12HDR (VE_ENGINE_DEC_MPEG + 0x00) | ||
9761 | |||
9762 | -#define VE_DEC_MPEG_MP12HDR_SLICE_TYPE(t) (((t) << 28) & GENMASK(30, 28)) | ||
9763 | +#define VE_DEC_MPEG_MP12HDR_SLICE_TYPE(t) SHIFT_AND_MASK_BITS(t, 30, 28) | ||
9764 | #define VE_DEC_MPEG_MP12HDR_F_CODE_SHIFT(x, y) (24 - 4 * (y) - 8 * (x)) | ||
9765 | #define VE_DEC_MPEG_MP12HDR_F_CODE(__x, __y, __v) \ | ||
9766 | - (((__v) & GENMASK(3, 0)) << VE_DEC_MPEG_MP12HDR_F_CODE_SHIFT(__x, __y)) | ||
9767 | + (((unsigned long)(__v) & GENMASK(3, 0)) << VE_DEC_MPEG_MP12HDR_F_CODE_SHIFT(__x, __y)) | ||
9768 | |||
9769 | #define VE_DEC_MPEG_MP12HDR_INTRA_DC_PRECISION(p) \ | ||
9770 | - (((p) << 10) & GENMASK(11, 10)) | ||
9771 | + SHIFT_AND_MASK_BITS(p, 11, 10) | ||
9772 | #define VE_DEC_MPEG_MP12HDR_INTRA_PICTURE_STRUCTURE(s) \ | ||
9773 | - (((s) << 8) & GENMASK(9, 8)) | ||
9774 | + SHIFT_AND_MASK_BITS(s, 9, 8) | ||
9775 | #define VE_DEC_MPEG_MP12HDR_TOP_FIELD_FIRST(v) \ | ||
9776 | ((v) ? BIT(7) : 0) | ||
9777 | #define VE_DEC_MPEG_MP12HDR_FRAME_PRED_FRAME_DCT(v) \ | ||
9778 | @@ -98,19 +101,19 @@ | ||
9779 | #define VE_DEC_MPEG_PICCODEDSIZE (VE_ENGINE_DEC_MPEG + 0x08) | ||
9780 | |||
9781 | #define VE_DEC_MPEG_PICCODEDSIZE_WIDTH(w) \ | ||
9782 | - ((DIV_ROUND_UP((w), 16) << 8) & GENMASK(15, 8)) | ||
9783 | + SHIFT_AND_MASK_BITS(DIV_ROUND_UP((w), 16), 15, 8) | ||
9784 | #define VE_DEC_MPEG_PICCODEDSIZE_HEIGHT(h) \ | ||
9785 | - ((DIV_ROUND_UP((h), 16) << 0) & GENMASK(7, 0)) | ||
9786 | + SHIFT_AND_MASK_BITS(DIV_ROUND_UP((h), 16), 7, 0) | ||
9787 | |||
9788 | #define VE_DEC_MPEG_PICBOUNDSIZE (VE_ENGINE_DEC_MPEG + 0x0c) | ||
9789 | |||
9790 | -#define VE_DEC_MPEG_PICBOUNDSIZE_WIDTH(w) (((w) << 16) & GENMASK(27, 16)) | ||
9791 | -#define VE_DEC_MPEG_PICBOUNDSIZE_HEIGHT(h) (((h) << 0) & GENMASK(11, 0)) | ||
9792 | +#define VE_DEC_MPEG_PICBOUNDSIZE_WIDTH(w) SHIFT_AND_MASK_BITS(w, 27, 16) | ||
9793 | +#define VE_DEC_MPEG_PICBOUNDSIZE_HEIGHT(h) SHIFT_AND_MASK_BITS(h, 11, 0) | ||
9794 | |||
9795 | #define VE_DEC_MPEG_MBADDR (VE_ENGINE_DEC_MPEG + 0x10) | ||
9796 | |||
9797 | -#define VE_DEC_MPEG_MBADDR_X(w) (((w) << 8) & GENMASK(15, 8)) | ||
9798 | -#define VE_DEC_MPEG_MBADDR_Y(h) (((h) << 0) & GENMASK(7, 0)) | ||
9799 | +#define VE_DEC_MPEG_MBADDR_X(w) SHIFT_AND_MASK_BITS(w, 15, 8) | ||
9800 | +#define VE_DEC_MPEG_MBADDR_Y(h) SHIFT_AND_MASK_BITS(h, 7, 0) | ||
9801 | |||
9802 | #define VE_DEC_MPEG_CTRL (VE_ENGINE_DEC_MPEG + 0x14) | ||
9803 | |||
9804 | @@ -225,7 +228,7 @@ | ||
9805 | #define VE_DEC_MPEG_IQMINPUT_FLAG_INTRA (0x01 << 14) | ||
9806 | #define VE_DEC_MPEG_IQMINPUT_FLAG_NON_INTRA (0x00 << 14) | ||
9807 | #define VE_DEC_MPEG_IQMINPUT_WEIGHT(i, v) \ | ||
9808 | - (((v) & GENMASK(7, 0)) | (((i) << 8) & GENMASK(13, 8))) | ||
9809 | + (SHIFT_AND_MASK_BITS(i, 13, 8) | SHIFT_AND_MASK_BITS(v, 7, 0)) | ||
9810 | |||
9811 | #define VE_DEC_MPEG_ERROR (VE_ENGINE_DEC_MPEG + 0xc4) | ||
9812 | #define VE_DEC_MPEG_CRTMBADDR (VE_ENGINE_DEC_MPEG + 0xc8) | ||
9813 | diff --git a/drivers/staging/mt7621-pci/Kconfig b/drivers/staging/mt7621-pci/Kconfig | ||
9814 | index af928b75a940..ce58042f2f21 100644 | ||
9815 | --- a/drivers/staging/mt7621-pci/Kconfig | ||
9816 | +++ b/drivers/staging/mt7621-pci/Kconfig | ||
9817 | @@ -2,7 +2,6 @@ | ||
9818 | config PCI_MT7621 | ||
9819 | tristate "MediaTek MT7621 PCI Controller" | ||
9820 | depends on RALINK | ||
9821 | - depends on PCI | ||
9822 | select PCI_DRIVERS_GENERIC | ||
9823 | help | ||
9824 | This selects a driver for the MediaTek MT7621 PCI Controller. | ||
9825 | diff --git a/drivers/staging/rtl8188eu/core/rtw_xmit.c b/drivers/staging/rtl8188eu/core/rtw_xmit.c | ||
9826 | index 952f2ab51347..c37591657bac 100644 | ||
9827 | --- a/drivers/staging/rtl8188eu/core/rtw_xmit.c | ||
9828 | +++ b/drivers/staging/rtl8188eu/core/rtw_xmit.c | ||
9829 | @@ -776,7 +776,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr | ||
9830 | memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN); | ||
9831 | memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN); | ||
9832 | |||
9833 | - if (psta->qos_option) | ||
9834 | + if (psta && psta->qos_option) | ||
9835 | qos_option = true; | ||
9836 | } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || | ||
9837 | check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) { | ||
9838 | @@ -784,7 +784,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr | ||
9839 | memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN); | ||
9840 | memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN); | ||
9841 | |||
9842 | - if (psta->qos_option) | ||
9843 | + if (psta && psta->qos_option) | ||
9844 | qos_option = true; | ||
9845 | } else { | ||
9846 | RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv))); | ||
9847 | diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c | ||
9848 | index 2821411878ce..511136dce3a4 100644 | ||
9849 | --- a/drivers/staging/rtl8192u/r8192U_core.c | ||
9850 | +++ b/drivers/staging/rtl8192u/r8192U_core.c | ||
9851 | @@ -1422,7 +1422,7 @@ short rtl8192_tx(struct net_device *dev, struct sk_buff *skb) | ||
9852 | (struct tx_fwinfo_819x_usb *)(skb->data + USB_HWDESC_HEADER_LEN); | ||
9853 | struct usb_device *udev = priv->udev; | ||
9854 | int pend; | ||
9855 | - int status; | ||
9856 | + int status, rt = -1; | ||
9857 | struct urb *tx_urb = NULL, *tx_urb_zero = NULL; | ||
9858 | unsigned int idx_pipe; | ||
9859 | |||
9860 | @@ -1566,8 +1566,10 @@ short rtl8192_tx(struct net_device *dev, struct sk_buff *skb) | ||
9861 | } | ||
9862 | if (bSend0Byte) { | ||
9863 | tx_urb_zero = usb_alloc_urb(0, GFP_ATOMIC); | ||
9864 | - if (!tx_urb_zero) | ||
9865 | - return -ENOMEM; | ||
9866 | + if (!tx_urb_zero) { | ||
9867 | + rt = -ENOMEM; | ||
9868 | + goto error; | ||
9869 | + } | ||
9870 | usb_fill_bulk_urb(tx_urb_zero, udev, | ||
9871 | usb_sndbulkpipe(udev, idx_pipe), | ||
9872 | &zero, 0, tx_zero_isr, dev); | ||
9873 | @@ -1577,7 +1579,7 @@ short rtl8192_tx(struct net_device *dev, struct sk_buff *skb) | ||
9874 | "Error TX URB for zero byte %d, error %d", | ||
9875 | atomic_read(&priv->tx_pending[tcb_desc->queue_index]), | ||
9876 | status); | ||
9877 | - return -1; | ||
9878 | + goto error; | ||
9879 | } | ||
9880 | } | ||
9881 | netif_trans_update(dev); | ||
9882 | @@ -1588,7 +1590,12 @@ short rtl8192_tx(struct net_device *dev, struct sk_buff *skb) | ||
9883 | RT_TRACE(COMP_ERR, "Error TX URB %d, error %d", | ||
9884 | atomic_read(&priv->tx_pending[tcb_desc->queue_index]), | ||
9885 | status); | ||
9886 | - return -1; | ||
9887 | + | ||
9888 | +error: | ||
9889 | + dev_kfree_skb_any(skb); | ||
9890 | + usb_free_urb(tx_urb); | ||
9891 | + usb_free_urb(tx_urb_zero); | ||
9892 | + return rt; | ||
9893 | } | ||
9894 | |||
9895 | static short rtl8192_usb_initendpoints(struct net_device *dev) | ||
9896 | diff --git a/drivers/staging/wilc1000/wilc_hif.c b/drivers/staging/wilc1000/wilc_hif.c | ||
9897 | index d3d9ea284816..77d0732f451b 100644 | ||
9898 | --- a/drivers/staging/wilc1000/wilc_hif.c | ||
9899 | +++ b/drivers/staging/wilc1000/wilc_hif.c | ||
9900 | @@ -473,6 +473,8 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss, | ||
9901 | rates_ie = cfg80211_find_ie(WLAN_EID_SUPP_RATES, ies->data, ies->len); | ||
9902 | if (rates_ie) { | ||
9903 | rates_len = rates_ie[1]; | ||
9904 | + if (rates_len > WILC_MAX_RATES_SUPPORTED) | ||
9905 | + rates_len = WILC_MAX_RATES_SUPPORTED; | ||
9906 | param->supp_rates[0] = rates_len; | ||
9907 | memcpy(¶m->supp_rates[1], rates_ie + 2, rates_len); | ||
9908 | } | ||
9909 | diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | ||
9910 | index 22f21831649b..c3cd6f389a98 100644 | ||
9911 | --- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | ||
9912 | +++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | ||
9913 | @@ -1419,8 +1419,10 @@ static int change_virtual_intf(struct wiphy *wiphy, struct net_device *dev, | ||
9914 | if (vif->iftype == WILC_AP_MODE || vif->iftype == WILC_GO_MODE) | ||
9915 | wilc_wfi_deinit_mon_interface(wl, true); | ||
9916 | vif->iftype = WILC_STATION_MODE; | ||
9917 | - wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9918 | - WILC_STATION_MODE, vif->idx); | ||
9919 | + | ||
9920 | + if (wl->initialized) | ||
9921 | + wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9922 | + WILC_STATION_MODE, vif->idx); | ||
9923 | |||
9924 | memset(priv->assoc_stainfo.sta_associated_bss, 0, | ||
9925 | WILC_MAX_NUM_STA * ETH_ALEN); | ||
9926 | @@ -1432,8 +1434,10 @@ static int change_virtual_intf(struct wiphy *wiphy, struct net_device *dev, | ||
9927 | priv->wdev.iftype = type; | ||
9928 | vif->monitor_flag = 0; | ||
9929 | vif->iftype = WILC_CLIENT_MODE; | ||
9930 | - wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9931 | - WILC_STATION_MODE, vif->idx); | ||
9932 | + | ||
9933 | + if (wl->initialized) | ||
9934 | + wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9935 | + WILC_STATION_MODE, vif->idx); | ||
9936 | break; | ||
9937 | |||
9938 | case NL80211_IFTYPE_AP: | ||
9939 | @@ -1450,8 +1454,10 @@ static int change_virtual_intf(struct wiphy *wiphy, struct net_device *dev, | ||
9940 | dev->ieee80211_ptr->iftype = type; | ||
9941 | priv->wdev.iftype = type; | ||
9942 | vif->iftype = WILC_GO_MODE; | ||
9943 | - wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9944 | - WILC_AP_MODE, vif->idx); | ||
9945 | + | ||
9946 | + if (wl->initialized) | ||
9947 | + wilc_set_operation_mode(vif, wilc_get_vif_idx(vif), | ||
9948 | + WILC_AP_MODE, vif->idx); | ||
9949 | break; | ||
9950 | |||
9951 | default: | ||
9952 | diff --git a/drivers/tty/serial/atmel_serial.c b/drivers/tty/serial/atmel_serial.c | ||
9953 | index a8dc8af83f39..1ba9bc667e13 100644 | ||
9954 | --- a/drivers/tty/serial/atmel_serial.c | ||
9955 | +++ b/drivers/tty/serial/atmel_serial.c | ||
9956 | @@ -2270,27 +2270,6 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, | ||
9957 | mode |= ATMEL_US_USMODE_NORMAL; | ||
9958 | } | ||
9959 | |||
9960 | - /* set the mode, clock divisor, parity, stop bits and data size */ | ||
9961 | - atmel_uart_writel(port, ATMEL_US_MR, mode); | ||
9962 | - | ||
9963 | - /* | ||
9964 | - * when switching the mode, set the RTS line state according to the | ||
9965 | - * new mode, otherwise keep the former state | ||
9966 | - */ | ||
9967 | - if ((old_mode & ATMEL_US_USMODE) != (mode & ATMEL_US_USMODE)) { | ||
9968 | - unsigned int rts_state; | ||
9969 | - | ||
9970 | - if ((mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_HWHS) { | ||
9971 | - /* let the hardware control the RTS line */ | ||
9972 | - rts_state = ATMEL_US_RTSDIS; | ||
9973 | - } else { | ||
9974 | - /* force RTS line to low level */ | ||
9975 | - rts_state = ATMEL_US_RTSEN; | ||
9976 | - } | ||
9977 | - | ||
9978 | - atmel_uart_writel(port, ATMEL_US_CR, rts_state); | ||
9979 | - } | ||
9980 | - | ||
9981 | /* | ||
9982 | * Set the baud rate: | ||
9983 | * Fractional baudrate allows to setup output frequency more | ||
9984 | @@ -2317,6 +2296,28 @@ static void atmel_set_termios(struct uart_port *port, struct ktermios *termios, | ||
9985 | |||
9986 | if (!(port->iso7816.flags & SER_ISO7816_ENABLED)) | ||
9987 | atmel_uart_writel(port, ATMEL_US_BRGR, quot); | ||
9988 | + | ||
9989 | + /* set the mode, clock divisor, parity, stop bits and data size */ | ||
9990 | + atmel_uart_writel(port, ATMEL_US_MR, mode); | ||
9991 | + | ||
9992 | + /* | ||
9993 | + * when switching the mode, set the RTS line state according to the | ||
9994 | + * new mode, otherwise keep the former state | ||
9995 | + */ | ||
9996 | + if ((old_mode & ATMEL_US_USMODE) != (mode & ATMEL_US_USMODE)) { | ||
9997 | + unsigned int rts_state; | ||
9998 | + | ||
9999 | + if ((mode & ATMEL_US_USMODE) == ATMEL_US_USMODE_HWHS) { | ||
10000 | + /* let the hardware control the RTS line */ | ||
10001 | + rts_state = ATMEL_US_RTSDIS; | ||
10002 | + } else { | ||
10003 | + /* force RTS line to low level */ | ||
10004 | + rts_state = ATMEL_US_RTSEN; | ||
10005 | + } | ||
10006 | + | ||
10007 | + atmel_uart_writel(port, ATMEL_US_CR, rts_state); | ||
10008 | + } | ||
10009 | + | ||
10010 | atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_RSTSTA | ATMEL_US_RSTRX); | ||
10011 | atmel_uart_writel(port, ATMEL_US_CR, ATMEL_US_TXEN | ATMEL_US_RXEN); | ||
10012 | atmel_port->tx_stopped = false; | ||
10013 | diff --git a/drivers/tty/serial/sprd_serial.c b/drivers/tty/serial/sprd_serial.c | ||
10014 | index 771d11196523..494e2672ebd7 100644 | ||
10015 | --- a/drivers/tty/serial/sprd_serial.c | ||
10016 | +++ b/drivers/tty/serial/sprd_serial.c | ||
10017 | @@ -679,6 +679,9 @@ static irqreturn_t sprd_handle_irq(int irq, void *dev_id) | ||
10018 | if (ims & SPRD_IMSR_TIMEOUT) | ||
10019 | serial_out(port, SPRD_ICLR, SPRD_ICLR_TIMEOUT); | ||
10020 | |||
10021 | + if (ims & SPRD_IMSR_BREAK_DETECT) | ||
10022 | + serial_out(port, SPRD_ICLR, SPRD_IMSR_BREAK_DETECT); | ||
10023 | + | ||
10024 | if (ims & (SPRD_IMSR_RX_FIFO_FULL | SPRD_IMSR_BREAK_DETECT | | ||
10025 | SPRD_IMSR_TIMEOUT)) | ||
10026 | sprd_rx(port); | ||
10027 | diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c | ||
10028 | index 3f899552f6e3..6ca40d135430 100644 | ||
10029 | --- a/drivers/usb/core/devio.c | ||
10030 | +++ b/drivers/usb/core/devio.c | ||
10031 | @@ -764,8 +764,15 @@ static int claimintf(struct usb_dev_state *ps, unsigned int ifnum) | ||
10032 | intf = usb_ifnum_to_if(dev, ifnum); | ||
10033 | if (!intf) | ||
10034 | err = -ENOENT; | ||
10035 | - else | ||
10036 | + else { | ||
10037 | + unsigned int old_suppress; | ||
10038 | + | ||
10039 | + /* suppress uevents while claiming interface */ | ||
10040 | + old_suppress = dev_get_uevent_suppress(&intf->dev); | ||
10041 | + dev_set_uevent_suppress(&intf->dev, 1); | ||
10042 | err = usb_driver_claim_interface(&usbfs_driver, intf, ps); | ||
10043 | + dev_set_uevent_suppress(&intf->dev, old_suppress); | ||
10044 | + } | ||
10045 | if (err == 0) | ||
10046 | set_bit(ifnum, &ps->ifclaimed); | ||
10047 | return err; | ||
10048 | @@ -785,7 +792,13 @@ static int releaseintf(struct usb_dev_state *ps, unsigned int ifnum) | ||
10049 | if (!intf) | ||
10050 | err = -ENOENT; | ||
10051 | else if (test_and_clear_bit(ifnum, &ps->ifclaimed)) { | ||
10052 | + unsigned int old_suppress; | ||
10053 | + | ||
10054 | + /* suppress uevents while releasing interface */ | ||
10055 | + old_suppress = dev_get_uevent_suppress(&intf->dev); | ||
10056 | + dev_set_uevent_suppress(&intf->dev, 1); | ||
10057 | usb_driver_release_interface(&usbfs_driver, intf); | ||
10058 | + dev_set_uevent_suppress(&intf->dev, old_suppress); | ||
10059 | err = 0; | ||
10060 | } | ||
10061 | return err; | ||
10062 | diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c | ||
10063 | index aa2f77f1506d..8a5c9b3ebe1e 100644 | ||
10064 | --- a/drivers/usb/host/ehci-q.c | ||
10065 | +++ b/drivers/usb/host/ehci-q.c | ||
10066 | @@ -27,6 +27,10 @@ | ||
10067 | |||
10068 | /*-------------------------------------------------------------------------*/ | ||
10069 | |||
10070 | +/* PID Codes that are used here, from EHCI specification, Table 3-16. */ | ||
10071 | +#define PID_CODE_IN 1 | ||
10072 | +#define PID_CODE_SETUP 2 | ||
10073 | + | ||
10074 | /* fill a qtd, returning how much of the buffer we were able to queue up */ | ||
10075 | |||
10076 | static int | ||
10077 | @@ -190,7 +194,7 @@ static int qtd_copy_status ( | ||
10078 | int status = -EINPROGRESS; | ||
10079 | |||
10080 | /* count IN/OUT bytes, not SETUP (even short packets) */ | ||
10081 | - if (likely (QTD_PID (token) != 2)) | ||
10082 | + if (likely(QTD_PID(token) != PID_CODE_SETUP)) | ||
10083 | urb->actual_length += length - QTD_LENGTH (token); | ||
10084 | |||
10085 | /* don't modify error codes */ | ||
10086 | @@ -206,6 +210,13 @@ static int qtd_copy_status ( | ||
10087 | if (token & QTD_STS_BABBLE) { | ||
10088 | /* FIXME "must" disable babbling device's port too */ | ||
10089 | status = -EOVERFLOW; | ||
10090 | + /* | ||
10091 | + * When MMF is active and PID Code is IN, queue is halted. | ||
10092 | + * EHCI Specification, Table 4-13. | ||
10093 | + */ | ||
10094 | + } else if ((token & QTD_STS_MMF) && | ||
10095 | + (QTD_PID(token) == PID_CODE_IN)) { | ||
10096 | + status = -EPROTO; | ||
10097 | /* CERR nonzero + halt --> stall */ | ||
10098 | } else if (QTD_CERR(token)) { | ||
10099 | status = -EPIPE; | ||
10100 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
10101 | index 1904ef56f61c..4917c5b033fa 100644 | ||
10102 | --- a/drivers/usb/host/xhci-pci.c | ||
10103 | +++ b/drivers/usb/host/xhci-pci.c | ||
10104 | @@ -48,6 +48,7 @@ | ||
10105 | #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_XHCI 0x15e9 | ||
10106 | #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI 0x15ec | ||
10107 | #define PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI 0x15f0 | ||
10108 | +#define PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI 0x8a13 | ||
10109 | |||
10110 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 | ||
10111 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba | ||
10112 | @@ -212,7 +213,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
10113 | pdev->device == PCI_DEVICE_ID_INTEL_ALPINE_RIDGE_C_4C_XHCI || | ||
10114 | pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_2C_XHCI || | ||
10115 | pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_4C_XHCI || | ||
10116 | - pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI)) | ||
10117 | + pdev->device == PCI_DEVICE_ID_INTEL_TITAN_RIDGE_DD_XHCI || | ||
10118 | + pdev->device == PCI_DEVICE_ID_INTEL_ICE_LAKE_XHCI)) | ||
10119 | xhci->quirks |= XHCI_DEFAULT_PM_RUNTIME_ALLOW; | ||
10120 | |||
10121 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && | ||
10122 | @@ -517,7 +519,6 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated) | ||
10123 | retval = xhci_resume(xhci, hibernated); | ||
10124 | return retval; | ||
10125 | } | ||
10126 | -#endif /* CONFIG_PM */ | ||
10127 | |||
10128 | static void xhci_pci_shutdown(struct usb_hcd *hcd) | ||
10129 | { | ||
10130 | @@ -530,6 +531,7 @@ static void xhci_pci_shutdown(struct usb_hcd *hcd) | ||
10131 | if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) | ||
10132 | pci_set_power_state(pdev, PCI_D3hot); | ||
10133 | } | ||
10134 | +#endif /* CONFIG_PM */ | ||
10135 | |||
10136 | /*-------------------------------------------------------------------------*/ | ||
10137 | |||
10138 | diff --git a/drivers/usb/renesas_usbhs/common.h b/drivers/usb/renesas_usbhs/common.h | ||
10139 | index 0824099b905e..ef1735d014da 100644 | ||
10140 | --- a/drivers/usb/renesas_usbhs/common.h | ||
10141 | +++ b/drivers/usb/renesas_usbhs/common.h | ||
10142 | @@ -161,11 +161,12 @@ struct usbhs_priv; | ||
10143 | #define VBSTS (1 << 7) /* VBUS_0 and VBUSIN_0 Input Status */ | ||
10144 | #define VALID (1 << 3) /* USB Request Receive */ | ||
10145 | |||
10146 | -#define DVSQ_MASK (0x3 << 4) /* Device State */ | ||
10147 | +#define DVSQ_MASK (0x7 << 4) /* Device State */ | ||
10148 | #define POWER_STATE (0 << 4) | ||
10149 | #define DEFAULT_STATE (1 << 4) | ||
10150 | #define ADDRESS_STATE (2 << 4) | ||
10151 | #define CONFIGURATION_STATE (3 << 4) | ||
10152 | +#define SUSPENDED_STATE (4 << 4) | ||
10153 | |||
10154 | #define CTSQ_MASK (0x7) /* Control Transfer Stage */ | ||
10155 | #define IDLE_SETUP_STAGE 0 /* Idle stage or setup stage */ | ||
10156 | diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
10157 | index cd38d74b3223..53489cafecc1 100644 | ||
10158 | --- a/drivers/usb/renesas_usbhs/mod_gadget.c | ||
10159 | +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
10160 | @@ -457,12 +457,18 @@ static int usbhsg_irq_dev_state(struct usbhs_priv *priv, | ||
10161 | { | ||
10162 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
10163 | struct device *dev = usbhsg_gpriv_to_dev(gpriv); | ||
10164 | + int state = usbhs_status_get_device_state(irq_state); | ||
10165 | |||
10166 | gpriv->gadget.speed = usbhs_bus_get_speed(priv); | ||
10167 | |||
10168 | - dev_dbg(dev, "state = %x : speed : %d\n", | ||
10169 | - usbhs_status_get_device_state(irq_state), | ||
10170 | - gpriv->gadget.speed); | ||
10171 | + dev_dbg(dev, "state = %x : speed : %d\n", state, gpriv->gadget.speed); | ||
10172 | + | ||
10173 | + if (gpriv->gadget.speed != USB_SPEED_UNKNOWN && | ||
10174 | + (state & SUSPENDED_STATE)) { | ||
10175 | + if (gpriv->driver && gpriv->driver->suspend) | ||
10176 | + gpriv->driver->suspend(&gpriv->gadget); | ||
10177 | + usb_gadget_set_state(&gpriv->gadget, USB_STATE_SUSPENDED); | ||
10178 | + } | ||
10179 | |||
10180 | return 0; | ||
10181 | } | ||
10182 | diff --git a/drivers/usb/usbip/usbip_common.c b/drivers/usb/usbip/usbip_common.c | ||
10183 | index 6532d68e8808..e4b96674c405 100644 | ||
10184 | --- a/drivers/usb/usbip/usbip_common.c | ||
10185 | +++ b/drivers/usb/usbip/usbip_common.c | ||
10186 | @@ -727,6 +727,9 @@ int usbip_recv_xbuff(struct usbip_device *ud, struct urb *urb) | ||
10187 | |||
10188 | copy -= recv; | ||
10189 | ret += recv; | ||
10190 | + | ||
10191 | + if (!copy) | ||
10192 | + break; | ||
10193 | } | ||
10194 | |||
10195 | if (ret != size) | ||
10196 | diff --git a/drivers/usb/usbip/vhci_rx.c b/drivers/usb/usbip/vhci_rx.c | ||
10197 | index 33f8972ba842..00fc98741c5d 100644 | ||
10198 | --- a/drivers/usb/usbip/vhci_rx.c | ||
10199 | +++ b/drivers/usb/usbip/vhci_rx.c | ||
10200 | @@ -77,16 +77,21 @@ static void vhci_recv_ret_submit(struct vhci_device *vdev, | ||
10201 | usbip_pack_pdu(pdu, urb, USBIP_RET_SUBMIT, 0); | ||
10202 | |||
10203 | /* recv transfer buffer */ | ||
10204 | - if (usbip_recv_xbuff(ud, urb) < 0) | ||
10205 | - return; | ||
10206 | + if (usbip_recv_xbuff(ud, urb) < 0) { | ||
10207 | + urb->status = -EPROTO; | ||
10208 | + goto error; | ||
10209 | + } | ||
10210 | |||
10211 | /* recv iso_packet_descriptor */ | ||
10212 | - if (usbip_recv_iso(ud, urb) < 0) | ||
10213 | - return; | ||
10214 | + if (usbip_recv_iso(ud, urb) < 0) { | ||
10215 | + urb->status = -EPROTO; | ||
10216 | + goto error; | ||
10217 | + } | ||
10218 | |||
10219 | /* restore the padding in iso packets */ | ||
10220 | usbip_pad_iso(ud, urb); | ||
10221 | |||
10222 | +error: | ||
10223 | if (usbip_dbg_flag_vhci_rx) | ||
10224 | usbip_dump_urb(urb); | ||
10225 | |||
10226 | diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig | ||
10227 | index 79cc75096f42..a50dadd01093 100644 | ||
10228 | --- a/drivers/xen/Kconfig | ||
10229 | +++ b/drivers/xen/Kconfig | ||
10230 | @@ -141,7 +141,8 @@ config XEN_GNTDEV | ||
10231 | |||
10232 | config XEN_GNTDEV_DMABUF | ||
10233 | bool "Add support for dma-buf grant access device driver extension" | ||
10234 | - depends on XEN_GNTDEV && XEN_GRANT_DMA_ALLOC && DMA_SHARED_BUFFER | ||
10235 | + depends on XEN_GNTDEV && XEN_GRANT_DMA_ALLOC | ||
10236 | + select DMA_SHARED_BUFFER | ||
10237 | help | ||
10238 | Allows userspace processes and kernel modules to use Xen backed | ||
10239 | dma-buf implementation. With this extension grant references to | ||
10240 | diff --git a/fs/btrfs/async-thread.c b/fs/btrfs/async-thread.c | ||
10241 | index 2e9e13ffbd08..10a04b99798a 100644 | ||
10242 | --- a/fs/btrfs/async-thread.c | ||
10243 | +++ b/fs/btrfs/async-thread.c | ||
10244 | @@ -252,16 +252,17 @@ out: | ||
10245 | } | ||
10246 | } | ||
10247 | |||
10248 | -static void run_ordered_work(struct __btrfs_workqueue *wq) | ||
10249 | +static void run_ordered_work(struct __btrfs_workqueue *wq, | ||
10250 | + struct btrfs_work *self) | ||
10251 | { | ||
10252 | struct list_head *list = &wq->ordered_list; | ||
10253 | struct btrfs_work *work; | ||
10254 | spinlock_t *lock = &wq->list_lock; | ||
10255 | unsigned long flags; | ||
10256 | + void *wtag; | ||
10257 | + bool free_self = false; | ||
10258 | |||
10259 | while (1) { | ||
10260 | - void *wtag; | ||
10261 | - | ||
10262 | spin_lock_irqsave(lock, flags); | ||
10263 | if (list_empty(list)) | ||
10264 | break; | ||
10265 | @@ -287,16 +288,47 @@ static void run_ordered_work(struct __btrfs_workqueue *wq) | ||
10266 | list_del(&work->ordered_list); | ||
10267 | spin_unlock_irqrestore(lock, flags); | ||
10268 | |||
10269 | - /* | ||
10270 | - * We don't want to call the ordered free functions with the | ||
10271 | - * lock held though. Save the work as tag for the trace event, | ||
10272 | - * because the callback could free the structure. | ||
10273 | - */ | ||
10274 | - wtag = work; | ||
10275 | - work->ordered_free(work); | ||
10276 | - trace_btrfs_all_work_done(wq->fs_info, wtag); | ||
10277 | + if (work == self) { | ||
10278 | + /* | ||
10279 | + * This is the work item that the worker is currently | ||
10280 | + * executing. | ||
10281 | + * | ||
10282 | + * The kernel workqueue code guarantees non-reentrancy | ||
10283 | + * of work items. I.e., if a work item with the same | ||
10284 | + * address and work function is queued twice, the second | ||
10285 | + * execution is blocked until the first one finishes. A | ||
10286 | + * work item may be freed and recycled with the same | ||
10287 | + * work function; the workqueue code assumes that the | ||
10288 | + * original work item cannot depend on the recycled work | ||
10289 | + * item in that case (see find_worker_executing_work()). | ||
10290 | + * | ||
10291 | + * Note that the work of one Btrfs filesystem may depend | ||
10292 | + * on the work of another Btrfs filesystem via, e.g., a | ||
10293 | + * loop device. Therefore, we must not allow the current | ||
10294 | + * work item to be recycled until we are really done, | ||
10295 | + * otherwise we break the above assumption and can | ||
10296 | + * deadlock. | ||
10297 | + */ | ||
10298 | + free_self = true; | ||
10299 | + } else { | ||
10300 | + /* | ||
10301 | + * We don't want to call the ordered free functions with | ||
10302 | + * the lock held though. Save the work as tag for the | ||
10303 | + * trace event, because the callback could free the | ||
10304 | + * structure. | ||
10305 | + */ | ||
10306 | + wtag = work; | ||
10307 | + work->ordered_free(work); | ||
10308 | + trace_btrfs_all_work_done(wq->fs_info, wtag); | ||
10309 | + } | ||
10310 | } | ||
10311 | spin_unlock_irqrestore(lock, flags); | ||
10312 | + | ||
10313 | + if (free_self) { | ||
10314 | + wtag = self; | ||
10315 | + self->ordered_free(self); | ||
10316 | + trace_btrfs_all_work_done(wq->fs_info, wtag); | ||
10317 | + } | ||
10318 | } | ||
10319 | |||
10320 | static void normal_work_helper(struct btrfs_work *work) | ||
10321 | @@ -324,7 +356,7 @@ static void normal_work_helper(struct btrfs_work *work) | ||
10322 | work->func(work); | ||
10323 | if (need_order) { | ||
10324 | set_bit(WORK_DONE_BIT, &work->flags); | ||
10325 | - run_ordered_work(wq); | ||
10326 | + run_ordered_work(wq, work); | ||
10327 | } | ||
10328 | if (!need_order) | ||
10329 | trace_btrfs_all_work_done(wq->fs_info, wtag); | ||
10330 | diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c | ||
10331 | index e59cde204b2f..da9b0f060a9d 100644 | ||
10332 | --- a/fs/btrfs/ctree.c | ||
10333 | +++ b/fs/btrfs/ctree.c | ||
10334 | @@ -383,7 +383,7 @@ void btrfs_put_tree_mod_seq(struct btrfs_fs_info *fs_info, | ||
10335 | for (node = rb_first(tm_root); node; node = next) { | ||
10336 | next = rb_next(node); | ||
10337 | tm = rb_entry(node, struct tree_mod_elem, node); | ||
10338 | - if (tm->seq > min_seq) | ||
10339 | + if (tm->seq >= min_seq) | ||
10340 | continue; | ||
10341 | rb_erase(node, tm_root); | ||
10342 | kfree(tm); | ||
10343 | diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h | ||
10344 | index fe2b8765d9e6..5e9f80b28fcf 100644 | ||
10345 | --- a/fs/btrfs/ctree.h | ||
10346 | +++ b/fs/btrfs/ctree.h | ||
10347 | @@ -2785,7 +2785,7 @@ struct btrfs_inode_extref *btrfs_find_name_in_ext_backref( | ||
10348 | /* file-item.c */ | ||
10349 | struct btrfs_dio_private; | ||
10350 | int btrfs_del_csums(struct btrfs_trans_handle *trans, | ||
10351 | - struct btrfs_fs_info *fs_info, u64 bytenr, u64 len); | ||
10352 | + struct btrfs_root *root, u64 bytenr, u64 len); | ||
10353 | blk_status_t btrfs_lookup_bio_sums(struct inode *inode, struct bio *bio, | ||
10354 | u8 *dst); | ||
10355 | blk_status_t btrfs_lookup_bio_sums_dio(struct inode *inode, struct bio *bio, | ||
10356 | diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c | ||
10357 | index 402b61bf345c..3895c21853cc 100644 | ||
10358 | --- a/fs/btrfs/disk-io.c | ||
10359 | +++ b/fs/btrfs/disk-io.c | ||
10360 | @@ -1657,8 +1657,8 @@ static void end_workqueue_fn(struct btrfs_work *work) | ||
10361 | bio->bi_status = end_io_wq->status; | ||
10362 | bio->bi_private = end_io_wq->private; | ||
10363 | bio->bi_end_io = end_io_wq->end_io; | ||
10364 | - kmem_cache_free(btrfs_end_io_wq_cache, end_io_wq); | ||
10365 | bio_endio(bio); | ||
10366 | + kmem_cache_free(btrfs_end_io_wq_cache, end_io_wq); | ||
10367 | } | ||
10368 | |||
10369 | static int cleaner_kthread(void *arg) | ||
10370 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
10371 | index 49cb26fa7c63..eb95ed78a18e 100644 | ||
10372 | --- a/fs/btrfs/extent-tree.c | ||
10373 | +++ b/fs/btrfs/extent-tree.c | ||
10374 | @@ -1848,8 +1848,8 @@ static int cleanup_ref_head(struct btrfs_trans_handle *trans, | ||
10375 | btrfs_pin_extent(fs_info, head->bytenr, | ||
10376 | head->num_bytes, 1); | ||
10377 | if (head->is_data) { | ||
10378 | - ret = btrfs_del_csums(trans, fs_info, head->bytenr, | ||
10379 | - head->num_bytes); | ||
10380 | + ret = btrfs_del_csums(trans, fs_info->csum_root, | ||
10381 | + head->bytenr, head->num_bytes); | ||
10382 | } | ||
10383 | } | ||
10384 | |||
10385 | @@ -3155,7 +3155,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | ||
10386 | btrfs_release_path(path); | ||
10387 | |||
10388 | if (is_data) { | ||
10389 | - ret = btrfs_del_csums(trans, info, bytenr, num_bytes); | ||
10390 | + ret = btrfs_del_csums(trans, info->csum_root, bytenr, | ||
10391 | + num_bytes); | ||
10392 | if (ret) { | ||
10393 | btrfs_abort_transaction(trans, ret); | ||
10394 | goto out; | ||
10395 | diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c | ||
10396 | index 4905f48587df..be9dc78aa727 100644 | ||
10397 | --- a/fs/btrfs/extent_io.c | ||
10398 | +++ b/fs/btrfs/extent_io.c | ||
10399 | @@ -5066,12 +5066,14 @@ struct extent_buffer *alloc_test_extent_buffer(struct btrfs_fs_info *fs_info, | ||
10400 | return eb; | ||
10401 | eb = alloc_dummy_extent_buffer(fs_info, start); | ||
10402 | if (!eb) | ||
10403 | - return NULL; | ||
10404 | + return ERR_PTR(-ENOMEM); | ||
10405 | eb->fs_info = fs_info; | ||
10406 | again: | ||
10407 | ret = radix_tree_preload(GFP_NOFS); | ||
10408 | - if (ret) | ||
10409 | + if (ret) { | ||
10410 | + exists = ERR_PTR(ret); | ||
10411 | goto free_eb; | ||
10412 | + } | ||
10413 | spin_lock(&fs_info->buffer_lock); | ||
10414 | ret = radix_tree_insert(&fs_info->buffer_radix, | ||
10415 | start >> PAGE_SHIFT, eb); | ||
10416 | diff --git a/fs/btrfs/file-item.c b/fs/btrfs/file-item.c | ||
10417 | index 1a599f50837b..c878bc25d046 100644 | ||
10418 | --- a/fs/btrfs/file-item.c | ||
10419 | +++ b/fs/btrfs/file-item.c | ||
10420 | @@ -590,9 +590,9 @@ static noinline void truncate_one_csum(struct btrfs_fs_info *fs_info, | ||
10421 | * range of bytes. | ||
10422 | */ | ||
10423 | int btrfs_del_csums(struct btrfs_trans_handle *trans, | ||
10424 | - struct btrfs_fs_info *fs_info, u64 bytenr, u64 len) | ||
10425 | + struct btrfs_root *root, u64 bytenr, u64 len) | ||
10426 | { | ||
10427 | - struct btrfs_root *root = fs_info->csum_root; | ||
10428 | + struct btrfs_fs_info *fs_info = trans->fs_info; | ||
10429 | struct btrfs_path *path; | ||
10430 | struct btrfs_key key; | ||
10431 | u64 end_byte = bytenr + len; | ||
10432 | @@ -602,6 +602,9 @@ int btrfs_del_csums(struct btrfs_trans_handle *trans, | ||
10433 | u16 csum_size = btrfs_super_csum_size(fs_info->super_copy); | ||
10434 | int blocksize_bits = fs_info->sb->s_blocksize_bits; | ||
10435 | |||
10436 | + ASSERT(root == fs_info->csum_root || | ||
10437 | + root->root_key.objectid == BTRFS_TREE_LOG_OBJECTID); | ||
10438 | + | ||
10439 | path = btrfs_alloc_path(); | ||
10440 | if (!path) | ||
10441 | return -ENOMEM; | ||
10442 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c | ||
10443 | index 10a01dd0c4e6..e5758f62e8d8 100644 | ||
10444 | --- a/fs/btrfs/inode.c | ||
10445 | +++ b/fs/btrfs/inode.c | ||
10446 | @@ -5697,7 +5697,6 @@ static void inode_tree_add(struct inode *inode) | ||
10447 | |||
10448 | static void inode_tree_del(struct inode *inode) | ||
10449 | { | ||
10450 | - struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); | ||
10451 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
10452 | int empty = 0; | ||
10453 | |||
10454 | @@ -5710,7 +5709,6 @@ static void inode_tree_del(struct inode *inode) | ||
10455 | spin_unlock(&root->inode_lock); | ||
10456 | |||
10457 | if (empty && btrfs_root_refs(&root->root_item) == 0) { | ||
10458 | - synchronize_srcu(&fs_info->subvol_srcu); | ||
10459 | spin_lock(&root->inode_lock); | ||
10460 | empty = RB_EMPTY_ROOT(&root->inode_tree); | ||
10461 | spin_unlock(&root->inode_lock); | ||
10462 | @@ -9535,9 +9533,8 @@ static int btrfs_rename_exchange(struct inode *old_dir, | ||
10463 | btrfs_init_log_ctx(&ctx_dest, new_inode); | ||
10464 | |||
10465 | /* close the race window with snapshot create/destroy ioctl */ | ||
10466 | - if (old_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10467 | - down_read(&fs_info->subvol_sem); | ||
10468 | - if (new_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10469 | + if (old_ino == BTRFS_FIRST_FREE_OBJECTID || | ||
10470 | + new_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10471 | down_read(&fs_info->subvol_sem); | ||
10472 | |||
10473 | /* | ||
10474 | @@ -9771,9 +9768,8 @@ out_fail: | ||
10475 | ret = ret ? ret : ret2; | ||
10476 | } | ||
10477 | out_notrans: | ||
10478 | - if (new_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10479 | - up_read(&fs_info->subvol_sem); | ||
10480 | - if (old_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10481 | + if (new_ino == BTRFS_FIRST_FREE_OBJECTID || | ||
10482 | + old_ino == BTRFS_FIRST_FREE_OBJECTID) | ||
10483 | up_read(&fs_info->subvol_sem); | ||
10484 | |||
10485 | ASSERT(list_empty(&ctx_root.list)); | ||
10486 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
10487 | index 23272d9154f3..a56dcc0c9c2a 100644 | ||
10488 | --- a/fs/btrfs/ioctl.c | ||
10489 | +++ b/fs/btrfs/ioctl.c | ||
10490 | @@ -705,11 +705,17 @@ static noinline int create_subvol(struct inode *dir, | ||
10491 | |||
10492 | btrfs_i_size_write(BTRFS_I(dir), dir->i_size + namelen * 2); | ||
10493 | ret = btrfs_update_inode(trans, root, dir); | ||
10494 | - BUG_ON(ret); | ||
10495 | + if (ret) { | ||
10496 | + btrfs_abort_transaction(trans, ret); | ||
10497 | + goto fail; | ||
10498 | + } | ||
10499 | |||
10500 | ret = btrfs_add_root_ref(trans, objectid, root->root_key.objectid, | ||
10501 | btrfs_ino(BTRFS_I(dir)), index, name, namelen); | ||
10502 | - BUG_ON(ret); | ||
10503 | + if (ret) { | ||
10504 | + btrfs_abort_transaction(trans, ret); | ||
10505 | + goto fail; | ||
10506 | + } | ||
10507 | |||
10508 | ret = btrfs_uuid_tree_add(trans, root_item->uuid, | ||
10509 | BTRFS_UUID_KEY_SUBVOL, objectid); | ||
10510 | diff --git a/fs/btrfs/reada.c b/fs/btrfs/reada.c | ||
10511 | index ee6f60547a8d..dd4f9c2b7107 100644 | ||
10512 | --- a/fs/btrfs/reada.c | ||
10513 | +++ b/fs/btrfs/reada.c | ||
10514 | @@ -752,21 +752,19 @@ static int reada_start_machine_dev(struct btrfs_device *dev) | ||
10515 | static void reada_start_machine_worker(struct btrfs_work *work) | ||
10516 | { | ||
10517 | struct reada_machine_work *rmw; | ||
10518 | - struct btrfs_fs_info *fs_info; | ||
10519 | int old_ioprio; | ||
10520 | |||
10521 | rmw = container_of(work, struct reada_machine_work, work); | ||
10522 | - fs_info = rmw->fs_info; | ||
10523 | - | ||
10524 | - kfree(rmw); | ||
10525 | |||
10526 | old_ioprio = IOPRIO_PRIO_VALUE(task_nice_ioclass(current), | ||
10527 | task_nice_ioprio(current)); | ||
10528 | set_task_ioprio(current, BTRFS_IOPRIO_READA); | ||
10529 | - __reada_start_machine(fs_info); | ||
10530 | + __reada_start_machine(rmw->fs_info); | ||
10531 | set_task_ioprio(current, old_ioprio); | ||
10532 | |||
10533 | - atomic_dec(&fs_info->reada_works_cnt); | ||
10534 | + atomic_dec(&rmw->fs_info->reada_works_cnt); | ||
10535 | + | ||
10536 | + kfree(rmw); | ||
10537 | } | ||
10538 | |||
10539 | static void __reada_start_machine(struct btrfs_fs_info *fs_info) | ||
10540 | diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c | ||
10541 | index 5cd42b66818c..fd0f4c1696c8 100644 | ||
10542 | --- a/fs/btrfs/relocation.c | ||
10543 | +++ b/fs/btrfs/relocation.c | ||
10544 | @@ -4555,6 +4555,7 @@ int btrfs_recover_relocation(struct btrfs_root *root) | ||
10545 | fs_root = read_fs_root(fs_info, reloc_root->root_key.offset); | ||
10546 | if (IS_ERR(fs_root)) { | ||
10547 | err = PTR_ERR(fs_root); | ||
10548 | + list_add_tail(&reloc_root->root_list, &reloc_roots); | ||
10549 | goto out_free; | ||
10550 | } | ||
10551 | |||
10552 | diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c | ||
10553 | index f7d4e03f4c5d..a0770a6aee00 100644 | ||
10554 | --- a/fs/btrfs/scrub.c | ||
10555 | +++ b/fs/btrfs/scrub.c | ||
10556 | @@ -2149,14 +2149,13 @@ static void scrub_missing_raid56_worker(struct btrfs_work *work) | ||
10557 | scrub_write_block_to_dev_replace(sblock); | ||
10558 | } | ||
10559 | |||
10560 | - scrub_block_put(sblock); | ||
10561 | - | ||
10562 | if (sctx->is_dev_replace && sctx->flush_all_writes) { | ||
10563 | mutex_lock(&sctx->wr_lock); | ||
10564 | scrub_wr_submit(sctx); | ||
10565 | mutex_unlock(&sctx->wr_lock); | ||
10566 | } | ||
10567 | |||
10568 | + scrub_block_put(sblock); | ||
10569 | scrub_pending_bio_dec(sctx); | ||
10570 | } | ||
10571 | |||
10572 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c | ||
10573 | index 518ec1265a0c..3eb0fec2488a 100644 | ||
10574 | --- a/fs/btrfs/send.c | ||
10575 | +++ b/fs/btrfs/send.c | ||
10576 | @@ -7075,12 +7075,6 @@ long btrfs_ioctl_send(struct file *mnt_file, struct btrfs_ioctl_send_args *arg) | ||
10577 | send_root->send_in_progress++; | ||
10578 | spin_unlock(&send_root->root_item_lock); | ||
10579 | |||
10580 | - /* | ||
10581 | - * This is done when we lookup the root, it should already be complete | ||
10582 | - * by the time we get here. | ||
10583 | - */ | ||
10584 | - WARN_ON(send_root->orphan_cleanup_state != ORPHAN_CLEANUP_DONE); | ||
10585 | - | ||
10586 | /* | ||
10587 | * Userspace tools do the checks and warn the user if it's | ||
10588 | * not RO. | ||
10589 | diff --git a/fs/btrfs/tests/free-space-tree-tests.c b/fs/btrfs/tests/free-space-tree-tests.c | ||
10590 | index bc92df977630..6e774d055402 100644 | ||
10591 | --- a/fs/btrfs/tests/free-space-tree-tests.c | ||
10592 | +++ b/fs/btrfs/tests/free-space-tree-tests.c | ||
10593 | @@ -463,9 +463,9 @@ static int run_test(test_func_t test_func, int bitmaps, u32 sectorsize, | ||
10594 | root->fs_info->tree_root = root; | ||
10595 | |||
10596 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); | ||
10597 | - if (!root->node) { | ||
10598 | + if (IS_ERR(root->node)) { | ||
10599 | test_std_err(TEST_ALLOC_EXTENT_BUFFER); | ||
10600 | - ret = -ENOMEM; | ||
10601 | + ret = PTR_ERR(root->node); | ||
10602 | goto out; | ||
10603 | } | ||
10604 | btrfs_set_header_level(root->node, 0); | ||
10605 | diff --git a/fs/btrfs/tests/qgroup-tests.c b/fs/btrfs/tests/qgroup-tests.c | ||
10606 | index 09aaca1efd62..ac035a6fa003 100644 | ||
10607 | --- a/fs/btrfs/tests/qgroup-tests.c | ||
10608 | +++ b/fs/btrfs/tests/qgroup-tests.c | ||
10609 | @@ -484,9 +484,9 @@ int btrfs_test_qgroups(u32 sectorsize, u32 nodesize) | ||
10610 | * *cough*backref walking code*cough* | ||
10611 | */ | ||
10612 | root->node = alloc_test_extent_buffer(root->fs_info, nodesize); | ||
10613 | - if (!root->node) { | ||
10614 | + if (IS_ERR(root->node)) { | ||
10615 | test_err("couldn't allocate dummy buffer"); | ||
10616 | - ret = -ENOMEM; | ||
10617 | + ret = PTR_ERR(root->node); | ||
10618 | goto out; | ||
10619 | } | ||
10620 | btrfs_set_header_level(root->node, 0); | ||
10621 | diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c | ||
10622 | index 076d5b8014fb..0e44db066641 100644 | ||
10623 | --- a/fs/btrfs/tree-checker.c | ||
10624 | +++ b/fs/btrfs/tree-checker.c | ||
10625 | @@ -243,7 +243,7 @@ static int check_extent_data_item(struct extent_buffer *leaf, | ||
10626 | } | ||
10627 | |||
10628 | static int check_csum_item(struct extent_buffer *leaf, struct btrfs_key *key, | ||
10629 | - int slot) | ||
10630 | + int slot, struct btrfs_key *prev_key) | ||
10631 | { | ||
10632 | struct btrfs_fs_info *fs_info = leaf->fs_info; | ||
10633 | u32 sectorsize = fs_info->sectorsize; | ||
10634 | @@ -267,6 +267,20 @@ static int check_csum_item(struct extent_buffer *leaf, struct btrfs_key *key, | ||
10635 | btrfs_item_size_nr(leaf, slot), csumsize); | ||
10636 | return -EUCLEAN; | ||
10637 | } | ||
10638 | + if (slot > 0 && prev_key->type == BTRFS_EXTENT_CSUM_KEY) { | ||
10639 | + u64 prev_csum_end; | ||
10640 | + u32 prev_item_size; | ||
10641 | + | ||
10642 | + prev_item_size = btrfs_item_size_nr(leaf, slot - 1); | ||
10643 | + prev_csum_end = (prev_item_size / csumsize) * sectorsize; | ||
10644 | + prev_csum_end += prev_key->offset; | ||
10645 | + if (prev_csum_end > key->offset) { | ||
10646 | + generic_err(leaf, slot - 1, | ||
10647 | +"csum end range (%llu) goes beyond the start range (%llu) of the next csum item", | ||
10648 | + prev_csum_end, key->offset); | ||
10649 | + return -EUCLEAN; | ||
10650 | + } | ||
10651 | + } | ||
10652 | return 0; | ||
10653 | } | ||
10654 | |||
10655 | @@ -1239,7 +1253,7 @@ static int check_leaf_item(struct extent_buffer *leaf, | ||
10656 | ret = check_extent_data_item(leaf, key, slot, prev_key); | ||
10657 | break; | ||
10658 | case BTRFS_EXTENT_CSUM_KEY: | ||
10659 | - ret = check_csum_item(leaf, key, slot); | ||
10660 | + ret = check_csum_item(leaf, key, slot, prev_key); | ||
10661 | break; | ||
10662 | case BTRFS_DIR_ITEM_KEY: | ||
10663 | case BTRFS_DIR_INDEX_KEY: | ||
10664 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c | ||
10665 | index 8a6cc600bf18..ab27e6cd9b3e 100644 | ||
10666 | --- a/fs/btrfs/tree-log.c | ||
10667 | +++ b/fs/btrfs/tree-log.c | ||
10668 | @@ -808,7 +808,8 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans, | ||
10669 | struct btrfs_ordered_sum, | ||
10670 | list); | ||
10671 | if (!ret) | ||
10672 | - ret = btrfs_del_csums(trans, fs_info, | ||
10673 | + ret = btrfs_del_csums(trans, | ||
10674 | + fs_info->csum_root, | ||
10675 | sums->bytenr, | ||
10676 | sums->len); | ||
10677 | if (!ret) | ||
10678 | @@ -3927,6 +3928,28 @@ static int log_inode_item(struct btrfs_trans_handle *trans, | ||
10679 | return 0; | ||
10680 | } | ||
10681 | |||
10682 | +static int log_csums(struct btrfs_trans_handle *trans, | ||
10683 | + struct btrfs_root *log_root, | ||
10684 | + struct btrfs_ordered_sum *sums) | ||
10685 | +{ | ||
10686 | + int ret; | ||
10687 | + | ||
10688 | + /* | ||
10689 | + * Due to extent cloning, we might have logged a csum item that covers a | ||
10690 | + * subrange of a cloned extent, and later we can end up logging a csum | ||
10691 | + * item for a larger subrange of the same extent or the entire range. | ||
10692 | + * This would leave csum items in the log tree that cover the same range | ||
10693 | + * and break the searches for checksums in the log tree, resulting in | ||
10694 | + * some checksums missing in the fs/subvolume tree. So just delete (or | ||
10695 | + * trim and adjust) any existing csum items in the log for this range. | ||
10696 | + */ | ||
10697 | + ret = btrfs_del_csums(trans, log_root, sums->bytenr, sums->len); | ||
10698 | + if (ret) | ||
10699 | + return ret; | ||
10700 | + | ||
10701 | + return btrfs_csum_file_blocks(trans, log_root, sums); | ||
10702 | +} | ||
10703 | + | ||
10704 | static noinline int copy_items(struct btrfs_trans_handle *trans, | ||
10705 | struct btrfs_inode *inode, | ||
10706 | struct btrfs_path *dst_path, | ||
10707 | @@ -4072,7 +4095,7 @@ static noinline int copy_items(struct btrfs_trans_handle *trans, | ||
10708 | struct btrfs_ordered_sum, | ||
10709 | list); | ||
10710 | if (!ret) | ||
10711 | - ret = btrfs_csum_file_blocks(trans, log, sums); | ||
10712 | + ret = log_csums(trans, log, sums); | ||
10713 | list_del(&sums->list); | ||
10714 | kfree(sums); | ||
10715 | } | ||
10716 | @@ -4292,7 +4315,7 @@ static int log_extent_csums(struct btrfs_trans_handle *trans, | ||
10717 | struct btrfs_ordered_sum, | ||
10718 | list); | ||
10719 | if (!ret) | ||
10720 | - ret = btrfs_csum_file_blocks(trans, log_root, sums); | ||
10721 | + ret = log_csums(trans, log_root, sums); | ||
10722 | list_del(&sums->list); | ||
10723 | kfree(sums); | ||
10724 | } | ||
10725 | @@ -6314,9 +6337,28 @@ again: | ||
10726 | wc.replay_dest = btrfs_read_fs_root_no_name(fs_info, &tmp_key); | ||
10727 | if (IS_ERR(wc.replay_dest)) { | ||
10728 | ret = PTR_ERR(wc.replay_dest); | ||
10729 | + | ||
10730 | + /* | ||
10731 | + * We didn't find the subvol, likely because it was | ||
10732 | + * deleted. This is ok, simply skip this log and go to | ||
10733 | + * the next one. | ||
10734 | + * | ||
10735 | + * We need to exclude the root because we can't have | ||
10736 | + * other log replays overwriting this log as we'll read | ||
10737 | + * it back in a few more times. This will keep our | ||
10738 | + * block from being modified, and we'll just bail for | ||
10739 | + * each subsequent pass. | ||
10740 | + */ | ||
10741 | + if (ret == -ENOENT) | ||
10742 | + ret = btrfs_pin_extent_for_log_replay(fs_info, | ||
10743 | + log->node->start, | ||
10744 | + log->node->len); | ||
10745 | free_extent_buffer(log->node); | ||
10746 | free_extent_buffer(log->commit_root); | ||
10747 | kfree(log); | ||
10748 | + | ||
10749 | + if (!ret) | ||
10750 | + goto next; | ||
10751 | btrfs_handle_fs_error(fs_info, ret, | ||
10752 | "Couldn't read target root for tree log recovery."); | ||
10753 | goto error; | ||
10754 | @@ -6348,7 +6390,6 @@ again: | ||
10755 | &root->highest_objectid); | ||
10756 | } | ||
10757 | |||
10758 | - key.offset = found_key.offset - 1; | ||
10759 | wc.replay_dest->log_root = NULL; | ||
10760 | free_extent_buffer(log->node); | ||
10761 | free_extent_buffer(log->commit_root); | ||
10762 | @@ -6356,9 +6397,10 @@ again: | ||
10763 | |||
10764 | if (ret) | ||
10765 | goto error; | ||
10766 | - | ||
10767 | +next: | ||
10768 | if (found_key.offset == 0) | ||
10769 | break; | ||
10770 | + key.offset = found_key.offset - 1; | ||
10771 | } | ||
10772 | btrfs_release_path(path); | ||
10773 | |||
10774 | diff --git a/fs/btrfs/uuid-tree.c b/fs/btrfs/uuid-tree.c | ||
10775 | index 91caab63bdf5..76b84f2397b1 100644 | ||
10776 | --- a/fs/btrfs/uuid-tree.c | ||
10777 | +++ b/fs/btrfs/uuid-tree.c | ||
10778 | @@ -324,6 +324,8 @@ again_search_slot: | ||
10779 | } | ||
10780 | if (ret < 0 && ret != -ENOENT) | ||
10781 | goto out; | ||
10782 | + key.offset++; | ||
10783 | + goto again_search_slot; | ||
10784 | } | ||
10785 | item_size -= sizeof(subid_le); | ||
10786 | offset += sizeof(subid_le); | ||
10787 | diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c | ||
10788 | index 9fdd2b269d61..6305d5ec25af 100644 | ||
10789 | --- a/fs/ext4/dir.c | ||
10790 | +++ b/fs/ext4/dir.c | ||
10791 | @@ -81,6 +81,11 @@ int __ext4_check_dir_entry(const char *function, unsigned int line, | ||
10792 | error_msg = "rec_len is too small for name_len"; | ||
10793 | else if (unlikely(((char *) de - buf) + rlen > size)) | ||
10794 | error_msg = "directory entry overrun"; | ||
10795 | + else if (unlikely(((char *) de - buf) + rlen > | ||
10796 | + size - EXT4_DIR_REC_LEN(1) && | ||
10797 | + ((char *) de - buf) + rlen != size)) { | ||
10798 | + error_msg = "directory entry too close to block end"; | ||
10799 | + } | ||
10800 | else if (unlikely(le32_to_cpu(de->inode) > | ||
10801 | le32_to_cpu(EXT4_SB(dir->i_sb)->s_es->s_inodes_count))) | ||
10802 | error_msg = "inode out of bounds"; | ||
10803 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c | ||
10804 | index 91da21890360..53134e4509b8 100644 | ||
10805 | --- a/fs/ext4/inode.c | ||
10806 | +++ b/fs/ext4/inode.c | ||
10807 | @@ -6035,7 +6035,7 @@ int ext4_expand_extra_isize(struct inode *inode, | ||
10808 | error = ext4_journal_get_write_access(handle, iloc->bh); | ||
10809 | if (error) { | ||
10810 | brelse(iloc->bh); | ||
10811 | - goto out_stop; | ||
10812 | + goto out_unlock; | ||
10813 | } | ||
10814 | |||
10815 | error = __ext4_expand_extra_isize(inode, new_extra_isize, iloc, | ||
10816 | @@ -6045,8 +6045,8 @@ int ext4_expand_extra_isize(struct inode *inode, | ||
10817 | if (!error) | ||
10818 | error = rc; | ||
10819 | |||
10820 | +out_unlock: | ||
10821 | ext4_write_unlock_xattr(inode, &no_expand); | ||
10822 | -out_stop: | ||
10823 | ext4_journal_stop(handle); | ||
10824 | return error; | ||
10825 | } | ||
10826 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
10827 | index 923476e3aefb..f56402e9c11c 100644 | ||
10828 | --- a/fs/ext4/namei.c | ||
10829 | +++ b/fs/ext4/namei.c | ||
10830 | @@ -2808,7 +2808,7 @@ bool ext4_empty_dir(struct inode *inode) | ||
10831 | { | ||
10832 | unsigned int offset; | ||
10833 | struct buffer_head *bh; | ||
10834 | - struct ext4_dir_entry_2 *de, *de1; | ||
10835 | + struct ext4_dir_entry_2 *de; | ||
10836 | struct super_block *sb; | ||
10837 | |||
10838 | if (ext4_has_inline_data(inode)) { | ||
10839 | @@ -2833,19 +2833,25 @@ bool ext4_empty_dir(struct inode *inode) | ||
10840 | return true; | ||
10841 | |||
10842 | de = (struct ext4_dir_entry_2 *) bh->b_data; | ||
10843 | - de1 = ext4_next_entry(de, sb->s_blocksize); | ||
10844 | - if (le32_to_cpu(de->inode) != inode->i_ino || | ||
10845 | - le32_to_cpu(de1->inode) == 0 || | ||
10846 | - strcmp(".", de->name) || strcmp("..", de1->name)) { | ||
10847 | - ext4_warning_inode(inode, "directory missing '.' and/or '..'"); | ||
10848 | + if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size, | ||
10849 | + 0) || | ||
10850 | + le32_to_cpu(de->inode) != inode->i_ino || strcmp(".", de->name)) { | ||
10851 | + ext4_warning_inode(inode, "directory missing '.'"); | ||
10852 | + brelse(bh); | ||
10853 | + return true; | ||
10854 | + } | ||
10855 | + offset = ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); | ||
10856 | + de = ext4_next_entry(de, sb->s_blocksize); | ||
10857 | + if (ext4_check_dir_entry(inode, NULL, de, bh, bh->b_data, bh->b_size, | ||
10858 | + offset) || | ||
10859 | + le32_to_cpu(de->inode) == 0 || strcmp("..", de->name)) { | ||
10860 | + ext4_warning_inode(inode, "directory missing '..'"); | ||
10861 | brelse(bh); | ||
10862 | return true; | ||
10863 | } | ||
10864 | - offset = ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize) + | ||
10865 | - ext4_rec_len_from_disk(de1->rec_len, sb->s_blocksize); | ||
10866 | - de = ext4_next_entry(de1, sb->s_blocksize); | ||
10867 | + offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); | ||
10868 | while (offset < inode->i_size) { | ||
10869 | - if ((void *) de >= (void *) (bh->b_data+sb->s_blocksize)) { | ||
10870 | + if (!(offset & (sb->s_blocksize - 1))) { | ||
10871 | unsigned int lblock; | ||
10872 | brelse(bh); | ||
10873 | lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb); | ||
10874 | @@ -2856,12 +2862,11 @@ bool ext4_empty_dir(struct inode *inode) | ||
10875 | } | ||
10876 | if (IS_ERR(bh)) | ||
10877 | return true; | ||
10878 | - de = (struct ext4_dir_entry_2 *) bh->b_data; | ||
10879 | } | ||
10880 | + de = (struct ext4_dir_entry_2 *) (bh->b_data + | ||
10881 | + (offset & (sb->s_blocksize - 1))); | ||
10882 | if (ext4_check_dir_entry(inode, NULL, de, bh, | ||
10883 | bh->b_data, bh->b_size, offset)) { | ||
10884 | - de = (struct ext4_dir_entry_2 *)(bh->b_data + | ||
10885 | - sb->s_blocksize); | ||
10886 | offset = (offset | (sb->s_blocksize - 1)) + 1; | ||
10887 | continue; | ||
10888 | } | ||
10889 | @@ -2870,7 +2875,6 @@ bool ext4_empty_dir(struct inode *inode) | ||
10890 | return false; | ||
10891 | } | ||
10892 | offset += ext4_rec_len_from_disk(de->rec_len, sb->s_blocksize); | ||
10893 | - de = ext4_next_entry(de, sb->s_blocksize); | ||
10894 | } | ||
10895 | brelse(bh); | ||
10896 | return true; | ||
10897 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
10898 | index 98d37b8d0050..66162b430edc 100644 | ||
10899 | --- a/fs/ext4/super.c | ||
10900 | +++ b/fs/ext4/super.c | ||
10901 | @@ -1887,6 +1887,13 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | ||
10902 | } | ||
10903 | sbi->s_commit_interval = HZ * arg; | ||
10904 | } else if (token == Opt_debug_want_extra_isize) { | ||
10905 | + if ((arg & 1) || | ||
10906 | + (arg < 4) || | ||
10907 | + (arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) { | ||
10908 | + ext4_msg(sb, KERN_ERR, | ||
10909 | + "Invalid want_extra_isize %d", arg); | ||
10910 | + return -1; | ||
10911 | + } | ||
10912 | sbi->s_want_extra_isize = arg; | ||
10913 | } else if (token == Opt_max_batch_time) { | ||
10914 | sbi->s_max_batch_time = arg; | ||
10915 | @@ -3551,40 +3558,6 @@ int ext4_calculate_overhead(struct super_block *sb) | ||
10916 | return 0; | ||
10917 | } | ||
10918 | |||
10919 | -static void ext4_clamp_want_extra_isize(struct super_block *sb) | ||
10920 | -{ | ||
10921 | - struct ext4_sb_info *sbi = EXT4_SB(sb); | ||
10922 | - struct ext4_super_block *es = sbi->s_es; | ||
10923 | - unsigned def_extra_isize = sizeof(struct ext4_inode) - | ||
10924 | - EXT4_GOOD_OLD_INODE_SIZE; | ||
10925 | - | ||
10926 | - if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) { | ||
10927 | - sbi->s_want_extra_isize = 0; | ||
10928 | - return; | ||
10929 | - } | ||
10930 | - if (sbi->s_want_extra_isize < 4) { | ||
10931 | - sbi->s_want_extra_isize = def_extra_isize; | ||
10932 | - if (ext4_has_feature_extra_isize(sb)) { | ||
10933 | - if (sbi->s_want_extra_isize < | ||
10934 | - le16_to_cpu(es->s_want_extra_isize)) | ||
10935 | - sbi->s_want_extra_isize = | ||
10936 | - le16_to_cpu(es->s_want_extra_isize); | ||
10937 | - if (sbi->s_want_extra_isize < | ||
10938 | - le16_to_cpu(es->s_min_extra_isize)) | ||
10939 | - sbi->s_want_extra_isize = | ||
10940 | - le16_to_cpu(es->s_min_extra_isize); | ||
10941 | - } | ||
10942 | - } | ||
10943 | - /* Check if enough inode space is available */ | ||
10944 | - if ((sbi->s_want_extra_isize > sbi->s_inode_size) || | ||
10945 | - (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > | ||
10946 | - sbi->s_inode_size)) { | ||
10947 | - sbi->s_want_extra_isize = def_extra_isize; | ||
10948 | - ext4_msg(sb, KERN_INFO, | ||
10949 | - "required extra inode space not available"); | ||
10950 | - } | ||
10951 | -} | ||
10952 | - | ||
10953 | static void ext4_set_resv_clusters(struct super_block *sb) | ||
10954 | { | ||
10955 | ext4_fsblk_t resv_clusters; | ||
10956 | @@ -3792,6 +3765,68 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
10957 | */ | ||
10958 | sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT; | ||
10959 | |||
10960 | + if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { | ||
10961 | + sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; | ||
10962 | + sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; | ||
10963 | + } else { | ||
10964 | + sbi->s_inode_size = le16_to_cpu(es->s_inode_size); | ||
10965 | + sbi->s_first_ino = le32_to_cpu(es->s_first_ino); | ||
10966 | + if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { | ||
10967 | + ext4_msg(sb, KERN_ERR, "invalid first ino: %u", | ||
10968 | + sbi->s_first_ino); | ||
10969 | + goto failed_mount; | ||
10970 | + } | ||
10971 | + if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || | ||
10972 | + (!is_power_of_2(sbi->s_inode_size)) || | ||
10973 | + (sbi->s_inode_size > blocksize)) { | ||
10974 | + ext4_msg(sb, KERN_ERR, | ||
10975 | + "unsupported inode size: %d", | ||
10976 | + sbi->s_inode_size); | ||
10977 | + goto failed_mount; | ||
10978 | + } | ||
10979 | + /* | ||
10980 | + * i_atime_extra is the last extra field available for | ||
10981 | + * [acm]times in struct ext4_inode. Checking for that | ||
10982 | + * field should suffice to ensure we have extra space | ||
10983 | + * for all three. | ||
10984 | + */ | ||
10985 | + if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) + | ||
10986 | + sizeof(((struct ext4_inode *)0)->i_atime_extra)) { | ||
10987 | + sb->s_time_gran = 1; | ||
10988 | + sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX; | ||
10989 | + } else { | ||
10990 | + sb->s_time_gran = NSEC_PER_SEC; | ||
10991 | + sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX; | ||
10992 | + } | ||
10993 | + sb->s_time_min = EXT4_TIMESTAMP_MIN; | ||
10994 | + } | ||
10995 | + if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) { | ||
10996 | + sbi->s_want_extra_isize = sizeof(struct ext4_inode) - | ||
10997 | + EXT4_GOOD_OLD_INODE_SIZE; | ||
10998 | + if (ext4_has_feature_extra_isize(sb)) { | ||
10999 | + unsigned v, max = (sbi->s_inode_size - | ||
11000 | + EXT4_GOOD_OLD_INODE_SIZE); | ||
11001 | + | ||
11002 | + v = le16_to_cpu(es->s_want_extra_isize); | ||
11003 | + if (v > max) { | ||
11004 | + ext4_msg(sb, KERN_ERR, | ||
11005 | + "bad s_want_extra_isize: %d", v); | ||
11006 | + goto failed_mount; | ||
11007 | + } | ||
11008 | + if (sbi->s_want_extra_isize < v) | ||
11009 | + sbi->s_want_extra_isize = v; | ||
11010 | + | ||
11011 | + v = le16_to_cpu(es->s_min_extra_isize); | ||
11012 | + if (v > max) { | ||
11013 | + ext4_msg(sb, KERN_ERR, | ||
11014 | + "bad s_min_extra_isize: %d", v); | ||
11015 | + goto failed_mount; | ||
11016 | + } | ||
11017 | + if (sbi->s_want_extra_isize < v) | ||
11018 | + sbi->s_want_extra_isize = v; | ||
11019 | + } | ||
11020 | + } | ||
11021 | + | ||
11022 | if (sbi->s_es->s_mount_opts[0]) { | ||
11023 | char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts, | ||
11024 | sizeof(sbi->s_es->s_mount_opts), | ||
11025 | @@ -4030,42 +4065,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | ||
11026 | has_huge_files); | ||
11027 | sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files); | ||
11028 | |||
11029 | - if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) { | ||
11030 | - sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE; | ||
11031 | - sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO; | ||
11032 | - } else { | ||
11033 | - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); | ||
11034 | - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); | ||
11035 | - if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) { | ||
11036 | - ext4_msg(sb, KERN_ERR, "invalid first ino: %u", | ||
11037 | - sbi->s_first_ino); | ||
11038 | - goto failed_mount; | ||
11039 | - } | ||
11040 | - if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) || | ||
11041 | - (!is_power_of_2(sbi->s_inode_size)) || | ||
11042 | - (sbi->s_inode_size > blocksize)) { | ||
11043 | - ext4_msg(sb, KERN_ERR, | ||
11044 | - "unsupported inode size: %d", | ||
11045 | - sbi->s_inode_size); | ||
11046 | - goto failed_mount; | ||
11047 | - } | ||
11048 | - /* | ||
11049 | - * i_atime_extra is the last extra field available for [acm]times in | ||
11050 | - * struct ext4_inode. Checking for that field should suffice to ensure | ||
11051 | - * we have extra space for all three. | ||
11052 | - */ | ||
11053 | - if (sbi->s_inode_size >= offsetof(struct ext4_inode, i_atime_extra) + | ||
11054 | - sizeof(((struct ext4_inode *)0)->i_atime_extra)) { | ||
11055 | - sb->s_time_gran = 1; | ||
11056 | - sb->s_time_max = EXT4_EXTRA_TIMESTAMP_MAX; | ||
11057 | - } else { | ||
11058 | - sb->s_time_gran = NSEC_PER_SEC; | ||
11059 | - sb->s_time_max = EXT4_NON_EXTRA_TIMESTAMP_MAX; | ||
11060 | - } | ||
11061 | - | ||
11062 | - sb->s_time_min = EXT4_TIMESTAMP_MIN; | ||
11063 | - } | ||
11064 | - | ||
11065 | sbi->s_desc_size = le16_to_cpu(es->s_desc_size); | ||
11066 | if (ext4_has_feature_64bit(sb)) { | ||
11067 | if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT || | ||
11068 | @@ -4521,8 +4520,6 @@ no_journal: | ||
11069 | } else if (ret) | ||
11070 | goto failed_mount4a; | ||
11071 | |||
11072 | - ext4_clamp_want_extra_isize(sb); | ||
11073 | - | ||
11074 | ext4_set_resv_clusters(sb); | ||
11075 | |||
11076 | err = ext4_setup_system_zone(sb); | ||
11077 | @@ -5310,8 +5307,6 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | ||
11078 | goto restore_opts; | ||
11079 | } | ||
11080 | |||
11081 | - ext4_clamp_want_extra_isize(sb); | ||
11082 | - | ||
11083 | if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^ | ||
11084 | test_opt(sb, JOURNAL_CHECKSUM)) { | ||
11085 | ext4_msg(sb, KERN_ERR, "changing journal_checksum " | ||
11086 | diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h | ||
11087 | index 2ba6253ea6d3..fc349204a71b 100644 | ||
11088 | --- a/include/drm/drm_dp_mst_helper.h | ||
11089 | +++ b/include/drm/drm_dp_mst_helper.h | ||
11090 | @@ -334,7 +334,7 @@ struct drm_dp_resource_status_notify { | ||
11091 | |||
11092 | struct drm_dp_query_payload_ack_reply { | ||
11093 | u8 port_number; | ||
11094 | - u8 allocated_pbn; | ||
11095 | + u16 allocated_pbn; | ||
11096 | }; | ||
11097 | |||
11098 | struct drm_dp_sideband_msg_req_body { | ||
11099 | diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h | ||
11100 | index 92d5fdc8154e..31b1b0e03df8 100644 | ||
11101 | --- a/include/linux/cpufreq.h | ||
11102 | +++ b/include/linux/cpufreq.h | ||
11103 | @@ -595,17 +595,6 @@ struct governor_attr { | ||
11104 | size_t count); | ||
11105 | }; | ||
11106 | |||
11107 | -static inline bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy) | ||
11108 | -{ | ||
11109 | - /* | ||
11110 | - * Allow remote callbacks if: | ||
11111 | - * - dvfs_possible_from_any_cpu flag is set | ||
11112 | - * - the local and remote CPUs share cpufreq policy | ||
11113 | - */ | ||
11114 | - return policy->dvfs_possible_from_any_cpu || | ||
11115 | - cpumask_test_cpu(smp_processor_id(), policy->cpus); | ||
11116 | -} | ||
11117 | - | ||
11118 | /********************************************************************* | ||
11119 | * FREQUENCY TABLE HELPERS * | ||
11120 | *********************************************************************/ | ||
11121 | diff --git a/include/linux/ipmi_smi.h b/include/linux/ipmi_smi.h | ||
11122 | index 4dc66157d872..deec18b8944a 100644 | ||
11123 | --- a/include/linux/ipmi_smi.h | ||
11124 | +++ b/include/linux/ipmi_smi.h | ||
11125 | @@ -224,10 +224,14 @@ static inline int ipmi_demangle_device_id(uint8_t netfn, uint8_t cmd, | ||
11126 | * is called, and the lower layer must get the interface from that | ||
11127 | * call. | ||
11128 | */ | ||
11129 | -int ipmi_register_smi(const struct ipmi_smi_handlers *handlers, | ||
11130 | - void *send_info, | ||
11131 | - struct device *dev, | ||
11132 | - unsigned char slave_addr); | ||
11133 | +int ipmi_add_smi(struct module *owner, | ||
11134 | + const struct ipmi_smi_handlers *handlers, | ||
11135 | + void *send_info, | ||
11136 | + struct device *dev, | ||
11137 | + unsigned char slave_addr); | ||
11138 | + | ||
11139 | +#define ipmi_register_smi(handlers, send_info, dev, slave_addr) \ | ||
11140 | + ipmi_add_smi(THIS_MODULE, handlers, send_info, dev, slave_addr) | ||
11141 | |||
11142 | /* | ||
11143 | * Remove a low-level interface from the IPMI driver. This will | ||
11144 | diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h | ||
11145 | index 5714fd35a83c..e3596db077dc 100644 | ||
11146 | --- a/include/linux/mod_devicetable.h | ||
11147 | +++ b/include/linux/mod_devicetable.h | ||
11148 | @@ -587,9 +587,9 @@ struct platform_device_id { | ||
11149 | #define MDIO_NAME_SIZE 32 | ||
11150 | #define MDIO_MODULE_PREFIX "mdio:" | ||
11151 | |||
11152 | -#define MDIO_ID_FMT "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d" | ||
11153 | +#define MDIO_ID_FMT "%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u%u" | ||
11154 | #define MDIO_ID_ARGS(_id) \ | ||
11155 | - (_id)>>31, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1, \ | ||
11156 | + ((_id)>>31) & 1, ((_id)>>30) & 1, ((_id)>>29) & 1, ((_id)>>28) & 1, \ | ||
11157 | ((_id)>>27) & 1, ((_id)>>26) & 1, ((_id)>>25) & 1, ((_id)>>24) & 1, \ | ||
11158 | ((_id)>>23) & 1, ((_id)>>22) & 1, ((_id)>>21) & 1, ((_id)>>20) & 1, \ | ||
11159 | ((_id)>>19) & 1, ((_id)>>18) & 1, ((_id)>>17) & 1, ((_id)>>16) & 1, \ | ||
11160 | diff --git a/include/linux/nvme.h b/include/linux/nvme.h | ||
11161 | index f61d6906e59d..a260cd754f28 100644 | ||
11162 | --- a/include/linux/nvme.h | ||
11163 | +++ b/include/linux/nvme.h | ||
11164 | @@ -1368,6 +1368,7 @@ enum { | ||
11165 | NVME_SC_ANA_INACCESSIBLE = 0x302, | ||
11166 | NVME_SC_ANA_TRANSITION = 0x303, | ||
11167 | NVME_SC_HOST_PATH_ERROR = 0x370, | ||
11168 | + NVME_SC_HOST_ABORTED_CMD = 0x371, | ||
11169 | |||
11170 | NVME_SC_CRD = 0x1800, | ||
11171 | NVME_SC_DNR = 0x4000, | ||
11172 | diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h | ||
11173 | index 8f8be5b00060..5c17cb733224 100644 | ||
11174 | --- a/include/linux/nvmem-consumer.h | ||
11175 | +++ b/include/linux/nvmem-consumer.h | ||
11176 | @@ -118,7 +118,7 @@ static inline void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len) | ||
11177 | } | ||
11178 | |||
11179 | static inline int nvmem_cell_write(struct nvmem_cell *cell, | ||
11180 | - const char *buf, size_t len) | ||
11181 | + void *buf, size_t len) | ||
11182 | { | ||
11183 | return -EOPNOTSUPP; | ||
11184 | } | ||
11185 | diff --git a/include/linux/phy.h b/include/linux/phy.h | ||
11186 | index 9a0e981df502..3d5d53313e6c 100644 | ||
11187 | --- a/include/linux/phy.h | ||
11188 | +++ b/include/linux/phy.h | ||
11189 | @@ -993,7 +993,7 @@ int phy_modify_paged_changed(struct phy_device *phydev, int page, u32 regnum, | ||
11190 | int phy_modify_paged(struct phy_device *phydev, int page, u32 regnum, | ||
11191 | u16 mask, u16 set); | ||
11192 | |||
11193 | -struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id, | ||
11194 | +struct phy_device *phy_device_create(struct mii_bus *bus, int addr, u32 phy_id, | ||
11195 | bool is_c45, | ||
11196 | struct phy_c45_device_ids *c45_ids); | ||
11197 | #if IS_ENABLED(CONFIG_PHYLIB) | ||
11198 | diff --git a/include/linux/sched/cpufreq.h b/include/linux/sched/cpufreq.h | ||
11199 | index afa940cd50dc..cc6bcc1e96bc 100644 | ||
11200 | --- a/include/linux/sched/cpufreq.h | ||
11201 | +++ b/include/linux/sched/cpufreq.h | ||
11202 | @@ -12,6 +12,8 @@ | ||
11203 | #define SCHED_CPUFREQ_MIGRATION (1U << 1) | ||
11204 | |||
11205 | #ifdef CONFIG_CPU_FREQ | ||
11206 | +struct cpufreq_policy; | ||
11207 | + | ||
11208 | struct update_util_data { | ||
11209 | void (*func)(struct update_util_data *data, u64 time, unsigned int flags); | ||
11210 | }; | ||
11211 | @@ -20,6 +22,7 @@ void cpufreq_add_update_util_hook(int cpu, struct update_util_data *data, | ||
11212 | void (*func)(struct update_util_data *data, u64 time, | ||
11213 | unsigned int flags)); | ||
11214 | void cpufreq_remove_update_util_hook(int cpu); | ||
11215 | +bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy); | ||
11216 | |||
11217 | static inline unsigned long map_util_freq(unsigned long util, | ||
11218 | unsigned long freq, unsigned long cap) | ||
11219 | diff --git a/include/net/arp.h b/include/net/arp.h | ||
11220 | index c8f580a0e6b1..4950191f6b2b 100644 | ||
11221 | --- a/include/net/arp.h | ||
11222 | +++ b/include/net/arp.h | ||
11223 | @@ -57,8 +57,8 @@ static inline void __ipv4_confirm_neigh(struct net_device *dev, u32 key) | ||
11224 | unsigned long now = jiffies; | ||
11225 | |||
11226 | /* avoid dirtying neighbour */ | ||
11227 | - if (n->confirmed != now) | ||
11228 | - n->confirmed = now; | ||
11229 | + if (READ_ONCE(n->confirmed) != now) | ||
11230 | + WRITE_ONCE(n->confirmed, now); | ||
11231 | } | ||
11232 | rcu_read_unlock_bh(); | ||
11233 | } | ||
11234 | diff --git a/include/net/dst.h b/include/net/dst.h | ||
11235 | index fe62fe2eb781..8224dad2ae94 100644 | ||
11236 | --- a/include/net/dst.h | ||
11237 | +++ b/include/net/dst.h | ||
11238 | @@ -82,7 +82,7 @@ struct dst_entry { | ||
11239 | struct dst_metrics { | ||
11240 | u32 metrics[RTAX_MAX]; | ||
11241 | refcount_t refcnt; | ||
11242 | -}; | ||
11243 | +} __aligned(4); /* Low pointer bits contain DST_METRICS_FLAGS */ | ||
11244 | extern const struct dst_metrics dst_default_metrics; | ||
11245 | |||
11246 | u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old); | ||
11247 | diff --git a/include/net/ndisc.h b/include/net/ndisc.h | ||
11248 | index b2f715ca0567..b5ebeb3b0de0 100644 | ||
11249 | --- a/include/net/ndisc.h | ||
11250 | +++ b/include/net/ndisc.h | ||
11251 | @@ -414,8 +414,8 @@ static inline void __ipv6_confirm_neigh(struct net_device *dev, | ||
11252 | unsigned long now = jiffies; | ||
11253 | |||
11254 | /* avoid dirtying neighbour */ | ||
11255 | - if (n->confirmed != now) | ||
11256 | - n->confirmed = now; | ||
11257 | + if (READ_ONCE(n->confirmed) != now) | ||
11258 | + WRITE_ONCE(n->confirmed, now); | ||
11259 | } | ||
11260 | rcu_read_unlock_bh(); | ||
11261 | } | ||
11262 | @@ -431,8 +431,8 @@ static inline void __ipv6_confirm_neigh_stub(struct net_device *dev, | ||
11263 | unsigned long now = jiffies; | ||
11264 | |||
11265 | /* avoid dirtying neighbour */ | ||
11266 | - if (n->confirmed != now) | ||
11267 | - n->confirmed = now; | ||
11268 | + if (READ_ONCE(n->confirmed) != now) | ||
11269 | + WRITE_ONCE(n->confirmed, now); | ||
11270 | } | ||
11271 | rcu_read_unlock_bh(); | ||
11272 | } | ||
11273 | diff --git a/include/net/neighbour.h b/include/net/neighbour.h | ||
11274 | index b8452cc0e059..5e679c8dae0b 100644 | ||
11275 | --- a/include/net/neighbour.h | ||
11276 | +++ b/include/net/neighbour.h | ||
11277 | @@ -72,7 +72,6 @@ struct neigh_parms { | ||
11278 | struct net_device *dev; | ||
11279 | struct list_head list; | ||
11280 | int (*neigh_setup)(struct neighbour *); | ||
11281 | - void (*neigh_cleanup)(struct neighbour *); | ||
11282 | struct neigh_table *tbl; | ||
11283 | |||
11284 | void *sysctl_table; | ||
11285 | diff --git a/include/net/sock.h b/include/net/sock.h | ||
11286 | index 718e62fbe869..013396e50b91 100644 | ||
11287 | --- a/include/net/sock.h | ||
11288 | +++ b/include/net/sock.h | ||
11289 | @@ -1940,8 +1940,8 @@ struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie); | ||
11290 | |||
11291 | static inline void sk_dst_confirm(struct sock *sk) | ||
11292 | { | ||
11293 | - if (!sk->sk_dst_pending_confirm) | ||
11294 | - sk->sk_dst_pending_confirm = 1; | ||
11295 | + if (!READ_ONCE(sk->sk_dst_pending_confirm)) | ||
11296 | + WRITE_ONCE(sk->sk_dst_pending_confirm, 1); | ||
11297 | } | ||
11298 | |||
11299 | static inline void sock_confirm_neigh(struct sk_buff *skb, struct neighbour *n) | ||
11300 | @@ -1951,10 +1951,10 @@ static inline void sock_confirm_neigh(struct sk_buff *skb, struct neighbour *n) | ||
11301 | unsigned long now = jiffies; | ||
11302 | |||
11303 | /* avoid dirtying neighbour */ | ||
11304 | - if (n->confirmed != now) | ||
11305 | - n->confirmed = now; | ||
11306 | - if (sk && sk->sk_dst_pending_confirm) | ||
11307 | - sk->sk_dst_pending_confirm = 0; | ||
11308 | + if (READ_ONCE(n->confirmed) != now) | ||
11309 | + WRITE_ONCE(n->confirmed, now); | ||
11310 | + if (sk && READ_ONCE(sk->sk_dst_pending_confirm)) | ||
11311 | + WRITE_ONCE(sk->sk_dst_pending_confirm, 0); | ||
11312 | } | ||
11313 | } | ||
11314 | |||
11315 | diff --git a/include/trace/events/wbt.h b/include/trace/events/wbt.h | ||
11316 | index b048694070e2..37342a13c9cb 100644 | ||
11317 | --- a/include/trace/events/wbt.h | ||
11318 | +++ b/include/trace/events/wbt.h | ||
11319 | @@ -33,7 +33,8 @@ TRACE_EVENT(wbt_stat, | ||
11320 | ), | ||
11321 | |||
11322 | TP_fast_assign( | ||
11323 | - strncpy(__entry->name, dev_name(bdi->dev), 32); | ||
11324 | + strlcpy(__entry->name, dev_name(bdi->dev), | ||
11325 | + ARRAY_SIZE(__entry->name)); | ||
11326 | __entry->rmean = stat[0].mean; | ||
11327 | __entry->rmin = stat[0].min; | ||
11328 | __entry->rmax = stat[0].max; | ||
11329 | @@ -67,7 +68,8 @@ TRACE_EVENT(wbt_lat, | ||
11330 | ), | ||
11331 | |||
11332 | TP_fast_assign( | ||
11333 | - strncpy(__entry->name, dev_name(bdi->dev), 32); | ||
11334 | + strlcpy(__entry->name, dev_name(bdi->dev), | ||
11335 | + ARRAY_SIZE(__entry->name)); | ||
11336 | __entry->lat = div_u64(lat, 1000); | ||
11337 | ), | ||
11338 | |||
11339 | @@ -103,7 +105,8 @@ TRACE_EVENT(wbt_step, | ||
11340 | ), | ||
11341 | |||
11342 | TP_fast_assign( | ||
11343 | - strncpy(__entry->name, dev_name(bdi->dev), 32); | ||
11344 | + strlcpy(__entry->name, dev_name(bdi->dev), | ||
11345 | + ARRAY_SIZE(__entry->name)); | ||
11346 | __entry->msg = msg; | ||
11347 | __entry->step = step; | ||
11348 | __entry->window = div_u64(window, 1000); | ||
11349 | @@ -138,7 +141,8 @@ TRACE_EVENT(wbt_timer, | ||
11350 | ), | ||
11351 | |||
11352 | TP_fast_assign( | ||
11353 | - strncpy(__entry->name, dev_name(bdi->dev), 32); | ||
11354 | + strlcpy(__entry->name, dev_name(bdi->dev), | ||
11355 | + ARRAY_SIZE(__entry->name)); | ||
11356 | __entry->status = status; | ||
11357 | __entry->step = step; | ||
11358 | __entry->inflight = inflight; | ||
11359 | diff --git a/include/uapi/linux/cec-funcs.h b/include/uapi/linux/cec-funcs.h | ||
11360 | index 8997d5068c08..4511b85c84df 100644 | ||
11361 | --- a/include/uapi/linux/cec-funcs.h | ||
11362 | +++ b/include/uapi/linux/cec-funcs.h | ||
11363 | @@ -923,7 +923,8 @@ static inline void cec_msg_give_deck_status(struct cec_msg *msg, | ||
11364 | msg->len = 3; | ||
11365 | msg->msg[1] = CEC_MSG_GIVE_DECK_STATUS; | ||
11366 | msg->msg[2] = status_req; | ||
11367 | - msg->reply = reply ? CEC_MSG_DECK_STATUS : 0; | ||
11368 | + msg->reply = (reply && status_req != CEC_OP_STATUS_REQ_OFF) ? | ||
11369 | + CEC_MSG_DECK_STATUS : 0; | ||
11370 | } | ||
11371 | |||
11372 | static inline void cec_ops_give_deck_status(const struct cec_msg *msg, | ||
11373 | @@ -1027,7 +1028,8 @@ static inline void cec_msg_give_tuner_device_status(struct cec_msg *msg, | ||
11374 | msg->len = 3; | ||
11375 | msg->msg[1] = CEC_MSG_GIVE_TUNER_DEVICE_STATUS; | ||
11376 | msg->msg[2] = status_req; | ||
11377 | - msg->reply = reply ? CEC_MSG_TUNER_DEVICE_STATUS : 0; | ||
11378 | + msg->reply = (reply && status_req != CEC_OP_STATUS_REQ_OFF) ? | ||
11379 | + CEC_MSG_TUNER_DEVICE_STATUS : 0; | ||
11380 | } | ||
11381 | |||
11382 | static inline void cec_ops_give_tuner_device_status(const struct cec_msg *msg, | ||
11383 | diff --git a/kernel/bpf/stackmap.c b/kernel/bpf/stackmap.c | ||
11384 | index 052580c33d26..173e983619d7 100644 | ||
11385 | --- a/kernel/bpf/stackmap.c | ||
11386 | +++ b/kernel/bpf/stackmap.c | ||
11387 | @@ -287,7 +287,7 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, | ||
11388 | bool irq_work_busy = false; | ||
11389 | struct stack_map_irq_work *work = NULL; | ||
11390 | |||
11391 | - if (in_nmi()) { | ||
11392 | + if (irqs_disabled()) { | ||
11393 | work = this_cpu_ptr(&up_read_work); | ||
11394 | if (work->irq_work.flags & IRQ_WORK_BUSY) | ||
11395 | /* cannot queue more up_read, fallback */ | ||
11396 | @@ -295,8 +295,9 @@ static void stack_map_get_build_id_offset(struct bpf_stack_build_id *id_offs, | ||
11397 | } | ||
11398 | |||
11399 | /* | ||
11400 | - * We cannot do up_read() in nmi context. To do build_id lookup | ||
11401 | - * in nmi context, we need to run up_read() in irq_work. We use | ||
11402 | + * We cannot do up_read() when the irq is disabled, because of | ||
11403 | + * risk to deadlock with rq_lock. To do build_id lookup when the | ||
11404 | + * irqs are disabled, we need to run up_read() in irq_work. We use | ||
11405 | * a percpu variable to do the irq_work. If the irq_work is | ||
11406 | * already used by another lookup, we fall back to report ips. | ||
11407 | * | ||
11408 | diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c | ||
11409 | index ffc3e53f5300..9e7cee5307e0 100644 | ||
11410 | --- a/kernel/bpf/verifier.c | ||
11411 | +++ b/kernel/bpf/verifier.c | ||
11412 | @@ -978,6 +978,17 @@ static void __reg_bound_offset(struct bpf_reg_state *reg) | ||
11413 | reg->umax_value)); | ||
11414 | } | ||
11415 | |||
11416 | +static void __reg_bound_offset32(struct bpf_reg_state *reg) | ||
11417 | +{ | ||
11418 | + u64 mask = 0xffffFFFF; | ||
11419 | + struct tnum range = tnum_range(reg->umin_value & mask, | ||
11420 | + reg->umax_value & mask); | ||
11421 | + struct tnum lo32 = tnum_cast(reg->var_off, 4); | ||
11422 | + struct tnum hi32 = tnum_lshift(tnum_rshift(reg->var_off, 32), 32); | ||
11423 | + | ||
11424 | + reg->var_off = tnum_or(hi32, tnum_intersect(lo32, range)); | ||
11425 | +} | ||
11426 | + | ||
11427 | /* Reset the min/max bounds of a register */ | ||
11428 | static void __mark_reg_unbounded(struct bpf_reg_state *reg) | ||
11429 | { | ||
11430 | @@ -5433,6 +5444,10 @@ static void reg_set_min_max(struct bpf_reg_state *true_reg, | ||
11431 | /* We might have learned some bits from the bounds. */ | ||
11432 | __reg_bound_offset(false_reg); | ||
11433 | __reg_bound_offset(true_reg); | ||
11434 | + if (is_jmp32) { | ||
11435 | + __reg_bound_offset32(false_reg); | ||
11436 | + __reg_bound_offset32(true_reg); | ||
11437 | + } | ||
11438 | /* Intersecting with the old var_off might have improved our bounds | ||
11439 | * slightly. e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc), | ||
11440 | * then new var_off is (0; 0x7f...fc) which improves our umax. | ||
11441 | @@ -5542,6 +5557,10 @@ static void reg_set_min_max_inv(struct bpf_reg_state *true_reg, | ||
11442 | /* We might have learned some bits from the bounds. */ | ||
11443 | __reg_bound_offset(false_reg); | ||
11444 | __reg_bound_offset(true_reg); | ||
11445 | + if (is_jmp32) { | ||
11446 | + __reg_bound_offset32(false_reg); | ||
11447 | + __reg_bound_offset32(true_reg); | ||
11448 | + } | ||
11449 | /* Intersecting with the old var_off might have improved our bounds | ||
11450 | * slightly. e.g. if umax was 0x7f...f and var_off was (0; 0xf...fc), | ||
11451 | * then new var_off is (0; 0x7f...fc) which improves our umax. | ||
11452 | diff --git a/kernel/cgroup/freezer.c b/kernel/cgroup/freezer.c | ||
11453 | index 8cf010680678..3984dd6b8ddb 100644 | ||
11454 | --- a/kernel/cgroup/freezer.c | ||
11455 | +++ b/kernel/cgroup/freezer.c | ||
11456 | @@ -230,6 +230,15 @@ void cgroup_freezer_migrate_task(struct task_struct *task, | ||
11457 | if (task->flags & PF_KTHREAD) | ||
11458 | return; | ||
11459 | |||
11460 | + /* | ||
11461 | + * It's not necessary to do changes if both of the src and dst cgroups | ||
11462 | + * are not freezing and task is not frozen. | ||
11463 | + */ | ||
11464 | + if (!test_bit(CGRP_FREEZE, &src->flags) && | ||
11465 | + !test_bit(CGRP_FREEZE, &dst->flags) && | ||
11466 | + !task->frozen) | ||
11467 | + return; | ||
11468 | + | ||
11469 | /* | ||
11470 | * Adjust counters of freezing and frozen tasks. | ||
11471 | * Note, that if the task is frozen, but the destination cgroup is not | ||
11472 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
11473 | index 00a014670ed0..8f66a4833ded 100644 | ||
11474 | --- a/kernel/events/core.c | ||
11475 | +++ b/kernel/events/core.c | ||
11476 | @@ -5607,10 +5607,8 @@ static void perf_mmap_close(struct vm_area_struct *vma) | ||
11477 | perf_pmu_output_stop(event); | ||
11478 | |||
11479 | /* now it's safe to free the pages */ | ||
11480 | - if (!rb->aux_mmap_locked) | ||
11481 | - atomic_long_sub(rb->aux_nr_pages, &mmap_user->locked_vm); | ||
11482 | - else | ||
11483 | - atomic64_sub(rb->aux_mmap_locked, &vma->vm_mm->pinned_vm); | ||
11484 | + atomic_long_sub(rb->aux_nr_pages - rb->aux_mmap_locked, &mmap_user->locked_vm); | ||
11485 | + atomic64_sub(rb->aux_mmap_locked, &vma->vm_mm->pinned_vm); | ||
11486 | |||
11487 | /* this has to be the last one */ | ||
11488 | rb_free_aux(rb); | ||
11489 | diff --git a/kernel/sched/core.c b/kernel/sched/core.c | ||
11490 | index 44123b4d14e8..8dacda4b0362 100644 | ||
11491 | --- a/kernel/sched/core.c | ||
11492 | +++ b/kernel/sched/core.c | ||
11493 | @@ -810,7 +810,7 @@ static inline unsigned int uclamp_bucket_base_value(unsigned int clamp_value) | ||
11494 | return UCLAMP_BUCKET_DELTA * uclamp_bucket_id(clamp_value); | ||
11495 | } | ||
11496 | |||
11497 | -static inline enum uclamp_id uclamp_none(enum uclamp_id clamp_id) | ||
11498 | +static inline unsigned int uclamp_none(enum uclamp_id clamp_id) | ||
11499 | { | ||
11500 | if (clamp_id == UCLAMP_MIN) | ||
11501 | return 0; | ||
11502 | @@ -853,7 +853,7 @@ static inline void uclamp_idle_reset(struct rq *rq, enum uclamp_id clamp_id, | ||
11503 | } | ||
11504 | |||
11505 | static inline | ||
11506 | -enum uclamp_id uclamp_rq_max_value(struct rq *rq, enum uclamp_id clamp_id, | ||
11507 | +unsigned int uclamp_rq_max_value(struct rq *rq, enum uclamp_id clamp_id, | ||
11508 | unsigned int clamp_value) | ||
11509 | { | ||
11510 | struct uclamp_bucket *bucket = rq->uclamp[clamp_id].bucket; | ||
11511 | @@ -918,7 +918,7 @@ uclamp_eff_get(struct task_struct *p, enum uclamp_id clamp_id) | ||
11512 | return uc_req; | ||
11513 | } | ||
11514 | |||
11515 | -enum uclamp_id uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id) | ||
11516 | +unsigned int uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id) | ||
11517 | { | ||
11518 | struct uclamp_se uc_eff; | ||
11519 | |||
11520 | diff --git a/kernel/sched/cpufreq.c b/kernel/sched/cpufreq.c | ||
11521 | index b5dcd1d83c7f..7c2fe50fd76d 100644 | ||
11522 | --- a/kernel/sched/cpufreq.c | ||
11523 | +++ b/kernel/sched/cpufreq.c | ||
11524 | @@ -5,6 +5,8 @@ | ||
11525 | * Copyright (C) 2016, Intel Corporation | ||
11526 | * Author: Rafael J. Wysocki <rafael.j.wysocki@intel.com> | ||
11527 | */ | ||
11528 | +#include <linux/cpufreq.h> | ||
11529 | + | ||
11530 | #include "sched.h" | ||
11531 | |||
11532 | DEFINE_PER_CPU(struct update_util_data __rcu *, cpufreq_update_util_data); | ||
11533 | @@ -57,3 +59,19 @@ void cpufreq_remove_update_util_hook(int cpu) | ||
11534 | rcu_assign_pointer(per_cpu(cpufreq_update_util_data, cpu), NULL); | ||
11535 | } | ||
11536 | EXPORT_SYMBOL_GPL(cpufreq_remove_update_util_hook); | ||
11537 | + | ||
11538 | +/** | ||
11539 | + * cpufreq_this_cpu_can_update - Check if cpufreq policy can be updated. | ||
11540 | + * @policy: cpufreq policy to check. | ||
11541 | + * | ||
11542 | + * Return 'true' if: | ||
11543 | + * - the local and remote CPUs share @policy, | ||
11544 | + * - dvfs_possible_from_any_cpu is set in @policy and the local CPU is not going | ||
11545 | + * offline (in which case it is not expected to run cpufreq updates any more). | ||
11546 | + */ | ||
11547 | +bool cpufreq_this_cpu_can_update(struct cpufreq_policy *policy) | ||
11548 | +{ | ||
11549 | + return cpumask_test_cpu(smp_processor_id(), policy->cpus) || | ||
11550 | + (policy->dvfs_possible_from_any_cpu && | ||
11551 | + rcu_dereference_sched(*this_cpu_ptr(&cpufreq_update_util_data))); | ||
11552 | +} | ||
11553 | diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c | ||
11554 | index 86800b4d5453..b6f56e7c8dd1 100644 | ||
11555 | --- a/kernel/sched/cpufreq_schedutil.c | ||
11556 | +++ b/kernel/sched/cpufreq_schedutil.c | ||
11557 | @@ -82,12 +82,10 @@ static bool sugov_should_update_freq(struct sugov_policy *sg_policy, u64 time) | ||
11558 | * by the hardware, as calculating the frequency is pointless if | ||
11559 | * we cannot in fact act on it. | ||
11560 | * | ||
11561 | - * For the slow switching platforms, the kthread is always scheduled on | ||
11562 | - * the right set of CPUs and any CPU can find the next frequency and | ||
11563 | - * schedule the kthread. | ||
11564 | + * This is needed on the slow switching platforms too to prevent CPUs | ||
11565 | + * going offline from leaving stale IRQ work items behind. | ||
11566 | */ | ||
11567 | - if (sg_policy->policy->fast_switch_enabled && | ||
11568 | - !cpufreq_this_cpu_can_update(sg_policy->policy)) | ||
11569 | + if (!cpufreq_this_cpu_can_update(sg_policy->policy)) | ||
11570 | return false; | ||
11571 | |||
11572 | if (unlikely(sg_policy->limits_changed)) { | ||
11573 | diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h | ||
11574 | index c8870c5bd7df..49ed949f850c 100644 | ||
11575 | --- a/kernel/sched/sched.h | ||
11576 | +++ b/kernel/sched/sched.h | ||
11577 | @@ -2309,7 +2309,7 @@ static inline void cpufreq_update_util(struct rq *rq, unsigned int flags) {} | ||
11578 | #endif /* CONFIG_CPU_FREQ */ | ||
11579 | |||
11580 | #ifdef CONFIG_UCLAMP_TASK | ||
11581 | -enum uclamp_id uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id); | ||
11582 | +unsigned int uclamp_eff_value(struct task_struct *p, enum uclamp_id clamp_id); | ||
11583 | |||
11584 | static __always_inline | ||
11585 | unsigned int uclamp_util_with(struct rq *rq, unsigned int util, | ||
11586 | diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c | ||
11587 | index 6a0ee9178365..2fa72419bbd7 100644 | ||
11588 | --- a/kernel/trace/trace.c | ||
11589 | +++ b/kernel/trace/trace.c | ||
11590 | @@ -4609,7 +4609,7 @@ int set_tracer_flag(struct trace_array *tr, unsigned int mask, int enabled) | ||
11591 | |||
11592 | if (mask == TRACE_ITER_RECORD_TGID) { | ||
11593 | if (!tgid_map) | ||
11594 | - tgid_map = kcalloc(PID_MAX_DEFAULT + 1, | ||
11595 | + tgid_map = kvcalloc(PID_MAX_DEFAULT + 1, | ||
11596 | sizeof(*tgid_map), | ||
11597 | GFP_KERNEL); | ||
11598 | if (!tgid_map) { | ||
11599 | diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c | ||
11600 | index 1552a95c743b..7f890262c8a3 100644 | ||
11601 | --- a/kernel/trace/trace_kprobe.c | ||
11602 | +++ b/kernel/trace/trace_kprobe.c | ||
11603 | @@ -435,11 +435,10 @@ static int disable_trace_kprobe(struct trace_event_call *call, | ||
11604 | |||
11605 | #if defined(CONFIG_KPROBES_ON_FTRACE) && \ | ||
11606 | !defined(CONFIG_KPROBE_EVENTS_ON_NOTRACE) | ||
11607 | -static bool within_notrace_func(struct trace_kprobe *tk) | ||
11608 | +static bool __within_notrace_func(unsigned long addr) | ||
11609 | { | ||
11610 | - unsigned long offset, size, addr; | ||
11611 | + unsigned long offset, size; | ||
11612 | |||
11613 | - addr = trace_kprobe_address(tk); | ||
11614 | if (!addr || !kallsyms_lookup_size_offset(addr, &size, &offset)) | ||
11615 | return false; | ||
11616 | |||
11617 | @@ -452,6 +451,28 @@ static bool within_notrace_func(struct trace_kprobe *tk) | ||
11618 | */ | ||
11619 | return !ftrace_location_range(addr, addr + size - 1); | ||
11620 | } | ||
11621 | + | ||
11622 | +static bool within_notrace_func(struct trace_kprobe *tk) | ||
11623 | +{ | ||
11624 | + unsigned long addr = addr = trace_kprobe_address(tk); | ||
11625 | + char symname[KSYM_NAME_LEN], *p; | ||
11626 | + | ||
11627 | + if (!__within_notrace_func(addr)) | ||
11628 | + return false; | ||
11629 | + | ||
11630 | + /* Check if the address is on a suffixed-symbol */ | ||
11631 | + if (!lookup_symbol_name(addr, symname)) { | ||
11632 | + p = strchr(symname, '.'); | ||
11633 | + if (!p) | ||
11634 | + return true; | ||
11635 | + *p = '\0'; | ||
11636 | + addr = (unsigned long)kprobe_lookup_name(symname, 0); | ||
11637 | + if (addr) | ||
11638 | + return __within_notrace_func(addr); | ||
11639 | + } | ||
11640 | + | ||
11641 | + return true; | ||
11642 | +} | ||
11643 | #else | ||
11644 | #define within_notrace_func(tk) (false) | ||
11645 | #endif | ||
11646 | diff --git a/lib/ubsan.c b/lib/ubsan.c | ||
11647 | index e7d31735950d..0c4681118fcd 100644 | ||
11648 | --- a/lib/ubsan.c | ||
11649 | +++ b/lib/ubsan.c | ||
11650 | @@ -374,9 +374,10 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, | ||
11651 | struct type_descriptor *lhs_type = data->lhs_type; | ||
11652 | char rhs_str[VALUE_LENGTH]; | ||
11653 | char lhs_str[VALUE_LENGTH]; | ||
11654 | + unsigned long ua_flags = user_access_save(); | ||
11655 | |||
11656 | if (suppress_report(&data->location)) | ||
11657 | - return; | ||
11658 | + goto out; | ||
11659 | |||
11660 | ubsan_prologue(&data->location, &flags); | ||
11661 | |||
11662 | @@ -402,6 +403,8 @@ void __ubsan_handle_shift_out_of_bounds(struct shift_out_of_bounds_data *data, | ||
11663 | lhs_type->type_name); | ||
11664 | |||
11665 | ubsan_epilogue(&flags); | ||
11666 | +out: | ||
11667 | + user_access_restore(ua_flags); | ||
11668 | } | ||
11669 | EXPORT_SYMBOL(__ubsan_handle_shift_out_of_bounds); | ||
11670 | |||
11671 | diff --git a/mm/vmscan.c b/mm/vmscan.c | ||
11672 | index ee4eecc7e1c2..e7f10c4b40f0 100644 | ||
11673 | --- a/mm/vmscan.c | ||
11674 | +++ b/mm/vmscan.c | ||
11675 | @@ -422,7 +422,7 @@ void register_shrinker_prepared(struct shrinker *shrinker) | ||
11676 | { | ||
11677 | down_write(&shrinker_rwsem); | ||
11678 | list_add_tail(&shrinker->list, &shrinker_list); | ||
11679 | -#ifdef CONFIG_MEMCG_KMEM | ||
11680 | +#ifdef CONFIG_MEMCG | ||
11681 | if (shrinker->flags & SHRINKER_MEMCG_AWARE) | ||
11682 | idr_replace(&shrinker_idr, shrinker, shrinker->id); | ||
11683 | #endif | ||
11684 | diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c | ||
11685 | index ad5b0ac1f9ce..7ff92dd4c53c 100644 | ||
11686 | --- a/net/bluetooth/hci_conn.c | ||
11687 | +++ b/net/bluetooth/hci_conn.c | ||
11688 | @@ -934,6 +934,14 @@ static void hci_req_directed_advertising(struct hci_request *req, | ||
11689 | return; | ||
11690 | |||
11691 | memset(&cp, 0, sizeof(cp)); | ||
11692 | + | ||
11693 | + /* Some controllers might reject command if intervals are not | ||
11694 | + * within range for undirected advertising. | ||
11695 | + * BCM20702A0 is known to be affected by this. | ||
11696 | + */ | ||
11697 | + cp.min_interval = cpu_to_le16(0x0020); | ||
11698 | + cp.max_interval = cpu_to_le16(0x0020); | ||
11699 | + | ||
11700 | cp.type = LE_ADV_DIRECT_IND; | ||
11701 | cp.own_address_type = own_addr_type; | ||
11702 | cp.direct_addr_type = conn->dst_type; | ||
11703 | diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c | ||
11704 | index 04bc79359a17..0cc9ce917222 100644 | ||
11705 | --- a/net/bluetooth/hci_core.c | ||
11706 | +++ b/net/bluetooth/hci_core.c | ||
11707 | @@ -842,8 +842,8 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt) | ||
11708 | if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) { | ||
11709 | struct hci_cp_le_write_def_data_len cp; | ||
11710 | |||
11711 | - cp.tx_len = hdev->le_max_tx_len; | ||
11712 | - cp.tx_time = hdev->le_max_tx_time; | ||
11713 | + cp.tx_len = cpu_to_le16(hdev->le_max_tx_len); | ||
11714 | + cp.tx_time = cpu_to_le16(hdev->le_max_tx_time); | ||
11715 | hci_req_add(req, HCI_OP_LE_WRITE_DEF_DATA_LEN, sizeof(cp), &cp); | ||
11716 | } | ||
11717 | |||
11718 | @@ -4440,7 +4440,14 @@ static void hci_rx_work(struct work_struct *work) | ||
11719 | hci_send_to_sock(hdev, skb); | ||
11720 | } | ||
11721 | |||
11722 | - if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL)) { | ||
11723 | + /* If the device has been opened in HCI_USER_CHANNEL, | ||
11724 | + * the userspace has exclusive access to device. | ||
11725 | + * When device is HCI_INIT, we still need to process | ||
11726 | + * the data packets to the driver in order | ||
11727 | + * to complete its setup(). | ||
11728 | + */ | ||
11729 | + if (hci_dev_test_flag(hdev, HCI_USER_CHANNEL) && | ||
11730 | + !test_bit(HCI_INIT, &hdev->flags)) { | ||
11731 | kfree_skb(skb); | ||
11732 | continue; | ||
11733 | } | ||
11734 | diff --git a/net/bluetooth/hci_request.c b/net/bluetooth/hci_request.c | ||
11735 | index 7f6a581b5b7e..3d25dbf10b26 100644 | ||
11736 | --- a/net/bluetooth/hci_request.c | ||
11737 | +++ b/net/bluetooth/hci_request.c | ||
11738 | @@ -1273,6 +1273,14 @@ static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) | ||
11739 | |||
11740 | instance_flags = get_adv_instance_flags(hdev, instance); | ||
11741 | |||
11742 | + /* If instance already has the flags set skip adding it once | ||
11743 | + * again. | ||
11744 | + */ | ||
11745 | + if (adv_instance && eir_get_data(adv_instance->adv_data, | ||
11746 | + adv_instance->adv_data_len, EIR_FLAGS, | ||
11747 | + NULL)) | ||
11748 | + goto skip_flags; | ||
11749 | + | ||
11750 | /* The Add Advertising command allows userspace to set both the general | ||
11751 | * and limited discoverable flags. | ||
11752 | */ | ||
11753 | @@ -1305,6 +1313,7 @@ static u8 create_instance_adv_data(struct hci_dev *hdev, u8 instance, u8 *ptr) | ||
11754 | } | ||
11755 | } | ||
11756 | |||
11757 | +skip_flags: | ||
11758 | if (adv_instance) { | ||
11759 | memcpy(ptr, adv_instance->adv_data, | ||
11760 | adv_instance->adv_data_len); | ||
11761 | diff --git a/net/can/j1939/socket.c b/net/can/j1939/socket.c | ||
11762 | index de09b0a65791..f7587428febd 100644 | ||
11763 | --- a/net/can/j1939/socket.c | ||
11764 | +++ b/net/can/j1939/socket.c | ||
11765 | @@ -423,9 +423,9 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr *uaddr, int len) | ||
11766 | { | ||
11767 | struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; | ||
11768 | struct j1939_sock *jsk = j1939_sk(sock->sk); | ||
11769 | - struct j1939_priv *priv = jsk->priv; | ||
11770 | - struct sock *sk = sock->sk; | ||
11771 | - struct net *net = sock_net(sk); | ||
11772 | + struct j1939_priv *priv; | ||
11773 | + struct sock *sk; | ||
11774 | + struct net *net; | ||
11775 | int ret = 0; | ||
11776 | |||
11777 | ret = j1939_sk_sanity_check(addr, len); | ||
11778 | @@ -434,6 +434,10 @@ static int j1939_sk_bind(struct socket *sock, struct sockaddr *uaddr, int len) | ||
11779 | |||
11780 | lock_sock(sock->sk); | ||
11781 | |||
11782 | + priv = jsk->priv; | ||
11783 | + sk = sock->sk; | ||
11784 | + net = sock_net(sk); | ||
11785 | + | ||
11786 | /* Already bound to an interface? */ | ||
11787 | if (jsk->state & J1939_SOCK_BOUND) { | ||
11788 | /* A re-bind() to a different interface is not | ||
11789 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c | ||
11790 | index 5480edff0c86..08ebc3ac5343 100644 | ||
11791 | --- a/net/core/neighbour.c | ||
11792 | +++ b/net/core/neighbour.c | ||
11793 | @@ -98,9 +98,6 @@ static int neigh_blackhole(struct neighbour *neigh, struct sk_buff *skb) | ||
11794 | |||
11795 | static void neigh_cleanup_and_release(struct neighbour *neigh) | ||
11796 | { | ||
11797 | - if (neigh->parms->neigh_cleanup) | ||
11798 | - neigh->parms->neigh_cleanup(neigh); | ||
11799 | - | ||
11800 | trace_neigh_cleanup_and_release(neigh, 0); | ||
11801 | __neigh_notify(neigh, RTM_DELNEIGH, 0, 0); | ||
11802 | call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, neigh); | ||
11803 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c | ||
11804 | index ae3bcb1540ec..b4db68e5caa9 100644 | ||
11805 | --- a/net/core/net-sysfs.c | ||
11806 | +++ b/net/core/net-sysfs.c | ||
11807 | @@ -919,14 +919,17 @@ static int rx_queue_add_kobject(struct net_device *dev, int index) | ||
11808 | struct kobject *kobj = &queue->kobj; | ||
11809 | int error = 0; | ||
11810 | |||
11811 | + /* Kobject_put later will trigger rx_queue_release call which | ||
11812 | + * decreases dev refcount: Take that reference here | ||
11813 | + */ | ||
11814 | + dev_hold(queue->dev); | ||
11815 | + | ||
11816 | kobj->kset = dev->queues_kset; | ||
11817 | error = kobject_init_and_add(kobj, &rx_queue_ktype, NULL, | ||
11818 | "rx-%u", index); | ||
11819 | if (error) | ||
11820 | goto err; | ||
11821 | |||
11822 | - dev_hold(queue->dev); | ||
11823 | - | ||
11824 | if (dev->sysfs_rx_queue_group) { | ||
11825 | error = sysfs_create_group(kobj, dev->sysfs_rx_queue_group); | ||
11826 | if (error) | ||
11827 | diff --git a/net/mac80211/status.c b/net/mac80211/status.c | ||
11828 | index ab8ba5835ca0..5a3d645fe1bc 100644 | ||
11829 | --- a/net/mac80211/status.c | ||
11830 | +++ b/net/mac80211/status.c | ||
11831 | @@ -1030,7 +1030,8 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw, | ||
11832 | I802_DEBUG_INC(local->dot11FailedCount); | ||
11833 | } | ||
11834 | |||
11835 | - if (ieee80211_is_nullfunc(fc) && ieee80211_has_pm(fc) && | ||
11836 | + if ((ieee80211_is_nullfunc(fc) || ieee80211_is_qos_nullfunc(fc)) && | ||
11837 | + ieee80211_has_pm(fc) && | ||
11838 | ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) && | ||
11839 | !(info->flags & IEEE80211_TX_CTL_INJECTED) && | ||
11840 | local->ps_sdata && !(local->scanning)) { | ||
11841 | diff --git a/net/nfc/nci/uart.c b/net/nfc/nci/uart.c | ||
11842 | index 78fe622eba65..11b554ce07ff 100644 | ||
11843 | --- a/net/nfc/nci/uart.c | ||
11844 | +++ b/net/nfc/nci/uart.c | ||
11845 | @@ -346,7 +346,7 @@ static int nci_uart_default_recv_buf(struct nci_uart *nu, const u8 *data, | ||
11846 | nu->rx_packet_len = -1; | ||
11847 | nu->rx_skb = nci_skb_alloc(nu->ndev, | ||
11848 | NCI_MAX_PACKET_SIZE, | ||
11849 | - GFP_KERNEL); | ||
11850 | + GFP_ATOMIC); | ||
11851 | if (!nu->rx_skb) | ||
11852 | return -ENOMEM; | ||
11853 | } | ||
11854 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
11855 | index 82a50e850245..529d4ce945db 100644 | ||
11856 | --- a/net/packet/af_packet.c | ||
11857 | +++ b/net/packet/af_packet.c | ||
11858 | @@ -544,7 +544,8 @@ static int prb_calc_retire_blk_tmo(struct packet_sock *po, | ||
11859 | msec = 1; | ||
11860 | div = ecmd.base.speed / 1000; | ||
11861 | } | ||
11862 | - } | ||
11863 | + } else | ||
11864 | + return DEFAULT_PRB_RETIRE_TOV; | ||
11865 | |||
11866 | mbits = (blk_size_in_bytes * 8) / (1024 * 1024); | ||
11867 | |||
11868 | diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c | ||
11869 | index 08d14d86ecfb..681ffb3545db 100644 | ||
11870 | --- a/net/sctp/protocol.c | ||
11871 | +++ b/net/sctp/protocol.c | ||
11872 | @@ -227,6 +227,7 @@ static void sctp_v4_from_skb(union sctp_addr *addr, struct sk_buff *skb, | ||
11873 | sa->sin_port = sh->dest; | ||
11874 | sa->sin_addr.s_addr = ip_hdr(skb)->daddr; | ||
11875 | } | ||
11876 | + memset(sa->sin_zero, 0, sizeof(sa->sin_zero)); | ||
11877 | } | ||
11878 | |||
11879 | /* Initialize an sctp_addr from a socket. */ | ||
11880 | @@ -235,6 +236,7 @@ static void sctp_v4_from_sk(union sctp_addr *addr, struct sock *sk) | ||
11881 | addr->v4.sin_family = AF_INET; | ||
11882 | addr->v4.sin_port = 0; | ||
11883 | addr->v4.sin_addr.s_addr = inet_sk(sk)->inet_rcv_saddr; | ||
11884 | + memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); | ||
11885 | } | ||
11886 | |||
11887 | /* Initialize sk->sk_rcv_saddr from sctp_addr. */ | ||
11888 | @@ -257,6 +259,7 @@ static void sctp_v4_from_addr_param(union sctp_addr *addr, | ||
11889 | addr->v4.sin_family = AF_INET; | ||
11890 | addr->v4.sin_port = port; | ||
11891 | addr->v4.sin_addr.s_addr = param->v4.addr.s_addr; | ||
11892 | + memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); | ||
11893 | } | ||
11894 | |||
11895 | /* Initialize an address parameter from a sctp_addr and return the length | ||
11896 | @@ -281,6 +284,7 @@ static void sctp_v4_dst_saddr(union sctp_addr *saddr, struct flowi4 *fl4, | ||
11897 | saddr->v4.sin_family = AF_INET; | ||
11898 | saddr->v4.sin_port = port; | ||
11899 | saddr->v4.sin_addr.s_addr = fl4->saddr; | ||
11900 | + memset(saddr->v4.sin_zero, 0, sizeof(saddr->v4.sin_zero)); | ||
11901 | } | ||
11902 | |||
11903 | /* Compare two addresses exactly. */ | ||
11904 | @@ -303,6 +307,7 @@ static void sctp_v4_inaddr_any(union sctp_addr *addr, __be16 port) | ||
11905 | addr->v4.sin_family = AF_INET; | ||
11906 | addr->v4.sin_addr.s_addr = htonl(INADDR_ANY); | ||
11907 | addr->v4.sin_port = port; | ||
11908 | + memset(addr->v4.sin_zero, 0, sizeof(addr->v4.sin_zero)); | ||
11909 | } | ||
11910 | |||
11911 | /* Is this a wildcard address? */ | ||
11912 | diff --git a/net/sctp/stream.c b/net/sctp/stream.c | ||
11913 | index e83cdaa2ab76..6a30392068a0 100644 | ||
11914 | --- a/net/sctp/stream.c | ||
11915 | +++ b/net/sctp/stream.c | ||
11916 | @@ -84,8 +84,10 @@ static int sctp_stream_alloc_out(struct sctp_stream *stream, __u16 outcnt, | ||
11917 | return 0; | ||
11918 | |||
11919 | ret = genradix_prealloc(&stream->out, outcnt, gfp); | ||
11920 | - if (ret) | ||
11921 | + if (ret) { | ||
11922 | + genradix_free(&stream->out); | ||
11923 | return ret; | ||
11924 | + } | ||
11925 | |||
11926 | stream->outcnt = outcnt; | ||
11927 | return 0; | ||
11928 | @@ -100,8 +102,10 @@ static int sctp_stream_alloc_in(struct sctp_stream *stream, __u16 incnt, | ||
11929 | return 0; | ||
11930 | |||
11931 | ret = genradix_prealloc(&stream->in, incnt, gfp); | ||
11932 | - if (ret) | ||
11933 | + if (ret) { | ||
11934 | + genradix_free(&stream->in); | ||
11935 | return ret; | ||
11936 | + } | ||
11937 | |||
11938 | stream->incnt = incnt; | ||
11939 | return 0; | ||
11940 | diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c | ||
11941 | index 2ba97ff325a5..0c5fcb8ed404 100644 | ||
11942 | --- a/net/smc/smc_core.c | ||
11943 | +++ b/net/smc/smc_core.c | ||
11944 | @@ -231,10 +231,12 @@ static int smc_lgr_create(struct smc_sock *smc, struct smc_init_info *ini) | ||
11945 | lgr->conns_all = RB_ROOT; | ||
11946 | if (ini->is_smcd) { | ||
11947 | /* SMC-D specific settings */ | ||
11948 | + get_device(&ini->ism_dev->dev); | ||
11949 | lgr->peer_gid = ini->ism_gid; | ||
11950 | lgr->smcd = ini->ism_dev; | ||
11951 | } else { | ||
11952 | /* SMC-R specific settings */ | ||
11953 | + get_device(&ini->ib_dev->ibdev->dev); | ||
11954 | lgr->role = smc->listen_smc ? SMC_SERV : SMC_CLNT; | ||
11955 | memcpy(lgr->peer_systemid, ini->ib_lcl->id_for_peer, | ||
11956 | SMC_SYSTEMID_LEN); | ||
11957 | @@ -433,10 +435,13 @@ static void smc_lgr_free_bufs(struct smc_link_group *lgr) | ||
11958 | static void smc_lgr_free(struct smc_link_group *lgr) | ||
11959 | { | ||
11960 | smc_lgr_free_bufs(lgr); | ||
11961 | - if (lgr->is_smcd) | ||
11962 | + if (lgr->is_smcd) { | ||
11963 | smc_ism_put_vlan(lgr->smcd, lgr->vlan_id); | ||
11964 | - else | ||
11965 | + put_device(&lgr->smcd->dev); | ||
11966 | + } else { | ||
11967 | smc_link_clear(&lgr->lnk[SMC_SINGLE_LINK]); | ||
11968 | + put_device(&lgr->lnk[SMC_SINGLE_LINK].smcibdev->ibdev->dev); | ||
11969 | + } | ||
11970 | kfree(lgr); | ||
11971 | } | ||
11972 | |||
11973 | diff --git a/samples/pktgen/functions.sh b/samples/pktgen/functions.sh | ||
11974 | index 4af4046d71be..40873a5d1461 100644 | ||
11975 | --- a/samples/pktgen/functions.sh | ||
11976 | +++ b/samples/pktgen/functions.sh | ||
11977 | @@ -5,6 +5,8 @@ | ||
11978 | # Author: Jesper Dangaaard Brouer | ||
11979 | # License: GPL | ||
11980 | |||
11981 | +set -o errexit | ||
11982 | + | ||
11983 | ## -- General shell logging cmds -- | ||
11984 | function err() { | ||
11985 | local exitcode=$1 | ||
11986 | @@ -58,6 +60,7 @@ function pg_set() { | ||
11987 | function proc_cmd() { | ||
11988 | local result | ||
11989 | local proc_file=$1 | ||
11990 | + local status=0 | ||
11991 | # after shift, the remaining args are contained in $@ | ||
11992 | shift | ||
11993 | local proc_ctrl=${PROC_DIR}/$proc_file | ||
11994 | @@ -73,13 +76,13 @@ function proc_cmd() { | ||
11995 | echo "cmd: $@ > $proc_ctrl" | ||
11996 | fi | ||
11997 | # Quoting of "$@" is important for space expansion | ||
11998 | - echo "$@" > "$proc_ctrl" | ||
11999 | - local status=$? | ||
12000 | + echo "$@" > "$proc_ctrl" || status=$? | ||
12001 | |||
12002 | - result=$(grep "Result: OK:" $proc_ctrl) | ||
12003 | - # Due to pgctrl, cannot use exit code $? from grep | ||
12004 | - if [[ "$result" == "" ]]; then | ||
12005 | - grep "Result:" $proc_ctrl >&2 | ||
12006 | + if [[ "$proc_file" != "pgctrl" ]]; then | ||
12007 | + result=$(grep "Result: OK:" $proc_ctrl) || true | ||
12008 | + if [[ "$result" == "" ]]; then | ||
12009 | + grep "Result:" $proc_ctrl >&2 | ||
12010 | + fi | ||
12011 | fi | ||
12012 | if (( $status != 0 )); then | ||
12013 | err 5 "Write error($status) occurred cmd: \"$@ > $proc_ctrl\"" | ||
12014 | @@ -105,6 +108,8 @@ function pgset() { | ||
12015 | fi | ||
12016 | } | ||
12017 | |||
12018 | +[[ $EUID -eq 0 ]] && trap 'pg_ctrl "reset"' EXIT | ||
12019 | + | ||
12020 | ## -- General shell tricks -- | ||
12021 | |||
12022 | function root_check_run_with_sudo() { | ||
12023 | diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c | ||
12024 | index 91c6ad58729f..d4280568a41e 100644 | ||
12025 | --- a/sound/core/pcm_native.c | ||
12026 | +++ b/sound/core/pcm_native.c | ||
12027 | @@ -222,7 +222,8 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream) | ||
12028 | return false; | ||
12029 | |||
12030 | if (substream->ops->mmap || | ||
12031 | - substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_DEV) | ||
12032 | + (substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_DEV && | ||
12033 | + substream->dma_buffer.dev.type != SNDRV_DMA_TYPE_DEV_UC)) | ||
12034 | return true; | ||
12035 | |||
12036 | return dma_can_mmap(substream->dma_buffer.dev.dev); | ||
12037 | @@ -705,6 +706,10 @@ static int snd_pcm_hw_params(struct snd_pcm_substream *substream, | ||
12038 | while (runtime->boundary * 2 <= LONG_MAX - runtime->buffer_size) | ||
12039 | runtime->boundary *= 2; | ||
12040 | |||
12041 | + /* clear the buffer for avoiding possible kernel info leaks */ | ||
12042 | + if (runtime->dma_area && !substream->ops->copy_user) | ||
12043 | + memset(runtime->dma_area, 0, runtime->dma_bytes); | ||
12044 | + | ||
12045 | snd_pcm_timer_resolution_change(substream); | ||
12046 | snd_pcm_set_state(substream, SNDRV_PCM_STATE_SETUP); | ||
12047 | |||
12048 | diff --git a/sound/core/timer.c b/sound/core/timer.c | ||
12049 | index 59ae21b0bb93..013f0e69ff0f 100644 | ||
12050 | --- a/sound/core/timer.c | ||
12051 | +++ b/sound/core/timer.c | ||
12052 | @@ -74,6 +74,9 @@ static LIST_HEAD(snd_timer_slave_list); | ||
12053 | /* lock for slave active lists */ | ||
12054 | static DEFINE_SPINLOCK(slave_active_lock); | ||
12055 | |||
12056 | +#define MAX_SLAVE_INSTANCES 1000 | ||
12057 | +static int num_slaves; | ||
12058 | + | ||
12059 | static DEFINE_MUTEX(register_mutex); | ||
12060 | |||
12061 | static int snd_timer_free(struct snd_timer *timer); | ||
12062 | @@ -252,6 +255,10 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
12063 | err = -EINVAL; | ||
12064 | goto unlock; | ||
12065 | } | ||
12066 | + if (num_slaves >= MAX_SLAVE_INSTANCES) { | ||
12067 | + err = -EBUSY; | ||
12068 | + goto unlock; | ||
12069 | + } | ||
12070 | timeri = snd_timer_instance_new(owner, NULL); | ||
12071 | if (!timeri) { | ||
12072 | err = -ENOMEM; | ||
12073 | @@ -261,6 +268,7 @@ int snd_timer_open(struct snd_timer_instance **ti, | ||
12074 | timeri->slave_id = tid->device; | ||
12075 | timeri->flags |= SNDRV_TIMER_IFLG_SLAVE; | ||
12076 | list_add_tail(&timeri->open_list, &snd_timer_slave_list); | ||
12077 | + num_slaves++; | ||
12078 | err = snd_timer_check_slave(timeri); | ||
12079 | if (err < 0) { | ||
12080 | snd_timer_close_locked(timeri, &card_dev_to_put); | ||
12081 | @@ -356,6 +364,8 @@ static int snd_timer_close_locked(struct snd_timer_instance *timeri, | ||
12082 | } | ||
12083 | |||
12084 | list_del(&timeri->open_list); | ||
12085 | + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) | ||
12086 | + num_slaves--; | ||
12087 | |||
12088 | /* force to stop the timer */ | ||
12089 | snd_timer_stop(timeri); | ||
12090 | diff --git a/sound/firewire/bebob/bebob_stream.c b/sound/firewire/bebob/bebob_stream.c | ||
12091 | index 6c1497d9f52b..ce07ea0d4e71 100644 | ||
12092 | --- a/sound/firewire/bebob/bebob_stream.c | ||
12093 | +++ b/sound/firewire/bebob/bebob_stream.c | ||
12094 | @@ -415,15 +415,16 @@ static int make_both_connections(struct snd_bebob *bebob) | ||
12095 | return 0; | ||
12096 | } | ||
12097 | |||
12098 | -static void | ||
12099 | -break_both_connections(struct snd_bebob *bebob) | ||
12100 | +static void break_both_connections(struct snd_bebob *bebob) | ||
12101 | { | ||
12102 | cmp_connection_break(&bebob->in_conn); | ||
12103 | cmp_connection_break(&bebob->out_conn); | ||
12104 | |||
12105 | - /* These models seems to be in transition state for a longer time. */ | ||
12106 | - if (bebob->maudio_special_quirk != NULL) | ||
12107 | - msleep(200); | ||
12108 | + // These models seem to be in transition state for a longer time. When | ||
12109 | + // accessing in the state, any transactions is corrupted. In the worst | ||
12110 | + // case, the device is going to reboot. | ||
12111 | + if (bebob->version < 2) | ||
12112 | + msleep(600); | ||
12113 | } | ||
12114 | |||
12115 | static int | ||
12116 | diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c | ||
12117 | index b7a1abb3e231..32ed46464af7 100644 | ||
12118 | --- a/sound/pci/hda/patch_ca0132.c | ||
12119 | +++ b/sound/pci/hda/patch_ca0132.c | ||
12120 | @@ -1809,13 +1809,14 @@ struct scp_msg { | ||
12121 | |||
12122 | static void dspio_clear_response_queue(struct hda_codec *codec) | ||
12123 | { | ||
12124 | + unsigned long timeout = jiffies + msecs_to_jiffies(1000); | ||
12125 | unsigned int dummy = 0; | ||
12126 | - int status = -1; | ||
12127 | + int status; | ||
12128 | |||
12129 | /* clear all from the response queue */ | ||
12130 | do { | ||
12131 | status = dspio_read(codec, &dummy); | ||
12132 | - } while (status == 0); | ||
12133 | + } while (status == 0 && time_before(jiffies, timeout)); | ||
12134 | } | ||
12135 | |||
12136 | static int dspio_get_response_data(struct hda_codec *codec) | ||
12137 | @@ -7588,12 +7589,14 @@ static void ca0132_process_dsp_response(struct hda_codec *codec, | ||
12138 | struct ca0132_spec *spec = codec->spec; | ||
12139 | |||
12140 | codec_dbg(codec, "ca0132_process_dsp_response\n"); | ||
12141 | + snd_hda_power_up_pm(codec); | ||
12142 | if (spec->wait_scp) { | ||
12143 | if (dspio_get_response_data(codec) >= 0) | ||
12144 | spec->wait_scp = 0; | ||
12145 | } | ||
12146 | |||
12147 | dspio_clear_response_queue(codec); | ||
12148 | + snd_hda_power_down_pm(codec); | ||
12149 | } | ||
12150 | |||
12151 | static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb) | ||
12152 | @@ -7604,11 +7607,10 @@ static void hp_callback(struct hda_codec *codec, struct hda_jack_callback *cb) | ||
12153 | /* Delay enabling the HP amp, to let the mic-detection | ||
12154 | * state machine run. | ||
12155 | */ | ||
12156 | - cancel_delayed_work(&spec->unsol_hp_work); | ||
12157 | - schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500)); | ||
12158 | tbl = snd_hda_jack_tbl_get(codec, cb->nid); | ||
12159 | if (tbl) | ||
12160 | tbl->block_report = 1; | ||
12161 | + schedule_delayed_work(&spec->unsol_hp_work, msecs_to_jiffies(500)); | ||
12162 | } | ||
12163 | |||
12164 | static void amic_callback(struct hda_codec *codec, struct hda_jack_callback *cb) | ||
12165 | @@ -8454,12 +8456,25 @@ static void ca0132_reboot_notify(struct hda_codec *codec) | ||
12166 | codec->patch_ops.free(codec); | ||
12167 | } | ||
12168 | |||
12169 | +#ifdef CONFIG_PM | ||
12170 | +static int ca0132_suspend(struct hda_codec *codec) | ||
12171 | +{ | ||
12172 | + struct ca0132_spec *spec = codec->spec; | ||
12173 | + | ||
12174 | + cancel_delayed_work_sync(&spec->unsol_hp_work); | ||
12175 | + return 0; | ||
12176 | +} | ||
12177 | +#endif | ||
12178 | + | ||
12179 | static const struct hda_codec_ops ca0132_patch_ops = { | ||
12180 | .build_controls = ca0132_build_controls, | ||
12181 | .build_pcms = ca0132_build_pcms, | ||
12182 | .init = ca0132_init, | ||
12183 | .free = ca0132_free, | ||
12184 | .unsol_event = snd_hda_jack_unsol_event, | ||
12185 | +#ifdef CONFIG_PM | ||
12186 | + .suspend = ca0132_suspend, | ||
12187 | +#endif | ||
12188 | .reboot_notify = ca0132_reboot_notify, | ||
12189 | }; | ||
12190 | |||
12191 | diff --git a/sound/soc/codecs/rt5677.c b/sound/soc/codecs/rt5677.c | ||
12192 | index 315a3d39bc09..8bc9450da79c 100644 | ||
12193 | --- a/sound/soc/codecs/rt5677.c | ||
12194 | +++ b/sound/soc/codecs/rt5677.c | ||
12195 | @@ -298,6 +298,7 @@ static bool rt5677_volatile_register(struct device *dev, unsigned int reg) | ||
12196 | case RT5677_I2C_MASTER_CTRL7: | ||
12197 | case RT5677_I2C_MASTER_CTRL8: | ||
12198 | case RT5677_HAP_GENE_CTRL2: | ||
12199 | + case RT5677_PWR_ANLG2: /* Modified by DSP firmware */ | ||
12200 | case RT5677_PWR_DSP_ST: | ||
12201 | case RT5677_PRIV_DATA: | ||
12202 | case RT5677_ASRC_22: | ||
12203 | diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c | ||
12204 | index cf64e109c658..7b087d94141b 100644 | ||
12205 | --- a/sound/soc/codecs/wm2200.c | ||
12206 | +++ b/sound/soc/codecs/wm2200.c | ||
12207 | @@ -2410,6 +2410,8 @@ static int wm2200_i2c_probe(struct i2c_client *i2c, | ||
12208 | |||
12209 | err_pm_runtime: | ||
12210 | pm_runtime_disable(&i2c->dev); | ||
12211 | + if (i2c->irq) | ||
12212 | + free_irq(i2c->irq, wm2200); | ||
12213 | err_reset: | ||
12214 | if (wm2200->pdata.reset) | ||
12215 | gpio_set_value_cansleep(wm2200->pdata.reset, 0); | ||
12216 | @@ -2426,12 +2428,15 @@ static int wm2200_i2c_remove(struct i2c_client *i2c) | ||
12217 | { | ||
12218 | struct wm2200_priv *wm2200 = i2c_get_clientdata(i2c); | ||
12219 | |||
12220 | + pm_runtime_disable(&i2c->dev); | ||
12221 | if (i2c->irq) | ||
12222 | free_irq(i2c->irq, wm2200); | ||
12223 | if (wm2200->pdata.reset) | ||
12224 | gpio_set_value_cansleep(wm2200->pdata.reset, 0); | ||
12225 | if (wm2200->pdata.ldo_ena) | ||
12226 | gpio_set_value_cansleep(wm2200->pdata.ldo_ena, 0); | ||
12227 | + regulator_bulk_disable(ARRAY_SIZE(wm2200->core_supplies), | ||
12228 | + wm2200->core_supplies); | ||
12229 | |||
12230 | return 0; | ||
12231 | } | ||
12232 | diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c | ||
12233 | index 4af0e519e623..91cc63c5a51f 100644 | ||
12234 | --- a/sound/soc/codecs/wm5100.c | ||
12235 | +++ b/sound/soc/codecs/wm5100.c | ||
12236 | @@ -2617,6 +2617,7 @@ static int wm5100_i2c_probe(struct i2c_client *i2c, | ||
12237 | return ret; | ||
12238 | |||
12239 | err_reset: | ||
12240 | + pm_runtime_disable(&i2c->dev); | ||
12241 | if (i2c->irq) | ||
12242 | free_irq(i2c->irq, wm5100); | ||
12243 | wm5100_free_gpio(i2c); | ||
12244 | @@ -2640,6 +2641,7 @@ static int wm5100_i2c_remove(struct i2c_client *i2c) | ||
12245 | { | ||
12246 | struct wm5100_priv *wm5100 = i2c_get_clientdata(i2c); | ||
12247 | |||
12248 | + pm_runtime_disable(&i2c->dev); | ||
12249 | if (i2c->irq) | ||
12250 | free_irq(i2c->irq, wm5100); | ||
12251 | wm5100_free_gpio(i2c); | ||
12252 | diff --git a/sound/soc/codecs/wm8904.c b/sound/soc/codecs/wm8904.c | ||
12253 | index bcb3c9d5abf0..9e8c564f6e9c 100644 | ||
12254 | --- a/sound/soc/codecs/wm8904.c | ||
12255 | +++ b/sound/soc/codecs/wm8904.c | ||
12256 | @@ -1917,6 +1917,7 @@ static int wm8904_set_bias_level(struct snd_soc_component *component, | ||
12257 | snd_soc_component_update_bits(component, WM8904_BIAS_CONTROL_0, | ||
12258 | WM8904_BIAS_ENA, 0); | ||
12259 | |||
12260 | + snd_soc_component_write(component, WM8904_SW_RESET_AND_ID, 0); | ||
12261 | regcache_cache_only(wm8904->regmap, true); | ||
12262 | regcache_mark_dirty(wm8904->regmap); | ||
12263 | |||
12264 | diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c | ||
12265 | index 9c1aa4ec9cba..dd2b5ad08659 100644 | ||
12266 | --- a/sound/soc/intel/boards/bytcr_rt5640.c | ||
12267 | +++ b/sound/soc/intel/boards/bytcr_rt5640.c | ||
12268 | @@ -405,10 +405,12 @@ static const struct dmi_system_id byt_rt5640_quirk_table[] = { | ||
12269 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
12270 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire SW5-012"), | ||
12271 | }, | ||
12272 | - .driver_data = (void *)(BYT_RT5640_IN1_MAP | | ||
12273 | - BYT_RT5640_MCLK_EN | | ||
12274 | - BYT_RT5640_SSP0_AIF1), | ||
12275 | - | ||
12276 | + .driver_data = (void *)(BYT_RT5640_DMIC1_MAP | | ||
12277 | + BYT_RT5640_JD_SRC_JD2_IN4N | | ||
12278 | + BYT_RT5640_OVCD_TH_2000UA | | ||
12279 | + BYT_RT5640_OVCD_SF_0P75 | | ||
12280 | + BYT_RT5640_SSP0_AIF1 | | ||
12281 | + BYT_RT5640_MCLK_EN), | ||
12282 | }, | ||
12283 | { | ||
12284 | .matches = { | ||
12285 | diff --git a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c | ||
12286 | index 74dda8784f1a..67b276a65a8d 100644 | ||
12287 | --- a/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c | ||
12288 | +++ b/sound/soc/intel/boards/kbl_rt5663_rt5514_max98927.c | ||
12289 | @@ -400,6 +400,9 @@ static int kabylake_dmic_startup(struct snd_pcm_substream *substream) | ||
12290 | snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, | ||
12291 | dmic_constraints); | ||
12292 | |||
12293 | + runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; | ||
12294 | + snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16); | ||
12295 | + | ||
12296 | return snd_pcm_hw_constraint_list(substream->runtime, 0, | ||
12297 | SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); | ||
12298 | } | ||
12299 | diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c | ||
12300 | index b600d3eaaf5c..a6e96cf1d8ff 100644 | ||
12301 | --- a/sound/soc/soc-pcm.c | ||
12302 | +++ b/sound/soc/soc-pcm.c | ||
12303 | @@ -877,6 +877,11 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, | ||
12304 | int i, ret = 0; | ||
12305 | |||
12306 | mutex_lock_nested(&rtd->card->pcm_mutex, rtd->card->pcm_subclass); | ||
12307 | + | ||
12308 | + ret = soc_pcm_params_symmetry(substream, params); | ||
12309 | + if (ret) | ||
12310 | + goto out; | ||
12311 | + | ||
12312 | if (rtd->dai_link->ops->hw_params) { | ||
12313 | ret = rtd->dai_link->ops->hw_params(substream, params); | ||
12314 | if (ret < 0) { | ||
12315 | @@ -958,9 +963,6 @@ static int soc_pcm_hw_params(struct snd_pcm_substream *substream, | ||
12316 | } | ||
12317 | component = NULL; | ||
12318 | |||
12319 | - ret = soc_pcm_params_symmetry(substream, params); | ||
12320 | - if (ret) | ||
12321 | - goto component_err; | ||
12322 | out: | ||
12323 | mutex_unlock(&rtd->card->pcm_mutex); | ||
12324 | return ret; | ||
12325 | @@ -1385,6 +1387,7 @@ static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream, | ||
12326 | struct snd_soc_dapm_widget *widget; | ||
12327 | struct snd_soc_dai *dai; | ||
12328 | int prune = 0; | ||
12329 | + int do_prune; | ||
12330 | |||
12331 | /* Destroy any old FE <--> BE connections */ | ||
12332 | for_each_dpcm_be(fe, stream, dpcm) { | ||
12333 | @@ -1398,13 +1401,16 @@ static int dpcm_prune_paths(struct snd_soc_pcm_runtime *fe, int stream, | ||
12334 | continue; | ||
12335 | |||
12336 | /* is there a valid CODEC DAI widget for this BE */ | ||
12337 | + do_prune = 1; | ||
12338 | for_each_rtd_codec_dai(dpcm->be, i, dai) { | ||
12339 | widget = dai_get_widget(dai, stream); | ||
12340 | |||
12341 | /* prune the BE if it's no longer in our active list */ | ||
12342 | if (widget && widget_in_list(list, widget)) | ||
12343 | - continue; | ||
12344 | + do_prune = 0; | ||
12345 | } | ||
12346 | + if (!do_prune) | ||
12347 | + continue; | ||
12348 | |||
12349 | dev_dbg(fe->dev, "ASoC: pruning %s BE %s for %s\n", | ||
12350 | stream ? "capture" : "playback", | ||
12351 | diff --git a/sound/soc/sof/imx/Kconfig b/sound/soc/sof/imx/Kconfig | ||
12352 | index 5acae75f5750..71f318bc2c74 100644 | ||
12353 | --- a/sound/soc/sof/imx/Kconfig | ||
12354 | +++ b/sound/soc/sof/imx/Kconfig | ||
12355 | @@ -11,8 +11,8 @@ config SND_SOC_SOF_IMX_TOPLEVEL | ||
12356 | |||
12357 | if SND_SOC_SOF_IMX_TOPLEVEL | ||
12358 | |||
12359 | -config SND_SOC_SOF_IMX8 | ||
12360 | - tristate "SOF support for i.MX8" | ||
12361 | +config SND_SOC_SOF_IMX8_SUPPORT | ||
12362 | + bool "SOF support for i.MX8" | ||
12363 | depends on IMX_SCU | ||
12364 | depends on IMX_DSP | ||
12365 | help | ||
12366 | @@ -20,4 +20,8 @@ config SND_SOC_SOF_IMX8 | ||
12367 | Say Y if you have such a device. | ||
12368 | If unsure select "N". | ||
12369 | |||
12370 | +config SND_SOC_SOF_IMX8 | ||
12371 | + def_tristate SND_SOC_SOF_OF | ||
12372 | + depends on SND_SOC_SOF_IMX8_SUPPORT | ||
12373 | + | ||
12374 | endif ## SND_SOC_SOF_IMX_IMX_TOPLEVEL | ||
12375 | diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c | ||
12376 | index 06e84679087b..5a5163eef2ef 100644 | ||
12377 | --- a/sound/soc/sof/intel/hda.c | ||
12378 | +++ b/sound/soc/sof/intel/hda.c | ||
12379 | @@ -268,6 +268,7 @@ static int hda_init(struct snd_sof_dev *sdev) | ||
12380 | |||
12381 | bus->use_posbuf = 1; | ||
12382 | bus->bdl_pos_adj = 0; | ||
12383 | + bus->sync_write = 1; | ||
12384 | |||
12385 | mutex_init(&hbus->prepare_mutex); | ||
12386 | hbus->pci = pci; | ||
12387 | diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c | ||
12388 | index 4452594c2e17..fa299e078156 100644 | ||
12389 | --- a/sound/soc/sof/topology.c | ||
12390 | +++ b/sound/soc/sof/topology.c | ||
12391 | @@ -2828,6 +2828,10 @@ static int sof_link_load(struct snd_soc_component *scomp, int index, | ||
12392 | if (!link->no_pcm) { | ||
12393 | link->nonatomic = true; | ||
12394 | |||
12395 | + /* set trigger order */ | ||
12396 | + link->trigger[0] = SND_SOC_DPCM_TRIGGER_POST; | ||
12397 | + link->trigger[1] = SND_SOC_DPCM_TRIGGER_POST; | ||
12398 | + | ||
12399 | /* nothing more to do for FE dai links */ | ||
12400 | return 0; | ||
12401 | } | ||
12402 | diff --git a/tools/arch/x86/lib/x86-opcode-map.txt b/tools/arch/x86/lib/x86-opcode-map.txt | ||
12403 | index e0b85930dd77..0a0e9112f284 100644 | ||
12404 | --- a/tools/arch/x86/lib/x86-opcode-map.txt | ||
12405 | +++ b/tools/arch/x86/lib/x86-opcode-map.txt | ||
12406 | @@ -333,7 +333,7 @@ AVXcode: 1 | ||
12407 | 06: CLTS | ||
12408 | 07: SYSRET (o64) | ||
12409 | 08: INVD | ||
12410 | -09: WBINVD | ||
12411 | +09: WBINVD | WBNOINVD (F3) | ||
12412 | 0a: | ||
12413 | 0b: UD2 (1B) | ||
12414 | 0c: | ||
12415 | @@ -364,7 +364,7 @@ AVXcode: 1 | ||
12416 | # a ModR/M byte. | ||
12417 | 1a: BNDCL Gv,Ev (F3) | BNDCU Gv,Ev (F2) | BNDMOV Gv,Ev (66) | BNDLDX Gv,Ev | ||
12418 | 1b: BNDCN Gv,Ev (F2) | BNDMOV Ev,Gv (66) | BNDMK Gv,Ev (F3) | BNDSTX Ev,Gv | ||
12419 | -1c: | ||
12420 | +1c: Grp20 (1A),(1C) | ||
12421 | 1d: | ||
12422 | 1e: | ||
12423 | 1f: NOP Ev | ||
12424 | @@ -792,6 +792,8 @@ f3: Grp17 (1A) | ||
12425 | f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v) | ||
12426 | f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v) | ||
12427 | f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v) | ||
12428 | +f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3) | ||
12429 | +f9: MOVDIRI My,Gy | ||
12430 | EndTable | ||
12431 | |||
12432 | Table: 3-byte opcode 2 (0x0f 0x3a) | ||
12433 | @@ -943,9 +945,9 @@ GrpTable: Grp6 | ||
12434 | EndTable | ||
12435 | |||
12436 | GrpTable: Grp7 | ||
12437 | -0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | ||
12438 | -1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ||
12439 | -2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ||
12440 | +0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B) | ||
12441 | +1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B) | ||
12442 | +2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B) | ||
12443 | 3: LIDT Ms | ||
12444 | 4: SMSW Mw/Rv | ||
12445 | 5: rdpkru (110),(11B) | wrpkru (111),(11B) | ||
12446 | @@ -1020,7 +1022,7 @@ GrpTable: Grp15 | ||
12447 | 3: vstmxcsr Md (v1) | WRGSBASE Ry (F3),(11B) | ||
12448 | 4: XSAVE | ptwrite Ey (F3),(11B) | ||
12449 | 5: XRSTOR | lfence (11B) | ||
12450 | -6: XSAVEOPT | clwb (66) | mfence (11B) | ||
12451 | +6: XSAVEOPT | clwb (66) | mfence (11B) | TPAUSE Rd (66),(11B) | UMONITOR Rv (F3),(11B) | UMWAIT Rd (F2),(11B) | ||
12452 | 7: clflush | clflushopt (66) | sfence (11B) | ||
12453 | EndTable | ||
12454 | |||
12455 | @@ -1051,6 +1053,10 @@ GrpTable: Grp19 | ||
12456 | 6: vscatterpf1qps/d Wx (66),(ev) | ||
12457 | EndTable | ||
12458 | |||
12459 | +GrpTable: Grp20 | ||
12460 | +0: cldemote Mb | ||
12461 | +EndTable | ||
12462 | + | ||
12463 | # AMD's Prefetch Group | ||
12464 | GrpTable: GrpP | ||
12465 | 0: PREFETCH | ||
12466 | diff --git a/tools/bpf/Makefile b/tools/bpf/Makefile | ||
12467 | index 5d1995fd369c..5535650800ab 100644 | ||
12468 | --- a/tools/bpf/Makefile | ||
12469 | +++ b/tools/bpf/Makefile | ||
12470 | @@ -16,7 +16,13 @@ CFLAGS += -D__EXPORTED_HEADERS__ -I$(srctree)/include/uapi -I$(srctree)/include | ||
12471 | # isn't set and when invoked from selftests build, where srctree | ||
12472 | # is set to ".". building_out_of_srctree is undefined for in srctree | ||
12473 | # builds | ||
12474 | +ifeq ($(srctree),) | ||
12475 | +update_srctree := 1 | ||
12476 | +endif | ||
12477 | ifndef building_out_of_srctree | ||
12478 | +update_srctree := 1 | ||
12479 | +endif | ||
12480 | +ifeq ($(update_srctree),1) | ||
12481 | srctree := $(patsubst %/,%,$(dir $(CURDIR))) | ||
12482 | srctree := $(patsubst %/,%,$(dir $(srctree))) | ||
12483 | endif | ||
12484 | diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c | ||
12485 | index ede55fec3618..87f27e2664c5 100644 | ||
12486 | --- a/tools/lib/bpf/btf_dump.c | ||
12487 | +++ b/tools/lib/bpf/btf_dump.c | ||
12488 | @@ -876,7 +876,6 @@ static void btf_dump_emit_struct_def(struct btf_dump *d, | ||
12489 | __u16 vlen = btf_vlen(t); | ||
12490 | |||
12491 | packed = is_struct ? btf_is_struct_packed(d->btf, id, t) : 0; | ||
12492 | - align = packed ? 1 : btf_align_of(d->btf, id); | ||
12493 | |||
12494 | btf_dump_printf(d, "%s%s%s {", | ||
12495 | is_struct ? "struct" : "union", | ||
12496 | @@ -906,6 +905,13 @@ static void btf_dump_emit_struct_def(struct btf_dump *d, | ||
12497 | btf_dump_printf(d, ";"); | ||
12498 | } | ||
12499 | |||
12500 | + /* pad at the end, if necessary */ | ||
12501 | + if (is_struct) { | ||
12502 | + align = packed ? 1 : btf_align_of(d->btf, id); | ||
12503 | + btf_dump_emit_bit_padding(d, off, t->size * 8, 0, align, | ||
12504 | + lvl + 1); | ||
12505 | + } | ||
12506 | + | ||
12507 | if (vlen) | ||
12508 | btf_dump_printf(d, "\n"); | ||
12509 | btf_dump_printf(d, "%s}", pfx(lvl)); | ||
12510 | diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c | ||
12511 | index e0276520171b..a267cd0c0ce2 100644 | ||
12512 | --- a/tools/lib/bpf/libbpf.c | ||
12513 | +++ b/tools/lib/bpf/libbpf.c | ||
12514 | @@ -1897,16 +1897,22 @@ int bpf_map__reuse_fd(struct bpf_map *map, int fd) | ||
12515 | return -errno; | ||
12516 | |||
12517 | new_fd = open("/", O_RDONLY | O_CLOEXEC); | ||
12518 | - if (new_fd < 0) | ||
12519 | + if (new_fd < 0) { | ||
12520 | + err = -errno; | ||
12521 | goto err_free_new_name; | ||
12522 | + } | ||
12523 | |||
12524 | new_fd = dup3(fd, new_fd, O_CLOEXEC); | ||
12525 | - if (new_fd < 0) | ||
12526 | + if (new_fd < 0) { | ||
12527 | + err = -errno; | ||
12528 | goto err_close_new_fd; | ||
12529 | + } | ||
12530 | |||
12531 | err = zclose(map->fd); | ||
12532 | - if (err) | ||
12533 | + if (err) { | ||
12534 | + err = -errno; | ||
12535 | goto err_close_new_fd; | ||
12536 | + } | ||
12537 | free(map->name); | ||
12538 | |||
12539 | map->fd = new_fd; | ||
12540 | @@ -1925,7 +1931,7 @@ err_close_new_fd: | ||
12541 | close(new_fd); | ||
12542 | err_free_new_name: | ||
12543 | free(new_name); | ||
12544 | - return -errno; | ||
12545 | + return err; | ||
12546 | } | ||
12547 | |||
12548 | int bpf_map__resize(struct bpf_map *map, __u32 max_entries) | ||
12549 | diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c | ||
12550 | index a902838f9fcc..70f9e10de286 100644 | ||
12551 | --- a/tools/lib/bpf/xsk.c | ||
12552 | +++ b/tools/lib/bpf/xsk.c | ||
12553 | @@ -163,6 +163,7 @@ int xsk_umem__create_v0_0_4(struct xsk_umem **umem_ptr, void *umem_area, | ||
12554 | umem->umem_area = umem_area; | ||
12555 | xsk_set_umem_config(&umem->config, usr_config); | ||
12556 | |||
12557 | + memset(&mr, 0, sizeof(mr)); | ||
12558 | mr.addr = (uintptr_t)umem_area; | ||
12559 | mr.len = size; | ||
12560 | mr.chunk_size = umem->config.frame_size; | ||
12561 | @@ -343,13 +344,18 @@ static int xsk_get_max_queues(struct xsk_socket *xsk) | ||
12562 | goto out; | ||
12563 | } | ||
12564 | |||
12565 | - if (err || channels.max_combined == 0) | ||
12566 | + if (err) { | ||
12567 | /* If the device says it has no channels, then all traffic | ||
12568 | * is sent to a single stream, so max queues = 1. | ||
12569 | */ | ||
12570 | ret = 1; | ||
12571 | - else | ||
12572 | - ret = channels.max_combined; | ||
12573 | + } else { | ||
12574 | + /* Take the max of rx, tx, combined. Drivers return | ||
12575 | + * the number of channels in different ways. | ||
12576 | + */ | ||
12577 | + ret = max(channels.max_rx, channels.max_tx); | ||
12578 | + ret = max(ret, (int)channels.max_combined); | ||
12579 | + } | ||
12580 | |||
12581 | out: | ||
12582 | close(fd); | ||
12583 | @@ -465,6 +471,8 @@ static int xsk_setup_xdp_prog(struct xsk_socket *xsk) | ||
12584 | } | ||
12585 | } else { | ||
12586 | xsk->prog_fd = bpf_prog_get_fd_by_id(prog_id); | ||
12587 | + if (xsk->prog_fd < 0) | ||
12588 | + return -errno; | ||
12589 | err = xsk_lookup_bpf_maps(xsk); | ||
12590 | if (err) { | ||
12591 | close(xsk->prog_fd); | ||
12592 | diff --git a/tools/lib/subcmd/Makefile b/tools/lib/subcmd/Makefile | ||
12593 | index 5b2cd5e58df0..5dbb0dde208c 100644 | ||
12594 | --- a/tools/lib/subcmd/Makefile | ||
12595 | +++ b/tools/lib/subcmd/Makefile | ||
12596 | @@ -28,7 +28,9 @@ ifeq ($(DEBUG),0) | ||
12597 | endif | ||
12598 | endif | ||
12599 | |||
12600 | -ifeq ($(CC_NO_CLANG), 0) | ||
12601 | +ifeq ($(DEBUG),1) | ||
12602 | + CFLAGS += -O0 | ||
12603 | +else ifeq ($(CC_NO_CLANG), 0) | ||
12604 | CFLAGS += -O3 | ||
12605 | else | ||
12606 | CFLAGS += -O6 | ||
12607 | diff --git a/tools/lib/traceevent/parse-filter.c b/tools/lib/traceevent/parse-filter.c | ||
12608 | index 552592d153fb..f3cbf86e51ac 100644 | ||
12609 | --- a/tools/lib/traceevent/parse-filter.c | ||
12610 | +++ b/tools/lib/traceevent/parse-filter.c | ||
12611 | @@ -1473,8 +1473,10 @@ static int copy_filter_type(struct tep_event_filter *filter, | ||
12612 | if (strcmp(str, "TRUE") == 0 || strcmp(str, "FALSE") == 0) { | ||
12613 | /* Add trivial event */ | ||
12614 | arg = allocate_arg(); | ||
12615 | - if (arg == NULL) | ||
12616 | + if (arg == NULL) { | ||
12617 | + free(str); | ||
12618 | return -1; | ||
12619 | + } | ||
12620 | |||
12621 | arg->type = TEP_FILTER_ARG_BOOLEAN; | ||
12622 | if (strcmp(str, "TRUE") == 0) | ||
12623 | @@ -1483,8 +1485,11 @@ static int copy_filter_type(struct tep_event_filter *filter, | ||
12624 | arg->boolean.value = 0; | ||
12625 | |||
12626 | filter_type = add_filter_type(filter, event->id); | ||
12627 | - if (filter_type == NULL) | ||
12628 | + if (filter_type == NULL) { | ||
12629 | + free(str); | ||
12630 | + free_arg(arg); | ||
12631 | return -1; | ||
12632 | + } | ||
12633 | |||
12634 | filter_type->filter = arg; | ||
12635 | |||
12636 | diff --git a/tools/memory-model/linux-kernel.cat b/tools/memory-model/linux-kernel.cat | ||
12637 | index ea2ff4b94074..2a9b4fe4a84e 100644 | ||
12638 | --- a/tools/memory-model/linux-kernel.cat | ||
12639 | +++ b/tools/memory-model/linux-kernel.cat | ||
12640 | @@ -197,7 +197,7 @@ empty (wr-incoh | rw-incoh | ww-incoh) as plain-coherence | ||
12641 | (* Actual races *) | ||
12642 | let ww-nonrace = ww-vis & ((Marked * W) | rw-xbstar) & ((W * Marked) | wr-vis) | ||
12643 | let ww-race = (pre-race & co) \ ww-nonrace | ||
12644 | -let wr-race = (pre-race & (co? ; rf)) \ wr-vis | ||
12645 | +let wr-race = (pre-race & (co? ; rf)) \ wr-vis \ rw-xbstar^-1 | ||
12646 | let rw-race = (pre-race & fr) \ rw-xbstar | ||
12647 | |||
12648 | flag ~empty (ww-race | wr-race | rw-race) as data-race | ||
12649 | diff --git a/tools/objtool/check.c b/tools/objtool/check.c | ||
12650 | index 044c9a3cb247..f53d3c515cdc 100644 | ||
12651 | --- a/tools/objtool/check.c | ||
12652 | +++ b/tools/objtool/check.c | ||
12653 | @@ -481,6 +481,7 @@ static const char *uaccess_safe_builtin[] = { | ||
12654 | "ubsan_type_mismatch_common", | ||
12655 | "__ubsan_handle_type_mismatch", | ||
12656 | "__ubsan_handle_type_mismatch_v1", | ||
12657 | + "__ubsan_handle_shift_out_of_bounds", | ||
12658 | /* misc */ | ||
12659 | "csum_partial_copy_generic", | ||
12660 | "__memcpy_mcsafe", | ||
12661 | diff --git a/tools/perf/arch/arm64/util/sym-handling.c b/tools/perf/arch/arm64/util/sym-handling.c | ||
12662 | index 5df788985130..8dfa3e5229f1 100644 | ||
12663 | --- a/tools/perf/arch/arm64/util/sym-handling.c | ||
12664 | +++ b/tools/perf/arch/arm64/util/sym-handling.c | ||
12665 | @@ -6,9 +6,10 @@ | ||
12666 | |||
12667 | #include "symbol.h" // for the elf__needs_adjust_symbols() prototype | ||
12668 | #include <stdbool.h> | ||
12669 | -#include <gelf.h> | ||
12670 | |||
12671 | #ifdef HAVE_LIBELF_SUPPORT | ||
12672 | +#include <gelf.h> | ||
12673 | + | ||
12674 | bool elf__needs_adjust_symbols(GElf_Ehdr ehdr) | ||
12675 | { | ||
12676 | return ehdr.e_type == ET_EXEC || | ||
12677 | diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c | ||
12678 | index aae0e57c60fb..7accaf8ef689 100644 | ||
12679 | --- a/tools/perf/builtin-report.c | ||
12680 | +++ b/tools/perf/builtin-report.c | ||
12681 | @@ -399,6 +399,13 @@ static int report__setup_sample_type(struct report *rep) | ||
12682 | PERF_SAMPLE_BRANCH_ANY)) | ||
12683 | rep->nonany_branch_mode = true; | ||
12684 | |||
12685 | +#ifndef HAVE_LIBUNWIND_SUPPORT | ||
12686 | + if (dwarf_callchain_users) { | ||
12687 | + ui__warning("Please install libunwind development packages " | ||
12688 | + "during the perf build.\n"); | ||
12689 | + } | ||
12690 | +#endif | ||
12691 | + | ||
12692 | return 0; | ||
12693 | } | ||
12694 | |||
12695 | diff --git a/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json b/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json | ||
12696 | index 0d1556fcdffe..99f4fc425564 100644 | ||
12697 | --- a/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json | ||
12698 | +++ b/tools/perf/pmu-events/arch/arm64/hisilicon/hip08/uncore-ddrc.json | ||
12699 | @@ -15,7 +15,7 @@ | ||
12700 | }, | ||
12701 | { | ||
12702 | "EventCode": "0x04", | ||
12703 | - "EventName": "uncore_hisi_ddrc.flux_wr", | ||
12704 | + "EventName": "uncore_hisi_ddrc.pre_cmd", | ||
12705 | "BriefDescription": "DDRC precharge commands", | ||
12706 | "PublicDescription": "DDRC precharge commands", | ||
12707 | "Unit": "hisi_sccl,ddrc", | ||
12708 | diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c | ||
12709 | index e2837260ca4d..99e3fd04a5cb 100644 | ||
12710 | --- a/tools/perf/pmu-events/jevents.c | ||
12711 | +++ b/tools/perf/pmu-events/jevents.c | ||
12712 | @@ -758,6 +758,7 @@ static int process_mapfile(FILE *outfp, char *fpath) | ||
12713 | char *line, *p; | ||
12714 | int line_num; | ||
12715 | char *tblname; | ||
12716 | + int ret = 0; | ||
12717 | |||
12718 | pr_info("%s: Processing mapfile %s\n", prog, fpath); | ||
12719 | |||
12720 | @@ -769,6 +770,7 @@ static int process_mapfile(FILE *outfp, char *fpath) | ||
12721 | if (!mapfp) { | ||
12722 | pr_info("%s: Error %s opening %s\n", prog, strerror(errno), | ||
12723 | fpath); | ||
12724 | + free(line); | ||
12725 | return -1; | ||
12726 | } | ||
12727 | |||
12728 | @@ -795,7 +797,8 @@ static int process_mapfile(FILE *outfp, char *fpath) | ||
12729 | /* TODO Deal with lines longer than 16K */ | ||
12730 | pr_info("%s: Mapfile %s: line %d too long, aborting\n", | ||
12731 | prog, fpath, line_num); | ||
12732 | - return -1; | ||
12733 | + ret = -1; | ||
12734 | + goto out; | ||
12735 | } | ||
12736 | line[strlen(line)-1] = '\0'; | ||
12737 | |||
12738 | @@ -825,7 +828,9 @@ static int process_mapfile(FILE *outfp, char *fpath) | ||
12739 | |||
12740 | out: | ||
12741 | print_mapping_table_suffix(outfp); | ||
12742 | - return 0; | ||
12743 | + fclose(mapfp); | ||
12744 | + free(line); | ||
12745 | + return ret; | ||
12746 | } | ||
12747 | |||
12748 | /* | ||
12749 | @@ -1122,6 +1127,7 @@ int main(int argc, char *argv[]) | ||
12750 | goto empty_map; | ||
12751 | } else if (rc < 0) { | ||
12752 | /* Make build fail */ | ||
12753 | + fclose(eventsfp); | ||
12754 | free_arch_std_events(); | ||
12755 | return 1; | ||
12756 | } else if (rc) { | ||
12757 | @@ -1134,6 +1140,7 @@ int main(int argc, char *argv[]) | ||
12758 | goto empty_map; | ||
12759 | } else if (rc < 0) { | ||
12760 | /* Make build fail */ | ||
12761 | + fclose(eventsfp); | ||
12762 | free_arch_std_events(); | ||
12763 | return 1; | ||
12764 | } else if (rc) { | ||
12765 | @@ -1151,6 +1158,8 @@ int main(int argc, char *argv[]) | ||
12766 | if (process_mapfile(eventsfp, mapfile)) { | ||
12767 | pr_info("%s: Error processing mapfile %s\n", prog, mapfile); | ||
12768 | /* Make build fail */ | ||
12769 | + fclose(eventsfp); | ||
12770 | + free_arch_std_events(); | ||
12771 | return 1; | ||
12772 | } | ||
12773 | |||
12774 | diff --git a/tools/perf/tests/bp_signal.c b/tools/perf/tests/bp_signal.c | ||
12775 | index c1c2c13de254..166f411568a5 100644 | ||
12776 | --- a/tools/perf/tests/bp_signal.c | ||
12777 | +++ b/tools/perf/tests/bp_signal.c | ||
12778 | @@ -49,14 +49,6 @@ asm ( | ||
12779 | "__test_function:\n" | ||
12780 | "incq (%rdi)\n" | ||
12781 | "ret\n"); | ||
12782 | -#elif defined (__aarch64__) | ||
12783 | -extern void __test_function(volatile long *ptr); | ||
12784 | -asm ( | ||
12785 | - ".globl __test_function\n" | ||
12786 | - "__test_function:\n" | ||
12787 | - "str x30, [x0]\n" | ||
12788 | - "ret\n"); | ||
12789 | - | ||
12790 | #else | ||
12791 | static void __test_function(volatile long *ptr) | ||
12792 | { | ||
12793 | @@ -302,10 +294,15 @@ bool test__bp_signal_is_supported(void) | ||
12794 | * stepping into the SIGIO handler and getting stuck on the | ||
12795 | * breakpointed instruction. | ||
12796 | * | ||
12797 | + * Since arm64 has the same issue with arm for the single-step | ||
12798 | + * handling, this case also gets suck on the breakpointed | ||
12799 | + * instruction. | ||
12800 | + * | ||
12801 | * Just disable the test for these architectures until these | ||
12802 | * issues are resolved. | ||
12803 | */ | ||
12804 | -#if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) | ||
12805 | +#if defined(__powerpc__) || defined(__s390x__) || defined(__arm__) || \ | ||
12806 | + defined(__aarch64__) | ||
12807 | return false; | ||
12808 | #else | ||
12809 | return true; | ||
12810 | diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c | ||
12811 | index bce3a4cb4c89..d85c9f608564 100644 | ||
12812 | --- a/tools/perf/tests/task-exit.c | ||
12813 | +++ b/tools/perf/tests/task-exit.c | ||
12814 | @@ -53,6 +53,7 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused | ||
12815 | struct perf_cpu_map *cpus; | ||
12816 | struct perf_thread_map *threads; | ||
12817 | struct mmap *md; | ||
12818 | + int retry_count = 0; | ||
12819 | |||
12820 | signal(SIGCHLD, sig_handler); | ||
12821 | |||
12822 | @@ -110,6 +111,7 @@ int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused | ||
12823 | if (evlist__mmap(evlist, 128) < 0) { | ||
12824 | pr_debug("failed to mmap events: %d (%s)\n", errno, | ||
12825 | str_error_r(errno, sbuf, sizeof(sbuf))); | ||
12826 | + err = -1; | ||
12827 | goto out_delete_evlist; | ||
12828 | } | ||
12829 | |||
12830 | @@ -131,6 +133,13 @@ retry: | ||
12831 | out_init: | ||
12832 | if (!exited || !nr_exit) { | ||
12833 | evlist__poll(evlist, -1); | ||
12834 | + | ||
12835 | + if (retry_count++ > 1000) { | ||
12836 | + pr_debug("Failed after retrying 1000 times\n"); | ||
12837 | + err = -1; | ||
12838 | + goto out_free_maps; | ||
12839 | + } | ||
12840 | + | ||
12841 | goto retry; | ||
12842 | } | ||
12843 | |||
12844 | diff --git a/tools/perf/util/cs-etm.c b/tools/perf/util/cs-etm.c | ||
12845 | index 4ba0f871f086..f5f855fff412 100644 | ||
12846 | --- a/tools/perf/util/cs-etm.c | ||
12847 | +++ b/tools/perf/util/cs-etm.c | ||
12848 | @@ -110,7 +110,7 @@ static int cs_etm__decode_data_block(struct cs_etm_queue *etmq); | ||
12849 | * encode the etm queue number as the upper 16 bit and the channel as | ||
12850 | * the lower 16 bit. | ||
12851 | */ | ||
12852 | -#define TO_CS_QUEUE_NR(queue_nr, trace_id_chan) \ | ||
12853 | +#define TO_CS_QUEUE_NR(queue_nr, trace_chan_id) \ | ||
12854 | (queue_nr << 16 | trace_chan_id) | ||
12855 | #define TO_QUEUE_NR(cs_queue_nr) (cs_queue_nr >> 16) | ||
12856 | #define TO_TRACE_CHAN_ID(cs_queue_nr) (cs_queue_nr & 0x0000ffff) | ||
12857 | @@ -819,7 +819,7 @@ static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm, | ||
12858 | * Note that packets decoded above are still in the traceID's packet | ||
12859 | * queue and will be processed in cs_etm__process_queues(). | ||
12860 | */ | ||
12861 | - cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_id_chan); | ||
12862 | + cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_chan_id); | ||
12863 | ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp); | ||
12864 | out: | ||
12865 | return ret; | ||
12866 | diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c | ||
12867 | index df6cee5c071f..5544bfbd0f6c 100644 | ||
12868 | --- a/tools/perf/util/dwarf-aux.c | ||
12869 | +++ b/tools/perf/util/dwarf-aux.c | ||
12870 | @@ -307,21 +307,51 @@ bool die_is_func_def(Dwarf_Die *dw_die) | ||
12871 | dwarf_attr(dw_die, DW_AT_declaration, &attr) == NULL); | ||
12872 | } | ||
12873 | |||
12874 | +/** | ||
12875 | + * die_entrypc - Returns entry PC (the lowest address) of a DIE | ||
12876 | + * @dw_die: a DIE | ||
12877 | + * @addr: where to store entry PC | ||
12878 | + * | ||
12879 | + * Since dwarf_entrypc() does not return entry PC if the DIE has only address | ||
12880 | + * range, we have to use this to retrieve the lowest address from the address | ||
12881 | + * range attribute. | ||
12882 | + */ | ||
12883 | +int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr) | ||
12884 | +{ | ||
12885 | + Dwarf_Addr base, end; | ||
12886 | + | ||
12887 | + if (!addr) | ||
12888 | + return -EINVAL; | ||
12889 | + | ||
12890 | + if (dwarf_entrypc(dw_die, addr) == 0) | ||
12891 | + return 0; | ||
12892 | + | ||
12893 | + return dwarf_ranges(dw_die, 0, &base, addr, &end) < 0 ? -ENOENT : 0; | ||
12894 | +} | ||
12895 | + | ||
12896 | /** | ||
12897 | * die_is_func_instance - Ensure that this DIE is an instance of a subprogram | ||
12898 | * @dw_die: a DIE | ||
12899 | * | ||
12900 | * Ensure that this DIE is an instance (which has an entry address). | ||
12901 | - * This returns true if @dw_die is a function instance. If not, you need to | ||
12902 | - * call die_walk_instances() to find actual instances. | ||
12903 | + * This returns true if @dw_die is a function instance. If not, the @dw_die | ||
12904 | + * must be a prototype. You can use die_walk_instances() to find actual | ||
12905 | + * instances. | ||
12906 | **/ | ||
12907 | bool die_is_func_instance(Dwarf_Die *dw_die) | ||
12908 | { | ||
12909 | Dwarf_Addr tmp; | ||
12910 | + Dwarf_Attribute attr_mem; | ||
12911 | + int tag = dwarf_tag(dw_die); | ||
12912 | |||
12913 | - /* Actually gcc optimizes non-inline as like as inlined */ | ||
12914 | - return !dwarf_func_inline(dw_die) && dwarf_entrypc(dw_die, &tmp) == 0; | ||
12915 | + if (tag != DW_TAG_subprogram && | ||
12916 | + tag != DW_TAG_inlined_subroutine) | ||
12917 | + return false; | ||
12918 | + | ||
12919 | + return dwarf_entrypc(dw_die, &tmp) == 0 || | ||
12920 | + dwarf_attr(dw_die, DW_AT_ranges, &attr_mem) != NULL; | ||
12921 | } | ||
12922 | + | ||
12923 | /** | ||
12924 | * die_get_data_member_location - Get the data-member offset | ||
12925 | * @mb_die: a DIE of a member of a data structure | ||
12926 | @@ -598,6 +628,9 @@ static int __die_walk_instances_cb(Dwarf_Die *inst, void *data) | ||
12927 | Dwarf_Die *origin; | ||
12928 | int tmp; | ||
12929 | |||
12930 | + if (!die_is_func_instance(inst)) | ||
12931 | + return DIE_FIND_CB_CONTINUE; | ||
12932 | + | ||
12933 | attr = dwarf_attr(inst, DW_AT_abstract_origin, &attr_mem); | ||
12934 | if (attr == NULL) | ||
12935 | return DIE_FIND_CB_CONTINUE; | ||
12936 | @@ -669,15 +702,14 @@ static int __die_walk_funclines_cb(Dwarf_Die *in_die, void *data) | ||
12937 | if (dwarf_tag(in_die) == DW_TAG_inlined_subroutine) { | ||
12938 | fname = die_get_call_file(in_die); | ||
12939 | lineno = die_get_call_lineno(in_die); | ||
12940 | - if (fname && lineno > 0 && dwarf_entrypc(in_die, &addr) == 0) { | ||
12941 | + if (fname && lineno > 0 && die_entrypc(in_die, &addr) == 0) { | ||
12942 | lw->retval = lw->callback(fname, lineno, addr, lw->data); | ||
12943 | if (lw->retval != 0) | ||
12944 | return DIE_FIND_CB_END; | ||
12945 | } | ||
12946 | + if (!lw->recursive) | ||
12947 | + return DIE_FIND_CB_SIBLING; | ||
12948 | } | ||
12949 | - if (!lw->recursive) | ||
12950 | - /* Don't need to search recursively */ | ||
12951 | - return DIE_FIND_CB_SIBLING; | ||
12952 | |||
12953 | if (addr) { | ||
12954 | fname = dwarf_decl_file(in_die); | ||
12955 | @@ -710,7 +742,7 @@ static int __die_walk_funclines(Dwarf_Die *sp_die, bool recursive, | ||
12956 | /* Handle function declaration line */ | ||
12957 | fname = dwarf_decl_file(sp_die); | ||
12958 | if (fname && dwarf_decl_line(sp_die, &lineno) == 0 && | ||
12959 | - dwarf_entrypc(sp_die, &addr) == 0) { | ||
12960 | + die_entrypc(sp_die, &addr) == 0) { | ||
12961 | lw.retval = callback(fname, lineno, addr, data); | ||
12962 | if (lw.retval != 0) | ||
12963 | goto done; | ||
12964 | @@ -724,6 +756,10 @@ static int __die_walk_culines_cb(Dwarf_Die *sp_die, void *data) | ||
12965 | { | ||
12966 | struct __line_walk_param *lw = data; | ||
12967 | |||
12968 | + /* | ||
12969 | + * Since inlined function can include another inlined function in | ||
12970 | + * the same file, we need to walk in it recursively. | ||
12971 | + */ | ||
12972 | lw->retval = __die_walk_funclines(sp_die, true, lw->callback, lw->data); | ||
12973 | if (lw->retval != 0) | ||
12974 | return DWARF_CB_ABORT; | ||
12975 | @@ -748,11 +784,12 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) | ||
12976 | Dwarf_Lines *lines; | ||
12977 | Dwarf_Line *line; | ||
12978 | Dwarf_Addr addr; | ||
12979 | - const char *fname, *decf = NULL; | ||
12980 | + const char *fname, *decf = NULL, *inf = NULL; | ||
12981 | int lineno, ret = 0; | ||
12982 | int decl = 0, inl; | ||
12983 | Dwarf_Die die_mem, *cu_die; | ||
12984 | size_t nlines, i; | ||
12985 | + bool flag; | ||
12986 | |||
12987 | /* Get the CU die */ | ||
12988 | if (dwarf_tag(rt_die) != DW_TAG_compile_unit) { | ||
12989 | @@ -783,6 +820,12 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) | ||
12990 | "Possible error in debuginfo.\n"); | ||
12991 | continue; | ||
12992 | } | ||
12993 | + /* Skip end-of-sequence */ | ||
12994 | + if (dwarf_lineendsequence(line, &flag) != 0 || flag) | ||
12995 | + continue; | ||
12996 | + /* Skip Non statement line-info */ | ||
12997 | + if (dwarf_linebeginstatement(line, &flag) != 0 || !flag) | ||
12998 | + continue; | ||
12999 | /* Filter lines based on address */ | ||
13000 | if (rt_die != cu_die) { | ||
13001 | /* | ||
13002 | @@ -792,13 +835,21 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) | ||
13003 | */ | ||
13004 | if (!dwarf_haspc(rt_die, addr)) | ||
13005 | continue; | ||
13006 | + | ||
13007 | if (die_find_inlinefunc(rt_die, addr, &die_mem)) { | ||
13008 | + /* Call-site check */ | ||
13009 | + inf = die_get_call_file(&die_mem); | ||
13010 | + if ((inf && !strcmp(inf, decf)) && | ||
13011 | + die_get_call_lineno(&die_mem) == lineno) | ||
13012 | + goto found; | ||
13013 | + | ||
13014 | dwarf_decl_line(&die_mem, &inl); | ||
13015 | if (inl != decl || | ||
13016 | decf != dwarf_decl_file(&die_mem)) | ||
13017 | continue; | ||
13018 | } | ||
13019 | } | ||
13020 | +found: | ||
13021 | /* Get source line */ | ||
13022 | fname = dwarf_linesrc(line, NULL, NULL); | ||
13023 | |||
13024 | @@ -813,8 +864,9 @@ int die_walk_lines(Dwarf_Die *rt_die, line_walk_callback_t callback, void *data) | ||
13025 | */ | ||
13026 | if (rt_die != cu_die) | ||
13027 | /* | ||
13028 | - * Don't need walk functions recursively, because nested | ||
13029 | - * inlined functions don't have lines of the specified DIE. | ||
13030 | + * Don't need walk inlined functions recursively, because | ||
13031 | + * inner inlined functions don't have the lines of the | ||
13032 | + * specified function. | ||
13033 | */ | ||
13034 | ret = __die_walk_funclines(rt_die, false, callback, data); | ||
13035 | else { | ||
13036 | @@ -989,7 +1041,7 @@ static int die_get_var_innermost_scope(Dwarf_Die *sp_die, Dwarf_Die *vr_die, | ||
13037 | bool first = true; | ||
13038 | const char *name; | ||
13039 | |||
13040 | - ret = dwarf_entrypc(sp_die, &entry); | ||
13041 | + ret = die_entrypc(sp_die, &entry); | ||
13042 | if (ret) | ||
13043 | return ret; | ||
13044 | |||
13045 | @@ -1052,7 +1104,7 @@ int die_get_var_range(Dwarf_Die *sp_die, Dwarf_Die *vr_die, struct strbuf *buf) | ||
13046 | bool first = true; | ||
13047 | const char *name; | ||
13048 | |||
13049 | - ret = dwarf_entrypc(sp_die, &entry); | ||
13050 | + ret = die_entrypc(sp_die, &entry); | ||
13051 | if (ret) | ||
13052 | return ret; | ||
13053 | |||
13054 | diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h | ||
13055 | index f204e5892403..506006e0cf66 100644 | ||
13056 | --- a/tools/perf/util/dwarf-aux.h | ||
13057 | +++ b/tools/perf/util/dwarf-aux.h | ||
13058 | @@ -29,6 +29,9 @@ int cu_walk_functions_at(Dwarf_Die *cu_die, Dwarf_Addr addr, | ||
13059 | /* Get DW_AT_linkage_name (should be NULL for C binary) */ | ||
13060 | const char *die_get_linkage_name(Dwarf_Die *dw_die); | ||
13061 | |||
13062 | +/* Get the lowest PC in DIE (including range list) */ | ||
13063 | +int die_entrypc(Dwarf_Die *dw_die, Dwarf_Addr *addr); | ||
13064 | + | ||
13065 | /* Ensure that this DIE is a subprogram and definition (not declaration) */ | ||
13066 | bool die_is_func_def(Dwarf_Die *dw_die); | ||
13067 | |||
13068 | diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c | ||
13069 | index b5e2adef49de..422ad1888e74 100644 | ||
13070 | --- a/tools/perf/util/parse-events.c | ||
13071 | +++ b/tools/perf/util/parse-events.c | ||
13072 | @@ -1365,8 +1365,15 @@ int parse_events_add_pmu(struct parse_events_state *parse_state, | ||
13073 | if (get_config_terms(head_config, &config_terms)) | ||
13074 | return -ENOMEM; | ||
13075 | |||
13076 | - if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) | ||
13077 | + if (perf_pmu__config(pmu, &attr, head_config, parse_state->error)) { | ||
13078 | + struct perf_evsel_config_term *pos, *tmp; | ||
13079 | + | ||
13080 | + list_for_each_entry_safe(pos, tmp, &config_terms, list) { | ||
13081 | + list_del_init(&pos->list); | ||
13082 | + free(pos); | ||
13083 | + } | ||
13084 | return -EINVAL; | ||
13085 | + } | ||
13086 | |||
13087 | evsel = __add_event(list, &parse_state->idx, &attr, | ||
13088 | get_config_name(head_config), pmu, | ||
13089 | @@ -1927,15 +1934,20 @@ int parse_events(struct evlist *evlist, const char *str, | ||
13090 | |||
13091 | ret = parse_events__scanner(str, &parse_state, PE_START_EVENTS); | ||
13092 | perf_pmu__parse_cleanup(); | ||
13093 | + | ||
13094 | + if (!ret && list_empty(&parse_state.list)) { | ||
13095 | + WARN_ONCE(true, "WARNING: event parser found nothing\n"); | ||
13096 | + return -1; | ||
13097 | + } | ||
13098 | + | ||
13099 | + /* | ||
13100 | + * Add list to the evlist even with errors to allow callers to clean up. | ||
13101 | + */ | ||
13102 | + perf_evlist__splice_list_tail(evlist, &parse_state.list); | ||
13103 | + | ||
13104 | if (!ret) { | ||
13105 | struct evsel *last; | ||
13106 | |||
13107 | - if (list_empty(&parse_state.list)) { | ||
13108 | - WARN_ONCE(true, "WARNING: event parser found nothing\n"); | ||
13109 | - return -1; | ||
13110 | - } | ||
13111 | - | ||
13112 | - perf_evlist__splice_list_tail(evlist, &parse_state.list); | ||
13113 | evlist->nr_groups += parse_state.nr_groups; | ||
13114 | last = evlist__last(evlist); | ||
13115 | last->cmdline_group_boundary = true; | ||
13116 | diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c | ||
13117 | index cd9f95e5044e..08cccd86447c 100644 | ||
13118 | --- a/tools/perf/util/probe-finder.c | ||
13119 | +++ b/tools/perf/util/probe-finder.c | ||
13120 | @@ -756,6 +756,16 @@ static int find_best_scope_cb(Dwarf_Die *fn_die, void *data) | ||
13121 | return 0; | ||
13122 | } | ||
13123 | |||
13124 | +/* Return innermost DIE */ | ||
13125 | +static int find_inner_scope_cb(Dwarf_Die *fn_die, void *data) | ||
13126 | +{ | ||
13127 | + struct find_scope_param *fsp = data; | ||
13128 | + | ||
13129 | + memcpy(fsp->die_mem, fn_die, sizeof(Dwarf_Die)); | ||
13130 | + fsp->found = true; | ||
13131 | + return 1; | ||
13132 | +} | ||
13133 | + | ||
13134 | /* Find an appropriate scope fits to given conditions */ | ||
13135 | static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) | ||
13136 | { | ||
13137 | @@ -767,8 +777,13 @@ static Dwarf_Die *find_best_scope(struct probe_finder *pf, Dwarf_Die *die_mem) | ||
13138 | .die_mem = die_mem, | ||
13139 | .found = false, | ||
13140 | }; | ||
13141 | + int ret; | ||
13142 | |||
13143 | - cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, &fsp); | ||
13144 | + ret = cu_walk_functions_at(&pf->cu_die, pf->addr, find_best_scope_cb, | ||
13145 | + &fsp); | ||
13146 | + if (!ret && !fsp.found) | ||
13147 | + cu_walk_functions_at(&pf->cu_die, pf->addr, | ||
13148 | + find_inner_scope_cb, &fsp); | ||
13149 | |||
13150 | return fsp.found ? die_mem : NULL; | ||
13151 | } | ||
13152 | @@ -942,7 +957,7 @@ static int probe_point_inline_cb(Dwarf_Die *in_die, void *data) | ||
13153 | ret = find_probe_point_lazy(in_die, pf); | ||
13154 | else { | ||
13155 | /* Get probe address */ | ||
13156 | - if (dwarf_entrypc(in_die, &addr) != 0) { | ||
13157 | + if (die_entrypc(in_die, &addr) != 0) { | ||
13158 | pr_warning("Failed to get entry address of %s.\n", | ||
13159 | dwarf_diename(in_die)); | ||
13160 | return -ENOENT; | ||
13161 | @@ -994,7 +1009,7 @@ static int probe_point_search_cb(Dwarf_Die *sp_die, void *data) | ||
13162 | param->retval = find_probe_point_by_line(pf); | ||
13163 | } else if (die_is_func_instance(sp_die)) { | ||
13164 | /* Instances always have the entry address */ | ||
13165 | - dwarf_entrypc(sp_die, &pf->addr); | ||
13166 | + die_entrypc(sp_die, &pf->addr); | ||
13167 | /* But in some case the entry address is 0 */ | ||
13168 | if (pf->addr == 0) { | ||
13169 | pr_debug("%s has no entry PC. Skipped\n", | ||
13170 | @@ -1425,6 +1440,18 @@ error: | ||
13171 | return DIE_FIND_CB_END; | ||
13172 | } | ||
13173 | |||
13174 | +static bool available_var_finder_overlap(struct available_var_finder *af) | ||
13175 | +{ | ||
13176 | + int i; | ||
13177 | + | ||
13178 | + for (i = 0; i < af->nvls; i++) { | ||
13179 | + if (af->pf.addr == af->vls[i].point.address) | ||
13180 | + return true; | ||
13181 | + } | ||
13182 | + return false; | ||
13183 | + | ||
13184 | +} | ||
13185 | + | ||
13186 | /* Add a found vars into available variables list */ | ||
13187 | static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf) | ||
13188 | { | ||
13189 | @@ -1435,6 +1462,14 @@ static int add_available_vars(Dwarf_Die *sc_die, struct probe_finder *pf) | ||
13190 | Dwarf_Die die_mem; | ||
13191 | int ret; | ||
13192 | |||
13193 | + /* | ||
13194 | + * For some reason (e.g. different column assigned to same address), | ||
13195 | + * this callback can be called with the address which already passed. | ||
13196 | + * Ignore it first. | ||
13197 | + */ | ||
13198 | + if (available_var_finder_overlap(af)) | ||
13199 | + return 0; | ||
13200 | + | ||
13201 | /* Check number of tevs */ | ||
13202 | if (af->nvls == af->max_vls) { | ||
13203 | pr_warning("Too many( > %d) probe point found.\n", af->max_vls); | ||
13204 | @@ -1578,7 +1613,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, | ||
13205 | /* Get function entry information */ | ||
13206 | func = basefunc = dwarf_diename(&spdie); | ||
13207 | if (!func || | ||
13208 | - dwarf_entrypc(&spdie, &baseaddr) != 0 || | ||
13209 | + die_entrypc(&spdie, &baseaddr) != 0 || | ||
13210 | dwarf_decl_line(&spdie, &baseline) != 0) { | ||
13211 | lineno = 0; | ||
13212 | goto post; | ||
13213 | @@ -1595,7 +1630,7 @@ int debuginfo__find_probe_point(struct debuginfo *dbg, unsigned long addr, | ||
13214 | while (die_find_top_inlinefunc(&spdie, (Dwarf_Addr)addr, | ||
13215 | &indie)) { | ||
13216 | /* There is an inline function */ | ||
13217 | - if (dwarf_entrypc(&indie, &_addr) == 0 && | ||
13218 | + if (die_entrypc(&indie, &_addr) == 0 && | ||
13219 | _addr == addr) { | ||
13220 | /* | ||
13221 | * addr is at an inline function entry. | ||
13222 | diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c | ||
13223 | index 061bb4d6a3f5..5c172845fa5a 100644 | ||
13224 | --- a/tools/perf/util/session.c | ||
13225 | +++ b/tools/perf/util/session.c | ||
13226 | @@ -1954,8 +1954,8 @@ out_err: | ||
13227 | } | ||
13228 | |||
13229 | static union perf_event * | ||
13230 | -fetch_mmaped_event(struct perf_session *session, | ||
13231 | - u64 head, size_t mmap_size, char *buf) | ||
13232 | +prefetch_event(char *buf, u64 head, size_t mmap_size, | ||
13233 | + bool needs_swap, union perf_event *error) | ||
13234 | { | ||
13235 | union perf_event *event; | ||
13236 | |||
13237 | @@ -1967,20 +1967,32 @@ fetch_mmaped_event(struct perf_session *session, | ||
13238 | return NULL; | ||
13239 | |||
13240 | event = (union perf_event *)(buf + head); | ||
13241 | + if (needs_swap) | ||
13242 | + perf_event_header__bswap(&event->header); | ||
13243 | |||
13244 | - if (session->header.needs_swap) | ||
13245 | + if (head + event->header.size <= mmap_size) | ||
13246 | + return event; | ||
13247 | + | ||
13248 | + /* We're not fetching the event so swap back again */ | ||
13249 | + if (needs_swap) | ||
13250 | perf_event_header__bswap(&event->header); | ||
13251 | |||
13252 | - if (head + event->header.size > mmap_size) { | ||
13253 | - /* We're not fetching the event so swap back again */ | ||
13254 | - if (session->header.needs_swap) | ||
13255 | - perf_event_header__bswap(&event->header); | ||
13256 | - pr_debug("%s: head=%#" PRIx64 " event->header_size=%#x, mmap_size=%#zx: fuzzed perf.data?\n", | ||
13257 | - __func__, head, event->header.size, mmap_size); | ||
13258 | - return ERR_PTR(-EINVAL); | ||
13259 | - } | ||
13260 | + pr_debug("%s: head=%#" PRIx64 " event->header_size=%#x, mmap_size=%#zx:" | ||
13261 | + " fuzzed or compressed perf.data?\n",__func__, head, event->header.size, mmap_size); | ||
13262 | |||
13263 | - return event; | ||
13264 | + return error; | ||
13265 | +} | ||
13266 | + | ||
13267 | +static union perf_event * | ||
13268 | +fetch_mmaped_event(u64 head, size_t mmap_size, char *buf, bool needs_swap) | ||
13269 | +{ | ||
13270 | + return prefetch_event(buf, head, mmap_size, needs_swap, ERR_PTR(-EINVAL)); | ||
13271 | +} | ||
13272 | + | ||
13273 | +static union perf_event * | ||
13274 | +fetch_decomp_event(u64 head, size_t mmap_size, char *buf, bool needs_swap) | ||
13275 | +{ | ||
13276 | + return prefetch_event(buf, head, mmap_size, needs_swap, NULL); | ||
13277 | } | ||
13278 | |||
13279 | static int __perf_session__process_decomp_events(struct perf_session *session) | ||
13280 | @@ -1993,10 +2005,8 @@ static int __perf_session__process_decomp_events(struct perf_session *session) | ||
13281 | return 0; | ||
13282 | |||
13283 | while (decomp->head < decomp->size && !session_done()) { | ||
13284 | - union perf_event *event = fetch_mmaped_event(session, decomp->head, decomp->size, decomp->data); | ||
13285 | - | ||
13286 | - if (IS_ERR(event)) | ||
13287 | - return PTR_ERR(event); | ||
13288 | + union perf_event *event = fetch_decomp_event(decomp->head, decomp->size, decomp->data, | ||
13289 | + session->header.needs_swap); | ||
13290 | |||
13291 | if (!event) | ||
13292 | break; | ||
13293 | @@ -2096,7 +2106,7 @@ remap: | ||
13294 | } | ||
13295 | |||
13296 | more: | ||
13297 | - event = fetch_mmaped_event(session, head, mmap_size, buf); | ||
13298 | + event = fetch_mmaped_event(head, mmap_size, buf, session->header.needs_swap); | ||
13299 | if (IS_ERR(event)) | ||
13300 | return PTR_ERR(event); | ||
13301 | |||
13302 | diff --git a/tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c b/tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c | ||
13303 | index 7c7451d3f494..58dbdfd4fa13 100644 | ||
13304 | --- a/tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c | ||
13305 | +++ b/tools/power/cpupower/utils/idle_monitor/hsw_ext_idle.c | ||
13306 | @@ -39,7 +39,6 @@ static cstate_t hsw_ext_cstates[HSW_EXT_CSTATE_COUNT] = { | ||
13307 | { | ||
13308 | .name = "PC9", | ||
13309 | .desc = N_("Processor Package C9"), | ||
13310 | - .desc = N_("Processor Package C2"), | ||
13311 | .id = PC9, | ||
13312 | .range = RANGE_PACKAGE, | ||
13313 | .get_count_percent = hsw_ext_get_count_percent, | ||
13314 | diff --git a/tools/testing/selftests/bpf/cgroup_helpers.c b/tools/testing/selftests/bpf/cgroup_helpers.c | ||
13315 | index e95c33e333a4..b29a73fe64db 100644 | ||
13316 | --- a/tools/testing/selftests/bpf/cgroup_helpers.c | ||
13317 | +++ b/tools/testing/selftests/bpf/cgroup_helpers.c | ||
13318 | @@ -98,7 +98,7 @@ int enable_all_controllers(char *cgroup_path) | ||
13319 | */ | ||
13320 | int setup_cgroup_environment(void) | ||
13321 | { | ||
13322 | - char cgroup_workdir[PATH_MAX + 1]; | ||
13323 | + char cgroup_workdir[PATH_MAX - 24]; | ||
13324 | |||
13325 | format_cgroup_path(cgroup_workdir, ""); | ||
13326 | |||
13327 | diff --git a/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c b/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c | ||
13328 | index 3a62119c7498..35c512818a56 100644 | ||
13329 | --- a/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c | ||
13330 | +++ b/tools/testing/selftests/bpf/progs/btf_dump_test_case_padding.c | ||
13331 | @@ -62,6 +62,10 @@ struct padded_a_lot { | ||
13332 | * long: 64; | ||
13333 | * long: 64; | ||
13334 | * int b; | ||
13335 | + * long: 32; | ||
13336 | + * long: 64; | ||
13337 | + * long: 64; | ||
13338 | + * long: 64; | ||
13339 | *}; | ||
13340 | * | ||
13341 | */ | ||
13342 | @@ -95,7 +99,6 @@ struct zone_padding { | ||
13343 | struct zone { | ||
13344 | int a; | ||
13345 | short b; | ||
13346 | - short: 16; | ||
13347 | struct zone_padding __pad__; | ||
13348 | }; | ||
13349 | |||
13350 | diff --git a/tools/testing/selftests/bpf/progs/test_seg6_loop.c b/tools/testing/selftests/bpf/progs/test_seg6_loop.c | ||
13351 | index c4d104428643..69880c1e7700 100644 | ||
13352 | --- a/tools/testing/selftests/bpf/progs/test_seg6_loop.c | ||
13353 | +++ b/tools/testing/selftests/bpf/progs/test_seg6_loop.c | ||
13354 | @@ -132,8 +132,10 @@ static __always_inline int is_valid_tlv_boundary(struct __sk_buff *skb, | ||
13355 | *pad_off = 0; | ||
13356 | |||
13357 | // we can only go as far as ~10 TLVs due to the BPF max stack size | ||
13358 | + // workaround: define induction variable "i" as "long" instead | ||
13359 | + // of "int" to prevent alu32 sub-register spilling. | ||
13360 | #pragma clang loop unroll(disable) | ||
13361 | - for (int i = 0; i < 100; i++) { | ||
13362 | + for (long i = 0; i < 100; i++) { | ||
13363 | struct sr6_tlv_t tlv; | ||
13364 | |||
13365 | if (cur_off == *tlv_off) | ||
13366 | diff --git a/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c b/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13367 | index 608a06871572..d22e438198cf 100644 | ||
13368 | --- a/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13369 | +++ b/tools/testing/selftests/bpf/progs/test_sysctl_loop1.c | ||
13370 | @@ -44,7 +44,10 @@ int sysctl_tcp_mem(struct bpf_sysctl *ctx) | ||
13371 | unsigned long tcp_mem[TCP_MEM_LOOPS] = {}; | ||
13372 | char value[MAX_VALUE_STR_LEN]; | ||
13373 | unsigned char i, off = 0; | ||
13374 | - int ret; | ||
13375 | + /* a workaround to prevent compiler from generating | ||
13376 | + * codes verifier cannot handle yet. | ||
13377 | + */ | ||
13378 | + volatile int ret; | ||
13379 | |||
13380 | if (ctx->write) | ||
13381 | return 0; | ||
13382 | diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c | ||
13383 | index af75a1c7a458..3bf18364c67c 100644 | ||
13384 | --- a/tools/testing/selftests/bpf/test_progs.c | ||
13385 | +++ b/tools/testing/selftests/bpf/test_progs.c | ||
13386 | @@ -20,7 +20,7 @@ struct prog_test_def { | ||
13387 | bool tested; | ||
13388 | bool need_cgroup_cleanup; | ||
13389 | |||
13390 | - const char *subtest_name; | ||
13391 | + char *subtest_name; | ||
13392 | int subtest_num; | ||
13393 | |||
13394 | /* store counts before subtest started */ | ||
13395 | @@ -81,16 +81,17 @@ void test__end_subtest() | ||
13396 | fprintf(env.stdout, "#%d/%d %s:%s\n", | ||
13397 | test->test_num, test->subtest_num, | ||
13398 | test->subtest_name, sub_error_cnt ? "FAIL" : "OK"); | ||
13399 | + | ||
13400 | + free(test->subtest_name); | ||
13401 | + test->subtest_name = NULL; | ||
13402 | } | ||
13403 | |||
13404 | bool test__start_subtest(const char *name) | ||
13405 | { | ||
13406 | struct prog_test_def *test = env.test; | ||
13407 | |||
13408 | - if (test->subtest_name) { | ||
13409 | + if (test->subtest_name) | ||
13410 | test__end_subtest(); | ||
13411 | - test->subtest_name = NULL; | ||
13412 | - } | ||
13413 | |||
13414 | test->subtest_num++; | ||
13415 | |||
13416 | @@ -104,7 +105,13 @@ bool test__start_subtest(const char *name) | ||
13417 | if (!should_run(&env.subtest_selector, test->subtest_num, name)) | ||
13418 | return false; | ||
13419 | |||
13420 | - test->subtest_name = name; | ||
13421 | + test->subtest_name = strdup(name); | ||
13422 | + if (!test->subtest_name) { | ||
13423 | + fprintf(env.stderr, | ||
13424 | + "Subtest #%d: failed to copy subtest name!\n", | ||
13425 | + test->subtest_num); | ||
13426 | + return false; | ||
13427 | + } | ||
13428 | env.test->old_error_cnt = env.test->error_cnt; | ||
13429 | |||
13430 | return true; | ||
13431 | diff --git a/tools/testing/selftests/bpf/test_tc_tunnel.sh b/tools/testing/selftests/bpf/test_tc_tunnel.sh | ||
13432 | index ff0d31d38061..7c76b841b17b 100755 | ||
13433 | --- a/tools/testing/selftests/bpf/test_tc_tunnel.sh | ||
13434 | +++ b/tools/testing/selftests/bpf/test_tc_tunnel.sh | ||
13435 | @@ -62,6 +62,10 @@ cleanup() { | ||
13436 | if [[ -f "${infile}" ]]; then | ||
13437 | rm "${infile}" | ||
13438 | fi | ||
13439 | + | ||
13440 | + if [[ -n $server_pid ]]; then | ||
13441 | + kill $server_pid 2> /dev/null | ||
13442 | + fi | ||
13443 | } | ||
13444 | |||
13445 | server_listen() { | ||
13446 | @@ -77,6 +81,7 @@ client_connect() { | ||
13447 | |||
13448 | verify_data() { | ||
13449 | wait "${server_pid}" | ||
13450 | + server_pid= | ||
13451 | # sha1sum returns two fields [sha1] [filepath] | ||
13452 | # convert to bash array and access first elem | ||
13453 | insum=($(sha1sum ${infile})) | ||
13454 | diff --git a/tools/testing/selftests/net/forwarding/router_bridge_vlan.sh b/tools/testing/selftests/net/forwarding/router_bridge_vlan.sh | ||
13455 | index fef88eb4b873..fa6a88c50750 100755 | ||
13456 | --- a/tools/testing/selftests/net/forwarding/router_bridge_vlan.sh | ||
13457 | +++ b/tools/testing/selftests/net/forwarding/router_bridge_vlan.sh | ||
13458 | @@ -36,7 +36,7 @@ h2_destroy() | ||
13459 | { | ||
13460 | ip -6 route del 2001:db8:1::/64 vrf v$h2 | ||
13461 | ip -4 route del 192.0.2.0/28 vrf v$h2 | ||
13462 | - simple_if_fini $h2 192.0.2.130/28 | ||
13463 | + simple_if_fini $h2 192.0.2.130/28 2001:db8:2::2/64 | ||
13464 | } | ||
13465 | |||
13466 | router_create() | ||
13467 | diff --git a/tools/testing/selftests/net/so_txtime.c b/tools/testing/selftests/net/so_txtime.c | ||
13468 | index 53f598f06647..34df4c8882af 100644 | ||
13469 | --- a/tools/testing/selftests/net/so_txtime.c | ||
13470 | +++ b/tools/testing/selftests/net/so_txtime.c | ||
13471 | @@ -105,8 +105,8 @@ static void do_recv_one(int fdr, struct timed_send *ts) | ||
13472 | tstop = (gettime_ns() - glob_tstart) / 1000; | ||
13473 | texpect = ts->delay_us >= 0 ? ts->delay_us : 0; | ||
13474 | |||
13475 | - fprintf(stderr, "payload:%c delay:%ld expected:%ld (us)\n", | ||
13476 | - rbuf[0], tstop, texpect); | ||
13477 | + fprintf(stderr, "payload:%c delay:%lld expected:%lld (us)\n", | ||
13478 | + rbuf[0], (long long)tstop, (long long)texpect); | ||
13479 | |||
13480 | if (rbuf[0] != ts->data) | ||
13481 | error(1, 0, "payload mismatch. expected %c", ts->data); | ||
13482 | diff --git a/tools/testing/selftests/net/tls.c b/tools/testing/selftests/net/tls.c | ||
13483 | index 13e5ef615026..0ea44d975b6c 100644 | ||
13484 | --- a/tools/testing/selftests/net/tls.c | ||
13485 | +++ b/tools/testing/selftests/net/tls.c | ||
13486 | @@ -722,34 +722,6 @@ TEST_F(tls, recv_lowat) | ||
13487 | EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0); | ||
13488 | } | ||
13489 | |||
13490 | -TEST_F(tls, recv_rcvbuf) | ||
13491 | -{ | ||
13492 | - char send_mem[4096]; | ||
13493 | - char recv_mem[4096]; | ||
13494 | - int rcv_buf = 1024; | ||
13495 | - | ||
13496 | - memset(send_mem, 0x1c, sizeof(send_mem)); | ||
13497 | - | ||
13498 | - EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVBUF, | ||
13499 | - &rcv_buf, sizeof(rcv_buf)), 0); | ||
13500 | - | ||
13501 | - EXPECT_EQ(send(self->fd, send_mem, 512, 0), 512); | ||
13502 | - memset(recv_mem, 0, sizeof(recv_mem)); | ||
13503 | - EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), 512); | ||
13504 | - EXPECT_EQ(memcmp(send_mem, recv_mem, 512), 0); | ||
13505 | - | ||
13506 | - if (self->notls) | ||
13507 | - return; | ||
13508 | - | ||
13509 | - EXPECT_EQ(send(self->fd, send_mem, 4096, 0), 4096); | ||
13510 | - memset(recv_mem, 0, sizeof(recv_mem)); | ||
13511 | - EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1); | ||
13512 | - EXPECT_EQ(errno, EMSGSIZE); | ||
13513 | - | ||
13514 | - EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1); | ||
13515 | - EXPECT_EQ(errno, EMSGSIZE); | ||
13516 | -} | ||
13517 | - | ||
13518 | TEST_F(tls, bidir) | ||
13519 | { | ||
13520 | char const *test_str = "test_read"; | ||
13521 | diff --git a/tools/testing/selftests/net/udpgso.c b/tools/testing/selftests/net/udpgso.c | ||
13522 | index 614b31aad168..c66da6ffd6d8 100644 | ||
13523 | --- a/tools/testing/selftests/net/udpgso.c | ||
13524 | +++ b/tools/testing/selftests/net/udpgso.c | ||
13525 | @@ -440,7 +440,8 @@ static bool __send_one(int fd, struct msghdr *msg, int flags) | ||
13526 | if (ret == -1) | ||
13527 | error(1, errno, "sendmsg"); | ||
13528 | if (ret != msg->msg_iov->iov_len) | ||
13529 | - error(1, 0, "sendto: %d != %lu", ret, msg->msg_iov->iov_len); | ||
13530 | + error(1, 0, "sendto: %d != %llu", ret, | ||
13531 | + (unsigned long long)msg->msg_iov->iov_len); | ||
13532 | if (msg->msg_flags) | ||
13533 | error(1, 0, "sendmsg: return flags 0x%x\n", msg->msg_flags); | ||
13534 | |||
13535 | diff --git a/tools/testing/selftests/net/udpgso_bench_tx.c b/tools/testing/selftests/net/udpgso_bench_tx.c | ||
13536 | index ada99496634a..17512a43885e 100644 | ||
13537 | --- a/tools/testing/selftests/net/udpgso_bench_tx.c | ||
13538 | +++ b/tools/testing/selftests/net/udpgso_bench_tx.c | ||
13539 | @@ -405,7 +405,8 @@ static int send_udp_segment(int fd, char *data) | ||
13540 | if (ret == -1) | ||
13541 | error(1, errno, "sendmsg"); | ||
13542 | if (ret != iov.iov_len) | ||
13543 | - error(1, 0, "sendmsg: %u != %lu\n", ret, iov.iov_len); | ||
13544 | + error(1, 0, "sendmsg: %u != %llu\n", ret, | ||
13545 | + (unsigned long long)iov.iov_len); | ||
13546 | |||
13547 | return 1; | ||
13548 | } | ||
13549 | diff --git a/tools/testing/selftests/proc/proc-self-map-files-002.c b/tools/testing/selftests/proc/proc-self-map-files-002.c | ||
13550 | index 47b7473dedef..e6aa00a183bc 100644 | ||
13551 | --- a/tools/testing/selftests/proc/proc-self-map-files-002.c | ||
13552 | +++ b/tools/testing/selftests/proc/proc-self-map-files-002.c | ||
13553 | @@ -47,7 +47,11 @@ static void fail(const char *fmt, unsigned long a, unsigned long b) | ||
13554 | int main(void) | ||
13555 | { | ||
13556 | const int PAGE_SIZE = sysconf(_SC_PAGESIZE); | ||
13557 | - const unsigned long va_max = 1UL << 32; | ||
13558 | + /* | ||
13559 | + * va_max must be enough bigger than vm.mmap_min_addr, which is | ||
13560 | + * 64KB/32KB by default. (depends on CONFIG_LSM_MMAP_MIN_ADDR) | ||
13561 | + */ | ||
13562 | + const unsigned long va_max = 1UL << 20; | ||
13563 | unsigned long va; | ||
13564 | void *p; | ||
13565 | int fd; | ||
13566 | diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c | ||
13567 | index 38b4c910b6c3..f23c9cd5684f 100644 | ||
13568 | --- a/virt/kvm/arm/mmu.c | ||
13569 | +++ b/virt/kvm/arm/mmu.c | ||
13570 | @@ -38,6 +38,11 @@ static unsigned long io_map_base; | ||
13571 | #define KVM_S2PTE_FLAG_IS_IOMAP (1UL << 0) | ||
13572 | #define KVM_S2_FLAG_LOGGING_ACTIVE (1UL << 1) | ||
13573 | |||
13574 | +static bool is_iomap(unsigned long flags) | ||
13575 | +{ | ||
13576 | + return flags & KVM_S2PTE_FLAG_IS_IOMAP; | ||
13577 | +} | ||
13578 | + | ||
13579 | static bool memslot_is_logging(struct kvm_memory_slot *memslot) | ||
13580 | { | ||
13581 | return memslot->dirty_bitmap && !(memslot->flags & KVM_MEM_READONLY); | ||
13582 | @@ -1698,6 +1703,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | ||
13583 | |||
13584 | vma_pagesize = vma_kernel_pagesize(vma); | ||
13585 | if (logging_active || | ||
13586 | + (vma->vm_flags & VM_PFNMAP) || | ||
13587 | !fault_supports_stage2_huge_mapping(memslot, hva, vma_pagesize)) { | ||
13588 | force_pte = true; | ||
13589 | vma_pagesize = PAGE_SIZE; | ||
13590 | @@ -1760,6 +1766,9 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | ||
13591 | writable = false; | ||
13592 | } | ||
13593 | |||
13594 | + if (exec_fault && is_iomap(flags)) | ||
13595 | + return -ENOEXEC; | ||
13596 | + | ||
13597 | spin_lock(&kvm->mmu_lock); | ||
13598 | if (mmu_notifier_retry(kvm, mmu_seq)) | ||
13599 | goto out_unlock; | ||
13600 | @@ -1781,7 +1790,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, | ||
13601 | if (writable) | ||
13602 | kvm_set_pfn_dirty(pfn); | ||
13603 | |||
13604 | - if (fault_status != FSC_PERM) | ||
13605 | + if (fault_status != FSC_PERM && !is_iomap(flags)) | ||
13606 | clean_dcache_guest_page(pfn, vma_pagesize); | ||
13607 | |||
13608 | if (exec_fault) | ||
13609 | @@ -1948,9 +1957,8 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||
13610 | if (kvm_is_error_hva(hva) || (write_fault && !writable)) { | ||
13611 | if (is_iabt) { | ||
13612 | /* Prefetch Abort on I/O address */ | ||
13613 | - kvm_inject_pabt(vcpu, kvm_vcpu_get_hfar(vcpu)); | ||
13614 | - ret = 1; | ||
13615 | - goto out_unlock; | ||
13616 | + ret = -ENOEXEC; | ||
13617 | + goto out; | ||
13618 | } | ||
13619 | |||
13620 | /* | ||
13621 | @@ -1992,6 +2000,11 @@ int kvm_handle_guest_abort(struct kvm_vcpu *vcpu, struct kvm_run *run) | ||
13622 | ret = user_mem_abort(vcpu, fault_ipa, memslot, hva, fault_status); | ||
13623 | if (ret == 0) | ||
13624 | ret = 1; | ||
13625 | +out: | ||
13626 | + if (ret == -ENOEXEC) { | ||
13627 | + kvm_inject_pabt(vcpu, kvm_vcpu_get_hfar(vcpu)); | ||
13628 | + ret = 1; | ||
13629 | + } | ||
13630 | out_unlock: | ||
13631 | srcu_read_unlock(&vcpu->kvm->srcu, idx); | ||
13632 | return ret; |