Annotation of /trunk/kernel-magellan/patches-3.7/0105-3.7.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2064 -
(hide annotations)
(download)
Wed Feb 6 10:48:49 2013 UTC (11 years, 7 months ago) by niro
File size: 110462 byte(s)
Wed Feb 6 10:48:49 2013 UTC (11 years, 7 months ago) by niro
File size: 110462 byte(s)
- linux-3.7.6
1 | niro | 2064 | diff --git a/Documentation/device-mapper/dm-raid.txt b/Documentation/device-mapper/dm-raid.txt |
2 | index 728c38c..56fb62b 100644 | ||
3 | --- a/Documentation/device-mapper/dm-raid.txt | ||
4 | +++ b/Documentation/device-mapper/dm-raid.txt | ||
5 | @@ -141,3 +141,4 @@ Version History | ||
6 | 1.2.0 Handle creation of arrays that contain failed devices. | ||
7 | 1.3.0 Added support for RAID 10 | ||
8 | 1.3.1 Allow device replacement/rebuild for RAID 10 | ||
9 | +1.3.2 Fix/improve redundancy checking for RAID10 | ||
10 | diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S | ||
11 | index 4eee351..486a15a 100644 | ||
12 | --- a/arch/arm/kernel/head.S | ||
13 | +++ b/arch/arm/kernel/head.S | ||
14 | @@ -246,6 +246,7 @@ __create_page_tables: | ||
15 | |||
16 | /* | ||
17 | * Then map boot params address in r2 if specified. | ||
18 | + * We map 2 sections in case the ATAGs/DTB crosses a section boundary. | ||
19 | */ | ||
20 | mov r0, r2, lsr #SECTION_SHIFT | ||
21 | movs r0, r0, lsl #SECTION_SHIFT | ||
22 | @@ -253,6 +254,8 @@ __create_page_tables: | ||
23 | addne r3, r3, #PAGE_OFFSET | ||
24 | addne r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER) | ||
25 | orrne r6, r7, r0 | ||
26 | + strne r6, [r3], #1 << PMD_ORDER | ||
27 | + addne r6, r6, #1 << SECTION_SHIFT | ||
28 | strne r6, [r3] | ||
29 | |||
30 | #ifdef CONFIG_DEBUG_LL | ||
31 | @@ -331,7 +334,7 @@ ENTRY(secondary_startup) | ||
32 | * as it has already been validated by the primary processor. | ||
33 | */ | ||
34 | #ifdef CONFIG_ARM_VIRT_EXT | ||
35 | - bl __hyp_stub_install | ||
36 | + bl __hyp_stub_install_secondary | ||
37 | #endif | ||
38 | safe_svcmode_maskall r9 | ||
39 | |||
40 | diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S | ||
41 | index 65b2417..1315c4c 100644 | ||
42 | --- a/arch/arm/kernel/hyp-stub.S | ||
43 | +++ b/arch/arm/kernel/hyp-stub.S | ||
44 | @@ -99,7 +99,7 @@ ENTRY(__hyp_stub_install_secondary) | ||
45 | * immediately. | ||
46 | */ | ||
47 | compare_cpu_mode_with_primary r4, r5, r6, r7 | ||
48 | - bxne lr | ||
49 | + movne pc, lr | ||
50 | |||
51 | /* | ||
52 | * Once we have given up on one CPU, we do not try to install the | ||
53 | @@ -111,7 +111,7 @@ ENTRY(__hyp_stub_install_secondary) | ||
54 | */ | ||
55 | |||
56 | cmp r4, #HYP_MODE | ||
57 | - bxne lr @ give up if the CPU is not in HYP mode | ||
58 | + movne pc, lr @ give up if the CPU is not in HYP mode | ||
59 | |||
60 | /* | ||
61 | * Configure HSCTLR to set correct exception endianness/instruction set | ||
62 | @@ -120,7 +120,8 @@ ENTRY(__hyp_stub_install_secondary) | ||
63 | * Eventually, CPU-specific code might be needed -- assume not for now | ||
64 | * | ||
65 | * This code relies on the "eret" instruction to synchronize the | ||
66 | - * various coprocessor accesses. | ||
67 | + * various coprocessor accesses. This is done when we switch to SVC | ||
68 | + * (see safe_svcmode_maskall). | ||
69 | */ | ||
70 | @ Now install the hypervisor stub: | ||
71 | adr r7, __hyp_stub_vectors | ||
72 | @@ -155,14 +156,7 @@ THUMB( orr r7, #(1 << 30) ) @ HSCTLR.TE | ||
73 | 1: | ||
74 | #endif | ||
75 | |||
76 | - bic r7, r4, #MODE_MASK | ||
77 | - orr r7, r7, #SVC_MODE | ||
78 | -THUMB( orr r7, r7, #PSR_T_BIT ) | ||
79 | - msr spsr_cxsf, r7 @ This is SPSR_hyp. | ||
80 | - | ||
81 | - __MSR_ELR_HYP(14) @ msr elr_hyp, lr | ||
82 | - __ERET @ return, switching to SVC mode | ||
83 | - @ The boot CPU mode is left in r4. | ||
84 | + bx lr @ The boot CPU mode is left in r4. | ||
85 | ENDPROC(__hyp_stub_install_secondary) | ||
86 | |||
87 | __hyp_stub_do_trap: | ||
88 | @@ -200,7 +194,7 @@ ENDPROC(__hyp_get_vectors) | ||
89 | @ fall through | ||
90 | ENTRY(__hyp_set_vectors) | ||
91 | __HVC(0) | ||
92 | - bx lr | ||
93 | + mov pc, lr | ||
94 | ENDPROC(__hyp_set_vectors) | ||
95 | |||
96 | #ifndef ZIMAGE | ||
97 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c | ||
98 | index 0b32c81..dee51da 100644 | ||
99 | --- a/arch/arm/mach-at91/setup.c | ||
100 | +++ b/arch/arm/mach-at91/setup.c | ||
101 | @@ -104,6 +104,8 @@ static void __init soc_detect(u32 dbgu_base) | ||
102 | switch (socid) { | ||
103 | case ARCH_ID_AT91RM9200: | ||
104 | at91_soc_initdata.type = AT91_SOC_RM9200; | ||
105 | + if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_NONE) | ||
106 | + at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; | ||
107 | at91_boot_soc = at91rm9200_soc; | ||
108 | break; | ||
109 | |||
110 | diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c | ||
111 | index bfcd397..92bb6b4 100644 | ||
112 | --- a/arch/arm/mach-omap2/board-omap4panda.c | ||
113 | +++ b/arch/arm/mach-omap2/board-omap4panda.c | ||
114 | @@ -402,6 +402,12 @@ static struct omap_board_mux board_mux[] __initdata = { | ||
115 | OMAP_PULL_ENA), | ||
116 | OMAP4_MUX(ABE_MCBSP1_FSX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT), | ||
117 | |||
118 | + /* UART2 - BT/FM/GPS shared transport */ | ||
119 | + OMAP4_MUX(UART2_CTS, OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
120 | + OMAP4_MUX(UART2_RTS, OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
121 | + OMAP4_MUX(UART2_RX, OMAP_PIN_INPUT | OMAP_MUX_MODE0), | ||
122 | + OMAP4_MUX(UART2_TX, OMAP_PIN_OUTPUT | OMAP_MUX_MODE0), | ||
123 | + | ||
124 | { .reg_offset = OMAP_MUX_TERMINATOR }, | ||
125 | }; | ||
126 | |||
127 | diff --git a/arch/arm/mach-s3c64xx/mach-crag6410-module.c b/arch/arm/mach-s3c64xx/mach-crag6410-module.c | ||
128 | index 4e3fe57..cbc1b7b 100644 | ||
129 | --- a/arch/arm/mach-s3c64xx/mach-crag6410-module.c | ||
130 | +++ b/arch/arm/mach-s3c64xx/mach-crag6410-module.c | ||
131 | @@ -39,7 +39,7 @@ static struct spi_board_info wm1253_devs[] = { | ||
132 | .bus_num = 0, | ||
133 | .chip_select = 0, | ||
134 | .mode = SPI_MODE_0, | ||
135 | - .irq = S3C_EINT(5), | ||
136 | + .irq = S3C_EINT(4), | ||
137 | .controller_data = &wm0010_spi_csinfo, | ||
138 | }, | ||
139 | }; | ||
140 | diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c | ||
141 | index 58bc3e4..9cb586f 100644 | ||
142 | --- a/arch/arm/mm/dma-mapping.c | ||
143 | +++ b/arch/arm/mm/dma-mapping.c | ||
144 | @@ -776,25 +776,27 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | ||
145 | size_t size, enum dma_data_direction dir, | ||
146 | void (*op)(const void *, size_t, int)) | ||
147 | { | ||
148 | + unsigned long pfn; | ||
149 | + size_t left = size; | ||
150 | + | ||
151 | + pfn = page_to_pfn(page) + offset / PAGE_SIZE; | ||
152 | + offset %= PAGE_SIZE; | ||
153 | + | ||
154 | /* | ||
155 | * A single sg entry may refer to multiple physically contiguous | ||
156 | * pages. But we still need to process highmem pages individually. | ||
157 | * If highmem is not configured then the bulk of this loop gets | ||
158 | * optimized out. | ||
159 | */ | ||
160 | - size_t left = size; | ||
161 | do { | ||
162 | size_t len = left; | ||
163 | void *vaddr; | ||
164 | |||
165 | + page = pfn_to_page(pfn); | ||
166 | + | ||
167 | if (PageHighMem(page)) { | ||
168 | - if (len + offset > PAGE_SIZE) { | ||
169 | - if (offset >= PAGE_SIZE) { | ||
170 | - page += offset / PAGE_SIZE; | ||
171 | - offset %= PAGE_SIZE; | ||
172 | - } | ||
173 | + if (len + offset > PAGE_SIZE) | ||
174 | len = PAGE_SIZE - offset; | ||
175 | - } | ||
176 | vaddr = kmap_high_get(page); | ||
177 | if (vaddr) { | ||
178 | vaddr += offset; | ||
179 | @@ -811,7 +813,7 @@ static void dma_cache_maint_page(struct page *page, unsigned long offset, | ||
180 | op(vaddr, len, dir); | ||
181 | } | ||
182 | offset = 0; | ||
183 | - page++; | ||
184 | + pfn++; | ||
185 | left -= len; | ||
186 | } while (left); | ||
187 | } | ||
188 | diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S | ||
189 | index cc926c9..323ce1a 100644 | ||
190 | --- a/arch/arm/vfp/entry.S | ||
191 | +++ b/arch/arm/vfp/entry.S | ||
192 | @@ -22,7 +22,7 @@ | ||
193 | @ IRQs disabled. | ||
194 | @ | ||
195 | ENTRY(do_vfp) | ||
196 | -#ifdef CONFIG_PREEMPT | ||
197 | +#ifdef CONFIG_PREEMPT_COUNT | ||
198 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
199 | add r11, r4, #1 @ increment it | ||
200 | str r11, [r10, #TI_PREEMPT] | ||
201 | @@ -35,7 +35,7 @@ ENTRY(do_vfp) | ||
202 | ENDPROC(do_vfp) | ||
203 | |||
204 | ENTRY(vfp_null_entry) | ||
205 | -#ifdef CONFIG_PREEMPT | ||
206 | +#ifdef CONFIG_PREEMPT_COUNT | ||
207 | get_thread_info r10 | ||
208 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
209 | sub r11, r4, #1 @ decrement it | ||
210 | @@ -53,7 +53,7 @@ ENDPROC(vfp_null_entry) | ||
211 | |||
212 | __INIT | ||
213 | ENTRY(vfp_testing_entry) | ||
214 | -#ifdef CONFIG_PREEMPT | ||
215 | +#ifdef CONFIG_PREEMPT_COUNT | ||
216 | get_thread_info r10 | ||
217 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
218 | sub r11, r4, #1 @ decrement it | ||
219 | diff --git a/arch/arm/vfp/vfphw.S b/arch/arm/vfp/vfphw.S | ||
220 | index ea0349f..dd5e56f 100644 | ||
221 | --- a/arch/arm/vfp/vfphw.S | ||
222 | +++ b/arch/arm/vfp/vfphw.S | ||
223 | @@ -168,7 +168,7 @@ vfp_hw_state_valid: | ||
224 | @ else it's one 32-bit instruction, so | ||
225 | @ always subtract 4 from the following | ||
226 | @ instruction address. | ||
227 | -#ifdef CONFIG_PREEMPT | ||
228 | +#ifdef CONFIG_PREEMPT_COUNT | ||
229 | get_thread_info r10 | ||
230 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
231 | sub r11, r4, #1 @ decrement it | ||
232 | @@ -192,7 +192,7 @@ look_for_VFP_exceptions: | ||
233 | @ not recognised by VFP | ||
234 | |||
235 | DBGSTR "not VFP" | ||
236 | -#ifdef CONFIG_PREEMPT | ||
237 | +#ifdef CONFIG_PREEMPT_COUNT | ||
238 | get_thread_info r10 | ||
239 | ldr r4, [r10, #TI_PREEMPT] @ get preempt count | ||
240 | sub r11, r4, #1 @ decrement it | ||
241 | diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S | ||
242 | index 56e0ff0..4262aac 100644 | ||
243 | --- a/arch/powerpc/kernel/entry_64.S | ||
244 | +++ b/arch/powerpc/kernel/entry_64.S | ||
245 | @@ -668,6 +668,19 @@ resume_kernel: | ||
246 | ld r4,TI_FLAGS(r9) | ||
247 | andi. r0,r4,_TIF_NEED_RESCHED | ||
248 | bne 1b | ||
249 | + | ||
250 | + /* | ||
251 | + * arch_local_irq_restore() from preempt_schedule_irq above may | ||
252 | + * enable hard interrupt but we really should disable interrupts | ||
253 | + * when we return from the interrupt, and so that we don't get | ||
254 | + * interrupted after loading SRR0/1. | ||
255 | + */ | ||
256 | +#ifdef CONFIG_PPC_BOOK3E | ||
257 | + wrteei 0 | ||
258 | +#else | ||
259 | + ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */ | ||
260 | + mtmsrd r10,1 /* Update machine state */ | ||
261 | +#endif /* CONFIG_PPC_BOOK3E */ | ||
262 | #endif /* CONFIG_PREEMPT */ | ||
263 | |||
264 | .globl fast_exc_return_irq | ||
265 | diff --git a/arch/powerpc/kvm/emulate.c b/arch/powerpc/kvm/emulate.c | ||
266 | index ee04aba..f6ba56f 100644 | ||
267 | --- a/arch/powerpc/kvm/emulate.c | ||
268 | +++ b/arch/powerpc/kvm/emulate.c | ||
269 | @@ -39,6 +39,7 @@ | ||
270 | #define OP_31_XOP_TRAP 4 | ||
271 | #define OP_31_XOP_LWZX 23 | ||
272 | #define OP_31_XOP_TRAP_64 68 | ||
273 | +#define OP_31_XOP_DCBF 86 | ||
274 | #define OP_31_XOP_LBZX 87 | ||
275 | #define OP_31_XOP_STWX 151 | ||
276 | #define OP_31_XOP_STBX 215 | ||
277 | @@ -353,6 +354,7 @@ int kvmppc_emulate_instruction(struct kvm_run *run, struct kvm_vcpu *vcpu) | ||
278 | kvmppc_set_exit_type(vcpu, EMULATED_MTSPR_EXITS); | ||
279 | break; | ||
280 | |||
281 | + case OP_31_XOP_DCBF: | ||
282 | case OP_31_XOP_DCBI: | ||
283 | /* Do nothing. The guest is performing dcbi because | ||
284 | * hardware DMA is not snooped by the dcache, but | ||
285 | diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h | ||
286 | index 2d3b7cb..80d44ff 100644 | ||
287 | --- a/arch/s390/include/asm/pgtable.h | ||
288 | +++ b/arch/s390/include/asm/pgtable.h | ||
289 | @@ -1365,6 +1365,18 @@ static inline void pmdp_invalidate(struct vm_area_struct *vma, | ||
290 | __pmd_idte(address, pmdp); | ||
291 | } | ||
292 | |||
293 | +#define __HAVE_ARCH_PMDP_SET_WRPROTECT | ||
294 | +static inline void pmdp_set_wrprotect(struct mm_struct *mm, | ||
295 | + unsigned long address, pmd_t *pmdp) | ||
296 | +{ | ||
297 | + pmd_t pmd = *pmdp; | ||
298 | + | ||
299 | + if (pmd_write(pmd)) { | ||
300 | + __pmd_idte(address, pmdp); | ||
301 | + set_pmd_at(mm, address, pmdp, pmd_wrprotect(pmd)); | ||
302 | + } | ||
303 | +} | ||
304 | + | ||
305 | static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot) | ||
306 | { | ||
307 | pmd_t __pmd; | ||
308 | diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c | ||
309 | index e87b0ca..ccae7e2 100644 | ||
310 | --- a/arch/x86/boot/compressed/eboot.c | ||
311 | +++ b/arch/x86/boot/compressed/eboot.c | ||
312 | @@ -316,10 +316,9 @@ static efi_status_t setup_gop(struct screen_info *si, efi_guid_t *proto, | ||
313 | * Once we've found a GOP supporting ConOut, | ||
314 | * don't bother looking any further. | ||
315 | */ | ||
316 | + first_gop = gop; | ||
317 | if (conout_found) | ||
318 | break; | ||
319 | - | ||
320 | - first_gop = gop; | ||
321 | } | ||
322 | } | ||
323 | |||
324 | diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S | ||
325 | index aa4aaf1..ccb2f4a 100644 | ||
326 | --- a/arch/x86/boot/compressed/head_32.S | ||
327 | +++ b/arch/x86/boot/compressed/head_32.S | ||
328 | @@ -50,8 +50,10 @@ ENTRY(startup_32) | ||
329 | pushl %eax | ||
330 | pushl %esi | ||
331 | pushl %ecx | ||
332 | + sub $0x4, %esp | ||
333 | |||
334 | .org 0x30,0x90 | ||
335 | + add $0x4, %esp | ||
336 | call efi_main | ||
337 | cmpl $0, %eax | ||
338 | movl %eax, %esi | ||
339 | diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h | ||
340 | index 6e8fdf5..28677c5 100644 | ||
341 | --- a/arch/x86/include/asm/efi.h | ||
342 | +++ b/arch/x86/include/asm/efi.h | ||
343 | @@ -94,6 +94,7 @@ extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | ||
344 | #endif /* CONFIG_X86_32 */ | ||
345 | |||
346 | extern int add_efi_memmap; | ||
347 | +extern unsigned long x86_efi_facility; | ||
348 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); | ||
349 | extern int efi_memblock_x86_reserve_range(void); | ||
350 | extern void efi_call_phys_prelog(void); | ||
351 | diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c | ||
352 | index a7c5661..4929502 100644 | ||
353 | --- a/arch/x86/kernel/msr.c | ||
354 | +++ b/arch/x86/kernel/msr.c | ||
355 | @@ -174,6 +174,9 @@ static int msr_open(struct inode *inode, struct file *file) | ||
356 | unsigned int cpu; | ||
357 | struct cpuinfo_x86 *c; | ||
358 | |||
359 | + if (!capable(CAP_SYS_RAWIO)) | ||
360 | + return -EPERM; | ||
361 | + | ||
362 | cpu = iminor(file->f_path.dentry->d_inode); | ||
363 | if (cpu >= nr_cpu_ids || !cpu_online(cpu)) | ||
364 | return -ENXIO; /* No such CPU */ | ||
365 | diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c | ||
366 | index 4e8ba39..76fa1e9 100644 | ||
367 | --- a/arch/x86/kernel/reboot.c | ||
368 | +++ b/arch/x86/kernel/reboot.c | ||
369 | @@ -584,7 +584,7 @@ static void native_machine_emergency_restart(void) | ||
370 | break; | ||
371 | |||
372 | case BOOT_EFI: | ||
373 | - if (efi_enabled) | ||
374 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | ||
375 | efi.reset_system(reboot_mode ? | ||
376 | EFI_RESET_WARM : | ||
377 | EFI_RESET_COLD, | ||
378 | diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c | ||
379 | index 86c524c..aeacb0e 100644 | ||
380 | --- a/arch/x86/kernel/setup.c | ||
381 | +++ b/arch/x86/kernel/setup.c | ||
382 | @@ -616,6 +616,7 @@ static unsigned reserve_low = CONFIG_X86_RESERVE_LOW << 10; | ||
383 | |||
384 | static bool __init snb_gfx_workaround_needed(void) | ||
385 | { | ||
386 | +#ifdef CONFIG_PCI | ||
387 | int i; | ||
388 | u16 vendor, devid; | ||
389 | static const u16 snb_ids[] = { | ||
390 | @@ -640,6 +641,7 @@ static bool __init snb_gfx_workaround_needed(void) | ||
391 | for (i = 0; i < ARRAY_SIZE(snb_ids); i++) | ||
392 | if (devid == snb_ids[i]) | ||
393 | return true; | ||
394 | +#endif | ||
395 | |||
396 | return false; | ||
397 | } | ||
398 | @@ -809,15 +811,15 @@ void __init setup_arch(char **cmdline_p) | ||
399 | #ifdef CONFIG_EFI | ||
400 | if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | ||
401 | "EL32", 4)) { | ||
402 | - efi_enabled = 1; | ||
403 | - efi_64bit = false; | ||
404 | + set_bit(EFI_BOOT, &x86_efi_facility); | ||
405 | } else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature, | ||
406 | "EL64", 4)) { | ||
407 | - efi_enabled = 1; | ||
408 | - efi_64bit = true; | ||
409 | + set_bit(EFI_BOOT, &x86_efi_facility); | ||
410 | + set_bit(EFI_64BIT, &x86_efi_facility); | ||
411 | } | ||
412 | - if (efi_enabled && efi_memblock_x86_reserve_range()) | ||
413 | - efi_enabled = 0; | ||
414 | + | ||
415 | + if (efi_enabled(EFI_BOOT)) | ||
416 | + efi_memblock_x86_reserve_range(); | ||
417 | #endif | ||
418 | |||
419 | x86_init.oem.arch_setup(); | ||
420 | @@ -890,7 +892,7 @@ void __init setup_arch(char **cmdline_p) | ||
421 | |||
422 | finish_e820_parsing(); | ||
423 | |||
424 | - if (efi_enabled) | ||
425 | + if (efi_enabled(EFI_BOOT)) | ||
426 | efi_init(); | ||
427 | |||
428 | dmi_scan_machine(); | ||
429 | @@ -973,7 +975,7 @@ void __init setup_arch(char **cmdline_p) | ||
430 | * The EFI specification says that boot service code won't be called | ||
431 | * after ExitBootServices(). This is, in fact, a lie. | ||
432 | */ | ||
433 | - if (efi_enabled) | ||
434 | + if (efi_enabled(EFI_MEMMAP)) | ||
435 | efi_reserve_boot_services(); | ||
436 | |||
437 | /* preallocate 4k for mptable mpc */ | ||
438 | @@ -1112,7 +1114,7 @@ void __init setup_arch(char **cmdline_p) | ||
439 | |||
440 | #ifdef CONFIG_VT | ||
441 | #if defined(CONFIG_VGA_CONSOLE) | ||
442 | - if (!efi_enabled || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) | ||
443 | + if (!efi_enabled(EFI_BOOT) || (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY)) | ||
444 | conswitchp = &vga_con; | ||
445 | #elif defined(CONFIG_DUMMY_CONSOLE) | ||
446 | conswitchp = &dummy_con; | ||
447 | @@ -1129,14 +1131,14 @@ void __init setup_arch(char **cmdline_p) | ||
448 | register_refined_jiffies(CLOCK_TICK_RATE); | ||
449 | |||
450 | #ifdef CONFIG_EFI | ||
451 | - /* Once setup is done above, disable efi_enabled on mismatched | ||
452 | - * firmware/kernel archtectures since there is no support for | ||
453 | - * runtime services. | ||
454 | + /* Once setup is done above, unmap the EFI memory map on | ||
455 | + * mismatched firmware/kernel archtectures since there is no | ||
456 | + * support for runtime services. | ||
457 | */ | ||
458 | - if (efi_enabled && IS_ENABLED(CONFIG_X86_64) != efi_64bit) { | ||
459 | + if (efi_enabled(EFI_BOOT) && | ||
460 | + IS_ENABLED(CONFIG_X86_64) != efi_enabled(EFI_64BIT)) { | ||
461 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); | ||
462 | efi_unmap_memmap(); | ||
463 | - efi_enabled = 0; | ||
464 | } | ||
465 | #endif | ||
466 | } | ||
467 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c | ||
468 | index ad44391..77cf009 100644 | ||
469 | --- a/arch/x86/platform/efi/efi.c | ||
470 | +++ b/arch/x86/platform/efi/efi.c | ||
471 | @@ -51,9 +51,6 @@ | ||
472 | |||
473 | #define EFI_DEBUG 1 | ||
474 | |||
475 | -int efi_enabled; | ||
476 | -EXPORT_SYMBOL(efi_enabled); | ||
477 | - | ||
478 | struct efi __read_mostly efi = { | ||
479 | .mps = EFI_INVALID_TABLE_ADDR, | ||
480 | .acpi = EFI_INVALID_TABLE_ADDR, | ||
481 | @@ -69,19 +66,28 @@ EXPORT_SYMBOL(efi); | ||
482 | |||
483 | struct efi_memory_map memmap; | ||
484 | |||
485 | -bool efi_64bit; | ||
486 | - | ||
487 | static struct efi efi_phys __initdata; | ||
488 | static efi_system_table_t efi_systab __initdata; | ||
489 | |||
490 | static inline bool efi_is_native(void) | ||
491 | { | ||
492 | - return IS_ENABLED(CONFIG_X86_64) == efi_64bit; | ||
493 | + return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT); | ||
494 | +} | ||
495 | + | ||
496 | +unsigned long x86_efi_facility; | ||
497 | + | ||
498 | +/* | ||
499 | + * Returns 1 if 'facility' is enabled, 0 otherwise. | ||
500 | + */ | ||
501 | +int efi_enabled(int facility) | ||
502 | +{ | ||
503 | + return test_bit(facility, &x86_efi_facility) != 0; | ||
504 | } | ||
505 | +EXPORT_SYMBOL(efi_enabled); | ||
506 | |||
507 | static int __init setup_noefi(char *arg) | ||
508 | { | ||
509 | - efi_enabled = 0; | ||
510 | + clear_bit(EFI_BOOT, &x86_efi_facility); | ||
511 | return 0; | ||
512 | } | ||
513 | early_param("noefi", setup_noefi); | ||
514 | @@ -426,6 +432,7 @@ void __init efi_reserve_boot_services(void) | ||
515 | |||
516 | void __init efi_unmap_memmap(void) | ||
517 | { | ||
518 | + clear_bit(EFI_MEMMAP, &x86_efi_facility); | ||
519 | if (memmap.map) { | ||
520 | early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size); | ||
521 | memmap.map = NULL; | ||
522 | @@ -460,7 +467,7 @@ void __init efi_free_boot_services(void) | ||
523 | |||
524 | static int __init efi_systab_init(void *phys) | ||
525 | { | ||
526 | - if (efi_64bit) { | ||
527 | + if (efi_enabled(EFI_64BIT)) { | ||
528 | efi_system_table_64_t *systab64; | ||
529 | u64 tmp = 0; | ||
530 | |||
531 | @@ -552,7 +559,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) | ||
532 | void *config_tables, *tablep; | ||
533 | int i, sz; | ||
534 | |||
535 | - if (efi_64bit) | ||
536 | + if (efi_enabled(EFI_64BIT)) | ||
537 | sz = sizeof(efi_config_table_64_t); | ||
538 | else | ||
539 | sz = sizeof(efi_config_table_32_t); | ||
540 | @@ -572,7 +579,7 @@ static int __init efi_config_init(u64 tables, int nr_tables) | ||
541 | efi_guid_t guid; | ||
542 | unsigned long table; | ||
543 | |||
544 | - if (efi_64bit) { | ||
545 | + if (efi_enabled(EFI_64BIT)) { | ||
546 | u64 table64; | ||
547 | guid = ((efi_config_table_64_t *)tablep)->guid; | ||
548 | table64 = ((efi_config_table_64_t *)tablep)->table; | ||
549 | @@ -684,7 +691,6 @@ void __init efi_init(void) | ||
550 | if (boot_params.efi_info.efi_systab_hi || | ||
551 | boot_params.efi_info.efi_memmap_hi) { | ||
552 | pr_info("Table located above 4GB, disabling EFI.\n"); | ||
553 | - efi_enabled = 0; | ||
554 | return; | ||
555 | } | ||
556 | efi_phys.systab = (efi_system_table_t *)boot_params.efi_info.efi_systab; | ||
557 | @@ -694,10 +700,10 @@ void __init efi_init(void) | ||
558 | ((__u64)boot_params.efi_info.efi_systab_hi<<32)); | ||
559 | #endif | ||
560 | |||
561 | - if (efi_systab_init(efi_phys.systab)) { | ||
562 | - efi_enabled = 0; | ||
563 | + if (efi_systab_init(efi_phys.systab)) | ||
564 | return; | ||
565 | - } | ||
566 | + | ||
567 | + set_bit(EFI_SYSTEM_TABLES, &x86_efi_facility); | ||
568 | |||
569 | /* | ||
570 | * Show what we know for posterity | ||
571 | @@ -715,10 +721,10 @@ void __init efi_init(void) | ||
572 | efi.systab->hdr.revision >> 16, | ||
573 | efi.systab->hdr.revision & 0xffff, vendor); | ||
574 | |||
575 | - if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) { | ||
576 | - efi_enabled = 0; | ||
577 | + if (efi_config_init(efi.systab->tables, efi.systab->nr_tables)) | ||
578 | return; | ||
579 | - } | ||
580 | + | ||
581 | + set_bit(EFI_CONFIG_TABLES, &x86_efi_facility); | ||
582 | |||
583 | /* | ||
584 | * Note: We currently don't support runtime services on an EFI | ||
585 | @@ -727,15 +733,17 @@ void __init efi_init(void) | ||
586 | |||
587 | if (!efi_is_native()) | ||
588 | pr_info("No EFI runtime due to 32/64-bit mismatch with kernel\n"); | ||
589 | - else if (efi_runtime_init()) { | ||
590 | - efi_enabled = 0; | ||
591 | - return; | ||
592 | + else { | ||
593 | + if (efi_runtime_init()) | ||
594 | + return; | ||
595 | + set_bit(EFI_RUNTIME_SERVICES, &x86_efi_facility); | ||
596 | } | ||
597 | |||
598 | - if (efi_memmap_init()) { | ||
599 | - efi_enabled = 0; | ||
600 | + if (efi_memmap_init()) | ||
601 | return; | ||
602 | - } | ||
603 | + | ||
604 | + set_bit(EFI_MEMMAP, &x86_efi_facility); | ||
605 | + | ||
606 | #ifdef CONFIG_X86_32 | ||
607 | if (efi_is_native()) { | ||
608 | x86_platform.get_wallclock = efi_get_time; | ||
609 | @@ -941,7 +949,7 @@ void __init efi_enter_virtual_mode(void) | ||
610 | * | ||
611 | * Call EFI services through wrapper functions. | ||
612 | */ | ||
613 | - efi.runtime_version = efi_systab.fw_revision; | ||
614 | + efi.runtime_version = efi_systab.hdr.revision; | ||
615 | efi.get_time = virt_efi_get_time; | ||
616 | efi.set_time = virt_efi_set_time; | ||
617 | efi.get_wakeup_time = virt_efi_get_wakeup_time; | ||
618 | @@ -969,6 +977,9 @@ u32 efi_mem_type(unsigned long phys_addr) | ||
619 | efi_memory_desc_t *md; | ||
620 | void *p; | ||
621 | |||
622 | + if (!efi_enabled(EFI_MEMMAP)) | ||
623 | + return 0; | ||
624 | + | ||
625 | for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { | ||
626 | md = p; | ||
627 | if ((md->phys_addr <= phys_addr) && | ||
628 | diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c | ||
629 | index 95fd505..2b20038 100644 | ||
630 | --- a/arch/x86/platform/efi/efi_64.c | ||
631 | +++ b/arch/x86/platform/efi/efi_64.c | ||
632 | @@ -38,7 +38,7 @@ | ||
633 | #include <asm/cacheflush.h> | ||
634 | #include <asm/fixmap.h> | ||
635 | |||
636 | -static pgd_t save_pgd __initdata; | ||
637 | +static pgd_t *save_pgd __initdata; | ||
638 | static unsigned long efi_flags __initdata; | ||
639 | |||
640 | static void __init early_code_mapping_set_exec(int executable) | ||
641 | @@ -61,12 +61,20 @@ static void __init early_code_mapping_set_exec(int executable) | ||
642 | void __init efi_call_phys_prelog(void) | ||
643 | { | ||
644 | unsigned long vaddress; | ||
645 | + int pgd; | ||
646 | + int n_pgds; | ||
647 | |||
648 | early_code_mapping_set_exec(1); | ||
649 | local_irq_save(efi_flags); | ||
650 | - vaddress = (unsigned long)__va(0x0UL); | ||
651 | - save_pgd = *pgd_offset_k(0x0UL); | ||
652 | - set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress)); | ||
653 | + | ||
654 | + n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT), PGDIR_SIZE); | ||
655 | + save_pgd = kmalloc(n_pgds * sizeof(pgd_t), GFP_KERNEL); | ||
656 | + | ||
657 | + for (pgd = 0; pgd < n_pgds; pgd++) { | ||
658 | + save_pgd[pgd] = *pgd_offset_k(pgd * PGDIR_SIZE); | ||
659 | + vaddress = (unsigned long)__va(pgd * PGDIR_SIZE); | ||
660 | + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), *pgd_offset_k(vaddress)); | ||
661 | + } | ||
662 | __flush_tlb_all(); | ||
663 | } | ||
664 | |||
665 | @@ -75,7 +83,11 @@ void __init efi_call_phys_epilog(void) | ||
666 | /* | ||
667 | * After the lock is released, the original page table is restored. | ||
668 | */ | ||
669 | - set_pgd(pgd_offset_k(0x0UL), save_pgd); | ||
670 | + int pgd; | ||
671 | + int n_pgds = DIV_ROUND_UP((max_pfn << PAGE_SHIFT) , PGDIR_SIZE); | ||
672 | + for (pgd = 0; pgd < n_pgds; pgd++) | ||
673 | + set_pgd(pgd_offset_k(pgd * PGDIR_SIZE), save_pgd[pgd]); | ||
674 | + kfree(save_pgd); | ||
675 | __flush_tlb_all(); | ||
676 | local_irq_restore(efi_flags); | ||
677 | early_code_mapping_set_exec(0); | ||
678 | diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c | ||
679 | index 9eaf708..251435a 100644 | ||
680 | --- a/drivers/acpi/osl.c | ||
681 | +++ b/drivers/acpi/osl.c | ||
682 | @@ -250,7 +250,7 @@ acpi_physical_address __init acpi_os_get_root_pointer(void) | ||
683 | return acpi_rsdp; | ||
684 | #endif | ||
685 | |||
686 | - if (efi_enabled) { | ||
687 | + if (efi_enabled(EFI_CONFIG_TABLES)) { | ||
688 | if (efi.acpi20 != EFI_INVALID_TABLE_ADDR) | ||
689 | return efi.acpi20; | ||
690 | else if (efi.acpi != EFI_INVALID_TABLE_ADDR) | ||
691 | diff --git a/drivers/edac/edac_pci_sysfs.c b/drivers/edac/edac_pci_sysfs.c | ||
692 | index e164c55..1bfb207 100644 | ||
693 | --- a/drivers/edac/edac_pci_sysfs.c | ||
694 | +++ b/drivers/edac/edac_pci_sysfs.c | ||
695 | @@ -256,7 +256,7 @@ static ssize_t edac_pci_dev_store(struct kobject *kobj, | ||
696 | struct edac_pci_dev_attribute *edac_pci_dev; | ||
697 | edac_pci_dev = (struct edac_pci_dev_attribute *)attr; | ||
698 | |||
699 | - if (edac_pci_dev->show) | ||
700 | + if (edac_pci_dev->store) | ||
701 | return edac_pci_dev->store(edac_pci_dev->value, buffer, count); | ||
702 | return -EIO; | ||
703 | } | ||
704 | diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c | ||
705 | index fd3ae62..982f1f5 100644 | ||
706 | --- a/drivers/firmware/dmi_scan.c | ||
707 | +++ b/drivers/firmware/dmi_scan.c | ||
708 | @@ -471,7 +471,7 @@ void __init dmi_scan_machine(void) | ||
709 | char __iomem *p, *q; | ||
710 | int rc; | ||
711 | |||
712 | - if (efi_enabled) { | ||
713 | + if (efi_enabled(EFI_CONFIG_TABLES)) { | ||
714 | if (efi.smbios == EFI_INVALID_TABLE_ADDR) | ||
715 | goto error; | ||
716 | |||
717 | diff --git a/drivers/firmware/efivars.c b/drivers/firmware/efivars.c | ||
718 | index d10c987..bfd8f43 100644 | ||
719 | --- a/drivers/firmware/efivars.c | ||
720 | +++ b/drivers/firmware/efivars.c | ||
721 | @@ -1224,7 +1224,7 @@ efivars_init(void) | ||
722 | printk(KERN_INFO "EFI Variables Facility v%s %s\n", EFIVARS_VERSION, | ||
723 | EFIVARS_DATE); | ||
724 | |||
725 | - if (!efi_enabled) | ||
726 | + if (!efi_enabled(EFI_RUNTIME_SERVICES)) | ||
727 | return 0; | ||
728 | |||
729 | /* For now we'll register the efi directory at /sys/firmware/efi */ | ||
730 | @@ -1262,7 +1262,7 @@ err_put: | ||
731 | static void __exit | ||
732 | efivars_exit(void) | ||
733 | { | ||
734 | - if (efi_enabled) { | ||
735 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) { | ||
736 | unregister_efivars(&__efivars); | ||
737 | kobject_put(efi_kobj); | ||
738 | } | ||
739 | diff --git a/drivers/firmware/iscsi_ibft_find.c b/drivers/firmware/iscsi_ibft_find.c | ||
740 | index 4da4eb9..2224f1d 100644 | ||
741 | --- a/drivers/firmware/iscsi_ibft_find.c | ||
742 | +++ b/drivers/firmware/iscsi_ibft_find.c | ||
743 | @@ -99,7 +99,7 @@ unsigned long __init find_ibft_region(unsigned long *sizep) | ||
744 | /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will | ||
745 | * only use ACPI for this */ | ||
746 | |||
747 | - if (!efi_enabled) | ||
748 | + if (!efi_enabled(EFI_BOOT)) | ||
749 | find_ibft_in_mem(); | ||
750 | |||
751 | if (ibft_addr) { | ||
752 | diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c | ||
753 | index da21b11..3a1a495 100644 | ||
754 | --- a/drivers/gpu/drm/i915/i915_debugfs.c | ||
755 | +++ b/drivers/gpu/drm/i915/i915_debugfs.c | ||
756 | @@ -30,6 +30,7 @@ | ||
757 | #include <linux/debugfs.h> | ||
758 | #include <linux/slab.h> | ||
759 | #include <linux/export.h> | ||
760 | +#include <generated/utsrelease.h> | ||
761 | #include <drm/drmP.h> | ||
762 | #include "intel_drv.h" | ||
763 | #include "intel_ringbuffer.h" | ||
764 | @@ -687,6 +688,7 @@ static int i915_error_state(struct seq_file *m, void *unused) | ||
765 | |||
766 | seq_printf(m, "Time: %ld s %ld us\n", error->time.tv_sec, | ||
767 | error->time.tv_usec); | ||
768 | + seq_printf(m, "Kernel: " UTS_RELEASE); | ||
769 | seq_printf(m, "PCI ID: 0x%04x\n", dev->pci_device); | ||
770 | seq_printf(m, "EIR: 0x%08x\n", error->eir); | ||
771 | seq_printf(m, "IER: 0x%08x\n", error->ier); | ||
772 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
773 | index ecec134..3a43405 100644 | ||
774 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
775 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
776 | @@ -527,6 +527,7 @@ | ||
777 | #define MI_MODE 0x0209c | ||
778 | # define VS_TIMER_DISPATCH (1 << 6) | ||
779 | # define MI_FLUSH_ENABLE (1 << 12) | ||
780 | +# define ASYNC_FLIP_PERF_DISABLE (1 << 14) | ||
781 | |||
782 | #define GEN6_GT_MODE 0x20d0 | ||
783 | #define GEN6_GT_MODE_HI (1 << 9) | ||
784 | diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c | ||
785 | index e87fa47..4e6a2b2 100644 | ||
786 | --- a/drivers/gpu/drm/i915/intel_pm.c | ||
787 | +++ b/drivers/gpu/drm/i915/intel_pm.c | ||
788 | @@ -4018,7 +4018,8 @@ static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv) | ||
789 | DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n"); | ||
790 | |||
791 | I915_WRITE_NOTRACE(FORCEWAKE, 1); | ||
792 | - POSTING_READ(ECOBUS); /* something from same cacheline, but !FORCEWAKE */ | ||
793 | + /* something from same cacheline, but !FORCEWAKE */ | ||
794 | + POSTING_READ(ECOBUS); | ||
795 | |||
796 | if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1), | ||
797 | FORCEWAKE_ACK_TIMEOUT_MS)) | ||
798 | @@ -4041,7 +4042,8 @@ static void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) | ||
799 | DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n"); | ||
800 | |||
801 | I915_WRITE_NOTRACE(FORCEWAKE_MT, _MASKED_BIT_ENABLE(1)); | ||
802 | - POSTING_READ(ECOBUS); /* something from same cacheline, but !FORCEWAKE */ | ||
803 | + /* something from same cacheline, but !FORCEWAKE */ | ||
804 | + POSTING_READ(ECOBUS); | ||
805 | |||
806 | if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1), | ||
807 | FORCEWAKE_ACK_TIMEOUT_MS)) | ||
808 | @@ -4078,14 +4080,16 @@ void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv) | ||
809 | static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv) | ||
810 | { | ||
811 | I915_WRITE_NOTRACE(FORCEWAKE, 0); | ||
812 | - /* gen6_gt_check_fifodbg doubles as the POSTING_READ */ | ||
813 | + /* something from same cacheline, but !FORCEWAKE */ | ||
814 | + POSTING_READ(ECOBUS); | ||
815 | gen6_gt_check_fifodbg(dev_priv); | ||
816 | } | ||
817 | |||
818 | static void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv) | ||
819 | { | ||
820 | I915_WRITE_NOTRACE(FORCEWAKE_MT, _MASKED_BIT_DISABLE(1)); | ||
821 | - /* gen6_gt_check_fifodbg doubles as the POSTING_READ */ | ||
822 | + /* something from same cacheline, but !FORCEWAKE_MT */ | ||
823 | + POSTING_READ(ECOBUS); | ||
824 | gen6_gt_check_fifodbg(dev_priv); | ||
825 | } | ||
826 | |||
827 | @@ -4140,7 +4144,8 @@ static void vlv_force_wake_get(struct drm_i915_private *dev_priv) | ||
828 | static void vlv_force_wake_put(struct drm_i915_private *dev_priv) | ||
829 | { | ||
830 | I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_DISABLE(1)); | ||
831 | - /* The below doubles as a POSTING_READ */ | ||
832 | + /* something from same cacheline, but !FORCEWAKE_VLV */ | ||
833 | + POSTING_READ(FORCEWAKE_ACK_VLV); | ||
834 | gen6_gt_check_fifodbg(dev_priv); | ||
835 | } | ||
836 | |||
837 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
838 | index ecbc5c5..4b33f2d 100644 | ||
839 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
840 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
841 | @@ -505,13 +505,25 @@ static int init_render_ring(struct intel_ring_buffer *ring) | ||
842 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
843 | int ret = init_ring_common(ring); | ||
844 | |||
845 | - if (INTEL_INFO(dev)->gen > 3) { | ||
846 | + if (INTEL_INFO(dev)->gen > 3) | ||
847 | I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(VS_TIMER_DISPATCH)); | ||
848 | - if (IS_GEN7(dev)) | ||
849 | - I915_WRITE(GFX_MODE_GEN7, | ||
850 | - _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) | | ||
851 | - _MASKED_BIT_ENABLE(GFX_REPLAY_MODE)); | ||
852 | - } | ||
853 | + | ||
854 | + /* We need to disable the AsyncFlip performance optimisations in order | ||
855 | + * to use MI_WAIT_FOR_EVENT within the CS. It should already be | ||
856 | + * programmed to '1' on all products. | ||
857 | + */ | ||
858 | + if (INTEL_INFO(dev)->gen >= 6) | ||
859 | + I915_WRITE(MI_MODE, _MASKED_BIT_ENABLE(ASYNC_FLIP_PERF_DISABLE)); | ||
860 | + | ||
861 | + /* Required for the hardware to program scanline values for waiting */ | ||
862 | + if (INTEL_INFO(dev)->gen == 6) | ||
863 | + I915_WRITE(GFX_MODE, | ||
864 | + _MASKED_BIT_ENABLE(GFX_TLB_INVALIDATE_ALWAYS)); | ||
865 | + | ||
866 | + if (IS_GEN7(dev)) | ||
867 | + I915_WRITE(GFX_MODE_GEN7, | ||
868 | + _MASKED_BIT_DISABLE(GFX_TLB_INVALIDATE_ALWAYS) | | ||
869 | + _MASKED_BIT_ENABLE(GFX_REPLAY_MODE)); | ||
870 | |||
871 | if (INTEL_INFO(dev)->gen >= 5) { | ||
872 | ret = init_pipe_control(ring); | ||
873 | diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c | ||
874 | index dc8d15a..e797080 100644 | ||
875 | --- a/drivers/gpu/drm/radeon/radeon_cs.c | ||
876 | +++ b/drivers/gpu/drm/radeon/radeon_cs.c | ||
877 | @@ -271,8 +271,10 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | ||
878 | p->chunks[p->chunk_ib_idx].kpage[1] = kmalloc(PAGE_SIZE, GFP_KERNEL); | ||
879 | if (p->chunks[p->chunk_ib_idx].kpage[0] == NULL || | ||
880 | p->chunks[p->chunk_ib_idx].kpage[1] == NULL) { | ||
881 | - kfree(p->chunks[i].kpage[0]); | ||
882 | - kfree(p->chunks[i].kpage[1]); | ||
883 | + kfree(p->chunks[p->chunk_ib_idx].kpage[0]); | ||
884 | + kfree(p->chunks[p->chunk_ib_idx].kpage[1]); | ||
885 | + p->chunks[p->chunk_ib_idx].kpage[0] = NULL; | ||
886 | + p->chunks[p->chunk_ib_idx].kpage[1] = NULL; | ||
887 | return -ENOMEM; | ||
888 | } | ||
889 | } | ||
890 | diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
891 | index 0fe56c9..cd1f151 100644 | ||
892 | --- a/drivers/gpu/drm/radeon/radeon_cursor.c | ||
893 | +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | ||
894 | @@ -240,7 +240,8 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, | ||
895 | y = 0; | ||
896 | } | ||
897 | |||
898 | - if (ASIC_IS_AVIVO(rdev)) { | ||
899 | + /* fixed on DCE6 and newer */ | ||
900 | + if (ASIC_IS_AVIVO(rdev) && !ASIC_IS_DCE6(rdev)) { | ||
901 | int i = 0; | ||
902 | struct drm_crtc *crtc_p; | ||
903 | |||
904 | diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c | ||
905 | index ad4c973..008d645 100644 | ||
906 | --- a/drivers/gpu/drm/radeon/radeon_device.c | ||
907 | +++ b/drivers/gpu/drm/radeon/radeon_device.c | ||
908 | @@ -429,7 +429,8 @@ bool radeon_card_posted(struct radeon_device *rdev) | ||
909 | { | ||
910 | uint32_t reg; | ||
911 | |||
912 | - if (efi_enabled && rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) | ||
913 | + if (efi_enabled(EFI_BOOT) && | ||
914 | + rdev->pdev->subsystem_vendor == PCI_VENDOR_ID_APPLE) | ||
915 | return false; | ||
916 | |||
917 | /* first check CRTCs */ | ||
918 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c | ||
919 | index 2bddddd..6477849 100644 | ||
920 | --- a/drivers/gpu/drm/radeon/radeon_display.c | ||
921 | +++ b/drivers/gpu/drm/radeon/radeon_display.c | ||
922 | @@ -1118,7 +1118,7 @@ radeon_user_framebuffer_create(struct drm_device *dev, | ||
923 | if (ret) { | ||
924 | kfree(radeon_fb); | ||
925 | drm_gem_object_unreference_unlocked(obj); | ||
926 | - return NULL; | ||
927 | + return ERR_PTR(ret); | ||
928 | } | ||
929 | |||
930 | return &radeon_fb->base; | ||
931 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h | ||
932 | index 1ef9a9e..7a845c0 100644 | ||
933 | --- a/drivers/hid/hid-ids.h | ||
934 | +++ b/drivers/hid/hid-ids.h | ||
935 | @@ -305,6 +305,9 @@ | ||
936 | #define USB_VENDOR_ID_EZKEY 0x0518 | ||
937 | #define USB_DEVICE_ID_BTC_8193 0x0002 | ||
938 | |||
939 | +#define USB_VENDOR_ID_FORMOSA 0x147a | ||
940 | +#define USB_DEVICE_ID_FORMOSA_IR_RECEIVER 0xe03e | ||
941 | + | ||
942 | #define USB_VENDOR_ID_FREESCALE 0x15A2 | ||
943 | #define USB_DEVICE_ID_FREESCALE_MX28 0x004F | ||
944 | |||
945 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c | ||
946 | index 0a1429f..29736e9 100644 | ||
947 | --- a/drivers/hid/usbhid/hid-quirks.c | ||
948 | +++ b/drivers/hid/usbhid/hid-quirks.c | ||
949 | @@ -70,6 +70,7 @@ static const struct hid_blacklist { | ||
950 | { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET }, | ||
951 | { USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET }, | ||
952 | { USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_TS2700, HID_QUIRK_NOGET }, | ||
953 | + { USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS }, | ||
954 | { USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET }, | ||
955 | { USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET }, | ||
956 | { USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_OPTICAL_TOUCH_SCREEN, HID_QUIRK_NO_INIT_REPORTS }, | ||
957 | diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c | ||
958 | index 81837b0..faf10ba 100644 | ||
959 | --- a/drivers/iommu/amd_iommu_init.c | ||
960 | +++ b/drivers/iommu/amd_iommu_init.c | ||
961 | @@ -975,6 +975,38 @@ static void __init free_iommu_all(void) | ||
962 | } | ||
963 | |||
964 | /* | ||
965 | + * Family15h Model 10h-1fh erratum 746 (IOMMU Logging May Stall Translations) | ||
966 | + * Workaround: | ||
967 | + * BIOS should disable L2B micellaneous clock gating by setting | ||
968 | + * L2_L2B_CK_GATE_CONTROL[CKGateL2BMiscDisable](D0F2xF4_x90[2]) = 1b | ||
969 | + */ | ||
970 | +static void __init amd_iommu_erratum_746_workaround(struct amd_iommu *iommu) | ||
971 | +{ | ||
972 | + u32 value; | ||
973 | + | ||
974 | + if ((boot_cpu_data.x86 != 0x15) || | ||
975 | + (boot_cpu_data.x86_model < 0x10) || | ||
976 | + (boot_cpu_data.x86_model > 0x1f)) | ||
977 | + return; | ||
978 | + | ||
979 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90); | ||
980 | + pci_read_config_dword(iommu->dev, 0xf4, &value); | ||
981 | + | ||
982 | + if (value & BIT(2)) | ||
983 | + return; | ||
984 | + | ||
985 | + /* Select NB indirect register 0x90 and enable writing */ | ||
986 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90 | (1 << 8)); | ||
987 | + | ||
988 | + pci_write_config_dword(iommu->dev, 0xf4, value | 0x4); | ||
989 | + pr_info("AMD-Vi: Applying erratum 746 workaround for IOMMU at %s\n", | ||
990 | + dev_name(&iommu->dev->dev)); | ||
991 | + | ||
992 | + /* Clear the enable writing bit */ | ||
993 | + pci_write_config_dword(iommu->dev, 0xf0, 0x90); | ||
994 | +} | ||
995 | + | ||
996 | +/* | ||
997 | * This function clues the initialization function for one IOMMU | ||
998 | * together and also allocates the command buffer and programs the | ||
999 | * hardware. It does NOT enable the IOMMU. This is done afterwards. | ||
1000 | @@ -1172,6 +1204,8 @@ static int iommu_init_pci(struct amd_iommu *iommu) | ||
1001 | iommu->stored_l2[i] = iommu_read_l2(iommu, i); | ||
1002 | } | ||
1003 | |||
1004 | + amd_iommu_erratum_746_workaround(iommu); | ||
1005 | + | ||
1006 | return pci_enable_device(iommu->dev); | ||
1007 | } | ||
1008 | |||
1009 | diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c | ||
1010 | index c2c07a4..be3d7dd 100644 | ||
1011 | --- a/drivers/iommu/intel-iommu.c | ||
1012 | +++ b/drivers/iommu/intel-iommu.c | ||
1013 | @@ -4234,6 +4234,21 @@ static struct iommu_ops intel_iommu_ops = { | ||
1014 | .pgsize_bitmap = INTEL_IOMMU_PGSIZES, | ||
1015 | }; | ||
1016 | |||
1017 | +static void __devinit quirk_iommu_g4x_gfx(struct pci_dev *dev) | ||
1018 | +{ | ||
1019 | + /* G4x/GM45 integrated gfx dmar support is totally busted. */ | ||
1020 | + printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n"); | ||
1021 | + dmar_map_gfx = 0; | ||
1022 | +} | ||
1023 | + | ||
1024 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_g4x_gfx); | ||
1025 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e00, quirk_iommu_g4x_gfx); | ||
1026 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e10, quirk_iommu_g4x_gfx); | ||
1027 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e20, quirk_iommu_g4x_gfx); | ||
1028 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e30, quirk_iommu_g4x_gfx); | ||
1029 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e40, quirk_iommu_g4x_gfx); | ||
1030 | +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e90, quirk_iommu_g4x_gfx); | ||
1031 | + | ||
1032 | static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | ||
1033 | { | ||
1034 | /* | ||
1035 | @@ -4242,12 +4257,6 @@ static void __devinit quirk_iommu_rwbf(struct pci_dev *dev) | ||
1036 | */ | ||
1037 | printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n"); | ||
1038 | rwbf_quirk = 1; | ||
1039 | - | ||
1040 | - /* https://bugzilla.redhat.com/show_bug.cgi?id=538163 */ | ||
1041 | - if (dev->revision == 0x07) { | ||
1042 | - printk(KERN_INFO "DMAR: Disabling IOMMU for graphics on this chipset\n"); | ||
1043 | - dmar_map_gfx = 0; | ||
1044 | - } | ||
1045 | } | ||
1046 | |||
1047 | DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf); | ||
1048 | diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c | ||
1049 | index 45d94a7..3235723 100644 | ||
1050 | --- a/drivers/md/dm-raid.c | ||
1051 | +++ b/drivers/md/dm-raid.c | ||
1052 | @@ -338,24 +338,22 @@ static int validate_region_size(struct raid_set *rs, unsigned long region_size) | ||
1053 | } | ||
1054 | |||
1055 | /* | ||
1056 | - * validate_rebuild_devices | ||
1057 | + * validate_raid_redundancy | ||
1058 | * @rs | ||
1059 | * | ||
1060 | - * Determine if the devices specified for rebuild can result in a valid | ||
1061 | - * usable array that is capable of rebuilding the given devices. | ||
1062 | + * Determine if there are enough devices in the array that haven't | ||
1063 | + * failed (or are being rebuilt) to form a usable array. | ||
1064 | * | ||
1065 | * Returns: 0 on success, -EINVAL on failure. | ||
1066 | */ | ||
1067 | -static int validate_rebuild_devices(struct raid_set *rs) | ||
1068 | +static int validate_raid_redundancy(struct raid_set *rs) | ||
1069 | { | ||
1070 | unsigned i, rebuild_cnt = 0; | ||
1071 | unsigned rebuilds_per_group, copies, d; | ||
1072 | |||
1073 | - if (!(rs->print_flags & DMPF_REBUILD)) | ||
1074 | - return 0; | ||
1075 | - | ||
1076 | for (i = 0; i < rs->md.raid_disks; i++) | ||
1077 | - if (!test_bit(In_sync, &rs->dev[i].rdev.flags)) | ||
1078 | + if (!test_bit(In_sync, &rs->dev[i].rdev.flags) || | ||
1079 | + !rs->dev[i].rdev.sb_page) | ||
1080 | rebuild_cnt++; | ||
1081 | |||
1082 | switch (rs->raid_type->level) { | ||
1083 | @@ -391,27 +389,24 @@ static int validate_rebuild_devices(struct raid_set *rs) | ||
1084 | * A A B B C | ||
1085 | * C D D E E | ||
1086 | */ | ||
1087 | - rebuilds_per_group = 0; | ||
1088 | for (i = 0; i < rs->md.raid_disks * copies; i++) { | ||
1089 | + if (!(i % copies)) | ||
1090 | + rebuilds_per_group = 0; | ||
1091 | d = i % rs->md.raid_disks; | ||
1092 | - if (!test_bit(In_sync, &rs->dev[d].rdev.flags) && | ||
1093 | + if ((!rs->dev[d].rdev.sb_page || | ||
1094 | + !test_bit(In_sync, &rs->dev[d].rdev.flags)) && | ||
1095 | (++rebuilds_per_group >= copies)) | ||
1096 | goto too_many; | ||
1097 | - if (!((i + 1) % copies)) | ||
1098 | - rebuilds_per_group = 0; | ||
1099 | } | ||
1100 | break; | ||
1101 | default: | ||
1102 | - DMERR("The rebuild parameter is not supported for %s", | ||
1103 | - rs->raid_type->name); | ||
1104 | - rs->ti->error = "Rebuild not supported for this RAID type"; | ||
1105 | - return -EINVAL; | ||
1106 | + if (rebuild_cnt) | ||
1107 | + return -EINVAL; | ||
1108 | } | ||
1109 | |||
1110 | return 0; | ||
1111 | |||
1112 | too_many: | ||
1113 | - rs->ti->error = "Too many rebuild devices specified"; | ||
1114 | return -EINVAL; | ||
1115 | } | ||
1116 | |||
1117 | @@ -662,9 +657,6 @@ static int parse_raid_params(struct raid_set *rs, char **argv, | ||
1118 | } | ||
1119 | rs->md.dev_sectors = sectors_per_dev; | ||
1120 | |||
1121 | - if (validate_rebuild_devices(rs)) | ||
1122 | - return -EINVAL; | ||
1123 | - | ||
1124 | /* Assume there are no metadata devices until the drives are parsed */ | ||
1125 | rs->md.persistent = 0; | ||
1126 | rs->md.external = 1; | ||
1127 | @@ -993,28 +985,10 @@ static int super_validate(struct mddev *mddev, struct md_rdev *rdev) | ||
1128 | static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | ||
1129 | { | ||
1130 | int ret; | ||
1131 | - unsigned redundancy = 0; | ||
1132 | struct raid_dev *dev; | ||
1133 | struct md_rdev *rdev, *tmp, *freshest; | ||
1134 | struct mddev *mddev = &rs->md; | ||
1135 | |||
1136 | - switch (rs->raid_type->level) { | ||
1137 | - case 1: | ||
1138 | - redundancy = rs->md.raid_disks - 1; | ||
1139 | - break; | ||
1140 | - case 4: | ||
1141 | - case 5: | ||
1142 | - case 6: | ||
1143 | - redundancy = rs->raid_type->parity_devs; | ||
1144 | - break; | ||
1145 | - case 10: | ||
1146 | - redundancy = raid10_md_layout_to_copies(mddev->layout) - 1; | ||
1147 | - break; | ||
1148 | - default: | ||
1149 | - ti->error = "Unknown RAID type"; | ||
1150 | - return -EINVAL; | ||
1151 | - } | ||
1152 | - | ||
1153 | freshest = NULL; | ||
1154 | rdev_for_each_safe(rdev, tmp, mddev) { | ||
1155 | /* | ||
1156 | @@ -1043,44 +1017,43 @@ static int analyse_superblocks(struct dm_target *ti, struct raid_set *rs) | ||
1157 | break; | ||
1158 | default: | ||
1159 | dev = container_of(rdev, struct raid_dev, rdev); | ||
1160 | - if (redundancy--) { | ||
1161 | - if (dev->meta_dev) | ||
1162 | - dm_put_device(ti, dev->meta_dev); | ||
1163 | - | ||
1164 | - dev->meta_dev = NULL; | ||
1165 | - rdev->meta_bdev = NULL; | ||
1166 | + if (dev->meta_dev) | ||
1167 | + dm_put_device(ti, dev->meta_dev); | ||
1168 | |||
1169 | - if (rdev->sb_page) | ||
1170 | - put_page(rdev->sb_page); | ||
1171 | + dev->meta_dev = NULL; | ||
1172 | + rdev->meta_bdev = NULL; | ||
1173 | |||
1174 | - rdev->sb_page = NULL; | ||
1175 | + if (rdev->sb_page) | ||
1176 | + put_page(rdev->sb_page); | ||
1177 | |||
1178 | - rdev->sb_loaded = 0; | ||
1179 | + rdev->sb_page = NULL; | ||
1180 | |||
1181 | - /* | ||
1182 | - * We might be able to salvage the data device | ||
1183 | - * even though the meta device has failed. For | ||
1184 | - * now, we behave as though '- -' had been | ||
1185 | - * set for this device in the table. | ||
1186 | - */ | ||
1187 | - if (dev->data_dev) | ||
1188 | - dm_put_device(ti, dev->data_dev); | ||
1189 | + rdev->sb_loaded = 0; | ||
1190 | |||
1191 | - dev->data_dev = NULL; | ||
1192 | - rdev->bdev = NULL; | ||
1193 | + /* | ||
1194 | + * We might be able to salvage the data device | ||
1195 | + * even though the meta device has failed. For | ||
1196 | + * now, we behave as though '- -' had been | ||
1197 | + * set for this device in the table. | ||
1198 | + */ | ||
1199 | + if (dev->data_dev) | ||
1200 | + dm_put_device(ti, dev->data_dev); | ||
1201 | |||
1202 | - list_del(&rdev->same_set); | ||
1203 | + dev->data_dev = NULL; | ||
1204 | + rdev->bdev = NULL; | ||
1205 | |||
1206 | - continue; | ||
1207 | - } | ||
1208 | - ti->error = "Failed to load superblock"; | ||
1209 | - return ret; | ||
1210 | + list_del(&rdev->same_set); | ||
1211 | } | ||
1212 | } | ||
1213 | |||
1214 | if (!freshest) | ||
1215 | return 0; | ||
1216 | |||
1217 | + if (validate_raid_redundancy(rs)) { | ||
1218 | + rs->ti->error = "Insufficient redundancy to activate array"; | ||
1219 | + return -EINVAL; | ||
1220 | + } | ||
1221 | + | ||
1222 | /* | ||
1223 | * Validation of the freshest device provides the source of | ||
1224 | * validation for the remaining devices. | ||
1225 | @@ -1430,7 +1403,7 @@ static void raid_resume(struct dm_target *ti) | ||
1226 | |||
1227 | static struct target_type raid_target = { | ||
1228 | .name = "raid", | ||
1229 | - .version = {1, 3, 1}, | ||
1230 | + .version = {1, 3, 2}, | ||
1231 | .module = THIS_MODULE, | ||
1232 | .ctr = raid_ctr, | ||
1233 | .dtr = raid_dtr, | ||
1234 | diff --git a/drivers/mfd/tc3589x.c b/drivers/mfd/tc3589x.c | ||
1235 | index 8f4c853..4678156 100644 | ||
1236 | --- a/drivers/mfd/tc3589x.c | ||
1237 | +++ b/drivers/mfd/tc3589x.c | ||
1238 | @@ -219,25 +219,18 @@ static void tc3589x_irq_unmap(struct irq_domain *d, unsigned int virq) | ||
1239 | } | ||
1240 | |||
1241 | static struct irq_domain_ops tc3589x_irq_ops = { | ||
1242 | - .map = tc3589x_irq_map, | ||
1243 | + .map = tc3589x_irq_map, | ||
1244 | .unmap = tc3589x_irq_unmap, | ||
1245 | - .xlate = irq_domain_xlate_twocell, | ||
1246 | + .xlate = irq_domain_xlate_twocell, | ||
1247 | }; | ||
1248 | |||
1249 | static int tc3589x_irq_init(struct tc3589x *tc3589x, struct device_node *np) | ||
1250 | { | ||
1251 | int base = tc3589x->irq_base; | ||
1252 | |||
1253 | - if (base) { | ||
1254 | - tc3589x->domain = irq_domain_add_legacy( | ||
1255 | - NULL, TC3589x_NR_INTERNAL_IRQS, base, | ||
1256 | - 0, &tc3589x_irq_ops, tc3589x); | ||
1257 | - } | ||
1258 | - else { | ||
1259 | - tc3589x->domain = irq_domain_add_linear( | ||
1260 | - np, TC3589x_NR_INTERNAL_IRQS, | ||
1261 | - &tc3589x_irq_ops, tc3589x); | ||
1262 | - } | ||
1263 | + tc3589x->domain = irq_domain_add_simple( | ||
1264 | + np, TC3589x_NR_INTERNAL_IRQS, base, | ||
1265 | + &tc3589x_irq_ops, tc3589x); | ||
1266 | |||
1267 | if (!tc3589x->domain) { | ||
1268 | dev_err(tc3589x->dev, "Failed to create irqdomain\n"); | ||
1269 | diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c | ||
1270 | index e5180df..3391bdd 100644 | ||
1271 | --- a/drivers/net/can/c_can/c_can.c | ||
1272 | +++ b/drivers/net/can/c_can/c_can.c | ||
1273 | @@ -954,7 +954,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | ||
1274 | break; | ||
1275 | case LEC_ACK_ERROR: | ||
1276 | netdev_dbg(dev, "ack error\n"); | ||
1277 | - cf->data[2] |= (CAN_ERR_PROT_LOC_ACK | | ||
1278 | + cf->data[3] |= (CAN_ERR_PROT_LOC_ACK | | ||
1279 | CAN_ERR_PROT_LOC_ACK_DEL); | ||
1280 | break; | ||
1281 | case LEC_BIT1_ERROR: | ||
1282 | @@ -967,7 +967,7 @@ static int c_can_handle_bus_err(struct net_device *dev, | ||
1283 | break; | ||
1284 | case LEC_CRC_ERROR: | ||
1285 | netdev_dbg(dev, "CRC error\n"); | ||
1286 | - cf->data[2] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1287 | + cf->data[3] |= (CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1288 | CAN_ERR_PROT_LOC_CRC_DEL); | ||
1289 | break; | ||
1290 | default: | ||
1291 | diff --git a/drivers/net/can/pch_can.c b/drivers/net/can/pch_can.c | ||
1292 | index 48b3d62..7a43d4d 100644 | ||
1293 | --- a/drivers/net/can/pch_can.c | ||
1294 | +++ b/drivers/net/can/pch_can.c | ||
1295 | @@ -560,7 +560,7 @@ static void pch_can_error(struct net_device *ndev, u32 status) | ||
1296 | stats->rx_errors++; | ||
1297 | break; | ||
1298 | case PCH_CRC_ERR: | ||
1299 | - cf->data[2] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1300 | + cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1301 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
1302 | priv->can.can_stats.bus_error++; | ||
1303 | stats->rx_errors++; | ||
1304 | diff --git a/drivers/net/can/ti_hecc.c b/drivers/net/can/ti_hecc.c | ||
1305 | index 9ded21e..44996a9 100644 | ||
1306 | --- a/drivers/net/can/ti_hecc.c | ||
1307 | +++ b/drivers/net/can/ti_hecc.c | ||
1308 | @@ -746,12 +746,12 @@ static int ti_hecc_error(struct net_device *ndev, int int_status, | ||
1309 | } | ||
1310 | if (err_status & HECC_CANES_CRCE) { | ||
1311 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_CRCE); | ||
1312 | - cf->data[2] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1313 | + cf->data[3] |= CAN_ERR_PROT_LOC_CRC_SEQ | | ||
1314 | CAN_ERR_PROT_LOC_CRC_DEL; | ||
1315 | } | ||
1316 | if (err_status & HECC_CANES_ACKE) { | ||
1317 | hecc_set_bit(priv, HECC_CANES, HECC_CANES_ACKE); | ||
1318 | - cf->data[2] |= CAN_ERR_PROT_LOC_ACK | | ||
1319 | + cf->data[3] |= CAN_ERR_PROT_LOC_ACK | | ||
1320 | CAN_ERR_PROT_LOC_ACK_DEL; | ||
1321 | } | ||
1322 | } | ||
1323 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | ||
1324 | index 759f5f5..8a38ff2 100644 | ||
1325 | --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c | ||
1326 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | ||
1327 | @@ -588,30 +588,17 @@ static void ar9003_hw_init_bb(struct ath_hw *ah, | ||
1328 | |||
1329 | static void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx) | ||
1330 | { | ||
1331 | - switch (rx) { | ||
1332 | - case 0x5: | ||
1333 | + if (ah->caps.tx_chainmask == 5 || ah->caps.rx_chainmask == 5) | ||
1334 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
1335 | AR_PHY_SWAP_ALT_CHAIN); | ||
1336 | - case 0x3: | ||
1337 | - case 0x1: | ||
1338 | - case 0x2: | ||
1339 | - case 0x7: | ||
1340 | - REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx); | ||
1341 | - REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx); | ||
1342 | - break; | ||
1343 | - default: | ||
1344 | - break; | ||
1345 | - } | ||
1346 | + | ||
1347 | + REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx); | ||
1348 | + REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx); | ||
1349 | |||
1350 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) && (tx == 0x7)) | ||
1351 | - REG_WRITE(ah, AR_SELFGEN_MASK, 0x3); | ||
1352 | - else | ||
1353 | - REG_WRITE(ah, AR_SELFGEN_MASK, tx); | ||
1354 | + tx = 3; | ||
1355 | |||
1356 | - if (tx == 0x5) { | ||
1357 | - REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
1358 | - AR_PHY_SWAP_ALT_CHAIN); | ||
1359 | - } | ||
1360 | + REG_WRITE(ah, AR_SELFGEN_MASK, tx); | ||
1361 | } | ||
1362 | |||
1363 | /* | ||
1364 | diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
1365 | index dfe6a47..d7897dcf 100644 | ||
1366 | --- a/drivers/net/wireless/ath/ath9k/ath9k.h | ||
1367 | +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | ||
1368 | @@ -315,7 +315,6 @@ struct ath_rx { | ||
1369 | u32 *rxlink; | ||
1370 | u32 num_pkts; | ||
1371 | unsigned int rxfilter; | ||
1372 | - spinlock_t rxbuflock; | ||
1373 | struct list_head rxbuf; | ||
1374 | struct ath_descdma rxdma; | ||
1375 | struct ath_buf *rx_bufptr; | ||
1376 | @@ -326,7 +325,6 @@ struct ath_rx { | ||
1377 | |||
1378 | int ath_startrecv(struct ath_softc *sc); | ||
1379 | bool ath_stoprecv(struct ath_softc *sc); | ||
1380 | -void ath_flushrecv(struct ath_softc *sc); | ||
1381 | u32 ath_calcrxfilter(struct ath_softc *sc); | ||
1382 | int ath_rx_init(struct ath_softc *sc, int nbufs); | ||
1383 | void ath_rx_cleanup(struct ath_softc *sc); | ||
1384 | @@ -630,7 +628,6 @@ void ath_ant_comb_update(struct ath_softc *sc); | ||
1385 | enum sc_op_flags { | ||
1386 | SC_OP_INVALID, | ||
1387 | SC_OP_BEACONS, | ||
1388 | - SC_OP_RXFLUSH, | ||
1389 | SC_OP_ANI_RUN, | ||
1390 | SC_OP_PRIM_STA_VIF, | ||
1391 | SC_OP_HW_RESET, | ||
1392 | diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c | ||
1393 | index 1b48414..4b2dabf 100644 | ||
1394 | --- a/drivers/net/wireless/ath/ath9k/beacon.c | ||
1395 | +++ b/drivers/net/wireless/ath/ath9k/beacon.c | ||
1396 | @@ -147,6 +147,7 @@ static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw, | ||
1397 | skb->len, DMA_TO_DEVICE); | ||
1398 | dev_kfree_skb_any(skb); | ||
1399 | bf->bf_buf_addr = 0; | ||
1400 | + bf->bf_mpdu = NULL; | ||
1401 | } | ||
1402 | |||
1403 | skb = ieee80211_beacon_get(hw, vif); | ||
1404 | @@ -359,7 +360,6 @@ void ath9k_beacon_tasklet(unsigned long data) | ||
1405 | return; | ||
1406 | |||
1407 | bf = ath9k_beacon_generate(sc->hw, vif); | ||
1408 | - WARN_ON(!bf); | ||
1409 | |||
1410 | if (sc->beacon.bmisscnt != 0) { | ||
1411 | ath_dbg(common, BSTUCK, "resume beacon xmit after %u misses\n", | ||
1412 | diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c | ||
1413 | index 6727b56..774e95b 100644 | ||
1414 | --- a/drivers/net/wireless/ath/ath9k/debug.c | ||
1415 | +++ b/drivers/net/wireless/ath/ath9k/debug.c | ||
1416 | @@ -973,7 +973,6 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf, | ||
1417 | RXS_ERR("RX-LENGTH-ERR", rx_len_err); | ||
1418 | RXS_ERR("RX-OOM-ERR", rx_oom_err); | ||
1419 | RXS_ERR("RX-RATE-ERR", rx_rate_err); | ||
1420 | - RXS_ERR("RX-DROP-RXFLUSH", rx_drop_rxflush); | ||
1421 | RXS_ERR("RX-TOO-MANY-FRAGS", rx_too_many_frags_err); | ||
1422 | |||
1423 | PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN); | ||
1424 | diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h | ||
1425 | index 2ed9785..b9d95c7 100644 | ||
1426 | --- a/drivers/net/wireless/ath/ath9k/debug.h | ||
1427 | +++ b/drivers/net/wireless/ath/ath9k/debug.h | ||
1428 | @@ -200,7 +200,6 @@ struct ath_tx_stats { | ||
1429 | * @rx_oom_err: No. of frames dropped due to OOM issues. | ||
1430 | * @rx_rate_err: No. of frames dropped due to rate errors. | ||
1431 | * @rx_too_many_frags_err: Frames dropped due to too-many-frags received. | ||
1432 | - * @rx_drop_rxflush: No. of frames dropped due to RX-FLUSH. | ||
1433 | * @rx_beacons: No. of beacons received. | ||
1434 | * @rx_frags: No. of rx-fragements received. | ||
1435 | */ | ||
1436 | @@ -219,7 +218,6 @@ struct ath_rx_stats { | ||
1437 | u32 rx_oom_err; | ||
1438 | u32 rx_rate_err; | ||
1439 | u32 rx_too_many_frags_err; | ||
1440 | - u32 rx_drop_rxflush; | ||
1441 | u32 rx_beacons; | ||
1442 | u32 rx_frags; | ||
1443 | }; | ||
1444 | diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
1445 | index 4a9570d..aac4a40 100644 | ||
1446 | --- a/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
1447 | +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | ||
1448 | @@ -344,6 +344,8 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle, | ||
1449 | endpoint->ep_callbacks.tx(endpoint->ep_callbacks.priv, | ||
1450 | skb, htc_hdr->endpoint_id, | ||
1451 | txok); | ||
1452 | + } else { | ||
1453 | + kfree_skb(skb); | ||
1454 | } | ||
1455 | } | ||
1456 | |||
1457 | diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c | ||
1458 | index dd45edf..6962c8a 100644 | ||
1459 | --- a/drivers/net/wireless/ath/ath9k/main.c | ||
1460 | +++ b/drivers/net/wireless/ath/ath9k/main.c | ||
1461 | @@ -181,7 +181,7 @@ static void ath_restart_work(struct ath_softc *sc) | ||
1462 | ath_start_ani(sc); | ||
1463 | } | ||
1464 | |||
1465 | -static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush) | ||
1466 | +static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx) | ||
1467 | { | ||
1468 | struct ath_hw *ah = sc->sc_ah; | ||
1469 | bool ret = true; | ||
1470 | @@ -201,14 +201,6 @@ static bool ath_prepare_reset(struct ath_softc *sc, bool retry_tx, bool flush) | ||
1471 | if (!ath_drain_all_txq(sc, retry_tx)) | ||
1472 | ret = false; | ||
1473 | |||
1474 | - if (!flush) { | ||
1475 | - if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
1476 | - ath_rx_tasklet(sc, 1, true); | ||
1477 | - ath_rx_tasklet(sc, 1, false); | ||
1478 | - } else { | ||
1479 | - ath_flushrecv(sc); | ||
1480 | - } | ||
1481 | - | ||
1482 | return ret; | ||
1483 | } | ||
1484 | |||
1485 | @@ -261,11 +253,11 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan, | ||
1486 | struct ath_common *common = ath9k_hw_common(ah); | ||
1487 | struct ath9k_hw_cal_data *caldata = NULL; | ||
1488 | bool fastcc = true; | ||
1489 | - bool flush = false; | ||
1490 | int r; | ||
1491 | |||
1492 | __ath_cancel_work(sc); | ||
1493 | |||
1494 | + tasklet_disable(&sc->intr_tq); | ||
1495 | spin_lock_bh(&sc->sc_pcu_lock); | ||
1496 | |||
1497 | if (!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) { | ||
1498 | @@ -275,11 +267,10 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan, | ||
1499 | |||
1500 | if (!hchan) { | ||
1501 | fastcc = false; | ||
1502 | - flush = true; | ||
1503 | hchan = ah->curchan; | ||
1504 | } | ||
1505 | |||
1506 | - if (!ath_prepare_reset(sc, retry_tx, flush)) | ||
1507 | + if (!ath_prepare_reset(sc, retry_tx)) | ||
1508 | fastcc = false; | ||
1509 | |||
1510 | ath_dbg(common, CONFIG, "Reset to %u MHz, HT40: %d fastcc: %d\n", | ||
1511 | @@ -297,6 +288,8 @@ static int ath_reset_internal(struct ath_softc *sc, struct ath9k_channel *hchan, | ||
1512 | |||
1513 | out: | ||
1514 | spin_unlock_bh(&sc->sc_pcu_lock); | ||
1515 | + tasklet_enable(&sc->intr_tq); | ||
1516 | + | ||
1517 | return r; | ||
1518 | } | ||
1519 | |||
1520 | @@ -816,7 +809,7 @@ static void ath9k_stop(struct ieee80211_hw *hw) | ||
1521 | ath9k_hw_cfg_gpio_input(ah, ah->led_pin); | ||
1522 | } | ||
1523 | |||
1524 | - ath_prepare_reset(sc, false, true); | ||
1525 | + ath_prepare_reset(sc, false); | ||
1526 | |||
1527 | if (sc->rx.frag) { | ||
1528 | dev_kfree_skb_any(sc->rx.frag); | ||
1529 | @@ -1837,6 +1830,9 @@ static u32 fill_chainmask(u32 cap, u32 new) | ||
1530 | |||
1531 | static bool validate_antenna_mask(struct ath_hw *ah, u32 val) | ||
1532 | { | ||
1533 | + if (AR_SREV_9300_20_OR_LATER(ah)) | ||
1534 | + return true; | ||
1535 | + | ||
1536 | switch (val & 0x7) { | ||
1537 | case 0x1: | ||
1538 | case 0x3: | ||
1539 | diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c | ||
1540 | index 83d16e7..4919d68 100644 | ||
1541 | --- a/drivers/net/wireless/ath/ath9k/recv.c | ||
1542 | +++ b/drivers/net/wireless/ath/ath9k/recv.c | ||
1543 | @@ -254,8 +254,6 @@ rx_init_fail: | ||
1544 | |||
1545 | static void ath_edma_start_recv(struct ath_softc *sc) | ||
1546 | { | ||
1547 | - spin_lock_bh(&sc->rx.rxbuflock); | ||
1548 | - | ||
1549 | ath9k_hw_rxena(sc->sc_ah); | ||
1550 | |||
1551 | ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_HP, | ||
1552 | @@ -267,8 +265,6 @@ static void ath_edma_start_recv(struct ath_softc *sc) | ||
1553 | ath_opmode_init(sc); | ||
1554 | |||
1555 | ath9k_hw_startpcureceive(sc->sc_ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); | ||
1556 | - | ||
1557 | - spin_unlock_bh(&sc->rx.rxbuflock); | ||
1558 | } | ||
1559 | |||
1560 | static void ath_edma_stop_recv(struct ath_softc *sc) | ||
1561 | @@ -285,8 +281,6 @@ int ath_rx_init(struct ath_softc *sc, int nbufs) | ||
1562 | int error = 0; | ||
1563 | |||
1564 | spin_lock_init(&sc->sc_pcu_lock); | ||
1565 | - spin_lock_init(&sc->rx.rxbuflock); | ||
1566 | - clear_bit(SC_OP_RXFLUSH, &sc->sc_flags); | ||
1567 | |||
1568 | common->rx_bufsize = IEEE80211_MAX_MPDU_LEN / 2 + | ||
1569 | sc->sc_ah->caps.rx_status_len; | ||
1570 | @@ -447,7 +441,6 @@ int ath_startrecv(struct ath_softc *sc) | ||
1571 | return 0; | ||
1572 | } | ||
1573 | |||
1574 | - spin_lock_bh(&sc->rx.rxbuflock); | ||
1575 | if (list_empty(&sc->rx.rxbuf)) | ||
1576 | goto start_recv; | ||
1577 | |||
1578 | @@ -468,26 +461,31 @@ start_recv: | ||
1579 | ath_opmode_init(sc); | ||
1580 | ath9k_hw_startpcureceive(ah, !!(sc->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)); | ||
1581 | |||
1582 | - spin_unlock_bh(&sc->rx.rxbuflock); | ||
1583 | - | ||
1584 | return 0; | ||
1585 | } | ||
1586 | |||
1587 | +static void ath_flushrecv(struct ath_softc *sc) | ||
1588 | +{ | ||
1589 | + if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
1590 | + ath_rx_tasklet(sc, 1, true); | ||
1591 | + ath_rx_tasklet(sc, 1, false); | ||
1592 | +} | ||
1593 | + | ||
1594 | bool ath_stoprecv(struct ath_softc *sc) | ||
1595 | { | ||
1596 | struct ath_hw *ah = sc->sc_ah; | ||
1597 | bool stopped, reset = false; | ||
1598 | |||
1599 | - spin_lock_bh(&sc->rx.rxbuflock); | ||
1600 | ath9k_hw_abortpcurecv(ah); | ||
1601 | ath9k_hw_setrxfilter(ah, 0); | ||
1602 | stopped = ath9k_hw_stopdmarecv(ah, &reset); | ||
1603 | |||
1604 | + ath_flushrecv(sc); | ||
1605 | + | ||
1606 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
1607 | ath_edma_stop_recv(sc); | ||
1608 | else | ||
1609 | sc->rx.rxlink = NULL; | ||
1610 | - spin_unlock_bh(&sc->rx.rxbuflock); | ||
1611 | |||
1612 | if (!(ah->ah_flags & AH_UNPLUGGED) && | ||
1613 | unlikely(!stopped)) { | ||
1614 | @@ -499,15 +497,6 @@ bool ath_stoprecv(struct ath_softc *sc) | ||
1615 | return stopped && !reset; | ||
1616 | } | ||
1617 | |||
1618 | -void ath_flushrecv(struct ath_softc *sc) | ||
1619 | -{ | ||
1620 | - set_bit(SC_OP_RXFLUSH, &sc->sc_flags); | ||
1621 | - if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
1622 | - ath_rx_tasklet(sc, 1, true); | ||
1623 | - ath_rx_tasklet(sc, 1, false); | ||
1624 | - clear_bit(SC_OP_RXFLUSH, &sc->sc_flags); | ||
1625 | -} | ||
1626 | - | ||
1627 | static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) | ||
1628 | { | ||
1629 | /* Check whether the Beacon frame has DTIM indicating buffered bc/mc */ | ||
1630 | @@ -744,6 +733,7 @@ static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, | ||
1631 | return NULL; | ||
1632 | } | ||
1633 | |||
1634 | + list_del(&bf->list); | ||
1635 | if (!bf->bf_mpdu) | ||
1636 | return bf; | ||
1637 | |||
1638 | @@ -1059,16 +1049,12 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | ||
1639 | dma_type = DMA_FROM_DEVICE; | ||
1640 | |||
1641 | qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; | ||
1642 | - spin_lock_bh(&sc->rx.rxbuflock); | ||
1643 | |||
1644 | tsf = ath9k_hw_gettsf64(ah); | ||
1645 | tsf_lower = tsf & 0xffffffff; | ||
1646 | |||
1647 | do { | ||
1648 | bool decrypt_error = false; | ||
1649 | - /* If handling rx interrupt and flush is in progress => exit */ | ||
1650 | - if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags) && (flush == 0)) | ||
1651 | - break; | ||
1652 | |||
1653 | memset(&rs, 0, sizeof(rs)); | ||
1654 | if (edma) | ||
1655 | @@ -1108,15 +1094,6 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | ||
1656 | sc->rx.num_pkts++; | ||
1657 | ath_debug_stat_rx(sc, &rs); | ||
1658 | |||
1659 | - /* | ||
1660 | - * If we're asked to flush receive queue, directly | ||
1661 | - * chain it back at the queue without processing it. | ||
1662 | - */ | ||
1663 | - if (test_bit(SC_OP_RXFLUSH, &sc->sc_flags)) { | ||
1664 | - RX_STAT_INC(rx_drop_rxflush); | ||
1665 | - goto requeue_drop_frag; | ||
1666 | - } | ||
1667 | - | ||
1668 | memset(rxs, 0, sizeof(struct ieee80211_rx_status)); | ||
1669 | |||
1670 | rxs->mactime = (tsf & ~0xffffffffULL) | rs.rs_tstamp; | ||
1671 | @@ -1251,19 +1228,18 @@ requeue_drop_frag: | ||
1672 | sc->rx.frag = NULL; | ||
1673 | } | ||
1674 | requeue: | ||
1675 | + list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
1676 | + if (flush) | ||
1677 | + continue; | ||
1678 | + | ||
1679 | if (edma) { | ||
1680 | - list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
1681 | ath_rx_edma_buf_link(sc, qtype); | ||
1682 | } else { | ||
1683 | - list_move_tail(&bf->list, &sc->rx.rxbuf); | ||
1684 | ath_rx_buf_link(sc, bf); | ||
1685 | - if (!flush) | ||
1686 | - ath9k_hw_rxena(ah); | ||
1687 | + ath9k_hw_rxena(ah); | ||
1688 | } | ||
1689 | } while (1); | ||
1690 | |||
1691 | - spin_unlock_bh(&sc->rx.rxbuflock); | ||
1692 | - | ||
1693 | if (!(ah->imask & ATH9K_INT_RXEOL)) { | ||
1694 | ah->imask |= (ATH9K_INT_RXEOL | ATH9K_INT_RXORN); | ||
1695 | ath9k_hw_set_interrupts(ah); | ||
1696 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
1697 | index a744ea5..36014bf 100644 | ||
1698 | --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
1699 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c | ||
1700 | @@ -280,8 +280,8 @@ static void brcms_ops_tx(struct ieee80211_hw *hw, | ||
1701 | kfree_skb(skb); | ||
1702 | goto done; | ||
1703 | } | ||
1704 | - brcms_c_sendpkt_mac80211(wl->wlc, skb, hw); | ||
1705 | - tx_info->rate_driver_data[0] = control->sta; | ||
1706 | + if (brcms_c_sendpkt_mac80211(wl->wlc, skb, hw)) | ||
1707 | + tx_info->rate_driver_data[0] = control->sta; | ||
1708 | done: | ||
1709 | spin_unlock_bh(&wl->lock); | ||
1710 | } | ||
1711 | @@ -1401,9 +1401,10 @@ void brcms_add_timer(struct brcms_timer *t, uint ms, int periodic) | ||
1712 | #endif | ||
1713 | t->ms = ms; | ||
1714 | t->periodic = (bool) periodic; | ||
1715 | - t->set = true; | ||
1716 | - | ||
1717 | - atomic_inc(&t->wl->callbacks); | ||
1718 | + if (!t->set) { | ||
1719 | + t->set = true; | ||
1720 | + atomic_inc(&t->wl->callbacks); | ||
1721 | + } | ||
1722 | |||
1723 | ieee80211_queue_delayed_work(hw, &t->dly_wrk, msecs_to_jiffies(ms)); | ||
1724 | } | ||
1725 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c | ||
1726 | index 75086b3..9fb0a4c9 100644 | ||
1727 | --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c | ||
1728 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c | ||
1729 | @@ -6095,7 +6095,7 @@ static bool brcms_c_prec_enq(struct brcms_c_info *wlc, struct pktq *q, | ||
1730 | return brcms_c_prec_enq_head(wlc, q, pkt, prec, false); | ||
1731 | } | ||
1732 | |||
1733 | -void brcms_c_txq_enq(struct brcms_c_info *wlc, struct scb *scb, | ||
1734 | +bool brcms_c_txq_enq(struct brcms_c_info *wlc, struct scb *scb, | ||
1735 | struct sk_buff *sdu, uint prec) | ||
1736 | { | ||
1737 | struct brcms_txq_info *qi = wlc->pkt_queue; /* Check me */ | ||
1738 | @@ -6110,7 +6110,9 @@ void brcms_c_txq_enq(struct brcms_c_info *wlc, struct scb *scb, | ||
1739 | * packet flooding from mac80211 stack | ||
1740 | */ | ||
1741 | brcmu_pkt_buf_free_skb(sdu); | ||
1742 | + return false; | ||
1743 | } | ||
1744 | + return true; | ||
1745 | } | ||
1746 | |||
1747 | /* | ||
1748 | @@ -7273,7 +7275,7 @@ brcms_c_d11hdrs_mac80211(struct brcms_c_info *wlc, struct ieee80211_hw *hw, | ||
1749 | return 0; | ||
1750 | } | ||
1751 | |||
1752 | -void brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, struct sk_buff *sdu, | ||
1753 | +bool brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, struct sk_buff *sdu, | ||
1754 | struct ieee80211_hw *hw) | ||
1755 | { | ||
1756 | u8 prio; | ||
1757 | @@ -7288,10 +7290,12 @@ void brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, struct sk_buff *sdu, | ||
1758 | prio = ieee80211_is_data(d11_header->frame_control) ? sdu->priority : | ||
1759 | MAXPRIO; | ||
1760 | fifo = prio2fifo[prio]; | ||
1761 | - if (brcms_c_d11hdrs_mac80211(wlc, hw, sdu, scb, 0, 1, fifo, 0)) | ||
1762 | - return; | ||
1763 | - brcms_c_txq_enq(wlc, scb, sdu, BRCMS_PRIO_TO_PREC(prio)); | ||
1764 | + brcms_c_d11hdrs_mac80211(wlc, hw, sdu, scb, 0, 1, fifo, 0); | ||
1765 | + if (!brcms_c_txq_enq(wlc, scb, sdu, BRCMS_PRIO_TO_PREC(prio))) | ||
1766 | + return false; | ||
1767 | brcms_c_send_q(wlc); | ||
1768 | + | ||
1769 | + return true; | ||
1770 | } | ||
1771 | |||
1772 | void brcms_c_send_q(struct brcms_c_info *wlc) | ||
1773 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.h b/drivers/net/wireless/brcm80211/brcmsmac/main.h | ||
1774 | index 8debc74..b44725c 100644 | ||
1775 | --- a/drivers/net/wireless/brcm80211/brcmsmac/main.h | ||
1776 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.h | ||
1777 | @@ -642,7 +642,7 @@ extern void brcms_c_txfifo(struct brcms_c_info *wlc, uint fifo, | ||
1778 | bool commit, s8 txpktpend); | ||
1779 | extern void brcms_c_txfifo_complete(struct brcms_c_info *wlc, uint fifo, | ||
1780 | s8 txpktpend); | ||
1781 | -extern void brcms_c_txq_enq(struct brcms_c_info *wlc, struct scb *scb, | ||
1782 | +extern bool brcms_c_txq_enq(struct brcms_c_info *wlc, struct scb *scb, | ||
1783 | struct sk_buff *sdu, uint prec); | ||
1784 | extern void brcms_c_print_txstatus(struct tx_status *txs); | ||
1785 | extern int brcms_b_xmtfifo_sz_get(struct brcms_hardware *wlc_hw, uint fifo, | ||
1786 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/pub.h b/drivers/net/wireless/brcm80211/brcmsmac/pub.h | ||
1787 | index 5855f4f..bfa2630 100644 | ||
1788 | --- a/drivers/net/wireless/brcm80211/brcmsmac/pub.h | ||
1789 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/pub.h | ||
1790 | @@ -321,7 +321,7 @@ extern void brcms_c_intrsrestore(struct brcms_c_info *wlc, u32 macintmask); | ||
1791 | extern bool brcms_c_intrsupd(struct brcms_c_info *wlc); | ||
1792 | extern bool brcms_c_isr(struct brcms_c_info *wlc, bool *wantdpc); | ||
1793 | extern bool brcms_c_dpc(struct brcms_c_info *wlc, bool bounded); | ||
1794 | -extern void brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, | ||
1795 | +extern bool brcms_c_sendpkt_mac80211(struct brcms_c_info *wlc, | ||
1796 | struct sk_buff *sdu, | ||
1797 | struct ieee80211_hw *hw); | ||
1798 | extern bool brcms_c_aggregatable(struct brcms_c_info *wlc, u8 tid); | ||
1799 | diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c | ||
1800 | index 318ed3c..617aeb9 100644 | ||
1801 | --- a/drivers/net/wireless/iwlegacy/common.c | ||
1802 | +++ b/drivers/net/wireless/iwlegacy/common.c | ||
1803 | @@ -3957,17 +3957,21 @@ il_connection_init_rx_config(struct il_priv *il) | ||
1804 | |||
1805 | memset(&il->staging, 0, sizeof(il->staging)); | ||
1806 | |||
1807 | - if (!il->vif) { | ||
1808 | + switch (il->iw_mode) { | ||
1809 | + case NL80211_IFTYPE_UNSPECIFIED: | ||
1810 | il->staging.dev_type = RXON_DEV_TYPE_ESS; | ||
1811 | - } else if (il->vif->type == NL80211_IFTYPE_STATION) { | ||
1812 | + break; | ||
1813 | + case NL80211_IFTYPE_STATION: | ||
1814 | il->staging.dev_type = RXON_DEV_TYPE_ESS; | ||
1815 | il->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; | ||
1816 | - } else if (il->vif->type == NL80211_IFTYPE_ADHOC) { | ||
1817 | + break; | ||
1818 | + case NL80211_IFTYPE_ADHOC: | ||
1819 | il->staging.dev_type = RXON_DEV_TYPE_IBSS; | ||
1820 | il->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK; | ||
1821 | il->staging.filter_flags = | ||
1822 | RXON_FILTER_BCON_AWARE_MSK | RXON_FILTER_ACCEPT_GRP_MSK; | ||
1823 | - } else { | ||
1824 | + break; | ||
1825 | + default: | ||
1826 | IL_ERR("Unsupported interface type %d\n", il->vif->type); | ||
1827 | return; | ||
1828 | } | ||
1829 | @@ -4550,8 +4554,7 @@ out: | ||
1830 | EXPORT_SYMBOL(il_mac_add_interface); | ||
1831 | |||
1832 | static void | ||
1833 | -il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif, | ||
1834 | - bool mode_change) | ||
1835 | +il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif) | ||
1836 | { | ||
1837 | lockdep_assert_held(&il->mutex); | ||
1838 | |||
1839 | @@ -4560,9 +4563,7 @@ il_teardown_interface(struct il_priv *il, struct ieee80211_vif *vif, | ||
1840 | il_force_scan_end(il); | ||
1841 | } | ||
1842 | |||
1843 | - if (!mode_change) | ||
1844 | - il_set_mode(il); | ||
1845 | - | ||
1846 | + il_set_mode(il); | ||
1847 | } | ||
1848 | |||
1849 | void | ||
1850 | @@ -4575,8 +4576,8 @@ il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | ||
1851 | |||
1852 | WARN_ON(il->vif != vif); | ||
1853 | il->vif = NULL; | ||
1854 | - | ||
1855 | - il_teardown_interface(il, vif, false); | ||
1856 | + il->iw_mode = NL80211_IFTYPE_UNSPECIFIED; | ||
1857 | + il_teardown_interface(il, vif); | ||
1858 | memset(il->bssid, 0, ETH_ALEN); | ||
1859 | |||
1860 | D_MAC80211("leave\n"); | ||
1861 | @@ -4685,18 +4686,10 @@ il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | ||
1862 | } | ||
1863 | |||
1864 | /* success */ | ||
1865 | - il_teardown_interface(il, vif, true); | ||
1866 | vif->type = newtype; | ||
1867 | vif->p2p = false; | ||
1868 | - err = il_set_mode(il); | ||
1869 | - WARN_ON(err); | ||
1870 | - /* | ||
1871 | - * We've switched internally, but submitting to the | ||
1872 | - * device may have failed for some reason. Mask this | ||
1873 | - * error, because otherwise mac80211 will not switch | ||
1874 | - * (and set the interface type back) and we'll be | ||
1875 | - * out of sync with it. | ||
1876 | - */ | ||
1877 | + il->iw_mode = newtype; | ||
1878 | + il_teardown_interface(il, vif); | ||
1879 | err = 0; | ||
1880 | |||
1881 | out: | ||
1882 | diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c | ||
1883 | index 780d3e1..f7e91f2 100644 | ||
1884 | --- a/drivers/net/wireless/mwifiex/cfg80211.c | ||
1885 | +++ b/drivers/net/wireless/mwifiex/cfg80211.c | ||
1886 | @@ -1462,7 +1462,7 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | ||
1887 | struct cfg80211_ssid req_ssid; | ||
1888 | int ret, auth_type = 0; | ||
1889 | struct cfg80211_bss *bss = NULL; | ||
1890 | - u8 is_scanning_required = 0, config_bands = 0; | ||
1891 | + u8 is_scanning_required = 0; | ||
1892 | |||
1893 | memset(&req_ssid, 0, sizeof(struct cfg80211_ssid)); | ||
1894 | |||
1895 | @@ -1481,19 +1481,6 @@ mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len, u8 *ssid, | ||
1896 | /* disconnect before try to associate */ | ||
1897 | mwifiex_deauthenticate(priv, NULL); | ||
1898 | |||
1899 | - if (channel) { | ||
1900 | - if (mode == NL80211_IFTYPE_STATION) { | ||
1901 | - if (channel->band == IEEE80211_BAND_2GHZ) | ||
1902 | - config_bands = BAND_B | BAND_G | BAND_GN; | ||
1903 | - else | ||
1904 | - config_bands = BAND_A | BAND_AN; | ||
1905 | - | ||
1906 | - if (!((config_bands | priv->adapter->fw_bands) & | ||
1907 | - ~priv->adapter->fw_bands)) | ||
1908 | - priv->adapter->config_bands = config_bands; | ||
1909 | - } | ||
1910 | - } | ||
1911 | - | ||
1912 | /* As this is new association, clear locally stored | ||
1913 | * keys and security related flags */ | ||
1914 | priv->sec_info.wpa_enabled = false; | ||
1915 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c | ||
1916 | index 13fbc4e..b879e13 100644 | ||
1917 | --- a/drivers/net/wireless/mwifiex/pcie.c | ||
1918 | +++ b/drivers/net/wireless/mwifiex/pcie.c | ||
1919 | @@ -161,7 +161,7 @@ static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state) | ||
1920 | |||
1921 | if (pdev) { | ||
1922 | card = (struct pcie_service_card *) pci_get_drvdata(pdev); | ||
1923 | - if (!card || card->adapter) { | ||
1924 | + if (!card || !card->adapter) { | ||
1925 | pr_err("Card or adapter structure is not valid\n"); | ||
1926 | return 0; | ||
1927 | } | ||
1928 | diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
1929 | index 786bc11..f3211d8 100644 | ||
1930 | --- a/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
1931 | +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c | ||
1932 | @@ -265,6 +265,20 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, | ||
1933 | if (ret) | ||
1934 | goto done; | ||
1935 | |||
1936 | + if (bss_desc) { | ||
1937 | + u8 config_bands = 0; | ||
1938 | + | ||
1939 | + if (mwifiex_band_to_radio_type((u8) bss_desc->bss_band) | ||
1940 | + == HostCmd_SCAN_RADIO_TYPE_BG) | ||
1941 | + config_bands = BAND_B | BAND_G | BAND_GN; | ||
1942 | + else | ||
1943 | + config_bands = BAND_A | BAND_AN; | ||
1944 | + | ||
1945 | + if (!((config_bands | adapter->fw_bands) & | ||
1946 | + ~adapter->fw_bands)) | ||
1947 | + adapter->config_bands = config_bands; | ||
1948 | + } | ||
1949 | + | ||
1950 | ret = mwifiex_check_network_compatibility(priv, bss_desc); | ||
1951 | if (ret) | ||
1952 | goto done; | ||
1953 | diff --git a/drivers/platform/x86/ibm_rtl.c b/drivers/platform/x86/ibm_rtl.c | ||
1954 | index 7481146..97c2be1 100644 | ||
1955 | --- a/drivers/platform/x86/ibm_rtl.c | ||
1956 | +++ b/drivers/platform/x86/ibm_rtl.c | ||
1957 | @@ -244,7 +244,7 @@ static int __init ibm_rtl_init(void) { | ||
1958 | if (force) | ||
1959 | pr_warn("module loaded by force\n"); | ||
1960 | /* first ensure that we are running on IBM HW */ | ||
1961 | - else if (efi_enabled || !dmi_check_system(ibm_rtl_dmi_table)) | ||
1962 | + else if (efi_enabled(EFI_BOOT) || !dmi_check_system(ibm_rtl_dmi_table)) | ||
1963 | return -ENODEV; | ||
1964 | |||
1965 | /* Get the address for the Extended BIOS Data Area */ | ||
1966 | diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c | ||
1967 | index 71623a2..d1f0300 100644 | ||
1968 | --- a/drivers/platform/x86/samsung-laptop.c | ||
1969 | +++ b/drivers/platform/x86/samsung-laptop.c | ||
1970 | @@ -26,6 +26,7 @@ | ||
1971 | #include <linux/seq_file.h> | ||
1972 | #include <linux/debugfs.h> | ||
1973 | #include <linux/ctype.h> | ||
1974 | +#include <linux/efi.h> | ||
1975 | #include <acpi/video.h> | ||
1976 | |||
1977 | /* | ||
1978 | @@ -1544,6 +1545,9 @@ static int __init samsung_init(void) | ||
1979 | struct samsung_laptop *samsung; | ||
1980 | int ret; | ||
1981 | |||
1982 | + if (efi_enabled(EFI_BOOT)) | ||
1983 | + return -ENODEV; | ||
1984 | + | ||
1985 | quirks = &samsung_unknown; | ||
1986 | if (!force && !dmi_check_system(samsung_dmi_table)) | ||
1987 | return -ENODEV; | ||
1988 | diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c | ||
1989 | index b74050b..9ac1e9d 100644 | ||
1990 | --- a/drivers/scsi/isci/init.c | ||
1991 | +++ b/drivers/scsi/isci/init.c | ||
1992 | @@ -633,7 +633,7 @@ static int __devinit isci_pci_probe(struct pci_dev *pdev, const struct pci_devic | ||
1993 | return -ENOMEM; | ||
1994 | pci_set_drvdata(pdev, pci_info); | ||
1995 | |||
1996 | - if (efi_enabled) | ||
1997 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | ||
1998 | orom = isci_get_efi_var(pdev); | ||
1999 | |||
2000 | if (!orom) | ||
2001 | diff --git a/drivers/target/target_core_fabric_configfs.c b/drivers/target/target_core_fabric_configfs.c | ||
2002 | index a55f91a..9430cd2 100644 | ||
2003 | --- a/drivers/target/target_core_fabric_configfs.c | ||
2004 | +++ b/drivers/target/target_core_fabric_configfs.c | ||
2005 | @@ -751,12 +751,6 @@ static int target_fabric_port_link( | ||
2006 | struct target_fabric_configfs *tf; | ||
2007 | int ret; | ||
2008 | |||
2009 | - if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) { | ||
2010 | - pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:" | ||
2011 | - " %p to struct se_device: %p\n", se_dev_ci, dev); | ||
2012 | - return -EFAULT; | ||
2013 | - } | ||
2014 | - | ||
2015 | tpg_ci = &lun_ci->ci_parent->ci_group->cg_item; | ||
2016 | se_tpg = container_of(to_config_group(tpg_ci), | ||
2017 | struct se_portal_group, tpg_group); | ||
2018 | @@ -774,6 +768,11 @@ static int target_fabric_port_link( | ||
2019 | ret = -ENODEV; | ||
2020 | goto out; | ||
2021 | } | ||
2022 | + if (dev->dev_link_magic != SE_DEV_LINK_MAGIC) { | ||
2023 | + pr_err("Bad dev->dev_link_magic, not a valid se_dev_ci pointer:" | ||
2024 | + " %p to struct se_device: %p\n", se_dev_ci, dev); | ||
2025 | + return -EFAULT; | ||
2026 | + } | ||
2027 | |||
2028 | lun_p = core_dev_add_lun(se_tpg, dev, lun->unpacked_lun); | ||
2029 | if (IS_ERR(lun_p)) { | ||
2030 | diff --git a/fs/cifs/cifs_dfs_ref.c b/fs/cifs/cifs_dfs_ref.c | ||
2031 | index ce5cbd7..210fce2 100644 | ||
2032 | --- a/fs/cifs/cifs_dfs_ref.c | ||
2033 | +++ b/fs/cifs/cifs_dfs_ref.c | ||
2034 | @@ -226,6 +226,8 @@ compose_mount_options_out: | ||
2035 | compose_mount_options_err: | ||
2036 | kfree(mountdata); | ||
2037 | mountdata = ERR_PTR(rc); | ||
2038 | + kfree(*devname); | ||
2039 | + *devname = NULL; | ||
2040 | goto compose_mount_options_out; | ||
2041 | } | ||
2042 | |||
2043 | diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c | ||
2044 | index dd057bc..fc8dc20 100644 | ||
2045 | --- a/fs/nfs/namespace.c | ||
2046 | +++ b/fs/nfs/namespace.c | ||
2047 | @@ -177,11 +177,31 @@ out_nofree: | ||
2048 | return mnt; | ||
2049 | } | ||
2050 | |||
2051 | +static int | ||
2052 | +nfs_namespace_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) | ||
2053 | +{ | ||
2054 | + if (NFS_FH(dentry->d_inode)->size != 0) | ||
2055 | + return nfs_getattr(mnt, dentry, stat); | ||
2056 | + generic_fillattr(dentry->d_inode, stat); | ||
2057 | + return 0; | ||
2058 | +} | ||
2059 | + | ||
2060 | +static int | ||
2061 | +nfs_namespace_setattr(struct dentry *dentry, struct iattr *attr) | ||
2062 | +{ | ||
2063 | + if (NFS_FH(dentry->d_inode)->size != 0) | ||
2064 | + return nfs_setattr(dentry, attr); | ||
2065 | + return -EACCES; | ||
2066 | +} | ||
2067 | + | ||
2068 | const struct inode_operations nfs_mountpoint_inode_operations = { | ||
2069 | .getattr = nfs_getattr, | ||
2070 | + .setattr = nfs_setattr, | ||
2071 | }; | ||
2072 | |||
2073 | const struct inode_operations nfs_referral_inode_operations = { | ||
2074 | + .getattr = nfs_namespace_getattr, | ||
2075 | + .setattr = nfs_namespace_setattr, | ||
2076 | }; | ||
2077 | |||
2078 | static void nfs_expire_automounts(struct work_struct *work) | ||
2079 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c | ||
2080 | index 6bacfde..1f55131 100644 | ||
2081 | --- a/fs/nfs/nfs4client.c | ||
2082 | +++ b/fs/nfs/nfs4client.c | ||
2083 | @@ -235,11 +235,10 @@ struct nfs_client *nfs4_init_client(struct nfs_client *clp, | ||
2084 | error = nfs4_discover_server_trunking(clp, &old); | ||
2085 | if (error < 0) | ||
2086 | goto error; | ||
2087 | + nfs_put_client(clp); | ||
2088 | if (clp != old) { | ||
2089 | clp->cl_preserve_clid = true; | ||
2090 | - nfs_put_client(clp); | ||
2091 | clp = old; | ||
2092 | - atomic_inc(&clp->cl_count); | ||
2093 | } | ||
2094 | |||
2095 | return clp; | ||
2096 | @@ -305,7 +304,7 @@ int nfs40_walk_client_list(struct nfs_client *new, | ||
2097 | .clientid = new->cl_clientid, | ||
2098 | .confirm = new->cl_confirm, | ||
2099 | }; | ||
2100 | - int status; | ||
2101 | + int status = -NFS4ERR_STALE_CLIENTID; | ||
2102 | |||
2103 | spin_lock(&nn->nfs_client_lock); | ||
2104 | list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { | ||
2105 | @@ -331,40 +330,33 @@ int nfs40_walk_client_list(struct nfs_client *new, | ||
2106 | |||
2107 | if (prev) | ||
2108 | nfs_put_client(prev); | ||
2109 | + prev = pos; | ||
2110 | |||
2111 | status = nfs4_proc_setclientid_confirm(pos, &clid, cred); | ||
2112 | - if (status == 0) { | ||
2113 | + switch (status) { | ||
2114 | + case -NFS4ERR_STALE_CLIENTID: | ||
2115 | + break; | ||
2116 | + case 0: | ||
2117 | nfs4_swap_callback_idents(pos, new); | ||
2118 | |||
2119 | - nfs_put_client(pos); | ||
2120 | + prev = NULL; | ||
2121 | *result = pos; | ||
2122 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", | ||
2123 | __func__, pos, atomic_read(&pos->cl_count)); | ||
2124 | - return 0; | ||
2125 | - } | ||
2126 | - if (status != -NFS4ERR_STALE_CLIENTID) { | ||
2127 | - nfs_put_client(pos); | ||
2128 | - dprintk("NFS: <-- %s status = %d, no result\n", | ||
2129 | - __func__, status); | ||
2130 | - return status; | ||
2131 | + default: | ||
2132 | + goto out; | ||
2133 | } | ||
2134 | |||
2135 | spin_lock(&nn->nfs_client_lock); | ||
2136 | - prev = pos; | ||
2137 | } | ||
2138 | + spin_unlock(&nn->nfs_client_lock); | ||
2139 | |||
2140 | - /* | ||
2141 | - * No matching nfs_client found. This should be impossible, | ||
2142 | - * because the new nfs_client has already been added to | ||
2143 | - * nfs_client_list by nfs_get_client(). | ||
2144 | - * | ||
2145 | - * Don't BUG(), since the caller is holding a mutex. | ||
2146 | - */ | ||
2147 | + /* No match found. The server lost our clientid */ | ||
2148 | +out: | ||
2149 | if (prev) | ||
2150 | nfs_put_client(prev); | ||
2151 | - spin_unlock(&nn->nfs_client_lock); | ||
2152 | - pr_err("NFS: %s Error: no matching nfs_client found\n", __func__); | ||
2153 | - return -NFS4ERR_STALE_CLIENTID; | ||
2154 | + dprintk("NFS: <-- %s status = %d\n", __func__, status); | ||
2155 | + return status; | ||
2156 | } | ||
2157 | |||
2158 | #ifdef CONFIG_NFS_V4_1 | ||
2159 | @@ -431,7 +423,7 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
2160 | { | ||
2161 | struct nfs_net *nn = net_generic(new->cl_net, nfs_net_id); | ||
2162 | struct nfs_client *pos, *n, *prev = NULL; | ||
2163 | - int error; | ||
2164 | + int status = -NFS4ERR_STALE_CLIENTID; | ||
2165 | |||
2166 | spin_lock(&nn->nfs_client_lock); | ||
2167 | list_for_each_entry_safe(pos, n, &nn->nfs_client_list, cl_share_link) { | ||
2168 | @@ -447,14 +439,17 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
2169 | nfs_put_client(prev); | ||
2170 | prev = pos; | ||
2171 | |||
2172 | - error = nfs_wait_client_init_complete(pos); | ||
2173 | - if (error < 0) { | ||
2174 | + nfs4_schedule_lease_recovery(pos); | ||
2175 | + status = nfs_wait_client_init_complete(pos); | ||
2176 | + if (status < 0) { | ||
2177 | nfs_put_client(pos); | ||
2178 | spin_lock(&nn->nfs_client_lock); | ||
2179 | continue; | ||
2180 | } | ||
2181 | - | ||
2182 | + status = pos->cl_cons_state; | ||
2183 | spin_lock(&nn->nfs_client_lock); | ||
2184 | + if (status < 0) | ||
2185 | + continue; | ||
2186 | } | ||
2187 | |||
2188 | if (pos->rpc_ops != new->rpc_ops) | ||
2189 | @@ -472,6 +467,7 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
2190 | if (!nfs4_match_serverowners(pos, new)) | ||
2191 | continue; | ||
2192 | |||
2193 | + atomic_inc(&pos->cl_count); | ||
2194 | spin_unlock(&nn->nfs_client_lock); | ||
2195 | dprintk("NFS: <-- %s using nfs_client = %p ({%d})\n", | ||
2196 | __func__, pos, atomic_read(&pos->cl_count)); | ||
2197 | @@ -480,16 +476,10 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
2198 | return 0; | ||
2199 | } | ||
2200 | |||
2201 | - /* | ||
2202 | - * No matching nfs_client found. This should be impossible, | ||
2203 | - * because the new nfs_client has already been added to | ||
2204 | - * nfs_client_list by nfs_get_client(). | ||
2205 | - * | ||
2206 | - * Don't BUG(), since the caller is holding a mutex. | ||
2207 | - */ | ||
2208 | + /* No matching nfs_client found. */ | ||
2209 | spin_unlock(&nn->nfs_client_lock); | ||
2210 | - pr_err("NFS: %s Error: no matching nfs_client found\n", __func__); | ||
2211 | - return -NFS4ERR_STALE_CLIENTID; | ||
2212 | + dprintk("NFS: <-- %s status = %d\n", __func__, status); | ||
2213 | + return status; | ||
2214 | } | ||
2215 | #endif /* CONFIG_NFS_V4_1 */ | ||
2216 | |||
2217 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c | ||
2218 | index c351e6b..b1c96e7 100644 | ||
2219 | --- a/fs/nfs/nfs4state.c | ||
2220 | +++ b/fs/nfs/nfs4state.c | ||
2221 | @@ -136,16 +136,11 @@ int nfs40_discover_server_trunking(struct nfs_client *clp, | ||
2222 | clp->cl_confirm = clid.confirm; | ||
2223 | |||
2224 | status = nfs40_walk_client_list(clp, result, cred); | ||
2225 | - switch (status) { | ||
2226 | - case -NFS4ERR_STALE_CLIENTID: | ||
2227 | - set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); | ||
2228 | - case 0: | ||
2229 | + if (status == 0) { | ||
2230 | /* Sustain the lease, even if it's empty. If the clientid4 | ||
2231 | * goes stale it's of no use for trunking discovery. */ | ||
2232 | nfs4_schedule_state_renewal(*result); | ||
2233 | - break; | ||
2234 | } | ||
2235 | - | ||
2236 | out: | ||
2237 | return status; | ||
2238 | } | ||
2239 | @@ -1850,6 +1845,7 @@ again: | ||
2240 | case -ETIMEDOUT: | ||
2241 | case -EAGAIN: | ||
2242 | ssleep(1); | ||
2243 | + case -NFS4ERR_STALE_CLIENTID: | ||
2244 | dprintk("NFS: %s after status %d, retrying\n", | ||
2245 | __func__, status); | ||
2246 | goto again; | ||
2247 | @@ -2001,8 +1997,18 @@ static int nfs4_reset_session(struct nfs_client *clp) | ||
2248 | nfs4_begin_drain_session(clp); | ||
2249 | cred = nfs4_get_exchange_id_cred(clp); | ||
2250 | status = nfs4_proc_destroy_session(clp->cl_session, cred); | ||
2251 | - if (status && status != -NFS4ERR_BADSESSION && | ||
2252 | - status != -NFS4ERR_DEADSESSION) { | ||
2253 | + switch (status) { | ||
2254 | + case 0: | ||
2255 | + case -NFS4ERR_BADSESSION: | ||
2256 | + case -NFS4ERR_DEADSESSION: | ||
2257 | + break; | ||
2258 | + case -NFS4ERR_BACK_CHAN_BUSY: | ||
2259 | + case -NFS4ERR_DELAY: | ||
2260 | + set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); | ||
2261 | + status = 0; | ||
2262 | + ssleep(1); | ||
2263 | + goto out; | ||
2264 | + default: | ||
2265 | status = nfs4_recovery_handle_error(clp, status); | ||
2266 | goto out; | ||
2267 | } | ||
2268 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c | ||
2269 | index 00be08f..49f3f90 100644 | ||
2270 | --- a/fs/nfs/super.c | ||
2271 | +++ b/fs/nfs/super.c | ||
2272 | @@ -2576,27 +2576,23 @@ nfs_xdev_mount(struct file_system_type *fs_type, int flags, | ||
2273 | struct nfs_server *server; | ||
2274 | struct dentry *mntroot = ERR_PTR(-ENOMEM); | ||
2275 | struct nfs_subversion *nfs_mod = NFS_SB(data->sb)->nfs_client->cl_nfs_mod; | ||
2276 | - int error; | ||
2277 | |||
2278 | - dprintk("--> nfs_xdev_mount_common()\n"); | ||
2279 | + dprintk("--> nfs_xdev_mount()\n"); | ||
2280 | |||
2281 | mount_info.mntfh = mount_info.cloned->fh; | ||
2282 | |||
2283 | /* create a new volume representation */ | ||
2284 | server = nfs_mod->rpc_ops->clone_server(NFS_SB(data->sb), data->fh, data->fattr, data->authflavor); | ||
2285 | - if (IS_ERR(server)) { | ||
2286 | - error = PTR_ERR(server); | ||
2287 | - goto out_err; | ||
2288 | - } | ||
2289 | |||
2290 | - mntroot = nfs_fs_mount_common(server, flags, dev_name, &mount_info, nfs_mod); | ||
2291 | - dprintk("<-- nfs_xdev_mount_common() = 0\n"); | ||
2292 | -out: | ||
2293 | - return mntroot; | ||
2294 | + if (IS_ERR(server)) | ||
2295 | + mntroot = ERR_CAST(server); | ||
2296 | + else | ||
2297 | + mntroot = nfs_fs_mount_common(server, flags, | ||
2298 | + dev_name, &mount_info, nfs_mod); | ||
2299 | |||
2300 | -out_err: | ||
2301 | - dprintk("<-- nfs_xdev_mount_common() = %d [error]\n", error); | ||
2302 | - goto out; | ||
2303 | + dprintk("<-- nfs_xdev_mount() = %ld\n", | ||
2304 | + IS_ERR(mntroot) ? PTR_ERR(mntroot) : 0L); | ||
2305 | + return mntroot; | ||
2306 | } | ||
2307 | |||
2308 | #if IS_ENABLED(CONFIG_NFS_V4) | ||
2309 | diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c | ||
2310 | index e0e9ee0..dfbcfd0 100644 | ||
2311 | --- a/fs/xfs/xfs_aops.c | ||
2312 | +++ b/fs/xfs/xfs_aops.c | ||
2313 | @@ -86,11 +86,11 @@ xfs_destroy_ioend( | ||
2314 | } | ||
2315 | |||
2316 | if (ioend->io_iocb) { | ||
2317 | + inode_dio_done(ioend->io_inode); | ||
2318 | if (ioend->io_isasync) { | ||
2319 | aio_complete(ioend->io_iocb, ioend->io_error ? | ||
2320 | ioend->io_error : ioend->io_result, 0); | ||
2321 | } | ||
2322 | - inode_dio_done(ioend->io_inode); | ||
2323 | } | ||
2324 | |||
2325 | mempool_free(ioend, xfs_ioend_pool); | ||
2326 | diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c | ||
2327 | index 4b0b8dd..58a1f41 100644 | ||
2328 | --- a/fs/xfs/xfs_buf.c | ||
2329 | +++ b/fs/xfs/xfs_buf.c | ||
2330 | @@ -487,6 +487,7 @@ _xfs_buf_find( | ||
2331 | struct rb_node *parent; | ||
2332 | xfs_buf_t *bp; | ||
2333 | xfs_daddr_t blkno = map[0].bm_bn; | ||
2334 | + xfs_daddr_t eofs; | ||
2335 | int numblks = 0; | ||
2336 | int i; | ||
2337 | |||
2338 | @@ -498,6 +499,23 @@ _xfs_buf_find( | ||
2339 | ASSERT(!(numbytes < (1 << btp->bt_sshift))); | ||
2340 | ASSERT(!(BBTOB(blkno) & (xfs_off_t)btp->bt_smask)); | ||
2341 | |||
2342 | + /* | ||
2343 | + * Corrupted block numbers can get through to here, unfortunately, so we | ||
2344 | + * have to check that the buffer falls within the filesystem bounds. | ||
2345 | + */ | ||
2346 | + eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks); | ||
2347 | + if (blkno >= eofs) { | ||
2348 | + /* | ||
2349 | + * XXX (dgc): we should really be returning EFSCORRUPTED here, | ||
2350 | + * but none of the higher level infrastructure supports | ||
2351 | + * returning a specific error on buffer lookup failures. | ||
2352 | + */ | ||
2353 | + xfs_alert(btp->bt_mount, | ||
2354 | + "%s: Block out of range: block 0x%llx, EOFS 0x%llx ", | ||
2355 | + __func__, blkno, eofs); | ||
2356 | + return NULL; | ||
2357 | + } | ||
2358 | + | ||
2359 | /* get tree root */ | ||
2360 | pag = xfs_perag_get(btp->bt_mount, | ||
2361 | xfs_daddr_to_agno(btp->bt_mount, blkno)); | ||
2362 | diff --git a/fs/xfs/xfs_sync.c b/fs/xfs/xfs_sync.c | ||
2363 | index 9500caf..7bf85e8 100644 | ||
2364 | --- a/fs/xfs/xfs_sync.c | ||
2365 | +++ b/fs/xfs/xfs_sync.c | ||
2366 | @@ -400,7 +400,7 @@ xfs_sync_worker( | ||
2367 | * cancel_delayed_work_sync on this work queue before tearing down | ||
2368 | * the ail and the log in xfs_log_unmount. | ||
2369 | */ | ||
2370 | - if (!(mp->m_super->s_flags & MS_ACTIVE) && | ||
2371 | + if ((mp->m_super->s_flags & MS_ACTIVE) && | ||
2372 | !(mp->m_flags & XFS_MOUNT_RDONLY)) { | ||
2373 | /* dgc: errors ignored here */ | ||
2374 | if (mp->m_super->s_writers.frozen == SB_UNFROZEN && | ||
2375 | diff --git a/include/linux/efi.h b/include/linux/efi.h | ||
2376 | index 8670eb1..b424f64 100644 | ||
2377 | --- a/include/linux/efi.h | ||
2378 | +++ b/include/linux/efi.h | ||
2379 | @@ -542,18 +542,30 @@ extern int __init efi_setup_pcdp_console(char *); | ||
2380 | #endif | ||
2381 | |||
2382 | /* | ||
2383 | - * We play games with efi_enabled so that the compiler will, if possible, remove | ||
2384 | - * EFI-related code altogether. | ||
2385 | + * We play games with efi_enabled so that the compiler will, if | ||
2386 | + * possible, remove EFI-related code altogether. | ||
2387 | */ | ||
2388 | +#define EFI_BOOT 0 /* Were we booted from EFI? */ | ||
2389 | +#define EFI_SYSTEM_TABLES 1 /* Can we use EFI system tables? */ | ||
2390 | +#define EFI_CONFIG_TABLES 2 /* Can we use EFI config tables? */ | ||
2391 | +#define EFI_RUNTIME_SERVICES 3 /* Can we use runtime services? */ | ||
2392 | +#define EFI_MEMMAP 4 /* Can we use EFI memory map? */ | ||
2393 | +#define EFI_64BIT 5 /* Is the firmware 64-bit? */ | ||
2394 | + | ||
2395 | #ifdef CONFIG_EFI | ||
2396 | # ifdef CONFIG_X86 | ||
2397 | - extern int efi_enabled; | ||
2398 | - extern bool efi_64bit; | ||
2399 | +extern int efi_enabled(int facility); | ||
2400 | # else | ||
2401 | -# define efi_enabled 1 | ||
2402 | +static inline int efi_enabled(int facility) | ||
2403 | +{ | ||
2404 | + return 1; | ||
2405 | +} | ||
2406 | # endif | ||
2407 | #else | ||
2408 | -# define efi_enabled 0 | ||
2409 | +static inline int efi_enabled(int facility) | ||
2410 | +{ | ||
2411 | + return 0; | ||
2412 | +} | ||
2413 | #endif | ||
2414 | |||
2415 | /* | ||
2416 | diff --git a/include/net/netfilter/nf_conntrack_core.h b/include/net/netfilter/nf_conntrack_core.h | ||
2417 | index d8f5b9f..e98aeb3 100644 | ||
2418 | --- a/include/net/netfilter/nf_conntrack_core.h | ||
2419 | +++ b/include/net/netfilter/nf_conntrack_core.h | ||
2420 | @@ -31,6 +31,8 @@ extern void nf_conntrack_cleanup(struct net *net); | ||
2421 | extern int nf_conntrack_proto_init(struct net *net); | ||
2422 | extern void nf_conntrack_proto_fini(struct net *net); | ||
2423 | |||
2424 | +extern void nf_conntrack_cleanup_end(void); | ||
2425 | + | ||
2426 | extern bool | ||
2427 | nf_ct_get_tuple(const struct sk_buff *skb, | ||
2428 | unsigned int nhoff, | ||
2429 | diff --git a/include/net/netns/x_tables.h b/include/net/netns/x_tables.h | ||
2430 | index 591db7d..c24060e 100644 | ||
2431 | --- a/include/net/netns/x_tables.h | ||
2432 | +++ b/include/net/netns/x_tables.h | ||
2433 | @@ -8,6 +8,7 @@ struct ebt_table; | ||
2434 | |||
2435 | struct netns_xt { | ||
2436 | struct list_head tables[NFPROTO_NUMPROTO]; | ||
2437 | + bool notrack_deprecated_warning; | ||
2438 | #if defined(CONFIG_BRIDGE_NF_EBTABLES) || \ | ||
2439 | defined(CONFIG_BRIDGE_NF_EBTABLES_MODULE) | ||
2440 | struct ebt_table *broute_table; | ||
2441 | diff --git a/init/main.c b/init/main.c | ||
2442 | index cd147a9..857166f 100644 | ||
2443 | --- a/init/main.c | ||
2444 | +++ b/init/main.c | ||
2445 | @@ -604,7 +604,7 @@ asmlinkage void __init start_kernel(void) | ||
2446 | pidmap_init(); | ||
2447 | anon_vma_init(); | ||
2448 | #ifdef CONFIG_X86 | ||
2449 | - if (efi_enabled) | ||
2450 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) | ||
2451 | efi_enter_virtual_mode(); | ||
2452 | #endif | ||
2453 | thread_info_cache_init(); | ||
2454 | @@ -632,7 +632,7 @@ asmlinkage void __init start_kernel(void) | ||
2455 | acpi_early_init(); /* before LAPIC and SMP init */ | ||
2456 | sfi_init_late(); | ||
2457 | |||
2458 | - if (efi_enabled) { | ||
2459 | + if (efi_enabled(EFI_RUNTIME_SERVICES)) { | ||
2460 | efi_late_init(); | ||
2461 | efi_free_boot_services(); | ||
2462 | } | ||
2463 | diff --git a/kernel/smp.c b/kernel/smp.c | ||
2464 | index 29dd40a..69f38bd 100644 | ||
2465 | --- a/kernel/smp.c | ||
2466 | +++ b/kernel/smp.c | ||
2467 | @@ -33,6 +33,7 @@ struct call_function_data { | ||
2468 | struct call_single_data csd; | ||
2469 | atomic_t refs; | ||
2470 | cpumask_var_t cpumask; | ||
2471 | + cpumask_var_t cpumask_ipi; | ||
2472 | }; | ||
2473 | |||
2474 | static DEFINE_PER_CPU_SHARED_ALIGNED(struct call_function_data, cfd_data); | ||
2475 | @@ -56,6 +57,9 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
2476 | if (!zalloc_cpumask_var_node(&cfd->cpumask, GFP_KERNEL, | ||
2477 | cpu_to_node(cpu))) | ||
2478 | return notifier_from_errno(-ENOMEM); | ||
2479 | + if (!zalloc_cpumask_var_node(&cfd->cpumask_ipi, GFP_KERNEL, | ||
2480 | + cpu_to_node(cpu))) | ||
2481 | + return notifier_from_errno(-ENOMEM); | ||
2482 | break; | ||
2483 | |||
2484 | #ifdef CONFIG_HOTPLUG_CPU | ||
2485 | @@ -65,6 +69,7 @@ hotplug_cfd(struct notifier_block *nfb, unsigned long action, void *hcpu) | ||
2486 | case CPU_DEAD: | ||
2487 | case CPU_DEAD_FROZEN: | ||
2488 | free_cpumask_var(cfd->cpumask); | ||
2489 | + free_cpumask_var(cfd->cpumask_ipi); | ||
2490 | break; | ||
2491 | #endif | ||
2492 | }; | ||
2493 | @@ -526,6 +531,12 @@ void smp_call_function_many(const struct cpumask *mask, | ||
2494 | return; | ||
2495 | } | ||
2496 | |||
2497 | + /* | ||
2498 | + * After we put an entry into the list, data->cpumask | ||
2499 | + * may be cleared again when another CPU sends another IPI for | ||
2500 | + * a SMP function call, so data->cpumask will be zero. | ||
2501 | + */ | ||
2502 | + cpumask_copy(data->cpumask_ipi, data->cpumask); | ||
2503 | raw_spin_lock_irqsave(&call_function.lock, flags); | ||
2504 | /* | ||
2505 | * Place entry at the _HEAD_ of the list, so that any cpu still | ||
2506 | @@ -549,7 +560,7 @@ void smp_call_function_many(const struct cpumask *mask, | ||
2507 | smp_mb(); | ||
2508 | |||
2509 | /* Send a message to all CPUs in the map */ | ||
2510 | - arch_send_call_function_ipi_mask(data->cpumask); | ||
2511 | + arch_send_call_function_ipi_mask(data->cpumask_ipi); | ||
2512 | |||
2513 | /* Optionally wait for the CPUs to complete */ | ||
2514 | if (wait) | ||
2515 | diff --git a/mm/slub.c b/mm/slub.c | ||
2516 | index a0d6984..321afab 100644 | ||
2517 | --- a/mm/slub.c | ||
2518 | +++ b/mm/slub.c | ||
2519 | @@ -3279,6 +3279,7 @@ static struct kmem_cache *__init create_kmalloc_cache(const char *name, | ||
2520 | if (kmem_cache_open(s, flags)) | ||
2521 | goto panic; | ||
2522 | |||
2523 | + s->refcount = 1; | ||
2524 | list_add(&s->list, &slab_caches); | ||
2525 | return s; | ||
2526 | |||
2527 | diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c | ||
2528 | index 2022b43..7c40d1e 100644 | ||
2529 | --- a/net/bluetooth/hci_event.c | ||
2530 | +++ b/net/bluetooth/hci_event.c | ||
2531 | @@ -2394,7 +2394,7 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | ||
2532 | if (ev->opcode != HCI_OP_NOP) | ||
2533 | del_timer(&hdev->cmd_timer); | ||
2534 | |||
2535 | - if (ev->ncmd) { | ||
2536 | + if (ev->ncmd && !test_bit(HCI_RESET, &hdev->flags)) { | ||
2537 | atomic_set(&hdev->cmd_cnt, 1); | ||
2538 | if (!skb_queue_empty(&hdev->cmd_q)) | ||
2539 | queue_work(hdev->workqueue, &hdev->cmd_work); | ||
2540 | diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c | ||
2541 | index ccd985d..03652f3 100644 | ||
2542 | --- a/net/bluetooth/hidp/core.c | ||
2543 | +++ b/net/bluetooth/hidp/core.c | ||
2544 | @@ -931,7 +931,7 @@ static int hidp_setup_hid(struct hidp_session *session, | ||
2545 | hid->version = req->version; | ||
2546 | hid->country = req->country; | ||
2547 | |||
2548 | - strncpy(hid->name, req->name, 128); | ||
2549 | + strncpy(hid->name, req->name, sizeof(req->name) - 1); | ||
2550 | strncpy(hid->phys, batostr(&bt_sk(session->ctrl_sock->sk)->src), 64); | ||
2551 | strncpy(hid->uniq, batostr(&bt_sk(session->ctrl_sock->sk)->dst), 64); | ||
2552 | |||
2553 | diff --git a/net/ipv4/netfilter/ipt_REJECT.c b/net/ipv4/netfilter/ipt_REJECT.c | ||
2554 | index 51f13f8..04b18c1 100644 | ||
2555 | --- a/net/ipv4/netfilter/ipt_REJECT.c | ||
2556 | +++ b/net/ipv4/netfilter/ipt_REJECT.c | ||
2557 | @@ -81,6 +81,7 @@ static void send_reset(struct sk_buff *oldskb, int hook) | ||
2558 | niph->saddr = oiph->daddr; | ||
2559 | niph->daddr = oiph->saddr; | ||
2560 | |||
2561 | + skb_reset_transport_header(nskb); | ||
2562 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); | ||
2563 | memset(tcph, 0, sizeof(*tcph)); | ||
2564 | tcph->source = oth->dest; | ||
2565 | diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c | ||
2566 | index fd4fb34..029623d 100644 | ||
2567 | --- a/net/ipv6/netfilter/ip6t_REJECT.c | ||
2568 | +++ b/net/ipv6/netfilter/ip6t_REJECT.c | ||
2569 | @@ -132,6 +132,7 @@ static void send_reset(struct net *net, struct sk_buff *oldskb) | ||
2570 | ip6h->saddr = oip6h->daddr; | ||
2571 | ip6h->daddr = oip6h->saddr; | ||
2572 | |||
2573 | + skb_reset_transport_header(nskb); | ||
2574 | tcph = (struct tcphdr *)skb_put(nskb, sizeof(struct tcphdr)); | ||
2575 | /* Truncate to length (no data) */ | ||
2576 | tcph->doff = sizeof(struct tcphdr)/4; | ||
2577 | diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
2578 | index 22c8ea9..3dacecc 100644 | ||
2579 | --- a/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
2580 | +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | ||
2581 | @@ -311,7 +311,10 @@ found: | ||
2582 | else | ||
2583 | fq->q.fragments = skb; | ||
2584 | |||
2585 | - skb->dev = NULL; | ||
2586 | + if (skb->dev) { | ||
2587 | + fq->iif = skb->dev->ifindex; | ||
2588 | + skb->dev = NULL; | ||
2589 | + } | ||
2590 | fq->q.stamp = skb->tstamp; | ||
2591 | fq->q.meat += skb->len; | ||
2592 | if (payload_len > fq->q.max_size) | ||
2593 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c | ||
2594 | index 7371f67..494da7f 100644 | ||
2595 | --- a/net/mac80211/cfg.c | ||
2596 | +++ b/net/mac80211/cfg.c | ||
2597 | @@ -164,7 +164,17 @@ static int ieee80211_add_key(struct wiphy *wiphy, struct net_device *dev, | ||
2598 | sta = sta_info_get(sdata, mac_addr); | ||
2599 | else | ||
2600 | sta = sta_info_get_bss(sdata, mac_addr); | ||
2601 | - if (!sta) { | ||
2602 | + /* | ||
2603 | + * The ASSOC test makes sure the driver is ready to | ||
2604 | + * receive the key. When wpa_supplicant has roamed | ||
2605 | + * using FT, it attempts to set the key before | ||
2606 | + * association has completed, this rejects that attempt | ||
2607 | + * so it will set the key again after assocation. | ||
2608 | + * | ||
2609 | + * TODO: accept the key if we have a station entry and | ||
2610 | + * add it to the device after the station. | ||
2611 | + */ | ||
2612 | + if (!sta || !test_sta_flag(sta, WLAN_STA_ASSOC)) { | ||
2613 | ieee80211_key_free(sdata->local, key); | ||
2614 | err = -ENOENT; | ||
2615 | goto out_unlock; | ||
2616 | diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h | ||
2617 | index 3da215c..493e2e8 100644 | ||
2618 | --- a/net/mac80211/ieee80211_i.h | ||
2619 | +++ b/net/mac80211/ieee80211_i.h | ||
2620 | @@ -1279,10 +1279,8 @@ int ieee80211_request_sched_scan_stop(struct ieee80211_sub_if_data *sdata); | ||
2621 | void ieee80211_sched_scan_stopped_work(struct work_struct *work); | ||
2622 | |||
2623 | /* off-channel helpers */ | ||
2624 | -void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
2625 | - bool offchannel_ps_enable); | ||
2626 | -void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
2627 | - bool offchannel_ps_disable); | ||
2628 | +void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local); | ||
2629 | +void ieee80211_offchannel_return(struct ieee80211_local *local); | ||
2630 | void ieee80211_roc_setup(struct ieee80211_local *local); | ||
2631 | void ieee80211_start_next_roc(struct ieee80211_local *local); | ||
2632 | void ieee80211_roc_purge(struct ieee80211_sub_if_data *sdata); | ||
2633 | diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c | ||
2634 | index 2c84185..b88152f 100644 | ||
2635 | --- a/net/mac80211/offchannel.c | ||
2636 | +++ b/net/mac80211/offchannel.c | ||
2637 | @@ -102,8 +102,7 @@ static void ieee80211_offchannel_ps_disable(struct ieee80211_sub_if_data *sdata) | ||
2638 | ieee80211_sta_reset_conn_monitor(sdata); | ||
2639 | } | ||
2640 | |||
2641 | -void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
2642 | - bool offchannel_ps_enable) | ||
2643 | +void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local) | ||
2644 | { | ||
2645 | struct ieee80211_sub_if_data *sdata; | ||
2646 | |||
2647 | @@ -131,8 +130,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
2648 | |||
2649 | if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { | ||
2650 | netif_tx_stop_all_queues(sdata->dev); | ||
2651 | - if (offchannel_ps_enable && | ||
2652 | - (sdata->vif.type == NL80211_IFTYPE_STATION) && | ||
2653 | + if (sdata->vif.type == NL80211_IFTYPE_STATION && | ||
2654 | sdata->u.mgd.associated) | ||
2655 | ieee80211_offchannel_ps_enable(sdata); | ||
2656 | } | ||
2657 | @@ -140,8 +138,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local, | ||
2658 | mutex_unlock(&local->iflist_mtx); | ||
2659 | } | ||
2660 | |||
2661 | -void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
2662 | - bool offchannel_ps_disable) | ||
2663 | +void ieee80211_offchannel_return(struct ieee80211_local *local) | ||
2664 | { | ||
2665 | struct ieee80211_sub_if_data *sdata; | ||
2666 | |||
2667 | @@ -157,11 +154,9 @@ void ieee80211_offchannel_return(struct ieee80211_local *local, | ||
2668 | continue; | ||
2669 | |||
2670 | /* Tell AP we're back */ | ||
2671 | - if (offchannel_ps_disable && | ||
2672 | - sdata->vif.type == NL80211_IFTYPE_STATION) { | ||
2673 | - if (sdata->u.mgd.associated) | ||
2674 | - ieee80211_offchannel_ps_disable(sdata); | ||
2675 | - } | ||
2676 | + if (sdata->vif.type == NL80211_IFTYPE_STATION && | ||
2677 | + sdata->u.mgd.associated) | ||
2678 | + ieee80211_offchannel_ps_disable(sdata); | ||
2679 | |||
2680 | if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { | ||
2681 | /* | ||
2682 | @@ -381,7 +376,7 @@ void ieee80211_sw_roc_work(struct work_struct *work) | ||
2683 | local->tmp_channel = NULL; | ||
2684 | ieee80211_hw_config(local, 0); | ||
2685 | |||
2686 | - ieee80211_offchannel_return(local, true); | ||
2687 | + ieee80211_offchannel_return(local); | ||
2688 | } | ||
2689 | |||
2690 | ieee80211_recalc_idle(local); | ||
2691 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c | ||
2692 | index fab706f..f41b1bd 100644 | ||
2693 | --- a/net/mac80211/scan.c | ||
2694 | +++ b/net/mac80211/scan.c | ||
2695 | @@ -310,7 +310,7 @@ static void __ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted, | ||
2696 | if (!was_hw_scan) { | ||
2697 | ieee80211_configure_filter(local); | ||
2698 | drv_sw_scan_complete(local); | ||
2699 | - ieee80211_offchannel_return(local, true); | ||
2700 | + ieee80211_offchannel_return(local); | ||
2701 | } | ||
2702 | |||
2703 | ieee80211_recalc_idle(local); | ||
2704 | @@ -355,7 +355,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local) | ||
2705 | local->next_scan_state = SCAN_DECISION; | ||
2706 | local->scan_channel_idx = 0; | ||
2707 | |||
2708 | - ieee80211_offchannel_stop_vifs(local, true); | ||
2709 | + ieee80211_offchannel_stop_vifs(local); | ||
2710 | |||
2711 | ieee80211_configure_filter(local); | ||
2712 | |||
2713 | @@ -680,12 +680,8 @@ static void ieee80211_scan_state_suspend(struct ieee80211_local *local, | ||
2714 | local->scan_channel = NULL; | ||
2715 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL); | ||
2716 | |||
2717 | - /* | ||
2718 | - * Re-enable vifs and beaconing. Leave PS | ||
2719 | - * in off-channel state..will put that back | ||
2720 | - * on-channel at the end of scanning. | ||
2721 | - */ | ||
2722 | - ieee80211_offchannel_return(local, false); | ||
2723 | + /* disable PS */ | ||
2724 | + ieee80211_offchannel_return(local); | ||
2725 | |||
2726 | *next_delay = HZ / 5; | ||
2727 | /* afterwards, resume scan & go to next channel */ | ||
2728 | @@ -695,8 +691,7 @@ static void ieee80211_scan_state_suspend(struct ieee80211_local *local, | ||
2729 | static void ieee80211_scan_state_resume(struct ieee80211_local *local, | ||
2730 | unsigned long *next_delay) | ||
2731 | { | ||
2732 | - /* PS already is in off-channel mode */ | ||
2733 | - ieee80211_offchannel_stop_vifs(local, false); | ||
2734 | + ieee80211_offchannel_stop_vifs(local); | ||
2735 | |||
2736 | if (local->ops->flush) { | ||
2737 | drv_flush(local, false); | ||
2738 | diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig | ||
2739 | index fefa514..49e96df 100644 | ||
2740 | --- a/net/netfilter/Kconfig | ||
2741 | +++ b/net/netfilter/Kconfig | ||
2742 | @@ -680,6 +680,13 @@ config NETFILTER_XT_TARGET_NFQUEUE | ||
2743 | |||
2744 | To compile it as a module, choose M here. If unsure, say N. | ||
2745 | |||
2746 | +config NETFILTER_XT_TARGET_NOTRACK | ||
2747 | + tristate '"NOTRACK" target support (DEPRECATED)' | ||
2748 | + depends on NF_CONNTRACK | ||
2749 | + depends on IP_NF_RAW || IP6_NF_RAW | ||
2750 | + depends on NETFILTER_ADVANCED | ||
2751 | + select NETFILTER_XT_TARGET_CT | ||
2752 | + | ||
2753 | config NETFILTER_XT_TARGET_RATEEST | ||
2754 | tristate '"RATEEST" target support' | ||
2755 | depends on NETFILTER_ADVANCED | ||
2756 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c | ||
2757 | index 0f241be..ec02168 100644 | ||
2758 | --- a/net/netfilter/nf_conntrack_core.c | ||
2759 | +++ b/net/netfilter/nf_conntrack_core.c | ||
2760 | @@ -1383,11 +1383,12 @@ void nf_conntrack_cleanup(struct net *net) | ||
2761 | synchronize_net(); | ||
2762 | nf_conntrack_proto_fini(net); | ||
2763 | nf_conntrack_cleanup_net(net); | ||
2764 | +} | ||
2765 | |||
2766 | - if (net_eq(net, &init_net)) { | ||
2767 | - RCU_INIT_POINTER(nf_ct_destroy, NULL); | ||
2768 | - nf_conntrack_cleanup_init_net(); | ||
2769 | - } | ||
2770 | +void nf_conntrack_cleanup_end(void) | ||
2771 | +{ | ||
2772 | + RCU_INIT_POINTER(nf_ct_destroy, NULL); | ||
2773 | + nf_conntrack_cleanup_init_net(); | ||
2774 | } | ||
2775 | |||
2776 | void *nf_ct_alloc_hashtable(unsigned int *sizep, int nulls) | ||
2777 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c | ||
2778 | index 7bbfb3d..ef9e86e 100644 | ||
2779 | --- a/net/netfilter/nf_conntrack_netlink.c | ||
2780 | +++ b/net/netfilter/nf_conntrack_netlink.c | ||
2781 | @@ -2514,7 +2514,7 @@ ctnetlink_create_expect(struct net *net, u16 zone, | ||
2782 | if (!help) { | ||
2783 | if (!cda[CTA_EXPECT_TIMEOUT]) { | ||
2784 | err = -EINVAL; | ||
2785 | - goto out; | ||
2786 | + goto err_out; | ||
2787 | } | ||
2788 | exp->timeout.expires = | ||
2789 | jiffies + ntohl(nla_get_be32(cda[CTA_EXPECT_TIMEOUT])) * HZ; | ||
2790 | diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c | ||
2791 | index 9b39432..df8aa3a 100644 | ||
2792 | --- a/net/netfilter/nf_conntrack_standalone.c | ||
2793 | +++ b/net/netfilter/nf_conntrack_standalone.c | ||
2794 | @@ -571,6 +571,7 @@ static int __init nf_conntrack_standalone_init(void) | ||
2795 | static void __exit nf_conntrack_standalone_fini(void) | ||
2796 | { | ||
2797 | unregister_pernet_subsys(&nf_conntrack_net_ops); | ||
2798 | + nf_conntrack_cleanup_end(); | ||
2799 | } | ||
2800 | |||
2801 | module_init(nf_conntrack_standalone_init); | ||
2802 | diff --git a/net/netfilter/nfnetlink_log.c b/net/netfilter/nfnetlink_log.c | ||
2803 | index 9f199f2..92fd8ec 100644 | ||
2804 | --- a/net/netfilter/nfnetlink_log.c | ||
2805 | +++ b/net/netfilter/nfnetlink_log.c | ||
2806 | @@ -13,6 +13,7 @@ | ||
2807 | */ | ||
2808 | #include <linux/module.h> | ||
2809 | #include <linux/skbuff.h> | ||
2810 | +#include <linux/if_arp.h> | ||
2811 | #include <linux/init.h> | ||
2812 | #include <linux/ip.h> | ||
2813 | #include <linux/ipv6.h> | ||
2814 | @@ -384,6 +385,7 @@ __build_packet_message(struct nfulnl_instance *inst, | ||
2815 | struct nfgenmsg *nfmsg; | ||
2816 | sk_buff_data_t old_tail = inst->skb->tail; | ||
2817 | struct sock *sk; | ||
2818 | + const unsigned char *hwhdrp; | ||
2819 | |||
2820 | nlh = nlmsg_put(inst->skb, 0, 0, | ||
2821 | NFNL_SUBSYS_ULOG << 8 | NFULNL_MSG_PACKET, | ||
2822 | @@ -485,9 +487,17 @@ __build_packet_message(struct nfulnl_instance *inst, | ||
2823 | if (indev && skb_mac_header_was_set(skb)) { | ||
2824 | if (nla_put_be16(inst->skb, NFULA_HWTYPE, htons(skb->dev->type)) || | ||
2825 | nla_put_be16(inst->skb, NFULA_HWLEN, | ||
2826 | - htons(skb->dev->hard_header_len)) || | ||
2827 | - nla_put(inst->skb, NFULA_HWHEADER, skb->dev->hard_header_len, | ||
2828 | - skb_mac_header(skb))) | ||
2829 | + htons(skb->dev->hard_header_len))) | ||
2830 | + goto nla_put_failure; | ||
2831 | + | ||
2832 | + hwhdrp = skb_mac_header(skb); | ||
2833 | + | ||
2834 | + if (skb->dev->type == ARPHRD_SIT) | ||
2835 | + hwhdrp -= ETH_HLEN; | ||
2836 | + | ||
2837 | + if (hwhdrp >= skb->head && | ||
2838 | + nla_put(inst->skb, NFULA_HWHEADER, | ||
2839 | + skb->dev->hard_header_len, hwhdrp)) | ||
2840 | goto nla_put_failure; | ||
2841 | } | ||
2842 | |||
2843 | diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c | ||
2844 | index 8d987c3..7b3a9e5 100644 | ||
2845 | --- a/net/netfilter/x_tables.c | ||
2846 | +++ b/net/netfilter/x_tables.c | ||
2847 | @@ -345,19 +345,27 @@ int xt_find_revision(u8 af, const char *name, u8 revision, int target, | ||
2848 | } | ||
2849 | EXPORT_SYMBOL_GPL(xt_find_revision); | ||
2850 | |||
2851 | -static char *textify_hooks(char *buf, size_t size, unsigned int mask) | ||
2852 | +static char * | ||
2853 | +textify_hooks(char *buf, size_t size, unsigned int mask, uint8_t nfproto) | ||
2854 | { | ||
2855 | - static const char *const names[] = { | ||
2856 | + static const char *const inetbr_names[] = { | ||
2857 | "PREROUTING", "INPUT", "FORWARD", | ||
2858 | "OUTPUT", "POSTROUTING", "BROUTING", | ||
2859 | }; | ||
2860 | - unsigned int i; | ||
2861 | + static const char *const arp_names[] = { | ||
2862 | + "INPUT", "FORWARD", "OUTPUT", | ||
2863 | + }; | ||
2864 | + const char *const *names; | ||
2865 | + unsigned int i, max; | ||
2866 | char *p = buf; | ||
2867 | bool np = false; | ||
2868 | int res; | ||
2869 | |||
2870 | + names = (nfproto == NFPROTO_ARP) ? arp_names : inetbr_names; | ||
2871 | + max = (nfproto == NFPROTO_ARP) ? ARRAY_SIZE(arp_names) : | ||
2872 | + ARRAY_SIZE(inetbr_names); | ||
2873 | *p = '\0'; | ||
2874 | - for (i = 0; i < ARRAY_SIZE(names); ++i) { | ||
2875 | + for (i = 0; i < max; ++i) { | ||
2876 | if (!(mask & (1 << i))) | ||
2877 | continue; | ||
2878 | res = snprintf(p, size, "%s%s", np ? "/" : "", names[i]); | ||
2879 | @@ -402,8 +410,10 @@ int xt_check_match(struct xt_mtchk_param *par, | ||
2880 | pr_err("%s_tables: %s match: used from hooks %s, but only " | ||
2881 | "valid from %s\n", | ||
2882 | xt_prefix[par->family], par->match->name, | ||
2883 | - textify_hooks(used, sizeof(used), par->hook_mask), | ||
2884 | - textify_hooks(allow, sizeof(allow), par->match->hooks)); | ||
2885 | + textify_hooks(used, sizeof(used), par->hook_mask, | ||
2886 | + par->family), | ||
2887 | + textify_hooks(allow, sizeof(allow), par->match->hooks, | ||
2888 | + par->family)); | ||
2889 | return -EINVAL; | ||
2890 | } | ||
2891 | if (par->match->proto && (par->match->proto != proto || inv_proto)) { | ||
2892 | @@ -575,8 +585,10 @@ int xt_check_target(struct xt_tgchk_param *par, | ||
2893 | pr_err("%s_tables: %s target: used from hooks %s, but only " | ||
2894 | "usable from %s\n", | ||
2895 | xt_prefix[par->family], par->target->name, | ||
2896 | - textify_hooks(used, sizeof(used), par->hook_mask), | ||
2897 | - textify_hooks(allow, sizeof(allow), par->target->hooks)); | ||
2898 | + textify_hooks(used, sizeof(used), par->hook_mask, | ||
2899 | + par->family), | ||
2900 | + textify_hooks(allow, sizeof(allow), par->target->hooks, | ||
2901 | + par->family)); | ||
2902 | return -EINVAL; | ||
2903 | } | ||
2904 | if (par->target->proto && (par->target->proto != proto || inv_proto)) { | ||
2905 | diff --git a/net/netfilter/xt_CT.c b/net/netfilter/xt_CT.c | ||
2906 | index ae7f5da..8461605 100644 | ||
2907 | --- a/net/netfilter/xt_CT.c | ||
2908 | +++ b/net/netfilter/xt_CT.c | ||
2909 | @@ -109,7 +109,7 @@ static int xt_ct_tg_check_v0(const struct xt_tgchk_param *par) | ||
2910 | struct xt_ct_target_info *info = par->targinfo; | ||
2911 | struct nf_conntrack_tuple t; | ||
2912 | struct nf_conn *ct; | ||
2913 | - int ret; | ||
2914 | + int ret = -EOPNOTSUPP; | ||
2915 | |||
2916 | if (info->flags & ~XT_CT_NOTRACK) | ||
2917 | return -EINVAL; | ||
2918 | @@ -243,7 +243,7 @@ static int xt_ct_tg_check_v1(const struct xt_tgchk_param *par) | ||
2919 | struct xt_ct_target_info_v1 *info = par->targinfo; | ||
2920 | struct nf_conntrack_tuple t; | ||
2921 | struct nf_conn *ct; | ||
2922 | - int ret; | ||
2923 | + int ret = -EOPNOTSUPP; | ||
2924 | |||
2925 | if (info->flags & ~XT_CT_NOTRACK) | ||
2926 | return -EINVAL; | ||
2927 | @@ -377,14 +377,60 @@ static struct xt_target xt_ct_tg_reg[] __read_mostly = { | ||
2928 | }, | ||
2929 | }; | ||
2930 | |||
2931 | +static unsigned int | ||
2932 | +notrack_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||
2933 | +{ | ||
2934 | + /* Previously seen (loopback)? Ignore. */ | ||
2935 | + if (skb->nfct != NULL) | ||
2936 | + return XT_CONTINUE; | ||
2937 | + | ||
2938 | + skb->nfct = &nf_ct_untracked_get()->ct_general; | ||
2939 | + skb->nfctinfo = IP_CT_NEW; | ||
2940 | + nf_conntrack_get(skb->nfct); | ||
2941 | + | ||
2942 | + return XT_CONTINUE; | ||
2943 | +} | ||
2944 | + | ||
2945 | +static int notrack_chk(const struct xt_tgchk_param *par) | ||
2946 | +{ | ||
2947 | + if (!par->net->xt.notrack_deprecated_warning) { | ||
2948 | + pr_info("netfilter: NOTRACK target is deprecated, " | ||
2949 | + "use CT instead or upgrade iptables\n"); | ||
2950 | + par->net->xt.notrack_deprecated_warning = true; | ||
2951 | + } | ||
2952 | + return 0; | ||
2953 | +} | ||
2954 | + | ||
2955 | +static struct xt_target notrack_tg_reg __read_mostly = { | ||
2956 | + .name = "NOTRACK", | ||
2957 | + .revision = 0, | ||
2958 | + .family = NFPROTO_UNSPEC, | ||
2959 | + .checkentry = notrack_chk, | ||
2960 | + .target = notrack_tg, | ||
2961 | + .table = "raw", | ||
2962 | + .me = THIS_MODULE, | ||
2963 | +}; | ||
2964 | + | ||
2965 | static int __init xt_ct_tg_init(void) | ||
2966 | { | ||
2967 | - return xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | ||
2968 | + int ret; | ||
2969 | + | ||
2970 | + ret = xt_register_target(¬rack_tg_reg); | ||
2971 | + if (ret < 0) | ||
2972 | + return ret; | ||
2973 | + | ||
2974 | + ret = xt_register_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | ||
2975 | + if (ret < 0) { | ||
2976 | + xt_unregister_target(¬rack_tg_reg); | ||
2977 | + return ret; | ||
2978 | + } | ||
2979 | + return 0; | ||
2980 | } | ||
2981 | |||
2982 | static void __exit xt_ct_tg_exit(void) | ||
2983 | { | ||
2984 | xt_unregister_targets(xt_ct_tg_reg, ARRAY_SIZE(xt_ct_tg_reg)); | ||
2985 | + xt_unregister_target(¬rack_tg_reg); | ||
2986 | } | ||
2987 | |||
2988 | module_init(xt_ct_tg_init); | ||
2989 | @@ -394,3 +440,5 @@ MODULE_LICENSE("GPL"); | ||
2990 | MODULE_DESCRIPTION("Xtables: connection tracking target"); | ||
2991 | MODULE_ALIAS("ipt_CT"); | ||
2992 | MODULE_ALIAS("ip6t_CT"); | ||
2993 | +MODULE_ALIAS("ipt_NOTRACK"); | ||
2994 | +MODULE_ALIAS("ip6t_NOTRACK"); | ||
2995 | diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c | ||
2996 | index 26a668a..a9d7af9 100644 | ||
2997 | --- a/net/netfilter/xt_hashlimit.c | ||
2998 | +++ b/net/netfilter/xt_hashlimit.c | ||
2999 | @@ -157,11 +157,22 @@ dsthash_find(const struct xt_hashlimit_htable *ht, | ||
3000 | /* allocate dsthash_ent, initialize dst, put in htable and lock it */ | ||
3001 | static struct dsthash_ent * | ||
3002 | dsthash_alloc_init(struct xt_hashlimit_htable *ht, | ||
3003 | - const struct dsthash_dst *dst) | ||
3004 | + const struct dsthash_dst *dst, bool *race) | ||
3005 | { | ||
3006 | struct dsthash_ent *ent; | ||
3007 | |||
3008 | spin_lock(&ht->lock); | ||
3009 | + | ||
3010 | + /* Two or more packets may race to create the same entry in the | ||
3011 | + * hashtable, double check if this packet lost race. | ||
3012 | + */ | ||
3013 | + ent = dsthash_find(ht, dst); | ||
3014 | + if (ent != NULL) { | ||
3015 | + spin_unlock(&ht->lock); | ||
3016 | + *race = true; | ||
3017 | + return ent; | ||
3018 | + } | ||
3019 | + | ||
3020 | /* initialize hash with random val at the time we allocate | ||
3021 | * the first hashtable entry */ | ||
3022 | if (unlikely(!ht->rnd_initialized)) { | ||
3023 | @@ -318,7 +329,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo) | ||
3024 | parent = hashlimit_net->ipt_hashlimit; | ||
3025 | else | ||
3026 | parent = hashlimit_net->ip6t_hashlimit; | ||
3027 | - remove_proc_entry(hinfo->pde->name, parent); | ||
3028 | + | ||
3029 | + if(parent != NULL) | ||
3030 | + remove_proc_entry(hinfo->pde->name, parent); | ||
3031 | + | ||
3032 | htable_selective_cleanup(hinfo, select_all); | ||
3033 | vfree(hinfo); | ||
3034 | } | ||
3035 | @@ -585,6 +599,7 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par) | ||
3036 | unsigned long now = jiffies; | ||
3037 | struct dsthash_ent *dh; | ||
3038 | struct dsthash_dst dst; | ||
3039 | + bool race = false; | ||
3040 | u32 cost; | ||
3041 | |||
3042 | if (hashlimit_init_dst(hinfo, &dst, skb, par->thoff) < 0) | ||
3043 | @@ -593,13 +608,18 @@ hashlimit_mt(const struct sk_buff *skb, struct xt_action_param *par) | ||
3044 | rcu_read_lock_bh(); | ||
3045 | dh = dsthash_find(hinfo, &dst); | ||
3046 | if (dh == NULL) { | ||
3047 | - dh = dsthash_alloc_init(hinfo, &dst); | ||
3048 | + dh = dsthash_alloc_init(hinfo, &dst, &race); | ||
3049 | if (dh == NULL) { | ||
3050 | rcu_read_unlock_bh(); | ||
3051 | goto hotdrop; | ||
3052 | + } else if (race) { | ||
3053 | + /* Already got an entry, update expiration timeout */ | ||
3054 | + dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); | ||
3055 | + rateinfo_recalc(dh, now, hinfo->cfg.mode); | ||
3056 | + } else { | ||
3057 | + dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire); | ||
3058 | + rateinfo_init(dh, hinfo); | ||
3059 | } | ||
3060 | - dh->expires = jiffies + msecs_to_jiffies(hinfo->cfg.expire); | ||
3061 | - rateinfo_init(dh, hinfo); | ||
3062 | } else { | ||
3063 | /* update expiration timeout */ | ||
3064 | dh->expires = now + msecs_to_jiffies(hinfo->cfg.expire); | ||
3065 | @@ -856,6 +876,27 @@ static int __net_init hashlimit_proc_net_init(struct net *net) | ||
3066 | |||
3067 | static void __net_exit hashlimit_proc_net_exit(struct net *net) | ||
3068 | { | ||
3069 | + struct xt_hashlimit_htable *hinfo; | ||
3070 | + struct hlist_node *pos; | ||
3071 | + struct proc_dir_entry *pde; | ||
3072 | + struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); | ||
3073 | + | ||
3074 | + /* recent_net_exit() is called before recent_mt_destroy(). Make sure | ||
3075 | + * that the parent xt_recent proc entry is is empty before trying to | ||
3076 | + * remove it. | ||
3077 | + */ | ||
3078 | + mutex_lock(&hashlimit_mutex); | ||
3079 | + pde = hashlimit_net->ipt_hashlimit; | ||
3080 | + if (pde == NULL) | ||
3081 | + pde = hashlimit_net->ip6t_hashlimit; | ||
3082 | + | ||
3083 | + hlist_for_each_entry(hinfo, pos, &hashlimit_net->htables, node) | ||
3084 | + remove_proc_entry(hinfo->pde->name, pde); | ||
3085 | + | ||
3086 | + hashlimit_net->ipt_hashlimit = NULL; | ||
3087 | + hashlimit_net->ip6t_hashlimit = NULL; | ||
3088 | + mutex_unlock(&hashlimit_mutex); | ||
3089 | + | ||
3090 | proc_net_remove(net, "ipt_hashlimit"); | ||
3091 | #if IS_ENABLED(CONFIG_IP6_NF_IPTABLES) | ||
3092 | proc_net_remove(net, "ip6t_hashlimit"); | ||
3093 | @@ -872,9 +913,6 @@ static int __net_init hashlimit_net_init(struct net *net) | ||
3094 | |||
3095 | static void __net_exit hashlimit_net_exit(struct net *net) | ||
3096 | { | ||
3097 | - struct hashlimit_net *hashlimit_net = hashlimit_pernet(net); | ||
3098 | - | ||
3099 | - BUG_ON(!hlist_empty(&hashlimit_net->htables)); | ||
3100 | hashlimit_proc_net_exit(net); | ||
3101 | } | ||
3102 | |||
3103 | diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c | ||
3104 | index 4635c9b..978efc9 100644 | ||
3105 | --- a/net/netfilter/xt_recent.c | ||
3106 | +++ b/net/netfilter/xt_recent.c | ||
3107 | @@ -29,6 +29,7 @@ | ||
3108 | #include <linux/skbuff.h> | ||
3109 | #include <linux/inet.h> | ||
3110 | #include <linux/slab.h> | ||
3111 | +#include <linux/vmalloc.h> | ||
3112 | #include <net/net_namespace.h> | ||
3113 | #include <net/netns/generic.h> | ||
3114 | |||
3115 | @@ -310,6 +311,14 @@ out: | ||
3116 | return ret; | ||
3117 | } | ||
3118 | |||
3119 | +static void recent_table_free(void *addr) | ||
3120 | +{ | ||
3121 | + if (is_vmalloc_addr(addr)) | ||
3122 | + vfree(addr); | ||
3123 | + else | ||
3124 | + kfree(addr); | ||
3125 | +} | ||
3126 | + | ||
3127 | static int recent_mt_check(const struct xt_mtchk_param *par, | ||
3128 | const struct xt_recent_mtinfo_v1 *info) | ||
3129 | { | ||
3130 | @@ -322,6 +331,7 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | ||
3131 | #endif | ||
3132 | unsigned int i; | ||
3133 | int ret = -EINVAL; | ||
3134 | + size_t sz; | ||
3135 | |||
3136 | if (unlikely(!hash_rnd_inited)) { | ||
3137 | get_random_bytes(&hash_rnd, sizeof(hash_rnd)); | ||
3138 | @@ -360,8 +370,11 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | ||
3139 | goto out; | ||
3140 | } | ||
3141 | |||
3142 | - t = kzalloc(sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size, | ||
3143 | - GFP_KERNEL); | ||
3144 | + sz = sizeof(*t) + sizeof(t->iphash[0]) * ip_list_hash_size; | ||
3145 | + if (sz <= PAGE_SIZE) | ||
3146 | + t = kzalloc(sz, GFP_KERNEL); | ||
3147 | + else | ||
3148 | + t = vzalloc(sz); | ||
3149 | if (t == NULL) { | ||
3150 | ret = -ENOMEM; | ||
3151 | goto out; | ||
3152 | @@ -377,14 +390,14 @@ static int recent_mt_check(const struct xt_mtchk_param *par, | ||
3153 | uid = make_kuid(&init_user_ns, ip_list_uid); | ||
3154 | gid = make_kgid(&init_user_ns, ip_list_gid); | ||
3155 | if (!uid_valid(uid) || !gid_valid(gid)) { | ||
3156 | - kfree(t); | ||
3157 | + recent_table_free(t); | ||
3158 | ret = -EINVAL; | ||
3159 | goto out; | ||
3160 | } | ||
3161 | pde = proc_create_data(t->name, ip_list_perms, recent_net->xt_recent, | ||
3162 | &recent_mt_fops, t); | ||
3163 | if (pde == NULL) { | ||
3164 | - kfree(t); | ||
3165 | + recent_table_free(t); | ||
3166 | ret = -ENOMEM; | ||
3167 | goto out; | ||
3168 | } | ||
3169 | @@ -431,10 +444,11 @@ static void recent_mt_destroy(const struct xt_mtdtor_param *par) | ||
3170 | list_del(&t->list); | ||
3171 | spin_unlock_bh(&recent_lock); | ||
3172 | #ifdef CONFIG_PROC_FS | ||
3173 | - remove_proc_entry(t->name, recent_net->xt_recent); | ||
3174 | + if (recent_net->xt_recent != NULL) | ||
3175 | + remove_proc_entry(t->name, recent_net->xt_recent); | ||
3176 | #endif | ||
3177 | recent_table_flush(t); | ||
3178 | - kfree(t); | ||
3179 | + recent_table_free(t); | ||
3180 | } | ||
3181 | mutex_unlock(&recent_mutex); | ||
3182 | } | ||
3183 | @@ -615,6 +629,20 @@ static int __net_init recent_proc_net_init(struct net *net) | ||
3184 | |||
3185 | static void __net_exit recent_proc_net_exit(struct net *net) | ||
3186 | { | ||
3187 | + struct recent_net *recent_net = recent_pernet(net); | ||
3188 | + struct recent_table *t; | ||
3189 | + | ||
3190 | + /* recent_net_exit() is called before recent_mt_destroy(). Make sure | ||
3191 | + * that the parent xt_recent proc entry is is empty before trying to | ||
3192 | + * remove it. | ||
3193 | + */ | ||
3194 | + spin_lock_bh(&recent_lock); | ||
3195 | + list_for_each_entry(t, &recent_net->tables, list) | ||
3196 | + remove_proc_entry(t->name, recent_net->xt_recent); | ||
3197 | + | ||
3198 | + recent_net->xt_recent = NULL; | ||
3199 | + spin_unlock_bh(&recent_lock); | ||
3200 | + | ||
3201 | proc_net_remove(net, "xt_recent"); | ||
3202 | } | ||
3203 | #else | ||
3204 | @@ -638,9 +666,6 @@ static int __net_init recent_net_init(struct net *net) | ||
3205 | |||
3206 | static void __net_exit recent_net_exit(struct net *net) | ||
3207 | { | ||
3208 | - struct recent_net *recent_net = recent_pernet(net); | ||
3209 | - | ||
3210 | - BUG_ON(!list_empty(&recent_net->tables)); | ||
3211 | recent_proc_net_exit(net); | ||
3212 | } | ||
3213 | |||
3214 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c | ||
3215 | index f419f0a9..078fb30 100644 | ||
3216 | --- a/sound/pci/hda/hda_intel.c | ||
3217 | +++ b/sound/pci/hda/hda_intel.c | ||
3218 | @@ -650,29 +650,43 @@ static char *driver_short_names[] DELAYED_INITDATA_MARK = { | ||
3219 | #define get_azx_dev(substream) (substream->runtime->private_data) | ||
3220 | |||
3221 | #ifdef CONFIG_X86 | ||
3222 | -static void __mark_pages_wc(struct azx *chip, void *addr, size_t size, bool on) | ||
3223 | +static void __mark_pages_wc(struct azx *chip, struct snd_dma_buffer *dmab, bool on) | ||
3224 | { | ||
3225 | + int pages; | ||
3226 | + | ||
3227 | if (azx_snoop(chip)) | ||
3228 | return; | ||
3229 | - if (addr && size) { | ||
3230 | - int pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
3231 | + if (!dmab || !dmab->area || !dmab->bytes) | ||
3232 | + return; | ||
3233 | + | ||
3234 | +#ifdef CONFIG_SND_DMA_SGBUF | ||
3235 | + if (dmab->dev.type == SNDRV_DMA_TYPE_DEV_SG) { | ||
3236 | + struct snd_sg_buf *sgbuf = dmab->private_data; | ||
3237 | if (on) | ||
3238 | - set_memory_wc((unsigned long)addr, pages); | ||
3239 | + set_pages_array_wc(sgbuf->page_table, sgbuf->pages); | ||
3240 | else | ||
3241 | - set_memory_wb((unsigned long)addr, pages); | ||
3242 | + set_pages_array_wb(sgbuf->page_table, sgbuf->pages); | ||
3243 | + return; | ||
3244 | } | ||
3245 | +#endif | ||
3246 | + | ||
3247 | + pages = (dmab->bytes + PAGE_SIZE - 1) >> PAGE_SHIFT; | ||
3248 | + if (on) | ||
3249 | + set_memory_wc((unsigned long)dmab->area, pages); | ||
3250 | + else | ||
3251 | + set_memory_wb((unsigned long)dmab->area, pages); | ||
3252 | } | ||
3253 | |||
3254 | static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf, | ||
3255 | bool on) | ||
3256 | { | ||
3257 | - __mark_pages_wc(chip, buf->area, buf->bytes, on); | ||
3258 | + __mark_pages_wc(chip, buf, on); | ||
3259 | } | ||
3260 | static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev, | ||
3261 | - struct snd_pcm_runtime *runtime, bool on) | ||
3262 | + struct snd_pcm_substream *substream, bool on) | ||
3263 | { | ||
3264 | if (azx_dev->wc_marked != on) { | ||
3265 | - __mark_pages_wc(chip, runtime->dma_area, runtime->dma_bytes, on); | ||
3266 | + __mark_pages_wc(chip, snd_pcm_get_dma_buf(substream), on); | ||
3267 | azx_dev->wc_marked = on; | ||
3268 | } | ||
3269 | } | ||
3270 | @@ -683,7 +697,7 @@ static inline void mark_pages_wc(struct azx *chip, struct snd_dma_buffer *buf, | ||
3271 | { | ||
3272 | } | ||
3273 | static inline void mark_runtime_wc(struct azx *chip, struct azx_dev *azx_dev, | ||
3274 | - struct snd_pcm_runtime *runtime, bool on) | ||
3275 | + struct snd_pcm_substream *substream, bool on) | ||
3276 | { | ||
3277 | } | ||
3278 | #endif | ||
3279 | @@ -1860,11 +1874,10 @@ static int azx_pcm_hw_params(struct snd_pcm_substream *substream, | ||
3280 | { | ||
3281 | struct azx_pcm *apcm = snd_pcm_substream_chip(substream); | ||
3282 | struct azx *chip = apcm->chip; | ||
3283 | - struct snd_pcm_runtime *runtime = substream->runtime; | ||
3284 | struct azx_dev *azx_dev = get_azx_dev(substream); | ||
3285 | int ret; | ||
3286 | |||
3287 | - mark_runtime_wc(chip, azx_dev, runtime, false); | ||
3288 | + mark_runtime_wc(chip, azx_dev, substream, false); | ||
3289 | azx_dev->bufsize = 0; | ||
3290 | azx_dev->period_bytes = 0; | ||
3291 | azx_dev->format_val = 0; | ||
3292 | @@ -1872,7 +1885,7 @@ static int azx_pcm_hw_params(struct snd_pcm_substream *substream, | ||
3293 | params_buffer_bytes(hw_params)); | ||
3294 | if (ret < 0) | ||
3295 | return ret; | ||
3296 | - mark_runtime_wc(chip, azx_dev, runtime, true); | ||
3297 | + mark_runtime_wc(chip, azx_dev, substream, true); | ||
3298 | return ret; | ||
3299 | } | ||
3300 | |||
3301 | @@ -1881,7 +1894,6 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) | ||
3302 | struct azx_pcm *apcm = snd_pcm_substream_chip(substream); | ||
3303 | struct azx_dev *azx_dev = get_azx_dev(substream); | ||
3304 | struct azx *chip = apcm->chip; | ||
3305 | - struct snd_pcm_runtime *runtime = substream->runtime; | ||
3306 | struct hda_pcm_stream *hinfo = apcm->hinfo[substream->stream]; | ||
3307 | |||
3308 | /* reset BDL address */ | ||
3309 | @@ -1894,7 +1906,7 @@ static int azx_pcm_hw_free(struct snd_pcm_substream *substream) | ||
3310 | |||
3311 | snd_hda_codec_cleanup(apcm->codec, hinfo, substream); | ||
3312 | |||
3313 | - mark_runtime_wc(chip, azx_dev, runtime, false); | ||
3314 | + mark_runtime_wc(chip, azx_dev, substream, false); | ||
3315 | return snd_pcm_lib_free_pages(substream); | ||
3316 | } | ||
3317 | |||
3318 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
3319 | index bbaf67c..c98cb89 100644 | ||
3320 | --- a/sound/pci/hda/patch_realtek.c | ||
3321 | +++ b/sound/pci/hda/patch_realtek.c | ||
3322 | @@ -4688,6 +4688,7 @@ static const struct snd_pci_quirk alc880_fixup_tbl[] = { | ||
3323 | SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB), | ||
3324 | SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810), | ||
3325 | SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM), | ||
3326 | + SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST), | ||
3327 | SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_FIXUP_F1734), | ||
3328 | SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU), | ||
3329 | SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734), | ||
3330 | @@ -5702,6 +5703,7 @@ static const struct alc_model_fixup alc268_fixup_models[] = { | ||
3331 | }; | ||
3332 | |||
3333 | static const struct snd_pci_quirk alc268_fixup_tbl[] = { | ||
3334 | + SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC), | ||
3335 | /* below is codec SSID since multiple Toshiba laptops have the | ||
3336 | * same PCI SSID 1179:ff00 | ||
3337 | */ | ||
3338 | diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c | ||
3339 | index 08ae3cb..f9d9f68 100644 | ||
3340 | --- a/sound/soc/codecs/arizona.c | ||
3341 | +++ b/sound/soc/codecs/arizona.c | ||
3342 | @@ -648,7 +648,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream, | ||
3343 | } | ||
3344 | sr_val = i; | ||
3345 | |||
3346 | - lrclk = snd_soc_params_to_bclk(params) / params_rate(params); | ||
3347 | + lrclk = rates[bclk] / params_rate(params); | ||
3348 | |||
3349 | arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n", | ||
3350 | rates[bclk], rates[bclk] / lrclk); | ||
3351 | diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c | ||
3352 | index 7ef4e96..0f2bb25 100644 | ||
3353 | --- a/sound/soc/codecs/wm2200.c | ||
3354 | +++ b/sound/soc/codecs/wm2200.c | ||
3355 | @@ -897,8 +897,6 @@ static const char *wm2200_mixer_texts[] = { | ||
3356 | "EQR", | ||
3357 | "LHPF1", | ||
3358 | "LHPF2", | ||
3359 | - "LHPF3", | ||
3360 | - "LHPF4", | ||
3361 | "DSP1.1", | ||
3362 | "DSP1.2", | ||
3363 | "DSP1.3", | ||
3364 | @@ -931,7 +929,6 @@ static int wm2200_mixer_values[] = { | ||
3365 | 0x25, | ||
3366 | 0x50, /* EQ */ | ||
3367 | 0x51, | ||
3368 | - 0x52, | ||
3369 | 0x60, /* LHPF1 */ | ||
3370 | 0x61, /* LHPF2 */ | ||
3371 | 0x68, /* DSP1 */ | ||
3372 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c | ||
3373 | index 298070e..41e8bfb 100644 | ||
3374 | --- a/sound/usb/mixer.c | ||
3375 | +++ b/sound/usb/mixer.c | ||
3376 | @@ -1259,16 +1259,23 @@ static int parse_audio_feature_unit(struct mixer_build *state, int unitid, void | ||
3377 | } | ||
3378 | channels = (hdr->bLength - 7) / csize - 1; | ||
3379 | bmaControls = hdr->bmaControls; | ||
3380 | + if (hdr->bLength < 7 + csize) { | ||
3381 | + snd_printk(KERN_ERR "usbaudio: unit %u: " | ||
3382 | + "invalid UAC_FEATURE_UNIT descriptor\n", | ||
3383 | + unitid); | ||
3384 | + return -EINVAL; | ||
3385 | + } | ||
3386 | } else { | ||
3387 | struct uac2_feature_unit_descriptor *ftr = _ftr; | ||
3388 | csize = 4; | ||
3389 | channels = (hdr->bLength - 6) / 4 - 1; | ||
3390 | bmaControls = ftr->bmaControls; | ||
3391 | - } | ||
3392 | - | ||
3393 | - if (hdr->bLength < 7 || !csize || hdr->bLength < 7 + csize) { | ||
3394 | - snd_printk(KERN_ERR "usbaudio: unit %u: invalid UAC_FEATURE_UNIT descriptor\n", unitid); | ||
3395 | - return -EINVAL; | ||
3396 | + if (hdr->bLength < 6 + csize) { | ||
3397 | + snd_printk(KERN_ERR "usbaudio: unit %u: " | ||
3398 | + "invalid UAC_FEATURE_UNIT descriptor\n", | ||
3399 | + unitid); | ||
3400 | + return -EINVAL; | ||
3401 | + } | ||
3402 | } | ||
3403 | |||
3404 | /* parse the source unit */ | ||
3405 | diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c | ||
3406 | index 9718e98..62e7bd6 100644 | ||
3407 | --- a/virt/kvm/eventfd.c | ||
3408 | +++ b/virt/kvm/eventfd.c | ||
3409 | @@ -332,7 +332,7 @@ kvm_irqfd_assign(struct kvm *kvm, struct kvm_irqfd *args) | ||
3410 | mutex_lock(&kvm->irqfds.resampler_lock); | ||
3411 | |||
3412 | list_for_each_entry(resampler, | ||
3413 | - &kvm->irqfds.resampler_list, list) { | ||
3414 | + &kvm->irqfds.resampler_list, link) { | ||
3415 | if (resampler->notifier.gsi == irqfd->gsi) { | ||
3416 | irqfd->resampler = resampler; | ||
3417 | break; |