Contents of /trunk/kernel-alx/patches-3.10/0133-3.10.34-all-fixes.patch
Parent Directory | Revision Log
Revision 2471 -
(show annotations)
(download)
(as text)
Wed Jul 2 10:42:37 2014 UTC (10 years, 2 months ago) by niro
File MIME type: application/x-xz
File size: 99225 byte(s)
Unable to calculate annotation data on binary file contents.
Wed Jul 2 10:42:37 2014 UTC (10 years, 2 months ago) by niro
File MIME type: application/x-xz
File size: 99225 byte(s)
Unable to calculate annotation data on binary file contents.
-uncompressed
1 | diff --git a/Makefile b/Makefile |
2 | index 1e602eb906fa..571a1bf14868 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 10 |
8 | -SUBLEVEL = 33 |
9 | +SUBLEVEL = 34 |
10 | EXTRAVERSION = |
11 | NAME = TOSSUG Baby Fish |
12 | |
13 | diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h |
14 | index dd64cc6f9cba..b07c09e5a0ac 100644 |
15 | --- a/arch/arm/include/asm/spinlock.h |
16 | +++ b/arch/arm/include/asm/spinlock.h |
17 | @@ -107,7 +107,7 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock) |
18 | " subs %1, %0, %0, ror #16\n" |
19 | " addeq %0, %0, %4\n" |
20 | " strexeq %2, %0, [%3]" |
21 | - : "=&r" (slock), "=&r" (contended), "=r" (res) |
22 | + : "=&r" (slock), "=&r" (contended), "=&r" (res) |
23 | : "r" (&lock->slock), "I" (1 << TICKET_SHIFT) |
24 | : "cc"); |
25 | } while (res); |
26 | diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c |
27 | index b4b1d397592b..eb83bcc70ec8 100644 |
28 | --- a/arch/arm/kernel/setup.c |
29 | +++ b/arch/arm/kernel/setup.c |
30 | @@ -530,6 +530,7 @@ void __init dump_machine_table(void) |
31 | int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
32 | { |
33 | struct membank *bank = &meminfo.bank[meminfo.nr_banks]; |
34 | + u64 aligned_start; |
35 | |
36 | if (meminfo.nr_banks >= NR_BANKS) { |
37 | printk(KERN_CRIT "NR_BANKS too low, " |
38 | @@ -542,10 +543,16 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
39 | * Size is appropriately rounded down, start is rounded up. |
40 | */ |
41 | size -= start & ~PAGE_MASK; |
42 | - bank->start = PAGE_ALIGN(start); |
43 | + aligned_start = PAGE_ALIGN(start); |
44 | |
45 | -#ifndef CONFIG_ARM_LPAE |
46 | - if (bank->start + size < bank->start) { |
47 | +#ifndef CONFIG_ARCH_PHYS_ADDR_T_64BIT |
48 | + if (aligned_start > ULONG_MAX) { |
49 | + printk(KERN_CRIT "Ignoring memory at 0x%08llx outside " |
50 | + "32-bit physical address space\n", (long long)start); |
51 | + return -EINVAL; |
52 | + } |
53 | + |
54 | + if (aligned_start + size > ULONG_MAX) { |
55 | printk(KERN_CRIT "Truncating memory at 0x%08llx to fit in " |
56 | "32-bit physical address space\n", (long long)start); |
57 | /* |
58 | @@ -553,10 +560,25 @@ int __init arm_add_memory(phys_addr_t start, phys_addr_t size) |
59 | * 32 bits, we use ULONG_MAX as the upper limit rather than 4GB. |
60 | * This means we lose a page after masking. |
61 | */ |
62 | - size = ULONG_MAX - bank->start; |
63 | + size = ULONG_MAX - aligned_start; |
64 | } |
65 | #endif |
66 | |
67 | + if (aligned_start < PHYS_OFFSET) { |
68 | + if (aligned_start + size <= PHYS_OFFSET) { |
69 | + pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n", |
70 | + aligned_start, aligned_start + size); |
71 | + return -EINVAL; |
72 | + } |
73 | + |
74 | + pr_info("Ignoring memory below PHYS_OFFSET: 0x%08llx-0x%08llx\n", |
75 | + aligned_start, (u64)PHYS_OFFSET); |
76 | + |
77 | + size -= PHYS_OFFSET - aligned_start; |
78 | + aligned_start = PHYS_OFFSET; |
79 | + } |
80 | + |
81 | + bank->start = aligned_start; |
82 | bank->size = size & ~(phys_addr_t)(PAGE_SIZE - 1); |
83 | |
84 | /* |
85 | diff --git a/arch/arm/mach-sa1100/include/mach/collie.h b/arch/arm/mach-sa1100/include/mach/collie.h |
86 | index f33679d2d3ee..50e1d850ee2e 100644 |
87 | --- a/arch/arm/mach-sa1100/include/mach/collie.h |
88 | +++ b/arch/arm/mach-sa1100/include/mach/collie.h |
89 | @@ -13,6 +13,8 @@ |
90 | #ifndef __ASM_ARCH_COLLIE_H |
91 | #define __ASM_ARCH_COLLIE_H |
92 | |
93 | +#include "hardware.h" /* Gives GPIO_MAX */ |
94 | + |
95 | extern void locomolcd_power(int on); |
96 | |
97 | #define COLLIE_SCOOP_GPIO_BASE (GPIO_MAX + 1) |
98 | diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h |
99 | index 87e6207b05e4..3d0074e10595 100644 |
100 | --- a/arch/mips/include/asm/mipsregs.h |
101 | +++ b/arch/mips/include/asm/mipsregs.h |
102 | @@ -14,6 +14,7 @@ |
103 | #define _ASM_MIPSREGS_H |
104 | |
105 | #include <linux/linkage.h> |
106 | +#include <linux/types.h> |
107 | #include <asm/hazards.h> |
108 | #include <asm/war.h> |
109 | |
110 | diff --git a/arch/powerpc/kernel/reloc_64.S b/arch/powerpc/kernel/reloc_64.S |
111 | index b47a0e1ab001..c712ecec13ba 100644 |
112 | --- a/arch/powerpc/kernel/reloc_64.S |
113 | +++ b/arch/powerpc/kernel/reloc_64.S |
114 | @@ -81,6 +81,7 @@ _GLOBAL(relocate) |
115 | |
116 | 6: blr |
117 | |
118 | +.balign 8 |
119 | p_dyn: .llong __dynamic_start - 0b |
120 | p_rela: .llong __rela_dyn_start - 0b |
121 | p_st: .llong _stext - 0b |
122 | diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S |
123 | index 73afd11799ca..df63cae573e0 100644 |
124 | --- a/arch/x86/kernel/head_32.S |
125 | +++ b/arch/x86/kernel/head_32.S |
126 | @@ -566,6 +566,10 @@ ENDPROC(early_idt_handlers) |
127 | /* This is global to keep gas from relaxing the jumps */ |
128 | ENTRY(early_idt_handler) |
129 | cld |
130 | + |
131 | + cmpl $2,(%esp) # X86_TRAP_NMI |
132 | + je is_nmi # Ignore NMI |
133 | + |
134 | cmpl $2,%ss:early_recursion_flag |
135 | je hlt_loop |
136 | incl %ss:early_recursion_flag |
137 | @@ -616,8 +620,9 @@ ex_entry: |
138 | pop %edx |
139 | pop %ecx |
140 | pop %eax |
141 | - addl $8,%esp /* drop vector number and error code */ |
142 | decl %ss:early_recursion_flag |
143 | +is_nmi: |
144 | + addl $8,%esp /* drop vector number and error code */ |
145 | iret |
146 | ENDPROC(early_idt_handler) |
147 | |
148 | diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S |
149 | index a8368608ab41..f2a9a2aa98f3 100644 |
150 | --- a/arch/x86/kernel/head_64.S |
151 | +++ b/arch/x86/kernel/head_64.S |
152 | @@ -343,6 +343,9 @@ early_idt_handlers: |
153 | ENTRY(early_idt_handler) |
154 | cld |
155 | |
156 | + cmpl $2,(%rsp) # X86_TRAP_NMI |
157 | + je is_nmi # Ignore NMI |
158 | + |
159 | cmpl $2,early_recursion_flag(%rip) |
160 | jz 1f |
161 | incl early_recursion_flag(%rip) |
162 | @@ -405,8 +408,9 @@ ENTRY(early_idt_handler) |
163 | popq %rdx |
164 | popq %rcx |
165 | popq %rax |
166 | - addq $16,%rsp # drop vector number and error code |
167 | decl early_recursion_flag(%rip) |
168 | +is_nmi: |
169 | + addq $16,%rsp # drop vector number and error code |
170 | INTERRUPT_RETURN |
171 | ENDPROC(early_idt_handler) |
172 | |
173 | diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c |
174 | index f7ea30dce238..b03ff1842547 100644 |
175 | --- a/arch/x86/kernel/i387.c |
176 | +++ b/arch/x86/kernel/i387.c |
177 | @@ -86,10 +86,19 @@ EXPORT_SYMBOL(__kernel_fpu_begin); |
178 | |
179 | void __kernel_fpu_end(void) |
180 | { |
181 | - if (use_eager_fpu()) |
182 | - math_state_restore(); |
183 | - else |
184 | + if (use_eager_fpu()) { |
185 | + /* |
186 | + * For eager fpu, most the time, tsk_used_math() is true. |
187 | + * Restore the user math as we are done with the kernel usage. |
188 | + * At few instances during thread exit, signal handling etc, |
189 | + * tsk_used_math() is false. Those few places will take proper |
190 | + * actions, so we don't need to restore the math here. |
191 | + */ |
192 | + if (likely(tsk_used_math(current))) |
193 | + math_state_restore(); |
194 | + } else { |
195 | stts(); |
196 | + } |
197 | } |
198 | EXPORT_SYMBOL(__kernel_fpu_end); |
199 | |
200 | diff --git a/arch/x86/kernel/quirks.c b/arch/x86/kernel/quirks.c |
201 | index 04ee1e2e4c02..52dbf1e400dc 100644 |
202 | --- a/arch/x86/kernel/quirks.c |
203 | +++ b/arch/x86/kernel/quirks.c |
204 | @@ -529,7 +529,7 @@ static void quirk_amd_nb_node(struct pci_dev *dev) |
205 | return; |
206 | |
207 | pci_read_config_dword(nb_ht, 0x60, &val); |
208 | - node = val & 7; |
209 | + node = pcibus_to_node(dev->bus) | (val & 7); |
210 | /* |
211 | * Some hardware may return an invalid node ID, |
212 | * so check it first: |
213 | diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
214 | index a14a6eaf871d..765210d4d925 100644 |
215 | --- a/arch/x86/kvm/svm.c |
216 | +++ b/arch/x86/kvm/svm.c |
217 | @@ -2985,10 +2985,8 @@ static int cr8_write_interception(struct vcpu_svm *svm) |
218 | u8 cr8_prev = kvm_get_cr8(&svm->vcpu); |
219 | /* instruction emulation calls kvm_set_cr8() */ |
220 | r = cr_interception(svm); |
221 | - if (irqchip_in_kernel(svm->vcpu.kvm)) { |
222 | - clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); |
223 | + if (irqchip_in_kernel(svm->vcpu.kvm)) |
224 | return r; |
225 | - } |
226 | if (cr8_prev <= kvm_get_cr8(&svm->vcpu)) |
227 | return r; |
228 | kvm_run->exit_reason = KVM_EXIT_SET_TPR; |
229 | @@ -3550,6 +3548,8 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) |
230 | if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) |
231 | return; |
232 | |
233 | + clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); |
234 | + |
235 | if (irr == -1) |
236 | return; |
237 | |
238 | diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c |
239 | index 3322b47ab7ca..c2dd598e25a2 100644 |
240 | --- a/drivers/acpi/resource.c |
241 | +++ b/drivers/acpi/resource.c |
242 | @@ -77,18 +77,24 @@ bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res) |
243 | switch (ares->type) { |
244 | case ACPI_RESOURCE_TYPE_MEMORY24: |
245 | memory24 = &ares->data.memory24; |
246 | + if (!memory24->address_length) |
247 | + return false; |
248 | acpi_dev_get_memresource(res, memory24->minimum, |
249 | memory24->address_length, |
250 | memory24->write_protect); |
251 | break; |
252 | case ACPI_RESOURCE_TYPE_MEMORY32: |
253 | memory32 = &ares->data.memory32; |
254 | + if (!memory32->address_length) |
255 | + return false; |
256 | acpi_dev_get_memresource(res, memory32->minimum, |
257 | memory32->address_length, |
258 | memory32->write_protect); |
259 | break; |
260 | case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: |
261 | fixed_memory32 = &ares->data.fixed_memory32; |
262 | + if (!fixed_memory32->address_length) |
263 | + return false; |
264 | acpi_dev_get_memresource(res, fixed_memory32->address, |
265 | fixed_memory32->address_length, |
266 | fixed_memory32->write_protect); |
267 | @@ -144,12 +150,16 @@ bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res) |
268 | switch (ares->type) { |
269 | case ACPI_RESOURCE_TYPE_IO: |
270 | io = &ares->data.io; |
271 | + if (!io->address_length) |
272 | + return false; |
273 | acpi_dev_get_ioresource(res, io->minimum, |
274 | io->address_length, |
275 | io->io_decode); |
276 | break; |
277 | case ACPI_RESOURCE_TYPE_FIXED_IO: |
278 | fixed_io = &ares->data.fixed_io; |
279 | + if (!fixed_io->address_length) |
280 | + return false; |
281 | acpi_dev_get_ioresource(res, fixed_io->address, |
282 | fixed_io->address_length, |
283 | ACPI_DECODE_10); |
284 | diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
285 | index 9c1a435d10e6..035920f2ab4d 100644 |
286 | --- a/drivers/acpi/sleep.c |
287 | +++ b/drivers/acpi/sleep.c |
288 | @@ -78,6 +78,17 @@ static int acpi_sleep_prepare(u32 acpi_state) |
289 | return 0; |
290 | } |
291 | |
292 | +static bool acpi_sleep_state_supported(u8 sleep_state) |
293 | +{ |
294 | + acpi_status status; |
295 | + u8 type_a, type_b; |
296 | + |
297 | + status = acpi_get_sleep_type_data(sleep_state, &type_a, &type_b); |
298 | + return ACPI_SUCCESS(status) && (!acpi_gbl_reduced_hardware |
299 | + || (acpi_gbl_FADT.sleep_control.address |
300 | + && acpi_gbl_FADT.sleep_status.address)); |
301 | +} |
302 | + |
303 | #ifdef CONFIG_ACPI_SLEEP |
304 | static u32 acpi_target_sleep_state = ACPI_STATE_S0; |
305 | |
306 | @@ -600,15 +611,9 @@ static void acpi_sleep_suspend_setup(void) |
307 | { |
308 | int i; |
309 | |
310 | - for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) { |
311 | - acpi_status status; |
312 | - u8 type_a, type_b; |
313 | - |
314 | - status = acpi_get_sleep_type_data(i, &type_a, &type_b); |
315 | - if (ACPI_SUCCESS(status)) { |
316 | + for (i = ACPI_STATE_S1; i < ACPI_STATE_S4; i++) |
317 | + if (acpi_sleep_state_supported(i)) |
318 | sleep_states[i] = 1; |
319 | - } |
320 | - } |
321 | |
322 | suspend_set_ops(old_suspend_ordering ? |
323 | &acpi_suspend_ops_old : &acpi_suspend_ops); |
324 | @@ -739,11 +744,7 @@ static const struct platform_hibernation_ops acpi_hibernation_ops_old = { |
325 | |
326 | static void acpi_sleep_hibernate_setup(void) |
327 | { |
328 | - acpi_status status; |
329 | - u8 type_a, type_b; |
330 | - |
331 | - status = acpi_get_sleep_type_data(ACPI_STATE_S4, &type_a, &type_b); |
332 | - if (ACPI_FAILURE(status)) |
333 | + if (!acpi_sleep_state_supported(ACPI_STATE_S4)) |
334 | return; |
335 | |
336 | hibernation_set_ops(old_suspend_ordering ? |
337 | @@ -792,8 +793,6 @@ static void acpi_power_off(void) |
338 | |
339 | int __init acpi_sleep_init(void) |
340 | { |
341 | - acpi_status status; |
342 | - u8 type_a, type_b; |
343 | char supported[ACPI_S_STATE_COUNT * 3 + 1]; |
344 | char *pos = supported; |
345 | int i; |
346 | @@ -808,8 +807,7 @@ int __init acpi_sleep_init(void) |
347 | acpi_sleep_suspend_setup(); |
348 | acpi_sleep_hibernate_setup(); |
349 | |
350 | - status = acpi_get_sleep_type_data(ACPI_STATE_S5, &type_a, &type_b); |
351 | - if (ACPI_SUCCESS(status)) { |
352 | + if (acpi_sleep_state_supported(ACPI_STATE_S5)) { |
353 | sleep_states[ACPI_STATE_S5] = 1; |
354 | pm_power_off_prepare = acpi_power_off_prepare; |
355 | pm_power_off = acpi_power_off; |
356 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
357 | index 15518fda2d2a..8b8cbe9bcb92 100644 |
358 | --- a/drivers/ata/libata-core.c |
359 | +++ b/drivers/ata/libata-core.c |
360 | @@ -4152,6 +4152,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { |
361 | |
362 | /* Seagate Momentus SpinPoint M8 seem to have FPMDA_AA issues */ |
363 | { "ST1000LM024 HN-M101MBB", "2AR10001", ATA_HORKAGE_BROKEN_FPDMA_AA }, |
364 | + { "ST1000LM024 HN-M101MBB", "2BA30001", ATA_HORKAGE_BROKEN_FPDMA_AA }, |
365 | |
366 | /* Blacklist entries taken from Silicon Image 3124/3132 |
367 | Windows driver .inf file - also several Linux problem reports */ |
368 | diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c |
369 | index 664a6ff0a823..392ad513dc04 100644 |
370 | --- a/drivers/firewire/core-device.c |
371 | +++ b/drivers/firewire/core-device.c |
372 | @@ -895,7 +895,7 @@ static int lookup_existing_device(struct device *dev, void *data) |
373 | old->config_rom_retries = 0; |
374 | fw_notice(card, "rediscovered device %s\n", dev_name(dev)); |
375 | |
376 | - PREPARE_DELAYED_WORK(&old->work, fw_device_update); |
377 | + old->workfn = fw_device_update; |
378 | fw_schedule_device_work(old, 0); |
379 | |
380 | if (current_node == card->root_node) |
381 | @@ -1054,7 +1054,7 @@ static void fw_device_init(struct work_struct *work) |
382 | if (atomic_cmpxchg(&device->state, |
383 | FW_DEVICE_INITIALIZING, |
384 | FW_DEVICE_RUNNING) == FW_DEVICE_GONE) { |
385 | - PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); |
386 | + device->workfn = fw_device_shutdown; |
387 | fw_schedule_device_work(device, SHUTDOWN_DELAY); |
388 | } else { |
389 | fw_notice(card, "created device %s: GUID %08x%08x, S%d00\n", |
390 | @@ -1175,13 +1175,20 @@ static void fw_device_refresh(struct work_struct *work) |
391 | dev_name(&device->device), fw_rcode_string(ret)); |
392 | gone: |
393 | atomic_set(&device->state, FW_DEVICE_GONE); |
394 | - PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); |
395 | + device->workfn = fw_device_shutdown; |
396 | fw_schedule_device_work(device, SHUTDOWN_DELAY); |
397 | out: |
398 | if (node_id == card->root_node->node_id) |
399 | fw_schedule_bm_work(card, 0); |
400 | } |
401 | |
402 | +static void fw_device_workfn(struct work_struct *work) |
403 | +{ |
404 | + struct fw_device *device = container_of(to_delayed_work(work), |
405 | + struct fw_device, work); |
406 | + device->workfn(work); |
407 | +} |
408 | + |
409 | void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
410 | { |
411 | struct fw_device *device; |
412 | @@ -1231,7 +1238,8 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
413 | * power-up after getting plugged in. We schedule the |
414 | * first config rom scan half a second after bus reset. |
415 | */ |
416 | - INIT_DELAYED_WORK(&device->work, fw_device_init); |
417 | + device->workfn = fw_device_init; |
418 | + INIT_DELAYED_WORK(&device->work, fw_device_workfn); |
419 | fw_schedule_device_work(device, INITIAL_DELAY); |
420 | break; |
421 | |
422 | @@ -1247,7 +1255,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
423 | if (atomic_cmpxchg(&device->state, |
424 | FW_DEVICE_RUNNING, |
425 | FW_DEVICE_INITIALIZING) == FW_DEVICE_RUNNING) { |
426 | - PREPARE_DELAYED_WORK(&device->work, fw_device_refresh); |
427 | + device->workfn = fw_device_refresh; |
428 | fw_schedule_device_work(device, |
429 | device->is_local ? 0 : INITIAL_DELAY); |
430 | } |
431 | @@ -1262,7 +1270,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
432 | smp_wmb(); /* update node_id before generation */ |
433 | device->generation = card->generation; |
434 | if (atomic_read(&device->state) == FW_DEVICE_RUNNING) { |
435 | - PREPARE_DELAYED_WORK(&device->work, fw_device_update); |
436 | + device->workfn = fw_device_update; |
437 | fw_schedule_device_work(device, 0); |
438 | } |
439 | break; |
440 | @@ -1287,7 +1295,7 @@ void fw_node_event(struct fw_card *card, struct fw_node *node, int event) |
441 | device = node->data; |
442 | if (atomic_xchg(&device->state, |
443 | FW_DEVICE_GONE) == FW_DEVICE_RUNNING) { |
444 | - PREPARE_DELAYED_WORK(&device->work, fw_device_shutdown); |
445 | + device->workfn = fw_device_shutdown; |
446 | fw_schedule_device_work(device, |
447 | list_empty(&card->link) ? 0 : SHUTDOWN_DELAY); |
448 | } |
449 | diff --git a/drivers/firewire/net.c b/drivers/firewire/net.c |
450 | index 815b0fcbe918..7bdb6fe63236 100644 |
451 | --- a/drivers/firewire/net.c |
452 | +++ b/drivers/firewire/net.c |
453 | @@ -929,8 +929,6 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, |
454 | if (rcode == RCODE_COMPLETE) { |
455 | fwnet_transmit_packet_done(ptask); |
456 | } else { |
457 | - fwnet_transmit_packet_failed(ptask); |
458 | - |
459 | if (printk_timed_ratelimit(&j, 1000) || rcode != last_rcode) { |
460 | dev_err(&ptask->dev->netdev->dev, |
461 | "fwnet_write_complete failed: %x (skipped %d)\n", |
462 | @@ -938,8 +936,10 @@ static void fwnet_write_complete(struct fw_card *card, int rcode, |
463 | |
464 | errors_skipped = 0; |
465 | last_rcode = rcode; |
466 | - } else |
467 | + } else { |
468 | errors_skipped++; |
469 | + } |
470 | + fwnet_transmit_packet_failed(ptask); |
471 | } |
472 | } |
473 | |
474 | diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c |
475 | index 47674b913843..1b1c37dd830b 100644 |
476 | --- a/drivers/firewire/sbp2.c |
477 | +++ b/drivers/firewire/sbp2.c |
478 | @@ -146,6 +146,7 @@ struct sbp2_logical_unit { |
479 | */ |
480 | int generation; |
481 | int retries; |
482 | + work_func_t workfn; |
483 | struct delayed_work work; |
484 | bool has_sdev; |
485 | bool blocked; |
486 | @@ -864,7 +865,7 @@ static void sbp2_login(struct work_struct *work) |
487 | /* set appropriate retry limit(s) in BUSY_TIMEOUT register */ |
488 | sbp2_set_busy_timeout(lu); |
489 | |
490 | - PREPARE_DELAYED_WORK(&lu->work, sbp2_reconnect); |
491 | + lu->workfn = sbp2_reconnect; |
492 | sbp2_agent_reset(lu); |
493 | |
494 | /* This was a re-login. */ |
495 | @@ -918,7 +919,7 @@ static void sbp2_login(struct work_struct *work) |
496 | * If a bus reset happened, sbp2_update will have requeued |
497 | * lu->work already. Reset the work from reconnect to login. |
498 | */ |
499 | - PREPARE_DELAYED_WORK(&lu->work, sbp2_login); |
500 | + lu->workfn = sbp2_login; |
501 | } |
502 | |
503 | static void sbp2_reconnect(struct work_struct *work) |
504 | @@ -952,7 +953,7 @@ static void sbp2_reconnect(struct work_struct *work) |
505 | lu->retries++ >= 5) { |
506 | dev_err(tgt_dev(tgt), "failed to reconnect\n"); |
507 | lu->retries = 0; |
508 | - PREPARE_DELAYED_WORK(&lu->work, sbp2_login); |
509 | + lu->workfn = sbp2_login; |
510 | } |
511 | sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5)); |
512 | |
513 | @@ -972,6 +973,13 @@ static void sbp2_reconnect(struct work_struct *work) |
514 | sbp2_conditionally_unblock(lu); |
515 | } |
516 | |
517 | +static void sbp2_lu_workfn(struct work_struct *work) |
518 | +{ |
519 | + struct sbp2_logical_unit *lu = container_of(to_delayed_work(work), |
520 | + struct sbp2_logical_unit, work); |
521 | + lu->workfn(work); |
522 | +} |
523 | + |
524 | static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) |
525 | { |
526 | struct sbp2_logical_unit *lu; |
527 | @@ -998,7 +1006,8 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry) |
528 | lu->blocked = false; |
529 | ++tgt->dont_block; |
530 | INIT_LIST_HEAD(&lu->orb_list); |
531 | - INIT_DELAYED_WORK(&lu->work, sbp2_login); |
532 | + lu->workfn = sbp2_login; |
533 | + INIT_DELAYED_WORK(&lu->work, sbp2_lu_workfn); |
534 | |
535 | list_add_tail(&lu->link, &tgt->lu_list); |
536 | return 0; |
537 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
538 | index 4c81e9faa635..1f7f3ce875c8 100644 |
539 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
540 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
541 | @@ -1281,7 +1281,7 @@ atombios_dig_transmitter_setup(struct drm_encoder *encoder, int action, uint8_t |
542 | } |
543 | if (is_dp) |
544 | args.v5.ucLaneNum = dp_lane_count; |
545 | - else if (radeon_encoder->pixel_clock > 165000) |
546 | + else if (radeon_dig_monitor_is_duallink(encoder, radeon_encoder->pixel_clock)) |
547 | args.v5.ucLaneNum = 8; |
548 | else |
549 | args.v5.ucLaneNum = 4; |
550 | diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c |
551 | index 8697abd7b173..0ac0a88860a4 100644 |
552 | --- a/drivers/gpu/drm/ttm/ttm_bo.c |
553 | +++ b/drivers/gpu/drm/ttm/ttm_bo.c |
554 | @@ -498,9 +498,11 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo, |
555 | |
556 | moved: |
557 | if (bo->evicted) { |
558 | - ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); |
559 | - if (ret) |
560 | - pr_err("Can not flush read caches\n"); |
561 | + if (bdev->driver->invalidate_caches) { |
562 | + ret = bdev->driver->invalidate_caches(bdev, bo->mem.placement); |
563 | + if (ret) |
564 | + pr_err("Can not flush read caches\n"); |
565 | + } |
566 | bo->evicted = false; |
567 | } |
568 | |
569 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
570 | index 6fc283a041d6..588a5eca63d8 100644 |
571 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
572 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
573 | @@ -392,8 +392,8 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
574 | isert_conn->state = ISER_CONN_INIT; |
575 | INIT_LIST_HEAD(&isert_conn->conn_accept_node); |
576 | init_completion(&isert_conn->conn_login_comp); |
577 | - init_waitqueue_head(&isert_conn->conn_wait); |
578 | - init_waitqueue_head(&isert_conn->conn_wait_comp_err); |
579 | + init_completion(&isert_conn->conn_wait); |
580 | + init_completion(&isert_conn->conn_wait_comp_err); |
581 | kref_init(&isert_conn->conn_kref); |
582 | kref_get(&isert_conn->conn_kref); |
583 | mutex_init(&isert_conn->conn_mutex); |
584 | @@ -550,11 +550,11 @@ isert_disconnect_work(struct work_struct *work) |
585 | |
586 | pr_debug("isert_disconnect_work(): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); |
587 | mutex_lock(&isert_conn->conn_mutex); |
588 | - isert_conn->state = ISER_CONN_DOWN; |
589 | + if (isert_conn->state == ISER_CONN_UP) |
590 | + isert_conn->state = ISER_CONN_TERMINATING; |
591 | |
592 | if (isert_conn->post_recv_buf_count == 0 && |
593 | atomic_read(&isert_conn->post_send_buf_count) == 0) { |
594 | - pr_debug("Calling wake_up(&isert_conn->conn_wait);\n"); |
595 | mutex_unlock(&isert_conn->conn_mutex); |
596 | goto wake_up; |
597 | } |
598 | @@ -574,7 +574,7 @@ isert_disconnect_work(struct work_struct *work) |
599 | mutex_unlock(&isert_conn->conn_mutex); |
600 | |
601 | wake_up: |
602 | - wake_up(&isert_conn->conn_wait); |
603 | + complete(&isert_conn->conn_wait); |
604 | isert_put_conn(isert_conn); |
605 | } |
606 | |
607 | @@ -1213,7 +1213,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
608 | case ISCSI_OP_SCSI_CMD: |
609 | spin_lock_bh(&conn->cmd_lock); |
610 | if (!list_empty(&cmd->i_conn_node)) |
611 | - list_del(&cmd->i_conn_node); |
612 | + list_del_init(&cmd->i_conn_node); |
613 | spin_unlock_bh(&conn->cmd_lock); |
614 | |
615 | if (cmd->data_direction == DMA_TO_DEVICE) |
616 | @@ -1225,7 +1225,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
617 | case ISCSI_OP_SCSI_TMFUNC: |
618 | spin_lock_bh(&conn->cmd_lock); |
619 | if (!list_empty(&cmd->i_conn_node)) |
620 | - list_del(&cmd->i_conn_node); |
621 | + list_del_init(&cmd->i_conn_node); |
622 | spin_unlock_bh(&conn->cmd_lock); |
623 | |
624 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
625 | @@ -1234,7 +1234,7 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
626 | case ISCSI_OP_NOOP_OUT: |
627 | spin_lock_bh(&conn->cmd_lock); |
628 | if (!list_empty(&cmd->i_conn_node)) |
629 | - list_del(&cmd->i_conn_node); |
630 | + list_del_init(&cmd->i_conn_node); |
631 | spin_unlock_bh(&conn->cmd_lock); |
632 | |
633 | /* |
634 | @@ -1308,6 +1308,7 @@ isert_completion_rdma_read(struct iser_tx_desc *tx_desc, |
635 | } |
636 | |
637 | cmd->write_data_done = se_cmd->data_length; |
638 | + wr->send_wr_num = 0; |
639 | |
640 | pr_debug("isert_do_rdma_read_comp, calling target_execute_cmd\n"); |
641 | spin_lock_bh(&cmd->istate_lock); |
642 | @@ -1348,7 +1349,7 @@ isert_do_control_comp(struct work_struct *work) |
643 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); |
644 | /* |
645 | * Call atomic_dec(&isert_conn->post_send_buf_count) |
646 | - * from isert_free_conn() |
647 | + * from isert_wait_conn() |
648 | */ |
649 | isert_conn->logout_posted = true; |
650 | iscsit_logout_post_handler(cmd, cmd->conn); |
651 | @@ -1367,6 +1368,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, |
652 | struct ib_device *ib_dev) |
653 | { |
654 | struct iscsi_cmd *cmd = &isert_cmd->iscsi_cmd; |
655 | + struct isert_rdma_wr *wr = &isert_cmd->rdma_wr; |
656 | |
657 | if (cmd->i_state == ISTATE_SEND_TASKMGTRSP || |
658 | cmd->i_state == ISTATE_SEND_LOGOUTRSP || |
659 | @@ -1377,7 +1379,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, |
660 | queue_work(isert_comp_wq, &isert_cmd->comp_work); |
661 | return; |
662 | } |
663 | - atomic_dec(&isert_conn->post_send_buf_count); |
664 | + atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
665 | |
666 | cmd->i_state = ISTATE_SENT_STATUS; |
667 | isert_completion_put(tx_desc, isert_cmd, ib_dev); |
668 | @@ -1415,7 +1417,7 @@ isert_send_completion(struct iser_tx_desc *tx_desc, |
669 | case ISER_IB_RDMA_READ: |
670 | pr_debug("isert_send_completion: Got ISER_IB_RDMA_READ:\n"); |
671 | |
672 | - atomic_dec(&isert_conn->post_send_buf_count); |
673 | + atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); |
674 | isert_completion_rdma_read(tx_desc, isert_cmd); |
675 | break; |
676 | default: |
677 | @@ -1426,31 +1428,38 @@ isert_send_completion(struct iser_tx_desc *tx_desc, |
678 | } |
679 | |
680 | static void |
681 | -isert_cq_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn) |
682 | +isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn) |
683 | { |
684 | struct ib_device *ib_dev = isert_conn->conn_cm_id->device; |
685 | + struct isert_cmd *isert_cmd = tx_desc->isert_cmd; |
686 | |
687 | - if (tx_desc) { |
688 | - struct isert_cmd *isert_cmd = tx_desc->isert_cmd; |
689 | + if (!isert_cmd) |
690 | + isert_unmap_tx_desc(tx_desc, ib_dev); |
691 | + else |
692 | + isert_completion_put(tx_desc, isert_cmd, ib_dev); |
693 | +} |
694 | |
695 | - if (!isert_cmd) |
696 | - isert_unmap_tx_desc(tx_desc, ib_dev); |
697 | - else |
698 | - isert_completion_put(tx_desc, isert_cmd, ib_dev); |
699 | +static void |
700 | +isert_cq_rx_comp_err(struct isert_conn *isert_conn) |
701 | +{ |
702 | + struct iscsi_conn *conn = isert_conn->conn; |
703 | + |
704 | + if (isert_conn->post_recv_buf_count) |
705 | + return; |
706 | + |
707 | + if (conn->sess) { |
708 | + target_sess_cmd_list_set_waiting(conn->sess->se_sess); |
709 | + target_wait_for_sess_cmds(conn->sess->se_sess); |
710 | } |
711 | |
712 | - if (isert_conn->post_recv_buf_count == 0 && |
713 | - atomic_read(&isert_conn->post_send_buf_count) == 0) { |
714 | - pr_debug("isert_cq_comp_err >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n"); |
715 | - pr_debug("Calling wake_up from isert_cq_comp_err\n"); |
716 | + while (atomic_read(&isert_conn->post_send_buf_count)) |
717 | + msleep(3000); |
718 | |
719 | - mutex_lock(&isert_conn->conn_mutex); |
720 | - if (isert_conn->state != ISER_CONN_DOWN) |
721 | - isert_conn->state = ISER_CONN_TERMINATING; |
722 | - mutex_unlock(&isert_conn->conn_mutex); |
723 | + mutex_lock(&isert_conn->conn_mutex); |
724 | + isert_conn->state = ISER_CONN_DOWN; |
725 | + mutex_unlock(&isert_conn->conn_mutex); |
726 | |
727 | - wake_up(&isert_conn->conn_wait_comp_err); |
728 | - } |
729 | + complete(&isert_conn->conn_wait_comp_err); |
730 | } |
731 | |
732 | static void |
733 | @@ -1475,7 +1484,7 @@ isert_cq_tx_work(struct work_struct *work) |
734 | pr_debug("TX wc.status != IB_WC_SUCCESS >>>>>>>>>>>>>>\n"); |
735 | pr_debug("TX wc.status: 0x%08x\n", wc.status); |
736 | atomic_dec(&isert_conn->post_send_buf_count); |
737 | - isert_cq_comp_err(tx_desc, isert_conn); |
738 | + isert_cq_tx_comp_err(tx_desc, isert_conn); |
739 | } |
740 | } |
741 | |
742 | @@ -1517,7 +1526,7 @@ isert_cq_rx_work(struct work_struct *work) |
743 | pr_debug("RX wc.status: 0x%08x\n", wc.status); |
744 | |
745 | isert_conn->post_recv_buf_count--; |
746 | - isert_cq_comp_err(NULL, isert_conn); |
747 | + isert_cq_rx_comp_err(isert_conn); |
748 | } |
749 | } |
750 | |
751 | @@ -1827,12 +1836,12 @@ isert_put_datain(struct iscsi_conn *conn, struct iscsi_cmd *cmd) |
752 | isert_init_tx_hdrs(isert_conn, &isert_cmd->tx_desc); |
753 | isert_init_send_wr(isert_cmd, &isert_cmd->tx_desc.send_wr); |
754 | |
755 | - atomic_inc(&isert_conn->post_send_buf_count); |
756 | + atomic_add(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
757 | |
758 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); |
759 | if (rc) { |
760 | pr_warn("ib_post_send() failed for IB_WR_RDMA_WRITE\n"); |
761 | - atomic_dec(&isert_conn->post_send_buf_count); |
762 | + atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
763 | } |
764 | pr_debug("Posted RDMA_WRITE + Response for iSER Data READ\n"); |
765 | return 1; |
766 | @@ -1935,12 +1944,12 @@ isert_get_dataout(struct iscsi_conn *conn, struct iscsi_cmd *cmd, bool recovery) |
767 | data_left -= data_len; |
768 | } |
769 | |
770 | - atomic_inc(&isert_conn->post_send_buf_count); |
771 | + atomic_add(wr->send_wr_num, &isert_conn->post_send_buf_count); |
772 | |
773 | rc = ib_post_send(isert_conn->conn_qp, wr->send_wr, &wr_failed); |
774 | if (rc) { |
775 | pr_warn("ib_post_send() failed for IB_WR_RDMA_READ\n"); |
776 | - atomic_dec(&isert_conn->post_send_buf_count); |
777 | + atomic_sub(wr->send_wr_num, &isert_conn->post_send_buf_count); |
778 | } |
779 | pr_debug("Posted RDMA_READ memory for ISER Data WRITE\n"); |
780 | return 0; |
781 | @@ -2218,22 +2227,11 @@ isert_free_np(struct iscsi_np *np) |
782 | kfree(isert_np); |
783 | } |
784 | |
785 | -static int isert_check_state(struct isert_conn *isert_conn, int state) |
786 | -{ |
787 | - int ret; |
788 | - |
789 | - mutex_lock(&isert_conn->conn_mutex); |
790 | - ret = (isert_conn->state == state); |
791 | - mutex_unlock(&isert_conn->conn_mutex); |
792 | - |
793 | - return ret; |
794 | -} |
795 | - |
796 | -static void isert_free_conn(struct iscsi_conn *conn) |
797 | +static void isert_wait_conn(struct iscsi_conn *conn) |
798 | { |
799 | struct isert_conn *isert_conn = conn->context; |
800 | |
801 | - pr_debug("isert_free_conn: Starting \n"); |
802 | + pr_debug("isert_wait_conn: Starting \n"); |
803 | /* |
804 | * Decrement post_send_buf_count for special case when called |
805 | * from isert_do_control_comp() -> iscsit_logout_post_handler() |
806 | @@ -2243,38 +2241,29 @@ static void isert_free_conn(struct iscsi_conn *conn) |
807 | atomic_dec(&isert_conn->post_send_buf_count); |
808 | |
809 | if (isert_conn->conn_cm_id && isert_conn->state != ISER_CONN_DOWN) { |
810 | - pr_debug("Calling rdma_disconnect from isert_free_conn\n"); |
811 | + pr_debug("Calling rdma_disconnect from isert_wait_conn\n"); |
812 | rdma_disconnect(isert_conn->conn_cm_id); |
813 | } |
814 | /* |
815 | * Only wait for conn_wait_comp_err if the isert_conn made it |
816 | * into full feature phase.. |
817 | */ |
818 | - if (isert_conn->state == ISER_CONN_UP) { |
819 | - pr_debug("isert_free_conn: Before wait_event comp_err %d\n", |
820 | - isert_conn->state); |
821 | - mutex_unlock(&isert_conn->conn_mutex); |
822 | - |
823 | - wait_event(isert_conn->conn_wait_comp_err, |
824 | - (isert_check_state(isert_conn, ISER_CONN_TERMINATING))); |
825 | - |
826 | - wait_event(isert_conn->conn_wait, |
827 | - (isert_check_state(isert_conn, ISER_CONN_DOWN))); |
828 | - |
829 | - isert_put_conn(isert_conn); |
830 | - return; |
831 | - } |
832 | if (isert_conn->state == ISER_CONN_INIT) { |
833 | mutex_unlock(&isert_conn->conn_mutex); |
834 | - isert_put_conn(isert_conn); |
835 | return; |
836 | } |
837 | - pr_debug("isert_free_conn: wait_event conn_wait %d\n", |
838 | - isert_conn->state); |
839 | + if (isert_conn->state == ISER_CONN_UP) |
840 | + isert_conn->state = ISER_CONN_TERMINATING; |
841 | mutex_unlock(&isert_conn->conn_mutex); |
842 | |
843 | - wait_event(isert_conn->conn_wait, |
844 | - (isert_check_state(isert_conn, ISER_CONN_DOWN))); |
845 | + wait_for_completion(&isert_conn->conn_wait_comp_err); |
846 | + |
847 | + wait_for_completion(&isert_conn->conn_wait); |
848 | +} |
849 | + |
850 | +static void isert_free_conn(struct iscsi_conn *conn) |
851 | +{ |
852 | + struct isert_conn *isert_conn = conn->context; |
853 | |
854 | isert_put_conn(isert_conn); |
855 | } |
856 | @@ -2286,6 +2275,7 @@ static struct iscsit_transport iser_target_transport = { |
857 | .iscsit_setup_np = isert_setup_np, |
858 | .iscsit_accept_np = isert_accept_np, |
859 | .iscsit_free_np = isert_free_np, |
860 | + .iscsit_wait_conn = isert_wait_conn, |
861 | .iscsit_free_conn = isert_free_conn, |
862 | .iscsit_alloc_cmd = isert_alloc_cmd, |
863 | .iscsit_get_login_rx = isert_get_login_rx, |
864 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.h b/drivers/infiniband/ulp/isert/ib_isert.h |
865 | index 5795c82a2306..b9d6cc6917cf 100644 |
866 | --- a/drivers/infiniband/ulp/isert/ib_isert.h |
867 | +++ b/drivers/infiniband/ulp/isert/ib_isert.h |
868 | @@ -103,8 +103,8 @@ struct isert_conn { |
869 | struct isert_device *conn_device; |
870 | struct work_struct conn_logout_work; |
871 | struct mutex conn_mutex; |
872 | - wait_queue_head_t conn_wait; |
873 | - wait_queue_head_t conn_wait_comp_err; |
874 | + struct completion conn_wait; |
875 | + struct completion conn_wait_comp_err; |
876 | struct kref conn_kref; |
877 | }; |
878 | |
879 | diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c |
880 | index 516f9c922bb2..1a75869d3a82 100644 |
881 | --- a/drivers/md/dm-cache-target.c |
882 | +++ b/drivers/md/dm-cache-target.c |
883 | @@ -861,12 +861,13 @@ static void issue_copy_real(struct dm_cache_migration *mg) |
884 | int r; |
885 | struct dm_io_region o_region, c_region; |
886 | struct cache *cache = mg->cache; |
887 | + sector_t cblock = from_cblock(mg->cblock); |
888 | |
889 | o_region.bdev = cache->origin_dev->bdev; |
890 | o_region.count = cache->sectors_per_block; |
891 | |
892 | c_region.bdev = cache->cache_dev->bdev; |
893 | - c_region.sector = from_cblock(mg->cblock) * cache->sectors_per_block; |
894 | + c_region.sector = cblock * cache->sectors_per_block; |
895 | c_region.count = cache->sectors_per_block; |
896 | |
897 | if (mg->writeback || mg->demote) { |
898 | @@ -2174,20 +2175,18 @@ static int cache_map(struct dm_target *ti, struct bio *bio) |
899 | bool discarded_block; |
900 | struct dm_bio_prison_cell *cell; |
901 | struct policy_result lookup_result; |
902 | - struct per_bio_data *pb; |
903 | + struct per_bio_data *pb = init_per_bio_data(bio, pb_data_size); |
904 | |
905 | - if (from_oblock(block) > from_oblock(cache->origin_blocks)) { |
906 | + if (unlikely(from_oblock(block) >= from_oblock(cache->origin_blocks))) { |
907 | /* |
908 | * This can only occur if the io goes to a partial block at |
909 | * the end of the origin device. We don't cache these. |
910 | * Just remap to the origin and carry on. |
911 | */ |
912 | - remap_to_origin_clear_discard(cache, bio, block); |
913 | + remap_to_origin(cache, bio); |
914 | return DM_MAPIO_REMAPPED; |
915 | } |
916 | |
917 | - pb = init_per_bio_data(bio, pb_data_size); |
918 | - |
919 | if (bio->bi_rw & (REQ_FLUSH | REQ_FUA | REQ_DISCARD)) { |
920 | defer_bio(cache, bio); |
921 | return DM_MAPIO_SUBMITTED; |
922 | diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c |
923 | index f63169d6af26..6d388cff8455 100644 |
924 | --- a/drivers/net/can/flexcan.c |
925 | +++ b/drivers/net/can/flexcan.c |
926 | @@ -862,7 +862,7 @@ static int flexcan_open(struct net_device *dev) |
927 | /* start chip and queuing */ |
928 | err = flexcan_chip_start(dev); |
929 | if (err) |
930 | - goto out_close; |
931 | + goto out_free_irq; |
932 | |
933 | can_led_event(dev, CAN_LED_EVENT_OPEN); |
934 | |
935 | @@ -871,6 +871,8 @@ static int flexcan_open(struct net_device *dev) |
936 | |
937 | return 0; |
938 | |
939 | + out_free_irq: |
940 | + free_irq(dev->irq, dev); |
941 | out_close: |
942 | close_candev(dev); |
943 | out: |
944 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c |
945 | index 68e9dc453e11..e27d5c839be5 100644 |
946 | --- a/drivers/net/ethernet/broadcom/tg3.c |
947 | +++ b/drivers/net/ethernet/broadcom/tg3.c |
948 | @@ -6687,8 +6687,7 @@ static int tg3_rx(struct tg3_napi *tnapi, int budget) |
949 | |
950 | work_mask |= opaque_key; |
951 | |
952 | - if ((desc->err_vlan & RXD_ERR_MASK) != 0 && |
953 | - (desc->err_vlan != RXD_ERR_ODD_NIBBLE_RCVD_MII)) { |
954 | + if (desc->err_vlan & RXD_ERR_MASK) { |
955 | drop_it: |
956 | tg3_recycle_rx(tnapi, tpr, opaque_key, |
957 | desc_idx, *post_ptr); |
958 | diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h |
959 | index ff6e30eeae35..046059c56713 100644 |
960 | --- a/drivers/net/ethernet/broadcom/tg3.h |
961 | +++ b/drivers/net/ethernet/broadcom/tg3.h |
962 | @@ -2587,7 +2587,11 @@ struct tg3_rx_buffer_desc { |
963 | #define RXD_ERR_TOO_SMALL 0x00400000 |
964 | #define RXD_ERR_NO_RESOURCES 0x00800000 |
965 | #define RXD_ERR_HUGE_FRAME 0x01000000 |
966 | -#define RXD_ERR_MASK 0xffff0000 |
967 | + |
968 | +#define RXD_ERR_MASK (RXD_ERR_BAD_CRC | RXD_ERR_COLLISION | \ |
969 | + RXD_ERR_LINK_LOST | RXD_ERR_PHY_DECODE | \ |
970 | + RXD_ERR_MAC_ABRT | RXD_ERR_TOO_SMALL | \ |
971 | + RXD_ERR_NO_RESOURCES | RXD_ERR_HUGE_FRAME) |
972 | |
973 | u32 reserved; |
974 | u32 opaque; |
975 | diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c |
976 | index 9a95abf2dedf..540ad16d7807 100644 |
977 | --- a/drivers/net/ethernet/sfc/ptp.c |
978 | +++ b/drivers/net/ethernet/sfc/ptp.c |
979 | @@ -1319,6 +1319,13 @@ void efx_ptp_event(struct efx_nic *efx, efx_qword_t *ev) |
980 | struct efx_ptp_data *ptp = efx->ptp_data; |
981 | int code = EFX_QWORD_FIELD(*ev, MCDI_EVENT_CODE); |
982 | |
983 | + if (!ptp) { |
984 | + if (net_ratelimit()) |
985 | + netif_warn(efx, drv, efx->net_dev, |
986 | + "Received PTP event but PTP not set up\n"); |
987 | + return; |
988 | + } |
989 | + |
990 | if (!ptp->enabled) |
991 | return; |
992 | |
993 | diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c |
994 | index a0c05e07feeb..2835bfe151b1 100644 |
995 | --- a/drivers/net/virtio_net.c |
996 | +++ b/drivers/net/virtio_net.c |
997 | @@ -1597,7 +1597,8 @@ static int virtnet_probe(struct virtio_device *vdev) |
998 | /* If we can receive ANY GSO packets, we must allocate large ones. */ |
999 | if (virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO4) || |
1000 | virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_TSO6) || |
1001 | - virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN)) |
1002 | + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_ECN) || |
1003 | + virtio_has_feature(vdev, VIRTIO_NET_F_GUEST_UFO)) |
1004 | vi->big_packets = true; |
1005 | |
1006 | if (virtio_has_feature(vdev, VIRTIO_NET_F_MRG_RXBUF)) |
1007 | diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c |
1008 | index 55a62cae2cb4..d0815855d877 100644 |
1009 | --- a/drivers/net/vmxnet3/vmxnet3_drv.c |
1010 | +++ b/drivers/net/vmxnet3/vmxnet3_drv.c |
1011 | @@ -1741,11 +1741,20 @@ vmxnet3_netpoll(struct net_device *netdev) |
1012 | { |
1013 | struct vmxnet3_adapter *adapter = netdev_priv(netdev); |
1014 | |
1015 | - if (adapter->intr.mask_mode == VMXNET3_IMM_ACTIVE) |
1016 | - vmxnet3_disable_all_intrs(adapter); |
1017 | - |
1018 | - vmxnet3_do_poll(adapter, adapter->rx_queue[0].rx_ring[0].size); |
1019 | - vmxnet3_enable_all_intrs(adapter); |
1020 | + switch (adapter->intr.type) { |
1021 | +#ifdef CONFIG_PCI_MSI |
1022 | + case VMXNET3_IT_MSIX: { |
1023 | + int i; |
1024 | + for (i = 0; i < adapter->num_rx_queues; i++) |
1025 | + vmxnet3_msix_rx(0, &adapter->rx_queue[i]); |
1026 | + break; |
1027 | + } |
1028 | +#endif |
1029 | + case VMXNET3_IT_MSI: |
1030 | + default: |
1031 | + vmxnet3_intr(0, adapter->netdev); |
1032 | + break; |
1033 | + } |
1034 | |
1035 | } |
1036 | #endif /* CONFIG_NET_POLL_CONTROLLER */ |
1037 | diff --git a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h |
1038 | index 999ab08c34e6..4ae3cf7283ea 100644 |
1039 | --- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h |
1040 | +++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h |
1041 | @@ -56,7 +56,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { |
1042 | {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3236605e, 0x32365a5e}, |
1043 | {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
1044 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, |
1045 | - {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, |
1046 | + {0x00009e20, 0x000003a5, 0x000003a5, 0x000003a5, 0x000003a5}, |
1047 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, |
1048 | {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282}, |
1049 | {0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27}, |
1050 | @@ -95,7 +95,7 @@ static const u32 ar9462_2p0_baseband_postamble[][5] = { |
1051 | {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000}, |
1052 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, |
1053 | {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, |
1054 | - {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, |
1055 | + {0x0000ae20, 0x000001a6, 0x000001a6, 0x000001aa, 0x000001aa}, |
1056 | {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550}, |
1057 | }; |
1058 | |
1059 | diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c |
1060 | index e04f3da1ccb3..e9d09f19f856 100644 |
1061 | --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c |
1062 | +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c |
1063 | @@ -739,6 +739,24 @@ static int iwlagn_mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, |
1064 | return ret; |
1065 | } |
1066 | |
1067 | +static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg) |
1068 | +{ |
1069 | + if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) |
1070 | + return false; |
1071 | + return true; |
1072 | +} |
1073 | + |
1074 | +static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg) |
1075 | +{ |
1076 | + if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) |
1077 | + return false; |
1078 | + if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG) |
1079 | + return true; |
1080 | + |
1081 | + /* disabled by default */ |
1082 | + return false; |
1083 | +} |
1084 | + |
1085 | static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw, |
1086 | struct ieee80211_vif *vif, |
1087 | enum ieee80211_ampdu_mlme_action action, |
1088 | @@ -760,7 +778,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw, |
1089 | |
1090 | switch (action) { |
1091 | case IEEE80211_AMPDU_RX_START: |
1092 | - if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) |
1093 | + if (!iwl_enable_rx_ampdu(priv->cfg)) |
1094 | break; |
1095 | IWL_DEBUG_HT(priv, "start Rx\n"); |
1096 | ret = iwl_sta_rx_agg_start(priv, sta, tid, *ssn); |
1097 | @@ -772,7 +790,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw, |
1098 | case IEEE80211_AMPDU_TX_START: |
1099 | if (!priv->trans->ops->txq_enable) |
1100 | break; |
1101 | - if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) |
1102 | + if (!iwl_enable_tx_ampdu(priv->cfg)) |
1103 | break; |
1104 | IWL_DEBUG_HT(priv, "start Tx\n"); |
1105 | ret = iwlagn_tx_agg_start(priv, vif, sta, tid, ssn); |
1106 | diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c |
1107 | index c3c13ce96eb0..e800002d6158 100644 |
1108 | --- a/drivers/net/wireless/iwlwifi/dvm/sta.c |
1109 | +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c |
1110 | @@ -590,6 +590,7 @@ void iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id, |
1111 | sizeof(priv->tid_data[sta_id][tid])); |
1112 | |
1113 | priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; |
1114 | + priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS; |
1115 | |
1116 | priv->num_stations--; |
1117 | |
1118 | diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c |
1119 | index 20e65d3cc3bd..2b5dbff9eadb 100644 |
1120 | --- a/drivers/net/wireless/iwlwifi/dvm/tx.c |
1121 | +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c |
1122 | @@ -1322,8 +1322,6 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, |
1123 | struct iwl_compressed_ba_resp *ba_resp = (void *)pkt->data; |
1124 | struct iwl_ht_agg *agg; |
1125 | struct sk_buff_head reclaimed_skbs; |
1126 | - struct ieee80211_tx_info *info; |
1127 | - struct ieee80211_hdr *hdr; |
1128 | struct sk_buff *skb; |
1129 | int sta_id; |
1130 | int tid; |
1131 | @@ -1410,22 +1408,28 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv, |
1132 | freed = 0; |
1133 | |
1134 | skb_queue_walk(&reclaimed_skbs, skb) { |
1135 | - hdr = (struct ieee80211_hdr *)skb->data; |
1136 | + struct ieee80211_hdr *hdr = (void *)skb->data; |
1137 | + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1138 | |
1139 | if (ieee80211_is_data_qos(hdr->frame_control)) |
1140 | freed++; |
1141 | else |
1142 | WARN_ON_ONCE(1); |
1143 | |
1144 | - info = IEEE80211_SKB_CB(skb); |
1145 | iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]); |
1146 | |
1147 | + memset(&info->status, 0, sizeof(info->status)); |
1148 | + /* Packet was transmitted successfully, failures come as single |
1149 | + * frames because before failing a frame the firmware transmits |
1150 | + * it without aggregation at least once. |
1151 | + */ |
1152 | + info->flags |= IEEE80211_TX_STAT_ACK; |
1153 | + |
1154 | if (freed == 1) { |
1155 | /* this is the first skb we deliver in this batch */ |
1156 | /* put the rate scaling data there */ |
1157 | info = IEEE80211_SKB_CB(skb); |
1158 | memset(&info->status, 0, sizeof(info->status)); |
1159 | - info->flags |= IEEE80211_TX_STAT_ACK; |
1160 | info->flags |= IEEE80211_TX_STAT_AMPDU; |
1161 | info->status.ampdu_ack_len = ba_resp->txed_2_done; |
1162 | info->status.ampdu_len = ba_resp->txed; |
1163 | diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c |
1164 | index 40fed1f511e2..96050e6c3d57 100644 |
1165 | --- a/drivers/net/wireless/iwlwifi/iwl-drv.c |
1166 | +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c |
1167 | @@ -1211,7 +1211,7 @@ module_param_named(swcrypto, iwlwifi_mod_params.sw_crypto, int, S_IRUGO); |
1168 | MODULE_PARM_DESC(swcrypto, "using crypto in software (default 0 [hardware])"); |
1169 | module_param_named(11n_disable, iwlwifi_mod_params.disable_11n, uint, S_IRUGO); |
1170 | MODULE_PARM_DESC(11n_disable, |
1171 | - "disable 11n functionality, bitmap: 1: full, 2: agg TX, 4: agg RX"); |
1172 | + "disable 11n functionality, bitmap: 1: full, 2: disable agg TX, 4: disable agg RX, 8 enable agg TX"); |
1173 | module_param_named(amsdu_size_8K, iwlwifi_mod_params.amsdu_size_8K, |
1174 | int, S_IRUGO); |
1175 | MODULE_PARM_DESC(amsdu_size_8K, "enable 8K amsdu size (default 0)"); |
1176 | diff --git a/drivers/net/wireless/iwlwifi/iwl-modparams.h b/drivers/net/wireless/iwlwifi/iwl-modparams.h |
1177 | index d6f6c37c09fd..e99bc55046e5 100644 |
1178 | --- a/drivers/net/wireless/iwlwifi/iwl-modparams.h |
1179 | +++ b/drivers/net/wireless/iwlwifi/iwl-modparams.h |
1180 | @@ -79,9 +79,12 @@ enum iwl_power_level { |
1181 | IWL_POWER_NUM |
1182 | }; |
1183 | |
1184 | -#define IWL_DISABLE_HT_ALL BIT(0) |
1185 | -#define IWL_DISABLE_HT_TXAGG BIT(1) |
1186 | -#define IWL_DISABLE_HT_RXAGG BIT(2) |
1187 | +enum iwl_disable_11n { |
1188 | + IWL_DISABLE_HT_ALL = BIT(0), |
1189 | + IWL_DISABLE_HT_TXAGG = BIT(1), |
1190 | + IWL_DISABLE_HT_RXAGG = BIT(2), |
1191 | + IWL_ENABLE_HT_TXAGG = BIT(3), |
1192 | +}; |
1193 | |
1194 | /** |
1195 | * struct iwl_mod_params |
1196 | @@ -90,7 +93,7 @@ enum iwl_power_level { |
1197 | * |
1198 | * @sw_crypto: using hardware encryption, default = 0 |
1199 | * @disable_11n: disable 11n capabilities, default = 0, |
1200 | - * use IWL_DISABLE_HT_* constants |
1201 | + * use IWL_[DIS,EN]ABLE_HT_* constants |
1202 | * @amsdu_size_8K: enable 8K amsdu size, default = 0 |
1203 | * @restart_fw: restart firmware, default = 1 |
1204 | * @plcp_check: enable plcp health check, default = true |
1205 | diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1206 | index 810bfa5f6de0..9649f511bd5b 100644 |
1207 | --- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1208 | +++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c |
1209 | @@ -523,8 +523,11 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif, |
1210 | |
1211 | mutex_lock(&mvm->mutex); |
1212 | |
1213 | - /* Rssi update while not associated ?! */ |
1214 | - if (WARN_ON_ONCE(mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT)) |
1215 | + /* |
1216 | + * Rssi update while not associated - can happen since the statistics |
1217 | + * are handled asynchronously |
1218 | + */ |
1219 | + if (mvmvif->ap_sta_id == IWL_MVM_STATION_COUNT) |
1220 | goto out_unlock; |
1221 | |
1222 | /* No open connection - reports should be disabled */ |
1223 | diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
1224 | index f7545e06ce2a..88b9c0964696 100644 |
1225 | --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
1226 | +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c |
1227 | @@ -278,6 +278,24 @@ static void iwl_mvm_mac_tx(struct ieee80211_hw *hw, |
1228 | ieee80211_free_txskb(hw, skb); |
1229 | } |
1230 | |
1231 | +static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg) |
1232 | +{ |
1233 | + if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) |
1234 | + return false; |
1235 | + return true; |
1236 | +} |
1237 | + |
1238 | +static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg) |
1239 | +{ |
1240 | + if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) |
1241 | + return false; |
1242 | + if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG) |
1243 | + return true; |
1244 | + |
1245 | + /* enabled by default */ |
1246 | + return true; |
1247 | +} |
1248 | + |
1249 | static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw, |
1250 | struct ieee80211_vif *vif, |
1251 | enum ieee80211_ampdu_mlme_action action, |
1252 | @@ -297,7 +315,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw, |
1253 | |
1254 | switch (action) { |
1255 | case IEEE80211_AMPDU_RX_START: |
1256 | - if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) { |
1257 | + if (!iwl_enable_rx_ampdu(mvm->cfg)) { |
1258 | ret = -EINVAL; |
1259 | break; |
1260 | } |
1261 | @@ -307,7 +325,7 @@ static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw, |
1262 | ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false); |
1263 | break; |
1264 | case IEEE80211_AMPDU_TX_START: |
1265 | - if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) { |
1266 | + if (!iwl_enable_tx_ampdu(mvm->cfg)) { |
1267 | ret = -EINVAL; |
1268 | break; |
1269 | } |
1270 | diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c |
1271 | index a2e6112e91e9..4ec8385e4307 100644 |
1272 | --- a/drivers/net/wireless/iwlwifi/mvm/tx.c |
1273 | +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c |
1274 | @@ -819,16 +819,12 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, |
1275 | struct iwl_mvm_ba_notif *ba_notif = (void *)pkt->data; |
1276 | struct sk_buff_head reclaimed_skbs; |
1277 | struct iwl_mvm_tid_data *tid_data; |
1278 | - struct ieee80211_tx_info *info; |
1279 | struct ieee80211_sta *sta; |
1280 | struct iwl_mvm_sta *mvmsta; |
1281 | - struct ieee80211_hdr *hdr; |
1282 | struct sk_buff *skb; |
1283 | int sta_id, tid, freed; |
1284 | - |
1285 | /* "flow" corresponds to Tx queue */ |
1286 | u16 scd_flow = le16_to_cpu(ba_notif->scd_flow); |
1287 | - |
1288 | /* "ssn" is start of block-ack Tx window, corresponds to index |
1289 | * (in Tx queue's circular buffer) of first TFD/frame in window */ |
1290 | u16 ba_resp_scd_ssn = le16_to_cpu(ba_notif->scd_ssn); |
1291 | @@ -885,22 +881,26 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, |
1292 | freed = 0; |
1293 | |
1294 | skb_queue_walk(&reclaimed_skbs, skb) { |
1295 | - hdr = (struct ieee80211_hdr *)skb->data; |
1296 | + struct ieee80211_hdr *hdr = (void *)skb->data; |
1297 | + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
1298 | |
1299 | if (ieee80211_is_data_qos(hdr->frame_control)) |
1300 | freed++; |
1301 | else |
1302 | WARN_ON_ONCE(1); |
1303 | |
1304 | - info = IEEE80211_SKB_CB(skb); |
1305 | iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]); |
1306 | |
1307 | + memset(&info->status, 0, sizeof(info->status)); |
1308 | + /* Packet was transmitted successfully, failures come as single |
1309 | + * frames because before failing a frame the firmware transmits |
1310 | + * it without aggregation at least once. |
1311 | + */ |
1312 | + info->flags |= IEEE80211_TX_STAT_ACK; |
1313 | + |
1314 | if (freed == 1) { |
1315 | /* this is the first skb we deliver in this batch */ |
1316 | /* put the rate scaling data there */ |
1317 | - info = IEEE80211_SKB_CB(skb); |
1318 | - memset(&info->status, 0, sizeof(info->status)); |
1319 | - info->flags |= IEEE80211_TX_STAT_ACK; |
1320 | info->flags |= IEEE80211_TX_STAT_AMPDU; |
1321 | info->status.ampdu_ack_len = ba_notif->txed_2_done; |
1322 | info->status.ampdu_len = ba_notif->txed; |
1323 | diff --git a/drivers/net/wireless/mwifiex/11ac.c b/drivers/net/wireless/mwifiex/11ac.c |
1324 | index 5e0eec4d71c7..5d9a8084665d 100644 |
1325 | --- a/drivers/net/wireless/mwifiex/11ac.c |
1326 | +++ b/drivers/net/wireless/mwifiex/11ac.c |
1327 | @@ -189,8 +189,7 @@ int mwifiex_cmd_append_11ac_tlv(struct mwifiex_private *priv, |
1328 | vht_cap->header.len = |
1329 | cpu_to_le16(sizeof(struct ieee80211_vht_cap)); |
1330 | memcpy((u8 *)vht_cap + sizeof(struct mwifiex_ie_types_header), |
1331 | - (u8 *)bss_desc->bcn_vht_cap + |
1332 | - sizeof(struct ieee_types_header), |
1333 | + (u8 *)bss_desc->bcn_vht_cap, |
1334 | le16_to_cpu(vht_cap->header.len)); |
1335 | |
1336 | mwifiex_fill_vht_cap_tlv(priv, vht_cap, bss_desc->bss_band); |
1337 | diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c |
1338 | index 41e9d25a2d8e..2658c8cda443 100644 |
1339 | --- a/drivers/net/wireless/mwifiex/11n.c |
1340 | +++ b/drivers/net/wireless/mwifiex/11n.c |
1341 | @@ -307,8 +307,7 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, |
1342 | ht_cap->header.len = |
1343 | cpu_to_le16(sizeof(struct ieee80211_ht_cap)); |
1344 | memcpy((u8 *) ht_cap + sizeof(struct mwifiex_ie_types_header), |
1345 | - (u8 *) bss_desc->bcn_ht_cap + |
1346 | - sizeof(struct ieee_types_header), |
1347 | + (u8 *)bss_desc->bcn_ht_cap, |
1348 | le16_to_cpu(ht_cap->header.len)); |
1349 | |
1350 | mwifiex_fill_cap_info(priv, radio_type, ht_cap); |
1351 | diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c |
1352 | index 20c9c4c7b0b2..801c709656f9 100644 |
1353 | --- a/drivers/net/wireless/mwifiex/pcie.c |
1354 | +++ b/drivers/net/wireless/mwifiex/pcie.c |
1355 | @@ -1195,6 +1195,12 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter) |
1356 | rd_index = card->rxbd_rdptr & reg->rx_mask; |
1357 | skb_data = card->rx_buf_list[rd_index]; |
1358 | |
1359 | + /* If skb allocation was failed earlier for Rx packet, |
1360 | + * rx_buf_list[rd_index] would have been left with a NULL. |
1361 | + */ |
1362 | + if (!skb_data) |
1363 | + return -ENOMEM; |
1364 | + |
1365 | MWIFIEX_SKB_PACB(skb_data, &buf_pa); |
1366 | pci_unmap_single(card->dev, buf_pa, MWIFIEX_RX_DATA_BUF_SIZE, |
1367 | PCI_DMA_FROMDEVICE); |
1368 | @@ -1509,6 +1515,14 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter) |
1369 | if (adapter->ps_state == PS_STATE_SLEEP_CFM) { |
1370 | mwifiex_process_sleep_confirm_resp(adapter, skb->data, |
1371 | skb->len); |
1372 | + mwifiex_pcie_enable_host_int(adapter); |
1373 | + if (mwifiex_write_reg(adapter, |
1374 | + PCIE_CPU_INT_EVENT, |
1375 | + CPU_INTR_SLEEP_CFM_DONE)) { |
1376 | + dev_warn(adapter->dev, |
1377 | + "Write register failed\n"); |
1378 | + return -1; |
1379 | + } |
1380 | while (reg->sleep_cookie && (count++ < 10) && |
1381 | mwifiex_pcie_ok_to_access_hw(adapter)) |
1382 | usleep_range(50, 60); |
1383 | @@ -1979,23 +1993,9 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter) |
1384 | adapter->int_status |= pcie_ireg; |
1385 | spin_unlock_irqrestore(&adapter->int_lock, flags); |
1386 | |
1387 | - if (pcie_ireg & HOST_INTR_CMD_DONE) { |
1388 | - if ((adapter->ps_state == PS_STATE_SLEEP_CFM) || |
1389 | - (adapter->ps_state == PS_STATE_SLEEP)) { |
1390 | - mwifiex_pcie_enable_host_int(adapter); |
1391 | - if (mwifiex_write_reg(adapter, |
1392 | - PCIE_CPU_INT_EVENT, |
1393 | - CPU_INTR_SLEEP_CFM_DONE) |
1394 | - ) { |
1395 | - dev_warn(adapter->dev, |
1396 | - "Write register failed\n"); |
1397 | - return; |
1398 | - |
1399 | - } |
1400 | - } |
1401 | - } else if (!adapter->pps_uapsd_mode && |
1402 | - adapter->ps_state == PS_STATE_SLEEP && |
1403 | - mwifiex_pcie_ok_to_access_hw(adapter)) { |
1404 | + if (!adapter->pps_uapsd_mode && |
1405 | + adapter->ps_state == PS_STATE_SLEEP && |
1406 | + mwifiex_pcie_ok_to_access_hw(adapter)) { |
1407 | /* Potentially for PCIe we could get other |
1408 | * interrupts like shared. Don't change power |
1409 | * state until cookie is set */ |
1410 | diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c |
1411 | index 50b2fe53219d..470347a0a729 100644 |
1412 | --- a/drivers/net/wireless/mwifiex/scan.c |
1413 | +++ b/drivers/net/wireless/mwifiex/scan.c |
1414 | @@ -2040,12 +2040,12 @@ mwifiex_save_curr_bcn(struct mwifiex_private *priv) |
1415 | curr_bss->ht_info_offset); |
1416 | |
1417 | if (curr_bss->bcn_vht_cap) |
1418 | - curr_bss->bcn_ht_cap = (void *)(curr_bss->beacon_buf + |
1419 | - curr_bss->vht_cap_offset); |
1420 | + curr_bss->bcn_vht_cap = (void *)(curr_bss->beacon_buf + |
1421 | + curr_bss->vht_cap_offset); |
1422 | |
1423 | if (curr_bss->bcn_vht_oper) |
1424 | - curr_bss->bcn_ht_oper = (void *)(curr_bss->beacon_buf + |
1425 | - curr_bss->vht_info_offset); |
1426 | + curr_bss->bcn_vht_oper = (void *)(curr_bss->beacon_buf + |
1427 | + curr_bss->vht_info_offset); |
1428 | |
1429 | if (curr_bss->bcn_bss_co_2040) |
1430 | curr_bss->bcn_bss_co_2040 = |
1431 | diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c |
1432 | index b7adf3d46463..923e348dda70 100644 |
1433 | --- a/drivers/net/wireless/mwifiex/usb.c |
1434 | +++ b/drivers/net/wireless/mwifiex/usb.c |
1435 | @@ -511,13 +511,6 @@ static int mwifiex_usb_resume(struct usb_interface *intf) |
1436 | MWIFIEX_BSS_ROLE_ANY), |
1437 | MWIFIEX_ASYNC_CMD); |
1438 | |
1439 | -#ifdef CONFIG_PM |
1440 | - /* Resume handler may be called due to remote wakeup, |
1441 | - * force to exit suspend anyway |
1442 | - */ |
1443 | - usb_disable_autosuspend(card->udev); |
1444 | -#endif /* CONFIG_PM */ |
1445 | - |
1446 | return 0; |
1447 | } |
1448 | |
1449 | @@ -576,7 +569,6 @@ static struct usb_driver mwifiex_usb_driver = { |
1450 | .id_table = mwifiex_usb_table, |
1451 | .suspend = mwifiex_usb_suspend, |
1452 | .resume = mwifiex_usb_resume, |
1453 | - .supports_autosuspend = 1, |
1454 | }; |
1455 | |
1456 | static int mwifiex_usb_tx_init(struct mwifiex_adapter *adapter) |
1457 | diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c |
1458 | index ae31e8df44d7..80f72f6b6d56 100644 |
1459 | --- a/drivers/net/wireless/mwifiex/wmm.c |
1460 | +++ b/drivers/net/wireless/mwifiex/wmm.c |
1461 | @@ -556,7 +556,8 @@ mwifiex_clean_txrx(struct mwifiex_private *priv) |
1462 | mwifiex_wmm_delete_all_ralist(priv); |
1463 | memcpy(tos_to_tid, ac_to_tid, sizeof(tos_to_tid)); |
1464 | |
1465 | - if (priv->adapter->if_ops.clean_pcie_ring) |
1466 | + if (priv->adapter->if_ops.clean_pcie_ring && |
1467 | + !priv->adapter->surprise_removed) |
1468 | priv->adapter->if_ops.clean_pcie_ring(priv->adapter); |
1469 | spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, flags); |
1470 | } |
1471 | diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c |
1472 | index 0bb7bfd49bf6..f30acaa84037 100644 |
1473 | --- a/drivers/pci/pci.c |
1474 | +++ b/drivers/pci/pci.c |
1475 | @@ -1130,6 +1130,9 @@ static int do_pci_enable_device(struct pci_dev *dev, int bars) |
1476 | return err; |
1477 | pci_fixup_device(pci_fixup_enable, dev); |
1478 | |
1479 | + if (dev->msi_enabled || dev->msix_enabled) |
1480 | + return 0; |
1481 | + |
1482 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); |
1483 | if (pin) { |
1484 | pci_read_config_word(dev, PCI_COMMAND, &cmd); |
1485 | diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c |
1486 | index 9847ab163829..a8b7466196ee 100644 |
1487 | --- a/drivers/pnp/pnpacpi/rsparser.c |
1488 | +++ b/drivers/pnp/pnpacpi/rsparser.c |
1489 | @@ -183,9 +183,7 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, |
1490 | struct resource r; |
1491 | int i, flags; |
1492 | |
1493 | - if (acpi_dev_resource_memory(res, &r) |
1494 | - || acpi_dev_resource_io(res, &r) |
1495 | - || acpi_dev_resource_address_space(res, &r) |
1496 | + if (acpi_dev_resource_address_space(res, &r) |
1497 | || acpi_dev_resource_ext_address_space(res, &r)) { |
1498 | pnp_add_resource(dev, &r); |
1499 | return AE_OK; |
1500 | @@ -217,6 +215,17 @@ static acpi_status pnpacpi_allocated_resource(struct acpi_resource *res, |
1501 | } |
1502 | |
1503 | switch (res->type) { |
1504 | + case ACPI_RESOURCE_TYPE_MEMORY24: |
1505 | + case ACPI_RESOURCE_TYPE_MEMORY32: |
1506 | + case ACPI_RESOURCE_TYPE_FIXED_MEMORY32: |
1507 | + if (acpi_dev_resource_memory(res, &r)) |
1508 | + pnp_add_resource(dev, &r); |
1509 | + break; |
1510 | + case ACPI_RESOURCE_TYPE_IO: |
1511 | + case ACPI_RESOURCE_TYPE_FIXED_IO: |
1512 | + if (acpi_dev_resource_io(res, &r)) |
1513 | + pnp_add_resource(dev, &r); |
1514 | + break; |
1515 | case ACPI_RESOURCE_TYPE_DMA: |
1516 | dma = &res->data.dma; |
1517 | if (dma->channel_count > 0 && dma->channels[0] != (u8) -1) |
1518 | diff --git a/drivers/rapidio/devices/tsi721.h b/drivers/rapidio/devices/tsi721.h |
1519 | index b4b0d83f9ef6..7061ac0ad428 100644 |
1520 | --- a/drivers/rapidio/devices/tsi721.h |
1521 | +++ b/drivers/rapidio/devices/tsi721.h |
1522 | @@ -678,6 +678,7 @@ struct tsi721_bdma_chan { |
1523 | struct list_head free_list; |
1524 | dma_cookie_t completed_cookie; |
1525 | struct tasklet_struct tasklet; |
1526 | + bool active; |
1527 | }; |
1528 | |
1529 | #endif /* CONFIG_RAPIDIO_DMA_ENGINE */ |
1530 | diff --git a/drivers/rapidio/devices/tsi721_dma.c b/drivers/rapidio/devices/tsi721_dma.c |
1531 | index 502663f5f7c6..91245f5dbe81 100644 |
1532 | --- a/drivers/rapidio/devices/tsi721_dma.c |
1533 | +++ b/drivers/rapidio/devices/tsi721_dma.c |
1534 | @@ -206,8 +206,8 @@ void tsi721_bdma_handler(struct tsi721_bdma_chan *bdma_chan) |
1535 | { |
1536 | /* Disable BDMA channel interrupts */ |
1537 | iowrite32(0, bdma_chan->regs + TSI721_DMAC_INTE); |
1538 | - |
1539 | - tasklet_schedule(&bdma_chan->tasklet); |
1540 | + if (bdma_chan->active) |
1541 | + tasklet_schedule(&bdma_chan->tasklet); |
1542 | } |
1543 | |
1544 | #ifdef CONFIG_PCI_MSI |
1545 | @@ -562,7 +562,7 @@ static int tsi721_alloc_chan_resources(struct dma_chan *dchan) |
1546 | } |
1547 | #endif /* CONFIG_PCI_MSI */ |
1548 | |
1549 | - tasklet_enable(&bdma_chan->tasklet); |
1550 | + bdma_chan->active = true; |
1551 | tsi721_bdma_interrupt_enable(bdma_chan, 1); |
1552 | |
1553 | return bdma_chan->bd_num - 1; |
1554 | @@ -576,9 +576,7 @@ err_out: |
1555 | static void tsi721_free_chan_resources(struct dma_chan *dchan) |
1556 | { |
1557 | struct tsi721_bdma_chan *bdma_chan = to_tsi721_chan(dchan); |
1558 | -#ifdef CONFIG_PCI_MSI |
1559 | struct tsi721_device *priv = to_tsi721(dchan->device); |
1560 | -#endif |
1561 | LIST_HEAD(list); |
1562 | |
1563 | dev_dbg(dchan->device->dev, "%s: Entry\n", __func__); |
1564 | @@ -589,14 +587,25 @@ static void tsi721_free_chan_resources(struct dma_chan *dchan) |
1565 | BUG_ON(!list_empty(&bdma_chan->active_list)); |
1566 | BUG_ON(!list_empty(&bdma_chan->queue)); |
1567 | |
1568 | - tasklet_disable(&bdma_chan->tasklet); |
1569 | + tsi721_bdma_interrupt_enable(bdma_chan, 0); |
1570 | + bdma_chan->active = false; |
1571 | + |
1572 | +#ifdef CONFIG_PCI_MSI |
1573 | + if (priv->flags & TSI721_USING_MSIX) { |
1574 | + synchronize_irq(priv->msix[TSI721_VECT_DMA0_DONE + |
1575 | + bdma_chan->id].vector); |
1576 | + synchronize_irq(priv->msix[TSI721_VECT_DMA0_INT + |
1577 | + bdma_chan->id].vector); |
1578 | + } else |
1579 | +#endif |
1580 | + synchronize_irq(priv->pdev->irq); |
1581 | + |
1582 | + tasklet_kill(&bdma_chan->tasklet); |
1583 | |
1584 | spin_lock_bh(&bdma_chan->lock); |
1585 | list_splice_init(&bdma_chan->free_list, &list); |
1586 | spin_unlock_bh(&bdma_chan->lock); |
1587 | |
1588 | - tsi721_bdma_interrupt_enable(bdma_chan, 0); |
1589 | - |
1590 | #ifdef CONFIG_PCI_MSI |
1591 | if (priv->flags & TSI721_USING_MSIX) { |
1592 | free_irq(priv->msix[TSI721_VECT_DMA0_DONE + |
1593 | @@ -790,6 +799,7 @@ int tsi721_register_dma(struct tsi721_device *priv) |
1594 | bdma_chan->dchan.cookie = 1; |
1595 | bdma_chan->dchan.chan_id = i; |
1596 | bdma_chan->id = i; |
1597 | + bdma_chan->active = false; |
1598 | |
1599 | spin_lock_init(&bdma_chan->lock); |
1600 | |
1601 | @@ -799,7 +809,6 @@ int tsi721_register_dma(struct tsi721_device *priv) |
1602 | |
1603 | tasklet_init(&bdma_chan->tasklet, tsi721_dma_tasklet, |
1604 | (unsigned long)bdma_chan); |
1605 | - tasklet_disable(&bdma_chan->tasklet); |
1606 | list_add_tail(&bdma_chan->dchan.device_node, |
1607 | &mport->dma.channels); |
1608 | } |
1609 | diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c |
1610 | index 815d6df8bd5f..c59cc6ed7adb 100644 |
1611 | --- a/drivers/regulator/core.c |
1612 | +++ b/drivers/regulator/core.c |
1613 | @@ -919,6 +919,8 @@ static int machine_constraints_voltage(struct regulator_dev *rdev, |
1614 | return 0; |
1615 | } |
1616 | |
1617 | +static int _regulator_do_enable(struct regulator_dev *rdev); |
1618 | + |
1619 | /** |
1620 | * set_machine_constraints - sets regulator constraints |
1621 | * @rdev: regulator source |
1622 | @@ -975,10 +977,9 @@ static int set_machine_constraints(struct regulator_dev *rdev, |
1623 | /* If the constraints say the regulator should be on at this point |
1624 | * and we have control then make sure it is enabled. |
1625 | */ |
1626 | - if ((rdev->constraints->always_on || rdev->constraints->boot_on) && |
1627 | - ops->enable) { |
1628 | - ret = ops->enable(rdev); |
1629 | - if (ret < 0) { |
1630 | + if (rdev->constraints->always_on || rdev->constraints->boot_on) { |
1631 | + ret = _regulator_do_enable(rdev); |
1632 | + if (ret < 0 && ret != -EINVAL) { |
1633 | rdev_err(rdev, "failed to enable\n"); |
1634 | goto out; |
1635 | } |
1636 | @@ -3790,9 +3791,8 @@ int regulator_suspend_finish(void) |
1637 | struct regulator_ops *ops = rdev->desc->ops; |
1638 | |
1639 | mutex_lock(&rdev->mutex); |
1640 | - if ((rdev->use_count > 0 || rdev->constraints->always_on) && |
1641 | - ops->enable) { |
1642 | - error = ops->enable(rdev); |
1643 | + if (rdev->use_count > 0 || rdev->constraints->always_on) { |
1644 | + error = _regulator_do_enable(rdev); |
1645 | if (error) |
1646 | ret = error; |
1647 | } else { |
1648 | diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c |
1649 | index d72a9216ee2e..e91ec8cd9b09 100644 |
1650 | --- a/drivers/s390/block/dasd.c |
1651 | +++ b/drivers/s390/block/dasd.c |
1652 | @@ -2879,12 +2879,12 @@ static int dasd_alloc_queue(struct dasd_block *block) |
1653 | |
1654 | elevator_exit(block->request_queue->elevator); |
1655 | block->request_queue->elevator = NULL; |
1656 | + mutex_lock(&block->request_queue->sysfs_lock); |
1657 | rc = elevator_init(block->request_queue, "deadline"); |
1658 | - if (rc) { |
1659 | + if (rc) |
1660 | blk_cleanup_queue(block->request_queue); |
1661 | - return rc; |
1662 | - } |
1663 | - return 0; |
1664 | + mutex_unlock(&block->request_queue->sysfs_lock); |
1665 | + return rc; |
1666 | } |
1667 | |
1668 | /* |
1669 | diff --git a/drivers/scsi/isci/host.h b/drivers/scsi/isci/host.h |
1670 | index 4911310a38f5..22a9bb1abae1 100644 |
1671 | --- a/drivers/scsi/isci/host.h |
1672 | +++ b/drivers/scsi/isci/host.h |
1673 | @@ -311,9 +311,8 @@ static inline struct Scsi_Host *to_shost(struct isci_host *ihost) |
1674 | } |
1675 | |
1676 | #define for_each_isci_host(id, ihost, pdev) \ |
1677 | - for (id = 0, ihost = to_pci_info(pdev)->hosts[id]; \ |
1678 | - id < ARRAY_SIZE(to_pci_info(pdev)->hosts) && ihost; \ |
1679 | - ihost = to_pci_info(pdev)->hosts[++id]) |
1680 | + for (id = 0; id < SCI_MAX_CONTROLLERS && \ |
1681 | + (ihost = to_pci_info(pdev)->hosts[id]); id++) |
1682 | |
1683 | static inline void wait_for_start(struct isci_host *ihost) |
1684 | { |
1685 | diff --git a/drivers/scsi/isci/port_config.c b/drivers/scsi/isci/port_config.c |
1686 | index cd962da4a57a..5017bde3b366 100644 |
1687 | --- a/drivers/scsi/isci/port_config.c |
1688 | +++ b/drivers/scsi/isci/port_config.c |
1689 | @@ -615,13 +615,6 @@ static void sci_apc_agent_link_up(struct isci_host *ihost, |
1690 | SCIC_SDS_APC_WAIT_LINK_UP_NOTIFICATION); |
1691 | } else { |
1692 | /* the phy is already the part of the port */ |
1693 | - u32 port_state = iport->sm.current_state_id; |
1694 | - |
1695 | - /* if the PORT'S state is resetting then the link up is from |
1696 | - * port hard reset in this case, we need to tell the port |
1697 | - * that link up is recieved |
1698 | - */ |
1699 | - BUG_ON(port_state != SCI_PORT_RESETTING); |
1700 | port_agent->phy_ready_mask |= 1 << phy_index; |
1701 | sci_port_link_up(iport, iphy); |
1702 | } |
1703 | diff --git a/drivers/scsi/isci/task.c b/drivers/scsi/isci/task.c |
1704 | index 0d30ca849e8f..5d6fda72d659 100644 |
1705 | --- a/drivers/scsi/isci/task.c |
1706 | +++ b/drivers/scsi/isci/task.c |
1707 | @@ -801,7 +801,7 @@ int isci_task_I_T_nexus_reset(struct domain_device *dev) |
1708 | /* XXX: need to cleanup any ireqs targeting this |
1709 | * domain_device |
1710 | */ |
1711 | - ret = TMF_RESP_FUNC_COMPLETE; |
1712 | + ret = -ENODEV; |
1713 | goto out; |
1714 | } |
1715 | |
1716 | diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
1717 | index c32efc753229..799c266b0bb5 100644 |
1718 | --- a/drivers/scsi/qla2xxx/qla_def.h |
1719 | +++ b/drivers/scsi/qla2xxx/qla_def.h |
1720 | @@ -2980,8 +2980,7 @@ struct qla_hw_data { |
1721 | IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ |
1722 | IS_QLA82XX(ha) || IS_QLA83XX(ha)) |
1723 | #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
1724 | -#define IS_NOPOLLING_TYPE(ha) ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ |
1725 | - IS_QLA83XX(ha)) && (ha)->flags.msix_enabled) |
1726 | +#define IS_NOPOLLING_TYPE(ha) (IS_QLA81XX(ha) && (ha)->flags.msix_enabled) |
1727 | #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
1728 | #define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) |
1729 | #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) |
1730 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c |
1731 | index fb7437dd5b7a..91b76cea3e3c 100644 |
1732 | --- a/drivers/scsi/storvsc_drv.c |
1733 | +++ b/drivers/scsi/storvsc_drv.c |
1734 | @@ -1189,6 +1189,9 @@ static void storvsc_device_destroy(struct scsi_device *sdevice) |
1735 | { |
1736 | struct stor_mem_pools *memp = sdevice->hostdata; |
1737 | |
1738 | + if (!memp) |
1739 | + return; |
1740 | + |
1741 | mempool_destroy(memp->request_mempool); |
1742 | kmem_cache_destroy(memp->request_pool); |
1743 | kfree(memp); |
1744 | diff --git a/drivers/spi/spi-ath79.c b/drivers/spi/spi-ath79.c |
1745 | index e504b7636058..23f1ba6e9ccf 100644 |
1746 | --- a/drivers/spi/spi-ath79.c |
1747 | +++ b/drivers/spi/spi-ath79.c |
1748 | @@ -132,9 +132,9 @@ static int ath79_spi_setup_cs(struct spi_device *spi) |
1749 | |
1750 | flags = GPIOF_DIR_OUT; |
1751 | if (spi->mode & SPI_CS_HIGH) |
1752 | - flags |= GPIOF_INIT_HIGH; |
1753 | - else |
1754 | flags |= GPIOF_INIT_LOW; |
1755 | + else |
1756 | + flags |= GPIOF_INIT_HIGH; |
1757 | |
1758 | status = gpio_request_one(cdata->gpio, flags, |
1759 | dev_name(&spi->dev)); |
1760 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
1761 | index 5b07fd156bd7..5232ac7b0745 100644 |
1762 | --- a/drivers/target/iscsi/iscsi_target.c |
1763 | +++ b/drivers/target/iscsi/iscsi_target.c |
1764 | @@ -3653,7 +3653,7 @@ iscsit_immediate_queue(struct iscsi_conn *conn, struct iscsi_cmd *cmd, int state |
1765 | break; |
1766 | case ISTATE_REMOVE: |
1767 | spin_lock_bh(&conn->cmd_lock); |
1768 | - list_del(&cmd->i_conn_node); |
1769 | + list_del_init(&cmd->i_conn_node); |
1770 | spin_unlock_bh(&conn->cmd_lock); |
1771 | |
1772 | iscsit_free_cmd(cmd, false); |
1773 | @@ -4099,7 +4099,7 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn) |
1774 | spin_lock_bh(&conn->cmd_lock); |
1775 | list_for_each_entry_safe(cmd, cmd_tmp, &conn->conn_cmd_list, i_conn_node) { |
1776 | |
1777 | - list_del(&cmd->i_conn_node); |
1778 | + list_del_init(&cmd->i_conn_node); |
1779 | spin_unlock_bh(&conn->cmd_lock); |
1780 | |
1781 | iscsit_increment_maxcmdsn(cmd, sess); |
1782 | @@ -4144,6 +4144,10 @@ int iscsit_close_connection( |
1783 | iscsit_stop_timers_for_cmds(conn); |
1784 | iscsit_stop_nopin_response_timer(conn); |
1785 | iscsit_stop_nopin_timer(conn); |
1786 | + |
1787 | + if (conn->conn_transport->iscsit_wait_conn) |
1788 | + conn->conn_transport->iscsit_wait_conn(conn); |
1789 | + |
1790 | iscsit_free_queue_reqs_for_conn(conn); |
1791 | |
1792 | /* |
1793 | diff --git a/drivers/target/iscsi/iscsi_target_erl2.c b/drivers/target/iscsi/iscsi_target_erl2.c |
1794 | index 45a5afd5ea13..0d2d013076c4 100644 |
1795 | --- a/drivers/target/iscsi/iscsi_target_erl2.c |
1796 | +++ b/drivers/target/iscsi/iscsi_target_erl2.c |
1797 | @@ -140,7 +140,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess) |
1798 | list_for_each_entry_safe(cmd, cmd_tmp, |
1799 | &cr->conn_recovery_cmd_list, i_conn_node) { |
1800 | |
1801 | - list_del(&cmd->i_conn_node); |
1802 | + list_del_init(&cmd->i_conn_node); |
1803 | cmd->conn = NULL; |
1804 | spin_unlock(&cr->conn_recovery_cmd_lock); |
1805 | iscsit_free_cmd(cmd, true); |
1806 | @@ -162,7 +162,7 @@ void iscsit_free_connection_recovery_entires(struct iscsi_session *sess) |
1807 | list_for_each_entry_safe(cmd, cmd_tmp, |
1808 | &cr->conn_recovery_cmd_list, i_conn_node) { |
1809 | |
1810 | - list_del(&cmd->i_conn_node); |
1811 | + list_del_init(&cmd->i_conn_node); |
1812 | cmd->conn = NULL; |
1813 | spin_unlock(&cr->conn_recovery_cmd_lock); |
1814 | iscsit_free_cmd(cmd, true); |
1815 | @@ -218,7 +218,7 @@ int iscsit_remove_cmd_from_connection_recovery( |
1816 | } |
1817 | cr = cmd->cr; |
1818 | |
1819 | - list_del(&cmd->i_conn_node); |
1820 | + list_del_init(&cmd->i_conn_node); |
1821 | return --cr->cmd_count; |
1822 | } |
1823 | |
1824 | @@ -299,7 +299,7 @@ int iscsit_discard_unacknowledged_ooo_cmdsns_for_conn(struct iscsi_conn *conn) |
1825 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN)) |
1826 | continue; |
1827 | |
1828 | - list_del(&cmd->i_conn_node); |
1829 | + list_del_init(&cmd->i_conn_node); |
1830 | |
1831 | spin_unlock_bh(&conn->cmd_lock); |
1832 | iscsit_free_cmd(cmd, true); |
1833 | @@ -337,7 +337,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) |
1834 | /* |
1835 | * Only perform connection recovery on ISCSI_OP_SCSI_CMD or |
1836 | * ISCSI_OP_NOOP_OUT opcodes. For all other opcodes call |
1837 | - * list_del(&cmd->i_conn_node); to release the command to the |
1838 | + * list_del_init(&cmd->i_conn_node); to release the command to the |
1839 | * session pool and remove it from the connection's list. |
1840 | * |
1841 | * Also stop the DataOUT timer, which will be restarted after |
1842 | @@ -353,7 +353,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) |
1843 | " CID: %hu\n", cmd->iscsi_opcode, |
1844 | cmd->init_task_tag, cmd->cmd_sn, conn->cid); |
1845 | |
1846 | - list_del(&cmd->i_conn_node); |
1847 | + list_del_init(&cmd->i_conn_node); |
1848 | spin_unlock_bh(&conn->cmd_lock); |
1849 | iscsit_free_cmd(cmd, true); |
1850 | spin_lock_bh(&conn->cmd_lock); |
1851 | @@ -373,7 +373,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) |
1852 | */ |
1853 | if (!(cmd->cmd_flags & ICF_OOO_CMDSN) && !cmd->immediate_cmd && |
1854 | iscsi_sna_gte(cmd->cmd_sn, conn->sess->exp_cmd_sn)) { |
1855 | - list_del(&cmd->i_conn_node); |
1856 | + list_del_init(&cmd->i_conn_node); |
1857 | spin_unlock_bh(&conn->cmd_lock); |
1858 | iscsit_free_cmd(cmd, true); |
1859 | spin_lock_bh(&conn->cmd_lock); |
1860 | @@ -395,7 +395,7 @@ int iscsit_prepare_cmds_for_realligance(struct iscsi_conn *conn) |
1861 | |
1862 | cmd->sess = conn->sess; |
1863 | |
1864 | - list_del(&cmd->i_conn_node); |
1865 | + list_del_init(&cmd->i_conn_node); |
1866 | spin_unlock_bh(&conn->cmd_lock); |
1867 | |
1868 | iscsit_free_all_datain_reqs(cmd); |
1869 | diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c |
1870 | index 439260b7d87f..f31b4c5cdf3f 100644 |
1871 | --- a/drivers/target/iscsi/iscsi_target_tpg.c |
1872 | +++ b/drivers/target/iscsi/iscsi_target_tpg.c |
1873 | @@ -138,7 +138,7 @@ struct iscsi_portal_group *iscsit_get_tpg_from_np( |
1874 | list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) { |
1875 | |
1876 | spin_lock(&tpg->tpg_state_lock); |
1877 | - if (tpg->tpg_state == TPG_STATE_FREE) { |
1878 | + if (tpg->tpg_state != TPG_STATE_ACTIVE) { |
1879 | spin_unlock(&tpg->tpg_state_lock); |
1880 | continue; |
1881 | } |
1882 | diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c |
1883 | index 548d1996590f..652438325197 100644 |
1884 | --- a/drivers/usb/core/config.c |
1885 | +++ b/drivers/usb/core/config.c |
1886 | @@ -718,6 +718,10 @@ int usb_get_configuration(struct usb_device *dev) |
1887 | result = -ENOMEM; |
1888 | goto err; |
1889 | } |
1890 | + |
1891 | + if (dev->quirks & USB_QUIRK_DELAY_INIT) |
1892 | + msleep(100); |
1893 | + |
1894 | result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, |
1895 | bigbuffer, length); |
1896 | if (result < 0) { |
1897 | diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c |
1898 | index 01fe36273f3b..1053eb651b2f 100644 |
1899 | --- a/drivers/usb/core/quirks.c |
1900 | +++ b/drivers/usb/core/quirks.c |
1901 | @@ -46,6 +46,10 @@ static const struct usb_device_id usb_quirk_list[] = { |
1902 | /* Microsoft LifeCam-VX700 v2.0 */ |
1903 | { USB_DEVICE(0x045e, 0x0770), .driver_info = USB_QUIRK_RESET_RESUME }, |
1904 | |
1905 | + /* Logitech HD Pro Webcams C920 and C930e */ |
1906 | + { USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT }, |
1907 | + { USB_DEVICE(0x046d, 0x0843), .driver_info = USB_QUIRK_DELAY_INIT }, |
1908 | + |
1909 | /* Logitech Quickcam Fusion */ |
1910 | { USB_DEVICE(0x046d, 0x08c1), .driver_info = USB_QUIRK_RESET_RESUME }, |
1911 | |
1912 | diff --git a/fs/bio-integrity.c b/fs/bio-integrity.c |
1913 | index 8dccf73025b3..433c3b828e1d 100644 |
1914 | --- a/fs/bio-integrity.c |
1915 | +++ b/fs/bio-integrity.c |
1916 | @@ -458,7 +458,7 @@ static int bio_integrity_verify(struct bio *bio) |
1917 | bix.disk_name = bio->bi_bdev->bd_disk->disk_name; |
1918 | bix.sector_size = bi->sector_size; |
1919 | |
1920 | - bio_for_each_segment(bv, bio, i) { |
1921 | + bio_for_each_segment_all(bv, bio, i) { |
1922 | void *kaddr = kmap_atomic(bv->bv_page); |
1923 | bix.data_buf = kaddr + bv->bv_offset; |
1924 | bix.data_size = bv->bv_len; |
1925 | diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c |
1926 | index b189bd1e7a3e..ce7067881d36 100644 |
1927 | --- a/fs/btrfs/compression.c |
1928 | +++ b/fs/btrfs/compression.c |
1929 | @@ -1009,6 +1009,8 @@ int btrfs_decompress_buf2page(char *buf, unsigned long buf_start, |
1930 | bytes = min(bytes, working_bytes); |
1931 | kaddr = kmap_atomic(page_out); |
1932 | memcpy(kaddr + *pg_offset, buf + buf_offset, bytes); |
1933 | + if (*pg_index == (vcnt - 1) && *pg_offset == 0) |
1934 | + memset(kaddr + bytes, 0, PAGE_CACHE_SIZE - bytes); |
1935 | kunmap_atomic(kaddr); |
1936 | flush_dcache_page(page_out); |
1937 | |
1938 | diff --git a/fs/namei.c b/fs/namei.c |
1939 | index cccaf77e76c5..1211ee5a1cb3 100644 |
1940 | --- a/fs/namei.c |
1941 | +++ b/fs/namei.c |
1942 | @@ -3655,6 +3655,7 @@ retry: |
1943 | out_dput: |
1944 | done_path_create(&new_path, new_dentry); |
1945 | if (retry_estale(error, how)) { |
1946 | + path_put(&old_path); |
1947 | how |= LOOKUP_REVAL; |
1948 | goto retry; |
1949 | } |
1950 | diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c |
1951 | index 57db3244f4d9..4b49a8c6ccad 100644 |
1952 | --- a/fs/nfs/delegation.c |
1953 | +++ b/fs/nfs/delegation.c |
1954 | @@ -656,16 +656,19 @@ int nfs_async_inode_return_delegation(struct inode *inode, |
1955 | |
1956 | rcu_read_lock(); |
1957 | delegation = rcu_dereference(NFS_I(inode)->delegation); |
1958 | + if (delegation == NULL) |
1959 | + goto out_enoent; |
1960 | |
1961 | - if (!clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) { |
1962 | - rcu_read_unlock(); |
1963 | - return -ENOENT; |
1964 | - } |
1965 | + if (!clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) |
1966 | + goto out_enoent; |
1967 | nfs_mark_return_delegation(server, delegation); |
1968 | rcu_read_unlock(); |
1969 | |
1970 | nfs_delegation_run_state_manager(clp); |
1971 | return 0; |
1972 | +out_enoent: |
1973 | + rcu_read_unlock(); |
1974 | + return -ENOENT; |
1975 | } |
1976 | |
1977 | static struct inode * |
1978 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
1979 | index 26e71bdb5b33..1ae7dd5956c5 100644 |
1980 | --- a/fs/nfs/nfs4proc.c |
1981 | +++ b/fs/nfs/nfs4proc.c |
1982 | @@ -3607,8 +3607,9 @@ static bool nfs4_stateid_is_current(nfs4_stateid *stateid, |
1983 | { |
1984 | nfs4_stateid current_stateid; |
1985 | |
1986 | - if (nfs4_set_rw_stateid(¤t_stateid, ctx, l_ctx, fmode)) |
1987 | - return false; |
1988 | + /* If the current stateid represents a lost lock, then exit */ |
1989 | + if (nfs4_set_rw_stateid(¤t_stateid, ctx, l_ctx, fmode) == -EIO) |
1990 | + return true; |
1991 | return nfs4_stateid_match(stateid, ¤t_stateid); |
1992 | } |
1993 | |
1994 | diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c |
1995 | index ff54014a24ec..46387e49aa46 100644 |
1996 | --- a/fs/ocfs2/file.c |
1997 | +++ b/fs/ocfs2/file.c |
1998 | @@ -2374,8 +2374,8 @@ out_dio: |
1999 | |
2000 | if (((file->f_flags & O_DSYNC) && !direct_io) || IS_SYNC(inode) || |
2001 | ((file->f_flags & O_DIRECT) && !direct_io)) { |
2002 | - ret = filemap_fdatawrite_range(file->f_mapping, pos, |
2003 | - pos + count - 1); |
2004 | + ret = filemap_fdatawrite_range(file->f_mapping, *ppos, |
2005 | + *ppos + count - 1); |
2006 | if (ret < 0) |
2007 | written = ret; |
2008 | |
2009 | @@ -2388,8 +2388,8 @@ out_dio: |
2010 | } |
2011 | |
2012 | if (!ret) |
2013 | - ret = filemap_fdatawait_range(file->f_mapping, pos, |
2014 | - pos + count - 1); |
2015 | + ret = filemap_fdatawait_range(file->f_mapping, *ppos, |
2016 | + *ppos + count - 1); |
2017 | } |
2018 | |
2019 | /* |
2020 | diff --git a/fs/ocfs2/quota_global.c b/fs/ocfs2/quota_global.c |
2021 | index 332a281f217e..e49b4f1cb26b 100644 |
2022 | --- a/fs/ocfs2/quota_global.c |
2023 | +++ b/fs/ocfs2/quota_global.c |
2024 | @@ -717,6 +717,12 @@ static int ocfs2_release_dquot(struct dquot *dquot) |
2025 | */ |
2026 | if (status < 0) |
2027 | mlog_errno(status); |
2028 | + /* |
2029 | + * Clear dq_off so that we search for the structure in quota file next |
2030 | + * time we acquire it. The structure might be deleted and reallocated |
2031 | + * elsewhere by another node while our dquot structure is on freelist. |
2032 | + */ |
2033 | + dquot->dq_off = 0; |
2034 | clear_bit(DQ_ACTIVE_B, &dquot->dq_flags); |
2035 | out_trans: |
2036 | ocfs2_commit_trans(osb, handle); |
2037 | @@ -756,16 +762,17 @@ static int ocfs2_acquire_dquot(struct dquot *dquot) |
2038 | status = ocfs2_lock_global_qf(info, 1); |
2039 | if (status < 0) |
2040 | goto out; |
2041 | - if (!test_bit(DQ_READ_B, &dquot->dq_flags)) { |
2042 | - status = ocfs2_qinfo_lock(info, 0); |
2043 | - if (status < 0) |
2044 | - goto out_dq; |
2045 | - status = qtree_read_dquot(&info->dqi_gi, dquot); |
2046 | - ocfs2_qinfo_unlock(info, 0); |
2047 | - if (status < 0) |
2048 | - goto out_dq; |
2049 | - } |
2050 | - set_bit(DQ_READ_B, &dquot->dq_flags); |
2051 | + status = ocfs2_qinfo_lock(info, 0); |
2052 | + if (status < 0) |
2053 | + goto out_dq; |
2054 | + /* |
2055 | + * We always want to read dquot structure from disk because we don't |
2056 | + * know what happened with it while it was on freelist. |
2057 | + */ |
2058 | + status = qtree_read_dquot(&info->dqi_gi, dquot); |
2059 | + ocfs2_qinfo_unlock(info, 0); |
2060 | + if (status < 0) |
2061 | + goto out_dq; |
2062 | |
2063 | OCFS2_DQUOT(dquot)->dq_use_count++; |
2064 | OCFS2_DQUOT(dquot)->dq_origspace = dquot->dq_dqb.dqb_curspace; |
2065 | diff --git a/fs/ocfs2/quota_local.c b/fs/ocfs2/quota_local.c |
2066 | index 27fe7ee4874c..d0f323da0b5c 100644 |
2067 | --- a/fs/ocfs2/quota_local.c |
2068 | +++ b/fs/ocfs2/quota_local.c |
2069 | @@ -1303,10 +1303,6 @@ int ocfs2_local_release_dquot(handle_t *handle, struct dquot *dquot) |
2070 | ocfs2_journal_dirty(handle, od->dq_chunk->qc_headerbh); |
2071 | |
2072 | out: |
2073 | - /* Clear the read bit so that next time someone uses this |
2074 | - * dquot he reads fresh info from disk and allocates local |
2075 | - * dquot structure */ |
2076 | - clear_bit(DQ_READ_B, &dquot->dq_flags); |
2077 | return status; |
2078 | } |
2079 | |
2080 | diff --git a/fs/proc/base.c b/fs/proc/base.c |
2081 | index c3834dad09b3..de12b8128b95 100644 |
2082 | --- a/fs/proc/base.c |
2083 | +++ b/fs/proc/base.c |
2084 | @@ -1825,6 +1825,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path) |
2085 | if (rc) |
2086 | goto out_mmput; |
2087 | |
2088 | + rc = -ENOENT; |
2089 | down_read(&mm->mmap_sem); |
2090 | vma = find_exact_vma(mm, vm_start, vm_end); |
2091 | if (vma && vma->vm_file) { |
2092 | diff --git a/include/linux/firewire.h b/include/linux/firewire.h |
2093 | index 217e4b42b7c8..5d838bf10cbd 100644 |
2094 | --- a/include/linux/firewire.h |
2095 | +++ b/include/linux/firewire.h |
2096 | @@ -200,6 +200,7 @@ struct fw_device { |
2097 | unsigned irmc:1; |
2098 | unsigned bc_implemented:2; |
2099 | |
2100 | + work_func_t workfn; |
2101 | struct delayed_work work; |
2102 | struct fw_attribute_group attribute_group; |
2103 | }; |
2104 | diff --git a/include/linux/jiffies.h b/include/linux/jiffies.h |
2105 | index 8fb8edf12417..7b5d4a8ab199 100644 |
2106 | --- a/include/linux/jiffies.h |
2107 | +++ b/include/linux/jiffies.h |
2108 | @@ -101,13 +101,13 @@ static inline u64 get_jiffies_64(void) |
2109 | #define time_after(a,b) \ |
2110 | (typecheck(unsigned long, a) && \ |
2111 | typecheck(unsigned long, b) && \ |
2112 | - ((long)(b) - (long)(a) < 0)) |
2113 | + ((long)((b) - (a)) < 0)) |
2114 | #define time_before(a,b) time_after(b,a) |
2115 | |
2116 | #define time_after_eq(a,b) \ |
2117 | (typecheck(unsigned long, a) && \ |
2118 | typecheck(unsigned long, b) && \ |
2119 | - ((long)(a) - (long)(b) >= 0)) |
2120 | + ((long)((a) - (b)) >= 0)) |
2121 | #define time_before_eq(a,b) time_after_eq(b,a) |
2122 | |
2123 | /* |
2124 | @@ -130,13 +130,13 @@ static inline u64 get_jiffies_64(void) |
2125 | #define time_after64(a,b) \ |
2126 | (typecheck(__u64, a) && \ |
2127 | typecheck(__u64, b) && \ |
2128 | - ((__s64)(b) - (__s64)(a) < 0)) |
2129 | + ((__s64)((b) - (a)) < 0)) |
2130 | #define time_before64(a,b) time_after64(b,a) |
2131 | |
2132 | #define time_after_eq64(a,b) \ |
2133 | (typecheck(__u64, a) && \ |
2134 | typecheck(__u64, b) && \ |
2135 | - ((__s64)(a) - (__s64)(b) >= 0)) |
2136 | + ((__s64)((a) - (b)) >= 0)) |
2137 | #define time_before_eq64(a,b) time_after_eq64(b,a) |
2138 | |
2139 | /* |
2140 | diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h |
2141 | index f8e084d0fc77..ba605015c4d8 100644 |
2142 | --- a/include/linux/tracepoint.h |
2143 | +++ b/include/linux/tracepoint.h |
2144 | @@ -60,6 +60,12 @@ struct tp_module { |
2145 | unsigned int num_tracepoints; |
2146 | struct tracepoint * const *tracepoints_ptrs; |
2147 | }; |
2148 | +bool trace_module_has_bad_taint(struct module *mod); |
2149 | +#else |
2150 | +static inline bool trace_module_has_bad_taint(struct module *mod) |
2151 | +{ |
2152 | + return false; |
2153 | +} |
2154 | #endif /* CONFIG_MODULES */ |
2155 | |
2156 | struct tracepoint_iter { |
2157 | diff --git a/include/net/tcp.h b/include/net/tcp.h |
2158 | index 3fc77e90624a..6f87f0873843 100644 |
2159 | --- a/include/net/tcp.h |
2160 | +++ b/include/net/tcp.h |
2161 | @@ -1308,7 +1308,8 @@ struct tcp_fastopen_request { |
2162 | /* Fast Open cookie. Size 0 means a cookie request */ |
2163 | struct tcp_fastopen_cookie cookie; |
2164 | struct msghdr *data; /* data in MSG_FASTOPEN */ |
2165 | - u16 copied; /* queued in tcp_connect() */ |
2166 | + size_t size; |
2167 | + int copied; /* queued in tcp_connect() */ |
2168 | }; |
2169 | void tcp_free_fastopen_req(struct tcp_sock *tp); |
2170 | |
2171 | diff --git a/include/target/iscsi/iscsi_transport.h b/include/target/iscsi/iscsi_transport.h |
2172 | index c5aade523863..4a5f00e2e6cd 100644 |
2173 | --- a/include/target/iscsi/iscsi_transport.h |
2174 | +++ b/include/target/iscsi/iscsi_transport.h |
2175 | @@ -11,6 +11,7 @@ struct iscsit_transport { |
2176 | int (*iscsit_setup_np)(struct iscsi_np *, struct __kernel_sockaddr_storage *); |
2177 | int (*iscsit_accept_np)(struct iscsi_np *, struct iscsi_conn *); |
2178 | void (*iscsit_free_np)(struct iscsi_np *); |
2179 | + void (*iscsit_wait_conn)(struct iscsi_conn *); |
2180 | void (*iscsit_free_conn)(struct iscsi_conn *); |
2181 | struct iscsi_cmd *(*iscsit_alloc_cmd)(struct iscsi_conn *, gfp_t); |
2182 | int (*iscsit_get_login_rx)(struct iscsi_conn *, struct iscsi_login *); |
2183 | diff --git a/ipc/msg.c b/ipc/msg.c |
2184 | index 558aa91186b6..52770bfde2a5 100644 |
2185 | --- a/ipc/msg.c |
2186 | +++ b/ipc/msg.c |
2187 | @@ -885,6 +885,8 @@ long do_msgrcv(int msqid, void __user *buf, size_t bufsz, long msgtyp, int msgfl |
2188 | return -EINVAL; |
2189 | |
2190 | if (msgflg & MSG_COPY) { |
2191 | + if ((msgflg & MSG_EXCEPT) || !(msgflg & IPC_NOWAIT)) |
2192 | + return -EINVAL; |
2193 | copy = prepare_copy(buf, min_t(size_t, bufsz, ns->msg_ctlmax)); |
2194 | if (IS_ERR(copy)) |
2195 | return PTR_ERR(copy); |
2196 | diff --git a/kernel/cpuset.c b/kernel/cpuset.c |
2197 | index d313870dcd02..d9dd521ddd6b 100644 |
2198 | --- a/kernel/cpuset.c |
2199 | +++ b/kernel/cpuset.c |
2200 | @@ -2422,9 +2422,9 @@ int __cpuset_node_allowed_softwall(int node, gfp_t gfp_mask) |
2201 | |
2202 | task_lock(current); |
2203 | cs = nearest_hardwall_ancestor(task_cs(current)); |
2204 | + allowed = node_isset(node, cs->mems_allowed); |
2205 | task_unlock(current); |
2206 | |
2207 | - allowed = node_isset(node, cs->mems_allowed); |
2208 | mutex_unlock(&callback_mutex); |
2209 | return allowed; |
2210 | } |
2211 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
2212 | index dc4db3228dcd..9bd5c8a6c8ee 100644 |
2213 | --- a/kernel/irq/manage.c |
2214 | +++ b/kernel/irq/manage.c |
2215 | @@ -802,8 +802,7 @@ static irqreturn_t irq_thread_fn(struct irq_desc *desc, |
2216 | |
2217 | static void wake_threads_waitq(struct irq_desc *desc) |
2218 | { |
2219 | - if (atomic_dec_and_test(&desc->threads_active) && |
2220 | - waitqueue_active(&desc->wait_for_threads)) |
2221 | + if (atomic_dec_and_test(&desc->threads_active)) |
2222 | wake_up(&desc->wait_for_threads); |
2223 | } |
2224 | |
2225 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
2226 | index 305ef886219e..c7ab8eab5427 100644 |
2227 | --- a/kernel/sched/fair.c |
2228 | +++ b/kernel/sched/fair.c |
2229 | @@ -5862,15 +5862,15 @@ static void switched_from_fair(struct rq *rq, struct task_struct *p) |
2230 | struct cfs_rq *cfs_rq = cfs_rq_of(se); |
2231 | |
2232 | /* |
2233 | - * Ensure the task's vruntime is normalized, so that when its |
2234 | + * Ensure the task's vruntime is normalized, so that when it's |
2235 | * switched back to the fair class the enqueue_entity(.flags=0) will |
2236 | * do the right thing. |
2237 | * |
2238 | - * If it was on_rq, then the dequeue_entity(.flags=0) will already |
2239 | - * have normalized the vruntime, if it was !on_rq, then only when |
2240 | + * If it's on_rq, then the dequeue_entity(.flags=0) will already |
2241 | + * have normalized the vruntime, if it's !on_rq, then only when |
2242 | * the task is sleeping will it still have non-normalized vruntime. |
2243 | */ |
2244 | - if (!se->on_rq && p->state != TASK_RUNNING) { |
2245 | + if (!p->on_rq && p->state != TASK_RUNNING) { |
2246 | /* |
2247 | * Fix up our vruntime so that the current sleep doesn't |
2248 | * cause 'unlimited' sleep bonus. |
2249 | diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c |
2250 | index f681da32a2ff..19ee339a1d0d 100644 |
2251 | --- a/kernel/time/tick-broadcast.c |
2252 | +++ b/kernel/time/tick-broadcast.c |
2253 | @@ -594,6 +594,13 @@ again: |
2254 | cpumask_clear(tick_broadcast_force_mask); |
2255 | |
2256 | /* |
2257 | + * Sanity check. Catch the case where we try to broadcast to |
2258 | + * offline cpus. |
2259 | + */ |
2260 | + if (WARN_ON_ONCE(!cpumask_subset(tmpmask, cpu_online_mask))) |
2261 | + cpumask_and(tmpmask, tmpmask, cpu_online_mask); |
2262 | + |
2263 | + /* |
2264 | * Wakeup the cpus which have an expired event. |
2265 | */ |
2266 | tick_do_broadcast(tmpmask); |
2267 | @@ -834,10 +841,12 @@ void tick_shutdown_broadcast_oneshot(unsigned int *cpup) |
2268 | raw_spin_lock_irqsave(&tick_broadcast_lock, flags); |
2269 | |
2270 | /* |
2271 | - * Clear the broadcast mask flag for the dead cpu, but do not |
2272 | - * stop the broadcast device! |
2273 | + * Clear the broadcast masks for the dead cpu, but do not stop |
2274 | + * the broadcast device! |
2275 | */ |
2276 | cpumask_clear_cpu(cpu, tick_broadcast_oneshot_mask); |
2277 | + cpumask_clear_cpu(cpu, tick_broadcast_pending_mask); |
2278 | + cpumask_clear_cpu(cpu, tick_broadcast_force_mask); |
2279 | |
2280 | raw_spin_unlock_irqrestore(&tick_broadcast_lock, flags); |
2281 | } |
2282 | diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c |
2283 | index 3d18aadef493..2f4b185bfc23 100644 |
2284 | --- a/kernel/trace/trace_events.c |
2285 | +++ b/kernel/trace/trace_events.c |
2286 | @@ -1860,6 +1860,16 @@ static void trace_module_add_events(struct module *mod) |
2287 | struct ftrace_module_file_ops *file_ops = NULL; |
2288 | struct ftrace_event_call **call, **start, **end; |
2289 | |
2290 | + if (!mod->num_trace_events) |
2291 | + return; |
2292 | + |
2293 | + /* Don't add infrastructure for mods without tracepoints */ |
2294 | + if (trace_module_has_bad_taint(mod)) { |
2295 | + pr_err("%s: module has bad taint, not creating trace events\n", |
2296 | + mod->name); |
2297 | + return; |
2298 | + } |
2299 | + |
2300 | start = mod->trace_events; |
2301 | end = mod->trace_events + mod->num_trace_events; |
2302 | |
2303 | diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c |
2304 | index 29f26540e9c9..031cc5655a51 100644 |
2305 | --- a/kernel/tracepoint.c |
2306 | +++ b/kernel/tracepoint.c |
2307 | @@ -631,6 +631,11 @@ void tracepoint_iter_reset(struct tracepoint_iter *iter) |
2308 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); |
2309 | |
2310 | #ifdef CONFIG_MODULES |
2311 | +bool trace_module_has_bad_taint(struct module *mod) |
2312 | +{ |
2313 | + return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP)); |
2314 | +} |
2315 | + |
2316 | static int tracepoint_module_coming(struct module *mod) |
2317 | { |
2318 | struct tp_module *tp_mod, *iter; |
2319 | @@ -641,7 +646,7 @@ static int tracepoint_module_coming(struct module *mod) |
2320 | * module headers (for forced load), to make sure we don't cause a crash. |
2321 | * Staging and out-of-tree GPL modules are fine. |
2322 | */ |
2323 | - if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP))) |
2324 | + if (trace_module_has_bad_taint(mod)) |
2325 | return 0; |
2326 | mutex_lock(&tracepoints_mutex); |
2327 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); |
2328 | diff --git a/mm/compaction.c b/mm/compaction.c |
2329 | index 9a3e351da29b..18a90b4d0bfc 100644 |
2330 | --- a/mm/compaction.c |
2331 | +++ b/mm/compaction.c |
2332 | @@ -252,7 +252,6 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, |
2333 | { |
2334 | int nr_scanned = 0, total_isolated = 0; |
2335 | struct page *cursor, *valid_page = NULL; |
2336 | - unsigned long nr_strict_required = end_pfn - blockpfn; |
2337 | unsigned long flags; |
2338 | bool locked = false; |
2339 | |
2340 | @@ -265,11 +264,12 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, |
2341 | |
2342 | nr_scanned++; |
2343 | if (!pfn_valid_within(blockpfn)) |
2344 | - continue; |
2345 | + goto isolate_fail; |
2346 | + |
2347 | if (!valid_page) |
2348 | valid_page = page; |
2349 | if (!PageBuddy(page)) |
2350 | - continue; |
2351 | + goto isolate_fail; |
2352 | |
2353 | /* |
2354 | * The zone lock must be held to isolate freepages. |
2355 | @@ -290,12 +290,10 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, |
2356 | |
2357 | /* Recheck this is a buddy page under lock */ |
2358 | if (!PageBuddy(page)) |
2359 | - continue; |
2360 | + goto isolate_fail; |
2361 | |
2362 | /* Found a free page, break it into order-0 pages */ |
2363 | isolated = split_free_page(page); |
2364 | - if (!isolated && strict) |
2365 | - break; |
2366 | total_isolated += isolated; |
2367 | for (i = 0; i < isolated; i++) { |
2368 | list_add(&page->lru, freelist); |
2369 | @@ -306,7 +304,15 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, |
2370 | if (isolated) { |
2371 | blockpfn += isolated - 1; |
2372 | cursor += isolated - 1; |
2373 | + continue; |
2374 | } |
2375 | + |
2376 | +isolate_fail: |
2377 | + if (strict) |
2378 | + break; |
2379 | + else |
2380 | + continue; |
2381 | + |
2382 | } |
2383 | |
2384 | trace_mm_compaction_isolate_freepages(nr_scanned, total_isolated); |
2385 | @@ -316,7 +322,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, |
2386 | * pages requested were isolated. If there were any failures, 0 is |
2387 | * returned and CMA will fail. |
2388 | */ |
2389 | - if (strict && nr_strict_required > total_isolated) |
2390 | + if (strict && blockpfn < end_pfn) |
2391 | total_isolated = 0; |
2392 | |
2393 | if (locked) |
2394 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
2395 | index 6115b2bbd6ea..f45e21ab9cea 100644 |
2396 | --- a/mm/memcontrol.c |
2397 | +++ b/mm/memcontrol.c |
2398 | @@ -6326,9 +6326,23 @@ static void mem_cgroup_invalidate_reclaim_iterators(struct mem_cgroup *memcg) |
2399 | static void mem_cgroup_css_offline(struct cgroup *cont) |
2400 | { |
2401 | struct mem_cgroup *memcg = mem_cgroup_from_cont(cont); |
2402 | + struct cgroup *iter; |
2403 | |
2404 | mem_cgroup_invalidate_reclaim_iterators(memcg); |
2405 | + |
2406 | + /* |
2407 | + * This requires that offlining is serialized. Right now that is |
2408 | + * guaranteed because css_killed_work_fn() holds the cgroup_mutex. |
2409 | + */ |
2410 | + rcu_read_lock(); |
2411 | + cgroup_for_each_descendant_post(iter, cont) { |
2412 | + rcu_read_unlock(); |
2413 | + mem_cgroup_reparent_charges(mem_cgroup_from_cont(iter)); |
2414 | + rcu_read_lock(); |
2415 | + } |
2416 | + rcu_read_unlock(); |
2417 | mem_cgroup_reparent_charges(memcg); |
2418 | + |
2419 | mem_cgroup_destroy_all_caches(memcg); |
2420 | } |
2421 | |
2422 | diff --git a/net/core/neighbour.c b/net/core/neighbour.c |
2423 | index 49aeab86f317..b49e8bafab17 100644 |
2424 | --- a/net/core/neighbour.c |
2425 | +++ b/net/core/neighbour.c |
2426 | @@ -764,9 +764,6 @@ static void neigh_periodic_work(struct work_struct *work) |
2427 | nht = rcu_dereference_protected(tbl->nht, |
2428 | lockdep_is_held(&tbl->lock)); |
2429 | |
2430 | - if (atomic_read(&tbl->entries) < tbl->gc_thresh1) |
2431 | - goto out; |
2432 | - |
2433 | /* |
2434 | * periodically recompute ReachableTime from random function |
2435 | */ |
2436 | @@ -779,6 +776,9 @@ static void neigh_periodic_work(struct work_struct *work) |
2437 | neigh_rand_reach_time(p->base_reachable_time); |
2438 | } |
2439 | |
2440 | + if (atomic_read(&tbl->entries) < tbl->gc_thresh1) |
2441 | + goto out; |
2442 | + |
2443 | for (i = 0 ; i < (1 << nht->hash_shift); i++) { |
2444 | np = &nht->hash_buckets[i]; |
2445 | |
2446 | diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c |
2447 | index 1a2e249cef49..39bdb14b3214 100644 |
2448 | --- a/net/ipv4/tcp.c |
2449 | +++ b/net/ipv4/tcp.c |
2450 | @@ -1001,7 +1001,8 @@ void tcp_free_fastopen_req(struct tcp_sock *tp) |
2451 | } |
2452 | } |
2453 | |
2454 | -static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *size) |
2455 | +static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, |
2456 | + int *copied, size_t size) |
2457 | { |
2458 | struct tcp_sock *tp = tcp_sk(sk); |
2459 | int err, flags; |
2460 | @@ -1016,11 +1017,12 @@ static int tcp_sendmsg_fastopen(struct sock *sk, struct msghdr *msg, int *size) |
2461 | if (unlikely(tp->fastopen_req == NULL)) |
2462 | return -ENOBUFS; |
2463 | tp->fastopen_req->data = msg; |
2464 | + tp->fastopen_req->size = size; |
2465 | |
2466 | flags = (msg->msg_flags & MSG_DONTWAIT) ? O_NONBLOCK : 0; |
2467 | err = __inet_stream_connect(sk->sk_socket, msg->msg_name, |
2468 | msg->msg_namelen, flags); |
2469 | - *size = tp->fastopen_req->copied; |
2470 | + *copied = tp->fastopen_req->copied; |
2471 | tcp_free_fastopen_req(tp); |
2472 | return err; |
2473 | } |
2474 | @@ -1040,7 +1042,7 @@ int tcp_sendmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, |
2475 | |
2476 | flags = msg->msg_flags; |
2477 | if (flags & MSG_FASTOPEN) { |
2478 | - err = tcp_sendmsg_fastopen(sk, msg, &copied_syn); |
2479 | + err = tcp_sendmsg_fastopen(sk, msg, &copied_syn, size); |
2480 | if (err == -EINPROGRESS && copied_syn > 0) |
2481 | goto out; |
2482 | else if (err) |
2483 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
2484 | index d2df17940e07..6da3d94a114b 100644 |
2485 | --- a/net/ipv4/tcp_output.c |
2486 | +++ b/net/ipv4/tcp_output.c |
2487 | @@ -2892,7 +2892,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) |
2488 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - |
2489 | MAX_TCP_OPTION_SPACE; |
2490 | |
2491 | - syn_data = skb_copy_expand(syn, skb_headroom(syn), space, |
2492 | + space = min_t(size_t, space, fo->size); |
2493 | + |
2494 | + /* limit to order-0 allocations */ |
2495 | + space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); |
2496 | + |
2497 | + syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space, |
2498 | sk->sk_allocation); |
2499 | if (syn_data == NULL) |
2500 | goto fallback; |
2501 | diff --git a/net/ipv6/exthdrs_core.c b/net/ipv6/exthdrs_core.c |
2502 | index c5e83fae4df4..51af9d0d019a 100644 |
2503 | --- a/net/ipv6/exthdrs_core.c |
2504 | +++ b/net/ipv6/exthdrs_core.c |
2505 | @@ -212,7 +212,7 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, |
2506 | found = (nexthdr == target); |
2507 | |
2508 | if ((!ipv6_ext_hdr(nexthdr)) || nexthdr == NEXTHDR_NONE) { |
2509 | - if (target < 0) |
2510 | + if (target < 0 || found) |
2511 | break; |
2512 | return -ENOENT; |
2513 | } |
2514 | diff --git a/net/ipv6/udp_offload.c b/net/ipv6/udp_offload.c |
2515 | index 3696aa28784a..2f65b022627b 100644 |
2516 | --- a/net/ipv6/udp_offload.c |
2517 | +++ b/net/ipv6/udp_offload.c |
2518 | @@ -108,7 +108,7 @@ static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, |
2519 | fptr = (struct frag_hdr *)(skb_network_header(skb) + unfrag_ip6hlen); |
2520 | fptr->nexthdr = nexthdr; |
2521 | fptr->reserved = 0; |
2522 | - ipv6_select_ident(fptr, (struct rt6_info *)skb_dst(skb)); |
2523 | + fptr->identification = skb_shinfo(skb)->ip6_frag_id; |
2524 | |
2525 | /* Fragment the skb. ipv6 header and the remaining fields of the |
2526 | * fragment header are updated in ipv6_gso_segment() |
2527 | diff --git a/net/mac80211/mesh_ps.c b/net/mac80211/mesh_ps.c |
2528 | index 3b7bfc01ee36..ddda201832b3 100644 |
2529 | --- a/net/mac80211/mesh_ps.c |
2530 | +++ b/net/mac80211/mesh_ps.c |
2531 | @@ -36,6 +36,7 @@ static struct sk_buff *mps_qos_null_get(struct sta_info *sta) |
2532 | sdata->vif.addr); |
2533 | nullfunc->frame_control = fc; |
2534 | nullfunc->duration_id = 0; |
2535 | + nullfunc->seq_ctrl = 0; |
2536 | /* no address resolution for this frame -> set addr 1 immediately */ |
2537 | memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); |
2538 | memset(skb_put(skb, 2), 0, 2); /* append QoS control field */ |
2539 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
2540 | index 5b4328dcbe4e..49bc2246bd86 100644 |
2541 | --- a/net/mac80211/mlme.c |
2542 | +++ b/net/mac80211/mlme.c |
2543 | @@ -310,6 +310,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, |
2544 | switch (vht_oper->chan_width) { |
2545 | case IEEE80211_VHT_CHANWIDTH_USE_HT: |
2546 | vht_chandef.width = chandef->width; |
2547 | + vht_chandef.center_freq1 = chandef->center_freq1; |
2548 | break; |
2549 | case IEEE80211_VHT_CHANWIDTH_80MHZ: |
2550 | vht_chandef.width = NL80211_CHAN_WIDTH_80; |
2551 | @@ -359,6 +360,28 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata, |
2552 | ret = 0; |
2553 | |
2554 | out: |
2555 | + /* |
2556 | + * When tracking the current AP, don't do any further checks if the |
2557 | + * new chandef is identical to the one we're currently using for the |
2558 | + * connection. This keeps us from playing ping-pong with regulatory, |
2559 | + * without it the following can happen (for example): |
2560 | + * - connect to an AP with 80 MHz, world regdom allows 80 MHz |
2561 | + * - AP advertises regdom US |
2562 | + * - CRDA loads regdom US with 80 MHz prohibited (old database) |
2563 | + * - the code below detects an unsupported channel, downgrades, and |
2564 | + * we disconnect from the AP in the caller |
2565 | + * - disconnect causes CRDA to reload world regdomain and the game |
2566 | + * starts anew. |
2567 | + * (see https://bugzilla.kernel.org/show_bug.cgi?id=70881) |
2568 | + * |
2569 | + * It seems possible that there are still scenarios with CSA or real |
2570 | + * bandwidth changes where a this could happen, but those cases are |
2571 | + * less common and wouldn't completely prevent using the AP. |
2572 | + */ |
2573 | + if (tracking && |
2574 | + cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef)) |
2575 | + return ret; |
2576 | + |
2577 | /* don't print the message below for VHT mismatch if VHT is disabled */ |
2578 | if (ret & IEEE80211_STA_DISABLE_VHT) |
2579 | vht_chandef = *chandef; |
2580 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c |
2581 | index 11216bc13b27..0418777c361f 100644 |
2582 | --- a/net/mac80211/sta_info.c |
2583 | +++ b/net/mac80211/sta_info.c |
2584 | @@ -339,6 +339,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, |
2585 | return NULL; |
2586 | |
2587 | spin_lock_init(&sta->lock); |
2588 | + spin_lock_init(&sta->ps_lock); |
2589 | INIT_WORK(&sta->drv_unblock_wk, sta_unblock); |
2590 | INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); |
2591 | mutex_init(&sta->ampdu_mlme.mtx); |
2592 | @@ -1045,6 +1046,8 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) |
2593 | |
2594 | skb_queue_head_init(&pending); |
2595 | |
2596 | + /* sync with ieee80211_tx_h_unicast_ps_buf */ |
2597 | + spin_lock(&sta->ps_lock); |
2598 | /* Send all buffered frames to the station */ |
2599 | for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { |
2600 | int count = skb_queue_len(&pending), tmp; |
2601 | @@ -1064,6 +1067,7 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta) |
2602 | } |
2603 | |
2604 | ieee80211_add_pending_skbs_fn(local, &pending, clear_sta_ps_flags, sta); |
2605 | + spin_unlock(&sta->ps_lock); |
2606 | |
2607 | local->total_ps_buffered -= buffered; |
2608 | |
2609 | @@ -1110,6 +1114,7 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata, |
2610 | memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN); |
2611 | memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN); |
2612 | memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN); |
2613 | + nullfunc->seq_ctrl = 0; |
2614 | |
2615 | skb->priority = tid; |
2616 | skb_set_queue_mapping(skb, ieee802_1d_to_ac[tid]); |
2617 | diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h |
2618 | index adc30045f99e..3184b2b2853c 100644 |
2619 | --- a/net/mac80211/sta_info.h |
2620 | +++ b/net/mac80211/sta_info.h |
2621 | @@ -244,6 +244,7 @@ struct sta_ampdu_mlme { |
2622 | * @drv_unblock_wk: used for driver PS unblocking |
2623 | * @listen_interval: listen interval of this station, when we're acting as AP |
2624 | * @_flags: STA flags, see &enum ieee80211_sta_info_flags, do not use directly |
2625 | + * @ps_lock: used for powersave (when mac80211 is the AP) related locking |
2626 | * @ps_tx_buf: buffers (per AC) of frames to transmit to this station |
2627 | * when it leaves power saving state or polls |
2628 | * @tx_filtered: buffers (per AC) of frames we already tried to |
2629 | @@ -324,10 +325,8 @@ struct sta_info { |
2630 | /* use the accessors defined below */ |
2631 | unsigned long _flags; |
2632 | |
2633 | - /* |
2634 | - * STA powersave frame queues, no more than the internal |
2635 | - * locking required. |
2636 | - */ |
2637 | + /* STA powersave lock and frame queues */ |
2638 | + spinlock_t ps_lock; |
2639 | struct sk_buff_head ps_tx_buf[IEEE80211_NUM_ACS]; |
2640 | struct sk_buff_head tx_filtered[IEEE80211_NUM_ACS]; |
2641 | unsigned long driver_buffered_tids; |
2642 | diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c |
2643 | index fe9d6e7b904b..6d5791d735f3 100644 |
2644 | --- a/net/mac80211/tx.c |
2645 | +++ b/net/mac80211/tx.c |
2646 | @@ -461,6 +461,20 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) |
2647 | sta->sta.addr, sta->sta.aid, ac); |
2648 | if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER) |
2649 | purge_old_ps_buffers(tx->local); |
2650 | + |
2651 | + /* sync with ieee80211_sta_ps_deliver_wakeup */ |
2652 | + spin_lock(&sta->ps_lock); |
2653 | + /* |
2654 | + * STA woke up the meantime and all the frames on ps_tx_buf have |
2655 | + * been queued to pending queue. No reordering can happen, go |
2656 | + * ahead and Tx the packet. |
2657 | + */ |
2658 | + if (!test_sta_flag(sta, WLAN_STA_PS_STA) && |
2659 | + !test_sta_flag(sta, WLAN_STA_PS_DRIVER)) { |
2660 | + spin_unlock(&sta->ps_lock); |
2661 | + return TX_CONTINUE; |
2662 | + } |
2663 | + |
2664 | if (skb_queue_len(&sta->ps_tx_buf[ac]) >= STA_MAX_TX_BUFFER) { |
2665 | struct sk_buff *old = skb_dequeue(&sta->ps_tx_buf[ac]); |
2666 | ps_dbg(tx->sdata, |
2667 | @@ -474,6 +488,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) |
2668 | info->control.vif = &tx->sdata->vif; |
2669 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; |
2670 | skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); |
2671 | + spin_unlock(&sta->ps_lock); |
2672 | |
2673 | if (!timer_pending(&local->sta_cleanup)) |
2674 | mod_timer(&local->sta_cleanup, |
2675 | diff --git a/net/mac80211/wme.c b/net/mac80211/wme.c |
2676 | index afba19cb6f87..a282fddf8b00 100644 |
2677 | --- a/net/mac80211/wme.c |
2678 | +++ b/net/mac80211/wme.c |
2679 | @@ -153,6 +153,11 @@ u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata, |
2680 | return IEEE80211_AC_BE; |
2681 | } |
2682 | |
2683 | + if (skb->protocol == sdata->control_port_protocol) { |
2684 | + skb->priority = 7; |
2685 | + return ieee80211_downgrade_queue(sdata, skb); |
2686 | + } |
2687 | + |
2688 | /* use the data classifier to determine what 802.1d tag the |
2689 | * data frame has */ |
2690 | skb->priority = cfg80211_classify8021d(skb); |
2691 | diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c |
2692 | index de1a0138317f..7ceb25ba85b8 100644 |
2693 | --- a/net/sctp/sm_statefuns.c |
2694 | +++ b/net/sctp/sm_statefuns.c |
2695 | @@ -765,6 +765,13 @@ sctp_disposition_t sctp_sf_do_5_1D_ce(struct net *net, |
2696 | struct sctp_chunk auth; |
2697 | sctp_ierror_t ret; |
2698 | |
2699 | + /* Make sure that we and the peer are AUTH capable */ |
2700 | + if (!net->sctp.auth_enable || !new_asoc->peer.auth_capable) { |
2701 | + kfree_skb(chunk->auth_chunk); |
2702 | + sctp_association_free(new_asoc); |
2703 | + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); |
2704 | + } |
2705 | + |
2706 | /* set-up our fake chunk so that we can process it */ |
2707 | auth.skb = chunk->auth_chunk; |
2708 | auth.asoc = chunk->asoc; |
2709 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
2710 | index 3ca7927520b0..94d334781554 100644 |
2711 | --- a/net/unix/af_unix.c |
2712 | +++ b/net/unix/af_unix.c |
2713 | @@ -160,9 +160,8 @@ static inline void unix_set_secdata(struct scm_cookie *scm, struct sk_buff *skb) |
2714 | |
2715 | static inline unsigned int unix_hash_fold(__wsum n) |
2716 | { |
2717 | - unsigned int hash = (__force unsigned int)n; |
2718 | + unsigned int hash = (__force unsigned int)csum_fold(n); |
2719 | |
2720 | - hash ^= hash>>16; |
2721 | hash ^= hash>>8; |
2722 | return hash&(UNIX_HASH_SIZE-1); |
2723 | } |
2724 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
2725 | index 5a6527668c07..290e09825b82 100644 |
2726 | --- a/sound/pci/hda/patch_analog.c |
2727 | +++ b/sound/pci/hda/patch_analog.c |
2728 | @@ -3667,6 +3667,7 @@ static int ad1884_parse_auto_config(struct hda_codec *codec) |
2729 | spec = codec->spec; |
2730 | |
2731 | spec->gen.mixer_nid = 0x20; |
2732 | + spec->gen.mixer_merge_nid = 0x21; |
2733 | spec->gen.beep_nid = 0x10; |
2734 | set_beep_amp(spec, 0x10, 0, HDA_OUTPUT); |
2735 | |
2736 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
2737 | index e0bdcb3ecf0e..34548589f419 100644 |
2738 | --- a/sound/pci/hda/patch_realtek.c |
2739 | +++ b/sound/pci/hda/patch_realtek.c |
2740 | @@ -3648,6 +3648,7 @@ static const struct hda_fixup alc269_fixups[] = { |
2741 | }; |
2742 | |
2743 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
2744 | + SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC), |
2745 | SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC), |
2746 | SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC), |
2747 | SND_PCI_QUIRK(0x1028, 0x05bd, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE), |
2748 | diff --git a/sound/pci/oxygen/xonar_dg.c b/sound/pci/oxygen/xonar_dg.c |
2749 | index 77acd790ea47..eb7ad7706205 100644 |
2750 | --- a/sound/pci/oxygen/xonar_dg.c |
2751 | +++ b/sound/pci/oxygen/xonar_dg.c |
2752 | @@ -294,6 +294,16 @@ static int output_switch_put(struct snd_kcontrol *ctl, |
2753 | oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, |
2754 | data->output_sel == 1 ? GPIO_HP_REAR : 0, |
2755 | GPIO_HP_REAR); |
2756 | + oxygen_write8_masked(chip, OXYGEN_PLAY_ROUTING, |
2757 | + data->output_sel == 0 ? |
2758 | + OXYGEN_PLAY_MUTE01 : |
2759 | + OXYGEN_PLAY_MUTE23 | |
2760 | + OXYGEN_PLAY_MUTE45 | |
2761 | + OXYGEN_PLAY_MUTE67, |
2762 | + OXYGEN_PLAY_MUTE01 | |
2763 | + OXYGEN_PLAY_MUTE23 | |
2764 | + OXYGEN_PLAY_MUTE45 | |
2765 | + OXYGEN_PLAY_MUTE67); |
2766 | } |
2767 | mutex_unlock(&chip->mutex); |
2768 | return changed; |
2769 | @@ -596,7 +606,7 @@ struct oxygen_model model_xonar_dg = { |
2770 | .model_data_size = sizeof(struct dg), |
2771 | .device_config = PLAYBACK_0_TO_I2S | |
2772 | PLAYBACK_1_TO_SPDIF | |
2773 | - CAPTURE_0_FROM_I2S_2 | |
2774 | + CAPTURE_0_FROM_I2S_1 | |
2775 | CAPTURE_1_FROM_SPDIF, |
2776 | .dac_channels_pcm = 6, |
2777 | .dac_channels_mixer = 0, |
2778 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c |
2779 | index 95558ef4a7a0..be4db47cb2d9 100644 |
2780 | --- a/sound/usb/mixer.c |
2781 | +++ b/sound/usb/mixer.c |
2782 | @@ -883,6 +883,7 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval, |
2783 | } |
2784 | break; |
2785 | |
2786 | + case USB_ID(0x046d, 0x0807): /* Logitech Webcam C500 */ |
2787 | case USB_ID(0x046d, 0x0808): |
2788 | case USB_ID(0x046d, 0x0809): |
2789 | case USB_ID(0x046d, 0x081b): /* HD Webcam c310 */ |
Properties
Name | Value |
---|---|
svn:mime-type | application/x-xz |