Contents of /trunk/kernel-magellan/patches-3.2/0102-3.2.3-all-fixes.patch
Parent Directory | Revision Log
Revision 1644 -
(show annotations)
(download)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 127825 byte(s)
Thu Feb 16 12:24:52 2012 UTC (12 years, 7 months ago) by niro
File size: 127825 byte(s)
-3.2.6-magellan-r1
1 | diff --git a/arch/arm/mach-at91/setup.c b/arch/arm/mach-at91/setup.c |
2 | index aa64294..f5bbe0ef 100644 |
3 | --- a/arch/arm/mach-at91/setup.c |
4 | +++ b/arch/arm/mach-at91/setup.c |
5 | @@ -27,9 +27,12 @@ EXPORT_SYMBOL(at91_soc_initdata); |
6 | void __init at91rm9200_set_type(int type) |
7 | { |
8 | if (type == ARCH_REVISON_9200_PQFP) |
9 | - at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; |
10 | - else |
11 | at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP; |
12 | + else |
13 | + at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; |
14 | + |
15 | + pr_info("AT91: filled in soc subtype: %s\n", |
16 | + at91_get_soc_subtype(&at91_soc_initdata)); |
17 | } |
18 | |
19 | void __init at91_init_irq_default(void) |
20 | diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig |
21 | index a3e0c86..52af004 100644 |
22 | --- a/arch/arm/mach-ux500/Kconfig |
23 | +++ b/arch/arm/mach-ux500/Kconfig |
24 | @@ -7,6 +7,7 @@ config UX500_SOC_COMMON |
25 | select HAS_MTU |
26 | select ARM_ERRATA_753970 |
27 | select ARM_ERRATA_754322 |
28 | + select ARM_ERRATA_764369 |
29 | |
30 | menu "Ux500 SoC" |
31 | |
32 | diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c |
33 | index 6826fae..306cff0 100644 |
34 | --- a/arch/arm/mach-ux500/board-mop500-sdi.c |
35 | +++ b/arch/arm/mach-ux500/board-mop500-sdi.c |
36 | @@ -233,6 +233,8 @@ void __init snowball_sdi_init(void) |
37 | { |
38 | u32 periphid = 0x10480180; |
39 | |
40 | + /* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported on sdi0 */ |
41 | + mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED; |
42 | mop500_sdi2_data.capabilities |= MMC_CAP_MMC_HIGHSPEED; |
43 | |
44 | /* On-board eMMC */ |
45 | diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S |
46 | index e70a737..40cc7aa 100644 |
47 | --- a/arch/arm/mm/proc-v7.S |
48 | +++ b/arch/arm/mm/proc-v7.S |
49 | @@ -271,10 +271,6 @@ ENDPROC(cpu_v7_do_resume) |
50 | * Initialise TLB, Caches, and MMU state ready to switch the MMU |
51 | * on. Return in r0 the new CP15 C1 control register setting. |
52 | * |
53 | - * We automatically detect if we have a Harvard cache, and use the |
54 | - * Harvard cache control instructions insead of the unified cache |
55 | - * control instructions. |
56 | - * |
57 | * This should be able to cover all ARMv7 cores. |
58 | * |
59 | * It is assumed that: |
60 | @@ -373,9 +369,7 @@ __v7_setup: |
61 | #endif |
62 | |
63 | 3: mov r10, #0 |
64 | -#ifdef HARVARD_CACHE |
65 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
66 | -#endif |
67 | dsb |
68 | #ifdef CONFIG_MMU |
69 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
70 | diff --git a/arch/m68k/atari/config.c b/arch/m68k/atari/config.c |
71 | index 4203d10..c4ac15c 100644 |
72 | --- a/arch/m68k/atari/config.c |
73 | +++ b/arch/m68k/atari/config.c |
74 | @@ -414,9 +414,9 @@ void __init config_atari(void) |
75 | * FDC val = 4 -> Supervisor only */ |
76 | asm volatile ("\n" |
77 | " .chip 68030\n" |
78 | - " pmove %0@,%/tt1\n" |
79 | + " pmove %0,%/tt1\n" |
80 | " .chip 68k" |
81 | - : : "a" (&tt1_val)); |
82 | + : : "m" (tt1_val)); |
83 | } else { |
84 | asm volatile ("\n" |
85 | " .chip 68040\n" |
86 | @@ -569,10 +569,10 @@ static void atari_reset(void) |
87 | : "d0"); |
88 | } else |
89 | asm volatile ("\n" |
90 | - " pmove %0@,%%tc\n" |
91 | + " pmove %0,%%tc\n" |
92 | " jmp %1@" |
93 | : /* no outputs */ |
94 | - : "a" (&tc_val), "a" (reset_addr)); |
95 | + : "m" (tc_val), "a" (reset_addr)); |
96 | } |
97 | |
98 | |
99 | diff --git a/arch/m68k/kernel/process_mm.c b/arch/m68k/kernel/process_mm.c |
100 | index 1bc223a..aa4ffb8 100644 |
101 | --- a/arch/m68k/kernel/process_mm.c |
102 | +++ b/arch/m68k/kernel/process_mm.c |
103 | @@ -189,8 +189,8 @@ void flush_thread(void) |
104 | current->thread.fs = __USER_DS; |
105 | if (!FPU_IS_EMU) |
106 | asm volatile (".chip 68k/68881\n\t" |
107 | - "frestore %0@\n\t" |
108 | - ".chip 68k" : : "a" (&zero)); |
109 | + "frestore %0\n\t" |
110 | + ".chip 68k" : : "m" (zero)); |
111 | } |
112 | |
113 | /* |
114 | diff --git a/arch/m68k/kernel/process_no.c b/arch/m68k/kernel/process_no.c |
115 | index 69c1803..5e1078c 100644 |
116 | --- a/arch/m68k/kernel/process_no.c |
117 | +++ b/arch/m68k/kernel/process_no.c |
118 | @@ -163,8 +163,8 @@ void flush_thread(void) |
119 | #ifdef CONFIG_FPU |
120 | if (!FPU_IS_EMU) |
121 | asm volatile (".chip 68k/68881\n\t" |
122 | - "frestore %0@\n\t" |
123 | - ".chip 68k" : : "a" (&zero)); |
124 | + "frestore %0\n\t" |
125 | + ".chip 68k" : : "m" (zero)); |
126 | #endif |
127 | } |
128 | |
129 | diff --git a/arch/m68k/kernel/traps.c b/arch/m68k/kernel/traps.c |
130 | index 89362f2..eb67469 100644 |
131 | --- a/arch/m68k/kernel/traps.c |
132 | +++ b/arch/m68k/kernel/traps.c |
133 | @@ -552,13 +552,13 @@ static inline void bus_error030 (struct frame *fp) |
134 | |
135 | #ifdef DEBUG |
136 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" |
137 | - "pmove %%psr,%1@" |
138 | - : "=a&" (desc) |
139 | - : "a" (&temp), "a" (addr), "d" (ssw)); |
140 | + "pmove %%psr,%1" |
141 | + : "=a&" (desc), "=m" (temp) |
142 | + : "a" (addr), "d" (ssw)); |
143 | #else |
144 | asm volatile ("ptestr %2,%1@,#7\n\t" |
145 | - "pmove %%psr,%0@" |
146 | - : : "a" (&temp), "a" (addr), "d" (ssw)); |
147 | + "pmove %%psr,%0" |
148 | + : "=m" (temp) : "a" (addr), "d" (ssw)); |
149 | #endif |
150 | mmusr = temp; |
151 | |
152 | @@ -605,20 +605,18 @@ static inline void bus_error030 (struct frame *fp) |
153 | !(ssw & RW) ? "write" : "read", addr, |
154 | fp->ptregs.pc, ssw); |
155 | asm volatile ("ptestr #1,%1@,#0\n\t" |
156 | - "pmove %%psr,%0@" |
157 | - : /* no outputs */ |
158 | - : "a" (&temp), "a" (addr)); |
159 | + "pmove %%psr,%0" |
160 | + : "=m" (temp) |
161 | + : "a" (addr)); |
162 | mmusr = temp; |
163 | |
164 | printk ("level 0 mmusr is %#x\n", mmusr); |
165 | #if 0 |
166 | - asm volatile ("pmove %%tt0,%0@" |
167 | - : /* no outputs */ |
168 | - : "a" (&tlong)); |
169 | + asm volatile ("pmove %%tt0,%0" |
170 | + : "=m" (tlong)); |
171 | printk("tt0 is %#lx, ", tlong); |
172 | - asm volatile ("pmove %%tt1,%0@" |
173 | - : /* no outputs */ |
174 | - : "a" (&tlong)); |
175 | + asm volatile ("pmove %%tt1,%0" |
176 | + : "=m" (tlong)); |
177 | printk("tt1 is %#lx\n", tlong); |
178 | #endif |
179 | #ifdef DEBUG |
180 | @@ -668,13 +666,13 @@ static inline void bus_error030 (struct frame *fp) |
181 | |
182 | #ifdef DEBUG |
183 | asm volatile ("ptestr #1,%2@,#7,%0\n\t" |
184 | - "pmove %%psr,%1@" |
185 | - : "=a&" (desc) |
186 | - : "a" (&temp), "a" (addr)); |
187 | + "pmove %%psr,%1" |
188 | + : "=a&" (desc), "=m" (temp) |
189 | + : "a" (addr)); |
190 | #else |
191 | asm volatile ("ptestr #1,%1@,#7\n\t" |
192 | - "pmove %%psr,%0@" |
193 | - : : "a" (&temp), "a" (addr)); |
194 | + "pmove %%psr,%0" |
195 | + : "=m" (temp) : "a" (addr)); |
196 | #endif |
197 | mmusr = temp; |
198 | |
199 | diff --git a/arch/m68k/mm/cache.c b/arch/m68k/mm/cache.c |
200 | index 5437fff..5550aa4 100644 |
201 | --- a/arch/m68k/mm/cache.c |
202 | +++ b/arch/m68k/mm/cache.c |
203 | @@ -52,9 +52,9 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr) |
204 | unsigned long *descaddr; |
205 | |
206 | asm volatile ("ptestr %3,%2@,#7,%0\n\t" |
207 | - "pmove %%psr,%1@" |
208 | - : "=a&" (descaddr) |
209 | - : "a" (&mmusr), "a" (vaddr), "d" (get_fs().seg)); |
210 | + "pmove %%psr,%1" |
211 | + : "=a&" (descaddr), "=m" (mmusr) |
212 | + : "a" (vaddr), "d" (get_fs().seg)); |
213 | if (mmusr & (MMU_I|MMU_B|MMU_L)) |
214 | return 0; |
215 | descaddr = phys_to_virt((unsigned long)descaddr); |
216 | diff --git a/arch/x86/include/asm/uv/uv_hub.h b/arch/x86/include/asm/uv/uv_hub.h |
217 | index 54a13aa..21f7385 100644 |
218 | --- a/arch/x86/include/asm/uv/uv_hub.h |
219 | +++ b/arch/x86/include/asm/uv/uv_hub.h |
220 | @@ -318,13 +318,13 @@ uv_gpa_in_mmr_space(unsigned long gpa) |
221 | /* UV global physical address --> socket phys RAM */ |
222 | static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa) |
223 | { |
224 | - unsigned long paddr = gpa & uv_hub_info->gpa_mask; |
225 | + unsigned long paddr; |
226 | unsigned long remap_base = uv_hub_info->lowmem_remap_base; |
227 | unsigned long remap_top = uv_hub_info->lowmem_remap_top; |
228 | |
229 | gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) | |
230 | ((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val); |
231 | - gpa = gpa & uv_hub_info->gpa_mask; |
232 | + paddr = gpa & uv_hub_info->gpa_mask; |
233 | if (paddr >= remap_base && paddr < remap_base + remap_top) |
234 | paddr -= remap_base; |
235 | return paddr; |
236 | diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c |
237 | index d494799..ac52c15 100644 |
238 | --- a/arch/x86/kernel/microcode_amd.c |
239 | +++ b/arch/x86/kernel/microcode_amd.c |
240 | @@ -300,13 +300,33 @@ free_table: |
241 | return state; |
242 | } |
243 | |
244 | +/* |
245 | + * AMD microcode firmware naming convention, up to family 15h they are in |
246 | + * the legacy file: |
247 | + * |
248 | + * amd-ucode/microcode_amd.bin |
249 | + * |
250 | + * This legacy file is always smaller than 2K in size. |
251 | + * |
252 | + * Starting at family 15h they are in family specific firmware files: |
253 | + * |
254 | + * amd-ucode/microcode_amd_fam15h.bin |
255 | + * amd-ucode/microcode_amd_fam16h.bin |
256 | + * ... |
257 | + * |
258 | + * These might be larger than 2K. |
259 | + */ |
260 | static enum ucode_state request_microcode_amd(int cpu, struct device *device) |
261 | { |
262 | - const char *fw_name = "amd-ucode/microcode_amd.bin"; |
263 | + char fw_name[36] = "amd-ucode/microcode_amd.bin"; |
264 | const struct firmware *fw; |
265 | enum ucode_state ret = UCODE_NFOUND; |
266 | + struct cpuinfo_x86 *c = &cpu_data(cpu); |
267 | + |
268 | + if (c->x86 >= 0x15) |
269 | + snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86); |
270 | |
271 | - if (request_firmware(&fw, fw_name, device)) { |
272 | + if (request_firmware(&fw, (const char *)fw_name, device)) { |
273 | pr_err("failed to load file %s\n", fw_name); |
274 | goto out; |
275 | } |
276 | diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c |
277 | index 7b65f75..7c1b765 100644 |
278 | --- a/arch/x86/net/bpf_jit_comp.c |
279 | +++ b/arch/x86/net/bpf_jit_comp.c |
280 | @@ -151,17 +151,18 @@ void bpf_jit_compile(struct sk_filter *fp) |
281 | cleanup_addr = proglen; /* epilogue address */ |
282 | |
283 | for (pass = 0; pass < 10; pass++) { |
284 | + u8 seen_or_pass0 = (pass == 0) ? (SEEN_XREG | SEEN_DATAREF | SEEN_MEM) : seen; |
285 | /* no prologue/epilogue for trivial filters (RET something) */ |
286 | proglen = 0; |
287 | prog = temp; |
288 | |
289 | - if (seen) { |
290 | + if (seen_or_pass0) { |
291 | EMIT4(0x55, 0x48, 0x89, 0xe5); /* push %rbp; mov %rsp,%rbp */ |
292 | EMIT4(0x48, 0x83, 0xec, 96); /* subq $96,%rsp */ |
293 | /* note : must save %rbx in case bpf_error is hit */ |
294 | - if (seen & (SEEN_XREG | SEEN_DATAREF)) |
295 | + if (seen_or_pass0 & (SEEN_XREG | SEEN_DATAREF)) |
296 | EMIT4(0x48, 0x89, 0x5d, 0xf8); /* mov %rbx, -8(%rbp) */ |
297 | - if (seen & SEEN_XREG) |
298 | + if (seen_or_pass0 & SEEN_XREG) |
299 | CLEAR_X(); /* make sure we dont leek kernel memory */ |
300 | |
301 | /* |
302 | @@ -170,7 +171,7 @@ void bpf_jit_compile(struct sk_filter *fp) |
303 | * r9 = skb->len - skb->data_len |
304 | * r8 = skb->data |
305 | */ |
306 | - if (seen & SEEN_DATAREF) { |
307 | + if (seen_or_pass0 & SEEN_DATAREF) { |
308 | if (offsetof(struct sk_buff, len) <= 127) |
309 | /* mov off8(%rdi),%r9d */ |
310 | EMIT4(0x44, 0x8b, 0x4f, offsetof(struct sk_buff, len)); |
311 | @@ -260,9 +261,14 @@ void bpf_jit_compile(struct sk_filter *fp) |
312 | case BPF_S_ALU_DIV_X: /* A /= X; */ |
313 | seen |= SEEN_XREG; |
314 | EMIT2(0x85, 0xdb); /* test %ebx,%ebx */ |
315 | - if (pc_ret0 != -1) |
316 | - EMIT_COND_JMP(X86_JE, addrs[pc_ret0] - (addrs[i] - 4)); |
317 | - else { |
318 | + if (pc_ret0 > 0) { |
319 | + /* addrs[pc_ret0 - 1] is start address of target |
320 | + * (addrs[i] - 4) is the address following this jmp |
321 | + * ("xor %edx,%edx; div %ebx" being 4 bytes long) |
322 | + */ |
323 | + EMIT_COND_JMP(X86_JE, addrs[pc_ret0 - 1] - |
324 | + (addrs[i] - 4)); |
325 | + } else { |
326 | EMIT_COND_JMP(X86_JNE, 2 + 5); |
327 | CLEAR_A(); |
328 | EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 4)); /* jmp .+off32 */ |
329 | @@ -335,12 +341,12 @@ void bpf_jit_compile(struct sk_filter *fp) |
330 | } |
331 | /* fallinto */ |
332 | case BPF_S_RET_A: |
333 | - if (seen) { |
334 | + if (seen_or_pass0) { |
335 | if (i != flen - 1) { |
336 | EMIT_JMP(cleanup_addr - addrs[i]); |
337 | break; |
338 | } |
339 | - if (seen & SEEN_XREG) |
340 | + if (seen_or_pass0 & SEEN_XREG) |
341 | EMIT4(0x48, 0x8b, 0x5d, 0xf8); /* mov -8(%rbp),%rbx */ |
342 | EMIT1(0xc9); /* leaveq */ |
343 | } |
344 | @@ -483,8 +489,9 @@ common_load: seen |= SEEN_DATAREF; |
345 | goto common_load; |
346 | case BPF_S_LDX_B_MSH: |
347 | if ((int)K < 0) { |
348 | - if (pc_ret0 != -1) { |
349 | - EMIT_JMP(addrs[pc_ret0] - addrs[i]); |
350 | + if (pc_ret0 > 0) { |
351 | + /* addrs[pc_ret0 - 1] is the start address */ |
352 | + EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]); |
353 | break; |
354 | } |
355 | CLEAR_A(); |
356 | @@ -599,13 +606,14 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i]; |
357 | * use it to give the cleanup instruction(s) addr |
358 | */ |
359 | cleanup_addr = proglen - 1; /* ret */ |
360 | - if (seen) |
361 | + if (seen_or_pass0) |
362 | cleanup_addr -= 1; /* leaveq */ |
363 | - if (seen & SEEN_XREG) |
364 | + if (seen_or_pass0 & SEEN_XREG) |
365 | cleanup_addr -= 4; /* mov -8(%rbp),%rbx */ |
366 | |
367 | if (image) { |
368 | - WARN_ON(proglen != oldproglen); |
369 | + if (proglen != oldproglen) |
370 | + pr_err("bpb_jit_compile proglen=%u != oldproglen=%u\n", proglen, oldproglen); |
371 | break; |
372 | } |
373 | if (proglen == oldproglen) { |
374 | diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c |
375 | index 9010ca7..81aee5a 100644 |
376 | --- a/arch/x86/platform/uv/tlb_uv.c |
377 | +++ b/arch/x86/platform/uv/tlb_uv.c |
378 | @@ -1860,6 +1860,8 @@ static void __init init_per_cpu_tunables(void) |
379 | bcp->cong_reps = congested_reps; |
380 | bcp->cong_period = congested_period; |
381 | bcp->clocks_per_100_usec = usec_2_cycles(100); |
382 | + spin_lock_init(&bcp->queue_lock); |
383 | + spin_lock_init(&bcp->uvhub_lock); |
384 | } |
385 | } |
386 | |
387 | diff --git a/arch/x86/platform/uv/uv_irq.c b/arch/x86/platform/uv/uv_irq.c |
388 | index 374a05d..f25c276 100644 |
389 | --- a/arch/x86/platform/uv/uv_irq.c |
390 | +++ b/arch/x86/platform/uv/uv_irq.c |
391 | @@ -25,7 +25,7 @@ struct uv_irq_2_mmr_pnode{ |
392 | int irq; |
393 | }; |
394 | |
395 | -static spinlock_t uv_irq_lock; |
396 | +static DEFINE_SPINLOCK(uv_irq_lock); |
397 | static struct rb_root uv_irq_root; |
398 | |
399 | static int uv_set_irq_affinity(struct irq_data *, const struct cpumask *, bool); |
400 | diff --git a/arch/x86/xen/spinlock.c b/arch/x86/xen/spinlock.c |
401 | index cc9b1e1..d69cc6c 100644 |
402 | --- a/arch/x86/xen/spinlock.c |
403 | +++ b/arch/x86/xen/spinlock.c |
404 | @@ -116,9 +116,26 @@ static inline void spin_time_accum_blocked(u64 start) |
405 | } |
406 | #endif /* CONFIG_XEN_DEBUG_FS */ |
407 | |
408 | +/* |
409 | + * Size struct xen_spinlock so it's the same as arch_spinlock_t. |
410 | + */ |
411 | +#if NR_CPUS < 256 |
412 | +typedef u8 xen_spinners_t; |
413 | +# define inc_spinners(xl) \ |
414 | + asm(LOCK_PREFIX " incb %0" : "+m" ((xl)->spinners) : : "memory"); |
415 | +# define dec_spinners(xl) \ |
416 | + asm(LOCK_PREFIX " decb %0" : "+m" ((xl)->spinners) : : "memory"); |
417 | +#else |
418 | +typedef u16 xen_spinners_t; |
419 | +# define inc_spinners(xl) \ |
420 | + asm(LOCK_PREFIX " incw %0" : "+m" ((xl)->spinners) : : "memory"); |
421 | +# define dec_spinners(xl) \ |
422 | + asm(LOCK_PREFIX " decw %0" : "+m" ((xl)->spinners) : : "memory"); |
423 | +#endif |
424 | + |
425 | struct xen_spinlock { |
426 | unsigned char lock; /* 0 -> free; 1 -> locked */ |
427 | - unsigned short spinners; /* count of waiting cpus */ |
428 | + xen_spinners_t spinners; /* count of waiting cpus */ |
429 | }; |
430 | |
431 | static int xen_spin_is_locked(struct arch_spinlock *lock) |
432 | @@ -164,8 +181,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl) |
433 | |
434 | wmb(); /* set lock of interest before count */ |
435 | |
436 | - asm(LOCK_PREFIX " incw %0" |
437 | - : "+m" (xl->spinners) : : "memory"); |
438 | + inc_spinners(xl); |
439 | |
440 | return prev; |
441 | } |
442 | @@ -176,8 +192,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl) |
443 | */ |
444 | static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev) |
445 | { |
446 | - asm(LOCK_PREFIX " decw %0" |
447 | - : "+m" (xl->spinners) : : "memory"); |
448 | + dec_spinners(xl); |
449 | wmb(); /* decrement count before restoring lock */ |
450 | __this_cpu_write(lock_spinners, prev); |
451 | } |
452 | @@ -373,6 +388,8 @@ void xen_uninit_lock_cpu(int cpu) |
453 | |
454 | void __init xen_init_spinlocks(void) |
455 | { |
456 | + BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t)); |
457 | + |
458 | pv_lock_ops.spin_is_locked = xen_spin_is_locked; |
459 | pv_lock_ops.spin_is_contended = xen_spin_is_contended; |
460 | pv_lock_ops.spin_lock = xen_spin_lock; |
461 | diff --git a/crypto/sha512_generic.c b/crypto/sha512_generic.c |
462 | index 9ed9f60..88f160b 100644 |
463 | --- a/crypto/sha512_generic.c |
464 | +++ b/crypto/sha512_generic.c |
465 | @@ -21,8 +21,6 @@ |
466 | #include <linux/percpu.h> |
467 | #include <asm/byteorder.h> |
468 | |
469 | -static DEFINE_PER_CPU(u64[80], msg_schedule); |
470 | - |
471 | static inline u64 Ch(u64 x, u64 y, u64 z) |
472 | { |
473 | return z ^ (x & (y ^ z)); |
474 | @@ -80,7 +78,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input) |
475 | |
476 | static inline void BLEND_OP(int I, u64 *W) |
477 | { |
478 | - W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16]; |
479 | + W[I % 16] += s1(W[(I-2) % 16]) + W[(I-7) % 16] + s0(W[(I-15) % 16]); |
480 | } |
481 | |
482 | static void |
483 | @@ -89,38 +87,48 @@ sha512_transform(u64 *state, const u8 *input) |
484 | u64 a, b, c, d, e, f, g, h, t1, t2; |
485 | |
486 | int i; |
487 | - u64 *W = get_cpu_var(msg_schedule); |
488 | + u64 W[16]; |
489 | |
490 | /* load the input */ |
491 | for (i = 0; i < 16; i++) |
492 | LOAD_OP(i, W, input); |
493 | |
494 | - for (i = 16; i < 80; i++) { |
495 | - BLEND_OP(i, W); |
496 | - } |
497 | - |
498 | /* load the state into our registers */ |
499 | a=state[0]; b=state[1]; c=state[2]; d=state[3]; |
500 | e=state[4]; f=state[5]; g=state[6]; h=state[7]; |
501 | |
502 | - /* now iterate */ |
503 | - for (i=0; i<80; i+=8) { |
504 | - t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[i ]; |
505 | - t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2; |
506 | - t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[i+1]; |
507 | - t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2; |
508 | - t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[i+2]; |
509 | - t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2; |
510 | - t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[i+3]; |
511 | - t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2; |
512 | - t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[i+4]; |
513 | - t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2; |
514 | - t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[i+5]; |
515 | - t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2; |
516 | - t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[i+6]; |
517 | - t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2; |
518 | - t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[i+7]; |
519 | - t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2; |
520 | +#define SHA512_0_15(i, a, b, c, d, e, f, g, h) \ |
521 | + t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[i]; \ |
522 | + t2 = e0(a) + Maj(a, b, c); \ |
523 | + d += t1; \ |
524 | + h = t1 + t2 |
525 | + |
526 | +#define SHA512_16_79(i, a, b, c, d, e, f, g, h) \ |
527 | + BLEND_OP(i, W); \ |
528 | + t1 = h + e1(e) + Ch(e, f, g) + sha512_K[i] + W[(i)%16]; \ |
529 | + t2 = e0(a) + Maj(a, b, c); \ |
530 | + d += t1; \ |
531 | + h = t1 + t2 |
532 | + |
533 | + for (i = 0; i < 16; i += 8) { |
534 | + SHA512_0_15(i, a, b, c, d, e, f, g, h); |
535 | + SHA512_0_15(i + 1, h, a, b, c, d, e, f, g); |
536 | + SHA512_0_15(i + 2, g, h, a, b, c, d, e, f); |
537 | + SHA512_0_15(i + 3, f, g, h, a, b, c, d, e); |
538 | + SHA512_0_15(i + 4, e, f, g, h, a, b, c, d); |
539 | + SHA512_0_15(i + 5, d, e, f, g, h, a, b, c); |
540 | + SHA512_0_15(i + 6, c, d, e, f, g, h, a, b); |
541 | + SHA512_0_15(i + 7, b, c, d, e, f, g, h, a); |
542 | + } |
543 | + for (i = 16; i < 80; i += 8) { |
544 | + SHA512_16_79(i, a, b, c, d, e, f, g, h); |
545 | + SHA512_16_79(i + 1, h, a, b, c, d, e, f, g); |
546 | + SHA512_16_79(i + 2, g, h, a, b, c, d, e, f); |
547 | + SHA512_16_79(i + 3, f, g, h, a, b, c, d, e); |
548 | + SHA512_16_79(i + 4, e, f, g, h, a, b, c, d); |
549 | + SHA512_16_79(i + 5, d, e, f, g, h, a, b, c); |
550 | + SHA512_16_79(i + 6, c, d, e, f, g, h, a, b); |
551 | + SHA512_16_79(i + 7, b, c, d, e, f, g, h, a); |
552 | } |
553 | |
554 | state[0] += a; state[1] += b; state[2] += c; state[3] += d; |
555 | @@ -128,8 +136,6 @@ sha512_transform(u64 *state, const u8 *input) |
556 | |
557 | /* erase our data */ |
558 | a = b = c = d = e = f = g = h = t1 = t2 = 0; |
559 | - memset(W, 0, sizeof(__get_cpu_var(msg_schedule))); |
560 | - put_cpu_var(msg_schedule); |
561 | } |
562 | |
563 | static int |
564 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c |
565 | index 3f4051a..c7e5282 100644 |
566 | --- a/drivers/char/tpm/tpm_tis.c |
567 | +++ b/drivers/char/tpm/tpm_tis.c |
568 | @@ -432,6 +432,9 @@ static int probe_itpm(struct tpm_chip *chip) |
569 | out: |
570 | itpm = rem_itpm; |
571 | tpm_tis_ready(chip); |
572 | + /* some TPMs need a break here otherwise they will not work |
573 | + * correctly on the immediately subsequent command */ |
574 | + msleep(chip->vendor.timeout_b); |
575 | release_locality(chip, chip->vendor.locality, 0); |
576 | |
577 | return rc; |
578 | diff --git a/drivers/gpu/drm/drm_auth.c b/drivers/gpu/drm/drm_auth.c |
579 | index 3f46772..ba23790 100644 |
580 | --- a/drivers/gpu/drm/drm_auth.c |
581 | +++ b/drivers/gpu/drm/drm_auth.c |
582 | @@ -101,7 +101,7 @@ static int drm_add_magic(struct drm_master *master, struct drm_file *priv, |
583 | * Searches and unlinks the entry in drm_device::magiclist with the magic |
584 | * number hash key, while holding the drm_device::struct_mutex lock. |
585 | */ |
586 | -static int drm_remove_magic(struct drm_master *master, drm_magic_t magic) |
587 | +int drm_remove_magic(struct drm_master *master, drm_magic_t magic) |
588 | { |
589 | struct drm_magic_entry *pt; |
590 | struct drm_hash_item *hash; |
591 | @@ -136,6 +136,8 @@ static int drm_remove_magic(struct drm_master *master, drm_magic_t magic) |
592 | * If there is a magic number in drm_file::magic then use it, otherwise |
593 | * searches an unique non-zero magic number and add it associating it with \p |
594 | * file_priv. |
595 | + * This ioctl needs protection by the drm_global_mutex, which protects |
596 | + * struct drm_file::magic and struct drm_magic_entry::priv. |
597 | */ |
598 | int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) |
599 | { |
600 | @@ -173,6 +175,8 @@ int drm_getmagic(struct drm_device *dev, void *data, struct drm_file *file_priv) |
601 | * \return zero if authentication successed, or a negative number otherwise. |
602 | * |
603 | * Checks if \p file_priv is associated with the magic number passed in \arg. |
604 | + * This ioctl needs protection by the drm_global_mutex, which protects |
605 | + * struct drm_file::magic and struct drm_magic_entry::priv. |
606 | */ |
607 | int drm_authmagic(struct drm_device *dev, void *data, |
608 | struct drm_file *file_priv) |
609 | diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c |
610 | index 4911e1d..828bf65 100644 |
611 | --- a/drivers/gpu/drm/drm_fops.c |
612 | +++ b/drivers/gpu/drm/drm_fops.c |
613 | @@ -487,6 +487,11 @@ int drm_release(struct inode *inode, struct file *filp) |
614 | (long)old_encode_dev(file_priv->minor->device), |
615 | dev->open_count); |
616 | |
617 | + /* Release any auth tokens that might point to this file_priv, |
618 | + (do that under the drm_global_mutex) */ |
619 | + if (file_priv->magic) |
620 | + (void) drm_remove_magic(file_priv->master, file_priv->magic); |
621 | + |
622 | /* if the master has gone away we can't do anything with the lock */ |
623 | if (file_priv->minor->master) |
624 | drm_master_release(dev, filp); |
625 | diff --git a/drivers/gpu/drm/i915/i915_suspend.c b/drivers/gpu/drm/i915/i915_suspend.c |
626 | index 7886e4f..43cbafe 100644 |
627 | --- a/drivers/gpu/drm/i915/i915_suspend.c |
628 | +++ b/drivers/gpu/drm/i915/i915_suspend.c |
629 | @@ -822,7 +822,7 @@ int i915_save_state(struct drm_device *dev) |
630 | |
631 | if (IS_IRONLAKE_M(dev)) |
632 | ironlake_disable_drps(dev); |
633 | - if (IS_GEN6(dev)) |
634 | + if (INTEL_INFO(dev)->gen >= 6) |
635 | gen6_disable_rps(dev); |
636 | |
637 | /* Cache mode state */ |
638 | @@ -881,7 +881,7 @@ int i915_restore_state(struct drm_device *dev) |
639 | intel_init_emon(dev); |
640 | } |
641 | |
642 | - if (IS_GEN6(dev)) { |
643 | + if (INTEL_INFO(dev)->gen >= 6) { |
644 | gen6_enable_rps(dev_priv); |
645 | gen6_update_ring_freq(dev_priv); |
646 | } |
647 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
648 | index ca70e2f..30a9af9 100644 |
649 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
650 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
651 | @@ -631,6 +631,19 @@ render_ring_add_request(struct intel_ring_buffer *ring, |
652 | } |
653 | |
654 | static u32 |
655 | +gen6_ring_get_seqno(struct intel_ring_buffer *ring) |
656 | +{ |
657 | + struct drm_device *dev = ring->dev; |
658 | + |
659 | + /* Workaround to force correct ordering between irq and seqno writes on |
660 | + * ivb (and maybe also on snb) by reading from a CS register (like |
661 | + * ACTHD) before reading the status page. */ |
662 | + if (IS_GEN7(dev)) |
663 | + intel_ring_get_active_head(ring); |
664 | + return intel_read_status_page(ring, I915_GEM_HWS_INDEX); |
665 | +} |
666 | + |
667 | +static u32 |
668 | ring_get_seqno(struct intel_ring_buffer *ring) |
669 | { |
670 | return intel_read_status_page(ring, I915_GEM_HWS_INDEX); |
671 | @@ -795,6 +808,12 @@ gen6_ring_get_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) |
672 | if (!dev->irq_enabled) |
673 | return false; |
674 | |
675 | + /* It looks like we need to prevent the gt from suspending while waiting |
676 | + * for an notifiy irq, otherwise irqs seem to get lost on at least the |
677 | + * blt/bsd rings on ivb. */ |
678 | + if (IS_GEN7(dev)) |
679 | + gen6_gt_force_wake_get(dev_priv); |
680 | + |
681 | spin_lock(&ring->irq_lock); |
682 | if (ring->irq_refcount++ == 0) { |
683 | ring->irq_mask &= ~rflag; |
684 | @@ -819,6 +838,9 @@ gen6_ring_put_irq(struct intel_ring_buffer *ring, u32 gflag, u32 rflag) |
685 | ironlake_disable_irq(dev_priv, gflag); |
686 | } |
687 | spin_unlock(&ring->irq_lock); |
688 | + |
689 | + if (IS_GEN7(dev)) |
690 | + gen6_gt_force_wake_put(dev_priv); |
691 | } |
692 | |
693 | static bool |
694 | @@ -1316,7 +1338,7 @@ static const struct intel_ring_buffer gen6_bsd_ring = { |
695 | .write_tail = gen6_bsd_ring_write_tail, |
696 | .flush = gen6_ring_flush, |
697 | .add_request = gen6_add_request, |
698 | - .get_seqno = ring_get_seqno, |
699 | + .get_seqno = gen6_ring_get_seqno, |
700 | .irq_get = gen6_bsd_ring_get_irq, |
701 | .irq_put = gen6_bsd_ring_put_irq, |
702 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, |
703 | @@ -1451,7 +1473,7 @@ static const struct intel_ring_buffer gen6_blt_ring = { |
704 | .write_tail = ring_write_tail, |
705 | .flush = blt_ring_flush, |
706 | .add_request = gen6_add_request, |
707 | - .get_seqno = ring_get_seqno, |
708 | + .get_seqno = gen6_ring_get_seqno, |
709 | .irq_get = blt_ring_get_irq, |
710 | .irq_put = blt_ring_put_irq, |
711 | .dispatch_execbuffer = gen6_ring_dispatch_execbuffer, |
712 | @@ -1474,6 +1496,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev) |
713 | ring->flush = gen6_render_ring_flush; |
714 | ring->irq_get = gen6_render_ring_get_irq; |
715 | ring->irq_put = gen6_render_ring_put_irq; |
716 | + ring->get_seqno = gen6_ring_get_seqno; |
717 | } else if (IS_GEN5(dev)) { |
718 | ring->add_request = pc_render_add_request; |
719 | ring->get_seqno = pc_render_get_seqno; |
720 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c |
721 | index f7b9268..e334ec3 100644 |
722 | --- a/drivers/gpu/drm/i915/intel_sdvo.c |
723 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c |
724 | @@ -1066,15 +1066,13 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder, |
725 | |
726 | /* Set the SDVO control regs. */ |
727 | if (INTEL_INFO(dev)->gen >= 4) { |
728 | - sdvox = 0; |
729 | + /* The real mode polarity is set by the SDVO commands, using |
730 | + * struct intel_sdvo_dtd. */ |
731 | + sdvox = SDVO_VSYNC_ACTIVE_HIGH | SDVO_HSYNC_ACTIVE_HIGH; |
732 | if (intel_sdvo->is_hdmi) |
733 | sdvox |= intel_sdvo->color_range; |
734 | if (INTEL_INFO(dev)->gen < 5) |
735 | sdvox |= SDVO_BORDER_ENABLE; |
736 | - if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC) |
737 | - sdvox |= SDVO_VSYNC_ACTIVE_HIGH; |
738 | - if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) |
739 | - sdvox |= SDVO_HSYNC_ACTIVE_HIGH; |
740 | } else { |
741 | sdvox = I915_READ(intel_sdvo->sdvo_reg); |
742 | switch (intel_sdvo->sdvo_reg) { |
743 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c |
744 | index 6fb335a..a71557c 100644 |
745 | --- a/drivers/gpu/drm/radeon/atombios_dp.c |
746 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c |
747 | @@ -549,8 +549,8 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector) |
748 | return false; |
749 | } |
750 | |
751 | -static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, |
752 | - struct drm_connector *connector) |
753 | +int radeon_dp_get_panel_mode(struct drm_encoder *encoder, |
754 | + struct drm_connector *connector) |
755 | { |
756 | struct drm_device *dev = encoder->dev; |
757 | struct radeon_device *rdev = dev->dev_private; |
758 | @@ -558,7 +558,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, |
759 | int panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
760 | |
761 | if (!ASIC_IS_DCE4(rdev)) |
762 | - return; |
763 | + return panel_mode; |
764 | |
765 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) == |
766 | ENCODER_OBJECT_ID_NUTMEG) |
767 | @@ -572,14 +572,7 @@ static void radeon_dp_set_panel_mode(struct drm_encoder *encoder, |
768 | panel_mode = DP_PANEL_MODE_INTERNAL_DP2_MODE; |
769 | } |
770 | |
771 | - atombios_dig_encoder_setup(encoder, |
772 | - ATOM_ENCODER_CMD_SETUP_PANEL_MODE, |
773 | - panel_mode); |
774 | - |
775 | - if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) && |
776 | - (panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { |
777 | - radeon_write_dpcd_reg(radeon_connector, DP_EDP_CONFIGURATION_SET, 1); |
778 | - } |
779 | + return panel_mode; |
780 | } |
781 | |
782 | void radeon_dp_set_link_config(struct drm_connector *connector, |
783 | @@ -717,6 +710,8 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp) |
784 | |
785 | static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) |
786 | { |
787 | + struct radeon_encoder *radeon_encoder = to_radeon_encoder(dp_info->encoder); |
788 | + struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
789 | u8 tmp; |
790 | |
791 | /* power up the sink */ |
792 | @@ -732,7 +727,10 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) |
793 | radeon_write_dpcd_reg(dp_info->radeon_connector, |
794 | DP_DOWNSPREAD_CTRL, 0); |
795 | |
796 | - radeon_dp_set_panel_mode(dp_info->encoder, dp_info->connector); |
797 | + if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) && |
798 | + (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) { |
799 | + radeon_write_dpcd_reg(dp_info->radeon_connector, DP_EDP_CONFIGURATION_SET, 1); |
800 | + } |
801 | |
802 | /* set the lane count on the sink */ |
803 | tmp = dp_info->dp_lane_count; |
804 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c |
805 | index 39c04c1..0f8eb48 100644 |
806 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c |
807 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c |
808 | @@ -1352,7 +1352,8 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) |
809 | switch (mode) { |
810 | case DRM_MODE_DPMS_ON: |
811 | /* some early dce3.2 boards have a bug in their transmitter control table */ |
812 | - if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730)) |
813 | + if ((rdev->family == CHIP_RV710) || (rdev->family == CHIP_RV730) || |
814 | + ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) |
815 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); |
816 | else |
817 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); |
818 | @@ -1362,8 +1363,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) |
819 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
820 | radeon_dig_connector->edp_on = true; |
821 | } |
822 | - if (ASIC_IS_DCE4(rdev)) |
823 | - atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
824 | radeon_dp_link_train(encoder, connector); |
825 | if (ASIC_IS_DCE4(rdev)) |
826 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON, 0); |
827 | @@ -1374,7 +1373,10 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) |
828 | case DRM_MODE_DPMS_STANDBY: |
829 | case DRM_MODE_DPMS_SUSPEND: |
830 | case DRM_MODE_DPMS_OFF: |
831 | - atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); |
832 | + if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) |
833 | + atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); |
834 | + else |
835 | + atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); |
836 | if (ENCODER_MODE_IS_DP(atombios_get_encoder_mode(encoder)) && connector) { |
837 | if (ASIC_IS_DCE4(rdev)) |
838 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_OFF, 0); |
839 | @@ -1821,7 +1823,21 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, |
840 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: |
841 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: |
842 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
843 | - if (ASIC_IS_DCE4(rdev)) { |
844 | + if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
845 | + struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
846 | + struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
847 | + |
848 | + if (!connector) |
849 | + dig->panel_mode = DP_PANEL_MODE_EXTERNAL_DP_MODE; |
850 | + else |
851 | + dig->panel_mode = radeon_dp_get_panel_mode(encoder, connector); |
852 | + |
853 | + /* setup and enable the encoder */ |
854 | + atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_SETUP, 0); |
855 | + atombios_dig_encoder_setup(encoder, |
856 | + ATOM_ENCODER_CMD_SETUP_PANEL_MODE, |
857 | + dig->panel_mode); |
858 | + } else if (ASIC_IS_DCE4(rdev)) { |
859 | /* disable the transmitter */ |
860 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); |
861 | /* setup and enable the encoder */ |
862 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c |
863 | index 8f86aeb..e7ddb49 100644 |
864 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c |
865 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c |
866 | @@ -134,6 +134,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev) |
867 | /* Dell RS690 only seems to work with MSIs. */ |
868 | if ((rdev->pdev->device == 0x791f) && |
869 | (rdev->pdev->subsystem_vendor == 0x1028) && |
870 | + (rdev->pdev->subsystem_device == 0x01fc)) |
871 | + return true; |
872 | + |
873 | + /* Dell RS690 only seems to work with MSIs. */ |
874 | + if ((rdev->pdev->device == 0x791f) && |
875 | + (rdev->pdev->subsystem_vendor == 0x1028) && |
876 | (rdev->pdev->subsystem_device == 0x01fd)) |
877 | return true; |
878 | |
879 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h |
880 | index 2c2e75e..8254d5a 100644 |
881 | --- a/drivers/gpu/drm/radeon/radeon_mode.h |
882 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h |
883 | @@ -362,6 +362,7 @@ struct radeon_encoder_atom_dig { |
884 | struct backlight_device *bl_dev; |
885 | int dpms_mode; |
886 | uint8_t backlight_level; |
887 | + int panel_mode; |
888 | }; |
889 | |
890 | struct radeon_encoder_atom_dac { |
891 | @@ -482,6 +483,8 @@ extern void radeon_dp_link_train(struct drm_encoder *encoder, |
892 | extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector); |
893 | extern u8 radeon_dp_getsinktype(struct radeon_connector *radeon_connector); |
894 | extern bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector); |
895 | +extern int radeon_dp_get_panel_mode(struct drm_encoder *encoder, |
896 | + struct drm_connector *connector); |
897 | extern void atombios_dig_encoder_setup(struct drm_encoder *encoder, int action, int panel_mode); |
898 | extern void radeon_atom_encoder_init(struct radeon_device *rdev); |
899 | extern void atombios_dig_transmitter_setup(struct drm_encoder *encoder, |
900 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
901 | index f94b33a..7c88f1f 100644 |
902 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
903 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c |
904 | @@ -378,7 +378,7 @@ int vmw_framebuffer_create_handle(struct drm_framebuffer *fb, |
905 | unsigned int *handle) |
906 | { |
907 | if (handle) |
908 | - handle = 0; |
909 | + *handle = 0; |
910 | |
911 | return 0; |
912 | } |
913 | diff --git a/drivers/hwmon/f71805f.c b/drivers/hwmon/f71805f.c |
914 | index 92f9497..6dbfd3e 100644 |
915 | --- a/drivers/hwmon/f71805f.c |
916 | +++ b/drivers/hwmon/f71805f.c |
917 | @@ -283,11 +283,11 @@ static inline long temp_from_reg(u8 reg) |
918 | |
919 | static inline u8 temp_to_reg(long val) |
920 | { |
921 | - if (val < 0) |
922 | - val = 0; |
923 | - else if (val > 1000 * 0xff) |
924 | - val = 0xff; |
925 | - return ((val + 500) / 1000); |
926 | + if (val <= 0) |
927 | + return 0; |
928 | + if (val >= 1000 * 0xff) |
929 | + return 0xff; |
930 | + return (val + 500) / 1000; |
931 | } |
932 | |
933 | /* |
934 | diff --git a/drivers/hwmon/sht15.c b/drivers/hwmon/sht15.c |
935 | index fe4104c..5357925 100644 |
936 | --- a/drivers/hwmon/sht15.c |
937 | +++ b/drivers/hwmon/sht15.c |
938 | @@ -883,7 +883,7 @@ static int sht15_invalidate_voltage(struct notifier_block *nb, |
939 | |
940 | static int __devinit sht15_probe(struct platform_device *pdev) |
941 | { |
942 | - int ret = 0; |
943 | + int ret; |
944 | struct sht15_data *data = kzalloc(sizeof(*data), GFP_KERNEL); |
945 | u8 status = 0; |
946 | |
947 | @@ -901,6 +901,7 @@ static int __devinit sht15_probe(struct platform_device *pdev) |
948 | init_waitqueue_head(&data->wait_queue); |
949 | |
950 | if (pdev->dev.platform_data == NULL) { |
951 | + ret = -EINVAL; |
952 | dev_err(&pdev->dev, "no platform data supplied\n"); |
953 | goto err_free_data; |
954 | } |
955 | diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c |
956 | index 93f5fc7..4b57ab6 100644 |
957 | --- a/drivers/hwmon/w83627ehf.c |
958 | +++ b/drivers/hwmon/w83627ehf.c |
959 | @@ -1319,6 +1319,7 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr, |
960 | { |
961 | struct w83627ehf_data *data = dev_get_drvdata(dev); |
962 | struct sensor_device_attribute *sensor_attr = to_sensor_dev_attr(attr); |
963 | + struct w83627ehf_sio_data *sio_data = dev->platform_data; |
964 | int nr = sensor_attr->index; |
965 | unsigned long val; |
966 | int err; |
967 | @@ -1330,6 +1331,11 @@ store_pwm_mode(struct device *dev, struct device_attribute *attr, |
968 | |
969 | if (val > 1) |
970 | return -EINVAL; |
971 | + |
972 | + /* On NCT67766F, DC mode is only supported for pwm1 */ |
973 | + if (sio_data->kind == nct6776 && nr && val != 1) |
974 | + return -EINVAL; |
975 | + |
976 | mutex_lock(&data->update_lock); |
977 | reg = w83627ehf_read_value(data, W83627EHF_REG_PWM_ENABLE[nr]); |
978 | data->pwm_mode[nr] = val; |
979 | diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c |
980 | index 106b88a..30431d8 100644 |
981 | --- a/drivers/net/bonding/bond_alb.c |
982 | +++ b/drivers/net/bonding/bond_alb.c |
983 | @@ -871,16 +871,12 @@ static void alb_send_learning_packets(struct slave *slave, u8 mac_addr[]) |
984 | } |
985 | } |
986 | |
987 | -/* hw is a boolean parameter that determines whether we should try and |
988 | - * set the hw address of the device as well as the hw address of the |
989 | - * net_device |
990 | - */ |
991 | -static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[], int hw) |
992 | +static int alb_set_slave_mac_addr(struct slave *slave, u8 addr[]) |
993 | { |
994 | struct net_device *dev = slave->dev; |
995 | struct sockaddr s_addr; |
996 | |
997 | - if (!hw) { |
998 | + if (slave->bond->params.mode == BOND_MODE_TLB) { |
999 | memcpy(dev->dev_addr, addr, dev->addr_len); |
1000 | return 0; |
1001 | } |
1002 | @@ -910,8 +906,8 @@ static void alb_swap_mac_addr(struct bonding *bond, struct slave *slave1, struct |
1003 | u8 tmp_mac_addr[ETH_ALEN]; |
1004 | |
1005 | memcpy(tmp_mac_addr, slave1->dev->dev_addr, ETH_ALEN); |
1006 | - alb_set_slave_mac_addr(slave1, slave2->dev->dev_addr, bond->alb_info.rlb_enabled); |
1007 | - alb_set_slave_mac_addr(slave2, tmp_mac_addr, bond->alb_info.rlb_enabled); |
1008 | + alb_set_slave_mac_addr(slave1, slave2->dev->dev_addr); |
1009 | + alb_set_slave_mac_addr(slave2, tmp_mac_addr); |
1010 | |
1011 | } |
1012 | |
1013 | @@ -1058,8 +1054,7 @@ static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slav |
1014 | |
1015 | /* Try setting slave mac to bond address and fall-through |
1016 | to code handling that situation below... */ |
1017 | - alb_set_slave_mac_addr(slave, bond->dev->dev_addr, |
1018 | - bond->alb_info.rlb_enabled); |
1019 | + alb_set_slave_mac_addr(slave, bond->dev->dev_addr); |
1020 | } |
1021 | |
1022 | /* The slave's address is equal to the address of the bond. |
1023 | @@ -1095,8 +1090,7 @@ static int alb_handle_addr_collision_on_attach(struct bonding *bond, struct slav |
1024 | } |
1025 | |
1026 | if (free_mac_slave) { |
1027 | - alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr, |
1028 | - bond->alb_info.rlb_enabled); |
1029 | + alb_set_slave_mac_addr(slave, free_mac_slave->perm_hwaddr); |
1030 | |
1031 | pr_warning("%s: Warning: the hw address of slave %s is in use by the bond; giving it the hw address of %s\n", |
1032 | bond->dev->name, slave->dev->name, |
1033 | @@ -1451,8 +1445,7 @@ int bond_alb_init_slave(struct bonding *bond, struct slave *slave) |
1034 | { |
1035 | int res; |
1036 | |
1037 | - res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr, |
1038 | - bond->alb_info.rlb_enabled); |
1039 | + res = alb_set_slave_mac_addr(slave, slave->perm_hwaddr); |
1040 | if (res) { |
1041 | return res; |
1042 | } |
1043 | @@ -1603,8 +1596,7 @@ void bond_alb_handle_active_change(struct bonding *bond, struct slave *new_slave |
1044 | alb_swap_mac_addr(bond, swap_slave, new_slave); |
1045 | } else { |
1046 | /* set the new_slave to the bond mac address */ |
1047 | - alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr, |
1048 | - bond->alb_info.rlb_enabled); |
1049 | + alb_set_slave_mac_addr(new_slave, bond->dev->dev_addr); |
1050 | } |
1051 | |
1052 | if (swap_slave) { |
1053 | @@ -1664,8 +1656,7 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr) |
1054 | alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave); |
1055 | alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave); |
1056 | } else { |
1057 | - alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr, |
1058 | - bond->alb_info.rlb_enabled); |
1059 | + alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr); |
1060 | |
1061 | read_lock(&bond->lock); |
1062 | alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr); |
1063 | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c |
1064 | index 7413497..959d448 100644 |
1065 | --- a/drivers/net/macvlan.c |
1066 | +++ b/drivers/net/macvlan.c |
1067 | @@ -172,6 +172,7 @@ static rx_handler_result_t macvlan_handle_frame(struct sk_buff **pskb) |
1068 | skb = ip_check_defrag(skb, IP_DEFRAG_MACVLAN); |
1069 | if (!skb) |
1070 | return RX_HANDLER_CONSUMED; |
1071 | + eth = eth_hdr(skb); |
1072 | src = macvlan_hash_lookup(port, eth->h_source); |
1073 | if (!src) |
1074 | /* frame comes from an external address */ |
1075 | diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1076 | index 510e9bb..453f58e 100644 |
1077 | --- a/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1078 | +++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c |
1079 | @@ -8217,13 +8217,21 @@ int brcms_c_get_curband(struct brcms_c_info *wlc) |
1080 | |
1081 | void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop) |
1082 | { |
1083 | + int timeout = 20; |
1084 | + |
1085 | /* flush packet queue when requested */ |
1086 | if (drop) |
1087 | brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL); |
1088 | |
1089 | /* wait for queue and DMA fifos to run dry */ |
1090 | - while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) |
1091 | + while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) { |
1092 | brcms_msleep(wlc->wl, 1); |
1093 | + |
1094 | + if (--timeout == 0) |
1095 | + break; |
1096 | + } |
1097 | + |
1098 | + WARN_ON_ONCE(timeout == 0); |
1099 | } |
1100 | |
1101 | void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval) |
1102 | diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c |
1103 | index 1920237..1daf01e 100644 |
1104 | --- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c |
1105 | +++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie-rx.c |
1106 | @@ -957,11 +957,11 @@ void iwl_irq_tasklet(struct iwl_trans *trans) |
1107 | } |
1108 | #endif |
1109 | |
1110 | - spin_unlock_irqrestore(&trans->shrd->lock, flags); |
1111 | - |
1112 | /* saved interrupt in inta variable now we can reset trans_pcie->inta */ |
1113 | trans_pcie->inta = 0; |
1114 | |
1115 | + spin_unlock_irqrestore(&trans->shrd->lock, flags); |
1116 | + |
1117 | /* Now service all interrupt bits discovered above. */ |
1118 | if (inta & CSR_INT_BIT_HW_ERR) { |
1119 | IWL_ERR(trans, "Hardware error detected. Restarting.\n"); |
1120 | diff --git a/drivers/scsi/mpt2sas/mpt2sas_base.c b/drivers/scsi/mpt2sas/mpt2sas_base.c |
1121 | index 0794c72..b1ddfef 100644 |
1122 | --- a/drivers/scsi/mpt2sas/mpt2sas_base.c |
1123 | +++ b/drivers/scsi/mpt2sas/mpt2sas_base.c |
1124 | @@ -4033,7 +4033,8 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) |
1125 | ioc->reply_free[i] = cpu_to_le32(reply_address); |
1126 | |
1127 | /* initialize reply queues */ |
1128 | - _base_assign_reply_queues(ioc); |
1129 | + if (ioc->is_driver_loading) |
1130 | + _base_assign_reply_queues(ioc); |
1131 | |
1132 | /* initialize Reply Post Free Queue */ |
1133 | reply_post_free = (long)ioc->reply_post_free; |
1134 | @@ -4081,24 +4082,17 @@ _base_make_ioc_operational(struct MPT2SAS_ADAPTER *ioc, int sleep_flag) |
1135 | |
1136 | |
1137 | if (ioc->is_driver_loading) { |
1138 | - |
1139 | - |
1140 | - |
1141 | - ioc->wait_for_discovery_to_complete = |
1142 | - _base_determine_wait_on_discovery(ioc); |
1143 | - return r; /* scan_start and scan_finished support */ |
1144 | - } |
1145 | - |
1146 | - |
1147 | - if (ioc->wait_for_discovery_to_complete && ioc->is_warpdrive) { |
1148 | - if (ioc->manu_pg10.OEMIdentifier == 0x80) { |
1149 | + if (ioc->is_warpdrive && ioc->manu_pg10.OEMIdentifier |
1150 | + == 0x80) { |
1151 | hide_flag = (u8) (ioc->manu_pg10.OEMSpecificFlags0 & |
1152 | MFG_PAGE10_HIDE_SSDS_MASK); |
1153 | if (hide_flag != MFG_PAGE10_HIDE_SSDS_MASK) |
1154 | ioc->mfg_pg10_hide_flag = hide_flag; |
1155 | } |
1156 | + ioc->wait_for_discovery_to_complete = |
1157 | + _base_determine_wait_on_discovery(ioc); |
1158 | + return r; /* scan_start and scan_finished support */ |
1159 | } |
1160 | - |
1161 | r = _base_send_port_enable(ioc, sleep_flag); |
1162 | if (r) |
1163 | return r; |
1164 | diff --git a/drivers/scsi/mpt2sas/mpt2sas_scsih.c b/drivers/scsi/mpt2sas/mpt2sas_scsih.c |
1165 | index 9bc6fb2..2824a90 100644 |
1166 | --- a/drivers/scsi/mpt2sas/mpt2sas_scsih.c |
1167 | +++ b/drivers/scsi/mpt2sas/mpt2sas_scsih.c |
1168 | @@ -8001,7 +8001,6 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1169 | goto out_attach_fail; |
1170 | } |
1171 | |
1172 | - scsi_scan_host(shost); |
1173 | if (ioc->is_warpdrive) { |
1174 | if (ioc->mfg_pg10_hide_flag == MFG_PAGE10_EXPOSE_ALL_DISKS) |
1175 | ioc->hide_drives = 0; |
1176 | @@ -8015,8 +8014,8 @@ _scsih_probe(struct pci_dev *pdev, const struct pci_device_id *id) |
1177 | } |
1178 | } else |
1179 | ioc->hide_drives = 0; |
1180 | + scsi_scan_host(shost); |
1181 | |
1182 | - _scsih_probe_devices(ioc); |
1183 | return 0; |
1184 | |
1185 | out_attach_fail: |
1186 | diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c |
1187 | index 00233af..8e00926 100644 |
1188 | --- a/drivers/tty/serial/amba-pl011.c |
1189 | +++ b/drivers/tty/serial/amba-pl011.c |
1190 | @@ -1740,9 +1740,19 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) |
1191 | { |
1192 | struct uart_amba_port *uap = amba_ports[co->index]; |
1193 | unsigned int status, old_cr, new_cr; |
1194 | + unsigned long flags; |
1195 | + int locked = 1; |
1196 | |
1197 | clk_enable(uap->clk); |
1198 | |
1199 | + local_irq_save(flags); |
1200 | + if (uap->port.sysrq) |
1201 | + locked = 0; |
1202 | + else if (oops_in_progress) |
1203 | + locked = spin_trylock(&uap->port.lock); |
1204 | + else |
1205 | + spin_lock(&uap->port.lock); |
1206 | + |
1207 | /* |
1208 | * First save the CR then disable the interrupts |
1209 | */ |
1210 | @@ -1762,6 +1772,10 @@ pl011_console_write(struct console *co, const char *s, unsigned int count) |
1211 | } while (status & UART01x_FR_BUSY); |
1212 | writew(old_cr, uap->port.membase + UART011_CR); |
1213 | |
1214 | + if (locked) |
1215 | + spin_unlock(&uap->port.lock); |
1216 | + local_irq_restore(flags); |
1217 | + |
1218 | clk_disable(uap->clk); |
1219 | } |
1220 | |
1221 | diff --git a/drivers/tty/serial/jsm/jsm_driver.c b/drivers/tty/serial/jsm/jsm_driver.c |
1222 | index 7c867a0..7545fe1 100644 |
1223 | --- a/drivers/tty/serial/jsm/jsm_driver.c |
1224 | +++ b/drivers/tty/serial/jsm/jsm_driver.c |
1225 | @@ -251,6 +251,7 @@ static void jsm_io_resume(struct pci_dev *pdev) |
1226 | struct jsm_board *brd = pci_get_drvdata(pdev); |
1227 | |
1228 | pci_restore_state(pdev); |
1229 | + pci_save_state(pdev); |
1230 | |
1231 | jsm_uart_port_init(brd); |
1232 | } |
1233 | diff --git a/drivers/tty/tty_port.c b/drivers/tty/tty_port.c |
1234 | index ef9dd62..bf6e238 100644 |
1235 | --- a/drivers/tty/tty_port.c |
1236 | +++ b/drivers/tty/tty_port.c |
1237 | @@ -227,7 +227,6 @@ int tty_port_block_til_ready(struct tty_port *port, |
1238 | int do_clocal = 0, retval; |
1239 | unsigned long flags; |
1240 | DEFINE_WAIT(wait); |
1241 | - int cd; |
1242 | |
1243 | /* block if port is in the process of being closed */ |
1244 | if (tty_hung_up_p(filp) || port->flags & ASYNC_CLOSING) { |
1245 | @@ -284,11 +283,14 @@ int tty_port_block_til_ready(struct tty_port *port, |
1246 | retval = -ERESTARTSYS; |
1247 | break; |
1248 | } |
1249 | - /* Probe the carrier. For devices with no carrier detect this |
1250 | - will always return true */ |
1251 | - cd = tty_port_carrier_raised(port); |
1252 | + /* |
1253 | + * Probe the carrier. For devices with no carrier detect |
1254 | + * tty_port_carrier_raised will always return true. |
1255 | + * Never ask drivers if CLOCAL is set, this causes troubles |
1256 | + * on some hardware. |
1257 | + */ |
1258 | if (!(port->flags & ASYNC_CLOSING) && |
1259 | - (do_clocal || cd)) |
1260 | + (do_clocal || tty_port_carrier_raised(port))) |
1261 | break; |
1262 | if (signal_pending(current)) { |
1263 | retval = -ERESTARTSYS; |
1264 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c |
1265 | index efe6849..fd4aee1 100644 |
1266 | --- a/drivers/usb/class/cdc-wdm.c |
1267 | +++ b/drivers/usb/class/cdc-wdm.c |
1268 | @@ -57,6 +57,8 @@ MODULE_DEVICE_TABLE (usb, wdm_ids); |
1269 | |
1270 | #define WDM_MAX 16 |
1271 | |
1272 | +/* CDC-WMC r1.1 requires wMaxCommand to be "at least 256 decimal (0x100)" */ |
1273 | +#define WDM_DEFAULT_BUFSIZE 256 |
1274 | |
1275 | static DEFINE_MUTEX(wdm_mutex); |
1276 | |
1277 | @@ -88,7 +90,8 @@ struct wdm_device { |
1278 | int count; |
1279 | dma_addr_t shandle; |
1280 | dma_addr_t ihandle; |
1281 | - struct mutex lock; |
1282 | + struct mutex wlock; |
1283 | + struct mutex rlock; |
1284 | wait_queue_head_t wait; |
1285 | struct work_struct rxwork; |
1286 | int werr; |
1287 | @@ -323,7 +326,7 @@ static ssize_t wdm_write |
1288 | } |
1289 | |
1290 | /* concurrent writes and disconnect */ |
1291 | - r = mutex_lock_interruptible(&desc->lock); |
1292 | + r = mutex_lock_interruptible(&desc->wlock); |
1293 | rv = -ERESTARTSYS; |
1294 | if (r) { |
1295 | kfree(buf); |
1296 | @@ -386,7 +389,7 @@ static ssize_t wdm_write |
1297 | out: |
1298 | usb_autopm_put_interface(desc->intf); |
1299 | outnp: |
1300 | - mutex_unlock(&desc->lock); |
1301 | + mutex_unlock(&desc->wlock); |
1302 | outnl: |
1303 | return rv < 0 ? rv : count; |
1304 | } |
1305 | @@ -399,7 +402,7 @@ static ssize_t wdm_read |
1306 | struct wdm_device *desc = file->private_data; |
1307 | |
1308 | |
1309 | - rv = mutex_lock_interruptible(&desc->lock); /*concurrent reads */ |
1310 | + rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */ |
1311 | if (rv < 0) |
1312 | return -ERESTARTSYS; |
1313 | |
1314 | @@ -467,14 +470,16 @@ retry: |
1315 | for (i = 0; i < desc->length - cntr; i++) |
1316 | desc->ubuf[i] = desc->ubuf[i + cntr]; |
1317 | |
1318 | + spin_lock_irq(&desc->iuspin); |
1319 | desc->length -= cntr; |
1320 | + spin_unlock_irq(&desc->iuspin); |
1321 | /* in case we had outstanding data */ |
1322 | if (!desc->length) |
1323 | clear_bit(WDM_READ, &desc->flags); |
1324 | rv = cntr; |
1325 | |
1326 | err: |
1327 | - mutex_unlock(&desc->lock); |
1328 | + mutex_unlock(&desc->rlock); |
1329 | return rv; |
1330 | } |
1331 | |
1332 | @@ -540,7 +545,8 @@ static int wdm_open(struct inode *inode, struct file *file) |
1333 | } |
1334 | intf->needs_remote_wakeup = 1; |
1335 | |
1336 | - mutex_lock(&desc->lock); |
1337 | + /* using write lock to protect desc->count */ |
1338 | + mutex_lock(&desc->wlock); |
1339 | if (!desc->count++) { |
1340 | desc->werr = 0; |
1341 | desc->rerr = 0; |
1342 | @@ -553,7 +559,7 @@ static int wdm_open(struct inode *inode, struct file *file) |
1343 | } else { |
1344 | rv = 0; |
1345 | } |
1346 | - mutex_unlock(&desc->lock); |
1347 | + mutex_unlock(&desc->wlock); |
1348 | usb_autopm_put_interface(desc->intf); |
1349 | out: |
1350 | mutex_unlock(&wdm_mutex); |
1351 | @@ -565,9 +571,11 @@ static int wdm_release(struct inode *inode, struct file *file) |
1352 | struct wdm_device *desc = file->private_data; |
1353 | |
1354 | mutex_lock(&wdm_mutex); |
1355 | - mutex_lock(&desc->lock); |
1356 | + |
1357 | + /* using write lock to protect desc->count */ |
1358 | + mutex_lock(&desc->wlock); |
1359 | desc->count--; |
1360 | - mutex_unlock(&desc->lock); |
1361 | + mutex_unlock(&desc->wlock); |
1362 | |
1363 | if (!desc->count) { |
1364 | dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); |
1365 | @@ -630,7 +638,7 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id) |
1366 | struct usb_cdc_dmm_desc *dmhd; |
1367 | u8 *buffer = intf->altsetting->extra; |
1368 | int buflen = intf->altsetting->extralen; |
1369 | - u16 maxcom = 0; |
1370 | + u16 maxcom = WDM_DEFAULT_BUFSIZE; |
1371 | |
1372 | if (!buffer) |
1373 | goto out; |
1374 | @@ -665,7 +673,8 @@ next_desc: |
1375 | desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); |
1376 | if (!desc) |
1377 | goto out; |
1378 | - mutex_init(&desc->lock); |
1379 | + mutex_init(&desc->rlock); |
1380 | + mutex_init(&desc->wlock); |
1381 | spin_lock_init(&desc->iuspin); |
1382 | init_waitqueue_head(&desc->wait); |
1383 | desc->wMaxCommand = maxcom; |
1384 | @@ -716,7 +725,7 @@ next_desc: |
1385 | goto err; |
1386 | |
1387 | desc->inbuf = usb_alloc_coherent(interface_to_usbdev(intf), |
1388 | - desc->bMaxPacketSize0, |
1389 | + desc->wMaxCommand, |
1390 | GFP_KERNEL, |
1391 | &desc->response->transfer_dma); |
1392 | if (!desc->inbuf) |
1393 | @@ -779,11 +788,13 @@ static void wdm_disconnect(struct usb_interface *intf) |
1394 | /* to terminate pending flushes */ |
1395 | clear_bit(WDM_IN_USE, &desc->flags); |
1396 | spin_unlock_irqrestore(&desc->iuspin, flags); |
1397 | - mutex_lock(&desc->lock); |
1398 | + wake_up_all(&desc->wait); |
1399 | + mutex_lock(&desc->rlock); |
1400 | + mutex_lock(&desc->wlock); |
1401 | kill_urbs(desc); |
1402 | cancel_work_sync(&desc->rxwork); |
1403 | - mutex_unlock(&desc->lock); |
1404 | - wake_up_all(&desc->wait); |
1405 | + mutex_unlock(&desc->wlock); |
1406 | + mutex_unlock(&desc->rlock); |
1407 | if (!desc->count) |
1408 | cleanup(desc); |
1409 | mutex_unlock(&wdm_mutex); |
1410 | @@ -798,8 +809,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message) |
1411 | dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); |
1412 | |
1413 | /* if this is an autosuspend the caller does the locking */ |
1414 | - if (!PMSG_IS_AUTO(message)) |
1415 | - mutex_lock(&desc->lock); |
1416 | + if (!PMSG_IS_AUTO(message)) { |
1417 | + mutex_lock(&desc->rlock); |
1418 | + mutex_lock(&desc->wlock); |
1419 | + } |
1420 | spin_lock_irq(&desc->iuspin); |
1421 | |
1422 | if (PMSG_IS_AUTO(message) && |
1423 | @@ -815,8 +828,10 @@ static int wdm_suspend(struct usb_interface *intf, pm_message_t message) |
1424 | kill_urbs(desc); |
1425 | cancel_work_sync(&desc->rxwork); |
1426 | } |
1427 | - if (!PMSG_IS_AUTO(message)) |
1428 | - mutex_unlock(&desc->lock); |
1429 | + if (!PMSG_IS_AUTO(message)) { |
1430 | + mutex_unlock(&desc->wlock); |
1431 | + mutex_unlock(&desc->rlock); |
1432 | + } |
1433 | |
1434 | return rv; |
1435 | } |
1436 | @@ -854,7 +869,8 @@ static int wdm_pre_reset(struct usb_interface *intf) |
1437 | { |
1438 | struct wdm_device *desc = usb_get_intfdata(intf); |
1439 | |
1440 | - mutex_lock(&desc->lock); |
1441 | + mutex_lock(&desc->rlock); |
1442 | + mutex_lock(&desc->wlock); |
1443 | kill_urbs(desc); |
1444 | |
1445 | /* |
1446 | @@ -876,7 +892,8 @@ static int wdm_post_reset(struct usb_interface *intf) |
1447 | int rv; |
1448 | |
1449 | rv = recover_from_urb_loss(desc); |
1450 | - mutex_unlock(&desc->lock); |
1451 | + mutex_unlock(&desc->wlock); |
1452 | + mutex_unlock(&desc->rlock); |
1453 | return 0; |
1454 | } |
1455 | |
1456 | diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c |
1457 | index 69a4e43..27bd50a 100644 |
1458 | --- a/drivers/usb/dwc3/ep0.c |
1459 | +++ b/drivers/usb/dwc3/ep0.c |
1460 | @@ -149,20 +149,14 @@ static int __dwc3_gadget_ep0_queue(struct dwc3_ep *dep, |
1461 | |
1462 | direction = !!(dep->flags & DWC3_EP0_DIR_IN); |
1463 | |
1464 | - if (dwc->ep0state == EP0_STATUS_PHASE) { |
1465 | - type = dwc->three_stage_setup |
1466 | - ? DWC3_TRBCTL_CONTROL_STATUS3 |
1467 | - : DWC3_TRBCTL_CONTROL_STATUS2; |
1468 | - } else if (dwc->ep0state == EP0_DATA_PHASE) { |
1469 | - type = DWC3_TRBCTL_CONTROL_DATA; |
1470 | - } else { |
1471 | - /* should never happen */ |
1472 | - WARN_ON(1); |
1473 | + if (dwc->ep0state != EP0_DATA_PHASE) { |
1474 | + dev_WARN(dwc->dev, "Unexpected pending request\n"); |
1475 | return 0; |
1476 | } |
1477 | |
1478 | ret = dwc3_ep0_start_trans(dwc, direction, |
1479 | - req->request.dma, req->request.length, type); |
1480 | + req->request.dma, req->request.length, |
1481 | + DWC3_TRBCTL_CONTROL_DATA); |
1482 | dep->flags &= ~(DWC3_EP_PENDING_REQUEST | |
1483 | DWC3_EP0_DIR_IN); |
1484 | } |
1485 | diff --git a/drivers/usb/gadget/langwell_udc.c b/drivers/usb/gadget/langwell_udc.c |
1486 | index c9fa3bf..6ad0ad6 100644 |
1487 | --- a/drivers/usb/gadget/langwell_udc.c |
1488 | +++ b/drivers/usb/gadget/langwell_udc.c |
1489 | @@ -1522,8 +1522,7 @@ static void langwell_udc_stop(struct langwell_udc *dev) |
1490 | |
1491 | |
1492 | /* stop all USB activities */ |
1493 | -static void stop_activity(struct langwell_udc *dev, |
1494 | - struct usb_gadget_driver *driver) |
1495 | +static void stop_activity(struct langwell_udc *dev) |
1496 | { |
1497 | struct langwell_ep *ep; |
1498 | dev_dbg(&dev->pdev->dev, "---> %s()\n", __func__); |
1499 | @@ -1535,9 +1534,9 @@ static void stop_activity(struct langwell_udc *dev, |
1500 | } |
1501 | |
1502 | /* report disconnect; the driver is already quiesced */ |
1503 | - if (driver) { |
1504 | + if (dev->driver) { |
1505 | spin_unlock(&dev->lock); |
1506 | - driver->disconnect(&dev->gadget); |
1507 | + dev->driver->disconnect(&dev->gadget); |
1508 | spin_lock(&dev->lock); |
1509 | } |
1510 | |
1511 | @@ -1925,11 +1924,10 @@ static int langwell_stop(struct usb_gadget *g, |
1512 | |
1513 | /* stop all usb activities */ |
1514 | dev->gadget.speed = USB_SPEED_UNKNOWN; |
1515 | - stop_activity(dev, driver); |
1516 | - spin_unlock_irqrestore(&dev->lock, flags); |
1517 | - |
1518 | dev->gadget.dev.driver = NULL; |
1519 | dev->driver = NULL; |
1520 | + stop_activity(dev); |
1521 | + spin_unlock_irqrestore(&dev->lock, flags); |
1522 | |
1523 | device_remove_file(&dev->pdev->dev, &dev_attr_function); |
1524 | |
1525 | @@ -2733,7 +2731,7 @@ static void handle_usb_reset(struct langwell_udc *dev) |
1526 | dev->bus_reset = 1; |
1527 | |
1528 | /* reset all the queues, stop all USB activities */ |
1529 | - stop_activity(dev, dev->driver); |
1530 | + stop_activity(dev); |
1531 | dev->usb_state = USB_STATE_DEFAULT; |
1532 | } else { |
1533 | dev_vdbg(&dev->pdev->dev, "device controller reset\n"); |
1534 | @@ -2741,7 +2739,7 @@ static void handle_usb_reset(struct langwell_udc *dev) |
1535 | langwell_udc_reset(dev); |
1536 | |
1537 | /* reset all the queues, stop all USB activities */ |
1538 | - stop_activity(dev, dev->driver); |
1539 | + stop_activity(dev); |
1540 | |
1541 | /* reset ep0 dQH and endptctrl */ |
1542 | ep0_reset(dev); |
1543 | @@ -3367,7 +3365,7 @@ static int langwell_udc_suspend(struct pci_dev *pdev, pm_message_t state) |
1544 | |
1545 | spin_lock_irq(&dev->lock); |
1546 | /* stop all usb activities */ |
1547 | - stop_activity(dev, dev->driver); |
1548 | + stop_activity(dev); |
1549 | spin_unlock_irq(&dev->lock); |
1550 | |
1551 | /* free dTD dma_pool and dQH */ |
1552 | diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c |
1553 | index c7f291a..85ea14e 100644 |
1554 | --- a/drivers/usb/gadget/storage_common.c |
1555 | +++ b/drivers/usb/gadget/storage_common.c |
1556 | @@ -598,16 +598,16 @@ static __maybe_unused struct usb_ss_cap_descriptor fsg_ss_cap_desc = { |
1557 | | USB_5GBPS_OPERATION), |
1558 | .bFunctionalitySupport = USB_LOW_SPEED_OPERATION, |
1559 | .bU1devExitLat = USB_DEFAULT_U1_DEV_EXIT_LAT, |
1560 | - .bU2DevExitLat = USB_DEFAULT_U2_DEV_EXIT_LAT, |
1561 | + .bU2DevExitLat = cpu_to_le16(USB_DEFAULT_U2_DEV_EXIT_LAT), |
1562 | }; |
1563 | |
1564 | static __maybe_unused struct usb_bos_descriptor fsg_bos_desc = { |
1565 | .bLength = USB_DT_BOS_SIZE, |
1566 | .bDescriptorType = USB_DT_BOS, |
1567 | |
1568 | - .wTotalLength = USB_DT_BOS_SIZE |
1569 | + .wTotalLength = cpu_to_le16(USB_DT_BOS_SIZE |
1570 | + USB_DT_USB_EXT_CAP_SIZE |
1571 | - + USB_DT_USB_SS_CAP_SIZE, |
1572 | + + USB_DT_USB_SS_CAP_SIZE), |
1573 | |
1574 | .bNumDeviceCaps = 2, |
1575 | }; |
1576 | diff --git a/drivers/usb/host/ehci-fsl.c b/drivers/usb/host/ehci-fsl.c |
1577 | index e90344a..b556a72 100644 |
1578 | --- a/drivers/usb/host/ehci-fsl.c |
1579 | +++ b/drivers/usb/host/ehci-fsl.c |
1580 | @@ -125,7 +125,7 @@ static int usb_hcd_fsl_probe(const struct hc_driver *driver, |
1581 | */ |
1582 | if (pdata->init && pdata->init(pdev)) { |
1583 | retval = -ENODEV; |
1584 | - goto err3; |
1585 | + goto err4; |
1586 | } |
1587 | |
1588 | /* Enable USB controller, 83xx or 8536 */ |
1589 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
1590 | index d28c586..ae92dc4 100644 |
1591 | --- a/drivers/usb/host/xhci-ring.c |
1592 | +++ b/drivers/usb/host/xhci-ring.c |
1593 | @@ -1215,6 +1215,7 @@ static void handle_vendor_event(struct xhci_hcd *xhci, |
1594 | * |
1595 | * Returns a zero-based port number, which is suitable for indexing into each of |
1596 | * the split roothubs' port arrays and bus state arrays. |
1597 | + * Add one to it in order to call xhci_find_slot_id_by_port. |
1598 | */ |
1599 | static unsigned int find_faked_portnum_from_hw_portnum(struct usb_hcd *hcd, |
1600 | struct xhci_hcd *xhci, u32 port_id) |
1601 | @@ -1335,7 +1336,7 @@ static void handle_port_status(struct xhci_hcd *xhci, |
1602 | xhci_set_link_state(xhci, port_array, faked_port_index, |
1603 | XDEV_U0); |
1604 | slot_id = xhci_find_slot_id_by_port(hcd, xhci, |
1605 | - faked_port_index); |
1606 | + faked_port_index + 1); |
1607 | if (!slot_id) { |
1608 | xhci_dbg(xhci, "slot_id is zero\n"); |
1609 | goto cleanup; |
1610 | @@ -3372,7 +3373,8 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, |
1611 | /* Check TD length */ |
1612 | if (running_total != td_len) { |
1613 | xhci_err(xhci, "ISOC TD length unmatch\n"); |
1614 | - return -EINVAL; |
1615 | + ret = -EINVAL; |
1616 | + goto cleanup; |
1617 | } |
1618 | } |
1619 | |
1620 | diff --git a/drivers/usb/misc/usbsevseg.c b/drivers/usb/misc/usbsevseg.c |
1621 | index 417b8f2..59689fa 100644 |
1622 | --- a/drivers/usb/misc/usbsevseg.c |
1623 | +++ b/drivers/usb/misc/usbsevseg.c |
1624 | @@ -24,7 +24,7 @@ |
1625 | |
1626 | #define VENDOR_ID 0x0fc5 |
1627 | #define PRODUCT_ID 0x1227 |
1628 | -#define MAXLEN 6 |
1629 | +#define MAXLEN 8 |
1630 | |
1631 | /* table of devices that work with this driver */ |
1632 | static const struct usb_device_id id_table[] = { |
1633 | diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c |
1634 | index f9a3f62..7c569f5 100644 |
1635 | --- a/drivers/usb/musb/davinci.c |
1636 | +++ b/drivers/usb/musb/davinci.c |
1637 | @@ -33,9 +33,6 @@ |
1638 | #include <linux/platform_device.h> |
1639 | #include <linux/dma-mapping.h> |
1640 | |
1641 | -#include <mach/hardware.h> |
1642 | -#include <mach/memory.h> |
1643 | -#include <asm/gpio.h> |
1644 | #include <mach/cputype.h> |
1645 | |
1646 | #include <asm/mach-types.h> |
1647 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
1648 | index a1a324b..a515237 100644 |
1649 | --- a/drivers/usb/serial/cp210x.c |
1650 | +++ b/drivers/usb/serial/cp210x.c |
1651 | @@ -39,6 +39,8 @@ static void cp210x_get_termios(struct tty_struct *, |
1652 | struct usb_serial_port *port); |
1653 | static void cp210x_get_termios_port(struct usb_serial_port *port, |
1654 | unsigned int *cflagp, unsigned int *baudp); |
1655 | +static void cp210x_change_speed(struct tty_struct *, struct usb_serial_port *, |
1656 | + struct ktermios *); |
1657 | static void cp210x_set_termios(struct tty_struct *, struct usb_serial_port *, |
1658 | struct ktermios*); |
1659 | static int cp210x_tiocmget(struct tty_struct *); |
1660 | @@ -138,6 +140,7 @@ static const struct usb_device_id id_table[] = { |
1661 | { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
1662 | { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
1663 | { USB_DEVICE(0x1BE3, 0x07A6) }, /* WAGO 750-923 USB Service Cable */ |
1664 | + { USB_DEVICE(0x3195, 0xF190) }, /* Link Instruments MSO-19 */ |
1665 | { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ |
1666 | { } /* Terminating Entry */ |
1667 | }; |
1668 | @@ -201,6 +204,8 @@ static struct usb_serial_driver cp210x_device = { |
1669 | #define CP210X_EMBED_EVENTS 0x15 |
1670 | #define CP210X_GET_EVENTSTATE 0x16 |
1671 | #define CP210X_SET_CHARS 0x19 |
1672 | +#define CP210X_GET_BAUDRATE 0x1D |
1673 | +#define CP210X_SET_BAUDRATE 0x1E |
1674 | |
1675 | /* CP210X_IFC_ENABLE */ |
1676 | #define UART_ENABLE 0x0001 |
1677 | @@ -354,8 +359,8 @@ static inline int cp210x_set_config_single(struct usb_serial_port *port, |
1678 | * Quantises the baud rate as per AN205 Table 1 |
1679 | */ |
1680 | static unsigned int cp210x_quantise_baudrate(unsigned int baud) { |
1681 | - if (baud <= 56) baud = 0; |
1682 | - else if (baud <= 300) baud = 300; |
1683 | + if (baud <= 300) |
1684 | + baud = 300; |
1685 | else if (baud <= 600) baud = 600; |
1686 | else if (baud <= 1200) baud = 1200; |
1687 | else if (baud <= 1800) baud = 1800; |
1688 | @@ -383,17 +388,15 @@ static unsigned int cp210x_quantise_baudrate(unsigned int baud) { |
1689 | else if (baud <= 491520) baud = 460800; |
1690 | else if (baud <= 567138) baud = 500000; |
1691 | else if (baud <= 670254) baud = 576000; |
1692 | - else if (baud <= 1053257) baud = 921600; |
1693 | - else if (baud <= 1474560) baud = 1228800; |
1694 | - else if (baud <= 2457600) baud = 1843200; |
1695 | - else baud = 3686400; |
1696 | + else if (baud < 1000000) |
1697 | + baud = 921600; |
1698 | + else if (baud > 2000000) |
1699 | + baud = 2000000; |
1700 | return baud; |
1701 | } |
1702 | |
1703 | static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port) |
1704 | { |
1705 | - int result; |
1706 | - |
1707 | dbg("%s - port %d", __func__, port->number); |
1708 | |
1709 | if (cp210x_set_config_single(port, CP210X_IFC_ENABLE, UART_ENABLE)) { |
1710 | @@ -402,13 +405,14 @@ static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port) |
1711 | return -EPROTO; |
1712 | } |
1713 | |
1714 | - result = usb_serial_generic_open(tty, port); |
1715 | - if (result) |
1716 | - return result; |
1717 | - |
1718 | /* Configure the termios structure */ |
1719 | cp210x_get_termios(tty, port); |
1720 | - return 0; |
1721 | + |
1722 | + /* The baud rate must be initialised on cp2104 */ |
1723 | + if (tty) |
1724 | + cp210x_change_speed(tty, port, NULL); |
1725 | + |
1726 | + return usb_serial_generic_open(tty, port); |
1727 | } |
1728 | |
1729 | static void cp210x_close(struct usb_serial_port *port) |
1730 | @@ -460,10 +464,7 @@ static void cp210x_get_termios_port(struct usb_serial_port *port, |
1731 | |
1732 | dbg("%s - port %d", __func__, port->number); |
1733 | |
1734 | - cp210x_get_config(port, CP210X_GET_BAUDDIV, &baud, 2); |
1735 | - /* Convert to baudrate */ |
1736 | - if (baud) |
1737 | - baud = cp210x_quantise_baudrate((BAUD_RATE_GEN_FREQ + baud/2)/ baud); |
1738 | + cp210x_get_config(port, CP210X_GET_BAUDRATE, &baud, 4); |
1739 | |
1740 | dbg("%s - baud rate = %d", __func__, baud); |
1741 | *baudp = baud; |
1742 | @@ -577,11 +578,64 @@ static void cp210x_get_termios_port(struct usb_serial_port *port, |
1743 | *cflagp = cflag; |
1744 | } |
1745 | |
1746 | +/* |
1747 | + * CP2101 supports the following baud rates: |
1748 | + * |
1749 | + * 300, 600, 1200, 1800, 2400, 4800, 7200, 9600, 14400, 19200, 28800, |
1750 | + * 38400, 56000, 57600, 115200, 128000, 230400, 460800, 921600 |
1751 | + * |
1752 | + * CP2102 and CP2103 support the following additional rates: |
1753 | + * |
1754 | + * 4000, 16000, 51200, 64000, 76800, 153600, 250000, 256000, 500000, |
1755 | + * 576000 |
1756 | + * |
1757 | + * The device will map a requested rate to a supported one, but the result |
1758 | + * of requests for rates greater than 1053257 is undefined (see AN205). |
1759 | + * |
1760 | + * CP2104, CP2105 and CP2110 support most rates up to 2M, 921k and 1M baud, |
1761 | + * respectively, with an error less than 1%. The actual rates are determined |
1762 | + * by |
1763 | + * |
1764 | + * div = round(freq / (2 x prescale x request)) |
1765 | + * actual = freq / (2 x prescale x div) |
1766 | + * |
1767 | + * For CP2104 and CP2105 freq is 48Mhz and prescale is 4 for request <= 365bps |
1768 | + * or 1 otherwise. |
1769 | + * For CP2110 freq is 24Mhz and prescale is 4 for request <= 300bps or 1 |
1770 | + * otherwise. |
1771 | + */ |
1772 | +static void cp210x_change_speed(struct tty_struct *tty, |
1773 | + struct usb_serial_port *port, struct ktermios *old_termios) |
1774 | +{ |
1775 | + u32 baud; |
1776 | + |
1777 | + baud = tty->termios->c_ospeed; |
1778 | + |
1779 | + /* This maps the requested rate to a rate valid on cp2102 or cp2103, |
1780 | + * or to an arbitrary rate in [1M,2M]. |
1781 | + * |
1782 | + * NOTE: B0 is not implemented. |
1783 | + */ |
1784 | + baud = cp210x_quantise_baudrate(baud); |
1785 | + |
1786 | + dbg("%s - setting baud rate to %u", __func__, baud); |
1787 | + if (cp210x_set_config(port, CP210X_SET_BAUDRATE, &baud, |
1788 | + sizeof(baud))) { |
1789 | + dev_warn(&port->dev, "failed to set baud rate to %u\n", baud); |
1790 | + if (old_termios) |
1791 | + baud = old_termios->c_ospeed; |
1792 | + else |
1793 | + baud = 9600; |
1794 | + } |
1795 | + |
1796 | + tty_encode_baud_rate(tty, baud, baud); |
1797 | +} |
1798 | + |
1799 | static void cp210x_set_termios(struct tty_struct *tty, |
1800 | struct usb_serial_port *port, struct ktermios *old_termios) |
1801 | { |
1802 | unsigned int cflag, old_cflag; |
1803 | - unsigned int baud = 0, bits; |
1804 | + unsigned int bits; |
1805 | unsigned int modem_ctl[4]; |
1806 | |
1807 | dbg("%s - port %d", __func__, port->number); |
1808 | @@ -592,20 +646,9 @@ static void cp210x_set_termios(struct tty_struct *tty, |
1809 | tty->termios->c_cflag &= ~CMSPAR; |
1810 | cflag = tty->termios->c_cflag; |
1811 | old_cflag = old_termios->c_cflag; |
1812 | - baud = cp210x_quantise_baudrate(tty_get_baud_rate(tty)); |
1813 | - |
1814 | - /* If the baud rate is to be updated*/ |
1815 | - if (baud != tty_termios_baud_rate(old_termios) && baud != 0) { |
1816 | - dbg("%s - Setting baud rate to %d baud", __func__, |
1817 | - baud); |
1818 | - if (cp210x_set_config_single(port, CP210X_SET_BAUDDIV, |
1819 | - ((BAUD_RATE_GEN_FREQ + baud/2) / baud))) { |
1820 | - dbg("Baud rate requested not supported by device"); |
1821 | - baud = tty_termios_baud_rate(old_termios); |
1822 | - } |
1823 | - } |
1824 | - /* Report back the resulting baud rate */ |
1825 | - tty_encode_baud_rate(tty, baud, baud); |
1826 | + |
1827 | + if (tty->termios->c_ospeed != old_termios->c_ospeed) |
1828 | + cp210x_change_speed(tty, port, old_termios); |
1829 | |
1830 | /* If the number of data bits is to be updated */ |
1831 | if ((cflag & CSIZE) != (old_cflag & CSIZE)) { |
1832 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
1833 | index ff3db5d..058b92c 100644 |
1834 | --- a/drivers/usb/serial/ftdi_sio.c |
1835 | +++ b/drivers/usb/serial/ftdi_sio.c |
1836 | @@ -797,6 +797,7 @@ static struct usb_device_id id_table_combined [] = { |
1837 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1838 | { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), |
1839 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1840 | + { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) }, |
1841 | { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, |
1842 | { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), |
1843 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1844 | @@ -805,6 +806,8 @@ static struct usb_device_id id_table_combined [] = { |
1845 | { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, |
1846 | { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), |
1847 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1848 | + { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID), |
1849 | + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1850 | { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, |
1851 | { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, |
1852 | { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, |
1853 | @@ -841,6 +844,7 @@ static struct usb_device_id id_table_combined [] = { |
1854 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
1855 | { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), |
1856 | .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, |
1857 | + { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, |
1858 | { }, /* Optional parameter entry */ |
1859 | { } /* Terminating entry */ |
1860 | }; |
1861 | @@ -1333,8 +1337,7 @@ static int set_serial_info(struct tty_struct *tty, |
1862 | goto check_and_exit; |
1863 | } |
1864 | |
1865 | - if ((new_serial.baud_base != priv->baud_base) && |
1866 | - (new_serial.baud_base < 9600)) { |
1867 | + if (new_serial.baud_base != priv->baud_base) { |
1868 | mutex_unlock(&priv->cfg_lock); |
1869 | return -EINVAL; |
1870 | } |
1871 | @@ -1824,6 +1827,7 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) |
1872 | |
1873 | static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) |
1874 | { |
1875 | + struct ktermios dummy; |
1876 | struct usb_device *dev = port->serial->dev; |
1877 | struct ftdi_private *priv = usb_get_serial_port_data(port); |
1878 | int result; |
1879 | @@ -1842,8 +1846,10 @@ static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) |
1880 | This is same behaviour as serial.c/rs_open() - Kuba */ |
1881 | |
1882 | /* ftdi_set_termios will send usb control messages */ |
1883 | - if (tty) |
1884 | - ftdi_set_termios(tty, port, tty->termios); |
1885 | + if (tty) { |
1886 | + memset(&dummy, 0, sizeof(dummy)); |
1887 | + ftdi_set_termios(tty, port, &dummy); |
1888 | + } |
1889 | |
1890 | /* Start reading from the device */ |
1891 | result = usb_serial_generic_open(tty, port); |
1892 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
1893 | index 055b64e..76d4f31 100644 |
1894 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
1895 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
1896 | @@ -39,6 +39,13 @@ |
1897 | /* www.candapter.com Ewert Energy Systems CANdapter device */ |
1898 | #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ |
1899 | |
1900 | +/* |
1901 | + * Texas Instruments XDS100v2 JTAG / BeagleBone A3 |
1902 | + * http://processors.wiki.ti.com/index.php/XDS100 |
1903 | + * http://beagleboard.org/bone |
1904 | + */ |
1905 | +#define TI_XDS100V2_PID 0xa6d0 |
1906 | + |
1907 | #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ |
1908 | |
1909 | /* US Interface Navigator (http://www.usinterface.com/) */ |
1910 | @@ -525,6 +532,12 @@ |
1911 | #define ADI_GNICEPLUS_PID 0xF001 |
1912 | |
1913 | /* |
1914 | + * Hornby Elite |
1915 | + */ |
1916 | +#define HORNBY_VID 0x04D8 |
1917 | +#define HORNBY_ELITE_PID 0x000A |
1918 | + |
1919 | +/* |
1920 | * RATOC REX-USB60F |
1921 | */ |
1922 | #define RATOC_VENDOR_ID 0x0584 |
1923 | @@ -1168,3 +1181,9 @@ |
1924 | */ |
1925 | /* TagTracer MIFARE*/ |
1926 | #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 |
1927 | + |
1928 | +/* |
1929 | + * Rainforest Automation |
1930 | + */ |
1931 | +/* ZigBee controller */ |
1932 | +#define FTDI_RF_R106 0x8A28 |
1933 | diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c |
1934 | index 0aac00a..8a90d58 100644 |
1935 | --- a/drivers/usb/serial/io_ti.c |
1936 | +++ b/drivers/usb/serial/io_ti.c |
1937 | @@ -2677,15 +2677,7 @@ cleanup: |
1938 | |
1939 | static void edge_disconnect(struct usb_serial *serial) |
1940 | { |
1941 | - int i; |
1942 | - struct edgeport_port *edge_port; |
1943 | - |
1944 | dbg("%s", __func__); |
1945 | - |
1946 | - for (i = 0; i < serial->num_ports; ++i) { |
1947 | - edge_port = usb_get_serial_port_data(serial->port[i]); |
1948 | - edge_remove_sysfs_attrs(edge_port->port); |
1949 | - } |
1950 | } |
1951 | |
1952 | static void edge_release(struct usb_serial *serial) |
1953 | @@ -2764,6 +2756,7 @@ static struct usb_serial_driver edgeport_1port_device = { |
1954 | .disconnect = edge_disconnect, |
1955 | .release = edge_release, |
1956 | .port_probe = edge_create_sysfs_attrs, |
1957 | + .port_remove = edge_remove_sysfs_attrs, |
1958 | .ioctl = edge_ioctl, |
1959 | .set_termios = edge_set_termios, |
1960 | .tiocmget = edge_tiocmget, |
1961 | @@ -2795,6 +2788,7 @@ static struct usb_serial_driver edgeport_2port_device = { |
1962 | .disconnect = edge_disconnect, |
1963 | .release = edge_release, |
1964 | .port_probe = edge_create_sysfs_attrs, |
1965 | + .port_remove = edge_remove_sysfs_attrs, |
1966 | .ioctl = edge_ioctl, |
1967 | .set_termios = edge_set_termios, |
1968 | .tiocmget = edge_tiocmget, |
1969 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
1970 | index c96b6b6..2a9ed6e 100644 |
1971 | --- a/drivers/usb/serial/option.c |
1972 | +++ b/drivers/usb/serial/option.c |
1973 | @@ -480,6 +480,10 @@ static void option_instat_callback(struct urb *urb); |
1974 | #define ZD_VENDOR_ID 0x0685 |
1975 | #define ZD_PRODUCT_7000 0x7000 |
1976 | |
1977 | +/* LG products */ |
1978 | +#define LG_VENDOR_ID 0x1004 |
1979 | +#define LG_PRODUCT_L02C 0x618f |
1980 | + |
1981 | /* some devices interfaces need special handling due to a number of reasons */ |
1982 | enum option_blacklist_reason { |
1983 | OPTION_BLACKLIST_NONE = 0, |
1984 | @@ -1183,6 +1187,7 @@ static const struct usb_device_id option_ids[] = { |
1985 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, |
1986 | { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, |
1987 | { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, |
1988 | + { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ |
1989 | { } /* Terminating entry */ |
1990 | }; |
1991 | MODULE_DEVICE_TABLE(usb, option_ids); |
1992 | diff --git a/drivers/usb/serial/qcaux.c b/drivers/usb/serial/qcaux.c |
1993 | index 30b73e6..a348198 100644 |
1994 | --- a/drivers/usb/serial/qcaux.c |
1995 | +++ b/drivers/usb/serial/qcaux.c |
1996 | @@ -36,6 +36,7 @@ |
1997 | #define UTSTARCOM_PRODUCT_UM175_V1 0x3712 |
1998 | #define UTSTARCOM_PRODUCT_UM175_V2 0x3714 |
1999 | #define UTSTARCOM_PRODUCT_UM175_ALLTEL 0x3715 |
2000 | +#define PANTECH_PRODUCT_UML190_VZW 0x3716 |
2001 | #define PANTECH_PRODUCT_UML290_VZW 0x3718 |
2002 | |
2003 | /* CMOTECH devices */ |
2004 | @@ -67,7 +68,11 @@ static struct usb_device_id id_table[] = { |
2005 | { USB_DEVICE_AND_INTERFACE_INFO(LG_VENDOR_ID, LG_PRODUCT_VX4400_6000, 0xff, 0xff, 0x00) }, |
2006 | { USB_DEVICE_AND_INTERFACE_INFO(SANYO_VENDOR_ID, SANYO_PRODUCT_KATANA_LX, 0xff, 0xff, 0x00) }, |
2007 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_U520, 0xff, 0x00, 0x00) }, |
2008 | - { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, |
2009 | + { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xff, 0xff) }, |
2010 | + { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML190_VZW, 0xff, 0xfe, 0xff) }, |
2011 | + { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfd, 0xff) }, /* NMEA */ |
2012 | + { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xfe, 0xff) }, /* WMC */ |
2013 | + { USB_DEVICE_AND_INTERFACE_INFO(UTSTARCOM_VENDOR_ID, PANTECH_PRODUCT_UML290_VZW, 0xff, 0xff, 0xff) }, /* DIAG */ |
2014 | { }, |
2015 | }; |
2016 | MODULE_DEVICE_TABLE(usb, id_table); |
2017 | diff --git a/drivers/usb/storage/realtek_cr.c b/drivers/usb/storage/realtek_cr.c |
2018 | index 0ce5f79..32c93d7 100644 |
2019 | --- a/drivers/usb/storage/realtek_cr.c |
2020 | +++ b/drivers/usb/storage/realtek_cr.c |
2021 | @@ -791,7 +791,7 @@ static void rts51x_suspend_timer_fn(unsigned long data) |
2022 | rts51x_set_stat(chip, RTS51X_STAT_SS); |
2023 | /* ignore mass storage interface's children */ |
2024 | pm_suspend_ignore_children(&us->pusb_intf->dev, true); |
2025 | - usb_autopm_put_interface(us->pusb_intf); |
2026 | + usb_autopm_put_interface_async(us->pusb_intf); |
2027 | US_DEBUGP("%s: RTS51X_STAT_SS 01," |
2028 | "intf->pm_usage_cnt:%d, power.usage:%d\n", |
2029 | __func__, |
2030 | diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c |
2031 | index 2a83425..68b19ab 100644 |
2032 | --- a/fs/ecryptfs/crypto.c |
2033 | +++ b/fs/ecryptfs/crypto.c |
2034 | @@ -417,17 +417,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page, |
2035 | (unsigned long long)(extent_base + extent_offset), rc); |
2036 | goto out; |
2037 | } |
2038 | - if (unlikely(ecryptfs_verbosity > 0)) { |
2039 | - ecryptfs_printk(KERN_DEBUG, "Encrypting extent " |
2040 | - "with iv:\n"); |
2041 | - ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes); |
2042 | - ecryptfs_printk(KERN_DEBUG, "First 8 bytes before " |
2043 | - "encryption:\n"); |
2044 | - ecryptfs_dump_hex((char *) |
2045 | - (page_address(page) |
2046 | - + (extent_offset * crypt_stat->extent_size)), |
2047 | - 8); |
2048 | - } |
2049 | rc = ecryptfs_encrypt_page_offset(crypt_stat, enc_extent_page, 0, |
2050 | page, (extent_offset |
2051 | * crypt_stat->extent_size), |
2052 | @@ -440,14 +429,6 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page, |
2053 | goto out; |
2054 | } |
2055 | rc = 0; |
2056 | - if (unlikely(ecryptfs_verbosity > 0)) { |
2057 | - ecryptfs_printk(KERN_DEBUG, "Encrypt extent [0x%.16llx]; " |
2058 | - "rc = [%d]\n", |
2059 | - (unsigned long long)(extent_base + extent_offset), rc); |
2060 | - ecryptfs_printk(KERN_DEBUG, "First 8 bytes after " |
2061 | - "encryption:\n"); |
2062 | - ecryptfs_dump_hex((char *)(page_address(enc_extent_page)), 8); |
2063 | - } |
2064 | out: |
2065 | return rc; |
2066 | } |
2067 | @@ -543,17 +524,6 @@ static int ecryptfs_decrypt_extent(struct page *page, |
2068 | (unsigned long long)(extent_base + extent_offset), rc); |
2069 | goto out; |
2070 | } |
2071 | - if (unlikely(ecryptfs_verbosity > 0)) { |
2072 | - ecryptfs_printk(KERN_DEBUG, "Decrypting extent " |
2073 | - "with iv:\n"); |
2074 | - ecryptfs_dump_hex(extent_iv, crypt_stat->iv_bytes); |
2075 | - ecryptfs_printk(KERN_DEBUG, "First 8 bytes before " |
2076 | - "decryption:\n"); |
2077 | - ecryptfs_dump_hex((char *) |
2078 | - (page_address(enc_extent_page) |
2079 | - + (extent_offset * crypt_stat->extent_size)), |
2080 | - 8); |
2081 | - } |
2082 | rc = ecryptfs_decrypt_page_offset(crypt_stat, page, |
2083 | (extent_offset |
2084 | * crypt_stat->extent_size), |
2085 | @@ -567,16 +537,6 @@ static int ecryptfs_decrypt_extent(struct page *page, |
2086 | goto out; |
2087 | } |
2088 | rc = 0; |
2089 | - if (unlikely(ecryptfs_verbosity > 0)) { |
2090 | - ecryptfs_printk(KERN_DEBUG, "Decrypt extent [0x%.16llx]; " |
2091 | - "rc = [%d]\n", |
2092 | - (unsigned long long)(extent_base + extent_offset), rc); |
2093 | - ecryptfs_printk(KERN_DEBUG, "First 8 bytes after " |
2094 | - "decryption:\n"); |
2095 | - ecryptfs_dump_hex((char *)(page_address(page) |
2096 | - + (extent_offset |
2097 | - * crypt_stat->extent_size)), 8); |
2098 | - } |
2099 | out: |
2100 | return rc; |
2101 | } |
2102 | @@ -1620,7 +1580,8 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) |
2103 | rc = ecryptfs_read_xattr_region(page_virt, ecryptfs_inode); |
2104 | if (rc) { |
2105 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " |
2106 | - "file header region or xattr region\n"); |
2107 | + "file header region or xattr region, inode %lu\n", |
2108 | + ecryptfs_inode->i_ino); |
2109 | rc = -EINVAL; |
2110 | goto out; |
2111 | } |
2112 | @@ -1629,7 +1590,8 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) |
2113 | ECRYPTFS_DONT_VALIDATE_HEADER_SIZE); |
2114 | if (rc) { |
2115 | printk(KERN_DEBUG "Valid eCryptfs headers not found in " |
2116 | - "file xattr region either\n"); |
2117 | + "file xattr region either, inode %lu\n", |
2118 | + ecryptfs_inode->i_ino); |
2119 | rc = -EINVAL; |
2120 | } |
2121 | if (crypt_stat->mount_crypt_stat->flags |
2122 | @@ -1640,7 +1602,8 @@ int ecryptfs_read_metadata(struct dentry *ecryptfs_dentry) |
2123 | "crypto metadata only in the extended attribute " |
2124 | "region, but eCryptfs was mounted without " |
2125 | "xattr support enabled. eCryptfs will not treat " |
2126 | - "this like an encrypted file.\n"); |
2127 | + "this like an encrypted file, inode %lu\n", |
2128 | + ecryptfs_inode->i_ino); |
2129 | rc = -EINVAL; |
2130 | } |
2131 | } |
2132 | diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c |
2133 | index 32f90a3..d2039ca 100644 |
2134 | --- a/fs/ecryptfs/inode.c |
2135 | +++ b/fs/ecryptfs/inode.c |
2136 | @@ -841,18 +841,6 @@ static int truncate_upper(struct dentry *dentry, struct iattr *ia, |
2137 | size_t num_zeros = (PAGE_CACHE_SIZE |
2138 | - (ia->ia_size & ~PAGE_CACHE_MASK)); |
2139 | |
2140 | - |
2141 | - /* |
2142 | - * XXX(truncate) this should really happen at the begginning |
2143 | - * of ->setattr. But the code is too messy to that as part |
2144 | - * of a larger patch. ecryptfs is also totally missing out |
2145 | - * on the inode_change_ok check at the beginning of |
2146 | - * ->setattr while would include this. |
2147 | - */ |
2148 | - rc = inode_newsize_ok(inode, ia->ia_size); |
2149 | - if (rc) |
2150 | - goto out; |
2151 | - |
2152 | if (!(crypt_stat->flags & ECRYPTFS_ENCRYPTED)) { |
2153 | truncate_setsize(inode, ia->ia_size); |
2154 | lower_ia->ia_size = ia->ia_size; |
2155 | @@ -902,6 +890,28 @@ out: |
2156 | return rc; |
2157 | } |
2158 | |
2159 | +static int ecryptfs_inode_newsize_ok(struct inode *inode, loff_t offset) |
2160 | +{ |
2161 | + struct ecryptfs_crypt_stat *crypt_stat; |
2162 | + loff_t lower_oldsize, lower_newsize; |
2163 | + |
2164 | + crypt_stat = &ecryptfs_inode_to_private(inode)->crypt_stat; |
2165 | + lower_oldsize = upper_size_to_lower_size(crypt_stat, |
2166 | + i_size_read(inode)); |
2167 | + lower_newsize = upper_size_to_lower_size(crypt_stat, offset); |
2168 | + if (lower_newsize > lower_oldsize) { |
2169 | + /* |
2170 | + * The eCryptfs inode and the new *lower* size are mixed here |
2171 | + * because we may not have the lower i_mutex held and/or it may |
2172 | + * not be appropriate to call inode_newsize_ok() with inodes |
2173 | + * from other filesystems. |
2174 | + */ |
2175 | + return inode_newsize_ok(inode, lower_newsize); |
2176 | + } |
2177 | + |
2178 | + return 0; |
2179 | +} |
2180 | + |
2181 | /** |
2182 | * ecryptfs_truncate |
2183 | * @dentry: The ecryptfs layer dentry |
2184 | @@ -918,6 +928,10 @@ int ecryptfs_truncate(struct dentry *dentry, loff_t new_length) |
2185 | struct iattr lower_ia = { .ia_valid = 0 }; |
2186 | int rc; |
2187 | |
2188 | + rc = ecryptfs_inode_newsize_ok(dentry->d_inode, new_length); |
2189 | + if (rc) |
2190 | + return rc; |
2191 | + |
2192 | rc = truncate_upper(dentry, &ia, &lower_ia); |
2193 | if (!rc && lower_ia.ia_valid & ATTR_SIZE) { |
2194 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry); |
2195 | @@ -997,6 +1011,16 @@ static int ecryptfs_setattr(struct dentry *dentry, struct iattr *ia) |
2196 | } |
2197 | } |
2198 | mutex_unlock(&crypt_stat->cs_mutex); |
2199 | + |
2200 | + rc = inode_change_ok(inode, ia); |
2201 | + if (rc) |
2202 | + goto out; |
2203 | + if (ia->ia_valid & ATTR_SIZE) { |
2204 | + rc = ecryptfs_inode_newsize_ok(inode, ia->ia_size); |
2205 | + if (rc) |
2206 | + goto out; |
2207 | + } |
2208 | + |
2209 | if (S_ISREG(inode->i_mode)) { |
2210 | rc = filemap_write_and_wait(inode->i_mapping); |
2211 | if (rc) |
2212 | diff --git a/fs/ecryptfs/miscdev.c b/fs/ecryptfs/miscdev.c |
2213 | index 940a82e..0dc5a3d 100644 |
2214 | --- a/fs/ecryptfs/miscdev.c |
2215 | +++ b/fs/ecryptfs/miscdev.c |
2216 | @@ -409,11 +409,47 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, |
2217 | ssize_t sz = 0; |
2218 | char *data; |
2219 | uid_t euid = current_euid(); |
2220 | + unsigned char packet_size_peek[3]; |
2221 | int rc; |
2222 | |
2223 | - if (count == 0) |
2224 | + if (count == 0) { |
2225 | goto out; |
2226 | + } else if (count == (1 + 4)) { |
2227 | + /* Likely a harmless MSG_HELO or MSG_QUIT - no packet length */ |
2228 | + goto memdup; |
2229 | + } else if (count < (1 + 4 + 1) |
2230 | + || count > (1 + 4 + 2 + sizeof(struct ecryptfs_message) + 4 |
2231 | + + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES)) { |
2232 | + printk(KERN_WARNING "%s: Acceptable packet size range is " |
2233 | + "[%d-%lu], but amount of data written is [%zu].", |
2234 | + __func__, (1 + 4 + 1), |
2235 | + (1 + 4 + 2 + sizeof(struct ecryptfs_message) + 4 |
2236 | + + ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES), count); |
2237 | + return -EINVAL; |
2238 | + } |
2239 | + |
2240 | + if (copy_from_user(packet_size_peek, (buf + 1 + 4), |
2241 | + sizeof(packet_size_peek))) { |
2242 | + printk(KERN_WARNING "%s: Error while inspecting packet size\n", |
2243 | + __func__); |
2244 | + return -EFAULT; |
2245 | + } |
2246 | + |
2247 | + rc = ecryptfs_parse_packet_length(packet_size_peek, &packet_size, |
2248 | + &packet_size_length); |
2249 | + if (rc) { |
2250 | + printk(KERN_WARNING "%s: Error parsing packet length; " |
2251 | + "rc = [%d]\n", __func__, rc); |
2252 | + return rc; |
2253 | + } |
2254 | + |
2255 | + if ((1 + 4 + packet_size_length + packet_size) != count) { |
2256 | + printk(KERN_WARNING "%s: Invalid packet size [%zu]\n", __func__, |
2257 | + packet_size); |
2258 | + return -EINVAL; |
2259 | + } |
2260 | |
2261 | +memdup: |
2262 | data = memdup_user(buf, count); |
2263 | if (IS_ERR(data)) { |
2264 | printk(KERN_ERR "%s: memdup_user returned error [%ld]\n", |
2265 | @@ -435,23 +471,7 @@ ecryptfs_miscdev_write(struct file *file, const char __user *buf, |
2266 | } |
2267 | memcpy(&counter_nbo, &data[i], 4); |
2268 | seq = be32_to_cpu(counter_nbo); |
2269 | - i += 4; |
2270 | - rc = ecryptfs_parse_packet_length(&data[i], &packet_size, |
2271 | - &packet_size_length); |
2272 | - if (rc) { |
2273 | - printk(KERN_WARNING "%s: Error parsing packet length; " |
2274 | - "rc = [%d]\n", __func__, rc); |
2275 | - goto out_free; |
2276 | - } |
2277 | - i += packet_size_length; |
2278 | - if ((1 + 4 + packet_size_length + packet_size) != count) { |
2279 | - printk(KERN_WARNING "%s: (1 + packet_size_length([%zd])" |
2280 | - " + packet_size([%zd]))([%zd]) != " |
2281 | - "count([%zd]). Invalid packet format.\n", |
2282 | - __func__, packet_size_length, packet_size, |
2283 | - (1 + packet_size_length + packet_size), count); |
2284 | - goto out_free; |
2285 | - } |
2286 | + i += 4 + packet_size_length; |
2287 | rc = ecryptfs_miscdev_response(&data[i], packet_size, |
2288 | euid, current_user_ns(), |
2289 | task_pid(current), seq); |
2290 | diff --git a/fs/ecryptfs/read_write.c b/fs/ecryptfs/read_write.c |
2291 | index 3745f7c..54eb14c 100644 |
2292 | --- a/fs/ecryptfs/read_write.c |
2293 | +++ b/fs/ecryptfs/read_write.c |
2294 | @@ -132,6 +132,11 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
2295 | size_t num_bytes = (PAGE_CACHE_SIZE - start_offset_in_page); |
2296 | size_t total_remaining_bytes = ((offset + size) - pos); |
2297 | |
2298 | + if (fatal_signal_pending(current)) { |
2299 | + rc = -EINTR; |
2300 | + break; |
2301 | + } |
2302 | + |
2303 | if (num_bytes > total_remaining_bytes) |
2304 | num_bytes = total_remaining_bytes; |
2305 | if (pos < offset) { |
2306 | @@ -193,15 +198,19 @@ int ecryptfs_write(struct inode *ecryptfs_inode, char *data, loff_t offset, |
2307 | } |
2308 | pos += num_bytes; |
2309 | } |
2310 | - if ((offset + size) > ecryptfs_file_size) { |
2311 | - i_size_write(ecryptfs_inode, (offset + size)); |
2312 | + if (pos > ecryptfs_file_size) { |
2313 | + i_size_write(ecryptfs_inode, pos); |
2314 | if (crypt_stat->flags & ECRYPTFS_ENCRYPTED) { |
2315 | - rc = ecryptfs_write_inode_size_to_metadata( |
2316 | + int rc2; |
2317 | + |
2318 | + rc2 = ecryptfs_write_inode_size_to_metadata( |
2319 | ecryptfs_inode); |
2320 | - if (rc) { |
2321 | + if (rc2) { |
2322 | printk(KERN_ERR "Problem with " |
2323 | "ecryptfs_write_inode_size_to_metadata; " |
2324 | - "rc = [%d]\n", rc); |
2325 | + "rc = [%d]\n", rc2); |
2326 | + if (!rc) |
2327 | + rc = rc2; |
2328 | goto out; |
2329 | } |
2330 | } |
2331 | diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c |
2332 | index f94fc48..5c93ffc 100644 |
2333 | --- a/fs/jbd/checkpoint.c |
2334 | +++ b/fs/jbd/checkpoint.c |
2335 | @@ -453,8 +453,6 @@ out: |
2336 | * |
2337 | * Return <0 on error, 0 on success, 1 if there was nothing to clean up. |
2338 | * |
2339 | - * Called with the journal lock held. |
2340 | - * |
2341 | * This is the only part of the journaling code which really needs to be |
2342 | * aware of transaction aborts. Checkpointing involves writing to the |
2343 | * main filesystem area rather than to the journal, so it can proceed |
2344 | @@ -472,13 +470,14 @@ int cleanup_journal_tail(journal_t *journal) |
2345 | if (is_journal_aborted(journal)) |
2346 | return 1; |
2347 | |
2348 | - /* OK, work out the oldest transaction remaining in the log, and |
2349 | + /* |
2350 | + * OK, work out the oldest transaction remaining in the log, and |
2351 | * the log block it starts at. |
2352 | * |
2353 | * If the log is now empty, we need to work out which is the |
2354 | * next transaction ID we will write, and where it will |
2355 | - * start. */ |
2356 | - |
2357 | + * start. |
2358 | + */ |
2359 | spin_lock(&journal->j_state_lock); |
2360 | spin_lock(&journal->j_list_lock); |
2361 | transaction = journal->j_checkpoint_transactions; |
2362 | @@ -504,7 +503,25 @@ int cleanup_journal_tail(journal_t *journal) |
2363 | spin_unlock(&journal->j_state_lock); |
2364 | return 1; |
2365 | } |
2366 | + spin_unlock(&journal->j_state_lock); |
2367 | + |
2368 | + /* |
2369 | + * We need to make sure that any blocks that were recently written out |
2370 | + * --- perhaps by log_do_checkpoint() --- are flushed out before we |
2371 | + * drop the transactions from the journal. It's unlikely this will be |
2372 | + * necessary, especially with an appropriately sized journal, but we |
2373 | + * need this to guarantee correctness. Fortunately |
2374 | + * cleanup_journal_tail() doesn't get called all that often. |
2375 | + */ |
2376 | + if (journal->j_flags & JFS_BARRIER) |
2377 | + blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL); |
2378 | |
2379 | + spin_lock(&journal->j_state_lock); |
2380 | + if (!tid_gt(first_tid, journal->j_tail_sequence)) { |
2381 | + spin_unlock(&journal->j_state_lock); |
2382 | + /* Someone else cleaned up journal so return 0 */ |
2383 | + return 0; |
2384 | + } |
2385 | /* OK, update the superblock to recover the freed space. |
2386 | * Physical blocks come first: have we wrapped beyond the end of |
2387 | * the log? */ |
2388 | diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c |
2389 | index 5b43e96..008bf06 100644 |
2390 | --- a/fs/jbd/recovery.c |
2391 | +++ b/fs/jbd/recovery.c |
2392 | @@ -20,6 +20,7 @@ |
2393 | #include <linux/fs.h> |
2394 | #include <linux/jbd.h> |
2395 | #include <linux/errno.h> |
2396 | +#include <linux/blkdev.h> |
2397 | #endif |
2398 | |
2399 | /* |
2400 | @@ -263,6 +264,9 @@ int journal_recover(journal_t *journal) |
2401 | err2 = sync_blockdev(journal->j_fs_dev); |
2402 | if (!err) |
2403 | err = err2; |
2404 | + /* Flush disk caches to get replayed data on the permanent storage */ |
2405 | + if (journal->j_flags & JFS_BARRIER) |
2406 | + blkdev_issue_flush(journal->j_fs_dev, GFP_KERNEL, NULL); |
2407 | |
2408 | return err; |
2409 | } |
2410 | diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c |
2411 | index d4e6080b..779789a 100644 |
2412 | --- a/fs/sysfs/file.c |
2413 | +++ b/fs/sysfs/file.c |
2414 | @@ -493,6 +493,12 @@ int sysfs_attr_ns(struct kobject *kobj, const struct attribute *attr, |
2415 | const void *ns = NULL; |
2416 | int err; |
2417 | |
2418 | + if (!dir_sd) { |
2419 | + WARN(1, KERN_ERR "sysfs: kobject %s without dirent\n", |
2420 | + kobject_name(kobj)); |
2421 | + return -ENOENT; |
2422 | + } |
2423 | + |
2424 | err = 0; |
2425 | if (!sysfs_ns_type(dir_sd)) |
2426 | goto out; |
2427 | diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c |
2428 | index c81b22f..deb804b 100644 |
2429 | --- a/fs/sysfs/inode.c |
2430 | +++ b/fs/sysfs/inode.c |
2431 | @@ -318,8 +318,11 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const cha |
2432 | struct sysfs_addrm_cxt acxt; |
2433 | struct sysfs_dirent *sd; |
2434 | |
2435 | - if (!dir_sd) |
2436 | + if (!dir_sd) { |
2437 | + WARN(1, KERN_WARNING "sysfs: can not remove '%s', no directory\n", |
2438 | + name); |
2439 | return -ENOENT; |
2440 | + } |
2441 | |
2442 | sysfs_addrm_start(&acxt, dir_sd); |
2443 | |
2444 | diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c |
2445 | index ce9268a..ee98d0b 100644 |
2446 | --- a/fs/xfs/xfs_vnodeops.c |
2447 | +++ b/fs/xfs/xfs_vnodeops.c |
2448 | @@ -131,7 +131,8 @@ xfs_readlink( |
2449 | __func__, (unsigned long long) ip->i_ino, |
2450 | (long long) pathlen); |
2451 | ASSERT(0); |
2452 | - return XFS_ERROR(EFSCORRUPTED); |
2453 | + error = XFS_ERROR(EFSCORRUPTED); |
2454 | + goto out; |
2455 | } |
2456 | |
2457 | |
2458 | diff --git a/include/drm/drmP.h b/include/drm/drmP.h |
2459 | index 1f9e951..bf4b2dc 100644 |
2460 | --- a/include/drm/drmP.h |
2461 | +++ b/include/drm/drmP.h |
2462 | @@ -1328,6 +1328,7 @@ extern int drm_getmagic(struct drm_device *dev, void *data, |
2463 | struct drm_file *file_priv); |
2464 | extern int drm_authmagic(struct drm_device *dev, void *data, |
2465 | struct drm_file *file_priv); |
2466 | +extern int drm_remove_magic(struct drm_master *master, drm_magic_t magic); |
2467 | |
2468 | /* Cache management (drm_cache.c) */ |
2469 | void drm_clflush_pages(struct page *pages[], unsigned long num_pages); |
2470 | diff --git a/include/net/netns/generic.h b/include/net/netns/generic.h |
2471 | index 3419bf5..d55f434 100644 |
2472 | --- a/include/net/netns/generic.h |
2473 | +++ b/include/net/netns/generic.h |
2474 | @@ -41,6 +41,7 @@ static inline void *net_generic(const struct net *net, int id) |
2475 | ptr = ng->ptr[id - 1]; |
2476 | rcu_read_unlock(); |
2477 | |
2478 | + BUG_ON(!ptr); |
2479 | return ptr; |
2480 | } |
2481 | #endif |
2482 | diff --git a/net/caif/caif_dev.c b/net/caif/caif_dev.c |
2483 | index f1fa1f6..68223e4 100644 |
2484 | --- a/net/caif/caif_dev.c |
2485 | +++ b/net/caif/caif_dev.c |
2486 | @@ -53,7 +53,6 @@ struct cfcnfg *get_cfcnfg(struct net *net) |
2487 | struct caif_net *caifn; |
2488 | BUG_ON(!net); |
2489 | caifn = net_generic(net, caif_net_id); |
2490 | - BUG_ON(!caifn); |
2491 | return caifn->cfg; |
2492 | } |
2493 | EXPORT_SYMBOL(get_cfcnfg); |
2494 | @@ -63,7 +62,6 @@ static struct caif_device_entry_list *caif_device_list(struct net *net) |
2495 | struct caif_net *caifn; |
2496 | BUG_ON(!net); |
2497 | caifn = net_generic(net, caif_net_id); |
2498 | - BUG_ON(!caifn); |
2499 | return &caifn->caifdevs; |
2500 | } |
2501 | |
2502 | @@ -92,7 +90,6 @@ static struct caif_device_entry *caif_device_alloc(struct net_device *dev) |
2503 | struct caif_device_entry *caifd; |
2504 | |
2505 | caifdevs = caif_device_list(dev_net(dev)); |
2506 | - BUG_ON(!caifdevs); |
2507 | |
2508 | caifd = kzalloc(sizeof(*caifd), GFP_KERNEL); |
2509 | if (!caifd) |
2510 | @@ -112,7 +109,7 @@ static struct caif_device_entry *caif_get(struct net_device *dev) |
2511 | struct caif_device_entry_list *caifdevs = |
2512 | caif_device_list(dev_net(dev)); |
2513 | struct caif_device_entry *caifd; |
2514 | - BUG_ON(!caifdevs); |
2515 | + |
2516 | list_for_each_entry_rcu(caifd, &caifdevs->list, list) { |
2517 | if (caifd->netdev == dev) |
2518 | return caifd; |
2519 | @@ -353,7 +350,7 @@ static struct notifier_block caif_device_notifier = { |
2520 | static int caif_init_net(struct net *net) |
2521 | { |
2522 | struct caif_net *caifn = net_generic(net, caif_net_id); |
2523 | - BUG_ON(!caifn); |
2524 | + |
2525 | INIT_LIST_HEAD(&caifn->caifdevs.list); |
2526 | mutex_init(&caifn->caifdevs.lock); |
2527 | |
2528 | @@ -418,7 +415,7 @@ static int __init caif_device_init(void) |
2529 | { |
2530 | int result; |
2531 | |
2532 | - result = register_pernet_device(&caif_net_ops); |
2533 | + result = register_pernet_subsys(&caif_net_ops); |
2534 | |
2535 | if (result) |
2536 | return result; |
2537 | @@ -431,7 +428,7 @@ static int __init caif_device_init(void) |
2538 | |
2539 | static void __exit caif_device_exit(void) |
2540 | { |
2541 | - unregister_pernet_device(&caif_net_ops); |
2542 | + unregister_pernet_subsys(&caif_net_ops); |
2543 | unregister_netdevice_notifier(&caif_device_notifier); |
2544 | dev_remove_pack(&caif_packet_type); |
2545 | } |
2546 | diff --git a/net/caif/cfcnfg.c b/net/caif/cfcnfg.c |
2547 | index 00523ec..86ff37c 100644 |
2548 | --- a/net/caif/cfcnfg.c |
2549 | +++ b/net/caif/cfcnfg.c |
2550 | @@ -309,7 +309,6 @@ int caif_connect_client(struct net *net, struct caif_connect_request *conn_req, |
2551 | int err; |
2552 | struct cfctrl_link_param param; |
2553 | struct cfcnfg *cfg = get_cfcnfg(net); |
2554 | - caif_assert(cfg != NULL); |
2555 | |
2556 | rcu_read_lock(); |
2557 | err = caif_connect_req_to_link_param(cfg, conn_req, ¶m); |
2558 | diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c |
2559 | index 385aefe..0329404 100644 |
2560 | --- a/net/core/net-sysfs.c |
2561 | +++ b/net/core/net-sysfs.c |
2562 | @@ -990,9 +990,9 @@ static ssize_t store_xps_map(struct netdev_queue *queue, |
2563 | nonempty = 1; |
2564 | } |
2565 | |
2566 | - if (nonempty) |
2567 | - RCU_INIT_POINTER(dev->xps_maps, new_dev_maps); |
2568 | - else { |
2569 | + if (nonempty) { |
2570 | + rcu_assign_pointer(dev->xps_maps, new_dev_maps); |
2571 | + } else { |
2572 | kfree(new_dev_maps); |
2573 | RCU_INIT_POINTER(dev->xps_maps, NULL); |
2574 | } |
2575 | diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c |
2576 | index aefcd7a..0e950fd 100644 |
2577 | --- a/net/core/net_namespace.c |
2578 | +++ b/net/core/net_namespace.c |
2579 | @@ -30,6 +30,20 @@ EXPORT_SYMBOL(init_net); |
2580 | |
2581 | #define INITIAL_NET_GEN_PTRS 13 /* +1 for len +2 for rcu_head */ |
2582 | |
2583 | +static unsigned int max_gen_ptrs = INITIAL_NET_GEN_PTRS; |
2584 | + |
2585 | +static struct net_generic *net_alloc_generic(void) |
2586 | +{ |
2587 | + struct net_generic *ng; |
2588 | + size_t generic_size = offsetof(struct net_generic, ptr[max_gen_ptrs]); |
2589 | + |
2590 | + ng = kzalloc(generic_size, GFP_KERNEL); |
2591 | + if (ng) |
2592 | + ng->len = max_gen_ptrs; |
2593 | + |
2594 | + return ng; |
2595 | +} |
2596 | + |
2597 | static int net_assign_generic(struct net *net, int id, void *data) |
2598 | { |
2599 | struct net_generic *ng, *old_ng; |
2600 | @@ -43,8 +57,7 @@ static int net_assign_generic(struct net *net, int id, void *data) |
2601 | if (old_ng->len >= id) |
2602 | goto assign; |
2603 | |
2604 | - ng = kzalloc(sizeof(struct net_generic) + |
2605 | - id * sizeof(void *), GFP_KERNEL); |
2606 | + ng = net_alloc_generic(); |
2607 | if (ng == NULL) |
2608 | return -ENOMEM; |
2609 | |
2610 | @@ -59,7 +72,6 @@ static int net_assign_generic(struct net *net, int id, void *data) |
2611 | * the old copy for kfree after a grace period. |
2612 | */ |
2613 | |
2614 | - ng->len = id; |
2615 | memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*)); |
2616 | |
2617 | rcu_assign_pointer(net->gen, ng); |
2618 | @@ -161,18 +173,6 @@ out_undo: |
2619 | goto out; |
2620 | } |
2621 | |
2622 | -static struct net_generic *net_alloc_generic(void) |
2623 | -{ |
2624 | - struct net_generic *ng; |
2625 | - size_t generic_size = sizeof(struct net_generic) + |
2626 | - INITIAL_NET_GEN_PTRS * sizeof(void *); |
2627 | - |
2628 | - ng = kzalloc(generic_size, GFP_KERNEL); |
2629 | - if (ng) |
2630 | - ng->len = INITIAL_NET_GEN_PTRS; |
2631 | - |
2632 | - return ng; |
2633 | -} |
2634 | |
2635 | #ifdef CONFIG_NET_NS |
2636 | static struct kmem_cache *net_cachep; |
2637 | @@ -483,6 +483,7 @@ again: |
2638 | } |
2639 | return error; |
2640 | } |
2641 | + max_gen_ptrs = max_t(unsigned int, max_gen_ptrs, *ops->id); |
2642 | } |
2643 | error = __register_pernet_operations(list, ops); |
2644 | if (error) { |
2645 | diff --git a/net/core/netpoll.c b/net/core/netpoll.c |
2646 | index cf64c1f..5d4d896 100644 |
2647 | --- a/net/core/netpoll.c |
2648 | +++ b/net/core/netpoll.c |
2649 | @@ -763,7 +763,7 @@ int __netpoll_setup(struct netpoll *np) |
2650 | } |
2651 | |
2652 | /* last thing to do is link it to the net device structure */ |
2653 | - RCU_INIT_POINTER(ndev->npinfo, npinfo); |
2654 | + rcu_assign_pointer(ndev->npinfo, npinfo); |
2655 | |
2656 | return 0; |
2657 | |
2658 | diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c |
2659 | index 2ab16e1..74d321a 100644 |
2660 | --- a/net/decnet/dn_dev.c |
2661 | +++ b/net/decnet/dn_dev.c |
2662 | @@ -388,7 +388,7 @@ static int dn_dev_insert_ifa(struct dn_dev *dn_db, struct dn_ifaddr *ifa) |
2663 | } |
2664 | |
2665 | ifa->ifa_next = dn_db->ifa_list; |
2666 | - RCU_INIT_POINTER(dn_db->ifa_list, ifa); |
2667 | + rcu_assign_pointer(dn_db->ifa_list, ifa); |
2668 | |
2669 | dn_ifaddr_notify(RTM_NEWADDR, ifa); |
2670 | blocking_notifier_call_chain(&dnaddr_chain, NETDEV_UP, ifa); |
2671 | @@ -1093,7 +1093,7 @@ static struct dn_dev *dn_dev_create(struct net_device *dev, int *err) |
2672 | |
2673 | memcpy(&dn_db->parms, p, sizeof(struct dn_dev_parms)); |
2674 | |
2675 | - RCU_INIT_POINTER(dev->dn_ptr, dn_db); |
2676 | + rcu_assign_pointer(dev->dn_ptr, dn_db); |
2677 | dn_db->dev = dev; |
2678 | init_timer(&dn_db->timer); |
2679 | |
2680 | diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c |
2681 | index 65f01dc..e41c40f 100644 |
2682 | --- a/net/ipv4/devinet.c |
2683 | +++ b/net/ipv4/devinet.c |
2684 | @@ -258,7 +258,7 @@ static struct in_device *inetdev_init(struct net_device *dev) |
2685 | ip_mc_up(in_dev); |
2686 | |
2687 | /* we can receive as soon as ip_ptr is set -- do this last */ |
2688 | - RCU_INIT_POINTER(dev->ip_ptr, in_dev); |
2689 | + rcu_assign_pointer(dev->ip_ptr, in_dev); |
2690 | out: |
2691 | return in_dev; |
2692 | out_kfree: |
2693 | diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c |
2694 | index 37b6711..3ce23f9 100644 |
2695 | --- a/net/ipv4/fib_trie.c |
2696 | +++ b/net/ipv4/fib_trie.c |
2697 | @@ -205,7 +205,7 @@ static inline struct tnode *node_parent_rcu(const struct rt_trie_node *node) |
2698 | return (struct tnode *)(parent & ~NODE_TYPE_MASK); |
2699 | } |
2700 | |
2701 | -/* Same as RCU_INIT_POINTER |
2702 | +/* Same as rcu_assign_pointer |
2703 | * but that macro() assumes that value is a pointer. |
2704 | */ |
2705 | static inline void node_set_parent(struct rt_trie_node *node, struct tnode *ptr) |
2706 | @@ -529,7 +529,7 @@ static void tnode_put_child_reorg(struct tnode *tn, int i, struct rt_trie_node * |
2707 | if (n) |
2708 | node_set_parent(n, tn); |
2709 | |
2710 | - RCU_INIT_POINTER(tn->child[i], n); |
2711 | + rcu_assign_pointer(tn->child[i], n); |
2712 | } |
2713 | |
2714 | #define MAX_WORK 10 |
2715 | @@ -1015,7 +1015,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn) |
2716 | |
2717 | tp = node_parent((struct rt_trie_node *) tn); |
2718 | if (!tp) |
2719 | - RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn); |
2720 | + rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn); |
2721 | |
2722 | tnode_free_flush(); |
2723 | if (!tp) |
2724 | @@ -1027,7 +1027,7 @@ static void trie_rebalance(struct trie *t, struct tnode *tn) |
2725 | if (IS_TNODE(tn)) |
2726 | tn = (struct tnode *)resize(t, (struct tnode *)tn); |
2727 | |
2728 | - RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn); |
2729 | + rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn); |
2730 | tnode_free_flush(); |
2731 | } |
2732 | |
2733 | @@ -1164,7 +1164,7 @@ static struct list_head *fib_insert_node(struct trie *t, u32 key, int plen) |
2734 | put_child(t, (struct tnode *)tp, cindex, |
2735 | (struct rt_trie_node *)tn); |
2736 | } else { |
2737 | - RCU_INIT_POINTER(t->trie, (struct rt_trie_node *)tn); |
2738 | + rcu_assign_pointer(t->trie, (struct rt_trie_node *)tn); |
2739 | tp = tn; |
2740 | } |
2741 | } |
2742 | diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c |
2743 | index c3cc64c..c8989a7 100644 |
2744 | --- a/net/ipv4/igmp.c |
2745 | +++ b/net/ipv4/igmp.c |
2746 | @@ -1244,7 +1244,7 @@ void ip_mc_inc_group(struct in_device *in_dev, __be32 addr) |
2747 | |
2748 | im->next_rcu = in_dev->mc_list; |
2749 | in_dev->mc_count++; |
2750 | - RCU_INIT_POINTER(in_dev->mc_list, im); |
2751 | + rcu_assign_pointer(in_dev->mc_list, im); |
2752 | |
2753 | #ifdef CONFIG_IP_MULTICAST |
2754 | igmpv3_del_delrec(in_dev, im->multiaddr); |
2755 | @@ -1816,7 +1816,7 @@ int ip_mc_join_group(struct sock *sk , struct ip_mreqn *imr) |
2756 | iml->next_rcu = inet->mc_list; |
2757 | iml->sflist = NULL; |
2758 | iml->sfmode = MCAST_EXCLUDE; |
2759 | - RCU_INIT_POINTER(inet->mc_list, iml); |
2760 | + rcu_assign_pointer(inet->mc_list, iml); |
2761 | ip_mc_inc_group(in_dev, addr); |
2762 | err = 0; |
2763 | done: |
2764 | @@ -2003,7 +2003,7 @@ int ip_mc_source(int add, int omode, struct sock *sk, struct |
2765 | atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc); |
2766 | kfree_rcu(psl, rcu); |
2767 | } |
2768 | - RCU_INIT_POINTER(pmc->sflist, newpsl); |
2769 | + rcu_assign_pointer(pmc->sflist, newpsl); |
2770 | psl = newpsl; |
2771 | } |
2772 | rv = 1; /* > 0 for insert logic below if sl_count is 0 */ |
2773 | @@ -2106,7 +2106,7 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter *msf, int ifindex) |
2774 | } else |
2775 | (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode, |
2776 | 0, NULL, 0); |
2777 | - RCU_INIT_POINTER(pmc->sflist, newpsl); |
2778 | + rcu_assign_pointer(pmc->sflist, newpsl); |
2779 | pmc->sfmode = msf->imsf_fmode; |
2780 | err = 0; |
2781 | done: |
2782 | diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c |
2783 | index 0b2e732..17ad951 100644 |
2784 | --- a/net/ipv4/ipip.c |
2785 | +++ b/net/ipv4/ipip.c |
2786 | @@ -231,7 +231,7 @@ static void ipip_tunnel_unlink(struct ipip_net *ipn, struct ip_tunnel *t) |
2787 | (iter = rtnl_dereference(*tp)) != NULL; |
2788 | tp = &iter->next) { |
2789 | if (t == iter) { |
2790 | - RCU_INIT_POINTER(*tp, t->next); |
2791 | + rcu_assign_pointer(*tp, t->next); |
2792 | break; |
2793 | } |
2794 | } |
2795 | @@ -241,8 +241,8 @@ static void ipip_tunnel_link(struct ipip_net *ipn, struct ip_tunnel *t) |
2796 | { |
2797 | struct ip_tunnel __rcu **tp = ipip_bucket(ipn, t); |
2798 | |
2799 | - RCU_INIT_POINTER(t->next, rtnl_dereference(*tp)); |
2800 | - RCU_INIT_POINTER(*tp, t); |
2801 | + rcu_assign_pointer(t->next, rtnl_dereference(*tp)); |
2802 | + rcu_assign_pointer(*tp, t); |
2803 | } |
2804 | |
2805 | static struct ip_tunnel * ipip_tunnel_locate(struct net *net, |
2806 | @@ -792,7 +792,7 @@ static int __net_init ipip_fb_tunnel_init(struct net_device *dev) |
2807 | return -ENOMEM; |
2808 | |
2809 | dev_hold(dev); |
2810 | - RCU_INIT_POINTER(ipn->tunnels_wc[0], tunnel); |
2811 | + rcu_assign_pointer(ipn->tunnels_wc[0], tunnel); |
2812 | return 0; |
2813 | } |
2814 | |
2815 | diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c |
2816 | index 76a7f07..d2aae27 100644 |
2817 | --- a/net/ipv4/ipmr.c |
2818 | +++ b/net/ipv4/ipmr.c |
2819 | @@ -1225,7 +1225,7 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsi |
2820 | |
2821 | ret = ip_ra_control(sk, 1, mrtsock_destruct); |
2822 | if (ret == 0) { |
2823 | - RCU_INIT_POINTER(mrt->mroute_sk, sk); |
2824 | + rcu_assign_pointer(mrt->mroute_sk, sk); |
2825 | IPV4_DEVCONF_ALL(net, MC_FORWARDING)++; |
2826 | } |
2827 | rtnl_unlock(); |
2828 | diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c |
2829 | index a9db4b1..c89e354 100644 |
2830 | --- a/net/ipv4/tcp_ipv4.c |
2831 | +++ b/net/ipv4/tcp_ipv4.c |
2832 | @@ -630,7 +630,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) |
2833 | arg.iov[0].iov_len = sizeof(rep.th); |
2834 | |
2835 | #ifdef CONFIG_TCP_MD5SIG |
2836 | - key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr) : NULL; |
2837 | + key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->saddr) : NULL; |
2838 | if (key) { |
2839 | rep.opt[0] = htonl((TCPOPT_NOP << 24) | |
2840 | (TCPOPT_NOP << 16) | |
2841 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c |
2842 | index 63170e2..097e0c7 100644 |
2843 | --- a/net/ipv4/tcp_output.c |
2844 | +++ b/net/ipv4/tcp_output.c |
2845 | @@ -1138,11 +1138,9 @@ int tcp_trim_head(struct sock *sk, struct sk_buff *skb, u32 len) |
2846 | sk_mem_uncharge(sk, len); |
2847 | sock_set_flag(sk, SOCK_QUEUE_SHRUNK); |
2848 | |
2849 | - /* Any change of skb->len requires recalculation of tso |
2850 | - * factor and mss. |
2851 | - */ |
2852 | + /* Any change of skb->len requires recalculation of tso factor. */ |
2853 | if (tcp_skb_pcount(skb) > 1) |
2854 | - tcp_set_skb_tso_segs(sk, skb, tcp_current_mss(sk)); |
2855 | + tcp_set_skb_tso_segs(sk, skb, tcp_skb_mss(skb)); |
2856 | |
2857 | return 0; |
2858 | } |
2859 | diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c |
2860 | index 36806de..836c4ea 100644 |
2861 | --- a/net/ipv6/addrconf.c |
2862 | +++ b/net/ipv6/addrconf.c |
2863 | @@ -429,7 +429,7 @@ static struct inet6_dev * ipv6_add_dev(struct net_device *dev) |
2864 | ndev->tstamp = jiffies; |
2865 | addrconf_sysctl_register(ndev); |
2866 | /* protected by rtnl_lock */ |
2867 | - RCU_INIT_POINTER(dev->ip6_ptr, ndev); |
2868 | + rcu_assign_pointer(dev->ip6_ptr, ndev); |
2869 | |
2870 | /* Join all-node multicast group */ |
2871 | ipv6_dev_mc_inc(dev, &in6addr_linklocal_allnodes); |
2872 | diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c |
2873 | index 4e2e9ff..d19f499 100644 |
2874 | --- a/net/ipv6/ip6_tunnel.c |
2875 | +++ b/net/ipv6/ip6_tunnel.c |
2876 | @@ -218,8 +218,8 @@ ip6_tnl_link(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) |
2877 | { |
2878 | struct ip6_tnl __rcu **tp = ip6_tnl_bucket(ip6n, &t->parms); |
2879 | |
2880 | - RCU_INIT_POINTER(t->next , rtnl_dereference(*tp)); |
2881 | - RCU_INIT_POINTER(*tp, t); |
2882 | + rcu_assign_pointer(t->next , rtnl_dereference(*tp)); |
2883 | + rcu_assign_pointer(*tp, t); |
2884 | } |
2885 | |
2886 | /** |
2887 | @@ -237,7 +237,7 @@ ip6_tnl_unlink(struct ip6_tnl_net *ip6n, struct ip6_tnl *t) |
2888 | (iter = rtnl_dereference(*tp)) != NULL; |
2889 | tp = &iter->next) { |
2890 | if (t == iter) { |
2891 | - RCU_INIT_POINTER(*tp, t->next); |
2892 | + rcu_assign_pointer(*tp, t->next); |
2893 | break; |
2894 | } |
2895 | } |
2896 | @@ -1450,7 +1450,7 @@ static int __net_init ip6_fb_tnl_dev_init(struct net_device *dev) |
2897 | |
2898 | t->parms.proto = IPPROTO_IPV6; |
2899 | dev_hold(dev); |
2900 | - RCU_INIT_POINTER(ip6n->tnls_wc[0], t); |
2901 | + rcu_assign_pointer(ip6n->tnls_wc[0], t); |
2902 | return 0; |
2903 | } |
2904 | |
2905 | diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c |
2906 | index 331af3b..361ebf3 100644 |
2907 | --- a/net/ipv6/raw.c |
2908 | +++ b/net/ipv6/raw.c |
2909 | @@ -131,7 +131,7 @@ static mh_filter_t __rcu *mh_filter __read_mostly; |
2910 | |
2911 | int rawv6_mh_filter_register(mh_filter_t filter) |
2912 | { |
2913 | - RCU_INIT_POINTER(mh_filter, filter); |
2914 | + rcu_assign_pointer(mh_filter, filter); |
2915 | return 0; |
2916 | } |
2917 | EXPORT_SYMBOL(rawv6_mh_filter_register); |
2918 | diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c |
2919 | index 96f3623..72a939d 100644 |
2920 | --- a/net/ipv6/sit.c |
2921 | +++ b/net/ipv6/sit.c |
2922 | @@ -182,7 +182,7 @@ static void ipip6_tunnel_unlink(struct sit_net *sitn, struct ip_tunnel *t) |
2923 | (iter = rtnl_dereference(*tp)) != NULL; |
2924 | tp = &iter->next) { |
2925 | if (t == iter) { |
2926 | - RCU_INIT_POINTER(*tp, t->next); |
2927 | + rcu_assign_pointer(*tp, t->next); |
2928 | break; |
2929 | } |
2930 | } |
2931 | @@ -192,8 +192,8 @@ static void ipip6_tunnel_link(struct sit_net *sitn, struct ip_tunnel *t) |
2932 | { |
2933 | struct ip_tunnel __rcu **tp = ipip6_bucket(sitn, t); |
2934 | |
2935 | - RCU_INIT_POINTER(t->next, rtnl_dereference(*tp)); |
2936 | - RCU_INIT_POINTER(*tp, t); |
2937 | + rcu_assign_pointer(t->next, rtnl_dereference(*tp)); |
2938 | + rcu_assign_pointer(*tp, t); |
2939 | } |
2940 | |
2941 | static void ipip6_tunnel_clone_6rd(struct net_device *dev, struct sit_net *sitn) |
2942 | @@ -393,7 +393,7 @@ ipip6_tunnel_add_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a, int chg) |
2943 | p->addr = a->addr; |
2944 | p->flags = a->flags; |
2945 | t->prl_count++; |
2946 | - RCU_INIT_POINTER(t->prl, p); |
2947 | + rcu_assign_pointer(t->prl, p); |
2948 | out: |
2949 | return err; |
2950 | } |
2951 | @@ -1177,7 +1177,7 @@ static int __net_init ipip6_fb_tunnel_init(struct net_device *dev) |
2952 | if (!dev->tstats) |
2953 | return -ENOMEM; |
2954 | dev_hold(dev); |
2955 | - RCU_INIT_POINTER(sitn->tunnels_wc[0], tunnel); |
2956 | + rcu_assign_pointer(sitn->tunnels_wc[0], tunnel); |
2957 | return 0; |
2958 | } |
2959 | |
2960 | diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c |
2961 | index 2dea4bb..b859e4a 100644 |
2962 | --- a/net/ipv6/tcp_ipv6.c |
2963 | +++ b/net/ipv6/tcp_ipv6.c |
2964 | @@ -1084,7 +1084,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb) |
2965 | |
2966 | #ifdef CONFIG_TCP_MD5SIG |
2967 | if (sk) |
2968 | - key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr); |
2969 | + key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr); |
2970 | #endif |
2971 | |
2972 | if (th->ack) |
2973 | diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c |
2974 | index d21e7eb..55670ec 100644 |
2975 | --- a/net/l2tp/l2tp_ip.c |
2976 | +++ b/net/l2tp/l2tp_ip.c |
2977 | @@ -393,11 +393,6 @@ static int l2tp_ip_backlog_recv(struct sock *sk, struct sk_buff *skb) |
2978 | { |
2979 | int rc; |
2980 | |
2981 | - if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) |
2982 | - goto drop; |
2983 | - |
2984 | - nf_reset(skb); |
2985 | - |
2986 | /* Charge it to the socket, dropping if the queue is full. */ |
2987 | rc = sock_queue_rcv_skb(sk, skb); |
2988 | if (rc < 0) |
2989 | diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c |
2990 | index 93b2434..41c2310 100644 |
2991 | --- a/net/mac80211/agg-rx.c |
2992 | +++ b/net/mac80211/agg-rx.c |
2993 | @@ -326,7 +326,7 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, |
2994 | status = WLAN_STATUS_SUCCESS; |
2995 | |
2996 | /* activate it for RX */ |
2997 | - RCU_INIT_POINTER(sta->ampdu_mlme.tid_rx[tid], tid_agg_rx); |
2998 | + rcu_assign_pointer(sta->ampdu_mlme.tid_rx[tid], tid_agg_rx); |
2999 | |
3000 | if (timeout) |
3001 | mod_timer(&tid_agg_rx->session_timer, TU_TO_EXP_TIME(timeout)); |
3002 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c |
3003 | index d06c65f..11cee76 100644 |
3004 | --- a/net/mac80211/cfg.c |
3005 | +++ b/net/mac80211/cfg.c |
3006 | @@ -575,7 +575,7 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata, |
3007 | |
3008 | sdata->vif.bss_conf.dtim_period = new->dtim_period; |
3009 | |
3010 | - RCU_INIT_POINTER(sdata->u.ap.beacon, new); |
3011 | + rcu_assign_pointer(sdata->u.ap.beacon, new); |
3012 | |
3013 | synchronize_rcu(); |
3014 | |
3015 | @@ -922,7 +922,7 @@ static int ieee80211_change_station(struct wiphy *wiphy, |
3016 | return -EBUSY; |
3017 | } |
3018 | |
3019 | - RCU_INIT_POINTER(vlansdata->u.vlan.sta, sta); |
3020 | + rcu_assign_pointer(vlansdata->u.vlan.sta, sta); |
3021 | } |
3022 | |
3023 | sta->sdata = vlansdata; |
3024 | diff --git a/net/mac80211/ibss.c b/net/mac80211/ibss.c |
3025 | index ede9a8b..3ece106 100644 |
3026 | --- a/net/mac80211/ibss.c |
3027 | +++ b/net/mac80211/ibss.c |
3028 | @@ -184,7 +184,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata, |
3029 | *pos++ = 0; /* U-APSD no in use */ |
3030 | } |
3031 | |
3032 | - RCU_INIT_POINTER(ifibss->presp, skb); |
3033 | + rcu_assign_pointer(ifibss->presp, skb); |
3034 | |
3035 | sdata->vif.bss_conf.beacon_int = beacon_int; |
3036 | sdata->vif.bss_conf.basic_rates = basic_rates; |
3037 | diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c |
3038 | index b1b1bb3..9da8626 100644 |
3039 | --- a/net/mac80211/mlme.c |
3040 | +++ b/net/mac80211/mlme.c |
3041 | @@ -2719,7 +2719,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, |
3042 | { |
3043 | struct ieee80211_local *local = sdata->local; |
3044 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
3045 | - struct ieee80211_work *wk; |
3046 | u8 bssid[ETH_ALEN]; |
3047 | bool assoc_bss = false; |
3048 | |
3049 | @@ -2732,30 +2731,47 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, |
3050 | assoc_bss = true; |
3051 | } else { |
3052 | bool not_auth_yet = false; |
3053 | + struct ieee80211_work *tmp, *wk = NULL; |
3054 | |
3055 | mutex_unlock(&ifmgd->mtx); |
3056 | |
3057 | mutex_lock(&local->mtx); |
3058 | - list_for_each_entry(wk, &local->work_list, list) { |
3059 | - if (wk->sdata != sdata) |
3060 | + list_for_each_entry(tmp, &local->work_list, list) { |
3061 | + if (tmp->sdata != sdata) |
3062 | continue; |
3063 | |
3064 | - if (wk->type != IEEE80211_WORK_DIRECT_PROBE && |
3065 | - wk->type != IEEE80211_WORK_AUTH && |
3066 | - wk->type != IEEE80211_WORK_ASSOC && |
3067 | - wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) |
3068 | + if (tmp->type != IEEE80211_WORK_DIRECT_PROBE && |
3069 | + tmp->type != IEEE80211_WORK_AUTH && |
3070 | + tmp->type != IEEE80211_WORK_ASSOC && |
3071 | + tmp->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) |
3072 | continue; |
3073 | |
3074 | - if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) |
3075 | + if (memcmp(req->bss->bssid, tmp->filter_ta, ETH_ALEN)) |
3076 | continue; |
3077 | |
3078 | - not_auth_yet = wk->type == IEEE80211_WORK_DIRECT_PROBE; |
3079 | - list_del_rcu(&wk->list); |
3080 | - free_work(wk); |
3081 | + not_auth_yet = tmp->type == IEEE80211_WORK_DIRECT_PROBE; |
3082 | + list_del_rcu(&tmp->list); |
3083 | + synchronize_rcu(); |
3084 | + wk = tmp; |
3085 | break; |
3086 | } |
3087 | mutex_unlock(&local->mtx); |
3088 | |
3089 | + if (wk && wk->type == IEEE80211_WORK_ASSOC) { |
3090 | + /* clean up dummy sta & TX sync */ |
3091 | + sta_info_destroy_addr(wk->sdata, wk->filter_ta); |
3092 | + if (wk->assoc.synced) |
3093 | + drv_finish_tx_sync(local, wk->sdata, |
3094 | + wk->filter_ta, |
3095 | + IEEE80211_TX_SYNC_ASSOC); |
3096 | + } else if (wk && wk->type == IEEE80211_WORK_AUTH) { |
3097 | + if (wk->probe_auth.synced) |
3098 | + drv_finish_tx_sync(local, wk->sdata, |
3099 | + wk->filter_ta, |
3100 | + IEEE80211_TX_SYNC_AUTH); |
3101 | + } |
3102 | + kfree(wk); |
3103 | + |
3104 | /* |
3105 | * If somebody requests authentication and we haven't |
3106 | * sent out an auth frame yet there's no need to send |
3107 | diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c |
3108 | index 8eaa746..1fdd8ff 100644 |
3109 | --- a/net/mac80211/sta_info.c |
3110 | +++ b/net/mac80211/sta_info.c |
3111 | @@ -73,7 +73,7 @@ static int sta_info_hash_del(struct ieee80211_local *local, |
3112 | if (!s) |
3113 | return -ENOENT; |
3114 | if (s == sta) { |
3115 | - RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)], |
3116 | + rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], |
3117 | s->hnext); |
3118 | return 0; |
3119 | } |
3120 | @@ -83,7 +83,7 @@ static int sta_info_hash_del(struct ieee80211_local *local, |
3121 | s = rcu_dereference_protected(s->hnext, |
3122 | lockdep_is_held(&local->sta_lock)); |
3123 | if (rcu_access_pointer(s->hnext)) { |
3124 | - RCU_INIT_POINTER(s->hnext, sta->hnext); |
3125 | + rcu_assign_pointer(s->hnext, sta->hnext); |
3126 | return 0; |
3127 | } |
3128 | |
3129 | @@ -232,7 +232,7 @@ static void sta_info_hash_add(struct ieee80211_local *local, |
3130 | struct sta_info *sta) |
3131 | { |
3132 | sta->hnext = local->sta_hash[STA_HASH(sta->sta.addr)]; |
3133 | - RCU_INIT_POINTER(local->sta_hash[STA_HASH(sta->sta.addr)], sta); |
3134 | + rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta); |
3135 | } |
3136 | |
3137 | static void sta_unblock(struct work_struct *wk) |
3138 | diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c |
3139 | index 7202b06..1d15193 100644 |
3140 | --- a/net/netfilter/nf_conntrack_core.c |
3141 | +++ b/net/netfilter/nf_conntrack_core.c |
3142 | @@ -776,7 +776,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl, |
3143 | if (exp->helper) { |
3144 | help = nf_ct_helper_ext_add(ct, GFP_ATOMIC); |
3145 | if (help) |
3146 | - RCU_INIT_POINTER(help->helper, exp->helper); |
3147 | + rcu_assign_pointer(help->helper, exp->helper); |
3148 | } |
3149 | |
3150 | #ifdef CONFIG_NF_CONNTRACK_MARK |
3151 | diff --git a/net/netfilter/nf_conntrack_ecache.c b/net/netfilter/nf_conntrack_ecache.c |
3152 | index b62c414..14af632 100644 |
3153 | --- a/net/netfilter/nf_conntrack_ecache.c |
3154 | +++ b/net/netfilter/nf_conntrack_ecache.c |
3155 | @@ -91,7 +91,7 @@ int nf_conntrack_register_notifier(struct net *net, |
3156 | ret = -EBUSY; |
3157 | goto out_unlock; |
3158 | } |
3159 | - RCU_INIT_POINTER(net->ct.nf_conntrack_event_cb, new); |
3160 | + rcu_assign_pointer(net->ct.nf_conntrack_event_cb, new); |
3161 | mutex_unlock(&nf_ct_ecache_mutex); |
3162 | return ret; |
3163 | |
3164 | @@ -128,7 +128,7 @@ int nf_ct_expect_register_notifier(struct net *net, |
3165 | ret = -EBUSY; |
3166 | goto out_unlock; |
3167 | } |
3168 | - RCU_INIT_POINTER(net->ct.nf_expect_event_cb, new); |
3169 | + rcu_assign_pointer(net->ct.nf_expect_event_cb, new); |
3170 | mutex_unlock(&nf_ct_ecache_mutex); |
3171 | return ret; |
3172 | |
3173 | diff --git a/net/netfilter/nf_conntrack_extend.c b/net/netfilter/nf_conntrack_extend.c |
3174 | index 4605c94..641ff5f 100644 |
3175 | --- a/net/netfilter/nf_conntrack_extend.c |
3176 | +++ b/net/netfilter/nf_conntrack_extend.c |
3177 | @@ -169,7 +169,7 @@ int nf_ct_extend_register(struct nf_ct_ext_type *type) |
3178 | before updating alloc_size */ |
3179 | type->alloc_size = ALIGN(sizeof(struct nf_ct_ext), type->align) |
3180 | + type->len; |
3181 | - RCU_INIT_POINTER(nf_ct_ext_types[type->id], type); |
3182 | + rcu_assign_pointer(nf_ct_ext_types[type->id], type); |
3183 | update_alloc_size(type); |
3184 | out: |
3185 | mutex_unlock(&nf_ct_ext_type_mutex); |
3186 | diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c |
3187 | index 93c4bdb..bbe23ba 100644 |
3188 | --- a/net/netfilter/nf_conntrack_helper.c |
3189 | +++ b/net/netfilter/nf_conntrack_helper.c |
3190 | @@ -145,7 +145,7 @@ int __nf_ct_try_assign_helper(struct nf_conn *ct, struct nf_conn *tmpl, |
3191 | memset(&help->help, 0, sizeof(help->help)); |
3192 | } |
3193 | |
3194 | - RCU_INIT_POINTER(help->helper, helper); |
3195 | + rcu_assign_pointer(help->helper, helper); |
3196 | out: |
3197 | return ret; |
3198 | } |
3199 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
3200 | index 257e772..782cdcd 100644 |
3201 | --- a/net/netfilter/nf_conntrack_netlink.c |
3202 | +++ b/net/netfilter/nf_conntrack_netlink.c |
3203 | @@ -1163,7 +1163,7 @@ ctnetlink_change_helper(struct nf_conn *ct, const struct nlattr * const cda[]) |
3204 | return -EOPNOTSUPP; |
3205 | } |
3206 | |
3207 | - RCU_INIT_POINTER(help->helper, helper); |
3208 | + rcu_assign_pointer(help->helper, helper); |
3209 | |
3210 | return 0; |
3211 | } |
3212 | diff --git a/net/netfilter/nf_log.c b/net/netfilter/nf_log.c |
3213 | index ce0c406..957374a 100644 |
3214 | --- a/net/netfilter/nf_log.c |
3215 | +++ b/net/netfilter/nf_log.c |
3216 | @@ -55,7 +55,7 @@ int nf_log_register(u_int8_t pf, struct nf_logger *logger) |
3217 | llog = rcu_dereference_protected(nf_loggers[pf], |
3218 | lockdep_is_held(&nf_log_mutex)); |
3219 | if (llog == NULL) |
3220 | - RCU_INIT_POINTER(nf_loggers[pf], logger); |
3221 | + rcu_assign_pointer(nf_loggers[pf], logger); |
3222 | } |
3223 | |
3224 | mutex_unlock(&nf_log_mutex); |
3225 | @@ -92,7 +92,7 @@ int nf_log_bind_pf(u_int8_t pf, const struct nf_logger *logger) |
3226 | mutex_unlock(&nf_log_mutex); |
3227 | return -ENOENT; |
3228 | } |
3229 | - RCU_INIT_POINTER(nf_loggers[pf], logger); |
3230 | + rcu_assign_pointer(nf_loggers[pf], logger); |
3231 | mutex_unlock(&nf_log_mutex); |
3232 | return 0; |
3233 | } |
3234 | @@ -250,7 +250,7 @@ static int nf_log_proc_dostring(ctl_table *table, int write, |
3235 | mutex_unlock(&nf_log_mutex); |
3236 | return -ENOENT; |
3237 | } |
3238 | - RCU_INIT_POINTER(nf_loggers[tindex], logger); |
3239 | + rcu_assign_pointer(nf_loggers[tindex], logger); |
3240 | mutex_unlock(&nf_log_mutex); |
3241 | } else { |
3242 | mutex_lock(&nf_log_mutex); |
3243 | diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c |
3244 | index 99ffd28..b3a7db6 100644 |
3245 | --- a/net/netfilter/nf_queue.c |
3246 | +++ b/net/netfilter/nf_queue.c |
3247 | @@ -40,7 +40,7 @@ int nf_register_queue_handler(u_int8_t pf, const struct nf_queue_handler *qh) |
3248 | else if (old) |
3249 | ret = -EBUSY; |
3250 | else { |
3251 | - RCU_INIT_POINTER(queue_handler[pf], qh); |
3252 | + rcu_assign_pointer(queue_handler[pf], qh); |
3253 | ret = 0; |
3254 | } |
3255 | mutex_unlock(&queue_handler_mutex); |
3256 | diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c |
3257 | index c879c1a..b4f8d84 100644 |
3258 | --- a/net/netfilter/nfnetlink.c |
3259 | +++ b/net/netfilter/nfnetlink.c |
3260 | @@ -59,7 +59,7 @@ int nfnetlink_subsys_register(const struct nfnetlink_subsystem *n) |
3261 | nfnl_unlock(); |
3262 | return -EBUSY; |
3263 | } |
3264 | - RCU_INIT_POINTER(subsys_table[n->subsys_id], n); |
3265 | + rcu_assign_pointer(subsys_table[n->subsys_id], n); |
3266 | nfnl_unlock(); |
3267 | |
3268 | return 0; |
3269 | @@ -210,7 +210,7 @@ static int __net_init nfnetlink_net_init(struct net *net) |
3270 | if (!nfnl) |
3271 | return -ENOMEM; |
3272 | net->nfnl_stash = nfnl; |
3273 | - RCU_INIT_POINTER(net->nfnl, nfnl); |
3274 | + rcu_assign_pointer(net->nfnl, nfnl); |
3275 | return 0; |
3276 | } |
3277 | |
3278 | diff --git a/net/netlabel/netlabel_domainhash.c b/net/netlabel/netlabel_domainhash.c |
3279 | index 3f905e5..e5330ed 100644 |
3280 | --- a/net/netlabel/netlabel_domainhash.c |
3281 | +++ b/net/netlabel/netlabel_domainhash.c |
3282 | @@ -282,7 +282,7 @@ int __init netlbl_domhsh_init(u32 size) |
3283 | INIT_LIST_HEAD(&hsh_tbl->tbl[iter]); |
3284 | |
3285 | spin_lock(&netlbl_domhsh_lock); |
3286 | - RCU_INIT_POINTER(netlbl_domhsh, hsh_tbl); |
3287 | + rcu_assign_pointer(netlbl_domhsh, hsh_tbl); |
3288 | spin_unlock(&netlbl_domhsh_lock); |
3289 | |
3290 | return 0; |
3291 | @@ -330,7 +330,7 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry, |
3292 | &rcu_dereference(netlbl_domhsh)->tbl[bkt]); |
3293 | } else { |
3294 | INIT_LIST_HEAD(&entry->list); |
3295 | - RCU_INIT_POINTER(netlbl_domhsh_def, entry); |
3296 | + rcu_assign_pointer(netlbl_domhsh_def, entry); |
3297 | } |
3298 | |
3299 | if (entry->type == NETLBL_NLTYPE_ADDRSELECT) { |
3300 | diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c |
3301 | index e251c2c..d463f5a 100644 |
3302 | --- a/net/netlabel/netlabel_unlabeled.c |
3303 | +++ b/net/netlabel/netlabel_unlabeled.c |
3304 | @@ -354,7 +354,7 @@ static struct netlbl_unlhsh_iface *netlbl_unlhsh_add_iface(int ifindex) |
3305 | INIT_LIST_HEAD(&iface->list); |
3306 | if (netlbl_unlhsh_rcu_deref(netlbl_unlhsh_def) != NULL) |
3307 | goto add_iface_failure; |
3308 | - RCU_INIT_POINTER(netlbl_unlhsh_def, iface); |
3309 | + rcu_assign_pointer(netlbl_unlhsh_def, iface); |
3310 | } |
3311 | spin_unlock(&netlbl_unlhsh_lock); |
3312 | |
3313 | @@ -1447,11 +1447,9 @@ int __init netlbl_unlabel_init(u32 size) |
3314 | for (iter = 0; iter < hsh_tbl->size; iter++) |
3315 | INIT_LIST_HEAD(&hsh_tbl->tbl[iter]); |
3316 | |
3317 | - rcu_read_lock(); |
3318 | spin_lock(&netlbl_unlhsh_lock); |
3319 | - RCU_INIT_POINTER(netlbl_unlhsh, hsh_tbl); |
3320 | + rcu_assign_pointer(netlbl_unlhsh, hsh_tbl); |
3321 | spin_unlock(&netlbl_unlhsh_lock); |
3322 | - rcu_read_unlock(); |
3323 | |
3324 | register_netdevice_notifier(&netlbl_unlhsh_netdev_notifier); |
3325 | |
3326 | diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c |
3327 | index bf10ea8..d65f699 100644 |
3328 | --- a/net/phonet/af_phonet.c |
3329 | +++ b/net/phonet/af_phonet.c |
3330 | @@ -480,7 +480,7 @@ int __init_or_module phonet_proto_register(unsigned int protocol, |
3331 | if (proto_tab[protocol]) |
3332 | err = -EBUSY; |
3333 | else |
3334 | - RCU_INIT_POINTER(proto_tab[protocol], pp); |
3335 | + rcu_assign_pointer(proto_tab[protocol], pp); |
3336 | mutex_unlock(&proto_tab_lock); |
3337 | |
3338 | return err; |
3339 | diff --git a/net/phonet/pn_dev.c b/net/phonet/pn_dev.c |
3340 | index c582761..9b9a85e 100644 |
3341 | --- a/net/phonet/pn_dev.c |
3342 | +++ b/net/phonet/pn_dev.c |
3343 | @@ -390,7 +390,7 @@ int phonet_route_add(struct net_device *dev, u8 daddr) |
3344 | daddr = daddr >> 2; |
3345 | mutex_lock(&routes->lock); |
3346 | if (routes->table[daddr] == NULL) { |
3347 | - RCU_INIT_POINTER(routes->table[daddr], dev); |
3348 | + rcu_assign_pointer(routes->table[daddr], dev); |
3349 | dev_hold(dev); |
3350 | err = 0; |
3351 | } |
3352 | diff --git a/net/phonet/socket.c b/net/phonet/socket.c |
3353 | index 3f8d0b1..4c7eff3 100644 |
3354 | --- a/net/phonet/socket.c |
3355 | +++ b/net/phonet/socket.c |
3356 | @@ -680,7 +680,7 @@ int pn_sock_bind_res(struct sock *sk, u8 res) |
3357 | mutex_lock(&resource_mutex); |
3358 | if (pnres.sk[res] == NULL) { |
3359 | sock_hold(sk); |
3360 | - RCU_INIT_POINTER(pnres.sk[res], sk); |
3361 | + rcu_assign_pointer(pnres.sk[res], sk); |
3362 | ret = 0; |
3363 | } |
3364 | mutex_unlock(&resource_mutex); |
3365 | diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c |
3366 | index bb6ad81..424ff62 100644 |
3367 | --- a/net/rds/af_rds.c |
3368 | +++ b/net/rds/af_rds.c |
3369 | @@ -68,7 +68,6 @@ static int rds_release(struct socket *sock) |
3370 | { |
3371 | struct sock *sk = sock->sk; |
3372 | struct rds_sock *rs; |
3373 | - unsigned long flags; |
3374 | |
3375 | if (!sk) |
3376 | goto out; |
3377 | @@ -94,10 +93,10 @@ static int rds_release(struct socket *sock) |
3378 | rds_rdma_drop_keys(rs); |
3379 | rds_notify_queue_get(rs, NULL); |
3380 | |
3381 | - spin_lock_irqsave(&rds_sock_lock, flags); |
3382 | + spin_lock_bh(&rds_sock_lock); |
3383 | list_del_init(&rs->rs_item); |
3384 | rds_sock_count--; |
3385 | - spin_unlock_irqrestore(&rds_sock_lock, flags); |
3386 | + spin_unlock_bh(&rds_sock_lock); |
3387 | |
3388 | rds_trans_put(rs->rs_transport); |
3389 | |
3390 | @@ -409,7 +408,6 @@ static const struct proto_ops rds_proto_ops = { |
3391 | |
3392 | static int __rds_create(struct socket *sock, struct sock *sk, int protocol) |
3393 | { |
3394 | - unsigned long flags; |
3395 | struct rds_sock *rs; |
3396 | |
3397 | sock_init_data(sock, sk); |
3398 | @@ -426,10 +424,10 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol) |
3399 | spin_lock_init(&rs->rs_rdma_lock); |
3400 | rs->rs_rdma_keys = RB_ROOT; |
3401 | |
3402 | - spin_lock_irqsave(&rds_sock_lock, flags); |
3403 | + spin_lock_bh(&rds_sock_lock); |
3404 | list_add_tail(&rs->rs_item, &rds_sock_list); |
3405 | rds_sock_count++; |
3406 | - spin_unlock_irqrestore(&rds_sock_lock, flags); |
3407 | + spin_unlock_bh(&rds_sock_lock); |
3408 | |
3409 | return 0; |
3410 | } |
3411 | @@ -471,12 +469,11 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, |
3412 | { |
3413 | struct rds_sock *rs; |
3414 | struct rds_incoming *inc; |
3415 | - unsigned long flags; |
3416 | unsigned int total = 0; |
3417 | |
3418 | len /= sizeof(struct rds_info_message); |
3419 | |
3420 | - spin_lock_irqsave(&rds_sock_lock, flags); |
3421 | + spin_lock_bh(&rds_sock_lock); |
3422 | |
3423 | list_for_each_entry(rs, &rds_sock_list, rs_item) { |
3424 | read_lock(&rs->rs_recv_lock); |
3425 | @@ -492,7 +489,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, |
3426 | read_unlock(&rs->rs_recv_lock); |
3427 | } |
3428 | |
3429 | - spin_unlock_irqrestore(&rds_sock_lock, flags); |
3430 | + spin_unlock_bh(&rds_sock_lock); |
3431 | |
3432 | lens->nr = total; |
3433 | lens->each = sizeof(struct rds_info_message); |
3434 | @@ -504,11 +501,10 @@ static void rds_sock_info(struct socket *sock, unsigned int len, |
3435 | { |
3436 | struct rds_info_socket sinfo; |
3437 | struct rds_sock *rs; |
3438 | - unsigned long flags; |
3439 | |
3440 | len /= sizeof(struct rds_info_socket); |
3441 | |
3442 | - spin_lock_irqsave(&rds_sock_lock, flags); |
3443 | + spin_lock_bh(&rds_sock_lock); |
3444 | |
3445 | if (len < rds_sock_count) |
3446 | goto out; |
3447 | @@ -529,7 +525,7 @@ out: |
3448 | lens->nr = rds_sock_count; |
3449 | lens->each = sizeof(struct rds_info_socket); |
3450 | |
3451 | - spin_unlock_irqrestore(&rds_sock_lock, flags); |
3452 | + spin_unlock_bh(&rds_sock_lock); |
3453 | } |
3454 | |
3455 | static void rds_exit(void) |
3456 | diff --git a/net/socket.c b/net/socket.c |
3457 | index 2877647..2dce67a 100644 |
3458 | --- a/net/socket.c |
3459 | +++ b/net/socket.c |
3460 | @@ -2472,7 +2472,7 @@ int sock_register(const struct net_proto_family *ops) |
3461 | lockdep_is_held(&net_family_lock))) |
3462 | err = -EEXIST; |
3463 | else { |
3464 | - RCU_INIT_POINTER(net_families[ops->family], ops); |
3465 | + rcu_assign_pointer(net_families[ops->family], ops); |
3466 | err = 0; |
3467 | } |
3468 | spin_unlock(&net_family_lock); |
3469 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c |
3470 | index afb5655..db0efde 100644 |
3471 | --- a/net/sunrpc/auth_gss/auth_gss.c |
3472 | +++ b/net/sunrpc/auth_gss/auth_gss.c |
3473 | @@ -122,7 +122,7 @@ gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx) |
3474 | if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags)) |
3475 | return; |
3476 | gss_get_ctx(ctx); |
3477 | - RCU_INIT_POINTER(gss_cred->gc_ctx, ctx); |
3478 | + rcu_assign_pointer(gss_cred->gc_ctx, ctx); |
3479 | set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); |
3480 | smp_mb__before_clear_bit(); |
3481 | clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags); |
3482 | diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c |
3483 | index b595a3d..d99678a 100644 |
3484 | --- a/net/unix/af_unix.c |
3485 | +++ b/net/unix/af_unix.c |
3486 | @@ -1915,7 +1915,7 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, |
3487 | struct sk_buff *skb; |
3488 | |
3489 | unix_state_lock(sk); |
3490 | - skb = skb_dequeue(&sk->sk_receive_queue); |
3491 | + skb = skb_peek(&sk->sk_receive_queue); |
3492 | if (skb == NULL) { |
3493 | unix_sk(sk)->recursion_level = 0; |
3494 | if (copied >= target) |
3495 | @@ -1955,11 +1955,8 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, |
3496 | if (check_creds) { |
3497 | /* Never glue messages from different writers */ |
3498 | if ((UNIXCB(skb).pid != siocb->scm->pid) || |
3499 | - (UNIXCB(skb).cred != siocb->scm->cred)) { |
3500 | - skb_queue_head(&sk->sk_receive_queue, skb); |
3501 | - sk->sk_data_ready(sk, skb->len); |
3502 | + (UNIXCB(skb).cred != siocb->scm->cred)) |
3503 | break; |
3504 | - } |
3505 | } else { |
3506 | /* Copy credentials */ |
3507 | scm_set_cred(siocb->scm, UNIXCB(skb).pid, UNIXCB(skb).cred); |
3508 | @@ -1974,8 +1971,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, |
3509 | |
3510 | chunk = min_t(unsigned int, skb->len, size); |
3511 | if (memcpy_toiovec(msg->msg_iov, skb->data, chunk)) { |
3512 | - skb_queue_head(&sk->sk_receive_queue, skb); |
3513 | - sk->sk_data_ready(sk, skb->len); |
3514 | if (copied == 0) |
3515 | copied = -EFAULT; |
3516 | break; |
3517 | @@ -1990,13 +1985,10 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, |
3518 | if (UNIXCB(skb).fp) |
3519 | unix_detach_fds(siocb->scm, skb); |
3520 | |
3521 | - /* put the skb back if we didn't use it up.. */ |
3522 | - if (skb->len) { |
3523 | - skb_queue_head(&sk->sk_receive_queue, skb); |
3524 | - sk->sk_data_ready(sk, skb->len); |
3525 | + if (skb->len) |
3526 | break; |
3527 | - } |
3528 | |
3529 | + skb_unlink(skb, &sk->sk_receive_queue); |
3530 | consume_skb(skb); |
3531 | |
3532 | if (siocb->scm->fp) |
3533 | @@ -2007,9 +1999,6 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, |
3534 | if (UNIXCB(skb).fp) |
3535 | siocb->scm->fp = scm_fp_dup(UNIXCB(skb).fp); |
3536 | |
3537 | - /* put message back and return */ |
3538 | - skb_queue_head(&sk->sk_receive_queue, skb); |
3539 | - sk->sk_data_ready(sk, skb->len); |
3540 | break; |
3541 | } |
3542 | } while (size); |
3543 | diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c |
3544 | index d0a42df..7cae73e 100644 |
3545 | --- a/net/xfrm/xfrm_user.c |
3546 | +++ b/net/xfrm/xfrm_user.c |
3547 | @@ -2927,7 +2927,7 @@ static int __net_init xfrm_user_net_init(struct net *net) |
3548 | if (nlsk == NULL) |
3549 | return -ENOMEM; |
3550 | net->xfrm.nlsk_stash = nlsk; /* Don't set to NULL */ |
3551 | - RCU_INIT_POINTER(net->xfrm.nlsk, nlsk); |
3552 | + rcu_assign_pointer(net->xfrm.nlsk, nlsk); |
3553 | return 0; |
3554 | } |
3555 | |
3556 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
3557 | index 5b2b75b..192e6c0 100644 |
3558 | --- a/sound/pci/hda/hda_intel.c |
3559 | +++ b/sound/pci/hda/hda_intel.c |
3560 | @@ -461,6 +461,7 @@ struct azx { |
3561 | unsigned int irq_pending_warned :1; |
3562 | unsigned int probing :1; /* codec probing phase */ |
3563 | unsigned int snoop:1; |
3564 | + unsigned int align_buffer_size:1; |
3565 | |
3566 | /* for debugging */ |
3567 | unsigned int last_cmd[AZX_MAX_CODECS]; |
3568 | @@ -1697,7 +1698,7 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) |
3569 | runtime->hw.rates = hinfo->rates; |
3570 | snd_pcm_limit_hw_rates(runtime); |
3571 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
3572 | - if (align_buffer_size) |
3573 | + if (chip->align_buffer_size) |
3574 | /* constrain buffer sizes to be multiple of 128 |
3575 | bytes. This is more efficient in terms of memory |
3576 | access but isn't required by the HDA spec and |
3577 | @@ -2753,8 +2754,9 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, |
3578 | } |
3579 | |
3580 | /* disable buffer size rounding to 128-byte multiples if supported */ |
3581 | + chip->align_buffer_size = align_buffer_size; |
3582 | if (chip->driver_caps & AZX_DCAPS_BUFSIZE) |
3583 | - align_buffer_size = 0; |
3584 | + chip->align_buffer_size = 0; |
3585 | |
3586 | /* allow 64bit DMA address if supported by H/W */ |
3587 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) |
3588 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
3589 | index 1d07e8f..5f03c40 100644 |
3590 | --- a/sound/pci/hda/patch_realtek.c |
3591 | +++ b/sound/pci/hda/patch_realtek.c |
3592 | @@ -5223,6 +5223,7 @@ static const struct hda_amp_list alc861_loopbacks[] = { |
3593 | /* Pin config fixes */ |
3594 | enum { |
3595 | PINFIX_FSC_AMILO_PI1505, |
3596 | + PINFIX_ASUS_A6RP, |
3597 | }; |
3598 | |
3599 | static const struct alc_fixup alc861_fixups[] = { |
3600 | @@ -5234,9 +5235,19 @@ static const struct alc_fixup alc861_fixups[] = { |
3601 | { } |
3602 | } |
3603 | }, |
3604 | + [PINFIX_ASUS_A6RP] = { |
3605 | + .type = ALC_FIXUP_VERBS, |
3606 | + .v.verbs = (const struct hda_verb[]) { |
3607 | + /* node 0x0f VREF seems controlling the master output */ |
3608 | + { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 }, |
3609 | + { } |
3610 | + }, |
3611 | + }, |
3612 | }; |
3613 | |
3614 | static const struct snd_pci_quirk alc861_fixup_tbl[] = { |
3615 | + SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", PINFIX_ASUS_A6RP), |
3616 | + SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", PINFIX_ASUS_A6RP), |
3617 | SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505), |
3618 | {} |
3619 | }; |
3620 | diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c |
3621 | index f3c73a9..ccdac27 100644 |
3622 | --- a/sound/pci/hda/patch_sigmatel.c |
3623 | +++ b/sound/pci/hda/patch_sigmatel.c |
3624 | @@ -4253,13 +4253,15 @@ static int enable_pin_detect(struct hda_codec *codec, hda_nid_t nid, |
3625 | return 1; |
3626 | } |
3627 | |
3628 | -static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid) |
3629 | +static int is_nid_out_jack_pin(struct auto_pin_cfg *cfg, hda_nid_t nid) |
3630 | { |
3631 | int i; |
3632 | for (i = 0; i < cfg->hp_outs; i++) |
3633 | if (cfg->hp_pins[i] == nid) |
3634 | return 1; /* nid is a HP-Out */ |
3635 | - |
3636 | + for (i = 0; i < cfg->line_outs; i++) |
3637 | + if (cfg->line_out_pins[i] == nid) |
3638 | + return 1; /* nid is a line-Out */ |
3639 | return 0; /* nid is not a HP-Out */ |
3640 | }; |
3641 | |
3642 | @@ -4465,7 +4467,7 @@ static int stac92xx_init(struct hda_codec *codec) |
3643 | continue; |
3644 | } |
3645 | |
3646 | - if (is_nid_hp_pin(cfg, nid)) |
3647 | + if (is_nid_out_jack_pin(cfg, nid)) |
3648 | continue; /* already has an unsol event */ |
3649 | |
3650 | pinctl = snd_hda_codec_read(codec, nid, 0, |
3651 | @@ -4950,7 +4952,14 @@ static int find_mute_led_gpio(struct hda_codec *codec, int default_polarity) |
3652 | /* BIOS bug: unfilled OEM string */ |
3653 | if (strstr(dev->name, "HP_Mute_LED_P_G")) { |
3654 | set_hp_led_gpio(codec); |
3655 | - spec->gpio_led_polarity = 1; |
3656 | + switch (codec->subsystem_id) { |
3657 | + case 0x103c148a: |
3658 | + spec->gpio_led_polarity = 0; |
3659 | + break; |
3660 | + default: |
3661 | + spec->gpio_led_polarity = 1; |
3662 | + break; |
3663 | + } |
3664 | return 1; |
3665 | } |
3666 | } |
3667 | diff --git a/sound/soc/codecs/wm5100.c b/sound/soc/codecs/wm5100.c |
3668 | index 42d9039..d0beeec 100644 |
3669 | --- a/sound/soc/codecs/wm5100.c |
3670 | +++ b/sound/soc/codecs/wm5100.c |
3671 | @@ -1379,6 +1379,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, |
3672 | |
3673 | switch (wm5100->rev) { |
3674 | case 0: |
3675 | + regcache_cache_bypass(wm5100->regmap, true); |
3676 | snd_soc_write(codec, 0x11, 0x3); |
3677 | snd_soc_write(codec, 0x203, 0xc); |
3678 | snd_soc_write(codec, 0x206, 0); |
3679 | @@ -1394,6 +1395,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, |
3680 | snd_soc_write(codec, |
3681 | wm5100_reva_patches[i].reg, |
3682 | wm5100_reva_patches[i].val); |
3683 | + regcache_cache_bypass(wm5100->regmap, false); |
3684 | break; |
3685 | default: |
3686 | break; |
3687 | @@ -1404,6 +1406,7 @@ static int wm5100_set_bias_level(struct snd_soc_codec *codec, |
3688 | break; |
3689 | |
3690 | case SND_SOC_BIAS_OFF: |
3691 | + regcache_cache_only(wm5100->regmap, true); |
3692 | if (wm5100->pdata.ldo_ena) |
3693 | gpio_set_value_cansleep(wm5100->pdata.ldo_ena, 0); |
3694 | regulator_bulk_disable(ARRAY_SIZE(wm5100->core_supplies), |
3695 | diff --git a/sound/soc/codecs/wm8996.c b/sound/soc/codecs/wm8996.c |
3696 | index a33b04d..6d98a57 100644 |
3697 | --- a/sound/soc/codecs/wm8996.c |
3698 | +++ b/sound/soc/codecs/wm8996.c |
3699 | @@ -1049,7 +1049,8 @@ SND_SOC_DAPM_SUPPLY_S("SYSCLK", 1, WM8996_AIF_CLOCKING_1, 0, 0, NULL, 0), |
3700 | SND_SOC_DAPM_SUPPLY_S("SYSDSPCLK", 2, WM8996_CLOCKING_1, 1, 0, NULL, 0), |
3701 | SND_SOC_DAPM_SUPPLY_S("AIFCLK", 2, WM8996_CLOCKING_1, 2, 0, NULL, 0), |
3702 | SND_SOC_DAPM_SUPPLY_S("Charge Pump", 2, WM8996_CHARGE_PUMP_1, 15, 0, cp_event, |
3703 | - SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), |
3704 | + SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | |
3705 | + SND_SOC_DAPM_POST_PMD), |
3706 | SND_SOC_DAPM_SUPPLY("Bandgap", SND_SOC_NOPM, 0, 0, bg_event, |
3707 | SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD), |
3708 | SND_SOC_DAPM_SUPPLY("LDO2", WM8996_POWER_MANAGEMENT_2, 1, 0, NULL, 0), |
3709 | @@ -1932,6 +1933,7 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, |
3710 | struct wm8996_priv *wm8996 = snd_soc_codec_get_drvdata(codec); |
3711 | int lfclk = 0; |
3712 | int ratediv = 0; |
3713 | + int sync = WM8996_REG_SYNC; |
3714 | int src; |
3715 | int old; |
3716 | |
3717 | @@ -1976,6 +1978,7 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, |
3718 | case 32000: |
3719 | case 32768: |
3720 | lfclk = WM8996_LFCLK_ENA; |
3721 | + sync = 0; |
3722 | break; |
3723 | default: |
3724 | dev_warn(codec->dev, "Unsupported clock rate %dHz\n", |
3725 | @@ -1989,6 +1992,8 @@ static int wm8996_set_sysclk(struct snd_soc_dai *dai, |
3726 | WM8996_SYSCLK_SRC_MASK | WM8996_SYSCLK_DIV_MASK, |
3727 | src << WM8996_SYSCLK_SRC_SHIFT | ratediv); |
3728 | snd_soc_update_bits(codec, WM8996_CLOCKING_1, WM8996_LFCLK_ENA, lfclk); |
3729 | + snd_soc_update_bits(codec, WM8996_CONTROL_INTERFACE_1, |
3730 | + WM8996_REG_SYNC, sync); |
3731 | snd_soc_update_bits(codec, WM8996_AIF_CLOCKING_1, |
3732 | WM8996_SYSCLK_ENA, old); |
3733 | |
3734 | diff --git a/sound/soc/codecs/wm8996.h b/sound/soc/codecs/wm8996.h |
3735 | index 0fde643..de9ac3e 100644 |
3736 | --- a/sound/soc/codecs/wm8996.h |
3737 | +++ b/sound/soc/codecs/wm8996.h |
3738 | @@ -1567,6 +1567,10 @@ int wm8996_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
3739 | /* |
3740 | * R257 (0x101) - Control Interface (1) |
3741 | */ |
3742 | +#define WM8996_REG_SYNC 0x8000 /* REG_SYNC */ |
3743 | +#define WM8996_REG_SYNC_MASK 0x8000 /* REG_SYNC */ |
3744 | +#define WM8996_REG_SYNC_SHIFT 15 /* REG_SYNC */ |
3745 | +#define WM8996_REG_SYNC_WIDTH 1 /* REG_SYNC */ |
3746 | #define WM8996_AUTO_INC 0x0004 /* AUTO_INC */ |
3747 | #define WM8996_AUTO_INC_MASK 0x0004 /* AUTO_INC */ |
3748 | #define WM8996_AUTO_INC_SHIFT 2 /* AUTO_INC */ |