Contents of /trunk/kernel-alx/patches-5.4/0106-5.4.7-all-fixes.patch
Parent Directory | Revision Log
Revision 3487 -
(show 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 | 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; |