Contents of /trunk/kernel26-magellan/patches-2.6.35-r4/0104-2.6.35.5-all-fixes.patch
Parent Directory | Revision Log
Revision 1138 -
(show annotations)
(download)
Tue Sep 21 13:53:34 2010 UTC (14 years ago) by niro
File size: 171638 byte(s)
Tue Sep 21 13:53:34 2010 UTC (14 years ago) by niro
File size: 171638 byte(s)
-2.6.35-magellan-r4: updated to linux-2.6.35.5, removed CVE-2010-3301 hotfix, as it is provided by 2.6.35.5
1 | diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt |
2 | index 1d38b0d..dc25bb8 100644 |
3 | --- a/Documentation/sound/alsa/HD-Audio-Models.txt |
4 | +++ b/Documentation/sound/alsa/HD-Audio-Models.txt |
5 | @@ -288,6 +288,7 @@ Conexant 5051 |
6 | Conexant 5066 |
7 | ============= |
8 | laptop Basic Laptop config (default) |
9 | + hp-laptop HP laptops, e g G60 |
10 | dell-laptop Dell laptops |
11 | olpc-xo-1_5 OLPC XO 1.5 |
12 | ideapad Lenovo IdeaPad U150 |
13 | diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S |
14 | index 2c1db77..a6c66f5 100644 |
15 | --- a/arch/arm/kernel/entry-common.S |
16 | +++ b/arch/arm/kernel/entry-common.S |
17 | @@ -382,11 +382,13 @@ ENDPROC(sys_clone_wrapper) |
18 | |
19 | sys_sigreturn_wrapper: |
20 | add r0, sp, #S_OFF |
21 | + mov why, #0 @ prevent syscall restart handling |
22 | b sys_sigreturn |
23 | ENDPROC(sys_sigreturn_wrapper) |
24 | |
25 | sys_rt_sigreturn_wrapper: |
26 | add r0, sp, #S_OFF |
27 | + mov why, #0 @ prevent syscall restart handling |
28 | b sys_rt_sigreturn |
29 | ENDPROC(sys_rt_sigreturn_wrapper) |
30 | |
31 | diff --git a/arch/ia64/include/asm/compat.h b/arch/ia64/include/asm/compat.h |
32 | index f90edc8..9301a28 100644 |
33 | --- a/arch/ia64/include/asm/compat.h |
34 | +++ b/arch/ia64/include/asm/compat.h |
35 | @@ -199,7 +199,7 @@ ptr_to_compat(void __user *uptr) |
36 | } |
37 | |
38 | static __inline__ void __user * |
39 | -compat_alloc_user_space (long len) |
40 | +arch_compat_alloc_user_space (long len) |
41 | { |
42 | struct pt_regs *regs = task_pt_regs(current); |
43 | return (void __user *) (((regs->r12 & 0xffffffff) & -16) - len); |
44 | diff --git a/arch/ia64/kernel/msi_ia64.c b/arch/ia64/kernel/msi_ia64.c |
45 | index 6c89228..4a746ea 100644 |
46 | --- a/arch/ia64/kernel/msi_ia64.c |
47 | +++ b/arch/ia64/kernel/msi_ia64.c |
48 | @@ -25,7 +25,7 @@ static int ia64_set_msi_irq_affinity(unsigned int irq, |
49 | if (irq_prepare_move(irq, cpu)) |
50 | return -1; |
51 | |
52 | - read_msi_msg(irq, &msg); |
53 | + get_cached_msi_msg(irq, &msg); |
54 | |
55 | addr = msg.address_lo; |
56 | addr &= MSI_ADDR_DEST_ID_MASK; |
57 | diff --git a/arch/ia64/sn/kernel/msi_sn.c b/arch/ia64/sn/kernel/msi_sn.c |
58 | index ebfdd6a..0c72dd4 100644 |
59 | --- a/arch/ia64/sn/kernel/msi_sn.c |
60 | +++ b/arch/ia64/sn/kernel/msi_sn.c |
61 | @@ -175,7 +175,7 @@ static int sn_set_msi_irq_affinity(unsigned int irq, |
62 | * Release XIO resources for the old MSI PCI address |
63 | */ |
64 | |
65 | - read_msi_msg(irq, &msg); |
66 | + get_cached_msi_msg(irq, &msg); |
67 | sn_pdev = (struct pcidev_info *)sn_irq_info->irq_pciioinfo; |
68 | pdev = sn_pdev->pdi_linux_pcidev; |
69 | provider = SN_PCIDEV_BUSPROVIDER(pdev); |
70 | diff --git a/arch/mips/include/asm/compat.h b/arch/mips/include/asm/compat.h |
71 | index 613f691..dbc5106 100644 |
72 | --- a/arch/mips/include/asm/compat.h |
73 | +++ b/arch/mips/include/asm/compat.h |
74 | @@ -145,7 +145,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
75 | return (u32)(unsigned long)uptr; |
76 | } |
77 | |
78 | -static inline void __user *compat_alloc_user_space(long len) |
79 | +static inline void __user *arch_compat_alloc_user_space(long len) |
80 | { |
81 | struct pt_regs *regs = (struct pt_regs *) |
82 | ((unsigned long) current_thread_info() + THREAD_SIZE - 32) - 1; |
83 | diff --git a/arch/parisc/include/asm/compat.h b/arch/parisc/include/asm/compat.h |
84 | index 02b77ba..efa0b60 100644 |
85 | --- a/arch/parisc/include/asm/compat.h |
86 | +++ b/arch/parisc/include/asm/compat.h |
87 | @@ -147,7 +147,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
88 | return (u32)(unsigned long)uptr; |
89 | } |
90 | |
91 | -static __inline__ void __user *compat_alloc_user_space(long len) |
92 | +static __inline__ void __user *arch_compat_alloc_user_space(long len) |
93 | { |
94 | struct pt_regs *regs = ¤t->thread.regs; |
95 | return (void __user *)regs->gr[30]; |
96 | diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h |
97 | index 396d21a..a11d4ea 100644 |
98 | --- a/arch/powerpc/include/asm/compat.h |
99 | +++ b/arch/powerpc/include/asm/compat.h |
100 | @@ -134,7 +134,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
101 | return (u32)(unsigned long)uptr; |
102 | } |
103 | |
104 | -static inline void __user *compat_alloc_user_space(long len) |
105 | +static inline void __user *arch_compat_alloc_user_space(long len) |
106 | { |
107 | struct pt_regs *regs = current->thread.regs; |
108 | unsigned long usp = regs->gpr[1]; |
109 | diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c |
110 | index 0441bbd..b119497 100644 |
111 | --- a/arch/powerpc/kernel/time.c |
112 | +++ b/arch/powerpc/kernel/time.c |
113 | @@ -616,20 +616,11 @@ void timer_interrupt(struct pt_regs * regs) |
114 | * some CPUs will continuue to take decrementer exceptions */ |
115 | set_dec(DECREMENTER_MAX); |
116 | |
117 | -#ifdef CONFIG_PPC32 |
118 | +#if defined(CONFIG_PPC32) && defined(CONFIG_PMAC) |
119 | if (atomic_read(&ppc_n_lost_interrupts) != 0) |
120 | do_IRQ(regs); |
121 | #endif |
122 | |
123 | - now = get_tb_or_rtc(); |
124 | - if (now < decrementer->next_tb) { |
125 | - /* not time for this event yet */ |
126 | - now = decrementer->next_tb - now; |
127 | - if (now <= DECREMENTER_MAX) |
128 | - set_dec((int)now); |
129 | - trace_timer_interrupt_exit(regs); |
130 | - return; |
131 | - } |
132 | old_regs = set_irq_regs(regs); |
133 | irq_enter(); |
134 | |
135 | @@ -645,8 +636,16 @@ void timer_interrupt(struct pt_regs * regs) |
136 | get_lppaca()->int_dword.fields.decr_int = 0; |
137 | #endif |
138 | |
139 | - if (evt->event_handler) |
140 | - evt->event_handler(evt); |
141 | + now = get_tb_or_rtc(); |
142 | + if (now >= decrementer->next_tb) { |
143 | + decrementer->next_tb = ~(u64)0; |
144 | + if (evt->event_handler) |
145 | + evt->event_handler(evt); |
146 | + } else { |
147 | + now = decrementer->next_tb - now; |
148 | + if (now <= DECREMENTER_MAX) |
149 | + set_dec((int)now); |
150 | + } |
151 | |
152 | #ifdef CONFIG_PPC_ISERIES |
153 | if (firmware_has_feature(FW_FEATURE_ISERIES) && hvlpevent_is_pending()) |
154 | diff --git a/arch/s390/include/asm/compat.h b/arch/s390/include/asm/compat.h |
155 | index 104f200..a875c2f 100644 |
156 | --- a/arch/s390/include/asm/compat.h |
157 | +++ b/arch/s390/include/asm/compat.h |
158 | @@ -181,7 +181,7 @@ static inline int is_compat_task(void) |
159 | |
160 | #endif |
161 | |
162 | -static inline void __user *compat_alloc_user_space(long len) |
163 | +static inline void __user *arch_compat_alloc_user_space(long len) |
164 | { |
165 | unsigned long stack; |
166 | |
167 | diff --git a/arch/sparc/include/asm/compat.h b/arch/sparc/include/asm/compat.h |
168 | index 5016f76..6f57325 100644 |
169 | --- a/arch/sparc/include/asm/compat.h |
170 | +++ b/arch/sparc/include/asm/compat.h |
171 | @@ -167,7 +167,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
172 | return (u32)(unsigned long)uptr; |
173 | } |
174 | |
175 | -static inline void __user *compat_alloc_user_space(long len) |
176 | +static inline void __user *arch_compat_alloc_user_space(long len) |
177 | { |
178 | struct pt_regs *regs = current_thread_info()->kregs; |
179 | unsigned long usp = regs->u_regs[UREG_I6]; |
180 | diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S |
181 | index e790bc1..4f5f71e 100644 |
182 | --- a/arch/x86/ia32/ia32entry.S |
183 | +++ b/arch/x86/ia32/ia32entry.S |
184 | @@ -50,7 +50,12 @@ |
185 | /* |
186 | * Reload arg registers from stack in case ptrace changed them. |
187 | * We don't reload %eax because syscall_trace_enter() returned |
188 | - * the value it wants us to use in the table lookup. |
189 | + * the %rax value we should see. Instead, we just truncate that |
190 | + * value to 32 bits again as we did on entry from user mode. |
191 | + * If it's a new value set by user_regset during entry tracing, |
192 | + * this matches the normal truncation of the user-mode value. |
193 | + * If it's -1 to make us punt the syscall, then (u32)-1 is still |
194 | + * an appropriately invalid value. |
195 | */ |
196 | .macro LOAD_ARGS32 offset, _r9=0 |
197 | .if \_r9 |
198 | @@ -60,6 +65,7 @@ |
199 | movl \offset+48(%rsp),%edx |
200 | movl \offset+56(%rsp),%esi |
201 | movl \offset+64(%rsp),%edi |
202 | + movl %eax,%eax /* zero extension */ |
203 | .endm |
204 | |
205 | .macro CFI_STARTPROC32 simple |
206 | @@ -153,7 +159,7 @@ ENTRY(ia32_sysenter_target) |
207 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) |
208 | CFI_REMEMBER_STATE |
209 | jnz sysenter_tracesys |
210 | - cmpl $(IA32_NR_syscalls-1),%eax |
211 | + cmpq $(IA32_NR_syscalls-1),%rax |
212 | ja ia32_badsys |
213 | sysenter_do_call: |
214 | IA32_ARG_FIXUP |
215 | @@ -195,7 +201,7 @@ sysexit_from_sys_call: |
216 | movl $AUDIT_ARCH_I386,%edi /* 1st arg: audit arch */ |
217 | call audit_syscall_entry |
218 | movl RAX-ARGOFFSET(%rsp),%eax /* reload syscall number */ |
219 | - cmpl $(IA32_NR_syscalls-1),%eax |
220 | + cmpq $(IA32_NR_syscalls-1),%rax |
221 | ja ia32_badsys |
222 | movl %ebx,%edi /* reload 1st syscall arg */ |
223 | movl RCX-ARGOFFSET(%rsp),%esi /* reload 2nd syscall arg */ |
224 | @@ -248,7 +254,7 @@ sysenter_tracesys: |
225 | call syscall_trace_enter |
226 | LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ |
227 | RESTORE_REST |
228 | - cmpl $(IA32_NR_syscalls-1),%eax |
229 | + cmpq $(IA32_NR_syscalls-1),%rax |
230 | ja int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */ |
231 | jmp sysenter_do_call |
232 | CFI_ENDPROC |
233 | @@ -314,7 +320,7 @@ ENTRY(ia32_cstar_target) |
234 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) |
235 | CFI_REMEMBER_STATE |
236 | jnz cstar_tracesys |
237 | - cmpl $IA32_NR_syscalls-1,%eax |
238 | + cmpq $IA32_NR_syscalls-1,%rax |
239 | ja ia32_badsys |
240 | cstar_do_call: |
241 | IA32_ARG_FIXUP 1 |
242 | @@ -367,7 +373,7 @@ cstar_tracesys: |
243 | LOAD_ARGS32 ARGOFFSET, 1 /* reload args from stack in case ptrace changed it */ |
244 | RESTORE_REST |
245 | xchgl %ebp,%r9d |
246 | - cmpl $(IA32_NR_syscalls-1),%eax |
247 | + cmpq $(IA32_NR_syscalls-1),%rax |
248 | ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */ |
249 | jmp cstar_do_call |
250 | END(ia32_cstar_target) |
251 | @@ -425,7 +431,7 @@ ENTRY(ia32_syscall) |
252 | orl $TS_COMPAT,TI_status(%r10) |
253 | testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10) |
254 | jnz ia32_tracesys |
255 | - cmpl $(IA32_NR_syscalls-1),%eax |
256 | + cmpq $(IA32_NR_syscalls-1),%rax |
257 | ja ia32_badsys |
258 | ia32_do_call: |
259 | IA32_ARG_FIXUP |
260 | @@ -444,7 +450,7 @@ ia32_tracesys: |
261 | call syscall_trace_enter |
262 | LOAD_ARGS32 ARGOFFSET /* reload args from stack in case ptrace changed it */ |
263 | RESTORE_REST |
264 | - cmpl $(IA32_NR_syscalls-1),%eax |
265 | + cmpq $(IA32_NR_syscalls-1),%rax |
266 | ja int_ret_from_sys_call /* ia32_tracesys has set RAX(%rsp) */ |
267 | jmp ia32_do_call |
268 | END(ia32_syscall) |
269 | diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h |
270 | index 306160e..1d9cd27 100644 |
271 | --- a/arch/x86/include/asm/compat.h |
272 | +++ b/arch/x86/include/asm/compat.h |
273 | @@ -205,7 +205,7 @@ static inline compat_uptr_t ptr_to_compat(void __user *uptr) |
274 | return (u32)(unsigned long)uptr; |
275 | } |
276 | |
277 | -static inline void __user *compat_alloc_user_space(long len) |
278 | +static inline void __user *arch_compat_alloc_user_space(long len) |
279 | { |
280 | struct pt_regs *regs = task_pt_regs(current); |
281 | return (void __user *)regs->sp - len; |
282 | diff --git a/arch/x86/include/asm/hpet.h b/arch/x86/include/asm/hpet.h |
283 | index 004e6e2..1d5c08a 100644 |
284 | --- a/arch/x86/include/asm/hpet.h |
285 | +++ b/arch/x86/include/asm/hpet.h |
286 | @@ -68,7 +68,6 @@ extern unsigned long force_hpet_address; |
287 | extern u8 hpet_blockid; |
288 | extern int hpet_force_user; |
289 | extern u8 hpet_msi_disable; |
290 | -extern u8 hpet_readback_cmp; |
291 | extern int is_hpet_enabled(void); |
292 | extern int hpet_enable(void); |
293 | extern void hpet_disable(void); |
294 | diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h |
295 | index c042729..1ca132f 100644 |
296 | --- a/arch/x86/include/asm/tsc.h |
297 | +++ b/arch/x86/include/asm/tsc.h |
298 | @@ -59,5 +59,7 @@ extern void check_tsc_sync_source(int cpu); |
299 | extern void check_tsc_sync_target(void); |
300 | |
301 | extern int notsc_setup(char *); |
302 | +extern void save_sched_clock_state(void); |
303 | +extern void restore_sched_clock_state(void); |
304 | |
305 | #endif /* _ASM_X86_TSC_H */ |
306 | diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
307 | index 2b18af1..f1efeba 100644 |
308 | --- a/arch/x86/kernel/apic/io_apic.c |
309 | +++ b/arch/x86/kernel/apic/io_apic.c |
310 | @@ -3399,7 +3399,7 @@ static int set_msi_irq_affinity(unsigned int irq, const struct cpumask *mask) |
311 | |
312 | cfg = desc->chip_data; |
313 | |
314 | - read_msi_msg_desc(desc, &msg); |
315 | + get_cached_msi_msg_desc(desc, &msg); |
316 | |
317 | msg.data &= ~MSI_DATA_VECTOR_MASK; |
318 | msg.data |= MSI_DATA_VECTOR(cfg->vector); |
319 | diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c |
320 | index 0ffe19e..a187365 100644 |
321 | --- a/arch/x86/kernel/cpu/perf_event_p4.c |
322 | +++ b/arch/x86/kernel/cpu/perf_event_p4.c |
323 | @@ -457,6 +457,8 @@ static int p4_hw_config(struct perf_event *event) |
324 | event->hw.config |= event->attr.config & |
325 | (p4_config_pack_escr(P4_ESCR_MASK_HT) | |
326 | p4_config_pack_cccr(P4_CCCR_MASK_HT)); |
327 | + |
328 | + event->hw.config &= ~P4_CCCR_FORCE_OVF; |
329 | } |
330 | |
331 | rc = x86_setup_perfctr(event); |
332 | diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c |
333 | index e5cc7e8..ebdb85c 100644 |
334 | --- a/arch/x86/kernel/early-quirks.c |
335 | +++ b/arch/x86/kernel/early-quirks.c |
336 | @@ -18,7 +18,6 @@ |
337 | #include <asm/apic.h> |
338 | #include <asm/iommu.h> |
339 | #include <asm/gart.h> |
340 | -#include <asm/hpet.h> |
341 | |
342 | static void __init fix_hypertransport_config(int num, int slot, int func) |
343 | { |
344 | @@ -192,21 +191,6 @@ static void __init ati_bugs_contd(int num, int slot, int func) |
345 | } |
346 | #endif |
347 | |
348 | -/* |
349 | - * Force the read back of the CMP register in hpet_next_event() |
350 | - * to work around the problem that the CMP register write seems to be |
351 | - * delayed. See hpet_next_event() for details. |
352 | - * |
353 | - * We do this on all SMBUS incarnations for now until we have more |
354 | - * information about the affected chipsets. |
355 | - */ |
356 | -static void __init ati_hpet_bugs(int num, int slot, int func) |
357 | -{ |
358 | -#ifdef CONFIG_HPET_TIMER |
359 | - hpet_readback_cmp = 1; |
360 | -#endif |
361 | -} |
362 | - |
363 | #define QFLAG_APPLY_ONCE 0x1 |
364 | #define QFLAG_APPLIED 0x2 |
365 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) |
366 | @@ -236,8 +220,6 @@ static struct chipset early_qrk[] __initdata = { |
367 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs }, |
368 | { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS, |
369 | PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd }, |
370 | - { PCI_VENDOR_ID_ATI, PCI_ANY_ID, |
371 | - PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_hpet_bugs }, |
372 | {} |
373 | }; |
374 | |
375 | diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
376 | index ba390d7..7cd1886 100644 |
377 | --- a/arch/x86/kernel/hpet.c |
378 | +++ b/arch/x86/kernel/hpet.c |
379 | @@ -36,7 +36,6 @@ |
380 | unsigned long hpet_address; |
381 | u8 hpet_blockid; /* OS timer block num */ |
382 | u8 hpet_msi_disable; |
383 | -u8 hpet_readback_cmp; |
384 | |
385 | #ifdef CONFIG_PCI_MSI |
386 | static unsigned long hpet_num_timers; |
387 | @@ -396,23 +395,27 @@ static int hpet_next_event(unsigned long delta, |
388 | * at that point and we would wait for the next hpet interrupt |
389 | * forever. We found out that reading the CMP register back |
390 | * forces the transfer so we can rely on the comparison with |
391 | - * the counter register below. |
392 | + * the counter register below. If the read back from the |
393 | + * compare register does not match the value we programmed |
394 | + * then we might have a real hardware problem. We can not do |
395 | + * much about it here, but at least alert the user/admin with |
396 | + * a prominent warning. |
397 | * |
398 | - * That works fine on those ATI chipsets, but on newer Intel |
399 | - * chipsets (ICH9...) this triggers due to an erratum: Reading |
400 | - * the comparator immediately following a write is returning |
401 | - * the old value. |
402 | + * An erratum on some chipsets (ICH9,..), results in |
403 | + * comparator read immediately following a write returning old |
404 | + * value. Workaround for this is to read this value second |
405 | + * time, when first read returns old value. |
406 | * |
407 | - * We restrict the read back to the affected ATI chipsets (set |
408 | - * by quirks) and also run it with hpet=verbose for debugging |
409 | - * purposes. |
410 | + * In fact the write to the comparator register is delayed up |
411 | + * to two HPET cycles so the workaround we tried to restrict |
412 | + * the readback to those known to be borked ATI chipsets |
413 | + * failed miserably. So we give up on optimizations forever |
414 | + * and penalize all HPET incarnations unconditionally. |
415 | */ |
416 | - if (hpet_readback_cmp || hpet_verbose) { |
417 | - u32 cmp = hpet_readl(HPET_Tn_CMP(timer)); |
418 | - |
419 | - if (cmp != cnt) |
420 | + if (unlikely((u32)hpet_readl(HPET_Tn_CMP(timer)) != cnt)) { |
421 | + if (hpet_readl(HPET_Tn_CMP(timer)) != cnt) |
422 | printk_once(KERN_WARNING |
423 | - "hpet: compare register read back failed.\n"); |
424 | + "hpet: compare register read back failed.\n"); |
425 | } |
426 | |
427 | return (s32)(hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0; |
428 | diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c |
429 | index 9faf91a..4094ae0 100644 |
430 | --- a/arch/x86/kernel/tsc.c |
431 | +++ b/arch/x86/kernel/tsc.c |
432 | @@ -626,6 +626,44 @@ static void set_cyc2ns_scale(unsigned long cpu_khz, int cpu) |
433 | local_irq_restore(flags); |
434 | } |
435 | |
436 | +static unsigned long long cyc2ns_suspend; |
437 | + |
438 | +void save_sched_clock_state(void) |
439 | +{ |
440 | + if (!sched_clock_stable) |
441 | + return; |
442 | + |
443 | + cyc2ns_suspend = sched_clock(); |
444 | +} |
445 | + |
446 | +/* |
447 | + * Even on processors with invariant TSC, TSC gets reset in some the |
448 | + * ACPI system sleep states. And in some systems BIOS seem to reinit TSC to |
449 | + * arbitrary value (still sync'd across cpu's) during resume from such sleep |
450 | + * states. To cope up with this, recompute the cyc2ns_offset for each cpu so |
451 | + * that sched_clock() continues from the point where it was left off during |
452 | + * suspend. |
453 | + */ |
454 | +void restore_sched_clock_state(void) |
455 | +{ |
456 | + unsigned long long offset; |
457 | + unsigned long flags; |
458 | + int cpu; |
459 | + |
460 | + if (!sched_clock_stable) |
461 | + return; |
462 | + |
463 | + local_irq_save(flags); |
464 | + |
465 | + __get_cpu_var(cyc2ns_offset) = 0; |
466 | + offset = cyc2ns_suspend - sched_clock(); |
467 | + |
468 | + for_each_possible_cpu(cpu) |
469 | + per_cpu(cyc2ns_offset, cpu) = offset; |
470 | + |
471 | + local_irq_restore(flags); |
472 | +} |
473 | + |
474 | #ifdef CONFIG_CPU_FREQ |
475 | |
476 | /* Frequency scaling support. Adjust the TSC based timer when the cpu frequency |
477 | diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c |
478 | index f6b48f6..cfe4faa 100644 |
479 | --- a/arch/x86/oprofile/nmi_int.c |
480 | +++ b/arch/x86/oprofile/nmi_int.c |
481 | @@ -568,8 +568,13 @@ static int __init init_sysfs(void) |
482 | int error; |
483 | |
484 | error = sysdev_class_register(&oprofile_sysclass); |
485 | - if (!error) |
486 | - error = sysdev_register(&device_oprofile); |
487 | + if (error) |
488 | + return error; |
489 | + |
490 | + error = sysdev_register(&device_oprofile); |
491 | + if (error) |
492 | + sysdev_class_unregister(&oprofile_sysclass); |
493 | + |
494 | return error; |
495 | } |
496 | |
497 | @@ -580,8 +585,10 @@ static void exit_sysfs(void) |
498 | } |
499 | |
500 | #else |
501 | -#define init_sysfs() do { } while (0) |
502 | -#define exit_sysfs() do { } while (0) |
503 | + |
504 | +static inline int init_sysfs(void) { return 0; } |
505 | +static inline void exit_sysfs(void) { } |
506 | + |
507 | #endif /* CONFIG_PM */ |
508 | |
509 | static int __init p4_init(char **cpu_type) |
510 | @@ -695,6 +702,8 @@ int __init op_nmi_init(struct oprofile_operations *ops) |
511 | char *cpu_type = NULL; |
512 | int ret = 0; |
513 | |
514 | + using_nmi = 0; |
515 | + |
516 | if (!cpu_has_apic) |
517 | return -ENODEV; |
518 | |
519 | @@ -774,7 +783,10 @@ int __init op_nmi_init(struct oprofile_operations *ops) |
520 | |
521 | mux_init(ops); |
522 | |
523 | - init_sysfs(); |
524 | + ret = init_sysfs(); |
525 | + if (ret) |
526 | + return ret; |
527 | + |
528 | using_nmi = 1; |
529 | printk(KERN_INFO "oprofile: using NMI interrupt.\n"); |
530 | return 0; |
531 | diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c |
532 | index 1290ba5..9c57cb1 100644 |
533 | --- a/arch/x86/power/cpu.c |
534 | +++ b/arch/x86/power/cpu.c |
535 | @@ -113,6 +113,7 @@ static void __save_processor_state(struct saved_context *ctxt) |
536 | void save_processor_state(void) |
537 | { |
538 | __save_processor_state(&saved_context); |
539 | + save_sched_clock_state(); |
540 | } |
541 | #ifdef CONFIG_X86_32 |
542 | EXPORT_SYMBOL(save_processor_state); |
543 | @@ -229,6 +230,7 @@ static void __restore_processor_state(struct saved_context *ctxt) |
544 | void restore_processor_state(void) |
545 | { |
546 | __restore_processor_state(&saved_context); |
547 | + restore_sched_clock_state(); |
548 | } |
549 | #ifdef CONFIG_X86_32 |
550 | EXPORT_SYMBOL(restore_processor_state); |
551 | diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c |
552 | index 81e772a..98c80e1 100644 |
553 | --- a/drivers/ata/libahci.c |
554 | +++ b/drivers/ata/libahci.c |
555 | @@ -1320,7 +1320,7 @@ int ahci_do_softreset(struct ata_link *link, unsigned int *class, |
556 | /* issue the first D2H Register FIS */ |
557 | msecs = 0; |
558 | now = jiffies; |
559 | - if (time_after(now, deadline)) |
560 | + if (time_after(deadline, now)) |
561 | msecs = jiffies_to_msecs(deadline - now); |
562 | |
563 | tf.ctl |= ATA_SRST; |
564 | diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c |
565 | index ddf8e48..1f24267 100644 |
566 | --- a/drivers/ata/libata-core.c |
567 | +++ b/drivers/ata/libata-core.c |
568 | @@ -5434,6 +5434,7 @@ static int ata_host_request_pm(struct ata_host *host, pm_message_t mesg, |
569 | */ |
570 | int ata_host_suspend(struct ata_host *host, pm_message_t mesg) |
571 | { |
572 | + unsigned int ehi_flags = ATA_EHI_QUIET; |
573 | int rc; |
574 | |
575 | /* |
576 | @@ -5442,7 +5443,18 @@ int ata_host_suspend(struct ata_host *host, pm_message_t mesg) |
577 | */ |
578 | ata_lpm_enable(host); |
579 | |
580 | - rc = ata_host_request_pm(host, mesg, 0, ATA_EHI_QUIET, 1); |
581 | + /* |
582 | + * On some hardware, device fails to respond after spun down |
583 | + * for suspend. As the device won't be used before being |
584 | + * resumed, we don't need to touch the device. Ask EH to skip |
585 | + * the usual stuff and proceed directly to suspend. |
586 | + * |
587 | + * http://thread.gmane.org/gmane.linux.ide/46764 |
588 | + */ |
589 | + if (mesg.event == PM_EVENT_SUSPEND) |
590 | + ehi_flags |= ATA_EHI_NO_AUTOPSY | ATA_EHI_NO_RECOVERY; |
591 | + |
592 | + rc = ata_host_request_pm(host, mesg, 0, ehi_flags, 1); |
593 | if (rc == 0) |
594 | host->dev->power.power_state = mesg; |
595 | return rc; |
596 | diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c |
597 | index f77a673..da5a55b 100644 |
598 | --- a/drivers/ata/libata-eh.c |
599 | +++ b/drivers/ata/libata-eh.c |
600 | @@ -3234,6 +3234,10 @@ static int ata_eh_skip_recovery(struct ata_link *link) |
601 | if (link->flags & ATA_LFLAG_DISABLED) |
602 | return 1; |
603 | |
604 | + /* skip if explicitly requested */ |
605 | + if (ehc->i.flags & ATA_EHI_NO_RECOVERY) |
606 | + return 1; |
607 | + |
608 | /* thaw frozen port and recover failed devices */ |
609 | if ((ap->pflags & ATA_PFLAG_FROZEN) || ata_link_nr_enabled(link)) |
610 | return 0; |
611 | diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c |
612 | index efa4a18..cde20ff 100644 |
613 | --- a/drivers/ata/libata-sff.c |
614 | +++ b/drivers/ata/libata-sff.c |
615 | @@ -418,6 +418,7 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) |
616 | if (ioaddr->ctl_addr) |
617 | iowrite8(tf->ctl, ioaddr->ctl_addr); |
618 | ap->last_ctl = tf->ctl; |
619 | + ata_wait_idle(ap); |
620 | } |
621 | |
622 | if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) { |
623 | @@ -453,6 +454,8 @@ void ata_sff_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) |
624 | iowrite8(tf->device, ioaddr->device_addr); |
625 | VPRINTK("device 0x%X\n", tf->device); |
626 | } |
627 | + |
628 | + ata_wait_idle(ap); |
629 | } |
630 | EXPORT_SYMBOL_GPL(ata_sff_tf_load); |
631 | |
632 | @@ -2735,10 +2738,6 @@ unsigned int ata_bmdma_qc_issue(struct ata_queued_cmd *qc) |
633 | { |
634 | struct ata_port *ap = qc->ap; |
635 | |
636 | - /* see ata_dma_blacklisted() */ |
637 | - BUG_ON((ap->flags & ATA_FLAG_PIO_POLLING) && |
638 | - qc->tf.protocol == ATAPI_PROT_DMA); |
639 | - |
640 | /* defer PIO handling to sff_qc_issue */ |
641 | if (!ata_is_dma(qc->tf.protocol)) |
642 | return ata_sff_qc_issue(qc); |
643 | diff --git a/drivers/ata/pata_cmd64x.c b/drivers/ata/pata_cmd64x.c |
644 | index 9f5da1c..905ff76 100644 |
645 | --- a/drivers/ata/pata_cmd64x.c |
646 | +++ b/drivers/ata/pata_cmd64x.c |
647 | @@ -121,14 +121,8 @@ static void cmd64x_set_timing(struct ata_port *ap, struct ata_device *adev, u8 m |
648 | |
649 | if (pair) { |
650 | struct ata_timing tp; |
651 | - |
652 | ata_timing_compute(pair, pair->pio_mode, &tp, T, 0); |
653 | ata_timing_merge(&t, &tp, &t, ATA_TIMING_SETUP); |
654 | - if (pair->dma_mode) { |
655 | - ata_timing_compute(pair, pair->dma_mode, |
656 | - &tp, T, 0); |
657 | - ata_timing_merge(&tp, &t, &t, ATA_TIMING_SETUP); |
658 | - } |
659 | } |
660 | } |
661 | |
662 | diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c |
663 | index 5e65988..ac8d7d9 100644 |
664 | --- a/drivers/ata/pata_via.c |
665 | +++ b/drivers/ata/pata_via.c |
666 | @@ -417,6 +417,8 @@ static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf) |
667 | tf->lbam, |
668 | tf->lbah); |
669 | } |
670 | + |
671 | + ata_wait_idle(ap); |
672 | } |
673 | |
674 | static int via_port_start(struct ata_port *ap) |
675 | diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c |
676 | index a476cd9..d57f6eb 100644 |
677 | --- a/drivers/ata/sata_mv.c |
678 | +++ b/drivers/ata/sata_mv.c |
679 | @@ -1898,19 +1898,25 @@ static void mv_bmdma_start(struct ata_queued_cmd *qc) |
680 | * LOCKING: |
681 | * Inherited from caller. |
682 | */ |
683 | -static void mv_bmdma_stop(struct ata_queued_cmd *qc) |
684 | +static void mv_bmdma_stop_ap(struct ata_port *ap) |
685 | { |
686 | - struct ata_port *ap = qc->ap; |
687 | void __iomem *port_mmio = mv_ap_base(ap); |
688 | u32 cmd; |
689 | |
690 | /* clear start/stop bit */ |
691 | cmd = readl(port_mmio + BMDMA_CMD); |
692 | - cmd &= ~ATA_DMA_START; |
693 | - writelfl(cmd, port_mmio + BMDMA_CMD); |
694 | + if (cmd & ATA_DMA_START) { |
695 | + cmd &= ~ATA_DMA_START; |
696 | + writelfl(cmd, port_mmio + BMDMA_CMD); |
697 | + |
698 | + /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ |
699 | + ata_sff_dma_pause(ap); |
700 | + } |
701 | +} |
702 | |
703 | - /* one-PIO-cycle guaranteed wait, per spec, for HDMA1:0 transition */ |
704 | - ata_sff_dma_pause(ap); |
705 | +static void mv_bmdma_stop(struct ata_queued_cmd *qc) |
706 | +{ |
707 | + mv_bmdma_stop_ap(qc->ap); |
708 | } |
709 | |
710 | /** |
711 | @@ -1934,8 +1940,21 @@ static u8 mv_bmdma_status(struct ata_port *ap) |
712 | reg = readl(port_mmio + BMDMA_STATUS); |
713 | if (reg & ATA_DMA_ACTIVE) |
714 | status = ATA_DMA_ACTIVE; |
715 | - else |
716 | + else if (reg & ATA_DMA_ERR) |
717 | status = (reg & ATA_DMA_ERR) | ATA_DMA_INTR; |
718 | + else { |
719 | + /* |
720 | + * Just because DMA_ACTIVE is 0 (DMA completed), |
721 | + * this does _not_ mean the device is "done". |
722 | + * So we should not yet be signalling ATA_DMA_INTR |
723 | + * in some cases. Eg. DSM/TRIM, and perhaps others. |
724 | + */ |
725 | + mv_bmdma_stop_ap(ap); |
726 | + if (ioread8(ap->ioaddr.altstatus_addr) & ATA_BUSY) |
727 | + status = 0; |
728 | + else |
729 | + status = ATA_DMA_INTR; |
730 | + } |
731 | return status; |
732 | } |
733 | |
734 | @@ -1995,6 +2014,9 @@ static void mv_qc_prep(struct ata_queued_cmd *qc) |
735 | |
736 | switch (tf->protocol) { |
737 | case ATA_PROT_DMA: |
738 | + if (tf->command == ATA_CMD_DSM) |
739 | + return; |
740 | + /* fall-thru */ |
741 | case ATA_PROT_NCQ: |
742 | break; /* continue below */ |
743 | case ATA_PROT_PIO: |
744 | @@ -2094,6 +2116,8 @@ static void mv_qc_prep_iie(struct ata_queued_cmd *qc) |
745 | if ((tf->protocol != ATA_PROT_DMA) && |
746 | (tf->protocol != ATA_PROT_NCQ)) |
747 | return; |
748 | + if (tf->command == ATA_CMD_DSM) |
749 | + return; /* use bmdma for this */ |
750 | |
751 | /* Fill in Gen IIE command request block */ |
752 | if (!(tf->flags & ATA_TFLAG_WRITE)) |
753 | @@ -2289,6 +2313,12 @@ static unsigned int mv_qc_issue(struct ata_queued_cmd *qc) |
754 | |
755 | switch (qc->tf.protocol) { |
756 | case ATA_PROT_DMA: |
757 | + if (qc->tf.command == ATA_CMD_DSM) { |
758 | + if (!ap->ops->bmdma_setup) /* no bmdma on GEN_I */ |
759 | + return AC_ERR_OTHER; |
760 | + break; /* use bmdma for this */ |
761 | + } |
762 | + /* fall thru */ |
763 | case ATA_PROT_NCQ: |
764 | mv_start_edma(ap, port_mmio, pp, qc->tf.protocol); |
765 | pp->req_idx = (pp->req_idx + 1) & MV_MAX_Q_DEPTH_MASK; |
766 | diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c |
767 | index d84af6c..ea6997e 100644 |
768 | --- a/drivers/char/agp/intel-gtt.c |
769 | +++ b/drivers/char/agp/intel-gtt.c |
770 | @@ -1061,11 +1061,11 @@ static void intel_i9xx_setup_flush(void) |
771 | intel_i915_setup_chipset_flush(); |
772 | } |
773 | |
774 | - if (intel_private.ifp_resource.start) { |
775 | + if (intel_private.ifp_resource.start) |
776 | intel_private.i9xx_flush_page = ioremap_nocache(intel_private.ifp_resource.start, PAGE_SIZE); |
777 | - if (!intel_private.i9xx_flush_page) |
778 | - dev_info(&intel_private.pcidev->dev, "can't ioremap flush page - no chipset flushing"); |
779 | - } |
780 | + if (!intel_private.i9xx_flush_page) |
781 | + dev_err(&intel_private.pcidev->dev, |
782 | + "can't ioremap flush page - no chipset flushing\n"); |
783 | } |
784 | |
785 | static int intel_i9xx_configure(void) |
786 | diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c |
787 | index 9b2a541..25d70d6 100644 |
788 | --- a/drivers/gpu/drm/drm_crtc_helper.c |
789 | +++ b/drivers/gpu/drm/drm_crtc_helper.c |
790 | @@ -610,13 +610,13 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set) |
791 | mode_changed = true; |
792 | |
793 | if (mode_changed) { |
794 | - old_fb = set->crtc->fb; |
795 | - set->crtc->fb = set->fb; |
796 | set->crtc->enabled = (set->mode != NULL); |
797 | if (set->mode != NULL) { |
798 | DRM_DEBUG_KMS("attempting to set mode from" |
799 | " userspace\n"); |
800 | drm_mode_debug_printmodeline(set->mode); |
801 | + old_fb = set->crtc->fb; |
802 | + set->crtc->fb = set->fb; |
803 | if (!drm_crtc_helper_set_mode(set->crtc, set->mode, |
804 | set->x, set->y, |
805 | old_fb)) { |
806 | diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c |
807 | index 013a0ae..ce8ff0e 100644 |
808 | --- a/drivers/gpu/drm/i915/i915_dma.c |
809 | +++ b/drivers/gpu/drm/i915/i915_dma.c |
810 | @@ -612,8 +612,10 @@ static int i915_batchbuffer(struct drm_device *dev, void *data, |
811 | ret = copy_from_user(cliprects, batch->cliprects, |
812 | batch->num_cliprects * |
813 | sizeof(struct drm_clip_rect)); |
814 | - if (ret != 0) |
815 | + if (ret != 0) { |
816 | + ret = -EFAULT; |
817 | goto fail_free; |
818 | + } |
819 | } |
820 | |
821 | mutex_lock(&dev->struct_mutex); |
822 | @@ -654,8 +656,10 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, |
823 | return -ENOMEM; |
824 | |
825 | ret = copy_from_user(batch_data, cmdbuf->buf, cmdbuf->sz); |
826 | - if (ret != 0) |
827 | + if (ret != 0) { |
828 | + ret = -EFAULT; |
829 | goto fail_batch_free; |
830 | + } |
831 | |
832 | if (cmdbuf->num_cliprects) { |
833 | cliprects = kcalloc(cmdbuf->num_cliprects, |
834 | @@ -668,8 +672,10 @@ static int i915_cmdbuffer(struct drm_device *dev, void *data, |
835 | ret = copy_from_user(cliprects, cmdbuf->cliprects, |
836 | cmdbuf->num_cliprects * |
837 | sizeof(struct drm_clip_rect)); |
838 | - if (ret != 0) |
839 | + if (ret != 0) { |
840 | + ret = -EFAULT; |
841 | goto fail_clip_free; |
842 | + } |
843 | } |
844 | |
845 | mutex_lock(&dev->struct_mutex); |
846 | @@ -877,7 +883,7 @@ intel_alloc_mchbar_resource(struct drm_device *dev) |
847 | int reg = IS_I965G(dev) ? MCHBAR_I965 : MCHBAR_I915; |
848 | u32 temp_lo, temp_hi = 0; |
849 | u64 mchbar_addr; |
850 | - int ret = 0; |
851 | + int ret; |
852 | |
853 | if (IS_I965G(dev)) |
854 | pci_read_config_dword(dev_priv->bridge_dev, reg + 4, &temp_hi); |
855 | @@ -887,22 +893,23 @@ intel_alloc_mchbar_resource(struct drm_device *dev) |
856 | /* If ACPI doesn't have it, assume we need to allocate it ourselves */ |
857 | #ifdef CONFIG_PNP |
858 | if (mchbar_addr && |
859 | - pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE)) { |
860 | - ret = 0; |
861 | - goto out; |
862 | - } |
863 | + pnp_range_reserved(mchbar_addr, mchbar_addr + MCHBAR_SIZE)) |
864 | + return 0; |
865 | #endif |
866 | |
867 | /* Get some space for it */ |
868 | - ret = pci_bus_alloc_resource(dev_priv->bridge_dev->bus, &dev_priv->mch_res, |
869 | + dev_priv->mch_res.name = "i915 MCHBAR"; |
870 | + dev_priv->mch_res.flags = IORESOURCE_MEM; |
871 | + ret = pci_bus_alloc_resource(dev_priv->bridge_dev->bus, |
872 | + &dev_priv->mch_res, |
873 | MCHBAR_SIZE, MCHBAR_SIZE, |
874 | PCIBIOS_MIN_MEM, |
875 | - 0, pcibios_align_resource, |
876 | + 0, pcibios_align_resource, |
877 | dev_priv->bridge_dev); |
878 | if (ret) { |
879 | DRM_DEBUG_DRIVER("failed bus alloc: %d\n", ret); |
880 | dev_priv->mch_res.start = 0; |
881 | - goto out; |
882 | + return ret; |
883 | } |
884 | |
885 | if (IS_I965G(dev)) |
886 | @@ -911,8 +918,7 @@ intel_alloc_mchbar_resource(struct drm_device *dev) |
887 | |
888 | pci_write_config_dword(dev_priv->bridge_dev, reg, |
889 | lower_32_bits(dev_priv->mch_res.start)); |
890 | -out: |
891 | - return ret; |
892 | + return 0; |
893 | } |
894 | |
895 | /* Setup MCHBAR if possible, return true if we should disable it again */ |
896 | @@ -2073,6 +2079,10 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
897 | goto free_priv; |
898 | } |
899 | |
900 | + /* overlay on gen2 is broken and can't address above 1G */ |
901 | + if (IS_GEN2(dev)) |
902 | + dma_set_coherent_mask(&dev->pdev->dev, DMA_BIT_MASK(30)); |
903 | + |
904 | dev_priv->regs = ioremap(base, size); |
905 | if (!dev_priv->regs) { |
906 | DRM_ERROR("failed to map registers\n"); |
907 | diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
908 | index 5aa747f..06f8238 100644 |
909 | --- a/drivers/gpu/drm/i915/i915_gem.c |
910 | +++ b/drivers/gpu/drm/i915/i915_gem.c |
911 | @@ -3709,6 +3709,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, |
912 | if (ret != 0) { |
913 | DRM_ERROR("copy %d cliprects failed: %d\n", |
914 | args->num_cliprects, ret); |
915 | + ret = -EFAULT; |
916 | goto pre_mutex_err; |
917 | } |
918 | } |
919 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h |
920 | index cf41c67..bed6a5e 100644 |
921 | --- a/drivers/gpu/drm/i915/i915_reg.h |
922 | +++ b/drivers/gpu/drm/i915/i915_reg.h |
923 | @@ -312,6 +312,7 @@ |
924 | |
925 | #define MI_MODE 0x0209c |
926 | # define VS_TIMER_DISPATCH (1 << 6) |
927 | +# define MI_FLUSH_ENABLE (1 << 11) |
928 | |
929 | #define SCPD0 0x0209c /* 915+ only */ |
930 | #define IER 0x020a0 |
931 | @@ -2199,9 +2200,17 @@ |
932 | #define WM1_LP_SR_EN (1<<31) |
933 | #define WM1_LP_LATENCY_SHIFT 24 |
934 | #define WM1_LP_LATENCY_MASK (0x7f<<24) |
935 | +#define WM1_LP_FBC_LP1_MASK (0xf<<20) |
936 | +#define WM1_LP_FBC_LP1_SHIFT 20 |
937 | #define WM1_LP_SR_MASK (0x1ff<<8) |
938 | #define WM1_LP_SR_SHIFT 8 |
939 | #define WM1_LP_CURSOR_MASK (0x3f) |
940 | +#define WM2_LP_ILK 0x4510c |
941 | +#define WM2_LP_EN (1<<31) |
942 | +#define WM3_LP_ILK 0x45110 |
943 | +#define WM3_LP_EN (1<<31) |
944 | +#define WM1S_LP_ILK 0x45120 |
945 | +#define WM1S_LP_EN (1<<31) |
946 | |
947 | /* Memory latency timer register */ |
948 | #define MLTR_ILK 0x11222 |
949 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
950 | index e9a4b12..ac38e46 100644 |
951 | --- a/drivers/gpu/drm/i915/intel_display.c |
952 | +++ b/drivers/gpu/drm/i915/intel_display.c |
953 | @@ -2314,6 +2314,9 @@ static void intel_crtc_dpms(struct drm_crtc *crtc, int mode) |
954 | int pipe = intel_crtc->pipe; |
955 | bool enabled; |
956 | |
957 | + if (intel_crtc->dpms_mode == mode) |
958 | + return; |
959 | + |
960 | dev_priv->display.dpms(crtc, mode); |
961 | |
962 | intel_crtc->dpms_mode = mode; |
963 | @@ -3203,8 +3206,7 @@ static void ironlake_update_wm(struct drm_device *dev, int planea_clock, |
964 | reg_value = I915_READ(WM1_LP_ILK); |
965 | reg_value &= ~(WM1_LP_LATENCY_MASK | WM1_LP_SR_MASK | |
966 | WM1_LP_CURSOR_MASK); |
967 | - reg_value |= WM1_LP_SR_EN | |
968 | - (ilk_sr_latency << WM1_LP_LATENCY_SHIFT) | |
969 | + reg_value |= (ilk_sr_latency << WM1_LP_LATENCY_SHIFT) | |
970 | (sr_wm << WM1_LP_SR_SHIFT) | cursor_wm; |
971 | |
972 | I915_WRITE(WM1_LP_ILK, reg_value); |
973 | @@ -4915,7 +4917,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe) |
974 | dev_priv->pipe_to_crtc_mapping[intel_crtc->pipe] = &intel_crtc->base; |
975 | |
976 | intel_crtc->cursor_addr = 0; |
977 | - intel_crtc->dpms_mode = DRM_MODE_DPMS_OFF; |
978 | + intel_crtc->dpms_mode = -1; |
979 | drm_crtc_helper_add(&intel_crtc->base, &intel_helper_funcs); |
980 | |
981 | intel_crtc->busy = false; |
982 | @@ -5422,6 +5424,9 @@ void intel_init_clock_gating(struct drm_device *dev) |
983 | I915_WRITE(DISP_ARB_CTL, |
984 | (I915_READ(DISP_ARB_CTL) | |
985 | DISP_FBC_WM_DIS)); |
986 | + I915_WRITE(WM3_LP_ILK, 0); |
987 | + I915_WRITE(WM2_LP_ILK, 0); |
988 | + I915_WRITE(WM1_LP_ILK, 0); |
989 | } |
990 | return; |
991 | } else if (IS_G4X(dev)) { |
992 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
993 | index 5dde80f..d9de8f1 100644 |
994 | --- a/drivers/gpu/drm/i915/intel_dp.c |
995 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
996 | @@ -229,7 +229,6 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder, |
997 | uint32_t ch_data = ch_ctl + 4; |
998 | int i; |
999 | int recv_bytes; |
1000 | - uint32_t ctl; |
1001 | uint32_t status; |
1002 | uint32_t aux_clock_divider; |
1003 | int try, precharge; |
1004 | @@ -253,41 +252,43 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder, |
1005 | else |
1006 | precharge = 5; |
1007 | |
1008 | + if (I915_READ(ch_ctl) & DP_AUX_CH_CTL_SEND_BUSY) { |
1009 | + DRM_ERROR("dp_aux_ch not started status 0x%08x\n", |
1010 | + I915_READ(ch_ctl)); |
1011 | + return -EBUSY; |
1012 | + } |
1013 | + |
1014 | /* Must try at least 3 times according to DP spec */ |
1015 | for (try = 0; try < 5; try++) { |
1016 | /* Load the send data into the aux channel data registers */ |
1017 | - for (i = 0; i < send_bytes; i += 4) { |
1018 | - uint32_t d = pack_aux(send + i, send_bytes - i); |
1019 | - |
1020 | - I915_WRITE(ch_data + i, d); |
1021 | - } |
1022 | - |
1023 | - ctl = (DP_AUX_CH_CTL_SEND_BUSY | |
1024 | - DP_AUX_CH_CTL_TIME_OUT_400us | |
1025 | - (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | |
1026 | - (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | |
1027 | - (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | |
1028 | - DP_AUX_CH_CTL_DONE | |
1029 | - DP_AUX_CH_CTL_TIME_OUT_ERROR | |
1030 | - DP_AUX_CH_CTL_RECEIVE_ERROR); |
1031 | + for (i = 0; i < send_bytes; i += 4) |
1032 | + I915_WRITE(ch_data + i, |
1033 | + pack_aux(send + i, send_bytes - i)); |
1034 | |
1035 | /* Send the command and wait for it to complete */ |
1036 | - I915_WRITE(ch_ctl, ctl); |
1037 | - (void) I915_READ(ch_ctl); |
1038 | + I915_WRITE(ch_ctl, |
1039 | + DP_AUX_CH_CTL_SEND_BUSY | |
1040 | + DP_AUX_CH_CTL_TIME_OUT_400us | |
1041 | + (send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) | |
1042 | + (precharge << DP_AUX_CH_CTL_PRECHARGE_2US_SHIFT) | |
1043 | + (aux_clock_divider << DP_AUX_CH_CTL_BIT_CLOCK_2X_SHIFT) | |
1044 | + DP_AUX_CH_CTL_DONE | |
1045 | + DP_AUX_CH_CTL_TIME_OUT_ERROR | |
1046 | + DP_AUX_CH_CTL_RECEIVE_ERROR); |
1047 | for (;;) { |
1048 | - udelay(100); |
1049 | status = I915_READ(ch_ctl); |
1050 | if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0) |
1051 | break; |
1052 | + udelay(100); |
1053 | } |
1054 | |
1055 | /* Clear done status and any errors */ |
1056 | - I915_WRITE(ch_ctl, (status | |
1057 | - DP_AUX_CH_CTL_DONE | |
1058 | - DP_AUX_CH_CTL_TIME_OUT_ERROR | |
1059 | - DP_AUX_CH_CTL_RECEIVE_ERROR)); |
1060 | - (void) I915_READ(ch_ctl); |
1061 | - if ((status & DP_AUX_CH_CTL_TIME_OUT_ERROR) == 0) |
1062 | + I915_WRITE(ch_ctl, |
1063 | + status | |
1064 | + DP_AUX_CH_CTL_DONE | |
1065 | + DP_AUX_CH_CTL_TIME_OUT_ERROR | |
1066 | + DP_AUX_CH_CTL_RECEIVE_ERROR); |
1067 | + if (status & DP_AUX_CH_CTL_DONE) |
1068 | break; |
1069 | } |
1070 | |
1071 | @@ -314,15 +315,12 @@ intel_dp_aux_ch(struct intel_encoder *intel_encoder, |
1072 | /* Unload any bytes sent back from the other side */ |
1073 | recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >> |
1074 | DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT); |
1075 | - |
1076 | if (recv_bytes > recv_size) |
1077 | recv_bytes = recv_size; |
1078 | |
1079 | - for (i = 0; i < recv_bytes; i += 4) { |
1080 | - uint32_t d = I915_READ(ch_data + i); |
1081 | - |
1082 | - unpack_aux(d, recv + i, recv_bytes - i); |
1083 | - } |
1084 | + for (i = 0; i < recv_bytes; i += 4) |
1085 | + unpack_aux(I915_READ(ch_data + i), |
1086 | + recv + i, recv_bytes - i); |
1087 | |
1088 | return recv_bytes; |
1089 | } |
1090 | diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c |
1091 | index 0eab8df..7d42ff1 100644 |
1092 | --- a/drivers/gpu/drm/i915/intel_lvds.c |
1093 | +++ b/drivers/gpu/drm/i915/intel_lvds.c |
1094 | @@ -988,8 +988,6 @@ void intel_lvds_init(struct drm_device *dev) |
1095 | |
1096 | intel_encoder->clone_mask = (1 << INTEL_LVDS_CLONE_BIT); |
1097 | intel_encoder->crtc_mask = (1 << 1); |
1098 | - if (IS_I965G(dev)) |
1099 | - intel_encoder->crtc_mask |= (1 << 0); |
1100 | drm_encoder_helper_add(encoder, &intel_lvds_helper_funcs); |
1101 | drm_connector_helper_add(connector, &intel_lvds_connector_helper_funcs); |
1102 | connector->display_info.subpixel_order = SubPixelHorizontalRGB; |
1103 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c |
1104 | index 26362f8..4d9c5ce 100644 |
1105 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c |
1106 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c |
1107 | @@ -203,9 +203,13 @@ static int init_render_ring(struct drm_device *dev, |
1108 | { |
1109 | drm_i915_private_t *dev_priv = dev->dev_private; |
1110 | int ret = init_ring_common(dev, ring); |
1111 | + int mode; |
1112 | + |
1113 | if (IS_I9XX(dev) && !IS_GEN3(dev)) { |
1114 | - I915_WRITE(MI_MODE, |
1115 | - (VS_TIMER_DISPATCH) << 16 | VS_TIMER_DISPATCH); |
1116 | + mode = VS_TIMER_DISPATCH << 16 | VS_TIMER_DISPATCH; |
1117 | + if (IS_GEN6(dev)) |
1118 | + mode |= MI_FLUSH_ENABLE << 16 | MI_FLUSH_ENABLE; |
1119 | + I915_WRITE(MI_MODE, mode); |
1120 | } |
1121 | return ret; |
1122 | } |
1123 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
1124 | index 8c2d647..1d67f4d 100644 |
1125 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
1126 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
1127 | @@ -527,6 +527,21 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, |
1128 | pll->algo = PLL_ALGO_LEGACY; |
1129 | pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; |
1130 | } |
1131 | + /* There is some evidence (often anecdotal) that RV515/RV620 LVDS |
1132 | + * (on some boards at least) prefers the legacy algo. I'm not |
1133 | + * sure whether this should handled generically or on a |
1134 | + * case-by-case quirk basis. Both algos should work fine in the |
1135 | + * majority of cases. |
1136 | + */ |
1137 | + if ((radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) && |
1138 | + ((rdev->family == CHIP_RV515) || |
1139 | + (rdev->family == CHIP_RV620))) { |
1140 | + /* allow the user to overrride just in case */ |
1141 | + if (radeon_new_pll == 1) |
1142 | + pll->algo = PLL_ALGO_NEW; |
1143 | + else |
1144 | + pll->algo = PLL_ALGO_LEGACY; |
1145 | + } |
1146 | } else { |
1147 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC) |
1148 | pll->flags |= RADEON_PLL_NO_ODD_POST_DIV; |
1149 | @@ -992,11 +1007,11 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
1150 | |
1151 | if (rdev->family >= CHIP_RV770) { |
1152 | if (radeon_crtc->crtc_id) { |
1153 | - WREG32(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, 0); |
1154 | - WREG32(R700_D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, 0); |
1155 | + WREG32(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location)); |
1156 | + WREG32(R700_D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location)); |
1157 | } else { |
1158 | - WREG32(R700_D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, 0); |
1159 | - WREG32(R700_D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, 0); |
1160 | + WREG32(R700_D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location)); |
1161 | + WREG32(R700_D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bits(fb_location)); |
1162 | } |
1163 | } |
1164 | WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, |
1165 | diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c |
1166 | index 1caf625..d448c25 100644 |
1167 | --- a/drivers/gpu/drm/radeon/evergreen.c |
1168 | +++ b/drivers/gpu/drm/radeon/evergreen.c |
1169 | @@ -658,6 +658,43 @@ static int evergreen_cp_load_microcode(struct radeon_device *rdev) |
1170 | return 0; |
1171 | } |
1172 | |
1173 | +static int evergreen_cp_start(struct radeon_device *rdev) |
1174 | +{ |
1175 | + int r; |
1176 | + uint32_t cp_me; |
1177 | + |
1178 | + r = radeon_ring_lock(rdev, 7); |
1179 | + if (r) { |
1180 | + DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); |
1181 | + return r; |
1182 | + } |
1183 | + radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5)); |
1184 | + radeon_ring_write(rdev, 0x1); |
1185 | + radeon_ring_write(rdev, 0x0); |
1186 | + radeon_ring_write(rdev, rdev->config.evergreen.max_hw_contexts - 1); |
1187 | + radeon_ring_write(rdev, PACKET3_ME_INITIALIZE_DEVICE_ID(1)); |
1188 | + radeon_ring_write(rdev, 0); |
1189 | + radeon_ring_write(rdev, 0); |
1190 | + radeon_ring_unlock_commit(rdev); |
1191 | + |
1192 | + cp_me = 0xff; |
1193 | + WREG32(CP_ME_CNTL, cp_me); |
1194 | + |
1195 | + r = radeon_ring_lock(rdev, 4); |
1196 | + if (r) { |
1197 | + DRM_ERROR("radeon: cp failed to lock ring (%d).\n", r); |
1198 | + return r; |
1199 | + } |
1200 | + /* init some VGT regs */ |
1201 | + radeon_ring_write(rdev, PACKET3(PACKET3_SET_CONTEXT_REG, 2)); |
1202 | + radeon_ring_write(rdev, (VGT_VERTEX_REUSE_BLOCK_CNTL - PACKET3_SET_CONTEXT_REG_START) >> 2); |
1203 | + radeon_ring_write(rdev, 0xe); |
1204 | + radeon_ring_write(rdev, 0x10); |
1205 | + radeon_ring_unlock_commit(rdev); |
1206 | + |
1207 | + return 0; |
1208 | +} |
1209 | + |
1210 | int evergreen_cp_resume(struct radeon_device *rdev) |
1211 | { |
1212 | u32 tmp; |
1213 | @@ -702,7 +739,7 @@ int evergreen_cp_resume(struct radeon_device *rdev) |
1214 | rdev->cp.rptr = RREG32(CP_RB_RPTR); |
1215 | rdev->cp.wptr = RREG32(CP_RB_WPTR); |
1216 | |
1217 | - r600_cp_start(rdev); |
1218 | + evergreen_cp_start(rdev); |
1219 | rdev->cp.ready = true; |
1220 | r = radeon_ring_test(rdev); |
1221 | if (r) { |
1222 | @@ -1106,14 +1143,25 @@ static void evergreen_gpu_init(struct radeon_device *rdev) |
1223 | EVERGREEN_MAX_BACKENDS_MASK)); |
1224 | break; |
1225 | } |
1226 | - } else |
1227 | - gb_backend_map = |
1228 | - evergreen_get_tile_pipe_to_backend_map(rdev, |
1229 | - rdev->config.evergreen.max_tile_pipes, |
1230 | - rdev->config.evergreen.max_backends, |
1231 | - ((EVERGREEN_MAX_BACKENDS_MASK << |
1232 | - rdev->config.evergreen.max_backends) & |
1233 | - EVERGREEN_MAX_BACKENDS_MASK)); |
1234 | + } else { |
1235 | + switch (rdev->family) { |
1236 | + case CHIP_CYPRESS: |
1237 | + case CHIP_HEMLOCK: |
1238 | + gb_backend_map = 0x66442200; |
1239 | + break; |
1240 | + case CHIP_JUNIPER: |
1241 | + gb_backend_map = 0x00006420; |
1242 | + break; |
1243 | + default: |
1244 | + gb_backend_map = |
1245 | + evergreen_get_tile_pipe_to_backend_map(rdev, |
1246 | + rdev->config.evergreen.max_tile_pipes, |
1247 | + rdev->config.evergreen.max_backends, |
1248 | + ((EVERGREEN_MAX_BACKENDS_MASK << |
1249 | + rdev->config.evergreen.max_backends) & |
1250 | + EVERGREEN_MAX_BACKENDS_MASK)); |
1251 | + } |
1252 | + } |
1253 | |
1254 | WREG32(GB_BACKEND_MAP, gb_backend_map); |
1255 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
1256 | diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
1257 | index bb3de01..952cc78 100644 |
1258 | --- a/drivers/gpu/drm/radeon/r600.c |
1259 | +++ b/drivers/gpu/drm/radeon/r600.c |
1260 | @@ -2104,10 +2104,7 @@ int r600_cp_start(struct radeon_device *rdev) |
1261 | } |
1262 | radeon_ring_write(rdev, PACKET3(PACKET3_ME_INITIALIZE, 5)); |
1263 | radeon_ring_write(rdev, 0x1); |
1264 | - if (rdev->family >= CHIP_CEDAR) { |
1265 | - radeon_ring_write(rdev, 0x0); |
1266 | - radeon_ring_write(rdev, rdev->config.evergreen.max_hw_contexts - 1); |
1267 | - } else if (rdev->family >= CHIP_RV770) { |
1268 | + if (rdev->family >= CHIP_RV770) { |
1269 | radeon_ring_write(rdev, 0x0); |
1270 | radeon_ring_write(rdev, rdev->config.rv770.max_hw_contexts - 1); |
1271 | } else { |
1272 | @@ -3526,7 +3523,7 @@ void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) |
1273 | * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL |
1274 | */ |
1275 | if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { |
1276 | - void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; |
1277 | + void __iomem *ptr = (void *)rdev->vram_scratch.ptr; |
1278 | u32 tmp; |
1279 | |
1280 | WREG32(HDP_DEBUG1, 0); |
1281 | diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h |
1282 | index 2f94dc6..e0865c7 100644 |
1283 | --- a/drivers/gpu/drm/radeon/radeon.h |
1284 | +++ b/drivers/gpu/drm/radeon/radeon.h |
1285 | @@ -997,6 +997,11 @@ int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data, |
1286 | int radeon_gem_get_tiling_ioctl(struct drm_device *dev, void *data, |
1287 | struct drm_file *filp); |
1288 | |
1289 | +/* VRAM scratch page for HDP bug */ |
1290 | +struct r700_vram_scratch { |
1291 | + struct radeon_bo *robj; |
1292 | + volatile uint32_t *ptr; |
1293 | +}; |
1294 | |
1295 | /* |
1296 | * Core structure, functions and helpers. |
1297 | @@ -1060,6 +1065,7 @@ struct radeon_device { |
1298 | const struct firmware *pfp_fw; /* r6/700 PFP firmware */ |
1299 | const struct firmware *rlc_fw; /* r6/700 RLC firmware */ |
1300 | struct r600_blit r600_blit; |
1301 | + struct r700_vram_scratch vram_scratch; |
1302 | int msi_enabled; /* msi enabled */ |
1303 | struct r600_ih ih; /* r6/700 interrupt ring */ |
1304 | struct workqueue_struct *wq; |
1305 | diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c |
1306 | index 1d6fb79..67e8073 100644 |
1307 | --- a/drivers/gpu/drm/radeon/rv770.c |
1308 | +++ b/drivers/gpu/drm/radeon/rv770.c |
1309 | @@ -889,6 +889,54 @@ static void rv770_gpu_init(struct radeon_device *rdev) |
1310 | |
1311 | } |
1312 | |
1313 | +static int rv770_vram_scratch_init(struct radeon_device *rdev) |
1314 | +{ |
1315 | + int r; |
1316 | + u64 gpu_addr; |
1317 | + |
1318 | + if (rdev->vram_scratch.robj == NULL) { |
1319 | + r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, |
1320 | + true, RADEON_GEM_DOMAIN_VRAM, |
1321 | + &rdev->vram_scratch.robj); |
1322 | + if (r) { |
1323 | + return r; |
1324 | + } |
1325 | + } |
1326 | + |
1327 | + r = radeon_bo_reserve(rdev->vram_scratch.robj, false); |
1328 | + if (unlikely(r != 0)) |
1329 | + return r; |
1330 | + r = radeon_bo_pin(rdev->vram_scratch.robj, |
1331 | + RADEON_GEM_DOMAIN_VRAM, &gpu_addr); |
1332 | + if (r) { |
1333 | + radeon_bo_unreserve(rdev->vram_scratch.robj); |
1334 | + return r; |
1335 | + } |
1336 | + r = radeon_bo_kmap(rdev->vram_scratch.robj, |
1337 | + (void **)&rdev->vram_scratch.ptr); |
1338 | + if (r) |
1339 | + radeon_bo_unpin(rdev->vram_scratch.robj); |
1340 | + radeon_bo_unreserve(rdev->vram_scratch.robj); |
1341 | + |
1342 | + return r; |
1343 | +} |
1344 | + |
1345 | +static void rv770_vram_scratch_fini(struct radeon_device *rdev) |
1346 | +{ |
1347 | + int r; |
1348 | + |
1349 | + if (rdev->vram_scratch.robj == NULL) { |
1350 | + return; |
1351 | + } |
1352 | + r = radeon_bo_reserve(rdev->vram_scratch.robj, false); |
1353 | + if (likely(r == 0)) { |
1354 | + radeon_bo_kunmap(rdev->vram_scratch.robj); |
1355 | + radeon_bo_unpin(rdev->vram_scratch.robj); |
1356 | + radeon_bo_unreserve(rdev->vram_scratch.robj); |
1357 | + } |
1358 | + radeon_bo_unref(&rdev->vram_scratch.robj); |
1359 | +} |
1360 | + |
1361 | int rv770_mc_init(struct radeon_device *rdev) |
1362 | { |
1363 | u32 tmp; |
1364 | @@ -954,6 +1002,9 @@ static int rv770_startup(struct radeon_device *rdev) |
1365 | if (r) |
1366 | return r; |
1367 | } |
1368 | + r = rv770_vram_scratch_init(rdev); |
1369 | + if (r) |
1370 | + return r; |
1371 | rv770_gpu_init(rdev); |
1372 | r = r600_blit_init(rdev); |
1373 | if (r) { |
1374 | @@ -1179,6 +1230,7 @@ void rv770_fini(struct radeon_device *rdev) |
1375 | r600_irq_fini(rdev); |
1376 | radeon_irq_kms_fini(rdev); |
1377 | rv770_pcie_gart_fini(rdev); |
1378 | + rv770_vram_scratch_fini(rdev); |
1379 | radeon_gem_fini(rdev); |
1380 | radeon_fence_driver_fini(rdev); |
1381 | radeon_clocks_fini(rdev); |
1382 | diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c |
1383 | index b729c02..ffd6899 100644 |
1384 | --- a/drivers/hid/usbhid/hid-core.c |
1385 | +++ b/drivers/hid/usbhid/hid-core.c |
1386 | @@ -828,6 +828,7 @@ static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t co |
1387 | } |
1388 | } else { |
1389 | int skipped_report_id = 0; |
1390 | + int report_id = buf[0]; |
1391 | if (buf[0] == 0x0) { |
1392 | /* Don't send the Report ID */ |
1393 | buf++; |
1394 | @@ -837,7 +838,7 @@ static int usbhid_output_raw_report(struct hid_device *hid, __u8 *buf, size_t co |
1395 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
1396 | HID_REQ_SET_REPORT, |
1397 | USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, |
1398 | - ((report_type + 1) << 8) | *buf, |
1399 | + ((report_type + 1) << 8) | report_id, |
1400 | interface->desc.bInterfaceNumber, buf, count, |
1401 | USB_CTRL_SET_TIMEOUT); |
1402 | /* count also the report id, if this was a numbered report. */ |
1403 | diff --git a/drivers/hwmon/ads7871.c b/drivers/hwmon/ads7871.c |
1404 | index b300a20..5231934 100644 |
1405 | --- a/drivers/hwmon/ads7871.c |
1406 | +++ b/drivers/hwmon/ads7871.c |
1407 | @@ -160,30 +160,12 @@ static const struct attribute_group ads7871_group = { |
1408 | |
1409 | static int __devinit ads7871_probe(struct spi_device *spi) |
1410 | { |
1411 | - int status, ret, err = 0; |
1412 | + int ret, err; |
1413 | uint8_t val; |
1414 | struct ads7871_data *pdata; |
1415 | |
1416 | dev_dbg(&spi->dev, "probe\n"); |
1417 | |
1418 | - pdata = kzalloc(sizeof(struct ads7871_data), GFP_KERNEL); |
1419 | - if (!pdata) { |
1420 | - err = -ENOMEM; |
1421 | - goto exit; |
1422 | - } |
1423 | - |
1424 | - status = sysfs_create_group(&spi->dev.kobj, &ads7871_group); |
1425 | - if (status < 0) |
1426 | - goto error_free; |
1427 | - |
1428 | - pdata->hwmon_dev = hwmon_device_register(&spi->dev); |
1429 | - if (IS_ERR(pdata->hwmon_dev)) { |
1430 | - err = PTR_ERR(pdata->hwmon_dev); |
1431 | - goto error_remove; |
1432 | - } |
1433 | - |
1434 | - spi_set_drvdata(spi, pdata); |
1435 | - |
1436 | /* Configure the SPI bus */ |
1437 | spi->mode = (SPI_MODE_0); |
1438 | spi->bits_per_word = 8; |
1439 | @@ -201,6 +183,24 @@ static int __devinit ads7871_probe(struct spi_device *spi) |
1440 | we need to make sure we really have a chip*/ |
1441 | if (val != ret) { |
1442 | err = -ENODEV; |
1443 | + goto exit; |
1444 | + } |
1445 | + |
1446 | + pdata = kzalloc(sizeof(struct ads7871_data), GFP_KERNEL); |
1447 | + if (!pdata) { |
1448 | + err = -ENOMEM; |
1449 | + goto exit; |
1450 | + } |
1451 | + |
1452 | + err = sysfs_create_group(&spi->dev.kobj, &ads7871_group); |
1453 | + if (err < 0) |
1454 | + goto error_free; |
1455 | + |
1456 | + spi_set_drvdata(spi, pdata); |
1457 | + |
1458 | + pdata->hwmon_dev = hwmon_device_register(&spi->dev); |
1459 | + if (IS_ERR(pdata->hwmon_dev)) { |
1460 | + err = PTR_ERR(pdata->hwmon_dev); |
1461 | goto error_remove; |
1462 | } |
1463 | |
1464 | diff --git a/drivers/hwmon/emc1403.c b/drivers/hwmon/emc1403.c |
1465 | index 0e4b564..3f5a00e 100644 |
1466 | --- a/drivers/hwmon/emc1403.c |
1467 | +++ b/drivers/hwmon/emc1403.c |
1468 | @@ -275,7 +275,6 @@ static int emc1403_probe(struct i2c_client *client, |
1469 | res = sysfs_create_group(&client->dev.kobj, &m_thermal_gr); |
1470 | if (res) { |
1471 | dev_warn(&client->dev, "create group failed\n"); |
1472 | - hwmon_device_unregister(data->hwmon_dev); |
1473 | goto thermal_error1; |
1474 | } |
1475 | data->hwmon_dev = hwmon_device_register(&client->dev); |
1476 | diff --git a/drivers/hwmon/f75375s.c b/drivers/hwmon/f75375s.c |
1477 | index 0f58ecc..9638d58 100644 |
1478 | --- a/drivers/hwmon/f75375s.c |
1479 | +++ b/drivers/hwmon/f75375s.c |
1480 | @@ -79,7 +79,7 @@ enum chips { f75373, f75375 }; |
1481 | #define F75375_REG_PWM2_DROP_DUTY 0x6C |
1482 | |
1483 | #define FAN_CTRL_LINEAR(nr) (4 + nr) |
1484 | -#define FAN_CTRL_MODE(nr) (5 + ((nr) * 2)) |
1485 | +#define FAN_CTRL_MODE(nr) (4 + ((nr) * 2)) |
1486 | |
1487 | /* |
1488 | * Data structures and manipulation thereof |
1489 | @@ -298,7 +298,7 @@ static int set_pwm_enable_direct(struct i2c_client *client, int nr, int val) |
1490 | return -EINVAL; |
1491 | |
1492 | fanmode = f75375_read8(client, F75375_REG_FAN_TIMER); |
1493 | - fanmode = ~(3 << FAN_CTRL_MODE(nr)); |
1494 | + fanmode &= ~(3 << FAN_CTRL_MODE(nr)); |
1495 | |
1496 | switch (val) { |
1497 | case 0: /* Full speed */ |
1498 | @@ -350,7 +350,7 @@ static ssize_t set_pwm_mode(struct device *dev, struct device_attribute *attr, |
1499 | |
1500 | mutex_lock(&data->update_lock); |
1501 | conf = f75375_read8(client, F75375_REG_CONFIG1); |
1502 | - conf = ~(1 << FAN_CTRL_LINEAR(nr)); |
1503 | + conf &= ~(1 << FAN_CTRL_LINEAR(nr)); |
1504 | |
1505 | if (val == 0) |
1506 | conf |= (1 << FAN_CTRL_LINEAR(nr)) ; |
1507 | diff --git a/drivers/hwmon/hp_accel.c b/drivers/hwmon/hp_accel.c |
1508 | index 7580f55..36e9575 100644 |
1509 | --- a/drivers/hwmon/hp_accel.c |
1510 | +++ b/drivers/hwmon/hp_accel.c |
1511 | @@ -221,6 +221,8 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { |
1512 | AXIS_DMI_MATCH("HPB442x", "HP ProBook 442", xy_rotated_left), |
1513 | AXIS_DMI_MATCH("HPB452x", "HP ProBook 452", y_inverted), |
1514 | AXIS_DMI_MATCH("HPB522x", "HP ProBook 522", xy_swap), |
1515 | + AXIS_DMI_MATCH("HPB532x", "HP ProBook 532", y_inverted), |
1516 | + AXIS_DMI_MATCH("Mini5102", "HP Mini 5102", xy_rotated_left_usd), |
1517 | { NULL, } |
1518 | /* Laptop models without axis info (yet): |
1519 | * "NC6910" "HP Compaq 6910" |
1520 | diff --git a/drivers/hwmon/k8temp.c b/drivers/hwmon/k8temp.c |
1521 | index 8bdf80d..8364932 100644 |
1522 | --- a/drivers/hwmon/k8temp.c |
1523 | +++ b/drivers/hwmon/k8temp.c |
1524 | @@ -143,6 +143,37 @@ static const struct pci_device_id k8temp_ids[] = { |
1525 | |
1526 | MODULE_DEVICE_TABLE(pci, k8temp_ids); |
1527 | |
1528 | +static int __devinit is_rev_g_desktop(u8 model) |
1529 | +{ |
1530 | + u32 brandidx; |
1531 | + |
1532 | + if (model < 0x69) |
1533 | + return 0; |
1534 | + |
1535 | + if (model == 0xc1 || model == 0x6c || model == 0x7c) |
1536 | + return 0; |
1537 | + |
1538 | + /* |
1539 | + * Differentiate between AM2 and ASB1. |
1540 | + * See "Constructing the processor Name String" in "Revision |
1541 | + * Guide for AMD NPT Family 0Fh Processors" (33610). |
1542 | + */ |
1543 | + brandidx = cpuid_ebx(0x80000001); |
1544 | + brandidx = (brandidx >> 9) & 0x1f; |
1545 | + |
1546 | + /* Single core */ |
1547 | + if ((model == 0x6f || model == 0x7f) && |
1548 | + (brandidx == 0x7 || brandidx == 0x9 || brandidx == 0xc)) |
1549 | + return 0; |
1550 | + |
1551 | + /* Dual core */ |
1552 | + if (model == 0x6b && |
1553 | + (brandidx == 0xb || brandidx == 0xc)) |
1554 | + return 0; |
1555 | + |
1556 | + return 1; |
1557 | +} |
1558 | + |
1559 | static int __devinit k8temp_probe(struct pci_dev *pdev, |
1560 | const struct pci_device_id *id) |
1561 | { |
1562 | @@ -179,9 +210,7 @@ static int __devinit k8temp_probe(struct pci_dev *pdev, |
1563 | "wrong - check erratum #141\n"); |
1564 | } |
1565 | |
1566 | - if ((model >= 0x69) && |
1567 | - !(model == 0xc1 || model == 0x6c || model == 0x7c || |
1568 | - model == 0x6b || model == 0x6f || model == 0x7f)) { |
1569 | + if (is_rev_g_desktop(model)) { |
1570 | /* |
1571 | * RevG desktop CPUs (i.e. no socket S1G1 or |
1572 | * ASB1 parts) need additional offset, |
1573 | diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.h b/drivers/infiniband/hw/cxgb3/cxio_hal.h |
1574 | index 8f0caf7..78fbe9f 100644 |
1575 | --- a/drivers/infiniband/hw/cxgb3/cxio_hal.h |
1576 | +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.h |
1577 | @@ -53,7 +53,7 @@ |
1578 | #define T3_MAX_PBL_SIZE 256 |
1579 | #define T3_MAX_RQ_SIZE 1024 |
1580 | #define T3_MAX_QP_DEPTH (T3_MAX_RQ_SIZE-1) |
1581 | -#define T3_MAX_CQ_DEPTH 262144 |
1582 | +#define T3_MAX_CQ_DEPTH 65536 |
1583 | #define T3_MAX_NUM_STAG (1<<15) |
1584 | #define T3_MAX_MR_SIZE 0x100000000ULL |
1585 | #define T3_PAGESIZE_MASK 0xffff000 /* 4KB-128MB */ |
1586 | diff --git a/drivers/input/mouse/appletouch.c b/drivers/input/mouse/appletouch.c |
1587 | index 05edd75..a9cf768 100644 |
1588 | --- a/drivers/input/mouse/appletouch.c |
1589 | +++ b/drivers/input/mouse/appletouch.c |
1590 | @@ -205,8 +205,8 @@ struct atp { |
1591 | bool overflow_warned; |
1592 | int x_old; /* last reported x/y, */ |
1593 | int y_old; /* used for smoothing */ |
1594 | - u8 xy_cur[ATP_XSENSORS + ATP_YSENSORS]; |
1595 | - u8 xy_old[ATP_XSENSORS + ATP_YSENSORS]; |
1596 | + signed char xy_cur[ATP_XSENSORS + ATP_YSENSORS]; |
1597 | + signed char xy_old[ATP_XSENSORS + ATP_YSENSORS]; |
1598 | int xy_acc[ATP_XSENSORS + ATP_YSENSORS]; |
1599 | int idlecount; /* number of empty packets */ |
1600 | struct work_struct work; |
1601 | @@ -531,7 +531,7 @@ static void atp_complete_geyser_1_2(struct urb *urb) |
1602 | |
1603 | for (i = 0; i < ATP_XSENSORS + ATP_YSENSORS; i++) { |
1604 | /* accumulate the change */ |
1605 | - int change = dev->xy_old[i] - dev->xy_cur[i]; |
1606 | + signed char change = dev->xy_old[i] - dev->xy_cur[i]; |
1607 | dev->xy_acc[i] -= change; |
1608 | |
1609 | /* prevent down drifting */ |
1610 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c |
1611 | index 6440a8f..5d42358 100644 |
1612 | --- a/drivers/input/serio/i8042.c |
1613 | +++ b/drivers/input/serio/i8042.c |
1614 | @@ -861,9 +861,6 @@ static int i8042_controller_selftest(void) |
1615 | unsigned char param; |
1616 | int i = 0; |
1617 | |
1618 | - if (!i8042_reset) |
1619 | - return 0; |
1620 | - |
1621 | /* |
1622 | * We try this 5 times; on some really fragile systems this does not |
1623 | * take the first time... |
1624 | @@ -1020,7 +1017,8 @@ static void i8042_controller_reset(void) |
1625 | * Reset the controller if requested. |
1626 | */ |
1627 | |
1628 | - i8042_controller_selftest(); |
1629 | + if (i8042_reset) |
1630 | + i8042_controller_selftest(); |
1631 | |
1632 | /* |
1633 | * Restore the original control register setting. |
1634 | @@ -1094,23 +1092,11 @@ static void i8042_dritek_enable(void) |
1635 | #ifdef CONFIG_PM |
1636 | |
1637 | /* |
1638 | - * Here we try to restore the original BIOS settings to avoid |
1639 | - * upsetting it. |
1640 | - */ |
1641 | - |
1642 | -static int i8042_pm_reset(struct device *dev) |
1643 | -{ |
1644 | - i8042_controller_reset(); |
1645 | - |
1646 | - return 0; |
1647 | -} |
1648 | - |
1649 | -/* |
1650 | * Here we try to reset everything back to a state we had |
1651 | * before suspending. |
1652 | */ |
1653 | |
1654 | -static int i8042_pm_restore(struct device *dev) |
1655 | +static int i8042_controller_resume(bool force_reset) |
1656 | { |
1657 | int error; |
1658 | |
1659 | @@ -1118,9 +1104,11 @@ static int i8042_pm_restore(struct device *dev) |
1660 | if (error) |
1661 | return error; |
1662 | |
1663 | - error = i8042_controller_selftest(); |
1664 | - if (error) |
1665 | - return error; |
1666 | + if (i8042_reset || force_reset) { |
1667 | + error = i8042_controller_selftest(); |
1668 | + if (error) |
1669 | + return error; |
1670 | + } |
1671 | |
1672 | /* |
1673 | * Restore original CTR value and disable all ports |
1674 | @@ -1162,6 +1150,28 @@ static int i8042_pm_restore(struct device *dev) |
1675 | return 0; |
1676 | } |
1677 | |
1678 | +/* |
1679 | + * Here we try to restore the original BIOS settings to avoid |
1680 | + * upsetting it. |
1681 | + */ |
1682 | + |
1683 | +static int i8042_pm_reset(struct device *dev) |
1684 | +{ |
1685 | + i8042_controller_reset(); |
1686 | + |
1687 | + return 0; |
1688 | +} |
1689 | + |
1690 | +static int i8042_pm_resume(struct device *dev) |
1691 | +{ |
1692 | + /* |
1693 | + * On resume from S2R we always try to reset the controller |
1694 | + * to bring it in a sane state. (In case of S2D we expect |
1695 | + * BIOS to reset the controller for us.) |
1696 | + */ |
1697 | + return i8042_controller_resume(true); |
1698 | +} |
1699 | + |
1700 | static int i8042_pm_thaw(struct device *dev) |
1701 | { |
1702 | i8042_interrupt(0, NULL); |
1703 | @@ -1169,9 +1179,14 @@ static int i8042_pm_thaw(struct device *dev) |
1704 | return 0; |
1705 | } |
1706 | |
1707 | +static int i8042_pm_restore(struct device *dev) |
1708 | +{ |
1709 | + return i8042_controller_resume(false); |
1710 | +} |
1711 | + |
1712 | static const struct dev_pm_ops i8042_pm_ops = { |
1713 | .suspend = i8042_pm_reset, |
1714 | - .resume = i8042_pm_restore, |
1715 | + .resume = i8042_pm_resume, |
1716 | .thaw = i8042_pm_thaw, |
1717 | .poweroff = i8042_pm_reset, |
1718 | .restore = i8042_pm_restore, |
1719 | @@ -1389,9 +1404,11 @@ static int __init i8042_probe(struct platform_device *dev) |
1720 | |
1721 | i8042_platform_device = dev; |
1722 | |
1723 | - error = i8042_controller_selftest(); |
1724 | - if (error) |
1725 | - return error; |
1726 | + if (i8042_reset) { |
1727 | + error = i8042_controller_selftest(); |
1728 | + if (error) |
1729 | + return error; |
1730 | + } |
1731 | |
1732 | error = i8042_controller_init(); |
1733 | if (error) |
1734 | @@ -1483,8 +1500,8 @@ static int __init i8042_init(void) |
1735 | |
1736 | static void __exit i8042_exit(void) |
1737 | { |
1738 | - platform_driver_unregister(&i8042_driver); |
1739 | platform_device_unregister(i8042_platform_device); |
1740 | + platform_driver_unregister(&i8042_driver); |
1741 | i8042_platform_exit(); |
1742 | |
1743 | panic_blink = NULL; |
1744 | diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c |
1745 | index 569e94d..83e7543 100644 |
1746 | --- a/drivers/mmc/core/core.c |
1747 | +++ b/drivers/mmc/core/core.c |
1748 | @@ -1057,6 +1057,17 @@ void mmc_rescan(struct work_struct *work) |
1749 | container_of(work, struct mmc_host, detect.work); |
1750 | u32 ocr; |
1751 | int err; |
1752 | + unsigned long flags; |
1753 | + |
1754 | + spin_lock_irqsave(&host->lock, flags); |
1755 | + |
1756 | + if (host->rescan_disable) { |
1757 | + spin_unlock_irqrestore(&host->lock, flags); |
1758 | + return; |
1759 | + } |
1760 | + |
1761 | + spin_unlock_irqrestore(&host->lock, flags); |
1762 | + |
1763 | |
1764 | mmc_bus_get(host); |
1765 | |
1766 | @@ -1266,19 +1277,6 @@ int mmc_suspend_host(struct mmc_host *host) |
1767 | if (host->bus_ops && !host->bus_dead) { |
1768 | if (host->bus_ops->suspend) |
1769 | err = host->bus_ops->suspend(host); |
1770 | - if (err == -ENOSYS || !host->bus_ops->resume) { |
1771 | - /* |
1772 | - * We simply "remove" the card in this case. |
1773 | - * It will be redetected on resume. |
1774 | - */ |
1775 | - if (host->bus_ops->remove) |
1776 | - host->bus_ops->remove(host); |
1777 | - mmc_claim_host(host); |
1778 | - mmc_detach_bus(host); |
1779 | - mmc_release_host(host); |
1780 | - host->pm_flags = 0; |
1781 | - err = 0; |
1782 | - } |
1783 | } |
1784 | mmc_bus_put(host); |
1785 | |
1786 | @@ -1310,28 +1308,61 @@ int mmc_resume_host(struct mmc_host *host) |
1787 | printk(KERN_WARNING "%s: error %d during resume " |
1788 | "(card was removed?)\n", |
1789 | mmc_hostname(host), err); |
1790 | - if (host->bus_ops->remove) |
1791 | - host->bus_ops->remove(host); |
1792 | - mmc_claim_host(host); |
1793 | - mmc_detach_bus(host); |
1794 | - mmc_release_host(host); |
1795 | - /* no need to bother upper layers */ |
1796 | err = 0; |
1797 | } |
1798 | } |
1799 | mmc_bus_put(host); |
1800 | |
1801 | - /* |
1802 | - * We add a slight delay here so that resume can progress |
1803 | - * in parallel. |
1804 | - */ |
1805 | - mmc_detect_change(host, 1); |
1806 | - |
1807 | return err; |
1808 | } |
1809 | - |
1810 | EXPORT_SYMBOL(mmc_resume_host); |
1811 | |
1812 | +/* Do the card removal on suspend if card is assumed removeable |
1813 | + * Do that in pm notifier while userspace isn't yet frozen, so we will be able |
1814 | + to sync the card. |
1815 | +*/ |
1816 | +int mmc_pm_notify(struct notifier_block *notify_block, |
1817 | + unsigned long mode, void *unused) |
1818 | +{ |
1819 | + struct mmc_host *host = container_of( |
1820 | + notify_block, struct mmc_host, pm_notify); |
1821 | + unsigned long flags; |
1822 | + |
1823 | + |
1824 | + switch (mode) { |
1825 | + case PM_HIBERNATION_PREPARE: |
1826 | + case PM_SUSPEND_PREPARE: |
1827 | + |
1828 | + spin_lock_irqsave(&host->lock, flags); |
1829 | + host->rescan_disable = 1; |
1830 | + spin_unlock_irqrestore(&host->lock, flags); |
1831 | + cancel_delayed_work_sync(&host->detect); |
1832 | + |
1833 | + if (!host->bus_ops || host->bus_ops->suspend) |
1834 | + break; |
1835 | + |
1836 | + mmc_claim_host(host); |
1837 | + |
1838 | + if (host->bus_ops->remove) |
1839 | + host->bus_ops->remove(host); |
1840 | + |
1841 | + mmc_detach_bus(host); |
1842 | + mmc_release_host(host); |
1843 | + host->pm_flags = 0; |
1844 | + break; |
1845 | + |
1846 | + case PM_POST_SUSPEND: |
1847 | + case PM_POST_HIBERNATION: |
1848 | + |
1849 | + spin_lock_irqsave(&host->lock, flags); |
1850 | + host->rescan_disable = 0; |
1851 | + spin_unlock_irqrestore(&host->lock, flags); |
1852 | + mmc_detect_change(host, 0); |
1853 | + |
1854 | + } |
1855 | + |
1856 | + return 0; |
1857 | +} |
1858 | #endif |
1859 | |
1860 | static int __init mmc_init(void) |
1861 | diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c |
1862 | index 4735390..d80cfdc 100644 |
1863 | --- a/drivers/mmc/core/host.c |
1864 | +++ b/drivers/mmc/core/host.c |
1865 | @@ -17,6 +17,7 @@ |
1866 | #include <linux/pagemap.h> |
1867 | #include <linux/leds.h> |
1868 | #include <linux/slab.h> |
1869 | +#include <linux/suspend.h> |
1870 | |
1871 | #include <linux/mmc/host.h> |
1872 | |
1873 | @@ -85,6 +86,9 @@ struct mmc_host *mmc_alloc_host(int extra, struct device *dev) |
1874 | init_waitqueue_head(&host->wq); |
1875 | INIT_DELAYED_WORK(&host->detect, mmc_rescan); |
1876 | INIT_DELAYED_WORK_DEFERRABLE(&host->disable, mmc_host_deeper_disable); |
1877 | +#ifdef CONFIG_PM |
1878 | + host->pm_notify.notifier_call = mmc_pm_notify; |
1879 | +#endif |
1880 | |
1881 | /* |
1882 | * By default, hosts do not support SGIO or large requests. |
1883 | @@ -133,6 +137,7 @@ int mmc_add_host(struct mmc_host *host) |
1884 | #endif |
1885 | |
1886 | mmc_start_host(host); |
1887 | + register_pm_notifier(&host->pm_notify); |
1888 | |
1889 | return 0; |
1890 | } |
1891 | @@ -149,6 +154,7 @@ EXPORT_SYMBOL(mmc_add_host); |
1892 | */ |
1893 | void mmc_remove_host(struct mmc_host *host) |
1894 | { |
1895 | + unregister_pm_notifier(&host->pm_notify); |
1896 | mmc_stop_host(host); |
1897 | |
1898 | #ifdef CONFIG_DEBUG_FS |
1899 | diff --git a/drivers/mmc/host/tmio_mmc.c b/drivers/mmc/host/tmio_mmc.c |
1900 | index ee7d0a5..69d98e3 100644 |
1901 | --- a/drivers/mmc/host/tmio_mmc.c |
1902 | +++ b/drivers/mmc/host/tmio_mmc.c |
1903 | @@ -164,6 +164,7 @@ tmio_mmc_start_command(struct tmio_mmc_host *host, struct mmc_command *cmd) |
1904 | static void tmio_mmc_pio_irq(struct tmio_mmc_host *host) |
1905 | { |
1906 | struct mmc_data *data = host->data; |
1907 | + void *sg_virt; |
1908 | unsigned short *buf; |
1909 | unsigned int count; |
1910 | unsigned long flags; |
1911 | @@ -173,8 +174,8 @@ static void tmio_mmc_pio_irq(struct tmio_mmc_host *host) |
1912 | return; |
1913 | } |
1914 | |
1915 | - buf = (unsigned short *)(tmio_mmc_kmap_atomic(host, &flags) + |
1916 | - host->sg_off); |
1917 | + sg_virt = tmio_mmc_kmap_atomic(host->sg_ptr, &flags); |
1918 | + buf = (unsigned short *)(sg_virt + host->sg_off); |
1919 | |
1920 | count = host->sg_ptr->length - host->sg_off; |
1921 | if (count > data->blksz) |
1922 | @@ -191,7 +192,7 @@ static void tmio_mmc_pio_irq(struct tmio_mmc_host *host) |
1923 | |
1924 | host->sg_off += count; |
1925 | |
1926 | - tmio_mmc_kunmap_atomic(host, &flags); |
1927 | + tmio_mmc_kunmap_atomic(sg_virt, &flags); |
1928 | |
1929 | if (host->sg_off == host->sg_ptr->length) |
1930 | tmio_mmc_next_sg(host); |
1931 | diff --git a/drivers/mmc/host/tmio_mmc.h b/drivers/mmc/host/tmio_mmc.h |
1932 | index 64f7d5d..0fedc78 100644 |
1933 | --- a/drivers/mmc/host/tmio_mmc.h |
1934 | +++ b/drivers/mmc/host/tmio_mmc.h |
1935 | @@ -82,10 +82,7 @@ |
1936 | |
1937 | #define ack_mmc_irqs(host, i) \ |
1938 | do { \ |
1939 | - u32 mask;\ |
1940 | - mask = sd_ctrl_read32((host), CTL_STATUS); \ |
1941 | - mask &= ~((i) & TMIO_MASK_IRQ); \ |
1942 | - sd_ctrl_write32((host), CTL_STATUS, mask); \ |
1943 | + sd_ctrl_write32((host), CTL_STATUS, ~(i)); \ |
1944 | } while (0) |
1945 | |
1946 | |
1947 | @@ -177,19 +174,17 @@ static inline int tmio_mmc_next_sg(struct tmio_mmc_host *host) |
1948 | return --host->sg_len; |
1949 | } |
1950 | |
1951 | -static inline char *tmio_mmc_kmap_atomic(struct tmio_mmc_host *host, |
1952 | +static inline char *tmio_mmc_kmap_atomic(struct scatterlist *sg, |
1953 | unsigned long *flags) |
1954 | { |
1955 | - struct scatterlist *sg = host->sg_ptr; |
1956 | - |
1957 | local_irq_save(*flags); |
1958 | return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset; |
1959 | } |
1960 | |
1961 | -static inline void tmio_mmc_kunmap_atomic(struct tmio_mmc_host *host, |
1962 | +static inline void tmio_mmc_kunmap_atomic(void *virt, |
1963 | unsigned long *flags) |
1964 | { |
1965 | - kunmap_atomic(sg_page(host->sg_ptr), KM_BIO_SRC_IRQ); |
1966 | + kunmap_atomic(virt, KM_BIO_SRC_IRQ); |
1967 | local_irq_restore(*flags); |
1968 | } |
1969 | |
1970 | diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c |
1971 | index ab9fe22..f1e3469 100644 |
1972 | --- a/drivers/net/wireless/ath/ath5k/base.c |
1973 | +++ b/drivers/net/wireless/ath/ath5k/base.c |
1974 | @@ -1318,6 +1318,10 @@ ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf, |
1975 | PCI_DMA_TODEVICE); |
1976 | |
1977 | rate = ieee80211_get_tx_rate(sc->hw, info); |
1978 | + if (!rate) { |
1979 | + ret = -EINVAL; |
1980 | + goto err_unmap; |
1981 | + } |
1982 | |
1983 | if (info->flags & IEEE80211_TX_CTL_NO_ACK) |
1984 | flags |= AR5K_TXDESC_NOACK; |
1985 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
1986 | index cb4e7da..5543465 100644 |
1987 | --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
1988 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
1989 | @@ -768,7 +768,7 @@ static bool ar9300_uncompress_block(struct ath_hw *ah, |
1990 | length = block[it+1]; |
1991 | length &= 0xff; |
1992 | |
1993 | - if (length > 0 && spot >= 0 && spot+length < mdataSize) { |
1994 | + if (length > 0 && spot >= 0 && spot+length <= mdataSize) { |
1995 | ath_print(common, ATH_DBG_EEPROM, |
1996 | "Restore at %d: spot=%d " |
1997 | "offset=%d length=%d\n", |
1998 | diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h |
1999 | index 5f01a0f..0e8489d 100644 |
2000 | --- a/drivers/net/wireless/ath/ath9k/eeprom.h |
2001 | +++ b/drivers/net/wireless/ath/ath9k/eeprom.h |
2002 | @@ -62,7 +62,7 @@ |
2003 | |
2004 | #define SD_NO_CTL 0xE0 |
2005 | #define NO_CTL 0xff |
2006 | -#define CTL_MODE_M 7 |
2007 | +#define CTL_MODE_M 0xf |
2008 | #define CTL_11A 0 |
2009 | #define CTL_11B 1 |
2010 | #define CTL_11G 2 |
2011 | diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c |
2012 | index 9d371c1..5f3c47d 100644 |
2013 | --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c |
2014 | +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c |
2015 | @@ -370,7 +370,8 @@ static int ath9k_htc_init_rate(struct ath9k_htc_priv *priv, |
2016 | priv->tgt_rate.rates.ht_rates.rs_nrates = j; |
2017 | |
2018 | caps = WLAN_RC_HT_FLAG; |
2019 | - if (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) |
2020 | + if ((sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) && |
2021 | + (conf_is_ht40(&priv->hw->conf))) |
2022 | caps |= WLAN_RC_40_FLAG; |
2023 | if (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) |
2024 | caps |= WLAN_RC_SGI_FLAG; |
2025 | diff --git a/drivers/net/wireless/ath/regd.h b/drivers/net/wireless/ath/regd.h |
2026 | index a1c3952..345dd97 100644 |
2027 | --- a/drivers/net/wireless/ath/regd.h |
2028 | +++ b/drivers/net/wireless/ath/regd.h |
2029 | @@ -31,7 +31,6 @@ enum ctl_group { |
2030 | #define NO_CTL 0xff |
2031 | #define SD_NO_CTL 0xE0 |
2032 | #define NO_CTL 0xff |
2033 | -#define CTL_MODE_M 7 |
2034 | #define CTL_11A 0 |
2035 | #define CTL_11B 1 |
2036 | #define CTL_11G 2 |
2037 | diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c |
2038 | index 4e68910..ccb2dd1 100644 |
2039 | --- a/drivers/net/wireless/p54/txrx.c |
2040 | +++ b/drivers/net/wireless/p54/txrx.c |
2041 | @@ -444,7 +444,7 @@ static void p54_rx_frame_sent(struct p54_common *priv, struct sk_buff *skb) |
2042 | } |
2043 | |
2044 | if (!(info->flags & IEEE80211_TX_CTL_NO_ACK) && |
2045 | - (!payload->status)) |
2046 | + !(payload->status & P54_TX_FAILED)) |
2047 | info->flags |= IEEE80211_TX_STAT_ACK; |
2048 | if (payload->status & P54_TX_PSM_CANCELLED) |
2049 | info->flags |= IEEE80211_TX_STAT_TX_FILTERED; |
2050 | diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c |
2051 | index a9352b2..b7e755f 100644 |
2052 | --- a/drivers/oprofile/buffer_sync.c |
2053 | +++ b/drivers/oprofile/buffer_sync.c |
2054 | @@ -141,16 +141,6 @@ static struct notifier_block module_load_nb = { |
2055 | .notifier_call = module_load_notify, |
2056 | }; |
2057 | |
2058 | - |
2059 | -static void end_sync(void) |
2060 | -{ |
2061 | - end_cpu_work(); |
2062 | - /* make sure we don't leak task structs */ |
2063 | - process_task_mortuary(); |
2064 | - process_task_mortuary(); |
2065 | -} |
2066 | - |
2067 | - |
2068 | int sync_start(void) |
2069 | { |
2070 | int err; |
2071 | @@ -158,7 +148,7 @@ int sync_start(void) |
2072 | if (!zalloc_cpumask_var(&marked_cpus, GFP_KERNEL)) |
2073 | return -ENOMEM; |
2074 | |
2075 | - start_cpu_work(); |
2076 | + mutex_lock(&buffer_mutex); |
2077 | |
2078 | err = task_handoff_register(&task_free_nb); |
2079 | if (err) |
2080 | @@ -173,7 +163,10 @@ int sync_start(void) |
2081 | if (err) |
2082 | goto out4; |
2083 | |
2084 | + start_cpu_work(); |
2085 | + |
2086 | out: |
2087 | + mutex_unlock(&buffer_mutex); |
2088 | return err; |
2089 | out4: |
2090 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
2091 | @@ -182,7 +175,6 @@ out3: |
2092 | out2: |
2093 | task_handoff_unregister(&task_free_nb); |
2094 | out1: |
2095 | - end_sync(); |
2096 | free_cpumask_var(marked_cpus); |
2097 | goto out; |
2098 | } |
2099 | @@ -190,11 +182,20 @@ out1: |
2100 | |
2101 | void sync_stop(void) |
2102 | { |
2103 | + /* flush buffers */ |
2104 | + mutex_lock(&buffer_mutex); |
2105 | + end_cpu_work(); |
2106 | unregister_module_notifier(&module_load_nb); |
2107 | profile_event_unregister(PROFILE_MUNMAP, &munmap_nb); |
2108 | profile_event_unregister(PROFILE_TASK_EXIT, &task_exit_nb); |
2109 | task_handoff_unregister(&task_free_nb); |
2110 | - end_sync(); |
2111 | + mutex_unlock(&buffer_mutex); |
2112 | + flush_scheduled_work(); |
2113 | + |
2114 | + /* make sure we don't leak task structs */ |
2115 | + process_task_mortuary(); |
2116 | + process_task_mortuary(); |
2117 | + |
2118 | free_cpumask_var(marked_cpus); |
2119 | } |
2120 | |
2121 | diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c |
2122 | index 219f79e..f179ac2 100644 |
2123 | --- a/drivers/oprofile/cpu_buffer.c |
2124 | +++ b/drivers/oprofile/cpu_buffer.c |
2125 | @@ -120,8 +120,6 @@ void end_cpu_work(void) |
2126 | |
2127 | cancel_delayed_work(&b->work); |
2128 | } |
2129 | - |
2130 | - flush_scheduled_work(); |
2131 | } |
2132 | |
2133 | /* |
2134 | diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c |
2135 | index 77b68ea..cd22d69 100644 |
2136 | --- a/drivers/pci/msi.c |
2137 | +++ b/drivers/pci/msi.c |
2138 | @@ -196,6 +196,9 @@ void unmask_msi_irq(unsigned int irq) |
2139 | void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg) |
2140 | { |
2141 | struct msi_desc *entry = get_irq_desc_msi(desc); |
2142 | + |
2143 | + BUG_ON(entry->dev->current_state != PCI_D0); |
2144 | + |
2145 | if (entry->msi_attrib.is_msix) { |
2146 | void __iomem *base = entry->mask_base + |
2147 | entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE; |
2148 | @@ -229,10 +232,32 @@ void read_msi_msg(unsigned int irq, struct msi_msg *msg) |
2149 | read_msi_msg_desc(desc, msg); |
2150 | } |
2151 | |
2152 | +void get_cached_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg) |
2153 | +{ |
2154 | + struct msi_desc *entry = get_irq_desc_msi(desc); |
2155 | + |
2156 | + /* Assert that the cache is valid, assuming that |
2157 | + * valid messages are not all-zeroes. */ |
2158 | + BUG_ON(!(entry->msg.address_hi | entry->msg.address_lo | |
2159 | + entry->msg.data)); |
2160 | + |
2161 | + *msg = entry->msg; |
2162 | +} |
2163 | + |
2164 | +void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg) |
2165 | +{ |
2166 | + struct irq_desc *desc = irq_to_desc(irq); |
2167 | + |
2168 | + get_cached_msi_msg_desc(desc, msg); |
2169 | +} |
2170 | + |
2171 | void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg) |
2172 | { |
2173 | struct msi_desc *entry = get_irq_desc_msi(desc); |
2174 | - if (entry->msi_attrib.is_msix) { |
2175 | + |
2176 | + if (entry->dev->current_state != PCI_D0) { |
2177 | + /* Don't touch the hardware now */ |
2178 | + } else if (entry->msi_attrib.is_msix) { |
2179 | void __iomem *base; |
2180 | base = entry->mask_base + |
2181 | entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE; |
2182 | diff --git a/drivers/power/apm_power.c b/drivers/power/apm_power.c |
2183 | index 936bae5..dc628cb 100644 |
2184 | --- a/drivers/power/apm_power.c |
2185 | +++ b/drivers/power/apm_power.c |
2186 | @@ -233,6 +233,7 @@ static int calculate_capacity(enum apm_source source) |
2187 | empty_design_prop = POWER_SUPPLY_PROP_ENERGY_EMPTY_DESIGN; |
2188 | now_prop = POWER_SUPPLY_PROP_ENERGY_NOW; |
2189 | avg_prop = POWER_SUPPLY_PROP_ENERGY_AVG; |
2190 | + break; |
2191 | case SOURCE_VOLTAGE: |
2192 | full_prop = POWER_SUPPLY_PROP_VOLTAGE_MAX; |
2193 | empty_prop = POWER_SUPPLY_PROP_VOLTAGE_MIN; |
2194 | diff --git a/drivers/serial/bfin_sport_uart.c b/drivers/serial/bfin_sport_uart.c |
2195 | index e57fb3d..5318dd3 100644 |
2196 | --- a/drivers/serial/bfin_sport_uart.c |
2197 | +++ b/drivers/serial/bfin_sport_uart.c |
2198 | @@ -121,7 +121,7 @@ static int sport_uart_setup(struct sport_uart_port *up, int size, int baud_rate) |
2199 | unsigned int sclk = get_sclk(); |
2200 | |
2201 | /* Set TCR1 and TCR2, TFSR is not enabled for uart */ |
2202 | - SPORT_PUT_TCR1(up, (ITFS | TLSBIT | ITCLK)); |
2203 | + SPORT_PUT_TCR1(up, (LATFS | ITFS | TFSR | TLSBIT | ITCLK)); |
2204 | SPORT_PUT_TCR2(up, size + 1); |
2205 | pr_debug("%s TCR1:%x, TCR2:%x\n", __func__, SPORT_GET_TCR1(up), SPORT_GET_TCR2(up)); |
2206 | |
2207 | diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c |
2208 | index 55b9932..69cc8f7 100644 |
2209 | --- a/drivers/staging/hv/netvsc_drv.c |
2210 | +++ b/drivers/staging/hv/netvsc_drv.c |
2211 | @@ -348,6 +348,9 @@ static const struct net_device_ops device_ops = { |
2212 | .ndo_stop = netvsc_close, |
2213 | .ndo_start_xmit = netvsc_start_xmit, |
2214 | .ndo_set_multicast_list = netvsc_set_multicast_list, |
2215 | + .ndo_change_mtu = eth_change_mtu, |
2216 | + .ndo_validate_addr = eth_validate_addr, |
2217 | + .ndo_set_mac_address = eth_mac_addr, |
2218 | }; |
2219 | |
2220 | static int netvsc_probe(struct device *device) |
2221 | diff --git a/drivers/staging/hv/ring_buffer.c b/drivers/staging/hv/ring_buffer.c |
2222 | index ae2a10e..c5a3870 100644 |
2223 | --- a/drivers/staging/hv/ring_buffer.c |
2224 | +++ b/drivers/staging/hv/ring_buffer.c |
2225 | @@ -192,8 +192,7 @@ Description: |
2226 | static inline u64 |
2227 | GetRingBufferIndices(RING_BUFFER_INFO *RingInfo) |
2228 | { |
2229 | - return ((u64)RingInfo->RingBuffer->WriteIndex << 32) |
2230 | - || RingInfo->RingBuffer->ReadIndex; |
2231 | + return (u64)RingInfo->RingBuffer->WriteIndex << 32; |
2232 | } |
2233 | |
2234 | |
2235 | diff --git a/drivers/staging/hv/storvsc_api.h b/drivers/staging/hv/storvsc_api.h |
2236 | index 0063bde..8505a1c 100644 |
2237 | --- a/drivers/staging/hv/storvsc_api.h |
2238 | +++ b/drivers/staging/hv/storvsc_api.h |
2239 | @@ -28,10 +28,10 @@ |
2240 | #include "vmbus_api.h" |
2241 | |
2242 | /* Defines */ |
2243 | -#define STORVSC_RING_BUFFER_SIZE (10*PAGE_SIZE) |
2244 | +#define STORVSC_RING_BUFFER_SIZE (20*PAGE_SIZE) |
2245 | #define BLKVSC_RING_BUFFER_SIZE (20*PAGE_SIZE) |
2246 | |
2247 | -#define STORVSC_MAX_IO_REQUESTS 64 |
2248 | +#define STORVSC_MAX_IO_REQUESTS 128 |
2249 | |
2250 | /* |
2251 | * In Hyper-V, each port/path/target maps to 1 scsi host adapter. In |
2252 | diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c |
2253 | index d22e35f..c1ba458 100644 |
2254 | --- a/drivers/staging/hv/storvsc_drv.c |
2255 | +++ b/drivers/staging/hv/storvsc_drv.c |
2256 | @@ -526,7 +526,7 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, |
2257 | |
2258 | /* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */ |
2259 | |
2260 | - if (j == 0) |
2261 | + if (bounce_addr == 0) |
2262 | bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0); |
2263 | |
2264 | while (srclen) { |
2265 | @@ -587,7 +587,7 @@ static unsigned int copy_from_bounce_buffer(struct scatterlist *orig_sgl, |
2266 | destlen = orig_sgl[i].length; |
2267 | /* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */ |
2268 | |
2269 | - if (j == 0) |
2270 | + if (bounce_addr == 0) |
2271 | bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0); |
2272 | |
2273 | while (destlen) { |
2274 | @@ -646,6 +646,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, |
2275 | unsigned int request_size = 0; |
2276 | int i; |
2277 | struct scatterlist *sgl; |
2278 | + unsigned int sg_count = 0; |
2279 | |
2280 | DPRINT_ENTER(STORVSC_DRV); |
2281 | |
2282 | @@ -730,6 +731,7 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, |
2283 | request->DataBuffer.Length = scsi_bufflen(scmnd); |
2284 | if (scsi_sg_count(scmnd)) { |
2285 | sgl = (struct scatterlist *)scsi_sglist(scmnd); |
2286 | + sg_count = scsi_sg_count(scmnd); |
2287 | |
2288 | /* check if we need to bounce the sgl */ |
2289 | if (do_bounce_buffer(sgl, scsi_sg_count(scmnd)) != -1) { |
2290 | @@ -764,15 +766,16 @@ static int storvsc_queuecommand(struct scsi_cmnd *scmnd, |
2291 | scsi_sg_count(scmnd)); |
2292 | |
2293 | sgl = cmd_request->bounce_sgl; |
2294 | + sg_count = cmd_request->bounce_sgl_count; |
2295 | } |
2296 | |
2297 | request->DataBuffer.Offset = sgl[0].offset; |
2298 | |
2299 | - for (i = 0; i < scsi_sg_count(scmnd); i++) { |
2300 | + for (i = 0; i < sg_count; i++) { |
2301 | DPRINT_DBG(STORVSC_DRV, "sgl[%d] len %d offset %d\n", |
2302 | i, sgl[i].length, sgl[i].offset); |
2303 | request->DataBuffer.PfnArray[i] = |
2304 | - page_to_pfn(sg_page((&sgl[i]))); |
2305 | + page_to_pfn(sg_page((&sgl[i]))); |
2306 | } |
2307 | } else if (scsi_sglist(scmnd)) { |
2308 | /* ASSERT(scsi_bufflen(scmnd) <= PAGE_SIZE); */ |
2309 | diff --git a/drivers/staging/rt2860/usb_main_dev.c b/drivers/staging/rt2860/usb_main_dev.c |
2310 | index c48e85d..1252392 100644 |
2311 | --- a/drivers/staging/rt2860/usb_main_dev.c |
2312 | +++ b/drivers/staging/rt2860/usb_main_dev.c |
2313 | @@ -44,6 +44,7 @@ struct usb_device_id rtusb_usb_id[] = { |
2314 | {USB_DEVICE(0x07B8, 0x2870)}, /* AboCom */ |
2315 | {USB_DEVICE(0x07B8, 0x2770)}, /* AboCom */ |
2316 | {USB_DEVICE(0x0DF6, 0x0039)}, /* Sitecom 2770 */ |
2317 | + {USB_DEVICE(0x0DF6, 0x003F)}, /* Sitecom 2770 */ |
2318 | {USB_DEVICE(0x083A, 0x7512)}, /* Arcadyan 2770 */ |
2319 | {USB_DEVICE(0x0789, 0x0162)}, /* Logitec 2870 */ |
2320 | {USB_DEVICE(0x0789, 0x0163)}, /* Logitec 2870 */ |
2321 | @@ -95,7 +96,8 @@ struct usb_device_id rtusb_usb_id[] = { |
2322 | {USB_DEVICE(0x050d, 0x815c)}, |
2323 | {USB_DEVICE(0x1482, 0x3C09)}, /* Abocom */ |
2324 | {USB_DEVICE(0x14B2, 0x3C09)}, /* Alpha */ |
2325 | - {USB_DEVICE(0x04E8, 0x2018)}, /* samsung */ |
2326 | + {USB_DEVICE(0x04E8, 0x2018)}, /* samsung linkstick2 */ |
2327 | + {USB_DEVICE(0x1690, 0x0740)}, /* Askey */ |
2328 | {USB_DEVICE(0x5A57, 0x0280)}, /* Zinwell */ |
2329 | {USB_DEVICE(0x5A57, 0x0282)}, /* Zinwell */ |
2330 | {USB_DEVICE(0x7392, 0x7718)}, |
2331 | @@ -105,21 +107,34 @@ struct usb_device_id rtusb_usb_id[] = { |
2332 | {USB_DEVICE(0x1737, 0x0071)}, /* Linksys WUSB600N */ |
2333 | {USB_DEVICE(0x0411, 0x00e8)}, /* Buffalo WLI-UC-G300N */ |
2334 | {USB_DEVICE(0x050d, 0x815c)}, /* Belkin F5D8053 */ |
2335 | + {USB_DEVICE(0x100D, 0x9031)}, /* Motorola 2770 */ |
2336 | #endif /* RT2870 // */ |
2337 | #ifdef RT3070 |
2338 | {USB_DEVICE(0x148F, 0x3070)}, /* Ralink 3070 */ |
2339 | {USB_DEVICE(0x148F, 0x3071)}, /* Ralink 3071 */ |
2340 | {USB_DEVICE(0x148F, 0x3072)}, /* Ralink 3072 */ |
2341 | {USB_DEVICE(0x0DB0, 0x3820)}, /* Ralink 3070 */ |
2342 | + {USB_DEVICE(0x0DB0, 0x871C)}, /* Ralink 3070 */ |
2343 | + {USB_DEVICE(0x0DB0, 0x822C)}, /* Ralink 3070 */ |
2344 | + {USB_DEVICE(0x0DB0, 0x871B)}, /* Ralink 3070 */ |
2345 | + {USB_DEVICE(0x0DB0, 0x822B)}, /* Ralink 3070 */ |
2346 | {USB_DEVICE(0x0DF6, 0x003E)}, /* Sitecom 3070 */ |
2347 | {USB_DEVICE(0x0DF6, 0x0042)}, /* Sitecom 3072 */ |
2348 | + {USB_DEVICE(0x0DF6, 0x0048)}, /* Sitecom 3070 */ |
2349 | + {USB_DEVICE(0x0DF6, 0x0047)}, /* Sitecom 3071 */ |
2350 | {USB_DEVICE(0x14B2, 0x3C12)}, /* AL 3070 */ |
2351 | {USB_DEVICE(0x18C5, 0x0012)}, /* Corega 3070 */ |
2352 | {USB_DEVICE(0x083A, 0x7511)}, /* Arcadyan 3070 */ |
2353 | + {USB_DEVICE(0x083A, 0xA701)}, /* SMC 3070 */ |
2354 | + {USB_DEVICE(0x083A, 0xA702)}, /* SMC 3072 */ |
2355 | {USB_DEVICE(0x1740, 0x9703)}, /* EnGenius 3070 */ |
2356 | {USB_DEVICE(0x1740, 0x9705)}, /* EnGenius 3071 */ |
2357 | {USB_DEVICE(0x1740, 0x9706)}, /* EnGenius 3072 */ |
2358 | + {USB_DEVICE(0x1740, 0x9707)}, /* EnGenius 3070 */ |
2359 | + {USB_DEVICE(0x1740, 0x9708)}, /* EnGenius 3071 */ |
2360 | + {USB_DEVICE(0x1740, 0x9709)}, /* EnGenius 3072 */ |
2361 | {USB_DEVICE(0x13D3, 0x3273)}, /* AzureWave 3070 */ |
2362 | + {USB_DEVICE(0x13D3, 0x3305)}, /* AzureWave 3070*/ |
2363 | {USB_DEVICE(0x1044, 0x800D)}, /* Gigabyte GN-WB32L 3070 */ |
2364 | {USB_DEVICE(0x2019, 0xAB25)}, /* Planex Communications, Inc. RT3070 */ |
2365 | {USB_DEVICE(0x07B8, 0x3070)}, /* AboCom 3070 */ |
2366 | @@ -132,14 +147,36 @@ struct usb_device_id rtusb_usb_id[] = { |
2367 | {USB_DEVICE(0x07D1, 0x3C0D)}, /* D-Link 3070 */ |
2368 | {USB_DEVICE(0x07D1, 0x3C0E)}, /* D-Link 3070 */ |
2369 | {USB_DEVICE(0x07D1, 0x3C0F)}, /* D-Link 3070 */ |
2370 | + {USB_DEVICE(0x07D1, 0x3C16)}, /* D-Link 3070 */ |
2371 | + {USB_DEVICE(0x07D1, 0x3C17)}, /* D-Link 8070 */ |
2372 | {USB_DEVICE(0x1D4D, 0x000C)}, /* Pegatron Corporation 3070 */ |
2373 | {USB_DEVICE(0x1D4D, 0x000E)}, /* Pegatron Corporation 3070 */ |
2374 | {USB_DEVICE(0x5A57, 0x5257)}, /* Zinwell 3070 */ |
2375 | {USB_DEVICE(0x5A57, 0x0283)}, /* Zinwell 3072 */ |
2376 | {USB_DEVICE(0x04BB, 0x0945)}, /* I-O DATA 3072 */ |
2377 | + {USB_DEVICE(0x04BB, 0x0947)}, /* I-O DATA 3070 */ |
2378 | + {USB_DEVICE(0x04BB, 0x0948)}, /* I-O DATA 3072 */ |
2379 | {USB_DEVICE(0x203D, 0x1480)}, /* Encore 3070 */ |
2380 | + {USB_DEVICE(0x20B8, 0x8888)}, /* PARA INDUSTRIAL 3070 */ |
2381 | + {USB_DEVICE(0x0B05, 0x1784)}, /* Asus 3072 */ |
2382 | + {USB_DEVICE(0x203D, 0x14A9)}, /* Encore 3070*/ |
2383 | + {USB_DEVICE(0x0DB0, 0x899A)}, /* MSI 3070*/ |
2384 | + {USB_DEVICE(0x0DB0, 0x3870)}, /* MSI 3070*/ |
2385 | + {USB_DEVICE(0x0DB0, 0x870A)}, /* MSI 3070*/ |
2386 | + {USB_DEVICE(0x0DB0, 0x6899)}, /* MSI 3070 */ |
2387 | + {USB_DEVICE(0x0DB0, 0x3822)}, /* MSI 3070 */ |
2388 | + {USB_DEVICE(0x0DB0, 0x3871)}, /* MSI 3070 */ |
2389 | + {USB_DEVICE(0x0DB0, 0x871A)}, /* MSI 3070 */ |
2390 | + {USB_DEVICE(0x0DB0, 0x822A)}, /* MSI 3070 */ |
2391 | + {USB_DEVICE(0x0DB0, 0x3821)}, /* Ralink 3070 */ |
2392 | + {USB_DEVICE(0x0DB0, 0x821A)}, /* Ralink 3070 */ |
2393 | + {USB_DEVICE(0x083A, 0xA703)}, /* IO-MAGIC */ |
2394 | + {USB_DEVICE(0x13D3, 0x3307)}, /* Azurewave */ |
2395 | + {USB_DEVICE(0x13D3, 0x3321)}, /* Azurewave */ |
2396 | + {USB_DEVICE(0x07FA, 0x7712)}, /* Edimax */ |
2397 | + {USB_DEVICE(0x0789, 0x0166)}, /* Edimax */ |
2398 | + {USB_DEVICE(0x148F, 0x2070)}, /* Edimax */ |
2399 | #endif /* RT3070 // */ |
2400 | - {USB_DEVICE(0x0DF6, 0x003F)}, /* Sitecom WL-608 */ |
2401 | {USB_DEVICE(0x1737, 0x0077)}, /* Linksys WUSB54GC-EU v3 */ |
2402 | {USB_DEVICE(0x2001, 0x3C09)}, /* D-Link */ |
2403 | {USB_DEVICE(0x2001, 0x3C0A)}, /* D-Link 3072 */ |
2404 | diff --git a/drivers/usb/atm/cxacru.c b/drivers/usb/atm/cxacru.c |
2405 | index c89990f..b24025d 100644 |
2406 | --- a/drivers/usb/atm/cxacru.c |
2407 | +++ b/drivers/usb/atm/cxacru.c |
2408 | @@ -1128,6 +1128,7 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, |
2409 | { |
2410 | struct cxacru_data *instance; |
2411 | struct usb_device *usb_dev = interface_to_usbdev(intf); |
2412 | + struct usb_host_endpoint *cmd_ep = usb_dev->ep_in[CXACRU_EP_CMD]; |
2413 | int ret; |
2414 | |
2415 | /* instance init */ |
2416 | @@ -1172,15 +1173,34 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance, |
2417 | goto fail; |
2418 | } |
2419 | |
2420 | - usb_fill_int_urb(instance->rcv_urb, |
2421 | + if (!cmd_ep) { |
2422 | + dbg("cxacru_bind: no command endpoint"); |
2423 | + ret = -ENODEV; |
2424 | + goto fail; |
2425 | + } |
2426 | + |
2427 | + if ((cmd_ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) |
2428 | + == USB_ENDPOINT_XFER_INT) { |
2429 | + usb_fill_int_urb(instance->rcv_urb, |
2430 | usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD), |
2431 | instance->rcv_buf, PAGE_SIZE, |
2432 | cxacru_blocking_completion, &instance->rcv_done, 1); |
2433 | |
2434 | - usb_fill_int_urb(instance->snd_urb, |
2435 | + usb_fill_int_urb(instance->snd_urb, |
2436 | usb_dev, usb_sndintpipe(usb_dev, CXACRU_EP_CMD), |
2437 | instance->snd_buf, PAGE_SIZE, |
2438 | cxacru_blocking_completion, &instance->snd_done, 4); |
2439 | + } else { |
2440 | + usb_fill_bulk_urb(instance->rcv_urb, |
2441 | + usb_dev, usb_rcvbulkpipe(usb_dev, CXACRU_EP_CMD), |
2442 | + instance->rcv_buf, PAGE_SIZE, |
2443 | + cxacru_blocking_completion, &instance->rcv_done); |
2444 | + |
2445 | + usb_fill_bulk_urb(instance->snd_urb, |
2446 | + usb_dev, usb_sndbulkpipe(usb_dev, CXACRU_EP_CMD), |
2447 | + instance->snd_buf, PAGE_SIZE, |
2448 | + cxacru_blocking_completion, &instance->snd_done); |
2449 | + } |
2450 | |
2451 | mutex_init(&instance->cm_serialize); |
2452 | |
2453 | diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c |
2454 | index 162c95a..a1aacb0 100644 |
2455 | --- a/drivers/usb/class/cdc-acm.c |
2456 | +++ b/drivers/usb/class/cdc-acm.c |
2457 | @@ -971,7 +971,8 @@ static int acm_probe(struct usb_interface *intf, |
2458 | } |
2459 | |
2460 | if (!buflen) { |
2461 | - if (intf->cur_altsetting->endpoint->extralen && |
2462 | + if (intf->cur_altsetting->endpoint && |
2463 | + intf->cur_altsetting->endpoint->extralen && |
2464 | intf->cur_altsetting->endpoint->extra) { |
2465 | dev_dbg(&intf->dev, |
2466 | "Seeking extra descriptors on endpoint\n"); |
2467 | @@ -1487,6 +1488,11 @@ static int acm_reset_resume(struct usb_interface *intf) |
2468 | USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \ |
2469 | USB_CDC_ACM_PROTO_VENDOR) |
2470 | |
2471 | +#define SAMSUNG_PCSUITE_ACM_INFO(x) \ |
2472 | + USB_DEVICE_AND_INTERFACE_INFO(0x04e7, x, \ |
2473 | + USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, \ |
2474 | + USB_CDC_ACM_PROTO_VENDOR) |
2475 | + |
2476 | /* |
2477 | * USB driver structure. |
2478 | */ |
2479 | @@ -1597,6 +1603,17 @@ static const struct usb_device_id acm_ids[] = { |
2480 | { NOKIA_PCSUITE_ACM_INFO(0x0108), }, /* Nokia 5320 XpressMusic 2G */ |
2481 | { NOKIA_PCSUITE_ACM_INFO(0x01f5), }, /* Nokia N97, RM-505 */ |
2482 | { NOKIA_PCSUITE_ACM_INFO(0x02e3), }, /* Nokia 5230, RM-588 */ |
2483 | + { NOKIA_PCSUITE_ACM_INFO(0x0178), }, /* Nokia E63 */ |
2484 | + { NOKIA_PCSUITE_ACM_INFO(0x010e), }, /* Nokia E75 */ |
2485 | + { NOKIA_PCSUITE_ACM_INFO(0x02d9), }, /* Nokia 6760 Slide */ |
2486 | + { NOKIA_PCSUITE_ACM_INFO(0x01d0), }, /* Nokia E52 */ |
2487 | + { NOKIA_PCSUITE_ACM_INFO(0x0223), }, /* Nokia E72 */ |
2488 | + { NOKIA_PCSUITE_ACM_INFO(0x0275), }, /* Nokia X6 */ |
2489 | + { NOKIA_PCSUITE_ACM_INFO(0x026c), }, /* Nokia N97 Mini */ |
2490 | + { NOKIA_PCSUITE_ACM_INFO(0x0154), }, /* Nokia 5800 XpressMusic */ |
2491 | + { NOKIA_PCSUITE_ACM_INFO(0x04ce), }, /* Nokia E90 */ |
2492 | + { NOKIA_PCSUITE_ACM_INFO(0x01d4), }, /* Nokia E55 */ |
2493 | + { SAMSUNG_PCSUITE_ACM_INFO(0x6651), }, /* Samsung GTi8510 (INNOV8) */ |
2494 | |
2495 | /* NOTE: non-Nokia COMM/ACM/0xff is likely MSFT RNDIS... NOT a modem! */ |
2496 | |
2497 | @@ -1605,6 +1622,10 @@ static const struct usb_device_id acm_ids[] = { |
2498 | .driver_info = NOT_A_MODEM, |
2499 | }, |
2500 | |
2501 | + /* control interfaces without any protocol set */ |
2502 | + { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
2503 | + USB_CDC_PROTO_NONE) }, |
2504 | + |
2505 | /* control interfaces with various AT-command sets */ |
2506 | { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, |
2507 | USB_CDC_ACM_PROTO_AT_V25TER) }, |
2508 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
2509 | index fd4c36e..844683e 100644 |
2510 | --- a/drivers/usb/core/message.c |
2511 | +++ b/drivers/usb/core/message.c |
2512 | @@ -1724,6 +1724,15 @@ free_interfaces: |
2513 | if (ret) |
2514 | goto free_interfaces; |
2515 | |
2516 | + /* if it's already configured, clear out old state first. |
2517 | + * getting rid of old interfaces means unbinding their drivers. |
2518 | + */ |
2519 | + if (dev->state != USB_STATE_ADDRESS) |
2520 | + usb_disable_device(dev, 1); /* Skip ep0 */ |
2521 | + |
2522 | + /* Get rid of pending async Set-Config requests for this device */ |
2523 | + cancel_async_set_config(dev); |
2524 | + |
2525 | /* Make sure we have bandwidth (and available HCD resources) for this |
2526 | * configuration. Remove endpoints from the schedule if we're dropping |
2527 | * this configuration to set configuration 0. After this point, the |
2528 | @@ -1733,20 +1742,11 @@ free_interfaces: |
2529 | mutex_lock(&hcd->bandwidth_mutex); |
2530 | ret = usb_hcd_alloc_bandwidth(dev, cp, NULL, NULL); |
2531 | if (ret < 0) { |
2532 | - usb_autosuspend_device(dev); |
2533 | mutex_unlock(&hcd->bandwidth_mutex); |
2534 | + usb_autosuspend_device(dev); |
2535 | goto free_interfaces; |
2536 | } |
2537 | |
2538 | - /* if it's already configured, clear out old state first. |
2539 | - * getting rid of old interfaces means unbinding their drivers. |
2540 | - */ |
2541 | - if (dev->state != USB_STATE_ADDRESS) |
2542 | - usb_disable_device(dev, 1); /* Skip ep0 */ |
2543 | - |
2544 | - /* Get rid of pending async Set-Config requests for this device */ |
2545 | - cancel_async_set_config(dev); |
2546 | - |
2547 | ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), |
2548 | USB_REQ_SET_CONFIGURATION, 0, configuration, 0, |
2549 | NULL, 0, USB_CTRL_SET_TIMEOUT); |
2550 | @@ -1761,8 +1761,8 @@ free_interfaces: |
2551 | if (!cp) { |
2552 | usb_set_device_state(dev, USB_STATE_ADDRESS); |
2553 | usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL); |
2554 | - usb_autosuspend_device(dev); |
2555 | mutex_unlock(&hcd->bandwidth_mutex); |
2556 | + usb_autosuspend_device(dev); |
2557 | goto free_interfaces; |
2558 | } |
2559 | mutex_unlock(&hcd->bandwidth_mutex); |
2560 | diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c |
2561 | index 5c0d06c..1043da1 100644 |
2562 | --- a/drivers/usb/gadget/rndis.c |
2563 | +++ b/drivers/usb/gadget/rndis.c |
2564 | @@ -292,9 +292,13 @@ gen_ndis_query_resp (int configNr, u32 OID, u8 *buf, unsigned buf_len, |
2565 | /* mandatory */ |
2566 | case OID_GEN_VENDOR_DESCRIPTION: |
2567 | pr_debug("%s: OID_GEN_VENDOR_DESCRIPTION\n", __func__); |
2568 | - length = strlen (rndis_per_dev_params [configNr].vendorDescr); |
2569 | - memcpy (outbuf, |
2570 | - rndis_per_dev_params [configNr].vendorDescr, length); |
2571 | + if ( rndis_per_dev_params [configNr].vendorDescr ) { |
2572 | + length = strlen (rndis_per_dev_params [configNr].vendorDescr); |
2573 | + memcpy (outbuf, |
2574 | + rndis_per_dev_params [configNr].vendorDescr, length); |
2575 | + } else { |
2576 | + outbuf[0] = 0; |
2577 | + } |
2578 | retval = 0; |
2579 | break; |
2580 | |
2581 | diff --git a/drivers/usb/host/ehci-ppc-of.c b/drivers/usb/host/ehci-ppc-of.c |
2582 | index 5aec928..a07cfd6 100644 |
2583 | --- a/drivers/usb/host/ehci-ppc-of.c |
2584 | +++ b/drivers/usb/host/ehci-ppc-of.c |
2585 | @@ -192,17 +192,19 @@ ehci_hcd_ppc_of_probe(struct of_device *op, const struct of_device_id *match) |
2586 | } |
2587 | |
2588 | rv = usb_add_hcd(hcd, irq, 0); |
2589 | - if (rv == 0) |
2590 | - return 0; |
2591 | + if (rv) |
2592 | + goto err_ehci; |
2593 | + |
2594 | + return 0; |
2595 | |
2596 | +err_ehci: |
2597 | + if (ehci->has_amcc_usb23) |
2598 | + iounmap(ehci->ohci_hcctrl_reg); |
2599 | iounmap(hcd->regs); |
2600 | err_ioremap: |
2601 | irq_dispose_mapping(irq); |
2602 | err_irq: |
2603 | release_mem_region(hcd->rsrc_start, hcd->rsrc_len); |
2604 | - |
2605 | - if (ehci->has_amcc_usb23) |
2606 | - iounmap(ehci->ohci_hcctrl_reg); |
2607 | err_rmr: |
2608 | usb_put_hcd(hcd); |
2609 | |
2610 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c |
2611 | index 80bf833..8ed6ff6 100644 |
2612 | --- a/drivers/usb/serial/cp210x.c |
2613 | +++ b/drivers/usb/serial/cp210x.c |
2614 | @@ -88,6 +88,7 @@ static const struct usb_device_id id_table[] = { |
2615 | { USB_DEVICE(0x10C4, 0x8149) }, /* West Mountain Radio Computerized Battery Analyzer */ |
2616 | { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */ |
2617 | { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */ |
2618 | + { USB_DEVICE(0x10C4, 0x8156) }, /* B&G H3000 link cable */ |
2619 | { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */ |
2620 | { USB_DEVICE(0x10C4, 0x818B) }, /* AVIT Research USB to TTL */ |
2621 | { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */ |
2622 | @@ -109,6 +110,7 @@ static const struct usb_device_id id_table[] = { |
2623 | { USB_DEVICE(0x10C4, 0x83A8) }, /* Amber Wireless AMB2560 */ |
2624 | { USB_DEVICE(0x10C4, 0x8411) }, /* Kyocera GPS Module */ |
2625 | { USB_DEVICE(0x10C4, 0x846E) }, /* BEI USB Sensor Interface (VCP) */ |
2626 | + { USB_DEVICE(0x10C4, 0x8477) }, /* Balluff RFID */ |
2627 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
2628 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
2629 | { USB_DEVICE(0x10C4, 0xEA71) }, /* Infinity GPS-MIC-1 Radio Monophone */ |
2630 | @@ -122,14 +124,14 @@ static const struct usb_device_id id_table[] = { |
2631 | { USB_DEVICE(0x1555, 0x0004) }, /* Owen AC4 USB-RS485 Converter */ |
2632 | { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */ |
2633 | { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */ |
2634 | - { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ |
2635 | - { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
2636 | - { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
2637 | - { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ |
2638 | { USB_DEVICE(0x16DC, 0x0010) }, /* W-IE-NE-R Plein & Baus GmbH PL512 Power Supply */ |
2639 | { USB_DEVICE(0x16DC, 0x0011) }, /* W-IE-NE-R Plein & Baus GmbH RCM Remote Control for MARATON Power Supply */ |
2640 | { USB_DEVICE(0x16DC, 0x0012) }, /* W-IE-NE-R Plein & Baus GmbH MPOD Multi Channel Power Supply */ |
2641 | { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML Control, Monitoring and Data Logger */ |
2642 | + { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */ |
2643 | + { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */ |
2644 | + { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */ |
2645 | + { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */ |
2646 | { } /* Terminating Entry */ |
2647 | }; |
2648 | |
2649 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c |
2650 | index 63ddb2f..0edf4b3 100644 |
2651 | --- a/drivers/usb/serial/ftdi_sio.c |
2652 | +++ b/drivers/usb/serial/ftdi_sio.c |
2653 | @@ -753,6 +753,14 @@ static struct usb_device_id id_table_combined [] = { |
2654 | { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) }, |
2655 | { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID), |
2656 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
2657 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_24_MASTER_WING_PID) }, |
2658 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_PC_WING_PID) }, |
2659 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_USB_DMX_PID) }, |
2660 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MIDI_TIMECODE_PID) }, |
2661 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MINI_WING_PID) }, |
2662 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MAXI_WING_PID) }, |
2663 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_MEDIA_WING_PID) }, |
2664 | + { USB_DEVICE(FTDI_VID, FTDI_CHAMSYS_WING_PID) }, |
2665 | { }, /* Optional parameter entry */ |
2666 | { } /* Terminating entry */ |
2667 | }; |
2668 | diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h |
2669 | index 2e95857..15a4583 100644 |
2670 | --- a/drivers/usb/serial/ftdi_sio_ids.h |
2671 | +++ b/drivers/usb/serial/ftdi_sio_ids.h |
2672 | @@ -135,6 +135,18 @@ |
2673 | #define FTDI_NDI_AURORA_SCU_PID 0xDA74 /* NDI Aurora SCU */ |
2674 | |
2675 | /* |
2676 | + * ChamSys Limited (www.chamsys.co.uk) USB wing/interface product IDs |
2677 | + */ |
2678 | +#define FTDI_CHAMSYS_24_MASTER_WING_PID 0xDAF8 |
2679 | +#define FTDI_CHAMSYS_PC_WING_PID 0xDAF9 |
2680 | +#define FTDI_CHAMSYS_USB_DMX_PID 0xDAFA |
2681 | +#define FTDI_CHAMSYS_MIDI_TIMECODE_PID 0xDAFB |
2682 | +#define FTDI_CHAMSYS_MINI_WING_PID 0xDAFC |
2683 | +#define FTDI_CHAMSYS_MAXI_WING_PID 0xDAFD |
2684 | +#define FTDI_CHAMSYS_MEDIA_WING_PID 0xDAFE |
2685 | +#define FTDI_CHAMSYS_WING_PID 0xDAFF |
2686 | + |
2687 | +/* |
2688 | * Westrex International devices submitted by Cory Lee |
2689 | */ |
2690 | #define FTDI_WESTREX_MODEL_777_PID 0xDC00 /* Model 777 */ |
2691 | diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c |
2692 | index 585b7e6..1c9b6e9 100644 |
2693 | --- a/drivers/usb/serial/mos7840.c |
2694 | +++ b/drivers/usb/serial/mos7840.c |
2695 | @@ -119,16 +119,20 @@ |
2696 | * by making a change here, in moschip_port_id_table, and in |
2697 | * moschip_id_table_combined |
2698 | */ |
2699 | -#define USB_VENDOR_ID_BANDB 0x0856 |
2700 | -#define BANDB_DEVICE_ID_USO9ML2_2 0xAC22 |
2701 | -#define BANDB_DEVICE_ID_USO9ML2_4 0xAC24 |
2702 | -#define BANDB_DEVICE_ID_US9ML2_2 0xAC29 |
2703 | -#define BANDB_DEVICE_ID_US9ML2_4 0xAC30 |
2704 | -#define BANDB_DEVICE_ID_USPTL4_2 0xAC31 |
2705 | -#define BANDB_DEVICE_ID_USPTL4_4 0xAC32 |
2706 | -#define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 |
2707 | -#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 |
2708 | -#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24 |
2709 | +#define USB_VENDOR_ID_BANDB 0x0856 |
2710 | +#define BANDB_DEVICE_ID_USO9ML2_2 0xAC22 |
2711 | +#define BANDB_DEVICE_ID_USO9ML2_2P 0xBC00 |
2712 | +#define BANDB_DEVICE_ID_USO9ML2_4 0xAC24 |
2713 | +#define BANDB_DEVICE_ID_USO9ML2_4P 0xBC01 |
2714 | +#define BANDB_DEVICE_ID_US9ML2_2 0xAC29 |
2715 | +#define BANDB_DEVICE_ID_US9ML2_4 0xAC30 |
2716 | +#define BANDB_DEVICE_ID_USPTL4_2 0xAC31 |
2717 | +#define BANDB_DEVICE_ID_USPTL4_4 0xAC32 |
2718 | +#define BANDB_DEVICE_ID_USOPTL4_2 0xAC42 |
2719 | +#define BANDB_DEVICE_ID_USOPTL4_2P 0xBC02 |
2720 | +#define BANDB_DEVICE_ID_USOPTL4_4 0xAC44 |
2721 | +#define BANDB_DEVICE_ID_USOPTL4_4P 0xBC03 |
2722 | +#define BANDB_DEVICE_ID_USOPTL2_4 0xAC24 |
2723 | |
2724 | /* This driver also supports |
2725 | * ATEN UC2324 device using Moschip MCS7840 |
2726 | @@ -184,13 +188,17 @@ static const struct usb_device_id moschip_port_id_table[] = { |
2727 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, |
2728 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
2729 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)}, |
2730 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P)}, |
2731 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4)}, |
2732 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P)}, |
2733 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2)}, |
2734 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4)}, |
2735 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2)}, |
2736 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)}, |
2737 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, |
2738 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)}, |
2739 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, |
2740 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)}, |
2741 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)}, |
2742 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, |
2743 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, |
2744 | @@ -201,13 +209,17 @@ static const struct usb_device_id moschip_id_table_combined[] __devinitconst = { |
2745 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7840)}, |
2746 | {USB_DEVICE(USB_VENDOR_ID_MOSCHIP, MOSCHIP_DEVICE_ID_7820)}, |
2747 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2)}, |
2748 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_2P)}, |
2749 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4)}, |
2750 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USO9ML2_4P)}, |
2751 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_2)}, |
2752 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_US9ML2_4)}, |
2753 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_2)}, |
2754 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USPTL4_4)}, |
2755 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2)}, |
2756 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_2P)}, |
2757 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4)}, |
2758 | + {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL4_4P)}, |
2759 | {USB_DEVICE(USB_VENDOR_ID_BANDB, BANDB_DEVICE_ID_USOPTL2_4)}, |
2760 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2324)}, |
2761 | {USB_DEVICE(USB_VENDOR_ID_ATENINTL, ATENINTL_DEVICE_ID_UC2322)}, |
2762 | diff --git a/drivers/xen/events.c b/drivers/xen/events.c |
2763 | index 28f133a..14ed358 100644 |
2764 | --- a/drivers/xen/events.c |
2765 | +++ b/drivers/xen/events.c |
2766 | @@ -107,6 +107,7 @@ static inline unsigned long *cpu_evtchn_mask(int cpu) |
2767 | #define VALID_EVTCHN(chn) ((chn) != 0) |
2768 | |
2769 | static struct irq_chip xen_dynamic_chip; |
2770 | +static struct irq_chip xen_percpu_chip; |
2771 | |
2772 | /* Constructor for packed IRQ information. */ |
2773 | static struct irq_info mk_unbound_info(void) |
2774 | @@ -363,7 +364,7 @@ int bind_evtchn_to_irq(unsigned int evtchn) |
2775 | irq = find_unbound_irq(); |
2776 | |
2777 | set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
2778 | - handle_level_irq, "event"); |
2779 | + handle_edge_irq, "event"); |
2780 | |
2781 | evtchn_to_irq[evtchn] = irq; |
2782 | irq_info[irq] = mk_evtchn_info(evtchn); |
2783 | @@ -389,8 +390,8 @@ static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu) |
2784 | if (irq < 0) |
2785 | goto out; |
2786 | |
2787 | - set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
2788 | - handle_level_irq, "ipi"); |
2789 | + set_irq_chip_and_handler_name(irq, &xen_percpu_chip, |
2790 | + handle_percpu_irq, "ipi"); |
2791 | |
2792 | bind_ipi.vcpu = cpu; |
2793 | if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi, |
2794 | @@ -430,8 +431,8 @@ static int bind_virq_to_irq(unsigned int virq, unsigned int cpu) |
2795 | |
2796 | irq = find_unbound_irq(); |
2797 | |
2798 | - set_irq_chip_and_handler_name(irq, &xen_dynamic_chip, |
2799 | - handle_level_irq, "virq"); |
2800 | + set_irq_chip_and_handler_name(irq, &xen_percpu_chip, |
2801 | + handle_percpu_irq, "virq"); |
2802 | |
2803 | evtchn_to_irq[evtchn] = irq; |
2804 | irq_info[irq] = mk_virq_info(evtchn, virq); |
2805 | @@ -934,6 +935,16 @@ static struct irq_chip xen_dynamic_chip __read_mostly = { |
2806 | .retrigger = retrigger_dynirq, |
2807 | }; |
2808 | |
2809 | +static struct irq_chip en_percpu_chip __read_mostly = { |
2810 | + .name = "xen-percpu", |
2811 | + |
2812 | + .disable = disable_dynirq, |
2813 | + .mask = disable_dynirq, |
2814 | + .unmask = enable_dynirq, |
2815 | + |
2816 | + .ack = ack_dynirq, |
2817 | +}; |
2818 | + |
2819 | void __init xen_init_IRQ(void) |
2820 | { |
2821 | int i; |
2822 | diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c |
2823 | index c4e8353..42b60b0 100644 |
2824 | --- a/fs/binfmt_misc.c |
2825 | +++ b/fs/binfmt_misc.c |
2826 | @@ -723,7 +723,7 @@ static int __init init_misc_binfmt(void) |
2827 | { |
2828 | int err = register_filesystem(&bm_fs_type); |
2829 | if (!err) { |
2830 | - err = register_binfmt(&misc_format); |
2831 | + err = insert_binfmt(&misc_format); |
2832 | if (err) |
2833 | unregister_filesystem(&bm_fs_type); |
2834 | } |
2835 | diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c |
2836 | index 2208f06..fa1039a 100644 |
2837 | --- a/fs/cifs/connect.c |
2838 | +++ b/fs/cifs/connect.c |
2839 | @@ -1647,9 +1647,6 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) |
2840 | if (ses) { |
2841 | cFYI(1, "Existing smb sess found (status=%d)", ses->status); |
2842 | |
2843 | - /* existing SMB ses has a server reference already */ |
2844 | - cifs_put_tcp_session(server); |
2845 | - |
2846 | mutex_lock(&ses->session_mutex); |
2847 | rc = cifs_negotiate_protocol(xid, ses); |
2848 | if (rc) { |
2849 | @@ -1672,6 +1669,9 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info) |
2850 | } |
2851 | } |
2852 | mutex_unlock(&ses->session_mutex); |
2853 | + |
2854 | + /* existing SMB ses has a server reference already */ |
2855 | + cifs_put_tcp_session(server); |
2856 | FreeXid(xid); |
2857 | return ses; |
2858 | } |
2859 | diff --git a/fs/direct-io.c b/fs/direct-io.c |
2860 | index 7600aac..458fdd3 100644 |
2861 | --- a/fs/direct-io.c |
2862 | +++ b/fs/direct-io.c |
2863 | @@ -218,7 +218,7 @@ static struct page *dio_get_page(struct dio *dio) |
2864 | * filesystems can use it to hold additional state between get_block calls and |
2865 | * dio_complete. |
2866 | */ |
2867 | -static int dio_complete(struct dio *dio, loff_t offset, int ret) |
2868 | +static int dio_complete(struct dio *dio, loff_t offset, int ret, bool is_async) |
2869 | { |
2870 | ssize_t transferred = 0; |
2871 | |
2872 | @@ -239,14 +239,6 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret) |
2873 | transferred = dio->i_size - offset; |
2874 | } |
2875 | |
2876 | - if (dio->end_io && dio->result) |
2877 | - dio->end_io(dio->iocb, offset, transferred, |
2878 | - dio->map_bh.b_private); |
2879 | - |
2880 | - if (dio->flags & DIO_LOCKING) |
2881 | - /* lockdep: non-owner release */ |
2882 | - up_read_non_owner(&dio->inode->i_alloc_sem); |
2883 | - |
2884 | if (ret == 0) |
2885 | ret = dio->page_errors; |
2886 | if (ret == 0) |
2887 | @@ -254,6 +246,17 @@ static int dio_complete(struct dio *dio, loff_t offset, int ret) |
2888 | if (ret == 0) |
2889 | ret = transferred; |
2890 | |
2891 | + if (dio->end_io && dio->result) { |
2892 | + dio->end_io(dio->iocb, offset, transferred, |
2893 | + dio->map_bh.b_private, ret, is_async); |
2894 | + } else if (is_async) { |
2895 | + aio_complete(dio->iocb, ret, 0); |
2896 | + } |
2897 | + |
2898 | + if (dio->flags & DIO_LOCKING) |
2899 | + /* lockdep: non-owner release */ |
2900 | + up_read_non_owner(&dio->inode->i_alloc_sem); |
2901 | + |
2902 | return ret; |
2903 | } |
2904 | |
2905 | @@ -277,8 +280,7 @@ static void dio_bio_end_aio(struct bio *bio, int error) |
2906 | spin_unlock_irqrestore(&dio->bio_lock, flags); |
2907 | |
2908 | if (remaining == 0) { |
2909 | - int ret = dio_complete(dio, dio->iocb->ki_pos, 0); |
2910 | - aio_complete(dio->iocb, ret, 0); |
2911 | + dio_complete(dio, dio->iocb->ki_pos, 0, true); |
2912 | kfree(dio); |
2913 | } |
2914 | } |
2915 | @@ -632,7 +634,7 @@ static int dio_send_cur_page(struct dio *dio) |
2916 | int ret = 0; |
2917 | |
2918 | if (dio->bio) { |
2919 | - loff_t cur_offset = dio->block_in_file << dio->blkbits; |
2920 | + loff_t cur_offset = dio->cur_page_fs_offset; |
2921 | loff_t bio_next_offset = dio->logical_offset_in_bio + |
2922 | dio->bio->bi_size; |
2923 | |
2924 | @@ -657,7 +659,7 @@ static int dio_send_cur_page(struct dio *dio) |
2925 | * Submit now if the underlying fs is about to perform a |
2926 | * metadata read |
2927 | */ |
2928 | - if (dio->boundary) |
2929 | + else if (dio->boundary) |
2930 | dio_bio_submit(dio); |
2931 | } |
2932 | |
2933 | @@ -1126,7 +1128,7 @@ direct_io_worker(int rw, struct kiocb *iocb, struct inode *inode, |
2934 | spin_unlock_irqrestore(&dio->bio_lock, flags); |
2935 | |
2936 | if (ret2 == 0) { |
2937 | - ret = dio_complete(dio, offset, ret); |
2938 | + ret = dio_complete(dio, offset, ret, false); |
2939 | kfree(dio); |
2940 | } else |
2941 | BUG_ON(ret != -EIOCBQUEUED); |
2942 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
2943 | index 19a4de5..4c9f05d 100644 |
2944 | --- a/fs/ext4/ext4.h |
2945 | +++ b/fs/ext4/ext4.h |
2946 | @@ -167,13 +167,15 @@ struct mpage_da_data { |
2947 | }; |
2948 | #define EXT4_IO_UNWRITTEN 0x1 |
2949 | typedef struct ext4_io_end { |
2950 | - struct list_head list; /* per-file finished AIO list */ |
2951 | + struct list_head list; /* per-file finished IO list */ |
2952 | struct inode *inode; /* file being written to */ |
2953 | unsigned int flag; /* unwritten or not */ |
2954 | struct page *page; /* page struct for buffer write */ |
2955 | loff_t offset; /* offset in the file */ |
2956 | ssize_t size; /* size of the extent */ |
2957 | struct work_struct work; /* data work queue */ |
2958 | + struct kiocb *iocb; /* iocb struct for AIO */ |
2959 | + int result; /* error value for AIO */ |
2960 | } ext4_io_end_t; |
2961 | |
2962 | /* |
2963 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
2964 | index 42272d6..3fb64b9 100644 |
2965 | --- a/fs/ext4/inode.c |
2966 | +++ b/fs/ext4/inode.c |
2967 | @@ -3668,6 +3668,8 @@ static int ext4_end_io_nolock(ext4_io_end_t *io) |
2968 | return ret; |
2969 | } |
2970 | |
2971 | + if (io->iocb) |
2972 | + aio_complete(io->iocb, io->result, 0); |
2973 | /* clear the DIO AIO unwritten flag */ |
2974 | io->flag = 0; |
2975 | return ret; |
2976 | @@ -3767,6 +3769,8 @@ static ext4_io_end_t *ext4_init_io_end (struct inode *inode, gfp_t flags) |
2977 | io->offset = 0; |
2978 | io->size = 0; |
2979 | io->page = NULL; |
2980 | + io->iocb = NULL; |
2981 | + io->result = 0; |
2982 | INIT_WORK(&io->work, ext4_end_io_work); |
2983 | INIT_LIST_HEAD(&io->list); |
2984 | } |
2985 | @@ -3775,7 +3779,8 @@ static ext4_io_end_t *ext4_init_io_end (struct inode *inode, gfp_t flags) |
2986 | } |
2987 | |
2988 | static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, |
2989 | - ssize_t size, void *private) |
2990 | + ssize_t size, void *private, int ret, |
2991 | + bool is_async) |
2992 | { |
2993 | ext4_io_end_t *io_end = iocb->private; |
2994 | struct workqueue_struct *wq; |
2995 | @@ -3784,7 +3789,7 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, |
2996 | |
2997 | /* if not async direct IO or dio with 0 bytes write, just return */ |
2998 | if (!io_end || !size) |
2999 | - return; |
3000 | + goto out; |
3001 | |
3002 | ext_debug("ext4_end_io_dio(): io_end 0x%p" |
3003 | "for inode %lu, iocb 0x%p, offset %llu, size %llu\n", |
3004 | @@ -3795,12 +3800,18 @@ static void ext4_end_io_dio(struct kiocb *iocb, loff_t offset, |
3005 | if (io_end->flag != EXT4_IO_UNWRITTEN){ |
3006 | ext4_free_io_end(io_end); |
3007 | iocb->private = NULL; |
3008 | +out: |
3009 | + if (is_async) |
3010 | + aio_complete(iocb, ret, 0); |
3011 | return; |
3012 | } |
3013 | |
3014 | io_end->offset = offset; |
3015 | io_end->size = size; |
3016 | - io_end->flag = EXT4_IO_UNWRITTEN; |
3017 | + if (is_async) { |
3018 | + io_end->iocb = iocb; |
3019 | + io_end->result = ret; |
3020 | + } |
3021 | wq = EXT4_SB(io_end->inode->i_sb)->dio_unwritten_wq; |
3022 | |
3023 | /* queue the work to convert unwritten extents to written */ |
3024 | diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c |
3025 | index 9424796..e5cdabf 100644 |
3026 | --- a/fs/fuse/dev.c |
3027 | +++ b/fs/fuse/dev.c |
3028 | @@ -1552,6 +1552,14 @@ __acquires(&fc->lock) |
3029 | } |
3030 | } |
3031 | |
3032 | +static void end_queued_requests(struct fuse_conn *fc) |
3033 | +{ |
3034 | + fc->max_background = UINT_MAX; |
3035 | + flush_bg_queue(fc); |
3036 | + end_requests(fc, &fc->pending); |
3037 | + end_requests(fc, &fc->processing); |
3038 | +} |
3039 | + |
3040 | /* |
3041 | * Abort all requests. |
3042 | * |
3043 | @@ -1578,8 +1586,7 @@ void fuse_abort_conn(struct fuse_conn *fc) |
3044 | fc->connected = 0; |
3045 | fc->blocked = 0; |
3046 | end_io_requests(fc); |
3047 | - end_requests(fc, &fc->pending); |
3048 | - end_requests(fc, &fc->processing); |
3049 | + end_queued_requests(fc); |
3050 | wake_up_all(&fc->waitq); |
3051 | wake_up_all(&fc->blocked_waitq); |
3052 | kill_fasync(&fc->fasync, SIGIO, POLL_IN); |
3053 | @@ -1594,8 +1601,9 @@ int fuse_dev_release(struct inode *inode, struct file *file) |
3054 | if (fc) { |
3055 | spin_lock(&fc->lock); |
3056 | fc->connected = 0; |
3057 | - end_requests(fc, &fc->pending); |
3058 | - end_requests(fc, &fc->processing); |
3059 | + fc->blocked = 0; |
3060 | + end_queued_requests(fc); |
3061 | + wake_up_all(&fc->blocked_waitq); |
3062 | spin_unlock(&fc->lock); |
3063 | fuse_conn_put(fc); |
3064 | } |
3065 | diff --git a/fs/minix/namei.c b/fs/minix/namei.c |
3066 | index e20ee85..f3f3578 100644 |
3067 | --- a/fs/minix/namei.c |
3068 | +++ b/fs/minix/namei.c |
3069 | @@ -115,7 +115,7 @@ static int minix_mkdir(struct inode * dir, struct dentry *dentry, int mode) |
3070 | |
3071 | inode_inc_link_count(dir); |
3072 | |
3073 | - inode = minix_new_inode(dir, mode, &err); |
3074 | + inode = minix_new_inode(dir, S_IFDIR | mode, &err); |
3075 | if (!inode) |
3076 | goto out_dir; |
3077 | |
3078 | diff --git a/fs/nfs/client.c b/fs/nfs/client.c |
3079 | index d25b525..e006770 100644 |
3080 | --- a/fs/nfs/client.c |
3081 | +++ b/fs/nfs/client.c |
3082 | @@ -274,7 +274,7 @@ static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, |
3083 | sin1->sin6_scope_id != sin2->sin6_scope_id) |
3084 | return 0; |
3085 | |
3086 | - return ipv6_addr_equal(&sin1->sin6_addr, &sin1->sin6_addr); |
3087 | + return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr); |
3088 | } |
3089 | #else /* !defined(CONFIG_IPV6) && !defined(CONFIG_IPV6_MODULE) */ |
3090 | static int nfs_sockaddr_match_ipaddr6(const struct sockaddr *sa1, |
3091 | diff --git a/fs/nfs/super.c b/fs/nfs/super.c |
3092 | index 6bf11d7..381d929 100644 |
3093 | --- a/fs/nfs/super.c |
3094 | +++ b/fs/nfs/super.c |
3095 | @@ -431,7 +431,15 @@ static int nfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
3096 | goto out_err; |
3097 | |
3098 | error = server->nfs_client->rpc_ops->statfs(server, fh, &res); |
3099 | + if (unlikely(error == -ESTALE)) { |
3100 | + struct dentry *pd_dentry; |
3101 | |
3102 | + pd_dentry = dget_parent(dentry); |
3103 | + if (pd_dentry != NULL) { |
3104 | + nfs_zap_caches(pd_dentry->d_inode); |
3105 | + dput(pd_dentry); |
3106 | + } |
3107 | + } |
3108 | nfs_free_fattr(res.fattr); |
3109 | if (error < 0) |
3110 | goto out_err; |
3111 | diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c |
3112 | index 356e976..96337a4 100644 |
3113 | --- a/fs/ocfs2/aops.c |
3114 | +++ b/fs/ocfs2/aops.c |
3115 | @@ -578,7 +578,9 @@ bail: |
3116 | static void ocfs2_dio_end_io(struct kiocb *iocb, |
3117 | loff_t offset, |
3118 | ssize_t bytes, |
3119 | - void *private) |
3120 | + void *private, |
3121 | + int ret, |
3122 | + bool is_async) |
3123 | { |
3124 | struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode; |
3125 | int level; |
3126 | @@ -592,6 +594,9 @@ static void ocfs2_dio_end_io(struct kiocb *iocb, |
3127 | if (!level) |
3128 | up_read(&inode->i_alloc_sem); |
3129 | ocfs2_rw_unlock(inode, level); |
3130 | + |
3131 | + if (is_async) |
3132 | + aio_complete(iocb, ret, 0); |
3133 | } |
3134 | |
3135 | /* |
3136 | diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c |
3137 | index abb0a95..201e7bc 100644 |
3138 | --- a/fs/ocfs2/inode.c |
3139 | +++ b/fs/ocfs2/inode.c |
3140 | @@ -488,7 +488,11 @@ static int ocfs2_read_locked_inode(struct inode *inode, |
3141 | OCFS2_BH_IGNORE_CACHE); |
3142 | } else { |
3143 | status = ocfs2_read_blocks_sync(osb, args->fi_blkno, 1, &bh); |
3144 | - if (!status) |
3145 | + /* |
3146 | + * If buffer is in jbd, then its checksum may not have been |
3147 | + * computed as yet. |
3148 | + */ |
3149 | + if (!status && !buffer_jbd(bh)) |
3150 | status = ocfs2_validate_inode_block(osb->sb, bh); |
3151 | } |
3152 | if (status < 0) { |
3153 | diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c |
3154 | index 1beaa73..cd79684 100644 |
3155 | --- a/fs/sysfs/file.c |
3156 | +++ b/fs/sysfs/file.c |
3157 | @@ -340,7 +340,7 @@ static int sysfs_open_file(struct inode *inode, struct file *file) |
3158 | char *p; |
3159 | |
3160 | p = d_path(&file->f_path, last_sysfs_file, sizeof(last_sysfs_file)); |
3161 | - if (p) |
3162 | + if (!IS_ERR(p)) |
3163 | memmove(last_sysfs_file, p, strlen(p) + 1); |
3164 | |
3165 | /* need attr_sd for attr and ops, its parent for kobj */ |
3166 | diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c |
3167 | index 34640d6..f9f5567 100644 |
3168 | --- a/fs/xfs/linux-2.6/xfs_aops.c |
3169 | +++ b/fs/xfs/linux-2.6/xfs_aops.c |
3170 | @@ -275,8 +275,11 @@ xfs_end_io( |
3171 | xfs_finish_ioend(ioend, 0); |
3172 | /* ensure we don't spin on blocked ioends */ |
3173 | delay(1); |
3174 | - } else |
3175 | + } else { |
3176 | + if (ioend->io_iocb) |
3177 | + aio_complete(ioend->io_iocb, ioend->io_result, 0); |
3178 | xfs_destroy_ioend(ioend); |
3179 | + } |
3180 | } |
3181 | |
3182 | /* |
3183 | @@ -309,6 +312,8 @@ xfs_alloc_ioend( |
3184 | atomic_inc(&XFS_I(ioend->io_inode)->i_iocount); |
3185 | ioend->io_offset = 0; |
3186 | ioend->io_size = 0; |
3187 | + ioend->io_iocb = NULL; |
3188 | + ioend->io_result = 0; |
3189 | |
3190 | INIT_WORK(&ioend->io_work, xfs_end_io); |
3191 | return ioend; |
3192 | @@ -1599,9 +1604,12 @@ xfs_end_io_direct( |
3193 | struct kiocb *iocb, |
3194 | loff_t offset, |
3195 | ssize_t size, |
3196 | - void *private) |
3197 | + void *private, |
3198 | + int ret, |
3199 | + bool is_async) |
3200 | { |
3201 | xfs_ioend_t *ioend = iocb->private; |
3202 | + bool complete_aio = is_async; |
3203 | |
3204 | /* |
3205 | * Non-NULL private data means we need to issue a transaction to |
3206 | @@ -1627,7 +1635,14 @@ xfs_end_io_direct( |
3207 | if (ioend->io_type == IO_READ) { |
3208 | xfs_finish_ioend(ioend, 0); |
3209 | } else if (private && size > 0) { |
3210 | - xfs_finish_ioend(ioend, is_sync_kiocb(iocb)); |
3211 | + if (is_async) { |
3212 | + ioend->io_iocb = iocb; |
3213 | + ioend->io_result = ret; |
3214 | + complete_aio = false; |
3215 | + xfs_finish_ioend(ioend, 0); |
3216 | + } else { |
3217 | + xfs_finish_ioend(ioend, 1); |
3218 | + } |
3219 | } else { |
3220 | /* |
3221 | * A direct I/O write ioend starts it's life in unwritten |
3222 | @@ -1645,6 +1660,9 @@ xfs_end_io_direct( |
3223 | * against double-freeing. |
3224 | */ |
3225 | iocb->private = NULL; |
3226 | + |
3227 | + if (complete_aio) |
3228 | + aio_complete(iocb, ret, 0); |
3229 | } |
3230 | |
3231 | STATIC ssize_t |
3232 | diff --git a/fs/xfs/linux-2.6/xfs_aops.h b/fs/xfs/linux-2.6/xfs_aops.h |
3233 | index 4cfc6ea..9f566d9 100644 |
3234 | --- a/fs/xfs/linux-2.6/xfs_aops.h |
3235 | +++ b/fs/xfs/linux-2.6/xfs_aops.h |
3236 | @@ -37,6 +37,8 @@ typedef struct xfs_ioend { |
3237 | size_t io_size; /* size of the extent */ |
3238 | xfs_off_t io_offset; /* offset in the file */ |
3239 | struct work_struct io_work; /* xfsdatad work queue */ |
3240 | + struct kiocb *io_iocb; |
3241 | + int io_result; |
3242 | } xfs_ioend_t; |
3243 | |
3244 | extern const struct address_space_operations xfs_address_space_operations; |
3245 | diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c |
3246 | index c7142a0..eb779af 100644 |
3247 | --- a/fs/xfs/xfs_ialloc.c |
3248 | +++ b/fs/xfs/xfs_ialloc.c |
3249 | @@ -1217,7 +1217,6 @@ xfs_imap_lookup( |
3250 | struct xfs_inobt_rec_incore rec; |
3251 | struct xfs_btree_cur *cur; |
3252 | struct xfs_buf *agbp; |
3253 | - xfs_agino_t startino; |
3254 | int error; |
3255 | int i; |
3256 | |
3257 | @@ -1231,13 +1230,13 @@ xfs_imap_lookup( |
3258 | } |
3259 | |
3260 | /* |
3261 | - * derive and lookup the exact inode record for the given agino. If the |
3262 | - * record cannot be found, then it's an invalid inode number and we |
3263 | - * should abort. |
3264 | + * Lookup the inode record for the given agino. If the record cannot be |
3265 | + * found, then it's an invalid inode number and we should abort. Once |
3266 | + * we have a record, we need to ensure it contains the inode number |
3267 | + * we are looking up. |
3268 | */ |
3269 | cur = xfs_inobt_init_cursor(mp, tp, agbp, agno); |
3270 | - startino = agino & ~(XFS_IALLOC_INODES(mp) - 1); |
3271 | - error = xfs_inobt_lookup(cur, startino, XFS_LOOKUP_EQ, &i); |
3272 | + error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i); |
3273 | if (!error) { |
3274 | if (i) |
3275 | error = xfs_inobt_get_rec(cur, &rec, &i); |
3276 | @@ -1250,6 +1249,11 @@ xfs_imap_lookup( |
3277 | if (error) |
3278 | return error; |
3279 | |
3280 | + /* check that the returned record contains the required inode */ |
3281 | + if (rec.ir_startino > agino || |
3282 | + rec.ir_startino + XFS_IALLOC_INODES(mp) <= agino) |
3283 | + return EINVAL; |
3284 | + |
3285 | /* for untrusted inodes check it is allocated first */ |
3286 | if ((flags & XFS_IGET_UNTRUSTED) && |
3287 | (rec.ir_free & XFS_INOBT_MASK(agino - rec.ir_startino))) |
3288 | diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c |
3289 | index b76a829..f702218 100644 |
3290 | --- a/fs/xfs/xfs_inode.c |
3291 | +++ b/fs/xfs/xfs_inode.c |
3292 | @@ -1927,6 +1927,11 @@ xfs_iunlink_remove( |
3293 | return 0; |
3294 | } |
3295 | |
3296 | +/* |
3297 | + * A big issue when freeing the inode cluster is is that we _cannot_ skip any |
3298 | + * inodes that are in memory - they all must be marked stale and attached to |
3299 | + * the cluster buffer. |
3300 | + */ |
3301 | STATIC void |
3302 | xfs_ifree_cluster( |
3303 | xfs_inode_t *free_ip, |
3304 | @@ -1958,8 +1963,6 @@ xfs_ifree_cluster( |
3305 | } |
3306 | |
3307 | for (j = 0; j < nbufs; j++, inum += ninodes) { |
3308 | - int found = 0; |
3309 | - |
3310 | blkno = XFS_AGB_TO_DADDR(mp, XFS_INO_TO_AGNO(mp, inum), |
3311 | XFS_INO_TO_AGBNO(mp, inum)); |
3312 | |
3313 | @@ -1978,7 +1981,9 @@ xfs_ifree_cluster( |
3314 | /* |
3315 | * Walk the inodes already attached to the buffer and mark them |
3316 | * stale. These will all have the flush locks held, so an |
3317 | - * in-memory inode walk can't lock them. |
3318 | + * in-memory inode walk can't lock them. By marking them all |
3319 | + * stale first, we will not attempt to lock them in the loop |
3320 | + * below as the XFS_ISTALE flag will be set. |
3321 | */ |
3322 | lip = XFS_BUF_FSPRIVATE(bp, xfs_log_item_t *); |
3323 | while (lip) { |
3324 | @@ -1990,11 +1995,11 @@ xfs_ifree_cluster( |
3325 | &iip->ili_flush_lsn, |
3326 | &iip->ili_item.li_lsn); |
3327 | xfs_iflags_set(iip->ili_inode, XFS_ISTALE); |
3328 | - found++; |
3329 | } |
3330 | lip = lip->li_bio_list; |
3331 | } |
3332 | |
3333 | + |
3334 | /* |
3335 | * For each inode in memory attempt to add it to the inode |
3336 | * buffer and set it up for being staled on buffer IO |
3337 | @@ -2006,6 +2011,7 @@ xfs_ifree_cluster( |
3338 | * even trying to lock them. |
3339 | */ |
3340 | for (i = 0; i < ninodes; i++) { |
3341 | +retry: |
3342 | read_lock(&pag->pag_ici_lock); |
3343 | ip = radix_tree_lookup(&pag->pag_ici_root, |
3344 | XFS_INO_TO_AGINO(mp, (inum + i))); |
3345 | @@ -2016,38 +2022,36 @@ xfs_ifree_cluster( |
3346 | continue; |
3347 | } |
3348 | |
3349 | - /* don't try to lock/unlock the current inode */ |
3350 | + /* |
3351 | + * Don't try to lock/unlock the current inode, but we |
3352 | + * _cannot_ skip the other inodes that we did not find |
3353 | + * in the list attached to the buffer and are not |
3354 | + * already marked stale. If we can't lock it, back off |
3355 | + * and retry. |
3356 | + */ |
3357 | if (ip != free_ip && |
3358 | !xfs_ilock_nowait(ip, XFS_ILOCK_EXCL)) { |
3359 | read_unlock(&pag->pag_ici_lock); |
3360 | - continue; |
3361 | + delay(1); |
3362 | + goto retry; |
3363 | } |
3364 | read_unlock(&pag->pag_ici_lock); |
3365 | |
3366 | - if (!xfs_iflock_nowait(ip)) { |
3367 | - if (ip != free_ip) |
3368 | - xfs_iunlock(ip, XFS_ILOCK_EXCL); |
3369 | - continue; |
3370 | - } |
3371 | - |
3372 | + xfs_iflock(ip); |
3373 | xfs_iflags_set(ip, XFS_ISTALE); |
3374 | - if (xfs_inode_clean(ip)) { |
3375 | - ASSERT(ip != free_ip); |
3376 | - xfs_ifunlock(ip); |
3377 | - xfs_iunlock(ip, XFS_ILOCK_EXCL); |
3378 | - continue; |
3379 | - } |
3380 | |
3381 | + /* |
3382 | + * we don't need to attach clean inodes or those only |
3383 | + * with unlogged changes (which we throw away, anyway). |
3384 | + */ |
3385 | iip = ip->i_itemp; |
3386 | - if (!iip) { |
3387 | - /* inode with unlogged changes only */ |
3388 | + if (!iip || xfs_inode_clean(ip)) { |
3389 | ASSERT(ip != free_ip); |
3390 | ip->i_update_core = 0; |
3391 | xfs_ifunlock(ip); |
3392 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
3393 | continue; |
3394 | } |
3395 | - found++; |
3396 | |
3397 | iip->ili_last_fields = iip->ili_format.ilf_fields; |
3398 | iip->ili_format.ilf_fields = 0; |
3399 | @@ -2063,8 +2067,7 @@ xfs_ifree_cluster( |
3400 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
3401 | } |
3402 | |
3403 | - if (found) |
3404 | - xfs_trans_stale_inode_buf(tp, bp); |
3405 | + xfs_trans_stale_inode_buf(tp, bp); |
3406 | xfs_trans_binval(tp, bp); |
3407 | } |
3408 | |
3409 | diff --git a/include/linux/compat.h b/include/linux/compat.h |
3410 | index 168f7da..c766441 100644 |
3411 | --- a/include/linux/compat.h |
3412 | +++ b/include/linux/compat.h |
3413 | @@ -360,5 +360,8 @@ extern ssize_t compat_rw_copy_check_uvector(int type, |
3414 | const struct compat_iovec __user *uvector, unsigned long nr_segs, |
3415 | unsigned long fast_segs, struct iovec *fast_pointer, |
3416 | struct iovec **ret_pointer); |
3417 | + |
3418 | +extern void __user *compat_alloc_user_space(unsigned long len); |
3419 | + |
3420 | #endif /* CONFIG_COMPAT */ |
3421 | #endif /* _LINUX_COMPAT_H */ |
3422 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
3423 | index f0f447a..509ca14 100644 |
3424 | --- a/include/linux/fs.h |
3425 | +++ b/include/linux/fs.h |
3426 | @@ -416,7 +416,8 @@ struct buffer_head; |
3427 | typedef int (get_block_t)(struct inode *inode, sector_t iblock, |
3428 | struct buffer_head *bh_result, int create); |
3429 | typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, |
3430 | - ssize_t bytes, void *private); |
3431 | + ssize_t bytes, void *private, int ret, |
3432 | + bool is_async); |
3433 | |
3434 | /* |
3435 | * Attribute flags. These should be or-ed together to figure out what |
3436 | diff --git a/include/linux/libata.h b/include/linux/libata.h |
3437 | index b85f3ff..8a9b4cf 100644 |
3438 | --- a/include/linux/libata.h |
3439 | +++ b/include/linux/libata.h |
3440 | @@ -335,6 +335,7 @@ enum { |
3441 | ATA_EHI_HOTPLUGGED = (1 << 0), /* could have been hotplugged */ |
3442 | ATA_EHI_NO_AUTOPSY = (1 << 2), /* no autopsy */ |
3443 | ATA_EHI_QUIET = (1 << 3), /* be quiet */ |
3444 | + ATA_EHI_NO_RECOVERY = (1 << 4), /* no recovery */ |
3445 | |
3446 | ATA_EHI_DID_SOFTRESET = (1 << 16), /* already soft-reset this port */ |
3447 | ATA_EHI_DID_HARDRESET = (1 << 17), /* already soft-reset this port */ |
3448 | diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h |
3449 | index f65913c..513ff03 100644 |
3450 | --- a/include/linux/mmc/host.h |
3451 | +++ b/include/linux/mmc/host.h |
3452 | @@ -124,6 +124,7 @@ struct mmc_host { |
3453 | unsigned int f_min; |
3454 | unsigned int f_max; |
3455 | u32 ocr_avail; |
3456 | + struct notifier_block pm_notify; |
3457 | |
3458 | #define MMC_VDD_165_195 0x00000080 /* VDD voltage 1.65 - 1.95 */ |
3459 | #define MMC_VDD_20_21 0x00000100 /* VDD voltage 2.0 ~ 2.1 */ |
3460 | @@ -183,6 +184,7 @@ struct mmc_host { |
3461 | |
3462 | /* Only used with MMC_CAP_DISABLE */ |
3463 | int enabled; /* host is enabled */ |
3464 | + int rescan_disable; /* disable card detection */ |
3465 | int nesting_cnt; /* "enable" nesting count */ |
3466 | int en_dis_recurs; /* detect recursion */ |
3467 | unsigned int disable_delay; /* disable delay in msecs */ |
3468 | @@ -257,6 +259,7 @@ int mmc_card_can_sleep(struct mmc_host *host); |
3469 | int mmc_host_enable(struct mmc_host *host); |
3470 | int mmc_host_disable(struct mmc_host *host); |
3471 | int mmc_host_lazy_disable(struct mmc_host *host); |
3472 | +int mmc_pm_notify(struct notifier_block *notify_block, unsigned long, void *); |
3473 | |
3474 | static inline void mmc_set_disable_delay(struct mmc_host *host, |
3475 | unsigned int disable_delay) |
3476 | diff --git a/include/linux/msi.h b/include/linux/msi.h |
3477 | index 6991ab5..91b05c1 100644 |
3478 | --- a/include/linux/msi.h |
3479 | +++ b/include/linux/msi.h |
3480 | @@ -14,8 +14,10 @@ struct irq_desc; |
3481 | extern void mask_msi_irq(unsigned int irq); |
3482 | extern void unmask_msi_irq(unsigned int irq); |
3483 | extern void read_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); |
3484 | +extern void get_cached_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); |
3485 | extern void write_msi_msg_desc(struct irq_desc *desc, struct msi_msg *msg); |
3486 | extern void read_msi_msg(unsigned int irq, struct msi_msg *msg); |
3487 | +extern void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); |
3488 | extern void write_msi_msg(unsigned int irq, struct msi_msg *msg); |
3489 | |
3490 | struct msi_desc { |
3491 | diff --git a/include/linux/swap.h b/include/linux/swap.h |
3492 | index ff4acea..11c1e47 100644 |
3493 | --- a/include/linux/swap.h |
3494 | +++ b/include/linux/swap.h |
3495 | @@ -19,6 +19,7 @@ struct bio; |
3496 | #define SWAP_FLAG_PREFER 0x8000 /* set if swap priority specified */ |
3497 | #define SWAP_FLAG_PRIO_MASK 0x7fff |
3498 | #define SWAP_FLAG_PRIO_SHIFT 0 |
3499 | +#define SWAP_FLAG_DISCARD 0x10000 /* discard swap cluster after use */ |
3500 | |
3501 | static inline int current_is_kswapd(void) |
3502 | { |
3503 | @@ -142,7 +143,7 @@ struct swap_extent { |
3504 | enum { |
3505 | SWP_USED = (1 << 0), /* is slot in swap_info[] used? */ |
3506 | SWP_WRITEOK = (1 << 1), /* ok to write to this swap? */ |
3507 | - SWP_DISCARDABLE = (1 << 2), /* blkdev supports discard */ |
3508 | + SWP_DISCARDABLE = (1 << 2), /* swapon+blkdev support discard */ |
3509 | SWP_DISCARDING = (1 << 3), /* now discarding a free cluster */ |
3510 | SWP_SOLIDSTATE = (1 << 4), /* blkdev seeks are cheap */ |
3511 | SWP_CONTINUED = (1 << 5), /* swap_map has count continuation */ |
3512 | diff --git a/kernel/compat.c b/kernel/compat.c |
3513 | index 5adab05..91b33fb 100644 |
3514 | --- a/kernel/compat.c |
3515 | +++ b/kernel/compat.c |
3516 | @@ -1137,3 +1137,24 @@ compat_sys_sysinfo(struct compat_sysinfo __user *info) |
3517 | |
3518 | return 0; |
3519 | } |
3520 | + |
3521 | +/* |
3522 | + * Allocate user-space memory for the duration of a single system call, |
3523 | + * in order to marshall parameters inside a compat thunk. |
3524 | + */ |
3525 | +void __user *compat_alloc_user_space(unsigned long len) |
3526 | +{ |
3527 | + void __user *ptr; |
3528 | + |
3529 | + /* If len would occupy more than half of the entire compat space... */ |
3530 | + if (unlikely(len > (((compat_uptr_t)~0) >> 1))) |
3531 | + return NULL; |
3532 | + |
3533 | + ptr = arch_compat_alloc_user_space(len); |
3534 | + |
3535 | + if (unlikely(!access_ok(VERIFY_WRITE, ptr, len))) |
3536 | + return NULL; |
3537 | + |
3538 | + return ptr; |
3539 | +} |
3540 | +EXPORT_SYMBOL_GPL(compat_alloc_user_space); |
3541 | diff --git a/kernel/gcov/fs.c b/kernel/gcov/fs.c |
3542 | index ef3c3f8..f83972b 100644 |
3543 | --- a/kernel/gcov/fs.c |
3544 | +++ b/kernel/gcov/fs.c |
3545 | @@ -33,10 +33,11 @@ |
3546 | * @children: child nodes |
3547 | * @all: list head for list of all nodes |
3548 | * @parent: parent node |
3549 | - * @info: associated profiling data structure if not a directory |
3550 | - * @ghost: when an object file containing profiling data is unloaded we keep a |
3551 | - * copy of the profiling data here to allow collecting coverage data |
3552 | - * for cleanup code. Such a node is called a "ghost". |
3553 | + * @loaded_info: array of pointers to profiling data sets for loaded object |
3554 | + * files. |
3555 | + * @num_loaded: number of profiling data sets for loaded object files. |
3556 | + * @unloaded_info: accumulated copy of profiling data sets for unloaded |
3557 | + * object files. Used only when gcov_persist=1. |
3558 | * @dentry: main debugfs entry, either a directory or data file |
3559 | * @links: associated symbolic links |
3560 | * @name: data file basename |
3561 | @@ -51,10 +52,11 @@ struct gcov_node { |
3562 | struct list_head children; |
3563 | struct list_head all; |
3564 | struct gcov_node *parent; |
3565 | - struct gcov_info *info; |
3566 | - struct gcov_info *ghost; |
3567 | + struct gcov_info **loaded_info; |
3568 | + struct gcov_info *unloaded_info; |
3569 | struct dentry *dentry; |
3570 | struct dentry **links; |
3571 | + int num_loaded; |
3572 | char name[0]; |
3573 | }; |
3574 | |
3575 | @@ -136,16 +138,37 @@ static const struct seq_operations gcov_seq_ops = { |
3576 | }; |
3577 | |
3578 | /* |
3579 | - * Return the profiling data set for a given node. This can either be the |
3580 | - * original profiling data structure or a duplicate (also called "ghost") |
3581 | - * in case the associated object file has been unloaded. |
3582 | + * Return a profiling data set associated with the given node. This is |
3583 | + * either a data set for a loaded object file or a data set copy in case |
3584 | + * all associated object files have been unloaded. |
3585 | */ |
3586 | static struct gcov_info *get_node_info(struct gcov_node *node) |
3587 | { |
3588 | - if (node->info) |
3589 | - return node->info; |
3590 | + if (node->num_loaded > 0) |
3591 | + return node->loaded_info[0]; |
3592 | |
3593 | - return node->ghost; |
3594 | + return node->unloaded_info; |
3595 | +} |
3596 | + |
3597 | +/* |
3598 | + * Return a newly allocated profiling data set which contains the sum of |
3599 | + * all profiling data associated with the given node. |
3600 | + */ |
3601 | +static struct gcov_info *get_accumulated_info(struct gcov_node *node) |
3602 | +{ |
3603 | + struct gcov_info *info; |
3604 | + int i = 0; |
3605 | + |
3606 | + if (node->unloaded_info) |
3607 | + info = gcov_info_dup(node->unloaded_info); |
3608 | + else |
3609 | + info = gcov_info_dup(node->loaded_info[i++]); |
3610 | + if (!info) |
3611 | + return NULL; |
3612 | + for (; i < node->num_loaded; i++) |
3613 | + gcov_info_add(info, node->loaded_info[i]); |
3614 | + |
3615 | + return info; |
3616 | } |
3617 | |
3618 | /* |
3619 | @@ -163,9 +186,10 @@ static int gcov_seq_open(struct inode *inode, struct file *file) |
3620 | mutex_lock(&node_lock); |
3621 | /* |
3622 | * Read from a profiling data copy to minimize reference tracking |
3623 | - * complexity and concurrent access. |
3624 | + * complexity and concurrent access and to keep accumulating multiple |
3625 | + * profiling data sets associated with one node simple. |
3626 | */ |
3627 | - info = gcov_info_dup(get_node_info(node)); |
3628 | + info = get_accumulated_info(node); |
3629 | if (!info) |
3630 | goto out_unlock; |
3631 | iter = gcov_iter_new(info); |
3632 | @@ -225,12 +249,25 @@ static struct gcov_node *get_node_by_name(const char *name) |
3633 | return NULL; |
3634 | } |
3635 | |
3636 | +/* |
3637 | + * Reset all profiling data associated with the specified node. |
3638 | + */ |
3639 | +static void reset_node(struct gcov_node *node) |
3640 | +{ |
3641 | + int i; |
3642 | + |
3643 | + if (node->unloaded_info) |
3644 | + gcov_info_reset(node->unloaded_info); |
3645 | + for (i = 0; i < node->num_loaded; i++) |
3646 | + gcov_info_reset(node->loaded_info[i]); |
3647 | +} |
3648 | + |
3649 | static void remove_node(struct gcov_node *node); |
3650 | |
3651 | /* |
3652 | * write() implementation for gcov data files. Reset profiling data for the |
3653 | - * associated file. If the object file has been unloaded (i.e. this is |
3654 | - * a "ghost" node), remove the debug fs node as well. |
3655 | + * corresponding file. If all associated object files have been unloaded, |
3656 | + * remove the debug fs node as well. |
3657 | */ |
3658 | static ssize_t gcov_seq_write(struct file *file, const char __user *addr, |
3659 | size_t len, loff_t *pos) |
3660 | @@ -245,10 +282,10 @@ static ssize_t gcov_seq_write(struct file *file, const char __user *addr, |
3661 | node = get_node_by_name(info->filename); |
3662 | if (node) { |
3663 | /* Reset counts or remove node for unloaded modules. */ |
3664 | - if (node->ghost) |
3665 | + if (node->num_loaded == 0) |
3666 | remove_node(node); |
3667 | else |
3668 | - gcov_info_reset(node->info); |
3669 | + reset_node(node); |
3670 | } |
3671 | /* Reset counts for open file. */ |
3672 | gcov_info_reset(info); |
3673 | @@ -378,7 +415,10 @@ static void init_node(struct gcov_node *node, struct gcov_info *info, |
3674 | INIT_LIST_HEAD(&node->list); |
3675 | INIT_LIST_HEAD(&node->children); |
3676 | INIT_LIST_HEAD(&node->all); |
3677 | - node->info = info; |
3678 | + if (node->loaded_info) { |
3679 | + node->loaded_info[0] = info; |
3680 | + node->num_loaded = 1; |
3681 | + } |
3682 | node->parent = parent; |
3683 | if (name) |
3684 | strcpy(node->name, name); |
3685 | @@ -394,9 +434,13 @@ static struct gcov_node *new_node(struct gcov_node *parent, |
3686 | struct gcov_node *node; |
3687 | |
3688 | node = kzalloc(sizeof(struct gcov_node) + strlen(name) + 1, GFP_KERNEL); |
3689 | - if (!node) { |
3690 | - pr_warning("out of memory\n"); |
3691 | - return NULL; |
3692 | + if (!node) |
3693 | + goto err_nomem; |
3694 | + if (info) { |
3695 | + node->loaded_info = kcalloc(1, sizeof(struct gcov_info *), |
3696 | + GFP_KERNEL); |
3697 | + if (!node->loaded_info) |
3698 | + goto err_nomem; |
3699 | } |
3700 | init_node(node, info, name, parent); |
3701 | /* Differentiate between gcov data file nodes and directory nodes. */ |
3702 | @@ -416,6 +460,11 @@ static struct gcov_node *new_node(struct gcov_node *parent, |
3703 | list_add(&node->all, &all_head); |
3704 | |
3705 | return node; |
3706 | + |
3707 | +err_nomem: |
3708 | + kfree(node); |
3709 | + pr_warning("out of memory\n"); |
3710 | + return NULL; |
3711 | } |
3712 | |
3713 | /* Remove symbolic links associated with node. */ |
3714 | @@ -441,8 +490,9 @@ static void release_node(struct gcov_node *node) |
3715 | list_del(&node->all); |
3716 | debugfs_remove(node->dentry); |
3717 | remove_links(node); |
3718 | - if (node->ghost) |
3719 | - gcov_info_free(node->ghost); |
3720 | + kfree(node->loaded_info); |
3721 | + if (node->unloaded_info) |
3722 | + gcov_info_free(node->unloaded_info); |
3723 | kfree(node); |
3724 | } |
3725 | |
3726 | @@ -477,7 +527,7 @@ static struct gcov_node *get_child_by_name(struct gcov_node *parent, |
3727 | |
3728 | /* |
3729 | * write() implementation for reset file. Reset all profiling data to zero |
3730 | - * and remove ghost nodes. |
3731 | + * and remove nodes for which all associated object files are unloaded. |
3732 | */ |
3733 | static ssize_t reset_write(struct file *file, const char __user *addr, |
3734 | size_t len, loff_t *pos) |
3735 | @@ -487,8 +537,8 @@ static ssize_t reset_write(struct file *file, const char __user *addr, |
3736 | mutex_lock(&node_lock); |
3737 | restart: |
3738 | list_for_each_entry(node, &all_head, all) { |
3739 | - if (node->info) |
3740 | - gcov_info_reset(node->info); |
3741 | + if (node->num_loaded > 0) |
3742 | + reset_node(node); |
3743 | else if (list_empty(&node->children)) { |
3744 | remove_node(node); |
3745 | /* Several nodes may have gone - restart loop. */ |
3746 | @@ -564,37 +614,115 @@ err_remove: |
3747 | } |
3748 | |
3749 | /* |
3750 | - * The profiling data set associated with this node is being unloaded. Store a |
3751 | - * copy of the profiling data and turn this node into a "ghost". |
3752 | + * Associate a profiling data set with an existing node. Needs to be called |
3753 | + * with node_lock held. |
3754 | */ |
3755 | -static int ghost_node(struct gcov_node *node) |
3756 | +static void add_info(struct gcov_node *node, struct gcov_info *info) |
3757 | { |
3758 | - node->ghost = gcov_info_dup(node->info); |
3759 | - if (!node->ghost) { |
3760 | - pr_warning("could not save data for '%s' (out of memory)\n", |
3761 | - node->info->filename); |
3762 | - return -ENOMEM; |
3763 | + struct gcov_info **loaded_info; |
3764 | + int num = node->num_loaded; |
3765 | + |
3766 | + /* |
3767 | + * Prepare new array. This is done first to simplify cleanup in |
3768 | + * case the new data set is incompatible, the node only contains |
3769 | + * unloaded data sets and there's not enough memory for the array. |
3770 | + */ |
3771 | + loaded_info = kcalloc(num + 1, sizeof(struct gcov_info *), GFP_KERNEL); |
3772 | + if (!loaded_info) { |
3773 | + pr_warning("could not add '%s' (out of memory)\n", |
3774 | + info->filename); |
3775 | + return; |
3776 | + } |
3777 | + memcpy(loaded_info, node->loaded_info, |
3778 | + num * sizeof(struct gcov_info *)); |
3779 | + loaded_info[num] = info; |
3780 | + /* Check if the new data set is compatible. */ |
3781 | + if (num == 0) { |
3782 | + /* |
3783 | + * A module was unloaded, modified and reloaded. The new |
3784 | + * data set replaces the copy of the last one. |
3785 | + */ |
3786 | + if (!gcov_info_is_compatible(node->unloaded_info, info)) { |
3787 | + pr_warning("discarding saved data for %s " |
3788 | + "(incompatible version)\n", info->filename); |
3789 | + gcov_info_free(node->unloaded_info); |
3790 | + node->unloaded_info = NULL; |
3791 | + } |
3792 | + } else { |
3793 | + /* |
3794 | + * Two different versions of the same object file are loaded. |
3795 | + * The initial one takes precedence. |
3796 | + */ |
3797 | + if (!gcov_info_is_compatible(node->loaded_info[0], info)) { |
3798 | + pr_warning("could not add '%s' (incompatible " |
3799 | + "version)\n", info->filename); |
3800 | + kfree(loaded_info); |
3801 | + return; |
3802 | + } |
3803 | } |
3804 | - node->info = NULL; |
3805 | + /* Overwrite previous array. */ |
3806 | + kfree(node->loaded_info); |
3807 | + node->loaded_info = loaded_info; |
3808 | + node->num_loaded = num + 1; |
3809 | +} |
3810 | |
3811 | - return 0; |
3812 | +/* |
3813 | + * Return the index of a profiling data set associated with a node. |
3814 | + */ |
3815 | +static int get_info_index(struct gcov_node *node, struct gcov_info *info) |
3816 | +{ |
3817 | + int i; |
3818 | + |
3819 | + for (i = 0; i < node->num_loaded; i++) { |
3820 | + if (node->loaded_info[i] == info) |
3821 | + return i; |
3822 | + } |
3823 | + return -ENOENT; |
3824 | } |
3825 | |
3826 | /* |
3827 | - * Profiling data for this node has been loaded again. Add profiling data |
3828 | - * from previous instantiation and turn this node into a regular node. |
3829 | + * Save the data of a profiling data set which is being unloaded. |
3830 | */ |
3831 | -static void revive_node(struct gcov_node *node, struct gcov_info *info) |
3832 | +static void save_info(struct gcov_node *node, struct gcov_info *info) |
3833 | { |
3834 | - if (gcov_info_is_compatible(node->ghost, info)) |
3835 | - gcov_info_add(info, node->ghost); |
3836 | + if (node->unloaded_info) |
3837 | + gcov_info_add(node->unloaded_info, info); |
3838 | else { |
3839 | - pr_warning("discarding saved data for '%s' (version changed)\n", |
3840 | + node->unloaded_info = gcov_info_dup(info); |
3841 | + if (!node->unloaded_info) { |
3842 | + pr_warning("could not save data for '%s' " |
3843 | + "(out of memory)\n", info->filename); |
3844 | + } |
3845 | + } |
3846 | +} |
3847 | + |
3848 | +/* |
3849 | + * Disassociate a profiling data set from a node. Needs to be called with |
3850 | + * node_lock held. |
3851 | + */ |
3852 | +static void remove_info(struct gcov_node *node, struct gcov_info *info) |
3853 | +{ |
3854 | + int i; |
3855 | + |
3856 | + i = get_info_index(node, info); |
3857 | + if (i < 0) { |
3858 | + pr_warning("could not remove '%s' (not found)\n", |
3859 | info->filename); |
3860 | + return; |
3861 | } |
3862 | - gcov_info_free(node->ghost); |
3863 | - node->ghost = NULL; |
3864 | - node->info = info; |
3865 | + if (gcov_persist) |
3866 | + save_info(node, info); |
3867 | + /* Shrink array. */ |
3868 | + node->loaded_info[i] = node->loaded_info[node->num_loaded - 1]; |
3869 | + node->num_loaded--; |
3870 | + if (node->num_loaded > 0) |
3871 | + return; |
3872 | + /* Last loaded data set was removed. */ |
3873 | + kfree(node->loaded_info); |
3874 | + node->loaded_info = NULL; |
3875 | + node->num_loaded = 0; |
3876 | + if (!node->unloaded_info) |
3877 | + remove_node(node); |
3878 | } |
3879 | |
3880 | /* |
3881 | @@ -609,30 +737,18 @@ void gcov_event(enum gcov_action action, struct gcov_info *info) |
3882 | node = get_node_by_name(info->filename); |
3883 | switch (action) { |
3884 | case GCOV_ADD: |
3885 | - /* Add new node or revive ghost. */ |
3886 | - if (!node) { |
3887 | + if (node) |
3888 | + add_info(node, info); |
3889 | + else |
3890 | add_node(info); |
3891 | - break; |
3892 | - } |
3893 | - if (gcov_persist) |
3894 | - revive_node(node, info); |
3895 | - else { |
3896 | - pr_warning("could not add '%s' (already exists)\n", |
3897 | - info->filename); |
3898 | - } |
3899 | break; |
3900 | case GCOV_REMOVE: |
3901 | - /* Remove node or turn into ghost. */ |
3902 | - if (!node) { |
3903 | + if (node) |
3904 | + remove_info(node, info); |
3905 | + else { |
3906 | pr_warning("could not remove '%s' (not found)\n", |
3907 | info->filename); |
3908 | - break; |
3909 | } |
3910 | - if (gcov_persist) { |
3911 | - if (!ghost_node(node)) |
3912 | - break; |
3913 | - } |
3914 | - remove_node(node); |
3915 | break; |
3916 | } |
3917 | mutex_unlock(&node_lock); |
3918 | diff --git a/kernel/groups.c b/kernel/groups.c |
3919 | index 53b1916..253dc0f 100644 |
3920 | --- a/kernel/groups.c |
3921 | +++ b/kernel/groups.c |
3922 | @@ -143,10 +143,9 @@ int groups_search(const struct group_info *group_info, gid_t grp) |
3923 | right = group_info->ngroups; |
3924 | while (left < right) { |
3925 | unsigned int mid = (left+right)/2; |
3926 | - int cmp = grp - GROUP_AT(group_info, mid); |
3927 | - if (cmp > 0) |
3928 | + if (grp > GROUP_AT(group_info, mid)) |
3929 | left = mid + 1; |
3930 | - else if (cmp < 0) |
3931 | + else if (grp < GROUP_AT(group_info, mid)) |
3932 | right = mid; |
3933 | else |
3934 | return 1; |
3935 | diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c |
3936 | index 6d2cb14..6b316b3 100644 |
3937 | --- a/kernel/trace/ftrace.c |
3938 | +++ b/kernel/trace/ftrace.c |
3939 | @@ -381,12 +381,19 @@ static int function_stat_show(struct seq_file *m, void *v) |
3940 | { |
3941 | struct ftrace_profile *rec = v; |
3942 | char str[KSYM_SYMBOL_LEN]; |
3943 | + int ret = 0; |
3944 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER |
3945 | - static DEFINE_MUTEX(mutex); |
3946 | static struct trace_seq s; |
3947 | unsigned long long avg; |
3948 | unsigned long long stddev; |
3949 | #endif |
3950 | + mutex_lock(&ftrace_profile_lock); |
3951 | + |
3952 | + /* we raced with function_profile_reset() */ |
3953 | + if (unlikely(rec->counter == 0)) { |
3954 | + ret = -EBUSY; |
3955 | + goto out; |
3956 | + } |
3957 | |
3958 | kallsyms_lookup(rec->ip, NULL, NULL, NULL, str); |
3959 | seq_printf(m, " %-30.30s %10lu", str, rec->counter); |
3960 | @@ -408,7 +415,6 @@ static int function_stat_show(struct seq_file *m, void *v) |
3961 | do_div(stddev, (rec->counter - 1) * 1000); |
3962 | } |
3963 | |
3964 | - mutex_lock(&mutex); |
3965 | trace_seq_init(&s); |
3966 | trace_print_graph_duration(rec->time, &s); |
3967 | trace_seq_puts(&s, " "); |
3968 | @@ -416,11 +422,12 @@ static int function_stat_show(struct seq_file *m, void *v) |
3969 | trace_seq_puts(&s, " "); |
3970 | trace_print_graph_duration(stddev, &s); |
3971 | trace_print_seq(m, &s); |
3972 | - mutex_unlock(&mutex); |
3973 | #endif |
3974 | seq_putc(m, '\n'); |
3975 | +out: |
3976 | + mutex_unlock(&ftrace_profile_lock); |
3977 | |
3978 | - return 0; |
3979 | + return ret; |
3980 | } |
3981 | |
3982 | static void ftrace_profile_reset(struct ftrace_profile_stat *stat) |
3983 | @@ -1503,6 +1510,8 @@ static void *t_start(struct seq_file *m, loff_t *pos) |
3984 | if (*pos > 0) |
3985 | return t_hash_start(m, pos); |
3986 | iter->flags |= FTRACE_ITER_PRINTALL; |
3987 | + /* reset in case of seek/pread */ |
3988 | + iter->flags &= ~FTRACE_ITER_HASH; |
3989 | return iter; |
3990 | } |
3991 | |
3992 | @@ -2410,7 +2419,7 @@ static const struct file_operations ftrace_filter_fops = { |
3993 | .open = ftrace_filter_open, |
3994 | .read = seq_read, |
3995 | .write = ftrace_filter_write, |
3996 | - .llseek = ftrace_regex_lseek, |
3997 | + .llseek = no_llseek, |
3998 | .release = ftrace_filter_release, |
3999 | }; |
4000 | |
4001 | diff --git a/mm/bounce.c b/mm/bounce.c |
4002 | index 13b6dad..1481de6 100644 |
4003 | --- a/mm/bounce.c |
4004 | +++ b/mm/bounce.c |
4005 | @@ -116,8 +116,8 @@ static void copy_to_high_bio_irq(struct bio *to, struct bio *from) |
4006 | */ |
4007 | vfrom = page_address(fromvec->bv_page) + tovec->bv_offset; |
4008 | |
4009 | - flush_dcache_page(tovec->bv_page); |
4010 | bounce_copy_vec(tovec, vfrom); |
4011 | + flush_dcache_page(tovec->bv_page); |
4012 | } |
4013 | } |
4014 | |
4015 | diff --git a/mm/compaction.c b/mm/compaction.c |
4016 | index 94cce51..4d709ee 100644 |
4017 | --- a/mm/compaction.c |
4018 | +++ b/mm/compaction.c |
4019 | @@ -214,15 +214,16 @@ static void acct_isolated(struct zone *zone, struct compact_control *cc) |
4020 | /* Similar to reclaim, but different enough that they don't share logic */ |
4021 | static bool too_many_isolated(struct zone *zone) |
4022 | { |
4023 | - |
4024 | - unsigned long inactive, isolated; |
4025 | + unsigned long active, inactive, isolated; |
4026 | |
4027 | inactive = zone_page_state(zone, NR_INACTIVE_FILE) + |
4028 | zone_page_state(zone, NR_INACTIVE_ANON); |
4029 | + active = zone_page_state(zone, NR_ACTIVE_FILE) + |
4030 | + zone_page_state(zone, NR_ACTIVE_ANON); |
4031 | isolated = zone_page_state(zone, NR_ISOLATED_FILE) + |
4032 | zone_page_state(zone, NR_ISOLATED_ANON); |
4033 | |
4034 | - return isolated > inactive; |
4035 | + return isolated > (inactive + active) / 2; |
4036 | } |
4037 | |
4038 | /* |
4039 | diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c |
4040 | index a4cfcdc..dd186c1 100644 |
4041 | --- a/mm/memory_hotplug.c |
4042 | +++ b/mm/memory_hotplug.c |
4043 | @@ -584,19 +584,19 @@ static inline int pageblock_free(struct page *page) |
4044 | /* Return the start of the next active pageblock after a given page */ |
4045 | static struct page *next_active_pageblock(struct page *page) |
4046 | { |
4047 | - int pageblocks_stride; |
4048 | - |
4049 | /* Ensure the starting page is pageblock-aligned */ |
4050 | BUG_ON(page_to_pfn(page) & (pageblock_nr_pages - 1)); |
4051 | |
4052 | - /* Move forward by at least 1 * pageblock_nr_pages */ |
4053 | - pageblocks_stride = 1; |
4054 | - |
4055 | /* If the entire pageblock is free, move to the end of free page */ |
4056 | - if (pageblock_free(page)) |
4057 | - pageblocks_stride += page_order(page) - pageblock_order; |
4058 | + if (pageblock_free(page)) { |
4059 | + int order; |
4060 | + /* be careful. we don't have locks, page_order can be changed.*/ |
4061 | + order = page_order(page); |
4062 | + if ((order < MAX_ORDER) && (order >= pageblock_order)) |
4063 | + return page + (1 << order); |
4064 | + } |
4065 | |
4066 | - return page + (pageblocks_stride * pageblock_nr_pages); |
4067 | + return page + pageblock_nr_pages; |
4068 | } |
4069 | |
4070 | /* Checks if this range of memory is likely to be hot-removable. */ |
4071 | diff --git a/mm/page-writeback.c b/mm/page-writeback.c |
4072 | index 37498ef..582cba1 100644 |
4073 | --- a/mm/page-writeback.c |
4074 | +++ b/mm/page-writeback.c |
4075 | @@ -949,22 +949,16 @@ continue_unlock: |
4076 | } |
4077 | } |
4078 | |
4079 | - if (wbc->nr_to_write > 0) { |
4080 | - if (--wbc->nr_to_write == 0 && |
4081 | - wbc->sync_mode == WB_SYNC_NONE) { |
4082 | - /* |
4083 | - * We stop writing back only if we are |
4084 | - * not doing integrity sync. In case of |
4085 | - * integrity sync we have to keep going |
4086 | - * because someone may be concurrently |
4087 | - * dirtying pages, and we might have |
4088 | - * synced a lot of newly appeared dirty |
4089 | - * pages, but have not synced all of the |
4090 | - * old dirty pages. |
4091 | - */ |
4092 | - done = 1; |
4093 | - break; |
4094 | - } |
4095 | + /* |
4096 | + * We stop writing back only if we are not doing |
4097 | + * integrity sync. In case of integrity sync we have to |
4098 | + * keep going until we have written all the pages |
4099 | + * we tagged for writeback prior to entering this loop. |
4100 | + */ |
4101 | + if (--wbc->nr_to_write <= 0 && |
4102 | + wbc->sync_mode == WB_SYNC_NONE) { |
4103 | + done = 1; |
4104 | + break; |
4105 | } |
4106 | } |
4107 | pagevec_release(&pvec); |
4108 | diff --git a/mm/swapfile.c b/mm/swapfile.c |
4109 | index f08d165..7c703ff 100644 |
4110 | --- a/mm/swapfile.c |
4111 | +++ b/mm/swapfile.c |
4112 | @@ -139,8 +139,7 @@ static int discard_swap(struct swap_info_struct *si) |
4113 | nr_blocks = ((sector_t)se->nr_pages - 1) << (PAGE_SHIFT - 9); |
4114 | if (nr_blocks) { |
4115 | err = blkdev_issue_discard(si->bdev, start_block, |
4116 | - nr_blocks, GFP_KERNEL, |
4117 | - BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER); |
4118 | + nr_blocks, GFP_KERNEL, BLKDEV_IFL_WAIT); |
4119 | if (err) |
4120 | return err; |
4121 | cond_resched(); |
4122 | @@ -151,8 +150,7 @@ static int discard_swap(struct swap_info_struct *si) |
4123 | nr_blocks = (sector_t)se->nr_pages << (PAGE_SHIFT - 9); |
4124 | |
4125 | err = blkdev_issue_discard(si->bdev, start_block, |
4126 | - nr_blocks, GFP_KERNEL, |
4127 | - BLKDEV_IFL_WAIT | BLKDEV_IFL_BARRIER); |
4128 | + nr_blocks, GFP_KERNEL, BLKDEV_IFL_WAIT); |
4129 | if (err) |
4130 | break; |
4131 | |
4132 | @@ -191,8 +189,7 @@ static void discard_swap_cluster(struct swap_info_struct *si, |
4133 | start_block <<= PAGE_SHIFT - 9; |
4134 | nr_blocks <<= PAGE_SHIFT - 9; |
4135 | if (blkdev_issue_discard(si->bdev, start_block, |
4136 | - nr_blocks, GFP_NOIO, BLKDEV_IFL_WAIT | |
4137 | - BLKDEV_IFL_BARRIER)) |
4138 | + nr_blocks, GFP_NOIO, BLKDEV_IFL_WAIT)) |
4139 | break; |
4140 | } |
4141 | |
4142 | @@ -318,10 +315,8 @@ checks: |
4143 | if (offset > si->highest_bit) |
4144 | scan_base = offset = si->lowest_bit; |
4145 | |
4146 | - /* reuse swap entry of cache-only swap if not hibernation. */ |
4147 | - if (vm_swap_full() |
4148 | - && usage == SWAP_HAS_CACHE |
4149 | - && si->swap_map[offset] == SWAP_HAS_CACHE) { |
4150 | + /* reuse swap entry of cache-only swap if not busy. */ |
4151 | + if (vm_swap_full() && si->swap_map[offset] == SWAP_HAS_CACHE) { |
4152 | int swap_was_freed; |
4153 | spin_unlock(&swap_lock); |
4154 | swap_was_freed = __try_to_reclaim_swap(si, offset); |
4155 | @@ -688,6 +683,24 @@ int try_to_free_swap(struct page *page) |
4156 | if (page_swapcount(page)) |
4157 | return 0; |
4158 | |
4159 | + /* |
4160 | + * Once hibernation has begun to create its image of memory, |
4161 | + * there's a danger that one of the calls to try_to_free_swap() |
4162 | + * - most probably a call from __try_to_reclaim_swap() while |
4163 | + * hibernation is allocating its own swap pages for the image, |
4164 | + * but conceivably even a call from memory reclaim - will free |
4165 | + * the swap from a page which has already been recorded in the |
4166 | + * image as a clean swapcache page, and then reuse its swap for |
4167 | + * another page of the image. On waking from hibernation, the |
4168 | + * original page might be freed under memory pressure, then |
4169 | + * later read back in from swap, now with the wrong data. |
4170 | + * |
4171 | + * Hibernation clears bits from gfp_allowed_mask to prevent |
4172 | + * memory reclaim from writing to disk, so check that here. |
4173 | + */ |
4174 | + if (!(gfp_allowed_mask & __GFP_IO)) |
4175 | + return 0; |
4176 | + |
4177 | delete_from_swap_cache(page); |
4178 | SetPageDirty(page); |
4179 | return 1; |
4180 | @@ -2034,7 +2047,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) |
4181 | p->flags |= SWP_SOLIDSTATE; |
4182 | p->cluster_next = 1 + (random32() % p->highest_bit); |
4183 | } |
4184 | - if (discard_swap(p) == 0) |
4185 | + if (discard_swap(p) == 0 && (swap_flags & SWAP_FLAG_DISCARD)) |
4186 | p->flags |= SWP_DISCARDABLE; |
4187 | } |
4188 | |
4189 | diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c |
4190 | index 1ac01b1..aaab5aa 100644 |
4191 | --- a/net/ipv4/netfilter/arp_tables.c |
4192 | +++ b/net/ipv4/netfilter/arp_tables.c |
4193 | @@ -1420,6 +1420,9 @@ static int translate_compat_table(const char *name, |
4194 | if (ret != 0) |
4195 | break; |
4196 | ++i; |
4197 | + if (strcmp(arpt_get_target(iter1)->u.user.name, |
4198 | + XT_ERROR_TARGET) == 0) |
4199 | + ++newinfo->stacksize; |
4200 | } |
4201 | if (ret) { |
4202 | /* |
4203 | diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c |
4204 | index 4b6c5ca..402ce75 100644 |
4205 | --- a/net/ipv4/netfilter/ip_tables.c |
4206 | +++ b/net/ipv4/netfilter/ip_tables.c |
4207 | @@ -1747,6 +1747,9 @@ translate_compat_table(struct net *net, |
4208 | if (ret != 0) |
4209 | break; |
4210 | ++i; |
4211 | + if (strcmp(ipt_get_target(iter1)->u.user.name, |
4212 | + XT_ERROR_TARGET) == 0) |
4213 | + ++newinfo->stacksize; |
4214 | } |
4215 | if (ret) { |
4216 | /* |
4217 | diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c |
4218 | index 9d2d68f..2112298 100644 |
4219 | --- a/net/ipv6/netfilter/ip6_tables.c |
4220 | +++ b/net/ipv6/netfilter/ip6_tables.c |
4221 | @@ -1765,6 +1765,9 @@ translate_compat_table(struct net *net, |
4222 | if (ret != 0) |
4223 | break; |
4224 | ++i; |
4225 | + if (strcmp(ip6t_get_target(iter1)->u.user.name, |
4226 | + XT_ERROR_TARGET) == 0) |
4227 | + ++newinfo->stacksize; |
4228 | } |
4229 | if (ret) { |
4230 | /* |
4231 | diff --git a/net/irda/irlan/irlan_common.c b/net/irda/irlan/irlan_common.c |
4232 | index a788f9e..6130f9d 100644 |
4233 | --- a/net/irda/irlan/irlan_common.c |
4234 | +++ b/net/irda/irlan/irlan_common.c |
4235 | @@ -1102,7 +1102,7 @@ int irlan_extract_param(__u8 *buf, char *name, char *value, __u16 *len) |
4236 | memcpy(&val_len, buf+n, 2); /* To avoid alignment problems */ |
4237 | le16_to_cpus(&val_len); n+=2; |
4238 | |
4239 | - if (val_len > 1016) { |
4240 | + if (val_len >= 1016) { |
4241 | IRDA_DEBUG(2, "%s(), parameter length to long\n", __func__ ); |
4242 | return -RSP_INVALID_COMMAND_FORMAT; |
4243 | } |
4244 | diff --git a/net/mac80211/main.c b/net/mac80211/main.c |
4245 | index 22a384d..52f15fe 100644 |
4246 | --- a/net/mac80211/main.c |
4247 | +++ b/net/mac80211/main.c |
4248 | @@ -659,6 +659,12 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) |
4249 | |
4250 | rtnl_unlock(); |
4251 | |
4252 | + /* |
4253 | + * Now all work items will be gone, but the |
4254 | + * timer might still be armed, so delete it |
4255 | + */ |
4256 | + del_timer_sync(&local->work_timer); |
4257 | + |
4258 | cancel_work_sync(&local->reconfig_filter); |
4259 | |
4260 | ieee80211_clear_tx_pending(local); |
4261 | diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c |
4262 | index 8da2a0e..5359f36 100644 |
4263 | --- a/net/sunrpc/auth_gss/auth_gss.c |
4264 | +++ b/net/sunrpc/auth_gss/auth_gss.c |
4265 | @@ -745,17 +745,18 @@ gss_pipe_release(struct inode *inode) |
4266 | struct rpc_inode *rpci = RPC_I(inode); |
4267 | struct gss_upcall_msg *gss_msg; |
4268 | |
4269 | +restart: |
4270 | spin_lock(&inode->i_lock); |
4271 | - while (!list_empty(&rpci->in_downcall)) { |
4272 | + list_for_each_entry(gss_msg, &rpci->in_downcall, list) { |
4273 | |
4274 | - gss_msg = list_entry(rpci->in_downcall.next, |
4275 | - struct gss_upcall_msg, list); |
4276 | + if (!list_empty(&gss_msg->msg.list)) |
4277 | + continue; |
4278 | gss_msg->msg.errno = -EPIPE; |
4279 | atomic_inc(&gss_msg->count); |
4280 | __gss_unhash_msg(gss_msg); |
4281 | spin_unlock(&inode->i_lock); |
4282 | gss_release_msg(gss_msg); |
4283 | - spin_lock(&inode->i_lock); |
4284 | + goto restart; |
4285 | } |
4286 | spin_unlock(&inode->i_lock); |
4287 | |
4288 | diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c |
4289 | index 95ccbcf..41a762f 100644 |
4290 | --- a/net/sunrpc/rpc_pipe.c |
4291 | +++ b/net/sunrpc/rpc_pipe.c |
4292 | @@ -48,7 +48,7 @@ static void rpc_purge_list(struct rpc_inode *rpci, struct list_head *head, |
4293 | return; |
4294 | do { |
4295 | msg = list_entry(head->next, struct rpc_pipe_msg, list); |
4296 | - list_del(&msg->list); |
4297 | + list_del_init(&msg->list); |
4298 | msg->errno = err; |
4299 | destroy_msg(msg); |
4300 | } while (!list_empty(head)); |
4301 | @@ -208,7 +208,7 @@ rpc_pipe_release(struct inode *inode, struct file *filp) |
4302 | if (msg != NULL) { |
4303 | spin_lock(&inode->i_lock); |
4304 | msg->errno = -EAGAIN; |
4305 | - list_del(&msg->list); |
4306 | + list_del_init(&msg->list); |
4307 | spin_unlock(&inode->i_lock); |
4308 | rpci->ops->destroy_msg(msg); |
4309 | } |
4310 | @@ -268,7 +268,7 @@ rpc_pipe_read(struct file *filp, char __user *buf, size_t len, loff_t *offset) |
4311 | if (res < 0 || msg->len == msg->copied) { |
4312 | filp->private_data = NULL; |
4313 | spin_lock(&inode->i_lock); |
4314 | - list_del(&msg->list); |
4315 | + list_del_init(&msg->list); |
4316 | spin_unlock(&inode->i_lock); |
4317 | rpci->ops->destroy_msg(msg); |
4318 | } |
4319 | diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c |
4320 | index 9634299..37c7d5b 100644 |
4321 | --- a/net/wireless/wext-compat.c |
4322 | +++ b/net/wireless/wext-compat.c |
4323 | @@ -1420,6 +1420,9 @@ int cfg80211_wext_giwessid(struct net_device *dev, |
4324 | { |
4325 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
4326 | |
4327 | + data->flags = 0; |
4328 | + data->length = 0; |
4329 | + |
4330 | switch (wdev->iftype) { |
4331 | case NL80211_IFTYPE_ADHOC: |
4332 | return cfg80211_ibss_wext_giwessid(dev, info, data, ssid); |
4333 | diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c |
4334 | index 0ef17bc..8f5116f 100644 |
4335 | --- a/net/wireless/wext-core.c |
4336 | +++ b/net/wireless/wext-core.c |
4337 | @@ -782,6 +782,22 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, |
4338 | } |
4339 | } |
4340 | |
4341 | + if (IW_IS_GET(cmd) && !(descr->flags & IW_DESCR_FLAG_NOMAX)) { |
4342 | + /* |
4343 | + * If this is a GET, but not NOMAX, it means that the extra |
4344 | + * data is not bounded by userspace, but by max_tokens. Thus |
4345 | + * set the length to max_tokens. This matches the extra data |
4346 | + * allocation. |
4347 | + * The driver should fill it with the number of tokens it |
4348 | + * provided, and it may check iwp->length rather than having |
4349 | + * knowledge of max_tokens. If the driver doesn't change the |
4350 | + * iwp->length, this ioctl just copies back max_token tokens |
4351 | + * filled with zeroes. Hopefully the driver isn't claiming |
4352 | + * them to be valid data. |
4353 | + */ |
4354 | + iwp->length = descr->max_tokens; |
4355 | + } |
4356 | + |
4357 | err = handler(dev, info, (union iwreq_data *) iwp, extra); |
4358 | |
4359 | iwp->length += essid_compat; |
4360 | diff --git a/security/integrity/ima/ima.h b/security/integrity/ima/ima.h |
4361 | index 16d100d..3fbcd1d 100644 |
4362 | --- a/security/integrity/ima/ima.h |
4363 | +++ b/security/integrity/ima/ima.h |
4364 | @@ -35,6 +35,7 @@ enum tpm_pcrs { TPM_PCR0 = 0, TPM_PCR8 = 8 }; |
4365 | #define IMA_MEASURE_HTABLE_SIZE (1 << IMA_HASH_BITS) |
4366 | |
4367 | /* set during initialization */ |
4368 | +extern int iint_initialized; |
4369 | extern int ima_initialized; |
4370 | extern int ima_used_chip; |
4371 | extern char *ima_hash; |
4372 | diff --git a/security/integrity/ima/ima_iint.c b/security/integrity/ima/ima_iint.c |
4373 | index 7625b85..afba4ae 100644 |
4374 | --- a/security/integrity/ima/ima_iint.c |
4375 | +++ b/security/integrity/ima/ima_iint.c |
4376 | @@ -22,9 +22,10 @@ |
4377 | |
4378 | RADIX_TREE(ima_iint_store, GFP_ATOMIC); |
4379 | DEFINE_SPINLOCK(ima_iint_lock); |
4380 | - |
4381 | static struct kmem_cache *iint_cache __read_mostly; |
4382 | |
4383 | +int iint_initialized = 0; |
4384 | + |
4385 | /* ima_iint_find_get - return the iint associated with an inode |
4386 | * |
4387 | * ima_iint_find_get gets a reference to the iint. Caller must |
4388 | @@ -141,6 +142,7 @@ static int __init ima_iintcache_init(void) |
4389 | iint_cache = |
4390 | kmem_cache_create("iint_cache", sizeof(struct ima_iint_cache), 0, |
4391 | SLAB_PANIC, init_once); |
4392 | + iint_initialized = 1; |
4393 | return 0; |
4394 | } |
4395 | security_initcall(ima_iintcache_init); |
4396 | diff --git a/security/integrity/ima/ima_main.c b/security/integrity/ima/ima_main.c |
4397 | index f936413..e662b89 100644 |
4398 | --- a/security/integrity/ima/ima_main.c |
4399 | +++ b/security/integrity/ima/ima_main.c |
4400 | @@ -148,12 +148,14 @@ void ima_counts_get(struct file *file) |
4401 | struct ima_iint_cache *iint; |
4402 | int rc; |
4403 | |
4404 | - if (!ima_initialized || !S_ISREG(inode->i_mode)) |
4405 | + if (!iint_initialized || !S_ISREG(inode->i_mode)) |
4406 | return; |
4407 | iint = ima_iint_find_get(inode); |
4408 | if (!iint) |
4409 | return; |
4410 | mutex_lock(&iint->mutex); |
4411 | + if (!ima_initialized) |
4412 | + goto out; |
4413 | rc = ima_must_measure(iint, inode, MAY_READ, FILE_CHECK); |
4414 | if (rc < 0) |
4415 | goto out; |
4416 | @@ -213,7 +215,7 @@ void ima_file_free(struct file *file) |
4417 | struct inode *inode = file->f_dentry->d_inode; |
4418 | struct ima_iint_cache *iint; |
4419 | |
4420 | - if (!ima_initialized || !S_ISREG(inode->i_mode)) |
4421 | + if (!iint_initialized || !S_ISREG(inode->i_mode)) |
4422 | return; |
4423 | iint = ima_iint_find_get(inode); |
4424 | if (!iint) |
4425 | @@ -230,7 +232,7 @@ static int process_measurement(struct file *file, const unsigned char *filename, |
4426 | { |
4427 | struct inode *inode = file->f_dentry->d_inode; |
4428 | struct ima_iint_cache *iint; |
4429 | - int rc; |
4430 | + int rc = 0; |
4431 | |
4432 | if (!ima_initialized || !S_ISREG(inode->i_mode)) |
4433 | return 0; |
4434 | diff --git a/sound/core/seq/oss/seq_oss_init.c b/sound/core/seq/oss/seq_oss_init.c |
4435 | index 6857122..69cd7b3 100644 |
4436 | --- a/sound/core/seq/oss/seq_oss_init.c |
4437 | +++ b/sound/core/seq/oss/seq_oss_init.c |
4438 | @@ -281,13 +281,10 @@ snd_seq_oss_open(struct file *file, int level) |
4439 | return 0; |
4440 | |
4441 | _error: |
4442 | - snd_seq_oss_writeq_delete(dp->writeq); |
4443 | - snd_seq_oss_readq_delete(dp->readq); |
4444 | snd_seq_oss_synth_cleanup(dp); |
4445 | snd_seq_oss_midi_cleanup(dp); |
4446 | - delete_port(dp); |
4447 | delete_seq_queue(dp->queue); |
4448 | - kfree(dp); |
4449 | + delete_port(dp); |
4450 | |
4451 | return rc; |
4452 | } |
4453 | @@ -350,8 +347,10 @@ create_port(struct seq_oss_devinfo *dp) |
4454 | static int |
4455 | delete_port(struct seq_oss_devinfo *dp) |
4456 | { |
4457 | - if (dp->port < 0) |
4458 | + if (dp->port < 0) { |
4459 | + kfree(dp); |
4460 | return 0; |
4461 | + } |
4462 | |
4463 | debug_printk(("delete_port %i\n", dp->port)); |
4464 | return snd_seq_event_port_detach(dp->cseq, dp->port); |
4465 | diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c |
4466 | index ba2098d..00515c7 100644 |
4467 | --- a/sound/pci/hda/hda_codec.c |
4468 | +++ b/sound/pci/hda/hda_codec.c |
4469 | @@ -4360,7 +4360,7 @@ int snd_hda_parse_pin_def_config(struct hda_codec *codec, |
4470 | cfg->hp_outs--; |
4471 | memmove(cfg->hp_pins + i, cfg->hp_pins + i + 1, |
4472 | sizeof(cfg->hp_pins[0]) * (cfg->hp_outs - i)); |
4473 | - memmove(sequences_hp + i - 1, sequences_hp + i, |
4474 | + memmove(sequences_hp + i, sequences_hp + i + 1, |
4475 | sizeof(sequences_hp[0]) * (cfg->hp_outs - i)); |
4476 | } |
4477 | } |
4478 | diff --git a/sound/pci/hda/patch_cirrus.c b/sound/pci/hda/patch_cirrus.c |
4479 | index 350ee8a..059565f 100644 |
4480 | --- a/sound/pci/hda/patch_cirrus.c |
4481 | +++ b/sound/pci/hda/patch_cirrus.c |
4482 | @@ -972,6 +972,53 @@ static struct hda_verb cs_coef_init_verbs[] = { |
4483 | {} /* terminator */ |
4484 | }; |
4485 | |
4486 | +/* Errata: CS4207 rev C0/C1/C2 Silicon |
4487 | + * |
4488 | + * http://www.cirrus.com/en/pubs/errata/ER880C3.pdf |
4489 | + * |
4490 | + * 6. At high temperature (TA > +85°C), the digital supply current (IVD) |
4491 | + * may be excessive (up to an additional 200 μA), which is most easily |
4492 | + * observed while the part is being held in reset (RESET# active low). |
4493 | + * |
4494 | + * Root Cause: At initial powerup of the device, the logic that drives |
4495 | + * the clock and write enable to the S/PDIF SRC RAMs is not properly |
4496 | + * initialized. |
4497 | + * Certain random patterns will cause a steady leakage current in those |
4498 | + * RAM cells. The issue will resolve once the SRCs are used (turned on). |
4499 | + * |
4500 | + * Workaround: The following verb sequence briefly turns on the S/PDIF SRC |
4501 | + * blocks, which will alleviate the issue. |
4502 | + */ |
4503 | + |
4504 | +static struct hda_verb cs_errata_init_verbs[] = { |
4505 | + {0x01, AC_VERB_SET_POWER_STATE, 0x00}, /* AFG: D0 */ |
4506 | + {0x11, AC_VERB_SET_PROC_STATE, 0x01}, /* VPW: processing on */ |
4507 | + |
4508 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, |
4509 | + {0x11, AC_VERB_SET_PROC_COEF, 0x9999}, |
4510 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, |
4511 | + {0x11, AC_VERB_SET_PROC_COEF, 0xa412}, |
4512 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, |
4513 | + {0x11, AC_VERB_SET_PROC_COEF, 0x0009}, |
4514 | + |
4515 | + {0x07, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Rx: D0 */ |
4516 | + {0x08, AC_VERB_SET_POWER_STATE, 0x00}, /* S/PDIF Tx: D0 */ |
4517 | + |
4518 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0017}, |
4519 | + {0x11, AC_VERB_SET_PROC_COEF, 0x2412}, |
4520 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0008}, |
4521 | + {0x11, AC_VERB_SET_PROC_COEF, 0x0000}, |
4522 | + {0x11, AC_VERB_SET_COEF_INDEX, 0x0001}, |
4523 | + {0x11, AC_VERB_SET_PROC_COEF, 0x0008}, |
4524 | + {0x11, AC_VERB_SET_PROC_STATE, 0x00}, |
4525 | + |
4526 | + {0x07, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Rx: D3 */ |
4527 | + {0x08, AC_VERB_SET_POWER_STATE, 0x03}, /* S/PDIF Tx: D3 */ |
4528 | + /*{0x01, AC_VERB_SET_POWER_STATE, 0x03},*/ /* AFG: D3 This is already handled */ |
4529 | + |
4530 | + {} /* terminator */ |
4531 | +}; |
4532 | + |
4533 | /* SPDIF setup */ |
4534 | static void init_digital(struct hda_codec *codec) |
4535 | { |
4536 | @@ -991,6 +1038,9 @@ static int cs_init(struct hda_codec *codec) |
4537 | { |
4538 | struct cs_spec *spec = codec->spec; |
4539 | |
4540 | + /* init_verb sequence for C0/C1/C2 errata*/ |
4541 | + snd_hda_sequence_write(codec, cs_errata_init_verbs); |
4542 | + |
4543 | snd_hda_sequence_write(codec, cs_coef_init_verbs); |
4544 | |
4545 | if (spec->gpio_mask) { |
4546 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
4547 | index baadda4..4eee494 100644 |
4548 | --- a/sound/pci/hda/patch_conexant.c |
4549 | +++ b/sound/pci/hda/patch_conexant.c |
4550 | @@ -116,6 +116,7 @@ struct conexant_spec { |
4551 | unsigned int dell_vostro:1; |
4552 | unsigned int ideapad:1; |
4553 | unsigned int thinkpad:1; |
4554 | + unsigned int hp_laptop:1; |
4555 | |
4556 | unsigned int ext_mic_present; |
4557 | unsigned int recording; |
4558 | @@ -2219,6 +2220,18 @@ static void cxt5066_ideapad_automic(struct hda_codec *codec) |
4559 | } |
4560 | } |
4561 | |
4562 | +/* toggle input of built-in digital mic and mic jack appropriately */ |
4563 | +static void cxt5066_hp_laptop_automic(struct hda_codec *codec) |
4564 | +{ |
4565 | + unsigned int present; |
4566 | + |
4567 | + present = snd_hda_jack_detect(codec, 0x1b); |
4568 | + snd_printdd("CXT5066: external microphone present=%d\n", present); |
4569 | + snd_hda_codec_write(codec, 0x17, 0, AC_VERB_SET_CONNECT_SEL, |
4570 | + present ? 1 : 3); |
4571 | +} |
4572 | + |
4573 | + |
4574 | /* toggle input of built-in digital mic and mic jack appropriately |
4575 | order is: external mic -> dock mic -> interal mic */ |
4576 | static void cxt5066_thinkpad_automic(struct hda_codec *codec) |
4577 | @@ -2328,6 +2341,20 @@ static void cxt5066_ideapad_event(struct hda_codec *codec, unsigned int res) |
4578 | } |
4579 | |
4580 | /* unsolicited event for jack sensing */ |
4581 | +static void cxt5066_hp_laptop_event(struct hda_codec *codec, unsigned int res) |
4582 | +{ |
4583 | + snd_printdd("CXT5066_hp_laptop: unsol event %x (%x)\n", res, res >> 26); |
4584 | + switch (res >> 26) { |
4585 | + case CONEXANT_HP_EVENT: |
4586 | + cxt5066_hp_automute(codec); |
4587 | + break; |
4588 | + case CONEXANT_MIC_EVENT: |
4589 | + cxt5066_hp_laptop_automic(codec); |
4590 | + break; |
4591 | + } |
4592 | +} |
4593 | + |
4594 | +/* unsolicited event for jack sensing */ |
4595 | static void cxt5066_thinkpad_event(struct hda_codec *codec, unsigned int res) |
4596 | { |
4597 | snd_printdd("CXT5066_thinkpad: unsol event %x (%x)\n", res, res >> 26); |
4598 | @@ -2910,6 +2937,14 @@ static struct hda_verb cxt5066_init_verbs_portd_lo[] = { |
4599 | { } /* end */ |
4600 | }; |
4601 | |
4602 | + |
4603 | +static struct hda_verb cxt5066_init_verbs_hp_laptop[] = { |
4604 | + {0x14, AC_VERB_SET_CONNECT_SEL, 0x0}, |
4605 | + {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_HP_EVENT}, |
4606 | + {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | CONEXANT_MIC_EVENT}, |
4607 | + { } /* end */ |
4608 | +}; |
4609 | + |
4610 | /* initialize jack-sensing, too */ |
4611 | static int cxt5066_init(struct hda_codec *codec) |
4612 | { |
4613 | @@ -2925,6 +2960,8 @@ static int cxt5066_init(struct hda_codec *codec) |
4614 | cxt5066_ideapad_automic(codec); |
4615 | else if (spec->thinkpad) |
4616 | cxt5066_thinkpad_automic(codec); |
4617 | + else if (spec->hp_laptop) |
4618 | + cxt5066_hp_laptop_automic(codec); |
4619 | } |
4620 | cxt5066_set_mic_boost(codec); |
4621 | return 0; |
4622 | @@ -2952,6 +2989,7 @@ enum { |
4623 | CXT5066_DELL_VOSTO, /* Dell Vostro 1015i */ |
4624 | CXT5066_IDEAPAD, /* Lenovo IdeaPad U150 */ |
4625 | CXT5066_THINKPAD, /* Lenovo ThinkPad T410s, others? */ |
4626 | + CXT5066_HP_LAPTOP, /* HP Laptop */ |
4627 | CXT5066_MODELS |
4628 | }; |
4629 | |
4630 | @@ -2962,6 +3000,7 @@ static const char *cxt5066_models[CXT5066_MODELS] = { |
4631 | [CXT5066_DELL_VOSTO] = "dell-vostro", |
4632 | [CXT5066_IDEAPAD] = "ideapad", |
4633 | [CXT5066_THINKPAD] = "thinkpad", |
4634 | + [CXT5066_HP_LAPTOP] = "hp-laptop", |
4635 | }; |
4636 | |
4637 | static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
4638 | @@ -2973,8 +3012,10 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = { |
4639 | SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO), |
4640 | SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO), |
4641 | SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD), |
4642 | + SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP), |
4643 | SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5), |
4644 | SND_PCI_QUIRK(0x1179, 0xffe0, "Toshiba Satellite Pro T130-15F", CXT5066_OLPC_XO_1_5), |
4645 | + SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo T400s", CXT5066_THINKPAD), |
4646 | SND_PCI_QUIRK(0x17aa, 0x21b2, "Thinkpad X100e", CXT5066_IDEAPAD), |
4647 | SND_PCI_QUIRK(0x17aa, 0x21b3, "Thinkpad Edge 13 (197)", CXT5066_IDEAPAD), |
4648 | SND_PCI_QUIRK(0x17aa, 0x21b4, "Thinkpad Edge", CXT5066_IDEAPAD), |
4649 | @@ -3032,6 +3073,23 @@ static int patch_cxt5066(struct hda_codec *codec) |
4650 | spec->num_init_verbs++; |
4651 | spec->dell_automute = 1; |
4652 | break; |
4653 | + case CXT5066_HP_LAPTOP: |
4654 | + codec->patch_ops.init = cxt5066_init; |
4655 | + codec->patch_ops.unsol_event = cxt5066_hp_laptop_event; |
4656 | + spec->init_verbs[spec->num_init_verbs] = |
4657 | + cxt5066_init_verbs_hp_laptop; |
4658 | + spec->num_init_verbs++; |
4659 | + spec->hp_laptop = 1; |
4660 | + spec->mixers[spec->num_mixers++] = cxt5066_mixer_master; |
4661 | + spec->mixers[spec->num_mixers++] = cxt5066_mixers; |
4662 | + /* no S/PDIF out */ |
4663 | + spec->multiout.dig_out_nid = 0; |
4664 | + /* input source automatically selected */ |
4665 | + spec->input_mux = NULL; |
4666 | + spec->port_d_mode = 0; |
4667 | + spec->mic_boost = 3; /* default 30dB gain */ |
4668 | + break; |
4669 | + |
4670 | case CXT5066_OLPC_XO_1_5: |
4671 | codec->patch_ops.init = cxt5066_olpc_init; |
4672 | codec->patch_ops.unsol_event = cxt5066_olpc_unsol_event; |
4673 | diff --git a/sound/pci/hda/patch_nvhdmi.c b/sound/pci/hda/patch_nvhdmi.c |
4674 | index b0652ac..88ae0f2 100644 |
4675 | --- a/sound/pci/hda/patch_nvhdmi.c |
4676 | +++ b/sound/pci/hda/patch_nvhdmi.c |
4677 | @@ -541,26 +541,32 @@ static int patch_nvhdmi_2ch(struct hda_codec *codec) |
4678 | * patch entries |
4679 | */ |
4680 | static struct hda_codec_preset snd_hda_preset_nvhdmi[] = { |
4681 | - { .id = 0x10de0002, .name = "MCP77/78 HDMI", |
4682 | - .patch = patch_nvhdmi_8ch_7x }, |
4683 | - { .id = 0x10de0003, .name = "MCP77/78 HDMI", |
4684 | - .patch = patch_nvhdmi_8ch_7x }, |
4685 | - { .id = 0x10de0005, .name = "MCP77/78 HDMI", |
4686 | - .patch = patch_nvhdmi_8ch_7x }, |
4687 | - { .id = 0x10de0006, .name = "MCP77/78 HDMI", |
4688 | - .patch = patch_nvhdmi_8ch_7x }, |
4689 | - { .id = 0x10de0007, .name = "MCP79/7A HDMI", |
4690 | - .patch = patch_nvhdmi_8ch_7x }, |
4691 | - { .id = 0x10de000a, .name = "GT220 HDMI", |
4692 | - .patch = patch_nvhdmi_8ch_89 }, |
4693 | - { .id = 0x10de000b, .name = "GT21x HDMI", |
4694 | - .patch = patch_nvhdmi_8ch_89 }, |
4695 | - { .id = 0x10de000c, .name = "MCP89 HDMI", |
4696 | - .patch = patch_nvhdmi_8ch_89 }, |
4697 | - { .id = 0x10de000d, .name = "GT240 HDMI", |
4698 | - .patch = patch_nvhdmi_8ch_89 }, |
4699 | - { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, |
4700 | - { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, |
4701 | + { .id = 0x10de0002, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
4702 | + { .id = 0x10de0003, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
4703 | + { .id = 0x10de0005, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
4704 | + { .id = 0x10de0006, .name = "MCP77/78 HDMI", .patch = patch_nvhdmi_8ch_7x }, |
4705 | + { .id = 0x10de0007, .name = "MCP79/7A HDMI", .patch = patch_nvhdmi_8ch_7x }, |
4706 | + { .id = 0x10de000a, .name = "GPU 0a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4707 | + { .id = 0x10de000b, .name = "GPU 0b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4708 | + { .id = 0x10de000c, .name = "MCP89 HDMI", .patch = patch_nvhdmi_8ch_89 }, |
4709 | + { .id = 0x10de000d, .name = "GPU 0d HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4710 | + { .id = 0x10de0010, .name = "GPU 10 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4711 | + { .id = 0x10de0011, .name = "GPU 11 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4712 | + { .id = 0x10de0012, .name = "GPU 12 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4713 | + { .id = 0x10de0013, .name = "GPU 13 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4714 | + { .id = 0x10de0014, .name = "GPU 14 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4715 | + { .id = 0x10de0018, .name = "GPU 18 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4716 | + { .id = 0x10de0019, .name = "GPU 19 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4717 | + { .id = 0x10de001a, .name = "GPU 1a HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4718 | + { .id = 0x10de001b, .name = "GPU 1b HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4719 | + { .id = 0x10de001c, .name = "GPU 1c HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4720 | + { .id = 0x10de0040, .name = "GPU 40 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4721 | + { .id = 0x10de0041, .name = "GPU 41 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4722 | + { .id = 0x10de0042, .name = "GPU 42 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4723 | + { .id = 0x10de0043, .name = "GPU 43 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4724 | + { .id = 0x10de0044, .name = "GPU 44 HDMI/DP", .patch = patch_nvhdmi_8ch_89 }, |
4725 | + { .id = 0x10de0067, .name = "MCP67 HDMI", .patch = patch_nvhdmi_2ch }, |
4726 | + { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch }, |
4727 | {} /* terminator */ |
4728 | }; |
4729 | |
4730 | @@ -573,6 +579,21 @@ MODULE_ALIAS("snd-hda-codec-id:10de000a"); |
4731 | MODULE_ALIAS("snd-hda-codec-id:10de000b"); |
4732 | MODULE_ALIAS("snd-hda-codec-id:10de000c"); |
4733 | MODULE_ALIAS("snd-hda-codec-id:10de000d"); |
4734 | +MODULE_ALIAS("snd-hda-codec-id:10de0010"); |
4735 | +MODULE_ALIAS("snd-hda-codec-id:10de0011"); |
4736 | +MODULE_ALIAS("snd-hda-codec-id:10de0012"); |
4737 | +MODULE_ALIAS("snd-hda-codec-id:10de0013"); |
4738 | +MODULE_ALIAS("snd-hda-codec-id:10de0014"); |
4739 | +MODULE_ALIAS("snd-hda-codec-id:10de0018"); |
4740 | +MODULE_ALIAS("snd-hda-codec-id:10de0019"); |
4741 | +MODULE_ALIAS("snd-hda-codec-id:10de001a"); |
4742 | +MODULE_ALIAS("snd-hda-codec-id:10de001b"); |
4743 | +MODULE_ALIAS("snd-hda-codec-id:10de001c"); |
4744 | +MODULE_ALIAS("snd-hda-codec-id:10de0040"); |
4745 | +MODULE_ALIAS("snd-hda-codec-id:10de0041"); |
4746 | +MODULE_ALIAS("snd-hda-codec-id:10de0042"); |
4747 | +MODULE_ALIAS("snd-hda-codec-id:10de0043"); |
4748 | +MODULE_ALIAS("snd-hda-codec-id:10de0044"); |
4749 | MODULE_ALIAS("snd-hda-codec-id:10de0067"); |
4750 | MODULE_ALIAS("snd-hda-codec-id:10de8001"); |
4751 | |
4752 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
4753 | index 6d9a542..76c4968 100644 |
4754 | --- a/sound/pci/hda/patch_realtek.c |
4755 | +++ b/sound/pci/hda/patch_realtek.c |
4756 | @@ -7005,7 +7005,7 @@ static struct hda_input_mux alc883_lenovo_nb0763_capture_source = { |
4757 | .num_items = 4, |
4758 | .items = { |
4759 | { "Mic", 0x0 }, |
4760 | - { "iMic", 0x1 }, |
4761 | + { "Int Mic", 0x1 }, |
4762 | { "Line", 0x2 }, |
4763 | { "CD", 0x4 }, |
4764 | }, |
4765 | @@ -8575,8 +8575,8 @@ static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = { |
4766 | HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT), |
4767 | HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT), |
4768 | HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT), |
4769 | - HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
4770 | - HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
4771 | + HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT), |
4772 | + HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT), |
4773 | { } /* end */ |
4774 | }; |
4775 | |
4776 | @@ -13026,6 +13026,8 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, |
4777 | dac = 0x02; |
4778 | break; |
4779 | case 0x15: |
4780 | + case 0x1a: /* ALC259/269 only */ |
4781 | + case 0x1b: /* ALC259/269 only */ |
4782 | case 0x21: /* ALC269vb has this pin, too */ |
4783 | dac = 0x03; |
4784 | break; |
4785 | @@ -13305,7 +13307,6 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = { |
4786 | SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA), |
4787 | SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER), |
4788 | SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1), |
4789 | - SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL), |
4790 | {} |
4791 | }; |
4792 | |
4793 | @@ -14229,6 +14230,7 @@ static void alc269_auto_init(struct hda_codec *codec) |
4794 | |
4795 | enum { |
4796 | ALC269_FIXUP_SONY_VAIO, |
4797 | + ALC269_FIXUP_DELL_M101Z, |
4798 | }; |
4799 | |
4800 | static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = { |
4801 | @@ -14240,10 +14242,20 @@ static const struct alc_fixup alc269_fixups[] = { |
4802 | [ALC269_FIXUP_SONY_VAIO] = { |
4803 | .verbs = alc269_sony_vaio_fixup_verbs |
4804 | }, |
4805 | + [ALC269_FIXUP_DELL_M101Z] = { |
4806 | + .verbs = (const struct hda_verb[]) { |
4807 | + /* Enables internal speaker */ |
4808 | + {0x20, AC_VERB_SET_COEF_INDEX, 13}, |
4809 | + {0x20, AC_VERB_SET_PROC_COEF, 0x4040}, |
4810 | + {} |
4811 | + } |
4812 | + }, |
4813 | }; |
4814 | |
4815 | static struct snd_pci_quirk alc269_fixup_tbl[] = { |
4816 | SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
4817 | + SND_PCI_QUIRK(0x104d, 0x9077, "Sony VAIO", ALC269_FIXUP_SONY_VAIO), |
4818 | + SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z), |
4819 | {} |
4820 | }; |
4821 | |
4822 | diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h |
4823 | index 6147216..a3409ed 100644 |
4824 | --- a/sound/pci/oxygen/oxygen.h |
4825 | +++ b/sound/pci/oxygen/oxygen.h |
4826 | @@ -155,6 +155,7 @@ void oxygen_pci_remove(struct pci_dev *pci); |
4827 | int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state); |
4828 | int oxygen_pci_resume(struct pci_dev *pci); |
4829 | #endif |
4830 | +void oxygen_pci_shutdown(struct pci_dev *pci); |
4831 | |
4832 | /* oxygen_mixer.c */ |
4833 | |
4834 | diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c |
4835 | index fad03d6..7e93cf8 100644 |
4836 | --- a/sound/pci/oxygen/oxygen_lib.c |
4837 | +++ b/sound/pci/oxygen/oxygen_lib.c |
4838 | @@ -519,16 +519,21 @@ static void oxygen_init(struct oxygen *chip) |
4839 | } |
4840 | } |
4841 | |
4842 | -static void oxygen_card_free(struct snd_card *card) |
4843 | +static void oxygen_shutdown(struct oxygen *chip) |
4844 | { |
4845 | - struct oxygen *chip = card->private_data; |
4846 | - |
4847 | spin_lock_irq(&chip->reg_lock); |
4848 | chip->interrupt_mask = 0; |
4849 | chip->pcm_running = 0; |
4850 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); |
4851 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); |
4852 | spin_unlock_irq(&chip->reg_lock); |
4853 | +} |
4854 | + |
4855 | +static void oxygen_card_free(struct snd_card *card) |
4856 | +{ |
4857 | + struct oxygen *chip = card->private_data; |
4858 | + |
4859 | + oxygen_shutdown(chip); |
4860 | if (chip->irq >= 0) |
4861 | free_irq(chip->irq, chip); |
4862 | flush_scheduled_work(); |
4863 | @@ -778,3 +783,13 @@ int oxygen_pci_resume(struct pci_dev *pci) |
4864 | } |
4865 | EXPORT_SYMBOL(oxygen_pci_resume); |
4866 | #endif /* CONFIG_PM */ |
4867 | + |
4868 | +void oxygen_pci_shutdown(struct pci_dev *pci) |
4869 | +{ |
4870 | + struct snd_card *card = pci_get_drvdata(pci); |
4871 | + struct oxygen *chip = card->private_data; |
4872 | + |
4873 | + oxygen_shutdown(chip); |
4874 | + chip->model.cleanup(chip); |
4875 | +} |
4876 | +EXPORT_SYMBOL(oxygen_pci_shutdown); |
4877 | diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c |
4878 | index f03a2f2..06c863e 100644 |
4879 | --- a/sound/pci/oxygen/virtuoso.c |
4880 | +++ b/sound/pci/oxygen/virtuoso.c |
4881 | @@ -95,6 +95,7 @@ static struct pci_driver xonar_driver = { |
4882 | .suspend = oxygen_pci_suspend, |
4883 | .resume = oxygen_pci_resume, |
4884 | #endif |
4885 | + .shutdown = oxygen_pci_shutdown, |
4886 | }; |
4887 | |
4888 | static int __init alsa_card_xonar_init(void) |
4889 | diff --git a/sound/pci/oxygen/xonar_wm87x6.c b/sound/pci/oxygen/xonar_wm87x6.c |
4890 | index dbc4b89..b82c1cf 100644 |
4891 | --- a/sound/pci/oxygen/xonar_wm87x6.c |
4892 | +++ b/sound/pci/oxygen/xonar_wm87x6.c |
4893 | @@ -53,6 +53,8 @@ struct xonar_wm87x6 { |
4894 | struct xonar_generic generic; |
4895 | u16 wm8776_regs[0x17]; |
4896 | u16 wm8766_regs[0x10]; |
4897 | + struct snd_kcontrol *line_adcmux_control; |
4898 | + struct snd_kcontrol *mic_adcmux_control; |
4899 | struct snd_kcontrol *lc_controls[13]; |
4900 | }; |
4901 | |
4902 | @@ -193,6 +195,7 @@ static void xonar_ds_init(struct oxygen *chip) |
4903 | static void xonar_ds_cleanup(struct oxygen *chip) |
4904 | { |
4905 | xonar_disable_output(chip); |
4906 | + wm8776_write(chip, WM8776_RESET, 0); |
4907 | } |
4908 | |
4909 | static void xonar_ds_suspend(struct oxygen *chip) |
4910 | @@ -603,6 +606,7 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, |
4911 | { |
4912 | struct oxygen *chip = ctl->private_data; |
4913 | struct xonar_wm87x6 *data = chip->model_data; |
4914 | + struct snd_kcontrol *other_ctl; |
4915 | unsigned int mux_bit = ctl->private_value; |
4916 | u16 reg; |
4917 | int changed; |
4918 | @@ -610,8 +614,18 @@ static int wm8776_input_mux_put(struct snd_kcontrol *ctl, |
4919 | mutex_lock(&chip->mutex); |
4920 | reg = data->wm8776_regs[WM8776_ADCMUX]; |
4921 | if (value->value.integer.value[0]) { |
4922 | - reg &= ~0x003; |
4923 | reg |= mux_bit; |
4924 | + /* line-in and mic-in are exclusive */ |
4925 | + mux_bit ^= 3; |
4926 | + if (reg & mux_bit) { |
4927 | + reg &= ~mux_bit; |
4928 | + if (mux_bit == 1) |
4929 | + other_ctl = data->line_adcmux_control; |
4930 | + else |
4931 | + other_ctl = data->mic_adcmux_control; |
4932 | + snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE, |
4933 | + &other_ctl->id); |
4934 | + } |
4935 | } else |
4936 | reg &= ~mux_bit; |
4937 | changed = reg != data->wm8776_regs[WM8776_ADCMUX]; |
4938 | @@ -963,7 +977,13 @@ static int xonar_ds_mixer_init(struct oxygen *chip) |
4939 | err = snd_ctl_add(chip->card, ctl); |
4940 | if (err < 0) |
4941 | return err; |
4942 | + if (!strcmp(ctl->id.name, "Line Capture Switch")) |
4943 | + data->line_adcmux_control = ctl; |
4944 | + else if (!strcmp(ctl->id.name, "Mic Capture Switch")) |
4945 | + data->mic_adcmux_control = ctl; |
4946 | } |
4947 | + if (!data->line_adcmux_control || !data->mic_adcmux_control) |
4948 | + return -ENXIO; |
4949 | BUILD_BUG_ON(ARRAY_SIZE(lc_controls) != ARRAY_SIZE(data->lc_controls)); |
4950 | for (i = 0; i < ARRAY_SIZE(lc_controls); ++i) { |
4951 | ctl = snd_ctl_new1(&lc_controls[i], chip); |
4952 | diff --git a/sound/usb/card.c b/sound/usb/card.c |
4953 | index 7a8ac1d..ceeba89 100644 |
4954 | --- a/sound/usb/card.c |
4955 | +++ b/sound/usb/card.c |
4956 | @@ -126,7 +126,7 @@ static void snd_usb_stream_disconnect(struct list_head *head) |
4957 | for (idx = 0; idx < 2; idx++) { |
4958 | subs = &as->substream[idx]; |
4959 | if (!subs->num_formats) |
4960 | - return; |
4961 | + continue; |
4962 | snd_usb_release_substream_urbs(subs, 1); |
4963 | subs->interface = -1; |
4964 | } |
4965 | @@ -216,6 +216,11 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) |
4966 | } |
4967 | |
4968 | switch (protocol) { |
4969 | + default: |
4970 | + snd_printdd(KERN_WARNING "unknown interface protocol %#02x, assuming v1\n", |
4971 | + protocol); |
4972 | + /* fall through */ |
4973 | + |
4974 | case UAC_VERSION_1: { |
4975 | struct uac_ac_header_descriptor_v1 *h1 = control_header; |
4976 | |
4977 | @@ -253,10 +258,6 @@ static int snd_usb_create_streams(struct snd_usb_audio *chip, int ctrlif) |
4978 | |
4979 | break; |
4980 | } |
4981 | - |
4982 | - default: |
4983 | - snd_printk(KERN_ERR "unknown protocol version 0x%02x\n", protocol); |
4984 | - return -EINVAL; |
4985 | } |
4986 | |
4987 | return 0; |
4988 | @@ -465,7 +466,13 @@ static void *snd_usb_audio_probe(struct usb_device *dev, |
4989 | goto __error; |
4990 | } |
4991 | |
4992 | - chip->ctrl_intf = alts; |
4993 | + /* |
4994 | + * For devices with more than one control interface, we assume the |
4995 | + * first contains the audio controls. We might need a more specific |
4996 | + * check here in the future. |
4997 | + */ |
4998 | + if (!chip->ctrl_intf) |
4999 | + chip->ctrl_intf = alts; |
5000 | |
5001 | if (err > 0) { |
5002 | /* create normal USB audio interfaces */ |
5003 | diff --git a/sound/usb/clock.c b/sound/usb/clock.c |
5004 | index b585511..aeda4c7 100644 |
5005 | --- a/sound/usb/clock.c |
5006 | +++ b/sound/usb/clock.c |
5007 | @@ -304,12 +304,11 @@ int snd_usb_init_sample_rate(struct snd_usb_audio *chip, int iface, |
5008 | |
5009 | switch (altsd->bInterfaceProtocol) { |
5010 | case UAC_VERSION_1: |
5011 | + default: |
5012 | return set_sample_rate_v1(chip, iface, alts, fmt, rate); |
5013 | |
5014 | case UAC_VERSION_2: |
5015 | return set_sample_rate_v2(chip, iface, alts, fmt, rate); |
5016 | } |
5017 | - |
5018 | - return -EINVAL; |
5019 | } |
5020 | |
5021 | diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c |
5022 | index 6f6596c..0aac628 100644 |
5023 | --- a/sound/usb/endpoint.c |
5024 | +++ b/sound/usb/endpoint.c |
5025 | @@ -274,6 +274,12 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) |
5026 | |
5027 | /* get audio formats */ |
5028 | switch (protocol) { |
5029 | + default: |
5030 | + snd_printdd(KERN_WARNING "%d:%u:%d: unknown interface protocol %#02x, assuming v1\n", |
5031 | + dev->devnum, iface_no, altno, protocol); |
5032 | + protocol = UAC_VERSION_1; |
5033 | + /* fall through */ |
5034 | + |
5035 | case UAC_VERSION_1: { |
5036 | struct uac_as_header_descriptor_v1 *as = |
5037 | snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, UAC_AS_GENERAL); |
5038 | @@ -335,11 +341,6 @@ int snd_usb_parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no) |
5039 | dev->devnum, iface_no, altno, as->bTerminalLink); |
5040 | continue; |
5041 | } |
5042 | - |
5043 | - default: |
5044 | - snd_printk(KERN_ERR "%d:%u:%d : unknown interface protocol %04x\n", |
5045 | - dev->devnum, iface_no, altno, protocol); |
5046 | - continue; |
5047 | } |
5048 | |
5049 | /* get format type */ |
5050 | diff --git a/sound/usb/format.c b/sound/usb/format.c |
5051 | index 30364ab..440d7c3 100644 |
5052 | --- a/sound/usb/format.c |
5053 | +++ b/sound/usb/format.c |
5054 | @@ -49,7 +49,8 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, |
5055 | u64 pcm_formats; |
5056 | |
5057 | switch (protocol) { |
5058 | - case UAC_VERSION_1: { |
5059 | + case UAC_VERSION_1: |
5060 | + default: { |
5061 | struct uac_format_type_i_discrete_descriptor *fmt = _fmt; |
5062 | sample_width = fmt->bBitResolution; |
5063 | sample_bytes = fmt->bSubframeSize; |
5064 | @@ -64,9 +65,6 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, |
5065 | format <<= 1; |
5066 | break; |
5067 | } |
5068 | - |
5069 | - default: |
5070 | - return -EINVAL; |
5071 | } |
5072 | |
5073 | pcm_formats = 0; |
5074 | @@ -385,6 +383,10 @@ static int parse_audio_format_i(struct snd_usb_audio *chip, |
5075 | * audio class v2 uses class specific EP0 range requests for that. |
5076 | */ |
5077 | switch (protocol) { |
5078 | + default: |
5079 | + snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n", |
5080 | + chip->dev->devnum, fp->iface, fp->altsetting, protocol); |
5081 | + /* fall through */ |
5082 | case UAC_VERSION_1: |
5083 | fp->channels = fmt->bNrChannels; |
5084 | ret = parse_audio_format_rates_v1(chip, fp, (unsigned char *) fmt, 7); |
5085 | @@ -435,6 +437,10 @@ static int parse_audio_format_ii(struct snd_usb_audio *chip, |
5086 | fp->channels = 1; |
5087 | |
5088 | switch (protocol) { |
5089 | + default: |
5090 | + snd_printdd(KERN_WARNING "%d:%u:%d : invalid protocol version %d, assuming v1\n", |
5091 | + chip->dev->devnum, fp->iface, fp->altsetting, protocol); |
5092 | + /* fall through */ |
5093 | case UAC_VERSION_1: { |
5094 | struct uac_format_type_ii_discrete_descriptor *fmt = _fmt; |
5095 | brate = le16_to_cpu(fmt->wMaxBitRate); |
5096 | diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c |
5097 | index 736d134..2a4377f 100644 |
5098 | --- a/sound/usb/mixer.c |
5099 | +++ b/sound/usb/mixer.c |
5100 | @@ -2168,7 +2168,15 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif, |
5101 | } |
5102 | |
5103 | host_iface = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; |
5104 | - mixer->protocol = get_iface_desc(host_iface)->bInterfaceProtocol; |
5105 | + switch (get_iface_desc(host_iface)->bInterfaceProtocol) { |
5106 | + case UAC_VERSION_1: |
5107 | + default: |
5108 | + mixer->protocol = UAC_VERSION_1; |
5109 | + break; |
5110 | + case UAC_VERSION_2: |
5111 | + mixer->protocol = UAC_VERSION_2; |
5112 | + break; |
5113 | + } |
5114 | |
5115 | if ((err = snd_usb_mixer_controls(mixer)) < 0 || |
5116 | (err = snd_usb_mixer_status_create(mixer)) < 0) |
5117 | diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c |
5118 | index 4568298..b40a248 100644 |
5119 | --- a/sound/usb/pcm.c |
5120 | +++ b/sound/usb/pcm.c |
5121 | @@ -173,13 +173,12 @@ int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, |
5122 | |
5123 | switch (altsd->bInterfaceProtocol) { |
5124 | case UAC_VERSION_1: |
5125 | + default: |
5126 | return init_pitch_v1(chip, iface, alts, fmt); |
5127 | |
5128 | case UAC_VERSION_2: |
5129 | return init_pitch_v2(chip, iface, alts, fmt); |
5130 | } |
5131 | - |
5132 | - return -EINVAL; |
5133 | } |
5134 | |
5135 | /* |
5136 | diff --git a/tools/perf/util/callchain.h b/tools/perf/util/callchain.h |
5137 | index f2e9ee1..ecb9732 100644 |
5138 | --- a/tools/perf/util/callchain.h |
5139 | +++ b/tools/perf/util/callchain.h |
5140 | @@ -50,6 +50,7 @@ static inline void callchain_init(struct callchain_node *node) |
5141 | INIT_LIST_HEAD(&node->children); |
5142 | INIT_LIST_HEAD(&node->val); |
5143 | |
5144 | + node->children_hit = 0; |
5145 | node->parent = NULL; |
5146 | node->hit = 0; |
5147 | } |