Annotation of /trunk/kernel-alx/patches-5.4/0205-5.4.106-all-fixes.patch
Parent Directory | Revision Log
Revision 3637 -
(hide annotations)
(download)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 175325 byte(s)
Mon Oct 24 12:40:44 2022 UTC (23 months ago) by niro
File size: 175325 byte(s)
-add missing
1 | niro | 3637 | diff --git a/Documentation/virt/kvm/api.txt b/Documentation/virt/kvm/api.txt |
2 | index 7064efd3b5ea3..fd22224853e58 100644 | ||
3 | --- a/Documentation/virt/kvm/api.txt | ||
4 | +++ b/Documentation/virt/kvm/api.txt | ||
5 | @@ -172,6 +172,9 @@ is dependent on the CPU capability and the kernel configuration. The limit can | ||
6 | be retrieved using KVM_CAP_ARM_VM_IPA_SIZE of the KVM_CHECK_EXTENSION | ||
7 | ioctl() at run-time. | ||
8 | |||
9 | +Creation of the VM will fail if the requested IPA size (whether it is | ||
10 | +implicit or explicit) is unsupported on the host. | ||
11 | + | ||
12 | Please note that configuring the IPA size does not affect the capability | ||
13 | exposed by the guest CPUs in ID_AA64MMFR0_EL1[PARange]. It only affects | ||
14 | size of the address translated by the stage2 level (guest physical to | ||
15 | diff --git a/Makefile b/Makefile | ||
16 | index e27d031f3241e..a333b378f1f71 100644 | ||
17 | --- a/Makefile | ||
18 | +++ b/Makefile | ||
19 | @@ -1,7 +1,7 @@ | ||
20 | # SPDX-License-Identifier: GPL-2.0 | ||
21 | VERSION = 5 | ||
22 | PATCHLEVEL = 4 | ||
23 | -SUBLEVEL = 105 | ||
24 | +SUBLEVEL = 106 | ||
25 | EXTRAVERSION = | ||
26 | NAME = Kleptomaniac Octopus | ||
27 | |||
28 | @@ -1175,9 +1175,15 @@ define filechk_utsrelease.h | ||
29 | endef | ||
30 | |||
31 | define filechk_version.h | ||
32 | - echo \#define LINUX_VERSION_CODE $(shell \ | ||
33 | - expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 0$(SUBLEVEL)); \ | ||
34 | - echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' | ||
35 | + if [ $(SUBLEVEL) -gt 255 ]; then \ | ||
36 | + echo \#define LINUX_VERSION_CODE $(shell \ | ||
37 | + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + 255); \ | ||
38 | + else \ | ||
39 | + echo \#define LINUX_VERSION_CODE $(shell \ | ||
40 | + expr $(VERSION) \* 65536 + 0$(PATCHLEVEL) \* 256 + $(SUBLEVEL)); \ | ||
41 | + fi; \ | ||
42 | + echo '#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + \ | ||
43 | + ((c) > 255 ? 255 : (c)))' | ||
44 | endef | ||
45 | |||
46 | $(version_h): FORCE | ||
47 | diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h | ||
48 | index f615830f9f57b..9d0b7e677faac 100644 | ||
49 | --- a/arch/arm/include/asm/kvm_asm.h | ||
50 | +++ b/arch/arm/include/asm/kvm_asm.h | ||
51 | @@ -56,7 +56,7 @@ extern char __kvm_hyp_init_end[]; | ||
52 | extern void __kvm_flush_vm_context(void); | ||
53 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | ||
54 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); | ||
55 | -extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu); | ||
56 | +extern void __kvm_flush_cpu_context(struct kvm_vcpu *vcpu); | ||
57 | |||
58 | extern void __kvm_timer_set_cntvoff(u32 cntvoff_low, u32 cntvoff_high); | ||
59 | |||
60 | diff --git a/arch/arm/kvm/hyp/tlb.c b/arch/arm/kvm/hyp/tlb.c | ||
61 | index 848f27bbad9db..80e67108d39d1 100644 | ||
62 | --- a/arch/arm/kvm/hyp/tlb.c | ||
63 | +++ b/arch/arm/kvm/hyp/tlb.c | ||
64 | @@ -45,7 +45,7 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa) | ||
65 | __kvm_tlb_flush_vmid(kvm); | ||
66 | } | ||
67 | |||
68 | -void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) | ||
69 | +void __hyp_text __kvm_flush_cpu_context(struct kvm_vcpu *vcpu) | ||
70 | { | ||
71 | struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm); | ||
72 | |||
73 | @@ -54,6 +54,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) | ||
74 | isb(); | ||
75 | |||
76 | write_sysreg(0, TLBIALL); | ||
77 | + write_sysreg(0, ICIALLU); | ||
78 | dsb(nsh); | ||
79 | isb(); | ||
80 | |||
81 | diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h | ||
82 | index 64d79b2884344..c54e759896c1a 100644 | ||
83 | --- a/arch/arm64/include/asm/kvm_asm.h | ||
84 | +++ b/arch/arm64/include/asm/kvm_asm.h | ||
85 | @@ -60,7 +60,7 @@ extern char __kvm_hyp_vector[]; | ||
86 | extern void __kvm_flush_vm_context(void); | ||
87 | extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); | ||
88 | extern void __kvm_tlb_flush_vmid(struct kvm *kvm); | ||
89 | -extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu); | ||
90 | +extern void __kvm_flush_cpu_context(struct kvm_vcpu *vcpu); | ||
91 | |||
92 | extern void __kvm_timer_set_cntvoff(u32 cntvoff_low, u32 cntvoff_high); | ||
93 | |||
94 | diff --git a/arch/arm64/include/asm/memory.h b/arch/arm64/include/asm/memory.h | ||
95 | index 6c295a231882a..67b6b90f37eed 100644 | ||
96 | --- a/arch/arm64/include/asm/memory.h | ||
97 | +++ b/arch/arm64/include/asm/memory.h | ||
98 | @@ -315,6 +315,11 @@ static inline void *phys_to_virt(phys_addr_t x) | ||
99 | #define ARCH_PFN_OFFSET ((unsigned long)PHYS_PFN_OFFSET) | ||
100 | |||
101 | #if !defined(CONFIG_SPARSEMEM_VMEMMAP) || defined(CONFIG_DEBUG_VIRTUAL) | ||
102 | +#define page_to_virt(x) ({ \ | ||
103 | + __typeof__(x) __page = x; \ | ||
104 | + void *__addr = __va(page_to_phys(__page)); \ | ||
105 | + (void *)__tag_set((const void *)__addr, page_kasan_tag(__page));\ | ||
106 | +}) | ||
107 | #define virt_to_page(x) pfn_to_page(virt_to_pfn(x)) | ||
108 | #else | ||
109 | #define page_to_virt(x) ({ \ | ||
110 | diff --git a/arch/arm64/include/asm/mmu_context.h b/arch/arm64/include/asm/mmu_context.h | ||
111 | index 3827ff4040a3f..3a5d9f1c91b6d 100644 | ||
112 | --- a/arch/arm64/include/asm/mmu_context.h | ||
113 | +++ b/arch/arm64/include/asm/mmu_context.h | ||
114 | @@ -63,10 +63,7 @@ extern u64 idmap_ptrs_per_pgd; | ||
115 | |||
116 | static inline bool __cpu_uses_extended_idmap(void) | ||
117 | { | ||
118 | - if (IS_ENABLED(CONFIG_ARM64_VA_BITS_52)) | ||
119 | - return false; | ||
120 | - | ||
121 | - return unlikely(idmap_t0sz != TCR_T0SZ(VA_BITS)); | ||
122 | + return unlikely(idmap_t0sz != TCR_T0SZ(vabits_actual)); | ||
123 | } | ||
124 | |||
125 | /* | ||
126 | diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S | ||
127 | index 438de2301cfe3..a2e0b37549433 100644 | ||
128 | --- a/arch/arm64/kernel/head.S | ||
129 | +++ b/arch/arm64/kernel/head.S | ||
130 | @@ -337,7 +337,7 @@ __create_page_tables: | ||
131 | */ | ||
132 | adrp x5, __idmap_text_end | ||
133 | clz x5, x5 | ||
134 | - cmp x5, TCR_T0SZ(VA_BITS) // default T0SZ small enough? | ||
135 | + cmp x5, TCR_T0SZ(VA_BITS_MIN) // default T0SZ small enough? | ||
136 | b.ge 1f // .. then skip VA range extension | ||
137 | |||
138 | adr_l x6, idmap_t0sz | ||
139 | diff --git a/arch/arm64/kvm/hyp/tlb.c b/arch/arm64/kvm/hyp/tlb.c | ||
140 | index eb0efc5557f30..7b7213fc17d95 100644 | ||
141 | --- a/arch/arm64/kvm/hyp/tlb.c | ||
142 | +++ b/arch/arm64/kvm/hyp/tlb.c | ||
143 | @@ -182,7 +182,7 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm) | ||
144 | __tlb_switch_to_host(kvm, &cxt); | ||
145 | } | ||
146 | |||
147 | -void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) | ||
148 | +void __hyp_text __kvm_flush_cpu_context(struct kvm_vcpu *vcpu) | ||
149 | { | ||
150 | struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm); | ||
151 | struct tlb_inv_context cxt; | ||
152 | @@ -191,6 +191,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu) | ||
153 | __tlb_switch_to_guest(kvm, &cxt); | ||
154 | |||
155 | __tlbi(vmalle1); | ||
156 | + asm volatile("ic iallu"); | ||
157 | dsb(nsh); | ||
158 | isb(); | ||
159 | |||
160 | diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c | ||
161 | index 784d485218ca1..a3105ae464be1 100644 | ||
162 | --- a/arch/arm64/kvm/reset.c | ||
163 | +++ b/arch/arm64/kvm/reset.c | ||
164 | @@ -378,10 +378,10 @@ void kvm_set_ipa_limit(void) | ||
165 | pr_info("kvm: Limiting the IPA size due to kernel %s Address limit\n", | ||
166 | (va_max < pa_max) ? "Virtual" : "Physical"); | ||
167 | |||
168 | - WARN(ipa_max < KVM_PHYS_SHIFT, | ||
169 | - "KVM IPA limit (%d bit) is smaller than default size\n", ipa_max); | ||
170 | kvm_ipa_limit = ipa_max; | ||
171 | - kvm_info("IPA Size Limit: %dbits\n", kvm_ipa_limit); | ||
172 | + kvm_info("IPA Size Limit: %d bits%s\n", kvm_ipa_limit, | ||
173 | + ((kvm_ipa_limit < KVM_PHYS_SHIFT) ? | ||
174 | + " (Reduced IPA size, limited VM/VMM compatibility)" : "")); | ||
175 | } | ||
176 | |||
177 | /* | ||
178 | @@ -408,6 +408,11 @@ int kvm_arm_setup_stage2(struct kvm *kvm, unsigned long type) | ||
179 | return -EINVAL; | ||
180 | } else { | ||
181 | phys_shift = KVM_PHYS_SHIFT; | ||
182 | + if (phys_shift > kvm_ipa_limit) { | ||
183 | + pr_warn_once("%s using unsupported default IPA limit, upgrade your VMM\n", | ||
184 | + current->comm); | ||
185 | + return -EINVAL; | ||
186 | + } | ||
187 | } | ||
188 | |||
189 | parange = read_sanitised_ftr_reg(SYS_ID_AA64MMFR0_EL1) & 7; | ||
190 | diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c | ||
191 | index 602bd19630ff8..cbcac03c0e0da 100644 | ||
192 | --- a/arch/arm64/mm/init.c | ||
193 | +++ b/arch/arm64/mm/init.c | ||
194 | @@ -245,6 +245,18 @@ int pfn_valid(unsigned long pfn) | ||
195 | |||
196 | if (!valid_section(__nr_to_section(pfn_to_section_nr(pfn)))) | ||
197 | return 0; | ||
198 | + | ||
199 | + /* | ||
200 | + * ZONE_DEVICE memory does not have the memblock entries. | ||
201 | + * memblock_is_map_memory() check for ZONE_DEVICE based | ||
202 | + * addresses will always fail. Even the normal hotplugged | ||
203 | + * memory will never have MEMBLOCK_NOMAP flag set in their | ||
204 | + * memblock entries. Skip memblock search for all non early | ||
205 | + * memory sections covering all of hotplug memory including | ||
206 | + * both normal and ZONE_DEVICE based. | ||
207 | + */ | ||
208 | + if (!early_section(__pfn_to_section(pfn))) | ||
209 | + return pfn_section_valid(__pfn_to_section(pfn), pfn); | ||
210 | #endif | ||
211 | return memblock_is_map_memory(addr); | ||
212 | } | ||
213 | diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c | ||
214 | index d10247fab0fdf..99bc0289ab2b6 100644 | ||
215 | --- a/arch/arm64/mm/mmu.c | ||
216 | +++ b/arch/arm64/mm/mmu.c | ||
217 | @@ -38,7 +38,7 @@ | ||
218 | #define NO_BLOCK_MAPPINGS BIT(0) | ||
219 | #define NO_CONT_MAPPINGS BIT(1) | ||
220 | |||
221 | -u64 idmap_t0sz = TCR_T0SZ(VA_BITS); | ||
222 | +u64 idmap_t0sz = TCR_T0SZ(VA_BITS_MIN); | ||
223 | u64 idmap_ptrs_per_pgd = PTRS_PER_PGD; | ||
224 | |||
225 | u64 __section(".mmuoff.data.write") vabits_actual; | ||
226 | diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h | ||
227 | index 898b542628815..be0f7257b13c8 100644 | ||
228 | --- a/arch/powerpc/include/asm/code-patching.h | ||
229 | +++ b/arch/powerpc/include/asm/code-patching.h | ||
230 | @@ -72,7 +72,7 @@ void __patch_exception(int exc, unsigned long addr); | ||
231 | #endif | ||
232 | |||
233 | #define OP_RT_RA_MASK 0xffff0000UL | ||
234 | -#define LIS_R2 0x3c020000UL | ||
235 | +#define LIS_R2 0x3c400000UL | ||
236 | #define ADDIS_R2_R12 0x3c4c0000UL | ||
237 | #define ADDI_R2_R2 0x38420000UL | ||
238 | |||
239 | diff --git a/arch/powerpc/include/asm/machdep.h b/arch/powerpc/include/asm/machdep.h | ||
240 | index 7bcb64444a394..f71c361dc356f 100644 | ||
241 | --- a/arch/powerpc/include/asm/machdep.h | ||
242 | +++ b/arch/powerpc/include/asm/machdep.h | ||
243 | @@ -59,6 +59,9 @@ struct machdep_calls { | ||
244 | int (*pcibios_root_bridge_prepare)(struct pci_host_bridge | ||
245 | *bridge); | ||
246 | |||
247 | + /* finds all the pci_controllers present at boot */ | ||
248 | + void (*discover_phbs)(void); | ||
249 | + | ||
250 | /* To setup PHBs when using automatic OF platform driver for PCI */ | ||
251 | int (*pci_setup_phb)(struct pci_controller *host); | ||
252 | |||
253 | diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h | ||
254 | index c41220f4aad9e..5a424f867c828 100644 | ||
255 | --- a/arch/powerpc/include/asm/ptrace.h | ||
256 | +++ b/arch/powerpc/include/asm/ptrace.h | ||
257 | @@ -62,6 +62,9 @@ struct pt_regs | ||
258 | }; | ||
259 | #endif | ||
260 | |||
261 | + | ||
262 | +#define STACK_FRAME_WITH_PT_REGS (STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)) | ||
263 | + | ||
264 | #ifdef __powerpc64__ | ||
265 | |||
266 | /* | ||
267 | diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c | ||
268 | index 5c0a1e17219b7..af399675248ed 100644 | ||
269 | --- a/arch/powerpc/kernel/asm-offsets.c | ||
270 | +++ b/arch/powerpc/kernel/asm-offsets.c | ||
271 | @@ -285,7 +285,7 @@ int main(void) | ||
272 | |||
273 | /* Interrupt register frame */ | ||
274 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); | ||
275 | - DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs)); | ||
276 | + DEFINE(SWITCH_FRAME_SIZE, STACK_FRAME_WITH_PT_REGS); | ||
277 | STACK_PT_REGS_OFFSET(GPR0, gpr[0]); | ||
278 | STACK_PT_REGS_OFFSET(GPR1, gpr[1]); | ||
279 | STACK_PT_REGS_OFFSET(GPR2, gpr[2]); | ||
280 | diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S | ||
281 | index 126ba54384300..edaab1142498c 100644 | ||
282 | --- a/arch/powerpc/kernel/head_32.S | ||
283 | +++ b/arch/powerpc/kernel/head_32.S | ||
284 | @@ -418,10 +418,11 @@ InstructionTLBMiss: | ||
285 | cmplw 0,r1,r3 | ||
286 | #endif | ||
287 | mfspr r2, SPRN_SPRG_PGDIR | ||
288 | - li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC | ||
289 | + li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC | _PAGE_USER | ||
290 | #if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC) | ||
291 | bge- 112f | ||
292 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ | ||
293 | + li r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC | ||
294 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ | ||
295 | #endif | ||
296 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ | ||
297 | @@ -480,9 +481,10 @@ DataLoadTLBMiss: | ||
298 | lis r1,PAGE_OFFSET@h /* check if kernel address */ | ||
299 | cmplw 0,r1,r3 | ||
300 | mfspr r2, SPRN_SPRG_PGDIR | ||
301 | - li r1, _PAGE_PRESENT | _PAGE_ACCESSED | ||
302 | + li r1, _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER | ||
303 | bge- 112f | ||
304 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ | ||
305 | + li r1, _PAGE_PRESENT | _PAGE_ACCESSED | ||
306 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ | ||
307 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ | ||
308 | lwz r2,0(r2) /* get pmd entry */ | ||
309 | @@ -556,9 +558,10 @@ DataStoreTLBMiss: | ||
310 | lis r1,PAGE_OFFSET@h /* check if kernel address */ | ||
311 | cmplw 0,r1,r3 | ||
312 | mfspr r2, SPRN_SPRG_PGDIR | ||
313 | - li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED | ||
314 | + li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_USER | ||
315 | bge- 112f | ||
316 | lis r2, (swapper_pg_dir - PAGE_OFFSET)@ha /* if kernel address, use */ | ||
317 | + li r1, _PAGE_RW | _PAGE_DIRTY | _PAGE_PRESENT | _PAGE_ACCESSED | ||
318 | addi r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l /* kernel page table */ | ||
319 | 112: rlwimi r2,r3,12,20,29 /* insert top 10 bits of address */ | ||
320 | lwz r2,0(r2) /* get pmd entry */ | ||
321 | diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c | ||
322 | index 1c448cf255061..a2c258a8d7367 100644 | ||
323 | --- a/arch/powerpc/kernel/pci-common.c | ||
324 | +++ b/arch/powerpc/kernel/pci-common.c | ||
325 | @@ -1669,3 +1669,13 @@ static void fixup_hide_host_resource_fsl(struct pci_dev *dev) | ||
326 | } | ||
327 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MOTOROLA, PCI_ANY_ID, fixup_hide_host_resource_fsl); | ||
328 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_FREESCALE, PCI_ANY_ID, fixup_hide_host_resource_fsl); | ||
329 | + | ||
330 | + | ||
331 | +static int __init discover_phbs(void) | ||
332 | +{ | ||
333 | + if (ppc_md.discover_phbs) | ||
334 | + ppc_md.discover_phbs(); | ||
335 | + | ||
336 | + return 0; | ||
337 | +} | ||
338 | +core_initcall(discover_phbs); | ||
339 | diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c | ||
340 | index bd0c258a1d5dd..c94bba9142e7e 100644 | ||
341 | --- a/arch/powerpc/kernel/process.c | ||
342 | +++ b/arch/powerpc/kernel/process.c | ||
343 | @@ -2081,7 +2081,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) | ||
344 | * See if this is an exception frame. | ||
345 | * We look for the "regshere" marker in the current frame. | ||
346 | */ | ||
347 | - if (validate_sp(sp, tsk, STACK_INT_FRAME_SIZE) | ||
348 | + if (validate_sp(sp, tsk, STACK_FRAME_WITH_PT_REGS) | ||
349 | && stack[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) { | ||
350 | struct pt_regs *regs = (struct pt_regs *) | ||
351 | (sp + STACK_FRAME_OVERHEAD); | ||
352 | diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c | ||
353 | index 206032c9b5458..ecfa460f66d17 100644 | ||
354 | --- a/arch/powerpc/kernel/traps.c | ||
355 | +++ b/arch/powerpc/kernel/traps.c | ||
356 | @@ -513,8 +513,11 @@ out: | ||
357 | die("Unrecoverable nested System Reset", regs, SIGABRT); | ||
358 | #endif | ||
359 | /* Must die if the interrupt is not recoverable */ | ||
360 | - if (!(regs->msr & MSR_RI)) | ||
361 | + if (!(regs->msr & MSR_RI)) { | ||
362 | + /* For the reason explained in die_mce, nmi_exit before die */ | ||
363 | + nmi_exit(); | ||
364 | die("Unrecoverable System Reset", regs, SIGABRT); | ||
365 | + } | ||
366 | |||
367 | if (saved_hsrrs) { | ||
368 | mtspr(SPRN_HSRR0, hsrr0); | ||
369 | diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c | ||
370 | index 02fc75ddcbb36..6f013e4188349 100644 | ||
371 | --- a/arch/powerpc/perf/core-book3s.c | ||
372 | +++ b/arch/powerpc/perf/core-book3s.c | ||
373 | @@ -2077,7 +2077,17 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | ||
374 | left += period; | ||
375 | if (left <= 0) | ||
376 | left = period; | ||
377 | - record = siar_valid(regs); | ||
378 | + | ||
379 | + /* | ||
380 | + * If address is not requested in the sample via | ||
381 | + * PERF_SAMPLE_IP, just record that sample irrespective | ||
382 | + * of SIAR valid check. | ||
383 | + */ | ||
384 | + if (event->attr.sample_type & PERF_SAMPLE_IP) | ||
385 | + record = siar_valid(regs); | ||
386 | + else | ||
387 | + record = 1; | ||
388 | + | ||
389 | event->hw.last_period = event->hw.sample_period; | ||
390 | } | ||
391 | if (left < 0x80000000LL) | ||
392 | @@ -2095,9 +2105,10 @@ static void record_and_restart(struct perf_event *event, unsigned long val, | ||
393 | * MMCR2. Check attr.exclude_kernel and address to drop the sample in | ||
394 | * these cases. | ||
395 | */ | ||
396 | - if (event->attr.exclude_kernel && record) | ||
397 | - if (is_kernel_addr(mfspr(SPRN_SIAR))) | ||
398 | - record = 0; | ||
399 | + if (event->attr.exclude_kernel && | ||
400 | + (event->attr.sample_type & PERF_SAMPLE_IP) && | ||
401 | + is_kernel_addr(mfspr(SPRN_SIAR))) | ||
402 | + record = 0; | ||
403 | |||
404 | /* | ||
405 | * Finally record data if requested. | ||
406 | diff --git a/arch/powerpc/platforms/pseries/msi.c b/arch/powerpc/platforms/pseries/msi.c | ||
407 | index b3ac2455faadc..637300330507f 100644 | ||
408 | --- a/arch/powerpc/platforms/pseries/msi.c | ||
409 | +++ b/arch/powerpc/platforms/pseries/msi.c | ||
410 | @@ -4,6 +4,7 @@ | ||
411 | * Copyright 2006-2007 Michael Ellerman, IBM Corp. | ||
412 | */ | ||
413 | |||
414 | +#include <linux/crash_dump.h> | ||
415 | #include <linux/device.h> | ||
416 | #include <linux/irq.h> | ||
417 | #include <linux/msi.h> | ||
418 | @@ -458,8 +459,28 @@ again: | ||
419 | return hwirq; | ||
420 | } | ||
421 | |||
422 | - virq = irq_create_mapping_affinity(NULL, hwirq, | ||
423 | - entry->affinity); | ||
424 | + /* | ||
425 | + * Depending on the number of online CPUs in the original | ||
426 | + * kernel, it is likely for CPU #0 to be offline in a kdump | ||
427 | + * kernel. The associated IRQs in the affinity mappings | ||
428 | + * provided by irq_create_affinity_masks() are thus not | ||
429 | + * started by irq_startup(), as per-design for managed IRQs. | ||
430 | + * This can be a problem with multi-queue block devices driven | ||
431 | + * by blk-mq : such a non-started IRQ is very likely paired | ||
432 | + * with the single queue enforced by blk-mq during kdump (see | ||
433 | + * blk_mq_alloc_tag_set()). This causes the device to remain | ||
434 | + * silent and likely hangs the guest at some point. | ||
435 | + * | ||
436 | + * We don't really care for fine-grained affinity when doing | ||
437 | + * kdump actually : simply ignore the pre-computed affinity | ||
438 | + * masks in this case and let the default mask with all CPUs | ||
439 | + * be used when creating the IRQ mappings. | ||
440 | + */ | ||
441 | + if (is_kdump_kernel()) | ||
442 | + virq = irq_create_mapping(NULL, hwirq); | ||
443 | + else | ||
444 | + virq = irq_create_mapping_affinity(NULL, hwirq, | ||
445 | + entry->affinity); | ||
446 | |||
447 | if (!virq) { | ||
448 | pr_debug("rtas_msi: Failed mapping hwirq %d\n", hwirq); | ||
449 | diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c | ||
450 | index 659d99af91566..8c51462f13fd1 100644 | ||
451 | --- a/arch/s390/kernel/smp.c | ||
452 | +++ b/arch/s390/kernel/smp.c | ||
453 | @@ -765,7 +765,7 @@ static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail, | ||
454 | static int __smp_rescan_cpus(struct sclp_core_info *info, bool early) | ||
455 | { | ||
456 | struct sclp_core_entry *core; | ||
457 | - cpumask_t avail; | ||
458 | + static cpumask_t avail; | ||
459 | bool configured; | ||
460 | u16 core_id; | ||
461 | int nr, i; | ||
462 | diff --git a/arch/sparc/include/asm/mman.h b/arch/sparc/include/asm/mman.h | ||
463 | index f94532f25db14..274217e7ed702 100644 | ||
464 | --- a/arch/sparc/include/asm/mman.h | ||
465 | +++ b/arch/sparc/include/asm/mman.h | ||
466 | @@ -57,35 +57,39 @@ static inline int sparc_validate_prot(unsigned long prot, unsigned long addr) | ||
467 | { | ||
468 | if (prot & ~(PROT_READ | PROT_WRITE | PROT_EXEC | PROT_SEM | PROT_ADI)) | ||
469 | return 0; | ||
470 | - if (prot & PROT_ADI) { | ||
471 | - if (!adi_capable()) | ||
472 | - return 0; | ||
473 | + return 1; | ||
474 | +} | ||
475 | |||
476 | - if (addr) { | ||
477 | - struct vm_area_struct *vma; | ||
478 | +#define arch_validate_flags(vm_flags) arch_validate_flags(vm_flags) | ||
479 | +/* arch_validate_flags() - Ensure combination of flags is valid for a | ||
480 | + * VMA. | ||
481 | + */ | ||
482 | +static inline bool arch_validate_flags(unsigned long vm_flags) | ||
483 | +{ | ||
484 | + /* If ADI is being enabled on this VMA, check for ADI | ||
485 | + * capability on the platform and ensure VMA is suitable | ||
486 | + * for ADI | ||
487 | + */ | ||
488 | + if (vm_flags & VM_SPARC_ADI) { | ||
489 | + if (!adi_capable()) | ||
490 | + return false; | ||
491 | |||
492 | - vma = find_vma(current->mm, addr); | ||
493 | - if (vma) { | ||
494 | - /* ADI can not be enabled on PFN | ||
495 | - * mapped pages | ||
496 | - */ | ||
497 | - if (vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) | ||
498 | - return 0; | ||
499 | + /* ADI can not be enabled on PFN mapped pages */ | ||
500 | + if (vm_flags & (VM_PFNMAP | VM_MIXEDMAP)) | ||
501 | + return false; | ||
502 | |||
503 | - /* Mergeable pages can become unmergeable | ||
504 | - * if ADI is enabled on them even if they | ||
505 | - * have identical data on them. This can be | ||
506 | - * because ADI enabled pages with identical | ||
507 | - * data may still not have identical ADI | ||
508 | - * tags on them. Disallow ADI on mergeable | ||
509 | - * pages. | ||
510 | - */ | ||
511 | - if (vma->vm_flags & VM_MERGEABLE) | ||
512 | - return 0; | ||
513 | - } | ||
514 | - } | ||
515 | + /* Mergeable pages can become unmergeable | ||
516 | + * if ADI is enabled on them even if they | ||
517 | + * have identical data on them. This can be | ||
518 | + * because ADI enabled pages with identical | ||
519 | + * data may still not have identical ADI | ||
520 | + * tags on them. Disallow ADI on mergeable | ||
521 | + * pages. | ||
522 | + */ | ||
523 | + if (vm_flags & VM_MERGEABLE) | ||
524 | + return false; | ||
525 | } | ||
526 | - return 1; | ||
527 | + return true; | ||
528 | } | ||
529 | #endif /* CONFIG_SPARC64 */ | ||
530 | |||
531 | diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c | ||
532 | index 906eda1158b4d..40dd6cb4a4133 100644 | ||
533 | --- a/arch/sparc/mm/init_32.c | ||
534 | +++ b/arch/sparc/mm/init_32.c | ||
535 | @@ -197,6 +197,9 @@ unsigned long __init bootmem_init(unsigned long *pages_avail) | ||
536 | size = memblock_phys_mem_size() - memblock_reserved_size(); | ||
537 | *pages_avail = (size >> PAGE_SHIFT) - high_pages; | ||
538 | |||
539 | + /* Only allow low memory to be allocated via memblock allocation */ | ||
540 | + memblock_set_current_limit(max_low_pfn << PAGE_SHIFT); | ||
541 | + | ||
542 | return max_pfn; | ||
543 | } | ||
544 | |||
545 | diff --git a/arch/x86/kernel/unwind_orc.c b/arch/x86/kernel/unwind_orc.c | ||
546 | index f29f015a5e7f3..b934f9f68a168 100644 | ||
547 | --- a/arch/x86/kernel/unwind_orc.c | ||
548 | +++ b/arch/x86/kernel/unwind_orc.c | ||
549 | @@ -357,8 +357,8 @@ static bool deref_stack_regs(struct unwind_state *state, unsigned long addr, | ||
550 | if (!stack_access_ok(state, addr, sizeof(struct pt_regs))) | ||
551 | return false; | ||
552 | |||
553 | - *ip = regs->ip; | ||
554 | - *sp = regs->sp; | ||
555 | + *ip = READ_ONCE_NOCHECK(regs->ip); | ||
556 | + *sp = READ_ONCE_NOCHECK(regs->sp); | ||
557 | return true; | ||
558 | } | ||
559 | |||
560 | @@ -370,8 +370,8 @@ static bool deref_stack_iret_regs(struct unwind_state *state, unsigned long addr | ||
561 | if (!stack_access_ok(state, addr, IRET_FRAME_SIZE)) | ||
562 | return false; | ||
563 | |||
564 | - *ip = regs->ip; | ||
565 | - *sp = regs->sp; | ||
566 | + *ip = READ_ONCE_NOCHECK(regs->ip); | ||
567 | + *sp = READ_ONCE_NOCHECK(regs->sp); | ||
568 | return true; | ||
569 | } | ||
570 | |||
571 | @@ -392,12 +392,12 @@ static bool get_reg(struct unwind_state *state, unsigned int reg_off, | ||
572 | return false; | ||
573 | |||
574 | if (state->full_regs) { | ||
575 | - *val = ((unsigned long *)state->regs)[reg]; | ||
576 | + *val = READ_ONCE_NOCHECK(((unsigned long *)state->regs)[reg]); | ||
577 | return true; | ||
578 | } | ||
579 | |||
580 | if (state->prev_regs) { | ||
581 | - *val = ((unsigned long *)state->prev_regs)[reg]; | ||
582 | + *val = READ_ONCE_NOCHECK(((unsigned long *)state->prev_regs)[reg]); | ||
583 | return true; | ||
584 | } | ||
585 | |||
586 | diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c | ||
587 | index 7d5236eafe845..4c3b9813b2843 100644 | ||
588 | --- a/drivers/base/swnode.c | ||
589 | +++ b/drivers/base/swnode.c | ||
590 | @@ -812,6 +812,9 @@ int software_node_register(const struct software_node *node) | ||
591 | if (software_node_to_swnode(node)) | ||
592 | return -EEXIST; | ||
593 | |||
594 | + if (node->parent && !parent) | ||
595 | + return -EINVAL; | ||
596 | + | ||
597 | return PTR_ERR_OR_ZERO(swnode_register(node, parent, 0)); | ||
598 | } | ||
599 | EXPORT_SYMBOL_GPL(software_node_register); | ||
600 | diff --git a/drivers/block/rsxx/core.c b/drivers/block/rsxx/core.c | ||
601 | index 804d28faa97b0..a1824bb080446 100644 | ||
602 | --- a/drivers/block/rsxx/core.c | ||
603 | +++ b/drivers/block/rsxx/core.c | ||
604 | @@ -869,6 +869,7 @@ static int rsxx_pci_probe(struct pci_dev *dev, | ||
605 | card->event_wq = create_singlethread_workqueue(DRIVER_NAME"_event"); | ||
606 | if (!card->event_wq) { | ||
607 | dev_err(CARD_TO_DEV(card), "Failed card event setup.\n"); | ||
608 | + st = -ENOMEM; | ||
609 | goto failed_event_handler; | ||
610 | } | ||
611 | |||
612 | diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c | ||
613 | index 22aa432a68bf9..719c6b7741afa 100644 | ||
614 | --- a/drivers/block/zram/zram_drv.c | ||
615 | +++ b/drivers/block/zram/zram_drv.c | ||
616 | @@ -627,7 +627,7 @@ static ssize_t writeback_store(struct device *dev, | ||
617 | struct bio_vec bio_vec; | ||
618 | struct page *page; | ||
619 | ssize_t ret = len; | ||
620 | - int mode; | ||
621 | + int mode, err; | ||
622 | unsigned long blk_idx = 0; | ||
623 | |||
624 | if (sysfs_streq(buf, "idle")) | ||
625 | @@ -719,12 +719,17 @@ static ssize_t writeback_store(struct device *dev, | ||
626 | * XXX: A single page IO would be inefficient for write | ||
627 | * but it would be not bad as starter. | ||
628 | */ | ||
629 | - ret = submit_bio_wait(&bio); | ||
630 | - if (ret) { | ||
631 | + err = submit_bio_wait(&bio); | ||
632 | + if (err) { | ||
633 | zram_slot_lock(zram, index); | ||
634 | zram_clear_flag(zram, index, ZRAM_UNDER_WB); | ||
635 | zram_clear_flag(zram, index, ZRAM_IDLE); | ||
636 | zram_slot_unlock(zram, index); | ||
637 | + /* | ||
638 | + * Return last IO error unless every IO were | ||
639 | + * not suceeded. | ||
640 | + */ | ||
641 | + ret = err; | ||
642 | continue; | ||
643 | } | ||
644 | |||
645 | diff --git a/drivers/gpu/drm/drm_gem_shmem_helper.c b/drivers/gpu/drm/drm_gem_shmem_helper.c | ||
646 | index f5918707672f1..d88f4230c2219 100644 | ||
647 | --- a/drivers/gpu/drm/drm_gem_shmem_helper.c | ||
648 | +++ b/drivers/gpu/drm/drm_gem_shmem_helper.c | ||
649 | @@ -474,14 +474,28 @@ static vm_fault_t drm_gem_shmem_fault(struct vm_fault *vmf) | ||
650 | struct drm_gem_object *obj = vma->vm_private_data; | ||
651 | struct drm_gem_shmem_object *shmem = to_drm_gem_shmem_obj(obj); | ||
652 | loff_t num_pages = obj->size >> PAGE_SHIFT; | ||
653 | + vm_fault_t ret; | ||
654 | struct page *page; | ||
655 | + pgoff_t page_offset; | ||
656 | |||
657 | - if (vmf->pgoff >= num_pages || WARN_ON_ONCE(!shmem->pages)) | ||
658 | - return VM_FAULT_SIGBUS; | ||
659 | + /* We don't use vmf->pgoff since that has the fake offset */ | ||
660 | + page_offset = (vmf->address - vma->vm_start) >> PAGE_SHIFT; | ||
661 | |||
662 | - page = shmem->pages[vmf->pgoff]; | ||
663 | + mutex_lock(&shmem->pages_lock); | ||
664 | + | ||
665 | + if (page_offset >= num_pages || | ||
666 | + WARN_ON_ONCE(!shmem->pages) || | ||
667 | + shmem->madv < 0) { | ||
668 | + ret = VM_FAULT_SIGBUS; | ||
669 | + } else { | ||
670 | + page = shmem->pages[page_offset]; | ||
671 | + | ||
672 | + ret = vmf_insert_page(vma, vmf->address, page); | ||
673 | + } | ||
674 | |||
675 | - return vmf_insert_page(vma, vmf->address, page); | ||
676 | + mutex_unlock(&shmem->pages_lock); | ||
677 | + | ||
678 | + return ret; | ||
679 | } | ||
680 | |||
681 | static void drm_gem_shmem_vm_open(struct vm_area_struct *vma) | ||
682 | @@ -549,9 +563,6 @@ int drm_gem_shmem_mmap(struct file *filp, struct vm_area_struct *vma) | ||
683 | vma->vm_flags &= ~VM_PFNMAP; | ||
684 | vma->vm_flags |= VM_MIXEDMAP; | ||
685 | |||
686 | - /* Remove the fake offset */ | ||
687 | - vma->vm_pgoff -= drm_vma_node_start(&shmem->base.vma_node); | ||
688 | - | ||
689 | return 0; | ||
690 | } | ||
691 | EXPORT_SYMBOL_GPL(drm_gem_shmem_mmap); | ||
692 | diff --git a/drivers/gpu/drm/drm_ioc32.c b/drivers/gpu/drm/drm_ioc32.c | ||
693 | index 22c7fd7196c82..2cf053fb8d54b 100644 | ||
694 | --- a/drivers/gpu/drm/drm_ioc32.c | ||
695 | +++ b/drivers/gpu/drm/drm_ioc32.c | ||
696 | @@ -99,6 +99,8 @@ static int compat_drm_version(struct file *file, unsigned int cmd, | ||
697 | if (copy_from_user(&v32, (void __user *)arg, sizeof(v32))) | ||
698 | return -EFAULT; | ||
699 | |||
700 | + memset(&v, 0, sizeof(v)); | ||
701 | + | ||
702 | v = (struct drm_version) { | ||
703 | .name_len = v32.name_len, | ||
704 | .name = compat_ptr(v32.name), | ||
705 | @@ -137,6 +139,9 @@ static int compat_drm_getunique(struct file *file, unsigned int cmd, | ||
706 | |||
707 | if (copy_from_user(&uq32, (void __user *)arg, sizeof(uq32))) | ||
708 | return -EFAULT; | ||
709 | + | ||
710 | + memset(&uq, 0, sizeof(uq)); | ||
711 | + | ||
712 | uq = (struct drm_unique){ | ||
713 | .unique_len = uq32.unique_len, | ||
714 | .unique = compat_ptr(uq32.unique), | ||
715 | @@ -265,6 +270,8 @@ static int compat_drm_getclient(struct file *file, unsigned int cmd, | ||
716 | if (copy_from_user(&c32, argp, sizeof(c32))) | ||
717 | return -EFAULT; | ||
718 | |||
719 | + memset(&client, 0, sizeof(client)); | ||
720 | + | ||
721 | client.idx = c32.idx; | ||
722 | |||
723 | err = drm_ioctl_kernel(file, drm_getclient, &client, 0); | ||
724 | @@ -850,6 +857,8 @@ static int compat_drm_wait_vblank(struct file *file, unsigned int cmd, | ||
725 | if (copy_from_user(&req32, argp, sizeof(req32))) | ||
726 | return -EFAULT; | ||
727 | |||
728 | + memset(&req, 0, sizeof(req)); | ||
729 | + | ||
730 | req.request.type = req32.request.type; | ||
731 | req.request.sequence = req32.request.sequence; | ||
732 | req.request.signal = req32.request.signal; | ||
733 | @@ -887,6 +896,8 @@ static int compat_drm_mode_addfb2(struct file *file, unsigned int cmd, | ||
734 | struct drm_mode_fb_cmd2 req64; | ||
735 | int err; | ||
736 | |||
737 | + memset(&req64, 0, sizeof(req64)); | ||
738 | + | ||
739 | if (copy_from_user(&req64, argp, | ||
740 | offsetof(drm_mode_fb_cmd232_t, modifier))) | ||
741 | return -EFAULT; | ||
742 | diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c | ||
743 | index a24f8dec5adc9..86d0961112773 100644 | ||
744 | --- a/drivers/gpu/drm/meson/meson_drv.c | ||
745 | +++ b/drivers/gpu/drm/meson/meson_drv.c | ||
746 | @@ -420,6 +420,16 @@ static int meson_probe_remote(struct platform_device *pdev, | ||
747 | return count; | ||
748 | } | ||
749 | |||
750 | +static void meson_drv_shutdown(struct platform_device *pdev) | ||
751 | +{ | ||
752 | + struct meson_drm *priv = dev_get_drvdata(&pdev->dev); | ||
753 | + struct drm_device *drm = priv->drm; | ||
754 | + | ||
755 | + DRM_DEBUG_DRIVER("\n"); | ||
756 | + drm_kms_helper_poll_fini(drm); | ||
757 | + drm_atomic_helper_shutdown(drm); | ||
758 | +} | ||
759 | + | ||
760 | static int meson_drv_probe(struct platform_device *pdev) | ||
761 | { | ||
762 | struct component_match *match = NULL; | ||
763 | @@ -469,6 +479,7 @@ MODULE_DEVICE_TABLE(of, dt_match); | ||
764 | |||
765 | static struct platform_driver meson_drm_platform_driver = { | ||
766 | .probe = meson_drv_probe, | ||
767 | + .shutdown = meson_drv_shutdown, | ||
768 | .driver = { | ||
769 | .name = "meson-drm", | ||
770 | .of_match_table = dt_match, | ||
771 | diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c | ||
772 | index 92d84280096e0..9abf3dc5ef990 100644 | ||
773 | --- a/drivers/gpu/drm/qxl/qxl_display.c | ||
774 | +++ b/drivers/gpu/drm/qxl/qxl_display.c | ||
775 | @@ -325,6 +325,7 @@ static void qxl_crtc_update_monitors_config(struct drm_crtc *crtc, | ||
776 | |||
777 | head.id = i; | ||
778 | head.flags = 0; | ||
779 | + head.surface_id = 0; | ||
780 | oldcount = qdev->monitors_config->count; | ||
781 | if (crtc->state->active) { | ||
782 | struct drm_display_mode *mode = &crtc->mode; | ||
783 | diff --git a/drivers/hid/hid-logitech-dj.c b/drivers/hid/hid-logitech-dj.c | ||
784 | index 86001cfbdb6f1..b499ac37dc7b0 100644 | ||
785 | --- a/drivers/hid/hid-logitech-dj.c | ||
786 | +++ b/drivers/hid/hid-logitech-dj.c | ||
787 | @@ -995,7 +995,12 @@ static void logi_hidpp_recv_queue_notif(struct hid_device *hdev, | ||
788 | workitem.reports_supported |= STD_KEYBOARD; | ||
789 | break; | ||
790 | case 0x0d: | ||
791 | - device_type = "eQUAD Lightspeed 1_1"; | ||
792 | + device_type = "eQUAD Lightspeed 1.1"; | ||
793 | + logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem); | ||
794 | + workitem.reports_supported |= STD_KEYBOARD; | ||
795 | + break; | ||
796 | + case 0x0f: | ||
797 | + device_type = "eQUAD Lightspeed 1.2"; | ||
798 | logi_hidpp_dev_conn_notif_equad(hdev, hidpp_report, &workitem); | ||
799 | workitem.reports_supported |= STD_KEYBOARD; | ||
800 | break; | ||
801 | diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c | ||
802 | index 9c162a01a5849..d0c4b3019e41e 100644 | ||
803 | --- a/drivers/i2c/busses/i2c-rcar.c | ||
804 | +++ b/drivers/i2c/busses/i2c-rcar.c | ||
805 | @@ -89,7 +89,6 @@ | ||
806 | |||
807 | #define RCAR_BUS_PHASE_START (MDBS | MIE | ESG) | ||
808 | #define RCAR_BUS_PHASE_DATA (MDBS | MIE) | ||
809 | -#define RCAR_BUS_MASK_DATA (~(ESG | FSB) & 0xFF) | ||
810 | #define RCAR_BUS_PHASE_STOP (MDBS | MIE | FSB) | ||
811 | |||
812 | #define RCAR_IRQ_SEND (MNR | MAL | MST | MAT | MDE) | ||
813 | @@ -117,6 +116,7 @@ enum rcar_i2c_type { | ||
814 | }; | ||
815 | |||
816 | struct rcar_i2c_priv { | ||
817 | + u32 flags; | ||
818 | void __iomem *io; | ||
819 | struct i2c_adapter adap; | ||
820 | struct i2c_msg *msg; | ||
821 | @@ -127,7 +127,6 @@ struct rcar_i2c_priv { | ||
822 | |||
823 | int pos; | ||
824 | u32 icccr; | ||
825 | - u32 flags; | ||
826 | u8 recovery_icmcr; /* protected by adapter lock */ | ||
827 | enum rcar_i2c_type devtype; | ||
828 | struct i2c_client *slave; | ||
829 | @@ -616,7 +615,7 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) | ||
830 | /* | ||
831 | * This driver has a lock-free design because there are IP cores (at least | ||
832 | * R-Car Gen2) which have an inherent race condition in their hardware design. | ||
833 | - * There, we need to clear RCAR_BUS_MASK_DATA bits as soon as possible after | ||
834 | + * There, we need to switch to RCAR_BUS_PHASE_DATA as soon as possible after | ||
835 | * the interrupt was generated, otherwise an unwanted repeated message gets | ||
836 | * generated. It turned out that taking a spinlock at the beginning of the ISR | ||
837 | * was already causing repeated messages. Thus, this driver was converted to | ||
838 | @@ -625,13 +624,11 @@ static bool rcar_i2c_slave_irq(struct rcar_i2c_priv *priv) | ||
839 | static irqreturn_t rcar_i2c_irq(int irq, void *ptr) | ||
840 | { | ||
841 | struct rcar_i2c_priv *priv = ptr; | ||
842 | - u32 msr, val; | ||
843 | + u32 msr; | ||
844 | |||
845 | /* Clear START or STOP immediately, except for REPSTART after read */ | ||
846 | - if (likely(!(priv->flags & ID_P_REP_AFTER_RD))) { | ||
847 | - val = rcar_i2c_read(priv, ICMCR); | ||
848 | - rcar_i2c_write(priv, ICMCR, val & RCAR_BUS_MASK_DATA); | ||
849 | - } | ||
850 | + if (likely(!(priv->flags & ID_P_REP_AFTER_RD))) | ||
851 | + rcar_i2c_write(priv, ICMCR, RCAR_BUS_PHASE_DATA); | ||
852 | |||
853 | msr = rcar_i2c_read(priv, ICMSR); | ||
854 | |||
855 | diff --git a/drivers/input/keyboard/applespi.c b/drivers/input/keyboard/applespi.c | ||
856 | index d38398526965d..a4b7422de534e 100644 | ||
857 | --- a/drivers/input/keyboard/applespi.c | ||
858 | +++ b/drivers/input/keyboard/applespi.c | ||
859 | @@ -48,6 +48,7 @@ | ||
860 | #include <linux/efi.h> | ||
861 | #include <linux/input.h> | ||
862 | #include <linux/input/mt.h> | ||
863 | +#include <linux/ktime.h> | ||
864 | #include <linux/leds.h> | ||
865 | #include <linux/module.h> | ||
866 | #include <linux/spinlock.h> | ||
867 | @@ -400,7 +401,7 @@ struct applespi_data { | ||
868 | unsigned int cmd_msg_cntr; | ||
869 | /* lock to protect the above parameters and flags below */ | ||
870 | spinlock_t cmd_msg_lock; | ||
871 | - bool cmd_msg_queued; | ||
872 | + ktime_t cmd_msg_queued; | ||
873 | enum applespi_evt_type cmd_evt_type; | ||
874 | |||
875 | struct led_classdev backlight_info; | ||
876 | @@ -716,7 +717,7 @@ static void applespi_msg_complete(struct applespi_data *applespi, | ||
877 | wake_up_all(&applespi->drain_complete); | ||
878 | |||
879 | if (is_write_msg) { | ||
880 | - applespi->cmd_msg_queued = false; | ||
881 | + applespi->cmd_msg_queued = 0; | ||
882 | applespi_send_cmd_msg(applespi); | ||
883 | } | ||
884 | |||
885 | @@ -758,8 +759,16 @@ static int applespi_send_cmd_msg(struct applespi_data *applespi) | ||
886 | return 0; | ||
887 | |||
888 | /* check whether send is in progress */ | ||
889 | - if (applespi->cmd_msg_queued) | ||
890 | - return 0; | ||
891 | + if (applespi->cmd_msg_queued) { | ||
892 | + if (ktime_ms_delta(ktime_get(), applespi->cmd_msg_queued) < 1000) | ||
893 | + return 0; | ||
894 | + | ||
895 | + dev_warn(&applespi->spi->dev, "Command %d timed out\n", | ||
896 | + applespi->cmd_evt_type); | ||
897 | + | ||
898 | + applespi->cmd_msg_queued = 0; | ||
899 | + applespi->write_active = false; | ||
900 | + } | ||
901 | |||
902 | /* set up packet */ | ||
903 | memset(packet, 0, APPLESPI_PACKET_SIZE); | ||
904 | @@ -856,7 +865,7 @@ static int applespi_send_cmd_msg(struct applespi_data *applespi) | ||
905 | return sts; | ||
906 | } | ||
907 | |||
908 | - applespi->cmd_msg_queued = true; | ||
909 | + applespi->cmd_msg_queued = ktime_get_coarse(); | ||
910 | applespi->write_active = true; | ||
911 | |||
912 | return 0; | ||
913 | @@ -1908,7 +1917,7 @@ static int __maybe_unused applespi_resume(struct device *dev) | ||
914 | applespi->drain = false; | ||
915 | applespi->have_cl_led_on = false; | ||
916 | applespi->have_bl_level = 0; | ||
917 | - applespi->cmd_msg_queued = false; | ||
918 | + applespi->cmd_msg_queued = 0; | ||
919 | applespi->read_active = false; | ||
920 | applespi->write_active = false; | ||
921 | |||
922 | diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c | ||
923 | index 31d7e2d4f3040..ad714ff375f85 100644 | ||
924 | --- a/drivers/iommu/amd_iommu_init.c | ||
925 | +++ b/drivers/iommu/amd_iommu_init.c | ||
926 | @@ -12,6 +12,7 @@ | ||
927 | #include <linux/acpi.h> | ||
928 | #include <linux/list.h> | ||
929 | #include <linux/bitmap.h> | ||
930 | +#include <linux/delay.h> | ||
931 | #include <linux/slab.h> | ||
932 | #include <linux/syscore_ops.h> | ||
933 | #include <linux/interrupt.h> | ||
934 | @@ -253,6 +254,8 @@ static enum iommu_init_state init_state = IOMMU_START_STATE; | ||
935 | static int amd_iommu_enable_interrupts(void); | ||
936 | static int __init iommu_go_to_state(enum iommu_init_state state); | ||
937 | static void init_device_table_dma(void); | ||
938 | +static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, | ||
939 | + u8 fxn, u64 *value, bool is_write); | ||
940 | |||
941 | static bool amd_iommu_pre_enabled = true; | ||
942 | |||
943 | @@ -1672,13 +1675,11 @@ static int __init init_iommu_all(struct acpi_table_header *table) | ||
944 | return 0; | ||
945 | } | ||
946 | |||
947 | -static int iommu_pc_get_set_reg(struct amd_iommu *iommu, u8 bank, u8 cntr, | ||
948 | - u8 fxn, u64 *value, bool is_write); | ||
949 | - | ||
950 | -static void init_iommu_perf_ctr(struct amd_iommu *iommu) | ||
951 | +static void __init init_iommu_perf_ctr(struct amd_iommu *iommu) | ||
952 | { | ||
953 | + int retry; | ||
954 | struct pci_dev *pdev = iommu->dev; | ||
955 | - u64 val = 0xabcd, val2 = 0, save_reg = 0; | ||
956 | + u64 val = 0xabcd, val2 = 0, save_reg, save_src; | ||
957 | |||
958 | if (!iommu_feature(iommu, FEATURE_PC)) | ||
959 | return; | ||
960 | @@ -1686,17 +1687,39 @@ static void init_iommu_perf_ctr(struct amd_iommu *iommu) | ||
961 | amd_iommu_pc_present = true; | ||
962 | |||
963 | /* save the value to restore, if writable */ | ||
964 | - if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, false)) | ||
965 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, false) || | ||
966 | + iommu_pc_get_set_reg(iommu, 0, 0, 8, &save_src, false)) | ||
967 | goto pc_false; | ||
968 | |||
969 | - /* Check if the performance counters can be written to */ | ||
970 | - if ((iommu_pc_get_set_reg(iommu, 0, 0, 0, &val, true)) || | ||
971 | - (iommu_pc_get_set_reg(iommu, 0, 0, 0, &val2, false)) || | ||
972 | - (val != val2)) | ||
973 | + /* | ||
974 | + * Disable power gating by programing the performance counter | ||
975 | + * source to 20 (i.e. counts the reads and writes from/to IOMMU | ||
976 | + * Reserved Register [MMIO Offset 1FF8h] that are ignored.), | ||
977 | + * which never get incremented during this init phase. | ||
978 | + * (Note: The event is also deprecated.) | ||
979 | + */ | ||
980 | + val = 20; | ||
981 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 8, &val, true)) | ||
982 | goto pc_false; | ||
983 | |||
984 | + /* Check if the performance counters can be written to */ | ||
985 | + val = 0xabcd; | ||
986 | + for (retry = 5; retry; retry--) { | ||
987 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &val, true) || | ||
988 | + iommu_pc_get_set_reg(iommu, 0, 0, 0, &val2, false) || | ||
989 | + val2) | ||
990 | + break; | ||
991 | + | ||
992 | + /* Wait about 20 msec for power gating to disable and retry. */ | ||
993 | + msleep(20); | ||
994 | + } | ||
995 | + | ||
996 | /* restore */ | ||
997 | - if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, true)) | ||
998 | + if (iommu_pc_get_set_reg(iommu, 0, 0, 0, &save_reg, true) || | ||
999 | + iommu_pc_get_set_reg(iommu, 0, 0, 8, &save_src, true)) | ||
1000 | + goto pc_false; | ||
1001 | + | ||
1002 | + if (val != val2) | ||
1003 | goto pc_false; | ||
1004 | |||
1005 | pci_info(pdev, "IOMMU performance counters supported\n"); | ||
1006 | diff --git a/drivers/media/platform/vsp1/vsp1_drm.c b/drivers/media/platform/vsp1/vsp1_drm.c | ||
1007 | index a4a45d68a6efc..1c00688c71c24 100644 | ||
1008 | --- a/drivers/media/platform/vsp1/vsp1_drm.c | ||
1009 | +++ b/drivers/media/platform/vsp1/vsp1_drm.c | ||
1010 | @@ -245,7 +245,7 @@ static int vsp1_du_pipeline_setup_brx(struct vsp1_device *vsp1, | ||
1011 | brx = &vsp1->bru->entity; | ||
1012 | else if (pipe->brx && !drm_pipe->force_brx_release) | ||
1013 | brx = pipe->brx; | ||
1014 | - else if (!vsp1->bru->entity.pipe) | ||
1015 | + else if (vsp1_feature(vsp1, VSP1_HAS_BRU) && !vsp1->bru->entity.pipe) | ||
1016 | brx = &vsp1->bru->entity; | ||
1017 | else | ||
1018 | brx = &vsp1->brs->entity; | ||
1019 | @@ -462,9 +462,9 @@ static int vsp1_du_pipeline_setup_inputs(struct vsp1_device *vsp1, | ||
1020 | * make sure it is present in the pipeline's list of entities if it | ||
1021 | * wasn't already. | ||
1022 | */ | ||
1023 | - if (!use_uif) { | ||
1024 | + if (drm_pipe->uif && !use_uif) { | ||
1025 | drm_pipe->uif->pipe = NULL; | ||
1026 | - } else if (!drm_pipe->uif->pipe) { | ||
1027 | + } else if (drm_pipe->uif && !drm_pipe->uif->pipe) { | ||
1028 | drm_pipe->uif->pipe = pipe; | ||
1029 | list_add_tail(&drm_pipe->uif->list_pipe, &pipe->entities); | ||
1030 | } | ||
1031 | diff --git a/drivers/media/rc/Makefile b/drivers/media/rc/Makefile | ||
1032 | index 48d23433b3c06..caeb51def782c 100644 | ||
1033 | --- a/drivers/media/rc/Makefile | ||
1034 | +++ b/drivers/media/rc/Makefile | ||
1035 | @@ -5,6 +5,7 @@ obj-y += keymaps/ | ||
1036 | obj-$(CONFIG_RC_CORE) += rc-core.o | ||
1037 | rc-core-y := rc-main.o rc-ir-raw.o | ||
1038 | rc-core-$(CONFIG_LIRC) += lirc_dev.o | ||
1039 | +rc-core-$(CONFIG_MEDIA_CEC_RC) += keymaps/rc-cec.o | ||
1040 | rc-core-$(CONFIG_BPF_LIRC_MODE2) += bpf-lirc.o | ||
1041 | obj-$(CONFIG_IR_NEC_DECODER) += ir-nec-decoder.o | ||
1042 | obj-$(CONFIG_IR_RC5_DECODER) += ir-rc5-decoder.o | ||
1043 | diff --git a/drivers/media/rc/keymaps/Makefile b/drivers/media/rc/keymaps/Makefile | ||
1044 | index ea91a9afa6a02..d89dcc4481229 100644 | ||
1045 | --- a/drivers/media/rc/keymaps/Makefile | ||
1046 | +++ b/drivers/media/rc/keymaps/Makefile | ||
1047 | @@ -20,7 +20,6 @@ obj-$(CONFIG_RC_MAP) += rc-adstech-dvb-t-pci.o \ | ||
1048 | rc-behold.o \ | ||
1049 | rc-behold-columbus.o \ | ||
1050 | rc-budget-ci-old.o \ | ||
1051 | - rc-cec.o \ | ||
1052 | rc-cinergy-1400.o \ | ||
1053 | rc-cinergy.o \ | ||
1054 | rc-d680-dmb.o \ | ||
1055 | diff --git a/drivers/media/rc/keymaps/rc-cec.c b/drivers/media/rc/keymaps/rc-cec.c | ||
1056 | index 3e3bd11092b45..068e22aeac8c3 100644 | ||
1057 | --- a/drivers/media/rc/keymaps/rc-cec.c | ||
1058 | +++ b/drivers/media/rc/keymaps/rc-cec.c | ||
1059 | @@ -1,5 +1,15 @@ | ||
1060 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
1061 | /* Keytable for the CEC remote control | ||
1062 | + * | ||
1063 | + * This keymap is unusual in that it can't be built as a module, | ||
1064 | + * instead it is registered directly in rc-main.c if CONFIG_MEDIA_CEC_RC | ||
1065 | + * is set. This is because it can be called from drm_dp_cec_set_edid() via | ||
1066 | + * cec_register_adapter() in an asynchronous context, and it is not | ||
1067 | + * allowed to use request_module() to load rc-cec.ko in that case. | ||
1068 | + * | ||
1069 | + * Since this keymap is only used if CONFIG_MEDIA_CEC_RC is set, we | ||
1070 | + * just compile this keymap into the rc-core module and never as a | ||
1071 | + * separate module. | ||
1072 | * | ||
1073 | * Copyright (c) 2015 by Kamil Debski | ||
1074 | */ | ||
1075 | @@ -152,7 +162,7 @@ static struct rc_map_table cec[] = { | ||
1076 | /* 0x77-0xff: Reserved */ | ||
1077 | }; | ||
1078 | |||
1079 | -static struct rc_map_list cec_map = { | ||
1080 | +struct rc_map_list cec_map = { | ||
1081 | .map = { | ||
1082 | .scan = cec, | ||
1083 | .size = ARRAY_SIZE(cec), | ||
1084 | @@ -160,19 +170,3 @@ static struct rc_map_list cec_map = { | ||
1085 | .name = RC_MAP_CEC, | ||
1086 | } | ||
1087 | }; | ||
1088 | - | ||
1089 | -static int __init init_rc_map_cec(void) | ||
1090 | -{ | ||
1091 | - return rc_map_register(&cec_map); | ||
1092 | -} | ||
1093 | - | ||
1094 | -static void __exit exit_rc_map_cec(void) | ||
1095 | -{ | ||
1096 | - rc_map_unregister(&cec_map); | ||
1097 | -} | ||
1098 | - | ||
1099 | -module_init(init_rc_map_cec); | ||
1100 | -module_exit(exit_rc_map_cec); | ||
1101 | - | ||
1102 | -MODULE_LICENSE("GPL"); | ||
1103 | -MODULE_AUTHOR("Kamil Debski"); | ||
1104 | diff --git a/drivers/media/rc/rc-main.c b/drivers/media/rc/rc-main.c | ||
1105 | index c4d7e06974d2c..ee80f38970bc4 100644 | ||
1106 | --- a/drivers/media/rc/rc-main.c | ||
1107 | +++ b/drivers/media/rc/rc-main.c | ||
1108 | @@ -2033,6 +2033,9 @@ static int __init rc_core_init(void) | ||
1109 | |||
1110 | led_trigger_register_simple("rc-feedback", &led_feedback); | ||
1111 | rc_map_register(&empty_map); | ||
1112 | +#ifdef CONFIG_MEDIA_CEC_RC | ||
1113 | + rc_map_register(&cec_map); | ||
1114 | +#endif | ||
1115 | |||
1116 | return 0; | ||
1117 | } | ||
1118 | @@ -2042,6 +2045,9 @@ static void __exit rc_core_exit(void) | ||
1119 | lirc_dev_exit(); | ||
1120 | class_unregister(&rc_class); | ||
1121 | led_trigger_unregister_simple(led_feedback); | ||
1122 | +#ifdef CONFIG_MEDIA_CEC_RC | ||
1123 | + rc_map_unregister(&cec_map); | ||
1124 | +#endif | ||
1125 | rc_map_unregister(&empty_map); | ||
1126 | } | ||
1127 | |||
1128 | diff --git a/drivers/media/usb/usbtv/usbtv-audio.c b/drivers/media/usb/usbtv/usbtv-audio.c | ||
1129 | index 6f108996142d7..bbfaec2e6ef61 100644 | ||
1130 | --- a/drivers/media/usb/usbtv/usbtv-audio.c | ||
1131 | +++ b/drivers/media/usb/usbtv/usbtv-audio.c | ||
1132 | @@ -399,7 +399,7 @@ void usbtv_audio_free(struct usbtv *usbtv) | ||
1133 | cancel_work_sync(&usbtv->snd_trigger); | ||
1134 | |||
1135 | if (usbtv->snd && usbtv->udev) { | ||
1136 | - snd_card_free(usbtv->snd); | ||
1137 | + snd_card_free_when_closed(usbtv->snd); | ||
1138 | usbtv->snd = NULL; | ||
1139 | } | ||
1140 | } | ||
1141 | diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c | ||
1142 | index 3a5d2890fe2aa..beaf15807f789 100644 | ||
1143 | --- a/drivers/misc/fastrpc.c | ||
1144 | +++ b/drivers/misc/fastrpc.c | ||
1145 | @@ -924,6 +924,11 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl, u32 kernel, | ||
1146 | if (!fl->cctx->rpdev) | ||
1147 | return -EPIPE; | ||
1148 | |||
1149 | + if (handle == FASTRPC_INIT_HANDLE && !kernel) { | ||
1150 | + dev_warn_ratelimited(fl->sctx->dev, "user app trying to send a kernel RPC message (%d)\n", handle); | ||
1151 | + return -EPERM; | ||
1152 | + } | ||
1153 | + | ||
1154 | ctx = fastrpc_context_alloc(fl, kernel, sc, args); | ||
1155 | if (IS_ERR(ctx)) | ||
1156 | return PTR_ERR(ctx); | ||
1157 | diff --git a/drivers/misc/pvpanic.c b/drivers/misc/pvpanic.c | ||
1158 | index 95ff7c5a1dfb6..0a5e5b841aeb1 100644 | ||
1159 | --- a/drivers/misc/pvpanic.c | ||
1160 | +++ b/drivers/misc/pvpanic.c | ||
1161 | @@ -166,6 +166,7 @@ static const struct of_device_id pvpanic_mmio_match[] = { | ||
1162 | { .compatible = "qemu,pvpanic-mmio", }, | ||
1163 | {} | ||
1164 | }; | ||
1165 | +MODULE_DEVICE_TABLE(of, pvpanic_mmio_match); | ||
1166 | |||
1167 | static struct platform_driver pvpanic_mmio_driver = { | ||
1168 | .driver = { | ||
1169 | diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c | ||
1170 | index 74de3f2dda38e..28501f165d457 100644 | ||
1171 | --- a/drivers/mmc/core/bus.c | ||
1172 | +++ b/drivers/mmc/core/bus.c | ||
1173 | @@ -373,11 +373,6 @@ void mmc_remove_card(struct mmc_card *card) | ||
1174 | mmc_remove_card_debugfs(card); | ||
1175 | #endif | ||
1176 | |||
1177 | - if (host->cqe_enabled) { | ||
1178 | - host->cqe_ops->cqe_disable(host); | ||
1179 | - host->cqe_enabled = false; | ||
1180 | - } | ||
1181 | - | ||
1182 | if (mmc_card_present(card)) { | ||
1183 | if (mmc_host_is_spi(card->host)) { | ||
1184 | pr_info("%s: SPI card removed\n", | ||
1185 | @@ -390,6 +385,10 @@ void mmc_remove_card(struct mmc_card *card) | ||
1186 | of_node_put(card->dev.of_node); | ||
1187 | } | ||
1188 | |||
1189 | + if (host->cqe_enabled) { | ||
1190 | + host->cqe_ops->cqe_disable(host); | ||
1191 | + host->cqe_enabled = false; | ||
1192 | + } | ||
1193 | + | ||
1194 | put_device(&card->dev); | ||
1195 | } | ||
1196 | - | ||
1197 | diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c | ||
1198 | index de14b5845f525..9f29288f2c9a9 100644 | ||
1199 | --- a/drivers/mmc/core/mmc.c | ||
1200 | +++ b/drivers/mmc/core/mmc.c | ||
1201 | @@ -423,10 +423,6 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
1202 | |||
1203 | /* EXT_CSD value is in units of 10ms, but we store in ms */ | ||
1204 | card->ext_csd.part_time = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; | ||
1205 | - /* Some eMMC set the value too low so set a minimum */ | ||
1206 | - if (card->ext_csd.part_time && | ||
1207 | - card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) | ||
1208 | - card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; | ||
1209 | |||
1210 | /* Sleep / awake timeout in 100ns units */ | ||
1211 | if (sa_shift > 0 && sa_shift <= 0x17) | ||
1212 | @@ -616,6 +612,17 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd) | ||
1213 | card->ext_csd.data_sector_size = 512; | ||
1214 | } | ||
1215 | |||
1216 | + /* | ||
1217 | + * GENERIC_CMD6_TIME is to be used "unless a specific timeout is defined | ||
1218 | + * when accessing a specific field", so use it here if there is no | ||
1219 | + * PARTITION_SWITCH_TIME. | ||
1220 | + */ | ||
1221 | + if (!card->ext_csd.part_time) | ||
1222 | + card->ext_csd.part_time = card->ext_csd.generic_cmd6_time; | ||
1223 | + /* Some eMMC set the value too low so set a minimum */ | ||
1224 | + if (card->ext_csd.part_time < MMC_MIN_PART_SWITCH_TIME) | ||
1225 | + card->ext_csd.part_time = MMC_MIN_PART_SWITCH_TIME; | ||
1226 | + | ||
1227 | /* eMMC v5 or later */ | ||
1228 | if (card->ext_csd.rev >= 7) { | ||
1229 | memcpy(card->ext_csd.fwrev, &ext_csd[EXT_CSD_FIRMWARE_VERSION], | ||
1230 | diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c | ||
1231 | index 9d47a2bd2546b..1254a5650cfff 100644 | ||
1232 | --- a/drivers/mmc/host/mtk-sd.c | ||
1233 | +++ b/drivers/mmc/host/mtk-sd.c | ||
1234 | @@ -1020,13 +1020,13 @@ static void msdc_track_cmd_data(struct msdc_host *host, | ||
1235 | static void msdc_request_done(struct msdc_host *host, struct mmc_request *mrq) | ||
1236 | { | ||
1237 | unsigned long flags; | ||
1238 | - bool ret; | ||
1239 | |||
1240 | - ret = cancel_delayed_work(&host->req_timeout); | ||
1241 | - if (!ret) { | ||
1242 | - /* delay work already running */ | ||
1243 | - return; | ||
1244 | - } | ||
1245 | + /* | ||
1246 | + * No need check the return value of cancel_delayed_work, as only ONE | ||
1247 | + * path will go here! | ||
1248 | + */ | ||
1249 | + cancel_delayed_work(&host->req_timeout); | ||
1250 | + | ||
1251 | spin_lock_irqsave(&host->lock, flags); | ||
1252 | host->mrq = NULL; | ||
1253 | spin_unlock_irqrestore(&host->lock, flags); | ||
1254 | @@ -1046,7 +1046,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, | ||
1255 | bool done = false; | ||
1256 | bool sbc_error; | ||
1257 | unsigned long flags; | ||
1258 | - u32 *rsp = cmd->resp; | ||
1259 | + u32 *rsp; | ||
1260 | |||
1261 | if (mrq->sbc && cmd == mrq->cmd && | ||
1262 | (events & (MSDC_INT_ACMDRDY | MSDC_INT_ACMDCRCERR | ||
1263 | @@ -1067,6 +1067,7 @@ static bool msdc_cmd_done(struct msdc_host *host, int events, | ||
1264 | |||
1265 | if (done) | ||
1266 | return true; | ||
1267 | + rsp = cmd->resp; | ||
1268 | |||
1269 | sdr_clr_bits(host->base + MSDC_INTEN, cmd_ints_mask); | ||
1270 | |||
1271 | @@ -1254,7 +1255,7 @@ static void msdc_data_xfer_next(struct msdc_host *host, | ||
1272 | static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, | ||
1273 | struct mmc_request *mrq, struct mmc_data *data) | ||
1274 | { | ||
1275 | - struct mmc_command *stop = data->stop; | ||
1276 | + struct mmc_command *stop; | ||
1277 | unsigned long flags; | ||
1278 | bool done; | ||
1279 | unsigned int check_data = events & | ||
1280 | @@ -1270,6 +1271,7 @@ static bool msdc_data_xfer_done(struct msdc_host *host, u32 events, | ||
1281 | |||
1282 | if (done) | ||
1283 | return true; | ||
1284 | + stop = data->stop; | ||
1285 | |||
1286 | if (check_data || (stop && stop->error)) { | ||
1287 | dev_dbg(host->dev, "DMA status: 0x%8X\n", | ||
1288 | diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c | ||
1289 | index 4031217d21c37..52054931c3507 100644 | ||
1290 | --- a/drivers/mmc/host/mxs-mmc.c | ||
1291 | +++ b/drivers/mmc/host/mxs-mmc.c | ||
1292 | @@ -644,7 +644,7 @@ static int mxs_mmc_probe(struct platform_device *pdev) | ||
1293 | |||
1294 | ret = mmc_of_parse(mmc); | ||
1295 | if (ret) | ||
1296 | - goto out_clk_disable; | ||
1297 | + goto out_free_dma; | ||
1298 | |||
1299 | mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34; | ||
1300 | |||
1301 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c | ||
1302 | index 1bd955e4c7d66..b6d00dfa8b8f6 100644 | ||
1303 | --- a/drivers/net/can/flexcan.c | ||
1304 | +++ b/drivers/net/can/flexcan.c | ||
1305 | @@ -548,7 +548,7 @@ static int flexcan_chip_freeze(struct flexcan_priv *priv) | ||
1306 | u32 reg; | ||
1307 | |||
1308 | reg = priv->read(®s->mcr); | ||
1309 | - reg |= FLEXCAN_MCR_HALT; | ||
1310 | + reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT; | ||
1311 | priv->write(reg, ®s->mcr); | ||
1312 | |||
1313 | while (timeout-- && !(priv->read(®s->mcr) & FLEXCAN_MCR_FRZ_ACK)) | ||
1314 | @@ -1057,10 +1057,13 @@ static int flexcan_chip_start(struct net_device *dev) | ||
1315 | |||
1316 | flexcan_set_bittiming(dev); | ||
1317 | |||
1318 | + /* set freeze, halt */ | ||
1319 | + err = flexcan_chip_freeze(priv); | ||
1320 | + if (err) | ||
1321 | + goto out_chip_disable; | ||
1322 | + | ||
1323 | /* MCR | ||
1324 | * | ||
1325 | - * enable freeze | ||
1326 | - * halt now | ||
1327 | * only supervisor access | ||
1328 | * enable warning int | ||
1329 | * enable individual RX masking | ||
1330 | @@ -1069,9 +1072,8 @@ static int flexcan_chip_start(struct net_device *dev) | ||
1331 | */ | ||
1332 | reg_mcr = priv->read(®s->mcr); | ||
1333 | reg_mcr &= ~FLEXCAN_MCR_MAXMB(0xff); | ||
1334 | - reg_mcr |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | FLEXCAN_MCR_SUPV | | ||
1335 | - FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | FLEXCAN_MCR_IDAM_C | | ||
1336 | - FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); | ||
1337 | + reg_mcr |= FLEXCAN_MCR_SUPV | FLEXCAN_MCR_WRN_EN | FLEXCAN_MCR_IRMQ | | ||
1338 | + FLEXCAN_MCR_IDAM_C | FLEXCAN_MCR_MAXMB(priv->tx_mb_idx); | ||
1339 | |||
1340 | /* MCR | ||
1341 | * | ||
1342 | @@ -1432,10 +1434,14 @@ static int register_flexcandev(struct net_device *dev) | ||
1343 | if (err) | ||
1344 | goto out_chip_disable; | ||
1345 | |||
1346 | - /* set freeze, halt and activate FIFO, restrict register access */ | ||
1347 | + /* set freeze, halt */ | ||
1348 | + err = flexcan_chip_freeze(priv); | ||
1349 | + if (err) | ||
1350 | + goto out_chip_disable; | ||
1351 | + | ||
1352 | + /* activate FIFO, restrict register access */ | ||
1353 | reg = priv->read(®s->mcr); | ||
1354 | - reg |= FLEXCAN_MCR_FRZ | FLEXCAN_MCR_HALT | | ||
1355 | - FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; | ||
1356 | + reg |= FLEXCAN_MCR_FEN | FLEXCAN_MCR_SUPV; | ||
1357 | priv->write(reg, ®s->mcr); | ||
1358 | |||
1359 | /* Currently we only support newer versions of this core | ||
1360 | diff --git a/drivers/net/can/m_can/tcan4x5x.c b/drivers/net/can/m_can/tcan4x5x.c | ||
1361 | index 1f8710b35c6d7..32cb479fe6ac8 100644 | ||
1362 | --- a/drivers/net/can/m_can/tcan4x5x.c | ||
1363 | +++ b/drivers/net/can/m_can/tcan4x5x.c | ||
1364 | @@ -325,14 +325,14 @@ static int tcan4x5x_init(struct m_can_classdev *cdev) | ||
1365 | if (ret) | ||
1366 | return ret; | ||
1367 | |||
1368 | + /* Zero out the MCAN buffers */ | ||
1369 | + m_can_init_ram(cdev); | ||
1370 | + | ||
1371 | ret = regmap_update_bits(tcan4x5x->regmap, TCAN4X5X_CONFIG, | ||
1372 | TCAN4X5X_MODE_SEL_MASK, TCAN4X5X_MODE_NORMAL); | ||
1373 | if (ret) | ||
1374 | return ret; | ||
1375 | |||
1376 | - /* Zero out the MCAN buffers */ | ||
1377 | - m_can_init_ram(cdev); | ||
1378 | - | ||
1379 | return ret; | ||
1380 | } | ||
1381 | |||
1382 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c | ||
1383 | index aa693c8e285ab..bde8ec75ac4e9 100644 | ||
1384 | --- a/drivers/net/ethernet/atheros/alx/main.c | ||
1385 | +++ b/drivers/net/ethernet/atheros/alx/main.c | ||
1386 | @@ -1897,13 +1897,16 @@ static int alx_resume(struct device *dev) | ||
1387 | |||
1388 | if (!netif_running(alx->dev)) | ||
1389 | return 0; | ||
1390 | - netif_device_attach(alx->dev); | ||
1391 | |||
1392 | rtnl_lock(); | ||
1393 | err = __alx_open(alx, true); | ||
1394 | rtnl_unlock(); | ||
1395 | + if (err) | ||
1396 | + return err; | ||
1397 | |||
1398 | - return err; | ||
1399 | + netif_device_attach(alx->dev); | ||
1400 | + | ||
1401 | + return 0; | ||
1402 | } | ||
1403 | |||
1404 | static SIMPLE_DEV_PM_OPS(alx_pm_ops, alx_suspend, alx_resume); | ||
1405 | diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1406 | index 4ae49d92c1eed..5a7831a97a132 100644 | ||
1407 | --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1408 | +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c | ||
1409 | @@ -7925,10 +7925,18 @@ static void bnxt_setup_inta(struct bnxt *bp) | ||
1410 | bp->irq_tbl[0].handler = bnxt_inta; | ||
1411 | } | ||
1412 | |||
1413 | +static int bnxt_init_int_mode(struct bnxt *bp); | ||
1414 | + | ||
1415 | static int bnxt_setup_int_mode(struct bnxt *bp) | ||
1416 | { | ||
1417 | int rc; | ||
1418 | |||
1419 | + if (!bp->irq_tbl) { | ||
1420 | + rc = bnxt_init_int_mode(bp); | ||
1421 | + if (rc || !bp->irq_tbl) | ||
1422 | + return rc ?: -ENODEV; | ||
1423 | + } | ||
1424 | + | ||
1425 | if (bp->flags & BNXT_FLAG_USING_MSIX) | ||
1426 | bnxt_setup_msix(bp); | ||
1427 | else | ||
1428 | @@ -8113,7 +8121,7 @@ static int bnxt_init_inta(struct bnxt *bp) | ||
1429 | |||
1430 | static int bnxt_init_int_mode(struct bnxt *bp) | ||
1431 | { | ||
1432 | - int rc = 0; | ||
1433 | + int rc = -ENODEV; | ||
1434 | |||
1435 | if (bp->flags & BNXT_FLAG_MSIX_CAP) | ||
1436 | rc = bnxt_init_msix(bp); | ||
1437 | @@ -8748,7 +8756,8 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) | ||
1438 | { | ||
1439 | struct hwrm_func_drv_if_change_output *resp = bp->hwrm_cmd_resp_addr; | ||
1440 | struct hwrm_func_drv_if_change_input req = {0}; | ||
1441 | - bool resc_reinit = false, fw_reset = false; | ||
1442 | + bool fw_reset = !bp->irq_tbl; | ||
1443 | + bool resc_reinit = false; | ||
1444 | u32 flags = 0; | ||
1445 | int rc; | ||
1446 | |||
1447 | @@ -8776,6 +8785,7 @@ static int bnxt_hwrm_if_change(struct bnxt *bp, bool up) | ||
1448 | |||
1449 | if (test_bit(BNXT_STATE_IN_FW_RESET, &bp->state) && !fw_reset) { | ||
1450 | netdev_err(bp->dev, "RESET_DONE not set during FW reset.\n"); | ||
1451 | + set_bit(BNXT_STATE_ABORT_ERR, &bp->state); | ||
1452 | return -ENODEV; | ||
1453 | } | ||
1454 | if (resc_reinit || fw_reset) { | ||
1455 | diff --git a/drivers/net/ethernet/davicom/dm9000.c b/drivers/net/ethernet/davicom/dm9000.c | ||
1456 | index 70060c51854fd..0928bec79fe4b 100644 | ||
1457 | --- a/drivers/net/ethernet/davicom/dm9000.c | ||
1458 | +++ b/drivers/net/ethernet/davicom/dm9000.c | ||
1459 | @@ -134,6 +134,8 @@ struct board_info { | ||
1460 | u32 wake_state; | ||
1461 | |||
1462 | int ip_summed; | ||
1463 | + | ||
1464 | + struct regulator *power_supply; | ||
1465 | }; | ||
1466 | |||
1467 | /* debug code */ | ||
1468 | @@ -1454,7 +1456,7 @@ dm9000_probe(struct platform_device *pdev) | ||
1469 | if (ret) { | ||
1470 | dev_err(dev, "failed to request reset gpio %d: %d\n", | ||
1471 | reset_gpios, ret); | ||
1472 | - return -ENODEV; | ||
1473 | + goto out_regulator_disable; | ||
1474 | } | ||
1475 | |||
1476 | /* According to manual PWRST# Low Period Min 1ms */ | ||
1477 | @@ -1466,8 +1468,10 @@ dm9000_probe(struct platform_device *pdev) | ||
1478 | |||
1479 | if (!pdata) { | ||
1480 | pdata = dm9000_parse_dt(&pdev->dev); | ||
1481 | - if (IS_ERR(pdata)) | ||
1482 | - return PTR_ERR(pdata); | ||
1483 | + if (IS_ERR(pdata)) { | ||
1484 | + ret = PTR_ERR(pdata); | ||
1485 | + goto out_regulator_disable; | ||
1486 | + } | ||
1487 | } | ||
1488 | |||
1489 | /* Init network device */ | ||
1490 | @@ -1484,6 +1488,8 @@ dm9000_probe(struct platform_device *pdev) | ||
1491 | |||
1492 | db->dev = &pdev->dev; | ||
1493 | db->ndev = ndev; | ||
1494 | + if (!IS_ERR(power)) | ||
1495 | + db->power_supply = power; | ||
1496 | |||
1497 | spin_lock_init(&db->lock); | ||
1498 | mutex_init(&db->addr_lock); | ||
1499 | @@ -1708,6 +1714,10 @@ out: | ||
1500 | dm9000_release_board(pdev, db); | ||
1501 | free_netdev(ndev); | ||
1502 | |||
1503 | +out_regulator_disable: | ||
1504 | + if (!IS_ERR(power)) | ||
1505 | + regulator_disable(power); | ||
1506 | + | ||
1507 | return ret; | ||
1508 | } | ||
1509 | |||
1510 | @@ -1765,10 +1775,13 @@ static int | ||
1511 | dm9000_drv_remove(struct platform_device *pdev) | ||
1512 | { | ||
1513 | struct net_device *ndev = platform_get_drvdata(pdev); | ||
1514 | + struct board_info *dm = to_dm9000_board(ndev); | ||
1515 | |||
1516 | unregister_netdev(ndev); | ||
1517 | - dm9000_release_board(pdev, netdev_priv(ndev)); | ||
1518 | + dm9000_release_board(pdev, dm); | ||
1519 | free_netdev(ndev); /* free device structure */ | ||
1520 | + if (dm->power_supply) | ||
1521 | + regulator_disable(dm->power_supply); | ||
1522 | |||
1523 | dev_dbg(&pdev->dev, "released and freed device\n"); | ||
1524 | return 0; | ||
1525 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1526 | index 4ef4d41b0d8d6..b77eaf31bd4ed 100644 | ||
1527 | --- a/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1528 | +++ b/drivers/net/ethernet/freescale/enetc/enetc.c | ||
1529 | @@ -942,7 +942,7 @@ static void enetc_free_rxtx_rings(struct enetc_ndev_priv *priv) | ||
1530 | enetc_free_tx_ring(priv->tx_ring[i]); | ||
1531 | } | ||
1532 | |||
1533 | -static int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1534 | +int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1535 | { | ||
1536 | int size = cbdr->bd_count * sizeof(struct enetc_cbd); | ||
1537 | |||
1538 | @@ -963,7 +963,7 @@ static int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1539 | return 0; | ||
1540 | } | ||
1541 | |||
1542 | -static void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1543 | +void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1544 | { | ||
1545 | int size = cbdr->bd_count * sizeof(struct enetc_cbd); | ||
1546 | |||
1547 | @@ -971,7 +971,7 @@ static void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr) | ||
1548 | cbdr->bd_base = NULL; | ||
1549 | } | ||
1550 | |||
1551 | -static void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) | ||
1552 | +void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) | ||
1553 | { | ||
1554 | /* set CBDR cache attributes */ | ||
1555 | enetc_wr(hw, ENETC_SICAR2, | ||
1556 | @@ -991,7 +991,7 @@ static void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr) | ||
1557 | cbdr->cir = hw->reg + ENETC_SICBDRCIR; | ||
1558 | } | ||
1559 | |||
1560 | -static void enetc_clear_cbdr(struct enetc_hw *hw) | ||
1561 | +void enetc_clear_cbdr(struct enetc_hw *hw) | ||
1562 | { | ||
1563 | enetc_wr(hw, ENETC_SICBDRMR, 0); | ||
1564 | } | ||
1565 | @@ -1016,13 +1016,12 @@ static int enetc_setup_default_rss_table(struct enetc_si *si, int num_groups) | ||
1566 | return 0; | ||
1567 | } | ||
1568 | |||
1569 | -static int enetc_configure_si(struct enetc_ndev_priv *priv) | ||
1570 | +int enetc_configure_si(struct enetc_ndev_priv *priv) | ||
1571 | { | ||
1572 | struct enetc_si *si = priv->si; | ||
1573 | struct enetc_hw *hw = &si->hw; | ||
1574 | int err; | ||
1575 | |||
1576 | - enetc_setup_cbdr(hw, &si->cbd_ring); | ||
1577 | /* set SI cache attributes */ | ||
1578 | enetc_wr(hw, ENETC_SICAR0, | ||
1579 | ENETC_SICAR_RD_COHERENT | ENETC_SICAR_WR_COHERENT); | ||
1580 | @@ -1068,6 +1067,8 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv) | ||
1581 | if (err) | ||
1582 | return err; | ||
1583 | |||
1584 | + enetc_setup_cbdr(&si->hw, &si->cbd_ring); | ||
1585 | + | ||
1586 | priv->cls_rules = kcalloc(si->num_fs_entries, sizeof(*priv->cls_rules), | ||
1587 | GFP_KERNEL); | ||
1588 | if (!priv->cls_rules) { | ||
1589 | @@ -1075,14 +1076,8 @@ int enetc_alloc_si_resources(struct enetc_ndev_priv *priv) | ||
1590 | goto err_alloc_cls; | ||
1591 | } | ||
1592 | |||
1593 | - err = enetc_configure_si(priv); | ||
1594 | - if (err) | ||
1595 | - goto err_config_si; | ||
1596 | - | ||
1597 | return 0; | ||
1598 | |||
1599 | -err_config_si: | ||
1600 | - kfree(priv->cls_rules); | ||
1601 | err_alloc_cls: | ||
1602 | enetc_clear_cbdr(&si->hw); | ||
1603 | enetc_free_cbdr(priv->dev, &si->cbd_ring); | ||
1604 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc.h b/drivers/net/ethernet/freescale/enetc/enetc.h | ||
1605 | index 541b4e2073fe3..b8801a2b6a025 100644 | ||
1606 | --- a/drivers/net/ethernet/freescale/enetc/enetc.h | ||
1607 | +++ b/drivers/net/ethernet/freescale/enetc/enetc.h | ||
1608 | @@ -221,6 +221,7 @@ void enetc_get_si_caps(struct enetc_si *si); | ||
1609 | void enetc_init_si_rings_params(struct enetc_ndev_priv *priv); | ||
1610 | int enetc_alloc_si_resources(struct enetc_ndev_priv *priv); | ||
1611 | void enetc_free_si_resources(struct enetc_ndev_priv *priv); | ||
1612 | +int enetc_configure_si(struct enetc_ndev_priv *priv); | ||
1613 | |||
1614 | int enetc_open(struct net_device *ndev); | ||
1615 | int enetc_close(struct net_device *ndev); | ||
1616 | @@ -236,6 +237,10 @@ int enetc_setup_tc(struct net_device *ndev, enum tc_setup_type type, | ||
1617 | void enetc_set_ethtool_ops(struct net_device *ndev); | ||
1618 | |||
1619 | /* control buffer descriptor ring (CBDR) */ | ||
1620 | +int enetc_alloc_cbdr(struct device *dev, struct enetc_cbdr *cbdr); | ||
1621 | +void enetc_free_cbdr(struct device *dev, struct enetc_cbdr *cbdr); | ||
1622 | +void enetc_setup_cbdr(struct enetc_hw *hw, struct enetc_cbdr *cbdr); | ||
1623 | +void enetc_clear_cbdr(struct enetc_hw *hw); | ||
1624 | int enetc_set_mac_flt_entry(struct enetc_si *si, int index, | ||
1625 | char *mac_addr, int si_map); | ||
1626 | int enetc_clear_mac_flt_entry(struct enetc_si *si, int index); | ||
1627 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pf.c b/drivers/net/ethernet/freescale/enetc/enetc_pf.c | ||
1628 | index 22f70638a4055..ac62464e0416a 100644 | ||
1629 | --- a/drivers/net/ethernet/freescale/enetc/enetc_pf.c | ||
1630 | +++ b/drivers/net/ethernet/freescale/enetc/enetc_pf.c | ||
1631 | @@ -854,6 +854,26 @@ static int enetc_init_port_rss_memory(struct enetc_si *si) | ||
1632 | return err; | ||
1633 | } | ||
1634 | |||
1635 | +static void enetc_init_unused_port(struct enetc_si *si) | ||
1636 | +{ | ||
1637 | + struct device *dev = &si->pdev->dev; | ||
1638 | + struct enetc_hw *hw = &si->hw; | ||
1639 | + int err; | ||
1640 | + | ||
1641 | + si->cbd_ring.bd_count = ENETC_CBDR_DEFAULT_SIZE; | ||
1642 | + err = enetc_alloc_cbdr(dev, &si->cbd_ring); | ||
1643 | + if (err) | ||
1644 | + return; | ||
1645 | + | ||
1646 | + enetc_setup_cbdr(hw, &si->cbd_ring); | ||
1647 | + | ||
1648 | + enetc_init_port_rfs_memory(si); | ||
1649 | + enetc_init_port_rss_memory(si); | ||
1650 | + | ||
1651 | + enetc_clear_cbdr(hw); | ||
1652 | + enetc_free_cbdr(dev, &si->cbd_ring); | ||
1653 | +} | ||
1654 | + | ||
1655 | static int enetc_pf_probe(struct pci_dev *pdev, | ||
1656 | const struct pci_device_id *ent) | ||
1657 | { | ||
1658 | @@ -863,11 +883,6 @@ static int enetc_pf_probe(struct pci_dev *pdev, | ||
1659 | struct enetc_pf *pf; | ||
1660 | int err; | ||
1661 | |||
1662 | - if (pdev->dev.of_node && !of_device_is_available(pdev->dev.of_node)) { | ||
1663 | - dev_info(&pdev->dev, "device is disabled, skipping\n"); | ||
1664 | - return -ENODEV; | ||
1665 | - } | ||
1666 | - | ||
1667 | err = enetc_pci_probe(pdev, KBUILD_MODNAME, sizeof(*pf)); | ||
1668 | if (err) { | ||
1669 | dev_err(&pdev->dev, "PCI probing failed\n"); | ||
1670 | @@ -881,6 +896,13 @@ static int enetc_pf_probe(struct pci_dev *pdev, | ||
1671 | goto err_map_pf_space; | ||
1672 | } | ||
1673 | |||
1674 | + if (pdev->dev.of_node && !of_device_is_available(pdev->dev.of_node)) { | ||
1675 | + enetc_init_unused_port(si); | ||
1676 | + dev_info(&pdev->dev, "device is disabled, skipping\n"); | ||
1677 | + err = -ENODEV; | ||
1678 | + goto err_device_disabled; | ||
1679 | + } | ||
1680 | + | ||
1681 | pf = enetc_si_priv(si); | ||
1682 | pf->si = si; | ||
1683 | pf->total_vfs = pci_sriov_get_totalvfs(pdev); | ||
1684 | @@ -920,6 +942,12 @@ static int enetc_pf_probe(struct pci_dev *pdev, | ||
1685 | goto err_init_port_rss; | ||
1686 | } | ||
1687 | |||
1688 | + err = enetc_configure_si(priv); | ||
1689 | + if (err) { | ||
1690 | + dev_err(&pdev->dev, "Failed to configure SI\n"); | ||
1691 | + goto err_config_si; | ||
1692 | + } | ||
1693 | + | ||
1694 | err = enetc_alloc_msix(priv); | ||
1695 | if (err) { | ||
1696 | dev_err(&pdev->dev, "MSIX alloc failed\n"); | ||
1697 | @@ -945,6 +973,7 @@ err_reg_netdev: | ||
1698 | enetc_mdio_remove(pf); | ||
1699 | enetc_of_put_phy(priv); | ||
1700 | enetc_free_msix(priv); | ||
1701 | +err_config_si: | ||
1702 | err_init_port_rss: | ||
1703 | err_init_port_rfs: | ||
1704 | err_alloc_msix: | ||
1705 | @@ -953,6 +982,7 @@ err_alloc_si_res: | ||
1706 | si->ndev = NULL; | ||
1707 | free_netdev(ndev); | ||
1708 | err_alloc_netdev: | ||
1709 | +err_device_disabled: | ||
1710 | err_map_pf_space: | ||
1711 | enetc_pci_remove(pdev); | ||
1712 | |||
1713 | diff --git a/drivers/net/ethernet/freescale/enetc/enetc_vf.c b/drivers/net/ethernet/freescale/enetc/enetc_vf.c | ||
1714 | index ebd21bf4cfa1e..3a8c2049b417c 100644 | ||
1715 | --- a/drivers/net/ethernet/freescale/enetc/enetc_vf.c | ||
1716 | +++ b/drivers/net/ethernet/freescale/enetc/enetc_vf.c | ||
1717 | @@ -189,6 +189,12 @@ static int enetc_vf_probe(struct pci_dev *pdev, | ||
1718 | goto err_alloc_si_res; | ||
1719 | } | ||
1720 | |||
1721 | + err = enetc_configure_si(priv); | ||
1722 | + if (err) { | ||
1723 | + dev_err(&pdev->dev, "Failed to configure SI\n"); | ||
1724 | + goto err_config_si; | ||
1725 | + } | ||
1726 | + | ||
1727 | err = enetc_alloc_msix(priv); | ||
1728 | if (err) { | ||
1729 | dev_err(&pdev->dev, "MSIX alloc failed\n"); | ||
1730 | @@ -208,6 +214,7 @@ static int enetc_vf_probe(struct pci_dev *pdev, | ||
1731 | |||
1732 | err_reg_netdev: | ||
1733 | enetc_free_msix(priv); | ||
1734 | +err_config_si: | ||
1735 | err_alloc_msix: | ||
1736 | enetc_free_si_resources(priv); | ||
1737 | err_alloc_si_res: | ||
1738 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | ||
1739 | index 1426eb5ddf3df..e34e0854635c3 100644 | ||
1740 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | ||
1741 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | ||
1742 | @@ -1018,16 +1018,16 @@ struct hclge_fd_tcam_config_3_cmd { | ||
1743 | #define HCLGE_FD_AD_DROP_B 0 | ||
1744 | #define HCLGE_FD_AD_DIRECT_QID_B 1 | ||
1745 | #define HCLGE_FD_AD_QID_S 2 | ||
1746 | -#define HCLGE_FD_AD_QID_M GENMASK(12, 2) | ||
1747 | +#define HCLGE_FD_AD_QID_M GENMASK(11, 2) | ||
1748 | #define HCLGE_FD_AD_USE_COUNTER_B 12 | ||
1749 | #define HCLGE_FD_AD_COUNTER_NUM_S 13 | ||
1750 | #define HCLGE_FD_AD_COUNTER_NUM_M GENMASK(20, 13) | ||
1751 | #define HCLGE_FD_AD_NXT_STEP_B 20 | ||
1752 | #define HCLGE_FD_AD_NXT_KEY_S 21 | ||
1753 | -#define HCLGE_FD_AD_NXT_KEY_M GENMASK(26, 21) | ||
1754 | +#define HCLGE_FD_AD_NXT_KEY_M GENMASK(25, 21) | ||
1755 | #define HCLGE_FD_AD_WR_RULE_ID_B 0 | ||
1756 | #define HCLGE_FD_AD_RULE_ID_S 1 | ||
1757 | -#define HCLGE_FD_AD_RULE_ID_M GENMASK(13, 1) | ||
1758 | +#define HCLGE_FD_AD_RULE_ID_M GENMASK(12, 1) | ||
1759 | |||
1760 | struct hclge_fd_ad_config_cmd { | ||
1761 | u8 stage; | ||
1762 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
1763 | index 08040cafc06bc..93f3865b679bf 100644 | ||
1764 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
1765 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
1766 | @@ -4908,9 +4908,9 @@ static bool hclge_fd_convert_tuple(u32 tuple_bit, u8 *key_x, u8 *key_y, | ||
1767 | case BIT(INNER_SRC_MAC): | ||
1768 | for (i = 0; i < ETH_ALEN; i++) { | ||
1769 | calc_x(key_x[ETH_ALEN - 1 - i], rule->tuples.src_mac[i], | ||
1770 | - rule->tuples.src_mac[i]); | ||
1771 | + rule->tuples_mask.src_mac[i]); | ||
1772 | calc_y(key_y[ETH_ALEN - 1 - i], rule->tuples.src_mac[i], | ||
1773 | - rule->tuples.src_mac[i]); | ||
1774 | + rule->tuples_mask.src_mac[i]); | ||
1775 | } | ||
1776 | |||
1777 | return true; | ||
1778 | @@ -5939,8 +5939,7 @@ static int hclge_get_fd_rule_info(struct hnae3_handle *handle, | ||
1779 | fs->h_ext.vlan_tci = cpu_to_be16(rule->tuples.vlan_tag1); | ||
1780 | fs->m_ext.vlan_tci = | ||
1781 | rule->unused_tuple & BIT(INNER_VLAN_TAG_FST) ? | ||
1782 | - cpu_to_be16(VLAN_VID_MASK) : | ||
1783 | - cpu_to_be16(rule->tuples_mask.vlan_tag1); | ||
1784 | + 0 : cpu_to_be16(rule->tuples_mask.vlan_tag1); | ||
1785 | } | ||
1786 | |||
1787 | if (fs->flow_type & FLOW_MAC_EXT) { | ||
1788 | diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1789 | index 309cdc5ebc1ff..79b13750fa2d2 100644 | ||
1790 | --- a/drivers/net/ethernet/ibm/ibmvnic.c | ||
1791 | +++ b/drivers/net/ethernet/ibm/ibmvnic.c | ||
1792 | @@ -1753,10 +1753,9 @@ static int ibmvnic_set_mac(struct net_device *netdev, void *p) | ||
1793 | if (!is_valid_ether_addr(addr->sa_data)) | ||
1794 | return -EADDRNOTAVAIL; | ||
1795 | |||
1796 | - if (adapter->state != VNIC_PROBED) { | ||
1797 | - ether_addr_copy(adapter->mac_addr, addr->sa_data); | ||
1798 | + ether_addr_copy(adapter->mac_addr, addr->sa_data); | ||
1799 | + if (adapter->state != VNIC_PROBED) | ||
1800 | rc = __ibmvnic_set_mac(netdev, addr->sa_data); | ||
1801 | - } | ||
1802 | |||
1803 | return rc; | ||
1804 | } | ||
1805 | diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1806 | index 0604b5aaad86f..58211590229b1 100644 | ||
1807 | --- a/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1808 | +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c | ||
1809 | @@ -15142,6 +15142,8 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
1810 | if (err) { | ||
1811 | dev_info(&pdev->dev, | ||
1812 | "setup of misc vector failed: %d\n", err); | ||
1813 | + i40e_cloud_filter_exit(pf); | ||
1814 | + i40e_fdir_teardown(pf); | ||
1815 | goto err_vsis; | ||
1816 | } | ||
1817 | } | ||
1818 | diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | ||
1819 | index 113f6087c7c9a..b14b164c9601f 100644 | ||
1820 | --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | ||
1821 | +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | ||
1822 | @@ -575,6 +575,11 @@ static int ixgbe_ipsec_add_sa(struct xfrm_state *xs) | ||
1823 | return -EINVAL; | ||
1824 | } | ||
1825 | |||
1826 | + if (xs->props.mode != XFRM_MODE_TRANSPORT) { | ||
1827 | + netdev_err(dev, "Unsupported mode for ipsec offload\n"); | ||
1828 | + return -EINVAL; | ||
1829 | + } | ||
1830 | + | ||
1831 | if (ixgbe_ipsec_check_mgmt_ip(xs)) { | ||
1832 | netdev_err(dev, "IPsec IP addr clash with mgmt filters\n"); | ||
1833 | return -EINVAL; | ||
1834 | diff --git a/drivers/net/ethernet/intel/ixgbevf/ipsec.c b/drivers/net/ethernet/intel/ixgbevf/ipsec.c | ||
1835 | index 5170dd9d8705b..caaea2c920a6e 100644 | ||
1836 | --- a/drivers/net/ethernet/intel/ixgbevf/ipsec.c | ||
1837 | +++ b/drivers/net/ethernet/intel/ixgbevf/ipsec.c | ||
1838 | @@ -272,6 +272,11 @@ static int ixgbevf_ipsec_add_sa(struct xfrm_state *xs) | ||
1839 | return -EINVAL; | ||
1840 | } | ||
1841 | |||
1842 | + if (xs->props.mode != XFRM_MODE_TRANSPORT) { | ||
1843 | + netdev_err(dev, "Unsupported mode for ipsec offload\n"); | ||
1844 | + return -EINVAL; | ||
1845 | + } | ||
1846 | + | ||
1847 | if (xs->xso.flags & XFRM_OFFLOAD_INBOUND) { | ||
1848 | struct rx_sa rsa; | ||
1849 | |||
1850 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
1851 | index a1202e53710cd..5582fba2f5823 100644 | ||
1852 | --- a/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
1853 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | ||
1854 | @@ -47,7 +47,7 @@ | ||
1855 | #define EN_ETHTOOL_SHORT_MASK cpu_to_be16(0xffff) | ||
1856 | #define EN_ETHTOOL_WORD_MASK cpu_to_be32(0xffffffff) | ||
1857 | |||
1858 | -static int mlx4_en_moderation_update(struct mlx4_en_priv *priv) | ||
1859 | +int mlx4_en_moderation_update(struct mlx4_en_priv *priv) | ||
1860 | { | ||
1861 | int i, t; | ||
1862 | int err = 0; | ||
1863 | diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
1864 | index b5eb116249dda..cd165e52ed33c 100644 | ||
1865 | --- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
1866 | +++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c | ||
1867 | @@ -3657,6 +3657,8 @@ int mlx4_en_reset_config(struct net_device *dev, | ||
1868 | en_err(priv, "Failed starting port\n"); | ||
1869 | } | ||
1870 | |||
1871 | + if (!err) | ||
1872 | + err = mlx4_en_moderation_update(priv); | ||
1873 | out: | ||
1874 | mutex_unlock(&mdev->state_lock); | ||
1875 | kfree(tmp); | ||
1876 | diff --git a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
1877 | index a2f69c6f0c79f..17a5bd4c68b2b 100644 | ||
1878 | --- a/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
1879 | +++ b/drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | ||
1880 | @@ -797,6 +797,7 @@ void mlx4_en_ptp_overflow_check(struct mlx4_en_dev *mdev); | ||
1881 | #define DEV_FEATURE_CHANGED(dev, new_features, feature) \ | ||
1882 | ((dev->features & feature) ^ (new_features & feature)) | ||
1883 | |||
1884 | +int mlx4_en_moderation_update(struct mlx4_en_priv *priv); | ||
1885 | int mlx4_en_reset_config(struct net_device *dev, | ||
1886 | struct hwtstamp_config ts_config, | ||
1887 | netdev_features_t new_features); | ||
1888 | diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c | ||
1889 | index 18f86e441570c..a042f4607b0d0 100644 | ||
1890 | --- a/drivers/net/ethernet/renesas/sh_eth.c | ||
1891 | +++ b/drivers/net/ethernet/renesas/sh_eth.c | ||
1892 | @@ -610,6 +610,8 @@ static struct sh_eth_cpu_data r7s72100_data = { | ||
1893 | EESR_TDE, | ||
1894 | .fdr_value = 0x0000070f, | ||
1895 | |||
1896 | + .trscer_err_mask = DESC_I_RINT8 | DESC_I_RINT5, | ||
1897 | + | ||
1898 | .no_psr = 1, | ||
1899 | .apr = 1, | ||
1900 | .mpr = 1, | ||
1901 | @@ -828,6 +830,8 @@ static struct sh_eth_cpu_data r7s9210_data = { | ||
1902 | |||
1903 | .fdr_value = 0x0000070f, | ||
1904 | |||
1905 | + .trscer_err_mask = DESC_I_RINT8 | DESC_I_RINT5, | ||
1906 | + | ||
1907 | .apr = 1, | ||
1908 | .mpr = 1, | ||
1909 | .tpauser = 1, | ||
1910 | @@ -1131,6 +1135,9 @@ static struct sh_eth_cpu_data sh771x_data = { | ||
1911 | EESIPR_CEEFIP | EESIPR_CELFIP | | ||
1912 | EESIPR_RRFIP | EESIPR_RTLFIP | EESIPR_RTSFIP | | ||
1913 | EESIPR_PREIP | EESIPR_CERFIP, | ||
1914 | + | ||
1915 | + .trscer_err_mask = DESC_I_RINT8, | ||
1916 | + | ||
1917 | .tsu = 1, | ||
1918 | .dual_port = 1, | ||
1919 | }; | ||
1920 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | ||
1921 | index 68c157979b947..a41ac13cc4e55 100644 | ||
1922 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | ||
1923 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c | ||
1924 | @@ -116,6 +116,23 @@ static void dwmac4_dma_init_channel(void __iomem *ioaddr, | ||
1925 | ioaddr + DMA_CHAN_INTR_ENA(chan)); | ||
1926 | } | ||
1927 | |||
1928 | +static void dwmac410_dma_init_channel(void __iomem *ioaddr, | ||
1929 | + struct stmmac_dma_cfg *dma_cfg, u32 chan) | ||
1930 | +{ | ||
1931 | + u32 value; | ||
1932 | + | ||
1933 | + /* common channel control register config */ | ||
1934 | + value = readl(ioaddr + DMA_CHAN_CONTROL(chan)); | ||
1935 | + if (dma_cfg->pblx8) | ||
1936 | + value = value | DMA_BUS_MODE_PBL; | ||
1937 | + | ||
1938 | + writel(value, ioaddr + DMA_CHAN_CONTROL(chan)); | ||
1939 | + | ||
1940 | + /* Mask interrupts by writing to CSR7 */ | ||
1941 | + writel(DMA_CHAN_INTR_DEFAULT_MASK_4_10, | ||
1942 | + ioaddr + DMA_CHAN_INTR_ENA(chan)); | ||
1943 | +} | ||
1944 | + | ||
1945 | static void dwmac4_dma_init(void __iomem *ioaddr, | ||
1946 | struct stmmac_dma_cfg *dma_cfg, int atds) | ||
1947 | { | ||
1948 | @@ -462,7 +479,7 @@ const struct stmmac_dma_ops dwmac4_dma_ops = { | ||
1949 | const struct stmmac_dma_ops dwmac410_dma_ops = { | ||
1950 | .reset = dwmac4_dma_reset, | ||
1951 | .init = dwmac4_dma_init, | ||
1952 | - .init_chan = dwmac4_dma_init_channel, | ||
1953 | + .init_chan = dwmac410_dma_init_channel, | ||
1954 | .init_rx_chan = dwmac4_dma_init_rx_chan, | ||
1955 | .init_tx_chan = dwmac4_dma_init_tx_chan, | ||
1956 | .axi = dwmac4_dma_axi, | ||
1957 | diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | ||
1958 | index f2a29a90e0854..afdea015f4b45 100644 | ||
1959 | --- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | ||
1960 | +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_lib.c | ||
1961 | @@ -60,10 +60,6 @@ void dwmac4_dma_stop_tx(void __iomem *ioaddr, u32 chan) | ||
1962 | |||
1963 | value &= ~DMA_CONTROL_ST; | ||
1964 | writel(value, ioaddr + DMA_CHAN_TX_CONTROL(chan)); | ||
1965 | - | ||
1966 | - value = readl(ioaddr + GMAC_CONFIG); | ||
1967 | - value &= ~GMAC_CONFIG_TE; | ||
1968 | - writel(value, ioaddr + GMAC_CONFIG); | ||
1969 | } | ||
1970 | |||
1971 | void dwmac4_dma_start_rx(void __iomem *ioaddr, u32 chan) | ||
1972 | diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
1973 | index ce5d3e9e5dff4..8e7c60e02fa09 100644 | ||
1974 | --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
1975 | +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | ||
1976 | @@ -4821,6 +4821,8 @@ static void stmmac_reset_queues_param(struct stmmac_priv *priv) | ||
1977 | tx_q->cur_tx = 0; | ||
1978 | tx_q->dirty_tx = 0; | ||
1979 | tx_q->mss = 0; | ||
1980 | + | ||
1981 | + netdev_tx_reset_queue(netdev_get_tx_queue(priv->dev, queue)); | ||
1982 | } | ||
1983 | } | ||
1984 | |||
1985 | diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c | ||
1986 | index a6bbe93f29ef6..917f37c176302 100644 | ||
1987 | --- a/drivers/net/netdevsim/netdev.c | ||
1988 | +++ b/drivers/net/netdevsim/netdev.c | ||
1989 | @@ -292,6 +292,7 @@ nsim_create(struct nsim_dev *nsim_dev, struct nsim_dev_port *nsim_dev_port) | ||
1990 | |||
1991 | ns = netdev_priv(dev); | ||
1992 | ns->netdev = dev; | ||
1993 | + u64_stats_init(&ns->syncp); | ||
1994 | ns->nsim_dev = nsim_dev; | ||
1995 | ns->nsim_dev_port = nsim_dev_port; | ||
1996 | ns->nsim_bus_dev = nsim_dev->nsim_bus_dev; | ||
1997 | diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c | ||
1998 | index b718b11607fcd..b0b8a3ce82b68 100644 | ||
1999 | --- a/drivers/net/phy/phy.c | ||
2000 | +++ b/drivers/net/phy/phy.c | ||
2001 | @@ -345,15 +345,16 @@ int phy_ethtool_ksettings_set(struct phy_device *phydev, | ||
2002 | |||
2003 | phydev->autoneg = autoneg; | ||
2004 | |||
2005 | - phydev->speed = speed; | ||
2006 | + if (autoneg == AUTONEG_DISABLE) { | ||
2007 | + phydev->speed = speed; | ||
2008 | + phydev->duplex = duplex; | ||
2009 | + } | ||
2010 | |||
2011 | linkmode_copy(phydev->advertising, advertising); | ||
2012 | |||
2013 | linkmode_mod_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, | ||
2014 | phydev->advertising, autoneg == AUTONEG_ENABLE); | ||
2015 | |||
2016 | - phydev->duplex = duplex; | ||
2017 | - | ||
2018 | phydev->mdix_ctrl = cmd->base.eth_tp_mdix_ctrl; | ||
2019 | |||
2020 | /* Restart the PHY */ | ||
2021 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
2022 | index 05b85b94d9518..6508d70056b3a 100644 | ||
2023 | --- a/drivers/net/usb/qmi_wwan.c | ||
2024 | +++ b/drivers/net/usb/qmi_wwan.c | ||
2025 | @@ -441,13 +441,6 @@ static ssize_t add_mux_store(struct device *d, struct device_attribute *attr, c | ||
2026 | goto err; | ||
2027 | } | ||
2028 | |||
2029 | - /* we don't want to modify a running netdev */ | ||
2030 | - if (netif_running(dev->net)) { | ||
2031 | - netdev_err(dev->net, "Cannot change a running device\n"); | ||
2032 | - ret = -EBUSY; | ||
2033 | - goto err; | ||
2034 | - } | ||
2035 | - | ||
2036 | ret = qmimux_register_device(dev->net, mux_id); | ||
2037 | if (!ret) { | ||
2038 | info->flags |= QMI_WWAN_FLAG_MUX; | ||
2039 | @@ -477,13 +470,6 @@ static ssize_t del_mux_store(struct device *d, struct device_attribute *attr, c | ||
2040 | if (!rtnl_trylock()) | ||
2041 | return restart_syscall(); | ||
2042 | |||
2043 | - /* we don't want to modify a running netdev */ | ||
2044 | - if (netif_running(dev->net)) { | ||
2045 | - netdev_err(dev->net, "Cannot change a running device\n"); | ||
2046 | - ret = -EBUSY; | ||
2047 | - goto err; | ||
2048 | - } | ||
2049 | - | ||
2050 | del_dev = qmimux_find_dev(dev, mux_id); | ||
2051 | if (!del_dev) { | ||
2052 | netdev_err(dev->net, "mux_id not present\n"); | ||
2053 | diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c | ||
2054 | index 709e3de0f6af1..60f357d2f79fa 100644 | ||
2055 | --- a/drivers/net/wan/lapbether.c | ||
2056 | +++ b/drivers/net/wan/lapbether.c | ||
2057 | @@ -283,7 +283,6 @@ static int lapbeth_open(struct net_device *dev) | ||
2058 | return -ENODEV; | ||
2059 | } | ||
2060 | |||
2061 | - netif_start_queue(dev); | ||
2062 | return 0; | ||
2063 | } | ||
2064 | |||
2065 | @@ -291,8 +290,6 @@ static int lapbeth_close(struct net_device *dev) | ||
2066 | { | ||
2067 | int err; | ||
2068 | |||
2069 | - netif_stop_queue(dev); | ||
2070 | - | ||
2071 | if ((err = lapb_unregister(dev)) != LAPB_OK) | ||
2072 | pr_err("lapb_unregister error: %d\n", err); | ||
2073 | |||
2074 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
2075 | index a412b352182c8..d50022d264642 100644 | ||
2076 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||
2077 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
2078 | @@ -177,7 +177,8 @@ struct ath_frame_info { | ||
2079 | s8 txq; | ||
2080 | u8 keyix; | ||
2081 | u8 rtscts_rate; | ||
2082 | - u8 retries : 7; | ||
2083 | + u8 retries : 6; | ||
2084 | + u8 dyn_smps : 1; | ||
2085 | u8 baw_tracked : 1; | ||
2086 | u8 tx_power; | ||
2087 | enum ath9k_key_type keytype:2; | ||
2088 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c | ||
2089 | index 31e7b108279c6..14e6871a14054 100644 | ||
2090 | --- a/drivers/net/wireless/ath/ath9k/xmit.c | ||
2091 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c | ||
2092 | @@ -1271,6 +1271,11 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, | ||
2093 | is_40, is_sgi, is_sp); | ||
2094 | if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) | ||
2095 | info->rates[i].RateFlags |= ATH9K_RATESERIES_STBC; | ||
2096 | + if (rix >= 8 && fi->dyn_smps) { | ||
2097 | + info->rates[i].RateFlags |= | ||
2098 | + ATH9K_RATESERIES_RTS_CTS; | ||
2099 | + info->flags |= ATH9K_TXDESC_CTSENA; | ||
2100 | + } | ||
2101 | |||
2102 | info->txpower[i] = ath_get_rate_txpower(sc, bf, rix, | ||
2103 | is_40, false); | ||
2104 | @@ -2111,6 +2116,7 @@ static void setup_frame_info(struct ieee80211_hw *hw, | ||
2105 | fi->keyix = an->ps_key; | ||
2106 | else | ||
2107 | fi->keyix = ATH9K_TXKEYIX_INVALID; | ||
2108 | + fi->dyn_smps = sta && sta->smps_mode == IEEE80211_SMPS_DYNAMIC; | ||
2109 | fi->keytype = keytype; | ||
2110 | fi->framelen = framelen; | ||
2111 | fi->tx_power = txpower; | ||
2112 | diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c | ||
2113 | index 781952b686ed2..d3efcbd48ee1e 100644 | ||
2114 | --- a/drivers/net/wireless/mediatek/mt76/dma.c | ||
2115 | +++ b/drivers/net/wireless/mediatek/mt76/dma.c | ||
2116 | @@ -454,13 +454,13 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, | ||
2117 | { | ||
2118 | struct sk_buff *skb = q->rx_head; | ||
2119 | struct skb_shared_info *shinfo = skb_shinfo(skb); | ||
2120 | + int nr_frags = shinfo->nr_frags; | ||
2121 | |||
2122 | - if (shinfo->nr_frags < ARRAY_SIZE(shinfo->frags)) { | ||
2123 | + if (nr_frags < ARRAY_SIZE(shinfo->frags)) { | ||
2124 | struct page *page = virt_to_head_page(data); | ||
2125 | int offset = data - page_address(page) + q->buf_offset; | ||
2126 | |||
2127 | - skb_add_rx_frag(skb, shinfo->nr_frags, page, offset, len, | ||
2128 | - q->buf_size); | ||
2129 | + skb_add_rx_frag(skb, nr_frags, page, offset, len, q->buf_size); | ||
2130 | } else { | ||
2131 | skb_free_frag(data); | ||
2132 | } | ||
2133 | @@ -469,7 +469,10 @@ mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data, | ||
2134 | return; | ||
2135 | |||
2136 | q->rx_head = NULL; | ||
2137 | - dev->drv->rx_skb(dev, q - dev->q_rx, skb); | ||
2138 | + if (nr_frags < ARRAY_SIZE(shinfo->frags)) | ||
2139 | + dev->drv->rx_skb(dev, q - dev->q_rx, skb); | ||
2140 | + else | ||
2141 | + dev_kfree_skb(skb); | ||
2142 | } | ||
2143 | |||
2144 | static int | ||
2145 | diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c | ||
2146 | index 95d77a17375e1..e4e24e7bf4628 100644 | ||
2147 | --- a/drivers/nvme/host/core.c | ||
2148 | +++ b/drivers/nvme/host/core.c | ||
2149 | @@ -455,7 +455,6 @@ static void nvme_free_ns_head(struct kref *ref) | ||
2150 | |||
2151 | nvme_mpath_remove_disk(head); | ||
2152 | ida_simple_remove(&head->subsys->ns_ida, head->instance); | ||
2153 | - list_del_init(&head->entry); | ||
2154 | cleanup_srcu_struct(&head->srcu); | ||
2155 | nvme_put_subsystem(head->subsys); | ||
2156 | kfree(head); | ||
2157 | @@ -3374,7 +3373,6 @@ static int __nvme_check_ids(struct nvme_subsystem *subsys, | ||
2158 | |||
2159 | list_for_each_entry(h, &subsys->nsheads, entry) { | ||
2160 | if (nvme_ns_ids_valid(&new->ids) && | ||
2161 | - !list_empty(&h->list) && | ||
2162 | nvme_ns_ids_equal(&new->ids, &h->ids)) | ||
2163 | return -EINVAL; | ||
2164 | } | ||
2165 | @@ -3469,6 +3467,7 @@ static int nvme_init_ns_head(struct nvme_ns *ns, unsigned nsid, | ||
2166 | "IDs don't match for shared namespace %d\n", | ||
2167 | nsid); | ||
2168 | ret = -EINVAL; | ||
2169 | + nvme_put_ns_head(head); | ||
2170 | goto out_unlock; | ||
2171 | } | ||
2172 | } | ||
2173 | @@ -3629,6 +3628,8 @@ static int nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid) | ||
2174 | out_unlink_ns: | ||
2175 | mutex_lock(&ctrl->subsys->lock); | ||
2176 | list_del_rcu(&ns->siblings); | ||
2177 | + if (list_empty(&ns->head->list)) | ||
2178 | + list_del_init(&ns->head->entry); | ||
2179 | mutex_unlock(&ctrl->subsys->lock); | ||
2180 | nvme_put_ns_head(ns->head); | ||
2181 | out_free_id: | ||
2182 | @@ -3651,7 +3652,10 @@ static void nvme_ns_remove(struct nvme_ns *ns) | ||
2183 | |||
2184 | mutex_lock(&ns->ctrl->subsys->lock); | ||
2185 | list_del_rcu(&ns->siblings); | ||
2186 | + if (list_empty(&ns->head->list)) | ||
2187 | + list_del_init(&ns->head->entry); | ||
2188 | mutex_unlock(&ns->ctrl->subsys->lock); | ||
2189 | + | ||
2190 | synchronize_rcu(); /* guarantee not available in head->list */ | ||
2191 | nvme_mpath_clear_current_path(ns); | ||
2192 | synchronize_srcu(&ns->head->srcu); /* wait for concurrent submissions */ | ||
2193 | diff --git a/drivers/pci/controller/pci-xgene-msi.c b/drivers/pci/controller/pci-xgene-msi.c | ||
2194 | index f4c02da84e599..0bfa5065b4405 100644 | ||
2195 | --- a/drivers/pci/controller/pci-xgene-msi.c | ||
2196 | +++ b/drivers/pci/controller/pci-xgene-msi.c | ||
2197 | @@ -384,13 +384,9 @@ static int xgene_msi_hwirq_alloc(unsigned int cpu) | ||
2198 | if (!msi_group->gic_irq) | ||
2199 | continue; | ||
2200 | |||
2201 | - irq_set_chained_handler(msi_group->gic_irq, | ||
2202 | - xgene_msi_isr); | ||
2203 | - err = irq_set_handler_data(msi_group->gic_irq, msi_group); | ||
2204 | - if (err) { | ||
2205 | - pr_err("failed to register GIC IRQ handler\n"); | ||
2206 | - return -EINVAL; | ||
2207 | - } | ||
2208 | + irq_set_chained_handler_and_data(msi_group->gic_irq, | ||
2209 | + xgene_msi_isr, msi_group); | ||
2210 | + | ||
2211 | /* | ||
2212 | * Statically allocate MSI GIC IRQs to each CPU core. | ||
2213 | * With 8-core X-Gene v1, 2 MSI GIC IRQs are allocated | ||
2214 | diff --git a/drivers/pci/controller/pcie-mediatek.c b/drivers/pci/controller/pcie-mediatek.c | ||
2215 | index 626a7c352dfdf..728a59655825d 100644 | ||
2216 | --- a/drivers/pci/controller/pcie-mediatek.c | ||
2217 | +++ b/drivers/pci/controller/pcie-mediatek.c | ||
2218 | @@ -1063,14 +1063,14 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie) | ||
2219 | err = of_pci_get_devfn(child); | ||
2220 | if (err < 0) { | ||
2221 | dev_err(dev, "failed to parse devfn: %d\n", err); | ||
2222 | - return err; | ||
2223 | + goto error_put_node; | ||
2224 | } | ||
2225 | |||
2226 | slot = PCI_SLOT(err); | ||
2227 | |||
2228 | err = mtk_pcie_parse_port(pcie, child, slot); | ||
2229 | if (err) | ||
2230 | - return err; | ||
2231 | + goto error_put_node; | ||
2232 | } | ||
2233 | |||
2234 | err = mtk_pcie_subsys_powerup(pcie); | ||
2235 | @@ -1086,6 +1086,9 @@ static int mtk_pcie_setup(struct mtk_pcie *pcie) | ||
2236 | mtk_pcie_subsys_powerdown(pcie); | ||
2237 | |||
2238 | return 0; | ||
2239 | +error_put_node: | ||
2240 | + of_node_put(child); | ||
2241 | + return err; | ||
2242 | } | ||
2243 | |||
2244 | static int mtk_pcie_probe(struct platform_device *pdev) | ||
2245 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c | ||
2246 | index 9add26438be50..3c3bc9f584983 100644 | ||
2247 | --- a/drivers/pci/pci.c | ||
2248 | +++ b/drivers/pci/pci.c | ||
2249 | @@ -3903,6 +3903,10 @@ int pci_register_io_range(struct fwnode_handle *fwnode, phys_addr_t addr, | ||
2250 | ret = logic_pio_register_range(range); | ||
2251 | if (ret) | ||
2252 | kfree(range); | ||
2253 | + | ||
2254 | + /* Ignore duplicates due to deferred probing */ | ||
2255 | + if (ret == -EEXIST) | ||
2256 | + ret = 0; | ||
2257 | #endif | ||
2258 | |||
2259 | return ret; | ||
2260 | diff --git a/drivers/platform/olpc/olpc-ec.c b/drivers/platform/olpc/olpc-ec.c | ||
2261 | index f64b82824db28..2db7113383fdc 100644 | ||
2262 | --- a/drivers/platform/olpc/olpc-ec.c | ||
2263 | +++ b/drivers/platform/olpc/olpc-ec.c | ||
2264 | @@ -426,11 +426,8 @@ static int olpc_ec_probe(struct platform_device *pdev) | ||
2265 | |||
2266 | /* get the EC revision */ | ||
2267 | err = olpc_ec_cmd(EC_FIRMWARE_REV, NULL, 0, &ec->version, 1); | ||
2268 | - if (err) { | ||
2269 | - ec_priv = NULL; | ||
2270 | - kfree(ec); | ||
2271 | - return err; | ||
2272 | - } | ||
2273 | + if (err) | ||
2274 | + goto error; | ||
2275 | |||
2276 | config.dev = pdev->dev.parent; | ||
2277 | config.driver_data = ec; | ||
2278 | @@ -440,12 +437,16 @@ static int olpc_ec_probe(struct platform_device *pdev) | ||
2279 | if (IS_ERR(ec->dcon_rdev)) { | ||
2280 | dev_err(&pdev->dev, "failed to register DCON regulator\n"); | ||
2281 | err = PTR_ERR(ec->dcon_rdev); | ||
2282 | - kfree(ec); | ||
2283 | - return err; | ||
2284 | + goto error; | ||
2285 | } | ||
2286 | |||
2287 | ec->dbgfs_dir = olpc_ec_setup_debugfs(); | ||
2288 | |||
2289 | + return 0; | ||
2290 | + | ||
2291 | +error: | ||
2292 | + ec_priv = NULL; | ||
2293 | + kfree(ec); | ||
2294 | return err; | ||
2295 | } | ||
2296 | |||
2297 | diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c | ||
2298 | index a0ebc2e603949..b577c8f7e3462 100644 | ||
2299 | --- a/drivers/s390/block/dasd.c | ||
2300 | +++ b/drivers/s390/block/dasd.c | ||
2301 | @@ -3087,7 +3087,8 @@ static blk_status_t do_dasd_request(struct blk_mq_hw_ctx *hctx, | ||
2302 | |||
2303 | basedev = block->base; | ||
2304 | spin_lock_irq(&dq->lock); | ||
2305 | - if (basedev->state < DASD_STATE_READY) { | ||
2306 | + if (basedev->state < DASD_STATE_READY || | ||
2307 | + test_bit(DASD_FLAG_OFFLINE, &basedev->flags)) { | ||
2308 | DBF_DEV_EVENT(DBF_ERR, basedev, | ||
2309 | "device not ready for request %p", req); | ||
2310 | rc = BLK_STS_IOERR; | ||
2311 | @@ -3522,8 +3523,6 @@ void dasd_generic_remove(struct ccw_device *cdev) | ||
2312 | struct dasd_device *device; | ||
2313 | struct dasd_block *block; | ||
2314 | |||
2315 | - cdev->handler = NULL; | ||
2316 | - | ||
2317 | device = dasd_device_from_cdev(cdev); | ||
2318 | if (IS_ERR(device)) { | ||
2319 | dasd_remove_sysfs_files(cdev); | ||
2320 | @@ -3542,6 +3541,7 @@ void dasd_generic_remove(struct ccw_device *cdev) | ||
2321 | * no quite down yet. | ||
2322 | */ | ||
2323 | dasd_set_target_state(device, DASD_STATE_NEW); | ||
2324 | + cdev->handler = NULL; | ||
2325 | /* dasd_delete_device destroys the device reference. */ | ||
2326 | block = device->block; | ||
2327 | dasd_delete_device(device); | ||
2328 | diff --git a/drivers/s390/cio/vfio_ccw_ops.c b/drivers/s390/cio/vfio_ccw_ops.c | ||
2329 | index f0d71ab77c50e..15df0a5c03ecb 100644 | ||
2330 | --- a/drivers/s390/cio/vfio_ccw_ops.c | ||
2331 | +++ b/drivers/s390/cio/vfio_ccw_ops.c | ||
2332 | @@ -506,7 +506,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, | ||
2333 | if (ret) | ||
2334 | return ret; | ||
2335 | |||
2336 | - return copy_to_user((void __user *)arg, &info, minsz); | ||
2337 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; | ||
2338 | } | ||
2339 | case VFIO_DEVICE_GET_REGION_INFO: | ||
2340 | { | ||
2341 | @@ -524,7 +524,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, | ||
2342 | if (ret) | ||
2343 | return ret; | ||
2344 | |||
2345 | - return copy_to_user((void __user *)arg, &info, minsz); | ||
2346 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; | ||
2347 | } | ||
2348 | case VFIO_DEVICE_GET_IRQ_INFO: | ||
2349 | { | ||
2350 | @@ -545,7 +545,7 @@ static ssize_t vfio_ccw_mdev_ioctl(struct mdev_device *mdev, | ||
2351 | if (info.count == -1) | ||
2352 | return -EINVAL; | ||
2353 | |||
2354 | - return copy_to_user((void __user *)arg, &info, minsz); | ||
2355 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; | ||
2356 | } | ||
2357 | case VFIO_DEVICE_SET_IRQS: | ||
2358 | { | ||
2359 | diff --git a/drivers/s390/crypto/vfio_ap_ops.c b/drivers/s390/crypto/vfio_ap_ops.c | ||
2360 | index 790b0b2b36272..1ec01148018f1 100644 | ||
2361 | --- a/drivers/s390/crypto/vfio_ap_ops.c | ||
2362 | +++ b/drivers/s390/crypto/vfio_ap_ops.c | ||
2363 | @@ -1279,7 +1279,7 @@ static int vfio_ap_mdev_get_device_info(unsigned long arg) | ||
2364 | info.num_regions = 0; | ||
2365 | info.num_irqs = 0; | ||
2366 | |||
2367 | - return copy_to_user((void __user *)arg, &info, minsz); | ||
2368 | + return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0; | ||
2369 | } | ||
2370 | |||
2371 | static ssize_t vfio_ap_mdev_ioctl(struct mdev_device *mdev, | ||
2372 | diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c | ||
2373 | index a14057c67a12a..c5b7d18513b66 100644 | ||
2374 | --- a/drivers/scsi/libiscsi.c | ||
2375 | +++ b/drivers/scsi/libiscsi.c | ||
2376 | @@ -1532,14 +1532,9 @@ check_mgmt: | ||
2377 | } | ||
2378 | rc = iscsi_prep_scsi_cmd_pdu(conn->task); | ||
2379 | if (rc) { | ||
2380 | - if (rc == -ENOMEM || rc == -EACCES) { | ||
2381 | - spin_lock_bh(&conn->taskqueuelock); | ||
2382 | - list_add_tail(&conn->task->running, | ||
2383 | - &conn->cmdqueue); | ||
2384 | - conn->task = NULL; | ||
2385 | - spin_unlock_bh(&conn->taskqueuelock); | ||
2386 | - goto done; | ||
2387 | - } else | ||
2388 | + if (rc == -ENOMEM || rc == -EACCES) | ||
2389 | + fail_scsi_task(conn->task, DID_IMM_RETRY); | ||
2390 | + else | ||
2391 | fail_scsi_task(conn->task, DID_ABORT); | ||
2392 | spin_lock_bh(&conn->taskqueuelock); | ||
2393 | continue; | ||
2394 | diff --git a/drivers/spi/spi-stm32.c b/drivers/spi/spi-stm32.c | ||
2395 | index 8622cf9d3f640..9e7a6de3c43d1 100644 | ||
2396 | --- a/drivers/spi/spi-stm32.c | ||
2397 | +++ b/drivers/spi/spi-stm32.c | ||
2398 | @@ -924,8 +924,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) | ||
2399 | mask |= STM32H7_SPI_SR_RXP; | ||
2400 | |||
2401 | if (!(sr & mask)) { | ||
2402 | - dev_dbg(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", | ||
2403 | - sr, ier); | ||
2404 | + dev_warn(spi->dev, "spurious IT (sr=0x%08x, ier=0x%08x)\n", | ||
2405 | + sr, ier); | ||
2406 | spin_unlock_irqrestore(&spi->lock, flags); | ||
2407 | return IRQ_NONE; | ||
2408 | } | ||
2409 | @@ -952,15 +952,8 @@ static irqreturn_t stm32h7_spi_irq_thread(int irq, void *dev_id) | ||
2410 | } | ||
2411 | |||
2412 | if (sr & STM32H7_SPI_SR_OVR) { | ||
2413 | - dev_warn(spi->dev, "Overrun: received value discarded\n"); | ||
2414 | - if (!spi->cur_usedma && (spi->rx_buf && (spi->rx_len > 0))) | ||
2415 | - stm32h7_spi_read_rxfifo(spi, false); | ||
2416 | - /* | ||
2417 | - * If overrun is detected while using DMA, it means that | ||
2418 | - * something went wrong, so stop the current transfer | ||
2419 | - */ | ||
2420 | - if (spi->cur_usedma) | ||
2421 | - end = true; | ||
2422 | + dev_err(spi->dev, "Overrun: RX data lost\n"); | ||
2423 | + end = true; | ||
2424 | } | ||
2425 | |||
2426 | if (sr & STM32H7_SPI_SR_EOT) { | ||
2427 | diff --git a/drivers/staging/comedi/drivers/addi_apci_1032.c b/drivers/staging/comedi/drivers/addi_apci_1032.c | ||
2428 | index e035c9f757a1c..2176d3289eff5 100644 | ||
2429 | --- a/drivers/staging/comedi/drivers/addi_apci_1032.c | ||
2430 | +++ b/drivers/staging/comedi/drivers/addi_apci_1032.c | ||
2431 | @@ -260,6 +260,7 @@ static irqreturn_t apci1032_interrupt(int irq, void *d) | ||
2432 | struct apci1032_private *devpriv = dev->private; | ||
2433 | struct comedi_subdevice *s = dev->read_subdev; | ||
2434 | unsigned int ctrl; | ||
2435 | + unsigned short val; | ||
2436 | |||
2437 | /* check interrupt is from this device */ | ||
2438 | if ((inl(devpriv->amcc_iobase + AMCC_OP_REG_INTCSR) & | ||
2439 | @@ -275,7 +276,8 @@ static irqreturn_t apci1032_interrupt(int irq, void *d) | ||
2440 | outl(ctrl & ~APCI1032_CTRL_INT_ENA, dev->iobase + APCI1032_CTRL_REG); | ||
2441 | |||
2442 | s->state = inl(dev->iobase + APCI1032_STATUS_REG) & 0xffff; | ||
2443 | - comedi_buf_write_samples(s, &s->state, 1); | ||
2444 | + val = s->state; | ||
2445 | + comedi_buf_write_samples(s, &val, 1); | ||
2446 | comedi_handle_events(dev, s); | ||
2447 | |||
2448 | /* enable the interrupt */ | ||
2449 | diff --git a/drivers/staging/comedi/drivers/addi_apci_1500.c b/drivers/staging/comedi/drivers/addi_apci_1500.c | ||
2450 | index 816dd25b9d0e4..8c3eff7cf465c 100644 | ||
2451 | --- a/drivers/staging/comedi/drivers/addi_apci_1500.c | ||
2452 | +++ b/drivers/staging/comedi/drivers/addi_apci_1500.c | ||
2453 | @@ -208,7 +208,7 @@ static irqreturn_t apci1500_interrupt(int irq, void *d) | ||
2454 | struct comedi_device *dev = d; | ||
2455 | struct apci1500_private *devpriv = dev->private; | ||
2456 | struct comedi_subdevice *s = dev->read_subdev; | ||
2457 | - unsigned int status = 0; | ||
2458 | + unsigned short status = 0; | ||
2459 | unsigned int val; | ||
2460 | |||
2461 | val = inl(devpriv->amcc + AMCC_OP_REG_INTCSR); | ||
2462 | @@ -238,14 +238,14 @@ static irqreturn_t apci1500_interrupt(int irq, void *d) | ||
2463 | * | ||
2464 | * Mask Meaning | ||
2465 | * ---------- ------------------------------------------ | ||
2466 | - * 0x00000001 Event 1 has occurred | ||
2467 | - * 0x00000010 Event 2 has occurred | ||
2468 | - * 0x00000100 Counter/timer 1 has run down (not implemented) | ||
2469 | - * 0x00001000 Counter/timer 2 has run down (not implemented) | ||
2470 | - * 0x00010000 Counter 3 has run down (not implemented) | ||
2471 | - * 0x00100000 Watchdog has run down (not implemented) | ||
2472 | - * 0x01000000 Voltage error | ||
2473 | - * 0x10000000 Short-circuit error | ||
2474 | + * 0b00000001 Event 1 has occurred | ||
2475 | + * 0b00000010 Event 2 has occurred | ||
2476 | + * 0b00000100 Counter/timer 1 has run down (not implemented) | ||
2477 | + * 0b00001000 Counter/timer 2 has run down (not implemented) | ||
2478 | + * 0b00010000 Counter 3 has run down (not implemented) | ||
2479 | + * 0b00100000 Watchdog has run down (not implemented) | ||
2480 | + * 0b01000000 Voltage error | ||
2481 | + * 0b10000000 Short-circuit error | ||
2482 | */ | ||
2483 | comedi_buf_write_samples(s, &status, 1); | ||
2484 | comedi_handle_events(dev, s); | ||
2485 | diff --git a/drivers/staging/comedi/drivers/adv_pci1710.c b/drivers/staging/comedi/drivers/adv_pci1710.c | ||
2486 | index ddc0dc93d08b6..eca5fa8a9eb8e 100644 | ||
2487 | --- a/drivers/staging/comedi/drivers/adv_pci1710.c | ||
2488 | +++ b/drivers/staging/comedi/drivers/adv_pci1710.c | ||
2489 | @@ -300,11 +300,11 @@ static int pci1710_ai_eoc(struct comedi_device *dev, | ||
2490 | static int pci1710_ai_read_sample(struct comedi_device *dev, | ||
2491 | struct comedi_subdevice *s, | ||
2492 | unsigned int cur_chan, | ||
2493 | - unsigned int *val) | ||
2494 | + unsigned short *val) | ||
2495 | { | ||
2496 | const struct boardtype *board = dev->board_ptr; | ||
2497 | struct pci1710_private *devpriv = dev->private; | ||
2498 | - unsigned int sample; | ||
2499 | + unsigned short sample; | ||
2500 | unsigned int chan; | ||
2501 | |||
2502 | sample = inw(dev->iobase + PCI171X_AD_DATA_REG); | ||
2503 | @@ -345,7 +345,7 @@ static int pci1710_ai_insn_read(struct comedi_device *dev, | ||
2504 | pci1710_ai_setup_chanlist(dev, s, &insn->chanspec, 1, 1); | ||
2505 | |||
2506 | for (i = 0; i < insn->n; i++) { | ||
2507 | - unsigned int val; | ||
2508 | + unsigned short val; | ||
2509 | |||
2510 | /* start conversion */ | ||
2511 | outw(0, dev->iobase + PCI171X_SOFTTRG_REG); | ||
2512 | @@ -395,7 +395,7 @@ static void pci1710_handle_every_sample(struct comedi_device *dev, | ||
2513 | { | ||
2514 | struct comedi_cmd *cmd = &s->async->cmd; | ||
2515 | unsigned int status; | ||
2516 | - unsigned int val; | ||
2517 | + unsigned short val; | ||
2518 | int ret; | ||
2519 | |||
2520 | status = inw(dev->iobase + PCI171X_STATUS_REG); | ||
2521 | @@ -455,7 +455,7 @@ static void pci1710_handle_fifo(struct comedi_device *dev, | ||
2522 | } | ||
2523 | |||
2524 | for (i = 0; i < devpriv->max_samples; i++) { | ||
2525 | - unsigned int val; | ||
2526 | + unsigned short val; | ||
2527 | int ret; | ||
2528 | |||
2529 | ret = pci1710_ai_read_sample(dev, s, s->async->cur_chan, &val); | ||
2530 | diff --git a/drivers/staging/comedi/drivers/das6402.c b/drivers/staging/comedi/drivers/das6402.c | ||
2531 | index f99211ec46deb..0034005bdf8f1 100644 | ||
2532 | --- a/drivers/staging/comedi/drivers/das6402.c | ||
2533 | +++ b/drivers/staging/comedi/drivers/das6402.c | ||
2534 | @@ -186,7 +186,7 @@ static irqreturn_t das6402_interrupt(int irq, void *d) | ||
2535 | if (status & DAS6402_STATUS_FFULL) { | ||
2536 | async->events |= COMEDI_CB_OVERFLOW; | ||
2537 | } else if (status & DAS6402_STATUS_FFNE) { | ||
2538 | - unsigned int val; | ||
2539 | + unsigned short val; | ||
2540 | |||
2541 | val = das6402_ai_read_sample(dev, s); | ||
2542 | comedi_buf_write_samples(s, &val, 1); | ||
2543 | diff --git a/drivers/staging/comedi/drivers/das800.c b/drivers/staging/comedi/drivers/das800.c | ||
2544 | index 8cf09ef3012fa..4bd8fd5218c8f 100644 | ||
2545 | --- a/drivers/staging/comedi/drivers/das800.c | ||
2546 | +++ b/drivers/staging/comedi/drivers/das800.c | ||
2547 | @@ -427,7 +427,7 @@ static irqreturn_t das800_interrupt(int irq, void *d) | ||
2548 | struct comedi_cmd *cmd; | ||
2549 | unsigned long irq_flags; | ||
2550 | unsigned int status; | ||
2551 | - unsigned int val; | ||
2552 | + unsigned short val; | ||
2553 | bool fifo_empty; | ||
2554 | bool fifo_overflow; | ||
2555 | int i; | ||
2556 | diff --git a/drivers/staging/comedi/drivers/dmm32at.c b/drivers/staging/comedi/drivers/dmm32at.c | ||
2557 | index 75693cdde3138..c180d18ce517f 100644 | ||
2558 | --- a/drivers/staging/comedi/drivers/dmm32at.c | ||
2559 | +++ b/drivers/staging/comedi/drivers/dmm32at.c | ||
2560 | @@ -404,7 +404,7 @@ static irqreturn_t dmm32at_isr(int irq, void *d) | ||
2561 | { | ||
2562 | struct comedi_device *dev = d; | ||
2563 | unsigned char intstat; | ||
2564 | - unsigned int val; | ||
2565 | + unsigned short val; | ||
2566 | int i; | ||
2567 | |||
2568 | if (!dev->attached) { | ||
2569 | diff --git a/drivers/staging/comedi/drivers/me4000.c b/drivers/staging/comedi/drivers/me4000.c | ||
2570 | index ee53571a89698..ead8000b5929b 100644 | ||
2571 | --- a/drivers/staging/comedi/drivers/me4000.c | ||
2572 | +++ b/drivers/staging/comedi/drivers/me4000.c | ||
2573 | @@ -924,7 +924,7 @@ static irqreturn_t me4000_ai_isr(int irq, void *dev_id) | ||
2574 | struct comedi_subdevice *s = dev->read_subdev; | ||
2575 | int i; | ||
2576 | int c = 0; | ||
2577 | - unsigned int lval; | ||
2578 | + unsigned short lval; | ||
2579 | |||
2580 | if (!dev->attached) | ||
2581 | return IRQ_NONE; | ||
2582 | diff --git a/drivers/staging/comedi/drivers/pcl711.c b/drivers/staging/comedi/drivers/pcl711.c | ||
2583 | index a5937206bf1cd..e9abae4180625 100644 | ||
2584 | --- a/drivers/staging/comedi/drivers/pcl711.c | ||
2585 | +++ b/drivers/staging/comedi/drivers/pcl711.c | ||
2586 | @@ -184,7 +184,7 @@ static irqreturn_t pcl711_interrupt(int irq, void *d) | ||
2587 | struct comedi_device *dev = d; | ||
2588 | struct comedi_subdevice *s = dev->read_subdev; | ||
2589 | struct comedi_cmd *cmd = &s->async->cmd; | ||
2590 | - unsigned int data; | ||
2591 | + unsigned short data; | ||
2592 | |||
2593 | if (!dev->attached) { | ||
2594 | dev_err(dev->class_dev, "spurious interrupt\n"); | ||
2595 | diff --git a/drivers/staging/comedi/drivers/pcl818.c b/drivers/staging/comedi/drivers/pcl818.c | ||
2596 | index 0af5315d43575..fc8afffc1815f 100644 | ||
2597 | --- a/drivers/staging/comedi/drivers/pcl818.c | ||
2598 | +++ b/drivers/staging/comedi/drivers/pcl818.c | ||
2599 | @@ -423,7 +423,7 @@ static int pcl818_ai_eoc(struct comedi_device *dev, | ||
2600 | |||
2601 | static bool pcl818_ai_write_sample(struct comedi_device *dev, | ||
2602 | struct comedi_subdevice *s, | ||
2603 | - unsigned int chan, unsigned int val) | ||
2604 | + unsigned int chan, unsigned short val) | ||
2605 | { | ||
2606 | struct pcl818_private *devpriv = dev->private; | ||
2607 | struct comedi_cmd *cmd = &s->async->cmd; | ||
2608 | diff --git a/drivers/staging/ks7010/ks_wlan_net.c b/drivers/staging/ks7010/ks_wlan_net.c | ||
2609 | index 3cffc8be66563..e61bd8e1d246f 100644 | ||
2610 | --- a/drivers/staging/ks7010/ks_wlan_net.c | ||
2611 | +++ b/drivers/staging/ks7010/ks_wlan_net.c | ||
2612 | @@ -1120,6 +1120,7 @@ static int ks_wlan_set_scan(struct net_device *dev, | ||
2613 | { | ||
2614 | struct ks_wlan_private *priv = netdev_priv(dev); | ||
2615 | struct iw_scan_req *req = NULL; | ||
2616 | + int len; | ||
2617 | |||
2618 | if (priv->sleep_mode == SLP_SLEEP) | ||
2619 | return -EPERM; | ||
2620 | @@ -1129,8 +1130,9 @@ static int ks_wlan_set_scan(struct net_device *dev, | ||
2621 | if (wrqu->data.length == sizeof(struct iw_scan_req) && | ||
2622 | wrqu->data.flags & IW_SCAN_THIS_ESSID) { | ||
2623 | req = (struct iw_scan_req *)extra; | ||
2624 | - priv->scan_ssid_len = req->essid_len; | ||
2625 | - memcpy(priv->scan_ssid, req->essid, priv->scan_ssid_len); | ||
2626 | + len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); | ||
2627 | + priv->scan_ssid_len = len; | ||
2628 | + memcpy(priv->scan_ssid, req->essid, len); | ||
2629 | } else { | ||
2630 | priv->scan_ssid_len = 0; | ||
2631 | } | ||
2632 | diff --git a/drivers/staging/rtl8188eu/core/rtw_ap.c b/drivers/staging/rtl8188eu/core/rtw_ap.c | ||
2633 | index 51a5b71f8c256..1c0300ce63369 100644 | ||
2634 | --- a/drivers/staging/rtl8188eu/core/rtw_ap.c | ||
2635 | +++ b/drivers/staging/rtl8188eu/core/rtw_ap.c | ||
2636 | @@ -784,6 +784,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) | ||
2637 | /* SSID */ | ||
2638 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SSID_IE_, &ie_len, (pbss_network->ie_length - _BEACON_IE_OFFSET_)); | ||
2639 | if (p && ie_len > 0) { | ||
2640 | + ie_len = min_t(int, ie_len, sizeof(pbss_network->ssid.ssid)); | ||
2641 | memset(&pbss_network->ssid, 0, sizeof(struct ndis_802_11_ssid)); | ||
2642 | memcpy(pbss_network->ssid.ssid, (p + 2), ie_len); | ||
2643 | pbss_network->ssid.ssid_length = ie_len; | ||
2644 | @@ -802,6 +803,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) | ||
2645 | /* get supported rates */ | ||
2646 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _SUPPORTEDRATES_IE_, &ie_len, (pbss_network->ie_length - _BEACON_IE_OFFSET_)); | ||
2647 | if (p) { | ||
2648 | + ie_len = min_t(int, ie_len, NDIS_802_11_LENGTH_RATES_EX); | ||
2649 | memcpy(supportRate, p + 2, ie_len); | ||
2650 | supportRateNum = ie_len; | ||
2651 | } | ||
2652 | @@ -809,6 +811,8 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) | ||
2653 | /* get ext_supported rates */ | ||
2654 | p = rtw_get_ie(ie + _BEACON_IE_OFFSET_, _EXT_SUPPORTEDRATES_IE_, &ie_len, pbss_network->ie_length - _BEACON_IE_OFFSET_); | ||
2655 | if (p) { | ||
2656 | + ie_len = min_t(int, ie_len, | ||
2657 | + NDIS_802_11_LENGTH_RATES_EX - supportRateNum); | ||
2658 | memcpy(supportRate + supportRateNum, p + 2, ie_len); | ||
2659 | supportRateNum += ie_len; | ||
2660 | } | ||
2661 | @@ -922,6 +926,7 @@ int rtw_check_beacon_data(struct adapter *padapter, u8 *pbuf, int len) | ||
2662 | |||
2663 | pht_cap->mcs.rx_mask[0] = 0xff; | ||
2664 | pht_cap->mcs.rx_mask[1] = 0x0; | ||
2665 | + ie_len = min_t(int, ie_len, sizeof(pmlmepriv->htpriv.ht_cap)); | ||
2666 | memcpy(&pmlmepriv->htpriv.ht_cap, p + 2, ie_len); | ||
2667 | } | ||
2668 | |||
2669 | diff --git a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | ||
2670 | index 630e7d933b104..7b83f0920f3c8 100644 | ||
2671 | --- a/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | ||
2672 | +++ b/drivers/staging/rtl8188eu/os_dep/ioctl_linux.c | ||
2673 | @@ -1160,9 +1160,11 @@ static int rtw_wx_set_scan(struct net_device *dev, struct iw_request_info *a, | ||
2674 | break; | ||
2675 | } | ||
2676 | sec_len = *(pos++); len -= 1; | ||
2677 | - if (sec_len > 0 && sec_len <= len) { | ||
2678 | + if (sec_len > 0 && | ||
2679 | + sec_len <= len && | ||
2680 | + sec_len <= 32) { | ||
2681 | ssid[ssid_index].ssid_length = sec_len; | ||
2682 | - memcpy(ssid[ssid_index].ssid, pos, ssid[ssid_index].ssid_length); | ||
2683 | + memcpy(ssid[ssid_index].ssid, pos, sec_len); | ||
2684 | ssid_index++; | ||
2685 | } | ||
2686 | pos += sec_len; | ||
2687 | diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c | ||
2688 | index 16bcee13f64b5..407effde5e71a 100644 | ||
2689 | --- a/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c | ||
2690 | +++ b/drivers/staging/rtl8192e/rtl8192e/rtl_wx.c | ||
2691 | @@ -406,9 +406,10 @@ static int _rtl92e_wx_set_scan(struct net_device *dev, | ||
2692 | struct iw_scan_req *req = (struct iw_scan_req *)b; | ||
2693 | |||
2694 | if (req->essid_len) { | ||
2695 | - ieee->current_network.ssid_len = req->essid_len; | ||
2696 | - memcpy(ieee->current_network.ssid, req->essid, | ||
2697 | - req->essid_len); | ||
2698 | + int len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); | ||
2699 | + | ||
2700 | + ieee->current_network.ssid_len = len; | ||
2701 | + memcpy(ieee->current_network.ssid, req->essid, len); | ||
2702 | } | ||
2703 | } | ||
2704 | |||
2705 | diff --git a/drivers/staging/rtl8192u/r8192U_wx.c b/drivers/staging/rtl8192u/r8192U_wx.c | ||
2706 | index 5822bb7984b91..8f10672ade37e 100644 | ||
2707 | --- a/drivers/staging/rtl8192u/r8192U_wx.c | ||
2708 | +++ b/drivers/staging/rtl8192u/r8192U_wx.c | ||
2709 | @@ -333,8 +333,10 @@ static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a, | ||
2710 | struct iw_scan_req *req = (struct iw_scan_req *)b; | ||
2711 | |||
2712 | if (req->essid_len) { | ||
2713 | - ieee->current_network.ssid_len = req->essid_len; | ||
2714 | - memcpy(ieee->current_network.ssid, req->essid, req->essid_len); | ||
2715 | + int len = min_t(int, req->essid_len, IW_ESSID_MAX_SIZE); | ||
2716 | + | ||
2717 | + ieee->current_network.ssid_len = len; | ||
2718 | + memcpy(ieee->current_network.ssid, req->essid, len); | ||
2719 | } | ||
2720 | } | ||
2721 | |||
2722 | diff --git a/drivers/staging/rtl8712/rtl871x_cmd.c b/drivers/staging/rtl8712/rtl871x_cmd.c | ||
2723 | index 26b618008fcfe..d989229de88bd 100644 | ||
2724 | --- a/drivers/staging/rtl8712/rtl871x_cmd.c | ||
2725 | +++ b/drivers/staging/rtl8712/rtl871x_cmd.c | ||
2726 | @@ -197,8 +197,10 @@ u8 r8712_sitesurvey_cmd(struct _adapter *padapter, | ||
2727 | psurveyPara->ss_ssidlen = 0; | ||
2728 | memset(psurveyPara->ss_ssid, 0, IW_ESSID_MAX_SIZE + 1); | ||
2729 | if ((pssid != NULL) && (pssid->SsidLength)) { | ||
2730 | - memcpy(psurveyPara->ss_ssid, pssid->Ssid, pssid->SsidLength); | ||
2731 | - psurveyPara->ss_ssidlen = cpu_to_le32(pssid->SsidLength); | ||
2732 | + int len = min_t(int, pssid->SsidLength, IW_ESSID_MAX_SIZE); | ||
2733 | + | ||
2734 | + memcpy(psurveyPara->ss_ssid, pssid->Ssid, len); | ||
2735 | + psurveyPara->ss_ssidlen = cpu_to_le32(len); | ||
2736 | } | ||
2737 | set_fwstate(pmlmepriv, _FW_UNDER_SURVEY); | ||
2738 | r8712_enqueue_cmd(pcmdpriv, ph2c); | ||
2739 | diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
2740 | index 944336e0d2e2f..cff918d8bcb54 100644 | ||
2741 | --- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
2742 | +++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c | ||
2743 | @@ -928,7 +928,7 @@ static int r871x_wx_set_priv(struct net_device *dev, | ||
2744 | struct iw_point *dwrq = (struct iw_point *)awrq; | ||
2745 | |||
2746 | len = dwrq->length; | ||
2747 | - ext = memdup_user(dwrq->pointer, len); | ||
2748 | + ext = strndup_user(dwrq->pointer, len); | ||
2749 | if (IS_ERR(ext)) | ||
2750 | return PTR_ERR(ext); | ||
2751 | |||
2752 | diff --git a/drivers/target/target_core_pr.c b/drivers/target/target_core_pr.c | ||
2753 | index 5e931690e6979..51e690ab4d295 100644 | ||
2754 | --- a/drivers/target/target_core_pr.c | ||
2755 | +++ b/drivers/target/target_core_pr.c | ||
2756 | @@ -3731,6 +3731,7 @@ core_scsi3_pri_read_keys(struct se_cmd *cmd) | ||
2757 | spin_unlock(&dev->t10_pr.registration_lock); | ||
2758 | |||
2759 | put_unaligned_be32(add_len, &buf[4]); | ||
2760 | + target_set_cmd_data_length(cmd, 8 + add_len); | ||
2761 | |||
2762 | transport_kunmap_data_sg(cmd); | ||
2763 | |||
2764 | @@ -3749,7 +3750,7 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) | ||
2765 | struct t10_pr_registration *pr_reg; | ||
2766 | unsigned char *buf; | ||
2767 | u64 pr_res_key; | ||
2768 | - u32 add_len = 16; /* Hardcoded to 16 when a reservation is held. */ | ||
2769 | + u32 add_len = 0; | ||
2770 | |||
2771 | if (cmd->data_length < 8) { | ||
2772 | pr_err("PRIN SA READ_RESERVATIONS SCSI Data Length: %u" | ||
2773 | @@ -3767,8 +3768,9 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) | ||
2774 | pr_reg = dev->dev_pr_res_holder; | ||
2775 | if (pr_reg) { | ||
2776 | /* | ||
2777 | - * Set the hardcoded Additional Length | ||
2778 | + * Set the Additional Length to 16 when a reservation is held | ||
2779 | */ | ||
2780 | + add_len = 16; | ||
2781 | put_unaligned_be32(add_len, &buf[4]); | ||
2782 | |||
2783 | if (cmd->data_length < 22) | ||
2784 | @@ -3804,6 +3806,8 @@ core_scsi3_pri_read_reservation(struct se_cmd *cmd) | ||
2785 | (pr_reg->pr_res_type & 0x0f); | ||
2786 | } | ||
2787 | |||
2788 | + target_set_cmd_data_length(cmd, 8 + add_len); | ||
2789 | + | ||
2790 | err: | ||
2791 | spin_unlock(&dev->dev_reservation_lock); | ||
2792 | transport_kunmap_data_sg(cmd); | ||
2793 | @@ -3822,7 +3826,7 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) | ||
2794 | struct se_device *dev = cmd->se_dev; | ||
2795 | struct t10_reservation *pr_tmpl = &dev->t10_pr; | ||
2796 | unsigned char *buf; | ||
2797 | - u16 add_len = 8; /* Hardcoded to 8. */ | ||
2798 | + u16 len = 8; /* Hardcoded to 8. */ | ||
2799 | |||
2800 | if (cmd->data_length < 6) { | ||
2801 | pr_err("PRIN SA REPORT_CAPABILITIES SCSI Data Length:" | ||
2802 | @@ -3834,7 +3838,7 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) | ||
2803 | if (!buf) | ||
2804 | return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; | ||
2805 | |||
2806 | - put_unaligned_be16(add_len, &buf[0]); | ||
2807 | + put_unaligned_be16(len, &buf[0]); | ||
2808 | buf[2] |= 0x10; /* CRH: Compatible Reservation Hanlding bit. */ | ||
2809 | buf[2] |= 0x08; /* SIP_C: Specify Initiator Ports Capable bit */ | ||
2810 | buf[2] |= 0x04; /* ATP_C: All Target Ports Capable bit */ | ||
2811 | @@ -3863,6 +3867,8 @@ core_scsi3_pri_report_capabilities(struct se_cmd *cmd) | ||
2812 | buf[4] |= 0x02; /* PR_TYPE_WRITE_EXCLUSIVE */ | ||
2813 | buf[5] |= 0x01; /* PR_TYPE_EXCLUSIVE_ACCESS_ALLREG */ | ||
2814 | |||
2815 | + target_set_cmd_data_length(cmd, len); | ||
2816 | + | ||
2817 | transport_kunmap_data_sg(cmd); | ||
2818 | |||
2819 | return 0; | ||
2820 | @@ -4023,6 +4029,7 @@ core_scsi3_pri_read_full_status(struct se_cmd *cmd) | ||
2821 | * Set ADDITIONAL_LENGTH | ||
2822 | */ | ||
2823 | put_unaligned_be32(add_len, &buf[4]); | ||
2824 | + target_set_cmd_data_length(cmd, 8 + add_len); | ||
2825 | |||
2826 | transport_kunmap_data_sg(cmd); | ||
2827 | |||
2828 | diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c | ||
2829 | index b1f4be055f838..a16835c0bb1dd 100644 | ||
2830 | --- a/drivers/target/target_core_transport.c | ||
2831 | +++ b/drivers/target/target_core_transport.c | ||
2832 | @@ -873,11 +873,9 @@ void target_complete_cmd(struct se_cmd *cmd, u8 scsi_status) | ||
2833 | } | ||
2834 | EXPORT_SYMBOL(target_complete_cmd); | ||
2835 | |||
2836 | -void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) | ||
2837 | +void target_set_cmd_data_length(struct se_cmd *cmd, int length) | ||
2838 | { | ||
2839 | - if ((scsi_status == SAM_STAT_GOOD || | ||
2840 | - cmd->se_cmd_flags & SCF_TREAT_READ_AS_NORMAL) && | ||
2841 | - length < cmd->data_length) { | ||
2842 | + if (length < cmd->data_length) { | ||
2843 | if (cmd->se_cmd_flags & SCF_UNDERFLOW_BIT) { | ||
2844 | cmd->residual_count += cmd->data_length - length; | ||
2845 | } else { | ||
2846 | @@ -887,6 +885,15 @@ void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int len | ||
2847 | |||
2848 | cmd->data_length = length; | ||
2849 | } | ||
2850 | +} | ||
2851 | +EXPORT_SYMBOL(target_set_cmd_data_length); | ||
2852 | + | ||
2853 | +void target_complete_cmd_with_length(struct se_cmd *cmd, u8 scsi_status, int length) | ||
2854 | +{ | ||
2855 | + if (scsi_status == SAM_STAT_GOOD || | ||
2856 | + cmd->se_cmd_flags & SCF_TREAT_READ_AS_NORMAL) { | ||
2857 | + target_set_cmd_data_length(cmd, length); | ||
2858 | + } | ||
2859 | |||
2860 | target_complete_cmd(cmd, scsi_status); | ||
2861 | } | ||
2862 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c | ||
2863 | index 681374a3b3684..00bfc81f24702 100644 | ||
2864 | --- a/drivers/usb/class/cdc-acm.c | ||
2865 | +++ b/drivers/usb/class/cdc-acm.c | ||
2866 | @@ -1941,6 +1941,11 @@ static const struct usb_device_id acm_ids[] = { | ||
2867 | .driver_info = SEND_ZERO_PACKET, | ||
2868 | }, | ||
2869 | |||
2870 | + /* Exclude Goodix Fingerprint Reader */ | ||
2871 | + { USB_DEVICE(0x27c6, 0x5395), | ||
2872 | + .driver_info = IGNORE_DEVICE, | ||
2873 | + }, | ||
2874 | + | ||
2875 | /* control interfaces without any protocol set */ | ||
2876 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, | ||
2877 | USB_CDC_PROTO_NONE) }, | ||
2878 | diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c | ||
2879 | index c9f6e97582885..f27b4aecff3d4 100644 | ||
2880 | --- a/drivers/usb/class/usblp.c | ||
2881 | +++ b/drivers/usb/class/usblp.c | ||
2882 | @@ -494,16 +494,24 @@ static int usblp_release(struct inode *inode, struct file *file) | ||
2883 | /* No kernel lock - fine */ | ||
2884 | static __poll_t usblp_poll(struct file *file, struct poll_table_struct *wait) | ||
2885 | { | ||
2886 | - __poll_t ret; | ||
2887 | + struct usblp *usblp = file->private_data; | ||
2888 | + __poll_t ret = 0; | ||
2889 | unsigned long flags; | ||
2890 | |||
2891 | - struct usblp *usblp = file->private_data; | ||
2892 | /* Should we check file->f_mode & FMODE_WRITE before poll_wait()? */ | ||
2893 | poll_wait(file, &usblp->rwait, wait); | ||
2894 | poll_wait(file, &usblp->wwait, wait); | ||
2895 | + | ||
2896 | + mutex_lock(&usblp->mut); | ||
2897 | + if (!usblp->present) | ||
2898 | + ret |= EPOLLHUP; | ||
2899 | + mutex_unlock(&usblp->mut); | ||
2900 | + | ||
2901 | spin_lock_irqsave(&usblp->lock, flags); | ||
2902 | - ret = ((usblp->bidir && usblp->rcomplete) ? EPOLLIN | EPOLLRDNORM : 0) | | ||
2903 | - ((usblp->no_paper || usblp->wcomplete) ? EPOLLOUT | EPOLLWRNORM : 0); | ||
2904 | + if (usblp->bidir && usblp->rcomplete) | ||
2905 | + ret |= EPOLLIN | EPOLLRDNORM; | ||
2906 | + if (usblp->no_paper || usblp->wcomplete) | ||
2907 | + ret |= EPOLLOUT | EPOLLWRNORM; | ||
2908 | spin_unlock_irqrestore(&usblp->lock, flags); | ||
2909 | return ret; | ||
2910 | } | ||
2911 | diff --git a/drivers/usb/dwc3/dwc3-qcom.c b/drivers/usb/dwc3/dwc3-qcom.c | ||
2912 | index 261af9e38dddf..7874b97e33227 100644 | ||
2913 | --- a/drivers/usb/dwc3/dwc3-qcom.c | ||
2914 | +++ b/drivers/usb/dwc3/dwc3-qcom.c | ||
2915 | @@ -251,8 +251,10 @@ static int dwc3_qcom_suspend(struct dwc3_qcom *qcom) | ||
2916 | for (i = qcom->num_clocks - 1; i >= 0; i--) | ||
2917 | clk_disable_unprepare(qcom->clks[i]); | ||
2918 | |||
2919 | + if (device_may_wakeup(qcom->dev)) | ||
2920 | + dwc3_qcom_enable_interrupts(qcom); | ||
2921 | + | ||
2922 | qcom->is_suspended = true; | ||
2923 | - dwc3_qcom_enable_interrupts(qcom); | ||
2924 | |||
2925 | return 0; | ||
2926 | } | ||
2927 | @@ -265,7 +267,8 @@ static int dwc3_qcom_resume(struct dwc3_qcom *qcom) | ||
2928 | if (!qcom->is_suspended) | ||
2929 | return 0; | ||
2930 | |||
2931 | - dwc3_qcom_disable_interrupts(qcom); | ||
2932 | + if (device_may_wakeup(qcom->dev)) | ||
2933 | + dwc3_qcom_disable_interrupts(qcom); | ||
2934 | |||
2935 | for (i = 0; i < qcom->num_clocks; i++) { | ||
2936 | ret = clk_prepare_enable(qcom->clks[i]); | ||
2937 | @@ -528,16 +531,19 @@ static int dwc3_qcom_of_register_core(struct platform_device *pdev) | ||
2938 | ret = of_platform_populate(np, NULL, NULL, dev); | ||
2939 | if (ret) { | ||
2940 | dev_err(dev, "failed to register dwc3 core - %d\n", ret); | ||
2941 | - return ret; | ||
2942 | + goto node_put; | ||
2943 | } | ||
2944 | |||
2945 | qcom->dwc3 = of_find_device_by_node(dwc3_np); | ||
2946 | if (!qcom->dwc3) { | ||
2947 | + ret = -ENODEV; | ||
2948 | dev_err(dev, "failed to get dwc3 platform device\n"); | ||
2949 | - return -ENODEV; | ||
2950 | } | ||
2951 | |||
2952 | - return 0; | ||
2953 | +node_put: | ||
2954 | + of_node_put(dwc3_np); | ||
2955 | + | ||
2956 | + return ret; | ||
2957 | } | ||
2958 | |||
2959 | static const struct dwc3_acpi_pdata sdm845_acpi_pdata = { | ||
2960 | diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c | ||
2961 | index 00d346965f7a5..560382e0a8f38 100644 | ||
2962 | --- a/drivers/usb/gadget/function/f_uac1.c | ||
2963 | +++ b/drivers/usb/gadget/function/f_uac1.c | ||
2964 | @@ -499,6 +499,7 @@ static void f_audio_disable(struct usb_function *f) | ||
2965 | uac1->as_out_alt = 0; | ||
2966 | uac1->as_in_alt = 0; | ||
2967 | |||
2968 | + u_audio_stop_playback(&uac1->g_audio); | ||
2969 | u_audio_stop_capture(&uac1->g_audio); | ||
2970 | } | ||
2971 | |||
2972 | diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c | ||
2973 | index 5d960b6603b6f..6f03e944e0e31 100644 | ||
2974 | --- a/drivers/usb/gadget/function/f_uac2.c | ||
2975 | +++ b/drivers/usb/gadget/function/f_uac2.c | ||
2976 | @@ -478,7 +478,7 @@ static int set_ep_max_packet_size(const struct f_uac2_opts *uac2_opts, | ||
2977 | } | ||
2978 | |||
2979 | max_size_bw = num_channels(chmask) * ssize * | ||
2980 | - DIV_ROUND_UP(srate, factor / (1 << (ep_desc->bInterval - 1))); | ||
2981 | + ((srate / (factor / (1 << (ep_desc->bInterval - 1)))) + 1); | ||
2982 | ep_desc->wMaxPacketSize = cpu_to_le16(min_t(u16, max_size_bw, | ||
2983 | max_size_ep)); | ||
2984 | |||
2985 | diff --git a/drivers/usb/gadget/function/u_ether_configfs.h b/drivers/usb/gadget/function/u_ether_configfs.h | ||
2986 | index d8b92485b727e..5b1d4771d44f4 100644 | ||
2987 | --- a/drivers/usb/gadget/function/u_ether_configfs.h | ||
2988 | +++ b/drivers/usb/gadget/function/u_ether_configfs.h | ||
2989 | @@ -169,12 +169,11 @@ out: \ | ||
2990 | size_t len) \ | ||
2991 | { \ | ||
2992 | struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \ | ||
2993 | - int ret; \ | ||
2994 | + int ret = -EINVAL; \ | ||
2995 | u8 val; \ | ||
2996 | \ | ||
2997 | mutex_lock(&opts->lock); \ | ||
2998 | - ret = sscanf(page, "%02hhx", &val); \ | ||
2999 | - if (ret > 0) { \ | ||
3000 | + if (sscanf(page, "%02hhx", &val) > 0) { \ | ||
3001 | opts->_n_ = val; \ | ||
3002 | ret = len; \ | ||
3003 | } \ | ||
3004 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
3005 | index d08b0079eecb1..71ef473df585f 100644 | ||
3006 | --- a/drivers/usb/host/xhci-pci.c | ||
3007 | +++ b/drivers/usb/host/xhci-pci.c | ||
3008 | @@ -62,6 +62,7 @@ | ||
3009 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 | ||
3010 | #define PCI_DEVICE_ID_ASMEDIA_1142_XHCI 0x1242 | ||
3011 | #define PCI_DEVICE_ID_ASMEDIA_2142_XHCI 0x2142 | ||
3012 | +#define PCI_DEVICE_ID_ASMEDIA_3242_XHCI 0x3242 | ||
3013 | |||
3014 | static const char hcd_name[] = "xhci_hcd"; | ||
3015 | |||
3016 | @@ -258,11 +259,14 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
3017 | pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) | ||
3018 | xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
3019 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && | ||
3020 | - pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) | ||
3021 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) { | ||
3022 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | ||
3023 | + xhci->quirks |= XHCI_NO_64BIT_SUPPORT; | ||
3024 | + } | ||
3025 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && | ||
3026 | (pdev->device == PCI_DEVICE_ID_ASMEDIA_1142_XHCI || | ||
3027 | - pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI)) | ||
3028 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_2142_XHCI || | ||
3029 | + pdev->device == PCI_DEVICE_ID_ASMEDIA_3242_XHCI)) | ||
3030 | xhci->quirks |= XHCI_NO_64BIT_SUPPORT; | ||
3031 | |||
3032 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && | ||
3033 | @@ -277,6 +281,11 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
3034 | pdev->device == 0x9026) | ||
3035 | xhci->quirks |= XHCI_RESET_PLL_ON_DISCONNECT; | ||
3036 | |||
3037 | + if (pdev->vendor == PCI_VENDOR_ID_AMD && | ||
3038 | + (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2 || | ||
3039 | + pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4)) | ||
3040 | + xhci->quirks |= XHCI_NO_SOFT_RETRY; | ||
3041 | + | ||
3042 | if (xhci->quirks & XHCI_RESET_ON_RESUME) | ||
3043 | xhci_dbg_trace(xhci, trace_xhci_dbg_quirks, | ||
3044 | "QUIRK: Resetting on resume"); | ||
3045 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
3046 | index 900ea91fb3c6b..f6b5010deb735 100644 | ||
3047 | --- a/drivers/usb/host/xhci-ring.c | ||
3048 | +++ b/drivers/usb/host/xhci-ring.c | ||
3049 | @@ -2299,7 +2299,8 @@ static int process_bulk_intr_td(struct xhci_hcd *xhci, struct xhci_td *td, | ||
3050 | remaining = 0; | ||
3051 | break; | ||
3052 | case COMP_USB_TRANSACTION_ERROR: | ||
3053 | - if ((ep_ring->err_count++ > MAX_SOFT_RETRY) || | ||
3054 | + if (xhci->quirks & XHCI_NO_SOFT_RETRY || | ||
3055 | + (ep_ring->err_count++ > MAX_SOFT_RETRY) || | ||
3056 | le32_to_cpu(slot_ctx->tt_info) & TT_SLOT) | ||
3057 | break; | ||
3058 | *status = 0; | ||
3059 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
3060 | index 91330517444e7..b5080bc1689e4 100644 | ||
3061 | --- a/drivers/usb/host/xhci.c | ||
3062 | +++ b/drivers/usb/host/xhci.c | ||
3063 | @@ -883,44 +883,42 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci) | ||
3064 | xhci_set_cmd_ring_deq(xhci); | ||
3065 | } | ||
3066 | |||
3067 | -static void xhci_disable_port_wake_on_bits(struct xhci_hcd *xhci) | ||
3068 | +/* | ||
3069 | + * Disable port wake bits if do_wakeup is not set. | ||
3070 | + * | ||
3071 | + * Also clear a possible internal port wake state left hanging for ports that | ||
3072 | + * detected termination but never successfully enumerated (trained to 0U). | ||
3073 | + * Internal wake causes immediate xHCI wake after suspend. PORT_CSC write done | ||
3074 | + * at enumeration clears this wake, force one here as well for unconnected ports | ||
3075 | + */ | ||
3076 | + | ||
3077 | +static void xhci_disable_hub_port_wake(struct xhci_hcd *xhci, | ||
3078 | + struct xhci_hub *rhub, | ||
3079 | + bool do_wakeup) | ||
3080 | { | ||
3081 | - struct xhci_port **ports; | ||
3082 | - int port_index; | ||
3083 | unsigned long flags; | ||
3084 | u32 t1, t2, portsc; | ||
3085 | + int i; | ||
3086 | |||
3087 | spin_lock_irqsave(&xhci->lock, flags); | ||
3088 | |||
3089 | - /* disable usb3 ports Wake bits */ | ||
3090 | - port_index = xhci->usb3_rhub.num_ports; | ||
3091 | - ports = xhci->usb3_rhub.ports; | ||
3092 | - while (port_index--) { | ||
3093 | - t1 = readl(ports[port_index]->addr); | ||
3094 | - portsc = t1; | ||
3095 | - t1 = xhci_port_state_to_neutral(t1); | ||
3096 | - t2 = t1 & ~PORT_WAKE_BITS; | ||
3097 | - if (t1 != t2) { | ||
3098 | - writel(t2, ports[port_index]->addr); | ||
3099 | - xhci_dbg(xhci, "disable wake bits port %d-%d, portsc: 0x%x, write: 0x%x\n", | ||
3100 | - xhci->usb3_rhub.hcd->self.busnum, | ||
3101 | - port_index + 1, portsc, t2); | ||
3102 | - } | ||
3103 | - } | ||
3104 | + for (i = 0; i < rhub->num_ports; i++) { | ||
3105 | + portsc = readl(rhub->ports[i]->addr); | ||
3106 | + t1 = xhci_port_state_to_neutral(portsc); | ||
3107 | + t2 = t1; | ||
3108 | + | ||
3109 | + /* clear wake bits if do_wake is not set */ | ||
3110 | + if (!do_wakeup) | ||
3111 | + t2 &= ~PORT_WAKE_BITS; | ||
3112 | + | ||
3113 | + /* Don't touch csc bit if connected or connect change is set */ | ||
3114 | + if (!(portsc & (PORT_CSC | PORT_CONNECT))) | ||
3115 | + t2 |= PORT_CSC; | ||
3116 | |||
3117 | - /* disable usb2 ports Wake bits */ | ||
3118 | - port_index = xhci->usb2_rhub.num_ports; | ||
3119 | - ports = xhci->usb2_rhub.ports; | ||
3120 | - while (port_index--) { | ||
3121 | - t1 = readl(ports[port_index]->addr); | ||
3122 | - portsc = t1; | ||
3123 | - t1 = xhci_port_state_to_neutral(t1); | ||
3124 | - t2 = t1 & ~PORT_WAKE_BITS; | ||
3125 | if (t1 != t2) { | ||
3126 | - writel(t2, ports[port_index]->addr); | ||
3127 | - xhci_dbg(xhci, "disable wake bits port %d-%d, portsc: 0x%x, write: 0x%x\n", | ||
3128 | - xhci->usb2_rhub.hcd->self.busnum, | ||
3129 | - port_index + 1, portsc, t2); | ||
3130 | + writel(t2, rhub->ports[i]->addr); | ||
3131 | + xhci_dbg(xhci, "config port %d-%d wake bits, portsc: 0x%x, write: 0x%x\n", | ||
3132 | + rhub->hcd->self.busnum, i + 1, portsc, t2); | ||
3133 | } | ||
3134 | } | ||
3135 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
3136 | @@ -983,8 +981,8 @@ int xhci_suspend(struct xhci_hcd *xhci, bool do_wakeup) | ||
3137 | return -EINVAL; | ||
3138 | |||
3139 | /* Clear root port wake on bits if wakeup not allowed. */ | ||
3140 | - if (!do_wakeup) | ||
3141 | - xhci_disable_port_wake_on_bits(xhci); | ||
3142 | + xhci_disable_hub_port_wake(xhci, &xhci->usb3_rhub, do_wakeup); | ||
3143 | + xhci_disable_hub_port_wake(xhci, &xhci->usb2_rhub, do_wakeup); | ||
3144 | |||
3145 | if (!HCD_HW_ACCESSIBLE(hcd)) | ||
3146 | return 0; | ||
3147 | @@ -1088,6 +1086,7 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
3148 | struct usb_hcd *secondary_hcd; | ||
3149 | int retval = 0; | ||
3150 | bool comp_timer_running = false; | ||
3151 | + bool pending_portevent = false; | ||
3152 | |||
3153 | if (!hcd->state) | ||
3154 | return 0; | ||
3155 | @@ -1226,13 +1225,22 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | ||
3156 | |||
3157 | done: | ||
3158 | if (retval == 0) { | ||
3159 | - /* Resume root hubs only when have pending events. */ | ||
3160 | - if (xhci_pending_portevent(xhci)) { | ||
3161 | + /* | ||
3162 | + * Resume roothubs only if there are pending events. | ||
3163 | + * USB 3 devices resend U3 LFPS wake after a 100ms delay if | ||
3164 | + * the first wake signalling failed, give it that chance. | ||
3165 | + */ | ||
3166 | + pending_portevent = xhci_pending_portevent(xhci); | ||
3167 | + if (!pending_portevent) { | ||
3168 | + msleep(120); | ||
3169 | + pending_portevent = xhci_pending_portevent(xhci); | ||
3170 | + } | ||
3171 | + | ||
3172 | + if (pending_portevent) { | ||
3173 | usb_hcd_resume_root_hub(xhci->shared_hcd); | ||
3174 | usb_hcd_resume_root_hub(hcd); | ||
3175 | } | ||
3176 | } | ||
3177 | - | ||
3178 | /* | ||
3179 | * If system is subject to the Quirk, Compliance Mode Timer needs to | ||
3180 | * be re-initialized Always after a system resume. Ports are subject | ||
3181 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
3182 | index 1ad1d6e9e9979..8798ed0317864 100644 | ||
3183 | --- a/drivers/usb/host/xhci.h | ||
3184 | +++ b/drivers/usb/host/xhci.h | ||
3185 | @@ -1875,6 +1875,7 @@ struct xhci_hcd { | ||
3186 | #define XHCI_SNPS_BROKEN_SUSPEND BIT_ULL(35) | ||
3187 | #define XHCI_SKIP_PHY_INIT BIT_ULL(37) | ||
3188 | #define XHCI_DISABLE_SPARSE BIT_ULL(38) | ||
3189 | +#define XHCI_NO_SOFT_RETRY BIT_ULL(40) | ||
3190 | |||
3191 | unsigned int num_active_eps; | ||
3192 | unsigned int limit_active_eps; | ||
3193 | diff --git a/drivers/usb/renesas_usbhs/pipe.c b/drivers/usb/renesas_usbhs/pipe.c | ||
3194 | index 9e5afdde1adbf..40576e7176d8b 100644 | ||
3195 | --- a/drivers/usb/renesas_usbhs/pipe.c | ||
3196 | +++ b/drivers/usb/renesas_usbhs/pipe.c | ||
3197 | @@ -746,6 +746,8 @@ struct usbhs_pipe *usbhs_pipe_malloc(struct usbhs_priv *priv, | ||
3198 | |||
3199 | void usbhs_pipe_free(struct usbhs_pipe *pipe) | ||
3200 | { | ||
3201 | + usbhsp_pipe_select(pipe); | ||
3202 | + usbhsp_pipe_cfg_set(pipe, 0xFFFF, 0); | ||
3203 | usbhsp_put_pipe(pipe); | ||
3204 | } | ||
3205 | |||
3206 | diff --git a/drivers/usb/serial/ch341.c b/drivers/usb/serial/ch341.c | ||
3207 | index fdaefbe924908..a82ba9cc0c724 100644 | ||
3208 | --- a/drivers/usb/serial/ch341.c | ||
3209 | +++ b/drivers/usb/serial/ch341.c | ||
3210 | @@ -85,6 +85,7 @@ static const struct usb_device_id id_table[] = { | ||
3211 | { USB_DEVICE(0x1a86, 0x7522) }, | ||
3212 | { USB_DEVICE(0x1a86, 0x7523) }, | ||
3213 | { USB_DEVICE(0x4348, 0x5523) }, | ||
3214 | + { USB_DEVICE(0x9986, 0x7523) }, | ||
3215 | { }, | ||
3216 | }; | ||
3217 | MODULE_DEVICE_TABLE(usb, id_table); | ||
3218 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
3219 | index 361a2e3ccad8d..caf27a0d51f03 100644 | ||
3220 | --- a/drivers/usb/serial/cp210x.c | ||
3221 | +++ b/drivers/usb/serial/cp210x.c | ||
3222 | @@ -146,6 +146,7 @@ static const struct usb_device_id id_table[] = { | ||
3223 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | ||
3224 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | ||
3225 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | ||
3226 | + { USB_DEVICE(0x10C4, 0x88D8) }, /* Acuity Brands nLight Air Adapter */ | ||
3227 | { USB_DEVICE(0x10C4, 0x88FB) }, /* CESINEL MEDCAL STII Network Analyzer */ | ||
3228 | { USB_DEVICE(0x10C4, 0x8938) }, /* CESINEL MEDCAL S II Network Analyzer */ | ||
3229 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | ||
3230 | @@ -202,6 +203,8 @@ static const struct usb_device_id id_table[] = { | ||
3231 | { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */ | ||
3232 | { USB_DEVICE(0x1901, 0x0195) }, /* GE B850/B650/B450 CP2104 DP UART interface */ | ||
3233 | { USB_DEVICE(0x1901, 0x0196) }, /* GE B850 CP2105 DP UART interface */ | ||
3234 | + { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */ | ||
3235 | + { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface */ | ||
3236 | { USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */ | ||
3237 | { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */ | ||
3238 | { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */ | ||
3239 | diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c | ||
3240 | index 4cca0b836f430..3b4d1ff9033dd 100644 | ||
3241 | --- a/drivers/usb/serial/io_edgeport.c | ||
3242 | +++ b/drivers/usb/serial/io_edgeport.c | ||
3243 | @@ -3003,26 +3003,32 @@ static int edge_startup(struct usb_serial *serial) | ||
3244 | response = -ENODEV; | ||
3245 | } | ||
3246 | |||
3247 | - usb_free_urb(edge_serial->interrupt_read_urb); | ||
3248 | - kfree(edge_serial->interrupt_in_buffer); | ||
3249 | - | ||
3250 | - usb_free_urb(edge_serial->read_urb); | ||
3251 | - kfree(edge_serial->bulk_in_buffer); | ||
3252 | - | ||
3253 | - kfree(edge_serial); | ||
3254 | - | ||
3255 | - return response; | ||
3256 | + goto error; | ||
3257 | } | ||
3258 | |||
3259 | /* start interrupt read for this edgeport this interrupt will | ||
3260 | * continue as long as the edgeport is connected */ | ||
3261 | response = usb_submit_urb(edge_serial->interrupt_read_urb, | ||
3262 | GFP_KERNEL); | ||
3263 | - if (response) | ||
3264 | + if (response) { | ||
3265 | dev_err(ddev, "%s - Error %d submitting control urb\n", | ||
3266 | __func__, response); | ||
3267 | + | ||
3268 | + goto error; | ||
3269 | + } | ||
3270 | } | ||
3271 | return response; | ||
3272 | + | ||
3273 | +error: | ||
3274 | + usb_free_urb(edge_serial->interrupt_read_urb); | ||
3275 | + kfree(edge_serial->interrupt_in_buffer); | ||
3276 | + | ||
3277 | + usb_free_urb(edge_serial->read_urb); | ||
3278 | + kfree(edge_serial->bulk_in_buffer); | ||
3279 | + | ||
3280 | + kfree(edge_serial); | ||
3281 | + | ||
3282 | + return response; | ||
3283 | } | ||
3284 | |||
3285 | |||
3286 | diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c | ||
3287 | index 2305d425e6c9a..8f1de1fbbeedf 100644 | ||
3288 | --- a/drivers/usb/usbip/stub_dev.c | ||
3289 | +++ b/drivers/usb/usbip/stub_dev.c | ||
3290 | @@ -46,6 +46,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3291 | int sockfd = 0; | ||
3292 | struct socket *socket; | ||
3293 | int rv; | ||
3294 | + struct task_struct *tcp_rx = NULL; | ||
3295 | + struct task_struct *tcp_tx = NULL; | ||
3296 | |||
3297 | if (!sdev) { | ||
3298 | dev_err(dev, "sdev is null\n"); | ||
3299 | @@ -69,23 +71,47 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3300 | } | ||
3301 | |||
3302 | socket = sockfd_lookup(sockfd, &err); | ||
3303 | - if (!socket) | ||
3304 | + if (!socket) { | ||
3305 | + dev_err(dev, "failed to lookup sock"); | ||
3306 | goto err; | ||
3307 | + } | ||
3308 | |||
3309 | - sdev->ud.tcp_socket = socket; | ||
3310 | - sdev->ud.sockfd = sockfd; | ||
3311 | + if (socket->type != SOCK_STREAM) { | ||
3312 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", | ||
3313 | + socket->type); | ||
3314 | + goto sock_err; | ||
3315 | + } | ||
3316 | |||
3317 | + /* unlock and create threads and get tasks */ | ||
3318 | spin_unlock_irq(&sdev->ud.lock); | ||
3319 | + tcp_rx = kthread_create(stub_rx_loop, &sdev->ud, "stub_rx"); | ||
3320 | + if (IS_ERR(tcp_rx)) { | ||
3321 | + sockfd_put(socket); | ||
3322 | + return -EINVAL; | ||
3323 | + } | ||
3324 | + tcp_tx = kthread_create(stub_tx_loop, &sdev->ud, "stub_tx"); | ||
3325 | + if (IS_ERR(tcp_tx)) { | ||
3326 | + kthread_stop(tcp_rx); | ||
3327 | + sockfd_put(socket); | ||
3328 | + return -EINVAL; | ||
3329 | + } | ||
3330 | |||
3331 | - sdev->ud.tcp_rx = kthread_get_run(stub_rx_loop, &sdev->ud, | ||
3332 | - "stub_rx"); | ||
3333 | - sdev->ud.tcp_tx = kthread_get_run(stub_tx_loop, &sdev->ud, | ||
3334 | - "stub_tx"); | ||
3335 | + /* get task structs now */ | ||
3336 | + get_task_struct(tcp_rx); | ||
3337 | + get_task_struct(tcp_tx); | ||
3338 | |||
3339 | + /* lock and update sdev->ud state */ | ||
3340 | spin_lock_irq(&sdev->ud.lock); | ||
3341 | + sdev->ud.tcp_socket = socket; | ||
3342 | + sdev->ud.sockfd = sockfd; | ||
3343 | + sdev->ud.tcp_rx = tcp_rx; | ||
3344 | + sdev->ud.tcp_tx = tcp_tx; | ||
3345 | sdev->ud.status = SDEV_ST_USED; | ||
3346 | spin_unlock_irq(&sdev->ud.lock); | ||
3347 | |||
3348 | + wake_up_process(sdev->ud.tcp_rx); | ||
3349 | + wake_up_process(sdev->ud.tcp_tx); | ||
3350 | + | ||
3351 | } else { | ||
3352 | dev_info(dev, "stub down\n"); | ||
3353 | |||
3354 | @@ -100,6 +126,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3355 | |||
3356 | return count; | ||
3357 | |||
3358 | +sock_err: | ||
3359 | + sockfd_put(socket); | ||
3360 | err: | ||
3361 | spin_unlock_irq(&sdev->ud.lock); | ||
3362 | return -EINVAL; | ||
3363 | diff --git a/drivers/usb/usbip/vhci_sysfs.c b/drivers/usb/usbip/vhci_sysfs.c | ||
3364 | index be37aec250c2b..e64ea314930be 100644 | ||
3365 | --- a/drivers/usb/usbip/vhci_sysfs.c | ||
3366 | +++ b/drivers/usb/usbip/vhci_sysfs.c | ||
3367 | @@ -312,6 +312,8 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, | ||
3368 | struct vhci *vhci; | ||
3369 | int err; | ||
3370 | unsigned long flags; | ||
3371 | + struct task_struct *tcp_rx = NULL; | ||
3372 | + struct task_struct *tcp_tx = NULL; | ||
3373 | |||
3374 | /* | ||
3375 | * @rhport: port number of vhci_hcd | ||
3376 | @@ -349,12 +351,35 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, | ||
3377 | |||
3378 | /* Extract socket from fd. */ | ||
3379 | socket = sockfd_lookup(sockfd, &err); | ||
3380 | - if (!socket) | ||
3381 | + if (!socket) { | ||
3382 | + dev_err(dev, "failed to lookup sock"); | ||
3383 | return -EINVAL; | ||
3384 | + } | ||
3385 | + if (socket->type != SOCK_STREAM) { | ||
3386 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", | ||
3387 | + socket->type); | ||
3388 | + sockfd_put(socket); | ||
3389 | + return -EINVAL; | ||
3390 | + } | ||
3391 | + | ||
3392 | + /* create threads before locking */ | ||
3393 | + tcp_rx = kthread_create(vhci_rx_loop, &vdev->ud, "vhci_rx"); | ||
3394 | + if (IS_ERR(tcp_rx)) { | ||
3395 | + sockfd_put(socket); | ||
3396 | + return -EINVAL; | ||
3397 | + } | ||
3398 | + tcp_tx = kthread_create(vhci_tx_loop, &vdev->ud, "vhci_tx"); | ||
3399 | + if (IS_ERR(tcp_tx)) { | ||
3400 | + kthread_stop(tcp_rx); | ||
3401 | + sockfd_put(socket); | ||
3402 | + return -EINVAL; | ||
3403 | + } | ||
3404 | |||
3405 | - /* now need lock until setting vdev status as used */ | ||
3406 | + /* get task structs now */ | ||
3407 | + get_task_struct(tcp_rx); | ||
3408 | + get_task_struct(tcp_tx); | ||
3409 | |||
3410 | - /* begin a lock */ | ||
3411 | + /* now begin lock until setting vdev status set */ | ||
3412 | spin_lock_irqsave(&vhci->lock, flags); | ||
3413 | spin_lock(&vdev->ud.lock); | ||
3414 | |||
3415 | @@ -364,6 +389,8 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, | ||
3416 | spin_unlock_irqrestore(&vhci->lock, flags); | ||
3417 | |||
3418 | sockfd_put(socket); | ||
3419 | + kthread_stop_put(tcp_rx); | ||
3420 | + kthread_stop_put(tcp_tx); | ||
3421 | |||
3422 | dev_err(dev, "port %d already used\n", rhport); | ||
3423 | /* | ||
3424 | @@ -382,14 +409,16 @@ static ssize_t attach_store(struct device *dev, struct device_attribute *attr, | ||
3425 | vdev->speed = speed; | ||
3426 | vdev->ud.sockfd = sockfd; | ||
3427 | vdev->ud.tcp_socket = socket; | ||
3428 | + vdev->ud.tcp_rx = tcp_rx; | ||
3429 | + vdev->ud.tcp_tx = tcp_tx; | ||
3430 | vdev->ud.status = VDEV_ST_NOTASSIGNED; | ||
3431 | |||
3432 | spin_unlock(&vdev->ud.lock); | ||
3433 | spin_unlock_irqrestore(&vhci->lock, flags); | ||
3434 | /* end the lock */ | ||
3435 | |||
3436 | - vdev->ud.tcp_rx = kthread_get_run(vhci_rx_loop, &vdev->ud, "vhci_rx"); | ||
3437 | - vdev->ud.tcp_tx = kthread_get_run(vhci_tx_loop, &vdev->ud, "vhci_tx"); | ||
3438 | + wake_up_process(vdev->ud.tcp_rx); | ||
3439 | + wake_up_process(vdev->ud.tcp_tx); | ||
3440 | |||
3441 | rh_port_connect(vdev, speed); | ||
3442 | |||
3443 | diff --git a/drivers/usb/usbip/vudc_sysfs.c b/drivers/usb/usbip/vudc_sysfs.c | ||
3444 | index 100f680c572ae..a3ec39fc61778 100644 | ||
3445 | --- a/drivers/usb/usbip/vudc_sysfs.c | ||
3446 | +++ b/drivers/usb/usbip/vudc_sysfs.c | ||
3447 | @@ -90,8 +90,9 @@ unlock: | ||
3448 | } | ||
3449 | static BIN_ATTR_RO(dev_desc, sizeof(struct usb_device_descriptor)); | ||
3450 | |||
3451 | -static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *attr, | ||
3452 | - const char *in, size_t count) | ||
3453 | +static ssize_t usbip_sockfd_store(struct device *dev, | ||
3454 | + struct device_attribute *attr, | ||
3455 | + const char *in, size_t count) | ||
3456 | { | ||
3457 | struct vudc *udc = (struct vudc *) dev_get_drvdata(dev); | ||
3458 | int rv; | ||
3459 | @@ -100,6 +101,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3460 | struct socket *socket; | ||
3461 | unsigned long flags; | ||
3462 | int ret; | ||
3463 | + struct task_struct *tcp_rx = NULL; | ||
3464 | + struct task_struct *tcp_tx = NULL; | ||
3465 | |||
3466 | rv = kstrtoint(in, 0, &sockfd); | ||
3467 | if (rv != 0) | ||
3468 | @@ -138,24 +141,54 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3469 | goto unlock_ud; | ||
3470 | } | ||
3471 | |||
3472 | - udc->ud.tcp_socket = socket; | ||
3473 | + if (socket->type != SOCK_STREAM) { | ||
3474 | + dev_err(dev, "Expecting SOCK_STREAM - found %d", | ||
3475 | + socket->type); | ||
3476 | + ret = -EINVAL; | ||
3477 | + goto sock_err; | ||
3478 | + } | ||
3479 | |||
3480 | + /* unlock and create threads and get tasks */ | ||
3481 | spin_unlock_irq(&udc->ud.lock); | ||
3482 | spin_unlock_irqrestore(&udc->lock, flags); | ||
3483 | |||
3484 | - udc->ud.tcp_rx = kthread_get_run(&v_rx_loop, | ||
3485 | - &udc->ud, "vudc_rx"); | ||
3486 | - udc->ud.tcp_tx = kthread_get_run(&v_tx_loop, | ||
3487 | - &udc->ud, "vudc_tx"); | ||
3488 | + tcp_rx = kthread_create(&v_rx_loop, &udc->ud, "vudc_rx"); | ||
3489 | + if (IS_ERR(tcp_rx)) { | ||
3490 | + sockfd_put(socket); | ||
3491 | + return -EINVAL; | ||
3492 | + } | ||
3493 | + tcp_tx = kthread_create(&v_tx_loop, &udc->ud, "vudc_tx"); | ||
3494 | + if (IS_ERR(tcp_tx)) { | ||
3495 | + kthread_stop(tcp_rx); | ||
3496 | + sockfd_put(socket); | ||
3497 | + return -EINVAL; | ||
3498 | + } | ||
3499 | + | ||
3500 | + /* get task structs now */ | ||
3501 | + get_task_struct(tcp_rx); | ||
3502 | + get_task_struct(tcp_tx); | ||
3503 | |||
3504 | + /* lock and update udc->ud state */ | ||
3505 | spin_lock_irqsave(&udc->lock, flags); | ||
3506 | spin_lock_irq(&udc->ud.lock); | ||
3507 | + | ||
3508 | + udc->ud.tcp_socket = socket; | ||
3509 | + udc->ud.tcp_rx = tcp_rx; | ||
3510 | + udc->ud.tcp_rx = tcp_tx; | ||
3511 | udc->ud.status = SDEV_ST_USED; | ||
3512 | + | ||
3513 | spin_unlock_irq(&udc->ud.lock); | ||
3514 | |||
3515 | ktime_get_ts64(&udc->start_time); | ||
3516 | v_start_timer(udc); | ||
3517 | udc->connected = 1; | ||
3518 | + | ||
3519 | + spin_unlock_irqrestore(&udc->lock, flags); | ||
3520 | + | ||
3521 | + wake_up_process(udc->ud.tcp_rx); | ||
3522 | + wake_up_process(udc->ud.tcp_tx); | ||
3523 | + return count; | ||
3524 | + | ||
3525 | } else { | ||
3526 | if (!udc->connected) { | ||
3527 | dev_err(dev, "Device not connected"); | ||
3528 | @@ -177,6 +210,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a | ||
3529 | |||
3530 | return count; | ||
3531 | |||
3532 | +sock_err: | ||
3533 | + sockfd_put(socket); | ||
3534 | unlock_ud: | ||
3535 | spin_unlock_irq(&udc->ud.lock); | ||
3536 | unlock: | ||
3537 | diff --git a/drivers/xen/events/events_2l.c b/drivers/xen/events/events_2l.c | ||
3538 | index f026624898e7a..77cc80bcb479c 100644 | ||
3539 | --- a/drivers/xen/events/events_2l.c | ||
3540 | +++ b/drivers/xen/events/events_2l.c | ||
3541 | @@ -47,6 +47,11 @@ static unsigned evtchn_2l_max_channels(void) | ||
3542 | return EVTCHN_2L_NR_CHANNELS; | ||
3543 | } | ||
3544 | |||
3545 | +static void evtchn_2l_remove(evtchn_port_t evtchn, unsigned int cpu) | ||
3546 | +{ | ||
3547 | + clear_bit(evtchn, BM(per_cpu(cpu_evtchn_mask, cpu))); | ||
3548 | +} | ||
3549 | + | ||
3550 | static void evtchn_2l_bind_to_cpu(struct irq_info *info, unsigned cpu) | ||
3551 | { | ||
3552 | clear_bit(info->evtchn, BM(per_cpu(cpu_evtchn_mask, info->cpu))); | ||
3553 | @@ -71,12 +76,6 @@ static bool evtchn_2l_is_pending(unsigned port) | ||
3554 | return sync_test_bit(port, BM(&s->evtchn_pending[0])); | ||
3555 | } | ||
3556 | |||
3557 | -static bool evtchn_2l_test_and_set_mask(unsigned port) | ||
3558 | -{ | ||
3559 | - struct shared_info *s = HYPERVISOR_shared_info; | ||
3560 | - return sync_test_and_set_bit(port, BM(&s->evtchn_mask[0])); | ||
3561 | -} | ||
3562 | - | ||
3563 | static void evtchn_2l_mask(unsigned port) | ||
3564 | { | ||
3565 | struct shared_info *s = HYPERVISOR_shared_info; | ||
3566 | @@ -354,18 +353,27 @@ static void evtchn_2l_resume(void) | ||
3567 | EVTCHN_2L_NR_CHANNELS/BITS_PER_EVTCHN_WORD); | ||
3568 | } | ||
3569 | |||
3570 | +static int evtchn_2l_percpu_deinit(unsigned int cpu) | ||
3571 | +{ | ||
3572 | + memset(per_cpu(cpu_evtchn_mask, cpu), 0, sizeof(xen_ulong_t) * | ||
3573 | + EVTCHN_2L_NR_CHANNELS/BITS_PER_EVTCHN_WORD); | ||
3574 | + | ||
3575 | + return 0; | ||
3576 | +} | ||
3577 | + | ||
3578 | static const struct evtchn_ops evtchn_ops_2l = { | ||
3579 | .max_channels = evtchn_2l_max_channels, | ||
3580 | .nr_channels = evtchn_2l_max_channels, | ||
3581 | + .remove = evtchn_2l_remove, | ||
3582 | .bind_to_cpu = evtchn_2l_bind_to_cpu, | ||
3583 | .clear_pending = evtchn_2l_clear_pending, | ||
3584 | .set_pending = evtchn_2l_set_pending, | ||
3585 | .is_pending = evtchn_2l_is_pending, | ||
3586 | - .test_and_set_mask = evtchn_2l_test_and_set_mask, | ||
3587 | .mask = evtchn_2l_mask, | ||
3588 | .unmask = evtchn_2l_unmask, | ||
3589 | .handle_events = evtchn_2l_handle_events, | ||
3590 | .resume = evtchn_2l_resume, | ||
3591 | + .percpu_deinit = evtchn_2l_percpu_deinit, | ||
3592 | }; | ||
3593 | |||
3594 | void __init xen_evtchn_2l_init(void) | ||
3595 | diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c | ||
3596 | index 7b94a6c316643..e492f5fe5be62 100644 | ||
3597 | --- a/drivers/xen/events/events_base.c | ||
3598 | +++ b/drivers/xen/events/events_base.c | ||
3599 | @@ -99,6 +99,7 @@ static DEFINE_RWLOCK(evtchn_rwlock); | ||
3600 | * evtchn_rwlock | ||
3601 | * IRQ-desc lock | ||
3602 | * percpu eoi_list_lock | ||
3603 | + * irq_info->lock | ||
3604 | */ | ||
3605 | |||
3606 | static LIST_HEAD(xen_irq_list_head); | ||
3607 | @@ -220,6 +221,8 @@ static int xen_irq_info_common_setup(struct irq_info *info, | ||
3608 | info->irq = irq; | ||
3609 | info->evtchn = evtchn; | ||
3610 | info->cpu = cpu; | ||
3611 | + info->mask_reason = EVT_MASK_REASON_EXPLICIT; | ||
3612 | + spin_lock_init(&info->lock); | ||
3613 | |||
3614 | ret = set_evtchn_to_irq(evtchn, irq); | ||
3615 | if (ret < 0) | ||
3616 | @@ -286,6 +289,7 @@ static int xen_irq_info_pirq_setup(unsigned irq, | ||
3617 | static void xen_irq_info_cleanup(struct irq_info *info) | ||
3618 | { | ||
3619 | set_evtchn_to_irq(info->evtchn, -1); | ||
3620 | + xen_evtchn_port_remove(info->evtchn, info->cpu); | ||
3621 | info->evtchn = 0; | ||
3622 | } | ||
3623 | |||
3624 | @@ -366,6 +370,34 @@ unsigned int cpu_from_evtchn(unsigned int evtchn) | ||
3625 | return ret; | ||
3626 | } | ||
3627 | |||
3628 | +static void do_mask(struct irq_info *info, u8 reason) | ||
3629 | +{ | ||
3630 | + unsigned long flags; | ||
3631 | + | ||
3632 | + spin_lock_irqsave(&info->lock, flags); | ||
3633 | + | ||
3634 | + if (!info->mask_reason) | ||
3635 | + mask_evtchn(info->evtchn); | ||
3636 | + | ||
3637 | + info->mask_reason |= reason; | ||
3638 | + | ||
3639 | + spin_unlock_irqrestore(&info->lock, flags); | ||
3640 | +} | ||
3641 | + | ||
3642 | +static void do_unmask(struct irq_info *info, u8 reason) | ||
3643 | +{ | ||
3644 | + unsigned long flags; | ||
3645 | + | ||
3646 | + spin_lock_irqsave(&info->lock, flags); | ||
3647 | + | ||
3648 | + info->mask_reason &= ~reason; | ||
3649 | + | ||
3650 | + if (!info->mask_reason) | ||
3651 | + unmask_evtchn(info->evtchn); | ||
3652 | + | ||
3653 | + spin_unlock_irqrestore(&info->lock, flags); | ||
3654 | +} | ||
3655 | + | ||
3656 | #ifdef CONFIG_X86 | ||
3657 | static bool pirq_check_eoi_map(unsigned irq) | ||
3658 | { | ||
3659 | @@ -493,7 +525,7 @@ static void xen_irq_lateeoi_locked(struct irq_info *info, bool spurious) | ||
3660 | } | ||
3661 | |||
3662 | info->eoi_time = 0; | ||
3663 | - unmask_evtchn(evtchn); | ||
3664 | + do_unmask(info, EVT_MASK_REASON_EOI_PENDING); | ||
3665 | } | ||
3666 | |||
3667 | static void xen_irq_lateeoi_worker(struct work_struct *work) | ||
3668 | @@ -662,6 +694,12 @@ static void xen_evtchn_close(unsigned int port) | ||
3669 | BUG(); | ||
3670 | } | ||
3671 | |||
3672 | +static void event_handler_exit(struct irq_info *info) | ||
3673 | +{ | ||
3674 | + smp_store_release(&info->is_active, 0); | ||
3675 | + clear_evtchn(info->evtchn); | ||
3676 | +} | ||
3677 | + | ||
3678 | static void pirq_query_unmask(int irq) | ||
3679 | { | ||
3680 | struct physdev_irq_status_query irq_status; | ||
3681 | @@ -680,7 +718,8 @@ static void pirq_query_unmask(int irq) | ||
3682 | |||
3683 | static void eoi_pirq(struct irq_data *data) | ||
3684 | { | ||
3685 | - int evtchn = evtchn_from_irq(data->irq); | ||
3686 | + struct irq_info *info = info_for_irq(data->irq); | ||
3687 | + int evtchn = info ? info->evtchn : 0; | ||
3688 | struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; | ||
3689 | int rc = 0; | ||
3690 | |||
3691 | @@ -689,16 +728,15 @@ static void eoi_pirq(struct irq_data *data) | ||
3692 | |||
3693 | if (unlikely(irqd_is_setaffinity_pending(data)) && | ||
3694 | likely(!irqd_irq_disabled(data))) { | ||
3695 | - int masked = test_and_set_mask(evtchn); | ||
3696 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); | ||
3697 | |||
3698 | - clear_evtchn(evtchn); | ||
3699 | + event_handler_exit(info); | ||
3700 | |||
3701 | irq_move_masked_irq(data); | ||
3702 | |||
3703 | - if (!masked) | ||
3704 | - unmask_evtchn(evtchn); | ||
3705 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); | ||
3706 | } else | ||
3707 | - clear_evtchn(evtchn); | ||
3708 | + event_handler_exit(info); | ||
3709 | |||
3710 | if (pirq_needs_eoi(data->irq)) { | ||
3711 | rc = HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi); | ||
3712 | @@ -749,7 +787,8 @@ static unsigned int __startup_pirq(unsigned int irq) | ||
3713 | goto err; | ||
3714 | |||
3715 | out: | ||
3716 | - unmask_evtchn(evtchn); | ||
3717 | + do_unmask(info, EVT_MASK_REASON_EXPLICIT); | ||
3718 | + | ||
3719 | eoi_pirq(irq_get_irq_data(irq)); | ||
3720 | |||
3721 | return 0; | ||
3722 | @@ -776,7 +815,7 @@ static void shutdown_pirq(struct irq_data *data) | ||
3723 | if (!VALID_EVTCHN(evtchn)) | ||
3724 | return; | ||
3725 | |||
3726 | - mask_evtchn(evtchn); | ||
3727 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); | ||
3728 | xen_evtchn_close(evtchn); | ||
3729 | xen_irq_info_cleanup(info); | ||
3730 | } | ||
3731 | @@ -1533,6 +1572,8 @@ void handle_irq_for_port(evtchn_port_t port, struct evtchn_loop_ctrl *ctrl) | ||
3732 | } | ||
3733 | |||
3734 | info = info_for_irq(irq); | ||
3735 | + if (xchg_acquire(&info->is_active, 1)) | ||
3736 | + return; | ||
3737 | |||
3738 | if (ctrl->defer_eoi) { | ||
3739 | info->eoi_cpu = smp_processor_id(); | ||
3740 | @@ -1635,10 +1676,10 @@ void rebind_evtchn_irq(int evtchn, int irq) | ||
3741 | } | ||
3742 | |||
3743 | /* Rebind an evtchn so that it gets delivered to a specific cpu */ | ||
3744 | -static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) | ||
3745 | +static int xen_rebind_evtchn_to_cpu(struct irq_info *info, unsigned int tcpu) | ||
3746 | { | ||
3747 | struct evtchn_bind_vcpu bind_vcpu; | ||
3748 | - int masked; | ||
3749 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3750 | |||
3751 | if (!VALID_EVTCHN(evtchn)) | ||
3752 | return -1; | ||
3753 | @@ -1654,7 +1695,7 @@ static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) | ||
3754 | * Mask the event while changing the VCPU binding to prevent | ||
3755 | * it being delivered on an unexpected VCPU. | ||
3756 | */ | ||
3757 | - masked = test_and_set_mask(evtchn); | ||
3758 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); | ||
3759 | |||
3760 | /* | ||
3761 | * If this fails, it usually just indicates that we're dealing with a | ||
3762 | @@ -1664,8 +1705,7 @@ static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) | ||
3763 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu) >= 0) | ||
3764 | bind_evtchn_to_cpu(evtchn, tcpu); | ||
3765 | |||
3766 | - if (!masked) | ||
3767 | - unmask_evtchn(evtchn); | ||
3768 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); | ||
3769 | |||
3770 | return 0; | ||
3771 | } | ||
3772 | @@ -1674,7 +1714,7 @@ static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, | ||
3773 | bool force) | ||
3774 | { | ||
3775 | unsigned tcpu = cpumask_first_and(dest, cpu_online_mask); | ||
3776 | - int ret = xen_rebind_evtchn_to_cpu(evtchn_from_irq(data->irq), tcpu); | ||
3777 | + int ret = xen_rebind_evtchn_to_cpu(info_for_irq(data->irq), tcpu); | ||
3778 | |||
3779 | if (!ret) | ||
3780 | irq_data_update_effective_affinity(data, cpumask_of(tcpu)); | ||
3781 | @@ -1693,39 +1733,41 @@ EXPORT_SYMBOL_GPL(xen_set_affinity_evtchn); | ||
3782 | |||
3783 | static void enable_dynirq(struct irq_data *data) | ||
3784 | { | ||
3785 | - int evtchn = evtchn_from_irq(data->irq); | ||
3786 | + struct irq_info *info = info_for_irq(data->irq); | ||
3787 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3788 | |||
3789 | if (VALID_EVTCHN(evtchn)) | ||
3790 | - unmask_evtchn(evtchn); | ||
3791 | + do_unmask(info, EVT_MASK_REASON_EXPLICIT); | ||
3792 | } | ||
3793 | |||
3794 | static void disable_dynirq(struct irq_data *data) | ||
3795 | { | ||
3796 | - int evtchn = evtchn_from_irq(data->irq); | ||
3797 | + struct irq_info *info = info_for_irq(data->irq); | ||
3798 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3799 | |||
3800 | if (VALID_EVTCHN(evtchn)) | ||
3801 | - mask_evtchn(evtchn); | ||
3802 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); | ||
3803 | } | ||
3804 | |||
3805 | static void ack_dynirq(struct irq_data *data) | ||
3806 | { | ||
3807 | - int evtchn = evtchn_from_irq(data->irq); | ||
3808 | + struct irq_info *info = info_for_irq(data->irq); | ||
3809 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3810 | |||
3811 | if (!VALID_EVTCHN(evtchn)) | ||
3812 | return; | ||
3813 | |||
3814 | if (unlikely(irqd_is_setaffinity_pending(data)) && | ||
3815 | likely(!irqd_irq_disabled(data))) { | ||
3816 | - int masked = test_and_set_mask(evtchn); | ||
3817 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); | ||
3818 | |||
3819 | - clear_evtchn(evtchn); | ||
3820 | + event_handler_exit(info); | ||
3821 | |||
3822 | irq_move_masked_irq(data); | ||
3823 | |||
3824 | - if (!masked) | ||
3825 | - unmask_evtchn(evtchn); | ||
3826 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); | ||
3827 | } else | ||
3828 | - clear_evtchn(evtchn); | ||
3829 | + event_handler_exit(info); | ||
3830 | } | ||
3831 | |||
3832 | static void mask_ack_dynirq(struct irq_data *data) | ||
3833 | @@ -1734,18 +1776,39 @@ static void mask_ack_dynirq(struct irq_data *data) | ||
3834 | ack_dynirq(data); | ||
3835 | } | ||
3836 | |||
3837 | +static void lateeoi_ack_dynirq(struct irq_data *data) | ||
3838 | +{ | ||
3839 | + struct irq_info *info = info_for_irq(data->irq); | ||
3840 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3841 | + | ||
3842 | + if (VALID_EVTCHN(evtchn)) { | ||
3843 | + do_mask(info, EVT_MASK_REASON_EOI_PENDING); | ||
3844 | + event_handler_exit(info); | ||
3845 | + } | ||
3846 | +} | ||
3847 | + | ||
3848 | +static void lateeoi_mask_ack_dynirq(struct irq_data *data) | ||
3849 | +{ | ||
3850 | + struct irq_info *info = info_for_irq(data->irq); | ||
3851 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3852 | + | ||
3853 | + if (VALID_EVTCHN(evtchn)) { | ||
3854 | + do_mask(info, EVT_MASK_REASON_EXPLICIT); | ||
3855 | + event_handler_exit(info); | ||
3856 | + } | ||
3857 | +} | ||
3858 | + | ||
3859 | static int retrigger_dynirq(struct irq_data *data) | ||
3860 | { | ||
3861 | - unsigned int evtchn = evtchn_from_irq(data->irq); | ||
3862 | - int masked; | ||
3863 | + struct irq_info *info = info_for_irq(data->irq); | ||
3864 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3865 | |||
3866 | if (!VALID_EVTCHN(evtchn)) | ||
3867 | return 0; | ||
3868 | |||
3869 | - masked = test_and_set_mask(evtchn); | ||
3870 | + do_mask(info, EVT_MASK_REASON_TEMPORARY); | ||
3871 | set_evtchn(evtchn); | ||
3872 | - if (!masked) | ||
3873 | - unmask_evtchn(evtchn); | ||
3874 | + do_unmask(info, EVT_MASK_REASON_TEMPORARY); | ||
3875 | |||
3876 | return 1; | ||
3877 | } | ||
3878 | @@ -1840,10 +1903,11 @@ static void restore_cpu_ipis(unsigned int cpu) | ||
3879 | /* Clear an irq's pending state, in preparation for polling on it */ | ||
3880 | void xen_clear_irq_pending(int irq) | ||
3881 | { | ||
3882 | - int evtchn = evtchn_from_irq(irq); | ||
3883 | + struct irq_info *info = info_for_irq(irq); | ||
3884 | + evtchn_port_t evtchn = info ? info->evtchn : 0; | ||
3885 | |||
3886 | if (VALID_EVTCHN(evtchn)) | ||
3887 | - clear_evtchn(evtchn); | ||
3888 | + event_handler_exit(info); | ||
3889 | } | ||
3890 | EXPORT_SYMBOL(xen_clear_irq_pending); | ||
3891 | void xen_set_irq_pending(int irq) | ||
3892 | @@ -1951,8 +2015,8 @@ static struct irq_chip xen_lateeoi_chip __read_mostly = { | ||
3893 | .irq_mask = disable_dynirq, | ||
3894 | .irq_unmask = enable_dynirq, | ||
3895 | |||
3896 | - .irq_ack = mask_ack_dynirq, | ||
3897 | - .irq_mask_ack = mask_ack_dynirq, | ||
3898 | + .irq_ack = lateeoi_ack_dynirq, | ||
3899 | + .irq_mask_ack = lateeoi_mask_ack_dynirq, | ||
3900 | |||
3901 | .irq_set_affinity = set_affinity_irq, | ||
3902 | .irq_retrigger = retrigger_dynirq, | ||
3903 | diff --git a/drivers/xen/events/events_fifo.c b/drivers/xen/events/events_fifo.c | ||
3904 | index 33462521bfd0f..360a7f8cdf754 100644 | ||
3905 | --- a/drivers/xen/events/events_fifo.c | ||
3906 | +++ b/drivers/xen/events/events_fifo.c | ||
3907 | @@ -209,12 +209,6 @@ static bool evtchn_fifo_is_pending(unsigned port) | ||
3908 | return sync_test_bit(EVTCHN_FIFO_BIT(PENDING, word), BM(word)); | ||
3909 | } | ||
3910 | |||
3911 | -static bool evtchn_fifo_test_and_set_mask(unsigned port) | ||
3912 | -{ | ||
3913 | - event_word_t *word = event_word_from_port(port); | ||
3914 | - return sync_test_and_set_bit(EVTCHN_FIFO_BIT(MASKED, word), BM(word)); | ||
3915 | -} | ||
3916 | - | ||
3917 | static void evtchn_fifo_mask(unsigned port) | ||
3918 | { | ||
3919 | event_word_t *word = event_word_from_port(port); | ||
3920 | @@ -420,7 +414,6 @@ static const struct evtchn_ops evtchn_ops_fifo = { | ||
3921 | .clear_pending = evtchn_fifo_clear_pending, | ||
3922 | .set_pending = evtchn_fifo_set_pending, | ||
3923 | .is_pending = evtchn_fifo_is_pending, | ||
3924 | - .test_and_set_mask = evtchn_fifo_test_and_set_mask, | ||
3925 | .mask = evtchn_fifo_mask, | ||
3926 | .unmask = evtchn_fifo_unmask, | ||
3927 | .handle_events = evtchn_fifo_handle_events, | ||
3928 | diff --git a/drivers/xen/events/events_internal.h b/drivers/xen/events/events_internal.h | ||
3929 | index a35c8c7ac6066..d3a89b4646b8b 100644 | ||
3930 | --- a/drivers/xen/events/events_internal.h | ||
3931 | +++ b/drivers/xen/events/events_internal.h | ||
3932 | @@ -33,13 +33,19 @@ struct irq_info { | ||
3933 | struct list_head eoi_list; | ||
3934 | short refcnt; | ||
3935 | short spurious_cnt; | ||
3936 | - enum xen_irq_type type; /* type */ | ||
3937 | + short type; /* type */ | ||
3938 | + u8 mask_reason; /* Why is event channel masked */ | ||
3939 | +#define EVT_MASK_REASON_EXPLICIT 0x01 | ||
3940 | +#define EVT_MASK_REASON_TEMPORARY 0x02 | ||
3941 | +#define EVT_MASK_REASON_EOI_PENDING 0x04 | ||
3942 | + u8 is_active; /* Is event just being handled? */ | ||
3943 | unsigned irq; | ||
3944 | unsigned int evtchn; /* event channel */ | ||
3945 | unsigned short cpu; /* cpu bound */ | ||
3946 | unsigned short eoi_cpu; /* EOI must happen on this cpu */ | ||
3947 | unsigned int irq_epoch; /* If eoi_cpu valid: irq_epoch of event */ | ||
3948 | u64 eoi_time; /* Time in jiffies when to EOI. */ | ||
3949 | + spinlock_t lock; | ||
3950 | |||
3951 | union { | ||
3952 | unsigned short virq; | ||
3953 | @@ -65,12 +71,12 @@ struct evtchn_ops { | ||
3954 | unsigned (*nr_channels)(void); | ||
3955 | |||
3956 | int (*setup)(struct irq_info *info); | ||
3957 | + void (*remove)(evtchn_port_t port, unsigned int cpu); | ||
3958 | void (*bind_to_cpu)(struct irq_info *info, unsigned cpu); | ||
3959 | |||
3960 | void (*clear_pending)(unsigned port); | ||
3961 | void (*set_pending)(unsigned port); | ||
3962 | bool (*is_pending)(unsigned port); | ||
3963 | - bool (*test_and_set_mask)(unsigned port); | ||
3964 | void (*mask)(unsigned port); | ||
3965 | void (*unmask)(unsigned port); | ||
3966 | |||
3967 | @@ -107,6 +113,13 @@ static inline int xen_evtchn_port_setup(struct irq_info *info) | ||
3968 | return 0; | ||
3969 | } | ||
3970 | |||
3971 | +static inline void xen_evtchn_port_remove(evtchn_port_t evtchn, | ||
3972 | + unsigned int cpu) | ||
3973 | +{ | ||
3974 | + if (evtchn_ops->remove) | ||
3975 | + evtchn_ops->remove(evtchn, cpu); | ||
3976 | +} | ||
3977 | + | ||
3978 | static inline void xen_evtchn_port_bind_to_cpu(struct irq_info *info, | ||
3979 | unsigned cpu) | ||
3980 | { | ||
3981 | @@ -128,11 +141,6 @@ static inline bool test_evtchn(unsigned port) | ||
3982 | return evtchn_ops->is_pending(port); | ||
3983 | } | ||
3984 | |||
3985 | -static inline bool test_and_set_mask(unsigned port) | ||
3986 | -{ | ||
3987 | - return evtchn_ops->test_and_set_mask(port); | ||
3988 | -} | ||
3989 | - | ||
3990 | static inline void mask_evtchn(unsigned port) | ||
3991 | { | ||
3992 | return evtchn_ops->mask(port); | ||
3993 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c | ||
3994 | index cdb45829354d9..056a68292e152 100644 | ||
3995 | --- a/fs/binfmt_misc.c | ||
3996 | +++ b/fs/binfmt_misc.c | ||
3997 | @@ -696,12 +696,24 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, | ||
3998 | struct super_block *sb = file_inode(file)->i_sb; | ||
3999 | struct dentry *root = sb->s_root, *dentry; | ||
4000 | int err = 0; | ||
4001 | + struct file *f = NULL; | ||
4002 | |||
4003 | e = create_entry(buffer, count); | ||
4004 | |||
4005 | if (IS_ERR(e)) | ||
4006 | return PTR_ERR(e); | ||
4007 | |||
4008 | + if (e->flags & MISC_FMT_OPEN_FILE) { | ||
4009 | + f = open_exec(e->interpreter); | ||
4010 | + if (IS_ERR(f)) { | ||
4011 | + pr_notice("register: failed to install interpreter file %s\n", | ||
4012 | + e->interpreter); | ||
4013 | + kfree(e); | ||
4014 | + return PTR_ERR(f); | ||
4015 | + } | ||
4016 | + e->interp_file = f; | ||
4017 | + } | ||
4018 | + | ||
4019 | inode_lock(d_inode(root)); | ||
4020 | dentry = lookup_one_len(e->name, root, strlen(e->name)); | ||
4021 | err = PTR_ERR(dentry); | ||
4022 | @@ -725,21 +737,6 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer, | ||
4023 | goto out2; | ||
4024 | } | ||
4025 | |||
4026 | - if (e->flags & MISC_FMT_OPEN_FILE) { | ||
4027 | - struct file *f; | ||
4028 | - | ||
4029 | - f = open_exec(e->interpreter); | ||
4030 | - if (IS_ERR(f)) { | ||
4031 | - err = PTR_ERR(f); | ||
4032 | - pr_notice("register: failed to install interpreter file %s\n", e->interpreter); | ||
4033 | - simple_release_fs(&bm_mnt, &entry_count); | ||
4034 | - iput(inode); | ||
4035 | - inode = NULL; | ||
4036 | - goto out2; | ||
4037 | - } | ||
4038 | - e->interp_file = f; | ||
4039 | - } | ||
4040 | - | ||
4041 | e->dentry = dget(dentry); | ||
4042 | inode->i_private = e; | ||
4043 | inode->i_fop = &bm_entry_operations; | ||
4044 | @@ -756,6 +753,8 @@ out: | ||
4045 | inode_unlock(d_inode(root)); | ||
4046 | |||
4047 | if (err) { | ||
4048 | + if (f) | ||
4049 | + filp_close(f, NULL); | ||
4050 | kfree(e); | ||
4051 | return err; | ||
4052 | } | ||
4053 | diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c | ||
4054 | index 115f063497ffa..41b3c5fc958c7 100644 | ||
4055 | --- a/fs/cifs/cifsfs.c | ||
4056 | +++ b/fs/cifs/cifsfs.c | ||
4057 | @@ -278,7 +278,7 @@ cifs_statfs(struct dentry *dentry, struct kstatfs *buf) | ||
4058 | rc = server->ops->queryfs(xid, tcon, buf); | ||
4059 | |||
4060 | free_xid(xid); | ||
4061 | - return 0; | ||
4062 | + return rc; | ||
4063 | } | ||
4064 | |||
4065 | static long cifs_fallocate(struct file *file, int mode, loff_t off, loff_t len) | ||
4066 | diff --git a/fs/configfs/file.c b/fs/configfs/file.c | ||
4067 | index fb65b706cc0db..84b4d58fc65f7 100644 | ||
4068 | --- a/fs/configfs/file.c | ||
4069 | +++ b/fs/configfs/file.c | ||
4070 | @@ -378,7 +378,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type | ||
4071 | |||
4072 | attr = to_attr(dentry); | ||
4073 | if (!attr) | ||
4074 | - goto out_put_item; | ||
4075 | + goto out_free_buffer; | ||
4076 | |||
4077 | if (type & CONFIGFS_ITEM_BIN_ATTR) { | ||
4078 | buffer->bin_attr = to_bin_attr(dentry); | ||
4079 | @@ -391,7 +391,7 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type | ||
4080 | /* Grab the module reference for this attribute if we have one */ | ||
4081 | error = -ENODEV; | ||
4082 | if (!try_module_get(buffer->owner)) | ||
4083 | - goto out_put_item; | ||
4084 | + goto out_free_buffer; | ||
4085 | |||
4086 | error = -EACCES; | ||
4087 | if (!buffer->item->ci_type) | ||
4088 | @@ -435,8 +435,6 @@ static int __configfs_open_file(struct inode *inode, struct file *file, int type | ||
4089 | |||
4090 | out_put_module: | ||
4091 | module_put(buffer->owner); | ||
4092 | -out_put_item: | ||
4093 | - config_item_put(buffer->item); | ||
4094 | out_free_buffer: | ||
4095 | up_read(&frag->frag_sem); | ||
4096 | kfree(buffer); | ||
4097 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c | ||
4098 | index 188b17a3b19eb..e7c0790308fe0 100644 | ||
4099 | --- a/fs/nfs/dir.c | ||
4100 | +++ b/fs/nfs/dir.c | ||
4101 | @@ -1073,6 +1073,15 @@ out_force: | ||
4102 | goto out; | ||
4103 | } | ||
4104 | |||
4105 | +static void nfs_mark_dir_for_revalidate(struct inode *inode) | ||
4106 | +{ | ||
4107 | + struct nfs_inode *nfsi = NFS_I(inode); | ||
4108 | + | ||
4109 | + spin_lock(&inode->i_lock); | ||
4110 | + nfsi->cache_validity |= NFS_INO_REVAL_PAGECACHE; | ||
4111 | + spin_unlock(&inode->i_lock); | ||
4112 | +} | ||
4113 | + | ||
4114 | /* | ||
4115 | * We judge how long we want to trust negative | ||
4116 | * dentries by looking at the parent inode mtime. | ||
4117 | @@ -1107,19 +1116,14 @@ nfs_lookup_revalidate_done(struct inode *dir, struct dentry *dentry, | ||
4118 | __func__, dentry); | ||
4119 | return 1; | ||
4120 | case 0: | ||
4121 | - nfs_mark_for_revalidate(dir); | ||
4122 | - if (inode && S_ISDIR(inode->i_mode)) { | ||
4123 | - /* Purge readdir caches. */ | ||
4124 | - nfs_zap_caches(inode); | ||
4125 | - /* | ||
4126 | - * We can't d_drop the root of a disconnected tree: | ||
4127 | - * its d_hash is on the s_anon list and d_drop() would hide | ||
4128 | - * it from shrink_dcache_for_unmount(), leading to busy | ||
4129 | - * inodes on unmount and further oopses. | ||
4130 | - */ | ||
4131 | - if (IS_ROOT(dentry)) | ||
4132 | - return 1; | ||
4133 | - } | ||
4134 | + /* | ||
4135 | + * We can't d_drop the root of a disconnected tree: | ||
4136 | + * its d_hash is on the s_anon list and d_drop() would hide | ||
4137 | + * it from shrink_dcache_for_unmount(), leading to busy | ||
4138 | + * inodes on unmount and further oopses. | ||
4139 | + */ | ||
4140 | + if (inode && IS_ROOT(dentry)) | ||
4141 | + return 1; | ||
4142 | dfprintk(LOOKUPCACHE, "NFS: %s(%pd2) is invalid\n", | ||
4143 | __func__, dentry); | ||
4144 | return 0; | ||
4145 | @@ -1188,6 +1192,13 @@ out: | ||
4146 | nfs_free_fattr(fattr); | ||
4147 | nfs_free_fhandle(fhandle); | ||
4148 | nfs4_label_free(label); | ||
4149 | + | ||
4150 | + /* | ||
4151 | + * If the lookup failed despite the dentry change attribute being | ||
4152 | + * a match, then we should revalidate the directory cache. | ||
4153 | + */ | ||
4154 | + if (!ret && nfs_verify_change_attribute(dir, dentry->d_time)) | ||
4155 | + nfs_mark_dir_for_revalidate(dir); | ||
4156 | return nfs_lookup_revalidate_done(dir, dentry, inode, ret); | ||
4157 | } | ||
4158 | |||
4159 | @@ -1230,7 +1241,7 @@ nfs_do_lookup_revalidate(struct inode *dir, struct dentry *dentry, | ||
4160 | error = nfs_lookup_verify_inode(inode, flags); | ||
4161 | if (error) { | ||
4162 | if (error == -ESTALE) | ||
4163 | - nfs_zap_caches(dir); | ||
4164 | + nfs_mark_dir_for_revalidate(dir); | ||
4165 | goto out_bad; | ||
4166 | } | ||
4167 | nfs_advise_use_readdirplus(dir); | ||
4168 | @@ -1725,7 +1736,6 @@ out: | ||
4169 | dput(parent); | ||
4170 | return d; | ||
4171 | out_error: | ||
4172 | - nfs_mark_for_revalidate(dir); | ||
4173 | d = ERR_PTR(error); | ||
4174 | goto out; | ||
4175 | } | ||
4176 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c | ||
4177 | index 30e44b33040a4..b2119159dead2 100644 | ||
4178 | --- a/fs/nfs/nfs4proc.c | ||
4179 | +++ b/fs/nfs/nfs4proc.c | ||
4180 | @@ -5830,7 +5830,7 @@ static int _nfs4_get_security_label(struct inode *inode, void *buf, | ||
4181 | return ret; | ||
4182 | if (!(fattr.valid & NFS_ATTR_FATTR_V4_SECURITY_LABEL)) | ||
4183 | return -ENOENT; | ||
4184 | - return 0; | ||
4185 | + return label.len; | ||
4186 | } | ||
4187 | |||
4188 | static int nfs4_get_security_label(struct inode *inode, void *buf, | ||
4189 | diff --git a/fs/pnode.h b/fs/pnode.h | ||
4190 | index 26f74e092bd98..988f1aa9b02ae 100644 | ||
4191 | --- a/fs/pnode.h | ||
4192 | +++ b/fs/pnode.h | ||
4193 | @@ -12,7 +12,7 @@ | ||
4194 | |||
4195 | #define IS_MNT_SHARED(m) ((m)->mnt.mnt_flags & MNT_SHARED) | ||
4196 | #define IS_MNT_SLAVE(m) ((m)->mnt_master) | ||
4197 | -#define IS_MNT_NEW(m) (!(m)->mnt_ns) | ||
4198 | +#define IS_MNT_NEW(m) (!(m)->mnt_ns || is_anon_ns((m)->mnt_ns)) | ||
4199 | #define CLEAR_MNT_SHARED(m) ((m)->mnt.mnt_flags &= ~MNT_SHARED) | ||
4200 | #define IS_MNT_UNBINDABLE(m) ((m)->mnt.mnt_flags & MNT_UNBINDABLE) | ||
4201 | #define IS_MNT_MARKED(m) ((m)->mnt.mnt_flags & MNT_MARKED) | ||
4202 | diff --git a/fs/udf/inode.c b/fs/udf/inode.c | ||
4203 | index 97a192eb9949c..507f8f9103270 100644 | ||
4204 | --- a/fs/udf/inode.c | ||
4205 | +++ b/fs/udf/inode.c | ||
4206 | @@ -547,11 +547,14 @@ static int udf_do_extend_file(struct inode *inode, | ||
4207 | |||
4208 | udf_write_aext(inode, last_pos, &last_ext->extLocation, | ||
4209 | last_ext->extLength, 1); | ||
4210 | + | ||
4211 | /* | ||
4212 | - * We've rewritten the last extent but there may be empty | ||
4213 | - * indirect extent after it - enter it. | ||
4214 | + * We've rewritten the last extent. If we are going to add | ||
4215 | + * more extents, we may need to enter possible following | ||
4216 | + * empty indirect extent. | ||
4217 | */ | ||
4218 | - udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0); | ||
4219 | + if (new_block_bytes || prealloc_len) | ||
4220 | + udf_next_aext(inode, last_pos, &tmploc, &tmplen, 0); | ||
4221 | } | ||
4222 | |||
4223 | /* Managed to do everything necessary? */ | ||
4224 | diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h | ||
4225 | index 0783b0c6d9e2f..1ef071e5a55ef 100644 | ||
4226 | --- a/include/linux/can/skb.h | ||
4227 | +++ b/include/linux/can/skb.h | ||
4228 | @@ -49,8 +49,12 @@ static inline void can_skb_reserve(struct sk_buff *skb) | ||
4229 | |||
4230 | static inline void can_skb_set_owner(struct sk_buff *skb, struct sock *sk) | ||
4231 | { | ||
4232 | - if (sk) { | ||
4233 | - sock_hold(sk); | ||
4234 | + /* If the socket has already been closed by user space, the | ||
4235 | + * refcount may already be 0 (and the socket will be freed | ||
4236 | + * after the last TX skb has been freed). So only increase | ||
4237 | + * socket refcount if the refcount is > 0. | ||
4238 | + */ | ||
4239 | + if (sk && refcount_inc_not_zero(&sk->sk_refcnt)) { | ||
4240 | skb->destructor = sock_efree; | ||
4241 | skb->sk = sk; | ||
4242 | } | ||
4243 | diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h | ||
4244 | index a132d875d3518..3a1d899019af0 100644 | ||
4245 | --- a/include/linux/sched/mm.h | ||
4246 | +++ b/include/linux/sched/mm.h | ||
4247 | @@ -167,7 +167,8 @@ static inline bool in_vfork(struct task_struct *tsk) | ||
4248 | * another oom-unkillable task does this it should blame itself. | ||
4249 | */ | ||
4250 | rcu_read_lock(); | ||
4251 | - ret = tsk->vfork_done && tsk->real_parent->mm == tsk->mm; | ||
4252 | + ret = tsk->vfork_done && | ||
4253 | + rcu_dereference(tsk->real_parent)->mm == tsk->mm; | ||
4254 | rcu_read_unlock(); | ||
4255 | |||
4256 | return ret; | ||
4257 | diff --git a/include/linux/stop_machine.h b/include/linux/stop_machine.h | ||
4258 | index f9a0c6189852e..69998fc5ffe9d 100644 | ||
4259 | --- a/include/linux/stop_machine.h | ||
4260 | +++ b/include/linux/stop_machine.h | ||
4261 | @@ -139,7 +139,7 @@ int stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, | ||
4262 | const struct cpumask *cpus); | ||
4263 | #else /* CONFIG_SMP || CONFIG_HOTPLUG_CPU */ | ||
4264 | |||
4265 | -static inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, | ||
4266 | +static __always_inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, | ||
4267 | const struct cpumask *cpus) | ||
4268 | { | ||
4269 | unsigned long flags; | ||
4270 | @@ -150,14 +150,15 @@ static inline int stop_machine_cpuslocked(cpu_stop_fn_t fn, void *data, | ||
4271 | return ret; | ||
4272 | } | ||
4273 | |||
4274 | -static inline int stop_machine(cpu_stop_fn_t fn, void *data, | ||
4275 | - const struct cpumask *cpus) | ||
4276 | +static __always_inline int | ||
4277 | +stop_machine(cpu_stop_fn_t fn, void *data, const struct cpumask *cpus) | ||
4278 | { | ||
4279 | return stop_machine_cpuslocked(fn, data, cpus); | ||
4280 | } | ||
4281 | |||
4282 | -static inline int stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, | ||
4283 | - const struct cpumask *cpus) | ||
4284 | +static __always_inline int | ||
4285 | +stop_machine_from_inactive_cpu(cpu_stop_fn_t fn, void *data, | ||
4286 | + const struct cpumask *cpus) | ||
4287 | { | ||
4288 | return stop_machine(fn, data, cpus); | ||
4289 | } | ||
4290 | diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h | ||
4291 | index e8a924eeea3d0..6b5fcfa1e5553 100644 | ||
4292 | --- a/include/linux/virtio_net.h | ||
4293 | +++ b/include/linux/virtio_net.h | ||
4294 | @@ -79,8 +79,13 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb, | ||
4295 | if (gso_type && skb->network_header) { | ||
4296 | struct flow_keys_basic keys; | ||
4297 | |||
4298 | - if (!skb->protocol) | ||
4299 | + if (!skb->protocol) { | ||
4300 | + __be16 protocol = dev_parse_header_protocol(skb); | ||
4301 | + | ||
4302 | virtio_net_hdr_set_proto(skb, hdr); | ||
4303 | + if (protocol && protocol != skb->protocol) | ||
4304 | + return -EINVAL; | ||
4305 | + } | ||
4306 | retry: | ||
4307 | if (!skb_flow_dissect_flow_keys_basic(NULL, skb, &keys, | ||
4308 | NULL, 0, 0, 0, | ||
4309 | diff --git a/include/media/rc-map.h b/include/media/rc-map.h | ||
4310 | index c2ef3906e1cd1..a358c87a65de2 100644 | ||
4311 | --- a/include/media/rc-map.h | ||
4312 | +++ b/include/media/rc-map.h | ||
4313 | @@ -126,6 +126,13 @@ struct rc_map_list { | ||
4314 | struct rc_map map; | ||
4315 | }; | ||
4316 | |||
4317 | +#ifdef CONFIG_MEDIA_CEC_RC | ||
4318 | +/* | ||
4319 | + * rc_map_list from rc-cec.c | ||
4320 | + */ | ||
4321 | +extern struct rc_map_list cec_map; | ||
4322 | +#endif | ||
4323 | + | ||
4324 | /* Routines from rc-map.c */ | ||
4325 | |||
4326 | /** | ||
4327 | diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h | ||
4328 | index 51b6f50eabeeb..0deeff9b4496a 100644 | ||
4329 | --- a/include/target/target_core_backend.h | ||
4330 | +++ b/include/target/target_core_backend.h | ||
4331 | @@ -69,6 +69,7 @@ int transport_backend_register(const struct target_backend_ops *); | ||
4332 | void target_backend_unregister(const struct target_backend_ops *); | ||
4333 | |||
4334 | void target_complete_cmd(struct se_cmd *, u8); | ||
4335 | +void target_set_cmd_data_length(struct se_cmd *, int); | ||
4336 | void target_complete_cmd_with_length(struct se_cmd *, u8, int); | ||
4337 | |||
4338 | void transport_copy_sense_to_cmd(struct se_cmd *, unsigned char *); | ||
4339 | diff --git a/include/uapi/linux/netfilter/nfnetlink_cthelper.h b/include/uapi/linux/netfilter/nfnetlink_cthelper.h | ||
4340 | index a13137afc4299..70af02092d16e 100644 | ||
4341 | --- a/include/uapi/linux/netfilter/nfnetlink_cthelper.h | ||
4342 | +++ b/include/uapi/linux/netfilter/nfnetlink_cthelper.h | ||
4343 | @@ -5,7 +5,7 @@ | ||
4344 | #define NFCT_HELPER_STATUS_DISABLED 0 | ||
4345 | #define NFCT_HELPER_STATUS_ENABLED 1 | ||
4346 | |||
4347 | -enum nfnl_acct_msg_types { | ||
4348 | +enum nfnl_cthelper_msg_types { | ||
4349 | NFNL_MSG_CTHELPER_NEW, | ||
4350 | NFNL_MSG_CTHELPER_GET, | ||
4351 | NFNL_MSG_CTHELPER_DEL, | ||
4352 | diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c | ||
4353 | index be0ca3306be8c..46c142b695988 100644 | ||
4354 | --- a/kernel/sched/membarrier.c | ||
4355 | +++ b/kernel/sched/membarrier.c | ||
4356 | @@ -265,9 +265,7 @@ static int sync_runqueues_membarrier_state(struct mm_struct *mm) | ||
4357 | } | ||
4358 | rcu_read_unlock(); | ||
4359 | |||
4360 | - preempt_disable(); | ||
4361 | - smp_call_function_many(tmpmask, ipi_sync_rq_state, mm, 1); | ||
4362 | - preempt_enable(); | ||
4363 | + on_each_cpu_mask(tmpmask, ipi_sync_rq_state, mm, true); | ||
4364 | |||
4365 | free_cpumask_var(tmpmask); | ||
4366 | cpus_read_unlock(); | ||
4367 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c | ||
4368 | index 70665934d53e2..eae6a078619f9 100644 | ||
4369 | --- a/kernel/sysctl.c | ||
4370 | +++ b/kernel/sysctl.c | ||
4371 | @@ -1563,7 +1563,7 @@ static struct ctl_table vm_table[] = { | ||
4372 | .data = &block_dump, | ||
4373 | .maxlen = sizeof(block_dump), | ||
4374 | .mode = 0644, | ||
4375 | - .proc_handler = proc_dointvec, | ||
4376 | + .proc_handler = proc_dointvec_minmax, | ||
4377 | .extra1 = SYSCTL_ZERO, | ||
4378 | }, | ||
4379 | { | ||
4380 | @@ -1571,7 +1571,7 @@ static struct ctl_table vm_table[] = { | ||
4381 | .data = &sysctl_vfs_cache_pressure, | ||
4382 | .maxlen = sizeof(sysctl_vfs_cache_pressure), | ||
4383 | .mode = 0644, | ||
4384 | - .proc_handler = proc_dointvec, | ||
4385 | + .proc_handler = proc_dointvec_minmax, | ||
4386 | .extra1 = SYSCTL_ZERO, | ||
4387 | }, | ||
4388 | #if defined(HAVE_ARCH_PICK_MMAP_LAYOUT) || \ | ||
4389 | @@ -1581,7 +1581,7 @@ static struct ctl_table vm_table[] = { | ||
4390 | .data = &sysctl_legacy_va_layout, | ||
4391 | .maxlen = sizeof(sysctl_legacy_va_layout), | ||
4392 | .mode = 0644, | ||
4393 | - .proc_handler = proc_dointvec, | ||
4394 | + .proc_handler = proc_dointvec_minmax, | ||
4395 | .extra1 = SYSCTL_ZERO, | ||
4396 | }, | ||
4397 | #endif | ||
4398 | @@ -1591,7 +1591,7 @@ static struct ctl_table vm_table[] = { | ||
4399 | .data = &node_reclaim_mode, | ||
4400 | .maxlen = sizeof(node_reclaim_mode), | ||
4401 | .mode = 0644, | ||
4402 | - .proc_handler = proc_dointvec, | ||
4403 | + .proc_handler = proc_dointvec_minmax, | ||
4404 | .extra1 = SYSCTL_ZERO, | ||
4405 | }, | ||
4406 | { | ||
4407 | diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c | ||
4408 | index 7f31932216a12..299a4c5b6cf8d 100644 | ||
4409 | --- a/kernel/time/hrtimer.c | ||
4410 | +++ b/kernel/time/hrtimer.c | ||
4411 | @@ -547,8 +547,11 @@ static ktime_t __hrtimer_next_event_base(struct hrtimer_cpu_base *cpu_base, | ||
4412 | } | ||
4413 | |||
4414 | /* | ||
4415 | - * Recomputes cpu_base::*next_timer and returns the earliest expires_next but | ||
4416 | - * does not set cpu_base::*expires_next, that is done by hrtimer_reprogram. | ||
4417 | + * Recomputes cpu_base::*next_timer and returns the earliest expires_next | ||
4418 | + * but does not set cpu_base::*expires_next, that is done by | ||
4419 | + * hrtimer[_force]_reprogram and hrtimer_interrupt only. When updating | ||
4420 | + * cpu_base::*expires_next right away, reprogramming logic would no longer | ||
4421 | + * work. | ||
4422 | * | ||
4423 | * When a softirq is pending, we can ignore the HRTIMER_ACTIVE_SOFT bases, | ||
4424 | * those timers will get run whenever the softirq gets handled, at the end of | ||
4425 | @@ -589,6 +592,37 @@ __hrtimer_get_next_event(struct hrtimer_cpu_base *cpu_base, unsigned int active_ | ||
4426 | return expires_next; | ||
4427 | } | ||
4428 | |||
4429 | +static ktime_t hrtimer_update_next_event(struct hrtimer_cpu_base *cpu_base) | ||
4430 | +{ | ||
4431 | + ktime_t expires_next, soft = KTIME_MAX; | ||
4432 | + | ||
4433 | + /* | ||
4434 | + * If the soft interrupt has already been activated, ignore the | ||
4435 | + * soft bases. They will be handled in the already raised soft | ||
4436 | + * interrupt. | ||
4437 | + */ | ||
4438 | + if (!cpu_base->softirq_activated) { | ||
4439 | + soft = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_SOFT); | ||
4440 | + /* | ||
4441 | + * Update the soft expiry time. clock_settime() might have | ||
4442 | + * affected it. | ||
4443 | + */ | ||
4444 | + cpu_base->softirq_expires_next = soft; | ||
4445 | + } | ||
4446 | + | ||
4447 | + expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_HARD); | ||
4448 | + /* | ||
4449 | + * If a softirq timer is expiring first, update cpu_base->next_timer | ||
4450 | + * and program the hardware with the soft expiry time. | ||
4451 | + */ | ||
4452 | + if (expires_next > soft) { | ||
4453 | + cpu_base->next_timer = cpu_base->softirq_next_timer; | ||
4454 | + expires_next = soft; | ||
4455 | + } | ||
4456 | + | ||
4457 | + return expires_next; | ||
4458 | +} | ||
4459 | + | ||
4460 | static inline ktime_t hrtimer_update_base(struct hrtimer_cpu_base *base) | ||
4461 | { | ||
4462 | ktime_t *offs_real = &base->clock_base[HRTIMER_BASE_REALTIME].offset; | ||
4463 | @@ -629,23 +663,7 @@ hrtimer_force_reprogram(struct hrtimer_cpu_base *cpu_base, int skip_equal) | ||
4464 | { | ||
4465 | ktime_t expires_next; | ||
4466 | |||
4467 | - /* | ||
4468 | - * Find the current next expiration time. | ||
4469 | - */ | ||
4470 | - expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_ALL); | ||
4471 | - | ||
4472 | - if (cpu_base->next_timer && cpu_base->next_timer->is_soft) { | ||
4473 | - /* | ||
4474 | - * When the softirq is activated, hrtimer has to be | ||
4475 | - * programmed with the first hard hrtimer because soft | ||
4476 | - * timer interrupt could occur too late. | ||
4477 | - */ | ||
4478 | - if (cpu_base->softirq_activated) | ||
4479 | - expires_next = __hrtimer_get_next_event(cpu_base, | ||
4480 | - HRTIMER_ACTIVE_HARD); | ||
4481 | - else | ||
4482 | - cpu_base->softirq_expires_next = expires_next; | ||
4483 | - } | ||
4484 | + expires_next = hrtimer_update_next_event(cpu_base); | ||
4485 | |||
4486 | if (skip_equal && expires_next == cpu_base->expires_next) | ||
4487 | return; | ||
4488 | @@ -1640,8 +1658,8 @@ retry: | ||
4489 | |||
4490 | __hrtimer_run_queues(cpu_base, now, flags, HRTIMER_ACTIVE_HARD); | ||
4491 | |||
4492 | - /* Reevaluate the clock bases for the next expiry */ | ||
4493 | - expires_next = __hrtimer_get_next_event(cpu_base, HRTIMER_ACTIVE_ALL); | ||
4494 | + /* Reevaluate the clock bases for the [soft] next expiry */ | ||
4495 | + expires_next = hrtimer_update_next_event(cpu_base); | ||
4496 | /* | ||
4497 | * Store the new expiry value so the migration code can verify | ||
4498 | * against it. | ||
4499 | diff --git a/lib/logic_pio.c b/lib/logic_pio.c | ||
4500 | index 905027574e5d8..774bb02fff10a 100644 | ||
4501 | --- a/lib/logic_pio.c | ||
4502 | +++ b/lib/logic_pio.c | ||
4503 | @@ -27,6 +27,8 @@ static DEFINE_MUTEX(io_range_mutex); | ||
4504 | * @new_range: pointer to the IO range to be registered. | ||
4505 | * | ||
4506 | * Returns 0 on success, the error code in case of failure. | ||
4507 | + * If the range already exists, -EEXIST will be returned, which should be | ||
4508 | + * considered a success. | ||
4509 | * | ||
4510 | * Register a new IO range node in the IO range list. | ||
4511 | */ | ||
4512 | @@ -49,6 +51,7 @@ int logic_pio_register_range(struct logic_pio_hwaddr *new_range) | ||
4513 | list_for_each_entry(range, &io_range_list, list) { | ||
4514 | if (range->fwnode == new_range->fwnode) { | ||
4515 | /* range already there */ | ||
4516 | + ret = -EEXIST; | ||
4517 | goto end_register; | ||
4518 | } | ||
4519 | if (range->flags == LOGIC_PIO_CPU_MMIO && | ||
4520 | diff --git a/mm/slub.c b/mm/slub.c | ||
4521 | index e622e8f4c2ac4..52ded855b4ed0 100644 | ||
4522 | --- a/mm/slub.c | ||
4523 | +++ b/mm/slub.c | ||
4524 | @@ -1887,7 +1887,7 @@ static void *get_partial_node(struct kmem_cache *s, struct kmem_cache_node *n, | ||
4525 | |||
4526 | t = acquire_slab(s, n, page, object == NULL, &objects); | ||
4527 | if (!t) | ||
4528 | - continue; /* cmpxchg raced */ | ||
4529 | + break; | ||
4530 | |||
4531 | available += objects; | ||
4532 | if (!object) { | ||
4533 | diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c | ||
4534 | index a23094b050f8b..e290a0c9e9282 100644 | ||
4535 | --- a/net/ipv4/cipso_ipv4.c | ||
4536 | +++ b/net/ipv4/cipso_ipv4.c | ||
4537 | @@ -519,16 +519,10 @@ int cipso_v4_doi_remove(u32 doi, struct netlbl_audit *audit_info) | ||
4538 | ret_val = -ENOENT; | ||
4539 | goto doi_remove_return; | ||
4540 | } | ||
4541 | - if (!refcount_dec_and_test(&doi_def->refcount)) { | ||
4542 | - spin_unlock(&cipso_v4_doi_list_lock); | ||
4543 | - ret_val = -EBUSY; | ||
4544 | - goto doi_remove_return; | ||
4545 | - } | ||
4546 | list_del_rcu(&doi_def->list); | ||
4547 | spin_unlock(&cipso_v4_doi_list_lock); | ||
4548 | |||
4549 | - cipso_v4_cache_invalidate(); | ||
4550 | - call_rcu(&doi_def->rcu, cipso_v4_doi_free_rcu); | ||
4551 | + cipso_v4_doi_putdef(doi_def); | ||
4552 | ret_val = 0; | ||
4553 | |||
4554 | doi_remove_return: | ||
4555 | @@ -585,9 +579,6 @@ void cipso_v4_doi_putdef(struct cipso_v4_doi *doi_def) | ||
4556 | |||
4557 | if (!refcount_dec_and_test(&doi_def->refcount)) | ||
4558 | return; | ||
4559 | - spin_lock(&cipso_v4_doi_list_lock); | ||
4560 | - list_del_rcu(&doi_def->list); | ||
4561 | - spin_unlock(&cipso_v4_doi_list_lock); | ||
4562 | |||
4563 | cipso_v4_cache_invalidate(); | ||
4564 | call_rcu(&doi_def->rcu, cipso_v4_doi_free_rcu); | ||
4565 | diff --git a/net/ipv4/nexthop.c b/net/ipv4/nexthop.c | ||
4566 | index c2b7d43d92b0e..f5f4369c131c9 100644 | ||
4567 | --- a/net/ipv4/nexthop.c | ||
4568 | +++ b/net/ipv4/nexthop.c | ||
4569 | @@ -1065,7 +1065,7 @@ out: | ||
4570 | |||
4571 | /* rtnl */ | ||
4572 | /* remove all nexthops tied to a device being deleted */ | ||
4573 | -static void nexthop_flush_dev(struct net_device *dev) | ||
4574 | +static void nexthop_flush_dev(struct net_device *dev, unsigned long event) | ||
4575 | { | ||
4576 | unsigned int hash = nh_dev_hashfn(dev->ifindex); | ||
4577 | struct net *net = dev_net(dev); | ||
4578 | @@ -1077,6 +1077,10 @@ static void nexthop_flush_dev(struct net_device *dev) | ||
4579 | if (nhi->fib_nhc.nhc_dev != dev) | ||
4580 | continue; | ||
4581 | |||
4582 | + if (nhi->reject_nh && | ||
4583 | + (event == NETDEV_DOWN || event == NETDEV_CHANGE)) | ||
4584 | + continue; | ||
4585 | + | ||
4586 | remove_nexthop(net, nhi->nh_parent, NULL); | ||
4587 | } | ||
4588 | } | ||
4589 | @@ -1794,11 +1798,11 @@ static int nh_netdev_event(struct notifier_block *this, | ||
4590 | switch (event) { | ||
4591 | case NETDEV_DOWN: | ||
4592 | case NETDEV_UNREGISTER: | ||
4593 | - nexthop_flush_dev(dev); | ||
4594 | + nexthop_flush_dev(dev, event); | ||
4595 | break; | ||
4596 | case NETDEV_CHANGE: | ||
4597 | if (!(dev_get_flags(dev) & (IFF_RUNNING | IFF_LOWER_UP))) | ||
4598 | - nexthop_flush_dev(dev); | ||
4599 | + nexthop_flush_dev(dev, event); | ||
4600 | break; | ||
4601 | case NETDEV_CHANGEMTU: | ||
4602 | info_ext = ptr; | ||
4603 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c | ||
4604 | index 6ddec8a23942b..5c8d0fb498256 100644 | ||
4605 | --- a/net/ipv4/tcp.c | ||
4606 | +++ b/net/ipv4/tcp.c | ||
4607 | @@ -2957,16 +2957,23 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | ||
4608 | break; | ||
4609 | |||
4610 | case TCP_QUEUE_SEQ: | ||
4611 | - if (sk->sk_state != TCP_CLOSE) | ||
4612 | + if (sk->sk_state != TCP_CLOSE) { | ||
4613 | err = -EPERM; | ||
4614 | - else if (tp->repair_queue == TCP_SEND_QUEUE) | ||
4615 | - WRITE_ONCE(tp->write_seq, val); | ||
4616 | - else if (tp->repair_queue == TCP_RECV_QUEUE) { | ||
4617 | - WRITE_ONCE(tp->rcv_nxt, val); | ||
4618 | - WRITE_ONCE(tp->copied_seq, val); | ||
4619 | - } | ||
4620 | - else | ||
4621 | + } else if (tp->repair_queue == TCP_SEND_QUEUE) { | ||
4622 | + if (!tcp_rtx_queue_empty(sk)) | ||
4623 | + err = -EPERM; | ||
4624 | + else | ||
4625 | + WRITE_ONCE(tp->write_seq, val); | ||
4626 | + } else if (tp->repair_queue == TCP_RECV_QUEUE) { | ||
4627 | + if (tp->rcv_nxt != tp->copied_seq) { | ||
4628 | + err = -EPERM; | ||
4629 | + } else { | ||
4630 | + WRITE_ONCE(tp->rcv_nxt, val); | ||
4631 | + WRITE_ONCE(tp->copied_seq, val); | ||
4632 | + } | ||
4633 | + } else { | ||
4634 | err = -EINVAL; | ||
4635 | + } | ||
4636 | break; | ||
4637 | |||
4638 | case TCP_REPAIR_OPTIONS: | ||
4639 | diff --git a/net/ipv4/udp_offload.c b/net/ipv4/udp_offload.c | ||
4640 | index d7c64e953e9a5..c463eebdc8fe2 100644 | ||
4641 | --- a/net/ipv4/udp_offload.c | ||
4642 | +++ b/net/ipv4/udp_offload.c | ||
4643 | @@ -426,7 +426,7 @@ struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff *skb, | ||
4644 | } | ||
4645 | |||
4646 | if (NAPI_GRO_CB(skb)->encap_mark || | ||
4647 | - (skb->ip_summed != CHECKSUM_PARTIAL && | ||
4648 | + (uh->check && skb->ip_summed != CHECKSUM_PARTIAL && | ||
4649 | NAPI_GRO_CB(skb)->csum_cnt == 0 && | ||
4650 | !NAPI_GRO_CB(skb)->csum_valid) || | ||
4651 | !udp_sk(sk)->gro_receive) | ||
4652 | diff --git a/net/ipv6/calipso.c b/net/ipv6/calipso.c | ||
4653 | index 8d3f66c310dbd..7426e33686d13 100644 | ||
4654 | --- a/net/ipv6/calipso.c | ||
4655 | +++ b/net/ipv6/calipso.c | ||
4656 | @@ -83,6 +83,9 @@ struct calipso_map_cache_entry { | ||
4657 | |||
4658 | static struct calipso_map_cache_bkt *calipso_cache; | ||
4659 | |||
4660 | +static void calipso_cache_invalidate(void); | ||
4661 | +static void calipso_doi_putdef(struct calipso_doi *doi_def); | ||
4662 | + | ||
4663 | /* Label Mapping Cache Functions | ||
4664 | */ | ||
4665 | |||
4666 | @@ -444,15 +447,10 @@ static int calipso_doi_remove(u32 doi, struct netlbl_audit *audit_info) | ||
4667 | ret_val = -ENOENT; | ||
4668 | goto doi_remove_return; | ||
4669 | } | ||
4670 | - if (!refcount_dec_and_test(&doi_def->refcount)) { | ||
4671 | - spin_unlock(&calipso_doi_list_lock); | ||
4672 | - ret_val = -EBUSY; | ||
4673 | - goto doi_remove_return; | ||
4674 | - } | ||
4675 | list_del_rcu(&doi_def->list); | ||
4676 | spin_unlock(&calipso_doi_list_lock); | ||
4677 | |||
4678 | - call_rcu(&doi_def->rcu, calipso_doi_free_rcu); | ||
4679 | + calipso_doi_putdef(doi_def); | ||
4680 | ret_val = 0; | ||
4681 | |||
4682 | doi_remove_return: | ||
4683 | @@ -508,10 +506,8 @@ static void calipso_doi_putdef(struct calipso_doi *doi_def) | ||
4684 | |||
4685 | if (!refcount_dec_and_test(&doi_def->refcount)) | ||
4686 | return; | ||
4687 | - spin_lock(&calipso_doi_list_lock); | ||
4688 | - list_del_rcu(&doi_def->list); | ||
4689 | - spin_unlock(&calipso_doi_list_lock); | ||
4690 | |||
4691 | + calipso_cache_invalidate(); | ||
4692 | call_rcu(&doi_def->rcu, calipso_doi_free_rcu); | ||
4693 | } | ||
4694 | |||
4695 | diff --git a/net/mpls/mpls_gso.c b/net/mpls/mpls_gso.c | ||
4696 | index b1690149b6fa0..1482259de9b5d 100644 | ||
4697 | --- a/net/mpls/mpls_gso.c | ||
4698 | +++ b/net/mpls/mpls_gso.c | ||
4699 | @@ -14,6 +14,7 @@ | ||
4700 | #include <linux/netdev_features.h> | ||
4701 | #include <linux/netdevice.h> | ||
4702 | #include <linux/skbuff.h> | ||
4703 | +#include <net/mpls.h> | ||
4704 | |||
4705 | static struct sk_buff *mpls_gso_segment(struct sk_buff *skb, | ||
4706 | netdev_features_t features) | ||
4707 | @@ -27,6 +28,8 @@ static struct sk_buff *mpls_gso_segment(struct sk_buff *skb, | ||
4708 | |||
4709 | skb_reset_network_header(skb); | ||
4710 | mpls_hlen = skb_inner_network_header(skb) - skb_network_header(skb); | ||
4711 | + if (unlikely(!mpls_hlen || mpls_hlen % MPLS_HLEN)) | ||
4712 | + goto out; | ||
4713 | if (unlikely(!pskb_may_pull(skb, mpls_hlen))) | ||
4714 | goto out; | ||
4715 | |||
4716 | diff --git a/net/netfilter/nf_nat_proto.c b/net/netfilter/nf_nat_proto.c | ||
4717 | index e87b6bd6b3cdb..4731d21fc3ad8 100644 | ||
4718 | --- a/net/netfilter/nf_nat_proto.c | ||
4719 | +++ b/net/netfilter/nf_nat_proto.c | ||
4720 | @@ -646,8 +646,8 @@ nf_nat_ipv4_fn(void *priv, struct sk_buff *skb, | ||
4721 | } | ||
4722 | |||
4723 | static unsigned int | ||
4724 | -nf_nat_ipv4_in(void *priv, struct sk_buff *skb, | ||
4725 | - const struct nf_hook_state *state) | ||
4726 | +nf_nat_ipv4_pre_routing(void *priv, struct sk_buff *skb, | ||
4727 | + const struct nf_hook_state *state) | ||
4728 | { | ||
4729 | unsigned int ret; | ||
4730 | __be32 daddr = ip_hdr(skb)->daddr; | ||
4731 | @@ -659,6 +659,23 @@ nf_nat_ipv4_in(void *priv, struct sk_buff *skb, | ||
4732 | return ret; | ||
4733 | } | ||
4734 | |||
4735 | +static unsigned int | ||
4736 | +nf_nat_ipv4_local_in(void *priv, struct sk_buff *skb, | ||
4737 | + const struct nf_hook_state *state) | ||
4738 | +{ | ||
4739 | + __be32 saddr = ip_hdr(skb)->saddr; | ||
4740 | + struct sock *sk = skb->sk; | ||
4741 | + unsigned int ret; | ||
4742 | + | ||
4743 | + ret = nf_nat_ipv4_fn(priv, skb, state); | ||
4744 | + | ||
4745 | + if (ret == NF_ACCEPT && sk && saddr != ip_hdr(skb)->saddr && | ||
4746 | + !inet_sk_transparent(sk)) | ||
4747 | + skb_orphan(skb); /* TCP edemux obtained wrong socket */ | ||
4748 | + | ||
4749 | + return ret; | ||
4750 | +} | ||
4751 | + | ||
4752 | static unsigned int | ||
4753 | nf_nat_ipv4_out(void *priv, struct sk_buff *skb, | ||
4754 | const struct nf_hook_state *state) | ||
4755 | @@ -736,7 +753,7 @@ nf_nat_ipv4_local_fn(void *priv, struct sk_buff *skb, | ||
4756 | static const struct nf_hook_ops nf_nat_ipv4_ops[] = { | ||
4757 | /* Before packet filtering, change destination */ | ||
4758 | { | ||
4759 | - .hook = nf_nat_ipv4_in, | ||
4760 | + .hook = nf_nat_ipv4_pre_routing, | ||
4761 | .pf = NFPROTO_IPV4, | ||
4762 | .hooknum = NF_INET_PRE_ROUTING, | ||
4763 | .priority = NF_IP_PRI_NAT_DST, | ||
4764 | @@ -757,7 +774,7 @@ static const struct nf_hook_ops nf_nat_ipv4_ops[] = { | ||
4765 | }, | ||
4766 | /* After packet filtering, change source */ | ||
4767 | { | ||
4768 | - .hook = nf_nat_ipv4_fn, | ||
4769 | + .hook = nf_nat_ipv4_local_in, | ||
4770 | .pf = NFPROTO_IPV4, | ||
4771 | .hooknum = NF_INET_LOCAL_IN, | ||
4772 | .priority = NF_IP_PRI_NAT_SRC, | ||
4773 | diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c | ||
4774 | index d1ef2d7930739..8b60fc04c67c2 100644 | ||
4775 | --- a/net/netfilter/x_tables.c | ||
4776 | +++ b/net/netfilter/x_tables.c | ||
4777 | @@ -330,6 +330,7 @@ static int match_revfn(u8 af, const char *name, u8 revision, int *bestp) | ||
4778 | const struct xt_match *m; | ||
4779 | int have_rev = 0; | ||
4780 | |||
4781 | + mutex_lock(&xt[af].mutex); | ||
4782 | list_for_each_entry(m, &xt[af].match, list) { | ||
4783 | if (strcmp(m->name, name) == 0) { | ||
4784 | if (m->revision > *bestp) | ||
4785 | @@ -338,6 +339,7 @@ static int match_revfn(u8 af, const char *name, u8 revision, int *bestp) | ||
4786 | have_rev = 1; | ||
4787 | } | ||
4788 | } | ||
4789 | + mutex_unlock(&xt[af].mutex); | ||
4790 | |||
4791 | if (af != NFPROTO_UNSPEC && !have_rev) | ||
4792 | return match_revfn(NFPROTO_UNSPEC, name, revision, bestp); | ||
4793 | @@ -350,6 +352,7 @@ static int target_revfn(u8 af, const char *name, u8 revision, int *bestp) | ||
4794 | const struct xt_target *t; | ||
4795 | int have_rev = 0; | ||
4796 | |||
4797 | + mutex_lock(&xt[af].mutex); | ||
4798 | list_for_each_entry(t, &xt[af].target, list) { | ||
4799 | if (strcmp(t->name, name) == 0) { | ||
4800 | if (t->revision > *bestp) | ||
4801 | @@ -358,6 +361,7 @@ static int target_revfn(u8 af, const char *name, u8 revision, int *bestp) | ||
4802 | have_rev = 1; | ||
4803 | } | ||
4804 | } | ||
4805 | + mutex_unlock(&xt[af].mutex); | ||
4806 | |||
4807 | if (af != NFPROTO_UNSPEC && !have_rev) | ||
4808 | return target_revfn(NFPROTO_UNSPEC, name, revision, bestp); | ||
4809 | @@ -371,12 +375,10 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target, | ||
4810 | { | ||
4811 | int have_rev, best = -1; | ||
4812 | |||
4813 | - mutex_lock(&xt[af].mutex); | ||
4814 | if (target == 1) | ||
4815 | have_rev = target_revfn(af, name, revision, &best); | ||
4816 | else | ||
4817 | have_rev = match_revfn(af, name, revision, &best); | ||
4818 | - mutex_unlock(&xt[af].mutex); | ||
4819 | |||
4820 | /* Nothing at all? Return 0 to try loading module. */ | ||
4821 | if (best == -1) { | ||
4822 | diff --git a/net/netlabel/netlabel_cipso_v4.c b/net/netlabel/netlabel_cipso_v4.c | ||
4823 | index 0f16080b87cb9..4cb43a2c07d14 100644 | ||
4824 | --- a/net/netlabel/netlabel_cipso_v4.c | ||
4825 | +++ b/net/netlabel/netlabel_cipso_v4.c | ||
4826 | @@ -575,6 +575,7 @@ list_start: | ||
4827 | |||
4828 | break; | ||
4829 | } | ||
4830 | + cipso_v4_doi_putdef(doi_def); | ||
4831 | rcu_read_unlock(); | ||
4832 | |||
4833 | genlmsg_end(ans_skb, data); | ||
4834 | @@ -583,12 +584,14 @@ list_start: | ||
4835 | list_retry: | ||
4836 | /* XXX - this limit is a guesstimate */ | ||
4837 | if (nlsze_mult < 4) { | ||
4838 | + cipso_v4_doi_putdef(doi_def); | ||
4839 | rcu_read_unlock(); | ||
4840 | kfree_skb(ans_skb); | ||
4841 | nlsze_mult *= 2; | ||
4842 | goto list_start; | ||
4843 | } | ||
4844 | list_failure_lock: | ||
4845 | + cipso_v4_doi_putdef(doi_def); | ||
4846 | rcu_read_unlock(); | ||
4847 | list_failure: | ||
4848 | kfree_skb(ans_skb); | ||
4849 | diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c | ||
4850 | index ef602976bb2c8..6e023e93d3186 100644 | ||
4851 | --- a/net/qrtr/qrtr.c | ||
4852 | +++ b/net/qrtr/qrtr.c | ||
4853 | @@ -791,8 +791,10 @@ static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) | ||
4854 | plen = (len + 3) & ~3; | ||
4855 | skb = sock_alloc_send_skb(sk, plen + QRTR_HDR_MAX_SIZE, | ||
4856 | msg->msg_flags & MSG_DONTWAIT, &rc); | ||
4857 | - if (!skb) | ||
4858 | + if (!skb) { | ||
4859 | + rc = -ENOMEM; | ||
4860 | goto out_node; | ||
4861 | + } | ||
4862 | |||
4863 | skb_reserve(skb, QRTR_HDR_MAX_SIZE); | ||
4864 | |||
4865 | diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c | ||
4866 | index b65a405f607b2..3b1b5ee521379 100644 | ||
4867 | --- a/net/sched/sch_api.c | ||
4868 | +++ b/net/sched/sch_api.c | ||
4869 | @@ -2157,7 +2157,7 @@ static int tc_dump_tclass_qdisc(struct Qdisc *q, struct sk_buff *skb, | ||
4870 | |||
4871 | static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb, | ||
4872 | struct tcmsg *tcm, struct netlink_callback *cb, | ||
4873 | - int *t_p, int s_t) | ||
4874 | + int *t_p, int s_t, bool recur) | ||
4875 | { | ||
4876 | struct Qdisc *q; | ||
4877 | int b; | ||
4878 | @@ -2168,7 +2168,7 @@ static int tc_dump_tclass_root(struct Qdisc *root, struct sk_buff *skb, | ||
4879 | if (tc_dump_tclass_qdisc(root, skb, tcm, cb, t_p, s_t) < 0) | ||
4880 | return -1; | ||
4881 | |||
4882 | - if (!qdisc_dev(root)) | ||
4883 | + if (!qdisc_dev(root) || !recur) | ||
4884 | return 0; | ||
4885 | |||
4886 | if (tcm->tcm_parent) { | ||
4887 | @@ -2203,13 +2203,13 @@ static int tc_dump_tclass(struct sk_buff *skb, struct netlink_callback *cb) | ||
4888 | s_t = cb->args[0]; | ||
4889 | t = 0; | ||
4890 | |||
4891 | - if (tc_dump_tclass_root(dev->qdisc, skb, tcm, cb, &t, s_t) < 0) | ||
4892 | + if (tc_dump_tclass_root(dev->qdisc, skb, tcm, cb, &t, s_t, true) < 0) | ||
4893 | goto done; | ||
4894 | |||
4895 | dev_queue = dev_ingress_queue(dev); | ||
4896 | if (dev_queue && | ||
4897 | tc_dump_tclass_root(dev_queue->qdisc_sleeping, skb, tcm, cb, | ||
4898 | - &t, s_t) < 0) | ||
4899 | + &t, s_t, false) < 0) | ||
4900 | goto done; | ||
4901 | |||
4902 | done: | ||
4903 | diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c | ||
4904 | index 7afbf15bcbd9a..4beb6d2957c33 100644 | ||
4905 | --- a/net/sunrpc/sched.c | ||
4906 | +++ b/net/sunrpc/sched.c | ||
4907 | @@ -990,8 +990,11 @@ void rpc_execute(struct rpc_task *task) | ||
4908 | |||
4909 | rpc_set_active(task); | ||
4910 | rpc_make_runnable(rpciod_workqueue, task); | ||
4911 | - if (!is_async) | ||
4912 | + if (!is_async) { | ||
4913 | + unsigned int pflags = memalloc_nofs_save(); | ||
4914 | __rpc_execute(task); | ||
4915 | + memalloc_nofs_restore(pflags); | ||
4916 | + } | ||
4917 | } | ||
4918 | |||
4919 | static void rpc_async_schedule(struct work_struct *work) | ||
4920 | diff --git a/samples/bpf/xdpsock_user.c b/samples/bpf/xdpsock_user.c | ||
4921 | index 79d1005ff2ee3..3b604c1eb3c3b 100644 | ||
4922 | --- a/samples/bpf/xdpsock_user.c | ||
4923 | +++ b/samples/bpf/xdpsock_user.c | ||
4924 | @@ -783,5 +783,7 @@ int main(int argc, char **argv) | ||
4925 | else | ||
4926 | l2fwd_all(); | ||
4927 | |||
4928 | + munmap(bufs, NUM_FRAMES * opt_xsk_frame_size); | ||
4929 | + | ||
4930 | return 0; | ||
4931 | } | ||
4932 | diff --git a/security/commoncap.c b/security/commoncap.c | ||
4933 | index ed89a6dd4f83d..28a6939bcc4e5 100644 | ||
4934 | --- a/security/commoncap.c | ||
4935 | +++ b/security/commoncap.c | ||
4936 | @@ -500,8 +500,7 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) | ||
4937 | __u32 magic, nsmagic; | ||
4938 | struct inode *inode = d_backing_inode(dentry); | ||
4939 | struct user_namespace *task_ns = current_user_ns(), | ||
4940 | - *fs_ns = inode->i_sb->s_user_ns, | ||
4941 | - *ancestor; | ||
4942 | + *fs_ns = inode->i_sb->s_user_ns; | ||
4943 | kuid_t rootid; | ||
4944 | size_t newsize; | ||
4945 | |||
4946 | @@ -524,15 +523,6 @@ int cap_convert_nscap(struct dentry *dentry, void **ivalue, size_t size) | ||
4947 | if (nsrootid == -1) | ||
4948 | return -EINVAL; | ||
4949 | |||
4950 | - /* | ||
4951 | - * Do not allow allow adding a v3 filesystem capability xattr | ||
4952 | - * if the rootid field is ambiguous. | ||
4953 | - */ | ||
4954 | - for (ancestor = task_ns->parent; ancestor; ancestor = ancestor->parent) { | ||
4955 | - if (from_kuid(ancestor, rootid) == 0) | ||
4956 | - return -EINVAL; | ||
4957 | - } | ||
4958 | - | ||
4959 | newsize = sizeof(struct vfs_ns_cap_data); | ||
4960 | nscap = kmalloc(newsize, GFP_ATOMIC); | ||
4961 | if (!nscap) | ||
4962 | diff --git a/sound/pci/hda/hda_bind.c b/sound/pci/hda/hda_bind.c | ||
4963 | index 6a85645663759..17a25e453f60c 100644 | ||
4964 | --- a/sound/pci/hda/hda_bind.c | ||
4965 | +++ b/sound/pci/hda/hda_bind.c | ||
4966 | @@ -47,6 +47,10 @@ static void hda_codec_unsol_event(struct hdac_device *dev, unsigned int ev) | ||
4967 | if (codec->bus->shutdown) | ||
4968 | return; | ||
4969 | |||
4970 | + /* ignore unsol events during system suspend/resume */ | ||
4971 | + if (codec->core.dev.power.power_state.event != PM_EVENT_ON) | ||
4972 | + return; | ||
4973 | + | ||
4974 | if (codec->patch_ops.unsol_event) | ||
4975 | codec->patch_ops.unsol_event(codec, ev); | ||
4976 | } | ||
4977 | diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c | ||
4978 | index 5e6081750bd9b..6a159c6c2f546 100644 | ||
4979 | --- a/sound/pci/hda/hda_controller.c | ||
4980 | +++ b/sound/pci/hda/hda_controller.c | ||
4981 | @@ -613,13 +613,6 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) | ||
4982 | 20, | ||
4983 | 178000000); | ||
4984 | |||
4985 | - /* by some reason, the playback stream stalls on PulseAudio with | ||
4986 | - * tsched=1 when a capture stream triggers. Until we figure out the | ||
4987 | - * real cause, disable tsched mode by telling the PCM info flag. | ||
4988 | - */ | ||
4989 | - if (chip->driver_caps & AZX_DCAPS_AMD_WORKAROUND) | ||
4990 | - runtime->hw.info |= SNDRV_PCM_INFO_BATCH; | ||
4991 | - | ||
4992 | if (chip->align_buffer_size) | ||
4993 | /* constrain buffer sizes to be multiple of 128 | ||
4994 | bytes. This is more efficient in terms of memory | ||
4995 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
4996 | index 7f9f6bbca5489..febd16c9efd7a 100644 | ||
4997 | --- a/sound/pci/hda/hda_intel.c | ||
4998 | +++ b/sound/pci/hda/hda_intel.c | ||
4999 | @@ -1025,6 +1025,8 @@ static int azx_prepare(struct device *dev) | ||
5000 | chip = card->private_data; | ||
5001 | chip->pm_prepared = 1; | ||
5002 | |||
5003 | + flush_work(&azx_bus(chip)->unsol_work); | ||
5004 | + | ||
5005 | /* HDA controller always requires different WAKEEN for runtime suspend | ||
5006 | * and system suspend, so don't use direct-complete here. | ||
5007 | */ | ||
5008 | diff --git a/sound/pci/hda/patch_ca0132.c b/sound/pci/hda/patch_ca0132.c | ||
5009 | index d7b2aae6d4289..9412bdda85c82 100644 | ||
5010 | --- a/sound/pci/hda/patch_ca0132.c | ||
5011 | +++ b/sound/pci/hda/patch_ca0132.c | ||
5012 | @@ -1185,6 +1185,7 @@ static const struct snd_pci_quirk ca0132_quirks[] = { | ||
5013 | SND_PCI_QUIRK(0x1102, 0x0013, "Recon3D", QUIRK_R3D), | ||
5014 | SND_PCI_QUIRK(0x1102, 0x0018, "Recon3D", QUIRK_R3D), | ||
5015 | SND_PCI_QUIRK(0x1102, 0x0051, "Sound Blaster AE-5", QUIRK_AE5), | ||
5016 | + SND_PCI_QUIRK(0x1102, 0x0191, "Sound Blaster AE-5 Plus", QUIRK_AE5), | ||
5017 | SND_PCI_QUIRK(0x1102, 0x0081, "Sound Blaster AE-7", QUIRK_AE7), | ||
5018 | {} | ||
5019 | }; | ||
5020 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c | ||
5021 | index df4771b9eff24..ce38b5d4670da 100644 | ||
5022 | --- a/sound/pci/hda/patch_hdmi.c | ||
5023 | +++ b/sound/pci/hda/patch_hdmi.c | ||
5024 | @@ -2382,6 +2382,18 @@ static void generic_hdmi_free(struct hda_codec *codec) | ||
5025 | } | ||
5026 | |||
5027 | #ifdef CONFIG_PM | ||
5028 | +static int generic_hdmi_suspend(struct hda_codec *codec) | ||
5029 | +{ | ||
5030 | + struct hdmi_spec *spec = codec->spec; | ||
5031 | + int pin_idx; | ||
5032 | + | ||
5033 | + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { | ||
5034 | + struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); | ||
5035 | + cancel_delayed_work_sync(&per_pin->work); | ||
5036 | + } | ||
5037 | + return 0; | ||
5038 | +} | ||
5039 | + | ||
5040 | static int generic_hdmi_resume(struct hda_codec *codec) | ||
5041 | { | ||
5042 | struct hdmi_spec *spec = codec->spec; | ||
5043 | @@ -2405,6 +2417,7 @@ static const struct hda_codec_ops generic_hdmi_patch_ops = { | ||
5044 | .build_controls = generic_hdmi_build_controls, | ||
5045 | .unsol_event = hdmi_unsol_event, | ||
5046 | #ifdef CONFIG_PM | ||
5047 | + .suspend = generic_hdmi_suspend, | ||
5048 | .resume = generic_hdmi_resume, | ||
5049 | #endif | ||
5050 | }; | ||
5051 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
5052 | index a7f31766d14df..9fb03c646a88f 100644 | ||
5053 | --- a/sound/usb/quirks.c | ||
5054 | +++ b/sound/usb/quirks.c | ||
5055 | @@ -1452,6 +1452,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
5056 | case USB_ID(0x1901, 0x0191): /* GE B850V3 CP2114 audio interface */ | ||
5057 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ | ||
5058 | case USB_ID(0x2912, 0x30c8): /* Audioengine D1 */ | ||
5059 | + case USB_ID(0x413c, 0xa506): /* Dell AE515 sound bar */ | ||
5060 | return true; | ||
5061 | } | ||
5062 | |||
5063 | @@ -1604,6 +1605,14 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, | ||
5064 | && (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
5065 | msleep(20); | ||
5066 | |||
5067 | + /* | ||
5068 | + * Plantronics headsets (C320, C320-M, etc) need a delay to avoid | ||
5069 | + * random microhpone failures. | ||
5070 | + */ | ||
5071 | + if (USB_ID_VENDOR(chip->usb_id) == 0x047f && | ||
5072 | + (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS) | ||
5073 | + msleep(20); | ||
5074 | + | ||
5075 | /* Zoom R16/24, many Logitech(at least H650e/H570e/BCC950), | ||
5076 | * Jabra 550a, Kingston HyperX needs a tiny delay here, | ||
5077 | * otherwise requests like get/set frequency return | ||
5078 | diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c | ||
5079 | index 8593d3c200c61..0116b0c06e976 100644 | ||
5080 | --- a/tools/perf/util/trace-event-read.c | ||
5081 | +++ b/tools/perf/util/trace-event-read.c | ||
5082 | @@ -361,6 +361,7 @@ static int read_saved_cmdline(struct tep_handle *pevent) | ||
5083 | pr_debug("error reading saved cmdlines\n"); | ||
5084 | goto out; | ||
5085 | } | ||
5086 | + buf[ret] = '\0'; | ||
5087 | |||
5088 | parse_saved_cmdline(pevent, buf, size); | ||
5089 | ret = 0; | ||
5090 | diff --git a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c | ||
5091 | index 0f98724120deb..b4e9a1d8c6cdb 100644 | ||
5092 | --- a/tools/testing/selftests/bpf/progs/test_tunnel_kern.c | ||
5093 | +++ b/tools/testing/selftests/bpf/progs/test_tunnel_kern.c | ||
5094 | @@ -446,10 +446,8 @@ int _geneve_get_tunnel(struct __sk_buff *skb) | ||
5095 | } | ||
5096 | |||
5097 | ret = bpf_skb_get_tunnel_opt(skb, &gopt, sizeof(gopt)); | ||
5098 | - if (ret < 0) { | ||
5099 | - ERROR(ret); | ||
5100 | - return TC_ACT_SHOT; | ||
5101 | - } | ||
5102 | + if (ret < 0) | ||
5103 | + gopt.opt_class = 0; | ||
5104 | |||
5105 | bpf_trace_printk(fmt, sizeof(fmt), | ||
5106 | key.tunnel_id, key.remote_ipv4, gopt.opt_class); | ||
5107 | diff --git a/tools/testing/selftests/bpf/verifier/array_access.c b/tools/testing/selftests/bpf/verifier/array_access.c | ||
5108 | index f3c33e128709b..bcc87906c4c19 100644 | ||
5109 | --- a/tools/testing/selftests/bpf/verifier/array_access.c | ||
5110 | +++ b/tools/testing/selftests/bpf/verifier/array_access.c | ||
5111 | @@ -250,12 +250,13 @@ | ||
5112 | BPF_MOV64_IMM(BPF_REG_5, 0), | ||
5113 | BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, | ||
5114 | BPF_FUNC_csum_diff), | ||
5115 | + BPF_ALU64_IMM(BPF_AND, BPF_REG_0, 0xffff), | ||
5116 | BPF_EXIT_INSN(), | ||
5117 | }, | ||
5118 | .prog_type = BPF_PROG_TYPE_SCHED_CLS, | ||
5119 | .fixup_map_array_ro = { 3 }, | ||
5120 | .result = ACCEPT, | ||
5121 | - .retval = -29, | ||
5122 | + .retval = 65507, | ||
5123 | }, | ||
5124 | { | ||
5125 | "invalid write map access into a read-only array 1", | ||
5126 | diff --git a/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh b/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh | ||
5127 | index 197e769c2ed16..f8cda822c1cec 100755 | ||
5128 | --- a/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh | ||
5129 | +++ b/tools/testing/selftests/net/forwarding/mirror_gre_bridge_1d_vlan.sh | ||
5130 | @@ -86,11 +86,20 @@ test_ip6gretap() | ||
5131 | |||
5132 | test_gretap_stp() | ||
5133 | { | ||
5134 | + # Sometimes after mirror installation, the neighbor's state is not valid. | ||
5135 | + # The reason is that there is no SW datapath activity related to the | ||
5136 | + # neighbor for the remote GRE address. Therefore whether the corresponding | ||
5137 | + # neighbor will be valid is a matter of luck, and the test is thus racy. | ||
5138 | + # Set the neighbor's state to permanent, so it would be always valid. | ||
5139 | + ip neigh replace 192.0.2.130 lladdr $(mac_get $h3) \ | ||
5140 | + nud permanent dev br2 | ||
5141 | full_test_span_gre_stp gt4 $swp3.555 "mirror to gretap" | ||
5142 | } | ||
5143 | |||
5144 | test_ip6gretap_stp() | ||
5145 | { | ||
5146 | + ip neigh replace 2001:db8:2::2 lladdr $(mac_get $h3) \ | ||
5147 | + nud permanent dev br2 | ||
5148 | full_test_span_gre_stp gt6 $swp3.555 "mirror to ip6gretap" | ||
5149 | } | ||
5150 | |||
5151 | diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c | ||
5152 | index 986fbc3cf667b..2e7d2b3f29079 100644 | ||
5153 | --- a/virt/kvm/arm/arm.c | ||
5154 | +++ b/virt/kvm/arm/arm.c | ||
5155 | @@ -373,11 +373,17 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) | ||
5156 | cpu_data = this_cpu_ptr(&kvm_host_data); | ||
5157 | |||
5158 | /* | ||
5159 | + * We guarantee that both TLBs and I-cache are private to each | ||
5160 | + * vcpu. If detecting that a vcpu from the same VM has | ||
5161 | + * previously run on the same physical CPU, call into the | ||
5162 | + * hypervisor code to nuke the relevant contexts. | ||
5163 | + * | ||
5164 | + * We might get preempted before the vCPU actually runs, but | ||
5165 | * We might get preempted before the vCPU actually runs, but | ||
5166 | * over-invalidation doesn't affect correctness. | ||
5167 | */ | ||
5168 | if (*last_ran != vcpu->vcpu_id) { | ||
5169 | - kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu); | ||
5170 | + kvm_call_hyp(__kvm_flush_cpu_context, vcpu); | ||
5171 | *last_ran = vcpu->vcpu_id; | ||
5172 | } | ||
5173 | |||
5174 | diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c | ||
5175 | index 03a586ab6d27b..c6ba672f07ccf 100644 | ||
5176 | --- a/virt/kvm/arm/mmu.c | ||
5177 | +++ b/virt/kvm/arm/mmu.c | ||
5178 | @@ -2307,8 +2307,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, | ||
5179 | * Prevent userspace from creating a memory region outside of the IPA | ||
5180 | * space addressable by the KVM guest IPA space. | ||
5181 | */ | ||
5182 | - if (memslot->base_gfn + memslot->npages >= | ||
5183 | - (kvm_phys_size(kvm) >> PAGE_SHIFT)) | ||
5184 | + if ((memslot->base_gfn + memslot->npages) > (kvm_phys_size(kvm) >> PAGE_SHIFT)) | ||
5185 | return -EFAULT; | ||
5186 | |||
5187 | down_read(¤t->mm->mmap_sem); |