Annotation of /trunk/kernel-magellan/patches-3.2/0102-3.2.3-all-fixes.patch
Parent Directory | Revision Log
Revision 1644 -
(hide 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 | niro | 1644 | 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 */ |