Magellan Linux

Contents of /trunk/kernel26-magellan/patches-2.6.35-r4/0103-2.6.35.4-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1138 - (show annotations) (download)
Tue Sep 21 13:53:34 2010 UTC (13 years, 7 months ago) by niro
File size: 150801 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/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h
2 index 9dcb11e..bf62c44 100644
3 --- a/arch/arm/include/asm/ptrace.h
4 +++ b/arch/arm/include/asm/ptrace.h
5 @@ -158,15 +158,24 @@ struct pt_regs {
6 */
7 static inline int valid_user_regs(struct pt_regs *regs)
8 {
9 - if (user_mode(regs) && (regs->ARM_cpsr & PSR_I_BIT) == 0) {
10 - regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
11 - return 1;
12 + unsigned long mode = regs->ARM_cpsr & MODE_MASK;
13 +
14 + /*
15 + * Always clear the F (FIQ) and A (delayed abort) bits
16 + */
17 + regs->ARM_cpsr &= ~(PSR_F_BIT | PSR_A_BIT);
18 +
19 + if ((regs->ARM_cpsr & PSR_I_BIT) == 0) {
20 + if (mode == USR_MODE)
21 + return 1;
22 + if (elf_hwcap & HWCAP_26BIT && mode == USR26_MODE)
23 + return 1;
24 }
25
26 /*
27 * Force CPSR to something logical...
28 */
29 - regs->ARM_cpsr &= PSR_f | PSR_s | (PSR_x & ~PSR_A_BIT) | PSR_T_BIT | MODE32_BIT;
30 + regs->ARM_cpsr &= PSR_f | PSR_s | PSR_x | PSR_T_BIT | MODE32_BIT;
31 if (!(elf_hwcap & HWCAP_26BIT))
32 regs->ARM_cpsr |= USR_MODE;
33
34 diff --git a/arch/arm/mach-ixp4xx/ixdp425-setup.c b/arch/arm/mach-ixp4xx/ixdp425-setup.c
35 index 827cbc4..ea9ee4e 100644
36 --- a/arch/arm/mach-ixp4xx/ixdp425-setup.c
37 +++ b/arch/arm/mach-ixp4xx/ixdp425-setup.c
38 @@ -100,6 +100,7 @@ ixdp425_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
39
40 static struct platform_nand_data ixdp425_flash_nand_data = {
41 .chip = {
42 + .nr_chips = 1,
43 .chip_delay = 30,
44 .options = NAND_NO_AUTOINCR,
45 #ifdef CONFIG_MTD_PARTITIONS
46 diff --git a/arch/arm/mach-mx3/mach-qong.c b/arch/arm/mach-mx3/mach-qong.c
47 index e5b5b83..1f9363f 100644
48 --- a/arch/arm/mach-mx3/mach-qong.c
49 +++ b/arch/arm/mach-mx3/mach-qong.c
50 @@ -169,6 +169,7 @@ static void qong_nand_select_chip(struct mtd_info *mtd, int chip)
51
52 static struct platform_nand_data qong_nand_data = {
53 .chip = {
54 + .nr_chips = 1,
55 .chip_delay = 20,
56 .options = 0,
57 },
58 diff --git a/arch/arm/mach-orion5x/ts78xx-setup.c b/arch/arm/mach-orion5x/ts78xx-setup.c
59 index 5041d1b..696b1a9 100644
60 --- a/arch/arm/mach-orion5x/ts78xx-setup.c
61 +++ b/arch/arm/mach-orion5x/ts78xx-setup.c
62 @@ -216,6 +216,7 @@ static struct mtd_partition ts78xx_ts_nand_parts[] = {
63
64 static struct platform_nand_data ts78xx_ts_nand_data = {
65 .chip = {
66 + .nr_chips = 1,
67 .part_probe_types = ts_nand_part_probes,
68 .partitions = ts78xx_ts_nand_parts,
69 .nr_partitions = ARRAY_SIZE(ts78xx_ts_nand_parts),
70 diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c
71 index 9eaf5b0..68a27bc 100644
72 --- a/arch/blackfin/mach-bf537/boards/stamp.c
73 +++ b/arch/blackfin/mach-bf537/boards/stamp.c
74 @@ -400,6 +400,7 @@ static int bfin_plat_nand_dev_ready(struct mtd_info *mtd)
75
76 static struct platform_nand_data bfin_plat_nand_data = {
77 .chip = {
78 + .nr_chips = 1,
79 .chip_delay = 30,
80 #ifdef CONFIG_MTD_PARTITIONS
81 .part_probe_types = part_probes,
82 diff --git a/arch/blackfin/mach-bf561/boards/acvilon.c b/arch/blackfin/mach-bf561/boards/acvilon.c
83 index bfcfa86..35b6d12 100644
84 --- a/arch/blackfin/mach-bf561/boards/acvilon.c
85 +++ b/arch/blackfin/mach-bf561/boards/acvilon.c
86 @@ -284,6 +284,7 @@ static int bfin_plat_nand_dev_ready(struct mtd_info *mtd)
87
88 static struct platform_nand_data bfin_plat_nand_data = {
89 .chip = {
90 + .nr_chips = 1,
91 .chip_delay = 30,
92 #ifdef CONFIG_MTD_PARTITIONS
93 .part_probe_types = part_probes,
94 diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
95 index 5d2f17d..b2e3635 100644
96 --- a/arch/powerpc/Makefile
97 +++ b/arch/powerpc/Makefile
98 @@ -164,7 +164,7 @@ drivers-$(CONFIG_OPROFILE) += arch/powerpc/oprofile/
99 all: zImage
100
101 # With make 3.82 we cannot mix normal and wildcard targets
102 -BOOT_TARGETS1 := zImage zImage.initrd uImaged
103 +BOOT_TARGETS1 := zImage zImage.initrd uImage
104 BOOT_TARGETS2 := zImage% dtbImage% treeImage.% cuImage.% simpleImage.%
105
106 PHONY += $(BOOT_TARGETS1) $(BOOT_TARGETS2)
107 diff --git a/arch/sparc/include/asm/atomic_64.h b/arch/sparc/include/asm/atomic_64.h
108 index 2050ca0..bdb2ff8 100644
109 --- a/arch/sparc/include/asm/atomic_64.h
110 +++ b/arch/sparc/include/asm/atomic_64.h
111 @@ -20,14 +20,14 @@
112 #define atomic64_set(v, i) (((v)->counter) = i)
113
114 extern void atomic_add(int, atomic_t *);
115 -extern void atomic64_add(int, atomic64_t *);
116 +extern void atomic64_add(long, atomic64_t *);
117 extern void atomic_sub(int, atomic_t *);
118 -extern void atomic64_sub(int, atomic64_t *);
119 +extern void atomic64_sub(long, atomic64_t *);
120
121 extern int atomic_add_ret(int, atomic_t *);
122 -extern int atomic64_add_ret(int, atomic64_t *);
123 +extern long atomic64_add_ret(long, atomic64_t *);
124 extern int atomic_sub_ret(int, atomic_t *);
125 -extern int atomic64_sub_ret(int, atomic64_t *);
126 +extern long atomic64_sub_ret(long, atomic64_t *);
127
128 #define atomic_dec_return(v) atomic_sub_ret(1, v)
129 #define atomic64_dec_return(v) atomic64_sub_ret(1, v)
130 @@ -91,7 +91,7 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u)
131 ((__typeof__((v)->counter))cmpxchg(&((v)->counter), (o), (n)))
132 #define atomic64_xchg(v, new) (xchg(&((v)->counter), new))
133
134 -static inline int atomic64_add_unless(atomic64_t *v, long a, long u)
135 +static inline long atomic64_add_unless(atomic64_t *v, long a, long u)
136 {
137 long c, old;
138 c = atomic64_read(v);
139 diff --git a/arch/sparc/include/asm/fb.h b/arch/sparc/include/asm/fb.h
140 index e834880..2173432 100644
141 --- a/arch/sparc/include/asm/fb.h
142 +++ b/arch/sparc/include/asm/fb.h
143 @@ -1,5 +1,6 @@
144 #ifndef _SPARC_FB_H_
145 #define _SPARC_FB_H_
146 +#include <linux/console.h>
147 #include <linux/fb.h>
148 #include <linux/fs.h>
149 #include <asm/page.h>
150 @@ -18,6 +19,9 @@ static inline int fb_is_primary_device(struct fb_info *info)
151 struct device *dev = info->device;
152 struct device_node *node;
153
154 + if (console_set_on_cmdline)
155 + return 0;
156 +
157 node = dev->of_node;
158 if (node &&
159 node == of_console_device)
160 diff --git a/arch/sparc/include/asm/parport.h b/arch/sparc/include/asm/parport.h
161 index c333b8d..d21ad50 100644
162 --- a/arch/sparc/include/asm/parport.h
163 +++ b/arch/sparc/include/asm/parport.h
164 @@ -228,6 +228,10 @@ static const struct of_device_id ecpp_match[] = {
165 .name = "parallel",
166 .compatible = "ns87317-ecpp",
167 },
168 + {
169 + .name = "parallel",
170 + .compatible = "pnpALI,1533,3",
171 + },
172 {},
173 };
174
175 diff --git a/arch/sparc/include/asm/rwsem-const.h b/arch/sparc/include/asm/rwsem-const.h
176 index a303c9d..e4c61a1 100644
177 --- a/arch/sparc/include/asm/rwsem-const.h
178 +++ b/arch/sparc/include/asm/rwsem-const.h
179 @@ -5,7 +5,7 @@
180 #define RWSEM_UNLOCKED_VALUE 0x00000000
181 #define RWSEM_ACTIVE_BIAS 0x00000001
182 #define RWSEM_ACTIVE_MASK 0x0000ffff
183 -#define RWSEM_WAITING_BIAS 0xffff0000
184 +#define RWSEM_WAITING_BIAS (-0x00010000)
185 #define RWSEM_ACTIVE_READ_BIAS RWSEM_ACTIVE_BIAS
186 #define RWSEM_ACTIVE_WRITE_BIAS (RWSEM_WAITING_BIAS + RWSEM_ACTIVE_BIAS)
187
188 diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
189 index dcb0593..f942bb7 100644
190 --- a/arch/x86/Kconfig
191 +++ b/arch/x86/Kconfig
192 @@ -247,6 +247,11 @@ config ARCH_HWEIGHT_CFLAGS
193
194 config KTIME_SCALAR
195 def_bool X86_32
196 +
197 +config ARCH_CPU_PROBE_RELEASE
198 + def_bool y
199 + depends on HOTPLUG_CPU
200 +
201 source "init/Kconfig"
202 source "kernel/Kconfig.freezer"
203
204 diff --git a/arch/x86/include/asm/cmpxchg_32.h b/arch/x86/include/asm/cmpxchg_32.h
205 index c1cf59d..20955ea 100644
206 --- a/arch/x86/include/asm/cmpxchg_32.h
207 +++ b/arch/x86/include/asm/cmpxchg_32.h
208 @@ -53,60 +53,33 @@ struct __xchg_dummy {
209 __xchg((v), (ptr), sizeof(*ptr))
210
211 /*
212 - * The semantics of XCHGCMP8B are a bit strange, this is why
213 - * there is a loop and the loading of %%eax and %%edx has to
214 - * be inside. This inlines well in most cases, the cached
215 - * cost is around ~38 cycles. (in the future we might want
216 - * to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
217 - * might have an implicit FPU-save as a cost, so it's not
218 - * clear which path to go.)
219 + * CMPXCHG8B only writes to the target if we had the previous
220 + * value in registers, otherwise it acts as a read and gives us the
221 + * "new previous" value. That is why there is a loop. Preloading
222 + * EDX:EAX is a performance optimization: in the common case it means
223 + * we need only one locked operation.
224 *
225 - * cmpxchg8b must be used with the lock prefix here to allow
226 - * the instruction to be executed atomically, see page 3-102
227 - * of the instruction set reference 24319102.pdf. We need
228 - * the reader side to see the coherent 64bit value.
229 + * A SIMD/3DNOW!/MMX/FPU 64-bit store here would require at the very
230 + * least an FPU save and/or %cr0.ts manipulation.
231 + *
232 + * cmpxchg8b must be used with the lock prefix here to allow the
233 + * instruction to be executed atomically. We need to have the reader
234 + * side to see the coherent 64bit value.
235 */
236 -static inline void __set_64bit(unsigned long long *ptr,
237 - unsigned int low, unsigned int high)
238 +static inline void set_64bit(volatile u64 *ptr, u64 value)
239 {
240 + u32 low = value;
241 + u32 high = value >> 32;
242 + u64 prev = *ptr;
243 +
244 asm volatile("\n1:\t"
245 - "movl (%1), %%eax\n\t"
246 - "movl 4(%1), %%edx\n\t"
247 - LOCK_PREFIX "cmpxchg8b (%1)\n\t"
248 + LOCK_PREFIX "cmpxchg8b %0\n\t"
249 "jnz 1b"
250 - : "=m" (*ptr)
251 - : "D" (ptr),
252 - "b" (low),
253 - "c" (high)
254 - : "ax", "dx", "memory");
255 -}
256 -
257 -static inline void __set_64bit_constant(unsigned long long *ptr,
258 - unsigned long long value)
259 -{
260 - __set_64bit(ptr, (unsigned int)value, (unsigned int)(value >> 32));
261 -}
262 -
263 -#define ll_low(x) *(((unsigned int *)&(x)) + 0)
264 -#define ll_high(x) *(((unsigned int *)&(x)) + 1)
265 -
266 -static inline void __set_64bit_var(unsigned long long *ptr,
267 - unsigned long long value)
268 -{
269 - __set_64bit(ptr, ll_low(value), ll_high(value));
270 + : "=m" (*ptr), "+A" (prev)
271 + : "b" (low), "c" (high)
272 + : "memory");
273 }
274
275 -#define set_64bit(ptr, value) \
276 - (__builtin_constant_p((value)) \
277 - ? __set_64bit_constant((ptr), (value)) \
278 - : __set_64bit_var((ptr), (value)))
279 -
280 -#define _set_64bit(ptr, value) \
281 - (__builtin_constant_p(value) \
282 - ? __set_64bit(ptr, (unsigned int)(value), \
283 - (unsigned int)((value) >> 32)) \
284 - : __set_64bit(ptr, ll_low((value)), ll_high((value))))
285 -
286 extern void __cmpxchg_wrong_size(void);
287
288 /*
289 diff --git a/arch/x86/include/asm/cmpxchg_64.h b/arch/x86/include/asm/cmpxchg_64.h
290 index b92f147..9596e7c 100644
291 --- a/arch/x86/include/asm/cmpxchg_64.h
292 +++ b/arch/x86/include/asm/cmpxchg_64.h
293 @@ -5,13 +5,11 @@
294
295 #define __xg(x) ((volatile long *)(x))
296
297 -static inline void set_64bit(volatile unsigned long *ptr, unsigned long val)
298 +static inline void set_64bit(volatile u64 *ptr, u64 val)
299 {
300 *ptr = val;
301 }
302
303 -#define _set_64bit set_64bit
304 -
305 extern void __xchg_wrong_size(void);
306 extern void __cmpxchg_wrong_size(void);
307
308 diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
309 index a96489e..c07e513 100644
310 --- a/arch/x86/kernel/apic/apic.c
311 +++ b/arch/x86/kernel/apic/apic.c
312 @@ -1606,7 +1606,7 @@ void __init init_apic_mappings(void)
313 * acpi lapic path already maps that address in
314 * acpi_register_lapic_address()
315 */
316 - if (!acpi_lapic)
317 + if (!acpi_lapic && !smp_found_config)
318 set_fixmap_nocache(FIX_APIC_BASE, apic_phys);
319
320 apic_printk(APIC_VERBOSE, "mapped APIC to %08lx (%08lx)\n",
321 diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
322 index e41ed24..2b18af1 100644
323 --- a/arch/x86/kernel/apic/io_apic.c
324 +++ b/arch/x86/kernel/apic/io_apic.c
325 @@ -1728,6 +1728,8 @@ __apicdebuginit(void) print_IO_APIC(void)
326 struct irq_pin_list *entry;
327
328 cfg = desc->chip_data;
329 + if (!cfg)
330 + continue;
331 entry = cfg->irq_2_pin;
332 if (!entry)
333 continue;
334 diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c
335 index 214ac86..d8d86d0 100644
336 --- a/arch/x86/kernel/cpu/perf_event_intel.c
337 +++ b/arch/x86/kernel/cpu/perf_event_intel.c
338 @@ -491,33 +491,78 @@ static void intel_pmu_enable_all(int added)
339 * Intel Errata AAP53 (model 30)
340 * Intel Errata BD53 (model 44)
341 *
342 - * These chips need to be 'reset' when adding counters by programming
343 - * the magic three (non counting) events 0x4300D2, 0x4300B1 and 0x4300B5
344 - * either in sequence on the same PMC or on different PMCs.
345 + * The official story:
346 + * These chips need to be 'reset' when adding counters by programming the
347 + * magic three (non-counting) events 0x4300B5, 0x4300D2, and 0x4300B1 either
348 + * in sequence on the same PMC or on different PMCs.
349 + *
350 + * In practise it appears some of these events do in fact count, and
351 + * we need to programm all 4 events.
352 */
353 -static void intel_pmu_nhm_enable_all(int added)
354 +static void intel_pmu_nhm_workaround(void)
355 {
356 - if (added) {
357 - struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
358 - int i;
359 + struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
360 + static const unsigned long nhm_magic[4] = {
361 + 0x4300B5,
362 + 0x4300D2,
363 + 0x4300B1,
364 + 0x4300B1
365 + };
366 + struct perf_event *event;
367 + int i;
368 +
369 + /*
370 + * The Errata requires below steps:
371 + * 1) Clear MSR_IA32_PEBS_ENABLE and MSR_CORE_PERF_GLOBAL_CTRL;
372 + * 2) Configure 4 PERFEVTSELx with the magic events and clear
373 + * the corresponding PMCx;
374 + * 3) set bit0~bit3 of MSR_CORE_PERF_GLOBAL_CTRL;
375 + * 4) Clear MSR_CORE_PERF_GLOBAL_CTRL;
376 + * 5) Clear 4 pairs of ERFEVTSELx and PMCx;
377 + */
378 +
379 + /*
380 + * The real steps we choose are a little different from above.
381 + * A) To reduce MSR operations, we don't run step 1) as they
382 + * are already cleared before this function is called;
383 + * B) Call x86_perf_event_update to save PMCx before configuring
384 + * PERFEVTSELx with magic number;
385 + * C) With step 5), we do clear only when the PERFEVTSELx is
386 + * not used currently.
387 + * D) Call x86_perf_event_set_period to restore PMCx;
388 + */
389
390 - wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 0, 0x4300D2);
391 - wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 1, 0x4300B1);
392 - wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + 2, 0x4300B5);
393 + /* We always operate 4 pairs of PERF Counters */
394 + for (i = 0; i < 4; i++) {
395 + event = cpuc->events[i];
396 + if (event)
397 + x86_perf_event_update(event);
398 + }
399
400 - wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0x3);
401 - wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0x0);
402 + for (i = 0; i < 4; i++) {
403 + wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + i, nhm_magic[i]);
404 + wrmsrl(MSR_ARCH_PERFMON_PERFCTR0 + i, 0x0);
405 + }
406
407 - for (i = 0; i < 3; i++) {
408 - struct perf_event *event = cpuc->events[i];
409 + wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0xf);
410 + wrmsrl(MSR_CORE_PERF_GLOBAL_CTRL, 0x0);
411
412 - if (!event)
413 - continue;
414 + for (i = 0; i < 4; i++) {
415 + event = cpuc->events[i];
416
417 + if (event) {
418 + x86_perf_event_set_period(event);
419 __x86_pmu_enable_event(&event->hw,
420 - ARCH_PERFMON_EVENTSEL_ENABLE);
421 - }
422 + ARCH_PERFMON_EVENTSEL_ENABLE);
423 + } else
424 + wrmsrl(MSR_ARCH_PERFMON_EVENTSEL0 + i, 0x0);
425 }
426 +}
427 +
428 +static void intel_pmu_nhm_enable_all(int added)
429 +{
430 + if (added)
431 + intel_pmu_nhm_workaround();
432 intel_pmu_enable_all(added);
433 }
434
435 diff --git a/arch/x86/kernel/cpu/perf_event_p4.c b/arch/x86/kernel/cpu/perf_event_p4.c
436 index ae85d69..0ffe19e 100644
437 --- a/arch/x86/kernel/cpu/perf_event_p4.c
438 +++ b/arch/x86/kernel/cpu/perf_event_p4.c
439 @@ -581,6 +581,7 @@ static int p4_pmu_handle_irq(struct pt_regs *regs)
440 cpuc = &__get_cpu_var(cpu_hw_events);
441
442 for (idx = 0; idx < x86_pmu.num_counters; idx++) {
443 + int overflow;
444
445 if (!test_bit(idx, cpuc->active_mask))
446 continue;
447 @@ -591,12 +592,14 @@ static int p4_pmu_handle_irq(struct pt_regs *regs)
448 WARN_ON_ONCE(hwc->idx != idx);
449
450 /* it might be unflagged overflow */
451 - handled = p4_pmu_clear_cccr_ovf(hwc);
452 + overflow = p4_pmu_clear_cccr_ovf(hwc);
453
454 val = x86_perf_event_update(event);
455 - if (!handled && (val & (1ULL << (x86_pmu.cntval_bits - 1))))
456 + if (!overflow && (val & (1ULL << (x86_pmu.cntval_bits - 1))))
457 continue;
458
459 + handled += overflow;
460 +
461 /* event overflow for sure */
462 data.period = event->hw.last_period;
463
464 @@ -612,7 +615,7 @@ static int p4_pmu_handle_irq(struct pt_regs *regs)
465 inc_irq_stat(apic_perf_irqs);
466 }
467
468 - return handled;
469 + return handled > 0;
470 }
471
472 /*
473 diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c
474 index d86dbf7..d7b6f7f 100644
475 --- a/arch/x86/kernel/mpparse.c
476 +++ b/arch/x86/kernel/mpparse.c
477 @@ -274,6 +274,18 @@ static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt)
478
479 void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { }
480
481 +static void __init smp_register_lapic_address(unsigned long address)
482 +{
483 + mp_lapic_addr = address;
484 +
485 + set_fixmap_nocache(FIX_APIC_BASE, address);
486 + if (boot_cpu_physical_apicid == -1U) {
487 + boot_cpu_physical_apicid = read_apic_id();
488 + apic_version[boot_cpu_physical_apicid] =
489 + GET_APIC_VERSION(apic_read(APIC_LVR));
490 + }
491 +}
492 +
493 static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
494 {
495 char str[16];
496 @@ -295,6 +307,10 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
497 if (early)
498 return 1;
499
500 + /* Initialize the lapic mapping */
501 + if (!acpi_lapic)
502 + smp_register_lapic_address(mpc->lapic);
503 +
504 if (mpc->oemptr)
505 x86_init.mpparse.smp_read_mpc_oem(mpc);
506
507 diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
508 index 11015fd..0bf2ece 100644
509 --- a/arch/x86/kernel/smpboot.c
510 +++ b/arch/x86/kernel/smpboot.c
511 @@ -91,6 +91,25 @@ DEFINE_PER_CPU(int, cpu_state) = { 0 };
512 static DEFINE_PER_CPU(struct task_struct *, idle_thread_array);
513 #define get_idle_for_cpu(x) (per_cpu(idle_thread_array, x))
514 #define set_idle_for_cpu(x, p) (per_cpu(idle_thread_array, x) = (p))
515 +
516 +/*
517 + * We need this for trampoline_base protection from concurrent accesses when
518 + * off- and onlining cores wildly.
519 + */
520 +static DEFINE_MUTEX(x86_cpu_hotplug_driver_mutex);
521 +
522 +void cpu_hotplug_driver_lock()
523 +{
524 + mutex_lock(&x86_cpu_hotplug_driver_mutex);
525 +}
526 +
527 +void cpu_hotplug_driver_unlock()
528 +{
529 + mutex_unlock(&x86_cpu_hotplug_driver_mutex);
530 +}
531 +
532 +ssize_t arch_cpu_probe(const char *buf, size_t count) { return -1; }
533 +ssize_t arch_cpu_release(const char *buf, size_t count) { return -1; }
534 #else
535 static struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ;
536 #define get_idle_for_cpu(x) (idle_thread_array[(x)])
537 diff --git a/arch/x86/lib/atomic64_386_32.S b/arch/x86/lib/atomic64_386_32.S
538 index 4a5979a..78ee8e0 100644
539 --- a/arch/x86/lib/atomic64_386_32.S
540 +++ b/arch/x86/lib/atomic64_386_32.S
541 @@ -25,150 +25,170 @@
542 CFI_ADJUST_CFA_OFFSET -4
543 .endm
544
545 -.macro BEGIN func reg
546 -$v = \reg
547 -
548 -ENTRY(atomic64_\func\()_386)
549 - CFI_STARTPROC
550 - LOCK $v
551 -
552 -.macro RETURN
553 - UNLOCK $v
554 +#define BEGIN(op) \
555 +.macro END; \
556 + CFI_ENDPROC; \
557 +ENDPROC(atomic64_##op##_386); \
558 +.purgem END; \
559 +.endm; \
560 +ENTRY(atomic64_##op##_386); \
561 + CFI_STARTPROC; \
562 + LOCK v;
563 +
564 +#define RET \
565 + UNLOCK v; \
566 ret
567 -.endm
568 -
569 -.macro END_
570 - CFI_ENDPROC
571 -ENDPROC(atomic64_\func\()_386)
572 -.purgem RETURN
573 -.purgem END_
574 -.purgem END
575 -.endm
576 -
577 -.macro END
578 -RETURN
579 -END_
580 -.endm
581 -.endm
582 -
583 -BEGIN read %ecx
584 - movl ($v), %eax
585 - movl 4($v), %edx
586 -END
587 -
588 -BEGIN set %esi
589 - movl %ebx, ($v)
590 - movl %ecx, 4($v)
591 -END
592 -
593 -BEGIN xchg %esi
594 - movl ($v), %eax
595 - movl 4($v), %edx
596 - movl %ebx, ($v)
597 - movl %ecx, 4($v)
598 -END
599 -
600 -BEGIN add %ecx
601 - addl %eax, ($v)
602 - adcl %edx, 4($v)
603 -END
604
605 -BEGIN add_return %ecx
606 - addl ($v), %eax
607 - adcl 4($v), %edx
608 - movl %eax, ($v)
609 - movl %edx, 4($v)
610 -END
611 -
612 -BEGIN sub %ecx
613 - subl %eax, ($v)
614 - sbbl %edx, 4($v)
615 -END
616 -
617 -BEGIN sub_return %ecx
618 +#define RET_END \
619 + RET; \
620 + END
621 +
622 +#define v %ecx
623 +BEGIN(read)
624 + movl (v), %eax
625 + movl 4(v), %edx
626 +RET_END
627 +#undef v
628 +
629 +#define v %esi
630 +BEGIN(set)
631 + movl %ebx, (v)
632 + movl %ecx, 4(v)
633 +RET_END
634 +#undef v
635 +
636 +#define v %esi
637 +BEGIN(xchg)
638 + movl (v), %eax
639 + movl 4(v), %edx
640 + movl %ebx, (v)
641 + movl %ecx, 4(v)
642 +RET_END
643 +#undef v
644 +
645 +#define v %ecx
646 +BEGIN(add)
647 + addl %eax, (v)
648 + adcl %edx, 4(v)
649 +RET_END
650 +#undef v
651 +
652 +#define v %ecx
653 +BEGIN(add_return)
654 + addl (v), %eax
655 + adcl 4(v), %edx
656 + movl %eax, (v)
657 + movl %edx, 4(v)
658 +RET_END
659 +#undef v
660 +
661 +#define v %ecx
662 +BEGIN(sub)
663 + subl %eax, (v)
664 + sbbl %edx, 4(v)
665 +RET_END
666 +#undef v
667 +
668 +#define v %ecx
669 +BEGIN(sub_return)
670 negl %edx
671 negl %eax
672 sbbl $0, %edx
673 - addl ($v), %eax
674 - adcl 4($v), %edx
675 - movl %eax, ($v)
676 - movl %edx, 4($v)
677 -END
678 -
679 -BEGIN inc %esi
680 - addl $1, ($v)
681 - adcl $0, 4($v)
682 -END
683 -
684 -BEGIN inc_return %esi
685 - movl ($v), %eax
686 - movl 4($v), %edx
687 + addl (v), %eax
688 + adcl 4(v), %edx
689 + movl %eax, (v)
690 + movl %edx, 4(v)
691 +RET_END
692 +#undef v
693 +
694 +#define v %esi
695 +BEGIN(inc)
696 + addl $1, (v)
697 + adcl $0, 4(v)
698 +RET_END
699 +#undef v
700 +
701 +#define v %esi
702 +BEGIN(inc_return)
703 + movl (v), %eax
704 + movl 4(v), %edx
705 addl $1, %eax
706 adcl $0, %edx
707 - movl %eax, ($v)
708 - movl %edx, 4($v)
709 -END
710 -
711 -BEGIN dec %esi
712 - subl $1, ($v)
713 - sbbl $0, 4($v)
714 -END
715 -
716 -BEGIN dec_return %esi
717 - movl ($v), %eax
718 - movl 4($v), %edx
719 + movl %eax, (v)
720 + movl %edx, 4(v)
721 +RET_END
722 +#undef v
723 +
724 +#define v %esi
725 +BEGIN(dec)
726 + subl $1, (v)
727 + sbbl $0, 4(v)
728 +RET_END
729 +#undef v
730 +
731 +#define v %esi
732 +BEGIN(dec_return)
733 + movl (v), %eax
734 + movl 4(v), %edx
735 subl $1, %eax
736 sbbl $0, %edx
737 - movl %eax, ($v)
738 - movl %edx, 4($v)
739 -END
740 + movl %eax, (v)
741 + movl %edx, 4(v)
742 +RET_END
743 +#undef v
744
745 -BEGIN add_unless %ecx
746 +#define v %ecx
747 +BEGIN(add_unless)
748 addl %eax, %esi
749 adcl %edx, %edi
750 - addl ($v), %eax
751 - adcl 4($v), %edx
752 + addl (v), %eax
753 + adcl 4(v), %edx
754 cmpl %eax, %esi
755 je 3f
756 1:
757 - movl %eax, ($v)
758 - movl %edx, 4($v)
759 + movl %eax, (v)
760 + movl %edx, 4(v)
761 movl $1, %eax
762 2:
763 -RETURN
764 + RET
765 3:
766 cmpl %edx, %edi
767 jne 1b
768 xorl %eax, %eax
769 jmp 2b
770 -END_
771 +END
772 +#undef v
773
774 -BEGIN inc_not_zero %esi
775 - movl ($v), %eax
776 - movl 4($v), %edx
777 +#define v %esi
778 +BEGIN(inc_not_zero)
779 + movl (v), %eax
780 + movl 4(v), %edx
781 testl %eax, %eax
782 je 3f
783 1:
784 addl $1, %eax
785 adcl $0, %edx
786 - movl %eax, ($v)
787 - movl %edx, 4($v)
788 + movl %eax, (v)
789 + movl %edx, 4(v)
790 movl $1, %eax
791 2:
792 -RETURN
793 + RET
794 3:
795 testl %edx, %edx
796 jne 1b
797 jmp 2b
798 -END_
799 +END
800 +#undef v
801
802 -BEGIN dec_if_positive %esi
803 - movl ($v), %eax
804 - movl 4($v), %edx
805 +#define v %esi
806 +BEGIN(dec_if_positive)
807 + movl (v), %eax
808 + movl 4(v), %edx
809 subl $1, %eax
810 sbbl $0, %edx
811 js 1f
812 - movl %eax, ($v)
813 - movl %edx, 4($v)
814 + movl %eax, (v)
815 + movl %edx, 4(v)
816 1:
817 -END
818 +RET_END
819 +#undef v
820 diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c
821 index b28d2f1..f6b48f6 100644
822 --- a/arch/x86/oprofile/nmi_int.c
823 +++ b/arch/x86/oprofile/nmi_int.c
824 @@ -634,6 +634,18 @@ static int __init ppro_init(char **cpu_type)
825 if (force_arch_perfmon && cpu_has_arch_perfmon)
826 return 0;
827
828 + /*
829 + * Documentation on identifying Intel processors by CPU family
830 + * and model can be found in the Intel Software Developer's
831 + * Manuals (SDM):
832 + *
833 + * http://www.intel.com/products/processor/manuals/
834 + *
835 + * As of May 2010 the documentation for this was in the:
836 + * "Intel 64 and IA-32 Architectures Software Developer's
837 + * Manual Volume 3B: System Programming Guide", "Table B-1
838 + * CPUID Signature Values of DisplayFamily_DisplayModel".
839 + */
840 switch (cpu_model) {
841 case 0 ... 2:
842 *cpu_type = "i386/ppro";
843 @@ -655,12 +667,13 @@ static int __init ppro_init(char **cpu_type)
844 case 15: case 23:
845 *cpu_type = "i386/core_2";
846 break;
847 + case 0x1a:
848 + case 0x1e:
849 case 0x2e:
850 - case 26:
851 spec = &op_arch_perfmon_spec;
852 *cpu_type = "i386/core_i7";
853 break;
854 - case 28:
855 + case 0x1c:
856 *cpu_type = "i386/atom";
857 break;
858 default:
859 diff --git a/drivers/acpi/apei/erst.c b/drivers/acpi/apei/erst.c
860 index 864dd46..18645f4 100644
861 --- a/drivers/acpi/apei/erst.c
862 +++ b/drivers/acpi/apei/erst.c
863 @@ -33,6 +33,7 @@
864 #include <linux/uaccess.h>
865 #include <linux/cper.h>
866 #include <linux/nmi.h>
867 +#include <linux/hardirq.h>
868 #include <acpi/apei.h>
869
870 #include "apei-internal.h"
871 diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c
872 index a754715..d84af6c 100644
873 --- a/drivers/char/agp/intel-gtt.c
874 +++ b/drivers/char/agp/intel-gtt.c
875 @@ -25,6 +25,10 @@
876 #define USE_PCI_DMA_API 1
877 #endif
878
879 +/* Max amount of stolen space, anything above will be returned to Linux */
880 +int intel_max_stolen = 32 * 1024 * 1024;
881 +EXPORT_SYMBOL(intel_max_stolen);
882 +
883 static const struct aper_size_info_fixed intel_i810_sizes[] =
884 {
885 {64, 16384, 4},
886 @@ -710,7 +714,12 @@ static void intel_i830_init_gtt_entries(void)
887 break;
888 }
889 }
890 - if (gtt_entries > 0) {
891 + if (!local && gtt_entries > intel_max_stolen) {
892 + dev_info(&agp_bridge->dev->dev,
893 + "detected %dK stolen memory, trimming to %dK\n",
894 + gtt_entries / KB(1), intel_max_stolen / KB(1));
895 + gtt_entries = intel_max_stolen / KB(4);
896 + } else if (gtt_entries > 0) {
897 dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
898 gtt_entries / KB(1), local ? "local" : "stolen");
899 gtt_entries /= KB(4);
900 diff --git a/drivers/char/mem.c b/drivers/char/mem.c
901 index f54dab8..a398ecd 100644
902 --- a/drivers/char/mem.c
903 +++ b/drivers/char/mem.c
904 @@ -916,7 +916,7 @@ static int __init chr_dev_init(void)
905 NULL, devlist[minor].name);
906 }
907
908 - return 0;
909 + return tty_init();
910 }
911
912 fs_initcall(chr_dev_init);
913 diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
914 index d71f0fc..507441a 100644
915 --- a/drivers/char/tty_io.c
916 +++ b/drivers/char/tty_io.c
917 @@ -3128,7 +3128,7 @@ static struct cdev tty_cdev, console_cdev;
918 * Ok, now we can initialize the rest of the tty devices and can count
919 * on memory allocations, interrupts etc..
920 */
921 -static int __init tty_init(void)
922 +int __init tty_init(void)
923 {
924 cdev_init(&tty_cdev, &tty_fops);
925 if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
926 @@ -3149,4 +3149,4 @@ static int __init tty_init(void)
927 #endif
928 return 0;
929 }
930 -module_init(tty_init);
931 +
932 diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
933 index 4a66201..c9736ed 100644
934 --- a/drivers/gpu/drm/drm_drv.c
935 +++ b/drivers/gpu/drm/drm_drv.c
936 @@ -502,7 +502,9 @@ long drm_ioctl(struct file *filp,
937 retcode = -EFAULT;
938 goto err_i1;
939 }
940 - }
941 + } else
942 + memset(kdata, 0, _IOC_SIZE(cmd));
943 +
944 if (ioctl->flags & DRM_UNLOCKED)
945 retcode = func(dev, kdata, file_priv);
946 else {
947 diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
948 index 2305a12..013a0ae 100644
949 --- a/drivers/gpu/drm/i915/i915_dma.c
950 +++ b/drivers/gpu/drm/i915/i915_dma.c
951 @@ -40,6 +40,8 @@
952 #include <linux/vga_switcheroo.h>
953 #include <linux/slab.h>
954
955 +extern int intel_max_stolen; /* from AGP driver */
956 +
957 /**
958 * Sets up the hardware status page for devices that need a physical address
959 * in the register.
960 @@ -2104,6 +2106,12 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
961 if (ret)
962 goto out_iomapfree;
963
964 + if (prealloc_size > intel_max_stolen) {
965 + DRM_INFO("detected %dM stolen memory, trimming to %dM\n",
966 + prealloc_size >> 20, intel_max_stolen >> 20);
967 + prealloc_size = intel_max_stolen;
968 + }
969 +
970 dev_priv->wq = create_singlethread_workqueue("i915");
971 if (dev_priv->wq == NULL) {
972 DRM_ERROR("Failed to create our workqueue.\n");
973 diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
974 index 8a84306..e9a4b12 100644
975 --- a/drivers/gpu/drm/i915/intel_display.c
976 +++ b/drivers/gpu/drm/i915/intel_display.c
977 @@ -1502,6 +1502,7 @@ static void ironlake_enable_pll_edp (struct drm_crtc *crtc)
978 dpa_ctl = I915_READ(DP_A);
979 dpa_ctl |= DP_PLL_ENABLE;
980 I915_WRITE(DP_A, dpa_ctl);
981 + POSTING_READ(DP_A);
982 udelay(200);
983 }
984
985 @@ -4816,14 +4817,16 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
986 work->pending_flip_obj = obj;
987
988 if (intel_crtc->plane)
989 - flip_mask = I915_DISPLAY_PLANE_B_FLIP_PENDING_INTERRUPT;
990 + flip_mask = MI_WAIT_FOR_PLANE_B_FLIP;
991 else
992 - flip_mask = I915_DISPLAY_PLANE_A_FLIP_PENDING_INTERRUPT;
993 + flip_mask = MI_WAIT_FOR_PLANE_A_FLIP;
994
995 - /* Wait for any previous flip to finish */
996 - if (IS_GEN3(dev))
997 - while (I915_READ(ISR) & flip_mask)
998 - ;
999 + if (IS_GEN3(dev) || IS_GEN2(dev)) {
1000 + BEGIN_LP_RING(2);
1001 + OUT_RING(MI_WAIT_FOR_EVENT | flip_mask);
1002 + OUT_RING(0);
1003 + ADVANCE_LP_RING();
1004 + }
1005
1006 /* Offset into the new buffer for cases of shared fbs between CRTCs */
1007 offset = obj_priv->gtt_offset;
1008 @@ -4837,12 +4840,18 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
1009 OUT_RING(offset | obj_priv->tiling_mode);
1010 pipesrc = I915_READ(pipesrc_reg);
1011 OUT_RING(pipesrc & 0x0fff0fff);
1012 - } else {
1013 + } else if (IS_GEN3(dev)) {
1014 OUT_RING(MI_DISPLAY_FLIP_I915 |
1015 MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
1016 OUT_RING(fb->pitch);
1017 OUT_RING(offset);
1018 OUT_RING(MI_NOOP);
1019 + } else {
1020 + OUT_RING(MI_DISPLAY_FLIP |
1021 + MI_DISPLAY_FLIP_PLANE(intel_crtc->plane));
1022 + OUT_RING(fb->pitch);
1023 + OUT_RING(offset);
1024 + OUT_RING(MI_NOOP);
1025 }
1026 ADVANCE_LP_RING();
1027
1028 diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c
1029 index 10673ae..6bfef51 100644
1030 --- a/drivers/gpu/drm/radeon/radeon_atombios.c
1031 +++ b/drivers/gpu/drm/radeon/radeon_atombios.c
1032 @@ -206,6 +206,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
1033 uint16_t *line_mux,
1034 struct radeon_hpd *hpd)
1035 {
1036 + struct radeon_device *rdev = dev->dev_private;
1037
1038 /* Asus M2A-VM HDMI board lists the DVI port as HDMI */
1039 if ((dev->pdev->device == 0x791e) &&
1040 @@ -308,13 +309,22 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev,
1041 }
1042 }
1043
1044 - /* Acer laptop reports DVI-D as DVI-I */
1045 + /* Acer laptop reports DVI-D as DVI-I and hpd pins reversed */
1046 if ((dev->pdev->device == 0x95c4) &&
1047 (dev->pdev->subsystem_vendor == 0x1025) &&
1048 (dev->pdev->subsystem_device == 0x013c)) {
1049 + struct radeon_gpio_rec gpio;
1050 +
1051 if ((*connector_type == DRM_MODE_CONNECTOR_DVII) &&
1052 - (supported_device == ATOM_DEVICE_DFP1_SUPPORT))
1053 + (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
1054 + gpio = radeon_lookup_gpio(rdev, 6);
1055 + *hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
1056 *connector_type = DRM_MODE_CONNECTOR_DVID;
1057 + } else if ((*connector_type == DRM_MODE_CONNECTOR_HDMIA) &&
1058 + (supported_device == ATOM_DEVICE_DFP1_SUPPORT)) {
1059 + gpio = radeon_lookup_gpio(rdev, 7);
1060 + *hpd = radeon_atom_get_hpd_info_from_gpio(rdev, &gpio);
1061 + }
1062 }
1063
1064 /* XFX Pine Group device rv730 reports no VGA DDC lines
1065 @@ -1049,7 +1059,7 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)
1066 }
1067 break;
1068 case 2:
1069 - if (igp_info->info_2.ucMemoryType & 0x0f)
1070 + if (igp_info->info_2.ulBootUpSidePortClock)
1071 return true;
1072 break;
1073 default:
1074 diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
1075 index dd279da..a718463 100644
1076 --- a/drivers/gpu/drm/radeon/radeon_device.c
1077 +++ b/drivers/gpu/drm/radeon/radeon_device.c
1078 @@ -199,7 +199,7 @@ void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64
1079 mc->mc_vram_size = mc->aper_size;
1080 }
1081 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
1082 - if (rdev->flags & RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_end <= mc->gtt_end) {
1083 + if (rdev->flags & RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_start <= mc->gtt_end) {
1084 dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
1085 mc->real_vram_size = mc->aper_size;
1086 mc->mc_vram_size = mc->aper_size;
1087 diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c
1088 index 5def6f5..0cd2704 100644
1089 --- a/drivers/gpu/drm/radeon/radeon_i2c.c
1090 +++ b/drivers/gpu/drm/radeon/radeon_i2c.c
1091 @@ -95,6 +95,13 @@ static void radeon_i2c_do_lock(struct radeon_i2c_chan *i2c, int lock_state)
1092 }
1093 }
1094
1095 + /* switch the pads to ddc mode */
1096 + if (ASIC_IS_DCE3(rdev) && rec->hw_capable) {
1097 + temp = RREG32(rec->mask_clk_reg);
1098 + temp &= ~(1 << 16);
1099 + WREG32(rec->mask_clk_reg, temp);
1100 + }
1101 +
1102 /* clear the output pin values */
1103 temp = RREG32(rec->a_clk_reg) & ~rec->a_clk_mask;
1104 WREG32(rec->a_clk_reg, temp);
1105 diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
1106 index 059bfa4..a108c7e 100644
1107 --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
1108 +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
1109 @@ -121,11 +121,12 @@ int radeon_irq_kms_init(struct radeon_device *rdev)
1110 * chips. Disable MSI on them for now.
1111 */
1112 if ((rdev->family >= CHIP_RV380) &&
1113 - (!(rdev->flags & RADEON_IS_IGP))) {
1114 + (!(rdev->flags & RADEON_IS_IGP)) &&
1115 + (!(rdev->flags & RADEON_IS_AGP))) {
1116 int ret = pci_enable_msi(rdev->pdev);
1117 if (!ret) {
1118 rdev->msi_enabled = 1;
1119 - DRM_INFO("radeon: using MSI.\n");
1120 + dev_info(rdev->dev, "radeon: using MSI.\n");
1121 }
1122 }
1123 rdev->irq.installed = true;
1124 diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c
1125 index ab389f8..b20379e 100644
1126 --- a/drivers/gpu/drm/radeon/radeon_kms.c
1127 +++ b/drivers/gpu/drm/radeon/radeon_kms.c
1128 @@ -106,7 +106,9 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
1129
1130 info = data;
1131 value_ptr = (uint32_t *)((unsigned long)info->value);
1132 - value = *value_ptr;
1133 + if (DRM_COPY_FROM_USER(&value, value_ptr, sizeof(value)))
1134 + return -EFAULT;
1135 +
1136 switch (info->request) {
1137 case RADEON_INFO_DEVICE_ID:
1138 value = dev->pci_device;
1139 diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
1140 index e1e5255..cf3a51f 100644
1141 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
1142 +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
1143 @@ -272,7 +272,7 @@ static uint8_t radeon_compute_pll_gain(uint16_t ref_freq, uint16_t ref_div,
1144 if (!ref_div)
1145 return 1;
1146
1147 - vcoFreq = ((unsigned)ref_freq & fb_div) / ref_div;
1148 + vcoFreq = ((unsigned)ref_freq * fb_div) / ref_div;
1149
1150 /*
1151 * This is horribly crude: the VCO frequency range is divided into
1152 diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
1153 index 3fa6984..c91b741 100644
1154 --- a/drivers/gpu/drm/radeon/radeon_pm.c
1155 +++ b/drivers/gpu/drm/radeon/radeon_pm.c
1156 @@ -224,6 +224,11 @@ static void radeon_pm_set_clocks(struct radeon_device *rdev)
1157 {
1158 int i;
1159
1160 + /* no need to take locks, etc. if nothing's going to change */
1161 + if ((rdev->pm.requested_clock_mode_index == rdev->pm.current_clock_mode_index) &&
1162 + (rdev->pm.requested_power_state_index == rdev->pm.current_power_state_index))
1163 + return;
1164 +
1165 mutex_lock(&rdev->ddev->struct_mutex);
1166 mutex_lock(&rdev->vram_mutex);
1167 mutex_lock(&rdev->cp.mutex);
1168 diff --git a/drivers/hwmon/pc87360.c b/drivers/hwmon/pc87360.c
1169 index 4a64b85..68e69a4 100644
1170 --- a/drivers/hwmon/pc87360.c
1171 +++ b/drivers/hwmon/pc87360.c
1172 @@ -1610,11 +1610,8 @@ static struct pc87360_data *pc87360_update_device(struct device *dev)
1173
1174 static int __init pc87360_device_add(unsigned short address)
1175 {
1176 - struct resource res = {
1177 - .name = "pc87360",
1178 - .flags = IORESOURCE_IO,
1179 - };
1180 - int err, i;
1181 + struct resource res[3];
1182 + int err, i, res_count;
1183
1184 pdev = platform_device_alloc("pc87360", address);
1185 if (!pdev) {
1186 @@ -1623,22 +1620,28 @@ static int __init pc87360_device_add(unsigned short address)
1187 goto exit;
1188 }
1189
1190 + memset(res, 0, 3 * sizeof(struct resource));
1191 + res_count = 0;
1192 for (i = 0; i < 3; i++) {
1193 if (!extra_isa[i])
1194 continue;
1195 - res.start = extra_isa[i];
1196 - res.end = extra_isa[i] + PC87360_EXTENT - 1;
1197 + res[res_count].start = extra_isa[i];
1198 + res[res_count].end = extra_isa[i] + PC87360_EXTENT - 1;
1199 + res[res_count].name = "pc87360",
1200 + res[res_count].flags = IORESOURCE_IO,
1201
1202 - err = acpi_check_resource_conflict(&res);
1203 + err = acpi_check_resource_conflict(&res[res_count]);
1204 if (err)
1205 goto exit_device_put;
1206
1207 - err = platform_device_add_resources(pdev, &res, 1);
1208 - if (err) {
1209 - printk(KERN_ERR "pc87360: Device resource[%d] "
1210 - "addition failed (%d)\n", i, err);
1211 - goto exit_device_put;
1212 - }
1213 + res_count++;
1214 + }
1215 +
1216 + err = platform_device_add_resources(pdev, res, res_count);
1217 + if (err) {
1218 + printk(KERN_ERR "pc87360: Device resources addition failed "
1219 + "(%d)\n", err);
1220 + goto exit_device_put;
1221 }
1222
1223 err = platform_device_add(pdev);
1224 diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c
1225 index 6fbe899..05b15ed 100644
1226 --- a/drivers/isdn/gigaset/capi.c
1227 +++ b/drivers/isdn/gigaset/capi.c
1228 @@ -378,13 +378,13 @@ void gigaset_skb_sent(struct bc_state *bcs, struct sk_buff *dskb)
1229 ++bcs->trans_up;
1230
1231 if (!ap) {
1232 - dev_err(cs->dev, "%s: no application\n", __func__);
1233 + gig_dbg(DEBUG_MCMD, "%s: application gone", __func__);
1234 return;
1235 }
1236
1237 /* don't send further B3 messages if disconnected */
1238 if (bcs->apconnstate < APCONN_ACTIVE) {
1239 - gig_dbg(DEBUG_LLDATA, "disconnected, discarding ack");
1240 + gig_dbg(DEBUG_MCMD, "%s: disconnected", __func__);
1241 return;
1242 }
1243
1244 @@ -422,13 +422,14 @@ void gigaset_skb_rcvd(struct bc_state *bcs, struct sk_buff *skb)
1245 bcs->trans_down++;
1246
1247 if (!ap) {
1248 - dev_err(cs->dev, "%s: no application\n", __func__);
1249 + gig_dbg(DEBUG_MCMD, "%s: application gone", __func__);
1250 + dev_kfree_skb_any(skb);
1251 return;
1252 }
1253
1254 /* don't send further B3 messages if disconnected */
1255 if (bcs->apconnstate < APCONN_ACTIVE) {
1256 - gig_dbg(DEBUG_LLDATA, "disconnected, discarding data");
1257 + gig_dbg(DEBUG_MCMD, "%s: disconnected", __func__);
1258 dev_kfree_skb_any(skb);
1259 return;
1260 }
1261 @@ -747,7 +748,7 @@ void gigaset_isdn_connD(struct bc_state *bcs)
1262 ap = bcs->ap;
1263 if (!ap) {
1264 spin_unlock_irqrestore(&bcs->aplock, flags);
1265 - dev_err(cs->dev, "%s: no application\n", __func__);
1266 + gig_dbg(DEBUG_CMD, "%s: application gone", __func__);
1267 return;
1268 }
1269 if (bcs->apconnstate == APCONN_NONE) {
1270 @@ -843,7 +844,7 @@ void gigaset_isdn_connB(struct bc_state *bcs)
1271 ap = bcs->ap;
1272 if (!ap) {
1273 spin_unlock_irqrestore(&bcs->aplock, flags);
1274 - dev_err(cs->dev, "%s: no application\n", __func__);
1275 + gig_dbg(DEBUG_CMD, "%s: application gone", __func__);
1276 return;
1277 }
1278 if (!bcs->apconnstate) {
1279 @@ -901,13 +902,12 @@ void gigaset_isdn_connB(struct bc_state *bcs)
1280 */
1281 void gigaset_isdn_hupB(struct bc_state *bcs)
1282 {
1283 - struct cardstate *cs = bcs->cs;
1284 struct gigaset_capi_appl *ap = bcs->ap;
1285
1286 /* ToDo: assure order of DISCONNECT_B3_IND and DISCONNECT_IND ? */
1287
1288 if (!ap) {
1289 - dev_err(cs->dev, "%s: no application\n", __func__);
1290 + gig_dbg(DEBUG_CMD, "%s: application gone", __func__);
1291 return;
1292 }
1293
1294 @@ -1044,6 +1044,7 @@ static inline void remove_appl_from_channel(struct bc_state *bcs,
1295 do {
1296 if (bcap->bcnext == ap) {
1297 bcap->bcnext = bcap->bcnext->bcnext;
1298 + spin_unlock_irqrestore(&bcs->aplock, flags);
1299 return;
1300 }
1301 bcap = bcap->bcnext;
1302 diff --git a/drivers/isdn/sc/ioctl.c b/drivers/isdn/sc/ioctl.c
1303 index 1081091..2655e3a 100644
1304 --- a/drivers/isdn/sc/ioctl.c
1305 +++ b/drivers/isdn/sc/ioctl.c
1306 @@ -174,7 +174,7 @@ int sc_ioctl(int card, scs_ioctl *data)
1307 pr_debug("%s: SCIOGETSPID: ioctl received\n",
1308 sc_adapter[card]->devicename);
1309
1310 - spid = kmalloc(SCIOC_SPIDSIZE, GFP_KERNEL);
1311 + spid = kzalloc(SCIOC_SPIDSIZE, GFP_KERNEL);
1312 if (!spid) {
1313 kfree(rcvmsg);
1314 return -ENOMEM;
1315 @@ -194,7 +194,7 @@ int sc_ioctl(int card, scs_ioctl *data)
1316 kfree(rcvmsg);
1317 return status;
1318 }
1319 - strcpy(spid, rcvmsg->msg_data.byte_array);
1320 + strlcpy(spid, rcvmsg->msg_data.byte_array, SCIOC_SPIDSIZE);
1321
1322 /*
1323 * Package the switch type and send to user space
1324 @@ -272,12 +272,12 @@ int sc_ioctl(int card, scs_ioctl *data)
1325 return status;
1326 }
1327
1328 - dn = kmalloc(SCIOC_DNSIZE, GFP_KERNEL);
1329 + dn = kzalloc(SCIOC_DNSIZE, GFP_KERNEL);
1330 if (!dn) {
1331 kfree(rcvmsg);
1332 return -ENOMEM;
1333 }
1334 - strcpy(dn, rcvmsg->msg_data.byte_array);
1335 + strlcpy(dn, rcvmsg->msg_data.byte_array, SCIOC_DNSIZE);
1336 kfree(rcvmsg);
1337
1338 /*
1339 @@ -348,7 +348,7 @@ int sc_ioctl(int card, scs_ioctl *data)
1340 pr_debug("%s: SCIOSTAT: ioctl received\n",
1341 sc_adapter[card]->devicename);
1342
1343 - bi = kmalloc (sizeof(boardInfo), GFP_KERNEL);
1344 + bi = kzalloc(sizeof(boardInfo), GFP_KERNEL);
1345 if (!bi) {
1346 kfree(rcvmsg);
1347 return -ENOMEM;
1348 diff --git a/drivers/md/dm-exception-store.c b/drivers/md/dm-exception-store.c
1349 index 2b7907b..0bdb201 100644
1350 --- a/drivers/md/dm-exception-store.c
1351 +++ b/drivers/md/dm-exception-store.c
1352 @@ -173,7 +173,9 @@ int dm_exception_store_set_chunk_size(struct dm_exception_store *store,
1353
1354 /* Validate the chunk size against the device block size */
1355 if (chunk_size %
1356 - (bdev_logical_block_size(dm_snap_cow(store->snap)->bdev) >> 9)) {
1357 + (bdev_logical_block_size(dm_snap_cow(store->snap)->bdev) >> 9) ||
1358 + chunk_size %
1359 + (bdev_logical_block_size(dm_snap_origin(store->snap)->bdev) >> 9)) {
1360 *error = "Chunk size is not a multiple of device blocksize";
1361 return -EINVAL;
1362 }
1363 diff --git a/drivers/md/dm-exception-store.h b/drivers/md/dm-exception-store.h
1364 index e8dfa06..0b25362 100644
1365 --- a/drivers/md/dm-exception-store.h
1366 +++ b/drivers/md/dm-exception-store.h
1367 @@ -126,8 +126,9 @@ struct dm_exception_store {
1368 };
1369
1370 /*
1371 - * Obtain the cow device used by a given snapshot.
1372 + * Obtain the origin or cow device used by a given snapshot.
1373 */
1374 +struct dm_dev *dm_snap_origin(struct dm_snapshot *snap);
1375 struct dm_dev *dm_snap_cow(struct dm_snapshot *snap);
1376
1377 /*
1378 diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
1379 index d7500e1..bb6bdc8 100644
1380 --- a/drivers/md/dm-ioctl.c
1381 +++ b/drivers/md/dm-ioctl.c
1382 @@ -249,40 +249,50 @@ static void __hash_remove(struct hash_cell *hc)
1383
1384 static void dm_hash_remove_all(int keep_open_devices)
1385 {
1386 - int i, dev_skipped, dev_removed;
1387 + int i, dev_skipped;
1388 struct hash_cell *hc;
1389 - struct list_head *tmp, *n;
1390 + struct mapped_device *md;
1391 +
1392 +retry:
1393 + dev_skipped = 0;
1394
1395 down_write(&_hash_lock);
1396
1397 -retry:
1398 - dev_skipped = dev_removed = 0;
1399 for (i = 0; i < NUM_BUCKETS; i++) {
1400 - list_for_each_safe (tmp, n, _name_buckets + i) {
1401 - hc = list_entry(tmp, struct hash_cell, name_list);
1402 + list_for_each_entry(hc, _name_buckets + i, name_list) {
1403 + md = hc->md;
1404 + dm_get(md);
1405
1406 - if (keep_open_devices &&
1407 - dm_lock_for_deletion(hc->md)) {
1408 + if (keep_open_devices && dm_lock_for_deletion(md)) {
1409 + dm_put(md);
1410 dev_skipped++;
1411 continue;
1412 }
1413 +
1414 __hash_remove(hc);
1415 - dev_removed = 1;
1416 - }
1417 - }
1418
1419 - /*
1420 - * Some mapped devices may be using other mapped devices, so if any
1421 - * still exist, repeat until we make no further progress.
1422 - */
1423 - if (dev_skipped) {
1424 - if (dev_removed)
1425 - goto retry;
1426 + up_write(&_hash_lock);
1427
1428 - DMWARN("remove_all left %d open device(s)", dev_skipped);
1429 + dm_put(md);
1430 + if (likely(keep_open_devices))
1431 + dm_destroy(md);
1432 + else
1433 + dm_destroy_immediate(md);
1434 +
1435 + /*
1436 + * Some mapped devices may be using other mapped
1437 + * devices, so repeat until we make no further
1438 + * progress. If a new mapped device is created
1439 + * here it will also get removed.
1440 + */
1441 + goto retry;
1442 + }
1443 }
1444
1445 up_write(&_hash_lock);
1446 +
1447 + if (dev_skipped)
1448 + DMWARN("remove_all left %d open device(s)", dev_skipped);
1449 }
1450
1451 static int dm_hash_rename(uint32_t cookie, uint32_t *flags, const char *old,
1452 @@ -640,6 +650,7 @@ static int dev_create(struct dm_ioctl *param, size_t param_size)
1453 r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md);
1454 if (r) {
1455 dm_put(md);
1456 + dm_destroy(md);
1457 return r;
1458 }
1459
1460 @@ -742,6 +753,7 @@ static int dev_remove(struct dm_ioctl *param, size_t param_size)
1461 param->flags |= DM_UEVENT_GENERATED_FLAG;
1462
1463 dm_put(md);
1464 + dm_destroy(md);
1465 return 0;
1466 }
1467
1468 diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
1469 index 5485377..a1f2ab5 100644
1470 --- a/drivers/md/dm-snap.c
1471 +++ b/drivers/md/dm-snap.c
1472 @@ -148,6 +148,12 @@ struct dm_snapshot {
1473 #define RUNNING_MERGE 0
1474 #define SHUTDOWN_MERGE 1
1475
1476 +struct dm_dev *dm_snap_origin(struct dm_snapshot *s)
1477 +{
1478 + return s->origin;
1479 +}
1480 +EXPORT_SYMBOL(dm_snap_origin);
1481 +
1482 struct dm_dev *dm_snap_cow(struct dm_snapshot *s)
1483 {
1484 return s->cow;
1485 @@ -1065,10 +1071,6 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1486 origin_mode = FMODE_WRITE;
1487 }
1488
1489 - origin_path = argv[0];
1490 - argv++;
1491 - argc--;
1492 -
1493 s = kmalloc(sizeof(*s), GFP_KERNEL);
1494 if (!s) {
1495 ti->error = "Cannot allocate snapshot context private "
1496 @@ -1077,6 +1079,16 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1497 goto bad;
1498 }
1499
1500 + origin_path = argv[0];
1501 + argv++;
1502 + argc--;
1503 +
1504 + r = dm_get_device(ti, origin_path, origin_mode, &s->origin);
1505 + if (r) {
1506 + ti->error = "Cannot get origin device";
1507 + goto bad_origin;
1508 + }
1509 +
1510 cow_path = argv[0];
1511 argv++;
1512 argc--;
1513 @@ -1097,12 +1109,6 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv)
1514 argv += args_used;
1515 argc -= args_used;
1516
1517 - r = dm_get_device(ti, origin_path, origin_mode, &s->origin);
1518 - if (r) {
1519 - ti->error = "Cannot get origin device";
1520 - goto bad_origin;
1521 - }
1522 -
1523 s->ti = ti;
1524 s->valid = 1;
1525 s->active = 0;
1526 @@ -1212,15 +1218,15 @@ bad_kcopyd:
1527 dm_exception_table_exit(&s->complete, exception_cache);
1528
1529 bad_hash_tables:
1530 - dm_put_device(ti, s->origin);
1531 -
1532 -bad_origin:
1533 dm_exception_store_destroy(s->store);
1534
1535 bad_store:
1536 dm_put_device(ti, s->cow);
1537
1538 bad_cow:
1539 + dm_put_device(ti, s->origin);
1540 +
1541 +bad_origin:
1542 kfree(s);
1543
1544 bad:
1545 @@ -1314,12 +1320,12 @@ static void snapshot_dtr(struct dm_target *ti)
1546
1547 mempool_destroy(s->pending_pool);
1548
1549 - dm_put_device(ti, s->origin);
1550 -
1551 dm_exception_store_destroy(s->store);
1552
1553 dm_put_device(ti, s->cow);
1554
1555 + dm_put_device(ti, s->origin);
1556 +
1557 kfree(s);
1558 }
1559
1560 @@ -1899,8 +1905,14 @@ static int snapshot_iterate_devices(struct dm_target *ti,
1561 iterate_devices_callout_fn fn, void *data)
1562 {
1563 struct dm_snapshot *snap = ti->private;
1564 + int r;
1565 +
1566 + r = fn(ti, snap->origin, 0, ti->len, data);
1567
1568 - return fn(ti, snap->origin, 0, ti->len, data);
1569 + if (!r)
1570 + r = fn(ti, snap->cow, 0, get_dev_size(snap->cow->bdev), data);
1571 +
1572 + return r;
1573 }
1574
1575
1576 diff --git a/drivers/md/dm.c b/drivers/md/dm.c
1577 index d21e128..e3a512d 100644
1578 --- a/drivers/md/dm.c
1579 +++ b/drivers/md/dm.c
1580 @@ -19,6 +19,7 @@
1581 #include <linux/slab.h>
1582 #include <linux/idr.h>
1583 #include <linux/hdreg.h>
1584 +#include <linux/delay.h>
1585
1586 #include <trace/events/block.h>
1587
1588 @@ -2141,6 +2142,7 @@ static struct mapped_device *dm_find_md(dev_t dev)
1589 md = idr_find(&_minor_idr, minor);
1590 if (md && (md == MINOR_ALLOCED ||
1591 (MINOR(disk_devt(dm_disk(md))) != minor) ||
1592 + dm_deleting_md(md) ||
1593 test_bit(DMF_FREEING, &md->flags))) {
1594 md = NULL;
1595 goto out;
1596 @@ -2175,6 +2177,7 @@ void dm_set_mdptr(struct mapped_device *md, void *ptr)
1597 void dm_get(struct mapped_device *md)
1598 {
1599 atomic_inc(&md->holders);
1600 + BUG_ON(test_bit(DMF_FREEING, &md->flags));
1601 }
1602
1603 const char *dm_device_name(struct mapped_device *md)
1604 @@ -2183,27 +2186,55 @@ const char *dm_device_name(struct mapped_device *md)
1605 }
1606 EXPORT_SYMBOL_GPL(dm_device_name);
1607
1608 -void dm_put(struct mapped_device *md)
1609 +static void __dm_destroy(struct mapped_device *md, bool wait)
1610 {
1611 struct dm_table *map;
1612
1613 - BUG_ON(test_bit(DMF_FREEING, &md->flags));
1614 + might_sleep();
1615
1616 - if (atomic_dec_and_lock(&md->holders, &_minor_lock)) {
1617 - map = dm_get_live_table(md);
1618 - idr_replace(&_minor_idr, MINOR_ALLOCED,
1619 - MINOR(disk_devt(dm_disk(md))));
1620 - set_bit(DMF_FREEING, &md->flags);
1621 - spin_unlock(&_minor_lock);
1622 - if (!dm_suspended_md(md)) {
1623 - dm_table_presuspend_targets(map);
1624 - dm_table_postsuspend_targets(map);
1625 - }
1626 - dm_sysfs_exit(md);
1627 - dm_table_put(map);
1628 - dm_table_destroy(__unbind(md));
1629 - free_dev(md);
1630 + spin_lock(&_minor_lock);
1631 + map = dm_get_live_table(md);
1632 + idr_replace(&_minor_idr, MINOR_ALLOCED, MINOR(disk_devt(dm_disk(md))));
1633 + set_bit(DMF_FREEING, &md->flags);
1634 + spin_unlock(&_minor_lock);
1635 +
1636 + if (!dm_suspended_md(md)) {
1637 + dm_table_presuspend_targets(map);
1638 + dm_table_postsuspend_targets(map);
1639 }
1640 +
1641 + /*
1642 + * Rare, but there may be I/O requests still going to complete,
1643 + * for example. Wait for all references to disappear.
1644 + * No one should increment the reference count of the mapped_device,
1645 + * after the mapped_device state becomes DMF_FREEING.
1646 + */
1647 + if (wait)
1648 + while (atomic_read(&md->holders))
1649 + msleep(1);
1650 + else if (atomic_read(&md->holders))
1651 + DMWARN("%s: Forcibly removing mapped_device still in use! (%d users)",
1652 + dm_device_name(md), atomic_read(&md->holders));
1653 +
1654 + dm_sysfs_exit(md);
1655 + dm_table_put(map);
1656 + dm_table_destroy(__unbind(md));
1657 + free_dev(md);
1658 +}
1659 +
1660 +void dm_destroy(struct mapped_device *md)
1661 +{
1662 + __dm_destroy(md, true);
1663 +}
1664 +
1665 +void dm_destroy_immediate(struct mapped_device *md)
1666 +{
1667 + __dm_destroy(md, false);
1668 +}
1669 +
1670 +void dm_put(struct mapped_device *md)
1671 +{
1672 + atomic_dec(&md->holders);
1673 }
1674 EXPORT_SYMBOL_GPL(dm_put);
1675
1676 diff --git a/drivers/md/dm.h b/drivers/md/dm.h
1677 index bad1724..8223671 100644
1678 --- a/drivers/md/dm.h
1679 +++ b/drivers/md/dm.h
1680 @@ -122,6 +122,11 @@ void dm_linear_exit(void);
1681 int dm_stripe_init(void);
1682 void dm_stripe_exit(void);
1683
1684 +/*
1685 + * mapped_device operations
1686 + */
1687 +void dm_destroy(struct mapped_device *md);
1688 +void dm_destroy_immediate(struct mapped_device *md);
1689 int dm_open_count(struct mapped_device *md);
1690 int dm_lock_for_deletion(struct mapped_device *md);
1691
1692 diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c
1693 index 8327e24..300ec15 100644
1694 --- a/drivers/memstick/core/mspro_block.c
1695 +++ b/drivers/memstick/core/mspro_block.c
1696 @@ -1040,6 +1040,7 @@ static int mspro_block_read_attributes(struct memstick_dev *card)
1697 snprintf(s_attr->name, sizeof(s_attr->name),
1698 "attr_x%02x", attr->entries[cnt].id);
1699
1700 + sysfs_attr_init(&s_attr->dev_attr.attr);
1701 s_attr->dev_attr.attr.name = s_attr->name;
1702 s_attr->dev_attr.attr.mode = S_IRUGO;
1703 s_attr->dev_attr.show = mspro_block_attr_show(s_attr->id);
1704 @@ -1330,13 +1331,14 @@ static void mspro_block_remove(struct memstick_dev *card)
1705 struct mspro_block_data *msb = memstick_get_drvdata(card);
1706 unsigned long flags;
1707
1708 - del_gendisk(msb->disk);
1709 - dev_dbg(&card->dev, "mspro block remove\n");
1710 spin_lock_irqsave(&msb->q_lock, flags);
1711 msb->eject = 1;
1712 blk_start_queue(msb->queue);
1713 spin_unlock_irqrestore(&msb->q_lock, flags);
1714
1715 + del_gendisk(msb->disk);
1716 + dev_dbg(&card->dev, "mspro block remove\n");
1717 +
1718 blk_cleanup_queue(msb->queue);
1719 msb->queue = NULL;
1720
1721 diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
1722 index 62f3ea9..3364061 100644
1723 --- a/drivers/mtd/chips/cfi_cmdset_0001.c
1724 +++ b/drivers/mtd/chips/cfi_cmdset_0001.c
1725 @@ -717,7 +717,7 @@ static int cfi_intelext_partition_fixup(struct mtd_info *mtd,
1726 chip = &newcfi->chips[0];
1727 for (i = 0; i < cfi->numchips; i++) {
1728 shared[i].writing = shared[i].erasing = NULL;
1729 - spin_lock_init(&shared[i].lock);
1730 + mutex_init(&shared[i].lock);
1731 for (j = 0; j < numparts; j++) {
1732 *chip = cfi->chips[i];
1733 chip->start += j << partshift;
1734 @@ -886,7 +886,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
1735 */
1736 struct flchip_shared *shared = chip->priv;
1737 struct flchip *contender;
1738 - spin_lock(&shared->lock);
1739 + mutex_lock(&shared->lock);
1740 contender = shared->writing;
1741 if (contender && contender != chip) {
1742 /*
1743 @@ -899,7 +899,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
1744 * get_chip returns success we're clear to go ahead.
1745 */
1746 ret = mutex_trylock(&contender->mutex);
1747 - spin_unlock(&shared->lock);
1748 + mutex_unlock(&shared->lock);
1749 if (!ret)
1750 goto retry;
1751 mutex_unlock(&chip->mutex);
1752 @@ -914,7 +914,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
1753 mutex_unlock(&contender->mutex);
1754 return ret;
1755 }
1756 - spin_lock(&shared->lock);
1757 + mutex_lock(&shared->lock);
1758
1759 /* We should not own chip if it is already
1760 * in FL_SYNCING state. Put contender and retry. */
1761 @@ -930,7 +930,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
1762 * on this chip. Sleep. */
1763 if (mode == FL_ERASING && shared->erasing
1764 && shared->erasing->oldstate == FL_ERASING) {
1765 - spin_unlock(&shared->lock);
1766 + mutex_unlock(&shared->lock);
1767 set_current_state(TASK_UNINTERRUPTIBLE);
1768 add_wait_queue(&chip->wq, &wait);
1769 mutex_unlock(&chip->mutex);
1770 @@ -944,7 +944,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
1771 shared->writing = chip;
1772 if (mode == FL_ERASING)
1773 shared->erasing = chip;
1774 - spin_unlock(&shared->lock);
1775 + mutex_unlock(&shared->lock);
1776 }
1777 ret = chip_ready(map, chip, adr, mode);
1778 if (ret == -EAGAIN)
1779 @@ -959,7 +959,7 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad
1780
1781 if (chip->priv) {
1782 struct flchip_shared *shared = chip->priv;
1783 - spin_lock(&shared->lock);
1784 + mutex_lock(&shared->lock);
1785 if (shared->writing == chip && chip->oldstate == FL_READY) {
1786 /* We own the ability to write, but we're done */
1787 shared->writing = shared->erasing;
1788 @@ -967,7 +967,7 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad
1789 /* give back ownership to who we loaned it from */
1790 struct flchip *loaner = shared->writing;
1791 mutex_lock(&loaner->mutex);
1792 - spin_unlock(&shared->lock);
1793 + mutex_unlock(&shared->lock);
1794 mutex_unlock(&chip->mutex);
1795 put_chip(map, loaner, loaner->start);
1796 mutex_lock(&chip->mutex);
1797 @@ -985,11 +985,11 @@ static void put_chip(struct map_info *map, struct flchip *chip, unsigned long ad
1798 * Don't let the switch below mess things up since
1799 * we don't have ownership to resume anything.
1800 */
1801 - spin_unlock(&shared->lock);
1802 + mutex_unlock(&shared->lock);
1803 wake_up(&chip->wq);
1804 return;
1805 }
1806 - spin_unlock(&shared->lock);
1807 + mutex_unlock(&shared->lock);
1808 }
1809
1810 switch(chip->oldstate) {
1811 diff --git a/drivers/mtd/lpddr/lpddr_cmds.c b/drivers/mtd/lpddr/lpddr_cmds.c
1812 index fece5be..04fdfcc 100644
1813 --- a/drivers/mtd/lpddr/lpddr_cmds.c
1814 +++ b/drivers/mtd/lpddr/lpddr_cmds.c
1815 @@ -98,7 +98,7 @@ struct mtd_info *lpddr_cmdset(struct map_info *map)
1816 numchips = lpddr->numchips / lpddr->qinfo->HWPartsNum;
1817 for (i = 0; i < numchips; i++) {
1818 shared[i].writing = shared[i].erasing = NULL;
1819 - spin_lock_init(&shared[i].lock);
1820 + mutex_init(&shared[i].lock);
1821 for (j = 0; j < lpddr->qinfo->HWPartsNum; j++) {
1822 *chip = lpddr->chips[i];
1823 chip->start += j << lpddr->chipshift;
1824 @@ -217,7 +217,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, int mode)
1825 */
1826 struct flchip_shared *shared = chip->priv;
1827 struct flchip *contender;
1828 - spin_lock(&shared->lock);
1829 + mutex_lock(&shared->lock);
1830 contender = shared->writing;
1831 if (contender && contender != chip) {
1832 /*
1833 @@ -230,7 +230,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, int mode)
1834 * get_chip returns success we're clear to go ahead.
1835 */
1836 ret = mutex_trylock(&contender->mutex);
1837 - spin_unlock(&shared->lock);
1838 + mutex_unlock(&shared->lock);
1839 if (!ret)
1840 goto retry;
1841 mutex_unlock(&chip->mutex);
1842 @@ -245,7 +245,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, int mode)
1843 mutex_unlock(&contender->mutex);
1844 return ret;
1845 }
1846 - spin_lock(&shared->lock);
1847 + mutex_lock(&shared->lock);
1848
1849 /* We should not own chip if it is already in FL_SYNCING
1850 * state. Put contender and retry. */
1851 @@ -261,7 +261,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, int mode)
1852 Must sleep in such a case. */
1853 if (mode == FL_ERASING && shared->erasing
1854 && shared->erasing->oldstate == FL_ERASING) {
1855 - spin_unlock(&shared->lock);
1856 + mutex_unlock(&shared->lock);
1857 set_current_state(TASK_UNINTERRUPTIBLE);
1858 add_wait_queue(&chip->wq, &wait);
1859 mutex_unlock(&chip->mutex);
1860 @@ -275,7 +275,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, int mode)
1861 shared->writing = chip;
1862 if (mode == FL_ERASING)
1863 shared->erasing = chip;
1864 - spin_unlock(&shared->lock);
1865 + mutex_unlock(&shared->lock);
1866 }
1867
1868 ret = chip_ready(map, chip, mode);
1869 @@ -348,7 +348,7 @@ static void put_chip(struct map_info *map, struct flchip *chip)
1870 {
1871 if (chip->priv) {
1872 struct flchip_shared *shared = chip->priv;
1873 - spin_lock(&shared->lock);
1874 + mutex_lock(&shared->lock);
1875 if (shared->writing == chip && chip->oldstate == FL_READY) {
1876 /* We own the ability to write, but we're done */
1877 shared->writing = shared->erasing;
1878 @@ -356,7 +356,7 @@ static void put_chip(struct map_info *map, struct flchip *chip)
1879 /* give back the ownership */
1880 struct flchip *loaner = shared->writing;
1881 mutex_lock(&loaner->mutex);
1882 - spin_unlock(&shared->lock);
1883 + mutex_unlock(&shared->lock);
1884 mutex_unlock(&chip->mutex);
1885 put_chip(map, loaner);
1886 mutex_lock(&chip->mutex);
1887 @@ -374,11 +374,11 @@ static void put_chip(struct map_info *map, struct flchip *chip)
1888 * Don't let the switch below mess things up since
1889 * we don't have ownership to resume anything.
1890 */
1891 - spin_unlock(&shared->lock);
1892 + mutex_unlock(&shared->lock);
1893 wake_up(&chip->wq);
1894 return;
1895 }
1896 - spin_unlock(&shared->lock);
1897 + mutex_unlock(&shared->lock);
1898 }
1899
1900 switch (chip->oldstate) {
1901 diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
1902 index 4a7b864..5bcc34a 100644
1903 --- a/drivers/mtd/nand/nand_base.c
1904 +++ b/drivers/mtd/nand/nand_base.c
1905 @@ -2852,6 +2852,7 @@ static struct nand_flash_dev *nand_get_flash_type(struct mtd_info *mtd,
1906 */
1907 if (id_data[0] == id_data[6] && id_data[1] == id_data[7] &&
1908 id_data[0] == NAND_MFR_SAMSUNG &&
1909 + (chip->cellinfo & NAND_CI_CELLTYPE_MSK) &&
1910 id_data[5] != 0x00) {
1911 /* Calc pagesize */
1912 mtd->writesize = 2048 << (extid & 0x03);
1913 diff --git a/drivers/mtd/nand/plat_nand.c b/drivers/mtd/nand/plat_nand.c
1914 index 90e143e..317aff4 100644
1915 --- a/drivers/mtd/nand/plat_nand.c
1916 +++ b/drivers/mtd/nand/plat_nand.c
1917 @@ -37,6 +37,11 @@ static int __devinit plat_nand_probe(struct platform_device *pdev)
1918 struct resource *res;
1919 int err = 0;
1920
1921 + if (pdata->chip.nr_chips < 1) {
1922 + dev_err(&pdev->dev, "invalid number of chips specified\n");
1923 + return -EINVAL;
1924 + }
1925 +
1926 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1927 if (!res)
1928 return -ENXIO;
1929 diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c
1930 index e02fa4f..4d89f37 100644
1931 --- a/drivers/mtd/nand/pxa3xx_nand.c
1932 +++ b/drivers/mtd/nand/pxa3xx_nand.c
1933 @@ -363,7 +363,7 @@ static struct pxa3xx_nand_flash *builtin_flash_types[] = {
1934 #define tAR_NDTR1(r) (((r) >> 0) & 0xf)
1935
1936 /* convert nano-seconds to nand flash controller clock cycles */
1937 -#define ns2cycle(ns, clk) (int)(((ns) * (clk / 1000000) / 1000) - 1)
1938 +#define ns2cycle(ns, clk) (int)((ns) * (clk / 1000000) / 1000)
1939
1940 /* convert nand flash controller clock cycles to nano-seconds */
1941 #define cycle2ns(c, clk) ((((c) + 1) * 1000000 + clk / 500) / (clk / 1000))
1942 diff --git a/drivers/net/e1000e/82571.c b/drivers/net/e1000e/82571.c
1943 index f654db9..d206f21 100644
1944 --- a/drivers/net/e1000e/82571.c
1945 +++ b/drivers/net/e1000e/82571.c
1946 @@ -936,12 +936,14 @@ static s32 e1000_reset_hw_82571(struct e1000_hw *hw)
1947 ew32(IMC, 0xffffffff);
1948 icr = er32(ICR);
1949
1950 - /* Install any alternate MAC address into RAR0 */
1951 - ret_val = e1000_check_alt_mac_addr_generic(hw);
1952 - if (ret_val)
1953 - return ret_val;
1954 + if (hw->mac.type == e1000_82571) {
1955 + /* Install any alternate MAC address into RAR0 */
1956 + ret_val = e1000_check_alt_mac_addr_generic(hw);
1957 + if (ret_val)
1958 + return ret_val;
1959
1960 - e1000e_set_laa_state_82571(hw, true);
1961 + e1000e_set_laa_state_82571(hw, true);
1962 + }
1963
1964 /* Reinitialize the 82571 serdes link state machine */
1965 if (hw->phy.media_type == e1000_media_type_internal_serdes)
1966 @@ -1618,14 +1620,16 @@ static s32 e1000_read_mac_addr_82571(struct e1000_hw *hw)
1967 {
1968 s32 ret_val = 0;
1969
1970 - /*
1971 - * If there's an alternate MAC address place it in RAR0
1972 - * so that it will override the Si installed default perm
1973 - * address.
1974 - */
1975 - ret_val = e1000_check_alt_mac_addr_generic(hw);
1976 - if (ret_val)
1977 - goto out;
1978 + if (hw->mac.type == e1000_82571) {
1979 + /*
1980 + * If there's an alternate MAC address place it in RAR0
1981 + * so that it will override the Si installed default perm
1982 + * address.
1983 + */
1984 + ret_val = e1000_check_alt_mac_addr_generic(hw);
1985 + if (ret_val)
1986 + goto out;
1987 + }
1988
1989 ret_val = e1000_read_mac_addr_generic(hw);
1990
1991 @@ -1833,6 +1837,7 @@ struct e1000_info e1000_82573_info = {
1992 | FLAG_HAS_SMART_POWER_DOWN
1993 | FLAG_HAS_AMT
1994 | FLAG_HAS_SWSM_ON_LOAD,
1995 + .flags2 = FLAG2_DISABLE_ASPM_L1,
1996 .pba = 20,
1997 .max_hw_frame_size = ETH_FRAME_LEN + ETH_FCS_LEN,
1998 .get_variants = e1000_get_variants_82571,
1999 diff --git a/drivers/net/e1000e/defines.h b/drivers/net/e1000e/defines.h
2000 index 4dc02c7..75289ca 100644
2001 --- a/drivers/net/e1000e/defines.h
2002 +++ b/drivers/net/e1000e/defines.h
2003 @@ -620,6 +620,7 @@
2004 #define E1000_FLASH_UPDATES 2000
2005
2006 /* NVM Word Offsets */
2007 +#define NVM_COMPAT 0x0003
2008 #define NVM_ID_LED_SETTINGS 0x0004
2009 #define NVM_INIT_CONTROL2_REG 0x000F
2010 #define NVM_INIT_CONTROL3_PORT_B 0x0014
2011 @@ -642,6 +643,9 @@
2012 /* Mask bits for fields in Word 0x1a of the NVM */
2013 #define NVM_WORD1A_ASPM_MASK 0x000C
2014
2015 +/* Mask bits for fields in Word 0x03 of the EEPROM */
2016 +#define NVM_COMPAT_LOM 0x0800
2017 +
2018 /* For checksumming, the sum of all words in the NVM should equal 0xBABA. */
2019 #define NVM_SUM 0xBABA
2020
2021 diff --git a/drivers/net/e1000e/lib.c b/drivers/net/e1000e/lib.c
2022 index a968e3a..768c105 100644
2023 --- a/drivers/net/e1000e/lib.c
2024 +++ b/drivers/net/e1000e/lib.c
2025 @@ -183,6 +183,16 @@ s32 e1000_check_alt_mac_addr_generic(struct e1000_hw *hw)
2026 u16 offset, nvm_alt_mac_addr_offset, nvm_data;
2027 u8 alt_mac_addr[ETH_ALEN];
2028
2029 + ret_val = e1000_read_nvm(hw, NVM_COMPAT, 1, &nvm_data);
2030 + if (ret_val)
2031 + goto out;
2032 +
2033 + /* Check for LOM (vs. NIC) or one of two valid mezzanine cards */
2034 + if (!((nvm_data & NVM_COMPAT_LOM) ||
2035 + (hw->adapter->pdev->device == E1000_DEV_ID_82571EB_SERDES_DUAL) ||
2036 + (hw->adapter->pdev->device == E1000_DEV_ID_82571EB_SERDES_QUAD)))
2037 + goto out;
2038 +
2039 ret_val = e1000_read_nvm(hw, NVM_ALT_MAC_ADDR_PTR, 1,
2040 &nvm_alt_mac_addr_offset);
2041 if (ret_val) {
2042 diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
2043 index 648972d..ab9fe22 100644
2044 --- a/drivers/net/wireless/ath/ath5k/base.c
2045 +++ b/drivers/net/wireless/ath/ath5k/base.c
2046 @@ -48,6 +48,7 @@
2047 #include <linux/netdevice.h>
2048 #include <linux/cache.h>
2049 #include <linux/pci.h>
2050 +#include <linux/pci-aspm.h>
2051 #include <linux/ethtool.h>
2052 #include <linux/uaccess.h>
2053 #include <linux/slab.h>
2054 @@ -472,6 +473,26 @@ ath5k_pci_probe(struct pci_dev *pdev,
2055 int ret;
2056 u8 csz;
2057
2058 + /*
2059 + * L0s needs to be disabled on all ath5k cards.
2060 + *
2061 + * For distributions shipping with CONFIG_PCIEASPM (this will be enabled
2062 + * by default in the future in 2.6.36) this will also mean both L1 and
2063 + * L0s will be disabled when a pre 1.1 PCIe device is detected. We do
2064 + * know L1 works correctly even for all ath5k pre 1.1 PCIe devices
2065 + * though but cannot currently undue the effect of a blacklist, for
2066 + * details you can read pcie_aspm_sanity_check() and see how it adjusts
2067 + * the device link capability.
2068 + *
2069 + * It may be possible in the future to implement some PCI API to allow
2070 + * drivers to override blacklists for pre 1.1 PCIe but for now it is
2071 + * best to accept that both L0s and L1 will be disabled completely for
2072 + * distributions shipping with CONFIG_PCIEASPM rather than having this
2073 + * issue present. Motivation for adding this new API will be to help
2074 + * with power consumption for some of these devices.
2075 + */
2076 + pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S);
2077 +
2078 ret = pci_enable_device(pdev);
2079 if (ret) {
2080 dev_err(&pdev->dev, "can't enable device\n");
2081 diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
2082 index 2571b44..5fcbc2f 100644
2083 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
2084 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
2085 @@ -68,18 +68,23 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
2086 struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
2087 struct ieee80211_sta *sta = tx_info->control.sta;
2088 struct ath9k_htc_sta *ista;
2089 - struct ath9k_htc_vif *avp;
2090 struct ath9k_htc_tx_ctl tx_ctl;
2091 enum htc_endpoint_id epid;
2092 u16 qnum, hw_qnum;
2093 __le16 fc;
2094 u8 *tx_fhdr;
2095 - u8 sta_idx;
2096 + u8 sta_idx, vif_idx;
2097
2098 hdr = (struct ieee80211_hdr *) skb->data;
2099 fc = hdr->frame_control;
2100
2101 - avp = (struct ath9k_htc_vif *) tx_info->control.vif->drv_priv;
2102 + if (tx_info->control.vif &&
2103 + (struct ath9k_htc_vif *) tx_info->control.vif->drv_priv)
2104 + vif_idx = ((struct ath9k_htc_vif *)
2105 + tx_info->control.vif->drv_priv)->index;
2106 + else
2107 + vif_idx = priv->nvifs;
2108 +
2109 if (sta) {
2110 ista = (struct ath9k_htc_sta *) sta->drv_priv;
2111 sta_idx = ista->index;
2112 @@ -96,7 +101,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
2113 memset(&tx_hdr, 0, sizeof(struct tx_frame_hdr));
2114
2115 tx_hdr.node_idx = sta_idx;
2116 - tx_hdr.vif_idx = avp->index;
2117 + tx_hdr.vif_idx = vif_idx;
2118
2119 if (tx_info->flags & IEEE80211_TX_CTL_AMPDU) {
2120 tx_ctl.type = ATH9K_HTC_AMPDU;
2121 @@ -156,7 +161,7 @@ int ath9k_htc_tx_start(struct ath9k_htc_priv *priv, struct sk_buff *skb)
2122 tx_ctl.type = ATH9K_HTC_NORMAL;
2123
2124 mgmt_hdr.node_idx = sta_idx;
2125 - mgmt_hdr.vif_idx = avp->index;
2126 + mgmt_hdr.vif_idx = vif_idx;
2127 mgmt_hdr.tidno = 0;
2128 mgmt_hdr.flags = 0;
2129
2130 diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c
2131 index c44a303..2a9480d 100644
2132 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c
2133 +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c
2134 @@ -915,22 +915,6 @@ void iwl3945_hw_build_tx_cmd_rate(struct iwl_priv *priv,
2135 rts_retry_limit = data_retry_limit;
2136 tx_cmd->rts_retry_limit = rts_retry_limit;
2137
2138 - if (ieee80211_is_mgmt(fc)) {
2139 - switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
2140 - case cpu_to_le16(IEEE80211_STYPE_AUTH):
2141 - case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
2142 - case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ):
2143 - case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ):
2144 - if (tx_flags & TX_CMD_FLG_RTS_MSK) {
2145 - tx_flags &= ~TX_CMD_FLG_RTS_MSK;
2146 - tx_flags |= TX_CMD_FLG_CTS_MSK;
2147 - }
2148 - break;
2149 - default:
2150 - break;
2151 - }
2152 - }
2153 -
2154 tx_cmd->rate = rate;
2155 tx_cmd->tx_flags = tx_flags;
2156
2157 diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
2158 index 01658cf..2a30397 100644
2159 --- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
2160 +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c
2161 @@ -209,10 +209,21 @@ static void iwlagn_chain_noise_reset(struct iwl_priv *priv)
2162 }
2163 }
2164
2165 -static void iwlagn_rts_tx_cmd_flag(struct ieee80211_tx_info *info,
2166 - __le32 *tx_flags)
2167 +static void iwlagn_rts_tx_cmd_flag(struct iwl_priv *priv,
2168 + struct ieee80211_tx_info *info,
2169 + __le16 fc, __le32 *tx_flags)
2170 {
2171 - *tx_flags |= TX_CMD_FLG_RTS_CTS_MSK;
2172 + if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS ||
2173 + info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
2174 + *tx_flags |= TX_CMD_FLG_RTS_CTS_MSK;
2175 + return;
2176 + }
2177 +
2178 + if (priv->cfg->use_rts_for_ht &&
2179 + info->flags & IEEE80211_TX_CTL_AMPDU) {
2180 + *tx_flags |= TX_CMD_FLG_RTS_CTS_MSK;
2181 + return;
2182 + }
2183 }
2184
2185 /* Calc max signal level (dBm) among 3 possible receivers */
2186 diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2187 index cf4a95b..ca46831 100644
2188 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2189 +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c
2190 @@ -325,18 +325,11 @@ static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid,
2191 struct iwl_lq_sta *lq_data,
2192 struct ieee80211_sta *sta)
2193 {
2194 - if ((tid < TID_MAX_LOAD_COUNT) &&
2195 - !rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta)) {
2196 - if (priv->cfg->use_rts_for_ht) {
2197 - /*
2198 - * switch to RTS/CTS if it is the prefer protection
2199 - * method for HT traffic
2200 - */
2201 - IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n");
2202 - priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN;
2203 - iwlcore_commit_rxon(priv);
2204 - }
2205 - }
2206 + if (tid < TID_MAX_LOAD_COUNT)
2207 + rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta);
2208 + else
2209 + IWL_ERR(priv, "tid exceeds max load count: %d/%d\n",
2210 + tid, TID_MAX_LOAD_COUNT);
2211 }
2212
2213 static inline int get_num_of_ant_from_rate(u32 rate_n_flags)
2214 diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
2215 index 7d614c4..3a3d27c 100644
2216 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
2217 +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
2218 @@ -376,10 +376,7 @@ static void iwlagn_tx_cmd_build_basic(struct iwl_priv *priv,
2219 tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK;
2220 }
2221
2222 - priv->cfg->ops->utils->rts_tx_cmd_flag(info, &tx_flags);
2223 -
2224 - if ((tx_flags & TX_CMD_FLG_RTS_MSK) || (tx_flags & TX_CMD_FLG_CTS_MSK))
2225 - tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK;
2226 + priv->cfg->ops->utils->rts_tx_cmd_flag(priv, info, fc, &tx_flags);
2227
2228 tx_flags &= ~(TX_CMD_FLG_ANT_SEL_MSK);
2229 if (ieee80211_is_mgmt(fc)) {
2230 @@ -453,21 +450,6 @@ static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
2231 if ((rate_idx >= IWL_FIRST_CCK_RATE) && (rate_idx <= IWL_LAST_CCK_RATE))
2232 rate_flags |= RATE_MCS_CCK_MSK;
2233
2234 - /* Set up RTS and CTS flags for certain packets */
2235 - switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
2236 - case cpu_to_le16(IEEE80211_STYPE_AUTH):
2237 - case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
2238 - case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ):
2239 - case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ):
2240 - if (tx_cmd->tx_flags & TX_CMD_FLG_RTS_MSK) {
2241 - tx_cmd->tx_flags &= ~TX_CMD_FLG_RTS_MSK;
2242 - tx_cmd->tx_flags |= TX_CMD_FLG_CTS_MSK;
2243 - }
2244 - break;
2245 - default:
2246 - break;
2247 - }
2248 -
2249 /* Set up antennas */
2250 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant);
2251 rate_flags |= iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
2252 diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
2253 index 24aff65..c7f56b4 100644
2254 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c
2255 +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
2256 @@ -200,13 +200,6 @@ int iwl_commit_rxon(struct iwl_priv *priv)
2257
2258 priv->start_calib = 0;
2259 if (new_assoc) {
2260 - /*
2261 - * allow CTS-to-self if possible for new association.
2262 - * this is relevant only for 5000 series and up,
2263 - * but will not damage 4965
2264 - */
2265 - priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN;
2266 -
2267 /* Apply the new configuration
2268 * RXON assoc doesn't clear the station table in uCode,
2269 */
2270 @@ -3336,13 +3329,40 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
2271 IWL_DEBUG_HT(priv, "priv->_agn.agg_tids_count = %u\n",
2272 priv->_agn.agg_tids_count);
2273 }
2274 + if (priv->cfg->use_rts_for_ht) {
2275 + struct iwl_station_priv *sta_priv =
2276 + (void *) sta->drv_priv;
2277 + /*
2278 + * switch off RTS/CTS if it was previously enabled
2279 + */
2280 +
2281 + sta_priv->lq_sta.lq.general_params.flags &=
2282 + ~LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK;
2283 + iwl_send_lq_cmd(priv, &sta_priv->lq_sta.lq,
2284 + CMD_ASYNC, false);
2285 + }
2286 + break;
2287 if (test_bit(STATUS_EXIT_PENDING, &priv->status))
2288 return 0;
2289 else
2290 return ret;
2291 case IEEE80211_AMPDU_TX_OPERATIONAL:
2292 - /* do nothing */
2293 - return -EOPNOTSUPP;
2294 + if (priv->cfg->use_rts_for_ht) {
2295 + struct iwl_station_priv *sta_priv =
2296 + (void *) sta->drv_priv;
2297 +
2298 + /*
2299 + * switch to RTS/CTS if it is the prefer protection
2300 + * method for HT traffic
2301 + */
2302 +
2303 + sta_priv->lq_sta.lq.general_params.flags |=
2304 + LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK;
2305 + iwl_send_lq_cmd(priv, &sta_priv->lq_sta.lq,
2306 + CMD_ASYNC, false);
2307 + }
2308 + ret = 0;
2309 + break;
2310 default:
2311 IWL_DEBUG_HT(priv, "unknown\n");
2312 return -EINVAL;
2313 @@ -3423,6 +3443,49 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
2314 return 0;
2315 }
2316
2317 +static void iwlagn_configure_filter(struct ieee80211_hw *hw,
2318 + unsigned int changed_flags,
2319 + unsigned int *total_flags,
2320 + u64 multicast)
2321 +{
2322 + struct iwl_priv *priv = hw->priv;
2323 + __le32 filter_or = 0, filter_nand = 0;
2324 +
2325 +#define CHK(test, flag) do { \
2326 + if (*total_flags & (test)) \
2327 + filter_or |= (flag); \
2328 + else \
2329 + filter_nand |= (flag); \
2330 + } while (0)
2331 +
2332 + IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
2333 + changed_flags, *total_flags);
2334 +
2335 + CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
2336 + CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
2337 + CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
2338 +
2339 +#undef CHK
2340 +
2341 + mutex_lock(&priv->mutex);
2342 +
2343 + priv->staging_rxon.filter_flags &= ~filter_nand;
2344 + priv->staging_rxon.filter_flags |= filter_or;
2345 +
2346 + iwlcore_commit_rxon(priv);
2347 +
2348 + mutex_unlock(&priv->mutex);
2349 +
2350 + /*
2351 + * Receiving all multicast frames is always enabled by the
2352 + * default flags setup in iwl_connection_init_rx_config()
2353 + * since we currently do not support programming multicast
2354 + * filters into the device.
2355 + */
2356 + *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
2357 + FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
2358 +}
2359 +
2360 /*****************************************************************************
2361 *
2362 * driver setup and teardown
2363 @@ -3583,7 +3646,7 @@ static struct ieee80211_ops iwl_hw_ops = {
2364 .add_interface = iwl_mac_add_interface,
2365 .remove_interface = iwl_mac_remove_interface,
2366 .config = iwl_mac_config,
2367 - .configure_filter = iwl_configure_filter,
2368 + .configure_filter = iwlagn_configure_filter,
2369 .set_key = iwl_mac_set_key,
2370 .update_tkip_key = iwl_mac_update_tkip_key,
2371 .conf_tx = iwl_mac_conf_tx,
2372 diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
2373 index 5bbc529..cd5b664 100644
2374 --- a/drivers/net/wireless/iwlwifi/iwl-core.c
2375 +++ b/drivers/net/wireless/iwlwifi/iwl-core.c
2376 @@ -403,19 +403,36 @@ EXPORT_SYMBOL(iwlcore_free_geos);
2377 * iwlcore_rts_tx_cmd_flag: Set rts/cts. 3945 and 4965 only share this
2378 * function.
2379 */
2380 -void iwlcore_rts_tx_cmd_flag(struct ieee80211_tx_info *info,
2381 - __le32 *tx_flags)
2382 +void iwlcore_rts_tx_cmd_flag(struct iwl_priv *priv,
2383 + struct ieee80211_tx_info *info,
2384 + __le16 fc, __le32 *tx_flags)
2385 {
2386 if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) {
2387 *tx_flags |= TX_CMD_FLG_RTS_MSK;
2388 *tx_flags &= ~TX_CMD_FLG_CTS_MSK;
2389 + *tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK;
2390 +
2391 + if (!ieee80211_is_mgmt(fc))
2392 + return;
2393 +
2394 + switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) {
2395 + case cpu_to_le16(IEEE80211_STYPE_AUTH):
2396 + case cpu_to_le16(IEEE80211_STYPE_DEAUTH):
2397 + case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ):
2398 + case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ):
2399 + *tx_flags &= ~TX_CMD_FLG_RTS_MSK;
2400 + *tx_flags |= TX_CMD_FLG_CTS_MSK;
2401 + break;
2402 + }
2403 } else if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
2404 *tx_flags &= ~TX_CMD_FLG_RTS_MSK;
2405 *tx_flags |= TX_CMD_FLG_CTS_MSK;
2406 + *tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK;
2407 }
2408 }
2409 EXPORT_SYMBOL(iwlcore_rts_tx_cmd_flag);
2410
2411 +
2412 static bool is_single_rx_stream(struct iwl_priv *priv)
2413 {
2414 return priv->current_ht_config.smps == IEEE80211_SMPS_STATIC ||
2415 @@ -1294,51 +1311,6 @@ out:
2416 EXPORT_SYMBOL(iwl_apm_init);
2417
2418
2419 -
2420 -void iwl_configure_filter(struct ieee80211_hw *hw,
2421 - unsigned int changed_flags,
2422 - unsigned int *total_flags,
2423 - u64 multicast)
2424 -{
2425 - struct iwl_priv *priv = hw->priv;
2426 - __le32 filter_or = 0, filter_nand = 0;
2427 -
2428 -#define CHK(test, flag) do { \
2429 - if (*total_flags & (test)) \
2430 - filter_or |= (flag); \
2431 - else \
2432 - filter_nand |= (flag); \
2433 - } while (0)
2434 -
2435 - IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
2436 - changed_flags, *total_flags);
2437 -
2438 - CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
2439 - CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
2440 - CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
2441 -
2442 -#undef CHK
2443 -
2444 - mutex_lock(&priv->mutex);
2445 -
2446 - priv->staging_rxon.filter_flags &= ~filter_nand;
2447 - priv->staging_rxon.filter_flags |= filter_or;
2448 -
2449 - iwlcore_commit_rxon(priv);
2450 -
2451 - mutex_unlock(&priv->mutex);
2452 -
2453 - /*
2454 - * Receiving all multicast frames is always enabled by the
2455 - * default flags setup in iwl_connection_init_rx_config()
2456 - * since we currently do not support programming multicast
2457 - * filters into the device.
2458 - */
2459 - *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
2460 - FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
2461 -}
2462 -EXPORT_SYMBOL(iwl_configure_filter);
2463 -
2464 int iwl_set_hw_params(struct iwl_priv *priv)
2465 {
2466 priv->hw_params.max_rxq_size = RX_QUEUE_SIZE;
2467 @@ -1936,6 +1908,10 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw,
2468 priv->staging_rxon.flags |= RXON_FLG_TGG_PROTECT_MSK;
2469 else
2470 priv->staging_rxon.flags &= ~RXON_FLG_TGG_PROTECT_MSK;
2471 + if (bss_conf->use_cts_prot)
2472 + priv->staging_rxon.flags |= RXON_FLG_SELF_CTS_EN;
2473 + else
2474 + priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN;
2475 }
2476
2477 if (changes & BSS_CHANGED_BASIC_RATES) {
2478 diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
2479 index 31775bd..e8ef317 100644
2480 --- a/drivers/net/wireless/iwlwifi/iwl-core.h
2481 +++ b/drivers/net/wireless/iwlwifi/iwl-core.h
2482 @@ -102,8 +102,9 @@ struct iwl_hcmd_utils_ops {
2483 u32 min_average_noise,
2484 u8 default_chain);
2485 void (*chain_noise_reset)(struct iwl_priv *priv);
2486 - void (*rts_tx_cmd_flag)(struct ieee80211_tx_info *info,
2487 - __le32 *tx_flags);
2488 + void (*rts_tx_cmd_flag)(struct iwl_priv *priv,
2489 + struct ieee80211_tx_info *info,
2490 + __le16 fc, __le32 *tx_flags);
2491 int (*calc_rssi)(struct iwl_priv *priv,
2492 struct iwl_rx_phy_res *rx_resp);
2493 void (*request_scan)(struct iwl_priv *priv, struct ieee80211_vif *vif);
2494 @@ -355,9 +356,6 @@ int iwl_set_decrypted_flag(struct iwl_priv *priv,
2495 u32 decrypt_res,
2496 struct ieee80211_rx_status *stats);
2497 void iwl_irq_handle_error(struct iwl_priv *priv);
2498 -void iwl_configure_filter(struct ieee80211_hw *hw,
2499 - unsigned int changed_flags,
2500 - unsigned int *total_flags, u64 multicast);
2501 int iwl_set_hw_params(struct iwl_priv *priv);
2502 void iwl_post_associate(struct iwl_priv *priv, struct ieee80211_vif *vif);
2503 void iwl_bss_info_changed(struct ieee80211_hw *hw,
2504 @@ -375,8 +373,9 @@ void iwl_config_ap(struct iwl_priv *priv, struct ieee80211_vif *vif);
2505 void iwl_mac_reset_tsf(struct ieee80211_hw *hw);
2506 int iwl_alloc_txq_mem(struct iwl_priv *priv);
2507 void iwl_free_txq_mem(struct iwl_priv *priv);
2508 -void iwlcore_rts_tx_cmd_flag(struct ieee80211_tx_info *info,
2509 - __le32 *tx_flags);
2510 +void iwlcore_rts_tx_cmd_flag(struct iwl_priv *priv,
2511 + struct ieee80211_tx_info *info,
2512 + __le16 fc, __le32 *tx_flags);
2513 #ifdef CONFIG_IWLWIFI_DEBUGFS
2514 int iwl_alloc_traffic_mem(struct iwl_priv *priv);
2515 void iwl_free_traffic_mem(struct iwl_priv *priv);
2516 diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
2517 index a27872d..39c0d2d 100644
2518 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
2519 +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
2520 @@ -434,10 +434,7 @@ static void iwl3945_build_tx_cmd_basic(struct iwl_priv *priv,
2521 tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK;
2522 }
2523
2524 - priv->cfg->ops->utils->rts_tx_cmd_flag(info, &tx_flags);
2525 -
2526 - if ((tx_flags & TX_CMD_FLG_RTS_MSK) || (tx_flags & TX_CMD_FLG_CTS_MSK))
2527 - tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK;
2528 + priv->cfg->ops->utils->rts_tx_cmd_flag(priv, info, fc, &tx_flags);
2529
2530 tx_flags &= ~(TX_CMD_FLG_ANT_SEL_MSK);
2531 if (ieee80211_is_mgmt(fc)) {
2532 @@ -3465,6 +3462,55 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw,
2533
2534 return 0;
2535 }
2536 +
2537 +static void iwl3945_configure_filter(struct ieee80211_hw *hw,
2538 + unsigned int changed_flags,
2539 + unsigned int *total_flags,
2540 + u64 multicast)
2541 +{
2542 + struct iwl_priv *priv = hw->priv;
2543 + __le32 filter_or = 0, filter_nand = 0;
2544 +
2545 +#define CHK(test, flag) do { \
2546 + if (*total_flags & (test)) \
2547 + filter_or |= (flag); \
2548 + else \
2549 + filter_nand |= (flag); \
2550 + } while (0)
2551 +
2552 + IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
2553 + changed_flags, *total_flags);
2554 +
2555 + CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
2556 + CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK);
2557 + CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
2558 +
2559 +#undef CHK
2560 +
2561 + mutex_lock(&priv->mutex);
2562 +
2563 + priv->staging_rxon.filter_flags &= ~filter_nand;
2564 + priv->staging_rxon.filter_flags |= filter_or;
2565 +
2566 + /*
2567 + * Committing directly here breaks for some reason,
2568 + * but we'll eventually commit the filter flags
2569 + * change anyway.
2570 + */
2571 +
2572 + mutex_unlock(&priv->mutex);
2573 +
2574 + /*
2575 + * Receiving all multicast frames is always enabled by the
2576 + * default flags setup in iwl_connection_init_rx_config()
2577 + * since we currently do not support programming multicast
2578 + * filters into the device.
2579 + */
2580 + *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
2581 + FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
2582 +}
2583 +
2584 +
2585 /*****************************************************************************
2586 *
2587 * sysfs attributes
2588 @@ -3870,7 +3916,7 @@ static struct ieee80211_ops iwl3945_hw_ops = {
2589 .add_interface = iwl_mac_add_interface,
2590 .remove_interface = iwl_mac_remove_interface,
2591 .config = iwl_mac_config,
2592 - .configure_filter = iwl_configure_filter,
2593 + .configure_filter = iwl3945_configure_filter,
2594 .set_key = iwl3945_mac_set_key,
2595 .conf_tx = iwl_mac_conf_tx,
2596 .reset_tsf = iwl_mac_reset_tsf,
2597 diff --git a/drivers/net/wireless/wl12xx/wl1251_cmd.c b/drivers/net/wireless/wl12xx/wl1251_cmd.c
2598 index a37b30c..ce3722f 100644
2599 --- a/drivers/net/wireless/wl12xx/wl1251_cmd.c
2600 +++ b/drivers/net/wireless/wl12xx/wl1251_cmd.c
2601 @@ -484,7 +484,7 @@ int wl1251_cmd_trigger_scan_to(struct wl1251 *wl, u32 timeout)
2602
2603 cmd->timeout = timeout;
2604
2605 - ret = wl1251_cmd_send(wl, CMD_SCAN, cmd, sizeof(*cmd));
2606 + ret = wl1251_cmd_send(wl, CMD_TRIGGER_SCAN_TO, cmd, sizeof(*cmd));
2607 if (ret < 0) {
2608 wl1251_error("cmd trigger scan to failed: %d", ret);
2609 goto out;
2610 diff --git a/drivers/platform/x86/compal-laptop.c b/drivers/platform/x86/compal-laptop.c
2611 index 71ff154..90111d7 100644
2612 --- a/drivers/platform/x86/compal-laptop.c
2613 +++ b/drivers/platform/x86/compal-laptop.c
2614 @@ -259,6 +259,14 @@ static struct dmi_system_id __initdata compal_dmi_table[] = {
2615 .callback = dmi_check_cb
2616 },
2617 {
2618 + .ident = "Dell Mini 1012",
2619 + .matches = {
2620 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
2621 + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"),
2622 + },
2623 + .callback = dmi_check_cb
2624 + },
2625 + {
2626 .ident = "Dell Inspiron 11z",
2627 .matches = {
2628 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
2629 @@ -375,5 +383,6 @@ MODULE_ALIAS("dmi:*:rnIFT00:rvrIFT00:*");
2630 MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron910:*");
2631 MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron1010:*");
2632 MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron1011:*");
2633 +MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron1012:*");
2634 MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron1110:*");
2635 MODULE_ALIAS("dmi:*:svnDellInc.:pnInspiron1210:*");
2636 diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
2637 index 661e3ac..6110601 100644
2638 --- a/drivers/platform/x86/dell-laptop.c
2639 +++ b/drivers/platform/x86/dell-laptop.c
2640 @@ -116,6 +116,13 @@ static struct dmi_system_id __devinitdata dell_blacklist[] = {
2641 },
2642 },
2643 {
2644 + .ident = "Dell Mini 1012",
2645 + .matches = {
2646 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
2647 + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1012"),
2648 + },
2649 + },
2650 + {
2651 .ident = "Dell Inspiron 11z",
2652 .matches = {
2653 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
2654 diff --git a/drivers/regulator/wm8994-regulator.c b/drivers/regulator/wm8994-regulator.c
2655 index 5a1dc8a..03713bc 100644
2656 --- a/drivers/regulator/wm8994-regulator.c
2657 +++ b/drivers/regulator/wm8994-regulator.c
2658 @@ -219,8 +219,6 @@ static __devinit int wm8994_ldo_probe(struct platform_device *pdev)
2659
2660 ldo->wm8994 = wm8994;
2661
2662 - ldo->is_enabled = true;
2663 -
2664 if (pdata->ldo[id].enable && gpio_is_valid(pdata->ldo[id].enable)) {
2665 ldo->enable = pdata->ldo[id].enable;
2666
2667 @@ -237,7 +235,8 @@ static __devinit int wm8994_ldo_probe(struct platform_device *pdev)
2668 ret);
2669 goto err_gpio;
2670 }
2671 - }
2672 + } else
2673 + ldo->is_enabled = true;
2674
2675 ldo->regulator = regulator_register(&wm8994_ldo_desc[id], &pdev->dev,
2676 pdata->ldo[id].init_data, ldo);
2677 diff --git a/drivers/serial/suncore.c b/drivers/serial/suncore.c
2678 index 544f2e2..6381a02 100644
2679 --- a/drivers/serial/suncore.c
2680 +++ b/drivers/serial/suncore.c
2681 @@ -55,7 +55,12 @@ EXPORT_SYMBOL(sunserial_unregister_minors);
2682 int sunserial_console_match(struct console *con, struct device_node *dp,
2683 struct uart_driver *drv, int line, bool ignore_line)
2684 {
2685 - if (!con || of_console_device != dp)
2686 + if (!con)
2687 + return 0;
2688 +
2689 + drv->cons = con;
2690 +
2691 + if (of_console_device != dp)
2692 return 0;
2693
2694 if (!ignore_line) {
2695 @@ -69,12 +74,10 @@ int sunserial_console_match(struct console *con, struct device_node *dp,
2696 return 0;
2697 }
2698
2699 - con->index = line;
2700 - drv->cons = con;
2701 -
2702 - if (!console_set_on_cmdline)
2703 + if (!console_set_on_cmdline) {
2704 + con->index = line;
2705 add_preferred_console(con->name, line, NULL);
2706 -
2707 + }
2708 return 1;
2709 }
2710 EXPORT_SYMBOL(sunserial_console_match);
2711 diff --git a/drivers/staging/batman-adv/hard-interface.c b/drivers/staging/batman-adv/hard-interface.c
2712 index 7a582e8..ce1d251 100644
2713 --- a/drivers/staging/batman-adv/hard-interface.c
2714 +++ b/drivers/staging/batman-adv/hard-interface.c
2715 @@ -128,6 +128,9 @@ static bool hardif_is_iface_up(struct batman_if *batman_if)
2716
2717 static void update_mac_addresses(struct batman_if *batman_if)
2718 {
2719 + if (!batman_if || !batman_if->packet_buff)
2720 + return;
2721 +
2722 addr_to_string(batman_if->addr_str, batman_if->net_dev->dev_addr);
2723
2724 memcpy(((struct batman_packet *)(batman_if->packet_buff))->orig,
2725 @@ -194,8 +197,6 @@ static void hardif_activate_interface(struct bat_priv *bat_priv,
2726 if (batman_if->if_status != IF_INACTIVE)
2727 return;
2728
2729 - dev_hold(batman_if->net_dev);
2730 -
2731 update_mac_addresses(batman_if);
2732 batman_if->if_status = IF_TO_BE_ACTIVATED;
2733
2734 @@ -222,8 +223,6 @@ static void hardif_deactivate_interface(struct batman_if *batman_if)
2735 (batman_if->if_status != IF_TO_BE_ACTIVATED))
2736 return;
2737
2738 - dev_put(batman_if->net_dev);
2739 -
2740 batman_if->if_status = IF_INACTIVE;
2741
2742 printk(KERN_INFO "batman-adv:Interface deactivated: %s\n",
2743 @@ -321,12 +320,14 @@ static struct batman_if *hardif_add_interface(struct net_device *net_dev)
2744 if (ret != 1)
2745 goto out;
2746
2747 + dev_hold(net_dev);
2748 +
2749 batman_if = kmalloc(sizeof(struct batman_if), GFP_ATOMIC);
2750 if (!batman_if) {
2751 printk(KERN_ERR "batman-adv:"
2752 "Can't add interface (%s): out of memory\n",
2753 net_dev->name);
2754 - goto out;
2755 + goto release_dev;
2756 }
2757
2758 batman_if->dev = kstrdup(net_dev->name, GFP_ATOMIC);
2759 @@ -340,6 +341,7 @@ static struct batman_if *hardif_add_interface(struct net_device *net_dev)
2760 batman_if->if_num = -1;
2761 batman_if->net_dev = net_dev;
2762 batman_if->if_status = IF_NOT_IN_USE;
2763 + batman_if->packet_buff = NULL;
2764 INIT_LIST_HEAD(&batman_if->list);
2765
2766 check_known_mac_addr(batman_if->net_dev->dev_addr);
2767 @@ -350,6 +352,8 @@ free_dev:
2768 kfree(batman_if->dev);
2769 free_if:
2770 kfree(batman_if);
2771 +release_dev:
2772 + dev_put(net_dev);
2773 out:
2774 return NULL;
2775 }
2776 @@ -378,6 +382,7 @@ static void hardif_remove_interface(struct batman_if *batman_if)
2777 batman_if->if_status = IF_TO_BE_REMOVED;
2778 list_del_rcu(&batman_if->list);
2779 sysfs_del_hardif(&batman_if->hardif_obj);
2780 + dev_put(batman_if->net_dev);
2781 call_rcu(&batman_if->rcu, hardif_free_interface);
2782 }
2783
2784 @@ -397,15 +402,13 @@ static int hard_if_event(struct notifier_block *this,
2785 /* FIXME: each batman_if will be attached to a softif */
2786 struct bat_priv *bat_priv = netdev_priv(soft_device);
2787
2788 - if (!batman_if)
2789 - batman_if = hardif_add_interface(net_dev);
2790 + if (!batman_if && event == NETDEV_REGISTER)
2791 + batman_if = hardif_add_interface(net_dev);
2792
2793 if (!batman_if)
2794 goto out;
2795
2796 switch (event) {
2797 - case NETDEV_REGISTER:
2798 - break;
2799 case NETDEV_UP:
2800 hardif_activate_interface(bat_priv, batman_if);
2801 break;
2802 diff --git a/drivers/staging/batman-adv/originator.c b/drivers/staging/batman-adv/originator.c
2803 index 568aef8..2177c50 100644
2804 --- a/drivers/staging/batman-adv/originator.c
2805 +++ b/drivers/staging/batman-adv/originator.c
2806 @@ -401,11 +401,12 @@ static int orig_node_add_if(struct orig_node *orig_node, int max_if_num)
2807 int orig_hash_add_if(struct batman_if *batman_if, int max_if_num)
2808 {
2809 struct orig_node *orig_node;
2810 + unsigned long flags;
2811 HASHIT(hashit);
2812
2813 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on
2814 * if_num */
2815 - spin_lock(&orig_hash_lock);
2816 + spin_lock_irqsave(&orig_hash_lock, flags);
2817
2818 while (hash_iterate(orig_hash, &hashit)) {
2819 orig_node = hashit.bucket->data;
2820 @@ -414,11 +415,11 @@ int orig_hash_add_if(struct batman_if *batman_if, int max_if_num)
2821 goto err;
2822 }
2823
2824 - spin_unlock(&orig_hash_lock);
2825 + spin_unlock_irqrestore(&orig_hash_lock, flags);
2826 return 0;
2827
2828 err:
2829 - spin_unlock(&orig_hash_lock);
2830 + spin_unlock_irqrestore(&orig_hash_lock, flags);
2831 return -ENOMEM;
2832 }
2833
2834 @@ -480,12 +481,13 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)
2835 {
2836 struct batman_if *batman_if_tmp;
2837 struct orig_node *orig_node;
2838 + unsigned long flags;
2839 HASHIT(hashit);
2840 int ret;
2841
2842 /* resize all orig nodes because orig_node->bcast_own(_sum) depend on
2843 * if_num */
2844 - spin_lock(&orig_hash_lock);
2845 + spin_lock_irqsave(&orig_hash_lock, flags);
2846
2847 while (hash_iterate(orig_hash, &hashit)) {
2848 orig_node = hashit.bucket->data;
2849 @@ -512,10 +514,10 @@ int orig_hash_del_if(struct batman_if *batman_if, int max_if_num)
2850 rcu_read_unlock();
2851
2852 batman_if->if_num = -1;
2853 - spin_unlock(&orig_hash_lock);
2854 + spin_unlock_irqrestore(&orig_hash_lock, flags);
2855 return 0;
2856
2857 err:
2858 - spin_unlock(&orig_hash_lock);
2859 + spin_unlock_irqrestore(&orig_hash_lock, flags);
2860 return -ENOMEM;
2861 }
2862 diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
2863 index bfc99a9..221f999 100644
2864 --- a/drivers/usb/host/xhci-ring.c
2865 +++ b/drivers/usb/host/xhci-ring.c
2866 @@ -131,7 +131,7 @@ static void next_trb(struct xhci_hcd *xhci,
2867 *seg = (*seg)->next;
2868 *trb = ((*seg)->trbs);
2869 } else {
2870 - *trb = (*trb)++;
2871 + (*trb)++;
2872 }
2873 }
2874
2875 diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
2876 index 2bef441..80bf833 100644
2877 --- a/drivers/usb/serial/cp210x.c
2878 +++ b/drivers/usb/serial/cp210x.c
2879 @@ -222,8 +222,8 @@ static struct usb_serial_driver cp210x_device = {
2880 #define BITS_STOP_2 0x0002
2881
2882 /* CP210X_SET_BREAK */
2883 -#define BREAK_ON 0x0000
2884 -#define BREAK_OFF 0x0001
2885 +#define BREAK_ON 0x0001
2886 +#define BREAK_OFF 0x0000
2887
2888 /* CP210X_(SET_MHS|GET_MDMSTS) */
2889 #define CONTROL_DTR 0x0001
2890 diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
2891 index eb12d9b..63ddb2f 100644
2892 --- a/drivers/usb/serial/ftdi_sio.c
2893 +++ b/drivers/usb/serial/ftdi_sio.c
2894 @@ -180,6 +180,7 @@ static struct usb_device_id id_table_combined [] = {
2895 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_IOBOARD_PID) },
2896 { USB_DEVICE(INTERBIOMETRICS_VID, INTERBIOMETRICS_MINI_IOBOARD_PID) },
2897 { USB_DEVICE(FTDI_VID, FTDI_SPROG_II) },
2898 + { USB_DEVICE(FTDI_VID, FTDI_LENZ_LIUSB_PID) },
2899 { USB_DEVICE(FTDI_VID, FTDI_XF_632_PID) },
2900 { USB_DEVICE(FTDI_VID, FTDI_XF_634_PID) },
2901 { USB_DEVICE(FTDI_VID, FTDI_XF_547_PID) },
2902 @@ -750,6 +751,8 @@ static struct usb_device_id id_table_combined [] = {
2903 { USB_DEVICE(FTDI_VID, XVERVE_SIGNALYZER_SH4_PID),
2904 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
2905 { USB_DEVICE(FTDI_VID, SEGWAY_RMP200_PID) },
2906 + { USB_DEVICE(IONICS_VID, IONICS_PLUGCOMPUTER_PID),
2907 + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
2908 { }, /* Optional parameter entry */
2909 { } /* Terminating entry */
2910 };
2911 @@ -1376,7 +1379,7 @@ static void ftdi_set_max_packet_size(struct usb_serial_port *port)
2912 }
2913
2914 /* set max packet size based on descriptor */
2915 - priv->max_packet_size = ep_desc->wMaxPacketSize;
2916 + priv->max_packet_size = le16_to_cpu(ep_desc->wMaxPacketSize);
2917
2918 dev_info(&udev->dev, "Setting MaxPacketSize %d\n", priv->max_packet_size);
2919 }
2920 diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
2921 index 6e612c5..2e95857 100644
2922 --- a/drivers/usb/serial/ftdi_sio_ids.h
2923 +++ b/drivers/usb/serial/ftdi_sio_ids.h
2924 @@ -110,6 +110,9 @@
2925 /* Propox devices */
2926 #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738
2927
2928 +/* Lenz LI-USB Computer Interface. */
2929 +#define FTDI_LENZ_LIUSB_PID 0xD780
2930 +
2931 /*
2932 * Xsens Technologies BV products (http://www.xsens.com).
2933 */
2934 @@ -989,6 +992,12 @@
2935 #define ALTI2_N3_PID 0x6001 /* Neptune 3 */
2936
2937 /*
2938 + * Ionics PlugComputer
2939 + */
2940 +#define IONICS_VID 0x1c0c
2941 +#define IONICS_PLUGCOMPUTER_PID 0x0102
2942 +
2943 +/*
2944 * Dresden Elektronik Sensor Terminal Board
2945 */
2946 #define DE_VID 0x1cf1 /* Vendor ID */
2947 diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
2948 index 0fca265..9991063 100644
2949 --- a/drivers/usb/serial/io_ti.c
2950 +++ b/drivers/usb/serial/io_ti.c
2951 @@ -1151,7 +1151,7 @@ static int download_fw(struct edgeport_serial *serial)
2952
2953 /* Check if we have an old version in the I2C and
2954 update if necessary */
2955 - if (download_cur_ver != download_new_ver) {
2956 + if (download_cur_ver < download_new_ver) {
2957 dbg("%s - Update I2C dld from %d.%d to %d.%d",
2958 __func__,
2959 firmware_version->Ver_Major,
2960 diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c
2961 index a6b207c..1f00f24 100644
2962 --- a/drivers/usb/serial/navman.c
2963 +++ b/drivers/usb/serial/navman.c
2964 @@ -25,6 +25,7 @@ static int debug;
2965
2966 static const struct usb_device_id id_table[] = {
2967 { USB_DEVICE(0x0a99, 0x0001) }, /* Talon Technology device */
2968 + { USB_DEVICE(0x0df7, 0x0900) }, /* Mobile Action i-gotU */
2969 { },
2970 };
2971 MODULE_DEVICE_TABLE(usb, id_table);
2972 diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
2973 index 5c35b3a..80c74d4 100644
2974 --- a/drivers/usb/serial/option.c
2975 +++ b/drivers/usb/serial/option.c
2976 @@ -368,6 +368,10 @@ static void option_instat_callback(struct urb *urb);
2977 #define OLIVETTI_VENDOR_ID 0x0b3c
2978 #define OLIVETTI_PRODUCT_OLICARD100 0xc000
2979
2980 +/* Celot products */
2981 +#define CELOT_VENDOR_ID 0x211f
2982 +#define CELOT_PRODUCT_CT680M 0x6801
2983 +
2984 /* some devices interfaces need special handling due to a number of reasons */
2985 enum option_blacklist_reason {
2986 OPTION_BLACKLIST_NONE = 0,
2987 @@ -891,10 +895,9 @@ static const struct usb_device_id option_ids[] = {
2988 { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_100F) },
2989 { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1011)},
2990 { USB_DEVICE(PIRELLI_VENDOR_ID, PIRELLI_PRODUCT_1012)},
2991 -
2992 { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) },
2993 -
2994 { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) },
2995 + { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */
2996 { } /* Terminating entry */
2997 };
2998 MODULE_DEVICE_TABLE(usb, option_ids);
2999 diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c
3000 index 6b60018..c98f0fb 100644
3001 --- a/drivers/usb/serial/pl2303.c
3002 +++ b/drivers/usb/serial/pl2303.c
3003 @@ -86,6 +86,7 @@ static const struct usb_device_id id_table[] = {
3004 { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) },
3005 { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) },
3006 { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) },
3007 + { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) },
3008 { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
3009 { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
3010 { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
3011 diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h
3012 index a871645..43eb9bd 100644
3013 --- a/drivers/usb/serial/pl2303.h
3014 +++ b/drivers/usb/serial/pl2303.h
3015 @@ -128,6 +128,10 @@
3016 #define CRESSI_VENDOR_ID 0x04b8
3017 #define CRESSI_EDY_PRODUCT_ID 0x0521
3018
3019 +/* Zeagle dive computer interface */
3020 +#define ZEAGLE_VENDOR_ID 0x04b8
3021 +#define ZEAGLE_N2ITION3_PRODUCT_ID 0x0522
3022 +
3023 /* Sony, USB data cable for CMD-Jxx mobile phones */
3024 #define SONY_VENDOR_ID 0x054c
3025 #define SONY_QN3USB_PRODUCT_ID 0x0437
3026 diff --git a/drivers/video/matrox/matroxfb_base.h b/drivers/video/matrox/matroxfb_base.h
3027 index f3a4e15..f96a471 100644
3028 --- a/drivers/video/matrox/matroxfb_base.h
3029 +++ b/drivers/video/matrox/matroxfb_base.h
3030 @@ -151,13 +151,13 @@ static inline void mga_writel(vaddr_t va, unsigned int offs, u_int32_t value) {
3031 static inline void mga_memcpy_toio(vaddr_t va, const void* src, int len) {
3032 #if defined(__alpha__) || defined(__i386__) || defined(__x86_64__)
3033 /*
3034 - * memcpy_toio works for us if:
3035 + * iowrite32_rep works for us if:
3036 * (1) Copies data as 32bit quantities, not byte after byte,
3037 * (2) Performs LE ordered stores, and
3038 * (3) It copes with unaligned source (destination is guaranteed to be page
3039 * aligned and length is guaranteed to be multiple of 4).
3040 */
3041 - memcpy_toio(va.vaddr, src, len);
3042 + iowrite32_rep(va.vaddr, src, len >> 2);
3043 #else
3044 u_int32_t __iomem* addr = va.vaddr;
3045
3046 diff --git a/firmware/Makefile b/firmware/Makefile
3047 index 020e629..99955ed 100644
3048 --- a/firmware/Makefile
3049 +++ b/firmware/Makefile
3050 @@ -142,7 +142,7 @@ fw-shipped-$(CONFIG_YAM) += yam/1200.bin yam/9600.bin
3051 fw-shipped-all := $(fw-shipped-y) $(fw-shipped-m) $(fw-shipped-)
3052
3053 # Directories which we _might_ need to create, so we have a rule for them.
3054 -firmware-dirs := $(sort $(patsubst %,$(objtree)/$(obj)/%/,$(dir $(fw-external-y) $(fw-shipped-all))))
3055 +firmware-dirs := $(sort $(addprefix $(objtree)/$(obj)/,$(dir $(fw-external-y) $(fw-shipped-all))))
3056
3057 quiet_cmd_mkdir = MKDIR $(patsubst $(objtree)/%,%,$@)
3058 cmd_mkdir = mkdir -p $@
3059 diff --git a/fs/char_dev.c b/fs/char_dev.c
3060 index d6db933..f80a4f2 100644
3061 --- a/fs/char_dev.c
3062 +++ b/fs/char_dev.c
3063 @@ -20,6 +20,7 @@
3064 #include <linux/cdev.h>
3065 #include <linux/mutex.h>
3066 #include <linux/backing-dev.h>
3067 +#include <linux/tty.h>
3068
3069 #include "internal.h"
3070
3071 diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
3072 index e60416d..d69551e 100644
3073 --- a/fs/nfs/dir.c
3074 +++ b/fs/nfs/dir.c
3075 @@ -1103,7 +1103,7 @@ static int nfs_open_revalidate(struct dentry *dentry, struct nameidata *nd)
3076 if ((openflags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL))
3077 goto no_open_dput;
3078 /* We can't create new files, or truncate existing ones here */
3079 - openflags &= ~(O_CREAT|O_TRUNC);
3080 + openflags &= ~(O_CREAT|O_EXCL|O_TRUNC);
3081
3082 /*
3083 * Note: we're not holding inode->i_mutex and so may be racing with
3084 diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
3085 index 70015dd..330a3c9 100644
3086 --- a/fs/nfs/nfs4proc.c
3087 +++ b/fs/nfs/nfs4proc.c
3088 @@ -2023,7 +2023,8 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
3089 struct rpc_cred *cred;
3090 struct nfs4_state *state;
3091 struct dentry *res;
3092 - fmode_t fmode = nd->intent.open.flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC);
3093 + int open_flags = nd->intent.open.flags;
3094 + fmode_t fmode = open_flags & (FMODE_READ | FMODE_WRITE | FMODE_EXEC);
3095
3096 if (nd->flags & LOOKUP_CREATE) {
3097 attr.ia_mode = nd->intent.open.create_mode;
3098 @@ -2031,8 +2032,9 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
3099 if (!IS_POSIXACL(dir))
3100 attr.ia_mode &= ~current_umask();
3101 } else {
3102 + open_flags &= ~O_EXCL;
3103 attr.ia_valid = 0;
3104 - BUG_ON(nd->intent.open.flags & O_CREAT);
3105 + BUG_ON(open_flags & O_CREAT);
3106 }
3107
3108 cred = rpc_lookup_cred();
3109 @@ -2041,7 +2043,7 @@ nfs4_atomic_open(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
3110 parent = dentry->d_parent;
3111 /* Protect against concurrent sillydeletes */
3112 nfs_block_sillyrename(parent);
3113 - state = nfs4_do_open(dir, &path, fmode, nd->intent.open.flags, &attr, cred);
3114 + state = nfs4_do_open(dir, &path, fmode, open_flags, &attr, cred);
3115 put_rpccred(cred);
3116 if (IS_ERR(state)) {
3117 if (PTR_ERR(state) == -ENOENT) {
3118 diff --git a/fs/nfs/super.c b/fs/nfs/super.c
3119 index f9df16d..6bf11d7 100644
3120 --- a/fs/nfs/super.c
3121 +++ b/fs/nfs/super.c
3122 @@ -652,6 +652,13 @@ static void nfs_show_mount_options(struct seq_file *m, struct nfs_server *nfss,
3123
3124 if (nfss->options & NFS_OPTION_FSCACHE)
3125 seq_printf(m, ",fsc");
3126 +
3127 + if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONEG) {
3128 + if (nfss->flags & NFS_MOUNT_LOOKUP_CACHE_NONE)
3129 + seq_printf(m, ",lookupcache=none");
3130 + else
3131 + seq_printf(m, ",lookupcache=pos");
3132 + }
3133 }
3134
3135 /*
3136 diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
3137 index 414ef68..fbb354c 100644
3138 --- a/fs/nilfs2/super.c
3139 +++ b/fs/nilfs2/super.c
3140 @@ -336,9 +336,10 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
3141 list_add(&sbi->s_list, &nilfs->ns_supers);
3142 up_write(&nilfs->ns_super_sem);
3143
3144 + err = -ENOMEM;
3145 sbi->s_ifile = nilfs_ifile_new(sbi, nilfs->ns_inode_size);
3146 if (!sbi->s_ifile)
3147 - return -ENOMEM;
3148 + goto delist;
3149
3150 down_read(&nilfs->ns_segctor_sem);
3151 err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
3152 @@ -369,6 +370,7 @@ int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno)
3153 nilfs_mdt_destroy(sbi->s_ifile);
3154 sbi->s_ifile = NULL;
3155
3156 + delist:
3157 down_write(&nilfs->ns_super_sem);
3158 list_del_init(&sbi->s_list);
3159 up_write(&nilfs->ns_super_sem);
3160 diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c
3161 index da70229..a76e0aa 100644
3162 --- a/fs/ocfs2/acl.c
3163 +++ b/fs/ocfs2/acl.c
3164 @@ -290,12 +290,30 @@ static int ocfs2_set_acl(handle_t *handle,
3165
3166 int ocfs2_check_acl(struct inode *inode, int mask)
3167 {
3168 - struct posix_acl *acl = ocfs2_get_acl(inode, ACL_TYPE_ACCESS);
3169 + struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
3170 + struct buffer_head *di_bh = NULL;
3171 + struct posix_acl *acl;
3172 + int ret = -EAGAIN;
3173
3174 - if (IS_ERR(acl))
3175 + if (!(osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL))
3176 + return ret;
3177 +
3178 + ret = ocfs2_read_inode_block(inode, &di_bh);
3179 + if (ret < 0) {
3180 + mlog_errno(ret);
3181 + return ret;
3182 + }
3183 +
3184 + acl = ocfs2_get_acl_nolock(inode, ACL_TYPE_ACCESS, di_bh);
3185 +
3186 + brelse(di_bh);
3187 +
3188 + if (IS_ERR(acl)) {
3189 + mlog_errno(PTR_ERR(acl));
3190 return PTR_ERR(acl);
3191 + }
3192 if (acl) {
3193 - int ret = posix_acl_permission(inode, acl, mask);
3194 + ret = posix_acl_permission(inode, acl, mask);
3195 posix_acl_release(acl);
3196 return ret;
3197 }
3198 @@ -344,7 +362,7 @@ int ocfs2_init_acl(handle_t *handle,
3199 {
3200 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
3201 struct posix_acl *acl = NULL;
3202 - int ret = 0;
3203 + int ret = 0, ret2;
3204 mode_t mode;
3205
3206 if (!S_ISLNK(inode->i_mode)) {
3207 @@ -381,7 +399,12 @@ int ocfs2_init_acl(handle_t *handle,
3208 mode = inode->i_mode;
3209 ret = posix_acl_create_masq(clone, &mode);
3210 if (ret >= 0) {
3211 - ret = ocfs2_acl_set_mode(inode, di_bh, handle, mode);
3212 + ret2 = ocfs2_acl_set_mode(inode, di_bh, handle, mode);
3213 + if (ret2) {
3214 + mlog_errno(ret2);
3215 + ret = ret2;
3216 + goto cleanup;
3217 + }
3218 if (ret > 0) {
3219 ret = ocfs2_set_acl(handle, inode,
3220 di_bh, ACL_TYPE_ACCESS,
3221 diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
3222 index 94b97fc..ffb4c68 100644
3223 --- a/fs/ocfs2/dlm/dlmmaster.c
3224 +++ b/fs/ocfs2/dlm/dlmmaster.c
3225 @@ -511,8 +511,6 @@ static void dlm_lockres_release(struct kref *kref)
3226
3227 atomic_dec(&dlm->res_cur_count);
3228
3229 - dlm_put(dlm);
3230 -
3231 if (!hlist_unhashed(&res->hash_node) ||
3232 !list_empty(&res->granted) ||
3233 !list_empty(&res->converting) ||
3234 @@ -585,8 +583,6 @@ static void dlm_init_lockres(struct dlm_ctxt *dlm,
3235 res->migration_pending = 0;
3236 res->inflight_locks = 0;
3237
3238 - /* put in dlm_lockres_release */
3239 - dlm_grab(dlm);
3240 res->dlm = dlm;
3241
3242 kref_init(&res->refs);
3243 @@ -3050,8 +3046,6 @@ int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data,
3244 /* check for pre-existing lock */
3245 spin_lock(&dlm->spinlock);
3246 res = __dlm_lookup_lockres(dlm, name, namelen, hash);
3247 - spin_lock(&dlm->master_lock);
3248 -
3249 if (res) {
3250 spin_lock(&res->spinlock);
3251 if (res->state & DLM_LOCK_RES_RECOVERING) {
3252 @@ -3069,14 +3063,15 @@ int dlm_migrate_request_handler(struct o2net_msg *msg, u32 len, void *data,
3253 spin_unlock(&res->spinlock);
3254 }
3255
3256 + spin_lock(&dlm->master_lock);
3257 /* ignore status. only nonzero status would BUG. */
3258 ret = dlm_add_migration_mle(dlm, res, mle, &oldmle,
3259 name, namelen,
3260 migrate->new_master,
3261 migrate->master);
3262
3263 -unlock:
3264 spin_unlock(&dlm->master_lock);
3265 +unlock:
3266 spin_unlock(&dlm->spinlock);
3267
3268 if (oldmle) {
3269 diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c
3270 index 9dfaac7..aaaffbc 100644
3271 --- a/fs/ocfs2/dlm/dlmrecovery.c
3272 +++ b/fs/ocfs2/dlm/dlmrecovery.c
3273 @@ -1997,6 +1997,8 @@ void dlm_move_lockres_to_recovery_list(struct dlm_ctxt *dlm,
3274 struct list_head *queue;
3275 struct dlm_lock *lock, *next;
3276
3277 + assert_spin_locked(&dlm->spinlock);
3278 + assert_spin_locked(&res->spinlock);
3279 res->state |= DLM_LOCK_RES_RECOVERING;
3280 if (!list_empty(&res->recovering)) {
3281 mlog(0,
3282 @@ -2326,19 +2328,15 @@ static void dlm_do_local_recovery_cleanup(struct dlm_ctxt *dlm, u8 dead_node)
3283 /* zero the lvb if necessary */
3284 dlm_revalidate_lvb(dlm, res, dead_node);
3285 if (res->owner == dead_node) {
3286 - if (res->state & DLM_LOCK_RES_DROPPING_REF)
3287 - mlog(0, "%s:%.*s: owned by "
3288 - "dead node %u, this node was "
3289 - "dropping its ref when it died. "
3290 - "continue, dropping the flag.\n",
3291 - dlm->name, res->lockname.len,
3292 - res->lockname.name, dead_node);
3293 -
3294 - /* the wake_up for this will happen when the
3295 - * RECOVERING flag is dropped later */
3296 - res->state &= ~DLM_LOCK_RES_DROPPING_REF;
3297 + if (res->state & DLM_LOCK_RES_DROPPING_REF) {
3298 + mlog(ML_NOTICE, "Ignore %.*s for "
3299 + "recovery as it is being freed\n",
3300 + res->lockname.len,
3301 + res->lockname.name);
3302 + } else
3303 + dlm_move_lockres_to_recovery_list(dlm,
3304 + res);
3305
3306 - dlm_move_lockres_to_recovery_list(dlm, res);
3307 } else if (res->owner == dlm->node_num) {
3308 dlm_free_dead_locks(dlm, res, dead_node);
3309 __dlm_lockres_calc_usage(dlm, res);
3310 diff --git a/fs/ocfs2/dlm/dlmthread.c b/fs/ocfs2/dlm/dlmthread.c
3311 index d4f73ca..2211acf 100644
3312 --- a/fs/ocfs2/dlm/dlmthread.c
3313 +++ b/fs/ocfs2/dlm/dlmthread.c
3314 @@ -92,19 +92,27 @@ int __dlm_lockres_has_locks(struct dlm_lock_resource *res)
3315 * truly ready to be freed. */
3316 int __dlm_lockres_unused(struct dlm_lock_resource *res)
3317 {
3318 - if (!__dlm_lockres_has_locks(res) &&
3319 - (list_empty(&res->dirty) && !(res->state & DLM_LOCK_RES_DIRTY))) {
3320 - /* try not to scan the bitmap unless the first two
3321 - * conditions are already true */
3322 - int bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
3323 - if (bit >= O2NM_MAX_NODES) {
3324 - /* since the bit for dlm->node_num is not
3325 - * set, inflight_locks better be zero */
3326 - BUG_ON(res->inflight_locks != 0);
3327 - return 1;
3328 - }
3329 - }
3330 - return 0;
3331 + int bit;
3332 +
3333 + if (__dlm_lockres_has_locks(res))
3334 + return 0;
3335 +
3336 + if (!list_empty(&res->dirty) || res->state & DLM_LOCK_RES_DIRTY)
3337 + return 0;
3338 +
3339 + if (res->state & DLM_LOCK_RES_RECOVERING)
3340 + return 0;
3341 +
3342 + bit = find_next_bit(res->refmap, O2NM_MAX_NODES, 0);
3343 + if (bit < O2NM_MAX_NODES)
3344 + return 0;
3345 +
3346 + /*
3347 + * since the bit for dlm->node_num is not set, inflight_locks better
3348 + * be zero
3349 + */
3350 + BUG_ON(res->inflight_locks != 0);
3351 + return 1;
3352 }
3353
3354
3355 @@ -152,45 +160,25 @@ void dlm_lockres_calc_usage(struct dlm_ctxt *dlm,
3356 spin_unlock(&dlm->spinlock);
3357 }
3358
3359 -static int dlm_purge_lockres(struct dlm_ctxt *dlm,
3360 +static void dlm_purge_lockres(struct dlm_ctxt *dlm,
3361 struct dlm_lock_resource *res)
3362 {
3363 int master;
3364 int ret = 0;
3365
3366 - spin_lock(&res->spinlock);
3367 - if (!__dlm_lockres_unused(res)) {
3368 - mlog(0, "%s:%.*s: tried to purge but not unused\n",
3369 - dlm->name, res->lockname.len, res->lockname.name);
3370 - __dlm_print_one_lock_resource(res);
3371 - spin_unlock(&res->spinlock);
3372 - BUG();
3373 - }
3374 -
3375 - if (res->state & DLM_LOCK_RES_MIGRATING) {
3376 - mlog(0, "%s:%.*s: Delay dropref as this lockres is "
3377 - "being remastered\n", dlm->name, res->lockname.len,
3378 - res->lockname.name);
3379 - /* Re-add the lockres to the end of the purge list */
3380 - if (!list_empty(&res->purge)) {
3381 - list_del_init(&res->purge);
3382 - list_add_tail(&res->purge, &dlm->purge_list);
3383 - }
3384 - spin_unlock(&res->spinlock);
3385 - return 0;
3386 - }
3387 + assert_spin_locked(&dlm->spinlock);
3388 + assert_spin_locked(&res->spinlock);
3389
3390 master = (res->owner == dlm->node_num);
3391
3392 - if (!master)
3393 - res->state |= DLM_LOCK_RES_DROPPING_REF;
3394 - spin_unlock(&res->spinlock);
3395
3396 mlog(0, "purging lockres %.*s, master = %d\n", res->lockname.len,
3397 res->lockname.name, master);
3398
3399 if (!master) {
3400 + res->state |= DLM_LOCK_RES_DROPPING_REF;
3401 /* drop spinlock... retake below */
3402 + spin_unlock(&res->spinlock);
3403 spin_unlock(&dlm->spinlock);
3404
3405 spin_lock(&res->spinlock);
3406 @@ -208,31 +196,35 @@ static int dlm_purge_lockres(struct dlm_ctxt *dlm,
3407 mlog(0, "%s:%.*s: dlm_deref_lockres returned %d\n",
3408 dlm->name, res->lockname.len, res->lockname.name, ret);
3409 spin_lock(&dlm->spinlock);
3410 + spin_lock(&res->spinlock);
3411 }
3412
3413 - spin_lock(&res->spinlock);
3414 if (!list_empty(&res->purge)) {
3415 mlog(0, "removing lockres %.*s:%p from purgelist, "
3416 "master = %d\n", res->lockname.len, res->lockname.name,
3417 res, master);
3418 list_del_init(&res->purge);
3419 - spin_unlock(&res->spinlock);
3420 dlm_lockres_put(res);
3421 dlm->purge_count--;
3422 - } else
3423 - spin_unlock(&res->spinlock);
3424 + }
3425 +
3426 + if (!__dlm_lockres_unused(res)) {
3427 + mlog(ML_ERROR, "found lockres %s:%.*s: in use after deref\n",
3428 + dlm->name, res->lockname.len, res->lockname.name);
3429 + __dlm_print_one_lock_resource(res);
3430 + BUG();
3431 + }
3432
3433 __dlm_unhash_lockres(res);
3434
3435 /* lockres is not in the hash now. drop the flag and wake up
3436 * any processes waiting in dlm_get_lock_resource. */
3437 if (!master) {
3438 - spin_lock(&res->spinlock);
3439 res->state &= ~DLM_LOCK_RES_DROPPING_REF;
3440 spin_unlock(&res->spinlock);
3441 wake_up(&res->wq);
3442 - }
3443 - return 0;
3444 + } else
3445 + spin_unlock(&res->spinlock);
3446 }
3447
3448 static void dlm_run_purge_list(struct dlm_ctxt *dlm,
3449 @@ -251,17 +243,7 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm,
3450 lockres = list_entry(dlm->purge_list.next,
3451 struct dlm_lock_resource, purge);
3452
3453 - /* Status of the lockres *might* change so double
3454 - * check. If the lockres is unused, holding the dlm
3455 - * spinlock will prevent people from getting and more
3456 - * refs on it -- there's no need to keep the lockres
3457 - * spinlock. */
3458 spin_lock(&lockres->spinlock);
3459 - unused = __dlm_lockres_unused(lockres);
3460 - spin_unlock(&lockres->spinlock);
3461 -
3462 - if (!unused)
3463 - continue;
3464
3465 purge_jiffies = lockres->last_used +
3466 msecs_to_jiffies(DLM_PURGE_INTERVAL_MS);
3467 @@ -273,15 +255,29 @@ static void dlm_run_purge_list(struct dlm_ctxt *dlm,
3468 * in tail order, we can stop at the first
3469 * unpurgable resource -- anyone added after
3470 * him will have a greater last_used value */
3471 + spin_unlock(&lockres->spinlock);
3472 break;
3473 }
3474
3475 + /* Status of the lockres *might* change so double
3476 + * check. If the lockres is unused, holding the dlm
3477 + * spinlock will prevent people from getting and more
3478 + * refs on it. */
3479 + unused = __dlm_lockres_unused(lockres);
3480 + if (!unused ||
3481 + (lockres->state & DLM_LOCK_RES_MIGRATING)) {
3482 + mlog(0, "lockres %s:%.*s: is in use or "
3483 + "being remastered, used %d, state %d\n",
3484 + dlm->name, lockres->lockname.len,
3485 + lockres->lockname.name, !unused, lockres->state);
3486 + list_move_tail(&dlm->purge_list, &lockres->purge);
3487 + spin_unlock(&lockres->spinlock);
3488 + continue;
3489 + }
3490 +
3491 dlm_lockres_get(lockres);
3492
3493 - /* This may drop and reacquire the dlm spinlock if it
3494 - * has to do migration. */
3495 - if (dlm_purge_lockres(dlm, lockres))
3496 - BUG();
3497 + dlm_purge_lockres(dlm, lockres);
3498
3499 dlm_lockres_put(lockres);
3500
3501 diff --git a/fs/ocfs2/refcounttree.c b/fs/ocfs2/refcounttree.c
3502 index 3ac5aa7..73a11cc 100644
3503 --- a/fs/ocfs2/refcounttree.c
3504 +++ b/fs/ocfs2/refcounttree.c
3505 @@ -2436,16 +2436,26 @@ static int ocfs2_calc_refcount_meta_credits(struct super_block *sb,
3506 len = min((u64)cpos + clusters, le64_to_cpu(rec.r_cpos) +
3507 le32_to_cpu(rec.r_clusters)) - cpos;
3508 /*
3509 - * If the refcount rec already exist, cool. We just need
3510 - * to check whether there is a split. Otherwise we just need
3511 - * to increase the refcount.
3512 - * If we will insert one, increases recs_add.
3513 - *
3514 * We record all the records which will be inserted to the
3515 * same refcount block, so that we can tell exactly whether
3516 * we need a new refcount block or not.
3517 + *
3518 + * If we will insert a new one, this is easy and only happens
3519 + * during adding refcounted flag to the extent, so we don't
3520 + * have a chance of spliting. We just need one record.
3521 + *
3522 + * If the refcount rec already exists, that would be a little
3523 + * complicated. we may have to:
3524 + * 1) split at the beginning if the start pos isn't aligned.
3525 + * we need 1 more record in this case.
3526 + * 2) split int the end if the end pos isn't aligned.
3527 + * we need 1 more record in this case.
3528 + * 3) split in the middle because of file system fragmentation.
3529 + * we need 2 more records in this case(we can't detect this
3530 + * beforehand, so always think of the worst case).
3531 */
3532 if (rec.r_refcount) {
3533 + recs_add += 2;
3534 /* Check whether we need a split at the beginning. */
3535 if (cpos == start_cpos &&
3536 cpos != le64_to_cpu(rec.r_cpos))
3537 diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
3538 index e5039a2..103f08a 100644
3539 --- a/include/acpi/platform/aclinux.h
3540 +++ b/include/acpi/platform/aclinux.h
3541 @@ -148,13 +148,17 @@ static inline void *acpi_os_acquire_object(acpi_cache_t * cache)
3542 #define ACPI_ALLOCATE_ZEROED(a) acpi_os_allocate_zeroed(a)
3543 #define ACPI_FREE(a) kfree(a)
3544
3545 -/* Used within ACPICA to show where it is safe to preempt execution */
3546 -#include <linux/hardirq.h>
3547 +#ifndef CONFIG_PREEMPT
3548 +/*
3549 + * Used within ACPICA to show where it is safe to preempt execution
3550 + * when CONFIG_PREEMPT=n
3551 + */
3552 #define ACPI_PREEMPTION_POINT() \
3553 do { \
3554 - if (!in_atomic_preempt_off() && !irqs_disabled()) \
3555 + if (!irqs_disabled()) \
3556 cond_resched(); \
3557 } while (0)
3558 +#endif
3559
3560 #endif /* __KERNEL__ */
3561
3562 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
3563 index b8bb9a6..ee7e258 100644
3564 --- a/include/linux/mm_types.h
3565 +++ b/include/linux/mm_types.h
3566 @@ -134,7 +134,7 @@ struct vm_area_struct {
3567 within vm_mm. */
3568
3569 /* linked list of VM areas per task, sorted by address */
3570 - struct vm_area_struct *vm_next;
3571 + struct vm_area_struct *vm_next, *vm_prev;
3572
3573 pgprot_t vm_page_prot; /* Access permissions of this VMA. */
3574 unsigned long vm_flags; /* Flags, see mm.h. */
3575 diff --git a/include/linux/mtd/flashchip.h b/include/linux/mtd/flashchip.h
3576 index f43e9b4..23cc10f 100644
3577 --- a/include/linux/mtd/flashchip.h
3578 +++ b/include/linux/mtd/flashchip.h
3579 @@ -92,7 +92,7 @@ struct flchip {
3580 /* This is used to handle contention on write/erase operations
3581 between partitions of the same physical chip. */
3582 struct flchip_shared {
3583 - spinlock_t lock;
3584 + struct mutex lock;
3585 struct flchip *writing;
3586 struct flchip *erasing;
3587 };
3588 diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
3589 index f89e7fd..eb674b7 100644
3590 --- a/include/linux/skbuff.h
3591 +++ b/include/linux/skbuff.h
3592 @@ -169,6 +169,7 @@ struct skb_shared_hwtstamps {
3593 * @software: generate software time stamp
3594 * @in_progress: device driver is going to provide
3595 * hardware time stamp
3596 + * @prevent_sk_orphan: make sk reference available on driver level
3597 * @flags: all shared_tx flags
3598 *
3599 * These flags are attached to packets as part of the
3600 @@ -178,7 +179,8 @@ union skb_shared_tx {
3601 struct {
3602 __u8 hardware:1,
3603 software:1,
3604 - in_progress:1;
3605 + in_progress:1,
3606 + prevent_sk_orphan:1;
3607 };
3608 __u8 flags;
3609 };
3610 diff --git a/include/linux/tty.h b/include/linux/tty.h
3611 index 931078b..7802a24 100644
3612 --- a/include/linux/tty.h
3613 +++ b/include/linux/tty.h
3614 @@ -552,6 +552,9 @@ static inline void tty_audit_push_task(struct task_struct *tsk,
3615 }
3616 #endif
3617
3618 +/* tty_io.c */
3619 +extern int __init tty_init(void);
3620 +
3621 /* tty_ioctl.c */
3622 extern int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
3623 unsigned int cmd, unsigned long arg);
3624 diff --git a/include/sound/emu10k1.h b/include/sound/emu10k1.h
3625 index 6a664c3..7dc97d1 100644
3626 --- a/include/sound/emu10k1.h
3627 +++ b/include/sound/emu10k1.h
3628 @@ -1707,6 +1707,7 @@ struct snd_emu10k1 {
3629 unsigned int card_type; /* EMU10K1_CARD_* */
3630 unsigned int ecard_ctrl; /* ecard control bits */
3631 unsigned long dma_mask; /* PCI DMA mask */
3632 + unsigned int delay_pcm_irq; /* in samples */
3633 int max_cache_pages; /* max memory size / PAGE_SIZE */
3634 struct snd_dma_buffer silent_page; /* silent page */
3635 struct snd_dma_buffer ptb_pages; /* page table pages */
3636 diff --git a/include/trace/events/timer.h b/include/trace/events/timer.h
3637 index 9496b96..fa8223a 100644
3638 --- a/include/trace/events/timer.h
3639 +++ b/include/trace/events/timer.h
3640 @@ -74,14 +74,16 @@ TRACE_EVENT(timer_expire_entry,
3641 TP_STRUCT__entry(
3642 __field( void *, timer )
3643 __field( unsigned long, now )
3644 + __field( void *, function)
3645 ),
3646
3647 TP_fast_assign(
3648 __entry->timer = timer;
3649 __entry->now = jiffies;
3650 + __entry->function = timer->function;
3651 ),
3652
3653 - TP_printk("timer=%p now=%lu", __entry->timer, __entry->now)
3654 + TP_printk("timer=%p function=%pf now=%lu", __entry->timer, __entry->function,__entry->now)
3655 );
3656
3657 /**
3658 @@ -213,14 +215,16 @@ TRACE_EVENT(hrtimer_expire_entry,
3659 TP_STRUCT__entry(
3660 __field( void *, hrtimer )
3661 __field( s64, now )
3662 + __field( void *, function)
3663 ),
3664
3665 TP_fast_assign(
3666 __entry->hrtimer = hrtimer;
3667 __entry->now = now->tv64;
3668 + __entry->function = hrtimer->function;
3669 ),
3670
3671 - TP_printk("hrtimer=%p now=%llu", __entry->hrtimer,
3672 + TP_printk("hrtimer=%p function=%pf now=%llu", __entry->hrtimer, __entry->function,
3673 (unsigned long long)ktime_to_ns((ktime_t) { .tv64 = __entry->now }))
3674 );
3675
3676 diff --git a/kernel/fork.c b/kernel/fork.c
3677 index b6cce14..e96c0cd 100644
3678 --- a/kernel/fork.c
3679 +++ b/kernel/fork.c
3680 @@ -300,7 +300,7 @@ out:
3681 #ifdef CONFIG_MMU
3682 static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
3683 {
3684 - struct vm_area_struct *mpnt, *tmp, **pprev;
3685 + struct vm_area_struct *mpnt, *tmp, *prev, **pprev;
3686 struct rb_node **rb_link, *rb_parent;
3687 int retval;
3688 unsigned long charge;
3689 @@ -328,6 +328,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
3690 if (retval)
3691 goto out;
3692
3693 + prev = NULL;
3694 for (mpnt = oldmm->mmap; mpnt; mpnt = mpnt->vm_next) {
3695 struct file *file;
3696
3697 @@ -359,7 +360,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
3698 goto fail_nomem_anon_vma_fork;
3699 tmp->vm_flags &= ~VM_LOCKED;
3700 tmp->vm_mm = mm;
3701 - tmp->vm_next = NULL;
3702 + tmp->vm_next = tmp->vm_prev = NULL;
3703 file = tmp->vm_file;
3704 if (file) {
3705 struct inode *inode = file->f_path.dentry->d_inode;
3706 @@ -392,6 +393,8 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
3707 */
3708 *pprev = tmp;
3709 pprev = &tmp->vm_next;
3710 + tmp->vm_prev = prev;
3711 + prev = tmp;
3712
3713 __vma_link_rb(mm, tmp, rb_link, rb_parent);
3714 rb_link = &tmp->vm_rb.rb_right;
3715 diff --git a/kernel/sched.c b/kernel/sched.c
3716 index 63b4a14..6d0dbeb 100644
3717 --- a/kernel/sched.c
3718 +++ b/kernel/sched.c
3719 @@ -3694,8 +3694,16 @@ int mutex_spin_on_owner(struct mutex *lock, struct thread_info *owner)
3720 /*
3721 * Owner changed, break to re-assess state.
3722 */
3723 - if (lock->owner != owner)
3724 + if (lock->owner != owner) {
3725 + /*
3726 + * If the lock has switched to a different owner,
3727 + * we likely have heavy contention. Return 0 to quit
3728 + * optimistic spinning and not contend further:
3729 + */
3730 + if (lock->owner)
3731 + return 0;
3732 break;
3733 + }
3734
3735 /*
3736 * Is that owner really running on that cpu?
3737 diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
3738 index caf8d4d..b87c22f 100644
3739 --- a/kernel/time/timekeeping.c
3740 +++ b/kernel/time/timekeeping.c
3741 @@ -736,6 +736,7 @@ static void timekeeping_adjust(s64 offset)
3742 static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
3743 {
3744 u64 nsecps = (u64)NSEC_PER_SEC << timekeeper.shift;
3745 + u64 raw_nsecs;
3746
3747 /* If the offset is smaller then a shifted interval, do nothing */
3748 if (offset < timekeeper.cycle_interval<<shift)
3749 @@ -752,12 +753,15 @@ static cycle_t logarithmic_accumulation(cycle_t offset, int shift)
3750 second_overflow();
3751 }
3752
3753 - /* Accumulate into raw time */
3754 - raw_time.tv_nsec += timekeeper.raw_interval << shift;;
3755 - while (raw_time.tv_nsec >= NSEC_PER_SEC) {
3756 - raw_time.tv_nsec -= NSEC_PER_SEC;
3757 - raw_time.tv_sec++;
3758 + /* Accumulate raw time */
3759 + raw_nsecs = timekeeper.raw_interval << shift;
3760 + raw_nsecs += raw_time.tv_nsec;
3761 + if (raw_nsecs >= NSEC_PER_SEC) {
3762 + u64 raw_secs = raw_nsecs;
3763 + raw_nsecs = do_div(raw_secs, NSEC_PER_SEC);
3764 + raw_time.tv_sec += raw_secs;
3765 }
3766 + raw_time.tv_nsec = raw_nsecs;
3767
3768 /* Accumulate error between NTP and clock interval */
3769 timekeeper.ntp_error += tick_length << shift;
3770 diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
3771 index 1da7b6e..5ec8f1d 100644
3772 --- a/kernel/trace/ring_buffer.c
3773 +++ b/kernel/trace/ring_buffer.c
3774 @@ -3868,6 +3868,9 @@ int ring_buffer_read_page(struct ring_buffer *buffer,
3775 rpos = reader->read;
3776 pos += size;
3777
3778 + if (rpos >= commit)
3779 + break;
3780 +
3781 event = rb_reader_event(cpu_buffer);
3782 size = rb_event_length(event);
3783 } while (len > size);
3784 diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c
3785 index 79f4bac..b4c179a 100644
3786 --- a/kernel/trace/trace_functions_graph.c
3787 +++ b/kernel/trace/trace_functions_graph.c
3788 @@ -507,7 +507,15 @@ get_return_for_leaf(struct trace_iterator *iter,
3789 * if the output fails.
3790 */
3791 data->ent = *curr;
3792 - data->ret = *next;
3793 + /*
3794 + * If the next event is not a return type, then
3795 + * we only care about what type it is. Otherwise we can
3796 + * safely copy the entire event.
3797 + */
3798 + if (next->ent.type == TRACE_GRAPH_RET)
3799 + data->ret = *next;
3800 + else
3801 + data->ret.ent.type = next->ent.type;
3802 }
3803 }
3804
3805 diff --git a/mm/memory.c b/mm/memory.c
3806 index 307bf77..53cf85d 100644
3807 --- a/mm/memory.c
3808 +++ b/mm/memory.c
3809 @@ -2770,11 +2770,18 @@ static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned lo
3810 {
3811 address &= PAGE_MASK;
3812 if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) {
3813 - address -= PAGE_SIZE;
3814 - if (find_vma(vma->vm_mm, address) != vma)
3815 - return -ENOMEM;
3816 + struct vm_area_struct *prev = vma->vm_prev;
3817 +
3818 + /*
3819 + * Is there a mapping abutting this one below?
3820 + *
3821 + * That's only ok if it's the same stack mapping
3822 + * that has gotten split..
3823 + */
3824 + if (prev && prev->vm_end == address)
3825 + return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM;
3826
3827 - expand_stack(vma, address);
3828 + expand_stack(vma, address - PAGE_SIZE);
3829 }
3830 return 0;
3831 }
3832 diff --git a/mm/mlock.c b/mm/mlock.c
3833 index 49e5e4c..cbae7c5 100644
3834 --- a/mm/mlock.c
3835 +++ b/mm/mlock.c
3836 @@ -135,6 +135,19 @@ void munlock_vma_page(struct page *page)
3837 }
3838 }
3839
3840 +/* Is the vma a continuation of the stack vma above it? */
3841 +static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr)
3842 +{
3843 + return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN);
3844 +}
3845 +
3846 +static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long addr)
3847 +{
3848 + return (vma->vm_flags & VM_GROWSDOWN) &&
3849 + (vma->vm_start == addr) &&
3850 + !vma_stack_continue(vma->vm_prev, addr);
3851 +}
3852 +
3853 /**
3854 * __mlock_vma_pages_range() - mlock a range of pages in the vma.
3855 * @vma: target vma
3856 @@ -168,11 +181,9 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma,
3857 gup_flags |= FOLL_WRITE;
3858
3859 /* We don't try to access the guard page of a stack vma */
3860 - if (vma->vm_flags & VM_GROWSDOWN) {
3861 - if (start == vma->vm_start) {
3862 - start += PAGE_SIZE;
3863 - nr_pages--;
3864 - }
3865 + if (stack_guard_page(vma, start)) {
3866 + addr += PAGE_SIZE;
3867 + nr_pages--;
3868 }
3869
3870 while (nr_pages > 0) {
3871 diff --git a/mm/mmap.c b/mm/mmap.c
3872 index 456ec6f..3867cfc 100644
3873 --- a/mm/mmap.c
3874 +++ b/mm/mmap.c
3875 @@ -388,17 +388,23 @@ static inline void
3876 __vma_link_list(struct mm_struct *mm, struct vm_area_struct *vma,
3877 struct vm_area_struct *prev, struct rb_node *rb_parent)
3878 {
3879 + struct vm_area_struct *next;
3880 +
3881 + vma->vm_prev = prev;
3882 if (prev) {
3883 - vma->vm_next = prev->vm_next;
3884 + next = prev->vm_next;
3885 prev->vm_next = vma;
3886 } else {
3887 mm->mmap = vma;
3888 if (rb_parent)
3889 - vma->vm_next = rb_entry(rb_parent,
3890 + next = rb_entry(rb_parent,
3891 struct vm_area_struct, vm_rb);
3892 else
3893 - vma->vm_next = NULL;
3894 + next = NULL;
3895 }
3896 + vma->vm_next = next;
3897 + if (next)
3898 + next->vm_prev = vma;
3899 }
3900
3901 void __vma_link_rb(struct mm_struct *mm, struct vm_area_struct *vma,
3902 @@ -485,7 +491,11 @@ static inline void
3903 __vma_unlink(struct mm_struct *mm, struct vm_area_struct *vma,
3904 struct vm_area_struct *prev)
3905 {
3906 - prev->vm_next = vma->vm_next;
3907 + struct vm_area_struct *next = vma->vm_next;
3908 +
3909 + prev->vm_next = next;
3910 + if (next)
3911 + next->vm_prev = prev;
3912 rb_erase(&vma->vm_rb, &mm->mm_rb);
3913 if (mm->mmap_cache == vma)
3914 mm->mmap_cache = prev;
3915 @@ -1900,6 +1910,7 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
3916 unsigned long addr;
3917
3918 insertion_point = (prev ? &prev->vm_next : &mm->mmap);
3919 + vma->vm_prev = NULL;
3920 do {
3921 rb_erase(&vma->vm_rb, &mm->mm_rb);
3922 mm->map_count--;
3923 @@ -1907,6 +1918,8 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
3924 vma = vma->vm_next;
3925 } while (vma && vma->vm_start < end);
3926 *insertion_point = vma;
3927 + if (vma)
3928 + vma->vm_prev = prev;
3929 tail_vma->vm_next = NULL;
3930 if (mm->unmap_area == arch_unmap_area)
3931 addr = prev ? prev->vm_end : mm->mmap_base;
3932 diff --git a/mm/nommu.c b/mm/nommu.c
3933 index b76f3ee..e48b38c 100644
3934 --- a/mm/nommu.c
3935 +++ b/mm/nommu.c
3936 @@ -609,7 +609,7 @@ static void protect_vma(struct vm_area_struct *vma, unsigned long flags)
3937 */
3938 static void add_vma_to_mm(struct mm_struct *mm, struct vm_area_struct *vma)
3939 {
3940 - struct vm_area_struct *pvma, **pp;
3941 + struct vm_area_struct *pvma, **pp, *next;
3942 struct address_space *mapping;
3943 struct rb_node **p, *parent;
3944
3945 @@ -669,8 +669,11 @@ static void add_vma_to_mm(struct mm_struct *mm, struct vm_area_struct *vma)
3946 break;
3947 }
3948
3949 - vma->vm_next = *pp;
3950 + next = *pp;
3951 *pp = vma;
3952 + vma->vm_next = next;
3953 + if (next)
3954 + next->vm_prev = vma;
3955 }
3956
3957 /*
3958 diff --git a/mm/slab.c b/mm/slab.c
3959 index e49f8f4..e4f747f 100644
3960 --- a/mm/slab.c
3961 +++ b/mm/slab.c
3962 @@ -2331,8 +2331,8 @@ kmem_cache_create (const char *name, size_t size, size_t align,
3963 }
3964 #if FORCED_DEBUG && defined(CONFIG_DEBUG_PAGEALLOC)
3965 if (size >= malloc_sizes[INDEX_L3 + 1].cs_size
3966 - && cachep->obj_size > cache_line_size() && size < PAGE_SIZE) {
3967 - cachep->obj_offset += PAGE_SIZE - size;
3968 + && cachep->obj_size > cache_line_size() && ALIGN(size, align) < PAGE_SIZE) {
3969 + cachep->obj_offset += PAGE_SIZE - ALIGN(size, align);
3970 size = PAGE_SIZE;
3971 }
3972 #endif
3973 diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
3974 index 753fc42..f49bcd9 100644
3975 --- a/net/bridge/br_device.c
3976 +++ b/net/bridge/br_device.c
3977 @@ -22,7 +22,7 @@
3978 #include <asm/uaccess.h>
3979 #include "br_private.h"
3980
3981 -/* net device transmit always called with no BH (preempt_disabled) */
3982 +/* net device transmit always called with BH disabled */
3983 netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
3984 {
3985 struct net_bridge *br = netdev_priv(dev);
3986 @@ -46,9 +46,12 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
3987 skb_reset_mac_header(skb);
3988 skb_pull(skb, ETH_HLEN);
3989
3990 + rcu_read_lock();
3991 if (is_multicast_ether_addr(dest)) {
3992 - if (br_multicast_rcv(br, NULL, skb))
3993 + if (br_multicast_rcv(br, NULL, skb)) {
3994 + kfree_skb(skb);
3995 goto out;
3996 + }
3997
3998 mdst = br_mdb_get(br, skb);
3999 if (mdst || BR_INPUT_SKB_CB_MROUTERS_ONLY(skb))
4000 @@ -61,6 +64,7 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
4001 br_flood_deliver(br, skb);
4002
4003 out:
4004 + rcu_read_unlock();
4005 return NETDEV_TX_OK;
4006 }
4007
4008 diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
4009 index b01dde3..7204ad3 100644
4010 --- a/net/bridge/br_fdb.c
4011 +++ b/net/bridge/br_fdb.c
4012 @@ -214,7 +214,7 @@ void br_fdb_delete_by_port(struct net_bridge *br,
4013 spin_unlock_bh(&br->hash_lock);
4014 }
4015
4016 -/* No locking or refcounting, assumes caller has no preempt (rcu_read_lock) */
4017 +/* No locking or refcounting, assumes caller has rcu_read_lock */
4018 struct net_bridge_fdb_entry *__br_fdb_get(struct net_bridge *br,
4019 const unsigned char *addr)
4020 {
4021 diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
4022 index d36e700..114365c 100644
4023 --- a/net/bridge/br_input.c
4024 +++ b/net/bridge/br_input.c
4025 @@ -37,7 +37,7 @@ static int br_pass_frame_up(struct sk_buff *skb)
4026 netif_receive_skb);
4027 }
4028
4029 -/* note: already called with rcu_read_lock (preempt_disabled) */
4030 +/* note: already called with rcu_read_lock */
4031 int br_handle_frame_finish(struct sk_buff *skb)
4032 {
4033 const unsigned char *dest = eth_hdr(skb)->h_dest;
4034 @@ -108,7 +108,7 @@ drop:
4035 goto out;
4036 }
4037
4038 -/* note: already called with rcu_read_lock (preempt_disabled) */
4039 +/* note: already called with rcu_read_lock */
4040 static int br_handle_local_finish(struct sk_buff *skb)
4041 {
4042 struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
4043 @@ -133,7 +133,7 @@ static inline int is_link_local(const unsigned char *dest)
4044 /*
4045 * Called via br_handle_frame_hook.
4046 * Return NULL if skb is handled
4047 - * note: already called with rcu_read_lock (preempt_disabled)
4048 + * note: already called with rcu_read_lock
4049 */
4050 struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
4051 {
4052 diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c
4053 index 217bd22..5854e82 100644
4054 --- a/net/bridge/br_stp_bpdu.c
4055 +++ b/net/bridge/br_stp_bpdu.c
4056 @@ -131,7 +131,7 @@ void br_send_tcn_bpdu(struct net_bridge_port *p)
4057 /*
4058 * Called from llc.
4059 *
4060 - * NO locks, but rcu_read_lock (preempt_disabled)
4061 + * NO locks, but rcu_read_lock
4062 */
4063 void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb,
4064 struct net_device *dev)
4065 diff --git a/net/can/bcm.c b/net/can/bcm.c
4066 index 9c65e9d..08ffe9e 100644
4067 --- a/net/can/bcm.c
4068 +++ b/net/can/bcm.c
4069 @@ -60,6 +60,13 @@
4070 #include <net/sock.h>
4071 #include <net/net_namespace.h>
4072
4073 +/*
4074 + * To send multiple CAN frame content within TX_SETUP or to filter
4075 + * CAN messages with multiplex index within RX_SETUP, the number of
4076 + * different filters is limited to 256 due to the one byte index value.
4077 + */
4078 +#define MAX_NFRAMES 256
4079 +
4080 /* use of last_frames[index].can_dlc */
4081 #define RX_RECV 0x40 /* received data for this element */
4082 #define RX_THR 0x80 /* element not been sent due to throttle feature */
4083 @@ -89,16 +96,16 @@ struct bcm_op {
4084 struct list_head list;
4085 int ifindex;
4086 canid_t can_id;
4087 - int flags;
4088 + u32 flags;
4089 unsigned long frames_abs, frames_filtered;
4090 struct timeval ival1, ival2;
4091 struct hrtimer timer, thrtimer;
4092 struct tasklet_struct tsklet, thrtsklet;
4093 ktime_t rx_stamp, kt_ival1, kt_ival2, kt_lastmsg;
4094 int rx_ifindex;
4095 - int count;
4096 - int nframes;
4097 - int currframe;
4098 + u32 count;
4099 + u32 nframes;
4100 + u32 currframe;
4101 struct can_frame *frames;
4102 struct can_frame *last_frames;
4103 struct can_frame sframe;
4104 @@ -175,7 +182,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
4105
4106 seq_printf(m, "rx_op: %03X %-5s ",
4107 op->can_id, bcm_proc_getifname(ifname, op->ifindex));
4108 - seq_printf(m, "[%d]%c ", op->nframes,
4109 + seq_printf(m, "[%u]%c ", op->nframes,
4110 (op->flags & RX_CHECK_DLC)?'d':' ');
4111 if (op->kt_ival1.tv64)
4112 seq_printf(m, "timeo=%lld ",
4113 @@ -198,7 +205,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
4114
4115 list_for_each_entry(op, &bo->tx_ops, list) {
4116
4117 - seq_printf(m, "tx_op: %03X %s [%d] ",
4118 + seq_printf(m, "tx_op: %03X %s [%u] ",
4119 op->can_id,
4120 bcm_proc_getifname(ifname, op->ifindex),
4121 op->nframes);
4122 @@ -283,7 +290,7 @@ static void bcm_send_to_user(struct bcm_op *op, struct bcm_msg_head *head,
4123 struct can_frame *firstframe;
4124 struct sockaddr_can *addr;
4125 struct sock *sk = op->sk;
4126 - int datalen = head->nframes * CFSIZ;
4127 + unsigned int datalen = head->nframes * CFSIZ;
4128 int err;
4129
4130 skb = alloc_skb(sizeof(*head) + datalen, gfp_any());
4131 @@ -468,7 +475,7 @@ rx_changed_settime:
4132 * bcm_rx_cmp_to_index - (bit)compares the currently received data to formerly
4133 * received data stored in op->last_frames[]
4134 */
4135 -static void bcm_rx_cmp_to_index(struct bcm_op *op, int index,
4136 +static void bcm_rx_cmp_to_index(struct bcm_op *op, unsigned int index,
4137 const struct can_frame *rxdata)
4138 {
4139 /*
4140 @@ -554,7 +561,8 @@ static enum hrtimer_restart bcm_rx_timeout_handler(struct hrtimer *hrtimer)
4141 /*
4142 * bcm_rx_do_flush - helper for bcm_rx_thr_flush
4143 */
4144 -static inline int bcm_rx_do_flush(struct bcm_op *op, int update, int index)
4145 +static inline int bcm_rx_do_flush(struct bcm_op *op, int update,
4146 + unsigned int index)
4147 {
4148 if ((op->last_frames) && (op->last_frames[index].can_dlc & RX_THR)) {
4149 if (update)
4150 @@ -575,7 +583,7 @@ static int bcm_rx_thr_flush(struct bcm_op *op, int update)
4151 int updated = 0;
4152
4153 if (op->nframes > 1) {
4154 - int i;
4155 + unsigned int i;
4156
4157 /* for MUX filter we start at index 1 */
4158 for (i = 1; i < op->nframes; i++)
4159 @@ -624,7 +632,7 @@ static void bcm_rx_handler(struct sk_buff *skb, void *data)
4160 {
4161 struct bcm_op *op = (struct bcm_op *)data;
4162 const struct can_frame *rxframe = (struct can_frame *)skb->data;
4163 - int i;
4164 + unsigned int i;
4165
4166 /* disable timeout */
4167 hrtimer_cancel(&op->timer);
4168 @@ -822,14 +830,15 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
4169 {
4170 struct bcm_sock *bo = bcm_sk(sk);
4171 struct bcm_op *op;
4172 - int i, err;
4173 + unsigned int i;
4174 + int err;
4175
4176 /* we need a real device to send frames */
4177 if (!ifindex)
4178 return -ENODEV;
4179
4180 - /* we need at least one can_frame */
4181 - if (msg_head->nframes < 1)
4182 + /* check nframes boundaries - we need at least one can_frame */
4183 + if (msg_head->nframes < 1 || msg_head->nframes > MAX_NFRAMES)
4184 return -EINVAL;
4185
4186 /* check the given can_id */
4187 @@ -993,6 +1002,10 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
4188 msg_head->nframes = 0;
4189 }
4190
4191 + /* the first element contains the mux-mask => MAX_NFRAMES + 1 */
4192 + if (msg_head->nframes > MAX_NFRAMES + 1)
4193 + return -EINVAL;
4194 +
4195 if ((msg_head->flags & RX_RTR_FRAME) &&
4196 ((msg_head->nframes != 1) ||
4197 (!(msg_head->can_id & CAN_RTR_FLAG))))
4198 diff --git a/net/can/raw.c b/net/can/raw.c
4199 index da99cf1..1650599 100644
4200 --- a/net/can/raw.c
4201 +++ b/net/can/raw.c
4202 @@ -655,6 +655,10 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock,
4203 err = sock_tx_timestamp(msg, sk, skb_tx(skb));
4204 if (err < 0)
4205 goto free_skb;
4206 +
4207 + /* to be able to check the received tx sock reference in raw_rcv() */
4208 + skb_tx(skb)->prevent_sk_orphan = 1;
4209 +
4210 skb->dev = dev;
4211 skb->sk = sk;
4212
4213 diff --git a/net/core/dev.c b/net/core/dev.c
4214 index 1f466e8..95cc486 100644
4215 --- a/net/core/dev.c
4216 +++ b/net/core/dev.c
4217 @@ -2504,6 +2504,7 @@ int netif_rx(struct sk_buff *skb)
4218 struct rps_dev_flow voidflow, *rflow = &voidflow;
4219 int cpu;
4220
4221 + preempt_disable();
4222 rcu_read_lock();
4223
4224 cpu = get_rps_cpu(skb->dev, skb, &rflow);
4225 @@ -2513,6 +2514,7 @@ int netif_rx(struct sk_buff *skb)
4226 ret = enqueue_to_backlog(skb, cpu, &rflow->last_qtail);
4227
4228 rcu_read_unlock();
4229 + preempt_enable();
4230 }
4231 #else
4232 {
4233 @@ -3064,7 +3066,7 @@ enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
4234 int mac_len;
4235 enum gro_result ret;
4236
4237 - if (!(skb->dev->features & NETIF_F_GRO))
4238 + if (!(skb->dev->features & NETIF_F_GRO) || netpoll_rx_on(skb))
4239 goto normal;
4240
4241 if (skb_is_gso(skb) || skb_has_frags(skb))
4242 @@ -3133,7 +3135,7 @@ pull:
4243 put_page(skb_shinfo(skb)->frags[0].page);
4244 memmove(skb_shinfo(skb)->frags,
4245 skb_shinfo(skb)->frags + 1,
4246 - --skb_shinfo(skb)->nr_frags);
4247 + --skb_shinfo(skb)->nr_frags * sizeof(skb_frag_t));
4248 }
4249 }
4250
4251 @@ -3151,9 +3153,6 @@ __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
4252 {
4253 struct sk_buff *p;
4254
4255 - if (netpoll_rx_on(skb))
4256 - return GRO_NORMAL;
4257 -
4258 for (p = napi->gro_list; p; p = p->next) {
4259 NAPI_GRO_CB(p)->same_flow =
4260 (p->dev == skb->dev) &&
4261 diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
4262 index 65afeae..c259714 100644
4263 --- a/net/ipv4/tcp.c
4264 +++ b/net/ipv4/tcp.c
4265 @@ -2176,6 +2176,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
4266 GFP_KERNEL);
4267 if (cvp == NULL)
4268 return -ENOMEM;
4269 +
4270 + kref_init(&cvp->kref);
4271 }
4272 lock_sock(sk);
4273 tp->rx_opt.cookie_in_always =
4274 @@ -2190,12 +2192,11 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
4275 */
4276 kref_put(&tp->cookie_values->kref,
4277 tcp_cookie_values_release);
4278 - kref_init(&cvp->kref);
4279 - tp->cookie_values = cvp;
4280 } else {
4281 cvp = tp->cookie_values;
4282 }
4283 }
4284 +
4285 if (cvp != NULL) {
4286 cvp->cookie_desired = ctd.tcpct_cookie_desired;
4287
4288 @@ -2209,6 +2210,8 @@ static int do_tcp_setsockopt(struct sock *sk, int level,
4289 cvp->s_data_desired = ctd.tcpct_s_data_desired;
4290 cvp->s_data_constant = 0; /* false */
4291 }
4292 +
4293 + tp->cookie_values = cvp;
4294 }
4295 release_sock(sk);
4296 return err;
4297 diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
4298 index a2eb965..54d7308 100644
4299 --- a/net/netlink/af_netlink.c
4300 +++ b/net/netlink/af_netlink.c
4301 @@ -1400,7 +1400,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
4302 struct netlink_sock *nlk = nlk_sk(sk);
4303 int noblock = flags&MSG_DONTWAIT;
4304 size_t copied;
4305 - struct sk_buff *skb, *frag __maybe_unused = NULL;
4306 + struct sk_buff *skb, *data_skb;
4307 int err;
4308
4309 if (flags&MSG_OOB)
4310 @@ -1412,45 +1412,35 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
4311 if (skb == NULL)
4312 goto out;
4313
4314 + data_skb = skb;
4315 +
4316 #ifdef CONFIG_COMPAT_NETLINK_MESSAGES
4317 if (unlikely(skb_shinfo(skb)->frag_list)) {
4318 - bool need_compat = !!(flags & MSG_CMSG_COMPAT);
4319 -
4320 /*
4321 - * If this skb has a frag_list, then here that means that
4322 - * we will have to use the frag_list skb for compat tasks
4323 - * and the regular skb for non-compat tasks.
4324 + * If this skb has a frag_list, then here that means that we
4325 + * will have to use the frag_list skb's data for compat tasks
4326 + * and the regular skb's data for normal (non-compat) tasks.
4327 *
4328 - * The skb might (and likely will) be cloned, so we can't
4329 - * just reset frag_list and go on with things -- we need to
4330 - * keep that. For the compat case that's easy -- simply get
4331 - * a reference to the compat skb and free the regular one
4332 - * including the frag. For the non-compat case, we need to
4333 - * avoid sending the frag to the user -- so assign NULL but
4334 - * restore it below before freeing the skb.
4335 + * If we need to send the compat skb, assign it to the
4336 + * 'data_skb' variable so that it will be used below for data
4337 + * copying. We keep 'skb' for everything else, including
4338 + * freeing both later.
4339 */
4340 - if (need_compat) {
4341 - struct sk_buff *compskb = skb_shinfo(skb)->frag_list;
4342 - skb_get(compskb);
4343 - kfree_skb(skb);
4344 - skb = compskb;
4345 - } else {
4346 - frag = skb_shinfo(skb)->frag_list;
4347 - skb_shinfo(skb)->frag_list = NULL;
4348 - }
4349 + if (flags & MSG_CMSG_COMPAT)
4350 + data_skb = skb_shinfo(skb)->frag_list;
4351 }
4352 #endif
4353
4354 msg->msg_namelen = 0;
4355
4356 - copied = skb->len;
4357 + copied = data_skb->len;
4358 if (len < copied) {
4359 msg->msg_flags |= MSG_TRUNC;
4360 copied = len;
4361 }
4362
4363 - skb_reset_transport_header(skb);
4364 - err = skb_copy_datagram_iovec(skb, 0, msg->msg_iov, copied);
4365 + skb_reset_transport_header(data_skb);
4366 + err = skb_copy_datagram_iovec(data_skb, 0, msg->msg_iov, copied);
4367
4368 if (msg->msg_name) {
4369 struct sockaddr_nl *addr = (struct sockaddr_nl *)msg->msg_name;
4370 @@ -1470,11 +1460,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
4371 }
4372 siocb->scm->creds = *NETLINK_CREDS(skb);
4373 if (flags & MSG_TRUNC)
4374 - copied = skb->len;
4375 -
4376 -#ifdef CONFIG_COMPAT_NETLINK_MESSAGES
4377 - skb_shinfo(skb)->frag_list = frag;
4378 -#endif
4379 + copied = data_skb->len;
4380
4381 skb_free_datagram(sk, skb);
4382
4383 diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c
4384 index 724553e..abbf4fa 100644
4385 --- a/net/sched/act_nat.c
4386 +++ b/net/sched/act_nat.c
4387 @@ -218,6 +218,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a,
4388 if (!pskb_may_pull(skb, ihl + sizeof(*icmph) + sizeof(*iph)))
4389 goto drop;
4390
4391 + icmph = (void *)(skb_network_header(skb) + ihl);
4392 iph = (void *)(icmph + 1);
4393 if (egress)
4394 addr = iph->daddr;
4395 @@ -246,7 +247,7 @@ static int tcf_nat(struct sk_buff *skb, struct tc_action *a,
4396 iph->saddr = new_addr;
4397
4398 inet_proto_csum_replace4(&icmph->checksum, skb, addr, new_addr,
4399 - 1);
4400 + 0);
4401 break;
4402 }
4403 default:
4404 diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
4405 index c657628..a9be0ef 100644
4406 --- a/net/sched/sch_sfq.c
4407 +++ b/net/sched/sch_sfq.c
4408 @@ -497,11 +497,22 @@ nla_put_failure:
4409 return -1;
4410 }
4411
4412 +static struct Qdisc *sfq_leaf(struct Qdisc *sch, unsigned long arg)
4413 +{
4414 + return NULL;
4415 +}
4416 +
4417 static unsigned long sfq_get(struct Qdisc *sch, u32 classid)
4418 {
4419 return 0;
4420 }
4421
4422 +static unsigned long sfq_bind(struct Qdisc *sch, unsigned long parent,
4423 + u32 classid)
4424 +{
4425 + return 0;
4426 +}
4427 +
4428 static struct tcf_proto **sfq_find_tcf(struct Qdisc *sch, unsigned long cl)
4429 {
4430 struct sfq_sched_data *q = qdisc_priv(sch);
4431 @@ -554,8 +565,10 @@ static void sfq_walk(struct Qdisc *sch, struct qdisc_walker *arg)
4432 }
4433
4434 static const struct Qdisc_class_ops sfq_class_ops = {
4435 + .leaf = sfq_leaf,
4436 .get = sfq_get,
4437 .tcf_chain = sfq_find_tcf,
4438 + .bind_tcf = sfq_bind,
4439 .dump = sfq_dump_class,
4440 .dump_stats = sfq_dump_class_stats,
4441 .walk = sfq_walk,
4442 diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c
4443 index ef17fcf..e4be688 100644
4444 --- a/net/wireless/mlme.c
4445 +++ b/net/wireless/mlme.c
4446 @@ -842,12 +842,18 @@ int cfg80211_mlme_action(struct cfg80211_registered_device *rdev,
4447 return -EINVAL;
4448 if (mgmt->u.action.category != WLAN_CATEGORY_PUBLIC) {
4449 /* Verify that we are associated with the destination AP */
4450 + wdev_lock(wdev);
4451 +
4452 if (!wdev->current_bss ||
4453 memcmp(wdev->current_bss->pub.bssid, mgmt->bssid,
4454 ETH_ALEN) != 0 ||
4455 memcmp(wdev->current_bss->pub.bssid, mgmt->da,
4456 - ETH_ALEN) != 0)
4457 + ETH_ALEN) != 0) {
4458 + wdev_unlock(wdev);
4459 return -ENOTCONN;
4460 + }
4461 + wdev_unlock(wdev);
4462 +
4463 }
4464
4465 if (memcmp(mgmt->sa, dev->dev_addr, ETH_ALEN) != 0)
4466 diff --git a/scripts/mkmakefile b/scripts/mkmakefile
4467 index 67d59c7..5325423 100644
4468 --- a/scripts/mkmakefile
4469 +++ b/scripts/mkmakefile
4470 @@ -44,7 +44,9 @@ all:
4471
4472 Makefile:;
4473
4474 -\$(all) %/: all
4475 +\$(all): all
4476 @:
4477
4478 +%/: all
4479 + @:
4480 EOF
4481 diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
4482 index 303ac04..1990918 100644
4483 --- a/sound/core/pcm_native.c
4484 +++ b/sound/core/pcm_native.c
4485 @@ -981,6 +981,10 @@ static int snd_pcm_do_pause(struct snd_pcm_substream *substream, int push)
4486 {
4487 if (substream->runtime->trigger_master != substream)
4488 return 0;
4489 + /* some drivers might use hw_ptr to recover from the pause -
4490 + update the hw_ptr now */
4491 + if (push)
4492 + snd_pcm_update_hw_ptr(substream);
4493 /* The jiffies check in snd_pcm_update_hw_ptr*() is done by
4494 * a delta betwen the current jiffies, this gives a large enough
4495 * delta, effectively to skip the check once.
4496 diff --git a/sound/pci/emu10k1/emu10k1.c b/sound/pci/emu10k1/emu10k1.c
4497 index 4203782..aff8387 100644
4498 --- a/sound/pci/emu10k1/emu10k1.c
4499 +++ b/sound/pci/emu10k1/emu10k1.c
4500 @@ -52,6 +52,7 @@ static int max_synth_voices[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 64};
4501 static int max_buffer_size[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 128};
4502 static int enable_ir[SNDRV_CARDS];
4503 static uint subsystem[SNDRV_CARDS]; /* Force card subsystem model */
4504 +static uint delay_pcm_irq[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
4505
4506 module_param_array(index, int, NULL, 0444);
4507 MODULE_PARM_DESC(index, "Index value for the EMU10K1 soundcard.");
4508 @@ -73,6 +74,8 @@ module_param_array(enable_ir, bool, NULL, 0444);
4509 MODULE_PARM_DESC(enable_ir, "Enable IR.");
4510 module_param_array(subsystem, uint, NULL, 0444);
4511 MODULE_PARM_DESC(subsystem, "Force card subsystem model.");
4512 +module_param_array(delay_pcm_irq, uint, NULL, 0444);
4513 +MODULE_PARM_DESC(delay_pcm_irq, "Delay PCM interrupt by specified number of samples (default 0).");
4514 /*
4515 * Class 0401: 1102:0008 (rev 00) Subsystem: 1102:1001 -> Audigy2 Value Model:SB0400
4516 */
4517 @@ -127,6 +130,7 @@ static int __devinit snd_card_emu10k1_probe(struct pci_dev *pci,
4518 &emu)) < 0)
4519 goto error;
4520 card->private_data = emu;
4521 + emu->delay_pcm_irq = delay_pcm_irq[dev] & 0x1f;
4522 if ((err = snd_emu10k1_pcm(emu, 0, NULL)) < 0)
4523 goto error;
4524 if ((err = snd_emu10k1_pcm_mic(emu, 1, NULL)) < 0)
4525 diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
4526 index 55b83ef..622bace 100644
4527 --- a/sound/pci/emu10k1/emupcm.c
4528 +++ b/sound/pci/emu10k1/emupcm.c
4529 @@ -332,7 +332,7 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
4530 evoice->epcm->ccca_start_addr = start_addr + ccis;
4531 if (extra) {
4532 start_addr += ccis;
4533 - end_addr += ccis;
4534 + end_addr += ccis + emu->delay_pcm_irq;
4535 }
4536 if (stereo && !extra) {
4537 snd_emu10k1_ptr_write(emu, CPF, voice, CPF_STEREO_MASK);
4538 @@ -360,7 +360,9 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
4539 /* Assumption that PT is already 0 so no harm overwriting */
4540 snd_emu10k1_ptr_write(emu, PTRX, voice, (send_amount[0] << 8) | send_amount[1]);
4541 snd_emu10k1_ptr_write(emu, DSL, voice, end_addr | (send_amount[3] << 24));
4542 - snd_emu10k1_ptr_write(emu, PSST, voice, start_addr | (send_amount[2] << 24));
4543 + snd_emu10k1_ptr_write(emu, PSST, voice,
4544 + (start_addr + (extra ? emu->delay_pcm_irq : 0)) |
4545 + (send_amount[2] << 24));
4546 if (emu->card_capabilities->emu_model)
4547 pitch_target = PITCH_48000; /* Disable interpolators on emu1010 card */
4548 else
4549 @@ -732,6 +734,23 @@ static void snd_emu10k1_playback_stop_voice(struct snd_emu10k1 *emu, struct snd_
4550 snd_emu10k1_ptr_write(emu, IP, voice, 0);
4551 }
4552
4553 +static inline void snd_emu10k1_playback_mangle_extra(struct snd_emu10k1 *emu,
4554 + struct snd_emu10k1_pcm *epcm,
4555 + struct snd_pcm_substream *substream,
4556 + struct snd_pcm_runtime *runtime)
4557 +{
4558 + unsigned int ptr, period_pos;
4559 +
4560 + /* try to sychronize the current position for the interrupt
4561 + source voice */
4562 + period_pos = runtime->status->hw_ptr - runtime->hw_ptr_interrupt;
4563 + period_pos %= runtime->period_size;
4564 + ptr = snd_emu10k1_ptr_read(emu, CCCA, epcm->extra->number);
4565 + ptr &= ~0x00ffffff;
4566 + ptr |= epcm->ccca_start_addr + period_pos;
4567 + snd_emu10k1_ptr_write(emu, CCCA, epcm->extra->number, ptr);
4568 +}
4569 +
4570 static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
4571 int cmd)
4572 {
4573 @@ -753,6 +772,8 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
4574 /* follow thru */
4575 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
4576 case SNDRV_PCM_TRIGGER_RESUME:
4577 + if (cmd == SNDRV_PCM_TRIGGER_PAUSE_RELEASE)
4578 + snd_emu10k1_playback_mangle_extra(emu, epcm, substream, runtime);
4579 mix = &emu->pcm_mixer[substream->number];
4580 snd_emu10k1_playback_prepare_voice(emu, epcm->voices[0], 1, 0, mix);
4581 snd_emu10k1_playback_prepare_voice(emu, epcm->voices[1], 0, 0, mix);
4582 @@ -869,8 +890,9 @@ static snd_pcm_uframes_t snd_emu10k1_playback_pointer(struct snd_pcm_substream *
4583 #endif
4584 /*
4585 printk(KERN_DEBUG
4586 - "ptr = 0x%x, buffer_size = 0x%x, period_size = 0x%x\n",
4587 - ptr, runtime->buffer_size, runtime->period_size);
4588 + "ptr = 0x%lx, buffer_size = 0x%lx, period_size = 0x%lx\n",
4589 + (long)ptr, (long)runtime->buffer_size,
4590 + (long)runtime->period_size);
4591 */
4592 return ptr;
4593 }
4594 diff --git a/sound/pci/emu10k1/memory.c b/sound/pci/emu10k1/memory.c
4595 index ffb1ddb..957a311 100644
4596 --- a/sound/pci/emu10k1/memory.c
4597 +++ b/sound/pci/emu10k1/memory.c
4598 @@ -310,8 +310,10 @@ snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *subst
4599 if (snd_BUG_ON(!hdr))
4600 return NULL;
4601
4602 + idx = runtime->period_size >= runtime->buffer_size ?
4603 + (emu->delay_pcm_irq * 2) : 0;
4604 mutex_lock(&hdr->block_mutex);
4605 - blk = search_empty(emu, runtime->dma_bytes);
4606 + blk = search_empty(emu, runtime->dma_bytes + idx);
4607 if (blk == NULL) {
4608 mutex_unlock(&hdr->block_mutex);
4609 return NULL;
4610 diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
4611 index 2bf2cb5..baadda4 100644
4612 --- a/sound/pci/hda/patch_conexant.c
4613 +++ b/sound/pci/hda/patch_conexant.c
4614 @@ -2970,6 +2970,7 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
4615 SND_PCI_QUIRK(0x1028, 0x02f5, "Dell",
4616 CXT5066_DELL_LAPTOP),
4617 SND_PCI_QUIRK(0x152d, 0x0833, "OLPC XO-1.5", CXT5066_OLPC_XO_1_5),
4618 + SND_PCI_QUIRK(0x1028, 0x02d8, "Dell Vostro", CXT5066_DELL_VOSTO),
4619 SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTO),
4620 SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
4621 SND_PCI_QUIRK(0x1179, 0xff50, "Toshiba Satellite P500-PSPGSC-01800T", CXT5066_OLPC_XO_1_5),
4622 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
4623 index aa7cc51..6d9a542 100644
4624 --- a/sound/pci/hda/patch_realtek.c
4625 +++ b/sound/pci/hda/patch_realtek.c
4626 @@ -6864,6 +6864,7 @@ static int patch_alc260(struct hda_codec *codec)
4627
4628 spec->stream_analog_playback = &alc260_pcm_analog_playback;
4629 spec->stream_analog_capture = &alc260_pcm_analog_capture;
4630 + spec->stream_analog_alt_capture = &alc260_pcm_analog_capture;
4631
4632 spec->stream_digital_playback = &alc260_pcm_digital_playback;
4633 spec->stream_digital_capture = &alc260_pcm_digital_capture;
4634 diff --git a/sound/pci/intel8x0.c b/sound/pci/intel8x0.c
4635 index 6433e65..4677492 100644
4636 --- a/sound/pci/intel8x0.c
4637 +++ b/sound/pci/intel8x0.c
4638 @@ -1776,6 +1776,12 @@ static struct ac97_quirk ac97_quirks[] __devinitdata = {
4639 },
4640 {
4641 .subvendor = 0x1014,
4642 + .subdevice = 0x0534,
4643 + .name = "ThinkPad X31",
4644 + .type = AC97_TUNE_INV_EAPD
4645 + },
4646 + {
4647 + .subvendor = 0x1014,
4648 .subdevice = 0x1f00,
4649 .name = "MS-9128",
4650 .type = AC97_TUNE_ALC_JACK
4651 diff --git a/sound/pci/riptide/riptide.c b/sound/pci/riptide/riptide.c
4652 index ad44626..c737287 100644
4653 --- a/sound/pci/riptide/riptide.c
4654 +++ b/sound/pci/riptide/riptide.c
4655 @@ -1224,15 +1224,14 @@ static int try_to_load_firmware(struct cmdif *cif, struct snd_riptide *chip)
4656 firmware.firmware.ASIC, firmware.firmware.CODEC,
4657 firmware.firmware.AUXDSP, firmware.firmware.PROG);
4658
4659 + if (!chip)
4660 + return 1;
4661 +
4662 for (i = 0; i < FIRMWARE_VERSIONS; i++) {
4663 if (!memcmp(&firmware_versions[i], &firmware, sizeof(firmware)))
4664 - break;
4665 - }
4666 - if (i >= FIRMWARE_VERSIONS)
4667 - return 0; /* no match */
4668 + return 1; /* OK */
4669
4670 - if (!chip)
4671 - return 1; /* OK */
4672 + }
4673
4674 snd_printdd("Writing Firmware\n");
4675 if (!chip->fw_entry) {
4676 diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c
4677 index c3571ee..72deeab 100644
4678 --- a/sound/soc/codecs/wm8580.c
4679 +++ b/sound/soc/codecs/wm8580.c
4680 @@ -269,9 +269,9 @@ SOC_DOUBLE("DAC2 Invert Switch", WM8580_DAC_CONTROL4, 2, 3, 1, 0),
4681 SOC_DOUBLE("DAC3 Invert Switch", WM8580_DAC_CONTROL4, 4, 5, 1, 0),
4682
4683 SOC_SINGLE("DAC ZC Switch", WM8580_DAC_CONTROL5, 5, 1, 0),
4684 -SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 0),
4685 -SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 0),
4686 -SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 0),
4687 +SOC_SINGLE("DAC1 Switch", WM8580_DAC_CONTROL5, 0, 1, 1),
4688 +SOC_SINGLE("DAC2 Switch", WM8580_DAC_CONTROL5, 1, 1, 1),
4689 +SOC_SINGLE("DAC3 Switch", WM8580_DAC_CONTROL5, 2, 1, 1),
4690
4691 SOC_DOUBLE("ADC Mute Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 0),
4692 SOC_SINGLE("ADC High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
4693 diff --git a/sound/soc/codecs/wm8776.c b/sound/soc/codecs/wm8776.c
4694 index 4e212ed..f8154e6 100644
4695 --- a/sound/soc/codecs/wm8776.c
4696 +++ b/sound/soc/codecs/wm8776.c
4697 @@ -178,13 +178,6 @@ static int wm8776_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
4698 case SND_SOC_DAIFMT_LEFT_J:
4699 iface |= 0x0001;
4700 break;
4701 - /* FIXME: CHECK A/B */
4702 - case SND_SOC_DAIFMT_DSP_A:
4703 - iface |= 0x0003;
4704 - break;
4705 - case SND_SOC_DAIFMT_DSP_B:
4706 - iface |= 0x0007;
4707 - break;
4708 default:
4709 return -EINVAL;
4710 }
4711 diff --git a/sound/soc/soc-cache.c b/sound/soc/soc-cache.c
4712 index 472af38..adbc68c 100644
4713 --- a/sound/soc/soc-cache.c
4714 +++ b/sound/soc/soc-cache.c
4715 @@ -340,7 +340,7 @@ static unsigned int snd_soc_16_8_read_i2c(struct snd_soc_codec *codec,
4716 static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
4717 unsigned int reg)
4718 {
4719 - u16 *cache = codec->reg_cache;
4720 + u8 *cache = codec->reg_cache;
4721
4722 reg &= 0xff;
4723 if (reg >= codec->reg_cache_size)
4724 @@ -351,7 +351,7 @@ static unsigned int snd_soc_16_8_read(struct snd_soc_codec *codec,
4725 static int snd_soc_16_8_write(struct snd_soc_codec *codec, unsigned int reg,
4726 unsigned int value)
4727 {
4728 - u16 *cache = codec->reg_cache;
4729 + u8 *cache = codec->reg_cache;
4730 u8 data[3];
4731 int ret;
4732