Annotation of /trunk/kernel-alx/patches-4.4/0107-4.4.8-all-fixes.patch
Parent Directory | Revision Log
Revision 2799 -
(hide annotations)
(download)
Mon May 30 12:45:59 2016 UTC (8 years, 3 months ago) by niro
File size: 179651 byte(s)
Mon May 30 12:45:59 2016 UTC (8 years, 3 months ago) by niro
File size: 179651 byte(s)
-linux-4.4.8
1 | niro | 2799 | diff --git a/Documentation/devicetree/bindings/pinctrl/img,pistachio-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/img,pistachio-pinctrl.txt |
2 | index 08a4a32c8eb0..0326154c7925 100644 | ||
3 | --- a/Documentation/devicetree/bindings/pinctrl/img,pistachio-pinctrl.txt | ||
4 | +++ b/Documentation/devicetree/bindings/pinctrl/img,pistachio-pinctrl.txt | ||
5 | @@ -134,12 +134,12 @@ mfio80 ddr_debug, mips_trace_data, mips_debug | ||
6 | mfio81 dreq0, mips_trace_data, eth_debug | ||
7 | mfio82 dreq1, mips_trace_data, eth_debug | ||
8 | mfio83 mips_pll_lock, mips_trace_data, usb_debug | ||
9 | -mfio84 sys_pll_lock, mips_trace_data, usb_debug | ||
10 | -mfio85 wifi_pll_lock, mips_trace_data, sdhost_debug | ||
11 | -mfio86 bt_pll_lock, mips_trace_data, sdhost_debug | ||
12 | -mfio87 rpu_v_pll_lock, dreq2, socif_debug | ||
13 | -mfio88 rpu_l_pll_lock, dreq3, socif_debug | ||
14 | -mfio89 audio_pll_lock, dreq4, dreq5 | ||
15 | +mfio84 audio_pll_lock, mips_trace_data, usb_debug | ||
16 | +mfio85 rpu_v_pll_lock, mips_trace_data, sdhost_debug | ||
17 | +mfio86 rpu_l_pll_lock, mips_trace_data, sdhost_debug | ||
18 | +mfio87 sys_pll_lock, dreq2, socif_debug | ||
19 | +mfio88 wifi_pll_lock, dreq3, socif_debug | ||
20 | +mfio89 bt_pll_lock, dreq4, dreq5 | ||
21 | tck | ||
22 | trstn | ||
23 | tdi | ||
24 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt | ||
25 | index 742f69d18fc8..0e4102ae1a61 100644 | ||
26 | --- a/Documentation/kernel-parameters.txt | ||
27 | +++ b/Documentation/kernel-parameters.txt | ||
28 | @@ -3928,6 +3928,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
29 | sector if the number is odd); | ||
30 | i = IGNORE_DEVICE (don't bind to this | ||
31 | device); | ||
32 | + j = NO_REPORT_LUNS (don't use report luns | ||
33 | + command, uas only); | ||
34 | l = NOT_LOCKABLE (don't try to lock and | ||
35 | unlock ejectable media); | ||
36 | m = MAX_SECTORS_64 (don't transfer more | ||
37 | diff --git a/Makefile b/Makefile | ||
38 | index 5a493e785aca..1928fcd539cc 100644 | ||
39 | --- a/Makefile | ||
40 | +++ b/Makefile | ||
41 | @@ -1,6 +1,6 @@ | ||
42 | VERSION = 4 | ||
43 | PATCHLEVEL = 4 | ||
44 | -SUBLEVEL = 7 | ||
45 | +SUBLEVEL = 8 | ||
46 | EXTRAVERSION = | ||
47 | NAME = Blurry Fish Butt | ||
48 | |||
49 | diff --git a/arch/arm64/include/asm/opcodes.h b/arch/arm64/include/asm/opcodes.h | ||
50 | index 4e603ea36ad3..123f45d92cd1 100644 | ||
51 | --- a/arch/arm64/include/asm/opcodes.h | ||
52 | +++ b/arch/arm64/include/asm/opcodes.h | ||
53 | @@ -1 +1,5 @@ | ||
54 | +#ifdef CONFIG_CPU_BIG_ENDIAN | ||
55 | +#define CONFIG_CPU_ENDIAN_BE8 CONFIG_CPU_BIG_ENDIAN | ||
56 | +#endif | ||
57 | + | ||
58 | #include <../../arm/include/asm/opcodes.h> | ||
59 | diff --git a/arch/arm64/kernel/debug-monitors.c b/arch/arm64/kernel/debug-monitors.c | ||
60 | index 8aee3aeec3e6..c1492ba1f6d1 100644 | ||
61 | --- a/arch/arm64/kernel/debug-monitors.c | ||
62 | +++ b/arch/arm64/kernel/debug-monitors.c | ||
63 | @@ -186,20 +186,21 @@ static void clear_regs_spsr_ss(struct pt_regs *regs) | ||
64 | |||
65 | /* EL1 Single Step Handler hooks */ | ||
66 | static LIST_HEAD(step_hook); | ||
67 | -static DEFINE_RWLOCK(step_hook_lock); | ||
68 | +static DEFINE_SPINLOCK(step_hook_lock); | ||
69 | |||
70 | void register_step_hook(struct step_hook *hook) | ||
71 | { | ||
72 | - write_lock(&step_hook_lock); | ||
73 | - list_add(&hook->node, &step_hook); | ||
74 | - write_unlock(&step_hook_lock); | ||
75 | + spin_lock(&step_hook_lock); | ||
76 | + list_add_rcu(&hook->node, &step_hook); | ||
77 | + spin_unlock(&step_hook_lock); | ||
78 | } | ||
79 | |||
80 | void unregister_step_hook(struct step_hook *hook) | ||
81 | { | ||
82 | - write_lock(&step_hook_lock); | ||
83 | - list_del(&hook->node); | ||
84 | - write_unlock(&step_hook_lock); | ||
85 | + spin_lock(&step_hook_lock); | ||
86 | + list_del_rcu(&hook->node); | ||
87 | + spin_unlock(&step_hook_lock); | ||
88 | + synchronize_rcu(); | ||
89 | } | ||
90 | |||
91 | /* | ||
92 | @@ -213,15 +214,15 @@ static int call_step_hook(struct pt_regs *regs, unsigned int esr) | ||
93 | struct step_hook *hook; | ||
94 | int retval = DBG_HOOK_ERROR; | ||
95 | |||
96 | - read_lock(&step_hook_lock); | ||
97 | + rcu_read_lock(); | ||
98 | |||
99 | - list_for_each_entry(hook, &step_hook, node) { | ||
100 | + list_for_each_entry_rcu(hook, &step_hook, node) { | ||
101 | retval = hook->fn(regs, esr); | ||
102 | if (retval == DBG_HOOK_HANDLED) | ||
103 | break; | ||
104 | } | ||
105 | |||
106 | - read_unlock(&step_hook_lock); | ||
107 | + rcu_read_unlock(); | ||
108 | |||
109 | return retval; | ||
110 | } | ||
111 | diff --git a/arch/mips/alchemy/devboards/db1000.c b/arch/mips/alchemy/devboards/db1000.c | ||
112 | index bdeed9d13c6f..433c4b9a9f0a 100644 | ||
113 | --- a/arch/mips/alchemy/devboards/db1000.c | ||
114 | +++ b/arch/mips/alchemy/devboards/db1000.c | ||
115 | @@ -503,15 +503,15 @@ int __init db1000_dev_setup(void) | ||
116 | if (board == BCSR_WHOAMI_DB1500) { | ||
117 | c0 = AU1500_GPIO2_INT; | ||
118 | c1 = AU1500_GPIO5_INT; | ||
119 | - d0 = AU1500_GPIO0_INT; | ||
120 | - d1 = AU1500_GPIO3_INT; | ||
121 | + d0 = 0; /* GPIO number, NOT irq! */ | ||
122 | + d1 = 3; /* GPIO number, NOT irq! */ | ||
123 | s0 = AU1500_GPIO1_INT; | ||
124 | s1 = AU1500_GPIO4_INT; | ||
125 | } else if (board == BCSR_WHOAMI_DB1100) { | ||
126 | c0 = AU1100_GPIO2_INT; | ||
127 | c1 = AU1100_GPIO5_INT; | ||
128 | - d0 = AU1100_GPIO0_INT; | ||
129 | - d1 = AU1100_GPIO3_INT; | ||
130 | + d0 = 0; /* GPIO number, NOT irq! */ | ||
131 | + d1 = 3; /* GPIO number, NOT irq! */ | ||
132 | s0 = AU1100_GPIO1_INT; | ||
133 | s1 = AU1100_GPIO4_INT; | ||
134 | |||
135 | @@ -545,15 +545,15 @@ int __init db1000_dev_setup(void) | ||
136 | } else if (board == BCSR_WHOAMI_DB1000) { | ||
137 | c0 = AU1000_GPIO2_INT; | ||
138 | c1 = AU1000_GPIO5_INT; | ||
139 | - d0 = AU1000_GPIO0_INT; | ||
140 | - d1 = AU1000_GPIO3_INT; | ||
141 | + d0 = 0; /* GPIO number, NOT irq! */ | ||
142 | + d1 = 3; /* GPIO number, NOT irq! */ | ||
143 | s0 = AU1000_GPIO1_INT; | ||
144 | s1 = AU1000_GPIO4_INT; | ||
145 | platform_add_devices(db1000_devs, ARRAY_SIZE(db1000_devs)); | ||
146 | } else if ((board == BCSR_WHOAMI_PB1500) || | ||
147 | (board == BCSR_WHOAMI_PB1500R2)) { | ||
148 | c0 = AU1500_GPIO203_INT; | ||
149 | - d0 = AU1500_GPIO201_INT; | ||
150 | + d0 = 1; /* GPIO number, NOT irq! */ | ||
151 | s0 = AU1500_GPIO202_INT; | ||
152 | twosocks = 0; | ||
153 | flashsize = 64; | ||
154 | @@ -566,7 +566,7 @@ int __init db1000_dev_setup(void) | ||
155 | */ | ||
156 | } else if (board == BCSR_WHOAMI_PB1100) { | ||
157 | c0 = AU1100_GPIO11_INT; | ||
158 | - d0 = AU1100_GPIO9_INT; | ||
159 | + d0 = 9; /* GPIO number, NOT irq! */ | ||
160 | s0 = AU1100_GPIO10_INT; | ||
161 | twosocks = 0; | ||
162 | flashsize = 64; | ||
163 | @@ -583,7 +583,6 @@ int __init db1000_dev_setup(void) | ||
164 | } else | ||
165 | return 0; /* unknown board, no further dev setup to do */ | ||
166 | |||
167 | - irq_set_irq_type(d0, IRQ_TYPE_EDGE_BOTH); | ||
168 | irq_set_irq_type(c0, IRQ_TYPE_LEVEL_LOW); | ||
169 | irq_set_irq_type(s0, IRQ_TYPE_LEVEL_LOW); | ||
170 | |||
171 | @@ -597,7 +596,6 @@ int __init db1000_dev_setup(void) | ||
172 | c0, d0, /*s0*/0, 0, 0); | ||
173 | |||
174 | if (twosocks) { | ||
175 | - irq_set_irq_type(d1, IRQ_TYPE_EDGE_BOTH); | ||
176 | irq_set_irq_type(c1, IRQ_TYPE_LEVEL_LOW); | ||
177 | irq_set_irq_type(s1, IRQ_TYPE_LEVEL_LOW); | ||
178 | |||
179 | diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c | ||
180 | index 5740bcfdfc7f..6c37b9326f41 100644 | ||
181 | --- a/arch/mips/alchemy/devboards/db1550.c | ||
182 | +++ b/arch/mips/alchemy/devboards/db1550.c | ||
183 | @@ -514,7 +514,7 @@ static void __init db1550_devices(void) | ||
184 | AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1, | ||
185 | AU1000_PCMCIA_IO_PHYS_ADDR, | ||
186 | AU1000_PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1, | ||
187 | - AU1550_GPIO3_INT, AU1550_GPIO0_INT, | ||
188 | + AU1550_GPIO3_INT, 0, | ||
189 | /*AU1550_GPIO21_INT*/0, 0, 0); | ||
190 | |||
191 | db1x_register_pcmcia_socket( | ||
192 | @@ -524,7 +524,7 @@ static void __init db1550_devices(void) | ||
193 | AU1000_PCMCIA_MEM_PHYS_ADDR + 0x004400000 - 1, | ||
194 | AU1000_PCMCIA_IO_PHYS_ADDR + 0x004000000, | ||
195 | AU1000_PCMCIA_IO_PHYS_ADDR + 0x004010000 - 1, | ||
196 | - AU1550_GPIO5_INT, AU1550_GPIO1_INT, | ||
197 | + AU1550_GPIO5_INT, 1, | ||
198 | /*AU1550_GPIO22_INT*/0, 0, 1); | ||
199 | |||
200 | platform_device_register(&db1550_nand_dev); | ||
201 | diff --git a/arch/mips/kernel/unaligned.c b/arch/mips/kernel/unaligned.c | ||
202 | index 490cea569d57..5c62065cbf22 100644 | ||
203 | --- a/arch/mips/kernel/unaligned.c | ||
204 | +++ b/arch/mips/kernel/unaligned.c | ||
205 | @@ -885,7 +885,7 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
206 | { | ||
207 | union mips_instruction insn; | ||
208 | unsigned long value; | ||
209 | - unsigned int res; | ||
210 | + unsigned int res, preempted; | ||
211 | unsigned long origpc; | ||
212 | unsigned long orig31; | ||
213 | void __user *fault_addr = NULL; | ||
214 | @@ -1226,27 +1226,36 @@ static void emulate_load_store_insn(struct pt_regs *regs, | ||
215 | if (!access_ok(VERIFY_READ, addr, sizeof(*fpr))) | ||
216 | goto sigbus; | ||
217 | |||
218 | - /* | ||
219 | - * Disable preemption to avoid a race between copying | ||
220 | - * state from userland, migrating to another CPU and | ||
221 | - * updating the hardware vector register below. | ||
222 | - */ | ||
223 | - preempt_disable(); | ||
224 | - | ||
225 | - res = __copy_from_user_inatomic(fpr, addr, | ||
226 | - sizeof(*fpr)); | ||
227 | - if (res) | ||
228 | - goto fault; | ||
229 | - | ||
230 | - /* | ||
231 | - * Update the hardware register if it is in use by the | ||
232 | - * task in this quantum, in order to avoid having to | ||
233 | - * save & restore the whole vector context. | ||
234 | - */ | ||
235 | - if (test_thread_flag(TIF_USEDMSA)) | ||
236 | - write_msa_wr(wd, fpr, df); | ||
237 | + do { | ||
238 | + /* | ||
239 | + * If we have live MSA context keep track of | ||
240 | + * whether we get preempted in order to avoid | ||
241 | + * the register context we load being clobbered | ||
242 | + * by the live context as it's saved during | ||
243 | + * preemption. If we don't have live context | ||
244 | + * then it can't be saved to clobber the value | ||
245 | + * we load. | ||
246 | + */ | ||
247 | + preempted = test_thread_flag(TIF_USEDMSA); | ||
248 | + | ||
249 | + res = __copy_from_user_inatomic(fpr, addr, | ||
250 | + sizeof(*fpr)); | ||
251 | + if (res) | ||
252 | + goto fault; | ||
253 | |||
254 | - preempt_enable(); | ||
255 | + /* | ||
256 | + * Update the hardware register if it is in use | ||
257 | + * by the task in this quantum, in order to | ||
258 | + * avoid having to save & restore the whole | ||
259 | + * vector context. | ||
260 | + */ | ||
261 | + preempt_disable(); | ||
262 | + if (test_thread_flag(TIF_USEDMSA)) { | ||
263 | + write_msa_wr(wd, fpr, df); | ||
264 | + preempted = 0; | ||
265 | + } | ||
266 | + preempt_enable(); | ||
267 | + } while (preempted); | ||
268 | break; | ||
269 | |||
270 | case msa_st_op: | ||
271 | diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h | ||
272 | index 0abdd4c607ed..1960b87c1c8b 100644 | ||
273 | --- a/arch/parisc/include/asm/uaccess.h | ||
274 | +++ b/arch/parisc/include/asm/uaccess.h | ||
275 | @@ -76,6 +76,7 @@ struct exception_table_entry { | ||
276 | */ | ||
277 | struct exception_data { | ||
278 | unsigned long fault_ip; | ||
279 | + unsigned long fault_gp; | ||
280 | unsigned long fault_space; | ||
281 | unsigned long fault_addr; | ||
282 | }; | ||
283 | diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c | ||
284 | index d2f62570a7b1..78d30d2ea2d8 100644 | ||
285 | --- a/arch/parisc/kernel/asm-offsets.c | ||
286 | +++ b/arch/parisc/kernel/asm-offsets.c | ||
287 | @@ -299,6 +299,7 @@ int main(void) | ||
288 | #endif | ||
289 | BLANK(); | ||
290 | DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip)); | ||
291 | + DEFINE(EXCDATA_GP, offsetof(struct exception_data, fault_gp)); | ||
292 | DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space)); | ||
293 | DEFINE(EXCDATA_ADDR, offsetof(struct exception_data, fault_addr)); | ||
294 | BLANK(); | ||
295 | diff --git a/arch/parisc/kernel/parisc_ksyms.c b/arch/parisc/kernel/parisc_ksyms.c | ||
296 | index 568b2c61ea02..3cad8aadc69e 100644 | ||
297 | --- a/arch/parisc/kernel/parisc_ksyms.c | ||
298 | +++ b/arch/parisc/kernel/parisc_ksyms.c | ||
299 | @@ -47,11 +47,11 @@ EXPORT_SYMBOL(__cmpxchg_u64); | ||
300 | EXPORT_SYMBOL(lclear_user); | ||
301 | EXPORT_SYMBOL(lstrnlen_user); | ||
302 | |||
303 | -/* Global fixups */ | ||
304 | -extern void fixup_get_user_skip_1(void); | ||
305 | -extern void fixup_get_user_skip_2(void); | ||
306 | -extern void fixup_put_user_skip_1(void); | ||
307 | -extern void fixup_put_user_skip_2(void); | ||
308 | +/* Global fixups - defined as int to avoid creation of function pointers */ | ||
309 | +extern int fixup_get_user_skip_1; | ||
310 | +extern int fixup_get_user_skip_2; | ||
311 | +extern int fixup_put_user_skip_1; | ||
312 | +extern int fixup_put_user_skip_2; | ||
313 | EXPORT_SYMBOL(fixup_get_user_skip_1); | ||
314 | EXPORT_SYMBOL(fixup_get_user_skip_2); | ||
315 | EXPORT_SYMBOL(fixup_put_user_skip_1); | ||
316 | diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c | ||
317 | index 553b09855cfd..77e2262c97f6 100644 | ||
318 | --- a/arch/parisc/kernel/traps.c | ||
319 | +++ b/arch/parisc/kernel/traps.c | ||
320 | @@ -798,6 +798,9 @@ void notrace handle_interruption(int code, struct pt_regs *regs) | ||
321 | |||
322 | if (fault_space == 0 && !faulthandler_disabled()) | ||
323 | { | ||
324 | + /* Clean up and return if in exception table. */ | ||
325 | + if (fixup_exception(regs)) | ||
326 | + return; | ||
327 | pdc_chassis_send_status(PDC_CHASSIS_DIRECT_PANIC); | ||
328 | parisc_terminate("Kernel Fault", regs, code, fault_address); | ||
329 | } | ||
330 | diff --git a/arch/parisc/lib/fixup.S b/arch/parisc/lib/fixup.S | ||
331 | index 536ef66bb94b..1052b747e011 100644 | ||
332 | --- a/arch/parisc/lib/fixup.S | ||
333 | +++ b/arch/parisc/lib/fixup.S | ||
334 | @@ -26,6 +26,7 @@ | ||
335 | |||
336 | #ifdef CONFIG_SMP | ||
337 | .macro get_fault_ip t1 t2 | ||
338 | + loadgp | ||
339 | addil LT%__per_cpu_offset,%r27 | ||
340 | LDREG RT%__per_cpu_offset(%r1),\t1 | ||
341 | /* t2 = smp_processor_id() */ | ||
342 | @@ -40,14 +41,19 @@ | ||
343 | LDREG RT%exception_data(%r1),\t1 | ||
344 | /* t1 = this_cpu_ptr(&exception_data) */ | ||
345 | add,l \t1,\t2,\t1 | ||
346 | + /* %r27 = t1->fault_gp - restore gp */ | ||
347 | + LDREG EXCDATA_GP(\t1), %r27 | ||
348 | /* t1 = t1->fault_ip */ | ||
349 | LDREG EXCDATA_IP(\t1), \t1 | ||
350 | .endm | ||
351 | #else | ||
352 | .macro get_fault_ip t1 t2 | ||
353 | + loadgp | ||
354 | /* t1 = this_cpu_ptr(&exception_data) */ | ||
355 | addil LT%exception_data,%r27 | ||
356 | LDREG RT%exception_data(%r1),\t2 | ||
357 | + /* %r27 = t2->fault_gp - restore gp */ | ||
358 | + LDREG EXCDATA_GP(\t2), %r27 | ||
359 | /* t1 = t2->fault_ip */ | ||
360 | LDREG EXCDATA_IP(\t2), \t1 | ||
361 | .endm | ||
362 | diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c | ||
363 | index a762864ec92e..f9064449908a 100644 | ||
364 | --- a/arch/parisc/mm/fault.c | ||
365 | +++ b/arch/parisc/mm/fault.c | ||
366 | @@ -151,6 +151,7 @@ int fixup_exception(struct pt_regs *regs) | ||
367 | struct exception_data *d; | ||
368 | d = this_cpu_ptr(&exception_data); | ||
369 | d->fault_ip = regs->iaoq[0]; | ||
370 | + d->fault_gp = regs->gr[27]; | ||
371 | d->fault_space = regs->isr; | ||
372 | d->fault_addr = regs->ior; | ||
373 | |||
374 | diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c | ||
375 | index 9833fee493ec..807f1594701d 100644 | ||
376 | --- a/arch/powerpc/mm/hugetlbpage.c | ||
377 | +++ b/arch/powerpc/mm/hugetlbpage.c | ||
378 | @@ -486,13 +486,13 @@ static void hugepd_free(struct mmu_gather *tlb, void *hugepte) | ||
379 | { | ||
380 | struct hugepd_freelist **batchp; | ||
381 | |||
382 | - batchp = this_cpu_ptr(&hugepd_freelist_cur); | ||
383 | + batchp = &get_cpu_var(hugepd_freelist_cur); | ||
384 | |||
385 | if (atomic_read(&tlb->mm->mm_users) < 2 || | ||
386 | cpumask_equal(mm_cpumask(tlb->mm), | ||
387 | cpumask_of(smp_processor_id()))) { | ||
388 | kmem_cache_free(hugepte_cache, hugepte); | ||
389 | - put_cpu_var(hugepd_freelist_cur); | ||
390 | + put_cpu_var(hugepd_freelist_cur); | ||
391 | return; | ||
392 | } | ||
393 | |||
394 | diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h | ||
395 | index 30cfd64295a0..9d2abb2a41d2 100644 | ||
396 | --- a/arch/x86/include/asm/kvm_host.h | ||
397 | +++ b/arch/x86/include/asm/kvm_host.h | ||
398 | @@ -41,7 +41,7 @@ | ||
399 | |||
400 | #define KVM_PIO_PAGE_OFFSET 1 | ||
401 | #define KVM_COALESCED_MMIO_PAGE_OFFSET 2 | ||
402 | -#define KVM_HALT_POLL_NS_DEFAULT 500000 | ||
403 | +#define KVM_HALT_POLL_NS_DEFAULT 400000 | ||
404 | |||
405 | #define KVM_IRQCHIP_NUM_PINS KVM_IOAPIC_NUM_PINS | ||
406 | |||
407 | diff --git a/arch/x86/include/asm/pci_x86.h b/arch/x86/include/asm/pci_x86.h | ||
408 | index fa1195dae425..164e3f8d3c3d 100644 | ||
409 | --- a/arch/x86/include/asm/pci_x86.h | ||
410 | +++ b/arch/x86/include/asm/pci_x86.h | ||
411 | @@ -93,6 +93,8 @@ extern raw_spinlock_t pci_config_lock; | ||
412 | extern int (*pcibios_enable_irq)(struct pci_dev *dev); | ||
413 | extern void (*pcibios_disable_irq)(struct pci_dev *dev); | ||
414 | |||
415 | +extern bool mp_should_keep_irq(struct device *dev); | ||
416 | + | ||
417 | struct pci_raw_ops { | ||
418 | int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn, | ||
419 | int reg, int len, u32 *val); | ||
420 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c | ||
421 | index 8bfc5fc6a39b..7eb4ebd3ebea 100644 | ||
422 | --- a/arch/x86/kvm/x86.c | ||
423 | +++ b/arch/x86/kvm/x86.c | ||
424 | @@ -6024,12 +6024,10 @@ static int inject_pending_event(struct kvm_vcpu *vcpu, bool req_int_win) | ||
425 | } | ||
426 | |||
427 | /* try to inject new event if pending */ | ||
428 | - if (vcpu->arch.nmi_pending) { | ||
429 | - if (kvm_x86_ops->nmi_allowed(vcpu)) { | ||
430 | - --vcpu->arch.nmi_pending; | ||
431 | - vcpu->arch.nmi_injected = true; | ||
432 | - kvm_x86_ops->set_nmi(vcpu); | ||
433 | - } | ||
434 | + if (vcpu->arch.nmi_pending && kvm_x86_ops->nmi_allowed(vcpu)) { | ||
435 | + --vcpu->arch.nmi_pending; | ||
436 | + vcpu->arch.nmi_injected = true; | ||
437 | + kvm_x86_ops->set_nmi(vcpu); | ||
438 | } else if (kvm_cpu_has_injectable_intr(vcpu)) { | ||
439 | /* | ||
440 | * Because interrupts can be injected asynchronously, we are | ||
441 | @@ -6474,10 +6472,12 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) | ||
442 | if (inject_pending_event(vcpu, req_int_win) != 0) | ||
443 | req_immediate_exit = true; | ||
444 | /* enable NMI/IRQ window open exits if needed */ | ||
445 | - else if (vcpu->arch.nmi_pending) | ||
446 | - kvm_x86_ops->enable_nmi_window(vcpu); | ||
447 | - else if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) | ||
448 | - kvm_x86_ops->enable_irq_window(vcpu); | ||
449 | + else { | ||
450 | + if (vcpu->arch.nmi_pending) | ||
451 | + kvm_x86_ops->enable_nmi_window(vcpu); | ||
452 | + if (kvm_cpu_has_injectable_intr(vcpu) || req_int_win) | ||
453 | + kvm_x86_ops->enable_irq_window(vcpu); | ||
454 | + } | ||
455 | |||
456 | if (kvm_lapic_enabled(vcpu)) { | ||
457 | update_cr8_intercept(vcpu); | ||
458 | diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c | ||
459 | index eccd4d99e6a4..8fd6f44aee83 100644 | ||
460 | --- a/arch/x86/pci/common.c | ||
461 | +++ b/arch/x86/pci/common.c | ||
462 | @@ -673,28 +673,22 @@ int pcibios_add_device(struct pci_dev *dev) | ||
463 | return 0; | ||
464 | } | ||
465 | |||
466 | -int pcibios_alloc_irq(struct pci_dev *dev) | ||
467 | +int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
468 | { | ||
469 | - /* | ||
470 | - * If the PCI device was already claimed by core code and has | ||
471 | - * MSI enabled, probing of the pcibios IRQ will overwrite | ||
472 | - * dev->irq. So bail out if MSI is already enabled. | ||
473 | - */ | ||
474 | - if (pci_dev_msi_enabled(dev)) | ||
475 | - return -EBUSY; | ||
476 | + int err; | ||
477 | |||
478 | - return pcibios_enable_irq(dev); | ||
479 | -} | ||
480 | + if ((err = pci_enable_resources(dev, mask)) < 0) | ||
481 | + return err; | ||
482 | |||
483 | -void pcibios_free_irq(struct pci_dev *dev) | ||
484 | -{ | ||
485 | - if (pcibios_disable_irq) | ||
486 | - pcibios_disable_irq(dev); | ||
487 | + if (!pci_dev_msi_enabled(dev)) | ||
488 | + return pcibios_enable_irq(dev); | ||
489 | + return 0; | ||
490 | } | ||
491 | |||
492 | -int pcibios_enable_device(struct pci_dev *dev, int mask) | ||
493 | +void pcibios_disable_device (struct pci_dev *dev) | ||
494 | { | ||
495 | - return pci_enable_resources(dev, mask); | ||
496 | + if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq) | ||
497 | + pcibios_disable_irq(dev); | ||
498 | } | ||
499 | |||
500 | int pci_ext_cfg_avail(void) | ||
501 | diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c | ||
502 | index 0d24e7c10145..8b93e634af84 100644 | ||
503 | --- a/arch/x86/pci/intel_mid_pci.c | ||
504 | +++ b/arch/x86/pci/intel_mid_pci.c | ||
505 | @@ -215,7 +215,7 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) | ||
506 | int polarity; | ||
507 | int ret; | ||
508 | |||
509 | - if (pci_has_managed_irq(dev)) | ||
510 | + if (dev->irq_managed && dev->irq > 0) | ||
511 | return 0; | ||
512 | |||
513 | switch (intel_mid_identify_cpu()) { | ||
514 | @@ -256,13 +256,10 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev) | ||
515 | |||
516 | static void intel_mid_pci_irq_disable(struct pci_dev *dev) | ||
517 | { | ||
518 | - if (pci_has_managed_irq(dev)) { | ||
519 | + if (!mp_should_keep_irq(&dev->dev) && dev->irq_managed && | ||
520 | + dev->irq > 0) { | ||
521 | mp_unmap_irq(dev->irq); | ||
522 | dev->irq_managed = 0; | ||
523 | - /* | ||
524 | - * Don't reset dev->irq here, otherwise | ||
525 | - * intel_mid_pci_irq_enable() will fail on next call. | ||
526 | - */ | ||
527 | } | ||
528 | } | ||
529 | |||
530 | diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c | ||
531 | index 32e70343e6fd..9bd115484745 100644 | ||
532 | --- a/arch/x86/pci/irq.c | ||
533 | +++ b/arch/x86/pci/irq.c | ||
534 | @@ -1202,7 +1202,7 @@ static int pirq_enable_irq(struct pci_dev *dev) | ||
535 | struct pci_dev *temp_dev; | ||
536 | int irq; | ||
537 | |||
538 | - if (pci_has_managed_irq(dev)) | ||
539 | + if (dev->irq_managed && dev->irq > 0) | ||
540 | return 0; | ||
541 | |||
542 | irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, | ||
543 | @@ -1230,7 +1230,8 @@ static int pirq_enable_irq(struct pci_dev *dev) | ||
544 | } | ||
545 | dev = temp_dev; | ||
546 | if (irq >= 0) { | ||
547 | - pci_set_managed_irq(dev, irq); | ||
548 | + dev->irq_managed = 1; | ||
549 | + dev->irq = irq; | ||
550 | dev_info(&dev->dev, "PCI->APIC IRQ transform: " | ||
551 | "INT %c -> IRQ %d\n", 'A' + pin - 1, irq); | ||
552 | return 0; | ||
553 | @@ -1256,10 +1257,24 @@ static int pirq_enable_irq(struct pci_dev *dev) | ||
554 | return 0; | ||
555 | } | ||
556 | |||
557 | +bool mp_should_keep_irq(struct device *dev) | ||
558 | +{ | ||
559 | + if (dev->power.is_prepared) | ||
560 | + return true; | ||
561 | +#ifdef CONFIG_PM | ||
562 | + if (dev->power.runtime_status == RPM_SUSPENDING) | ||
563 | + return true; | ||
564 | +#endif | ||
565 | + | ||
566 | + return false; | ||
567 | +} | ||
568 | + | ||
569 | static void pirq_disable_irq(struct pci_dev *dev) | ||
570 | { | ||
571 | - if (io_apic_assign_pci_irqs && pci_has_managed_irq(dev)) { | ||
572 | + if (io_apic_assign_pci_irqs && !mp_should_keep_irq(&dev->dev) && | ||
573 | + dev->irq_managed && dev->irq) { | ||
574 | mp_unmap_irq(dev->irq); | ||
575 | - pci_reset_managed_irq(dev); | ||
576 | + dev->irq = 0; | ||
577 | + dev->irq_managed = 0; | ||
578 | } | ||
579 | } | ||
580 | diff --git a/crypto/asymmetric_keys/pkcs7_trust.c b/crypto/asymmetric_keys/pkcs7_trust.c | ||
581 | index 90d6d47965b0..ecdb5a2ce085 100644 | ||
582 | --- a/crypto/asymmetric_keys/pkcs7_trust.c | ||
583 | +++ b/crypto/asymmetric_keys/pkcs7_trust.c | ||
584 | @@ -178,6 +178,8 @@ int pkcs7_validate_trust(struct pkcs7_message *pkcs7, | ||
585 | int cached_ret = -ENOKEY; | ||
586 | int ret; | ||
587 | |||
588 | + *_trusted = false; | ||
589 | + | ||
590 | for (p = pkcs7->certs; p; p = p->next) | ||
591 | p->seen = false; | ||
592 | |||
593 | diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c | ||
594 | index c9336751e5e3..8a10a7ae6a8a 100644 | ||
595 | --- a/drivers/acpi/pci_irq.c | ||
596 | +++ b/drivers/acpi/pci_irq.c | ||
597 | @@ -409,7 +409,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | ||
598 | return 0; | ||
599 | } | ||
600 | |||
601 | - if (pci_has_managed_irq(dev)) | ||
602 | + if (dev->irq_managed && dev->irq > 0) | ||
603 | return 0; | ||
604 | |||
605 | entry = acpi_pci_irq_lookup(dev, pin); | ||
606 | @@ -454,7 +454,8 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | ||
607 | kfree(entry); | ||
608 | return rc; | ||
609 | } | ||
610 | - pci_set_managed_irq(dev, rc); | ||
611 | + dev->irq = rc; | ||
612 | + dev->irq_managed = 1; | ||
613 | |||
614 | if (link) | ||
615 | snprintf(link_desc, sizeof(link_desc), " -> Link[%s]", link); | ||
616 | @@ -477,9 +478,17 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | ||
617 | u8 pin; | ||
618 | |||
619 | pin = dev->pin; | ||
620 | - if (!pin || !pci_has_managed_irq(dev)) | ||
621 | + if (!pin || !dev->irq_managed || dev->irq <= 0) | ||
622 | return; | ||
623 | |||
624 | + /* Keep IOAPIC pin configuration when suspending */ | ||
625 | + if (dev->dev.power.is_prepared) | ||
626 | + return; | ||
627 | +#ifdef CONFIG_PM | ||
628 | + if (dev->dev.power.runtime_status == RPM_SUSPENDING) | ||
629 | + return; | ||
630 | +#endif | ||
631 | + | ||
632 | entry = acpi_pci_irq_lookup(dev, pin); | ||
633 | if (!entry) | ||
634 | return; | ||
635 | @@ -499,6 +508,6 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | ||
636 | dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); | ||
637 | if (gsi >= 0) { | ||
638 | acpi_unregister_gsi(gsi); | ||
639 | - pci_reset_managed_irq(dev); | ||
640 | + dev->irq_managed = 0; | ||
641 | } | ||
642 | } | ||
643 | diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c | ||
644 | index 81ea69fee7ca..fbdddd6f94b8 100644 | ||
645 | --- a/drivers/block/rbd.c | ||
646 | +++ b/drivers/block/rbd.c | ||
647 | @@ -1955,7 +1955,7 @@ static struct ceph_osd_request *rbd_osd_req_create( | ||
648 | |||
649 | osdc = &rbd_dev->rbd_client->client->osdc; | ||
650 | osd_req = ceph_osdc_alloc_request(osdc, snapc, num_ops, false, | ||
651 | - GFP_ATOMIC); | ||
652 | + GFP_NOIO); | ||
653 | if (!osd_req) | ||
654 | return NULL; /* ENOMEM */ | ||
655 | |||
656 | @@ -2004,7 +2004,7 @@ rbd_osd_req_create_copyup(struct rbd_obj_request *obj_request) | ||
657 | rbd_dev = img_request->rbd_dev; | ||
658 | osdc = &rbd_dev->rbd_client->client->osdc; | ||
659 | osd_req = ceph_osdc_alloc_request(osdc, snapc, num_osd_ops, | ||
660 | - false, GFP_ATOMIC); | ||
661 | + false, GFP_NOIO); | ||
662 | if (!osd_req) | ||
663 | return NULL; /* ENOMEM */ | ||
664 | |||
665 | @@ -2506,7 +2506,7 @@ static int rbd_img_request_fill(struct rbd_img_request *img_request, | ||
666 | bio_chain_clone_range(&bio_list, | ||
667 | &bio_offset, | ||
668 | clone_size, | ||
669 | - GFP_ATOMIC); | ||
670 | + GFP_NOIO); | ||
671 | if (!obj_request->bio_list) | ||
672 | goto out_unwind; | ||
673 | } else if (type == OBJ_REQUEST_PAGES) { | ||
674 | diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | ||
675 | index 272110cc18c2..ea87033bfaf6 100644 | ||
676 | --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | ||
677 | +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c | ||
678 | @@ -898,14 +898,6 @@ static int gmc_v7_0_early_init(void *handle) | ||
679 | gmc_v7_0_set_gart_funcs(adev); | ||
680 | gmc_v7_0_set_irq_funcs(adev); | ||
681 | |||
682 | - if (adev->flags & AMD_IS_APU) { | ||
683 | - adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; | ||
684 | - } else { | ||
685 | - u32 tmp = RREG32(mmMC_SEQ_MISC0); | ||
686 | - tmp &= MC_SEQ_MISC0__MT__MASK; | ||
687 | - adev->mc.vram_type = gmc_v7_0_convert_vram_type(tmp); | ||
688 | - } | ||
689 | - | ||
690 | return 0; | ||
691 | } | ||
692 | |||
693 | @@ -926,6 +918,14 @@ static int gmc_v7_0_sw_init(void *handle) | ||
694 | if (r) | ||
695 | return r; | ||
696 | |||
697 | + if (adev->flags & AMD_IS_APU) { | ||
698 | + adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; | ||
699 | + } else { | ||
700 | + u32 tmp = RREG32(mmMC_SEQ_MISC0); | ||
701 | + tmp &= MC_SEQ_MISC0__MT__MASK; | ||
702 | + adev->mc.vram_type = gmc_v7_0_convert_vram_type(tmp); | ||
703 | + } | ||
704 | + | ||
705 | r = amdgpu_irq_add_id(adev, 146, &adev->mc.vm_fault); | ||
706 | if (r) | ||
707 | return r; | ||
708 | diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | ||
709 | index ba4ad00ba8b4..08423089fb84 100644 | ||
710 | --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | ||
711 | +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c | ||
712 | @@ -852,14 +852,6 @@ static int gmc_v8_0_early_init(void *handle) | ||
713 | gmc_v8_0_set_gart_funcs(adev); | ||
714 | gmc_v8_0_set_irq_funcs(adev); | ||
715 | |||
716 | - if (adev->flags & AMD_IS_APU) { | ||
717 | - adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; | ||
718 | - } else { | ||
719 | - u32 tmp = RREG32(mmMC_SEQ_MISC0); | ||
720 | - tmp &= MC_SEQ_MISC0__MT__MASK; | ||
721 | - adev->mc.vram_type = gmc_v8_0_convert_vram_type(tmp); | ||
722 | - } | ||
723 | - | ||
724 | return 0; | ||
725 | } | ||
726 | |||
727 | @@ -870,6 +862,8 @@ static int gmc_v8_0_late_init(void *handle) | ||
728 | return amdgpu_irq_get(adev, &adev->mc.vm_fault, 0); | ||
729 | } | ||
730 | |||
731 | +#define mmMC_SEQ_MISC0_FIJI 0xA71 | ||
732 | + | ||
733 | static int gmc_v8_0_sw_init(void *handle) | ||
734 | { | ||
735 | int r; | ||
736 | @@ -880,6 +874,19 @@ static int gmc_v8_0_sw_init(void *handle) | ||
737 | if (r) | ||
738 | return r; | ||
739 | |||
740 | + if (adev->flags & AMD_IS_APU) { | ||
741 | + adev->mc.vram_type = AMDGPU_VRAM_TYPE_UNKNOWN; | ||
742 | + } else { | ||
743 | + u32 tmp; | ||
744 | + | ||
745 | + if (adev->asic_type == CHIP_FIJI) | ||
746 | + tmp = RREG32(mmMC_SEQ_MISC0_FIJI); | ||
747 | + else | ||
748 | + tmp = RREG32(mmMC_SEQ_MISC0); | ||
749 | + tmp &= MC_SEQ_MISC0__MT__MASK; | ||
750 | + adev->mc.vram_type = gmc_v8_0_convert_vram_type(tmp); | ||
751 | + } | ||
752 | + | ||
753 | r = amdgpu_irq_add_id(adev, 146, &adev->mc.vm_fault); | ||
754 | if (r) | ||
755 | return r; | ||
756 | diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c | ||
757 | index 9535c5b60387..7e5a97204051 100644 | ||
758 | --- a/drivers/gpu/drm/drm_dp_helper.c | ||
759 | +++ b/drivers/gpu/drm/drm_dp_helper.c | ||
760 | @@ -178,7 +178,7 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | ||
761 | { | ||
762 | struct drm_dp_aux_msg msg; | ||
763 | unsigned int retry; | ||
764 | - int err; | ||
765 | + int err = 0; | ||
766 | |||
767 | memset(&msg, 0, sizeof(msg)); | ||
768 | msg.address = offset; | ||
769 | @@ -186,6 +186,8 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | ||
770 | msg.buffer = buffer; | ||
771 | msg.size = size; | ||
772 | |||
773 | + mutex_lock(&aux->hw_mutex); | ||
774 | + | ||
775 | /* | ||
776 | * The specification doesn't give any recommendation on how often to | ||
777 | * retry native transactions. We used to retry 7 times like for | ||
778 | @@ -194,25 +196,24 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | ||
779 | */ | ||
780 | for (retry = 0; retry < 32; retry++) { | ||
781 | |||
782 | - mutex_lock(&aux->hw_mutex); | ||
783 | err = aux->transfer(aux, &msg); | ||
784 | - mutex_unlock(&aux->hw_mutex); | ||
785 | if (err < 0) { | ||
786 | if (err == -EBUSY) | ||
787 | continue; | ||
788 | |||
789 | - return err; | ||
790 | + goto unlock; | ||
791 | } | ||
792 | |||
793 | |||
794 | switch (msg.reply & DP_AUX_NATIVE_REPLY_MASK) { | ||
795 | case DP_AUX_NATIVE_REPLY_ACK: | ||
796 | if (err < size) | ||
797 | - return -EPROTO; | ||
798 | - return err; | ||
799 | + err = -EPROTO; | ||
800 | + goto unlock; | ||
801 | |||
802 | case DP_AUX_NATIVE_REPLY_NACK: | ||
803 | - return -EIO; | ||
804 | + err = -EIO; | ||
805 | + goto unlock; | ||
806 | |||
807 | case DP_AUX_NATIVE_REPLY_DEFER: | ||
808 | usleep_range(AUX_RETRY_INTERVAL, AUX_RETRY_INTERVAL + 100); | ||
809 | @@ -221,7 +222,11 @@ static int drm_dp_dpcd_access(struct drm_dp_aux *aux, u8 request, | ||
810 | } | ||
811 | |||
812 | DRM_DEBUG_KMS("too many retries, giving up\n"); | ||
813 | - return -EIO; | ||
814 | + err = -EIO; | ||
815 | + | ||
816 | +unlock: | ||
817 | + mutex_unlock(&aux->hw_mutex); | ||
818 | + return err; | ||
819 | } | ||
820 | |||
821 | /** | ||
822 | @@ -543,9 +548,7 @@ static int drm_dp_i2c_do_msg(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | ||
823 | int max_retries = max(7, drm_dp_i2c_retry_count(msg, dp_aux_i2c_speed_khz)); | ||
824 | |||
825 | for (retry = 0, defer_i2c = 0; retry < (max_retries + defer_i2c); retry++) { | ||
826 | - mutex_lock(&aux->hw_mutex); | ||
827 | ret = aux->transfer(aux, msg); | ||
828 | - mutex_unlock(&aux->hw_mutex); | ||
829 | if (ret < 0) { | ||
830 | if (ret == -EBUSY) | ||
831 | continue; | ||
832 | @@ -684,6 +687,8 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, | ||
833 | |||
834 | memset(&msg, 0, sizeof(msg)); | ||
835 | |||
836 | + mutex_lock(&aux->hw_mutex); | ||
837 | + | ||
838 | for (i = 0; i < num; i++) { | ||
839 | msg.address = msgs[i].addr; | ||
840 | drm_dp_i2c_msg_set_request(&msg, &msgs[i]); | ||
841 | @@ -738,6 +743,8 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, | ||
842 | msg.size = 0; | ||
843 | (void)drm_dp_i2c_do_msg(aux, &msg); | ||
844 | |||
845 | + mutex_unlock(&aux->hw_mutex); | ||
846 | + | ||
847 | return err; | ||
848 | } | ||
849 | |||
850 | diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c | ||
851 | index a82b891ae1fe..7285adb27099 100644 | ||
852 | --- a/drivers/gpu/drm/radeon/si_dpm.c | ||
853 | +++ b/drivers/gpu/drm/radeon/si_dpm.c | ||
854 | @@ -2926,9 +2926,11 @@ static struct si_dpm_quirk si_dpm_quirk_list[] = { | ||
855 | /* PITCAIRN - https://bugs.freedesktop.org/show_bug.cgi?id=76490 */ | ||
856 | { PCI_VENDOR_ID_ATI, 0x6810, 0x1462, 0x3036, 0, 120000 }, | ||
857 | { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0xe271, 0, 120000 }, | ||
858 | + { PCI_VENDOR_ID_ATI, 0x6811, 0x174b, 0x2015, 0, 120000 }, | ||
859 | { PCI_VENDOR_ID_ATI, 0x6810, 0x174b, 0xe271, 85000, 90000 }, | ||
860 | { PCI_VENDOR_ID_ATI, 0x6811, 0x1462, 0x2015, 0, 120000 }, | ||
861 | { PCI_VENDOR_ID_ATI, 0x6811, 0x1043, 0x2015, 0, 120000 }, | ||
862 | + { PCI_VENDOR_ID_ATI, 0x6811, 0x148c, 0x2015, 0, 120000 }, | ||
863 | { 0, 0, 0, 0 }, | ||
864 | }; | ||
865 | |||
866 | @@ -3008,6 +3010,10 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | ||
867 | } | ||
868 | ++p; | ||
869 | } | ||
870 | + /* limit mclk on all R7 370 parts for stability */ | ||
871 | + if (rdev->pdev->device == 0x6811 && | ||
872 | + rdev->pdev->revision == 0x81) | ||
873 | + max_mclk = 120000; | ||
874 | |||
875 | if (rps->vce_active) { | ||
876 | rps->evclk = rdev->pm.dpm.vce_states[rdev->pm.dpm.vce_level].evclk; | ||
877 | diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c | ||
878 | index 62c7b1dafaa4..73e41a8613da 100644 | ||
879 | --- a/drivers/gpu/drm/udl/udl_fb.c | ||
880 | +++ b/drivers/gpu/drm/udl/udl_fb.c | ||
881 | @@ -539,7 +539,7 @@ static int udlfb_create(struct drm_fb_helper *helper, | ||
882 | out_destroy_fbi: | ||
883 | drm_fb_helper_release_fbi(helper); | ||
884 | out_gfree: | ||
885 | - drm_gem_object_unreference(&ufbdev->ufb.obj->base); | ||
886 | + drm_gem_object_unreference_unlocked(&ufbdev->ufb.obj->base); | ||
887 | out: | ||
888 | return ret; | ||
889 | } | ||
890 | diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c | ||
891 | index 2a0a784ab6ee..d7528e0d8442 100644 | ||
892 | --- a/drivers/gpu/drm/udl/udl_gem.c | ||
893 | +++ b/drivers/gpu/drm/udl/udl_gem.c | ||
894 | @@ -52,7 +52,7 @@ udl_gem_create(struct drm_file *file, | ||
895 | return ret; | ||
896 | } | ||
897 | |||
898 | - drm_gem_object_unreference(&obj->base); | ||
899 | + drm_gem_object_unreference_unlocked(&obj->base); | ||
900 | *handle_p = handle; | ||
901 | return 0; | ||
902 | } | ||
903 | diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c | ||
904 | index 5dd426fee8cc..0df32fe0e345 100644 | ||
905 | --- a/drivers/hid/usbhid/hid-core.c | ||
906 | +++ b/drivers/hid/usbhid/hid-core.c | ||
907 | @@ -951,14 +951,6 @@ static int usbhid_output_report(struct hid_device *hid, __u8 *buf, size_t count) | ||
908 | return ret; | ||
909 | } | ||
910 | |||
911 | -static void usbhid_restart_queues(struct usbhid_device *usbhid) | ||
912 | -{ | ||
913 | - if (usbhid->urbout && !test_bit(HID_OUT_RUNNING, &usbhid->iofl)) | ||
914 | - usbhid_restart_out_queue(usbhid); | ||
915 | - if (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl)) | ||
916 | - usbhid_restart_ctrl_queue(usbhid); | ||
917 | -} | ||
918 | - | ||
919 | static void hid_free_buffers(struct usb_device *dev, struct hid_device *hid) | ||
920 | { | ||
921 | struct usbhid_device *usbhid = hid->driver_data; | ||
922 | @@ -1404,6 +1396,37 @@ static void hid_cease_io(struct usbhid_device *usbhid) | ||
923 | usb_kill_urb(usbhid->urbout); | ||
924 | } | ||
925 | |||
926 | +static void hid_restart_io(struct hid_device *hid) | ||
927 | +{ | ||
928 | + struct usbhid_device *usbhid = hid->driver_data; | ||
929 | + int clear_halt = test_bit(HID_CLEAR_HALT, &usbhid->iofl); | ||
930 | + int reset_pending = test_bit(HID_RESET_PENDING, &usbhid->iofl); | ||
931 | + | ||
932 | + spin_lock_irq(&usbhid->lock); | ||
933 | + clear_bit(HID_SUSPENDED, &usbhid->iofl); | ||
934 | + usbhid_mark_busy(usbhid); | ||
935 | + | ||
936 | + if (clear_halt || reset_pending) | ||
937 | + schedule_work(&usbhid->reset_work); | ||
938 | + usbhid->retry_delay = 0; | ||
939 | + spin_unlock_irq(&usbhid->lock); | ||
940 | + | ||
941 | + if (reset_pending || !test_bit(HID_STARTED, &usbhid->iofl)) | ||
942 | + return; | ||
943 | + | ||
944 | + if (!clear_halt) { | ||
945 | + if (hid_start_in(hid) < 0) | ||
946 | + hid_io_error(hid); | ||
947 | + } | ||
948 | + | ||
949 | + spin_lock_irq(&usbhid->lock); | ||
950 | + if (usbhid->urbout && !test_bit(HID_OUT_RUNNING, &usbhid->iofl)) | ||
951 | + usbhid_restart_out_queue(usbhid); | ||
952 | + if (!test_bit(HID_CTRL_RUNNING, &usbhid->iofl)) | ||
953 | + usbhid_restart_ctrl_queue(usbhid); | ||
954 | + spin_unlock_irq(&usbhid->lock); | ||
955 | +} | ||
956 | + | ||
957 | /* Treat USB reset pretty much the same as suspend/resume */ | ||
958 | static int hid_pre_reset(struct usb_interface *intf) | ||
959 | { | ||
960 | @@ -1453,14 +1476,14 @@ static int hid_post_reset(struct usb_interface *intf) | ||
961 | return 1; | ||
962 | } | ||
963 | |||
964 | + /* No need to do another reset or clear a halted endpoint */ | ||
965 | spin_lock_irq(&usbhid->lock); | ||
966 | clear_bit(HID_RESET_PENDING, &usbhid->iofl); | ||
967 | + clear_bit(HID_CLEAR_HALT, &usbhid->iofl); | ||
968 | spin_unlock_irq(&usbhid->lock); | ||
969 | hid_set_idle(dev, intf->cur_altsetting->desc.bInterfaceNumber, 0, 0); | ||
970 | - status = hid_start_in(hid); | ||
971 | - if (status < 0) | ||
972 | - hid_io_error(hid); | ||
973 | - usbhid_restart_queues(usbhid); | ||
974 | + | ||
975 | + hid_restart_io(hid); | ||
976 | |||
977 | return 0; | ||
978 | } | ||
979 | @@ -1483,25 +1506,9 @@ void usbhid_put_power(struct hid_device *hid) | ||
980 | #ifdef CONFIG_PM | ||
981 | static int hid_resume_common(struct hid_device *hid, bool driver_suspended) | ||
982 | { | ||
983 | - struct usbhid_device *usbhid = hid->driver_data; | ||
984 | - int status; | ||
985 | - | ||
986 | - spin_lock_irq(&usbhid->lock); | ||
987 | - clear_bit(HID_SUSPENDED, &usbhid->iofl); | ||
988 | - usbhid_mark_busy(usbhid); | ||
989 | - | ||
990 | - if (test_bit(HID_CLEAR_HALT, &usbhid->iofl) || | ||
991 | - test_bit(HID_RESET_PENDING, &usbhid->iofl)) | ||
992 | - schedule_work(&usbhid->reset_work); | ||
993 | - usbhid->retry_delay = 0; | ||
994 | - | ||
995 | - usbhid_restart_queues(usbhid); | ||
996 | - spin_unlock_irq(&usbhid->lock); | ||
997 | - | ||
998 | - status = hid_start_in(hid); | ||
999 | - if (status < 0) | ||
1000 | - hid_io_error(hid); | ||
1001 | + int status = 0; | ||
1002 | |||
1003 | + hid_restart_io(hid); | ||
1004 | if (driver_suspended && hid->driver && hid->driver->resume) | ||
1005 | status = hid->driver->resume(hid); | ||
1006 | return status; | ||
1007 | @@ -1570,12 +1577,8 @@ static int hid_suspend(struct usb_interface *intf, pm_message_t message) | ||
1008 | static int hid_resume(struct usb_interface *intf) | ||
1009 | { | ||
1010 | struct hid_device *hid = usb_get_intfdata (intf); | ||
1011 | - struct usbhid_device *usbhid = hid->driver_data; | ||
1012 | int status; | ||
1013 | |||
1014 | - if (!test_bit(HID_STARTED, &usbhid->iofl)) | ||
1015 | - return 0; | ||
1016 | - | ||
1017 | status = hid_resume_common(hid, true); | ||
1018 | dev_dbg(&intf->dev, "resume status %d\n", status); | ||
1019 | return 0; | ||
1020 | @@ -1584,10 +1587,8 @@ static int hid_resume(struct usb_interface *intf) | ||
1021 | static int hid_reset_resume(struct usb_interface *intf) | ||
1022 | { | ||
1023 | struct hid_device *hid = usb_get_intfdata(intf); | ||
1024 | - struct usbhid_device *usbhid = hid->driver_data; | ||
1025 | int status; | ||
1026 | |||
1027 | - clear_bit(HID_SUSPENDED, &usbhid->iofl); | ||
1028 | status = hid_post_reset(intf); | ||
1029 | if (status >= 0 && hid->driver && hid->driver->reset_resume) { | ||
1030 | int ret = hid->driver->reset_resume(hid); | ||
1031 | diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c | ||
1032 | index 01a4f05c1642..3c0f47ac8e53 100644 | ||
1033 | --- a/drivers/hid/wacom_wac.c | ||
1034 | +++ b/drivers/hid/wacom_wac.c | ||
1035 | @@ -2493,6 +2493,17 @@ void wacom_setup_device_quirks(struct wacom *wacom) | ||
1036 | } | ||
1037 | |||
1038 | /* | ||
1039 | + * Hack for the Bamboo One: | ||
1040 | + * the device presents a PAD/Touch interface as most Bamboos and even | ||
1041 | + * sends ghosts PAD data on it. However, later, we must disable this | ||
1042 | + * ghost interface, and we can not detect it unless we set it here | ||
1043 | + * to WACOM_DEVICETYPE_PAD or WACOM_DEVICETYPE_TOUCH. | ||
1044 | + */ | ||
1045 | + if (features->type == BAMBOO_PEN && | ||
1046 | + features->pktlen == WACOM_PKGLEN_BBTOUCH3) | ||
1047 | + features->device_type |= WACOM_DEVICETYPE_PAD; | ||
1048 | + | ||
1049 | + /* | ||
1050 | * Raw Wacom-mode pen and touch events both come from interface | ||
1051 | * 0, whose HID descriptor has an application usage of 0xFF0D | ||
1052 | * (i.e., WACOM_VENDORDEFINED_PEN). We route pen packets back | ||
1053 | diff --git a/drivers/hwmon/max1111.c b/drivers/hwmon/max1111.c | ||
1054 | index 36544c4f653c..303d0c9df907 100644 | ||
1055 | --- a/drivers/hwmon/max1111.c | ||
1056 | +++ b/drivers/hwmon/max1111.c | ||
1057 | @@ -85,6 +85,9 @@ static struct max1111_data *the_max1111; | ||
1058 | |||
1059 | int max1111_read_channel(int channel) | ||
1060 | { | ||
1061 | + if (!the_max1111 || !the_max1111->spi) | ||
1062 | + return -ENODEV; | ||
1063 | + | ||
1064 | return max1111_read(&the_max1111->spi->dev, channel); | ||
1065 | } | ||
1066 | EXPORT_SYMBOL(max1111_read_channel); | ||
1067 | @@ -258,6 +261,9 @@ static int max1111_remove(struct spi_device *spi) | ||
1068 | { | ||
1069 | struct max1111_data *data = spi_get_drvdata(spi); | ||
1070 | |||
1071 | +#ifdef CONFIG_SHARPSL_PM | ||
1072 | + the_max1111 = NULL; | ||
1073 | +#endif | ||
1074 | hwmon_device_unregister(data->hwmon_dev); | ||
1075 | sysfs_remove_group(&spi->dev.kobj, &max1110_attr_group); | ||
1076 | sysfs_remove_group(&spi->dev.kobj, &max1111_attr_group); | ||
1077 | diff --git a/drivers/iio/accel/bmc150-accel-core.c b/drivers/iio/accel/bmc150-accel-core.c | ||
1078 | index 2d33f1e821db..291c61a41c9a 100644 | ||
1079 | --- a/drivers/iio/accel/bmc150-accel-core.c | ||
1080 | +++ b/drivers/iio/accel/bmc150-accel-core.c | ||
1081 | @@ -547,7 +547,7 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data, | ||
1082 | { | ||
1083 | int ret; | ||
1084 | int axis = chan->scan_index; | ||
1085 | - unsigned int raw_val; | ||
1086 | + __le16 raw_val; | ||
1087 | |||
1088 | mutex_lock(&data->mutex); | ||
1089 | ret = bmc150_accel_set_power_state(data, true); | ||
1090 | @@ -557,14 +557,14 @@ static int bmc150_accel_get_axis(struct bmc150_accel_data *data, | ||
1091 | } | ||
1092 | |||
1093 | ret = regmap_bulk_read(data->regmap, BMC150_ACCEL_AXIS_TO_REG(axis), | ||
1094 | - &raw_val, 2); | ||
1095 | + &raw_val, sizeof(raw_val)); | ||
1096 | if (ret < 0) { | ||
1097 | dev_err(data->dev, "Error reading axis %d\n", axis); | ||
1098 | bmc150_accel_set_power_state(data, false); | ||
1099 | mutex_unlock(&data->mutex); | ||
1100 | return ret; | ||
1101 | } | ||
1102 | - *val = sign_extend32(raw_val >> chan->scan_type.shift, | ||
1103 | + *val = sign_extend32(le16_to_cpu(raw_val) >> chan->scan_type.shift, | ||
1104 | chan->scan_type.realbits - 1); | ||
1105 | ret = bmc150_accel_set_power_state(data, false); | ||
1106 | mutex_unlock(&data->mutex); | ||
1107 | @@ -988,6 +988,7 @@ static const struct iio_event_spec bmc150_accel_event = { | ||
1108 | .realbits = (bits), \ | ||
1109 | .storagebits = 16, \ | ||
1110 | .shift = 16 - (bits), \ | ||
1111 | + .endianness = IIO_LE, \ | ||
1112 | }, \ | ||
1113 | .event_spec = &bmc150_accel_event, \ | ||
1114 | .num_event_specs = 1 \ | ||
1115 | diff --git a/drivers/iio/gyro/bmg160_core.c b/drivers/iio/gyro/bmg160_core.c | ||
1116 | index 02ff789852a0..acb3b303d800 100644 | ||
1117 | --- a/drivers/iio/gyro/bmg160_core.c | ||
1118 | +++ b/drivers/iio/gyro/bmg160_core.c | ||
1119 | @@ -452,7 +452,7 @@ static int bmg160_get_temp(struct bmg160_data *data, int *val) | ||
1120 | static int bmg160_get_axis(struct bmg160_data *data, int axis, int *val) | ||
1121 | { | ||
1122 | int ret; | ||
1123 | - unsigned int raw_val; | ||
1124 | + __le16 raw_val; | ||
1125 | |||
1126 | mutex_lock(&data->mutex); | ||
1127 | ret = bmg160_set_power_state(data, true); | ||
1128 | @@ -462,7 +462,7 @@ static int bmg160_get_axis(struct bmg160_data *data, int axis, int *val) | ||
1129 | } | ||
1130 | |||
1131 | ret = regmap_bulk_read(data->regmap, BMG160_AXIS_TO_REG(axis), &raw_val, | ||
1132 | - 2); | ||
1133 | + sizeof(raw_val)); | ||
1134 | if (ret < 0) { | ||
1135 | dev_err(data->dev, "Error reading axis %d\n", axis); | ||
1136 | bmg160_set_power_state(data, false); | ||
1137 | @@ -470,7 +470,7 @@ static int bmg160_get_axis(struct bmg160_data *data, int axis, int *val) | ||
1138 | return ret; | ||
1139 | } | ||
1140 | |||
1141 | - *val = sign_extend32(raw_val, 15); | ||
1142 | + *val = sign_extend32(le16_to_cpu(raw_val), 15); | ||
1143 | ret = bmg160_set_power_state(data, false); | ||
1144 | mutex_unlock(&data->mutex); | ||
1145 | if (ret < 0) | ||
1146 | @@ -733,6 +733,7 @@ static const struct iio_event_spec bmg160_event = { | ||
1147 | .sign = 's', \ | ||
1148 | .realbits = 16, \ | ||
1149 | .storagebits = 16, \ | ||
1150 | + .endianness = IIO_LE, \ | ||
1151 | }, \ | ||
1152 | .event_spec = &bmg160_event, \ | ||
1153 | .num_event_specs = 1 \ | ||
1154 | @@ -780,7 +781,7 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p) | ||
1155 | mutex_unlock(&data->mutex); | ||
1156 | goto err; | ||
1157 | } | ||
1158 | - data->buffer[i++] = ret; | ||
1159 | + data->buffer[i++] = val; | ||
1160 | } | ||
1161 | mutex_unlock(&data->mutex); | ||
1162 | |||
1163 | diff --git a/drivers/iio/magnetometer/st_magn.h b/drivers/iio/magnetometer/st_magn.h | ||
1164 | index 06a4d9c35581..9daca4681922 100644 | ||
1165 | --- a/drivers/iio/magnetometer/st_magn.h | ||
1166 | +++ b/drivers/iio/magnetometer/st_magn.h | ||
1167 | @@ -44,6 +44,7 @@ static inline int st_magn_allocate_ring(struct iio_dev *indio_dev) | ||
1168 | static inline void st_magn_deallocate_ring(struct iio_dev *indio_dev) | ||
1169 | { | ||
1170 | } | ||
1171 | +#define ST_MAGN_TRIGGER_SET_STATE NULL | ||
1172 | #endif /* CONFIG_IIO_BUFFER */ | ||
1173 | |||
1174 | #endif /* ST_MAGN_H */ | ||
1175 | diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c | ||
1176 | index 0e3b0092ec92..515bb8b80952 100644 | ||
1177 | --- a/drivers/iommu/iommu.c | ||
1178 | +++ b/drivers/iommu/iommu.c | ||
1179 | @@ -848,7 +848,8 @@ struct iommu_group *iommu_group_get_for_dev(struct device *dev) | ||
1180 | if (!group->default_domain) { | ||
1181 | group->default_domain = __iommu_domain_alloc(dev->bus, | ||
1182 | IOMMU_DOMAIN_DMA); | ||
1183 | - group->domain = group->default_domain; | ||
1184 | + if (!group->domain) | ||
1185 | + group->domain = group->default_domain; | ||
1186 | } | ||
1187 | |||
1188 | ret = iommu_group_add_device(group, dev); | ||
1189 | diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c | ||
1190 | index 15516a6e3a39..323aad3c89de 100644 | ||
1191 | --- a/drivers/media/platform/coda/coda-common.c | ||
1192 | +++ b/drivers/media/platform/coda/coda-common.c | ||
1193 | @@ -2119,14 +2119,12 @@ static int coda_probe(struct platform_device *pdev) | ||
1194 | |||
1195 | pdev_id = of_id ? of_id->data : platform_get_device_id(pdev); | ||
1196 | |||
1197 | - if (of_id) { | ||
1198 | + if (of_id) | ||
1199 | dev->devtype = of_id->data; | ||
1200 | - } else if (pdev_id) { | ||
1201 | + else if (pdev_id) | ||
1202 | dev->devtype = &coda_devdata[pdev_id->driver_data]; | ||
1203 | - } else { | ||
1204 | - ret = -EINVAL; | ||
1205 | - goto err_v4l2_register; | ||
1206 | - } | ||
1207 | + else | ||
1208 | + return -EINVAL; | ||
1209 | |||
1210 | spin_lock_init(&dev->irqlock); | ||
1211 | INIT_LIST_HEAD(&dev->instances); | ||
1212 | diff --git a/drivers/media/platform/vsp1/vsp1_sru.c b/drivers/media/platform/vsp1/vsp1_sru.c | ||
1213 | index 6310acab60e7..d41ae950d1a1 100644 | ||
1214 | --- a/drivers/media/platform/vsp1/vsp1_sru.c | ||
1215 | +++ b/drivers/media/platform/vsp1/vsp1_sru.c | ||
1216 | @@ -154,6 +154,7 @@ static int sru_s_stream(struct v4l2_subdev *subdev, int enable) | ||
1217 | mutex_lock(sru->ctrls.lock); | ||
1218 | ctrl0 |= vsp1_sru_read(sru, VI6_SRU_CTRL0) | ||
1219 | & (VI6_SRU_CTRL0_PARAM0_MASK | VI6_SRU_CTRL0_PARAM1_MASK); | ||
1220 | + vsp1_sru_write(sru, VI6_SRU_CTRL0, ctrl0); | ||
1221 | mutex_unlock(sru->ctrls.lock); | ||
1222 | |||
1223 | vsp1_sru_write(sru, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5); | ||
1224 | diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c | ||
1225 | index 0934024fb89d..d91ded795c93 100644 | ||
1226 | --- a/drivers/media/usb/au0828/au0828-core.c | ||
1227 | +++ b/drivers/media/usb/au0828/au0828-core.c | ||
1228 | @@ -159,7 +159,7 @@ static void au0828_usb_disconnect(struct usb_interface *interface) | ||
1229 | Set the status so poll routines can check and avoid | ||
1230 | access after disconnect. | ||
1231 | */ | ||
1232 | - dev->dev_state = DEV_DISCONNECTED; | ||
1233 | + set_bit(DEV_DISCONNECTED, &dev->dev_state); | ||
1234 | |||
1235 | au0828_rc_unregister(dev); | ||
1236 | /* Digital TV */ | ||
1237 | diff --git a/drivers/media/usb/au0828/au0828-input.c b/drivers/media/usb/au0828/au0828-input.c | ||
1238 | index b0f067971979..3d6687f0407d 100644 | ||
1239 | --- a/drivers/media/usb/au0828/au0828-input.c | ||
1240 | +++ b/drivers/media/usb/au0828/au0828-input.c | ||
1241 | @@ -130,7 +130,7 @@ static int au0828_get_key_au8522(struct au0828_rc *ir) | ||
1242 | bool first = true; | ||
1243 | |||
1244 | /* do nothing if device is disconnected */ | ||
1245 | - if (ir->dev->dev_state == DEV_DISCONNECTED) | ||
1246 | + if (test_bit(DEV_DISCONNECTED, &ir->dev->dev_state)) | ||
1247 | return 0; | ||
1248 | |||
1249 | /* Check IR int */ | ||
1250 | @@ -260,7 +260,7 @@ static void au0828_rc_stop(struct rc_dev *rc) | ||
1251 | cancel_delayed_work_sync(&ir->work); | ||
1252 | |||
1253 | /* do nothing if device is disconnected */ | ||
1254 | - if (ir->dev->dev_state != DEV_DISCONNECTED) { | ||
1255 | + if (!test_bit(DEV_DISCONNECTED, &ir->dev->dev_state)) { | ||
1256 | /* Disable IR */ | ||
1257 | au8522_rc_clear(ir, 0xe0, 1 << 4); | ||
1258 | } | ||
1259 | diff --git a/drivers/media/usb/au0828/au0828-video.c b/drivers/media/usb/au0828/au0828-video.c | ||
1260 | index 45c622e234f7..7b2fe1b56039 100644 | ||
1261 | --- a/drivers/media/usb/au0828/au0828-video.c | ||
1262 | +++ b/drivers/media/usb/au0828/au0828-video.c | ||
1263 | @@ -104,14 +104,13 @@ static inline void print_err_status(struct au0828_dev *dev, | ||
1264 | |||
1265 | static int check_dev(struct au0828_dev *dev) | ||
1266 | { | ||
1267 | - if (dev->dev_state & DEV_DISCONNECTED) { | ||
1268 | + if (test_bit(DEV_DISCONNECTED, &dev->dev_state)) { | ||
1269 | pr_info("v4l2 ioctl: device not present\n"); | ||
1270 | return -ENODEV; | ||
1271 | } | ||
1272 | |||
1273 | - if (dev->dev_state & DEV_MISCONFIGURED) { | ||
1274 | - pr_info("v4l2 ioctl: device is misconfigured; " | ||
1275 | - "close and open it again\n"); | ||
1276 | + if (test_bit(DEV_MISCONFIGURED, &dev->dev_state)) { | ||
1277 | + pr_info("v4l2 ioctl: device is misconfigured; close and open it again\n"); | ||
1278 | return -EIO; | ||
1279 | } | ||
1280 | return 0; | ||
1281 | @@ -519,8 +518,8 @@ static inline int au0828_isoc_copy(struct au0828_dev *dev, struct urb *urb) | ||
1282 | if (!dev) | ||
1283 | return 0; | ||
1284 | |||
1285 | - if ((dev->dev_state & DEV_DISCONNECTED) || | ||
1286 | - (dev->dev_state & DEV_MISCONFIGURED)) | ||
1287 | + if (test_bit(DEV_DISCONNECTED, &dev->dev_state) || | ||
1288 | + test_bit(DEV_MISCONFIGURED, &dev->dev_state)) | ||
1289 | return 0; | ||
1290 | |||
1291 | if (urb->status < 0) { | ||
1292 | @@ -766,10 +765,10 @@ static int au0828_stream_interrupt(struct au0828_dev *dev) | ||
1293 | int ret = 0; | ||
1294 | |||
1295 | dev->stream_state = STREAM_INTERRUPT; | ||
1296 | - if (dev->dev_state == DEV_DISCONNECTED) | ||
1297 | + if (test_bit(DEV_DISCONNECTED, &dev->dev_state)) | ||
1298 | return -ENODEV; | ||
1299 | else if (ret) { | ||
1300 | - dev->dev_state = DEV_MISCONFIGURED; | ||
1301 | + set_bit(DEV_MISCONFIGURED, &dev->dev_state); | ||
1302 | dprintk(1, "%s device is misconfigured!\n", __func__); | ||
1303 | return ret; | ||
1304 | } | ||
1305 | @@ -958,7 +957,7 @@ static int au0828_v4l2_open(struct file *filp) | ||
1306 | int ret; | ||
1307 | |||
1308 | dprintk(1, | ||
1309 | - "%s called std_set %d dev_state %d stream users %d users %d\n", | ||
1310 | + "%s called std_set %d dev_state %ld stream users %d users %d\n", | ||
1311 | __func__, dev->std_set_in_tuner_core, dev->dev_state, | ||
1312 | dev->streaming_users, dev->users); | ||
1313 | |||
1314 | @@ -977,7 +976,7 @@ static int au0828_v4l2_open(struct file *filp) | ||
1315 | au0828_analog_stream_enable(dev); | ||
1316 | au0828_analog_stream_reset(dev); | ||
1317 | dev->stream_state = STREAM_OFF; | ||
1318 | - dev->dev_state |= DEV_INITIALIZED; | ||
1319 | + set_bit(DEV_INITIALIZED, &dev->dev_state); | ||
1320 | } | ||
1321 | dev->users++; | ||
1322 | mutex_unlock(&dev->lock); | ||
1323 | @@ -991,7 +990,7 @@ static int au0828_v4l2_close(struct file *filp) | ||
1324 | struct video_device *vdev = video_devdata(filp); | ||
1325 | |||
1326 | dprintk(1, | ||
1327 | - "%s called std_set %d dev_state %d stream users %d users %d\n", | ||
1328 | + "%s called std_set %d dev_state %ld stream users %d users %d\n", | ||
1329 | __func__, dev->std_set_in_tuner_core, dev->dev_state, | ||
1330 | dev->streaming_users, dev->users); | ||
1331 | |||
1332 | @@ -1007,7 +1006,7 @@ static int au0828_v4l2_close(struct file *filp) | ||
1333 | del_timer_sync(&dev->vbi_timeout); | ||
1334 | } | ||
1335 | |||
1336 | - if (dev->dev_state == DEV_DISCONNECTED) | ||
1337 | + if (test_bit(DEV_DISCONNECTED, &dev->dev_state)) | ||
1338 | goto end; | ||
1339 | |||
1340 | if (dev->users == 1) { | ||
1341 | @@ -1036,7 +1035,7 @@ static void au0828_init_tuner(struct au0828_dev *dev) | ||
1342 | .type = V4L2_TUNER_ANALOG_TV, | ||
1343 | }; | ||
1344 | |||
1345 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1346 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1347 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1348 | |||
1349 | if (dev->std_set_in_tuner_core) | ||
1350 | @@ -1108,7 +1107,7 @@ static int vidioc_querycap(struct file *file, void *priv, | ||
1351 | struct video_device *vdev = video_devdata(file); | ||
1352 | struct au0828_dev *dev = video_drvdata(file); | ||
1353 | |||
1354 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1355 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1356 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1357 | |||
1358 | strlcpy(cap->driver, "au0828", sizeof(cap->driver)); | ||
1359 | @@ -1151,7 +1150,7 @@ static int vidioc_g_fmt_vid_cap(struct file *file, void *priv, | ||
1360 | { | ||
1361 | struct au0828_dev *dev = video_drvdata(file); | ||
1362 | |||
1363 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1364 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1365 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1366 | |||
1367 | f->fmt.pix.width = dev->width; | ||
1368 | @@ -1170,7 +1169,7 @@ static int vidioc_try_fmt_vid_cap(struct file *file, void *priv, | ||
1369 | { | ||
1370 | struct au0828_dev *dev = video_drvdata(file); | ||
1371 | |||
1372 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1373 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1374 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1375 | |||
1376 | return au0828_set_format(dev, VIDIOC_TRY_FMT, f); | ||
1377 | @@ -1182,7 +1181,7 @@ static int vidioc_s_fmt_vid_cap(struct file *file, void *priv, | ||
1378 | struct au0828_dev *dev = video_drvdata(file); | ||
1379 | int rc; | ||
1380 | |||
1381 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1382 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1383 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1384 | |||
1385 | rc = check_dev(dev); | ||
1386 | @@ -1204,7 +1203,7 @@ static int vidioc_s_std(struct file *file, void *priv, v4l2_std_id norm) | ||
1387 | { | ||
1388 | struct au0828_dev *dev = video_drvdata(file); | ||
1389 | |||
1390 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1391 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1392 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1393 | |||
1394 | if (norm == dev->std) | ||
1395 | @@ -1236,7 +1235,7 @@ static int vidioc_g_std(struct file *file, void *priv, v4l2_std_id *norm) | ||
1396 | { | ||
1397 | struct au0828_dev *dev = video_drvdata(file); | ||
1398 | |||
1399 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1400 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1401 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1402 | |||
1403 | *norm = dev->std; | ||
1404 | @@ -1259,7 +1258,7 @@ static int vidioc_enum_input(struct file *file, void *priv, | ||
1405 | [AU0828_VMUX_DEBUG] = "tv debug" | ||
1406 | }; | ||
1407 | |||
1408 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1409 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1410 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1411 | |||
1412 | tmp = input->index; | ||
1413 | @@ -1289,7 +1288,7 @@ static int vidioc_g_input(struct file *file, void *priv, unsigned int *i) | ||
1414 | { | ||
1415 | struct au0828_dev *dev = video_drvdata(file); | ||
1416 | |||
1417 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1418 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1419 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1420 | |||
1421 | *i = dev->ctrl_input; | ||
1422 | @@ -1300,7 +1299,7 @@ static void au0828_s_input(struct au0828_dev *dev, int index) | ||
1423 | { | ||
1424 | int i; | ||
1425 | |||
1426 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1427 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1428 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1429 | |||
1430 | switch (AUVI_INPUT(index).type) { | ||
1431 | @@ -1385,7 +1384,7 @@ static int vidioc_g_audio(struct file *file, void *priv, struct v4l2_audio *a) | ||
1432 | { | ||
1433 | struct au0828_dev *dev = video_drvdata(file); | ||
1434 | |||
1435 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1436 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1437 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1438 | |||
1439 | a->index = dev->ctrl_ainput; | ||
1440 | @@ -1405,7 +1404,7 @@ static int vidioc_s_audio(struct file *file, void *priv, const struct v4l2_audio | ||
1441 | if (a->index != dev->ctrl_ainput) | ||
1442 | return -EINVAL; | ||
1443 | |||
1444 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1445 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1446 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1447 | return 0; | ||
1448 | } | ||
1449 | @@ -1417,7 +1416,7 @@ static int vidioc_g_tuner(struct file *file, void *priv, struct v4l2_tuner *t) | ||
1450 | if (t->index != 0) | ||
1451 | return -EINVAL; | ||
1452 | |||
1453 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1454 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1455 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1456 | |||
1457 | strcpy(t->name, "Auvitek tuner"); | ||
1458 | @@ -1437,7 +1436,7 @@ static int vidioc_s_tuner(struct file *file, void *priv, | ||
1459 | if (t->index != 0) | ||
1460 | return -EINVAL; | ||
1461 | |||
1462 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1463 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1464 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1465 | |||
1466 | au0828_init_tuner(dev); | ||
1467 | @@ -1459,7 +1458,7 @@ static int vidioc_g_frequency(struct file *file, void *priv, | ||
1468 | |||
1469 | if (freq->tuner != 0) | ||
1470 | return -EINVAL; | ||
1471 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1472 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1473 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1474 | freq->frequency = dev->ctrl_freq; | ||
1475 | return 0; | ||
1476 | @@ -1474,7 +1473,7 @@ static int vidioc_s_frequency(struct file *file, void *priv, | ||
1477 | if (freq->tuner != 0) | ||
1478 | return -EINVAL; | ||
1479 | |||
1480 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1481 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1482 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1483 | |||
1484 | au0828_init_tuner(dev); | ||
1485 | @@ -1500,7 +1499,7 @@ static int vidioc_g_fmt_vbi_cap(struct file *file, void *priv, | ||
1486 | { | ||
1487 | struct au0828_dev *dev = video_drvdata(file); | ||
1488 | |||
1489 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1490 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1491 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1492 | |||
1493 | format->fmt.vbi.samples_per_line = dev->vbi_width; | ||
1494 | @@ -1526,7 +1525,7 @@ static int vidioc_cropcap(struct file *file, void *priv, | ||
1495 | if (cc->type != V4L2_BUF_TYPE_VIDEO_CAPTURE) | ||
1496 | return -EINVAL; | ||
1497 | |||
1498 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1499 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1500 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1501 | |||
1502 | cc->bounds.left = 0; | ||
1503 | @@ -1548,7 +1547,7 @@ static int vidioc_g_register(struct file *file, void *priv, | ||
1504 | { | ||
1505 | struct au0828_dev *dev = video_drvdata(file); | ||
1506 | |||
1507 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1508 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1509 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1510 | |||
1511 | reg->val = au0828_read(dev, reg->reg); | ||
1512 | @@ -1561,7 +1560,7 @@ static int vidioc_s_register(struct file *file, void *priv, | ||
1513 | { | ||
1514 | struct au0828_dev *dev = video_drvdata(file); | ||
1515 | |||
1516 | - dprintk(1, "%s called std_set %d dev_state %d\n", __func__, | ||
1517 | + dprintk(1, "%s called std_set %d dev_state %ld\n", __func__, | ||
1518 | dev->std_set_in_tuner_core, dev->dev_state); | ||
1519 | |||
1520 | return au0828_writereg(dev, reg->reg, reg->val); | ||
1521 | diff --git a/drivers/media/usb/au0828/au0828.h b/drivers/media/usb/au0828/au0828.h | ||
1522 | index 60b59391ea2a..d1b6405a05a4 100644 | ||
1523 | --- a/drivers/media/usb/au0828/au0828.h | ||
1524 | +++ b/drivers/media/usb/au0828/au0828.h | ||
1525 | @@ -21,6 +21,7 @@ | ||
1526 | |||
1527 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
1528 | |||
1529 | +#include <linux/bitops.h> | ||
1530 | #include <linux/usb.h> | ||
1531 | #include <linux/i2c.h> | ||
1532 | #include <linux/i2c-algo-bit.h> | ||
1533 | @@ -122,9 +123,9 @@ enum au0828_stream_state { | ||
1534 | |||
1535 | /* device state */ | ||
1536 | enum au0828_dev_state { | ||
1537 | - DEV_INITIALIZED = 0x01, | ||
1538 | - DEV_DISCONNECTED = 0x02, | ||
1539 | - DEV_MISCONFIGURED = 0x04 | ||
1540 | + DEV_INITIALIZED = 0, | ||
1541 | + DEV_DISCONNECTED = 1, | ||
1542 | + DEV_MISCONFIGURED = 2 | ||
1543 | }; | ||
1544 | |||
1545 | struct au0828_dev; | ||
1546 | @@ -248,7 +249,7 @@ struct au0828_dev { | ||
1547 | int input_type; | ||
1548 | int std_set_in_tuner_core; | ||
1549 | unsigned int ctrl_input; | ||
1550 | - enum au0828_dev_state dev_state; | ||
1551 | + long unsigned int dev_state; /* defined at enum au0828_dev_state */; | ||
1552 | enum au0828_stream_state stream_state; | ||
1553 | wait_queue_head_t open; | ||
1554 | |||
1555 | diff --git a/drivers/media/usb/usbvision/usbvision-video.c b/drivers/media/usb/usbvision/usbvision-video.c | ||
1556 | index b693206f66dd..d1dc1a198e3e 100644 | ||
1557 | --- a/drivers/media/usb/usbvision/usbvision-video.c | ||
1558 | +++ b/drivers/media/usb/usbvision/usbvision-video.c | ||
1559 | @@ -1463,9 +1463,23 @@ static int usbvision_probe(struct usb_interface *intf, | ||
1560 | |||
1561 | if (usbvision_device_data[model].interface >= 0) | ||
1562 | interface = &dev->actconfig->interface[usbvision_device_data[model].interface]->altsetting[0]; | ||
1563 | - else | ||
1564 | + else if (ifnum < dev->actconfig->desc.bNumInterfaces) | ||
1565 | interface = &dev->actconfig->interface[ifnum]->altsetting[0]; | ||
1566 | + else { | ||
1567 | + dev_err(&intf->dev, "interface %d is invalid, max is %d\n", | ||
1568 | + ifnum, dev->actconfig->desc.bNumInterfaces - 1); | ||
1569 | + ret = -ENODEV; | ||
1570 | + goto err_usb; | ||
1571 | + } | ||
1572 | + | ||
1573 | + if (interface->desc.bNumEndpoints < 2) { | ||
1574 | + dev_err(&intf->dev, "interface %d has %d endpoints, but must" | ||
1575 | + " have minimum 2\n", ifnum, interface->desc.bNumEndpoints); | ||
1576 | + ret = -ENODEV; | ||
1577 | + goto err_usb; | ||
1578 | + } | ||
1579 | endpoint = &interface->endpoint[1].desc; | ||
1580 | + | ||
1581 | if (!usb_endpoint_xfer_isoc(endpoint)) { | ||
1582 | dev_err(&intf->dev, "%s: interface %d. has non-ISO endpoint!\n", | ||
1583 | __func__, ifnum); | ||
1584 | diff --git a/drivers/mmc/host/sdhci-pci-core.c b/drivers/mmc/host/sdhci-pci-core.c | ||
1585 | index 45ee07d3a761..610154836d79 100644 | ||
1586 | --- a/drivers/mmc/host/sdhci-pci-core.c | ||
1587 | +++ b/drivers/mmc/host/sdhci-pci-core.c | ||
1588 | @@ -390,6 +390,7 @@ static int byt_sd_probe_slot(struct sdhci_pci_slot *slot) | ||
1589 | slot->cd_idx = 0; | ||
1590 | slot->cd_override_level = true; | ||
1591 | if (slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BXT_SD || | ||
1592 | + slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BXTM_SD || | ||
1593 | slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_APL_SD) | ||
1594 | slot->host->mmc_host_ops.get_cd = bxt_get_cd; | ||
1595 | |||
1596 | @@ -1173,6 +1174,30 @@ static const struct pci_device_id pci_ids[] = { | ||
1597 | |||
1598 | { | ||
1599 | .vendor = PCI_VENDOR_ID_INTEL, | ||
1600 | + .device = PCI_DEVICE_ID_INTEL_BXTM_EMMC, | ||
1601 | + .subvendor = PCI_ANY_ID, | ||
1602 | + .subdevice = PCI_ANY_ID, | ||
1603 | + .driver_data = (kernel_ulong_t)&sdhci_intel_byt_emmc, | ||
1604 | + }, | ||
1605 | + | ||
1606 | + { | ||
1607 | + .vendor = PCI_VENDOR_ID_INTEL, | ||
1608 | + .device = PCI_DEVICE_ID_INTEL_BXTM_SDIO, | ||
1609 | + .subvendor = PCI_ANY_ID, | ||
1610 | + .subdevice = PCI_ANY_ID, | ||
1611 | + .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sdio, | ||
1612 | + }, | ||
1613 | + | ||
1614 | + { | ||
1615 | + .vendor = PCI_VENDOR_ID_INTEL, | ||
1616 | + .device = PCI_DEVICE_ID_INTEL_BXTM_SD, | ||
1617 | + .subvendor = PCI_ANY_ID, | ||
1618 | + .subdevice = PCI_ANY_ID, | ||
1619 | + .driver_data = (kernel_ulong_t)&sdhci_intel_byt_sd, | ||
1620 | + }, | ||
1621 | + | ||
1622 | + { | ||
1623 | + .vendor = PCI_VENDOR_ID_INTEL, | ||
1624 | .device = PCI_DEVICE_ID_INTEL_APL_EMMC, | ||
1625 | .subvendor = PCI_ANY_ID, | ||
1626 | .subdevice = PCI_ANY_ID, | ||
1627 | diff --git a/drivers/mmc/host/sdhci-pci.h b/drivers/mmc/host/sdhci-pci.h | ||
1628 | index d1a0b4db60db..89e7151684a1 100644 | ||
1629 | --- a/drivers/mmc/host/sdhci-pci.h | ||
1630 | +++ b/drivers/mmc/host/sdhci-pci.h | ||
1631 | @@ -28,6 +28,9 @@ | ||
1632 | #define PCI_DEVICE_ID_INTEL_BXT_SD 0x0aca | ||
1633 | #define PCI_DEVICE_ID_INTEL_BXT_EMMC 0x0acc | ||
1634 | #define PCI_DEVICE_ID_INTEL_BXT_SDIO 0x0ad0 | ||
1635 | +#define PCI_DEVICE_ID_INTEL_BXTM_SD 0x1aca | ||
1636 | +#define PCI_DEVICE_ID_INTEL_BXTM_EMMC 0x1acc | ||
1637 | +#define PCI_DEVICE_ID_INTEL_BXTM_SDIO 0x1ad0 | ||
1638 | #define PCI_DEVICE_ID_INTEL_APL_SD 0x5aca | ||
1639 | #define PCI_DEVICE_ID_INTEL_APL_EMMC 0x5acc | ||
1640 | #define PCI_DEVICE_ID_INTEL_APL_SDIO 0x5ad0 | ||
1641 | diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c | ||
1642 | index 28bbca0af238..b3d70a7a5262 100644 | ||
1643 | --- a/drivers/net/bonding/bond_main.c | ||
1644 | +++ b/drivers/net/bonding/bond_main.c | ||
1645 | @@ -3260,6 +3260,30 @@ static int bond_close(struct net_device *bond_dev) | ||
1646 | return 0; | ||
1647 | } | ||
1648 | |||
1649 | +/* fold stats, assuming all rtnl_link_stats64 fields are u64, but | ||
1650 | + * that some drivers can provide 32bit values only. | ||
1651 | + */ | ||
1652 | +static void bond_fold_stats(struct rtnl_link_stats64 *_res, | ||
1653 | + const struct rtnl_link_stats64 *_new, | ||
1654 | + const struct rtnl_link_stats64 *_old) | ||
1655 | +{ | ||
1656 | + const u64 *new = (const u64 *)_new; | ||
1657 | + const u64 *old = (const u64 *)_old; | ||
1658 | + u64 *res = (u64 *)_res; | ||
1659 | + int i; | ||
1660 | + | ||
1661 | + for (i = 0; i < sizeof(*_res) / sizeof(u64); i++) { | ||
1662 | + u64 nv = new[i]; | ||
1663 | + u64 ov = old[i]; | ||
1664 | + | ||
1665 | + /* detects if this particular field is 32bit only */ | ||
1666 | + if (((nv | ov) >> 32) == 0) | ||
1667 | + res[i] += (u32)nv - (u32)ov; | ||
1668 | + else | ||
1669 | + res[i] += nv - ov; | ||
1670 | + } | ||
1671 | +} | ||
1672 | + | ||
1673 | static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev, | ||
1674 | struct rtnl_link_stats64 *stats) | ||
1675 | { | ||
1676 | @@ -3268,43 +3292,23 @@ static struct rtnl_link_stats64 *bond_get_stats(struct net_device *bond_dev, | ||
1677 | struct list_head *iter; | ||
1678 | struct slave *slave; | ||
1679 | |||
1680 | + spin_lock(&bond->stats_lock); | ||
1681 | memcpy(stats, &bond->bond_stats, sizeof(*stats)); | ||
1682 | |||
1683 | - bond_for_each_slave(bond, slave, iter) { | ||
1684 | - const struct rtnl_link_stats64 *sstats = | ||
1685 | + rcu_read_lock(); | ||
1686 | + bond_for_each_slave_rcu(bond, slave, iter) { | ||
1687 | + const struct rtnl_link_stats64 *new = | ||
1688 | dev_get_stats(slave->dev, &temp); | ||
1689 | - struct rtnl_link_stats64 *pstats = &slave->slave_stats; | ||
1690 | - | ||
1691 | - stats->rx_packets += sstats->rx_packets - pstats->rx_packets; | ||
1692 | - stats->rx_bytes += sstats->rx_bytes - pstats->rx_bytes; | ||
1693 | - stats->rx_errors += sstats->rx_errors - pstats->rx_errors; | ||
1694 | - stats->rx_dropped += sstats->rx_dropped - pstats->rx_dropped; | ||
1695 | - | ||
1696 | - stats->tx_packets += sstats->tx_packets - pstats->tx_packets;; | ||
1697 | - stats->tx_bytes += sstats->tx_bytes - pstats->tx_bytes; | ||
1698 | - stats->tx_errors += sstats->tx_errors - pstats->tx_errors; | ||
1699 | - stats->tx_dropped += sstats->tx_dropped - pstats->tx_dropped; | ||
1700 | - | ||
1701 | - stats->multicast += sstats->multicast - pstats->multicast; | ||
1702 | - stats->collisions += sstats->collisions - pstats->collisions; | ||
1703 | - | ||
1704 | - stats->rx_length_errors += sstats->rx_length_errors - pstats->rx_length_errors; | ||
1705 | - stats->rx_over_errors += sstats->rx_over_errors - pstats->rx_over_errors; | ||
1706 | - stats->rx_crc_errors += sstats->rx_crc_errors - pstats->rx_crc_errors; | ||
1707 | - stats->rx_frame_errors += sstats->rx_frame_errors - pstats->rx_frame_errors; | ||
1708 | - stats->rx_fifo_errors += sstats->rx_fifo_errors - pstats->rx_fifo_errors; | ||
1709 | - stats->rx_missed_errors += sstats->rx_missed_errors - pstats->rx_missed_errors; | ||
1710 | - | ||
1711 | - stats->tx_aborted_errors += sstats->tx_aborted_errors - pstats->tx_aborted_errors; | ||
1712 | - stats->tx_carrier_errors += sstats->tx_carrier_errors - pstats->tx_carrier_errors; | ||
1713 | - stats->tx_fifo_errors += sstats->tx_fifo_errors - pstats->tx_fifo_errors; | ||
1714 | - stats->tx_heartbeat_errors += sstats->tx_heartbeat_errors - pstats->tx_heartbeat_errors; | ||
1715 | - stats->tx_window_errors += sstats->tx_window_errors - pstats->tx_window_errors; | ||
1716 | + | ||
1717 | + bond_fold_stats(stats, new, &slave->slave_stats); | ||
1718 | |||
1719 | /* save off the slave stats for the next run */ | ||
1720 | - memcpy(pstats, sstats, sizeof(*sstats)); | ||
1721 | + memcpy(&slave->slave_stats, new, sizeof(*new)); | ||
1722 | } | ||
1723 | + rcu_read_unlock(); | ||
1724 | + | ||
1725 | memcpy(&bond->bond_stats, stats, sizeof(*stats)); | ||
1726 | + spin_unlock(&bond->stats_lock); | ||
1727 | |||
1728 | return stats; | ||
1729 | } | ||
1730 | @@ -4118,6 +4122,7 @@ void bond_setup(struct net_device *bond_dev) | ||
1731 | struct bonding *bond = netdev_priv(bond_dev); | ||
1732 | |||
1733 | spin_lock_init(&bond->mode_lock); | ||
1734 | + spin_lock_init(&bond->stats_lock); | ||
1735 | bond->params = bonding_defaults; | ||
1736 | |||
1737 | /* Initialize pointers */ | ||
1738 | diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1739 | index 17f017ab4dac..0fb3f8de88e9 100644 | ||
1740 | --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1741 | +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c | ||
1742 | @@ -1197,7 +1197,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev, | ||
1743 | dev->stats.tx_bytes += tx_cb_ptr->skb->len; | ||
1744 | dma_unmap_single(&dev->dev, | ||
1745 | dma_unmap_addr(tx_cb_ptr, dma_addr), | ||
1746 | - tx_cb_ptr->skb->len, | ||
1747 | + dma_unmap_len(tx_cb_ptr, dma_len), | ||
1748 | DMA_TO_DEVICE); | ||
1749 | bcmgenet_free_cb(tx_cb_ptr); | ||
1750 | } else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) { | ||
1751 | @@ -1308,7 +1308,7 @@ static int bcmgenet_xmit_single(struct net_device *dev, | ||
1752 | } | ||
1753 | |||
1754 | dma_unmap_addr_set(tx_cb_ptr, dma_addr, mapping); | ||
1755 | - dma_unmap_len_set(tx_cb_ptr, dma_len, skb->len); | ||
1756 | + dma_unmap_len_set(tx_cb_ptr, dma_len, skb_len); | ||
1757 | length_status = (skb_len << DMA_BUFLENGTH_SHIFT) | dma_desc_flags | | ||
1758 | (priv->hw_params->qtag_mask << DMA_TX_QTAG_SHIFT) | | ||
1759 | DMA_TX_APPEND_CRC; | ||
1760 | diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c | ||
1761 | index 060dd3922974..973dade2d07f 100644 | ||
1762 | --- a/drivers/net/ethernet/jme.c | ||
1763 | +++ b/drivers/net/ethernet/jme.c | ||
1764 | @@ -3312,13 +3312,14 @@ jme_resume(struct device *dev) | ||
1765 | jme_reset_phy_processor(jme); | ||
1766 | jme_phy_calibration(jme); | ||
1767 | jme_phy_setEA(jme); | ||
1768 | - jme_start_irq(jme); | ||
1769 | netif_device_attach(netdev); | ||
1770 | |||
1771 | atomic_inc(&jme->link_changing); | ||
1772 | |||
1773 | jme_reset_link(jme); | ||
1774 | |||
1775 | + jme_start_irq(jme); | ||
1776 | + | ||
1777 | return 0; | ||
1778 | } | ||
1779 | |||
1780 | diff --git a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
1781 | index cad6c44df91c..d314d96dcb1c 100644 | ||
1782 | --- a/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
1783 | +++ b/drivers/net/ethernet/mellanox/mlx4/resource_tracker.c | ||
1784 | @@ -3132,7 +3132,7 @@ static int verify_qp_parameters(struct mlx4_dev *dev, | ||
1785 | case QP_TRANS_RTS2RTS: | ||
1786 | case QP_TRANS_SQD2SQD: | ||
1787 | case QP_TRANS_SQD2RTS: | ||
1788 | - if (slave != mlx4_master_func_num(dev)) | ||
1789 | + if (slave != mlx4_master_func_num(dev)) { | ||
1790 | if (optpar & MLX4_QP_OPTPAR_PRIMARY_ADDR_PATH) { | ||
1791 | port = (qp_ctx->pri_path.sched_queue >> 6 & 1) + 1; | ||
1792 | if (dev->caps.port_mask[port] != MLX4_PORT_TYPE_IB) | ||
1793 | @@ -3151,6 +3151,7 @@ static int verify_qp_parameters(struct mlx4_dev *dev, | ||
1794 | if (qp_ctx->alt_path.mgid_index >= num_gids) | ||
1795 | return -EINVAL; | ||
1796 | } | ||
1797 | + } | ||
1798 | break; | ||
1799 | default: | ||
1800 | break; | ||
1801 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | ||
1802 | index 4365c8bccc6d..605f6410f867 100644 | ||
1803 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | ||
1804 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h | ||
1805 | @@ -61,6 +61,8 @@ struct mlxsw_sp { | ||
1806 | #define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100 | ||
1807 | unsigned int interval; /* ms */ | ||
1808 | } fdb_notify; | ||
1809 | +#define MLXSW_SP_MIN_AGEING_TIME 10 | ||
1810 | +#define MLXSW_SP_MAX_AGEING_TIME 1000000 | ||
1811 | #define MLXSW_SP_DEFAULT_AGEING_TIME 300 | ||
1812 | u32 ageing_time; | ||
1813 | struct { | ||
1814 | diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | ||
1815 | index 7dbeafa65934..d4c4c2b5156c 100644 | ||
1816 | --- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | ||
1817 | +++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c | ||
1818 | @@ -232,8 +232,13 @@ static int mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port *mlxsw_sp_port, | ||
1819 | unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t); | ||
1820 | u32 ageing_time = jiffies_to_msecs(ageing_jiffies) / 1000; | ||
1821 | |||
1822 | - if (switchdev_trans_ph_prepare(trans)) | ||
1823 | - return 0; | ||
1824 | + if (switchdev_trans_ph_prepare(trans)) { | ||
1825 | + if (ageing_time < MLXSW_SP_MIN_AGEING_TIME || | ||
1826 | + ageing_time > MLXSW_SP_MAX_AGEING_TIME) | ||
1827 | + return -ERANGE; | ||
1828 | + else | ||
1829 | + return 0; | ||
1830 | + } | ||
1831 | |||
1832 | return mlxsw_sp_ageing_set(mlxsw_sp, ageing_time); | ||
1833 | } | ||
1834 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
1835 | index 46bbea8e023c..55007f1e6bbc 100644 | ||
1836 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
1837 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | ||
1838 | @@ -566,6 +566,7 @@ struct qlcnic_adapter_stats { | ||
1839 | u64 tx_dma_map_error; | ||
1840 | u64 spurious_intr; | ||
1841 | u64 mac_filter_limit_overrun; | ||
1842 | + u64 mbx_spurious_intr; | ||
1843 | }; | ||
1844 | |||
1845 | /* | ||
1846 | @@ -1099,7 +1100,7 @@ struct qlcnic_mailbox { | ||
1847 | unsigned long status; | ||
1848 | spinlock_t queue_lock; /* Mailbox queue lock */ | ||
1849 | spinlock_t aen_lock; /* Mailbox response/AEN lock */ | ||
1850 | - atomic_t rsp_status; | ||
1851 | + u32 rsp_status; | ||
1852 | u32 num_cmds; | ||
1853 | }; | ||
1854 | |||
1855 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
1856 | index 37a731be7d39..f9640d5ce6ba 100644 | ||
1857 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
1858 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | ||
1859 | @@ -491,7 +491,7 @@ irqreturn_t qlcnic_83xx_clear_legacy_intr(struct qlcnic_adapter *adapter) | ||
1860 | |||
1861 | static inline void qlcnic_83xx_notify_mbx_response(struct qlcnic_mailbox *mbx) | ||
1862 | { | ||
1863 | - atomic_set(&mbx->rsp_status, QLC_83XX_MBX_RESPONSE_ARRIVED); | ||
1864 | + mbx->rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; | ||
1865 | complete(&mbx->completion); | ||
1866 | } | ||
1867 | |||
1868 | @@ -510,7 +510,7 @@ static void qlcnic_83xx_poll_process_aen(struct qlcnic_adapter *adapter) | ||
1869 | if (event & QLCNIC_MBX_ASYNC_EVENT) { | ||
1870 | __qlcnic_83xx_process_aen(adapter); | ||
1871 | } else { | ||
1872 | - if (atomic_read(&mbx->rsp_status) != rsp_status) | ||
1873 | + if (mbx->rsp_status != rsp_status) | ||
1874 | qlcnic_83xx_notify_mbx_response(mbx); | ||
1875 | } | ||
1876 | out: | ||
1877 | @@ -1023,7 +1023,7 @@ static void qlcnic_83xx_process_aen(struct qlcnic_adapter *adapter) | ||
1878 | if (event & QLCNIC_MBX_ASYNC_EVENT) { | ||
1879 | __qlcnic_83xx_process_aen(adapter); | ||
1880 | } else { | ||
1881 | - if (atomic_read(&mbx->rsp_status) != rsp_status) | ||
1882 | + if (mbx->rsp_status != rsp_status) | ||
1883 | qlcnic_83xx_notify_mbx_response(mbx); | ||
1884 | } | ||
1885 | } | ||
1886 | @@ -2338,9 +2338,9 @@ static void qlcnic_83xx_handle_link_aen(struct qlcnic_adapter *adapter, | ||
1887 | |||
1888 | static irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data) | ||
1889 | { | ||
1890 | + u32 mask, resp, event, rsp_status = QLC_83XX_MBX_RESPONSE_ARRIVED; | ||
1891 | struct qlcnic_adapter *adapter = data; | ||
1892 | struct qlcnic_mailbox *mbx; | ||
1893 | - u32 mask, resp, event; | ||
1894 | unsigned long flags; | ||
1895 | |||
1896 | mbx = adapter->ahw->mailbox; | ||
1897 | @@ -2350,10 +2350,14 @@ static irqreturn_t qlcnic_83xx_handle_aen(int irq, void *data) | ||
1898 | goto out; | ||
1899 | |||
1900 | event = readl(QLCNIC_MBX_FW(adapter->ahw, 0)); | ||
1901 | - if (event & QLCNIC_MBX_ASYNC_EVENT) | ||
1902 | + if (event & QLCNIC_MBX_ASYNC_EVENT) { | ||
1903 | __qlcnic_83xx_process_aen(adapter); | ||
1904 | - else | ||
1905 | - qlcnic_83xx_notify_mbx_response(mbx); | ||
1906 | + } else { | ||
1907 | + if (mbx->rsp_status != rsp_status) | ||
1908 | + qlcnic_83xx_notify_mbx_response(mbx); | ||
1909 | + else | ||
1910 | + adapter->stats.mbx_spurious_intr++; | ||
1911 | + } | ||
1912 | |||
1913 | out: | ||
1914 | mask = QLCRDX(adapter->ahw, QLCNIC_DEF_INT_MASK); | ||
1915 | @@ -4050,10 +4054,10 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | ||
1916 | struct qlcnic_adapter *adapter = mbx->adapter; | ||
1917 | const struct qlcnic_mbx_ops *mbx_ops = mbx->ops; | ||
1918 | struct device *dev = &adapter->pdev->dev; | ||
1919 | - atomic_t *rsp_status = &mbx->rsp_status; | ||
1920 | struct list_head *head = &mbx->cmd_q; | ||
1921 | struct qlcnic_hardware_context *ahw; | ||
1922 | struct qlcnic_cmd_args *cmd = NULL; | ||
1923 | + unsigned long flags; | ||
1924 | |||
1925 | ahw = adapter->ahw; | ||
1926 | |||
1927 | @@ -4063,7 +4067,9 @@ static void qlcnic_83xx_mailbox_worker(struct work_struct *work) | ||
1928 | return; | ||
1929 | } | ||
1930 | |||
1931 | - atomic_set(rsp_status, QLC_83XX_MBX_RESPONSE_WAIT); | ||
1932 | + spin_lock_irqsave(&mbx->aen_lock, flags); | ||
1933 | + mbx->rsp_status = QLC_83XX_MBX_RESPONSE_WAIT; | ||
1934 | + spin_unlock_irqrestore(&mbx->aen_lock, flags); | ||
1935 | |||
1936 | spin_lock(&mbx->queue_lock); | ||
1937 | |||
1938 | diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | ||
1939 | index 494e8105adee..0a2318cad34d 100644 | ||
1940 | --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | ||
1941 | +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | ||
1942 | @@ -59,7 +59,8 @@ static const struct qlcnic_stats qlcnic_gstrings_stats[] = { | ||
1943 | QLC_OFF(stats.mac_filter_limit_overrun)}, | ||
1944 | {"spurious intr", QLC_SIZEOF(stats.spurious_intr), | ||
1945 | QLC_OFF(stats.spurious_intr)}, | ||
1946 | - | ||
1947 | + {"mbx spurious intr", QLC_SIZEOF(stats.mbx_spurious_intr), | ||
1948 | + QLC_OFF(stats.mbx_spurious_intr)}, | ||
1949 | }; | ||
1950 | |||
1951 | static const char qlcnic_device_gstrings_stats[][ETH_GSTRING_LEN] = { | ||
1952 | diff --git a/drivers/net/ethernet/qlogic/qlge/qlge_main.c b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | ||
1953 | index 997976426799..b28e73ea2c25 100644 | ||
1954 | --- a/drivers/net/ethernet/qlogic/qlge/qlge_main.c | ||
1955 | +++ b/drivers/net/ethernet/qlogic/qlge/qlge_main.c | ||
1956 | @@ -1648,7 +1648,18 @@ static void ql_process_mac_rx_skb(struct ql_adapter *qdev, | ||
1957 | return; | ||
1958 | } | ||
1959 | skb_reserve(new_skb, NET_IP_ALIGN); | ||
1960 | + | ||
1961 | + pci_dma_sync_single_for_cpu(qdev->pdev, | ||
1962 | + dma_unmap_addr(sbq_desc, mapaddr), | ||
1963 | + dma_unmap_len(sbq_desc, maplen), | ||
1964 | + PCI_DMA_FROMDEVICE); | ||
1965 | + | ||
1966 | memcpy(skb_put(new_skb, length), skb->data, length); | ||
1967 | + | ||
1968 | + pci_dma_sync_single_for_device(qdev->pdev, | ||
1969 | + dma_unmap_addr(sbq_desc, mapaddr), | ||
1970 | + dma_unmap_len(sbq_desc, maplen), | ||
1971 | + PCI_DMA_FROMDEVICE); | ||
1972 | skb = new_skb; | ||
1973 | |||
1974 | /* Frame error, so drop the packet. */ | ||
1975 | diff --git a/drivers/net/ethernet/qualcomm/qca_spi.c b/drivers/net/ethernet/qualcomm/qca_spi.c | ||
1976 | index 689a4a5c8dcf..1ef03939d25f 100644 | ||
1977 | --- a/drivers/net/ethernet/qualcomm/qca_spi.c | ||
1978 | +++ b/drivers/net/ethernet/qualcomm/qca_spi.c | ||
1979 | @@ -811,7 +811,7 @@ qcaspi_netdev_setup(struct net_device *dev) | ||
1980 | dev->netdev_ops = &qcaspi_netdev_ops; | ||
1981 | qcaspi_set_ethtool_ops(dev); | ||
1982 | dev->watchdog_timeo = QCASPI_TX_TIMEOUT; | ||
1983 | - dev->flags = IFF_MULTICAST; | ||
1984 | + dev->priv_flags &= ~IFF_TX_SKB_SHARING; | ||
1985 | dev->tx_queue_len = 100; | ||
1986 | |||
1987 | qca = netdev_priv(dev); | ||
1988 | diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c | ||
1989 | index 6a8fc0f341ff..36fc9427418f 100644 | ||
1990 | --- a/drivers/net/ethernet/renesas/sh_eth.c | ||
1991 | +++ b/drivers/net/ethernet/renesas/sh_eth.c | ||
1992 | @@ -1185,11 +1185,8 @@ static void sh_eth_ring_format(struct net_device *ndev) | ||
1993 | break; | ||
1994 | sh_eth_set_receive_align(skb); | ||
1995 | |||
1996 | - /* RX descriptor */ | ||
1997 | - rxdesc = &mdp->rx_ring[i]; | ||
1998 | /* The size of the buffer is a multiple of 32 bytes. */ | ||
1999 | buf_len = ALIGN(mdp->rx_buf_sz, 32); | ||
2000 | - rxdesc->len = cpu_to_edmac(mdp, buf_len << 16); | ||
2001 | dma_addr = dma_map_single(&ndev->dev, skb->data, buf_len, | ||
2002 | DMA_FROM_DEVICE); | ||
2003 | if (dma_mapping_error(&ndev->dev, dma_addr)) { | ||
2004 | @@ -1197,6 +1194,10 @@ static void sh_eth_ring_format(struct net_device *ndev) | ||
2005 | break; | ||
2006 | } | ||
2007 | mdp->rx_skbuff[i] = skb; | ||
2008 | + | ||
2009 | + /* RX descriptor */ | ||
2010 | + rxdesc = &mdp->rx_ring[i]; | ||
2011 | + rxdesc->len = cpu_to_edmac(mdp, buf_len << 16); | ||
2012 | rxdesc->addr = cpu_to_edmac(mdp, dma_addr); | ||
2013 | rxdesc->status = cpu_to_edmac(mdp, RD_RACT | RD_RFP); | ||
2014 | |||
2015 | @@ -1212,7 +1213,8 @@ static void sh_eth_ring_format(struct net_device *ndev) | ||
2016 | mdp->dirty_rx = (u32) (i - mdp->num_rx_ring); | ||
2017 | |||
2018 | /* Mark the last entry as wrapping the ring. */ | ||
2019 | - rxdesc->status |= cpu_to_edmac(mdp, RD_RDLE); | ||
2020 | + if (rxdesc) | ||
2021 | + rxdesc->status |= cpu_to_edmac(mdp, RD_RDLE); | ||
2022 | |||
2023 | memset(mdp->tx_ring, 0, tx_ringsize); | ||
2024 | |||
2025 | diff --git a/drivers/net/ethernet/rocker/rocker.c b/drivers/net/ethernet/rocker/rocker.c | ||
2026 | index 52ec3d6e056a..2b34622a4bfe 100644 | ||
2027 | --- a/drivers/net/ethernet/rocker/rocker.c | ||
2028 | +++ b/drivers/net/ethernet/rocker/rocker.c | ||
2029 | @@ -239,6 +239,7 @@ struct rocker { | ||
2030 | struct { | ||
2031 | u64 id; | ||
2032 | } hw; | ||
2033 | + unsigned long ageing_time; | ||
2034 | spinlock_t cmd_ring_lock; /* for cmd ring accesses */ | ||
2035 | struct rocker_dma_ring_info cmd_ring; | ||
2036 | struct rocker_dma_ring_info event_ring; | ||
2037 | @@ -3704,7 +3705,7 @@ static void rocker_fdb_cleanup(unsigned long data) | ||
2038 | struct rocker_port *rocker_port; | ||
2039 | struct rocker_fdb_tbl_entry *entry; | ||
2040 | struct hlist_node *tmp; | ||
2041 | - unsigned long next_timer = jiffies + BR_MIN_AGEING_TIME; | ||
2042 | + unsigned long next_timer = jiffies + rocker->ageing_time; | ||
2043 | unsigned long expires; | ||
2044 | unsigned long lock_flags; | ||
2045 | int flags = ROCKER_OP_FLAG_NOWAIT | ROCKER_OP_FLAG_REMOVE | | ||
2046 | @@ -4367,8 +4368,12 @@ static int rocker_port_bridge_ageing_time(struct rocker_port *rocker_port, | ||
2047 | struct switchdev_trans *trans, | ||
2048 | u32 ageing_time) | ||
2049 | { | ||
2050 | + struct rocker *rocker = rocker_port->rocker; | ||
2051 | + | ||
2052 | if (!switchdev_trans_ph_prepare(trans)) { | ||
2053 | rocker_port->ageing_time = clock_t_to_jiffies(ageing_time); | ||
2054 | + if (rocker_port->ageing_time < rocker->ageing_time) | ||
2055 | + rocker->ageing_time = rocker_port->ageing_time; | ||
2056 | mod_timer(&rocker_port->rocker->fdb_cleanup_timer, jiffies); | ||
2057 | } | ||
2058 | |||
2059 | @@ -5206,10 +5211,13 @@ static int rocker_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||
2060 | goto err_init_tbls; | ||
2061 | } | ||
2062 | |||
2063 | + rocker->ageing_time = BR_DEFAULT_AGEING_TIME; | ||
2064 | setup_timer(&rocker->fdb_cleanup_timer, rocker_fdb_cleanup, | ||
2065 | (unsigned long) rocker); | ||
2066 | mod_timer(&rocker->fdb_cleanup_timer, jiffies); | ||
2067 | |||
2068 | + rocker->ageing_time = BR_DEFAULT_AGEING_TIME; | ||
2069 | + | ||
2070 | err = rocker_probe_ports(rocker); | ||
2071 | if (err) { | ||
2072 | dev_err(&pdev->dev, "failed to probe ports\n"); | ||
2073 | diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c | ||
2074 | index 0fc521941c71..159a68782bec 100644 | ||
2075 | --- a/drivers/net/macvtap.c | ||
2076 | +++ b/drivers/net/macvtap.c | ||
2077 | @@ -760,6 +760,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | ||
2078 | macvtap16_to_cpu(q, vnet_hdr.hdr_len) : GOODCOPY_LEN; | ||
2079 | if (copylen > good_linear) | ||
2080 | copylen = good_linear; | ||
2081 | + else if (copylen < ETH_HLEN) | ||
2082 | + copylen = ETH_HLEN; | ||
2083 | linear = copylen; | ||
2084 | i = *from; | ||
2085 | iov_iter_advance(&i, copylen); | ||
2086 | @@ -769,10 +771,11 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m, | ||
2087 | |||
2088 | if (!zerocopy) { | ||
2089 | copylen = len; | ||
2090 | - if (macvtap16_to_cpu(q, vnet_hdr.hdr_len) > good_linear) | ||
2091 | + linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); | ||
2092 | + if (linear > good_linear) | ||
2093 | linear = good_linear; | ||
2094 | - else | ||
2095 | - linear = macvtap16_to_cpu(q, vnet_hdr.hdr_len); | ||
2096 | + else if (linear < ETH_HLEN) | ||
2097 | + linear = ETH_HLEN; | ||
2098 | } | ||
2099 | |||
2100 | skb = macvtap_alloc_skb(&q->sk, MACVTAP_RESERVE, copylen, | ||
2101 | diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c | ||
2102 | index 9a863c6a6a33..174e06ec7c2f 100644 | ||
2103 | --- a/drivers/net/ppp/ppp_generic.c | ||
2104 | +++ b/drivers/net/ppp/ppp_generic.c | ||
2105 | @@ -567,7 +567,7 @@ static int get_filter(void __user *arg, struct sock_filter **p) | ||
2106 | |||
2107 | static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2108 | { | ||
2109 | - struct ppp_file *pf = file->private_data; | ||
2110 | + struct ppp_file *pf; | ||
2111 | struct ppp *ppp; | ||
2112 | int err = -EFAULT, val, val2, i; | ||
2113 | struct ppp_idle idle; | ||
2114 | @@ -577,9 +577,14 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2115 | void __user *argp = (void __user *)arg; | ||
2116 | int __user *p = argp; | ||
2117 | |||
2118 | - if (!pf) | ||
2119 | - return ppp_unattached_ioctl(current->nsproxy->net_ns, | ||
2120 | - pf, file, cmd, arg); | ||
2121 | + mutex_lock(&ppp_mutex); | ||
2122 | + | ||
2123 | + pf = file->private_data; | ||
2124 | + if (!pf) { | ||
2125 | + err = ppp_unattached_ioctl(current->nsproxy->net_ns, | ||
2126 | + pf, file, cmd, arg); | ||
2127 | + goto out; | ||
2128 | + } | ||
2129 | |||
2130 | if (cmd == PPPIOCDETACH) { | ||
2131 | /* | ||
2132 | @@ -594,7 +599,6 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2133 | * this fd and reopening /dev/ppp. | ||
2134 | */ | ||
2135 | err = -EINVAL; | ||
2136 | - mutex_lock(&ppp_mutex); | ||
2137 | if (pf->kind == INTERFACE) { | ||
2138 | ppp = PF_TO_PPP(pf); | ||
2139 | rtnl_lock(); | ||
2140 | @@ -608,15 +612,13 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2141 | } else | ||
2142 | pr_warn("PPPIOCDETACH file->f_count=%ld\n", | ||
2143 | atomic_long_read(&file->f_count)); | ||
2144 | - mutex_unlock(&ppp_mutex); | ||
2145 | - return err; | ||
2146 | + goto out; | ||
2147 | } | ||
2148 | |||
2149 | if (pf->kind == CHANNEL) { | ||
2150 | struct channel *pch; | ||
2151 | struct ppp_channel *chan; | ||
2152 | |||
2153 | - mutex_lock(&ppp_mutex); | ||
2154 | pch = PF_TO_CHANNEL(pf); | ||
2155 | |||
2156 | switch (cmd) { | ||
2157 | @@ -638,17 +640,16 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2158 | err = chan->ops->ioctl(chan, cmd, arg); | ||
2159 | up_read(&pch->chan_sem); | ||
2160 | } | ||
2161 | - mutex_unlock(&ppp_mutex); | ||
2162 | - return err; | ||
2163 | + goto out; | ||
2164 | } | ||
2165 | |||
2166 | if (pf->kind != INTERFACE) { | ||
2167 | /* can't happen */ | ||
2168 | pr_err("PPP: not interface or channel??\n"); | ||
2169 | - return -EINVAL; | ||
2170 | + err = -EINVAL; | ||
2171 | + goto out; | ||
2172 | } | ||
2173 | |||
2174 | - mutex_lock(&ppp_mutex); | ||
2175 | ppp = PF_TO_PPP(pf); | ||
2176 | switch (cmd) { | ||
2177 | case PPPIOCSMRU: | ||
2178 | @@ -823,7 +824,10 @@ static long ppp_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
2179 | default: | ||
2180 | err = -ENOTTY; | ||
2181 | } | ||
2182 | + | ||
2183 | +out: | ||
2184 | mutex_unlock(&ppp_mutex); | ||
2185 | + | ||
2186 | return err; | ||
2187 | } | ||
2188 | |||
2189 | @@ -836,7 +840,6 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | ||
2190 | struct ppp_net *pn; | ||
2191 | int __user *p = (int __user *)arg; | ||
2192 | |||
2193 | - mutex_lock(&ppp_mutex); | ||
2194 | switch (cmd) { | ||
2195 | case PPPIOCNEWUNIT: | ||
2196 | /* Create a new ppp unit */ | ||
2197 | @@ -886,7 +889,7 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, | ||
2198 | default: | ||
2199 | err = -ENOTTY; | ||
2200 | } | ||
2201 | - mutex_unlock(&ppp_mutex); | ||
2202 | + | ||
2203 | return err; | ||
2204 | } | ||
2205 | |||
2206 | @@ -2290,7 +2293,7 @@ int ppp_register_net_channel(struct net *net, struct ppp_channel *chan) | ||
2207 | |||
2208 | pch->ppp = NULL; | ||
2209 | pch->chan = chan; | ||
2210 | - pch->chan_net = net; | ||
2211 | + pch->chan_net = get_net(net); | ||
2212 | chan->ppp = pch; | ||
2213 | init_ppp_file(&pch->file, CHANNEL); | ||
2214 | pch->file.hdrlen = chan->hdrlen; | ||
2215 | @@ -2387,6 +2390,8 @@ ppp_unregister_channel(struct ppp_channel *chan) | ||
2216 | spin_lock_bh(&pn->all_channels_lock); | ||
2217 | list_del(&pch->list); | ||
2218 | spin_unlock_bh(&pn->all_channels_lock); | ||
2219 | + put_net(pch->chan_net); | ||
2220 | + pch->chan_net = NULL; | ||
2221 | |||
2222 | pch->file.dead = 1; | ||
2223 | wake_up_interruptible(&pch->file.rwait); | ||
2224 | @@ -2803,6 +2808,7 @@ static struct ppp *ppp_create_interface(struct net *net, int unit, | ||
2225 | |||
2226 | out2: | ||
2227 | mutex_unlock(&pn->all_ppp_mutex); | ||
2228 | + rtnl_unlock(); | ||
2229 | free_netdev(dev); | ||
2230 | out1: | ||
2231 | *retp = ret; | ||
2232 | diff --git a/drivers/net/tun.c b/drivers/net/tun.c | ||
2233 | index f0db770e8b2f..2d186bd66d43 100644 | ||
2234 | --- a/drivers/net/tun.c | ||
2235 | +++ b/drivers/net/tun.c | ||
2236 | @@ -621,7 +621,8 @@ static int tun_attach(struct tun_struct *tun, struct file *file, bool skip_filte | ||
2237 | |||
2238 | /* Re-attach the filter to persist device */ | ||
2239 | if (!skip_filter && (tun->filter_attached == true)) { | ||
2240 | - err = sk_attach_filter(&tun->fprog, tfile->socket.sk); | ||
2241 | + err = __sk_attach_filter(&tun->fprog, tfile->socket.sk, | ||
2242 | + lockdep_rtnl_is_held()); | ||
2243 | if (!err) | ||
2244 | goto out; | ||
2245 | } | ||
2246 | @@ -1000,7 +1001,6 @@ static void tun_net_init(struct net_device *dev) | ||
2247 | /* Zero header length */ | ||
2248 | dev->type = ARPHRD_NONE; | ||
2249 | dev->flags = IFF_POINTOPOINT | IFF_NOARP | IFF_MULTICAST; | ||
2250 | - dev->tx_queue_len = TUN_READQ_SIZE; /* We prefer our own queue length */ | ||
2251 | break; | ||
2252 | |||
2253 | case IFF_TAP: | ||
2254 | @@ -1012,7 +1012,6 @@ static void tun_net_init(struct net_device *dev) | ||
2255 | |||
2256 | eth_hw_addr_random(dev); | ||
2257 | |||
2258 | - dev->tx_queue_len = TUN_READQ_SIZE; /* We prefer our own queue length */ | ||
2259 | break; | ||
2260 | } | ||
2261 | } | ||
2262 | @@ -1463,6 +1462,8 @@ static void tun_setup(struct net_device *dev) | ||
2263 | |||
2264 | dev->ethtool_ops = &tun_ethtool_ops; | ||
2265 | dev->destructor = tun_free_netdev; | ||
2266 | + /* We prefer our own queue length */ | ||
2267 | + dev->tx_queue_len = TUN_READQ_SIZE; | ||
2268 | } | ||
2269 | |||
2270 | /* Trivial set of netlink ops to allow deleting tun or tap | ||
2271 | @@ -1804,7 +1805,7 @@ static void tun_detach_filter(struct tun_struct *tun, int n) | ||
2272 | |||
2273 | for (i = 0; i < n; i++) { | ||
2274 | tfile = rtnl_dereference(tun->tfiles[i]); | ||
2275 | - sk_detach_filter(tfile->socket.sk); | ||
2276 | + __sk_detach_filter(tfile->socket.sk, lockdep_rtnl_is_held()); | ||
2277 | } | ||
2278 | |||
2279 | tun->filter_attached = false; | ||
2280 | @@ -1817,7 +1818,8 @@ static int tun_attach_filter(struct tun_struct *tun) | ||
2281 | |||
2282 | for (i = 0; i < tun->numqueues; i++) { | ||
2283 | tfile = rtnl_dereference(tun->tfiles[i]); | ||
2284 | - ret = sk_attach_filter(&tun->fprog, tfile->socket.sk); | ||
2285 | + ret = __sk_attach_filter(&tun->fprog, tfile->socket.sk, | ||
2286 | + lockdep_rtnl_is_held()); | ||
2287 | if (ret) { | ||
2288 | tun_detach_filter(tun, i); | ||
2289 | return ret; | ||
2290 | diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c | ||
2291 | index 3da70bf9936a..7cba2c3759df 100644 | ||
2292 | --- a/drivers/net/usb/cdc_ether.c | ||
2293 | +++ b/drivers/net/usb/cdc_ether.c | ||
2294 | @@ -160,6 +160,12 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) | ||
2295 | info->u = header.usb_cdc_union_desc; | ||
2296 | info->header = header.usb_cdc_header_desc; | ||
2297 | info->ether = header.usb_cdc_ether_desc; | ||
2298 | + if (!info->u) { | ||
2299 | + if (rndis) | ||
2300 | + goto skip; | ||
2301 | + else /* in that case a quirk is mandatory */ | ||
2302 | + goto bad_desc; | ||
2303 | + } | ||
2304 | /* we need a master/control interface (what we're | ||
2305 | * probed with) and a slave/data interface; union | ||
2306 | * descriptors sort this all out. | ||
2307 | @@ -256,7 +262,7 @@ skip: | ||
2308 | goto bad_desc; | ||
2309 | } | ||
2310 | |||
2311 | - } else if (!info->header || !info->u || (!rndis && !info->ether)) { | ||
2312 | + } else if (!info->header || (!rndis && !info->ether)) { | ||
2313 | dev_dbg(&intf->dev, "missing cdc %s%s%sdescriptor\n", | ||
2314 | info->header ? "" : "header ", | ||
2315 | info->u ? "" : "union ", | ||
2316 | diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c | ||
2317 | index e8a1144c5a8b..8c2bb77db049 100644 | ||
2318 | --- a/drivers/net/usb/cdc_ncm.c | ||
2319 | +++ b/drivers/net/usb/cdc_ncm.c | ||
2320 | @@ -794,7 +794,11 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ | ||
2321 | |||
2322 | iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; | ||
2323 | |||
2324 | - /* reset data interface */ | ||
2325 | + /* Reset data interface. Some devices will not reset properly | ||
2326 | + * unless they are configured first. Toggle the altsetting to | ||
2327 | + * force a reset | ||
2328 | + */ | ||
2329 | + usb_set_interface(dev->udev, iface_no, data_altsetting); | ||
2330 | temp = usb_set_interface(dev->udev, iface_no, 0); | ||
2331 | if (temp) { | ||
2332 | dev_dbg(&intf->dev, "set interface failed\n"); | ||
2333 | diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c | ||
2334 | index 982e0acd1a36..a34f491224c1 100644 | ||
2335 | --- a/drivers/net/usb/qmi_wwan.c | ||
2336 | +++ b/drivers/net/usb/qmi_wwan.c | ||
2337 | @@ -699,6 +699,7 @@ static const struct usb_device_id products[] = { | ||
2338 | {QMI_FIXED_INTF(0x19d2, 0x1426, 2)}, /* ZTE MF91 */ | ||
2339 | {QMI_FIXED_INTF(0x19d2, 0x1428, 2)}, /* Telewell TW-LTE 4G v2 */ | ||
2340 | {QMI_FIXED_INTF(0x19d2, 0x2002, 4)}, /* ZTE (Vodafone) K3765-Z */ | ||
2341 | + {QMI_FIXED_INTF(0x2001, 0x7e19, 4)}, /* D-Link DWM-221 B1 */ | ||
2342 | {QMI_FIXED_INTF(0x0f3d, 0x68a2, 8)}, /* Sierra Wireless MC7700 */ | ||
2343 | {QMI_FIXED_INTF(0x114f, 0x68a2, 8)}, /* Sierra Wireless MC7750 */ | ||
2344 | {QMI_FIXED_INTF(0x1199, 0x68a2, 8)}, /* Sierra Wireless MC7710 in QMI mode */ | ||
2345 | @@ -718,8 +719,10 @@ static const struct usb_device_id products[] = { | ||
2346 | {QMI_FIXED_INTF(0x1199, 0x9061, 8)}, /* Sierra Wireless Modem */ | ||
2347 | {QMI_FIXED_INTF(0x1199, 0x9070, 8)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
2348 | {QMI_FIXED_INTF(0x1199, 0x9070, 10)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
2349 | - {QMI_FIXED_INTF(0x1199, 0x9071, 8)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
2350 | - {QMI_FIXED_INTF(0x1199, 0x9071, 10)}, /* Sierra Wireless MC74xx/EM74xx */ | ||
2351 | + {QMI_FIXED_INTF(0x1199, 0x9071, 8)}, /* Sierra Wireless MC74xx */ | ||
2352 | + {QMI_FIXED_INTF(0x1199, 0x9071, 10)}, /* Sierra Wireless MC74xx */ | ||
2353 | + {QMI_FIXED_INTF(0x1199, 0x9079, 8)}, /* Sierra Wireless EM74xx */ | ||
2354 | + {QMI_FIXED_INTF(0x1199, 0x9079, 10)}, /* Sierra Wireless EM74xx */ | ||
2355 | {QMI_FIXED_INTF(0x1bbb, 0x011e, 4)}, /* Telekom Speedstick LTE II (Alcatel One Touch L100V LTE) */ | ||
2356 | {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ | ||
2357 | {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ | ||
2358 | diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c | ||
2359 | index 0744bf2ef2d6..c2ea4e5666fb 100644 | ||
2360 | --- a/drivers/net/usb/usbnet.c | ||
2361 | +++ b/drivers/net/usb/usbnet.c | ||
2362 | @@ -1766,6 +1766,13 @@ out3: | ||
2363 | if (info->unbind) | ||
2364 | info->unbind (dev, udev); | ||
2365 | out1: | ||
2366 | + /* subdrivers must undo all they did in bind() if they | ||
2367 | + * fail it, but we may fail later and a deferred kevent | ||
2368 | + * may trigger an error resubmitting itself and, worse, | ||
2369 | + * schedule a timer. So we kill it all just in case. | ||
2370 | + */ | ||
2371 | + cancel_work_sync(&dev->kevent); | ||
2372 | + del_timer_sync(&dev->delay); | ||
2373 | free_netdev(net); | ||
2374 | out: | ||
2375 | return status; | ||
2376 | diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c | ||
2377 | index 0a242b200df4..903bda437839 100644 | ||
2378 | --- a/drivers/net/vrf.c | ||
2379 | +++ b/drivers/net/vrf.c | ||
2380 | @@ -114,20 +114,23 @@ static struct dst_ops vrf_dst_ops = { | ||
2381 | #if IS_ENABLED(CONFIG_IPV6) | ||
2382 | static bool check_ipv6_frame(const struct sk_buff *skb) | ||
2383 | { | ||
2384 | - const struct ipv6hdr *ipv6h = (struct ipv6hdr *)skb->data; | ||
2385 | - size_t hlen = sizeof(*ipv6h); | ||
2386 | + const struct ipv6hdr *ipv6h; | ||
2387 | + struct ipv6hdr _ipv6h; | ||
2388 | bool rc = true; | ||
2389 | |||
2390 | - if (skb->len < hlen) | ||
2391 | + ipv6h = skb_header_pointer(skb, 0, sizeof(_ipv6h), &_ipv6h); | ||
2392 | + if (!ipv6h) | ||
2393 | goto out; | ||
2394 | |||
2395 | if (ipv6h->nexthdr == NEXTHDR_ICMP) { | ||
2396 | const struct icmp6hdr *icmph; | ||
2397 | + struct icmp6hdr _icmph; | ||
2398 | |||
2399 | - if (skb->len < hlen + sizeof(*icmph)) | ||
2400 | + icmph = skb_header_pointer(skb, sizeof(_ipv6h), | ||
2401 | + sizeof(_icmph), &_icmph); | ||
2402 | + if (!icmph) | ||
2403 | goto out; | ||
2404 | |||
2405 | - icmph = (struct icmp6hdr *)(skb->data + sizeof(*ipv6h)); | ||
2406 | switch (icmph->icmp6_type) { | ||
2407 | case NDISC_ROUTER_SOLICITATION: | ||
2408 | case NDISC_ROUTER_ADVERTISEMENT: | ||
2409 | diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c | ||
2410 | index e0fcda4ddd55..3c0df70e2f53 100644 | ||
2411 | --- a/drivers/net/vxlan.c | ||
2412 | +++ b/drivers/net/vxlan.c | ||
2413 | @@ -1306,8 +1306,10 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | ||
2414 | gbp = (struct vxlanhdr_gbp *)vxh; | ||
2415 | md->gbp = ntohs(gbp->policy_id); | ||
2416 | |||
2417 | - if (tun_dst) | ||
2418 | + if (tun_dst) { | ||
2419 | tun_dst->u.tun_info.key.tun_flags |= TUNNEL_VXLAN_OPT; | ||
2420 | + tun_dst->u.tun_info.options_len = sizeof(*md); | ||
2421 | + } | ||
2422 | |||
2423 | if (gbp->dont_learn) | ||
2424 | md->gbp |= VXLAN_GBP_DONT_LEARN; | ||
2425 | diff --git a/drivers/net/wan/farsync.c b/drivers/net/wan/farsync.c | ||
2426 | index 44541dbc5c28..69b994f3b8c5 100644 | ||
2427 | --- a/drivers/net/wan/farsync.c | ||
2428 | +++ b/drivers/net/wan/farsync.c | ||
2429 | @@ -2516,7 +2516,7 @@ fst_add_one(struct pci_dev *pdev, const struct pci_device_id *ent) | ||
2430 | dev->mem_start = card->phys_mem | ||
2431 | + BUF_OFFSET ( txBuffer[i][0][0]); | ||
2432 | dev->mem_end = card->phys_mem | ||
2433 | - + BUF_OFFSET ( txBuffer[i][NUM_TX_BUFFER][0]); | ||
2434 | + + BUF_OFFSET ( txBuffer[i][NUM_TX_BUFFER - 1][LEN_RX_BUFFER - 1]); | ||
2435 | dev->base_addr = card->pci_conf; | ||
2436 | dev->irq = card->irq; | ||
2437 | |||
2438 | diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c | ||
2439 | index cc81482c934d..113a43fca9cf 100644 | ||
2440 | --- a/drivers/net/wireless/ath/ath9k/eeprom.c | ||
2441 | +++ b/drivers/net/wireless/ath/ath9k/eeprom.c | ||
2442 | @@ -403,10 +403,9 @@ void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, | ||
2443 | |||
2444 | if (match) { | ||
2445 | if (AR_SREV_9287(ah)) { | ||
2446 | - /* FIXME: array overrun? */ | ||
2447 | for (i = 0; i < numXpdGains; i++) { | ||
2448 | minPwrT4[i] = data_9287[idxL].pwrPdg[i][0]; | ||
2449 | - maxPwrT4[i] = data_9287[idxL].pwrPdg[i][4]; | ||
2450 | + maxPwrT4[i] = data_9287[idxL].pwrPdg[i][intercepts - 1]; | ||
2451 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
2452 | data_9287[idxL].pwrPdg[i], | ||
2453 | data_9287[idxL].vpdPdg[i], | ||
2454 | @@ -416,7 +415,7 @@ void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, | ||
2455 | } else if (eeprom_4k) { | ||
2456 | for (i = 0; i < numXpdGains; i++) { | ||
2457 | minPwrT4[i] = data_4k[idxL].pwrPdg[i][0]; | ||
2458 | - maxPwrT4[i] = data_4k[idxL].pwrPdg[i][4]; | ||
2459 | + maxPwrT4[i] = data_4k[idxL].pwrPdg[i][intercepts - 1]; | ||
2460 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
2461 | data_4k[idxL].pwrPdg[i], | ||
2462 | data_4k[idxL].vpdPdg[i], | ||
2463 | @@ -426,7 +425,7 @@ void ath9k_hw_get_gain_boundaries_pdadcs(struct ath_hw *ah, | ||
2464 | } else { | ||
2465 | for (i = 0; i < numXpdGains; i++) { | ||
2466 | minPwrT4[i] = data_def[idxL].pwrPdg[i][0]; | ||
2467 | - maxPwrT4[i] = data_def[idxL].pwrPdg[i][4]; | ||
2468 | + maxPwrT4[i] = data_def[idxL].pwrPdg[i][intercepts - 1]; | ||
2469 | ath9k_hw_fill_vpd_table(minPwrT4[i], maxPwrT4[i], | ||
2470 | data_def[idxL].pwrPdg[i], | ||
2471 | data_def[idxL].vpdPdg[i], | ||
2472 | diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c | ||
2473 | index 496b9b662dc6..5f47356d6942 100644 | ||
2474 | --- a/drivers/nvdimm/bus.c | ||
2475 | +++ b/drivers/nvdimm/bus.c | ||
2476 | @@ -335,7 +335,7 @@ static const struct nd_cmd_desc __nd_cmd_dimm_descs[] = { | ||
2477 | [ND_CMD_IMPLEMENTED] = { }, | ||
2478 | [ND_CMD_SMART] = { | ||
2479 | .out_num = 2, | ||
2480 | - .out_sizes = { 4, 8, }, | ||
2481 | + .out_sizes = { 4, 128, }, | ||
2482 | }, | ||
2483 | [ND_CMD_SMART_THRESHOLD] = { | ||
2484 | .out_num = 2, | ||
2485 | diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c | ||
2486 | index 71805a1aa0f3..9d3974591cd6 100644 | ||
2487 | --- a/drivers/nvdimm/pfn_devs.c | ||
2488 | +++ b/drivers/nvdimm/pfn_devs.c | ||
2489 | @@ -275,7 +275,7 @@ int nd_pfn_validate(struct nd_pfn *nd_pfn) | ||
2490 | } else { | ||
2491 | /* from init we validate */ | ||
2492 | if (memcmp(nd_pfn->uuid, pfn_sb->uuid, 16) != 0) | ||
2493 | - return -EINVAL; | ||
2494 | + return -ENODEV; | ||
2495 | } | ||
2496 | |||
2497 | /* | ||
2498 | diff --git a/drivers/pcmcia/db1xxx_ss.c b/drivers/pcmcia/db1xxx_ss.c | ||
2499 | index 4c2fa05b4589..944674ee3464 100644 | ||
2500 | --- a/drivers/pcmcia/db1xxx_ss.c | ||
2501 | +++ b/drivers/pcmcia/db1xxx_ss.c | ||
2502 | @@ -56,6 +56,7 @@ struct db1x_pcmcia_sock { | ||
2503 | int stschg_irq; /* card-status-change irq */ | ||
2504 | int card_irq; /* card irq */ | ||
2505 | int eject_irq; /* db1200/pb1200 have these */ | ||
2506 | + int insert_gpio; /* db1000 carddetect gpio */ | ||
2507 | |||
2508 | #define BOARD_TYPE_DEFAULT 0 /* most boards */ | ||
2509 | #define BOARD_TYPE_DB1200 1 /* IRQs aren't gpios */ | ||
2510 | @@ -83,7 +84,7 @@ static int db1200_card_inserted(struct db1x_pcmcia_sock *sock) | ||
2511 | /* carddetect gpio: low-active */ | ||
2512 | static int db1000_card_inserted(struct db1x_pcmcia_sock *sock) | ||
2513 | { | ||
2514 | - return !gpio_get_value(irq_to_gpio(sock->insert_irq)); | ||
2515 | + return !gpio_get_value(sock->insert_gpio); | ||
2516 | } | ||
2517 | |||
2518 | static int db1x_card_inserted(struct db1x_pcmcia_sock *sock) | ||
2519 | @@ -457,9 +458,15 @@ static int db1x_pcmcia_socket_probe(struct platform_device *pdev) | ||
2520 | r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "card"); | ||
2521 | sock->card_irq = r ? r->start : 0; | ||
2522 | |||
2523 | - /* insert: irq which triggers on card insertion/ejection */ | ||
2524 | + /* insert: irq which triggers on card insertion/ejection | ||
2525 | + * BIG FAT NOTE: on DB1000/1100/1500/1550 we pass a GPIO here! | ||
2526 | + */ | ||
2527 | r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "insert"); | ||
2528 | sock->insert_irq = r ? r->start : -1; | ||
2529 | + if (sock->board_type == BOARD_TYPE_DEFAULT) { | ||
2530 | + sock->insert_gpio = r ? r->start : -1; | ||
2531 | + sock->insert_irq = r ? gpio_to_irq(r->start) : -1; | ||
2532 | + } | ||
2533 | |||
2534 | /* stschg: irq which trigger on card status change (optional) */ | ||
2535 | r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "stschg"); | ||
2536 | diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c | ||
2537 | index a5bb93987378..1029aa7889b5 100644 | ||
2538 | --- a/drivers/pinctrl/freescale/pinctrl-imx.c | ||
2539 | +++ b/drivers/pinctrl/freescale/pinctrl-imx.c | ||
2540 | @@ -726,19 +726,18 @@ int imx_pinctrl_probe(struct platform_device *pdev, | ||
2541 | |||
2542 | if (of_property_read_bool(dev_np, "fsl,input-sel")) { | ||
2543 | np = of_parse_phandle(dev_np, "fsl,input-sel", 0); | ||
2544 | - if (np) { | ||
2545 | - ipctl->input_sel_base = of_iomap(np, 0); | ||
2546 | - if (IS_ERR(ipctl->input_sel_base)) { | ||
2547 | - of_node_put(np); | ||
2548 | - dev_err(&pdev->dev, | ||
2549 | - "iomuxc input select base address not found\n"); | ||
2550 | - return PTR_ERR(ipctl->input_sel_base); | ||
2551 | - } | ||
2552 | - } else { | ||
2553 | + if (!np) { | ||
2554 | dev_err(&pdev->dev, "iomuxc fsl,input-sel property not found\n"); | ||
2555 | return -EINVAL; | ||
2556 | } | ||
2557 | + | ||
2558 | + ipctl->input_sel_base = of_iomap(np, 0); | ||
2559 | of_node_put(np); | ||
2560 | + if (!ipctl->input_sel_base) { | ||
2561 | + dev_err(&pdev->dev, | ||
2562 | + "iomuxc input select base address not found\n"); | ||
2563 | + return -ENOMEM; | ||
2564 | + } | ||
2565 | } | ||
2566 | |||
2567 | imx_pinctrl_desc.name = dev_name(&pdev->dev); | ||
2568 | diff --git a/drivers/pinctrl/nomadik/pinctrl-nomadik.c b/drivers/pinctrl/nomadik/pinctrl-nomadik.c | ||
2569 | index eebfae0c9b7c..f844b4ae7f79 100644 | ||
2570 | --- a/drivers/pinctrl/nomadik/pinctrl-nomadik.c | ||
2571 | +++ b/drivers/pinctrl/nomadik/pinctrl-nomadik.c | ||
2572 | @@ -995,7 +995,7 @@ static void nmk_gpio_dbg_show_one(struct seq_file *s, | ||
2573 | int val; | ||
2574 | |||
2575 | if (pull) | ||
2576 | - pullidx = data_out ? 1 : 2; | ||
2577 | + pullidx = data_out ? 2 : 1; | ||
2578 | |||
2579 | seq_printf(s, " gpio-%-3d (%-20.20s) in %s %s", | ||
2580 | gpio, | ||
2581 | diff --git a/drivers/pinctrl/pinctrl-pistachio.c b/drivers/pinctrl/pinctrl-pistachio.c | ||
2582 | index 85c9046c690e..6b1a47f8c096 100644 | ||
2583 | --- a/drivers/pinctrl/pinctrl-pistachio.c | ||
2584 | +++ b/drivers/pinctrl/pinctrl-pistachio.c | ||
2585 | @@ -469,27 +469,27 @@ static const char * const pistachio_mips_pll_lock_groups[] = { | ||
2586 | "mfio83", | ||
2587 | }; | ||
2588 | |||
2589 | -static const char * const pistachio_sys_pll_lock_groups[] = { | ||
2590 | +static const char * const pistachio_audio_pll_lock_groups[] = { | ||
2591 | "mfio84", | ||
2592 | }; | ||
2593 | |||
2594 | -static const char * const pistachio_wifi_pll_lock_groups[] = { | ||
2595 | +static const char * const pistachio_rpu_v_pll_lock_groups[] = { | ||
2596 | "mfio85", | ||
2597 | }; | ||
2598 | |||
2599 | -static const char * const pistachio_bt_pll_lock_groups[] = { | ||
2600 | +static const char * const pistachio_rpu_l_pll_lock_groups[] = { | ||
2601 | "mfio86", | ||
2602 | }; | ||
2603 | |||
2604 | -static const char * const pistachio_rpu_v_pll_lock_groups[] = { | ||
2605 | +static const char * const pistachio_sys_pll_lock_groups[] = { | ||
2606 | "mfio87", | ||
2607 | }; | ||
2608 | |||
2609 | -static const char * const pistachio_rpu_l_pll_lock_groups[] = { | ||
2610 | +static const char * const pistachio_wifi_pll_lock_groups[] = { | ||
2611 | "mfio88", | ||
2612 | }; | ||
2613 | |||
2614 | -static const char * const pistachio_audio_pll_lock_groups[] = { | ||
2615 | +static const char * const pistachio_bt_pll_lock_groups[] = { | ||
2616 | "mfio89", | ||
2617 | }; | ||
2618 | |||
2619 | @@ -559,12 +559,12 @@ enum pistachio_mux_option { | ||
2620 | PISTACHIO_FUNCTION_DREQ4, | ||
2621 | PISTACHIO_FUNCTION_DREQ5, | ||
2622 | PISTACHIO_FUNCTION_MIPS_PLL_LOCK, | ||
2623 | + PISTACHIO_FUNCTION_AUDIO_PLL_LOCK, | ||
2624 | + PISTACHIO_FUNCTION_RPU_V_PLL_LOCK, | ||
2625 | + PISTACHIO_FUNCTION_RPU_L_PLL_LOCK, | ||
2626 | PISTACHIO_FUNCTION_SYS_PLL_LOCK, | ||
2627 | PISTACHIO_FUNCTION_WIFI_PLL_LOCK, | ||
2628 | PISTACHIO_FUNCTION_BT_PLL_LOCK, | ||
2629 | - PISTACHIO_FUNCTION_RPU_V_PLL_LOCK, | ||
2630 | - PISTACHIO_FUNCTION_RPU_L_PLL_LOCK, | ||
2631 | - PISTACHIO_FUNCTION_AUDIO_PLL_LOCK, | ||
2632 | PISTACHIO_FUNCTION_DEBUG_RAW_CCA_IND, | ||
2633 | PISTACHIO_FUNCTION_DEBUG_ED_SEC20_CCA_IND, | ||
2634 | PISTACHIO_FUNCTION_DEBUG_ED_SEC40_CCA_IND, | ||
2635 | @@ -620,12 +620,12 @@ static const struct pistachio_function pistachio_functions[] = { | ||
2636 | FUNCTION(dreq4), | ||
2637 | FUNCTION(dreq5), | ||
2638 | FUNCTION(mips_pll_lock), | ||
2639 | + FUNCTION(audio_pll_lock), | ||
2640 | + FUNCTION(rpu_v_pll_lock), | ||
2641 | + FUNCTION(rpu_l_pll_lock), | ||
2642 | FUNCTION(sys_pll_lock), | ||
2643 | FUNCTION(wifi_pll_lock), | ||
2644 | FUNCTION(bt_pll_lock), | ||
2645 | - FUNCTION(rpu_v_pll_lock), | ||
2646 | - FUNCTION(rpu_l_pll_lock), | ||
2647 | - FUNCTION(audio_pll_lock), | ||
2648 | FUNCTION(debug_raw_cca_ind), | ||
2649 | FUNCTION(debug_ed_sec20_cca_ind), | ||
2650 | FUNCTION(debug_ed_sec40_cca_ind), | ||
2651 | diff --git a/drivers/pinctrl/sh-pfc/core.c b/drivers/pinctrl/sh-pfc/core.c | ||
2652 | index 181ea98a63b7..2b0d70217bbd 100644 | ||
2653 | --- a/drivers/pinctrl/sh-pfc/core.c | ||
2654 | +++ b/drivers/pinctrl/sh-pfc/core.c | ||
2655 | @@ -545,7 +545,9 @@ static int sh_pfc_probe(struct platform_device *pdev) | ||
2656 | return ret; | ||
2657 | } | ||
2658 | |||
2659 | - pinctrl_provide_dummies(); | ||
2660 | + /* Enable dummy states for those platforms without pinctrl support */ | ||
2661 | + if (!of_have_populated_dt()) | ||
2662 | + pinctrl_provide_dummies(); | ||
2663 | |||
2664 | ret = sh_pfc_init_ranges(pfc); | ||
2665 | if (ret < 0) | ||
2666 | diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | ||
2667 | index 00265f0435a7..8b381d69df86 100644 | ||
2668 | --- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | ||
2669 | +++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | ||
2670 | @@ -485,6 +485,7 @@ static const struct sunxi_pinctrl_desc sun8i_a33_pinctrl_data = { | ||
2671 | .pins = sun8i_a33_pins, | ||
2672 | .npins = ARRAY_SIZE(sun8i_a33_pins), | ||
2673 | .irq_banks = 2, | ||
2674 | + .irq_bank_base = 1, | ||
2675 | }; | ||
2676 | |||
2677 | static int sun8i_a33_pinctrl_probe(struct platform_device *pdev) | ||
2678 | diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.c b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
2679 | index dead97daca35..a4a5b504c532 100644 | ||
2680 | --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
2681 | +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.c | ||
2682 | @@ -578,7 +578,7 @@ static void sunxi_pinctrl_irq_release_resources(struct irq_data *d) | ||
2683 | static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) | ||
2684 | { | ||
2685 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | ||
2686 | - u32 reg = sunxi_irq_cfg_reg(d->hwirq); | ||
2687 | + u32 reg = sunxi_irq_cfg_reg(d->hwirq, pctl->desc->irq_bank_base); | ||
2688 | u8 index = sunxi_irq_cfg_offset(d->hwirq); | ||
2689 | unsigned long flags; | ||
2690 | u32 regval; | ||
2691 | @@ -625,7 +625,8 @@ static int sunxi_pinctrl_irq_set_type(struct irq_data *d, unsigned int type) | ||
2692 | static void sunxi_pinctrl_irq_ack(struct irq_data *d) | ||
2693 | { | ||
2694 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | ||
2695 | - u32 status_reg = sunxi_irq_status_reg(d->hwirq); | ||
2696 | + u32 status_reg = sunxi_irq_status_reg(d->hwirq, | ||
2697 | + pctl->desc->irq_bank_base); | ||
2698 | u8 status_idx = sunxi_irq_status_offset(d->hwirq); | ||
2699 | |||
2700 | /* Clear the IRQ */ | ||
2701 | @@ -635,7 +636,7 @@ static void sunxi_pinctrl_irq_ack(struct irq_data *d) | ||
2702 | static void sunxi_pinctrl_irq_mask(struct irq_data *d) | ||
2703 | { | ||
2704 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | ||
2705 | - u32 reg = sunxi_irq_ctrl_reg(d->hwirq); | ||
2706 | + u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base); | ||
2707 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); | ||
2708 | unsigned long flags; | ||
2709 | u32 val; | ||
2710 | @@ -652,7 +653,7 @@ static void sunxi_pinctrl_irq_mask(struct irq_data *d) | ||
2711 | static void sunxi_pinctrl_irq_unmask(struct irq_data *d) | ||
2712 | { | ||
2713 | struct sunxi_pinctrl *pctl = irq_data_get_irq_chip_data(d); | ||
2714 | - u32 reg = sunxi_irq_ctrl_reg(d->hwirq); | ||
2715 | + u32 reg = sunxi_irq_ctrl_reg(d->hwirq, pctl->desc->irq_bank_base); | ||
2716 | u8 idx = sunxi_irq_ctrl_offset(d->hwirq); | ||
2717 | unsigned long flags; | ||
2718 | u32 val; | ||
2719 | @@ -744,7 +745,7 @@ static void sunxi_pinctrl_irq_handler(struct irq_desc *desc) | ||
2720 | if (bank == pctl->desc->irq_banks) | ||
2721 | return; | ||
2722 | |||
2723 | - reg = sunxi_irq_status_reg_from_bank(bank); | ||
2724 | + reg = sunxi_irq_status_reg_from_bank(bank, pctl->desc->irq_bank_base); | ||
2725 | val = readl(pctl->membase + reg); | ||
2726 | |||
2727 | if (val) { | ||
2728 | @@ -1023,9 +1024,11 @@ int sunxi_pinctrl_init(struct platform_device *pdev, | ||
2729 | |||
2730 | for (i = 0; i < pctl->desc->irq_banks; i++) { | ||
2731 | /* Mask and clear all IRQs before registering a handler */ | ||
2732 | - writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i)); | ||
2733 | + writel(0, pctl->membase + sunxi_irq_ctrl_reg_from_bank(i, | ||
2734 | + pctl->desc->irq_bank_base)); | ||
2735 | writel(0xffffffff, | ||
2736 | - pctl->membase + sunxi_irq_status_reg_from_bank(i)); | ||
2737 | + pctl->membase + sunxi_irq_status_reg_from_bank(i, | ||
2738 | + pctl->desc->irq_bank_base)); | ||
2739 | |||
2740 | irq_set_chained_handler_and_data(pctl->irq[i], | ||
2741 | sunxi_pinctrl_irq_handler, | ||
2742 | diff --git a/drivers/pinctrl/sunxi/pinctrl-sunxi.h b/drivers/pinctrl/sunxi/pinctrl-sunxi.h | ||
2743 | index e248e81a0f9e..0afce1ab12d0 100644 | ||
2744 | --- a/drivers/pinctrl/sunxi/pinctrl-sunxi.h | ||
2745 | +++ b/drivers/pinctrl/sunxi/pinctrl-sunxi.h | ||
2746 | @@ -97,6 +97,7 @@ struct sunxi_pinctrl_desc { | ||
2747 | int npins; | ||
2748 | unsigned pin_base; | ||
2749 | unsigned irq_banks; | ||
2750 | + unsigned irq_bank_base; | ||
2751 | bool irq_read_needs_mux; | ||
2752 | }; | ||
2753 | |||
2754 | @@ -233,12 +234,12 @@ static inline u32 sunxi_pull_offset(u16 pin) | ||
2755 | return pin_num * PULL_PINS_BITS; | ||
2756 | } | ||
2757 | |||
2758 | -static inline u32 sunxi_irq_cfg_reg(u16 irq) | ||
2759 | +static inline u32 sunxi_irq_cfg_reg(u16 irq, unsigned bank_base) | ||
2760 | { | ||
2761 | u8 bank = irq / IRQ_PER_BANK; | ||
2762 | u8 reg = (irq % IRQ_PER_BANK) / IRQ_CFG_IRQ_PER_REG * 0x04; | ||
2763 | |||
2764 | - return IRQ_CFG_REG + bank * IRQ_MEM_SIZE + reg; | ||
2765 | + return IRQ_CFG_REG + (bank_base + bank) * IRQ_MEM_SIZE + reg; | ||
2766 | } | ||
2767 | |||
2768 | static inline u32 sunxi_irq_cfg_offset(u16 irq) | ||
2769 | @@ -247,16 +248,16 @@ static inline u32 sunxi_irq_cfg_offset(u16 irq) | ||
2770 | return irq_num * IRQ_CFG_IRQ_BITS; | ||
2771 | } | ||
2772 | |||
2773 | -static inline u32 sunxi_irq_ctrl_reg_from_bank(u8 bank) | ||
2774 | +static inline u32 sunxi_irq_ctrl_reg_from_bank(u8 bank, unsigned bank_base) | ||
2775 | { | ||
2776 | - return IRQ_CTRL_REG + bank * IRQ_MEM_SIZE; | ||
2777 | + return IRQ_CTRL_REG + (bank_base + bank) * IRQ_MEM_SIZE; | ||
2778 | } | ||
2779 | |||
2780 | -static inline u32 sunxi_irq_ctrl_reg(u16 irq) | ||
2781 | +static inline u32 sunxi_irq_ctrl_reg(u16 irq, unsigned bank_base) | ||
2782 | { | ||
2783 | u8 bank = irq / IRQ_PER_BANK; | ||
2784 | |||
2785 | - return sunxi_irq_ctrl_reg_from_bank(bank); | ||
2786 | + return sunxi_irq_ctrl_reg_from_bank(bank, bank_base); | ||
2787 | } | ||
2788 | |||
2789 | static inline u32 sunxi_irq_ctrl_offset(u16 irq) | ||
2790 | @@ -265,16 +266,16 @@ static inline u32 sunxi_irq_ctrl_offset(u16 irq) | ||
2791 | return irq_num * IRQ_CTRL_IRQ_BITS; | ||
2792 | } | ||
2793 | |||
2794 | -static inline u32 sunxi_irq_status_reg_from_bank(u8 bank) | ||
2795 | +static inline u32 sunxi_irq_status_reg_from_bank(u8 bank, unsigned bank_base) | ||
2796 | { | ||
2797 | - return IRQ_STATUS_REG + bank * IRQ_MEM_SIZE; | ||
2798 | + return IRQ_STATUS_REG + (bank_base + bank) * IRQ_MEM_SIZE; | ||
2799 | } | ||
2800 | |||
2801 | -static inline u32 sunxi_irq_status_reg(u16 irq) | ||
2802 | +static inline u32 sunxi_irq_status_reg(u16 irq, unsigned bank_base) | ||
2803 | { | ||
2804 | u8 bank = irq / IRQ_PER_BANK; | ||
2805 | |||
2806 | - return sunxi_irq_status_reg_from_bank(bank); | ||
2807 | + return sunxi_irq_status_reg_from_bank(bank, bank_base); | ||
2808 | } | ||
2809 | |||
2810 | static inline u32 sunxi_irq_status_offset(u16 irq) | ||
2811 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
2812 | index cc84ea7d09cc..0d7c6e86f149 100644 | ||
2813 | --- a/drivers/scsi/sd.c | ||
2814 | +++ b/drivers/scsi/sd.c | ||
2815 | @@ -1275,18 +1275,19 @@ static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | ||
2816 | struct scsi_disk *sdkp = scsi_disk(bdev->bd_disk); | ||
2817 | struct scsi_device *sdp = sdkp->device; | ||
2818 | struct Scsi_Host *host = sdp->host; | ||
2819 | + sector_t capacity = logical_to_sectors(sdp, sdkp->capacity); | ||
2820 | int diskinfo[4]; | ||
2821 | |||
2822 | /* default to most commonly used values */ | ||
2823 | - diskinfo[0] = 0x40; /* 1 << 6 */ | ||
2824 | - diskinfo[1] = 0x20; /* 1 << 5 */ | ||
2825 | - diskinfo[2] = sdkp->capacity >> 11; | ||
2826 | - | ||
2827 | + diskinfo[0] = 0x40; /* 1 << 6 */ | ||
2828 | + diskinfo[1] = 0x20; /* 1 << 5 */ | ||
2829 | + diskinfo[2] = capacity >> 11; | ||
2830 | + | ||
2831 | /* override with calculated, extended default, or driver values */ | ||
2832 | if (host->hostt->bios_param) | ||
2833 | - host->hostt->bios_param(sdp, bdev, sdkp->capacity, diskinfo); | ||
2834 | + host->hostt->bios_param(sdp, bdev, capacity, diskinfo); | ||
2835 | else | ||
2836 | - scsicam_bios_param(bdev, sdkp->capacity, diskinfo); | ||
2837 | + scsicam_bios_param(bdev, capacity, diskinfo); | ||
2838 | |||
2839 | geo->heads = diskinfo[0]; | ||
2840 | geo->sectors = diskinfo[1]; | ||
2841 | @@ -2337,14 +2338,6 @@ got_data: | ||
2842 | if (sdkp->capacity > 0xffffffff) | ||
2843 | sdp->use_16_for_rw = 1; | ||
2844 | |||
2845 | - /* Rescale capacity to 512-byte units */ | ||
2846 | - if (sector_size == 4096) | ||
2847 | - sdkp->capacity <<= 3; | ||
2848 | - else if (sector_size == 2048) | ||
2849 | - sdkp->capacity <<= 2; | ||
2850 | - else if (sector_size == 1024) | ||
2851 | - sdkp->capacity <<= 1; | ||
2852 | - | ||
2853 | blk_queue_physical_block_size(sdp->request_queue, | ||
2854 | sdkp->physical_block_size); | ||
2855 | sdkp->device->sector_size = sector_size; | ||
2856 | @@ -2812,11 +2805,6 @@ static int sd_try_extended_inquiry(struct scsi_device *sdp) | ||
2857 | return 0; | ||
2858 | } | ||
2859 | |||
2860 | -static inline u32 logical_to_sectors(struct scsi_device *sdev, u32 blocks) | ||
2861 | -{ | ||
2862 | - return blocks << (ilog2(sdev->sector_size) - 9); | ||
2863 | -} | ||
2864 | - | ||
2865 | /** | ||
2866 | * sd_revalidate_disk - called the first time a new disk is seen, | ||
2867 | * performs disk spin up, read_capacity, etc. | ||
2868 | @@ -2900,7 +2888,7 @@ static int sd_revalidate_disk(struct gendisk *disk) | ||
2869 | /* Combine with controller limits */ | ||
2870 | q->limits.max_sectors = min(rw_max, queue_max_hw_sectors(q)); | ||
2871 | |||
2872 | - set_capacity(disk, sdkp->capacity); | ||
2873 | + set_capacity(disk, logical_to_sectors(sdp, sdkp->capacity)); | ||
2874 | sd_config_write_same(sdkp); | ||
2875 | kfree(buffer); | ||
2876 | |||
2877 | diff --git a/drivers/scsi/sd.h b/drivers/scsi/sd.h | ||
2878 | index 5f2a84aff29f..654630bb7d0e 100644 | ||
2879 | --- a/drivers/scsi/sd.h | ||
2880 | +++ b/drivers/scsi/sd.h | ||
2881 | @@ -65,7 +65,7 @@ struct scsi_disk { | ||
2882 | struct device dev; | ||
2883 | struct gendisk *disk; | ||
2884 | atomic_t openers; | ||
2885 | - sector_t capacity; /* size in 512-byte sectors */ | ||
2886 | + sector_t capacity; /* size in logical blocks */ | ||
2887 | u32 max_xfer_blocks; | ||
2888 | u32 opt_xfer_blocks; | ||
2889 | u32 max_ws_blocks; | ||
2890 | @@ -146,6 +146,11 @@ static inline int scsi_medium_access_command(struct scsi_cmnd *scmd) | ||
2891 | return 0; | ||
2892 | } | ||
2893 | |||
2894 | +static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks) | ||
2895 | +{ | ||
2896 | + return blocks << (ilog2(sdev->sector_size) - 9); | ||
2897 | +} | ||
2898 | + | ||
2899 | /* | ||
2900 | * A DIF-capable target device can be formatted with different | ||
2901 | * protection schemes. Currently 0 through 3 are defined: | ||
2902 | diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c | ||
2903 | index e237e9f3312d..df560216d702 100644 | ||
2904 | --- a/drivers/staging/android/ion/ion.c | ||
2905 | +++ b/drivers/staging/android/ion/ion.c | ||
2906 | @@ -251,8 +251,10 @@ static struct ion_buffer *ion_buffer_create(struct ion_heap *heap, | ||
2907 | * memory coming from the heaps is ready for dma, ie if it has a | ||
2908 | * cached mapping that mapping has been invalidated | ||
2909 | */ | ||
2910 | - for_each_sg(buffer->sg_table->sgl, sg, buffer->sg_table->nents, i) | ||
2911 | + for_each_sg(buffer->sg_table->sgl, sg, buffer->sg_table->nents, i) { | ||
2912 | sg_dma_address(sg) = sg_phys(sg); | ||
2913 | + sg_dma_len(sg) = sg->length; | ||
2914 | + } | ||
2915 | mutex_lock(&dev->buffer_lock); | ||
2916 | ion_buffer_add(dev, buffer); | ||
2917 | mutex_unlock(&dev->buffer_lock); | ||
2918 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
2919 | index 2a274884c7ea..84df093639ac 100644 | ||
2920 | --- a/drivers/usb/core/hub.c | ||
2921 | +++ b/drivers/usb/core/hub.c | ||
2922 | @@ -5392,6 +5392,7 @@ static int usb_reset_and_verify_device(struct usb_device *udev) | ||
2923 | } | ||
2924 | |||
2925 | bos = udev->bos; | ||
2926 | + udev->bos = NULL; | ||
2927 | |||
2928 | for (i = 0; i < SET_CONFIG_TRIES; ++i) { | ||
2929 | |||
2930 | @@ -5484,11 +5485,8 @@ done: | ||
2931 | usb_set_usb2_hardware_lpm(udev, 1); | ||
2932 | usb_unlocked_enable_lpm(udev); | ||
2933 | usb_enable_ltm(udev); | ||
2934 | - /* release the new BOS descriptor allocated by hub_port_init() */ | ||
2935 | - if (udev->bos != bos) { | ||
2936 | - usb_release_bos_descriptor(udev); | ||
2937 | - udev->bos = bos; | ||
2938 | - } | ||
2939 | + usb_release_bos_descriptor(udev); | ||
2940 | + udev->bos = bos; | ||
2941 | return 0; | ||
2942 | |||
2943 | re_enumerate: | ||
2944 | diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c | ||
2945 | index c0f5c652d272..f1893e08e51a 100644 | ||
2946 | --- a/drivers/usb/renesas_usbhs/fifo.c | ||
2947 | +++ b/drivers/usb/renesas_usbhs/fifo.c | ||
2948 | @@ -190,7 +190,8 @@ static int usbhsf_pkt_handler(struct usbhs_pipe *pipe, int type) | ||
2949 | goto __usbhs_pkt_handler_end; | ||
2950 | } | ||
2951 | |||
2952 | - ret = func(pkt, &is_done); | ||
2953 | + if (likely(func)) | ||
2954 | + ret = func(pkt, &is_done); | ||
2955 | |||
2956 | if (is_done) | ||
2957 | __usbhsf_pkt_del(pkt); | ||
2958 | @@ -889,6 +890,7 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) | ||
2959 | |||
2960 | pkt->trans = len; | ||
2961 | |||
2962 | + usbhsf_tx_irq_ctrl(pipe, 0); | ||
2963 | INIT_WORK(&pkt->work, xfer_work); | ||
2964 | schedule_work(&pkt->work); | ||
2965 | |||
2966 | diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2967 | index 8f7a78e70975..fa14198daf77 100644 | ||
2968 | --- a/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2969 | +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | ||
2970 | @@ -158,10 +158,14 @@ static void usbhsg_queue_done(struct usbhs_priv *priv, struct usbhs_pkt *pkt) | ||
2971 | struct usbhs_pipe *pipe = pkt->pipe; | ||
2972 | struct usbhsg_uep *uep = usbhsg_pipe_to_uep(pipe); | ||
2973 | struct usbhsg_request *ureq = usbhsg_pkt_to_ureq(pkt); | ||
2974 | + unsigned long flags; | ||
2975 | |||
2976 | ureq->req.actual = pkt->actual; | ||
2977 | |||
2978 | - usbhsg_queue_pop(uep, ureq, 0); | ||
2979 | + usbhs_lock(priv, flags); | ||
2980 | + if (uep) | ||
2981 | + __usbhsg_queue_pop(uep, ureq, 0); | ||
2982 | + usbhs_unlock(priv, flags); | ||
2983 | } | ||
2984 | |||
2985 | static void usbhsg_queue_push(struct usbhsg_uep *uep, | ||
2986 | diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c | ||
2987 | index ce0cd6e20d4f..9baf081174ce 100644 | ||
2988 | --- a/drivers/usb/storage/uas.c | ||
2989 | +++ b/drivers/usb/storage/uas.c | ||
2990 | @@ -2,7 +2,7 @@ | ||
2991 | * USB Attached SCSI | ||
2992 | * Note that this is not the same as the USB Mass Storage driver | ||
2993 | * | ||
2994 | - * Copyright Hans de Goede <hdegoede@redhat.com> for Red Hat, Inc. 2013 - 2014 | ||
2995 | + * Copyright Hans de Goede <hdegoede@redhat.com> for Red Hat, Inc. 2013 - 2016 | ||
2996 | * Copyright Matthew Wilcox for Intel Corp, 2010 | ||
2997 | * Copyright Sarah Sharp for Intel Corp, 2010 | ||
2998 | * | ||
2999 | @@ -757,6 +757,17 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd) | ||
3000 | return SUCCESS; | ||
3001 | } | ||
3002 | |||
3003 | +static int uas_target_alloc(struct scsi_target *starget) | ||
3004 | +{ | ||
3005 | + struct uas_dev_info *devinfo = (struct uas_dev_info *) | ||
3006 | + dev_to_shost(starget->dev.parent)->hostdata; | ||
3007 | + | ||
3008 | + if (devinfo->flags & US_FL_NO_REPORT_LUNS) | ||
3009 | + starget->no_report_luns = 1; | ||
3010 | + | ||
3011 | + return 0; | ||
3012 | +} | ||
3013 | + | ||
3014 | static int uas_slave_alloc(struct scsi_device *sdev) | ||
3015 | { | ||
3016 | struct uas_dev_info *devinfo = | ||
3017 | @@ -800,7 +811,6 @@ static int uas_slave_configure(struct scsi_device *sdev) | ||
3018 | if (devinfo->flags & US_FL_BROKEN_FUA) | ||
3019 | sdev->broken_fua = 1; | ||
3020 | |||
3021 | - scsi_change_queue_depth(sdev, devinfo->qdepth - 2); | ||
3022 | return 0; | ||
3023 | } | ||
3024 | |||
3025 | @@ -808,6 +818,7 @@ static struct scsi_host_template uas_host_template = { | ||
3026 | .module = THIS_MODULE, | ||
3027 | .name = "uas", | ||
3028 | .queuecommand = uas_queuecommand, | ||
3029 | + .target_alloc = uas_target_alloc, | ||
3030 | .slave_alloc = uas_slave_alloc, | ||
3031 | .slave_configure = uas_slave_configure, | ||
3032 | .eh_abort_handler = uas_eh_abort_handler, | ||
3033 | @@ -932,6 +943,12 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id) | ||
3034 | if (result) | ||
3035 | goto set_alt0; | ||
3036 | |||
3037 | + /* | ||
3038 | + * 1 tag is reserved for untagged commands + | ||
3039 | + * 1 tag to avoid off by one errors in some bridge firmwares | ||
3040 | + */ | ||
3041 | + shost->can_queue = devinfo->qdepth - 2; | ||
3042 | + | ||
3043 | usb_set_intfdata(intf, shost); | ||
3044 | result = scsi_add_host(shost, &intf->dev); | ||
3045 | if (result) | ||
3046 | diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h | ||
3047 | index ccc113e83d88..53341a77d89f 100644 | ||
3048 | --- a/drivers/usb/storage/unusual_uas.h | ||
3049 | +++ b/drivers/usb/storage/unusual_uas.h | ||
3050 | @@ -64,6 +64,13 @@ UNUSUAL_DEV(0x0bc2, 0x3312, 0x0000, 0x9999, | ||
3051 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3052 | US_FL_NO_ATA_1X), | ||
3053 | |||
3054 | +/* Reported-by: David Webb <djw@noc.ac.uk> */ | ||
3055 | +UNUSUAL_DEV(0x0bc2, 0x331a, 0x0000, 0x9999, | ||
3056 | + "Seagate", | ||
3057 | + "Expansion Desk", | ||
3058 | + USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
3059 | + US_FL_NO_REPORT_LUNS), | ||
3060 | + | ||
3061 | /* Reported-by: Hans de Goede <hdegoede@redhat.com> */ | ||
3062 | UNUSUAL_DEV(0x0bc2, 0x3320, 0x0000, 0x9999, | ||
3063 | "Seagate", | ||
3064 | diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c | ||
3065 | index 43576ed31ccd..9de988a0f856 100644 | ||
3066 | --- a/drivers/usb/storage/usb.c | ||
3067 | +++ b/drivers/usb/storage/usb.c | ||
3068 | @@ -482,7 +482,7 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) | ||
3069 | US_FL_NO_READ_DISC_INFO | US_FL_NO_READ_CAPACITY_16 | | ||
3070 | US_FL_INITIAL_READ10 | US_FL_WRITE_CACHE | | ||
3071 | US_FL_NO_ATA_1X | US_FL_NO_REPORT_OPCODES | | ||
3072 | - US_FL_MAX_SECTORS_240); | ||
3073 | + US_FL_MAX_SECTORS_240 | US_FL_NO_REPORT_LUNS); | ||
3074 | |||
3075 | p = quirks; | ||
3076 | while (*p) { | ||
3077 | @@ -532,6 +532,9 @@ void usb_stor_adjust_quirks(struct usb_device *udev, unsigned long *fflags) | ||
3078 | case 'i': | ||
3079 | f |= US_FL_IGNORE_DEVICE; | ||
3080 | break; | ||
3081 | + case 'j': | ||
3082 | + f |= US_FL_NO_REPORT_LUNS; | ||
3083 | + break; | ||
3084 | case 'l': | ||
3085 | f |= US_FL_NOT_LOCKABLE; | ||
3086 | break; | ||
3087 | diff --git a/drivers/virtio/virtio_pci_modern.c b/drivers/virtio/virtio_pci_modern.c | ||
3088 | index 8e5cf194cc0b..4469202eaa8e 100644 | ||
3089 | --- a/drivers/virtio/virtio_pci_modern.c | ||
3090 | +++ b/drivers/virtio/virtio_pci_modern.c | ||
3091 | @@ -17,6 +17,7 @@ | ||
3092 | * | ||
3093 | */ | ||
3094 | |||
3095 | +#include <linux/delay.h> | ||
3096 | #define VIRTIO_PCI_NO_LEGACY | ||
3097 | #include "virtio_pci_common.h" | ||
3098 | |||
3099 | @@ -271,9 +272,13 @@ static void vp_reset(struct virtio_device *vdev) | ||
3100 | struct virtio_pci_device *vp_dev = to_vp_device(vdev); | ||
3101 | /* 0 status means a reset. */ | ||
3102 | vp_iowrite8(0, &vp_dev->common->device_status); | ||
3103 | - /* Flush out the status write, and flush in device writes, | ||
3104 | - * including MSI-X interrupts, if any. */ | ||
3105 | - vp_ioread8(&vp_dev->common->device_status); | ||
3106 | + /* After writing 0 to device_status, the driver MUST wait for a read of | ||
3107 | + * device_status to return 0 before reinitializing the device. | ||
3108 | + * This will flush out the status write, and flush in device writes, | ||
3109 | + * including MSI-X interrupts, if any. | ||
3110 | + */ | ||
3111 | + while (vp_ioread8(&vp_dev->common->device_status)) | ||
3112 | + msleep(1); | ||
3113 | /* Flush pending VQ/configuration callbacks. */ | ||
3114 | vp_synchronize_vectors(vdev); | ||
3115 | } | ||
3116 | diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c | ||
3117 | index 524c22146429..44367783f07a 100644 | ||
3118 | --- a/drivers/xen/events/events_base.c | ||
3119 | +++ b/drivers/xen/events/events_base.c | ||
3120 | @@ -484,9 +484,19 @@ static void eoi_pirq(struct irq_data *data) | ||
3121 | struct physdev_eoi eoi = { .irq = pirq_from_irq(data->irq) }; | ||
3122 | int rc = 0; | ||
3123 | |||
3124 | - irq_move_irq(data); | ||
3125 | + if (!VALID_EVTCHN(evtchn)) | ||
3126 | + return; | ||
3127 | |||
3128 | - if (VALID_EVTCHN(evtchn)) | ||
3129 | + if (unlikely(irqd_is_setaffinity_pending(data))) { | ||
3130 | + int masked = test_and_set_mask(evtchn); | ||
3131 | + | ||
3132 | + clear_evtchn(evtchn); | ||
3133 | + | ||
3134 | + irq_move_masked_irq(data); | ||
3135 | + | ||
3136 | + if (!masked) | ||
3137 | + unmask_evtchn(evtchn); | ||
3138 | + } else | ||
3139 | clear_evtchn(evtchn); | ||
3140 | |||
3141 | if (pirq_needs_eoi(data->irq)) { | ||
3142 | @@ -1357,9 +1367,19 @@ static void ack_dynirq(struct irq_data *data) | ||
3143 | { | ||
3144 | int evtchn = evtchn_from_irq(data->irq); | ||
3145 | |||
3146 | - irq_move_irq(data); | ||
3147 | + if (!VALID_EVTCHN(evtchn)) | ||
3148 | + return; | ||
3149 | |||
3150 | - if (VALID_EVTCHN(evtchn)) | ||
3151 | + if (unlikely(irqd_is_setaffinity_pending(data))) { | ||
3152 | + int masked = test_and_set_mask(evtchn); | ||
3153 | + | ||
3154 | + clear_evtchn(evtchn); | ||
3155 | + | ||
3156 | + irq_move_masked_irq(data); | ||
3157 | + | ||
3158 | + if (!masked) | ||
3159 | + unmask_evtchn(evtchn); | ||
3160 | + } else | ||
3161 | clear_evtchn(evtchn); | ||
3162 | } | ||
3163 | |||
3164 | diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c | ||
3165 | index 0f09526aa7d9..5e5db3687e34 100644 | ||
3166 | --- a/fs/btrfs/file.c | ||
3167 | +++ b/fs/btrfs/file.c | ||
3168 | @@ -1885,7 +1885,7 @@ static int start_ordered_ops(struct inode *inode, loff_t start, loff_t end) | ||
3169 | */ | ||
3170 | int btrfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync) | ||
3171 | { | ||
3172 | - struct dentry *dentry = file->f_path.dentry; | ||
3173 | + struct dentry *dentry = file_dentry(file); | ||
3174 | struct inode *inode = d_inode(dentry); | ||
3175 | struct btrfs_root *root = BTRFS_I(inode)->root; | ||
3176 | struct btrfs_trans_handle *trans; | ||
3177 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c | ||
3178 | index 323e12cc9d2f..0e044d7ee721 100644 | ||
3179 | --- a/fs/btrfs/tree-log.c | ||
3180 | +++ b/fs/btrfs/tree-log.c | ||
3181 | @@ -4406,6 +4406,127 @@ static int btrfs_log_trailing_hole(struct btrfs_trans_handle *trans, | ||
3182 | return ret; | ||
3183 | } | ||
3184 | |||
3185 | +/* | ||
3186 | + * When we are logging a new inode X, check if it doesn't have a reference that | ||
3187 | + * matches the reference from some other inode Y created in a past transaction | ||
3188 | + * and that was renamed in the current transaction. If we don't do this, then at | ||
3189 | + * log replay time we can lose inode Y (and all its files if it's a directory): | ||
3190 | + * | ||
3191 | + * mkdir /mnt/x | ||
3192 | + * echo "hello world" > /mnt/x/foobar | ||
3193 | + * sync | ||
3194 | + * mv /mnt/x /mnt/y | ||
3195 | + * mkdir /mnt/x # or touch /mnt/x | ||
3196 | + * xfs_io -c fsync /mnt/x | ||
3197 | + * <power fail> | ||
3198 | + * mount fs, trigger log replay | ||
3199 | + * | ||
3200 | + * After the log replay procedure, we would lose the first directory and all its | ||
3201 | + * files (file foobar). | ||
3202 | + * For the case where inode Y is not a directory we simply end up losing it: | ||
3203 | + * | ||
3204 | + * echo "123" > /mnt/foo | ||
3205 | + * sync | ||
3206 | + * mv /mnt/foo /mnt/bar | ||
3207 | + * echo "abc" > /mnt/foo | ||
3208 | + * xfs_io -c fsync /mnt/foo | ||
3209 | + * <power fail> | ||
3210 | + * | ||
3211 | + * We also need this for cases where a snapshot entry is replaced by some other | ||
3212 | + * entry (file or directory) otherwise we end up with an unreplayable log due to | ||
3213 | + * attempts to delete the snapshot entry (entry of type BTRFS_ROOT_ITEM_KEY) as | ||
3214 | + * if it were a regular entry: | ||
3215 | + * | ||
3216 | + * mkdir /mnt/x | ||
3217 | + * btrfs subvolume snapshot /mnt /mnt/x/snap | ||
3218 | + * btrfs subvolume delete /mnt/x/snap | ||
3219 | + * rmdir /mnt/x | ||
3220 | + * mkdir /mnt/x | ||
3221 | + * fsync /mnt/x or fsync some new file inside it | ||
3222 | + * <power fail> | ||
3223 | + * | ||
3224 | + * The snapshot delete, rmdir of x, mkdir of a new x and the fsync all happen in | ||
3225 | + * the same transaction. | ||
3226 | + */ | ||
3227 | +static int btrfs_check_ref_name_override(struct extent_buffer *eb, | ||
3228 | + const int slot, | ||
3229 | + const struct btrfs_key *key, | ||
3230 | + struct inode *inode) | ||
3231 | +{ | ||
3232 | + int ret; | ||
3233 | + struct btrfs_path *search_path; | ||
3234 | + char *name = NULL; | ||
3235 | + u32 name_len = 0; | ||
3236 | + u32 item_size = btrfs_item_size_nr(eb, slot); | ||
3237 | + u32 cur_offset = 0; | ||
3238 | + unsigned long ptr = btrfs_item_ptr_offset(eb, slot); | ||
3239 | + | ||
3240 | + search_path = btrfs_alloc_path(); | ||
3241 | + if (!search_path) | ||
3242 | + return -ENOMEM; | ||
3243 | + search_path->search_commit_root = 1; | ||
3244 | + search_path->skip_locking = 1; | ||
3245 | + | ||
3246 | + while (cur_offset < item_size) { | ||
3247 | + u64 parent; | ||
3248 | + u32 this_name_len; | ||
3249 | + u32 this_len; | ||
3250 | + unsigned long name_ptr; | ||
3251 | + struct btrfs_dir_item *di; | ||
3252 | + | ||
3253 | + if (key->type == BTRFS_INODE_REF_KEY) { | ||
3254 | + struct btrfs_inode_ref *iref; | ||
3255 | + | ||
3256 | + iref = (struct btrfs_inode_ref *)(ptr + cur_offset); | ||
3257 | + parent = key->offset; | ||
3258 | + this_name_len = btrfs_inode_ref_name_len(eb, iref); | ||
3259 | + name_ptr = (unsigned long)(iref + 1); | ||
3260 | + this_len = sizeof(*iref) + this_name_len; | ||
3261 | + } else { | ||
3262 | + struct btrfs_inode_extref *extref; | ||
3263 | + | ||
3264 | + extref = (struct btrfs_inode_extref *)(ptr + | ||
3265 | + cur_offset); | ||
3266 | + parent = btrfs_inode_extref_parent(eb, extref); | ||
3267 | + this_name_len = btrfs_inode_extref_name_len(eb, extref); | ||
3268 | + name_ptr = (unsigned long)&extref->name; | ||
3269 | + this_len = sizeof(*extref) + this_name_len; | ||
3270 | + } | ||
3271 | + | ||
3272 | + if (this_name_len > name_len) { | ||
3273 | + char *new_name; | ||
3274 | + | ||
3275 | + new_name = krealloc(name, this_name_len, GFP_NOFS); | ||
3276 | + if (!new_name) { | ||
3277 | + ret = -ENOMEM; | ||
3278 | + goto out; | ||
3279 | + } | ||
3280 | + name_len = this_name_len; | ||
3281 | + name = new_name; | ||
3282 | + } | ||
3283 | + | ||
3284 | + read_extent_buffer(eb, name, name_ptr, this_name_len); | ||
3285 | + di = btrfs_lookup_dir_item(NULL, BTRFS_I(inode)->root, | ||
3286 | + search_path, parent, | ||
3287 | + name, this_name_len, 0); | ||
3288 | + if (di && !IS_ERR(di)) { | ||
3289 | + ret = 1; | ||
3290 | + goto out; | ||
3291 | + } else if (IS_ERR(di)) { | ||
3292 | + ret = PTR_ERR(di); | ||
3293 | + goto out; | ||
3294 | + } | ||
3295 | + btrfs_release_path(search_path); | ||
3296 | + | ||
3297 | + cur_offset += this_len; | ||
3298 | + } | ||
3299 | + ret = 0; | ||
3300 | +out: | ||
3301 | + btrfs_free_path(search_path); | ||
3302 | + kfree(name); | ||
3303 | + return ret; | ||
3304 | +} | ||
3305 | + | ||
3306 | /* log a single inode in the tree log. | ||
3307 | * At least one parent directory for this inode must exist in the tree | ||
3308 | * or be logged already. | ||
3309 | @@ -4578,6 +4699,22 @@ again: | ||
3310 | if (min_key.type == BTRFS_INODE_ITEM_KEY) | ||
3311 | need_log_inode_item = false; | ||
3312 | |||
3313 | + if ((min_key.type == BTRFS_INODE_REF_KEY || | ||
3314 | + min_key.type == BTRFS_INODE_EXTREF_KEY) && | ||
3315 | + BTRFS_I(inode)->generation == trans->transid) { | ||
3316 | + ret = btrfs_check_ref_name_override(path->nodes[0], | ||
3317 | + path->slots[0], | ||
3318 | + &min_key, inode); | ||
3319 | + if (ret < 0) { | ||
3320 | + err = ret; | ||
3321 | + goto out_unlock; | ||
3322 | + } else if (ret > 0) { | ||
3323 | + err = 1; | ||
3324 | + btrfs_set_log_full_commit(root->fs_info, trans); | ||
3325 | + goto out_unlock; | ||
3326 | + } | ||
3327 | + } | ||
3328 | + | ||
3329 | /* Skip xattrs, we log them later with btrfs_log_all_xattrs() */ | ||
3330 | if (min_key.type == BTRFS_XATTR_ITEM_KEY) { | ||
3331 | if (ins_nr == 0) | ||
3332 | diff --git a/fs/dcache.c b/fs/dcache.c | ||
3333 | index 877bcbbd03ff..18effa378f97 100644 | ||
3334 | --- a/fs/dcache.c | ||
3335 | +++ b/fs/dcache.c | ||
3336 | @@ -1666,7 +1666,8 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op) | ||
3337 | DCACHE_OP_REVALIDATE | | ||
3338 | DCACHE_OP_WEAK_REVALIDATE | | ||
3339 | DCACHE_OP_DELETE | | ||
3340 | - DCACHE_OP_SELECT_INODE)); | ||
3341 | + DCACHE_OP_SELECT_INODE | | ||
3342 | + DCACHE_OP_REAL)); | ||
3343 | dentry->d_op = op; | ||
3344 | if (!op) | ||
3345 | return; | ||
3346 | @@ -1684,6 +1685,8 @@ void d_set_d_op(struct dentry *dentry, const struct dentry_operations *op) | ||
3347 | dentry->d_flags |= DCACHE_OP_PRUNE; | ||
3348 | if (op->d_select_inode) | ||
3349 | dentry->d_flags |= DCACHE_OP_SELECT_INODE; | ||
3350 | + if (op->d_real) | ||
3351 | + dentry->d_flags |= DCACHE_OP_REAL; | ||
3352 | |||
3353 | } | ||
3354 | EXPORT_SYMBOL(d_set_d_op); | ||
3355 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
3356 | index cc7ca4e87144..d4156e1c128d 100644 | ||
3357 | --- a/fs/ext4/ext4.h | ||
3358 | +++ b/fs/ext4/ext4.h | ||
3359 | @@ -850,6 +850,29 @@ do { \ | ||
3360 | #include "extents_status.h" | ||
3361 | |||
3362 | /* | ||
3363 | + * Lock subclasses for i_data_sem in the ext4_inode_info structure. | ||
3364 | + * | ||
3365 | + * These are needed to avoid lockdep false positives when we need to | ||
3366 | + * allocate blocks to the quota inode during ext4_map_blocks(), while | ||
3367 | + * holding i_data_sem for a normal (non-quota) inode. Since we don't | ||
3368 | + * do quota tracking for the quota inode, this avoids deadlock (as | ||
3369 | + * well as infinite recursion, since it isn't turtles all the way | ||
3370 | + * down...) | ||
3371 | + * | ||
3372 | + * I_DATA_SEM_NORMAL - Used for most inodes | ||
3373 | + * I_DATA_SEM_OTHER - Used by move_inode.c for the second normal inode | ||
3374 | + * where the second inode has larger inode number | ||
3375 | + * than the first | ||
3376 | + * I_DATA_SEM_QUOTA - Used for quota inodes only | ||
3377 | + */ | ||
3378 | +enum { | ||
3379 | + I_DATA_SEM_NORMAL = 0, | ||
3380 | + I_DATA_SEM_OTHER, | ||
3381 | + I_DATA_SEM_QUOTA, | ||
3382 | +}; | ||
3383 | + | ||
3384 | + | ||
3385 | +/* | ||
3386 | * fourth extended file system inode data in memory | ||
3387 | */ | ||
3388 | struct ext4_inode_info { | ||
3389 | diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c | ||
3390 | index e032a0423e35..9bdbf98240a0 100644 | ||
3391 | --- a/fs/ext4/move_extent.c | ||
3392 | +++ b/fs/ext4/move_extent.c | ||
3393 | @@ -60,10 +60,10 @@ ext4_double_down_write_data_sem(struct inode *first, struct inode *second) | ||
3394 | { | ||
3395 | if (first < second) { | ||
3396 | down_write(&EXT4_I(first)->i_data_sem); | ||
3397 | - down_write_nested(&EXT4_I(second)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
3398 | + down_write_nested(&EXT4_I(second)->i_data_sem, I_DATA_SEM_OTHER); | ||
3399 | } else { | ||
3400 | down_write(&EXT4_I(second)->i_data_sem); | ||
3401 | - down_write_nested(&EXT4_I(first)->i_data_sem, SINGLE_DEPTH_NESTING); | ||
3402 | + down_write_nested(&EXT4_I(first)->i_data_sem, I_DATA_SEM_OTHER); | ||
3403 | |||
3404 | } | ||
3405 | } | ||
3406 | @@ -483,6 +483,13 @@ mext_check_arguments(struct inode *orig_inode, | ||
3407 | return -EBUSY; | ||
3408 | } | ||
3409 | |||
3410 | + if (IS_NOQUOTA(orig_inode) || IS_NOQUOTA(donor_inode)) { | ||
3411 | + ext4_debug("ext4 move extent: The argument files should " | ||
3412 | + "not be quota files [ino:orig %lu, donor %lu]\n", | ||
3413 | + orig_inode->i_ino, donor_inode->i_ino); | ||
3414 | + return -EBUSY; | ||
3415 | + } | ||
3416 | + | ||
3417 | /* Ext4 move extent supports only extent based file */ | ||
3418 | if (!(ext4_test_inode_flag(orig_inode, EXT4_INODE_EXTENTS))) { | ||
3419 | ext4_debug("ext4 move extent: orig file is not extents " | ||
3420 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
3421 | index c9ab67da6e5a..ba1cf0bf2f81 100644 | ||
3422 | --- a/fs/ext4/super.c | ||
3423 | +++ b/fs/ext4/super.c | ||
3424 | @@ -1292,9 +1292,9 @@ static int set_qf_name(struct super_block *sb, int qtype, substring_t *args) | ||
3425 | return -1; | ||
3426 | } | ||
3427 | if (ext4_has_feature_quota(sb)) { | ||
3428 | - ext4_msg(sb, KERN_ERR, "Cannot set journaled quota options " | ||
3429 | - "when QUOTA feature is enabled"); | ||
3430 | - return -1; | ||
3431 | + ext4_msg(sb, KERN_INFO, "Journaled quota options " | ||
3432 | + "ignored when QUOTA feature is enabled"); | ||
3433 | + return 1; | ||
3434 | } | ||
3435 | qname = match_strdup(args); | ||
3436 | if (!qname) { | ||
3437 | @@ -1657,10 +1657,10 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token, | ||
3438 | return -1; | ||
3439 | } | ||
3440 | if (ext4_has_feature_quota(sb)) { | ||
3441 | - ext4_msg(sb, KERN_ERR, | ||
3442 | - "Cannot set journaled quota options " | ||
3443 | + ext4_msg(sb, KERN_INFO, | ||
3444 | + "Quota format mount options ignored " | ||
3445 | "when QUOTA feature is enabled"); | ||
3446 | - return -1; | ||
3447 | + return 1; | ||
3448 | } | ||
3449 | sbi->s_jquota_fmt = m->mount_opt; | ||
3450 | #endif | ||
3451 | @@ -1721,11 +1721,11 @@ static int parse_options(char *options, struct super_block *sb, | ||
3452 | #ifdef CONFIG_QUOTA | ||
3453 | if (ext4_has_feature_quota(sb) && | ||
3454 | (test_opt(sb, USRQUOTA) || test_opt(sb, GRPQUOTA))) { | ||
3455 | - ext4_msg(sb, KERN_ERR, "Cannot set quota options when QUOTA " | ||
3456 | - "feature is enabled"); | ||
3457 | - return 0; | ||
3458 | - } | ||
3459 | - if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { | ||
3460 | + ext4_msg(sb, KERN_INFO, "Quota feature enabled, usrquota and grpquota " | ||
3461 | + "mount options ignored."); | ||
3462 | + clear_opt(sb, USRQUOTA); | ||
3463 | + clear_opt(sb, GRPQUOTA); | ||
3464 | + } else if (sbi->s_qf_names[USRQUOTA] || sbi->s_qf_names[GRPQUOTA]) { | ||
3465 | if (test_opt(sb, USRQUOTA) && sbi->s_qf_names[USRQUOTA]) | ||
3466 | clear_opt(sb, USRQUOTA); | ||
3467 | |||
3468 | @@ -4936,6 +4936,20 @@ static int ext4_quota_on_mount(struct super_block *sb, int type) | ||
3469 | EXT4_SB(sb)->s_jquota_fmt, type); | ||
3470 | } | ||
3471 | |||
3472 | +static void lockdep_set_quota_inode(struct inode *inode, int subclass) | ||
3473 | +{ | ||
3474 | + struct ext4_inode_info *ei = EXT4_I(inode); | ||
3475 | + | ||
3476 | + /* The first argument of lockdep_set_subclass has to be | ||
3477 | + * *exactly* the same as the argument to init_rwsem() --- in | ||
3478 | + * this case, in init_once() --- or lockdep gets unhappy | ||
3479 | + * because the name of the lock is set using the | ||
3480 | + * stringification of the argument to init_rwsem(). | ||
3481 | + */ | ||
3482 | + (void) ei; /* shut up clang warning if !CONFIG_LOCKDEP */ | ||
3483 | + lockdep_set_subclass(&ei->i_data_sem, subclass); | ||
3484 | +} | ||
3485 | + | ||
3486 | /* | ||
3487 | * Standard function to be called on quota_on | ||
3488 | */ | ||
3489 | @@ -4975,8 +4989,12 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | ||
3490 | if (err) | ||
3491 | return err; | ||
3492 | } | ||
3493 | - | ||
3494 | - return dquot_quota_on(sb, type, format_id, path); | ||
3495 | + lockdep_set_quota_inode(path->dentry->d_inode, I_DATA_SEM_QUOTA); | ||
3496 | + err = dquot_quota_on(sb, type, format_id, path); | ||
3497 | + if (err) | ||
3498 | + lockdep_set_quota_inode(path->dentry->d_inode, | ||
3499 | + I_DATA_SEM_NORMAL); | ||
3500 | + return err; | ||
3501 | } | ||
3502 | |||
3503 | static int ext4_quota_enable(struct super_block *sb, int type, int format_id, | ||
3504 | @@ -5002,8 +5020,11 @@ static int ext4_quota_enable(struct super_block *sb, int type, int format_id, | ||
3505 | |||
3506 | /* Don't account quota for quota files to avoid recursion */ | ||
3507 | qf_inode->i_flags |= S_NOQUOTA; | ||
3508 | + lockdep_set_quota_inode(qf_inode, I_DATA_SEM_QUOTA); | ||
3509 | err = dquot_enable(qf_inode, type, format_id, flags); | ||
3510 | iput(qf_inode); | ||
3511 | + if (err) | ||
3512 | + lockdep_set_quota_inode(qf_inode, I_DATA_SEM_NORMAL); | ||
3513 | |||
3514 | return err; | ||
3515 | } | ||
3516 | diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c | ||
3517 | index ce5a21861074..5fc2162afb67 100644 | ||
3518 | --- a/fs/nfs/dir.c | ||
3519 | +++ b/fs/nfs/dir.c | ||
3520 | @@ -377,7 +377,7 @@ int nfs_readdir_xdr_filler(struct page **pages, nfs_readdir_descriptor_t *desc, | ||
3521 | again: | ||
3522 | timestamp = jiffies; | ||
3523 | gencount = nfs_inc_attr_generation_counter(); | ||
3524 | - error = NFS_PROTO(inode)->readdir(file->f_path.dentry, cred, entry->cookie, pages, | ||
3525 | + error = NFS_PROTO(inode)->readdir(file_dentry(file), cred, entry->cookie, pages, | ||
3526 | NFS_SERVER(inode)->dtsize, desc->plus); | ||
3527 | if (error < 0) { | ||
3528 | /* We requested READDIRPLUS, but the server doesn't grok it */ | ||
3529 | @@ -560,7 +560,7 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en | ||
3530 | count++; | ||
3531 | |||
3532 | if (desc->plus != 0) | ||
3533 | - nfs_prime_dcache(desc->file->f_path.dentry, entry); | ||
3534 | + nfs_prime_dcache(file_dentry(desc->file), entry); | ||
3535 | |||
3536 | status = nfs_readdir_add_to_array(entry, page); | ||
3537 | if (status != 0) | ||
3538 | @@ -864,7 +864,7 @@ static bool nfs_dir_mapping_need_revalidate(struct inode *dir) | ||
3539 | */ | ||
3540 | static int nfs_readdir(struct file *file, struct dir_context *ctx) | ||
3541 | { | ||
3542 | - struct dentry *dentry = file->f_path.dentry; | ||
3543 | + struct dentry *dentry = file_dentry(file); | ||
3544 | struct inode *inode = d_inode(dentry); | ||
3545 | nfs_readdir_descriptor_t my_desc, | ||
3546 | *desc = &my_desc; | ||
3547 | diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c | ||
3548 | index 3e2071a177fd..f714b98cfd74 100644 | ||
3549 | --- a/fs/nfs/inode.c | ||
3550 | +++ b/fs/nfs/inode.c | ||
3551 | @@ -927,7 +927,7 @@ int nfs_open(struct inode *inode, struct file *filp) | ||
3552 | { | ||
3553 | struct nfs_open_context *ctx; | ||
3554 | |||
3555 | - ctx = alloc_nfs_open_context(filp->f_path.dentry, filp->f_mode); | ||
3556 | + ctx = alloc_nfs_open_context(file_dentry(filp), filp->f_mode); | ||
3557 | if (IS_ERR(ctx)) | ||
3558 | return PTR_ERR(ctx); | ||
3559 | nfs_file_set_open_context(filp, ctx); | ||
3560 | diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c | ||
3561 | index db9b5fea5b3e..679e003818b1 100644 | ||
3562 | --- a/fs/nfs/nfs4file.c | ||
3563 | +++ b/fs/nfs/nfs4file.c | ||
3564 | @@ -26,7 +26,7 @@ static int | ||
3565 | nfs4_file_open(struct inode *inode, struct file *filp) | ||
3566 | { | ||
3567 | struct nfs_open_context *ctx; | ||
3568 | - struct dentry *dentry = filp->f_path.dentry; | ||
3569 | + struct dentry *dentry = file_dentry(filp); | ||
3570 | struct dentry *parent = NULL; | ||
3571 | struct inode *dir; | ||
3572 | unsigned openflags = filp->f_flags; | ||
3573 | @@ -57,7 +57,7 @@ nfs4_file_open(struct inode *inode, struct file *filp) | ||
3574 | parent = dget_parent(dentry); | ||
3575 | dir = d_inode(parent); | ||
3576 | |||
3577 | - ctx = alloc_nfs_open_context(filp->f_path.dentry, filp->f_mode); | ||
3578 | + ctx = alloc_nfs_open_context(file_dentry(filp), filp->f_mode); | ||
3579 | err = PTR_ERR(ctx); | ||
3580 | if (IS_ERR(ctx)) | ||
3581 | goto out; | ||
3582 | diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c | ||
3583 | index 000b2ed05c29..a1acc6004a91 100644 | ||
3584 | --- a/fs/overlayfs/super.c | ||
3585 | +++ b/fs/overlayfs/super.c | ||
3586 | @@ -276,6 +276,37 @@ static void ovl_dentry_release(struct dentry *dentry) | ||
3587 | } | ||
3588 | } | ||
3589 | |||
3590 | +static struct dentry *ovl_d_real(struct dentry *dentry, struct inode *inode) | ||
3591 | +{ | ||
3592 | + struct dentry *real; | ||
3593 | + | ||
3594 | + if (d_is_dir(dentry)) { | ||
3595 | + if (!inode || inode == d_inode(dentry)) | ||
3596 | + return dentry; | ||
3597 | + goto bug; | ||
3598 | + } | ||
3599 | + | ||
3600 | + real = ovl_dentry_upper(dentry); | ||
3601 | + if (real && (!inode || inode == d_inode(real))) | ||
3602 | + return real; | ||
3603 | + | ||
3604 | + real = ovl_dentry_lower(dentry); | ||
3605 | + if (!real) | ||
3606 | + goto bug; | ||
3607 | + | ||
3608 | + if (!inode || inode == d_inode(real)) | ||
3609 | + return real; | ||
3610 | + | ||
3611 | + /* Handle recursion */ | ||
3612 | + if (real->d_flags & DCACHE_OP_REAL) | ||
3613 | + return real->d_op->d_real(real, inode); | ||
3614 | + | ||
3615 | +bug: | ||
3616 | + WARN(1, "ovl_d_real(%pd4, %s:%lu\n): real dentry not found\n", dentry, | ||
3617 | + inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0); | ||
3618 | + return dentry; | ||
3619 | +} | ||
3620 | + | ||
3621 | static int ovl_dentry_revalidate(struct dentry *dentry, unsigned int flags) | ||
3622 | { | ||
3623 | struct ovl_entry *oe = dentry->d_fsdata; | ||
3624 | @@ -320,11 +351,13 @@ static int ovl_dentry_weak_revalidate(struct dentry *dentry, unsigned int flags) | ||
3625 | static const struct dentry_operations ovl_dentry_operations = { | ||
3626 | .d_release = ovl_dentry_release, | ||
3627 | .d_select_inode = ovl_d_select_inode, | ||
3628 | + .d_real = ovl_d_real, | ||
3629 | }; | ||
3630 | |||
3631 | static const struct dentry_operations ovl_reval_dentry_operations = { | ||
3632 | .d_release = ovl_dentry_release, | ||
3633 | .d_select_inode = ovl_d_select_inode, | ||
3634 | + .d_real = ovl_d_real, | ||
3635 | .d_revalidate = ovl_dentry_revalidate, | ||
3636 | .d_weak_revalidate = ovl_dentry_weak_revalidate, | ||
3637 | }; | ||
3638 | diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h | ||
3639 | index 22ab246feed3..eeae401a2412 100644 | ||
3640 | --- a/include/linux/compiler-gcc.h | ||
3641 | +++ b/include/linux/compiler-gcc.h | ||
3642 | @@ -199,7 +199,7 @@ | ||
3643 | #define unreachable() __builtin_unreachable() | ||
3644 | |||
3645 | /* Mark a function definition as prohibited from being cloned. */ | ||
3646 | -#define __noclone __attribute__((__noclone__)) | ||
3647 | +#define __noclone __attribute__((__noclone__, __optimize__("no-tracer"))) | ||
3648 | |||
3649 | #endif /* GCC_VERSION >= 40500 */ | ||
3650 | |||
3651 | diff --git a/include/linux/dcache.h b/include/linux/dcache.h | ||
3652 | index 8a2e009c8a5a..f513dd855cb2 100644 | ||
3653 | --- a/include/linux/dcache.h | ||
3654 | +++ b/include/linux/dcache.h | ||
3655 | @@ -161,6 +161,7 @@ struct dentry_operations { | ||
3656 | struct vfsmount *(*d_automount)(struct path *); | ||
3657 | int (*d_manage)(struct dentry *, bool); | ||
3658 | struct inode *(*d_select_inode)(struct dentry *, unsigned); | ||
3659 | + struct dentry *(*d_real)(struct dentry *, struct inode *); | ||
3660 | } ____cacheline_aligned; | ||
3661 | |||
3662 | /* | ||
3663 | @@ -227,6 +228,7 @@ struct dentry_operations { | ||
3664 | #define DCACHE_MAY_FREE 0x00800000 | ||
3665 | #define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */ | ||
3666 | #define DCACHE_OP_SELECT_INODE 0x02000000 /* Unioned entry: dcache op selects inode */ | ||
3667 | +#define DCACHE_OP_REAL 0x08000000 | ||
3668 | |||
3669 | extern seqlock_t rename_lock; | ||
3670 | |||
3671 | @@ -582,4 +584,12 @@ static inline struct dentry *d_backing_dentry(struct dentry *upper) | ||
3672 | return upper; | ||
3673 | } | ||
3674 | |||
3675 | +static inline struct dentry *d_real(struct dentry *dentry) | ||
3676 | +{ | ||
3677 | + if (unlikely(dentry->d_flags & DCACHE_OP_REAL)) | ||
3678 | + return dentry->d_op->d_real(dentry, NULL); | ||
3679 | + else | ||
3680 | + return dentry; | ||
3681 | +} | ||
3682 | + | ||
3683 | #endif /* __LINUX_DCACHE_H */ | ||
3684 | diff --git a/include/linux/filter.h b/include/linux/filter.h | ||
3685 | index 5972ffe5719a..5110d4211866 100644 | ||
3686 | --- a/include/linux/filter.h | ||
3687 | +++ b/include/linux/filter.h | ||
3688 | @@ -446,8 +446,12 @@ int bpf_prog_create_from_user(struct bpf_prog **pfp, struct sock_fprog *fprog, | ||
3689 | void bpf_prog_destroy(struct bpf_prog *fp); | ||
3690 | |||
3691 | int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk); | ||
3692 | +int __sk_attach_filter(struct sock_fprog *fprog, struct sock *sk, | ||
3693 | + bool locked); | ||
3694 | int sk_attach_bpf(u32 ufd, struct sock *sk); | ||
3695 | int sk_detach_filter(struct sock *sk); | ||
3696 | +int __sk_detach_filter(struct sock *sk, bool locked); | ||
3697 | + | ||
3698 | int sk_get_filter(struct sock *sk, struct sock_filter __user *filter, | ||
3699 | unsigned int len); | ||
3700 | |||
3701 | diff --git a/include/linux/fs.h b/include/linux/fs.h | ||
3702 | index 22c5a0cf16e3..ab3d8d9bb3ef 100644 | ||
3703 | --- a/include/linux/fs.h | ||
3704 | +++ b/include/linux/fs.h | ||
3705 | @@ -1207,6 +1207,16 @@ static inline struct inode *file_inode(const struct file *f) | ||
3706 | return f->f_inode; | ||
3707 | } | ||
3708 | |||
3709 | +static inline struct dentry *file_dentry(const struct file *file) | ||
3710 | +{ | ||
3711 | + struct dentry *dentry = file->f_path.dentry; | ||
3712 | + | ||
3713 | + if (unlikely(dentry->d_flags & DCACHE_OP_REAL)) | ||
3714 | + return dentry->d_op->d_real(dentry, file_inode(file)); | ||
3715 | + else | ||
3716 | + return dentry; | ||
3717 | +} | ||
3718 | + | ||
3719 | static inline int locks_lock_file_wait(struct file *filp, struct file_lock *fl) | ||
3720 | { | ||
3721 | return locks_lock_inode_wait(file_inode(filp), fl); | ||
3722 | diff --git a/include/linux/if_bridge.h b/include/linux/if_bridge.h | ||
3723 | index a338a688ee4a..dcb89e3515db 100644 | ||
3724 | --- a/include/linux/if_bridge.h | ||
3725 | +++ b/include/linux/if_bridge.h | ||
3726 | @@ -46,10 +46,6 @@ struct br_ip_list { | ||
3727 | #define BR_LEARNING_SYNC BIT(9) | ||
3728 | #define BR_PROXYARP_WIFI BIT(10) | ||
3729 | |||
3730 | -/* values as per ieee8021QBridgeFdbAgingTime */ | ||
3731 | -#define BR_MIN_AGEING_TIME (10 * HZ) | ||
3732 | -#define BR_MAX_AGEING_TIME (1000000 * HZ) | ||
3733 | - | ||
3734 | #define BR_DEFAULT_AGEING_TIME (300 * HZ) | ||
3735 | |||
3736 | extern void brioctl_set(int (*ioctl_hook)(struct net *, unsigned int, void __user *)); | ||
3737 | diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h | ||
3738 | index 3143c847bddb..04c068e55353 100644 | ||
3739 | --- a/include/linux/netdevice.h | ||
3740 | +++ b/include/linux/netdevice.h | ||
3741 | @@ -265,6 +265,7 @@ struct header_ops { | ||
3742 | void (*cache_update)(struct hh_cache *hh, | ||
3743 | const struct net_device *dev, | ||
3744 | const unsigned char *haddr); | ||
3745 | + bool (*validate)(const char *ll_header, unsigned int len); | ||
3746 | }; | ||
3747 | |||
3748 | /* These flag bits are private to the generic network queueing | ||
3749 | @@ -1398,8 +1399,7 @@ enum netdev_priv_flags { | ||
3750 | * @dma: DMA channel | ||
3751 | * @mtu: Interface MTU value | ||
3752 | * @type: Interface hardware type | ||
3753 | - * @hard_header_len: Hardware header length, which means that this is the | ||
3754 | - * minimum size of a packet. | ||
3755 | + * @hard_header_len: Maximum hardware header length. | ||
3756 | * | ||
3757 | * @needed_headroom: Extra headroom the hardware may need, but not in all | ||
3758 | * cases can this be guaranteed | ||
3759 | @@ -2493,6 +2493,24 @@ static inline int dev_parse_header(const struct sk_buff *skb, | ||
3760 | return dev->header_ops->parse(skb, haddr); | ||
3761 | } | ||
3762 | |||
3763 | +/* ll_header must have at least hard_header_len allocated */ | ||
3764 | +static inline bool dev_validate_header(const struct net_device *dev, | ||
3765 | + char *ll_header, int len) | ||
3766 | +{ | ||
3767 | + if (likely(len >= dev->hard_header_len)) | ||
3768 | + return true; | ||
3769 | + | ||
3770 | + if (capable(CAP_SYS_RAWIO)) { | ||
3771 | + memset(ll_header + len, 0, dev->hard_header_len - len); | ||
3772 | + return true; | ||
3773 | + } | ||
3774 | + | ||
3775 | + if (dev->header_ops && dev->header_ops->validate) | ||
3776 | + return dev->header_ops->validate(ll_header, len); | ||
3777 | + | ||
3778 | + return false; | ||
3779 | +} | ||
3780 | + | ||
3781 | typedef int gifconf_func_t(struct net_device * dev, char __user * bufptr, int len); | ||
3782 | int register_gifconf(unsigned int family, gifconf_func_t *gifconf); | ||
3783 | static inline int unregister_gifconf(unsigned int family) | ||
3784 | diff --git a/include/linux/pci.h b/include/linux/pci.h | ||
3785 | index 4e554bfff129..e89c7ee7e803 100644 | ||
3786 | --- a/include/linux/pci.h | ||
3787 | +++ b/include/linux/pci.h | ||
3788 | @@ -989,23 +989,6 @@ static inline int pci_is_managed(struct pci_dev *pdev) | ||
3789 | return pdev->is_managed; | ||
3790 | } | ||
3791 | |||
3792 | -static inline void pci_set_managed_irq(struct pci_dev *pdev, unsigned int irq) | ||
3793 | -{ | ||
3794 | - pdev->irq = irq; | ||
3795 | - pdev->irq_managed = 1; | ||
3796 | -} | ||
3797 | - | ||
3798 | -static inline void pci_reset_managed_irq(struct pci_dev *pdev) | ||
3799 | -{ | ||
3800 | - pdev->irq = 0; | ||
3801 | - pdev->irq_managed = 0; | ||
3802 | -} | ||
3803 | - | ||
3804 | -static inline bool pci_has_managed_irq(struct pci_dev *pdev) | ||
3805 | -{ | ||
3806 | - return pdev->irq_managed && pdev->irq > 0; | ||
3807 | -} | ||
3808 | - | ||
3809 | void pci_disable_device(struct pci_dev *dev); | ||
3810 | |||
3811 | extern unsigned int pcibios_max_latency; | ||
3812 | diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h | ||
3813 | index 75f136a22a5e..4fde61804191 100644 | ||
3814 | --- a/include/linux/skbuff.h | ||
3815 | +++ b/include/linux/skbuff.h | ||
3816 | @@ -1908,6 +1908,30 @@ static inline void skb_reserve(struct sk_buff *skb, int len) | ||
3817 | skb->tail += len; | ||
3818 | } | ||
3819 | |||
3820 | +/** | ||
3821 | + * skb_tailroom_reserve - adjust reserved_tailroom | ||
3822 | + * @skb: buffer to alter | ||
3823 | + * @mtu: maximum amount of headlen permitted | ||
3824 | + * @needed_tailroom: minimum amount of reserved_tailroom | ||
3825 | + * | ||
3826 | + * Set reserved_tailroom so that headlen can be as large as possible but | ||
3827 | + * not larger than mtu and tailroom cannot be smaller than | ||
3828 | + * needed_tailroom. | ||
3829 | + * The required headroom should already have been reserved before using | ||
3830 | + * this function. | ||
3831 | + */ | ||
3832 | +static inline void skb_tailroom_reserve(struct sk_buff *skb, unsigned int mtu, | ||
3833 | + unsigned int needed_tailroom) | ||
3834 | +{ | ||
3835 | + SKB_LINEAR_ASSERT(skb); | ||
3836 | + if (mtu < skb_tailroom(skb) - needed_tailroom) | ||
3837 | + /* use at most mtu */ | ||
3838 | + skb->reserved_tailroom = skb_tailroom(skb) - mtu; | ||
3839 | + else | ||
3840 | + /* use up to all available space */ | ||
3841 | + skb->reserved_tailroom = needed_tailroom; | ||
3842 | +} | ||
3843 | + | ||
3844 | #define ENCAP_TYPE_ETHER 0 | ||
3845 | #define ENCAP_TYPE_IPPROTO 1 | ||
3846 | |||
3847 | @@ -2724,6 +2748,23 @@ static inline void skb_postpull_rcsum(struct sk_buff *skb, | ||
3848 | |||
3849 | unsigned char *skb_pull_rcsum(struct sk_buff *skb, unsigned int len); | ||
3850 | |||
3851 | +static inline void skb_postpush_rcsum(struct sk_buff *skb, | ||
3852 | + const void *start, unsigned int len) | ||
3853 | +{ | ||
3854 | + /* For performing the reverse operation to skb_postpull_rcsum(), | ||
3855 | + * we can instead of ... | ||
3856 | + * | ||
3857 | + * skb->csum = csum_add(skb->csum, csum_partial(start, len, 0)); | ||
3858 | + * | ||
3859 | + * ... just use this equivalent version here to save a few | ||
3860 | + * instructions. Feeding csum of 0 in csum_partial() and later | ||
3861 | + * on adding skb->csum is equivalent to feed skb->csum in the | ||
3862 | + * first place. | ||
3863 | + */ | ||
3864 | + if (skb->ip_summed == CHECKSUM_COMPLETE) | ||
3865 | + skb->csum = csum_partial(start, len, skb->csum); | ||
3866 | +} | ||
3867 | + | ||
3868 | /** | ||
3869 | * pskb_trim_rcsum - trim received skb and update checksum | ||
3870 | * @skb: buffer to trim | ||
3871 | diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h | ||
3872 | index 7f5f78bd15ad..245f57dbbb61 100644 | ||
3873 | --- a/include/linux/usb_usual.h | ||
3874 | +++ b/include/linux/usb_usual.h | ||
3875 | @@ -79,6 +79,8 @@ | ||
3876 | /* Cannot handle MI_REPORT_SUPPORTED_OPERATION_CODES */ \ | ||
3877 | US_FLAG(MAX_SECTORS_240, 0x08000000) \ | ||
3878 | /* Sets max_sectors to 240 */ \ | ||
3879 | + US_FLAG(NO_REPORT_LUNS, 0x10000000) \ | ||
3880 | + /* Cannot handle REPORT_LUNS */ \ | ||
3881 | |||
3882 | #define US_FLAG(name, value) US_FL_##name = value , | ||
3883 | enum { US_DO_ALL_FLAGS }; | ||
3884 | diff --git a/include/net/bonding.h b/include/net/bonding.h | ||
3885 | index c1740a2794a3..93abe5f6188d 100644 | ||
3886 | --- a/include/net/bonding.h | ||
3887 | +++ b/include/net/bonding.h | ||
3888 | @@ -214,6 +214,7 @@ struct bonding { | ||
3889 | * ALB mode (6) - to sync the use and modifications of its hash table | ||
3890 | */ | ||
3891 | spinlock_t mode_lock; | ||
3892 | + spinlock_t stats_lock; | ||
3893 | u8 send_peer_notif; | ||
3894 | u8 igmp_retrans; | ||
3895 | #ifdef CONFIG_PROC_FS | ||
3896 | diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c | ||
3897 | index 4504ca66118d..50da680c479f 100644 | ||
3898 | --- a/kernel/bpf/helpers.c | ||
3899 | +++ b/kernel/bpf/helpers.c | ||
3900 | @@ -166,7 +166,7 @@ static u64 bpf_get_current_comm(u64 r1, u64 size, u64 r3, u64 r4, u64 r5) | ||
3901 | if (!task) | ||
3902 | return -EINVAL; | ||
3903 | |||
3904 | - memcpy(buf, task->comm, min_t(size_t, size, sizeof(task->comm))); | ||
3905 | + strlcpy(buf, task->comm, min_t(size_t, size, sizeof(task->comm))); | ||
3906 | return 0; | ||
3907 | } | ||
3908 | |||
3909 | diff --git a/kernel/events/core.c b/kernel/events/core.c | ||
3910 | index faf2067fc8e2..1e889a078dbc 100644 | ||
3911 | --- a/kernel/events/core.c | ||
3912 | +++ b/kernel/events/core.c | ||
3913 | @@ -1580,14 +1580,14 @@ event_sched_out(struct perf_event *event, | ||
3914 | |||
3915 | perf_pmu_disable(event->pmu); | ||
3916 | |||
3917 | + event->tstamp_stopped = tstamp; | ||
3918 | + event->pmu->del(event, 0); | ||
3919 | + event->oncpu = -1; | ||
3920 | event->state = PERF_EVENT_STATE_INACTIVE; | ||
3921 | if (event->pending_disable) { | ||
3922 | event->pending_disable = 0; | ||
3923 | event->state = PERF_EVENT_STATE_OFF; | ||
3924 | } | ||
3925 | - event->tstamp_stopped = tstamp; | ||
3926 | - event->pmu->del(event, 0); | ||
3927 | - event->oncpu = -1; | ||
3928 | |||
3929 | if (!is_software_event(event)) | ||
3930 | cpuctx->active_oncpu--; | ||
3931 | @@ -8583,7 +8583,12 @@ err_context: | ||
3932 | perf_unpin_context(ctx); | ||
3933 | put_ctx(ctx); | ||
3934 | err_alloc: | ||
3935 | - free_event(event); | ||
3936 | + /* | ||
3937 | + * If event_file is set, the fput() above will have called ->release() | ||
3938 | + * and that will take care of freeing the event. | ||
3939 | + */ | ||
3940 | + if (!event_file) | ||
3941 | + free_event(event); | ||
3942 | err_cpus: | ||
3943 | put_online_cpus(); | ||
3944 | err_task: | ||
3945 | diff --git a/mm/page_isolation.c b/mm/page_isolation.c | ||
3946 | index 4568fd58f70a..00c96462cc36 100644 | ||
3947 | --- a/mm/page_isolation.c | ||
3948 | +++ b/mm/page_isolation.c | ||
3949 | @@ -283,11 +283,11 @@ struct page *alloc_migrate_target(struct page *page, unsigned long private, | ||
3950 | * now as a simple work-around, we use the next node for destination. | ||
3951 | */ | ||
3952 | if (PageHuge(page)) { | ||
3953 | - nodemask_t src = nodemask_of_node(page_to_nid(page)); | ||
3954 | - nodemask_t dst; | ||
3955 | - nodes_complement(dst, src); | ||
3956 | + int node = next_online_node(page_to_nid(page)); | ||
3957 | + if (node == MAX_NUMNODES) | ||
3958 | + node = first_online_node; | ||
3959 | return alloc_huge_page_node(page_hstate(compound_head(page)), | ||
3960 | - next_node(page_to_nid(page), dst)); | ||
3961 | + node); | ||
3962 | } | ||
3963 | |||
3964 | if (PageHighMem(page)) | ||
3965 | diff --git a/net/ax25/ax25_ip.c b/net/ax25/ax25_ip.c | ||
3966 | index b563a3f5f2a8..2fa3be965101 100644 | ||
3967 | --- a/net/ax25/ax25_ip.c | ||
3968 | +++ b/net/ax25/ax25_ip.c | ||
3969 | @@ -228,8 +228,23 @@ netdev_tx_t ax25_ip_xmit(struct sk_buff *skb) | ||
3970 | } | ||
3971 | #endif | ||
3972 | |||
3973 | +static bool ax25_validate_header(const char *header, unsigned int len) | ||
3974 | +{ | ||
3975 | + ax25_digi digi; | ||
3976 | + | ||
3977 | + if (!len) | ||
3978 | + return false; | ||
3979 | + | ||
3980 | + if (header[0]) | ||
3981 | + return true; | ||
3982 | + | ||
3983 | + return ax25_addr_parse(header + 1, len - 1, NULL, NULL, &digi, NULL, | ||
3984 | + NULL); | ||
3985 | +} | ||
3986 | + | ||
3987 | const struct header_ops ax25_header_ops = { | ||
3988 | .create = ax25_hard_header, | ||
3989 | + .validate = ax25_validate_header, | ||
3990 | }; | ||
3991 | |||
3992 | EXPORT_SYMBOL(ax25_header_ops); | ||
3993 | diff --git a/net/bridge/br_stp.c b/net/bridge/br_stp.c | ||
3994 | index 5f3f64553179..eff69cb270d2 100644 | ||
3995 | --- a/net/bridge/br_stp.c | ||
3996 | +++ b/net/bridge/br_stp.c | ||
3997 | @@ -567,6 +567,14 @@ int br_set_max_age(struct net_bridge *br, unsigned long val) | ||
3998 | |||
3999 | } | ||
4000 | |||
4001 | +/* Set time interval that dynamic forwarding entries live | ||
4002 | + * For pure software bridge, allow values outside the 802.1 | ||
4003 | + * standard specification for special cases: | ||
4004 | + * 0 - entry never ages (all permanant) | ||
4005 | + * 1 - entry disappears (no persistance) | ||
4006 | + * | ||
4007 | + * Offloaded switch entries maybe more restrictive | ||
4008 | + */ | ||
4009 | int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) | ||
4010 | { | ||
4011 | struct switchdev_attr attr = { | ||
4012 | @@ -577,11 +585,8 @@ int br_set_ageing_time(struct net_bridge *br, u32 ageing_time) | ||
4013 | unsigned long t = clock_t_to_jiffies(ageing_time); | ||
4014 | int err; | ||
4015 | |||
4016 | - if (t < BR_MIN_AGEING_TIME || t > BR_MAX_AGEING_TIME) | ||
4017 | - return -ERANGE; | ||
4018 | - | ||
4019 | err = switchdev_port_attr_set(br->dev, &attr); | ||
4020 | - if (err) | ||
4021 | + if (err && err != -EOPNOTSUPP) | ||
4022 | return err; | ||
4023 | |||
4024 | br->ageing_time = t; | ||
4025 | diff --git a/net/core/filter.c b/net/core/filter.c | ||
4026 | index 37157c4c1a78..f393a22b9d50 100644 | ||
4027 | --- a/net/core/filter.c | ||
4028 | +++ b/net/core/filter.c | ||
4029 | @@ -1139,7 +1139,8 @@ void bpf_prog_destroy(struct bpf_prog *fp) | ||
4030 | } | ||
4031 | EXPORT_SYMBOL_GPL(bpf_prog_destroy); | ||
4032 | |||
4033 | -static int __sk_attach_prog(struct bpf_prog *prog, struct sock *sk) | ||
4034 | +static int __sk_attach_prog(struct bpf_prog *prog, struct sock *sk, | ||
4035 | + bool locked) | ||
4036 | { | ||
4037 | struct sk_filter *fp, *old_fp; | ||
4038 | |||
4039 | @@ -1155,10 +1156,8 @@ static int __sk_attach_prog(struct bpf_prog *prog, struct sock *sk) | ||
4040 | return -ENOMEM; | ||
4041 | } | ||
4042 | |||
4043 | - old_fp = rcu_dereference_protected(sk->sk_filter, | ||
4044 | - sock_owned_by_user(sk)); | ||
4045 | + old_fp = rcu_dereference_protected(sk->sk_filter, locked); | ||
4046 | rcu_assign_pointer(sk->sk_filter, fp); | ||
4047 | - | ||
4048 | if (old_fp) | ||
4049 | sk_filter_uncharge(sk, old_fp); | ||
4050 | |||
4051 | @@ -1175,7 +1174,8 @@ static int __sk_attach_prog(struct bpf_prog *prog, struct sock *sk) | ||
4052 | * occurs or there is insufficient memory for the filter a negative | ||
4053 | * errno code is returned. On success the return is zero. | ||
4054 | */ | ||
4055 | -int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) | ||
4056 | +int __sk_attach_filter(struct sock_fprog *fprog, struct sock *sk, | ||
4057 | + bool locked) | ||
4058 | { | ||
4059 | unsigned int fsize = bpf_classic_proglen(fprog); | ||
4060 | unsigned int bpf_fsize = bpf_prog_size(fprog->len); | ||
4061 | @@ -1213,7 +1213,7 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) | ||
4062 | if (IS_ERR(prog)) | ||
4063 | return PTR_ERR(prog); | ||
4064 | |||
4065 | - err = __sk_attach_prog(prog, sk); | ||
4066 | + err = __sk_attach_prog(prog, sk, locked); | ||
4067 | if (err < 0) { | ||
4068 | __bpf_prog_release(prog); | ||
4069 | return err; | ||
4070 | @@ -1221,7 +1221,12 @@ int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) | ||
4071 | |||
4072 | return 0; | ||
4073 | } | ||
4074 | -EXPORT_SYMBOL_GPL(sk_attach_filter); | ||
4075 | +EXPORT_SYMBOL_GPL(__sk_attach_filter); | ||
4076 | + | ||
4077 | +int sk_attach_filter(struct sock_fprog *fprog, struct sock *sk) | ||
4078 | +{ | ||
4079 | + return __sk_attach_filter(fprog, sk, sock_owned_by_user(sk)); | ||
4080 | +} | ||
4081 | |||
4082 | int sk_attach_bpf(u32 ufd, struct sock *sk) | ||
4083 | { | ||
4084 | @@ -1240,7 +1245,7 @@ int sk_attach_bpf(u32 ufd, struct sock *sk) | ||
4085 | return -EINVAL; | ||
4086 | } | ||
4087 | |||
4088 | - err = __sk_attach_prog(prog, sk); | ||
4089 | + err = __sk_attach_prog(prog, sk, sock_owned_by_user(sk)); | ||
4090 | if (err < 0) { | ||
4091 | bpf_prog_put(prog); | ||
4092 | return err; | ||
4093 | @@ -1913,7 +1918,7 @@ static int __init register_sk_filter_ops(void) | ||
4094 | } | ||
4095 | late_initcall(register_sk_filter_ops); | ||
4096 | |||
4097 | -int sk_detach_filter(struct sock *sk) | ||
4098 | +int __sk_detach_filter(struct sock *sk, bool locked) | ||
4099 | { | ||
4100 | int ret = -ENOENT; | ||
4101 | struct sk_filter *filter; | ||
4102 | @@ -1921,8 +1926,7 @@ int sk_detach_filter(struct sock *sk) | ||
4103 | if (sock_flag(sk, SOCK_FILTER_LOCKED)) | ||
4104 | return -EPERM; | ||
4105 | |||
4106 | - filter = rcu_dereference_protected(sk->sk_filter, | ||
4107 | - sock_owned_by_user(sk)); | ||
4108 | + filter = rcu_dereference_protected(sk->sk_filter, locked); | ||
4109 | if (filter) { | ||
4110 | RCU_INIT_POINTER(sk->sk_filter, NULL); | ||
4111 | sk_filter_uncharge(sk, filter); | ||
4112 | @@ -1931,7 +1935,12 @@ int sk_detach_filter(struct sock *sk) | ||
4113 | |||
4114 | return ret; | ||
4115 | } | ||
4116 | -EXPORT_SYMBOL_GPL(sk_detach_filter); | ||
4117 | +EXPORT_SYMBOL_GPL(__sk_detach_filter); | ||
4118 | + | ||
4119 | +int sk_detach_filter(struct sock *sk) | ||
4120 | +{ | ||
4121 | + return __sk_detach_filter(sk, sock_owned_by_user(sk)); | ||
4122 | +} | ||
4123 | |||
4124 | int sk_get_filter(struct sock *sk, struct sock_filter __user *ubuf, | ||
4125 | unsigned int len) | ||
4126 | diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c | ||
4127 | index 34ba7a08876d..ca966f7de351 100644 | ||
4128 | --- a/net/core/rtnetlink.c | ||
4129 | +++ b/net/core/rtnetlink.c | ||
4130 | @@ -905,6 +905,7 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev, | ||
4131 | + rtnl_link_get_af_size(dev, ext_filter_mask) /* IFLA_AF_SPEC */ | ||
4132 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_PORT_ID */ | ||
4133 | + nla_total_size(MAX_PHYS_ITEM_ID_LEN) /* IFLA_PHYS_SWITCH_ID */ | ||
4134 | + + nla_total_size(IFNAMSIZ) /* IFLA_PHYS_PORT_NAME */ | ||
4135 | + nla_total_size(1); /* IFLA_PROTO_DOWN */ | ||
4136 | |||
4137 | } | ||
4138 | diff --git a/net/core/skbuff.c b/net/core/skbuff.c | ||
4139 | index 5bf88f58bee7..8616d1147c93 100644 | ||
4140 | --- a/net/core/skbuff.c | ||
4141 | +++ b/net/core/skbuff.c | ||
4142 | @@ -2948,6 +2948,24 @@ int skb_append_pagefrags(struct sk_buff *skb, struct page *page, | ||
4143 | EXPORT_SYMBOL_GPL(skb_append_pagefrags); | ||
4144 | |||
4145 | /** | ||
4146 | + * skb_push_rcsum - push skb and update receive checksum | ||
4147 | + * @skb: buffer to update | ||
4148 | + * @len: length of data pulled | ||
4149 | + * | ||
4150 | + * This function performs an skb_push on the packet and updates | ||
4151 | + * the CHECKSUM_COMPLETE checksum. It should be used on | ||
4152 | + * receive path processing instead of skb_push unless you know | ||
4153 | + * that the checksum difference is zero (e.g., a valid IP header) | ||
4154 | + * or you are setting ip_summed to CHECKSUM_NONE. | ||
4155 | + */ | ||
4156 | +static unsigned char *skb_push_rcsum(struct sk_buff *skb, unsigned len) | ||
4157 | +{ | ||
4158 | + skb_push(skb, len); | ||
4159 | + skb_postpush_rcsum(skb, skb->data, len); | ||
4160 | + return skb->data; | ||
4161 | +} | ||
4162 | + | ||
4163 | +/** | ||
4164 | * skb_pull_rcsum - pull skb and update receive checksum | ||
4165 | * @skb: buffer to update | ||
4166 | * @len: length of data pulled | ||
4167 | @@ -4084,9 +4102,9 @@ struct sk_buff *skb_checksum_trimmed(struct sk_buff *skb, | ||
4168 | if (!pskb_may_pull(skb_chk, offset)) | ||
4169 | goto err; | ||
4170 | |||
4171 | - __skb_pull(skb_chk, offset); | ||
4172 | + skb_pull_rcsum(skb_chk, offset); | ||
4173 | ret = skb_chkf(skb_chk); | ||
4174 | - __skb_push(skb_chk, offset); | ||
4175 | + skb_push_rcsum(skb_chk, offset); | ||
4176 | |||
4177 | if (ret) | ||
4178 | goto err; | ||
4179 | diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c | ||
4180 | index 902d606324a0..8be8f27bfacc 100644 | ||
4181 | --- a/net/dccp/ipv4.c | ||
4182 | +++ b/net/dccp/ipv4.c | ||
4183 | @@ -204,8 +204,6 @@ void dccp_req_err(struct sock *sk, u64 seq) | ||
4184 | * ICMPs are not backlogged, hence we cannot get an established | ||
4185 | * socket here. | ||
4186 | */ | ||
4187 | - WARN_ON(req->sk); | ||
4188 | - | ||
4189 | if (!between48(seq, dccp_rsk(req)->dreq_iss, dccp_rsk(req)->dreq_gss)) { | ||
4190 | NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS); | ||
4191 | } else { | ||
4192 | diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c | ||
4193 | index f6303b17546b..0212591b0077 100644 | ||
4194 | --- a/net/ipv4/devinet.c | ||
4195 | +++ b/net/ipv4/devinet.c | ||
4196 | @@ -334,6 +334,9 @@ static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap, | ||
4197 | |||
4198 | ASSERT_RTNL(); | ||
4199 | |||
4200 | + if (in_dev->dead) | ||
4201 | + goto no_promotions; | ||
4202 | + | ||
4203 | /* 1. Deleting primary ifaddr forces deletion all secondaries | ||
4204 | * unless alias promotion is set | ||
4205 | **/ | ||
4206 | @@ -380,6 +383,7 @@ static void __inet_del_ifa(struct in_device *in_dev, struct in_ifaddr **ifap, | ||
4207 | fib_del_ifaddr(ifa, ifa1); | ||
4208 | } | ||
4209 | |||
4210 | +no_promotions: | ||
4211 | /* 2. Unlink it */ | ||
4212 | |||
4213 | *ifap = ifa1->ifa_next; | ||
4214 | diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c | ||
4215 | index 473447593060..8a9246deccfe 100644 | ||
4216 | --- a/net/ipv4/fib_frontend.c | ||
4217 | +++ b/net/ipv4/fib_frontend.c | ||
4218 | @@ -280,7 +280,6 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb) | ||
4219 | struct in_device *in_dev; | ||
4220 | struct fib_result res; | ||
4221 | struct rtable *rt; | ||
4222 | - struct flowi4 fl4; | ||
4223 | struct net *net; | ||
4224 | int scope; | ||
4225 | |||
4226 | @@ -296,14 +295,13 @@ __be32 fib_compute_spec_dst(struct sk_buff *skb) | ||
4227 | |||
4228 | scope = RT_SCOPE_UNIVERSE; | ||
4229 | if (!ipv4_is_zeronet(ip_hdr(skb)->saddr)) { | ||
4230 | - fl4.flowi4_oif = 0; | ||
4231 | - fl4.flowi4_iif = LOOPBACK_IFINDEX; | ||
4232 | - fl4.daddr = ip_hdr(skb)->saddr; | ||
4233 | - fl4.saddr = 0; | ||
4234 | - fl4.flowi4_tos = RT_TOS(ip_hdr(skb)->tos); | ||
4235 | - fl4.flowi4_scope = scope; | ||
4236 | - fl4.flowi4_mark = IN_DEV_SRC_VMARK(in_dev) ? skb->mark : 0; | ||
4237 | - fl4.flowi4_tun_key.tun_id = 0; | ||
4238 | + struct flowi4 fl4 = { | ||
4239 | + .flowi4_iif = LOOPBACK_IFINDEX, | ||
4240 | + .daddr = ip_hdr(skb)->saddr, | ||
4241 | + .flowi4_tos = RT_TOS(ip_hdr(skb)->tos), | ||
4242 | + .flowi4_scope = scope, | ||
4243 | + .flowi4_mark = IN_DEV_SRC_VMARK(in_dev) ? skb->mark : 0, | ||
4244 | + }; | ||
4245 | if (!fib_lookup(net, &fl4, &res, 0)) | ||
4246 | return FIB_RES_PREFSRC(net, res); | ||
4247 | } else { | ||
4248 | @@ -922,6 +920,9 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) | ||
4249 | subnet = 1; | ||
4250 | } | ||
4251 | |||
4252 | + if (in_dev->dead) | ||
4253 | + goto no_promotions; | ||
4254 | + | ||
4255 | /* Deletion is more complicated than add. | ||
4256 | * We should take care of not to delete too much :-) | ||
4257 | * | ||
4258 | @@ -997,6 +998,7 @@ void fib_del_ifaddr(struct in_ifaddr *ifa, struct in_ifaddr *iprim) | ||
4259 | } | ||
4260 | } | ||
4261 | |||
4262 | +no_promotions: | ||
4263 | if (!(ok & BRD_OK)) | ||
4264 | fib_magic(RTM_DELROUTE, RTN_BROADCAST, ifa->ifa_broadcast, 32, prim); | ||
4265 | if (subnet && ifa->ifa_prefixlen < 31) { | ||
4266 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c | ||
4267 | index 05e4cba14162..b3086cf27027 100644 | ||
4268 | --- a/net/ipv4/igmp.c | ||
4269 | +++ b/net/ipv4/igmp.c | ||
4270 | @@ -356,9 +356,8 @@ static struct sk_buff *igmpv3_newpack(struct net_device *dev, unsigned int mtu) | ||
4271 | skb_dst_set(skb, &rt->dst); | ||
4272 | skb->dev = dev; | ||
4273 | |||
4274 | - skb->reserved_tailroom = skb_end_offset(skb) - | ||
4275 | - min(mtu, skb_end_offset(skb)); | ||
4276 | skb_reserve(skb, hlen); | ||
4277 | + skb_tailroom_reserve(skb, mtu, tlen); | ||
4278 | |||
4279 | skb_reset_network_header(skb); | ||
4280 | pip = ip_hdr(skb); | ||
4281 | diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c | ||
4282 | index 49f02856304d..f2ad5216c438 100644 | ||
4283 | --- a/net/ipv4/ip_output.c | ||
4284 | +++ b/net/ipv4/ip_output.c | ||
4285 | @@ -1237,13 +1237,16 @@ ssize_t ip_append_page(struct sock *sk, struct flowi4 *fl4, struct page *page, | ||
4286 | if (!skb) | ||
4287 | return -EINVAL; | ||
4288 | |||
4289 | - cork->length += size; | ||
4290 | if ((size + skb->len > mtu) && | ||
4291 | (sk->sk_protocol == IPPROTO_UDP) && | ||
4292 | (rt->dst.dev->features & NETIF_F_UFO)) { | ||
4293 | + if (skb->ip_summed != CHECKSUM_PARTIAL) | ||
4294 | + return -EOPNOTSUPP; | ||
4295 | + | ||
4296 | skb_shinfo(skb)->gso_size = mtu - fragheaderlen; | ||
4297 | skb_shinfo(skb)->gso_type = SKB_GSO_UDP; | ||
4298 | } | ||
4299 | + cork->length += size; | ||
4300 | |||
4301 | while (size > 0) { | ||
4302 | if (skb_is_gso(skb)) { | ||
4303 | diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c | ||
4304 | index cbb51f3fac06..ce30c8b72457 100644 | ||
4305 | --- a/net/ipv4/ip_tunnel.c | ||
4306 | +++ b/net/ipv4/ip_tunnel.c | ||
4307 | @@ -663,6 +663,8 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | ||
4308 | inner_iph = (const struct iphdr *)skb_inner_network_header(skb); | ||
4309 | connected = (tunnel->parms.iph.daddr != 0); | ||
4310 | |||
4311 | + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | ||
4312 | + | ||
4313 | dst = tnl_params->daddr; | ||
4314 | if (dst == 0) { | ||
4315 | /* NBMA tunnel */ | ||
4316 | @@ -760,7 +762,6 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, | ||
4317 | tunnel->err_time + IPTUNNEL_ERR_TIMEO)) { | ||
4318 | tunnel->err_count--; | ||
4319 | |||
4320 | - memset(IPCB(skb), 0, sizeof(*IPCB(skb))); | ||
4321 | dst_link_failure(skb); | ||
4322 | } else | ||
4323 | tunnel->err_count = 0; | ||
4324 | diff --git a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | ||
4325 | index c6eb42100e9a..ea91058b5f6f 100644 | ||
4326 | --- a/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | ||
4327 | +++ b/net/ipv4/netfilter/nf_nat_masquerade_ipv4.c | ||
4328 | @@ -108,10 +108,18 @@ static int masq_inet_event(struct notifier_block *this, | ||
4329 | unsigned long event, | ||
4330 | void *ptr) | ||
4331 | { | ||
4332 | - struct net_device *dev = ((struct in_ifaddr *)ptr)->ifa_dev->dev; | ||
4333 | + struct in_device *idev = ((struct in_ifaddr *)ptr)->ifa_dev; | ||
4334 | struct netdev_notifier_info info; | ||
4335 | |||
4336 | - netdev_notifier_info_init(&info, dev); | ||
4337 | + /* The masq_dev_notifier will catch the case of the device going | ||
4338 | + * down. So if the inetdev is dead and being destroyed we have | ||
4339 | + * no work to do. Otherwise this is an individual address removal | ||
4340 | + * and we have to perform the flush. | ||
4341 | + */ | ||
4342 | + if (idev->dead) | ||
4343 | + return NOTIFY_DONE; | ||
4344 | + | ||
4345 | + netdev_notifier_info_init(&info, idev->dev); | ||
4346 | return masq_device_event(this, event, &info); | ||
4347 | } | ||
4348 | |||
4349 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c | ||
4350 | index 8c7e63163e92..048418b049d8 100644 | ||
4351 | --- a/net/ipv4/tcp_ipv4.c | ||
4352 | +++ b/net/ipv4/tcp_ipv4.c | ||
4353 | @@ -320,8 +320,6 @@ void tcp_req_err(struct sock *sk, u32 seq, bool abort) | ||
4354 | /* ICMPs are not backlogged, hence we cannot get | ||
4355 | * an established socket here. | ||
4356 | */ | ||
4357 | - WARN_ON(req->sk); | ||
4358 | - | ||
4359 | if (seq != tcp_rsk(req)->snt_isn) { | ||
4360 | NET_INC_STATS_BH(net, LINUX_MIB_OUTOFWINDOWICMPS); | ||
4361 | } else if (abort) { | ||
4362 | diff --git a/net/ipv4/tcp_metrics.c b/net/ipv4/tcp_metrics.c | ||
4363 | index c8cbc2b4b792..a726d7853ce5 100644 | ||
4364 | --- a/net/ipv4/tcp_metrics.c | ||
4365 | +++ b/net/ipv4/tcp_metrics.c | ||
4366 | @@ -550,7 +550,7 @@ reset: | ||
4367 | */ | ||
4368 | if (crtt > tp->srtt_us) { | ||
4369 | /* Set RTO like tcp_rtt_estimator(), but from cached RTT. */ | ||
4370 | - crtt /= 8 * USEC_PER_MSEC; | ||
4371 | + crtt /= 8 * USEC_PER_SEC / HZ; | ||
4372 | inet_csk(sk)->icsk_rto = crtt + max(2 * crtt, tcp_rto_min(sk)); | ||
4373 | } else if (tp->srtt_us == 0) { | ||
4374 | /* RFC6298: 5.7 We've failed to get a valid RTT sample from | ||
4375 | diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c | ||
4376 | index ac6b1961ffeb..9475a2748a9a 100644 | ||
4377 | --- a/net/ipv4/tcp_minisocks.c | ||
4378 | +++ b/net/ipv4/tcp_minisocks.c | ||
4379 | @@ -458,7 +458,7 @@ struct sock *tcp_create_openreq_child(const struct sock *sk, | ||
4380 | |||
4381 | newtp->rcv_wup = newtp->copied_seq = | ||
4382 | newtp->rcv_nxt = treq->rcv_isn + 1; | ||
4383 | - newtp->segs_in = 0; | ||
4384 | + newtp->segs_in = 1; | ||
4385 | |||
4386 | newtp->snd_sml = newtp->snd_una = | ||
4387 | newtp->snd_nxt = newtp->snd_up = treq->snt_isn + 1; | ||
4388 | @@ -818,6 +818,7 @@ int tcp_child_process(struct sock *parent, struct sock *child, | ||
4389 | int ret = 0; | ||
4390 | int state = child->sk_state; | ||
4391 | |||
4392 | + tcp_sk(child)->segs_in += max_t(u16, 1, skb_shinfo(skb)->gso_segs); | ||
4393 | if (!sock_owned_by_user(child)) { | ||
4394 | ret = tcp_rcv_state_process(child, skb); | ||
4395 | /* Wakeup parent, send SIGIO */ | ||
4396 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c | ||
4397 | index 7f8ab46adf61..21fbb54f11d0 100644 | ||
4398 | --- a/net/ipv4/udp.c | ||
4399 | +++ b/net/ipv4/udp.c | ||
4400 | @@ -1990,10 +1990,14 @@ void udp_v4_early_demux(struct sk_buff *skb) | ||
4401 | if (!in_dev) | ||
4402 | return; | ||
4403 | |||
4404 | - ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr, | ||
4405 | - iph->protocol); | ||
4406 | - if (!ours) | ||
4407 | - return; | ||
4408 | + /* we are supposed to accept bcast packets */ | ||
4409 | + if (skb->pkt_type == PACKET_MULTICAST) { | ||
4410 | + ours = ip_check_mc_rcu(in_dev, iph->daddr, iph->saddr, | ||
4411 | + iph->protocol); | ||
4412 | + if (!ours) | ||
4413 | + return; | ||
4414 | + } | ||
4415 | + | ||
4416 | sk = __udp4_lib_mcast_demux_lookup(net, uh->dest, iph->daddr, | ||
4417 | uh->source, iph->saddr, dif); | ||
4418 | } else if (skb->pkt_type == PACKET_HOST) { | ||
4419 | diff --git a/net/ipv4/udp_tunnel.c b/net/ipv4/udp_tunnel.c | ||
4420 | index aba428626b52..280a9bdeddee 100644 | ||
4421 | --- a/net/ipv4/udp_tunnel.c | ||
4422 | +++ b/net/ipv4/udp_tunnel.c | ||
4423 | @@ -89,6 +89,8 @@ int udp_tunnel_xmit_skb(struct rtable *rt, struct sock *sk, struct sk_buff *skb, | ||
4424 | uh->source = src_port; | ||
4425 | uh->len = htons(skb->len); | ||
4426 | |||
4427 | + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | ||
4428 | + | ||
4429 | udp_set_csum(nocheck, skb, src, dst, skb->len); | ||
4430 | |||
4431 | return iptunnel_xmit(sk, rt, skb, src, dst, IPPROTO_UDP, | ||
4432 | diff --git a/net/ipv6/exthdrs_core.c b/net/ipv6/exthdrs_core.c | ||
4433 | index 5c5d23e59da5..9508a20fbf61 100644 | ||
4434 | --- a/net/ipv6/exthdrs_core.c | ||
4435 | +++ b/net/ipv6/exthdrs_core.c | ||
4436 | @@ -257,7 +257,11 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | ||
4437 | *fragoff = _frag_off; | ||
4438 | return hp->nexthdr; | ||
4439 | } | ||
4440 | - return -ENOENT; | ||
4441 | + if (!found) | ||
4442 | + return -ENOENT; | ||
4443 | + if (fragoff) | ||
4444 | + *fragoff = _frag_off; | ||
4445 | + break; | ||
4446 | } | ||
4447 | hdrlen = 8; | ||
4448 | } else if (nexthdr == NEXTHDR_AUTH) { | ||
4449 | diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c | ||
4450 | index e5ea177d34c6..4650c6824783 100644 | ||
4451 | --- a/net/ipv6/ip6_gre.c | ||
4452 | +++ b/net/ipv6/ip6_gre.c | ||
4453 | @@ -778,6 +778,8 @@ static inline int ip6gre_xmit_ipv4(struct sk_buff *skb, struct net_device *dev) | ||
4454 | __u32 mtu; | ||
4455 | int err; | ||
4456 | |||
4457 | + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | ||
4458 | + | ||
4459 | if (!(t->parms.flags & IP6_TNL_F_IGN_ENCAP_LIMIT)) | ||
4460 | encap_limit = t->parms.encap_limit; | ||
4461 | |||
4462 | diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c | ||
4463 | index 31144c486c52..a175152d3e46 100644 | ||
4464 | --- a/net/ipv6/ip6_output.c | ||
4465 | +++ b/net/ipv6/ip6_output.c | ||
4466 | @@ -1091,8 +1091,8 @@ static inline int ip6_ufo_append_data(struct sock *sk, | ||
4467 | int getfrag(void *from, char *to, int offset, int len, | ||
4468 | int odd, struct sk_buff *skb), | ||
4469 | void *from, int length, int hh_len, int fragheaderlen, | ||
4470 | - int transhdrlen, int mtu, unsigned int flags, | ||
4471 | - const struct flowi6 *fl6) | ||
4472 | + int exthdrlen, int transhdrlen, int mtu, | ||
4473 | + unsigned int flags, const struct flowi6 *fl6) | ||
4474 | |||
4475 | { | ||
4476 | struct sk_buff *skb; | ||
4477 | @@ -1117,7 +1117,7 @@ static inline int ip6_ufo_append_data(struct sock *sk, | ||
4478 | skb_put(skb, fragheaderlen + transhdrlen); | ||
4479 | |||
4480 | /* initialize network header pointer */ | ||
4481 | - skb_reset_network_header(skb); | ||
4482 | + skb_set_network_header(skb, exthdrlen); | ||
4483 | |||
4484 | /* initialize protocol header pointer */ | ||
4485 | skb->transport_header = skb->network_header + fragheaderlen; | ||
4486 | @@ -1359,7 +1359,7 @@ emsgsize: | ||
4487 | (rt->dst.dev->features & NETIF_F_UFO) && | ||
4488 | (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) { | ||
4489 | err = ip6_ufo_append_data(sk, queue, getfrag, from, length, | ||
4490 | - hh_len, fragheaderlen, | ||
4491 | + hh_len, fragheaderlen, exthdrlen, | ||
4492 | transhdrlen, mtu, flags, fl6); | ||
4493 | if (err) | ||
4494 | goto error; | ||
4495 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c | ||
4496 | index 137fca42aaa6..3991b21e24ad 100644 | ||
4497 | --- a/net/ipv6/ip6_tunnel.c | ||
4498 | +++ b/net/ipv6/ip6_tunnel.c | ||
4499 | @@ -343,12 +343,12 @@ static int ip6_tnl_create2(struct net_device *dev) | ||
4500 | |||
4501 | t = netdev_priv(dev); | ||
4502 | |||
4503 | + dev->rtnl_link_ops = &ip6_link_ops; | ||
4504 | err = register_netdevice(dev); | ||
4505 | if (err < 0) | ||
4506 | goto out; | ||
4507 | |||
4508 | strcpy(t->parms.name, dev->name); | ||
4509 | - dev->rtnl_link_ops = &ip6_link_ops; | ||
4510 | |||
4511 | dev_hold(dev); | ||
4512 | ip6_tnl_link(ip6n, t); | ||
4513 | @@ -1180,6 +1180,8 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) | ||
4514 | u8 tproto; | ||
4515 | int err; | ||
4516 | |||
4517 | + memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt)); | ||
4518 | + | ||
4519 | tproto = ACCESS_ONCE(t->parms.proto); | ||
4520 | if (tproto != IPPROTO_IPIP && tproto != 0) | ||
4521 | return -1; | ||
4522 | diff --git a/net/ipv6/mcast.c b/net/ipv6/mcast.c | ||
4523 | index 5ee56d0a8699..d64ee7e83664 100644 | ||
4524 | --- a/net/ipv6/mcast.c | ||
4525 | +++ b/net/ipv6/mcast.c | ||
4526 | @@ -1574,9 +1574,8 @@ static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) | ||
4527 | return NULL; | ||
4528 | |||
4529 | skb->priority = TC_PRIO_CONTROL; | ||
4530 | - skb->reserved_tailroom = skb_end_offset(skb) - | ||
4531 | - min(mtu, skb_end_offset(skb)); | ||
4532 | skb_reserve(skb, hlen); | ||
4533 | + skb_tailroom_reserve(skb, mtu, tlen); | ||
4534 | |||
4535 | if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { | ||
4536 | /* <draft-ietf-magma-mld-source-05.txt>: | ||
4537 | diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c | ||
4538 | index 9da3287a3923..6665e1a0bfe1 100644 | ||
4539 | --- a/net/ipv6/udp.c | ||
4540 | +++ b/net/ipv6/udp.c | ||
4541 | @@ -837,8 +837,8 @@ start_lookup: | ||
4542 | flush_stack(stack, count, skb, count - 1); | ||
4543 | } else { | ||
4544 | if (!inner_flushed) | ||
4545 | - UDP_INC_STATS_BH(net, UDP_MIB_IGNOREDMULTI, | ||
4546 | - proto == IPPROTO_UDPLITE); | ||
4547 | + UDP6_INC_STATS_BH(net, UDP_MIB_IGNOREDMULTI, | ||
4548 | + proto == IPPROTO_UDPLITE); | ||
4549 | consume_skb(skb); | ||
4550 | } | ||
4551 | return 0; | ||
4552 | @@ -916,11 +916,9 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, | ||
4553 | ret = udpv6_queue_rcv_skb(sk, skb); | ||
4554 | sock_put(sk); | ||
4555 | |||
4556 | - /* a return value > 0 means to resubmit the input, but | ||
4557 | - * it wants the return to be -protocol, or 0 | ||
4558 | - */ | ||
4559 | + /* a return value > 0 means to resubmit the input */ | ||
4560 | if (ret > 0) | ||
4561 | - return -ret; | ||
4562 | + return ret; | ||
4563 | |||
4564 | return 0; | ||
4565 | } | ||
4566 | diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c | ||
4567 | index ec22078b0914..42de4ccd159f 100644 | ||
4568 | --- a/net/l2tp/l2tp_ip.c | ||
4569 | +++ b/net/l2tp/l2tp_ip.c | ||
4570 | @@ -123,12 +123,11 @@ static int l2tp_ip_recv(struct sk_buff *skb) | ||
4571 | struct l2tp_tunnel *tunnel = NULL; | ||
4572 | int length; | ||
4573 | |||
4574 | - /* Point to L2TP header */ | ||
4575 | - optr = ptr = skb->data; | ||
4576 | - | ||
4577 | if (!pskb_may_pull(skb, 4)) | ||
4578 | goto discard; | ||
4579 | |||
4580 | + /* Point to L2TP header */ | ||
4581 | + optr = ptr = skb->data; | ||
4582 | session_id = ntohl(*((__be32 *) ptr)); | ||
4583 | ptr += 4; | ||
4584 | |||
4585 | @@ -156,6 +155,9 @@ static int l2tp_ip_recv(struct sk_buff *skb) | ||
4586 | if (!pskb_may_pull(skb, length)) | ||
4587 | goto discard; | ||
4588 | |||
4589 | + /* Point to L2TP header */ | ||
4590 | + optr = ptr = skb->data; | ||
4591 | + ptr += 4; | ||
4592 | pr_debug("%s: ip recv\n", tunnel->name); | ||
4593 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length); | ||
4594 | } | ||
4595 | diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c | ||
4596 | index a2c8747d2936..9ee4ddb6b397 100644 | ||
4597 | --- a/net/l2tp/l2tp_ip6.c | ||
4598 | +++ b/net/l2tp/l2tp_ip6.c | ||
4599 | @@ -135,12 +135,11 @@ static int l2tp_ip6_recv(struct sk_buff *skb) | ||
4600 | struct l2tp_tunnel *tunnel = NULL; | ||
4601 | int length; | ||
4602 | |||
4603 | - /* Point to L2TP header */ | ||
4604 | - optr = ptr = skb->data; | ||
4605 | - | ||
4606 | if (!pskb_may_pull(skb, 4)) | ||
4607 | goto discard; | ||
4608 | |||
4609 | + /* Point to L2TP header */ | ||
4610 | + optr = ptr = skb->data; | ||
4611 | session_id = ntohl(*((__be32 *) ptr)); | ||
4612 | ptr += 4; | ||
4613 | |||
4614 | @@ -168,6 +167,9 @@ static int l2tp_ip6_recv(struct sk_buff *skb) | ||
4615 | if (!pskb_may_pull(skb, length)) | ||
4616 | goto discard; | ||
4617 | |||
4618 | + /* Point to L2TP header */ | ||
4619 | + optr = ptr = skb->data; | ||
4620 | + ptr += 4; | ||
4621 | pr_debug("%s: ip recv\n", tunnel->name); | ||
4622 | print_hex_dump_bytes("", DUMP_PREFIX_OFFSET, ptr, length); | ||
4623 | } | ||
4624 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c | ||
4625 | index 6a12b0f5cac8..980e9e9b6684 100644 | ||
4626 | --- a/net/mac80211/ibss.c | ||
4627 | +++ b/net/mac80211/ibss.c | ||
4628 | @@ -7,6 +7,7 @@ | ||
4629 | * Copyright 2007, Michael Wu <flamingice@sourmilk.net> | ||
4630 | * Copyright 2009, Johannes Berg <johannes@sipsolutions.net> | ||
4631 | * Copyright 2013-2014 Intel Mobile Communications GmbH | ||
4632 | + * Copyright(c) 2016 Intel Deutschland GmbH | ||
4633 | * | ||
4634 | * This program is free software; you can redistribute it and/or modify | ||
4635 | * it under the terms of the GNU General Public License version 2 as | ||
4636 | @@ -1484,14 +1485,21 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata) | ||
4637 | |||
4638 | sdata_info(sdata, "Trigger new scan to find an IBSS to join\n"); | ||
4639 | |||
4640 | - num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy, | ||
4641 | - &ifibss->chandef, | ||
4642 | - channels, | ||
4643 | - ARRAY_SIZE(channels)); | ||
4644 | scan_width = cfg80211_chandef_to_scan_width(&ifibss->chandef); | ||
4645 | - ieee80211_request_ibss_scan(sdata, ifibss->ssid, | ||
4646 | - ifibss->ssid_len, channels, num, | ||
4647 | - scan_width); | ||
4648 | + | ||
4649 | + if (ifibss->fixed_channel) { | ||
4650 | + num = ieee80211_ibss_setup_scan_channels(local->hw.wiphy, | ||
4651 | + &ifibss->chandef, | ||
4652 | + channels, | ||
4653 | + ARRAY_SIZE(channels)); | ||
4654 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, | ||
4655 | + ifibss->ssid_len, channels, | ||
4656 | + num, scan_width); | ||
4657 | + } else { | ||
4658 | + ieee80211_request_ibss_scan(sdata, ifibss->ssid, | ||
4659 | + ifibss->ssid_len, NULL, | ||
4660 | + 0, scan_width); | ||
4661 | + } | ||
4662 | } else { | ||
4663 | int interval = IEEE80211_SCAN_INTERVAL; | ||
4664 | |||
4665 | diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c | ||
4666 | index c9e325d2e120..7a2b7915093b 100644 | ||
4667 | --- a/net/mac80211/iface.c | ||
4668 | +++ b/net/mac80211/iface.c | ||
4669 | @@ -977,7 +977,10 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | ||
4670 | if (sdata->vif.txq) { | ||
4671 | struct txq_info *txqi = to_txq_info(sdata->vif.txq); | ||
4672 | |||
4673 | + spin_lock_bh(&txqi->queue.lock); | ||
4674 | ieee80211_purge_tx_queue(&local->hw, &txqi->queue); | ||
4675 | + spin_unlock_bh(&txqi->queue.lock); | ||
4676 | + | ||
4677 | atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); | ||
4678 | } | ||
4679 | |||
4680 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c | ||
4681 | index 4cbf36cae806..a3bb8f7f5fc5 100644 | ||
4682 | --- a/net/mac80211/rx.c | ||
4683 | +++ b/net/mac80211/rx.c | ||
4684 | @@ -2250,7 +2250,7 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | ||
4685 | struct ieee80211_local *local = rx->local; | ||
4686 | struct ieee80211_sub_if_data *sdata = rx->sdata; | ||
4687 | struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; | ||
4688 | - u16 q, hdrlen; | ||
4689 | + u16 ac, q, hdrlen; | ||
4690 | |||
4691 | hdr = (struct ieee80211_hdr *) skb->data; | ||
4692 | hdrlen = ieee80211_hdrlen(hdr->frame_control); | ||
4693 | @@ -2319,7 +2319,8 @@ ieee80211_rx_h_mesh_fwding(struct ieee80211_rx_data *rx) | ||
4694 | ether_addr_equal(sdata->vif.addr, hdr->addr3)) | ||
4695 | return RX_CONTINUE; | ||
4696 | |||
4697 | - q = ieee80211_select_queue_80211(sdata, skb, hdr); | ||
4698 | + ac = ieee80211_select_queue_80211(sdata, skb, hdr); | ||
4699 | + q = sdata->vif.hw_queue[ac]; | ||
4700 | if (ieee80211_queue_stopped(&local->hw, q)) { | ||
4701 | IEEE80211_IFSTA_MESH_CTR_INC(ifmsh, dropped_frames_congestion); | ||
4702 | return RX_DROP_MONITOR; | ||
4703 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c | ||
4704 | index f91d1873218c..67066d048e6f 100644 | ||
4705 | --- a/net/mac80211/sta_info.c | ||
4706 | +++ b/net/mac80211/sta_info.c | ||
4707 | @@ -256,11 +256,11 @@ void sta_info_free(struct ieee80211_local *local, struct sta_info *sta) | ||
4708 | } | ||
4709 | |||
4710 | /* Caller must hold local->sta_mtx */ | ||
4711 | -static void sta_info_hash_add(struct ieee80211_local *local, | ||
4712 | - struct sta_info *sta) | ||
4713 | +static int sta_info_hash_add(struct ieee80211_local *local, | ||
4714 | + struct sta_info *sta) | ||
4715 | { | ||
4716 | - rhashtable_insert_fast(&local->sta_hash, &sta->hash_node, | ||
4717 | - sta_rht_params); | ||
4718 | + return rhashtable_insert_fast(&local->sta_hash, &sta->hash_node, | ||
4719 | + sta_rht_params); | ||
4720 | } | ||
4721 | |||
4722 | static void sta_deliver_ps_frames(struct work_struct *wk) | ||
4723 | @@ -484,11 +484,17 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | ||
4724 | { | ||
4725 | struct ieee80211_local *local = sta->local; | ||
4726 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
4727 | - struct station_info sinfo; | ||
4728 | + struct station_info *sinfo; | ||
4729 | int err = 0; | ||
4730 | |||
4731 | lockdep_assert_held(&local->sta_mtx); | ||
4732 | |||
4733 | + sinfo = kzalloc(sizeof(struct station_info), GFP_KERNEL); | ||
4734 | + if (!sinfo) { | ||
4735 | + err = -ENOMEM; | ||
4736 | + goto out_err; | ||
4737 | + } | ||
4738 | + | ||
4739 | /* check if STA exists already */ | ||
4740 | if (sta_info_get_bss(sdata, sta->sta.addr)) { | ||
4741 | err = -EEXIST; | ||
4742 | @@ -503,7 +509,9 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | ||
4743 | set_sta_flag(sta, WLAN_STA_BLOCK_BA); | ||
4744 | |||
4745 | /* make the station visible */ | ||
4746 | - sta_info_hash_add(local, sta); | ||
4747 | + err = sta_info_hash_add(local, sta); | ||
4748 | + if (err) | ||
4749 | + goto out_drop_sta; | ||
4750 | |||
4751 | list_add_tail_rcu(&sta->list, &local->sta_list); | ||
4752 | |||
4753 | @@ -520,10 +528,9 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | ||
4754 | ieee80211_sta_debugfs_add(sta); | ||
4755 | rate_control_add_sta_debugfs(sta); | ||
4756 | |||
4757 | - memset(&sinfo, 0, sizeof(sinfo)); | ||
4758 | - sinfo.filled = 0; | ||
4759 | - sinfo.generation = local->sta_generation; | ||
4760 | - cfg80211_new_sta(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL); | ||
4761 | + sinfo->generation = local->sta_generation; | ||
4762 | + cfg80211_new_sta(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); | ||
4763 | + kfree(sinfo); | ||
4764 | |||
4765 | sta_dbg(sdata, "Inserted STA %pM\n", sta->sta.addr); | ||
4766 | |||
4767 | @@ -538,6 +545,7 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU) | ||
4768 | out_remove: | ||
4769 | sta_info_hash_del(local, sta); | ||
4770 | list_del_rcu(&sta->list); | ||
4771 | + out_drop_sta: | ||
4772 | local->num_sta--; | ||
4773 | synchronize_net(); | ||
4774 | __cleanup_single_sta(sta); | ||
4775 | @@ -882,7 +890,7 @@ static void __sta_info_destroy_part2(struct sta_info *sta) | ||
4776 | { | ||
4777 | struct ieee80211_local *local = sta->local; | ||
4778 | struct ieee80211_sub_if_data *sdata = sta->sdata; | ||
4779 | - struct station_info sinfo = {}; | ||
4780 | + struct station_info *sinfo; | ||
4781 | int ret; | ||
4782 | |||
4783 | /* | ||
4784 | @@ -920,8 +928,11 @@ static void __sta_info_destroy_part2(struct sta_info *sta) | ||
4785 | |||
4786 | sta_dbg(sdata, "Removed STA %pM\n", sta->sta.addr); | ||
4787 | |||
4788 | - sta_set_sinfo(sta, &sinfo); | ||
4789 | - cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, &sinfo, GFP_KERNEL); | ||
4790 | + sinfo = kzalloc(sizeof(*sinfo), GFP_KERNEL); | ||
4791 | + if (sinfo) | ||
4792 | + sta_set_sinfo(sta, sinfo); | ||
4793 | + cfg80211_del_sta_sinfo(sdata->dev, sta->sta.addr, sinfo, GFP_KERNEL); | ||
4794 | + kfree(sinfo); | ||
4795 | |||
4796 | rate_control_remove_sta_debugfs(sta); | ||
4797 | ieee80211_sta_debugfs_remove(sta); | ||
4798 | diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c | ||
4799 | index c32fc411a911..881bc2072809 100644 | ||
4800 | --- a/net/mpls/af_mpls.c | ||
4801 | +++ b/net/mpls/af_mpls.c | ||
4802 | @@ -518,6 +518,9 @@ static struct net_device *find_outdev(struct net *net, | ||
4803 | if (!dev) | ||
4804 | return ERR_PTR(-ENODEV); | ||
4805 | |||
4806 | + if (IS_ERR(dev)) | ||
4807 | + return dev; | ||
4808 | + | ||
4809 | /* The caller is holding rtnl anyways, so release the dev reference */ | ||
4810 | dev_put(dev); | ||
4811 | |||
4812 | diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c | ||
4813 | index 992396aa635c..da1ae0e13cb5 100644 | ||
4814 | --- a/net/packet/af_packet.c | ||
4815 | +++ b/net/packet/af_packet.c | ||
4816 | @@ -1916,6 +1916,10 @@ retry: | ||
4817 | goto retry; | ||
4818 | } | ||
4819 | |||
4820 | + if (!dev_validate_header(dev, skb->data, len)) { | ||
4821 | + err = -EINVAL; | ||
4822 | + goto out_unlock; | ||
4823 | + } | ||
4824 | if (len > (dev->mtu + dev->hard_header_len + extra_len) && | ||
4825 | !packet_extra_vlan_len_allowed(dev, skb)) { | ||
4826 | err = -EMSGSIZE; | ||
4827 | @@ -2326,18 +2330,6 @@ static void tpacket_destruct_skb(struct sk_buff *skb) | ||
4828 | sock_wfree(skb); | ||
4829 | } | ||
4830 | |||
4831 | -static bool ll_header_truncated(const struct net_device *dev, int len) | ||
4832 | -{ | ||
4833 | - /* net device doesn't like empty head */ | ||
4834 | - if (unlikely(len < dev->hard_header_len)) { | ||
4835 | - net_warn_ratelimited("%s: packet size is too short (%d < %d)\n", | ||
4836 | - current->comm, len, dev->hard_header_len); | ||
4837 | - return true; | ||
4838 | - } | ||
4839 | - | ||
4840 | - return false; | ||
4841 | -} | ||
4842 | - | ||
4843 | static void tpacket_set_protocol(const struct net_device *dev, | ||
4844 | struct sk_buff *skb) | ||
4845 | { | ||
4846 | @@ -2420,19 +2412,19 @@ static int tpacket_fill_skb(struct packet_sock *po, struct sk_buff *skb, | ||
4847 | if (unlikely(err < 0)) | ||
4848 | return -EINVAL; | ||
4849 | } else if (dev->hard_header_len) { | ||
4850 | - if (ll_header_truncated(dev, tp_len)) | ||
4851 | - return -EINVAL; | ||
4852 | + int hdrlen = min_t(int, dev->hard_header_len, tp_len); | ||
4853 | |||
4854 | skb_push(skb, dev->hard_header_len); | ||
4855 | - err = skb_store_bits(skb, 0, data, | ||
4856 | - dev->hard_header_len); | ||
4857 | + err = skb_store_bits(skb, 0, data, hdrlen); | ||
4858 | if (unlikely(err)) | ||
4859 | return err; | ||
4860 | + if (!dev_validate_header(dev, skb->data, hdrlen)) | ||
4861 | + return -EINVAL; | ||
4862 | if (!skb->protocol) | ||
4863 | tpacket_set_protocol(dev, skb); | ||
4864 | |||
4865 | - data += dev->hard_header_len; | ||
4866 | - to_write -= dev->hard_header_len; | ||
4867 | + data += hdrlen; | ||
4868 | + to_write -= hdrlen; | ||
4869 | } | ||
4870 | |||
4871 | offset = offset_in_page(data); | ||
4872 | @@ -2763,9 +2755,6 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | ||
4873 | offset = dev_hard_header(skb, dev, ntohs(proto), addr, NULL, len); | ||
4874 | if (unlikely(offset < 0)) | ||
4875 | goto out_free; | ||
4876 | - } else { | ||
4877 | - if (ll_header_truncated(dev, len)) | ||
4878 | - goto out_free; | ||
4879 | } | ||
4880 | |||
4881 | /* Returns -EFAULT on error */ | ||
4882 | @@ -2773,6 +2762,12 @@ static int packet_snd(struct socket *sock, struct msghdr *msg, size_t len) | ||
4883 | if (err) | ||
4884 | goto out_free; | ||
4885 | |||
4886 | + if (sock->type == SOCK_RAW && | ||
4887 | + !dev_validate_header(dev, skb->data, len)) { | ||
4888 | + err = -EINVAL; | ||
4889 | + goto out_free; | ||
4890 | + } | ||
4891 | + | ||
4892 | sock_tx_timestamp(sk, &skb_shinfo(skb)->tx_flags); | ||
4893 | |||
4894 | if (!gso_type && (len > dev->mtu + reserve + extra_len) && | ||
4895 | diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c | ||
4896 | index ec529121f38a..ce46f1c7f133 100644 | ||
4897 | --- a/net/sctp/ipv6.c | ||
4898 | +++ b/net/sctp/ipv6.c | ||
4899 | @@ -526,6 +526,8 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1, | ||
4900 | } | ||
4901 | return 0; | ||
4902 | } | ||
4903 | + if (addr1->v6.sin6_port != addr2->v6.sin6_port) | ||
4904 | + return 0; | ||
4905 | if (!ipv6_addr_equal(&addr1->v6.sin6_addr, &addr2->v6.sin6_addr)) | ||
4906 | return 0; | ||
4907 | /* If this is a linklocal address, compare the scope_id. */ | ||
4908 | diff --git a/net/socket.c b/net/socket.c | ||
4909 | index d730ef9dfbf0..263b334ec5e4 100644 | ||
4910 | --- a/net/socket.c | ||
4911 | +++ b/net/socket.c | ||
4912 | @@ -2238,31 +2238,31 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, | ||
4913 | break; | ||
4914 | } | ||
4915 | |||
4916 | -out_put: | ||
4917 | - fput_light(sock->file, fput_needed); | ||
4918 | - | ||
4919 | if (err == 0) | ||
4920 | - return datagrams; | ||
4921 | + goto out_put; | ||
4922 | |||
4923 | - if (datagrams != 0) { | ||
4924 | + if (datagrams == 0) { | ||
4925 | + datagrams = err; | ||
4926 | + goto out_put; | ||
4927 | + } | ||
4928 | + | ||
4929 | + /* | ||
4930 | + * We may return less entries than requested (vlen) if the | ||
4931 | + * sock is non block and there aren't enough datagrams... | ||
4932 | + */ | ||
4933 | + if (err != -EAGAIN) { | ||
4934 | /* | ||
4935 | - * We may return less entries than requested (vlen) if the | ||
4936 | - * sock is non block and there aren't enough datagrams... | ||
4937 | + * ... or if recvmsg returns an error after we | ||
4938 | + * received some datagrams, where we record the | ||
4939 | + * error to return on the next call or if the | ||
4940 | + * app asks about it using getsockopt(SO_ERROR). | ||
4941 | */ | ||
4942 | - if (err != -EAGAIN) { | ||
4943 | - /* | ||
4944 | - * ... or if recvmsg returns an error after we | ||
4945 | - * received some datagrams, where we record the | ||
4946 | - * error to return on the next call or if the | ||
4947 | - * app asks about it using getsockopt(SO_ERROR). | ||
4948 | - */ | ||
4949 | - sock->sk->sk_err = -err; | ||
4950 | - } | ||
4951 | - | ||
4952 | - return datagrams; | ||
4953 | + sock->sk->sk_err = -err; | ||
4954 | } | ||
4955 | +out_put: | ||
4956 | + fput_light(sock->file, fput_needed); | ||
4957 | |||
4958 | - return err; | ||
4959 | + return datagrams; | ||
4960 | } | ||
4961 | |||
4962 | SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, | ||
4963 | diff --git a/net/tipc/socket.c b/net/tipc/socket.c | ||
4964 | index b53246fb0412..e53003cf7703 100644 | ||
4965 | --- a/net/tipc/socket.c | ||
4966 | +++ b/net/tipc/socket.c | ||
4967 | @@ -673,7 +673,7 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, | ||
4968 | struct tipc_sock *tsk = tipc_sk(sk); | ||
4969 | struct net *net = sock_net(sk); | ||
4970 | struct tipc_msg *mhdr = &tsk->phdr; | ||
4971 | - struct sk_buff_head *pktchain = &sk->sk_write_queue; | ||
4972 | + struct sk_buff_head pktchain; | ||
4973 | struct iov_iter save = msg->msg_iter; | ||
4974 | uint mtu; | ||
4975 | int rc; | ||
4976 | @@ -687,14 +687,16 @@ static int tipc_sendmcast(struct socket *sock, struct tipc_name_seq *seq, | ||
4977 | msg_set_nameupper(mhdr, seq->upper); | ||
4978 | msg_set_hdr_sz(mhdr, MCAST_H_SIZE); | ||
4979 | |||
4980 | + skb_queue_head_init(&pktchain); | ||
4981 | + | ||
4982 | new_mtu: | ||
4983 | mtu = tipc_bcast_get_mtu(net); | ||
4984 | - rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, pktchain); | ||
4985 | + rc = tipc_msg_build(mhdr, msg, 0, dsz, mtu, &pktchain); | ||
4986 | if (unlikely(rc < 0)) | ||
4987 | return rc; | ||
4988 | |||
4989 | do { | ||
4990 | - rc = tipc_bcast_xmit(net, pktchain); | ||
4991 | + rc = tipc_bcast_xmit(net, &pktchain); | ||
4992 | if (likely(!rc)) | ||
4993 | return dsz; | ||
4994 | |||
4995 | @@ -704,7 +706,7 @@ new_mtu: | ||
4996 | if (!rc) | ||
4997 | continue; | ||
4998 | } | ||
4999 | - __skb_queue_purge(pktchain); | ||
5000 | + __skb_queue_purge(&pktchain); | ||
5001 | if (rc == -EMSGSIZE) { | ||
5002 | msg->msg_iter = save; | ||
5003 | goto new_mtu; | ||
5004 | @@ -863,7 +865,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) | ||
5005 | struct net *net = sock_net(sk); | ||
5006 | struct tipc_msg *mhdr = &tsk->phdr; | ||
5007 | u32 dnode, dport; | ||
5008 | - struct sk_buff_head *pktchain = &sk->sk_write_queue; | ||
5009 | + struct sk_buff_head pktchain; | ||
5010 | struct sk_buff *skb; | ||
5011 | struct tipc_name_seq *seq; | ||
5012 | struct iov_iter save; | ||
5013 | @@ -924,17 +926,18 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) | ||
5014 | msg_set_hdr_sz(mhdr, BASIC_H_SIZE); | ||
5015 | } | ||
5016 | |||
5017 | + skb_queue_head_init(&pktchain); | ||
5018 | save = m->msg_iter; | ||
5019 | new_mtu: | ||
5020 | mtu = tipc_node_get_mtu(net, dnode, tsk->portid); | ||
5021 | - rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, pktchain); | ||
5022 | + rc = tipc_msg_build(mhdr, m, 0, dsz, mtu, &pktchain); | ||
5023 | if (rc < 0) | ||
5024 | return rc; | ||
5025 | |||
5026 | do { | ||
5027 | - skb = skb_peek(pktchain); | ||
5028 | + skb = skb_peek(&pktchain); | ||
5029 | TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; | ||
5030 | - rc = tipc_node_xmit(net, pktchain, dnode, tsk->portid); | ||
5031 | + rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid); | ||
5032 | if (likely(!rc)) { | ||
5033 | if (sock->state != SS_READY) | ||
5034 | sock->state = SS_CONNECTING; | ||
5035 | @@ -946,7 +949,7 @@ new_mtu: | ||
5036 | if (!rc) | ||
5037 | continue; | ||
5038 | } | ||
5039 | - __skb_queue_purge(pktchain); | ||
5040 | + __skb_queue_purge(&pktchain); | ||
5041 | if (rc == -EMSGSIZE) { | ||
5042 | m->msg_iter = save; | ||
5043 | goto new_mtu; | ||
5044 | @@ -1016,7 +1019,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz) | ||
5045 | struct net *net = sock_net(sk); | ||
5046 | struct tipc_sock *tsk = tipc_sk(sk); | ||
5047 | struct tipc_msg *mhdr = &tsk->phdr; | ||
5048 | - struct sk_buff_head *pktchain = &sk->sk_write_queue; | ||
5049 | + struct sk_buff_head pktchain; | ||
5050 | DECLARE_SOCKADDR(struct sockaddr_tipc *, dest, m->msg_name); | ||
5051 | u32 portid = tsk->portid; | ||
5052 | int rc = -EINVAL; | ||
5053 | @@ -1044,17 +1047,19 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz) | ||
5054 | |||
5055 | timeo = sock_sndtimeo(sk, m->msg_flags & MSG_DONTWAIT); | ||
5056 | dnode = tsk_peer_node(tsk); | ||
5057 | + skb_queue_head_init(&pktchain); | ||
5058 | |||
5059 | next: | ||
5060 | save = m->msg_iter; | ||
5061 | mtu = tsk->max_pkt; | ||
5062 | send = min_t(uint, dsz - sent, TIPC_MAX_USER_MSG_SIZE); | ||
5063 | - rc = tipc_msg_build(mhdr, m, sent, send, mtu, pktchain); | ||
5064 | + rc = tipc_msg_build(mhdr, m, sent, send, mtu, &pktchain); | ||
5065 | if (unlikely(rc < 0)) | ||
5066 | return rc; | ||
5067 | + | ||
5068 | do { | ||
5069 | if (likely(!tsk_conn_cong(tsk))) { | ||
5070 | - rc = tipc_node_xmit(net, pktchain, dnode, portid); | ||
5071 | + rc = tipc_node_xmit(net, &pktchain, dnode, portid); | ||
5072 | if (likely(!rc)) { | ||
5073 | tsk->sent_unacked++; | ||
5074 | sent += send; | ||
5075 | @@ -1063,7 +1068,7 @@ next: | ||
5076 | goto next; | ||
5077 | } | ||
5078 | if (rc == -EMSGSIZE) { | ||
5079 | - __skb_queue_purge(pktchain); | ||
5080 | + __skb_queue_purge(&pktchain); | ||
5081 | tsk->max_pkt = tipc_node_get_mtu(net, dnode, | ||
5082 | portid); | ||
5083 | m->msg_iter = save; | ||
5084 | @@ -1077,7 +1082,7 @@ next: | ||
5085 | rc = tipc_wait_for_sndpkt(sock, &timeo); | ||
5086 | } while (!rc); | ||
5087 | |||
5088 | - __skb_queue_purge(pktchain); | ||
5089 | + __skb_queue_purge(&pktchain); | ||
5090 | return sent ? sent : rc; | ||
5091 | } | ||
5092 | |||
5093 | diff --git a/net/xfrm/xfrm_input.c b/net/xfrm/xfrm_input.c | ||
5094 | index ad7f5b3f9b61..1c4ad477ce93 100644 | ||
5095 | --- a/net/xfrm/xfrm_input.c | ||
5096 | +++ b/net/xfrm/xfrm_input.c | ||
5097 | @@ -292,12 +292,15 @@ int xfrm_input(struct sk_buff *skb, int nexthdr, __be32 spi, int encap_type) | ||
5098 | XFRM_SKB_CB(skb)->seq.input.hi = seq_hi; | ||
5099 | |||
5100 | skb_dst_force(skb); | ||
5101 | + dev_hold(skb->dev); | ||
5102 | |||
5103 | nexthdr = x->type->input(x, skb); | ||
5104 | |||
5105 | if (nexthdr == -EINPROGRESS) | ||
5106 | return 0; | ||
5107 | resume: | ||
5108 | + dev_put(skb->dev); | ||
5109 | + | ||
5110 | spin_lock(&x->lock); | ||
5111 | if (nexthdr <= 0) { | ||
5112 | if (nexthdr == -EBADMSG) { | ||
5113 | diff --git a/sound/core/timer.c b/sound/core/timer.c | ||
5114 | index f24c9fccf008..b982d1b089bd 100644 | ||
5115 | --- a/sound/core/timer.c | ||
5116 | +++ b/sound/core/timer.c | ||
5117 | @@ -1051,8 +1051,8 @@ static int snd_timer_s_start(struct snd_timer * timer) | ||
5118 | njiff += timer->sticks - priv->correction; | ||
5119 | priv->correction = 0; | ||
5120 | } | ||
5121 | - priv->last_expires = priv->tlist.expires = njiff; | ||
5122 | - add_timer(&priv->tlist); | ||
5123 | + priv->last_expires = njiff; | ||
5124 | + mod_timer(&priv->tlist, njiff); | ||
5125 | return 0; | ||
5126 | } | ||
5127 | |||
5128 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c | ||
5129 | index 6968b796baa3..1402ba954b3d 100644 | ||
5130 | --- a/sound/pci/hda/patch_realtek.c | ||
5131 | +++ b/sound/pci/hda/patch_realtek.c | ||
5132 | @@ -3801,6 +3801,10 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, | ||
5133 | |||
5134 | static void alc_headset_mode_default(struct hda_codec *codec) | ||
5135 | { | ||
5136 | + static struct coef_fw coef0225[] = { | ||
5137 | + UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10), | ||
5138 | + {} | ||
5139 | + }; | ||
5140 | static struct coef_fw coef0255[] = { | ||
5141 | WRITE_COEF(0x45, 0xc089), | ||
5142 | WRITE_COEF(0x45, 0xc489), | ||
5143 | @@ -3842,6 +3846,9 @@ static void alc_headset_mode_default(struct hda_codec *codec) | ||
5144 | }; | ||
5145 | |||
5146 | switch (codec->core.vendor_id) { | ||
5147 | + case 0x10ec0225: | ||
5148 | + alc_process_coef_fw(codec, coef0225); | ||
5149 | + break; | ||
5150 | case 0x10ec0255: | ||
5151 | case 0x10ec0256: | ||
5152 | alc_process_coef_fw(codec, coef0255); | ||
5153 | @@ -4750,6 +4757,10 @@ enum { | ||
5154 | ALC293_FIXUP_LENOVO_SPK_NOISE, | ||
5155 | ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, | ||
5156 | ALC255_FIXUP_DELL_SPK_NOISE, | ||
5157 | + ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5158 | + ALC280_FIXUP_HP_HEADSET_MIC, | ||
5159 | + ALC221_FIXUP_HP_FRONT_MIC, | ||
5160 | + ALC292_FIXUP_TPT460, | ||
5161 | }; | ||
5162 | |||
5163 | static const struct hda_fixup alc269_fixups[] = { | ||
5164 | @@ -5375,6 +5386,36 @@ static const struct hda_fixup alc269_fixups[] = { | ||
5165 | .chained = true, | ||
5166 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE | ||
5167 | }, | ||
5168 | + [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = { | ||
5169 | + .type = HDA_FIXUP_VERBS, | ||
5170 | + .v.verbs = (const struct hda_verb[]) { | ||
5171 | + /* Disable pass-through path for FRONT 14h */ | ||
5172 | + { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 }, | ||
5173 | + { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 }, | ||
5174 | + {} | ||
5175 | + }, | ||
5176 | + .chained = true, | ||
5177 | + .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE | ||
5178 | + }, | ||
5179 | + [ALC280_FIXUP_HP_HEADSET_MIC] = { | ||
5180 | + .type = HDA_FIXUP_FUNC, | ||
5181 | + .v.func = alc_fixup_disable_aamix, | ||
5182 | + .chained = true, | ||
5183 | + .chain_id = ALC269_FIXUP_HEADSET_MIC, | ||
5184 | + }, | ||
5185 | + [ALC221_FIXUP_HP_FRONT_MIC] = { | ||
5186 | + .type = HDA_FIXUP_PINS, | ||
5187 | + .v.pins = (const struct hda_pintbl[]) { | ||
5188 | + { 0x19, 0x02a19020 }, /* Front Mic */ | ||
5189 | + { } | ||
5190 | + }, | ||
5191 | + }, | ||
5192 | + [ALC292_FIXUP_TPT460] = { | ||
5193 | + .type = HDA_FIXUP_FUNC, | ||
5194 | + .v.func = alc_fixup_tpt440_dock, | ||
5195 | + .chained = true, | ||
5196 | + .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE, | ||
5197 | + }, | ||
5198 | }; | ||
5199 | |||
5200 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
5201 | @@ -5479,6 +5520,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
5202 | SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
5203 | SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
5204 | SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | ||
5205 | + SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC), | ||
5206 | + SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC), | ||
5207 | SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300), | ||
5208 | SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
5209 | SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||
5210 | @@ -5527,7 +5570,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||
5211 | SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), | ||
5212 | SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), | ||
5213 | SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), | ||
5214 | - SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE), | ||
5215 | + SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), | ||
5216 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
5217 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
5218 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), | ||
5219 | @@ -5622,6 +5665,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | ||
5220 | {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"}, | ||
5221 | {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"}, | ||
5222 | {.id = ALC292_FIXUP_TPT440, .name = "tpt440"}, | ||
5223 | + {.id = ALC292_FIXUP_TPT460, .name = "tpt460"}, | ||
5224 | {} | ||
5225 | }; | ||
5226 | #define ALC225_STANDARD_PINS \ | ||
5227 | @@ -5648,10 +5692,10 @@ static const struct hda_model_fixup alc269_fixup_models[] = { | ||
5228 | {0x21, 0x03211020} | ||
5229 | |||
5230 | static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | ||
5231 | - SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5232 | + SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5233 | ALC225_STANDARD_PINS, | ||
5234 | {0x14, 0x901701a0}), | ||
5235 | - SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5236 | + SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5237 | ALC225_STANDARD_PINS, | ||
5238 | {0x14, 0x901701b0}), | ||
5239 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, | ||
5240 | @@ -6379,6 +6423,7 @@ enum { | ||
5241 | ALC668_FIXUP_AUTO_MUTE, | ||
5242 | ALC668_FIXUP_DELL_DISABLE_AAMIX, | ||
5243 | ALC668_FIXUP_DELL_XPS13, | ||
5244 | + ALC662_FIXUP_ASUS_Nx50, | ||
5245 | }; | ||
5246 | |||
5247 | static const struct hda_fixup alc662_fixups[] = { | ||
5248 | @@ -6619,6 +6664,12 @@ static const struct hda_fixup alc662_fixups[] = { | ||
5249 | .type = HDA_FIXUP_FUNC, | ||
5250 | .v.func = alc_fixup_bass_chmap, | ||
5251 | }, | ||
5252 | + [ALC662_FIXUP_ASUS_Nx50] = { | ||
5253 | + .type = HDA_FIXUP_FUNC, | ||
5254 | + .v.func = alc_fixup_auto_mute_via_amp, | ||
5255 | + .chained = true, | ||
5256 | + .chain_id = ALC662_FIXUP_BASS_1A | ||
5257 | + }, | ||
5258 | }; | ||
5259 | |||
5260 | static const struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
5261 | @@ -6641,8 +6692,9 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | ||
5262 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
5263 | SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
5264 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), | ||
5265 | - SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A), | ||
5266 | + SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50), | ||
5267 | SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A), | ||
5268 | + SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50), | ||
5269 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), | ||
5270 | SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16), | ||
5271 | SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16), | ||
5272 | diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c | ||
5273 | index ddca6547399b..1f8fb0d904e0 100644 | ||
5274 | --- a/sound/usb/mixer_maps.c | ||
5275 | +++ b/sound/usb/mixer_maps.c | ||
5276 | @@ -349,6 +349,16 @@ static struct usbmix_name_map bose_companion5_map[] = { | ||
5277 | }; | ||
5278 | |||
5279 | /* | ||
5280 | + * Dell usb dock with ALC4020 codec had a firmware problem where it got | ||
5281 | + * screwed up when zero volume is passed; just skip it as a workaround | ||
5282 | + */ | ||
5283 | +static const struct usbmix_name_map dell_alc4020_map[] = { | ||
5284 | + { 16, NULL }, | ||
5285 | + { 19, NULL }, | ||
5286 | + { 0 } | ||
5287 | +}; | ||
5288 | + | ||
5289 | +/* | ||
5290 | * Control map entries | ||
5291 | */ | ||
5292 | |||
5293 | @@ -431,6 +441,10 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = { | ||
5294 | .map = aureon_51_2_map, | ||
5295 | }, | ||
5296 | { | ||
5297 | + .id = USB_ID(0x0bda, 0x4014), | ||
5298 | + .map = dell_alc4020_map, | ||
5299 | + }, | ||
5300 | + { | ||
5301 | .id = USB_ID(0x0dba, 0x1000), | ||
5302 | .map = mbox1_map, | ||
5303 | }, | ||
5304 | diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c | ||
5305 | index cd7eac28edee..001fb4dc0722 100644 | ||
5306 | --- a/sound/usb/quirks.c | ||
5307 | +++ b/sound/usb/quirks.c | ||
5308 | @@ -1135,9 +1135,11 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip) | ||
5309 | case USB_ID(0x045E, 0x076F): /* MS Lifecam HD-6000 */ | ||
5310 | case USB_ID(0x045E, 0x0772): /* MS Lifecam Studio */ | ||
5311 | case USB_ID(0x045E, 0x0779): /* MS Lifecam HD-3000 */ | ||
5312 | + case USB_ID(0x047F, 0x0415): /* Plantronics BT-300 */ | ||
5313 | case USB_ID(0x047F, 0xAA05): /* Plantronics DA45 */ | ||
5314 | case USB_ID(0x04D8, 0xFEEA): /* Benchmark DAC1 Pre */ | ||
5315 | case USB_ID(0x074D, 0x3553): /* Outlaw RR2150 (Micronas UAC3553B) */ | ||
5316 | + case USB_ID(0x1de7, 0x0014): /* Phoenix Audio TMX320 */ | ||
5317 | case USB_ID(0x21B4, 0x0081): /* AudioQuest DragonFly */ | ||
5318 | return true; | ||
5319 | } |