Magellan Linux

Contents of /trunk/kernel26-alx/patches-2.6.23-r1/0114-2.6.23.15-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 659 - (show annotations) (download)
Mon Jun 23 21:49:40 2008 UTC (15 years, 11 months ago) by niro
File size: 262663 byte(s)
-fixed patch, cvs headers get interprated

1 diff --git a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c
2 index f02a8ac..14dc111 100644
3 --- a/arch/i386/kernel/apm.c
4 +++ b/arch/i386/kernel/apm.c
5 @@ -2256,14 +2256,12 @@ static int __init apm_init(void)
6 apm_info.disabled = 1;
7 return -ENODEV;
8 }
9 - if (PM_IS_ACTIVE()) {
10 + if (pm_flags & PM_ACPI) {
11 printk(KERN_NOTICE "apm: overridden by ACPI.\n");
12 apm_info.disabled = 1;
13 return -ENODEV;
14 }
15 -#ifdef CONFIG_PM_LEGACY
16 - pm_active = 1;
17 -#endif
18 + pm_flags |= PM_APM;
19
20 /*
21 * Set up a segment that references the real mode segment 0x40
22 @@ -2366,9 +2364,7 @@ static void __exit apm_exit(void)
23 kthread_stop(kapmd_task);
24 kapmd_task = NULL;
25 }
26 -#ifdef CONFIG_PM_LEGACY
27 - pm_active = 0;
28 -#endif
29 + pm_flags &= ~PM_APM;
30 }
31
32 module_init(apm_init);
33 diff --git a/arch/ia64/kernel/unaligned.c b/arch/ia64/kernel/unaligned.c
34 index fe6aa5a..ecf401b 100644
35 --- a/arch/ia64/kernel/unaligned.c
36 +++ b/arch/ia64/kernel/unaligned.c
37 @@ -1487,16 +1487,19 @@ ia64_handle_unaligned (unsigned long ifa, struct pt_regs *regs)
38 case LDFA_OP:
39 case LDFCCLR_OP:
40 case LDFCNC_OP:
41 - case LDF_IMM_OP:
42 - case LDFA_IMM_OP:
43 - case LDFCCLR_IMM_OP:
44 - case LDFCNC_IMM_OP:
45 if (u.insn.x)
46 ret = emulate_load_floatpair(ifa, u.insn, regs);
47 else
48 ret = emulate_load_float(ifa, u.insn, regs);
49 break;
50
51 + case LDF_IMM_OP:
52 + case LDFA_IMM_OP:
53 + case LDFCCLR_IMM_OP:
54 + case LDFCNC_IMM_OP:
55 + ret = emulate_load_float(ifa, u.insn, regs);
56 + break;
57 +
58 case STF_OP:
59 case STF_IMM_OP:
60 ret = emulate_store_float(ifa, u.insn, regs);
61 diff --git a/arch/sparc64/kernel/chmc.c b/arch/sparc64/kernel/chmc.c
62 index 777d345..6d4f02e 100644
63 --- a/arch/sparc64/kernel/chmc.c
64 +++ b/arch/sparc64/kernel/chmc.c
65 @@ -16,6 +15,7 @@
66 #include <linux/init.h>
67 #include <asm/spitfire.h>
68 #include <asm/chmctrl.h>
69 +#include <asm/cpudata.h>
70 #include <asm/oplib.h>
71 #include <asm/prom.h>
72 #include <asm/io.h>
73 @@ -242,8 +242,11 @@ int chmc_getunumber(int syndrome_code,
74 */
75 static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
76 {
77 - unsigned long ret;
78 - int this_cpu = get_cpu();
79 + unsigned long ret, this_cpu;
80 +
81 + preempt_disable();
82 +
83 + this_cpu = real_hard_smp_processor_id();
84
85 if (mp->portid == this_cpu) {
86 __asm__ __volatile__("ldxa [%1] %2, %0"
87 @@ -255,7 +258,8 @@ static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
88 : "r" (mp->regs + offset),
89 "i" (ASI_PHYS_BYPASS_EC_E));
90 }
91 - put_cpu();
92 +
93 + preempt_enable();
94
95 return ret;
96 }
97 diff --git a/arch/sparc64/kernel/entry.S b/arch/sparc64/kernel/entry.S
98 index 8059531..193791c 100644
99 --- a/arch/sparc64/kernel/entry.S
100 +++ b/arch/sparc64/kernel/entry.S
101 @@ -2593,3 +2593,15 @@ sun4v_mmustat_info:
102 retl
103 nop
104 .size sun4v_mmustat_info, .-sun4v_mmustat_info
105 +
106 + .globl sun4v_mmu_demap_all
107 + .type sun4v_mmu_demap_all,#function
108 +sun4v_mmu_demap_all:
109 + clr %o0
110 + clr %o1
111 + mov HV_MMU_ALL, %o2
112 + mov HV_FAST_MMU_DEMAP_ALL, %o5
113 + ta HV_FAST_TRAP
114 + retl
115 + nop
116 + .size sun4v_mmu_demap_all, .-sun4v_mmu_demap_all
117 diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
118 index e8dac81..9bc05cf 100644
119 --- a/arch/sparc64/kernel/pci.c
120 +++ b/arch/sparc64/kernel/pci.c
121 @@ -1276,4 +1276,20 @@ int pci_dma_supported(struct pci_dev *pdev, u64 device_mask)
122 return (device_mask & dma_addr_mask) == dma_addr_mask;
123 }
124
125 +void pci_resource_to_user(const struct pci_dev *pdev, int bar,
126 + const struct resource *rp, resource_size_t *start,
127 + resource_size_t *end)
128 +{
129 + struct pci_pbm_info *pbm = pdev->dev.archdata.host_controller;
130 + unsigned long offset;
131 +
132 + if (rp->flags & IORESOURCE_IO)
133 + offset = pbm->io_space.start;
134 + else
135 + offset = pbm->mem_space.start;
136 +
137 + *start = rp->start - offset;
138 + *end = rp->end - offset;
139 +}
140 +
141 #endif /* !(CONFIG_PCI) */
142 diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
143 index c73b7a4..34e8a01 100644
144 --- a/arch/sparc64/kernel/smp.c
145 +++ b/arch/sparc64/kernel/smp.c
146 @@ -476,7 +476,7 @@ static __inline__ void spitfire_xcall_deliver(u64 data0, u64 data1, u64 data2, c
147 */
148 static void cheetah_xcall_deliver(u64 data0, u64 data1, u64 data2, cpumask_t mask)
149 {
150 - u64 pstate, ver;
151 + u64 pstate, ver, busy_mask;
152 int nack_busy_id, is_jbus, need_more;
153
154 if (cpus_empty(mask))
155 @@ -508,14 +508,20 @@ retry:
156 "i" (ASI_INTR_W));
157
158 nack_busy_id = 0;
159 + busy_mask = 0;
160 {
161 int i;
162
163 for_each_cpu_mask(i, mask) {
164 u64 target = (i << 14) | 0x70;
165
166 - if (!is_jbus)
167 + if (is_jbus) {
168 + busy_mask |= (0x1UL << (i * 2));
169 + } else {
170 target |= (nack_busy_id << 24);
171 + busy_mask |= (0x1UL <<
172 + (nack_busy_id * 2));
173 + }
174 __asm__ __volatile__(
175 "stxa %%g0, [%0] %1\n\t"
176 "membar #Sync\n\t"
177 @@ -531,15 +537,16 @@ retry:
178
179 /* Now, poll for completion. */
180 {
181 - u64 dispatch_stat;
182 + u64 dispatch_stat, nack_mask;
183 long stuck;
184
185 stuck = 100000 * nack_busy_id;
186 + nack_mask = busy_mask << 1;
187 do {
188 __asm__ __volatile__("ldxa [%%g0] %1, %0"
189 : "=r" (dispatch_stat)
190 : "i" (ASI_INTR_DISPATCH_STAT));
191 - if (dispatch_stat == 0UL) {
192 + if (!(dispatch_stat & (busy_mask | nack_mask))) {
193 __asm__ __volatile__("wrpr %0, 0x0, %%pstate"
194 : : "r" (pstate));
195 if (unlikely(need_more)) {
196 @@ -556,12 +563,12 @@ retry:
197 }
198 if (!--stuck)
199 break;
200 - } while (dispatch_stat & 0x5555555555555555UL);
201 + } while (dispatch_stat & busy_mask);
202
203 __asm__ __volatile__("wrpr %0, 0x0, %%pstate"
204 : : "r" (pstate));
205
206 - if ((dispatch_stat & ~(0x5555555555555555UL)) == 0) {
207 + if (dispatch_stat & busy_mask) {
208 /* Busy bits will not clear, continue instead
209 * of freezing up on this cpu.
210 */
211 diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
212 index 3010227..ed2484d 100644
213 --- a/arch/sparc64/mm/init.c
214 +++ b/arch/sparc64/mm/init.c
215 @@ -1135,14 +1135,9 @@ static void __init mark_kpte_bitmap(unsigned long start, unsigned long end)
216 }
217 }
218
219 -static void __init kernel_physical_mapping_init(void)
220 +static void __init init_kpte_bitmap(void)
221 {
222 unsigned long i;
223 -#ifdef CONFIG_DEBUG_PAGEALLOC
224 - unsigned long mem_alloced = 0UL;
225 -#endif
226 -
227 - read_obp_memory("reg", &pall[0], &pall_ents);
228
229 for (i = 0; i < pall_ents; i++) {
230 unsigned long phys_start, phys_end;
231 @@ -1151,14 +1146,24 @@ static void __init kernel_physical_mapping_init(void)
232 phys_end = phys_start + pall[i].reg_size;
233
234 mark_kpte_bitmap(phys_start, phys_end);
235 + }
236 +}
237
238 +static void __init kernel_physical_mapping_init(void)
239 +{
240 #ifdef CONFIG_DEBUG_PAGEALLOC
241 + unsigned long i, mem_alloced = 0UL;
242 +
243 + for (i = 0; i < pall_ents; i++) {
244 + unsigned long phys_start, phys_end;
245 +
246 + phys_start = pall[i].phys_addr;
247 + phys_end = phys_start + pall[i].reg_size;
248 +
249 mem_alloced += kernel_map_range(phys_start, phys_end,
250 PAGE_KERNEL);
251 -#endif
252 }
253
254 -#ifdef CONFIG_DEBUG_PAGEALLOC
255 printk("Allocated %ld bytes for kernel page tables.\n",
256 mem_alloced);
257
258 @@ -1400,6 +1405,10 @@ void __init paging_init(void)
259
260 inherit_prom_mappings();
261
262 + read_obp_memory("reg", &pall[0], &pall_ents);
263 +
264 + init_kpte_bitmap();
265 +
266 /* Ok, we can use our TLB miss and window trap handlers safely. */
267 setup_tba();
268
269 @@ -1854,7 +1863,9 @@ void __flush_tlb_all(void)
270 "wrpr %0, %1, %%pstate"
271 : "=r" (pstate)
272 : "i" (PSTATE_IE));
273 - if (tlb_type == spitfire) {
274 + if (tlb_type == hypervisor) {
275 + sun4v_mmu_demap_all();
276 + } else if (tlb_type == spitfire) {
277 for (i = 0; i < 64; i++) {
278 /* Spitfire Errata #32 workaround */
279 /* NOTE: Always runs on spitfire, so no
280 diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c
281 index 3ec110c..d2e5298 100644
282 --- a/drivers/acpi/blacklist.c
283 +++ b/drivers/acpi/blacklist.c
284 @@ -3,6 +3,7 @@
285 *
286 * Check to see if the given machine has a known bad ACPI BIOS
287 * or if the BIOS is too old.
288 + * Check given machine against acpi_osi_dmi_table[].
289 *
290 * Copyright (C) 2004 Len Brown <len.brown@intel.com>
291 * Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
292 @@ -50,6 +51,8 @@ struct acpi_blacklist_item {
293 u32 is_critical_error;
294 };
295
296 +static struct dmi_system_id acpi_osi_dmi_table[] __initdata;
297 +
298 /*
299 * POLICY: If *anything* doesn't work, put it on the blacklist.
300 * If they are critical errors, mark it critical, and abort driver load.
301 @@ -67,8 +70,6 @@ static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
302 /* IBM 600E - _ADR should return 7, but it returns 1 */
303 {"IBM ", "TP600E ", 0x00000105, ACPI_SIG_DSDT, less_than_or_equal,
304 "Incorrect _ADR", 1},
305 - {"ASUS\0\0", "P2B-S ", 0, ACPI_SIG_DSDT, all_versions,
306 - "Bogus PCI routing", 1},
307
308 {""}
309 };
310 @@ -165,5 +166,388 @@ int __init acpi_blacklisted(void)
311
312 blacklisted += blacklist_by_year();
313
314 + dmi_check_system(acpi_osi_dmi_table);
315 +
316 return blacklisted;
317 }
318 +#ifdef CONFIG_DMI
319 +static int __init dmi_enable_osi_linux(struct dmi_system_id *d)
320 +{
321 + acpi_dmi_osi_linux(1, d); /* enable */
322 + return 0;
323 +}
324 +static int __init dmi_disable_osi_linux(struct dmi_system_id *d)
325 +{
326 + acpi_dmi_osi_linux(0, d); /* disable */
327 + return 0;
328 +}
329 +static int __init dmi_unknown_osi_linux(struct dmi_system_id *d)
330 +{
331 + acpi_dmi_osi_linux(-1, d); /* unknown */
332 + return 0;
333 +}
334 +
335 +/*
336 + * Most BIOS that invoke OSI(Linux) do nothing with it.
337 + * But some cause Linux to break.
338 + * Only a couple use it to make Linux run better.
339 + *
340 + * Thus, Linux should continue to disable OSI(Linux) by default,
341 + * should continue to discourage BIOS writers from using it, and
342 + * should whitelist the few existing systems that require it.
343 + *
344 + * If it appears clear a vendor isn't using OSI(Linux)
345 + * for anything constructive, blacklist them by name to disable
346 + * unnecessary dmesg warnings on all of their products.
347 + */
348 +
349 +static struct dmi_system_id acpi_osi_dmi_table[] __initdata = {
350 + /*
351 + * Disable OSI(Linux) warnings on all "Acer, inc."
352 + *
353 + * _OSI(Linux) disables the latest Windows BIOS code:
354 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3100"),
355 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5050"),
356 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5100"),
357 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5580"),
358 + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 3010"),
359 + * _OSI(Linux) effect unknown:
360 + * DMI_MATCH(DMI_PRODUCT_NAME, "Ferrari 5000"),
361 + */
362 + /*
363 + * note that dmi_check_system() uses strstr()
364 + * to match sub-strings rather than !strcmp(),
365 + * so "Acer" below matches "Acer, inc." above.
366 + */
367 + /*
368 + * Disable OSI(Linux) warnings on all "Acer"
369 + *
370 + * _OSI(Linux) effect unknown:
371 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5315"),
372 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5610"),
373 + * DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7720Z"),
374 + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 5520"),
375 + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 6460"),
376 + * DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 7510"),
377 + * DMI_MATCH(DMI_PRODUCT_NAME, "Extensa 5220"),
378 + */
379 + {
380 + .callback = dmi_unknown_osi_linux,
381 + .ident = "Acer",
382 + .matches = {
383 + DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
384 + },
385 + },
386 + /*
387 + * Disable OSI(Linux) warnings on all "Apple Computer, Inc."
388 + *
389 + * _OSI(Linux) confirmed to be a NOP:
390 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
391 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBook2,1"),
392 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro2,2"),
393 + * _OSI(Linux) effect unknown:
394 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacPro2,1"),
395 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro1,1"),
396 + * DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro3,1"),
397 + */
398 + {
399 + .callback = dmi_disable_osi_linux,
400 + .ident = "Apple",
401 + .matches = {
402 + DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
403 + },
404 + },
405 + /*
406 + * Disable OSI(Linux) warnings on all "BenQ"
407 + *
408 + * _OSI(Linux) confirmed to be a NOP:
409 + * DMI_MATCH(DMI_PRODUCT_NAME, "Joybook S31"),
410 + */
411 + {
412 + .callback = dmi_disable_osi_linux,
413 + .ident = "BenQ",
414 + .matches = {
415 + DMI_MATCH(DMI_SYS_VENDOR, "BenQ"),
416 + },
417 + },
418 + /*
419 + * Disable OSI(Linux) warnings on all "Clevo Co."
420 + *
421 + * _OSI(Linux) confirmed to be a NOP:
422 + * DMI_MATCH(DMI_PRODUCT_NAME, "M570RU"),
423 + */
424 + {
425 + .callback = dmi_disable_osi_linux,
426 + .ident = "Clevo",
427 + .matches = {
428 + DMI_MATCH(DMI_SYS_VENDOR, "Clevo Co."),
429 + },
430 + },
431 + /*
432 + * Disable OSI(Linux) warnings on all "COMPAL"
433 + *
434 + * _OSI(Linux) confirmed to be a NOP:
435 + * DMI_MATCH(DMI_BOARD_NAME, "HEL8X"),
436 + * _OSI(Linux) unknown effect:
437 + * DMI_MATCH(DMI_BOARD_NAME, "IFL91"),
438 + */
439 + {
440 + .callback = dmi_unknown_osi_linux,
441 + .ident = "Compal",
442 + .matches = {
443 + DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"),
444 + },
445 + },
446 + { /* OSI(Linux) touches USB, unknown side-effect */
447 + .callback = dmi_disable_osi_linux,
448 + .ident = "Dell Dimension 5150",
449 + .matches = {
450 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
451 + DMI_MATCH(DMI_PRODUCT_NAME, "Dell DM051"),
452 + },
453 + },
454 + { /* OSI(Linux) is a NOP */
455 + .callback = dmi_disable_osi_linux,
456 + .ident = "Dell",
457 + .matches = {
458 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
459 + DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1501"),
460 + },
461 + },
462 + { /* OSI(Linux) effect unknown */
463 + .callback = dmi_unknown_osi_linux,
464 + .ident = "Dell",
465 + .matches = {
466 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
467 + DMI_MATCH(DMI_PRODUCT_NAME, "Latitude D830"),
468 + },
469 + },
470 + { /* OSI(Linux) effect unknown */
471 + .callback = dmi_unknown_osi_linux,
472 + .ident = "Dell",
473 + .matches = {
474 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
475 + DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex GX620"),
476 + },
477 + },
478 + { /* OSI(Linux) effect unknown */
479 + .callback = dmi_unknown_osi_linux,
480 + .ident = "Dell",
481 + .matches = {
482 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
483 + DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1900"),
484 + },
485 + },
486 + { /* OSI(Linux) touches USB */
487 + .callback = dmi_disable_osi_linux,
488 + .ident = "Dell",
489 + .matches = {
490 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
491 + DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation 390"),
492 + },
493 + },
494 + { /* OSI(Linux) is a NOP */
495 + .callback = dmi_disable_osi_linux,
496 + .ident = "Dell Vostro 1000",
497 + .matches = {
498 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
499 + DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 1000"),
500 + },
501 + },
502 + { /* OSI(Linux) effect unknown */
503 + .callback = dmi_unknown_osi_linux,
504 + .ident = "Dell",
505 + .matches = {
506 + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
507 + DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge SC440"),
508 + },
509 + },
510 + { /* OSI(Linux) effect unknown */
511 + .callback = dmi_unknown_osi_linux,
512 + .ident = "Dialogue Flybook V5",
513 + .matches = {
514 + DMI_MATCH(DMI_SYS_VENDOR, "Dialogue Technology Corporation"),
515 + DMI_MATCH(DMI_PRODUCT_NAME, "Flybook V5"),
516 + },
517 + },
518 + /*
519 + * Disable OSI(Linux) warnings on all "FUJITSU SIEMENS"
520 + *
521 + * _OSI(Linux) disables latest Windows BIOS code:
522 + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pa 2510"),
523 + * _OSI(Linux) confirmed to be a NOP:
524 + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1536"),
525 + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pi 1556"),
526 + * DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Xi 1546"),
527 + * _OSI(Linux) unknown effect:
528 + * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo M1425"),
529 + * DMI_MATCH(DMI_PRODUCT_NAME, "Amilo Si 1520"),
530 + * DMI_MATCH(DMI_PRODUCT_NAME, "ESPRIMO Mobile V5505"),
531 + */
532 + {
533 + .callback = dmi_disable_osi_linux,
534 + .ident = "Fujitsu Siemens",
535 + .matches = {
536 + DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"),
537 + },
538 + },
539 + /*
540 + * Disable OSI(Linux) warnings on all "Hewlett-Packard"
541 + *
542 + * _OSI(Linux) confirmed to be a NOP:
543 + * .ident = "HP Pavilion tx 1000"
544 + * DMI_MATCH(DMI_BOARD_NAME, "30BF"),
545 + * .ident = "HP Pavilion dv2000"
546 + * DMI_MATCH(DMI_BOARD_NAME, "30B5"),
547 + * .ident = "HP Pavilion dv5000",
548 + * DMI_MATCH(DMI_BOARD_NAME, "30A7"),
549 + * .ident = "HP Pavilion dv6300 30BC",
550 + * DMI_MATCH(DMI_BOARD_NAME, "30BC"),
551 + * .ident = "HP Pavilion dv6000",
552 + * DMI_MATCH(DMI_BOARD_NAME, "30B7"),
553 + * DMI_MATCH(DMI_BOARD_NAME, "30B8"),
554 + * .ident = "HP Pavilion dv9000",
555 + * DMI_MATCH(DMI_BOARD_NAME, "30B9"),
556 + * .ident = "HP Pavilion dv9500",
557 + * DMI_MATCH(DMI_BOARD_NAME, "30CB"),
558 + * .ident = "HP/Compaq Presario C500",
559 + * DMI_MATCH(DMI_BOARD_NAME, "30C6"),
560 + * .ident = "HP/Compaq Presario F500",
561 + * DMI_MATCH(DMI_BOARD_NAME, "30D3"),
562 + * _OSI(Linux) unknown effect:
563 + * .ident = "HP Pavilion dv6500",
564 + * DMI_MATCH(DMI_BOARD_NAME, "30D0"),
565 + */
566 + {
567 + .callback = dmi_disable_osi_linux,
568 + .ident = "Hewlett-Packard",
569 + .matches = {
570 + DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
571 + },
572 + },
573 + /*
574 + * Lenovo has a mix of systems OSI(Linux) situations
575 + * and thus we can not wildcard the vendor.
576 + *
577 + * _OSI(Linux) helps sound
578 + * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
579 + * DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
580 + * _OSI(Linux) is a NOP:
581 + * DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
582 + */
583 + {
584 + .callback = dmi_enable_osi_linux,
585 + .ident = "Lenovo ThinkPad R61",
586 + .matches = {
587 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
588 + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad R61"),
589 + },
590 + },
591 + {
592 + .callback = dmi_enable_osi_linux,
593 + .ident = "Lenovo ThinkPad T61",
594 + .matches = {
595 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
596 + DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T61"),
597 + },
598 + },
599 + {
600 + .callback = dmi_unknown_osi_linux,
601 + .ident = "Lenovo 3000 V100",
602 + .matches = {
603 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
604 + DMI_MATCH(DMI_PRODUCT_VERSION, "LENOVO3000 V100"),
605 + },
606 + },
607 + {
608 + .callback = dmi_disable_osi_linux,
609 + .ident = "Lenovo 3000 N100",
610 + .matches = {
611 + DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
612 + DMI_MATCH(DMI_PRODUCT_VERSION, "3000 N100"),
613 + },
614 + },
615 + /*
616 + * Disable OSI(Linux) warnings on all "LG Electronics"
617 + *
618 + * _OSI(Linux) confirmed to be a NOP:
619 + * DMI_MATCH(DMI_PRODUCT_NAME, "P1-J150B"),
620 + * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
621 + *
622 + * unknown:
623 + * DMI_MATCH(DMI_PRODUCT_NAME, "S1-MDGDG"),
624 + * with DMI_MATCH(DMI_BOARD_NAME, "ROCKY"),
625 + */
626 + {
627 + .callback = dmi_disable_osi_linux,
628 + .ident = "LG",
629 + .matches = {
630 + DMI_MATCH(DMI_SYS_VENDOR, "LG Electronics"),
631 + },
632 + },
633 + /* NEC - OSI(Linux) effect unknown */
634 + {
635 + .callback = dmi_unknown_osi_linux,
636 + .ident = "NEC VERSA M360",
637 + .matches = {
638 + DMI_MATCH(DMI_SYS_VENDOR, "NEC Computers SAS"),
639 + DMI_MATCH(DMI_PRODUCT_NAME, "NEC VERSA M360"),
640 + },
641 + },
642 + /*
643 + * Disable OSI(Linux) warnings on all "Samsung Electronics"
644 + *
645 + * OSI(Linux) disables PNP0C32 and other BIOS code for Windows:
646 + * DMI_MATCH(DMI_PRODUCT_NAME, "R40P/R41P"),
647 + * DMI_MATCH(DMI_PRODUCT_NAME, "R59P/R60P/R61P"),
648 + */
649 + {
650 + .callback = dmi_disable_osi_linux,
651 + .ident = "Samsung",
652 + .matches = {
653 + DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
654 + },
655 + },
656 + /*
657 + * Disable OSI(Linux) warnings on all "Sony Corporation"
658 + *
659 + * _OSI(Linux) is a NOP:
660 + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ650N"),
661 + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SZ38GP_C"),
662 + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-TZ21MN_N"),
663 + * _OSI(Linux) unknown effect:
664 + * DMI_MATCH(DMI_PRODUCT_NAME, "VGN-FZ11M"),
665 + */
666 + {
667 + .callback = dmi_unknown_osi_linux,
668 + .ident = "Sony",
669 + .matches = {
670 + DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"),
671 + },
672 + },
673 + /*
674 + * Disable OSI(Linux) warnings on all "TOSHIBA"
675 + *
676 + * _OSI(Linux) breaks sound (bugzilla 7787):
677 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P100"),
678 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P105"),
679 + * _OSI(Linux) is a NOP:
680 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A100"),
681 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A210"),
682 + * _OSI(Linux) unknown effect:
683 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A135"),
684 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A200"),
685 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P205"),
686 + * DMI_MATCH(DMI_PRODUCT_NAME, "Satellite U305"),
687 + */
688 + {
689 + .callback = dmi_disable_osi_linux,
690 + .ident = "Toshiba",
691 + .matches = {
692 + DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
693 + },
694 + },
695 + {}
696 +};
697 +
698 +#endif /* CONFIG_DMI */
699 diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
700 index 9ba778a..222fcec 100644
701 --- a/drivers/acpi/bus.c
702 +++ b/drivers/acpi/bus.c
703 @@ -29,7 +29,6 @@
704 #include <linux/list.h>
705 #include <linux/sched.h>
706 #include <linux/pm.h>
707 -#include <linux/pm_legacy.h>
708 #include <linux/device.h>
709 #include <linux/proc_fs.h>
710 #ifdef CONFIG_X86
711 @@ -757,16 +756,14 @@ static int __init acpi_init(void)
712 result = acpi_bus_init();
713
714 if (!result) {
715 -#ifdef CONFIG_PM_LEGACY
716 - if (!PM_IS_ACTIVE())
717 - pm_active = 1;
718 + if (!(pm_flags & PM_APM))
719 + pm_flags |= PM_ACPI;
720 else {
721 printk(KERN_INFO PREFIX
722 "APM is already active, exiting\n");
723 disable_acpi();
724 result = -ENODEV;
725 }
726 -#endif
727 } else
728 disable_acpi();
729
730 diff --git a/drivers/acpi/dispatcher/dsobject.c b/drivers/acpi/dispatcher/dsobject.c
731 index a474ca2..954ac8c 100644
732 --- a/drivers/acpi/dispatcher/dsobject.c
733 +++ b/drivers/acpi/dispatcher/dsobject.c
734 @@ -137,6 +137,71 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
735 return_ACPI_STATUS(status);
736 }
737 }
738 +
739 + /* Special object resolution for elements of a package */
740 +
741 + if ((op->common.parent->common.aml_opcode == AML_PACKAGE_OP) ||
742 + (op->common.parent->common.aml_opcode ==
743 + AML_VAR_PACKAGE_OP)) {
744 + /*
745 + * Attempt to resolve the node to a value before we insert it into
746 + * the package. If this is a reference to a common data type,
747 + * resolve it immediately. According to the ACPI spec, package
748 + * elements can only be "data objects" or method references.
749 + * Attempt to resolve to an Integer, Buffer, String or Package.
750 + * If cannot, return the named reference (for things like Devices,
751 + * Methods, etc.) Buffer Fields and Fields will resolve to simple
752 + * objects (int/buf/str/pkg).
753 + *
754 + * NOTE: References to things like Devices, Methods, Mutexes, etc.
755 + * will remain as named references. This behavior is not described
756 + * in the ACPI spec, but it appears to be an oversight.
757 + */
758 + obj_desc = (union acpi_operand_object *)op->common.node;
759 +
760 + status =
761 + acpi_ex_resolve_node_to_value(ACPI_CAST_INDIRECT_PTR
762 + (struct
763 + acpi_namespace_node,
764 + &obj_desc),
765 + walk_state);
766 + if (ACPI_FAILURE(status)) {
767 + return_ACPI_STATUS(status);
768 + }
769 +
770 + switch (op->common.node->type) {
771 + /*
772 + * For these types, we need the actual node, not the subobject.
773 + * However, the subobject got an extra reference count above.
774 + */
775 + case ACPI_TYPE_MUTEX:
776 + case ACPI_TYPE_METHOD:
777 + case ACPI_TYPE_POWER:
778 + case ACPI_TYPE_PROCESSOR:
779 + case ACPI_TYPE_EVENT:
780 + case ACPI_TYPE_REGION:
781 + case ACPI_TYPE_DEVICE:
782 + case ACPI_TYPE_THERMAL:
783 +
784 + obj_desc =
785 + (union acpi_operand_object *)op->common.
786 + node;
787 + break;
788 +
789 + default:
790 + break;
791 + }
792 +
793 + /*
794 + * If above resolved to an operand object, we are done. Otherwise,
795 + * we have a NS node, we must create the package entry as a named
796 + * reference.
797 + */
798 + if (ACPI_GET_DESCRIPTOR_TYPE(obj_desc) !=
799 + ACPI_DESC_TYPE_NAMED) {
800 + goto exit;
801 + }
802 + }
803 }
804
805 /* Create and init a new internal ACPI object */
806 @@ -156,6 +221,7 @@ acpi_ds_build_internal_object(struct acpi_walk_state *walk_state,
807 return_ACPI_STATUS(status);
808 }
809
810 + exit:
811 *obj_desc_ptr = obj_desc;
812 return_ACPI_STATUS(AE_OK);
813 }
814 @@ -356,12 +422,25 @@ acpi_ds_build_internal_package_obj(struct acpi_walk_state *walk_state,
815 arg = arg->common.next;
816 for (i = 0; arg && (i < element_count); i++) {
817 if (arg->common.aml_opcode == AML_INT_RETURN_VALUE_OP) {
818 -
819 - /* This package element is already built, just get it */
820 -
821 - obj_desc->package.elements[i] =
822 - ACPI_CAST_PTR(union acpi_operand_object,
823 - arg->common.node);
824 + if (arg->common.node->type == ACPI_TYPE_METHOD) {
825 + /*
826 + * A method reference "looks" to the parser to be a method
827 + * invocation, so we special case it here
828 + */
829 + arg->common.aml_opcode = AML_INT_NAMEPATH_OP;
830 + status =
831 + acpi_ds_build_internal_object(walk_state,
832 + arg,
833 + &obj_desc->
834 + package.
835 + elements[i]);
836 + } else {
837 + /* This package element is already built, just get it */
838 +
839 + obj_desc->package.elements[i] =
840 + ACPI_CAST_PTR(union acpi_operand_object,
841 + arg->common.node);
842 + }
843 } else {
844 status = acpi_ds_build_internal_object(walk_state, arg,
845 &obj_desc->
846 diff --git a/drivers/acpi/events/evregion.c b/drivers/acpi/events/evregion.c
847 index e99f0c4..58ad097 100644
848 --- a/drivers/acpi/events/evregion.c
849 +++ b/drivers/acpi/events/evregion.c
850 @@ -344,7 +344,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
851 * setup will potentially execute control methods
852 * (e.g., _REG method for this region)
853 */
854 - acpi_ex_relinquish_interpreter();
855 + acpi_ex_exit_interpreter();
856
857 status = region_setup(region_obj, ACPI_REGION_ACTIVATE,
858 handler_desc->address_space.context,
859 @@ -352,7 +352,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
860
861 /* Re-enter the interpreter */
862
863 - acpi_ex_reacquire_interpreter();
864 + acpi_ex_enter_interpreter();
865
866 /* Check for failure of the Region Setup */
867
868 @@ -405,7 +405,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
869 * exit the interpreter because the handler *might* block -- we don't
870 * know what it will do, so we can't hold the lock on the intepreter.
871 */
872 - acpi_ex_relinquish_interpreter();
873 + acpi_ex_exit_interpreter();
874 }
875
876 /* Call the handler */
877 @@ -426,7 +426,7 @@ acpi_ev_address_space_dispatch(union acpi_operand_object *region_obj,
878 * We just returned from a non-default handler, we must re-enter the
879 * interpreter
880 */
881 - acpi_ex_reacquire_interpreter();
882 + acpi_ex_enter_interpreter();
883 }
884
885 return_ACPI_STATUS(status);
886 diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
887 index 12c09fa..cd573e4 100644
888 --- a/drivers/acpi/osl.c
889 +++ b/drivers/acpi/osl.c
890 @@ -77,11 +77,55 @@ static struct workqueue_struct *kacpi_notify_wq;
891 #define OSI_STRING_LENGTH_MAX 64 /* arbitrary */
892 static char osi_additional_string[OSI_STRING_LENGTH_MAX];
893
894 -static int osi_linux; /* disable _OSI(Linux) by default */
895 +/*
896 + * "Ode to _OSI(Linux)"
897 + *
898 + * osi_linux -- Control response to BIOS _OSI(Linux) query.
899 + *
900 + * As Linux evolves, the features that it supports change.
901 + * So an OSI string such as "Linux" is not specific enough
902 + * to be useful across multiple versions of Linux. It
903 + * doesn't identify any particular feature, interface,
904 + * or even any particular version of Linux...
905 + *
906 + * Unfortunately, Linux-2.6.22 and earlier responded "yes"
907 + * to a BIOS _OSI(Linux) query. When
908 + * a reference mobile BIOS started using it, its use
909 + * started to spread to many vendor platforms.
910 + * As it is not supportable, we need to halt that spread.
911 + *
912 + * Today, most BIOS references to _OSI(Linux) are noise --
913 + * they have no functional effect and are just dead code
914 + * carried over from the reference BIOS.
915 + *
916 + * The next most common case is that _OSI(Linux) harms Linux,
917 + * usually by causing the BIOS to follow paths that are
918 + * not tested during Windows validation.
919 + *
920 + * Finally, there is a short list of platforms
921 + * where OSI(Linux) benefits Linux.
922 + *
923 + * In Linux-2.6.23, OSI(Linux) is first disabled by default.
924 + * DMI is used to disable the dmesg warning about OSI(Linux)
925 + * on platforms where it is known to have no effect.
926 + * But a dmesg warning remains for systems where
927 + * we do not know if OSI(Linux) is good or bad for the system.
928 + * DMI is also used to enable OSI(Linux) for the machines
929 + * that are known to need it.
930 + *
931 + * BIOS writers should NOT query _OSI(Linux) on future systems.
932 + * It will be ignored by default, and to get Linux to
933 + * not ignore it will require a kernel source update to
934 + * add a DMI entry, or a boot-time "acpi_osi=Linux" invocation.
935 + */
936 +#define OSI_LINUX_ENABLE 0
937
938 -#ifdef CONFIG_DMI
939 -static struct __initdata dmi_system_id acpi_osl_dmi_table[];
940 -#endif
941 +static struct osi_linux {
942 + unsigned int enable:1;
943 + unsigned int dmi:1;
944 + unsigned int cmdline:1;
945 + unsigned int known:1;
946 +} osi_linux = { OSI_LINUX_ENABLE, 0, 0, 0};
947
948 static void __init acpi_request_region (struct acpi_generic_address *addr,
949 unsigned int length, char *desc)
950 @@ -133,7 +177,6 @@ device_initcall(acpi_reserve_resources);
951
952 acpi_status __init acpi_os_initialize(void)
953 {
954 - dmi_check_system(acpi_osl_dmi_table);
955 return AE_OK;
956 }
957
958 @@ -971,13 +1014,37 @@ static int __init acpi_os_name_setup(char *str)
959
960 __setup("acpi_os_name=", acpi_os_name_setup);
961
962 -static void enable_osi_linux(int enable) {
963 +static void __init set_osi_linux(unsigned int enable)
964 +{
965 + if (osi_linux.enable != enable) {
966 + osi_linux.enable = enable;
967 + printk(KERN_NOTICE PREFIX "%sed _OSI(Linux)\n",
968 + enable ? "Add": "Delet");
969 + }
970 + return;
971 +}
972
973 - if (osi_linux != enable)
974 - printk(KERN_INFO PREFIX "%sabled _OSI(Linux)\n",
975 - enable ? "En": "Dis");
976 +static void __init acpi_cmdline_osi_linux(unsigned int enable)
977 +{
978 + osi_linux.cmdline = 1; /* cmdline set the default */
979 + set_osi_linux(enable);
980 +
981 + return;
982 +}
983 +
984 +void __init acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d)
985 +{
986 + osi_linux.dmi = 1; /* DMI knows that this box asks OSI(Linux) */
987 +
988 + printk(KERN_NOTICE PREFIX "DMI detected: %s\n", d->ident);
989 +
990 + if (enable == -1)
991 + return;
992 +
993 + osi_linux.known = 1; /* DMI knows which OSI(Linux) default needed */
994 +
995 + set_osi_linux(enable);
996
997 - osi_linux = enable;
998 return;
999 }
1000
1001 @@ -994,12 +1061,12 @@ static int __init acpi_osi_setup(char *str)
1002 printk(KERN_INFO PREFIX "_OSI method disabled\n");
1003 acpi_gbl_create_osi_method = FALSE;
1004 } else if (!strcmp("!Linux", str)) {
1005 - enable_osi_linux(0);
1006 + acpi_cmdline_osi_linux(0); /* !enable */
1007 } else if (*str == '!') {
1008 if (acpi_osi_invalidate(++str) == AE_OK)
1009 printk(KERN_INFO PREFIX "Deleted _OSI(%s)\n", str);
1010 } else if (!strcmp("Linux", str)) {
1011 - enable_osi_linux(1);
1012 + acpi_cmdline_osi_linux(1); /* enable */
1013 } else if (*osi_additional_string == '\0') {
1014 strncpy(osi_additional_string, str, OSI_STRING_LENGTH_MAX);
1015 printk(KERN_INFO PREFIX "Added _OSI(%s)\n", str);
1016 @@ -1156,6 +1223,34 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
1017 return (AE_OK);
1018 }
1019
1020 +/**
1021 + * acpi_dmi_dump - dump DMI slots needed for blacklist entry
1022 + *
1023 + * Returns 0 on success
1024 + */
1025 +static int acpi_dmi_dump(void)
1026 +{
1027 +
1028 + if (!dmi_available)
1029 + return -1;
1030 +
1031 + printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
1032 + dmi_get_system_info(DMI_SYS_VENDOR));
1033 + printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
1034 + dmi_get_system_info(DMI_PRODUCT_NAME));
1035 + printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
1036 + dmi_get_system_info(DMI_PRODUCT_VERSION));
1037 + printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
1038 + dmi_get_system_info(DMI_BOARD_NAME));
1039 + printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
1040 + dmi_get_system_info(DMI_BIOS_VENDOR));
1041 + printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
1042 + dmi_get_system_info(DMI_BIOS_DATE));
1043 +
1044 + return 0;
1045 +}
1046 +
1047 +
1048 /******************************************************************************
1049 *
1050 * FUNCTION: acpi_os_validate_interface
1051 @@ -1175,13 +1270,29 @@ acpi_os_validate_interface (char *interface)
1052 if (!strncmp(osi_additional_string, interface, OSI_STRING_LENGTH_MAX))
1053 return AE_OK;
1054 if (!strcmp("Linux", interface)) {
1055 - printk(KERN_WARNING PREFIX
1056 - "System BIOS is requesting _OSI(Linux)\n");
1057 - printk(KERN_WARNING PREFIX
1058 - "If \"acpi_osi=Linux\" works better,\n"
1059 - "Please send dmidecode "
1060 - "to linux-acpi@vger.kernel.org\n");
1061 - if(osi_linux)
1062 +
1063 + printk(KERN_NOTICE PREFIX
1064 + "BIOS _OSI(Linux) query %s%s\n",
1065 + osi_linux.enable ? "honored" : "ignored",
1066 + osi_linux.cmdline ? " via cmdline" :
1067 + osi_linux.dmi ? " via DMI" : "");
1068 +
1069 + if (!osi_linux.dmi) {
1070 + if (acpi_dmi_dump())
1071 + printk(KERN_NOTICE PREFIX
1072 + "[please extract dmidecode output]\n");
1073 + printk(KERN_NOTICE PREFIX
1074 + "Please send DMI info above to "
1075 + "linux-acpi@vger.kernel.org\n");
1076 + }
1077 + if (!osi_linux.known && !osi_linux.cmdline) {
1078 + printk(KERN_NOTICE PREFIX
1079 + "If \"acpi_osi=%sLinux\" works better, "
1080 + "please notify linux-acpi@vger.kernel.org\n",
1081 + osi_linux.enable ? "!" : "");
1082 + }
1083 +
1084 + if (osi_linux.enable)
1085 return AE_OK;
1086 }
1087 return AE_SUPPORT;
1088 @@ -1213,28 +1324,4 @@ acpi_os_validate_address (
1089 return AE_OK;
1090 }
1091
1092 -#ifdef CONFIG_DMI
1093 -static int dmi_osi_linux(struct dmi_system_id *d)
1094 -{
1095 - printk(KERN_NOTICE "%s detected: enabling _OSI(Linux)\n", d->ident);
1096 - enable_osi_linux(1);
1097 - return 0;
1098 -}
1099 -
1100 -static struct dmi_system_id acpi_osl_dmi_table[] __initdata = {
1101 - /*
1102 - * Boxes that need _OSI(Linux)
1103 - */
1104 - {
1105 - .callback = dmi_osi_linux,
1106 - .ident = "Intel Napa CRB",
1107 - .matches = {
1108 - DMI_MATCH(DMI_BOARD_VENDOR, "Intel Corporation"),
1109 - DMI_MATCH(DMI_BOARD_NAME, "MPAD-MSAE Customer Reference Boards"),
1110 - },
1111 - },
1112 - {}
1113 -};
1114 -#endif /* CONFIG_DMI */
1115 -
1116 #endif
1117 diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
1118 index dd3186a..62010c2 100644
1119 --- a/drivers/acpi/pci_irq.c
1120 +++ b/drivers/acpi/pci_irq.c
1121 @@ -429,6 +429,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
1122 &polarity, &link,
1123 acpi_pci_allocate_irq);
1124
1125 + if (irq < 0) {
1126 + /*
1127 + * IDE legacy mode controller IRQs are magic. Why do compat
1128 + * extensions always make such a nasty mess.
1129 + */
1130 + if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE &&
1131 + (dev->class & 0x05) == 0)
1132 + return 0;
1133 + }
1134 /*
1135 * No IRQ known to the ACPI subsystem - maybe the BIOS /
1136 * driver reported one, then use it. Exit in any case.
1137 diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
1138 index dad84c0..9d71f25 100644
1139 --- a/drivers/acpi/video.c
1140 +++ b/drivers/acpi/video.c
1141 @@ -573,7 +573,7 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
1142 struct acpi_video_device_brightness *br = NULL;
1143
1144
1145 - memset(&device->cap, 0, 4);
1146 + memset(&device->cap, 0, sizeof(device->cap));
1147
1148 if (ACPI_SUCCESS(acpi_get_handle(device->dev->handle, "_ADR", &h_dummy1))) {
1149 device->cap._ADR = 1;
1150 @@ -693,7 +693,7 @@ static void acpi_video_bus_find_cap(struct acpi_video_bus *video)
1151 {
1152 acpi_handle h_dummy1;
1153
1154 - memset(&video->cap, 0, 4);
1155 + memset(&video->cap, 0, sizeof(video->cap));
1156 if (ACPI_SUCCESS(acpi_get_handle(video->device->handle, "_DOS", &h_dummy1))) {
1157 video->cap._DOS = 1;
1158 }
1159 diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
1160 index 98e33f9..4895a42 100644
1161 --- a/drivers/ata/libata-core.c
1162 +++ b/drivers/ata/libata-core.c
1163 @@ -6121,19 +6121,6 @@ static void ata_host_release(struct device *gendev, void *res)
1164 if (!ap)
1165 continue;
1166
1167 - if ((host->flags & ATA_HOST_STARTED) && ap->ops->port_stop)
1168 - ap->ops->port_stop(ap);
1169 - }
1170 -
1171 - if ((host->flags & ATA_HOST_STARTED) && host->ops->host_stop)
1172 - host->ops->host_stop(host);
1173 -
1174 - for (i = 0; i < host->n_ports; i++) {
1175 - struct ata_port *ap = host->ports[i];
1176 -
1177 - if (!ap)
1178 - continue;
1179 -
1180 if (ap->scsi_host)
1181 scsi_host_put(ap->scsi_host);
1182
1183 @@ -6258,6 +6245,24 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
1184 return host;
1185 }
1186
1187 +static void ata_host_stop(struct device *gendev, void *res)
1188 +{
1189 + struct ata_host *host = dev_get_drvdata(gendev);
1190 + int i;
1191 +
1192 + WARN_ON(!(host->flags & ATA_HOST_STARTED));
1193 +
1194 + for (i = 0; i < host->n_ports; i++) {
1195 + struct ata_port *ap = host->ports[i];
1196 +
1197 + if (ap->ops->port_stop)
1198 + ap->ops->port_stop(ap);
1199 + }
1200 +
1201 + if (host->ops->host_stop)
1202 + host->ops->host_stop(host);
1203 +}
1204 +
1205 /**
1206 * ata_host_start - start and freeze ports of an ATA host
1207 * @host: ATA host to start ports for
1208 @@ -6276,6 +6281,8 @@ struct ata_host *ata_host_alloc_pinfo(struct device *dev,
1209 */
1210 int ata_host_start(struct ata_host *host)
1211 {
1212 + int have_stop = 0;
1213 + void *start_dr = NULL;
1214 int i, rc;
1215
1216 if (host->flags & ATA_HOST_STARTED)
1217 @@ -6287,6 +6294,22 @@ int ata_host_start(struct ata_host *host)
1218 if (!host->ops && !ata_port_is_dummy(ap))
1219 host->ops = ap->ops;
1220
1221 + if (ap->ops->port_stop)
1222 + have_stop = 1;
1223 + }
1224 +
1225 + if (host->ops->host_stop)
1226 + have_stop = 1;
1227 +
1228 + if (have_stop) {
1229 + start_dr = devres_alloc(ata_host_stop, 0, GFP_KERNEL);
1230 + if (!start_dr)
1231 + return -ENOMEM;
1232 + }
1233 +
1234 + for (i = 0; i < host->n_ports; i++) {
1235 + struct ata_port *ap = host->ports[i];
1236 +
1237 if (ap->ops->port_start) {
1238 rc = ap->ops->port_start(ap);
1239 if (rc) {
1240 @@ -6299,6 +6322,8 @@ int ata_host_start(struct ata_host *host)
1241 ata_eh_freeze_port(ap);
1242 }
1243
1244 + if (start_dr)
1245 + devres_add(host->dev, start_dr);
1246 host->flags |= ATA_HOST_STARTED;
1247 return 0;
1248
1249 @@ -6309,6 +6334,7 @@ int ata_host_start(struct ata_host *host)
1250 if (ap->ops->port_stop)
1251 ap->ops->port_stop(ap);
1252 }
1253 + devres_free(start_dr);
1254 return rc;
1255 }
1256
1257 diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
1258 index 25698cf..bab694a 100644
1259 --- a/drivers/ata/sata_promise.c
1260 +++ b/drivers/ata/sata_promise.c
1261 @@ -50,6 +50,7 @@
1262 enum {
1263 PDC_MAX_PORTS = 4,
1264 PDC_MMIO_BAR = 3,
1265 + PDC_MAX_PRD = LIBATA_MAX_PRD - 1, /* -1 for ASIC PRD bug workaround */
1266
1267 /* register offsets */
1268 PDC_FEATURE = 0x04, /* Feature/Error reg (per port) */
1269 @@ -155,7 +156,7 @@ static struct scsi_host_template pdc_ata_sht = {
1270 .queuecommand = ata_scsi_queuecmd,
1271 .can_queue = ATA_DEF_QUEUE,
1272 .this_id = ATA_SHT_THIS_ID,
1273 - .sg_tablesize = LIBATA_MAX_PRD,
1274 + .sg_tablesize = PDC_MAX_PRD,
1275 .cmd_per_lun = ATA_SHT_CMD_PER_LUN,
1276 .emulated = ATA_SHT_EMULATED,
1277 .use_clustering = ATA_SHT_USE_CLUSTERING,
1278 @@ -527,6 +528,84 @@ static void pdc_atapi_pkt(struct ata_queued_cmd *qc)
1279 memcpy(buf+31, cdb, cdb_len);
1280 }
1281
1282 +/**
1283 + * pdc_fill_sg - Fill PCI IDE PRD table
1284 + * @qc: Metadata associated with taskfile to be transferred
1285 + *
1286 + * Fill PCI IDE PRD (scatter-gather) table with segments
1287 + * associated with the current disk command.
1288 + * Make sure hardware does not choke on it.
1289 + *
1290 + * LOCKING:
1291 + * spin_lock_irqsave(host lock)
1292 + *
1293 + */
1294 +static void pdc_fill_sg(struct ata_queued_cmd *qc)
1295 +{
1296 + struct ata_port *ap = qc->ap;
1297 + struct scatterlist *sg;
1298 + unsigned int idx;
1299 + const u32 SG_COUNT_ASIC_BUG = 41*4;
1300 +
1301 + if (!(qc->flags & ATA_QCFLAG_DMAMAP))
1302 + return;
1303 +
1304 + WARN_ON(qc->__sg == NULL);
1305 + WARN_ON(qc->n_elem == 0 && qc->pad_len == 0);
1306 +
1307 + idx = 0;
1308 + ata_for_each_sg(sg, qc) {
1309 + u32 addr, offset;
1310 + u32 sg_len, len;
1311 +
1312 + /* determine if physical DMA addr spans 64K boundary.
1313 + * Note h/w doesn't support 64-bit, so we unconditionally
1314 + * truncate dma_addr_t to u32.
1315 + */
1316 + addr = (u32) sg_dma_address(sg);
1317 + sg_len = sg_dma_len(sg);
1318 +
1319 + while (sg_len) {
1320 + offset = addr & 0xffff;
1321 + len = sg_len;
1322 + if ((offset + sg_len) > 0x10000)
1323 + len = 0x10000 - offset;
1324 +
1325 + ap->prd[idx].addr = cpu_to_le32(addr);
1326 + ap->prd[idx].flags_len = cpu_to_le32(len & 0xffff);
1327 + VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
1328 +
1329 + idx++;
1330 + sg_len -= len;
1331 + addr += len;
1332 + }
1333 + }
1334 +
1335 + if (idx) {
1336 + u32 len = le32_to_cpu(ap->prd[idx - 1].flags_len);
1337 +
1338 + if (len > SG_COUNT_ASIC_BUG) {
1339 + u32 addr;
1340 +
1341 + VPRINTK("Splitting last PRD.\n");
1342 +
1343 + addr = le32_to_cpu(ap->prd[idx - 1].addr);
1344 + ap->prd[idx - 1].flags_len = cpu_to_le32(len - SG_COUNT_ASIC_BUG);
1345 + VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx - 1, addr, SG_COUNT_ASIC_BUG);
1346 +
1347 + addr = addr + len - SG_COUNT_ASIC_BUG;
1348 + len = SG_COUNT_ASIC_BUG;
1349 + ap->prd[idx].addr = cpu_to_le32(addr);
1350 + ap->prd[idx].flags_len = cpu_to_le32(len);
1351 + VPRINTK("PRD[%u] = (0x%X, 0x%X)\n", idx, addr, len);
1352 +
1353 + idx++;
1354 + }
1355 +
1356 + ap->prd[idx - 1].flags_len |= cpu_to_le32(ATA_PRD_EOT);
1357 + }
1358 +}
1359 +
1360 static void pdc_qc_prep(struct ata_queued_cmd *qc)
1361 {
1362 struct pdc_port_priv *pp = qc->ap->private_data;
1363 @@ -536,7 +615,7 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
1364
1365 switch (qc->tf.protocol) {
1366 case ATA_PROT_DMA:
1367 - ata_qc_prep(qc);
1368 + pdc_fill_sg(qc);
1369 /* fall through */
1370
1371 case ATA_PROT_NODATA:
1372 @@ -552,11 +631,11 @@ static void pdc_qc_prep(struct ata_queued_cmd *qc)
1373 break;
1374
1375 case ATA_PROT_ATAPI:
1376 - ata_qc_prep(qc);
1377 + pdc_fill_sg(qc);
1378 break;
1379
1380 case ATA_PROT_ATAPI_DMA:
1381 - ata_qc_prep(qc);
1382 + pdc_fill_sg(qc);
1383 /*FALLTHROUGH*/
1384 case ATA_PROT_ATAPI_NODATA:
1385 pdc_atapi_pkt(qc);
1386 diff --git a/drivers/atm/nicstar.c b/drivers/atm/nicstar.c
1387 index 14ced85..0c205b0 100644
1388 --- a/drivers/atm/nicstar.c
1389 +++ b/drivers/atm/nicstar.c
1390 @@ -625,14 +625,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
1391 if (mac[i] == NULL)
1392 nicstar_init_eprom(card->membase);
1393
1394 - if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0)
1395 - {
1396 - printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
1397 - error = 9;
1398 - ns_init_card_error(card, error);
1399 - return error;
1400 - }
1401 -
1402 /* Set the VPI/VCI MSb mask to zero so we can receive OAM cells */
1403 writel(0x00000000, card->membase + VPM);
1404
1405 @@ -858,8 +850,6 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
1406 card->iovpool.count++;
1407 }
1408
1409 - card->intcnt = 0;
1410 -
1411 /* Configure NICStAR */
1412 if (card->rct_size == 4096)
1413 ns_cfg_rctsize = NS_CFG_RCTSIZE_4096_ENTRIES;
1414 @@ -868,6 +858,15 @@ static int __devinit ns_init_card(int i, struct pci_dev *pcidev)
1415
1416 card->efbie = 1;
1417
1418 + card->intcnt = 0;
1419 + if (request_irq(pcidev->irq, &ns_irq_handler, IRQF_DISABLED | IRQF_SHARED, "nicstar", card) != 0)
1420 + {
1421 + printk("nicstar%d: can't allocate IRQ %d.\n", i, pcidev->irq);
1422 + error = 9;
1423 + ns_init_card_error(card, error);
1424 + return error;
1425 + }
1426 +
1427 /* Register device */
1428 card->atmdev = atm_dev_register("nicstar", &atm_ops, -1, NULL);
1429 if (card->atmdev == NULL)
1430 diff --git a/drivers/char/apm-emulation.c b/drivers/char/apm-emulation.c
1431 index ec116df..72183bd 100644
1432 --- a/drivers/char/apm-emulation.c
1433 +++ b/drivers/char/apm-emulation.c
1434 @@ -295,7 +295,6 @@ static int
1435 apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
1436 {
1437 struct apm_user *as = filp->private_data;
1438 - unsigned long flags;
1439 int err = -EINVAL;
1440
1441 if (!as->suser || !as->writer)
1442 @@ -331,10 +330,16 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
1443 * Wait for the suspend/resume to complete. If there
1444 * are pending acknowledges, we wait here for them.
1445 */
1446 - flags = current->flags;
1447 + freezer_do_not_count();
1448
1449 wait_event(apm_suspend_waitqueue,
1450 as->suspend_state == SUSPEND_DONE);
1451 +
1452 + /*
1453 + * Since we are waiting until the suspend is done, the
1454 + * try_to_freeze() in freezer_count() will not trigger
1455 + */
1456 + freezer_count();
1457 } else {
1458 as->suspend_state = SUSPEND_WAIT;
1459 mutex_unlock(&state_lock);
1460 @@ -362,14 +367,10 @@ apm_ioctl(struct inode * inode, struct file *filp, u_int cmd, u_long arg)
1461 * Wait for the suspend/resume to complete. If there
1462 * are pending acknowledges, we wait here for them.
1463 */
1464 - flags = current->flags;
1465 -
1466 - wait_event_interruptible(apm_suspend_waitqueue,
1467 + wait_event_freezable(apm_suspend_waitqueue,
1468 as->suspend_state == SUSPEND_DONE);
1469 }
1470
1471 - current->flags = flags;
1472 -
1473 mutex_lock(&state_lock);
1474 err = as->suspend_result;
1475 as->suspend_state = SUSPEND_NONE;
1476 diff --git a/drivers/char/drm/drm_vm.c b/drivers/char/drm/drm_vm.c
1477 index 68e36e5..caa0bce 100644
1478 --- a/drivers/char/drm/drm_vm.c
1479 +++ b/drivers/char/drm/drm_vm.c
1480 @@ -506,6 +506,7 @@ static int drm_mmap_dma(struct file *filp, struct vm_area_struct *vma)
1481 vma->vm_ops = &drm_vm_dma_ops;
1482
1483 vma->vm_flags |= VM_RESERVED; /* Don't swap */
1484 + vma->vm_flags |= VM_DONTEXPAND;
1485
1486 vma->vm_file = filp; /* Needed for drm_vm_open() */
1487 drm_vm_open_locked(vma);
1488 @@ -655,6 +656,7 @@ static int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma)
1489 return -EINVAL; /* This should never happen. */
1490 }
1491 vma->vm_flags |= VM_RESERVED; /* Don't swap */
1492 + vma->vm_flags |= VM_DONTEXPAND;
1493
1494 vma->vm_file = filp; /* Needed for drm_vm_open() */
1495 drm_vm_open_locked(vma);
1496 diff --git a/drivers/char/mspec.c b/drivers/char/mspec.c
1497 index 04ac155..ada142a 100644
1498 --- a/drivers/char/mspec.c
1499 +++ b/drivers/char/mspec.c
1500 @@ -283,7 +283,7 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma,
1501 vdata->refcnt = ATOMIC_INIT(1);
1502 vma->vm_private_data = vdata;
1503
1504 - vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP);
1505 + vma->vm_flags |= (VM_IO | VM_RESERVED | VM_PFNMAP | VM_DONTEXPAND);
1506 if (vdata->type == MSPEC_FETCHOP || vdata->type == MSPEC_UNCACHED)
1507 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
1508 vma->vm_ops = &mspec_vm_ops;
1509 diff --git a/drivers/char/tty_ioctl.c b/drivers/char/tty_ioctl.c
1510 index 3ee73cf..d08c301 100644
1511 --- a/drivers/char/tty_ioctl.c
1512 +++ b/drivers/char/tty_ioctl.c
1513 @@ -62,7 +62,7 @@ void tty_wait_until_sent(struct tty_struct * tty, long timeout)
1514 if (!timeout)
1515 timeout = MAX_SCHEDULE_TIMEOUT;
1516 if (wait_event_interruptible_timeout(tty->write_wait,
1517 - !tty->driver->chars_in_buffer(tty), timeout))
1518 + !tty->driver->chars_in_buffer(tty), timeout) < 0)
1519 return;
1520 if (tty->driver->wait_until_sent)
1521 tty->driver->wait_until_sent(tty, timeout);
1522 diff --git a/drivers/connector/cn_queue.c b/drivers/connector/cn_queue.c
1523 index 296f510..12ceed5 100644
1524 --- a/drivers/connector/cn_queue.c
1525 +++ b/drivers/connector/cn_queue.c
1526 @@ -99,8 +99,8 @@ int cn_queue_add_callback(struct cn_queue_dev *dev, char *name, struct cb_id *id
1527 spin_unlock_bh(&dev->queue_lock);
1528
1529 if (found) {
1530 - atomic_dec(&dev->refcnt);
1531 cn_queue_free_callback(cbq);
1532 + atomic_dec(&dev->refcnt);
1533 return -EINVAL;
1534 }
1535
1536 diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c
1537 index d4501dc..e9a23a4 100644
1538 --- a/drivers/crypto/padlock-aes.c
1539 +++ b/drivers/crypto/padlock-aes.c
1540 @@ -419,13 +419,58 @@ static int aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
1541 /* ====== Encryption/decryption routines ====== */
1542
1543 /* These are the real call to PadLock. */
1544 +static inline void padlock_xcrypt(const u8 *input, u8 *output, void *key,
1545 + void *control_word)
1546 +{
1547 + asm volatile (".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */
1548 + : "+S"(input), "+D"(output)
1549 + : "d"(control_word), "b"(key), "c"(1));
1550 +}
1551 +
1552 +static void aes_crypt_copy(const u8 *in, u8 *out, u32 *key, struct cword *cword)
1553 +{
1554 + u8 buf[AES_BLOCK_SIZE * 2 + PADLOCK_ALIGNMENT - 1];
1555 + u8 *tmp = PTR_ALIGN(&buf[0], PADLOCK_ALIGNMENT);
1556 +
1557 + memcpy(tmp, in, AES_BLOCK_SIZE);
1558 + padlock_xcrypt(tmp, out, key, cword);
1559 +}
1560 +
1561 +static inline void aes_crypt(const u8 *in, u8 *out, u32 *key,
1562 + struct cword *cword)
1563 +{
1564 + asm volatile ("pushfl; popfl");
1565 +
1566 + /* padlock_xcrypt requires at least two blocks of data. */
1567 + if (unlikely(!(((unsigned long)in ^ (PAGE_SIZE - AES_BLOCK_SIZE)) &
1568 + (PAGE_SIZE - 1)))) {
1569 + aes_crypt_copy(in, out, key, cword);
1570 + return;
1571 + }
1572 +
1573 + padlock_xcrypt(in, out, key, cword);
1574 +}
1575 +
1576 static inline void padlock_xcrypt_ecb(const u8 *input, u8 *output, void *key,
1577 void *control_word, u32 count)
1578 {
1579 + if (count == 1) {
1580 + aes_crypt(input, output, key, control_word);
1581 + return;
1582 + }
1583 +
1584 asm volatile ("pushfl; popfl"); /* enforce key reload. */
1585 - asm volatile (".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */
1586 + asm volatile ("test $1, %%cl;"
1587 + "je 1f;"
1588 + "lea -1(%%ecx), %%eax;"
1589 + "mov $1, %%ecx;"
1590 + ".byte 0xf3,0x0f,0xa7,0xc8;" /* rep xcryptecb */
1591 + "mov %%eax, %%ecx;"
1592 + "1:"
1593 + ".byte 0xf3,0x0f,0xa7,0xc8" /* rep xcryptecb */
1594 : "+S"(input), "+D"(output)
1595 - : "d"(control_word), "b"(key), "c"(count));
1596 + : "d"(control_word), "b"(key), "c"(count)
1597 + : "ax");
1598 }
1599
1600 static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key,
1601 @@ -443,13 +488,13 @@ static inline u8 *padlock_xcrypt_cbc(const u8 *input, u8 *output, void *key,
1602 static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1603 {
1604 struct aes_ctx *ctx = aes_ctx(tfm);
1605 - padlock_xcrypt_ecb(in, out, ctx->E, &ctx->cword.encrypt, 1);
1606 + aes_crypt(in, out, ctx->E, &ctx->cword.encrypt);
1607 }
1608
1609 static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1610 {
1611 struct aes_ctx *ctx = aes_ctx(tfm);
1612 - padlock_xcrypt_ecb(in, out, ctx->D, &ctx->cword.decrypt, 1);
1613 + aes_crypt(in, out, ctx->D, &ctx->cword.decrypt);
1614 }
1615
1616 static struct crypto_alg aes_alg = {
1617 diff --git a/drivers/firmware/dmi-id.c b/drivers/firmware/dmi-id.c
1618 index 59c3b5a..ed0d030 100644
1619 --- a/drivers/firmware/dmi-id.c
1620 +++ b/drivers/firmware/dmi-id.c
1621 @@ -159,8 +159,6 @@ static struct device *dmi_dev;
1622 if (dmi_get_system_info(_field)) \
1623 sys_dmi_attributes[i++] = & sys_dmi_##_name##_attr.attr;
1624
1625 -extern int dmi_available;
1626 -
1627 static int __init dmi_id_init(void)
1628 {
1629 int ret, i;
1630 diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
1631 index f1c3d6c..27026f7 100644
1632 --- a/drivers/input/evdev.c
1633 +++ b/drivers/input/evdev.c
1634 @@ -30,6 +30,8 @@ struct evdev {
1635 wait_queue_head_t wait;
1636 struct evdev_client *grab;
1637 struct list_head client_list;
1638 + spinlock_t client_lock; /* protects client_list */
1639 + struct mutex mutex;
1640 struct device dev;
1641 };
1642
1643 @@ -37,39 +39,53 @@ struct evdev_client {
1644 struct input_event buffer[EVDEV_BUFFER_SIZE];
1645 int head;
1646 int tail;
1647 + spinlock_t buffer_lock; /* protects access to buffer, head and tail */
1648 struct fasync_struct *fasync;
1649 struct evdev *evdev;
1650 struct list_head node;
1651 };
1652
1653 static struct evdev *evdev_table[EVDEV_MINORS];
1654 +static DEFINE_MUTEX(evdev_table_mutex);
1655
1656 -static void evdev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
1657 +static void evdev_pass_event(struct evdev_client *client,
1658 + struct input_event *event)
1659 +{
1660 + /*
1661 + * Interrupts are disabled, just acquire the lock
1662 + */
1663 + spin_lock(&client->buffer_lock);
1664 + client->buffer[client->head++] = *event;
1665 + client->head &= EVDEV_BUFFER_SIZE - 1;
1666 + spin_unlock(&client->buffer_lock);
1667 +
1668 + kill_fasync(&client->fasync, SIGIO, POLL_IN);
1669 +}
1670 +
1671 +/*
1672 + * Pass incoming event to all connected clients. Note that we are
1673 + * caleld under a spinlock with interrupts off so we don't need
1674 + * to use rcu_read_lock() here. Writers will be using syncronize_sched()
1675 + * instead of synchrnoize_rcu().
1676 + */
1677 +static void evdev_event(struct input_handle *handle,
1678 + unsigned int type, unsigned int code, int value)
1679 {
1680 struct evdev *evdev = handle->private;
1681 struct evdev_client *client;
1682 + struct input_event event;
1683
1684 - if (evdev->grab) {
1685 - client = evdev->grab;
1686 -
1687 - do_gettimeofday(&client->buffer[client->head].time);
1688 - client->buffer[client->head].type = type;
1689 - client->buffer[client->head].code = code;
1690 - client->buffer[client->head].value = value;
1691 - client->head = (client->head + 1) & (EVDEV_BUFFER_SIZE - 1);
1692 -
1693 - kill_fasync(&client->fasync, SIGIO, POLL_IN);
1694 - } else
1695 - list_for_each_entry(client, &evdev->client_list, node) {
1696 -
1697 - do_gettimeofday(&client->buffer[client->head].time);
1698 - client->buffer[client->head].type = type;
1699 - client->buffer[client->head].code = code;
1700 - client->buffer[client->head].value = value;
1701 - client->head = (client->head + 1) & (EVDEV_BUFFER_SIZE - 1);
1702 + do_gettimeofday(&event.time);
1703 + event.type = type;
1704 + event.code = code;
1705 + event.value = value;
1706
1707 - kill_fasync(&client->fasync, SIGIO, POLL_IN);
1708 - }
1709 + client = rcu_dereference(evdev->grab);
1710 + if (client)
1711 + evdev_pass_event(client, &event);
1712 + else
1713 + list_for_each_entry_rcu(client, &evdev->client_list, node)
1714 + evdev_pass_event(client, &event);
1715
1716 wake_up_interruptible(&evdev->wait);
1717 }
1718 @@ -88,38 +104,145 @@ static int evdev_flush(struct file *file, fl_owner_t id)
1719 {
1720 struct evdev_client *client = file->private_data;
1721 struct evdev *evdev = client->evdev;
1722 + int retval;
1723 +
1724 + retval = mutex_lock_interruptible(&evdev->mutex);
1725 + if (retval)
1726 + return retval;
1727
1728 if (!evdev->exist)
1729 - return -ENODEV;
1730 + retval = -ENODEV;
1731 + else
1732 + retval = input_flush_device(&evdev->handle, file);
1733
1734 - return input_flush_device(&evdev->handle, file);
1735 + mutex_unlock(&evdev->mutex);
1736 + return retval;
1737 }
1738
1739 static void evdev_free(struct device *dev)
1740 {
1741 struct evdev *evdev = container_of(dev, struct evdev, dev);
1742
1743 - evdev_table[evdev->minor] = NULL;
1744 kfree(evdev);
1745 }
1746
1747 +/*
1748 + * Grabs an event device (along with underlying input device).
1749 + * This function is called with evdev->mutex taken.
1750 + */
1751 +static int evdev_grab(struct evdev *evdev, struct evdev_client *client)
1752 +{
1753 + int error;
1754 +
1755 + if (evdev->grab)
1756 + return -EBUSY;
1757 +
1758 + error = input_grab_device(&evdev->handle);
1759 + if (error)
1760 + return error;
1761 +
1762 + rcu_assign_pointer(evdev->grab, client);
1763 + /*
1764 + * We don't use synchronize_rcu() here because read-side
1765 + * critical section is protected by a spinlock instead
1766 + * of rcu_read_lock().
1767 + */
1768 + synchronize_sched();
1769 +
1770 + return 0;
1771 +}
1772 +
1773 +static int evdev_ungrab(struct evdev *evdev, struct evdev_client *client)
1774 +{
1775 + if (evdev->grab != client)
1776 + return -EINVAL;
1777 +
1778 + rcu_assign_pointer(evdev->grab, NULL);
1779 + synchronize_sched();
1780 + input_release_device(&evdev->handle);
1781 +
1782 + return 0;
1783 +}
1784 +
1785 +static void evdev_attach_client(struct evdev *evdev,
1786 + struct evdev_client *client)
1787 +{
1788 + spin_lock(&evdev->client_lock);
1789 + list_add_tail_rcu(&client->node, &evdev->client_list);
1790 + spin_unlock(&evdev->client_lock);
1791 + synchronize_sched();
1792 +}
1793 +
1794 +static void evdev_detach_client(struct evdev *evdev,
1795 + struct evdev_client *client)
1796 +{
1797 + spin_lock(&evdev->client_lock);
1798 + list_del_rcu(&client->node);
1799 + spin_unlock(&evdev->client_lock);
1800 + synchronize_sched();
1801 +}
1802 +
1803 +static int evdev_open_device(struct evdev *evdev)
1804 +{
1805 + int retval;
1806 +
1807 + retval = mutex_lock_interruptible(&evdev->mutex);
1808 + if (retval)
1809 + return retval;
1810 +
1811 + if (!evdev->exist)
1812 + retval = -ENODEV;
1813 + else if (!evdev->open++) {
1814 + retval = input_open_device(&evdev->handle);
1815 + if (retval)
1816 + evdev->open--;
1817 + }
1818 +
1819 + mutex_unlock(&evdev->mutex);
1820 + return retval;
1821 +}
1822 +
1823 +static void evdev_close_device(struct evdev *evdev)
1824 +{
1825 + mutex_lock(&evdev->mutex);
1826 +
1827 + if (evdev->exist && !--evdev->open)
1828 + input_close_device(&evdev->handle);
1829 +
1830 + mutex_unlock(&evdev->mutex);
1831 +}
1832 +
1833 +/*
1834 + * Wake up users waiting for IO so they can disconnect from
1835 + * dead device.
1836 + */
1837 +static void evdev_hangup(struct evdev *evdev)
1838 +{
1839 + struct evdev_client *client;
1840 +
1841 + spin_lock(&evdev->client_lock);
1842 + list_for_each_entry(client, &evdev->client_list, node)
1843 + kill_fasync(&client->fasync, SIGIO, POLL_HUP);
1844 + spin_unlock(&evdev->client_lock);
1845 +
1846 + wake_up_interruptible(&evdev->wait);
1847 +}
1848 +
1849 static int evdev_release(struct inode *inode, struct file *file)
1850 {
1851 struct evdev_client *client = file->private_data;
1852 struct evdev *evdev = client->evdev;
1853
1854 - if (evdev->grab == client) {
1855 - input_release_device(&evdev->handle);
1856 - evdev->grab = NULL;
1857 - }
1858 + mutex_lock(&evdev->mutex);
1859 + if (evdev->grab == client)
1860 + evdev_ungrab(evdev, client);
1861 + mutex_unlock(&evdev->mutex);
1862
1863 evdev_fasync(-1, file, 0);
1864 - list_del(&client->node);
1865 + evdev_detach_client(evdev, client);
1866 kfree(client);
1867
1868 - if (!--evdev->open && evdev->exist)
1869 - input_close_device(&evdev->handle);
1870 -
1871 + evdev_close_device(evdev);
1872 put_device(&evdev->dev);
1873
1874 return 0;
1875 @@ -127,41 +250,44 @@ static int evdev_release(struct inode *inode, struct file *file)
1876
1877 static int evdev_open(struct inode *inode, struct file *file)
1878 {
1879 - struct evdev_client *client;
1880 struct evdev *evdev;
1881 + struct evdev_client *client;
1882 int i = iminor(inode) - EVDEV_MINOR_BASE;
1883 int error;
1884
1885 if (i >= EVDEV_MINORS)
1886 return -ENODEV;
1887
1888 + error = mutex_lock_interruptible(&evdev_table_mutex);
1889 + if (error)
1890 + return error;
1891 evdev = evdev_table[i];
1892 + if (evdev)
1893 + get_device(&evdev->dev);
1894 + mutex_unlock(&evdev_table_mutex);
1895
1896 - if (!evdev || !evdev->exist)
1897 + if (!evdev)
1898 return -ENODEV;
1899
1900 - get_device(&evdev->dev);
1901 -
1902 client = kzalloc(sizeof(struct evdev_client), GFP_KERNEL);
1903 if (!client) {
1904 error = -ENOMEM;
1905 goto err_put_evdev;
1906 }
1907
1908 + spin_lock_init(&client->buffer_lock);
1909 client->evdev = evdev;
1910 - list_add_tail(&client->node, &evdev->client_list);
1911 + evdev_attach_client(evdev, client);
1912
1913 - if (!evdev->open++ && evdev->exist) {
1914 - error = input_open_device(&evdev->handle);
1915 - if (error)
1916 - goto err_free_client;
1917 - }
1918 + error = evdev_open_device(evdev);
1919 + if (error)
1920 + goto err_free_client;
1921
1922 file->private_data = client;
1923 return 0;
1924
1925 err_free_client:
1926 - list_del(&client->node);
1927 + evdev_detach_client(evdev, client);
1928 kfree(client);
1929 err_put_evdev:
1930 put_device(&evdev->dev);
1931 @@ -197,12 +323,14 @@ static inline size_t evdev_event_size(void)
1932 sizeof(struct input_event_compat) : sizeof(struct input_event);
1933 }
1934
1935 -static int evdev_event_from_user(const char __user *buffer, struct input_event *event)
1936 +static int evdev_event_from_user(const char __user *buffer,
1937 + struct input_event *event)
1938 {
1939 if (COMPAT_TEST) {
1940 struct input_event_compat compat_event;
1941
1942 - if (copy_from_user(&compat_event, buffer, sizeof(struct input_event_compat)))
1943 + if (copy_from_user(&compat_event, buffer,
1944 + sizeof(struct input_event_compat)))
1945 return -EFAULT;
1946
1947 event->time.tv_sec = compat_event.time.tv_sec;
1948 @@ -219,7 +347,8 @@ static int evdev_event_from_user(const char __user *buffer, struct input_event *
1949 return 0;
1950 }
1951
1952 -static int evdev_event_to_user(char __user *buffer, const struct input_event *event)
1953 +static int evdev_event_to_user(char __user *buffer,
1954 + const struct input_event *event)
1955 {
1956 if (COMPAT_TEST) {
1957 struct input_event_compat compat_event;
1958 @@ -230,7 +359,8 @@ static int evdev_event_to_user(char __user *buffer, const struct input_event *ev
1959 compat_event.code = event->code;
1960 compat_event.value = event->value;
1961
1962 - if (copy_to_user(buffer, &compat_event, sizeof(struct input_event_compat)))
1963 + if (copy_to_user(buffer, &compat_event,
1964 + sizeof(struct input_event_compat)))
1965 return -EFAULT;
1966
1967 } else {
1968 @@ -248,7 +378,8 @@ static inline size_t evdev_event_size(void)
1969 return sizeof(struct input_event);
1970 }
1971
1972 -static int evdev_event_from_user(const char __user *buffer, struct input_event *event)
1973 +static int evdev_event_from_user(const char __user *buffer,
1974 + struct input_event *event)
1975 {
1976 if (copy_from_user(event, buffer, sizeof(struct input_event)))
1977 return -EFAULT;
1978 @@ -256,7 +387,8 @@ static int evdev_event_from_user(const char __user *buffer, struct input_event *
1979 return 0;
1980 }
1981
1982 -static int evdev_event_to_user(char __user *buffer, const struct input_event *event)
1983 +static int evdev_event_to_user(char __user *buffer,
1984 + const struct input_event *event)
1985 {
1986 if (copy_to_user(buffer, event, sizeof(struct input_event)))
1987 return -EFAULT;
1988 @@ -266,37 +398,71 @@ static int evdev_event_to_user(char __user *buffer, const struct input_event *ev
1989
1990 #endif /* CONFIG_COMPAT */
1991
1992 -static ssize_t evdev_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
1993 +static ssize_t evdev_write(struct file *file, const char __user *buffer,
1994 + size_t count, loff_t *ppos)
1995 {
1996 struct evdev_client *client = file->private_data;
1997 struct evdev *evdev = client->evdev;
1998 struct input_event event;
1999 - int retval = 0;
2000 + int retval;
2001
2002 - if (!evdev->exist)
2003 - return -ENODEV;
2004 + retval = mutex_lock_interruptible(&evdev->mutex);
2005 + if (retval)
2006 + return retval;
2007 +
2008 + if (!evdev->exist) {
2009 + retval = -ENODEV;
2010 + goto out;
2011 + }
2012
2013 while (retval < count) {
2014
2015 - if (evdev_event_from_user(buffer + retval, &event))
2016 - return -EFAULT;
2017 - input_inject_event(&evdev->handle, event.type, event.code, event.value);
2018 + if (evdev_event_from_user(buffer + retval, &event)) {
2019 + retval = -EFAULT;
2020 + goto out;
2021 + }
2022 +
2023 + input_inject_event(&evdev->handle,
2024 + event.type, event.code, event.value);
2025 retval += evdev_event_size();
2026 }
2027
2028 + out:
2029 + mutex_unlock(&evdev->mutex);
2030 return retval;
2031 }
2032
2033 -static ssize_t evdev_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
2034 +static int evdev_fetch_next_event(struct evdev_client *client,
2035 + struct input_event *event)
2036 +{
2037 + int have_event;
2038 +
2039 + spin_lock_irq(&client->buffer_lock);
2040 +
2041 + have_event = client->head != client->tail;
2042 + if (have_event) {
2043 + *event = client->buffer[client->tail++];
2044 + client->tail &= EVDEV_BUFFER_SIZE - 1;
2045 + }
2046 +
2047 + spin_unlock_irq(&client->buffer_lock);
2048 +
2049 + return have_event;
2050 +}
2051 +
2052 +static ssize_t evdev_read(struct file *file, char __user *buffer,
2053 + size_t count, loff_t *ppos)
2054 {
2055 struct evdev_client *client = file->private_data;
2056 struct evdev *evdev = client->evdev;
2057 + struct input_event event;
2058 int retval;
2059
2060 if (count < evdev_event_size())
2061 return -EINVAL;
2062
2063 - if (client->head == client->tail && evdev->exist && (file->f_flags & O_NONBLOCK))
2064 + if (client->head == client->tail && evdev->exist &&
2065 + (file->f_flags & O_NONBLOCK))
2066 return -EAGAIN;
2067
2068 retval = wait_event_interruptible(evdev->wait,
2069 @@ -307,14 +473,12 @@ static ssize_t evdev_read(struct file *file, char __user *buffer, size_t count,
2070 if (!evdev->exist)
2071 return -ENODEV;
2072
2073 - while (client->head != client->tail && retval + evdev_event_size() <= count) {
2074 + while (retval + evdev_event_size() <= count &&
2075 + evdev_fetch_next_event(client, &event)) {
2076
2077 - struct input_event *event = (struct input_event *) client->buffer + client->tail;
2078 -
2079 - if (evdev_event_to_user(buffer + retval, event))
2080 + if (evdev_event_to_user(buffer + retval, &event))
2081 return -EFAULT;
2082
2083 - client->tail = (client->tail + 1) & (EVDEV_BUFFER_SIZE - 1);
2084 retval += evdev_event_size();
2085 }
2086
2087 @@ -409,8 +573,8 @@ static int str_to_user(const char *str, unsigned int maxlen, void __user *p)
2088 return copy_to_user(p, str, len) ? -EFAULT : len;
2089 }
2090
2091 -static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
2092 - void __user *p, int compat_mode)
2093 +static long evdev_do_ioctl(struct file *file, unsigned int cmd,
2094 + void __user *p, int compat_mode)
2095 {
2096 struct evdev_client *client = file->private_data;
2097 struct evdev *evdev = client->evdev;
2098 @@ -421,215 +585,289 @@ static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
2099 int i, t, u, v;
2100 int error;
2101
2102 - if (!evdev->exist)
2103 - return -ENODEV;
2104 -
2105 switch (cmd) {
2106
2107 - case EVIOCGVERSION:
2108 - return put_user(EV_VERSION, ip);
2109 + case EVIOCGVERSION:
2110 + return put_user(EV_VERSION, ip);
2111
2112 - case EVIOCGID:
2113 - if (copy_to_user(p, &dev->id, sizeof(struct input_id)))
2114 - return -EFAULT;
2115 - return 0;
2116 + case EVIOCGID:
2117 + if (copy_to_user(p, &dev->id, sizeof(struct input_id)))
2118 + return -EFAULT;
2119 + return 0;
2120
2121 - case EVIOCGREP:
2122 - if (!test_bit(EV_REP, dev->evbit))
2123 - return -ENOSYS;
2124 - if (put_user(dev->rep[REP_DELAY], ip))
2125 - return -EFAULT;
2126 - if (put_user(dev->rep[REP_PERIOD], ip + 1))
2127 - return -EFAULT;
2128 - return 0;
2129 + case EVIOCGREP:
2130 + if (!test_bit(EV_REP, dev->evbit))
2131 + return -ENOSYS;
2132 + if (put_user(dev->rep[REP_DELAY], ip))
2133 + return -EFAULT;
2134 + if (put_user(dev->rep[REP_PERIOD], ip + 1))
2135 + return -EFAULT;
2136 + return 0;
2137
2138 - case EVIOCSREP:
2139 - if (!test_bit(EV_REP, dev->evbit))
2140 - return -ENOSYS;
2141 - if (get_user(u, ip))
2142 - return -EFAULT;
2143 - if (get_user(v, ip + 1))
2144 - return -EFAULT;
2145 + case EVIOCSREP:
2146 + if (!test_bit(EV_REP, dev->evbit))
2147 + return -ENOSYS;
2148 + if (get_user(u, ip))
2149 + return -EFAULT;
2150 + if (get_user(v, ip + 1))
2151 + return -EFAULT;
2152
2153 - input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u);
2154 - input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v);
2155 + input_inject_event(&evdev->handle, EV_REP, REP_DELAY, u);
2156 + input_inject_event(&evdev->handle, EV_REP, REP_PERIOD, v);
2157
2158 - return 0;
2159 + return 0;
2160
2161 - case EVIOCGKEYCODE:
2162 - if (get_user(t, ip))
2163 - return -EFAULT;
2164 + case EVIOCGKEYCODE:
2165 + if (get_user(t, ip))
2166 + return -EFAULT;
2167
2168 - error = dev->getkeycode(dev, t, &v);
2169 - if (error)
2170 - return error;
2171 + error = dev->getkeycode(dev, t, &v);
2172 + if (error)
2173 + return error;
2174
2175 - if (put_user(v, ip + 1))
2176 - return -EFAULT;
2177 + if (put_user(v, ip + 1))
2178 + return -EFAULT;
2179
2180 - return 0;
2181 + return 0;
2182
2183 - case EVIOCSKEYCODE:
2184 - if (get_user(t, ip) || get_user(v, ip + 1))
2185 - return -EFAULT;
2186 + case EVIOCSKEYCODE:
2187 + if (get_user(t, ip) || get_user(v, ip + 1))
2188 + return -EFAULT;
2189
2190 - return dev->setkeycode(dev, t, v);
2191 + return dev->setkeycode(dev, t, v);
2192
2193 - case EVIOCSFF:
2194 - if (copy_from_user(&effect, p, sizeof(effect)))
2195 - return -EFAULT;
2196 + case EVIOCSFF:
2197 + if (copy_from_user(&effect, p, sizeof(effect)))
2198 + return -EFAULT;
2199
2200 - error = input_ff_upload(dev, &effect, file);
2201 + error = input_ff_upload(dev, &effect, file);
2202
2203 - if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
2204 - return -EFAULT;
2205 + if (put_user(effect.id, &(((struct ff_effect __user *)p)->id)))
2206 + return -EFAULT;
2207
2208 - return error;
2209 + return error;
2210
2211 - case EVIOCRMFF:
2212 - return input_ff_erase(dev, (int)(unsigned long) p, file);
2213 + case EVIOCRMFF:
2214 + return input_ff_erase(dev, (int)(unsigned long) p, file);
2215
2216 - case EVIOCGEFFECTS:
2217 - i = test_bit(EV_FF, dev->evbit) ? dev->ff->max_effects : 0;
2218 - if (put_user(i, ip))
2219 - return -EFAULT;
2220 - return 0;
2221 -
2222 - case EVIOCGRAB:
2223 - if (p) {
2224 - if (evdev->grab)
2225 - return -EBUSY;
2226 - if (input_grab_device(&evdev->handle))
2227 - return -EBUSY;
2228 - evdev->grab = client;
2229 - return 0;
2230 - } else {
2231 - if (evdev->grab != client)
2232 - return -EINVAL;
2233 - input_release_device(&evdev->handle);
2234 - evdev->grab = NULL;
2235 - return 0;
2236 - }
2237 + case EVIOCGEFFECTS:
2238 + i = test_bit(EV_FF, dev->evbit) ?
2239 + dev->ff->max_effects : 0;
2240 + if (put_user(i, ip))
2241 + return -EFAULT;
2242 + return 0;
2243
2244 - default:
2245 + case EVIOCGRAB:
2246 + if (p)
2247 + return evdev_grab(evdev, client);
2248 + else
2249 + return evdev_ungrab(evdev, client);
2250
2251 - if (_IOC_TYPE(cmd) != 'E')
2252 - return -EINVAL;
2253 + default:
2254
2255 - if (_IOC_DIR(cmd) == _IOC_READ) {
2256 + if (_IOC_TYPE(cmd) != 'E')
2257 + return -EINVAL;
2258
2259 - if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0,0))) {
2260 + if (_IOC_DIR(cmd) == _IOC_READ) {
2261
2262 - unsigned long *bits;
2263 - int len;
2264 + if ((_IOC_NR(cmd) & ~EV_MAX) == _IOC_NR(EVIOCGBIT(0, 0))) {
2265
2266 - switch (_IOC_NR(cmd) & EV_MAX) {
2267 - case 0: bits = dev->evbit; len = EV_MAX; break;
2268 - case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
2269 - case EV_REL: bits = dev->relbit; len = REL_MAX; break;
2270 - case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
2271 - case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
2272 - case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
2273 - case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
2274 - case EV_FF: bits = dev->ffbit; len = FF_MAX; break;
2275 - case EV_SW: bits = dev->swbit; len = SW_MAX; break;
2276 - default: return -EINVAL;
2277 - }
2278 - return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);
2279 - }
2280 + unsigned long *bits;
2281 + int len;
2282
2283 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))
2284 - return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),
2285 - p, compat_mode);
2286 + switch (_IOC_NR(cmd) & EV_MAX) {
2287
2288 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0)))
2289 - return bits_to_user(dev->led, LED_MAX, _IOC_SIZE(cmd),
2290 - p, compat_mode);
2291 + case 0: bits = dev->evbit; len = EV_MAX; break;
2292 + case EV_KEY: bits = dev->keybit; len = KEY_MAX; break;
2293 + case EV_REL: bits = dev->relbit; len = REL_MAX; break;
2294 + case EV_ABS: bits = dev->absbit; len = ABS_MAX; break;
2295 + case EV_MSC: bits = dev->mscbit; len = MSC_MAX; break;
2296 + case EV_LED: bits = dev->ledbit; len = LED_MAX; break;
2297 + case EV_SND: bits = dev->sndbit; len = SND_MAX; break;
2298 + case EV_FF: bits = dev->ffbit; len = FF_MAX; break;
2299 + case EV_SW: bits = dev->swbit; len = SW_MAX; break;
2300 + default: return -EINVAL;
2301 + }
2302 + return bits_to_user(bits, len, _IOC_SIZE(cmd), p, compat_mode);
2303 + }
2304
2305 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))
2306 - return bits_to_user(dev->snd, SND_MAX, _IOC_SIZE(cmd),
2307 - p, compat_mode);
2308 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGKEY(0)))
2309 + return bits_to_user(dev->key, KEY_MAX, _IOC_SIZE(cmd),
2310 + p, compat_mode);
2311
2312 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0)))
2313 - return bits_to_user(dev->sw, SW_MAX, _IOC_SIZE(cmd),
2314 - p, compat_mode);
2315 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGLED(0)))
2316 + return bits_to_user(dev->led, LED_MAX, _IOC_SIZE(cmd),
2317 + p, compat_mode);
2318
2319 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
2320 - return str_to_user(dev->name, _IOC_SIZE(cmd), p);
2321 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSND(0)))
2322 + return bits_to_user(dev->snd, SND_MAX, _IOC_SIZE(cmd),
2323 + p, compat_mode);
2324
2325 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
2326 - return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
2327 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGSW(0)))
2328 + return bits_to_user(dev->sw, SW_MAX, _IOC_SIZE(cmd),
2329 + p, compat_mode);
2330
2331 - if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0)))
2332 - return str_to_user(dev->uniq, _IOC_SIZE(cmd), p);
2333 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGNAME(0)))
2334 + return str_to_user(dev->name, _IOC_SIZE(cmd), p);
2335
2336 - if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {
2337 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGPHYS(0)))
2338 + return str_to_user(dev->phys, _IOC_SIZE(cmd), p);
2339
2340 - t = _IOC_NR(cmd) & ABS_MAX;
2341 + if (_IOC_NR(cmd) == _IOC_NR(EVIOCGUNIQ(0)))
2342 + return str_to_user(dev->uniq, _IOC_SIZE(cmd), p);
2343
2344 - abs.value = dev->abs[t];
2345 - abs.minimum = dev->absmin[t];
2346 - abs.maximum = dev->absmax[t];
2347 - abs.fuzz = dev->absfuzz[t];
2348 - abs.flat = dev->absflat[t];
2349 + if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCGABS(0))) {
2350
2351 - if (copy_to_user(p, &abs, sizeof(struct input_absinfo)))
2352 - return -EFAULT;
2353 + t = _IOC_NR(cmd) & ABS_MAX;
2354
2355 - return 0;
2356 - }
2357 + abs.value = dev->abs[t];
2358 + abs.minimum = dev->absmin[t];
2359 + abs.maximum = dev->absmax[t];
2360 + abs.fuzz = dev->absfuzz[t];
2361 + abs.flat = dev->absflat[t];
2362
2363 + if (copy_to_user(p, &abs, sizeof(struct input_absinfo)))
2364 + return -EFAULT;
2365 +
2366 + return 0;
2367 }
2368
2369 - if (_IOC_DIR(cmd) == _IOC_WRITE) {
2370 + }
2371
2372 - if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
2373 + if (_IOC_DIR(cmd) == _IOC_WRITE) {
2374
2375 - t = _IOC_NR(cmd) & ABS_MAX;
2376 + if ((_IOC_NR(cmd) & ~ABS_MAX) == _IOC_NR(EVIOCSABS(0))) {
2377
2378 - if (copy_from_user(&abs, p, sizeof(struct input_absinfo)))
2379 - return -EFAULT;
2380 + t = _IOC_NR(cmd) & ABS_MAX;
2381
2382 - dev->abs[t] = abs.value;
2383 - dev->absmin[t] = abs.minimum;
2384 - dev->absmax[t] = abs.maximum;
2385 - dev->absfuzz[t] = abs.fuzz;
2386 - dev->absflat[t] = abs.flat;
2387 + if (copy_from_user(&abs, p,
2388 + sizeof(struct input_absinfo)))
2389 + return -EFAULT;
2390
2391 - return 0;
2392 - }
2393 + /*
2394 + * Take event lock to ensure that we are not
2395 + * changing device parameters in the middle
2396 + * of event.
2397 + */
2398 + spin_lock_irq(&dev->event_lock);
2399 +
2400 + dev->abs[t] = abs.value;
2401 + dev->absmin[t] = abs.minimum;
2402 + dev->absmax[t] = abs.maximum;
2403 + dev->absfuzz[t] = abs.fuzz;
2404 + dev->absflat[t] = abs.flat;
2405 +
2406 + spin_unlock_irq(&dev->event_lock);
2407 +
2408 + return 0;
2409 }
2410 + }
2411 }
2412 return -EINVAL;
2413 }
2414
2415 +static long evdev_ioctl_handler(struct file *file, unsigned int cmd,
2416 + void __user *p, int compat_mode)
2417 +{
2418 + struct evdev_client *client = file->private_data;
2419 + struct evdev *evdev = client->evdev;
2420 + int retval;
2421 +
2422 + retval = mutex_lock_interruptible(&evdev->mutex);
2423 + if (retval)
2424 + return retval;
2425 +
2426 + if (!evdev->exist) {
2427 + retval = -ENODEV;
2428 + goto out;
2429 + }
2430 +
2431 + retval = evdev_do_ioctl(file, cmd, p, compat_mode);
2432 +
2433 + out:
2434 + mutex_unlock(&evdev->mutex);
2435 + return retval;
2436 +}
2437 +
2438 static long evdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
2439 {
2440 return evdev_ioctl_handler(file, cmd, (void __user *)arg, 0);
2441 }
2442
2443 #ifdef CONFIG_COMPAT
2444 -static long evdev_ioctl_compat(struct file *file, unsigned int cmd, unsigned long arg)
2445 +static long evdev_ioctl_compat(struct file *file,
2446 + unsigned int cmd, unsigned long arg)
2447 {
2448 return evdev_ioctl_handler(file, cmd, compat_ptr(arg), 1);
2449 }
2450 #endif
2451
2452 static const struct file_operations evdev_fops = {
2453 - .owner = THIS_MODULE,
2454 - .read = evdev_read,
2455 - .write = evdev_write,
2456 - .poll = evdev_poll,
2457 - .open = evdev_open,
2458 - .release = evdev_release,
2459 - .unlocked_ioctl = evdev_ioctl,
2460 + .owner = THIS_MODULE,
2461 + .read = evdev_read,
2462 + .write = evdev_write,
2463 + .poll = evdev_poll,
2464 + .open = evdev_open,
2465 + .release = evdev_release,
2466 + .unlocked_ioctl = evdev_ioctl,
2467 #ifdef CONFIG_COMPAT
2468 - .compat_ioctl = evdev_ioctl_compat,
2469 + .compat_ioctl = evdev_ioctl_compat,
2470 #endif
2471 - .fasync = evdev_fasync,
2472 - .flush = evdev_flush
2473 + .fasync = evdev_fasync,
2474 + .flush = evdev_flush
2475 };
2476
2477 +static int evdev_install_chrdev(struct evdev *evdev)
2478 +{
2479 + /*
2480 + * No need to do any locking here as calls to connect and
2481 + * disconnect are serialized by the input core
2482 + */
2483 + evdev_table[evdev->minor] = evdev;
2484 + return 0;
2485 +}
2486 +
2487 +static void evdev_remove_chrdev(struct evdev *evdev)
2488 +{
2489 + /*
2490 + * Lock evdev table to prevent race with evdev_open()
2491 + */
2492 + mutex_lock(&evdev_table_mutex);
2493 + evdev_table[evdev->minor] = NULL;
2494 + mutex_unlock(&evdev_table_mutex);
2495 +}
2496 +
2497 +/*
2498 + * Mark device non-existent. This disables writes, ioctls and
2499 + * prevents new users from opening the device. Already posted
2500 + * blocking reads will stay, however new ones will fail.
2501 + */
2502 +static void evdev_mark_dead(struct evdev *evdev)
2503 +{
2504 + mutex_lock(&evdev->mutex);
2505 + evdev->exist = 0;
2506 + mutex_unlock(&evdev->mutex);
2507 +}
2508 +
2509 +static void evdev_cleanup(struct evdev *evdev)
2510 +{
2511 + struct input_handle *handle = &evdev->handle;
2512 +
2513 + evdev_mark_dead(evdev);
2514 + evdev_hangup(evdev);
2515 + evdev_remove_chrdev(evdev);
2516 +
2517 + /* evdev is marked dead so no one else accesses evdev->open */
2518 + if (evdev->open) {
2519 + input_flush_device(handle, NULL);
2520 + input_close_device(handle);
2521 + }
2522 +}
2523 +
2524 +/*
2525 + * Create new evdev device. Note that input core serializes calls
2526 + * to connect and disconnect so we don't need to lock evdev_table here.
2527 + */
2528 static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
2529 const struct input_device_id *id)
2530 {
2531 @@ -637,7 +875,10 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
2532 int minor;
2533 int error;
2534
2535 - for (minor = 0; minor < EVDEV_MINORS && evdev_table[minor]; minor++);
2536 + for (minor = 0; minor < EVDEV_MINORS; minor++)
2537 + if (!evdev_table[minor])
2538 + break;
2539 +
2540 if (minor == EVDEV_MINORS) {
2541 printk(KERN_ERR "evdev: no more free evdev devices\n");
2542 return -ENFILE;
2543 @@ -648,38 +889,44 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
2544 return -ENOMEM;
2545
2546 INIT_LIST_HEAD(&evdev->client_list);
2547 + spin_lock_init(&evdev->client_lock);
2548 + mutex_init(&evdev->mutex);
2549 init_waitqueue_head(&evdev->wait);
2550
2551 + snprintf(evdev->name, sizeof(evdev->name), "event%d", minor);
2552 evdev->exist = 1;
2553 evdev->minor = minor;
2554 +
2555 evdev->handle.dev = dev;
2556 evdev->handle.name = evdev->name;
2557 evdev->handle.handler = handler;
2558 evdev->handle.private = evdev;
2559 - snprintf(evdev->name, sizeof(evdev->name), "event%d", minor);
2560
2561 - snprintf(evdev->dev.bus_id, sizeof(evdev->dev.bus_id),
2562 - "event%d", minor);
2563 + strlcpy(evdev->dev.bus_id, evdev->name, sizeof(evdev->dev.bus_id));
2564 + evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor);
2565 evdev->dev.class = &input_class;
2566 evdev->dev.parent = &dev->dev;
2567 - evdev->dev.devt = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor);
2568 evdev->dev.release = evdev_free;
2569 device_initialize(&evdev->dev);
2570
2571 - evdev_table[minor] = evdev;
2572 -
2573 - error = device_add(&evdev->dev);
2574 + error = input_register_handle(&evdev->handle);
2575 if (error)
2576 goto err_free_evdev;
2577
2578 - error = input_register_handle(&evdev->handle);
2579 + error = evdev_install_chrdev(evdev);
2580 + if (error)
2581 + goto err_unregister_handle;
2582 +
2583 + error = device_add(&evdev->dev);
2584 if (error)
2585 - goto err_delete_evdev;
2586 + goto err_cleanup_evdev;
2587
2588 return 0;
2589
2590 - err_delete_evdev:
2591 - device_del(&evdev->dev);
2592 + err_cleanup_evdev:
2593 + evdev_cleanup(evdev);
2594 + err_unregister_handle:
2595 + input_unregister_handle(&evdev->handle);
2596 err_free_evdev:
2597 put_device(&evdev->dev);
2598 return error;
2599 @@ -688,21 +935,10 @@ static int evdev_connect(struct input_handler *handler, struct input_dev *dev,
2600 static void evdev_disconnect(struct input_handle *handle)
2601 {
2602 struct evdev *evdev = handle->private;
2603 - struct evdev_client *client;
2604
2605 - input_unregister_handle(handle);
2606 device_del(&evdev->dev);
2607 -
2608 - evdev->exist = 0;
2609 -
2610 - if (evdev->open) {
2611 - input_flush_device(handle, NULL);
2612 - input_close_device(handle);
2613 - list_for_each_entry(client, &evdev->client_list, node)
2614 - kill_fasync(&client->fasync, SIGIO, POLL_HUP);
2615 - wake_up_interruptible(&evdev->wait);
2616 - }
2617 -
2618 + evdev_cleanup(evdev);
2619 + input_unregister_handle(handle);
2620 put_device(&evdev->dev);
2621 }
2622
2623 @@ -714,13 +950,13 @@ static const struct input_device_id evdev_ids[] = {
2624 MODULE_DEVICE_TABLE(input, evdev_ids);
2625
2626 static struct input_handler evdev_handler = {
2627 - .event = evdev_event,
2628 - .connect = evdev_connect,
2629 - .disconnect = evdev_disconnect,
2630 - .fops = &evdev_fops,
2631 - .minor = EVDEV_MINOR_BASE,
2632 - .name = "evdev",
2633 - .id_table = evdev_ids,
2634 + .event = evdev_event,
2635 + .connect = evdev_connect,
2636 + .disconnect = evdev_disconnect,
2637 + .fops = &evdev_fops,
2638 + .minor = EVDEV_MINOR_BASE,
2639 + .name = "evdev",
2640 + .id_table = evdev_ids,
2641 };
2642
2643 static int __init evdev_init(void)
2644 diff --git a/drivers/input/input.c b/drivers/input/input.c
2645 index 5fe7555..c59544f 100644
2646 --- a/drivers/input/input.c
2647 +++ b/drivers/input/input.c
2648 @@ -17,10 +17,10 @@
2649 #include <linux/major.h>
2650 #include <linux/proc_fs.h>
2651 #include <linux/seq_file.h>
2652 -#include <linux/interrupt.h>
2653 #include <linux/poll.h>
2654 #include <linux/device.h>
2655 #include <linux/mutex.h>
2656 +#include <linux/rcupdate.h>
2657
2658 MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
2659 MODULE_DESCRIPTION("Input core");
2660 @@ -31,167 +31,244 @@ MODULE_LICENSE("GPL");
2661 static LIST_HEAD(input_dev_list);
2662 static LIST_HEAD(input_handler_list);
2663
2664 +/*
2665 + * input_mutex protects access to both input_dev_list and input_handler_list.
2666 + * This also causes input_[un]register_device and input_[un]register_handler
2667 + * be mutually exclusive which simplifies locking in drivers implementing
2668 + * input handlers.
2669 + */
2670 +static DEFINE_MUTEX(input_mutex);
2671 +
2672 static struct input_handler *input_table[8];
2673
2674 -/**
2675 - * input_event() - report new input event
2676 - * @dev: device that generated the event
2677 - * @type: type of the event
2678 - * @code: event code
2679 - * @value: value of the event
2680 - *
2681 - * This function should be used by drivers implementing various input devices
2682 - * See also input_inject_event()
2683 - */
2684 -void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
2685 +static inline int is_event_supported(unsigned int code,
2686 + unsigned long *bm, unsigned int max)
2687 {
2688 - struct input_handle *handle;
2689 + return code <= max && test_bit(code, bm);
2690 +}
2691
2692 - if (type > EV_MAX || !test_bit(type, dev->evbit))
2693 - return;
2694 +static int input_defuzz_abs_event(int value, int old_val, int fuzz)
2695 +{
2696 + if (fuzz) {
2697 + if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2)
2698 + return old_val;
2699
2700 - add_input_randomness(type, code, value);
2701 + if (value > old_val - fuzz && value < old_val + fuzz)
2702 + return (old_val * 3 + value) / 4;
2703
2704 - switch (type) {
2705 + if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2)
2706 + return (old_val + value) / 2;
2707 + }
2708
2709 - case EV_SYN:
2710 - switch (code) {
2711 - case SYN_CONFIG:
2712 - if (dev->event)
2713 - dev->event(dev, type, code, value);
2714 - break;
2715 -
2716 - case SYN_REPORT:
2717 - if (dev->sync)
2718 - return;
2719 - dev->sync = 1;
2720 - break;
2721 - }
2722 - break;
2723 + return value;
2724 +}
2725
2726 - case EV_KEY:
2727 +/*
2728 + * Pass event through all open handles. This function is called with
2729 + * dev->event_lock held and interrupts disabled. Because of that we
2730 + * do not need to use rcu_read_lock() here although we are using RCU
2731 + * to access handle list. Note that because of that write-side uses
2732 + * synchronize_sched() instead of synchronize_ru().
2733 + */
2734 +static void input_pass_event(struct input_dev *dev,
2735 + unsigned int type, unsigned int code, int value)
2736 +{
2737 + struct input_handle *handle = rcu_dereference(dev->grab);
2738
2739 - if (code > KEY_MAX || !test_bit(code, dev->keybit) || !!test_bit(code, dev->key) == value)
2740 - return;
2741 + if (handle)
2742 + handle->handler->event(handle, type, code, value);
2743 + else
2744 + list_for_each_entry_rcu(handle, &dev->h_list, d_node)
2745 + if (handle->open)
2746 + handle->handler->event(handle,
2747 + type, code, value);
2748 +}
2749
2750 - if (value == 2)
2751 - break;
2752 +/*
2753 + * Generate software autorepeat event. Note that we take
2754 + * dev->event_lock here to avoid racing with input_event
2755 + * which may cause keys get "stuck".
2756 + */
2757 +static void input_repeat_key(unsigned long data)
2758 +{
2759 + struct input_dev *dev = (void *) data;
2760 + unsigned long flags;
2761
2762 - change_bit(code, dev->key);
2763 + spin_lock_irqsave(&dev->event_lock, flags);
2764
2765 - if (test_bit(EV_REP, dev->evbit) && dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] && dev->timer.data && value) {
2766 - dev->repeat_key = code;
2767 - mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
2768 - }
2769 + if (test_bit(dev->repeat_key, dev->key) &&
2770 + is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) {
2771
2772 - break;
2773 + input_pass_event(dev, EV_KEY, dev->repeat_key, 2);
2774
2775 - case EV_SW:
2776 + if (dev->sync) {
2777 + /*
2778 + * Only send SYN_REPORT if we are not in a middle
2779 + * of driver parsing a new hardware packet.
2780 + * Otherwise assume that the driver will send
2781 + * SYN_REPORT once it's done.
2782 + */
2783 + input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
2784 + }
2785
2786 - if (code > SW_MAX || !test_bit(code, dev->swbit) || !!test_bit(code, dev->sw) == value)
2787 - return;
2788 + if (dev->rep[REP_PERIOD])
2789 + mod_timer(&dev->timer, jiffies +
2790 + msecs_to_jiffies(dev->rep[REP_PERIOD]));
2791 + }
2792
2793 - change_bit(code, dev->sw);
2794 + spin_unlock_irqrestore(&dev->event_lock, flags);
2795 +}
2796
2797 - break;
2798 +static void input_start_autorepeat(struct input_dev *dev, int code)
2799 +{
2800 + if (test_bit(EV_REP, dev->evbit) &&
2801 + dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] &&
2802 + dev->timer.data) {
2803 + dev->repeat_key = code;
2804 + mod_timer(&dev->timer,
2805 + jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
2806 + }
2807 +}
2808
2809 - case EV_ABS:
2810 +#define INPUT_IGNORE_EVENT 0
2811 +#define INPUT_PASS_TO_HANDLERS 1
2812 +#define INPUT_PASS_TO_DEVICE 2
2813 +#define INPUT_PASS_TO_ALL (INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE)
2814
2815 - if (code > ABS_MAX || !test_bit(code, dev->absbit))
2816 - return;
2817 +static void input_handle_event(struct input_dev *dev,
2818 + unsigned int type, unsigned int code, int value)
2819 +{
2820 + int disposition = INPUT_IGNORE_EVENT;
2821
2822 - if (dev->absfuzz[code]) {
2823 - if ((value > dev->abs[code] - (dev->absfuzz[code] >> 1)) &&
2824 - (value < dev->abs[code] + (dev->absfuzz[code] >> 1)))
2825 - return;
2826 + switch (type) {
2827
2828 - if ((value > dev->abs[code] - dev->absfuzz[code]) &&
2829 - (value < dev->abs[code] + dev->absfuzz[code]))
2830 - value = (dev->abs[code] * 3 + value) >> 2;
2831 + case EV_SYN:
2832 + switch (code) {
2833 + case SYN_CONFIG:
2834 + disposition = INPUT_PASS_TO_ALL;
2835 + break;
2836
2837 - if ((value > dev->abs[code] - (dev->absfuzz[code] << 1)) &&
2838 - (value < dev->abs[code] + (dev->absfuzz[code] << 1)))
2839 - value = (dev->abs[code] + value) >> 1;
2840 + case SYN_REPORT:
2841 + if (!dev->sync) {
2842 + dev->sync = 1;
2843 + disposition = INPUT_PASS_TO_HANDLERS;
2844 }
2845 -
2846 - if (dev->abs[code] == value)
2847 - return;
2848 -
2849 - dev->abs[code] = value;
2850 break;
2851 + }
2852 + break;
2853
2854 - case EV_REL:
2855 + case EV_KEY:
2856 + if (is_event_supported(code, dev->keybit, KEY_MAX) &&
2857 + !!test_bit(code, dev->key) != value) {
2858
2859 - if (code > REL_MAX || !test_bit(code, dev->relbit) || (value == 0))
2860 - return;
2861 + if (value != 2) {
2862 + __change_bit(code, dev->key);
2863 + if (value)
2864 + input_start_autorepeat(dev, code);
2865 + }
2866
2867 - break;
2868 + disposition = INPUT_PASS_TO_HANDLERS;
2869 + }
2870 + break;
2871
2872 - case EV_MSC:
2873 + case EV_SW:
2874 + if (is_event_supported(code, dev->swbit, SW_MAX) &&
2875 + !!test_bit(code, dev->sw) != value) {
2876
2877 - if (code > MSC_MAX || !test_bit(code, dev->mscbit))
2878 - return;
2879 + __change_bit(code, dev->sw);
2880 + disposition = INPUT_PASS_TO_HANDLERS;
2881 + }
2882 + break;
2883
2884 - if (dev->event)
2885 - dev->event(dev, type, code, value);
2886 + case EV_ABS:
2887 + if (is_event_supported(code, dev->absbit, ABS_MAX)) {
2888
2889 - break;
2890 + value = input_defuzz_abs_event(value,
2891 + dev->abs[code], dev->absfuzz[code]);
2892
2893 - case EV_LED:
2894 + if (dev->abs[code] != value) {
2895 + dev->abs[code] = value;
2896 + disposition = INPUT_PASS_TO_HANDLERS;
2897 + }
2898 + }
2899 + break;
2900
2901 - if (code > LED_MAX || !test_bit(code, dev->ledbit) || !!test_bit(code, dev->led) == value)
2902 - return;
2903 + case EV_REL:
2904 + if (is_event_supported(code, dev->relbit, REL_MAX) && value)
2905 + disposition = INPUT_PASS_TO_HANDLERS;
2906
2907 - change_bit(code, dev->led);
2908 + break;
2909
2910 - if (dev->event)
2911 - dev->event(dev, type, code, value);
2912 + case EV_MSC:
2913 + if (is_event_supported(code, dev->mscbit, MSC_MAX))
2914 + disposition = INPUT_PASS_TO_ALL;
2915
2916 - break;
2917 + break;
2918 +
2919 + case EV_LED:
2920 + if (is_event_supported(code, dev->ledbit, LED_MAX) &&
2921 + !!test_bit(code, dev->led) != value) {
2922
2923 - case EV_SND:
2924 + __change_bit(code, dev->led);
2925 + disposition = INPUT_PASS_TO_ALL;
2926 + }
2927 + break;
2928
2929 - if (code > SND_MAX || !test_bit(code, dev->sndbit))
2930 - return;
2931 + case EV_SND:
2932 + if (is_event_supported(code, dev->sndbit, SND_MAX)) {
2933
2934 if (!!test_bit(code, dev->snd) != !!value)
2935 - change_bit(code, dev->snd);
2936 + __change_bit(code, dev->snd);
2937 + disposition = INPUT_PASS_TO_ALL;
2938 + }
2939 + break;
2940
2941 - if (dev->event)
2942 - dev->event(dev, type, code, value);
2943 + case EV_REP:
2944 + if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
2945 + dev->rep[code] = value;
2946 + disposition = INPUT_PASS_TO_ALL;
2947 + }
2948 + break;
2949
2950 - break;
2951 + case EV_FF:
2952 + if (value >= 0)
2953 + disposition = INPUT_PASS_TO_ALL;
2954 + break;
2955 + }
2956
2957 - case EV_REP:
2958 + if (type != EV_SYN)
2959 + dev->sync = 0;
2960
2961 - if (code > REP_MAX || value < 0 || dev->rep[code] == value)
2962 - return;
2963 + if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
2964 + dev->event(dev, type, code, value);
2965
2966 - dev->rep[code] = value;
2967 - if (dev->event)
2968 - dev->event(dev, type, code, value);
2969 + if (disposition & INPUT_PASS_TO_HANDLERS)
2970 + input_pass_event(dev, type, code, value);
2971 +}
2972
2973 - break;
2974 +/**
2975 + * input_event() - report new input event
2976 + * @dev: device that generated the event
2977 + * @type: type of the event
2978 + * @code: event code
2979 + * @value: value of the event
2980 + *
2981 + * This function should be used by drivers implementing various input
2982 + * devices. See also input_inject_event().
2983 + */
2984
2985 - case EV_FF:
2986 +void input_event(struct input_dev *dev,
2987 + unsigned int type, unsigned int code, int value)
2988 +{
2989 + unsigned long flags;
2990
2991 - if (value < 0)
2992 - return;
2993 + if (is_event_supported(type, dev->evbit, EV_MAX)) {
2994
2995 - if (dev->event)
2996 - dev->event(dev, type, code, value);
2997 - break;
2998 + spin_lock_irqsave(&dev->event_lock, flags);
2999 + add_input_randomness(type, code, value);
3000 + input_handle_event(dev, type, code, value);
3001 + spin_unlock_irqrestore(&dev->event_lock, flags);
3002 }
3003 -
3004 - if (type != EV_SYN)
3005 - dev->sync = 0;
3006 -
3007 - if (dev->grab)
3008 - dev->grab->handler->event(dev->grab, type, code, value);
3009 - else
3010 - list_for_each_entry(handle, &dev->h_list, d_node)
3011 - if (handle->open)
3012 - handle->handler->event(handle, type, code, value);
3013 }
3014 EXPORT_SYMBOL(input_event);
3015
3016 @@ -202,102 +279,230 @@ EXPORT_SYMBOL(input_event);
3017 * @code: event code
3018 * @value: value of the event
3019 *
3020 - * Similar to input_event() but will ignore event if device is "grabbed" and handle
3021 - * injecting event is not the one that owns the device.
3022 + * Similar to input_event() but will ignore event if device is
3023 + * "grabbed" and handle injecting event is not the one that owns
3024 + * the device.
3025 */
3026 -void input_inject_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
3027 +void input_inject_event(struct input_handle *handle,
3028 + unsigned int type, unsigned int code, int value)
3029 {
3030 - if (!handle->dev->grab || handle->dev->grab == handle)
3031 - input_event(handle->dev, type, code, value);
3032 -}
3033 -EXPORT_SYMBOL(input_inject_event);
3034 -
3035 -static void input_repeat_key(unsigned long data)
3036 -{
3037 - struct input_dev *dev = (void *) data;
3038 + struct input_dev *dev = handle->dev;
3039 + struct input_handle *grab;
3040 + unsigned long flags;
3041
3042 - if (!test_bit(dev->repeat_key, dev->key))
3043 - return;
3044 + if (is_event_supported(type, dev->evbit, EV_MAX)) {
3045 + spin_lock_irqsave(&dev->event_lock, flags);
3046
3047 - input_event(dev, EV_KEY, dev->repeat_key, 2);
3048 - input_sync(dev);
3049 + grab = rcu_dereference(dev->grab);
3050 + if (!grab || grab == handle)
3051 + input_handle_event(dev, type, code, value);
3052
3053 - if (dev->rep[REP_PERIOD])
3054 - mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->rep[REP_PERIOD]));
3055 + spin_unlock_irqrestore(&dev->event_lock, flags);
3056 + }
3057 }
3058 +EXPORT_SYMBOL(input_inject_event);
3059
3060 +/**
3061 + * input_grab_device - grabs device for exclusive use
3062 + * @handle: input handle that wants to own the device
3063 + *
3064 + * When a device is grabbed by an input handle all events generated by
3065 + * the device are delivered only to this handle. Also events injected
3066 + * by other input handles are ignored while device is grabbed.
3067 + */
3068 int input_grab_device(struct input_handle *handle)
3069 {
3070 - if (handle->dev->grab)
3071 - return -EBUSY;
3072 + struct input_dev *dev = handle->dev;
3073 + int retval;
3074
3075 - handle->dev->grab = handle;
3076 - return 0;
3077 + retval = mutex_lock_interruptible(&dev->mutex);
3078 + if (retval)
3079 + return retval;
3080 +
3081 + if (dev->grab) {
3082 + retval = -EBUSY;
3083 + goto out;
3084 + }
3085 +
3086 + rcu_assign_pointer(dev->grab, handle);
3087 + /*
3088 + * Not using synchronize_rcu() because read-side is protected
3089 + * by a spinlock with interrupts off instead of rcu_read_lock().
3090 + */
3091 + synchronize_sched();
3092 +
3093 + out:
3094 + mutex_unlock(&dev->mutex);
3095 + return retval;
3096 }
3097 EXPORT_SYMBOL(input_grab_device);
3098
3099 -void input_release_device(struct input_handle *handle)
3100 +static void __input_release_device(struct input_handle *handle)
3101 {
3102 struct input_dev *dev = handle->dev;
3103
3104 if (dev->grab == handle) {
3105 - dev->grab = NULL;
3106 + rcu_assign_pointer(dev->grab, NULL);
3107 + /* Make sure input_pass_event() notices that grab is gone */
3108 + synchronize_sched();
3109
3110 list_for_each_entry(handle, &dev->h_list, d_node)
3111 - if (handle->handler->start)
3112 + if (handle->open && handle->handler->start)
3113 handle->handler->start(handle);
3114 }
3115 }
3116 +
3117 +/**
3118 + * input_release_device - release previously grabbed device
3119 + * @handle: input handle that owns the device
3120 + *
3121 + * Releases previously grabbed device so that other input handles can
3122 + * start receiving input events. Upon release all handlers attached
3123 + * to the device have their start() method called so they have a change
3124 + * to synchronize device state with the rest of the system.
3125 + */
3126 +void input_release_device(struct input_handle *handle)
3127 +{
3128 + struct input_dev *dev = handle->dev;
3129 +
3130 + mutex_lock(&dev->mutex);
3131 + __input_release_device(handle);
3132 + mutex_unlock(&dev->mutex);
3133 +}
3134 EXPORT_SYMBOL(input_release_device);
3135
3136 +/**
3137 + * input_open_device - open input device
3138 + * @handle: handle through which device is being accessed
3139 + *
3140 + * This function should be called by input handlers when they
3141 + * want to start receive events from given input device.
3142 + */
3143 int input_open_device(struct input_handle *handle)
3144 {
3145 struct input_dev *dev = handle->dev;
3146 - int err;
3147 + int retval;
3148
3149 - err = mutex_lock_interruptible(&dev->mutex);
3150 - if (err)
3151 - return err;
3152 + retval = mutex_lock_interruptible(&dev->mutex);
3153 + if (retval)
3154 + return retval;
3155 +
3156 + if (dev->going_away) {
3157 + retval = -ENODEV;
3158 + goto out;
3159 + }
3160
3161 handle->open++;
3162
3163 if (!dev->users++ && dev->open)
3164 - err = dev->open(dev);
3165 -
3166 - if (err)
3167 - handle->open--;
3168 + retval = dev->open(dev);
3169 +
3170 + if (retval) {
3171 + dev->users--;
3172 + if (!--handle->open) {
3173 + /*
3174 + * Make sure we are not delivering any more events
3175 + * through this handle
3176 + */
3177 + synchronize_sched();
3178 + }
3179 + }
3180
3181 + out:
3182 mutex_unlock(&dev->mutex);
3183 -
3184 - return err;
3185 + return retval;
3186 }
3187 EXPORT_SYMBOL(input_open_device);
3188
3189 -int input_flush_device(struct input_handle* handle, struct file* file)
3190 +int input_flush_device(struct input_handle *handle, struct file *file)
3191 {
3192 - if (handle->dev->flush)
3193 - return handle->dev->flush(handle->dev, file);
3194 + struct input_dev *dev = handle->dev;
3195 + int retval;
3196
3197 - return 0;
3198 + retval = mutex_lock_interruptible(&dev->mutex);
3199 + if (retval)
3200 + return retval;
3201 +
3202 + if (dev->flush)
3203 + retval = dev->flush(dev, file);
3204 +
3205 + mutex_unlock(&dev->mutex);
3206 + return retval;
3207 }
3208 EXPORT_SYMBOL(input_flush_device);
3209
3210 +/**
3211 + * input_close_device - close input device
3212 + * @handle: handle through which device is being accessed
3213 + *
3214 + * This function should be called by input handlers when they
3215 + * want to stop receive events from given input device.
3216 + */
3217 void input_close_device(struct input_handle *handle)
3218 {
3219 struct input_dev *dev = handle->dev;
3220
3221 - input_release_device(handle);
3222 -
3223 mutex_lock(&dev->mutex);
3224
3225 + __input_release_device(handle);
3226 +
3227 if (!--dev->users && dev->close)
3228 dev->close(dev);
3229 - handle->open--;
3230 +
3231 + if (!--handle->open) {
3232 + /*
3233 + * synchronize_sched() makes sure that input_pass_event()
3234 + * completed and that no more input events are delivered
3235 + * through this handle
3236 + */
3237 + synchronize_sched();
3238 + }
3239
3240 mutex_unlock(&dev->mutex);
3241 }
3242 EXPORT_SYMBOL(input_close_device);
3243
3244 +/*
3245 + * Prepare device for unregistering
3246 + */
3247 +static void input_disconnect_device(struct input_dev *dev)
3248 +{
3249 + struct input_handle *handle;
3250 + int code;
3251 +
3252 + /*
3253 + * Mark device as going away. Note that we take dev->mutex here
3254 + * not to protect access to dev->going_away but rather to ensure
3255 + * that there are no threads in the middle of input_open_device()
3256 + */
3257 + mutex_lock(&dev->mutex);
3258 + dev->going_away = 1;
3259 + mutex_unlock(&dev->mutex);
3260 +
3261 + spin_lock_irq(&dev->event_lock);
3262 +
3263 + /*
3264 + * Simulate keyup events for all pressed keys so that handlers
3265 + * are not left with "stuck" keys. The driver may continue
3266 + * generate events even after we done here but they will not
3267 + * reach any handlers.
3268 + */
3269 + if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) {
3270 + for (code = 0; code <= KEY_MAX; code++) {
3271 + if (is_event_supported(code, dev->keybit, KEY_MAX) &&
3272 + test_bit(code, dev->key)) {
3273 + input_pass_event(dev, EV_KEY, code, 0);
3274 + }
3275 + }
3276 + input_pass_event(dev, EV_SYN, SYN_REPORT, 1);
3277 + }
3278 +
3279 + list_for_each_entry(handle, &dev->h_list, d_node)
3280 + handle->open = 0;
3281 +
3282 + spin_unlock_irq(&dev->event_lock);
3283 +}
3284 +
3285 static int input_fetch_keycode(struct input_dev *dev, int scancode)
3286 {
3287 switch (dev->keycodesize) {
3288 @@ -473,7 +678,8 @@ static unsigned int input_proc_devices_poll(struct file *file, poll_table *wait)
3289
3290 static void *input_devices_seq_start(struct seq_file *seq, loff_t *pos)
3291 {
3292 - /* acquire lock here ... Yes, we do need locking, I knowi, I know... */
3293 + if (mutex_lock_interruptible(&input_mutex))
3294 + return NULL;
3295
3296 return seq_list_start(&input_dev_list, *pos);
3297 }
3298 @@ -485,7 +691,7 @@ static void *input_devices_seq_next(struct seq_file *seq, void *v, loff_t *pos)
3299
3300 static void input_devices_seq_stop(struct seq_file *seq, void *v)
3301 {
3302 - /* release lock here */
3303 + mutex_unlock(&input_mutex);
3304 }
3305
3306 static void input_seq_print_bitmap(struct seq_file *seq, const char *name,
3307 @@ -569,7 +775,9 @@ static const struct file_operations input_devices_fileops = {
3308
3309 static void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos)
3310 {
3311 - /* acquire lock here ... Yes, we do need locking, I knowi, I know... */
3312 + if (mutex_lock_interruptible(&input_mutex))
3313 + return NULL;
3314 +
3315 seq->private = (void *)(unsigned long)*pos;
3316 return seq_list_start(&input_handler_list, *pos);
3317 }
3318 @@ -582,7 +790,7 @@ static void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos)
3319
3320 static void input_handlers_seq_stop(struct seq_file *seq, void *v)
3321 {
3322 - /* release lock here */
3323 + mutex_unlock(&input_mutex);
3324 }
3325
3326 static int input_handlers_seq_show(struct seq_file *seq, void *v)
3327 @@ -1005,6 +1213,7 @@ struct input_dev *input_allocate_device(void)
3328 dev->dev.class = &input_class;
3329 device_initialize(&dev->dev);
3330 mutex_init(&dev->mutex);
3331 + spin_lock_init(&dev->event_lock);
3332 INIT_LIST_HEAD(&dev->h_list);
3333 INIT_LIST_HEAD(&dev->node);
3334
3335 @@ -1022,7 +1231,7 @@ EXPORT_SYMBOL(input_allocate_device);
3336 * This function should only be used if input_register_device()
3337 * was not called yet or if it failed. Once device was registered
3338 * use input_unregister_device() and memory will be freed once last
3339 - * refrence to the device is dropped.
3340 + * reference to the device is dropped.
3341 *
3342 * Device should be allocated by input_allocate_device().
3343 *
3344 @@ -1092,6 +1301,18 @@ void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int
3345 }
3346 EXPORT_SYMBOL(input_set_capability);
3347
3348 +/**
3349 + * input_register_device - register device with input core
3350 + * @dev: device to be registered
3351 + *
3352 + * This function registers device with input core. The device must be
3353 + * allocated with input_allocate_device() and all it's capabilities
3354 + * set up before registering.
3355 + * If function fails the device must be freed with input_free_device().
3356 + * Once device has been successfully registered it can be unregistered
3357 + * with input_unregister_device(); input_free_device() should not be
3358 + * called in this case.
3359 + */
3360 int input_register_device(struct input_dev *dev)
3361 {
3362 static atomic_t input_no = ATOMIC_INIT(0);
3363 @@ -1099,7 +1320,7 @@ int input_register_device(struct input_dev *dev)
3364 const char *path;
3365 int error;
3366
3367 - set_bit(EV_SYN, dev->evbit);
3368 + __set_bit(EV_SYN, dev->evbit);
3369
3370 /*
3371 * If delay and period are pre-set by the driver, then autorepeating
3372 @@ -1120,8 +1341,6 @@ int input_register_device(struct input_dev *dev)
3373 if (!dev->setkeycode)
3374 dev->setkeycode = input_default_setkeycode;
3375
3376 - list_add_tail(&dev->node, &input_dev_list);
3377 -
3378 snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
3379 "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1);
3380
3381 @@ -1137,49 +1356,79 @@ int input_register_device(struct input_dev *dev)
3382 dev->name ? dev->name : "Unspecified device", path ? path : "N/A");
3383 kfree(path);
3384
3385 + error = mutex_lock_interruptible(&input_mutex);
3386 + if (error) {
3387 + device_del(&dev->dev);
3388 + return error;
3389 + }
3390 +
3391 + list_add_tail(&dev->node, &input_dev_list);
3392 +
3393 list_for_each_entry(handler, &input_handler_list, node)
3394 input_attach_handler(dev, handler);
3395
3396 input_wakeup_procfs_readers();
3397
3398 + mutex_unlock(&input_mutex);
3399 +
3400 return 0;
3401 }
3402 EXPORT_SYMBOL(input_register_device);
3403
3404 +/**
3405 + * input_unregister_device - unregister previously registered device
3406 + * @dev: device to be unregistered
3407 + *
3408 + * This function unregisters an input device. Once device is unregistered
3409 + * the caller should not try to access it as it may get freed at any moment.
3410 + */
3411 void input_unregister_device(struct input_dev *dev)
3412 {
3413 struct input_handle *handle, *next;
3414 - int code;
3415
3416 - for (code = 0; code <= KEY_MAX; code++)
3417 - if (test_bit(code, dev->key))
3418 - input_report_key(dev, code, 0);
3419 - input_sync(dev);
3420 + input_disconnect_device(dev);
3421
3422 - del_timer_sync(&dev->timer);
3423 + mutex_lock(&input_mutex);
3424
3425 list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
3426 handle->handler->disconnect(handle);
3427 WARN_ON(!list_empty(&dev->h_list));
3428
3429 + del_timer_sync(&dev->timer);
3430 list_del_init(&dev->node);
3431
3432 - device_unregister(&dev->dev);
3433 -
3434 input_wakeup_procfs_readers();
3435 +
3436 + mutex_unlock(&input_mutex);
3437 +
3438 + device_unregister(&dev->dev);
3439 }
3440 EXPORT_SYMBOL(input_unregister_device);
3441
3442 +/**
3443 + * input_register_handler - register a new input handler
3444 + * @handler: handler to be registered
3445 + *
3446 + * This function registers a new input handler (interface) for input
3447 + * devices in the system and attaches it to all input devices that
3448 + * are compatible with the handler.
3449 + */
3450 int input_register_handler(struct input_handler *handler)
3451 {
3452 struct input_dev *dev;
3453 + int retval;
3454 +
3455 + retval = mutex_lock_interruptible(&input_mutex);
3456 + if (retval)
3457 + return retval;
3458
3459 INIT_LIST_HEAD(&handler->h_list);
3460
3461 if (handler->fops != NULL) {
3462 - if (input_table[handler->minor >> 5])
3463 - return -EBUSY;
3464 -
3465 + if (input_table[handler->minor >> 5]) {
3466 + retval = -EBUSY;
3467 + goto out;
3468 + }
3469 input_table[handler->minor >> 5] = handler;
3470 }
3471
3472 @@ -1189,14 +1438,26 @@ int input_register_handler(struct input_handler *handler)
3473 input_attach_handler(dev, handler);
3474
3475 input_wakeup_procfs_readers();
3476 - return 0;
3477 +
3478 + out:
3479 + mutex_unlock(&input_mutex);
3480 + return retval;
3481 }
3482 EXPORT_SYMBOL(input_register_handler);
3483
3484 +/**
3485 + * input_unregister_handler - unregisters an input handler
3486 + * @handler: handler to be unregistered
3487 + *
3488 + * This function disconnects a handler from its input devices and
3489 + * removes it from lists of known handlers.
3490 + */
3491 void input_unregister_handler(struct input_handler *handler)
3492 {
3493 struct input_handle *handle, *next;
3494
3495 + mutex_lock(&input_mutex);
3496 +
3497 list_for_each_entry_safe(handle, next, &handler->h_list, h_node)
3498 handler->disconnect(handle);
3499 WARN_ON(!list_empty(&handler->h_list));
3500 @@ -1207,14 +1468,50 @@ void input_unregister_handler(struct input_handler *handler)
3501 input_table[handler->minor >> 5] = NULL;
3502
3503 input_wakeup_procfs_readers();
3504 +
3505 + mutex_unlock(&input_mutex);
3506 }
3507 EXPORT_SYMBOL(input_unregister_handler);
3508
3509 +/**
3510 + * input_register_handle - register a new input handle
3511 + * @handle: handle to register
3512 + *
3513 + * This function puts a new input handle onto device's
3514 + * and handler's lists so that events can flow through
3515 + * it once it is opened using input_open_device().
3516 + *
3517 + * This function is supposed to be called from handler's
3518 + * connect() method.
3519 + */
3520 int input_register_handle(struct input_handle *handle)
3521 {
3522 struct input_handler *handler = handle->handler;
3523 + struct input_dev *dev = handle->dev;
3524 + int error;
3525 +
3526 + /*
3527 + * We take dev->mutex here to prevent race with
3528 + * input_release_device().
3529 + */
3530 + error = mutex_lock_interruptible(&dev->mutex);
3531 + if (error)
3532 + return error;
3533 + list_add_tail_rcu(&handle->d_node, &dev->h_list);
3534 + mutex_unlock(&dev->mutex);
3535 + /*
3536 + * We don't use synchronize_rcu() here because we rely
3537 + * on dev->event_lock to protect read-side critical
3538 + * section in input_pass_event().
3539 + */
3540 + synchronize_sched();
3541
3542 - list_add_tail(&handle->d_node, &handle->dev->h_list);
3543 + /*
3544 + * Since we are supposed to be called from ->connect()
3545 + * which is mutually exclusive with ->disconnect()
3546 + * we can't be racing with input_unregister_handle()
3547 + * and so separate lock is not needed here.
3548 + */
3549 list_add_tail(&handle->h_node, &handler->h_list);
3550
3551 if (handler->start)
3552 @@ -1224,10 +1521,29 @@ int input_register_handle(struct input_handle *handle)
3553 }
3554 EXPORT_SYMBOL(input_register_handle);
3555
3556 +/**
3557 + * input_unregister_handle - unregister an input handle
3558 + * @handle: handle to unregister
3559 + *
3560 + * This function removes input handle from device's
3561 + * and handler's lists.
3562 + *
3563 + * This function is supposed to be called from handler's
3564 + * disconnect() method.
3565 + */
3566 void input_unregister_handle(struct input_handle *handle)
3567 {
3568 + struct input_dev *dev = handle->dev;
3569 +
3570 list_del_init(&handle->h_node);
3571 - list_del_init(&handle->d_node);
3572 +
3573 + /*
3574 + * Take dev->mutex to prevent race with input_release_device().
3575 + */
3576 + mutex_lock(&dev->mutex);
3577 + list_del_rcu(&handle->d_node);
3578 + mutex_unlock(&dev->mutex);
3579 + synchronize_sched();
3580 }
3581 EXPORT_SYMBOL(input_unregister_handle);
3582
3583 diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c
3584 index a9a0180..f306c97 100644
3585 --- a/drivers/input/joydev.c
3586 +++ b/drivers/input/joydev.c
3587 @@ -43,6 +43,8 @@ struct joydev {
3588 struct input_handle handle;
3589 wait_queue_head_t wait;
3590 struct list_head client_list;
3591 + spinlock_t client_lock; /* protects client_list */
3592 + struct mutex mutex;
3593 struct device dev;
3594
3595 struct js_corr corr[ABS_MAX + 1];
3596 @@ -61,31 +63,61 @@ struct joydev_client {
3597 int head;
3598 int tail;
3599 int startup;
3600 + spinlock_t buffer_lock; /* protects access to buffer, head and tail */
3601 struct fasync_struct *fasync;
3602 struct joydev *joydev;
3603 struct list_head node;
3604 };
3605
3606 static struct joydev *joydev_table[JOYDEV_MINORS];
3607 +static DEFINE_MUTEX(joydev_table_mutex);
3608
3609 static int joydev_correct(int value, struct js_corr *corr)
3610 {
3611 switch (corr->type) {
3612 - case JS_CORR_NONE:
3613 - break;
3614 - case JS_CORR_BROKEN:
3615 - value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 :
3616 - ((corr->coef[3] * (value - corr->coef[1])) >> 14)) :
3617 - ((corr->coef[2] * (value - corr->coef[0])) >> 14);
3618 - break;
3619 - default:
3620 - return 0;
3621 +
3622 + case JS_CORR_NONE:
3623 + break;
3624 +
3625 + case JS_CORR_BROKEN:
3626 + value = value > corr->coef[0] ? (value < corr->coef[1] ? 0 :
3627 + ((corr->coef[3] * (value - corr->coef[1])) >> 14)) :
3628 + ((corr->coef[2] * (value - corr->coef[0])) >> 14);
3629 + break;
3630 +
3631 + default:
3632 + return 0;
3633 }
3634
3635 return value < -32767 ? -32767 : (value > 32767 ? 32767 : value);
3636 }
3637
3638 -static void joydev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
3639 +static void joydev_pass_event(struct joydev_client *client,
3640 + struct js_event *event)
3641 +{
3642 + struct joydev *joydev = client->joydev;
3643 +
3644 + /*
3645 + * IRQs already disabled, just acquire the lock
3646 + */
3647 + spin_lock(&client->buffer_lock);
3648 +
3649 + client->buffer[client->head] = *event;
3650 +
3651 + if (client->startup == joydev->nabs + joydev->nkey) {
3652 + client->head++;
3653 + client->head &= JOYDEV_BUFFER_SIZE - 1;
3654 + if (client->tail == client->head)
3655 + client->startup = 0;
3656 + }
3657 +
3658 + spin_unlock(&client->buffer_lock);
3659 +
3660 + kill_fasync(&client->fasync, SIGIO, POLL_IN);
3661 +}
3662 +
3663 +static void joydev_event(struct input_handle *handle,
3664 + unsigned int type, unsigned int code, int value)
3665 {
3666 struct joydev *joydev = handle->private;
3667 struct joydev_client *client;
3668 @@ -93,39 +125,32 @@ static void joydev_event(struct input_handle *handle, unsigned int type, unsigne
3669
3670 switch (type) {
3671
3672 - case EV_KEY:
3673 - if (code < BTN_MISC || value == 2)
3674 - return;
3675 - event.type = JS_EVENT_BUTTON;
3676 - event.number = joydev->keymap[code - BTN_MISC];
3677 - event.value = value;
3678 - break;
3679 -
3680 - case EV_ABS:
3681 - event.type = JS_EVENT_AXIS;
3682 - event.number = joydev->absmap[code];
3683 - event.value = joydev_correct(value, joydev->corr + event.number);
3684 - if (event.value == joydev->abs[event.number])
3685 - return;
3686 - joydev->abs[event.number] = event.value;
3687 - break;
3688 + case EV_KEY:
3689 + if (code < BTN_MISC || value == 2)
3690 + return;
3691 + event.type = JS_EVENT_BUTTON;
3692 + event.number = joydev->keymap[code - BTN_MISC];
3693 + event.value = value;
3694 + break;
3695
3696 - default:
3697 + case EV_ABS:
3698 + event.type = JS_EVENT_AXIS;
3699 + event.number = joydev->absmap[code];
3700 + event.value = joydev_correct(value,
3701 + &joydev->corr[event.number]);
3702 + if (event.value == joydev->abs[event.number])
3703 return;
3704 + joydev->abs[event.number] = event.value;
3705 + break;
3706 +
3707 + default:
3708 + return;
3709 }
3710
3711 event.time = jiffies_to_msecs(jiffies);
3712
3713 - list_for_each_entry(client, &joydev->client_list, node) {
3714 -
3715 - memcpy(client->buffer + client->head, &event, sizeof(struct js_event));
3716 -
3717 - if (client->startup == joydev->nabs + joydev->nkey)
3718 - if (client->tail == (client->head = (client->head + 1) & (JOYDEV_BUFFER_SIZE - 1)))
3719 - client->startup = 0;
3720 -
3721 - kill_fasync(&client->fasync, SIGIO, POLL_IN);
3722 - }
3723 + list_for_each_entry_rcu(client, &joydev->client_list, node)
3724 + joydev_pass_event(client, &event);
3725
3726 wake_up_interruptible(&joydev->wait);
3727 }
3728 @@ -144,23 +169,88 @@ static void joydev_free(struct device *dev)
3729 {
3730 struct joydev *joydev = container_of(dev, struct joydev, dev);
3731
3732 - joydev_table[joydev->minor] = NULL;
3733 kfree(joydev);
3734 }
3735
3736 +static void joydev_attach_client(struct joydev *joydev,
3737 + struct joydev_client *client)
3738 +{
3739 + spin_lock(&joydev->client_lock);
3740 + list_add_tail_rcu(&client->node, &joydev->client_list);
3741 + spin_unlock(&joydev->client_lock);
3742 + /*
3743 + * We don't use synchronize_rcu() here because read-side
3744 + * critical section is protected by a spinlock (dev->event_lock)
3745 + * instead of rcu_read_lock().
3746 + */
3747 + synchronize_sched();
3748 +}
3749 +
3750 +static void joydev_detach_client(struct joydev *joydev,
3751 + struct joydev_client *client)
3752 +{
3753 + spin_lock(&joydev->client_lock);
3754 + list_del_rcu(&client->node);
3755 + spin_unlock(&joydev->client_lock);
3756 + synchronize_sched();
3757 +}
3758 +
3759 +static int joydev_open_device(struct joydev *joydev)
3760 +{
3761 + int retval;
3762 +
3763 + retval = mutex_lock_interruptible(&joydev->mutex);
3764 + if (retval)
3765 + return retval;
3766 +
3767 + if (!joydev->exist)
3768 + retval = -ENODEV;
3769 + else if (!joydev->open++) {
3770 + retval = input_open_device(&joydev->handle);
3771 + if (retval)
3772 + joydev->open--;
3773 + }
3774 +
3775 + mutex_unlock(&joydev->mutex);
3776 + return retval;
3777 +}
3778 +
3779 +static void joydev_close_device(struct joydev *joydev)
3780 +{
3781 + mutex_lock(&joydev->mutex);
3782 +
3783 + if (joydev->exist && !--joydev->open)
3784 + input_close_device(&joydev->handle);
3785 +
3786 + mutex_unlock(&joydev->mutex);
3787 +}
3788 +
3789 +/*
3790 + * Wake up users waiting for IO so they can disconnect from
3791 + * dead device.
3792 + */
3793 +static void joydev_hangup(struct joydev *joydev)
3794 +{
3795 + struct joydev_client *client;
3796 +
3797 + spin_lock(&joydev->client_lock);
3798 + list_for_each_entry(client, &joydev->client_list, node)
3799 + kill_fasync(&client->fasync, SIGIO, POLL_HUP);
3800 + spin_unlock(&joydev->client_lock);
3801 +
3802 + wake_up_interruptible(&joydev->wait);
3803 +}
3804 +
3805 static int joydev_release(struct inode *inode, struct file *file)
3806 {
3807 struct joydev_client *client = file->private_data;
3808 struct joydev *joydev = client->joydev;
3809
3810 joydev_fasync(-1, file, 0);
3811 -
3812 - list_del(&client->node);
3813 + joydev_detach_client(joydev, client);
3814 kfree(client);
3815
3816 - if (!--joydev->open && joydev->exist)
3817 - input_close_device(&joydev->handle);
3818 -
3819 + joydev_close_device(joydev);
3820 put_device(&joydev->dev);
3821
3822 return 0;
3823 @@ -176,11 +266,16 @@ static int joydev_open(struct inode *inode, struct file *file)
3824 if (i >= JOYDEV_MINORS)
3825 return -ENODEV;
3826
3827 + error = mutex_lock_interruptible(&joydev_table_mutex);
3828 + if (error)
3829 + return error;
3830 joydev = joydev_table[i];
3831 - if (!joydev || !joydev->exist)
3832 - return -ENODEV;
3833 + if (joydev)
3834 + get_device(&joydev->dev);
3835 + mutex_unlock(&joydev_table_mutex);
3836
3837 - get_device(&joydev->dev);
3838 + if (!joydev)
3839 + return -ENODEV;
3840
3841 client = kzalloc(sizeof(struct joydev_client), GFP_KERNEL);
3842 if (!client) {
3843 @@ -188,37 +283,129 @@ static int joydev_open(struct inode *inode, struct file *file)
3844 goto err_put_joydev;
3845 }
3846
3847 + spin_lock_init(&client->buffer_lock);
3848 client->joydev = joydev;
3849 - list_add_tail(&client->node, &joydev->client_list);
3850 + joydev_attach_client(joydev, client);
3851
3852 - if (!joydev->open++ && joydev->exist) {
3853 - error = input_open_device(&joydev->handle);
3854 - if (error)
3855 - goto err_free_client;
3856 - }
3857 + error = joydev_open_device(joydev);
3858 + if (error)
3859 + goto err_free_client;
3860
3861 file->private_data = client;
3862 return 0;
3863
3864 err_free_client:
3865 - list_del(&client->node);
3866 + joydev_detach_client(joydev, client);
3867 kfree(client);
3868 err_put_joydev:
3869 put_device(&joydev->dev);
3870 return error;
3871 }
3872
3873 -static ssize_t joydev_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
3874 +static int joydev_generate_startup_event(struct joydev_client *client,
3875 + struct input_dev *input,
3876 + struct js_event *event)
3877 {
3878 - return -EINVAL;
3879 + struct joydev *joydev = client->joydev;
3880 + int have_event;
3881 +
3882 + spin_lock_irq(&client->buffer_lock);
3883 +
3884 + have_event = client->startup < joydev->nabs + joydev->nkey;
3885 +
3886 + if (have_event) {
3887 +
3888 + event->time = jiffies_to_msecs(jiffies);
3889 + if (client->startup < joydev->nkey) {
3890 + event->type = JS_EVENT_BUTTON | JS_EVENT_INIT;
3891 + event->number = client->startup;
3892 + event->value = !!test_bit(joydev->keypam[event->number],
3893 + input->key);
3894 + } else {
3895 + event->type = JS_EVENT_AXIS | JS_EVENT_INIT;
3896 + event->number = client->startup - joydev->nkey;
3897 + event->value = joydev->abs[event->number];
3898 + }
3899 + client->startup++;
3900 + }
3901 +
3902 + spin_unlock_irq(&client->buffer_lock);
3903 +
3904 + return have_event;
3905 +}
3906 +
3907 +static int joydev_fetch_next_event(struct joydev_client *client,
3908 + struct js_event *event)
3909 +{
3910 + int have_event;
3911 +
3912 + spin_lock_irq(&client->buffer_lock);
3913 +
3914 + have_event = client->head != client->tail;
3915 + if (have_event) {
3916 + *event = client->buffer[client->tail++];
3917 + client->tail &= JOYDEV_BUFFER_SIZE - 1;
3918 + }
3919 +
3920 + spin_unlock_irq(&client->buffer_lock);
3921 +
3922 + return have_event;
3923 +}
3924 +
3925 +/*
3926 + * Old joystick interface
3927 + */
3928 +static ssize_t joydev_0x_read(struct joydev_client *client,
3929 + struct input_dev *input,
3930 + char __user *buf)
3931 +{
3932 + struct joydev *joydev = client->joydev;
3933 + struct JS_DATA_TYPE data;
3934 + int i;
3935 +
3936 + spin_lock_irq(&input->event_lock);
3937 +
3938 + /*
3939 + * Get device state
3940 + */
3941 + for (data.buttons = i = 0; i < 32 && i < joydev->nkey; i++)
3942 + data.buttons |=
3943 + test_bit(joydev->keypam[i], input->key) ? (1 << i) : 0;
3944 + data.x = (joydev->abs[0] / 256 + 128) >> joydev->glue.JS_CORR.x;
3945 + data.y = (joydev->abs[1] / 256 + 128) >> joydev->glue.JS_CORR.y;
3946 +
3947 + /*
3948 + * Reset reader's event queue
3949 + */
3950 + spin_lock(&client->buffer_lock);
3951 + client->startup = 0;
3952 + client->tail = client->head;
3953 + spin_unlock(&client->buffer_lock);
3954 +
3955 + spin_unlock_irq(&input->event_lock);
3956 +
3957 + if (copy_to_user(buf, &data, sizeof(struct JS_DATA_TYPE)))
3958 + return -EFAULT;
3959 +
3960 + return sizeof(struct JS_DATA_TYPE);
3961 +}
3962 +
3963 +static inline int joydev_data_pending(struct joydev_client *client)
3964 +{
3965 + struct joydev *joydev = client->joydev;
3966 +
3967 + return client->startup < joydev->nabs + joydev->nkey ||
3968 + client->head != client->tail;
3969 }
3970
3971 -static ssize_t joydev_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
3972 +static ssize_t joydev_read(struct file *file, char __user *buf,
3973 + size_t count, loff_t *ppos)
3974 {
3975 struct joydev_client *client = file->private_data;
3976 struct joydev *joydev = client->joydev;
3977 struct input_dev *input = joydev->handle.dev;
3978 - int retval = 0;
3979 + struct js_event event;
3980 + int retval;
3981
3982 if (!joydev->exist)
3983 return -ENODEV;
3984 @@ -226,68 +413,35 @@ static ssize_t joydev_read(struct file *file, char __user *buf, size_t count, lo
3985 if (count < sizeof(struct js_event))
3986 return -EINVAL;
3987
3988 - if (count == sizeof(struct JS_DATA_TYPE)) {
3989 -
3990 - struct JS_DATA_TYPE data;
3991 - int i;
3992 -
3993 - for (data.buttons = i = 0; i < 32 && i < joydev->nkey; i++)
3994 - data.buttons |= test_bit(joydev->keypam[i], input->key) ? (1 << i) : 0;
3995 - data.x = (joydev->abs[0] / 256 + 128) >> joydev->glue.JS_CORR.x;
3996 - data.y = (joydev->abs[1] / 256 + 128) >> joydev->glue.JS_CORR.y;
3997 -
3998 - if (copy_to_user(buf, &data, sizeof(struct JS_DATA_TYPE)))
3999 - return -EFAULT;
4000 -
4001 - client->startup = 0;
4002 - client->tail = client->head;
4003 + if (count == sizeof(struct JS_DATA_TYPE))
4004 + return joydev_0x_read(client, input, buf);
4005
4006 - return sizeof(struct JS_DATA_TYPE);
4007 - }
4008 -
4009 - if (client->startup == joydev->nabs + joydev->nkey &&
4010 - client->head == client->tail && (file->f_flags & O_NONBLOCK))
4011 + if (!joydev_data_pending(client) && (file->f_flags & O_NONBLOCK))
4012 return -EAGAIN;
4013
4014 retval = wait_event_interruptible(joydev->wait,
4015 - !joydev->exist ||
4016 - client->startup < joydev->nabs + joydev->nkey ||
4017 - client->head != client->tail);
4018 + !joydev->exist || joydev_data_pending(client));
4019 if (retval)
4020 return retval;
4021
4022 if (!joydev->exist)
4023 return -ENODEV;
4024
4025 - while (client->startup < joydev->nabs + joydev->nkey && retval + sizeof(struct js_event) <= count) {
4026 -
4027 - struct js_event event;
4028 -
4029 - event.time = jiffies_to_msecs(jiffies);
4030 -
4031 - if (client->startup < joydev->nkey) {
4032 - event.type = JS_EVENT_BUTTON | JS_EVENT_INIT;
4033 - event.number = client->startup;
4034 - event.value = !!test_bit(joydev->keypam[event.number], input->key);
4035 - } else {
4036 - event.type = JS_EVENT_AXIS | JS_EVENT_INIT;
4037 - event.number = client->startup - joydev->nkey;
4038 - event.value = joydev->abs[event.number];
4039 - }
4040 + while (retval + sizeof(struct js_event) <= count &&
4041 + joydev_generate_startup_event(client, input, &event)) {
4042
4043 if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
4044 return -EFAULT;
4045
4046 - client->startup++;
4047 retval += sizeof(struct js_event);
4048 }
4049
4050 - while (client->head != client->tail && retval + sizeof(struct js_event) <= count) {
4051 + while (retval + sizeof(struct js_event) <= count &&
4052 + joydev_fetch_next_event(client, &event)) {
4053
4054 - if (copy_to_user(buf + retval, client->buffer + client->tail, sizeof(struct js_event)))
4055 + if (copy_to_user(buf + retval, &event, sizeof(struct js_event)))
4056 return -EFAULT;
4057
4058 - client->tail = (client->tail + 1) & (JOYDEV_BUFFER_SIZE - 1);
4059 retval += sizeof(struct js_event);
4060 }
4061
4062 @@ -301,126 +455,144 @@ static unsigned int joydev_poll(struct file *file, poll_table *wait)
4063 struct joydev *joydev = client->joydev;
4064
4065 poll_wait(file, &joydev->wait, wait);
4066 - return ((client->head != client->tail || client->startup < joydev->nabs + joydev->nkey) ?
4067 - (POLLIN | POLLRDNORM) : 0) | (joydev->exist ? 0 : (POLLHUP | POLLERR));
4068 + return (joydev_data_pending(client) ? (POLLIN | POLLRDNORM) : 0) |
4069 + (joydev->exist ? 0 : (POLLHUP | POLLERR));
4070 }
4071
4072 -static int joydev_ioctl_common(struct joydev *joydev, unsigned int cmd, void __user *argp)
4073 +static int joydev_ioctl_common(struct joydev *joydev,
4074 + unsigned int cmd, void __user *argp)
4075 {
4076 struct input_dev *dev = joydev->handle.dev;
4077 int i, j;
4078
4079 switch (cmd) {
4080
4081 - case JS_SET_CAL:
4082 - return copy_from_user(&joydev->glue.JS_CORR, argp,
4083 + case JS_SET_CAL:
4084 + return copy_from_user(&joydev->glue.JS_CORR, argp,
4085 sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
4086
4087 - case JS_GET_CAL:
4088 - return copy_to_user(argp, &joydev->glue.JS_CORR,
4089 + case JS_GET_CAL:
4090 + return copy_to_user(argp, &joydev->glue.JS_CORR,
4091 sizeof(joydev->glue.JS_CORR)) ? -EFAULT : 0;
4092
4093 - case JS_SET_TIMEOUT:
4094 - return get_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
4095 + case JS_SET_TIMEOUT:
4096 + return get_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
4097
4098 - case JS_GET_TIMEOUT:
4099 - return put_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
4100 + case JS_GET_TIMEOUT:
4101 + return put_user(joydev->glue.JS_TIMEOUT, (s32 __user *) argp);
4102
4103 - case JSIOCGVERSION:
4104 - return put_user(JS_VERSION, (__u32 __user *) argp);
4105 + case JSIOCGVERSION:
4106 + return put_user(JS_VERSION, (__u32 __user *) argp);
4107
4108 - case JSIOCGAXES:
4109 - return put_user(joydev->nabs, (__u8 __user *) argp);
4110 + case JSIOCGAXES:
4111 + return put_user(joydev->nabs, (__u8 __user *) argp);
4112
4113 - case JSIOCGBUTTONS:
4114 - return put_user(joydev->nkey, (__u8 __user *) argp);
4115 + case JSIOCGBUTTONS:
4116 + return put_user(joydev->nkey, (__u8 __user *) argp);
4117
4118 - case JSIOCSCORR:
4119 - if (copy_from_user(joydev->corr, argp,
4120 - sizeof(joydev->corr[0]) * joydev->nabs))
4121 - return -EFAULT;
4122 - for (i = 0; i < joydev->nabs; i++) {
4123 - j = joydev->abspam[i];
4124 - joydev->abs[i] = joydev_correct(dev->abs[j], joydev->corr + i);
4125 - }
4126 - return 0;
4127 + case JSIOCSCORR:
4128 + if (copy_from_user(joydev->corr, argp,
4129 + sizeof(joydev->corr[0]) * joydev->nabs))
4130 + return -EFAULT;
4131
4132 - case JSIOCGCORR:
4133 - return copy_to_user(argp, joydev->corr,
4134 - sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0;
4135 + for (i = 0; i < joydev->nabs; i++) {
4136 + j = joydev->abspam[i];
4137 + joydev->abs[i] = joydev_correct(dev->abs[j],
4138 + &joydev->corr[i]);
4139 + }
4140 + return 0;
4141
4142 - case JSIOCSAXMAP:
4143 - if (copy_from_user(joydev->abspam, argp, sizeof(__u8) * (ABS_MAX + 1)))
4144 - return -EFAULT;
4145 - for (i = 0; i < joydev->nabs; i++) {
4146 - if (joydev->abspam[i] > ABS_MAX)
4147 - return -EINVAL;
4148 - joydev->absmap[joydev->abspam[i]] = i;
4149 - }
4150 - return 0;
4151 -
4152 - case JSIOCGAXMAP:
4153 - return copy_to_user(argp, joydev->abspam,
4154 - sizeof(__u8) * (ABS_MAX + 1)) ? -EFAULT : 0;
4155 -
4156 - case JSIOCSBTNMAP:
4157 - if (copy_from_user(joydev->keypam, argp, sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)))
4158 + case JSIOCGCORR:
4159 + return copy_to_user(argp, joydev->corr,
4160 + sizeof(joydev->corr[0]) * joydev->nabs) ? -EFAULT : 0;
4161 +
4162 + case JSIOCSAXMAP:
4163 + if (copy_from_user(joydev->abspam, argp,
4164 + sizeof(__u8) * (ABS_MAX + 1)))
4165 + return -EFAULT;
4166 +
4167 + for (i = 0; i < joydev->nabs; i++) {
4168 + if (joydev->abspam[i] > ABS_MAX)
4169 + return -EINVAL;
4170 + joydev->absmap[joydev->abspam[i]] = i;
4171 + }
4172 + return 0;
4173 +
4174 + case JSIOCGAXMAP:
4175 + return copy_to_user(argp, joydev->abspam,
4176 + sizeof(__u8) * (ABS_MAX + 1)) ? -EFAULT : 0;
4177 +
4178 + case JSIOCSBTNMAP:
4179 + if (copy_from_user(joydev->keypam, argp,
4180 + sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)))
4181 + return -EFAULT;
4182 +
4183 + for (i = 0; i < joydev->nkey; i++) {
4184 + if (joydev->keypam[i] > KEY_MAX ||
4185 + joydev->keypam[i] < BTN_MISC)
4186 + return -EINVAL;
4187 + joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;
4188 + }
4189 +
4190 + return 0;
4191 +
4192 + case JSIOCGBTNMAP:
4193 + return copy_to_user(argp, joydev->keypam,
4194 + sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)) ? -EFAULT : 0;
4195 +
4196 + default:
4197 + if ((cmd & ~IOCSIZE_MASK) == JSIOCGNAME(0)) {
4198 + int len;
4199 + if (!dev->name)
4200 + return 0;
4201 + len = strlen(dev->name) + 1;
4202 + if (len > _IOC_SIZE(cmd))
4203 + len = _IOC_SIZE(cmd);
4204 + if (copy_to_user(argp, dev->name, len))
4205 return -EFAULT;
4206 - for (i = 0; i < joydev->nkey; i++) {
4207 - if (joydev->keypam[i] > KEY_MAX || joydev->keypam[i] < BTN_MISC)
4208 - return -EINVAL;
4209 - joydev->keymap[joydev->keypam[i] - BTN_MISC] = i;
4210 - }
4211 - return 0;
4212 -
4213 - case JSIOCGBTNMAP:
4214 - return copy_to_user(argp, joydev->keypam,
4215 - sizeof(__u16) * (KEY_MAX - BTN_MISC + 1)) ? -EFAULT : 0;
4216 -
4217 - default:
4218 - if ((cmd & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT)) == JSIOCGNAME(0)) {
4219 - int len;
4220 - if (!dev->name)
4221 - return 0;
4222 - len = strlen(dev->name) + 1;
4223 - if (len > _IOC_SIZE(cmd))
4224 - len = _IOC_SIZE(cmd);
4225 - if (copy_to_user(argp, dev->name, len))
4226 - return -EFAULT;
4227 - return len;
4228 - }
4229 + return len;
4230 + }
4231 }
4232 return -EINVAL;
4233 }
4234
4235 #ifdef CONFIG_COMPAT
4236 -static long joydev_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
4237 +static long joydev_compat_ioctl(struct file *file,
4238 + unsigned int cmd, unsigned long arg)
4239 {
4240 struct joydev_client *client = file->private_data;
4241 struct joydev *joydev = client->joydev;
4242 void __user *argp = (void __user *)arg;
4243 s32 tmp32;
4244 struct JS_DATA_SAVE_TYPE_32 ds32;
4245 - int err;
4246 + int retval;
4247
4248 - if (!joydev->exist)
4249 - return -ENODEV;
4250 + retval = mutex_lock_interruptible(&joydev->mutex);
4251 + if (retval)
4252 + return retval;
4253 +
4254 + if (!joydev->exist) {
4255 + retval = -ENODEV;
4256 + goto out;
4257 + }
4258 +
4259 + switch (cmd) {
4260
4261 - switch(cmd) {
4262 case JS_SET_TIMELIMIT:
4263 - err = get_user(tmp32, (s32 __user *) arg);
4264 - if (err == 0)
4265 + retval = get_user(tmp32, (s32 __user *) arg);
4266 + if (retval == 0)
4267 joydev->glue.JS_TIMELIMIT = tmp32;
4268 break;
4269 +
4270 case JS_GET_TIMELIMIT:
4271 tmp32 = joydev->glue.JS_TIMELIMIT;
4272 - err = put_user(tmp32, (s32 __user *) arg);
4273 + retval = put_user(tmp32, (s32 __user *) arg);
4274 break;
4275
4276 case JS_SET_ALL:
4277 - err = copy_from_user(&ds32, argp,
4278 - sizeof(ds32)) ? -EFAULT : 0;
4279 - if (err == 0) {
4280 + retval = copy_from_user(&ds32, argp,
4281 + sizeof(ds32)) ? -EFAULT : 0;
4282 + if (retval == 0) {
4283 joydev->glue.JS_TIMEOUT = ds32.JS_TIMEOUT;
4284 joydev->glue.BUSY = ds32.BUSY;
4285 joydev->glue.JS_EXPIRETIME = ds32.JS_EXPIRETIME;
4286 @@ -438,55 +610,119 @@ static long joydev_compat_ioctl(struct file *file, unsigned int cmd, unsigned lo
4287 ds32.JS_SAVE = joydev->glue.JS_SAVE;
4288 ds32.JS_CORR = joydev->glue.JS_CORR;
4289
4290 - err = copy_to_user(argp, &ds32, sizeof(ds32)) ? -EFAULT : 0;
4291 + retval = copy_to_user(argp, &ds32, sizeof(ds32)) ? -EFAULT : 0;
4292 break;
4293
4294 default:
4295 - err = joydev_ioctl_common(joydev, cmd, argp);
4296 + retval = joydev_ioctl_common(joydev, cmd, argp);
4297 + break;
4298 }
4299 - return err;
4300 +
4301 + out:
4302 + mutex_unlock(&joydev->mutex);
4303 + return retval;
4304 }
4305 #endif /* CONFIG_COMPAT */
4306
4307 -static int joydev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
4308 +static long joydev_ioctl(struct file *file,
4309 + unsigned int cmd, unsigned long arg)
4310 {
4311 struct joydev_client *client = file->private_data;
4312 struct joydev *joydev = client->joydev;
4313 void __user *argp = (void __user *)arg;
4314 + int retval;
4315
4316 - if (!joydev->exist)
4317 - return -ENODEV;
4318 + retval = mutex_lock_interruptible(&joydev->mutex);
4319 + if (retval)
4320 + return retval;
4321 +
4322 + if (!joydev->exist) {
4323 + retval = -ENODEV;
4324 + goto out;
4325 + }
4326 +
4327 + switch (cmd) {
4328 +
4329 + case JS_SET_TIMELIMIT:
4330 + retval = get_user(joydev->glue.JS_TIMELIMIT,
4331 + (long __user *) arg);
4332 + break;
4333 +
4334 + case JS_GET_TIMELIMIT:
4335 + retval = put_user(joydev->glue.JS_TIMELIMIT,
4336 + (long __user *) arg);
4337 + break;
4338 +
4339 + case JS_SET_ALL:
4340 + retval = copy_from_user(&joydev->glue, argp,
4341 + sizeof(joydev->glue)) ? -EFAULT: 0;
4342 + break;
4343 +
4344 + case JS_GET_ALL:
4345 + retval = copy_to_user(argp, &joydev->glue,
4346 + sizeof(joydev->glue)) ? -EFAULT : 0;
4347 + break;
4348
4349 - switch(cmd) {
4350 - case JS_SET_TIMELIMIT:
4351 - return get_user(joydev->glue.JS_TIMELIMIT, (long __user *) arg);
4352 - case JS_GET_TIMELIMIT:
4353 - return put_user(joydev->glue.JS_TIMELIMIT, (long __user *) arg);
4354 - case JS_SET_ALL:
4355 - return copy_from_user(&joydev->glue, argp,
4356 - sizeof(joydev->glue)) ? -EFAULT : 0;
4357 - case JS_GET_ALL:
4358 - return copy_to_user(argp, &joydev->glue,
4359 - sizeof(joydev->glue)) ? -EFAULT : 0;
4360 - default:
4361 - return joydev_ioctl_common(joydev, cmd, argp);
4362 + default:
4363 + retval = joydev_ioctl_common(joydev, cmd, argp);
4364 + break;
4365 }
4366 + out:
4367 + mutex_unlock(&joydev->mutex);
4368 + return retval;
4369 }
4370
4371 static const struct file_operations joydev_fops = {
4372 - .owner = THIS_MODULE,
4373 - .read = joydev_read,
4374 - .write = joydev_write,
4375 - .poll = joydev_poll,
4376 - .open = joydev_open,
4377 - .release = joydev_release,
4378 - .ioctl = joydev_ioctl,
4379 + .owner = THIS_MODULE,
4380 + .read = joydev_read,
4381 + .poll = joydev_poll,
4382 + .open = joydev_open,
4383 + .release = joydev_release,
4384 + .unlocked_ioctl = joydev_ioctl,
4385 #ifdef CONFIG_COMPAT
4386 - .compat_ioctl = joydev_compat_ioctl,
4387 + .compat_ioctl = joydev_compat_ioctl,
4388 #endif
4389 - .fasync = joydev_fasync,
4390 + .fasync = joydev_fasync,
4391 };
4392
4393 +static int joydev_install_chrdev(struct joydev *joydev)
4394 +{
4395 + joydev_table[joydev->minor] = joydev;
4396 + return 0;
4397 +}
4398 +
4399 +static void joydev_remove_chrdev(struct joydev *joydev)
4400 +{
4401 + mutex_lock(&joydev_table_mutex);
4402 + joydev_table[joydev->minor] = NULL;
4403 + mutex_unlock(&joydev_table_mutex);
4404 +}
4405 +
4406 +/*
4407 + * Mark device non-existant. This disables writes, ioctls and
4408 + * prevents new users from opening the device. Already posted
4409 + * blocking reads will stay, however new ones will fail.
4410 + */
4411 +static void joydev_mark_dead(struct joydev *joydev)
4412 +{
4413 + mutex_lock(&joydev->mutex);
4414 + joydev->exist = 0;
4415 + mutex_unlock(&joydev->mutex);
4416 +}
4417 +
4418 +static void joydev_cleanup(struct joydev *joydev)
4419 +{
4420 + struct input_handle *handle = &joydev->handle;
4421 +
4422 + joydev_mark_dead(joydev);
4423 + joydev_hangup(joydev);
4424 + joydev_remove_chrdev(joydev);
4425 +
4426 + /* joydev is marked dead so noone else accesses joydev->open */
4427 + if (joydev->open)
4428 + input_close_device(handle);
4429 +}
4430 +
4431 static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
4432 const struct input_device_id *id)
4433 {
4434 @@ -494,7 +730,10 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
4435 int i, j, t, minor;
4436 int error;
4437
4438 - for (minor = 0; minor < JOYDEV_MINORS && joydev_table[minor]; minor++);
4439 + for (minor = 0; minor < JOYDEV_MINORS; minor++)
4440 + if (!joydev_table[minor])
4441 + break;
4442 +
4443 if (minor == JOYDEV_MINORS) {
4444 printk(KERN_ERR "joydev: no more free joydev devices\n");
4445 return -ENFILE;
4446 @@ -505,15 +744,19 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
4447 return -ENOMEM;
4448
4449 INIT_LIST_HEAD(&joydev->client_list);
4450 + spin_lock_init(&joydev->client_lock);
4451 + mutex_init(&joydev->mutex);
4452 init_waitqueue_head(&joydev->wait);
4453
4454 + snprintf(joydev->name, sizeof(joydev->name), "js%d", minor);
4455 + joydev->exist = 1;
4456 joydev->minor = minor;
4457 +
4458 joydev->exist = 1;
4459 joydev->handle.dev = dev;
4460 joydev->handle.name = joydev->name;
4461 joydev->handle.handler = handler;
4462 joydev->handle.private = joydev;
4463 - snprintf(joydev->name, sizeof(joydev->name), "js%d", minor);
4464
4465 for (i = 0; i < ABS_MAX + 1; i++)
4466 if (test_bit(i, dev->absbit)) {
4467 @@ -545,67 +788,65 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
4468 }
4469 joydev->corr[i].type = JS_CORR_BROKEN;
4470 joydev->corr[i].prec = dev->absfuzz[j];
4471 - joydev->corr[i].coef[0] = (dev->absmax[j] + dev->absmin[j]) / 2 - dev->absflat[j];
4472 - joydev->corr[i].coef[1] = (dev->absmax[j] + dev->absmin[j]) / 2 + dev->absflat[j];
4473 - if (!(t = ((dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j])))
4474 - continue;
4475 - joydev->corr[i].coef[2] = (1 << 29) / t;
4476 - joydev->corr[i].coef[3] = (1 << 29) / t;
4477 -
4478 - joydev->abs[i] = joydev_correct(dev->abs[j], joydev->corr + i);
4479 + joydev->corr[i].coef[0] =
4480 + (dev->absmax[j] + dev->absmin[j]) / 2 - dev->absflat[j];
4481 + joydev->corr[i].coef[1] =
4482 + (dev->absmax[j] + dev->absmin[j]) / 2 + dev->absflat[j];
4483 +
4484 + t = (dev->absmax[j] - dev->absmin[j]) / 2 - 2 * dev->absflat[j];
4485 + if (t) {
4486 + joydev->corr[i].coef[2] = (1 << 29) / t;
4487 + joydev->corr[i].coef[3] = (1 << 29) / t;
4488 +
4489 + joydev->abs[i] = joydev_correct(dev->abs[j],
4490 + joydev->corr + i);
4491 + }
4492 }
4493
4494 - snprintf(joydev->dev.bus_id, sizeof(joydev->dev.bus_id),
4495 - "js%d", minor);
4496 + strlcpy(joydev->dev.bus_id, joydev->name, sizeof(joydev->dev.bus_id));
4497 + joydev->dev.devt = MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor);
4498 joydev->dev.class = &input_class;
4499 joydev->dev.parent = &dev->dev;
4500 - joydev->dev.devt = MKDEV(INPUT_MAJOR, JOYDEV_MINOR_BASE + minor);
4501 joydev->dev.release = joydev_free;
4502 device_initialize(&joydev->dev);
4503
4504 - joydev_table[minor] = joydev;
4505 -
4506 - error = device_add(&joydev->dev);
4507 + error = input_register_handle(&joydev->handle);
4508 if (error)
4509 goto err_free_joydev;
4510
4511 - error = input_register_handle(&joydev->handle);
4512 + error = joydev_install_chrdev(joydev);
4513 if (error)
4514 - goto err_delete_joydev;
4515 + goto err_unregister_handle;
4516 +
4517 + error = device_add(&joydev->dev);
4518 + if (error)
4519 + goto err_cleanup_joydev;
4520
4521 return 0;
4522
4523 - err_delete_joydev:
4524 - device_del(&joydev->dev);
4525 + err_cleanup_joydev:
4526 + joydev_cleanup(joydev);
4527 + err_unregister_handle:
4528 + input_unregister_handle(&joydev->handle);
4529 err_free_joydev:
4530 put_device(&joydev->dev);
4531 return error;
4532 }
4533
4534 -
4535 static void joydev_disconnect(struct input_handle *handle)
4536 {
4537 struct joydev *joydev = handle->private;
4538 - struct joydev_client *client;
4539
4540 - input_unregister_handle(handle);
4541 device_del(&joydev->dev);
4542 -
4543 - joydev->exist = 0;
4544 -
4545 - if (joydev->open) {
4546 - input_close_device(handle);
4547 - list_for_each_entry(client, &joydev->client_list, node)
4548 - kill_fasync(&client->fasync, SIGIO, POLL_HUP);
4549 - wake_up_interruptible(&joydev->wait);
4550 - }
4551 -
4552 + joydev_cleanup(joydev);
4553 + input_unregister_handle(handle);
4554 put_device(&joydev->dev);
4555 }
4556
4557 static const struct input_device_id joydev_blacklist[] = {
4558 {
4559 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT,
4560 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
4561 + INPUT_DEVICE_ID_MATCH_KEYBIT,
4562 .evbit = { BIT(EV_KEY) },
4563 .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
4564 }, /* Avoid itouchpads, touchscreens and tablets */
4565 @@ -614,17 +855,20 @@ static const struct input_device_id joydev_blacklist[] = {
4566
4567 static const struct input_device_id joydev_ids[] = {
4568 {
4569 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
4570 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
4571 + INPUT_DEVICE_ID_MATCH_ABSBIT,
4572 .evbit = { BIT(EV_ABS) },
4573 .absbit = { BIT(ABS_X) },
4574 },
4575 {
4576 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
4577 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
4578 + INPUT_DEVICE_ID_MATCH_ABSBIT,
4579 .evbit = { BIT(EV_ABS) },
4580 .absbit = { BIT(ABS_WHEEL) },
4581 },
4582 {
4583 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
4584 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
4585 + INPUT_DEVICE_ID_MATCH_ABSBIT,
4586 .evbit = { BIT(EV_ABS) },
4587 .absbit = { BIT(ABS_THROTTLE) },
4588 },
4589 @@ -634,14 +878,14 @@ static const struct input_device_id joydev_ids[] = {
4590 MODULE_DEVICE_TABLE(input, joydev_ids);
4591
4592 static struct input_handler joydev_handler = {
4593 - .event = joydev_event,
4594 - .connect = joydev_connect,
4595 - .disconnect = joydev_disconnect,
4596 - .fops = &joydev_fops,
4597 - .minor = JOYDEV_MINOR_BASE,
4598 - .name = "joydev",
4599 - .id_table = joydev_ids,
4600 - .blacklist = joydev_blacklist,
4601 + .event = joydev_event,
4602 + .connect = joydev_connect,
4603 + .disconnect = joydev_disconnect,
4604 + .fops = &joydev_fops,
4605 + .minor = JOYDEV_MINOR_BASE,
4606 + .name = "joydev",
4607 + .id_table = joydev_ids,
4608 + .blacklist = joydev_blacklist,
4609 };
4610
4611 static int __init joydev_init(void)
4612 diff --git a/drivers/input/mousedev.c b/drivers/input/mousedev.c
4613 index 9173916..cc36edb 100644
4614 --- a/drivers/input/mousedev.c
4615 +++ b/drivers/input/mousedev.c
4616 @@ -61,9 +61,11 @@ struct mousedev {
4617 int open;
4618 int minor;
4619 char name[16];
4620 + struct input_handle handle;
4621 wait_queue_head_t wait;
4622 struct list_head client_list;
4623 - struct input_handle handle;
4624 + spinlock_t client_lock; /* protects client_list */
4625 + struct mutex mutex;
4626 struct device dev;
4627
4628 struct list_head mixdev_node;
4629 @@ -113,108 +115,137 @@ static unsigned char mousedev_imex_seq[] = { 0xf3, 200, 0xf3, 200, 0xf3, 80 };
4630 static struct input_handler mousedev_handler;
4631
4632 static struct mousedev *mousedev_table[MOUSEDEV_MINORS];
4633 +static DEFINE_MUTEX(mousedev_table_mutex);
4634 static struct mousedev *mousedev_mix;
4635 static LIST_HEAD(mousedev_mix_list);
4636
4637 +static void mixdev_open_devices(void);
4638 +static void mixdev_close_devices(void);
4639 +
4640 #define fx(i) (mousedev->old_x[(mousedev->pkt_count - (i)) & 03])
4641 #define fy(i) (mousedev->old_y[(mousedev->pkt_count - (i)) & 03])
4642
4643 -static void mousedev_touchpad_event(struct input_dev *dev, struct mousedev *mousedev, unsigned int code, int value)
4644 +static void mousedev_touchpad_event(struct input_dev *dev,
4645 + struct mousedev *mousedev,
4646 + unsigned int code, int value)
4647 {
4648 int size, tmp;
4649 enum { FRACTION_DENOM = 128 };
4650
4651 switch (code) {
4652 - case ABS_X:
4653 - fx(0) = value;
4654 - if (mousedev->touch && mousedev->pkt_count >= 2) {
4655 - size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4656 - if (size == 0)
4657 - size = 256 * 2;
4658 - tmp = ((value - fx(2)) * (256 * FRACTION_DENOM)) / size;
4659 - tmp += mousedev->frac_dx;
4660 - mousedev->packet.dx = tmp / FRACTION_DENOM;
4661 - mousedev->frac_dx = tmp - mousedev->packet.dx * FRACTION_DENOM;
4662 - }
4663 - break;
4664
4665 - case ABS_Y:
4666 - fy(0) = value;
4667 - if (mousedev->touch && mousedev->pkt_count >= 2) {
4668 - /* use X size to keep the same scale */
4669 - size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4670 - if (size == 0)
4671 - size = 256 * 2;
4672 - tmp = -((value - fy(2)) * (256 * FRACTION_DENOM)) / size;
4673 - tmp += mousedev->frac_dy;
4674 - mousedev->packet.dy = tmp / FRACTION_DENOM;
4675 - mousedev->frac_dy = tmp - mousedev->packet.dy * FRACTION_DENOM;
4676 - }
4677 - break;
4678 + case ABS_X:
4679 + fx(0) = value;
4680 + if (mousedev->touch && mousedev->pkt_count >= 2) {
4681 + size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4682 + if (size == 0)
4683 + size = 256 * 2;
4684 + tmp = ((value - fx(2)) * 256 * FRACTION_DENOM) / size;
4685 + tmp += mousedev->frac_dx;
4686 + mousedev->packet.dx = tmp / FRACTION_DENOM;
4687 + mousedev->frac_dx =
4688 + tmp - mousedev->packet.dx * FRACTION_DENOM;
4689 + }
4690 + break;
4691 +
4692 + case ABS_Y:
4693 + fy(0) = value;
4694 + if (mousedev->touch && mousedev->pkt_count >= 2) {
4695 + /* use X size to keep the same scale */
4696 + size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4697 + if (size == 0)
4698 + size = 256 * 2;
4699 + tmp = -((value - fy(2)) * 256 * FRACTION_DENOM) / size;
4700 + tmp += mousedev->frac_dy;
4701 + mousedev->packet.dy = tmp / FRACTION_DENOM;
4702 + mousedev->frac_dy = tmp -
4703 + mousedev->packet.dy * FRACTION_DENOM;
4704 + }
4705 + break;
4706 }
4707 }
4708
4709 -static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev, unsigned int code, int value)
4710 +static void mousedev_abs_event(struct input_dev *dev, struct mousedev *mousedev,
4711 + unsigned int code, int value)
4712 {
4713 int size;
4714
4715 switch (code) {
4716 - case ABS_X:
4717 - size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4718 - if (size == 0)
4719 - size = xres ? : 1;
4720 - if (value > dev->absmax[ABS_X])
4721 - value = dev->absmax[ABS_X];
4722 - if (value < dev->absmin[ABS_X])
4723 - value = dev->absmin[ABS_X];
4724 - mousedev->packet.x = ((value - dev->absmin[ABS_X]) * xres) / size;
4725 - mousedev->packet.abs_event = 1;
4726 - break;
4727
4728 - case ABS_Y:
4729 - size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y];
4730 - if (size == 0)
4731 - size = yres ? : 1;
4732 - if (value > dev->absmax[ABS_Y])
4733 - value = dev->absmax[ABS_Y];
4734 - if (value < dev->absmin[ABS_Y])
4735 - value = dev->absmin[ABS_Y];
4736 - mousedev->packet.y = yres - ((value - dev->absmin[ABS_Y]) * yres) / size;
4737 - mousedev->packet.abs_event = 1;
4738 - break;
4739 + case ABS_X:
4740 + size = dev->absmax[ABS_X] - dev->absmin[ABS_X];
4741 + if (size == 0)
4742 + size = xres ? : 1;
4743 + if (value > dev->absmax[ABS_X])
4744 + value = dev->absmax[ABS_X];
4745 + if (value < dev->absmin[ABS_X])
4746 + value = dev->absmin[ABS_X];
4747 + mousedev->packet.x =
4748 + ((value - dev->absmin[ABS_X]) * xres) / size;
4749 + mousedev->packet.abs_event = 1;
4750 + break;
4751 +
4752 + case ABS_Y:
4753 + size = dev->absmax[ABS_Y] - dev->absmin[ABS_Y];
4754 + if (size == 0)
4755 + size = yres ? : 1;
4756 + if (value > dev->absmax[ABS_Y])
4757 + value = dev->absmax[ABS_Y];
4758 + if (value < dev->absmin[ABS_Y])
4759 + value = dev->absmin[ABS_Y];
4760 + mousedev->packet.y = yres -
4761 + ((value - dev->absmin[ABS_Y]) * yres) / size;
4762 + mousedev->packet.abs_event = 1;
4763 + break;
4764 }
4765 }
4766
4767 -static void mousedev_rel_event(struct mousedev *mousedev, unsigned int code, int value)
4768 +static void mousedev_rel_event(struct mousedev *mousedev,
4769 + unsigned int code, int value)
4770 {
4771 switch (code) {
4772 - case REL_X: mousedev->packet.dx += value; break;
4773 - case REL_Y: mousedev->packet.dy -= value; break;
4774 - case REL_WHEEL: mousedev->packet.dz -= value; break;
4775 + case REL_X:
4776 + mousedev->packet.dx += value;
4777 + break;
4778 +
4779 + case REL_Y:
4780 + mousedev->packet.dy -= value;
4781 + break;
4782 +
4783 + case REL_WHEEL:
4784 + mousedev->packet.dz -= value;
4785 + break;
4786 }
4787 }
4788
4789 -static void mousedev_key_event(struct mousedev *mousedev, unsigned int code, int value)
4790 +static void mousedev_key_event(struct mousedev *mousedev,
4791 + unsigned int code, int value)
4792 {
4793 int index;
4794
4795 switch (code) {
4796 - case BTN_TOUCH:
4797 - case BTN_0:
4798 - case BTN_LEFT: index = 0; break;
4799 - case BTN_STYLUS:
4800 - case BTN_1:
4801 - case BTN_RIGHT: index = 1; break;
4802 - case BTN_2:
4803 - case BTN_FORWARD:
4804 - case BTN_STYLUS2:
4805 - case BTN_MIDDLE: index = 2; break;
4806 - case BTN_3:
4807 - case BTN_BACK:
4808 - case BTN_SIDE: index = 3; break;
4809 - case BTN_4:
4810 - case BTN_EXTRA: index = 4; break;
4811 - default: return;
4812 +
4813 + case BTN_TOUCH:
4814 + case BTN_0:
4815 + case BTN_LEFT: index = 0; break;
4816 +
4817 + case BTN_STYLUS:
4818 + case BTN_1:
4819 + case BTN_RIGHT: index = 1; break;
4820 +
4821 + case BTN_2:
4822 + case BTN_FORWARD:
4823 + case BTN_STYLUS2:
4824 + case BTN_MIDDLE: index = 2; break;
4825 +
4826 + case BTN_3:
4827 + case BTN_BACK:
4828 + case BTN_SIDE: index = 3; break;
4829 +
4830 + case BTN_4:
4831 + case BTN_EXTRA: index = 4; break;
4832 +
4833 + default: return;
4834 }
4835
4836 if (value) {
4837 @@ -226,19 +257,22 @@ static void mousedev_key_event(struct mousedev *mousedev, unsigned int code, int
4838 }
4839 }
4840
4841 -static void mousedev_notify_readers(struct mousedev *mousedev, struct mousedev_hw_data *packet)
4842 +static void mousedev_notify_readers(struct mousedev *mousedev,
4843 + struct mousedev_hw_data *packet)
4844 {
4845 struct mousedev_client *client;
4846 struct mousedev_motion *p;
4847 - unsigned long flags;
4848 + unsigned int new_head;
4849 int wake_readers = 0;
4850
4851 - list_for_each_entry(client, &mousedev->client_list, node) {
4852 - spin_lock_irqsave(&client->packet_lock, flags);
4853 + list_for_each_entry_rcu(client, &mousedev->client_list, node) {
4854 +
4855 + /* Just acquire the lock, interrupts already disabled */
4856 + spin_lock(&client->packet_lock);
4857
4858 p = &client->packets[client->head];
4859 if (client->ready && p->buttons != mousedev->packet.buttons) {
4860 - unsigned int new_head = (client->head + 1) % PACKET_QUEUE_LEN;
4861 + new_head = (client->head + 1) % PACKET_QUEUE_LEN;
4862 if (new_head != client->tail) {
4863 p = &client->packets[client->head = new_head];
4864 memset(p, 0, sizeof(struct mousedev_motion));
4865 @@ -253,19 +287,22 @@ static void mousedev_notify_readers(struct mousedev *mousedev, struct mousedev_h
4866 }
4867
4868 client->pos_x += packet->dx;
4869 - client->pos_x = client->pos_x < 0 ? 0 : (client->pos_x >= xres ? xres : client->pos_x);
4870 + client->pos_x = client->pos_x < 0 ?
4871 + 0 : (client->pos_x >= xres ? xres : client->pos_x);
4872 client->pos_y += packet->dy;
4873 - client->pos_y = client->pos_y < 0 ? 0 : (client->pos_y >= yres ? yres : client->pos_y);
4874 + client->pos_y = client->pos_y < 0 ?
4875 + 0 : (client->pos_y >= yres ? yres : client->pos_y);
4876
4877 p->dx += packet->dx;
4878 p->dy += packet->dy;
4879 p->dz += packet->dz;
4880 p->buttons = mousedev->packet.buttons;
4881
4882 - if (p->dx || p->dy || p->dz || p->buttons != client->last_buttons)
4883 + if (p->dx || p->dy || p->dz ||
4884 + p->buttons != client->last_buttons)
4885 client->ready = 1;
4886
4887 - spin_unlock_irqrestore(&client->packet_lock, flags);
4888 + spin_unlock(&client->packet_lock);
4889
4890 if (client->ready) {
4891 kill_fasync(&client->fasync, SIGIO, POLL_IN);
4892 @@ -281,7 +318,8 @@ static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
4893 {
4894 if (!value) {
4895 if (mousedev->touch &&
4896 - time_before(jiffies, mousedev->touch + msecs_to_jiffies(tap_time))) {
4897 + time_before(jiffies,
4898 + mousedev->touch + msecs_to_jiffies(tap_time))) {
4899 /*
4900 * Toggle left button to emulate tap.
4901 * We rely on the fact that mousedev_mix always has 0
4902 @@ -290,7 +328,8 @@ static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
4903 set_bit(0, &mousedev->packet.buttons);
4904 set_bit(0, &mousedev_mix->packet.buttons);
4905 mousedev_notify_readers(mousedev, &mousedev_mix->packet);
4906 - mousedev_notify_readers(mousedev_mix, &mousedev_mix->packet);
4907 + mousedev_notify_readers(mousedev_mix,
4908 + &mousedev_mix->packet);
4909 clear_bit(0, &mousedev->packet.buttons);
4910 clear_bit(0, &mousedev_mix->packet.buttons);
4911 }
4912 @@ -302,54 +341,61 @@ static void mousedev_touchpad_touch(struct mousedev *mousedev, int value)
4913 mousedev->touch = jiffies;
4914 }
4915
4916 -static void mousedev_event(struct input_handle *handle, unsigned int type, unsigned int code, int value)
4917 +static void mousedev_event(struct input_handle *handle,
4918 + unsigned int type, unsigned int code, int value)
4919 {
4920 struct mousedev *mousedev = handle->private;
4921
4922 switch (type) {
4923 - case EV_ABS:
4924 - /* Ignore joysticks */
4925 - if (test_bit(BTN_TRIGGER, handle->dev->keybit))
4926 - return;
4927
4928 - if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
4929 - mousedev_touchpad_event(handle->dev, mousedev, code, value);
4930 - else
4931 - mousedev_abs_event(handle->dev, mousedev, code, value);
4932 + case EV_ABS:
4933 + /* Ignore joysticks */
4934 + if (test_bit(BTN_TRIGGER, handle->dev->keybit))
4935 + return;
4936
4937 - break;
4938 + if (test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
4939 + mousedev_touchpad_event(handle->dev,
4940 + mousedev, code, value);
4941 + else
4942 + mousedev_abs_event(handle->dev, mousedev, code, value);
4943
4944 - case EV_REL:
4945 - mousedev_rel_event(mousedev, code, value);
4946 - break;
4947 + break;
4948
4949 - case EV_KEY:
4950 - if (value != 2) {
4951 - if (code == BTN_TOUCH && test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
4952 - mousedev_touchpad_touch(mousedev, value);
4953 - else
4954 - mousedev_key_event(mousedev, code, value);
4955 - }
4956 - break;
4957 + case EV_REL:
4958 + mousedev_rel_event(mousedev, code, value);
4959 + break;
4960
4961 - case EV_SYN:
4962 - if (code == SYN_REPORT) {
4963 - if (mousedev->touch) {
4964 - mousedev->pkt_count++;
4965 - /* Input system eats duplicate events, but we need all of them
4966 - * to do correct averaging so apply present one forward
4967 - */
4968 - fx(0) = fx(1);
4969 - fy(0) = fy(1);
4970 - }
4971 -
4972 - mousedev_notify_readers(mousedev, &mousedev->packet);
4973 - mousedev_notify_readers(mousedev_mix, &mousedev->packet);
4974 -
4975 - mousedev->packet.dx = mousedev->packet.dy = mousedev->packet.dz = 0;
4976 - mousedev->packet.abs_event = 0;
4977 + case EV_KEY:
4978 + if (value != 2) {
4979 + if (code == BTN_TOUCH &&
4980 + test_bit(BTN_TOOL_FINGER, handle->dev->keybit))
4981 + mousedev_touchpad_touch(mousedev, value);
4982 + else
4983 + mousedev_key_event(mousedev, code, value);
4984 + }
4985 + break;
4986 +
4987 + case EV_SYN:
4988 + if (code == SYN_REPORT) {
4989 + if (mousedev->touch) {
4990 + mousedev->pkt_count++;
4991 + /*
4992 + * Input system eats duplicate events,
4993 + * but we need all of them to do correct
4994 + * averaging so apply present one forward
4995 + */
4996 + fx(0) = fx(1);
4997 + fy(0) = fy(1);
4998 }
4999 - break;
5000 +
5001 + mousedev_notify_readers(mousedev, &mousedev->packet);
5002 + mousedev_notify_readers(mousedev_mix, &mousedev->packet);
5003 +
5004 + mousedev->packet.dx = mousedev->packet.dy =
5005 + mousedev->packet.dz = 0;
5006 + mousedev->packet.abs_event = 0;
5007 + }
5008 + break;
5009 }
5010 }
5011
5012 @@ -367,41 +413,48 @@ static void mousedev_free(struct device *dev)
5013 {
5014 struct mousedev *mousedev = container_of(dev, struct mousedev, dev);
5015
5016 - mousedev_table[mousedev->minor] = NULL;
5017 kfree(mousedev);
5018 }
5019
5020 -static int mixdev_add_device(struct mousedev *mousedev)
5021 +static int mousedev_open_device(struct mousedev *mousedev)
5022 {
5023 - int error;
5024 + int retval;
5025
5026 - if (mousedev_mix->open) {
5027 - error = input_open_device(&mousedev->handle);
5028 - if (error)
5029 - return error;
5030 + retval = mutex_lock_interruptible(&mousedev->mutex);
5031 + if (retval)
5032 + return retval;
5033
5034 - mousedev->open++;
5035 - mousedev->mixdev_open = 1;
5036 + if (mousedev->minor == MOUSEDEV_MIX)
5037 + mixdev_open_devices();
5038 + else if (!mousedev->exist)
5039 + retval = -ENODEV;
5040 + else if (!mousedev->open++) {
5041 + retval = input_open_device(&mousedev->handle);
5042 + if (retval)
5043 + mousedev->open--;
5044 }
5045
5046 - get_device(&mousedev->dev);
5047 - list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
5048 -
5049 - return 0;
5050 + mutex_unlock(&mousedev->mutex);
5051 + return retval;
5052 }
5053
5054 -static void mixdev_remove_device(struct mousedev *mousedev)
5055 +static void mousedev_close_device(struct mousedev *mousedev)
5056 {
5057 - if (mousedev->mixdev_open) {
5058 - mousedev->mixdev_open = 0;
5059 - if (!--mousedev->open && mousedev->exist)
5060 - input_close_device(&mousedev->handle);
5061 - }
5062 + mutex_lock(&mousedev->mutex);
5063
5064 - list_del_init(&mousedev->mixdev_node);
5065 - put_device(&mousedev->dev);
5066 + if (mousedev->minor == MOUSEDEV_MIX)
5067 + mixdev_close_devices();
5068 + else if (mousedev->exist && !--mousedev->open)
5069 + input_close_device(&mousedev->handle);
5070 +
5071 + mutex_unlock(&mousedev->mutex);
5072 }
5073
5074 +/*
5075 + * Open all available devices so they can all be multiplexed in one.
5076 + * stream. Note that this function is called with mousedev_mix->mutex
5077 + * held.
5078 + */
5079 static void mixdev_open_devices(void)
5080 {
5081 struct mousedev *mousedev;
5082 @@ -411,16 +464,19 @@ static void mixdev_open_devices(void)
5083
5084 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
5085 if (!mousedev->mixdev_open) {
5086 - if (!mousedev->open && mousedev->exist)
5087 - if (input_open_device(&mousedev->handle))
5088 - continue;
5089 + if (mousedev_open_device(mousedev))
5090 + continue;
5091
5092 - mousedev->open++;
5093 mousedev->mixdev_open = 1;
5094 }
5095 }
5096 }
5097
5098 +/*
5099 + * Close all devices that were opened as part of multiplexed
5100 + * device. Note that this function is called with mousedev_mix->mutex
5101 + * held.
5102 + */
5103 static void mixdev_close_devices(void)
5104 {
5105 struct mousedev *mousedev;
5106 @@ -431,33 +487,50 @@ static void mixdev_close_devices(void)
5107 list_for_each_entry(mousedev, &mousedev_mix_list, mixdev_node) {
5108 if (mousedev->mixdev_open) {
5109 mousedev->mixdev_open = 0;
5110 - if (!--mousedev->open && mousedev->exist)
5111 - input_close_device(&mousedev->handle);
5112 + mousedev_close_device(mousedev);
5113 }
5114 }
5115 }
5116
5117 +
5118 +static void mousedev_attach_client(struct mousedev *mousedev,
5119 + struct mousedev_client *client)
5120 +{
5121 + spin_lock(&mousedev->client_lock);
5122 + list_add_tail_rcu(&client->node, &mousedev->client_list);
5123 + spin_unlock(&mousedev->client_lock);
5124 + /*
5125 + * We don't use synchronize_rcu() here because read-side
5126 + * critical section is protected by a spinlock (dev->event_lock)
5127 + * instead of rcu_read_lock().
5128 + */
5129 + synchronize_sched();
5130 +}
5131 +
5132 +static void mousedev_detach_client(struct mousedev *mousedev,
5133 + struct mousedev_client *client)
5134 +{
5135 + spin_lock(&mousedev->client_lock);
5136 + list_del_rcu(&client->node);
5137 + spin_unlock(&mousedev->client_lock);
5138 + synchronize_sched();
5139 +}
5140 +
5141 static int mousedev_release(struct inode *inode, struct file *file)
5142 {
5143 struct mousedev_client *client = file->private_data;
5144 struct mousedev *mousedev = client->mousedev;
5145
5146 mousedev_fasync(-1, file, 0);
5147 -
5148 - list_del(&client->node);
5149 + mousedev_detach_client(mousedev, client);
5150 kfree(client);
5151
5152 - if (mousedev->minor == MOUSEDEV_MIX)
5153 - mixdev_close_devices();
5154 - else if (!--mousedev->open && mousedev->exist)
5155 - input_close_device(&mousedev->handle);
5156 -
5157 + mousedev_close_device(mousedev);
5158 put_device(&mousedev->dev);
5159
5160 return 0;
5161 }
5162
5163 -
5164 static int mousedev_open(struct inode *inode, struct file *file)
5165 {
5166 struct mousedev_client *client;
5167 @@ -475,12 +548,17 @@ static int mousedev_open(struct inode *inode, struct file *file)
5168 if (i >= MOUSEDEV_MINORS)
5169 return -ENODEV;
5170
5171 + error = mutex_lock_interruptible(&mousedev_table_mutex);
5172 + if (error)
5173 + return error;
5174 mousedev = mousedev_table[i];
5175 + if (mousedev)
5176 + get_device(&mousedev->dev);
5177 + mutex_unlock(&mousedev_table_mutex);
5178 +
5179 if (!mousedev)
5180 return -ENODEV;
5181
5182 - get_device(&mousedev->dev);
5183 -
5184 client = kzalloc(sizeof(struct mousedev_client), GFP_KERNEL);
5185 if (!client) {
5186 error = -ENOMEM;
5187 @@ -491,21 +569,17 @@ static int mousedev_open(struct inode *inode, struct file *file)
5188 client->pos_x = xres / 2;
5189 client->pos_y = yres / 2;
5190 client->mousedev = mousedev;
5191 - list_add_tail(&client->node, &mousedev->client_list);
5192 + mousedev_attach_client(mousedev, client);
5193
5194 - if (mousedev->minor == MOUSEDEV_MIX)
5195 - mixdev_open_devices();
5196 - else if (!mousedev->open++ && mousedev->exist) {
5197 - error = input_open_device(&mousedev->handle);
5198 - if (error)
5199 - goto err_free_client;
5200 - }
5201 + error = mousedev_open_device(mousedev);
5202 + if (error)
5203 + goto err_free_client;
5204
5205 file->private_data = client;
5206 return 0;
5207
5208 err_free_client:
5209 - list_del(&client->node);
5210 + mousedev_detach_client(mousedev, client);
5211 kfree(client);
5212 err_put_mousedev:
5213 put_device(&mousedev->dev);
5214 @@ -517,41 +591,41 @@ static inline int mousedev_limit_delta(int delta, int limit)
5215 return delta > limit ? limit : (delta < -limit ? -limit : delta);
5216 }
5217
5218 -static void mousedev_packet(struct mousedev_client *client, signed char *ps2_data)
5219 +static void mousedev_packet(struct mousedev_client *client,
5220 + signed char *ps2_data)
5221 {
5222 - struct mousedev_motion *p;
5223 - unsigned long flags;
5224 -
5225 - spin_lock_irqsave(&client->packet_lock, flags);
5226 - p = &client->packets[client->tail];
5227 + struct mousedev_motion *p = &client->packets[client->tail];
5228
5229 - ps2_data[0] = 0x08 | ((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);
5230 + ps2_data[0] = 0x08 |
5231 + ((p->dx < 0) << 4) | ((p->dy < 0) << 5) | (p->buttons & 0x07);
5232 ps2_data[1] = mousedev_limit_delta(p->dx, 127);
5233 ps2_data[2] = mousedev_limit_delta(p->dy, 127);
5234 p->dx -= ps2_data[1];
5235 p->dy -= ps2_data[2];
5236
5237 switch (client->mode) {
5238 - case MOUSEDEV_EMUL_EXPS:
5239 - ps2_data[3] = mousedev_limit_delta(p->dz, 7);
5240 - p->dz -= ps2_data[3];
5241 - ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1);
5242 - client->bufsiz = 4;
5243 - break;
5244 -
5245 - case MOUSEDEV_EMUL_IMPS:
5246 - ps2_data[0] |= ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
5247 - ps2_data[3] = mousedev_limit_delta(p->dz, 127);
5248 - p->dz -= ps2_data[3];
5249 - client->bufsiz = 4;
5250 - break;
5251 -
5252 - case MOUSEDEV_EMUL_PS2:
5253 - default:
5254 - ps2_data[0] |= ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
5255 - p->dz = 0;
5256 - client->bufsiz = 3;
5257 - break;
5258 + case MOUSEDEV_EMUL_EXPS:
5259 + ps2_data[3] = mousedev_limit_delta(p->dz, 7);
5260 + p->dz -= ps2_data[3];
5261 + ps2_data[3] = (ps2_data[3] & 0x0f) | ((p->buttons & 0x18) << 1);
5262 + client->bufsiz = 4;
5263 + break;
5264 +
5265 + case MOUSEDEV_EMUL_IMPS:
5266 + ps2_data[0] |=
5267 + ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
5268 + ps2_data[3] = mousedev_limit_delta(p->dz, 127);
5269 + p->dz -= ps2_data[3];
5270 + client->bufsiz = 4;
5271 + break;
5272 +
5273 + case MOUSEDEV_EMUL_PS2:
5274 + default:
5275 + ps2_data[0] |=
5276 + ((p->buttons & 0x10) >> 3) | ((p->buttons & 0x08) >> 1);
5277 + p->dz = 0;
5278 + client->bufsiz = 3;
5279 + break;
5280 }
5281
5282 if (!p->dx && !p->dy && !p->dz) {
5283 @@ -561,12 +635,56 @@ static void mousedev_packet(struct mousedev_client *client, signed char *ps2_dat
5284 } else
5285 client->tail = (client->tail + 1) % PACKET_QUEUE_LEN;
5286 }
5287 -
5288 - spin_unlock_irqrestore(&client->packet_lock, flags);
5289 }
5290
5291 +static void mousedev_generate_response(struct mousedev_client *client,
5292 + int command)
5293 +{
5294 + client->ps2[0] = 0xfa; /* ACK */
5295 +
5296 + switch (command) {
5297
5298 -static ssize_t mousedev_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
5299 + case 0xeb: /* Poll */
5300 + mousedev_packet(client, &client->ps2[1]);
5301 + client->bufsiz++; /* account for leading ACK */
5302 + break;
5303 +
5304 + case 0xf2: /* Get ID */
5305 + switch (client->mode) {
5306 + case MOUSEDEV_EMUL_PS2:
5307 + client->ps2[1] = 0;
5308 + break;
5309 + case MOUSEDEV_EMUL_IMPS:
5310 + client->ps2[1] = 3;
5311 + break;
5312 + case MOUSEDEV_EMUL_EXPS:
5313 + client->ps2[1] = 4;
5314 + break;
5315 + }
5316 + client->bufsiz = 2;
5317 + break;
5318 +
5319 + case 0xe9: /* Get info */
5320 + client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200;
5321 + client->bufsiz = 4;
5322 + break;
5323 +
5324 + case 0xff: /* Reset */
5325 + client->impsseq = client->imexseq = 0;
5326 + client->mode = MOUSEDEV_EMUL_PS2;
5327 + client->ps2[1] = 0xaa; client->ps2[2] = 0x00;
5328 + client->bufsiz = 3;
5329 + break;
5330 +
5331 + default:
5332 + client->bufsiz = 1;
5333 + break;
5334 + }
5335 + client->buffer = client->bufsiz;
5336 +}
5337 +
5338 +static ssize_t mousedev_write(struct file *file, const char __user *buffer,
5339 + size_t count, loff_t *ppos)
5340 {
5341 struct mousedev_client *client = file->private_data;
5342 unsigned char c;
5343 @@ -577,6 +695,8 @@ static ssize_t mousedev_write(struct file *file, const char __user *buffer, size
5344 if (get_user(c, buffer + i))
5345 return -EFAULT;
5346
5347 + spin_lock_irq(&client->packet_lock);
5348 +
5349 if (c == mousedev_imex_seq[client->imexseq]) {
5350 if (++client->imexseq == MOUSEDEV_SEQ_LEN) {
5351 client->imexseq = 0;
5352 @@ -593,68 +713,39 @@ static ssize_t mousedev_write(struct file *file, const char __user *buffer, size
5353 } else
5354 client->impsseq = 0;
5355
5356 - client->ps2[0] = 0xfa;
5357 -
5358 - switch (c) {
5359 -
5360 - case 0xeb: /* Poll */
5361 - mousedev_packet(client, &client->ps2[1]);
5362 - client->bufsiz++; /* account for leading ACK */
5363 - break;
5364 -
5365 - case 0xf2: /* Get ID */
5366 - switch (client->mode) {
5367 - case MOUSEDEV_EMUL_PS2: client->ps2[1] = 0; break;
5368 - case MOUSEDEV_EMUL_IMPS: client->ps2[1] = 3; break;
5369 - case MOUSEDEV_EMUL_EXPS: client->ps2[1] = 4; break;
5370 - }
5371 - client->bufsiz = 2;
5372 - break;
5373 -
5374 - case 0xe9: /* Get info */
5375 - client->ps2[1] = 0x60; client->ps2[2] = 3; client->ps2[3] = 200;
5376 - client->bufsiz = 4;
5377 - break;
5378 -
5379 - case 0xff: /* Reset */
5380 - client->impsseq = client->imexseq = 0;
5381 - client->mode = MOUSEDEV_EMUL_PS2;
5382 - client->ps2[1] = 0xaa; client->ps2[2] = 0x00;
5383 - client->bufsiz = 3;
5384 - break;
5385 -
5386 - default:
5387 - client->bufsiz = 1;
5388 - break;
5389 - }
5390 + mousedev_generate_response(client, c);
5391
5392 - client->buffer = client->bufsiz;
5393 + spin_unlock_irq(&client->packet_lock);
5394 }
5395
5396 kill_fasync(&client->fasync, SIGIO, POLL_IN);
5397 -
5398 wake_up_interruptible(&client->mousedev->wait);
5399
5400 return count;
5401 }
5402
5403 -static ssize_t mousedev_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
5404 +static ssize_t mousedev_read(struct file *file, char __user *buffer,
5405 + size_t count, loff_t *ppos)
5406 {
5407 struct mousedev_client *client = file->private_data;
5408 + struct mousedev *mousedev = client->mousedev;
5409 + signed char data[sizeof(client->ps2)];
5410 int retval = 0;
5411
5412 - if (!client->ready && !client->buffer && (file->f_flags & O_NONBLOCK))
5413 + if (!client->ready && !client->buffer && mousedev->exist &&
5414 + (file->f_flags & O_NONBLOCK))
5415 return -EAGAIN;
5416
5417 - retval = wait_event_interruptible(client->mousedev->wait,
5418 - !client->mousedev->exist || client->ready || client->buffer);
5419 -
5420 + retval = wait_event_interruptible(mousedev->wait,
5421 + !mousedev->exist || client->ready || client->buffer);
5422 if (retval)
5423 return retval;
5424
5425 - if (!client->mousedev->exist)
5426 + if (!mousedev->exist)
5427 return -ENODEV;
5428
5429 + spin_lock_irq(&client->packet_lock);
5430 +
5431 if (!client->buffer && client->ready) {
5432 mousedev_packet(client, client->ps2);
5433 client->buffer = client->bufsiz;
5434 @@ -663,9 +754,12 @@ static ssize_t mousedev_read(struct file *file, char __user *buffer, size_t coun
5435 if (count > client->buffer)
5436 count = client->buffer;
5437
5438 + memcpy(data, client->ps2 + client->bufsiz - client->buffer, count);
5439 client->buffer -= count;
5440
5441 - if (copy_to_user(buffer, client->ps2 + client->bufsiz - client->buffer - count, count))
5442 + spin_unlock_irq(&client->packet_lock);
5443 +
5444 + if (copy_to_user(buffer, data, count))
5445 return -EFAULT;
5446
5447 return count;
5448 @@ -692,6 +786,60 @@ static const struct file_operations mousedev_fops = {
5449 .fasync = mousedev_fasync,
5450 };
5451
5452 +static int mousedev_install_chrdev(struct mousedev *mousedev)
5453 +{
5454 + mousedev_table[mousedev->minor] = mousedev;
5455 + return 0;
5456 +}
5457 +
5458 +static void mousedev_remove_chrdev(struct mousedev *mousedev)
5459 +{
5460 + mutex_lock(&mousedev_table_mutex);
5461 + mousedev_table[mousedev->minor] = NULL;
5462 + mutex_unlock(&mousedev_table_mutex);
5463 +}
5464 +
5465 +/*
5466 + * Mark device non-existent. This disables writes, ioctls and
5467 + * prevents new users from opening the device. Already posted
5468 + * blocking reads will stay, however new ones will fail.
5469 + */
5470 +static void mousedev_mark_dead(struct mousedev *mousedev)
5471 +{
5472 + mutex_lock(&mousedev->mutex);
5473 + mousedev->exist = 0;
5474 + mutex_unlock(&mousedev->mutex);
5475 +}
5476 +
5477 +/*
5478 + * Wake up users waiting for IO so they can disconnect from
5479 + * dead device.
5480 + */
5481 +static void mousedev_hangup(struct mousedev *mousedev)
5482 +{
5483 + struct mousedev_client *client;
5484 +
5485 + spin_lock(&mousedev->client_lock);
5486 + list_for_each_entry(client, &mousedev->client_list, node)
5487 + kill_fasync(&client->fasync, SIGIO, POLL_HUP);
5488 + spin_unlock(&mousedev->client_lock);
5489 +
5490 + wake_up_interruptible(&mousedev->wait);
5491 +}
5492 +
5493 +static void mousedev_cleanup(struct mousedev *mousedev)
5494 +{
5495 + struct input_handle *handle = &mousedev->handle;
5496 +
5497 + mousedev_mark_dead(mousedev);
5498 + mousedev_hangup(mousedev);
5499 + mousedev_remove_chrdev(mousedev);
5500 +
5501 + /* mousedev is marked dead so no one else accesses mousedev->open */
5502 + if (mousedev->open)
5503 + input_close_device(handle);
5504 +}
5505 +
5506 static struct mousedev *mousedev_create(struct input_dev *dev,
5507 struct input_handler *handler,
5508 int minor)
5509 @@ -707,6 +855,10 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
5510
5511 INIT_LIST_HEAD(&mousedev->client_list);
5512 INIT_LIST_HEAD(&mousedev->mixdev_node);
5513 + spin_lock_init(&mousedev->client_lock);
5514 + mutex_init(&mousedev->mutex);
5515 + lockdep_set_subclass(&mousedev->mutex,
5516 + minor == MOUSEDEV_MIX ? MOUSEDEV_MIX : 0);
5517 init_waitqueue_head(&mousedev->wait);
5518
5519 if (minor == MOUSEDEV_MIX)
5520 @@ -731,14 +883,27 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
5521 mousedev->dev.release = mousedev_free;
5522 device_initialize(&mousedev->dev);
5523
5524 - mousedev_table[minor] = mousedev;
5525 + if (minor != MOUSEDEV_MIX) {
5526 + error = input_register_handle(&mousedev->handle);
5527 + if (error)
5528 + goto err_free_mousedev;
5529 + }
5530 +
5531 + error = mousedev_install_chrdev(mousedev);
5532 + if (error)
5533 + goto err_unregister_handle;
5534
5535 error = device_add(&mousedev->dev);
5536 if (error)
5537 - goto err_free_mousedev;
5538 + goto err_cleanup_mousedev;
5539
5540 return mousedev;
5541
5542 + err_cleanup_mousedev:
5543 + mousedev_cleanup(mousedev);
5544 + err_unregister_handle:
5545 + if (minor != MOUSEDEV_MIX)
5546 + input_unregister_handle(&mousedev->handle);
5547 err_free_mousedev:
5548 put_device(&mousedev->dev);
5549 err_out:
5550 @@ -747,29 +912,64 @@ static struct mousedev *mousedev_create(struct input_dev *dev,
5551
5552 static void mousedev_destroy(struct mousedev *mousedev)
5553 {
5554 - struct mousedev_client *client;
5555 -
5556 device_del(&mousedev->dev);
5557 - mousedev->exist = 0;
5558 + mousedev_cleanup(mousedev);
5559 + if (mousedev->minor != MOUSEDEV_MIX)
5560 + input_unregister_handle(&mousedev->handle);
5561 + put_device(&mousedev->dev);
5562 +}
5563
5564 - if (mousedev->open) {
5565 - input_close_device(&mousedev->handle);
5566 - list_for_each_entry(client, &mousedev->client_list, node)
5567 - kill_fasync(&client->fasync, SIGIO, POLL_HUP);
5568 - wake_up_interruptible(&mousedev->wait);
5569 +static int mixdev_add_device(struct mousedev *mousedev)
5570 +{
5571 + int retval;
5572 +
5573 + retval = mutex_lock_interruptible(&mousedev_mix->mutex);
5574 + if (retval)
5575 + return retval;
5576 +
5577 + if (mousedev_mix->open) {
5578 + retval = mousedev_open_device(mousedev);
5579 + if (retval)
5580 + goto out;
5581 +
5582 + mousedev->mixdev_open = 1;
5583 }
5584
5585 + get_device(&mousedev->dev);
5586 + list_add_tail(&mousedev->mixdev_node, &mousedev_mix_list);
5587 +
5588 + out:
5589 + mutex_unlock(&mousedev_mix->mutex);
5590 + return retval;
5591 +}
5592 +
5593 +static void mixdev_remove_device(struct mousedev *mousedev)
5594 +{
5595 + mutex_lock(&mousedev_mix->mutex);
5596 +
5597 + if (mousedev->mixdev_open) {
5598 + mousedev->mixdev_open = 0;
5599 + mousedev_close_device(mousedev);
5600 + }
5601 +
5602 + list_del_init(&mousedev->mixdev_node);
5603 + mutex_unlock(&mousedev_mix->mutex);
5604 +
5605 put_device(&mousedev->dev);
5606 }
5607
5608 -static int mousedev_connect(struct input_handler *handler, struct input_dev *dev,
5609 +static int mousedev_connect(struct input_handler *handler,
5610 + struct input_dev *dev,
5611 const struct input_device_id *id)
5612 {
5613 struct mousedev *mousedev;
5614 int minor;
5615 int error;
5616
5617 - for (minor = 0; minor < MOUSEDEV_MINORS && mousedev_table[minor]; minor++);
5618 + for (minor = 0; minor < MOUSEDEV_MINORS; minor++)
5619 + if (!mousedev_table[minor])
5620 + break;
5621 +
5622 if (minor == MOUSEDEV_MINORS) {
5623 printk(KERN_ERR "mousedev: no more free mousedev devices\n");
5624 return -ENFILE;
5625 @@ -779,21 +979,13 @@ static int mousedev_connect(struct input_handler *handler, struct input_dev *dev
5626 if (IS_ERR(mousedev))
5627 return PTR_ERR(mousedev);
5628
5629 - error = input_register_handle(&mousedev->handle);
5630 - if (error)
5631 - goto err_delete_mousedev;
5632 -
5633 error = mixdev_add_device(mousedev);
5634 - if (error)
5635 - goto err_unregister_handle;
5636 + if (error) {
5637 + mousedev_destroy(mousedev);
5638 + return error;
5639 + }
5640
5641 return 0;
5642 -
5643 - err_unregister_handle:
5644 - input_unregister_handle(&mousedev->handle);
5645 - err_delete_mousedev:
5646 - device_unregister(&mousedev->dev);
5647 - return error;
5648 }
5649
5650 static void mousedev_disconnect(struct input_handle *handle)
5651 @@ -801,33 +993,42 @@ static void mousedev_disconnect(struct input_handle *handle)
5652 struct mousedev *mousedev = handle->private;
5653
5654 mixdev_remove_device(mousedev);
5655 - input_unregister_handle(handle);
5656 mousedev_destroy(mousedev);
5657 }
5658
5659 static const struct input_device_id mousedev_ids[] = {
5660 {
5661 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT | INPUT_DEVICE_ID_MATCH_RELBIT,
5662 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
5663 + INPUT_DEVICE_ID_MATCH_KEYBIT |
5664 + INPUT_DEVICE_ID_MATCH_RELBIT,
5665 .evbit = { BIT(EV_KEY) | BIT(EV_REL) },
5666 .keybit = { [LONG(BTN_LEFT)] = BIT(BTN_LEFT) },
5667 .relbit = { BIT(REL_X) | BIT(REL_Y) },
5668 - }, /* A mouse like device, at least one button, two relative axes */
5669 + }, /* A mouse like device, at least one button,
5670 + two relative axes */
5671 {
5672 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_RELBIT,
5673 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
5674 + INPUT_DEVICE_ID_MATCH_RELBIT,
5675 .evbit = { BIT(EV_KEY) | BIT(EV_REL) },
5676 .relbit = { BIT(REL_WHEEL) },
5677 }, /* A separate scrollwheel */
5678 {
5679 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
5680 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
5681 + INPUT_DEVICE_ID_MATCH_KEYBIT |
5682 + INPUT_DEVICE_ID_MATCH_ABSBIT,
5683 .evbit = { BIT(EV_KEY) | BIT(EV_ABS) },
5684 .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) },
5685 .absbit = { BIT(ABS_X) | BIT(ABS_Y) },
5686 - }, /* A tablet like device, at least touch detection, two absolute axes */
5687 + }, /* A tablet like device, at least touch detection,
5688 + two absolute axes */
5689 {
5690 - .flags = INPUT_DEVICE_ID_MATCH_EVBIT | INPUT_DEVICE_ID_MATCH_KEYBIT | INPUT_DEVICE_ID_MATCH_ABSBIT,
5691 + .flags = INPUT_DEVICE_ID_MATCH_EVBIT |
5692 + INPUT_DEVICE_ID_MATCH_KEYBIT |
5693 + INPUT_DEVICE_ID_MATCH_ABSBIT,
5694 .evbit = { BIT(EV_KEY) | BIT(EV_ABS) },
5695 .keybit = { [LONG(BTN_TOOL_FINGER)] = BIT(BTN_TOOL_FINGER) },
5696 - .absbit = { BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) | BIT(ABS_TOOL_WIDTH) },
5697 + .absbit = { BIT(ABS_X) | BIT(ABS_Y) | BIT(ABS_PRESSURE) |
5698 + BIT(ABS_TOOL_WIDTH) },
5699 }, /* A touchpad */
5700
5701 { }, /* Terminating entry */
5702 diff --git a/drivers/input/tsdev.c b/drivers/input/tsdev.c
5703 index d2f882e..1202334 100644
5704 --- a/drivers/input/tsdev.c
5705 +++ b/drivers/input/tsdev.c
5706 @@ -112,6 +112,8 @@ struct tsdev {
5707 struct input_handle handle;
5708 wait_queue_head_t wait;
5709 struct list_head client_list;
5710 + spinlock_t client_lock; /* protects client_list */
5711 + struct mutex mutex;
5712 struct device dev;
5713
5714 int x, y, pressure;
5715 @@ -122,8 +124,9 @@ struct tsdev_client {
5716 struct fasync_struct *fasync;
5717 struct list_head node;
5718 struct tsdev *tsdev;
5719 + struct ts_event buffer[TSDEV_BUFFER_SIZE];
5720 int head, tail;
5721 - struct ts_event event[TSDEV_BUFFER_SIZE];
5722 + spinlock_t buffer_lock; /* protects access to buffer, head and tail */
5723 int raw;
5724 };
5725
5726 @@ -137,6 +140,7 @@ struct tsdev_client {
5727 #define TS_SET_CAL _IOW(IOC_H3600_TS_MAGIC, 11, struct ts_calibration)
5728
5729 static struct tsdev *tsdev_table[TSDEV_MINORS/2];
5730 +static DEFINE_MUTEX(tsdev_table_mutex);
5731
5732 static int tsdev_fasync(int fd, struct file *file, int on)
5733 {
5734 @@ -144,9 +148,94 @@ static int tsdev_fasync(int fd, struct file *file, int on)
5735 int retval;
5736
5737 retval = fasync_helper(fd, file, on, &client->fasync);
5738 +
5739 return retval < 0 ? retval : 0;
5740 }
5741
5742 +static void tsdev_free(struct device *dev)
5743 +{
5744 + struct tsdev *tsdev = container_of(dev, struct tsdev, dev);
5745 +
5746 + kfree(tsdev);
5747 +}
5748 +
5749 +static void tsdev_attach_client(struct tsdev *tsdev, struct tsdev_client *client)
5750 +{
5751 + spin_lock(&tsdev->client_lock);
5752 + list_add_tail_rcu(&client->node, &tsdev->client_list);
5753 + spin_unlock(&tsdev->client_lock);
5754 + synchronize_sched();
5755 +}
5756 +
5757 +static void tsdev_detach_client(struct tsdev *tsdev, struct tsdev_client *client)
5758 +{
5759 + spin_lock(&tsdev->client_lock);
5760 + list_del_rcu(&client->node);
5761 + spin_unlock(&tsdev->client_lock);
5762 + synchronize_sched();
5763 +}
5764 +
5765 +static int tsdev_open_device(struct tsdev *tsdev)
5766 +{
5767 + int retval;
5768 +
5769 + retval = mutex_lock_interruptible(&tsdev->mutex);
5770 + if (retval)
5771 + return retval;
5772 +
5773 + if (!tsdev->exist)
5774 + retval = -ENODEV;
5775 + else if (!tsdev->open++) {
5776 + retval = input_open_device(&tsdev->handle);
5777 + if (retval)
5778 + tsdev->open--;
5779 + }
5780 +
5781 + mutex_unlock(&tsdev->mutex);
5782 + return retval;
5783 +}
5784 +
5785 +static void tsdev_close_device(struct tsdev *tsdev)
5786 +{
5787 + mutex_lock(&tsdev->mutex);
5788 +
5789 + if (tsdev->exist && !--tsdev->open)
5790 + input_close_device(&tsdev->handle);
5791 +
5792 + mutex_unlock(&tsdev->mutex);
5793 +}
5794 +
5795 +/*
5796 + * Wake up users waiting for IO so they can disconnect from
5797 + * dead device.
5798 + */
5799 +static void tsdev_hangup(struct tsdev *tsdev)
5800 +{
5801 + struct tsdev_client *client;
5802 +
5803 + spin_lock(&tsdev->client_lock);
5804 + list_for_each_entry(client, &tsdev->client_list, node)
5805 + kill_fasync(&client->fasync, SIGIO, POLL_HUP);
5806 + spin_unlock(&tsdev->client_lock);
5807 +
5808 + wake_up_interruptible(&tsdev->wait);
5809 +}
5810 +
5811 +static int tsdev_release(struct inode *inode, struct file *file)
5812 +{
5813 + struct tsdev_client *client = file->private_data;
5814 + struct tsdev *tsdev = client->tsdev;
5815 +
5816 + tsdev_fasync(-1, file, 0);
5817 + tsdev_detach_client(tsdev, client);
5818 + kfree(client);
5819 +
5820 + tsdev_close_device(tsdev);
5821 + put_device(&tsdev->dev);
5822 +
5823 + return 0;
5824 +}
5825 +
5826 static int tsdev_open(struct inode *inode, struct file *file)
5827 {
5828 int i = iminor(inode) - TSDEV_MINOR_BASE;
5829 @@ -161,11 +250,16 @@ static int tsdev_open(struct inode *inode, struct file *file)
5830 if (i >= TSDEV_MINORS)
5831 return -ENODEV;
5832
5833 + error = mutex_lock_interruptible(&tsdev_table_mutex);
5834 + if (error)
5835 + return error;
5836 tsdev = tsdev_table[i & TSDEV_MINOR_MASK];
5837 - if (!tsdev || !tsdev->exist)
5838 - return -ENODEV;
5839 + if (tsdev)
5840 + get_device(&tsdev->dev);
5841 + mutex_unlock(&tsdev_table_mutex);
5842
5843 - get_device(&tsdev->dev);
5844 + if (!tsdev)
5845 + return -ENODEV;
5846
5847 client = kzalloc(sizeof(struct tsdev_client), GFP_KERNEL);
5848 if (!client) {
5849 @@ -173,51 +267,42 @@ static int tsdev_open(struct inode *inode, struct file *file)
5850 goto err_put_tsdev;
5851 }
5852
5853 + spin_lock_init(&client->buffer_lock);
5854 client->tsdev = tsdev;
5855 - client->raw = (i >= TSDEV_MINORS / 2) ? 1 : 0;
5856 - list_add_tail(&client->node, &tsdev->client_list);
5857 + client->raw = i >= TSDEV_MINORS / 2;
5858 + tsdev_attach_client(tsdev, client);
5859
5860 - if (!tsdev->open++ && tsdev->exist) {
5861 - error = input_open_device(&tsdev->handle);
5862 - if (error)
5863 - goto err_free_client;
5864 - }
5865 + error = tsdev_open_device(tsdev);
5866 + if (error)
5867 + goto err_free_client;
5868
5869 file->private_data = client;
5870 return 0;
5871
5872 err_free_client:
5873 - list_del(&client->node);
5874 + tsdev_detach_client(tsdev, client);
5875 kfree(client);
5876 err_put_tsdev:
5877 put_device(&tsdev->dev);
5878 return error;
5879 }
5880
5881 -static void tsdev_free(struct device *dev)
5882 -{
5883 - struct tsdev *tsdev = container_of(dev, struct tsdev, dev);
5884 -
5885 - tsdev_table[tsdev->minor] = NULL;
5886 - kfree(tsdev);
5887 -}
5888 -
5889 -static int tsdev_release(struct inode *inode, struct file *file)
5890 +static int tsdev_fetch_next_event(struct tsdev_client *client,
5891 + struct ts_event *event)
5892 {
5893 - struct tsdev_client *client = file->private_data;
5894 - struct tsdev *tsdev = client->tsdev;
5895 + int have_event;
5896
5897 - tsdev_fasync(-1, file, 0);
5898 -
5899 - list_del(&client->node);
5900 - kfree(client);
5901 + spin_lock_irq(&client->buffer_lock);
5902
5903 - if (!--tsdev->open && tsdev->exist)
5904 - input_close_device(&tsdev->handle);
5905 + have_event = client->head != client->tail;
5906 + if (have_event) {
5907 + *event = client->buffer[client->tail++];
5908 + client->tail &= TSDEV_BUFFER_SIZE - 1;
5909 + }
5910
5911 - put_device(&tsdev->dev);
5912 + spin_unlock_irq(&client->buffer_lock);
5913
5914 - return 0;
5915 + return have_event;
5916 }
5917
5918 static ssize_t tsdev_read(struct file *file, char __user *buffer, size_t count,
5919 @@ -225,9 +310,11 @@ static ssize_t tsdev_read(struct file *file, char __user *buffer, size_t count,
5920 {
5921 struct tsdev_client *client = file->private_data;
5922 struct tsdev *tsdev = client->tsdev;
5923 - int retval = 0;
5924 + struct ts_event event;
5925 + int retval;
5926
5927 - if (client->head == client->tail && tsdev->exist && (file->f_flags & O_NONBLOCK))
5928 + if (client->head == client->tail && tsdev->exist &&
5929 + (file->f_flags & O_NONBLOCK))
5930 return -EAGAIN;
5931
5932 retval = wait_event_interruptible(tsdev->wait,
5933 @@ -238,13 +325,14 @@ static ssize_t tsdev_read(struct file *file, char __user *buffer, size_t count,
5934 if (!tsdev->exist)
5935 return -ENODEV;
5936
5937 - while (client->head != client->tail &&
5938 - retval + sizeof (struct ts_event) <= count) {
5939 - if (copy_to_user (buffer + retval, client->event + client->tail,
5940 - sizeof (struct ts_event)))
5941 + while (retval + sizeof(struct ts_event) <= count &&
5942 + tsdev_fetch_next_event(client, &event)) {
5943 +
5944 + if (copy_to_user(buffer + retval, &event,
5945 + sizeof(struct ts_event)))
5946 return -EFAULT;
5947 - client->tail = (client->tail + 1) & (TSDEV_BUFFER_SIZE - 1);
5948 - retval += sizeof (struct ts_event);
5949 +
5950 + retval += sizeof(struct ts_event);
5951 }
5952
5953 return retval;
5954 @@ -261,14 +349,23 @@ static unsigned int tsdev_poll(struct file *file, poll_table *wait)
5955 (tsdev->exist ? 0 : (POLLHUP | POLLERR));
5956 }
5957
5958 -static int tsdev_ioctl(struct inode *inode, struct file *file,
5959 - unsigned int cmd, unsigned long arg)
5960 +static long tsdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
5961 {
5962 struct tsdev_client *client = file->private_data;
5963 struct tsdev *tsdev = client->tsdev;
5964 int retval = 0;
5965
5966 + retval = mutex_lock_interruptible(&tsdev->mutex);
5967 + if (retval)
5968 + return retval;
5969 +
5970 + if (!tsdev->exist) {
5971 + retval = -ENODEV;
5972 + goto out;
5973 + }
5974 +
5975 switch (cmd) {
5976 +
5977 case TS_GET_CAL:
5978 if (copy_to_user((void __user *)arg, &tsdev->cal,
5979 sizeof (struct ts_calibration)))
5980 @@ -277,7 +374,7 @@ static int tsdev_ioctl(struct inode *inode, struct file *file,
5981
5982 case TS_SET_CAL:
5983 if (copy_from_user(&tsdev->cal, (void __user *)arg,
5984 - sizeof (struct ts_calibration)))
5985 + sizeof(struct ts_calibration)))
5986 retval = -EFAULT;
5987 break;
5988
5989 @@ -286,29 +383,79 @@ static int tsdev_ioctl(struct inode *inode, struct file *file,
5990 break;
5991 }
5992
5993 + out:
5994 + mutex_unlock(&tsdev->mutex);
5995 return retval;
5996 }
5997
5998 static const struct file_operations tsdev_fops = {
5999 - .owner = THIS_MODULE,
6000 - .open = tsdev_open,
6001 - .release = tsdev_release,
6002 - .read = tsdev_read,
6003 - .poll = tsdev_poll,
6004 - .fasync = tsdev_fasync,
6005 - .ioctl = tsdev_ioctl,
6006 + .owner = THIS_MODULE,
6007 + .open = tsdev_open,
6008 + .release = tsdev_release,
6009 + .read = tsdev_read,
6010 + .poll = tsdev_poll,
6011 + .fasync = tsdev_fasync,
6012 + .unlocked_ioctl = tsdev_ioctl,
6013 };
6014
6015 +static void tsdev_pass_event(struct tsdev *tsdev, struct tsdev_client *client,
6016 + int x, int y, int pressure, int millisecs)
6017 +{
6018 + struct ts_event *event;
6019 + int tmp;
6020 +
6021 + /* Interrupts are already disabled, just acquire the lock */
6022 + spin_lock(&client->buffer_lock);
6023 +
6024 + event = &client->buffer[client->head++];
6025 + client->head &= TSDEV_BUFFER_SIZE - 1;
6026 +
6027 + /* Calibration */
6028 + if (!client->raw) {
6029 + x = ((x * tsdev->cal.xscale) >> 8) + tsdev->cal.xtrans;
6030 + y = ((y * tsdev->cal.yscale) >> 8) + tsdev->cal.ytrans;
6031 + if (tsdev->cal.xyswap) {
6032 + tmp = x; x = y; y = tmp;
6033 + }
6034 + }
6035 +
6036 + event->millisecs = millisecs;
6037 + event->x = x;
6038 + event->y = y;
6039 + event->pressure = pressure;
6040 +
6041 + spin_unlock(&client->buffer_lock);
6042 +
6043 + kill_fasync(&client->fasync, SIGIO, POLL_IN);
6044 +}
6045 +
6046 +static void tsdev_distribute_event(struct tsdev *tsdev)
6047 +{
6048 + struct tsdev_client *client;
6049 + struct timeval time;
6050 + int millisecs;
6051 +
6052 + do_gettimeofday(&time);
6053 + millisecs = time.tv_usec / 1000;
6054 +
6055 + list_for_each_entry_rcu(client, &tsdev->client_list, node)
6056 + tsdev_pass_event(tsdev, client,
6057 + tsdev->x, tsdev->y,
6058 + tsdev->pressure, millisecs);
6059 +}
6060 +
6061 static void tsdev_event(struct input_handle *handle, unsigned int type,
6062 unsigned int code, int value)
6063 {
6064 struct tsdev *tsdev = handle->private;
6065 - struct tsdev_client *client;
6066 - struct timeval time;
6067 + struct input_dev *dev = handle->dev;
6068 + int wake_up_readers = 0;
6069
6070 switch (type) {
6071 +
6072 case EV_ABS:
6073 switch (code) {
6074 +
6075 case ABS_X:
6076 tsdev->x = value;
6077 break;
6078 @@ -318,9 +465,9 @@ static void tsdev_event(struct input_handle *handle, unsigned int type,
6079 break;
6080
6081 case ABS_PRESSURE:
6082 - if (value > handle->dev->absmax[ABS_PRESSURE])
6083 - value = handle->dev->absmax[ABS_PRESSURE];
6084 - value -= handle->dev->absmin[ABS_PRESSURE];
6085 + if (value > dev->absmax[ABS_PRESSURE])
6086 + value = dev->absmax[ABS_PRESSURE];
6087 + value -= dev->absmin[ABS_PRESSURE];
6088 if (value < 0)
6089 value = 0;
6090 tsdev->pressure = value;
6091 @@ -330,6 +477,7 @@ static void tsdev_event(struct input_handle *handle, unsigned int type,
6092
6093 case EV_REL:
6094 switch (code) {
6095 +
6096 case REL_X:
6097 tsdev->x += value;
6098 if (tsdev->x < 0)
6099 @@ -351,6 +499,7 @@ static void tsdev_event(struct input_handle *handle, unsigned int type,
6100 case EV_KEY:
6101 if (code == BTN_TOUCH || code == BTN_MOUSE) {
6102 switch (value) {
6103 +
6104 case 0:
6105 tsdev->pressure = 0;
6106 break;
6107 @@ -362,49 +511,71 @@ static void tsdev_event(struct input_handle *handle, unsigned int type,
6108 }
6109 }
6110 break;
6111 +
6112 + case EV_SYN:
6113 + if (code == SYN_REPORT) {
6114 + tsdev_distribute_event(tsdev);
6115 + wake_up_readers = 1;
6116 + }
6117 + break;
6118 }
6119
6120 - if (type != EV_SYN || code != SYN_REPORT)
6121 - return;
6122 + if (wake_up_readers)
6123 + wake_up_interruptible(&tsdev->wait);
6124 +}
6125 +
6126 +static int tsdev_install_chrdev(struct tsdev *tsdev)
6127 +{
6128 + tsdev_table[tsdev->minor] = tsdev;
6129 + return 0;
6130 +}
6131
6132 - list_for_each_entry(client, &tsdev->client_list, node) {
6133 - int x, y, tmp;
6134 +static void tsdev_remove_chrdev(struct tsdev *tsdev)
6135 +{
6136 + mutex_lock(&tsdev_table_mutex);
6137 + tsdev_table[tsdev->minor] = NULL;
6138 + mutex_unlock(&tsdev_table_mutex);
6139 +}
6140
6141 - do_gettimeofday(&time);
6142 - client->event[client->head].millisecs = time.tv_usec / 1000;
6143 - client->event[client->head].pressure = tsdev->pressure;
6144 +/*
6145 + * Mark device non-existant. This disables writes, ioctls and
6146 + * prevents new users from opening the device. Already posted
6147 + * blocking reads will stay, however new ones will fail.
6148 + */
6149 +static void tsdev_mark_dead(struct tsdev *tsdev)
6150 +{
6151 + mutex_lock(&tsdev->mutex);
6152 + tsdev->exist = 0;
6153 + mutex_unlock(&tsdev->mutex);
6154 +}
6155
6156 - x = tsdev->x;
6157 - y = tsdev->y;
6158 +static void tsdev_cleanup(struct tsdev *tsdev)
6159 +{
6160 + struct input_handle *handle = &tsdev->handle;
6161
6162 - /* Calibration */
6163 - if (!client->raw) {
6164 - x = ((x * tsdev->cal.xscale) >> 8) + tsdev->cal.xtrans;
6165 - y = ((y * tsdev->cal.yscale) >> 8) + tsdev->cal.ytrans;
6166 - if (tsdev->cal.xyswap) {
6167 - tmp = x; x = y; y = tmp;
6168 - }
6169 - }
6170 + tsdev_mark_dead(tsdev);
6171 + tsdev_hangup(tsdev);
6172 + tsdev_remove_chrdev(tsdev);
6173
6174 - client->event[client->head].x = x;
6175 - client->event[client->head].y = y;
6176 - client->head = (client->head + 1) & (TSDEV_BUFFER_SIZE - 1);
6177 - kill_fasync(&client->fasync, SIGIO, POLL_IN);
6178 - }
6179 - wake_up_interruptible(&tsdev->wait);
6180 + /* tsdev is marked dead so noone else accesses tsdev->open */
6181 + if (tsdev->open)
6182 + input_close_device(handle);
6183 }
6184
6185 static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
6186 const struct input_device_id *id)
6187 {
6188 struct tsdev *tsdev;
6189 - int minor, delta;
6190 + int delta;
6191 + int minor;
6192 int error;
6193
6194 - for (minor = 0; minor < TSDEV_MINORS / 2 && tsdev_table[minor]; minor++);
6195 - if (minor >= TSDEV_MINORS / 2) {
6196 - printk(KERN_ERR
6197 - "tsdev: You have way too many touchscreens\n");
6198 + for (minor = 0; minor < TSDEV_MINORS / 2; minor++)
6199 + if (!tsdev_table[minor])
6200 + break;
6201 +
6202 + if (minor == TSDEV_MINORS) {
6203 + printk(KERN_ERR "tsdev: no more free tsdev devices\n");
6204 return -ENFILE;
6205 }
6206
6207 @@ -413,15 +584,18 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
6208 return -ENOMEM;
6209
6210 INIT_LIST_HEAD(&tsdev->client_list);
6211 + spin_lock_init(&tsdev->client_lock);
6212 + mutex_init(&tsdev->mutex);
6213 init_waitqueue_head(&tsdev->wait);
6214
6215 + snprintf(tsdev->name, sizeof(tsdev->name), "ts%d", minor);
6216 tsdev->exist = 1;
6217 tsdev->minor = minor;
6218 +
6219 tsdev->handle.dev = dev;
6220 tsdev->handle.name = tsdev->name;
6221 tsdev->handle.handler = handler;
6222 tsdev->handle.private = tsdev;
6223 - snprintf(tsdev->name, sizeof(tsdev->name), "ts%d", minor);
6224
6225 /* Precompute the rough calibration matrix */
6226 delta = dev->absmax [ABS_X] - dev->absmin [ABS_X] + 1;
6227 @@ -436,28 +610,31 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
6228 tsdev->cal.yscale = (yres << 8) / delta;
6229 tsdev->cal.ytrans = - ((dev->absmin [ABS_Y] * tsdev->cal.yscale) >> 8);
6230
6231 - snprintf(tsdev->dev.bus_id, sizeof(tsdev->dev.bus_id),
6232 - "ts%d", minor);
6233 + strlcpy(tsdev->dev.bus_id, tsdev->name, sizeof(tsdev->dev.bus_id));
6234 + tsdev->dev.devt = MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor);
6235 tsdev->dev.class = &input_class;
6236 tsdev->dev.parent = &dev->dev;
6237 - tsdev->dev.devt = MKDEV(INPUT_MAJOR, TSDEV_MINOR_BASE + minor);
6238 tsdev->dev.release = tsdev_free;
6239 device_initialize(&tsdev->dev);
6240
6241 - tsdev_table[minor] = tsdev;
6242 -
6243 - error = device_add(&tsdev->dev);
6244 + error = input_register_handle(&tsdev->handle);
6245 if (error)
6246 goto err_free_tsdev;
6247
6248 - error = input_register_handle(&tsdev->handle);
6249 + error = tsdev_install_chrdev(tsdev);
6250 if (error)
6251 - goto err_delete_tsdev;
6252 + goto err_unregister_handle;
6253 +
6254 + error = device_add(&tsdev->dev);
6255 + if (error)
6256 + goto err_cleanup_tsdev;
6257
6258 return 0;
6259
6260 - err_delete_tsdev:
6261 - device_del(&tsdev->dev);
6262 + err_cleanup_tsdev:
6263 + tsdev_cleanup(tsdev);
6264 + err_unregister_handle:
6265 + input_unregister_handle(&tsdev->handle);
6266 err_free_tsdev:
6267 put_device(&tsdev->dev);
6268 return error;
6269 @@ -466,20 +643,10 @@ static int tsdev_connect(struct input_handler *handler, struct input_dev *dev,
6270 static void tsdev_disconnect(struct input_handle *handle)
6271 {
6272 struct tsdev *tsdev = handle->private;
6273 - struct tsdev_client *client;
6274
6275 - input_unregister_handle(handle);
6276 device_del(&tsdev->dev);
6277 -
6278 - tsdev->exist = 0;
6279 -
6280 - if (tsdev->open) {
6281 - input_close_device(handle);
6282 - list_for_each_entry(client, &tsdev->client_list, node)
6283 - kill_fasync(&client->fasync, SIGIO, POLL_HUP);
6284 - wake_up_interruptible(&tsdev->wait);
6285 - }
6286 -
6287 + tsdev_cleanup(tsdev);
6288 + input_unregister_handle(handle);
6289 put_device(&tsdev->dev);
6290 }
6291
6292 @@ -510,13 +677,13 @@ static const struct input_device_id tsdev_ids[] = {
6293 MODULE_DEVICE_TABLE(input, tsdev_ids);
6294
6295 static struct input_handler tsdev_handler = {
6296 - .event = tsdev_event,
6297 - .connect = tsdev_connect,
6298 - .disconnect = tsdev_disconnect,
6299 - .fops = &tsdev_fops,
6300 - .minor = TSDEV_MINOR_BASE,
6301 - .name = "tsdev",
6302 - .id_table = tsdev_ids,
6303 + .event = tsdev_event,
6304 + .connect = tsdev_connect,
6305 + .disconnect = tsdev_disconnect,
6306 + .fops = &tsdev_fops,
6307 + .minor = TSDEV_MINOR_BASE,
6308 + .name = "tsdev",
6309 + .id_table = tsdev_ids,
6310 };
6311
6312 static int __init tsdev_init(void)
6313 diff --git a/drivers/isdn/capi/capidrv.c b/drivers/isdn/capi/capidrv.c
6314 index 23b6f7b..f65b7f9 100644
6315 --- a/drivers/isdn/capi/capidrv.c
6316 +++ b/drivers/isdn/capi/capidrv.c
6317 @@ -2306,13 +2306,14 @@ static int __init capidrv_init(void)
6318
6319 static void __exit capidrv_exit(void)
6320 {
6321 - char rev[10];
6322 + char rev[32];
6323 char *p;
6324
6325 if ((p = strchr(revision, ':')) != 0) {
6326 - strcpy(rev, p + 1);
6327 - p = strchr(rev, '$');
6328 - *p = 0;
6329 + strncpy(rev, p + 1, sizeof(rev));
6330 + rev[sizeof(rev)-1] = 0;
6331 + if ((p = strchr(rev, '$')) != 0)
6332 + *p = 0;
6333 } else {
6334 strcpy(rev, " ??? ");
6335 }
6336 diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
6337 index bdc52d6..ba2e135 100644
6338 --- a/drivers/md/dm-crypt.c
6339 +++ b/drivers/md/dm-crypt.c
6340 @@ -399,7 +399,8 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size)
6341 struct bio *clone;
6342 unsigned int nr_iovecs = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
6343 gfp_t gfp_mask = GFP_NOIO | __GFP_HIGHMEM;
6344 - unsigned int i;
6345 + unsigned i, len;
6346 + struct page *page;
6347
6348 clone = bio_alloc_bioset(GFP_NOIO, nr_iovecs, cc->bs);
6349 if (!clone)
6350 @@ -408,10 +409,8 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size)
6351 clone_init(io, clone);
6352
6353 for (i = 0; i < nr_iovecs; i++) {
6354 - struct bio_vec *bv = bio_iovec_idx(clone, i);
6355 -
6356 - bv->bv_page = mempool_alloc(cc->page_pool, gfp_mask);
6357 - if (!bv->bv_page)
6358 + page = mempool_alloc(cc->page_pool, gfp_mask);
6359 + if (!page)
6360 break;
6361
6362 /*
6363 @@ -422,15 +421,14 @@ static struct bio *crypt_alloc_buffer(struct dm_crypt_io *io, unsigned size)
6364 if (i == (MIN_BIO_PAGES - 1))
6365 gfp_mask = (gfp_mask | __GFP_NOWARN) & ~__GFP_WAIT;
6366
6367 - bv->bv_offset = 0;
6368 - if (size > PAGE_SIZE)
6369 - bv->bv_len = PAGE_SIZE;
6370 - else
6371 - bv->bv_len = size;
6372 + len = (size > PAGE_SIZE) ? PAGE_SIZE : size;
6373 +
6374 + if (!bio_add_page(clone, page, len, 0)) {
6375 + mempool_free(page, cc->page_pool);
6376 + break;
6377 + }
6378
6379 - clone->bi_size += bv->bv_len;
6380 - clone->bi_vcnt++;
6381 - size -= bv->bv_len;
6382 + size -= len;
6383 }
6384
6385 if (!clone->bi_size) {
6386 @@ -515,6 +513,9 @@ static int crypt_endio(struct bio *clone, unsigned int done, int error)
6387 struct crypt_config *cc = io->target->private;
6388 unsigned read_io = bio_data_dir(clone) == READ;
6389
6390 + if (unlikely(!bio_flagged(clone, BIO_UPTODATE) && !error))
6391 + error = -EIO;
6392 +
6393 /*
6394 * free the processed pages, even if
6395 * it's only a partially completed write
6396 @@ -529,10 +530,8 @@ static int crypt_endio(struct bio *clone, unsigned int done, int error)
6397 if (!read_io)
6398 goto out;
6399
6400 - if (unlikely(!bio_flagged(clone, BIO_UPTODATE))) {
6401 - error = -EIO;
6402 + if (unlikely(error))
6403 goto out;
6404 - }
6405
6406 bio_put(clone);
6407 io->post_process = 1;
6408 diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
6409 index b441d82..8a4f63b 100644
6410 --- a/drivers/md/dm-ioctl.c
6411 +++ b/drivers/md/dm-ioctl.c
6412 @@ -1250,21 +1250,17 @@ static int target_message(struct dm_ioctl *param, size_t param_size)
6413 if (!table)
6414 goto out_argv;
6415
6416 - if (tmsg->sector >= dm_table_get_size(table)) {
6417 + ti = dm_table_find_target(table, tmsg->sector);
6418 + if (!dm_target_is_valid(ti)) {
6419 DMWARN("Target message sector outside device.");
6420 r = -EINVAL;
6421 - goto out_table;
6422 - }
6423 -
6424 - ti = dm_table_find_target(table, tmsg->sector);
6425 - if (ti->type->message)
6426 + } else if (ti->type->message)
6427 r = ti->type->message(ti, argc, argv);
6428 else {
6429 DMWARN("Target type does not support messages");
6430 r = -EINVAL;
6431 }
6432
6433 - out_table:
6434 dm_table_put(table);
6435 out_argv:
6436 kfree(argv);
6437 diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c
6438 index 2bcde57..72d2250 100644
6439 --- a/drivers/md/dm-table.c
6440 +++ b/drivers/md/dm-table.c
6441 @@ -187,8 +187,10 @@ static int alloc_targets(struct dm_table *t, unsigned int num)
6442
6443 /*
6444 * Allocate both the target array and offset array at once.
6445 + * Append an empty entry to catch sectors beyond the end of
6446 + * the device.
6447 */
6448 - n_highs = (sector_t *) dm_vcalloc(num, sizeof(struct dm_target) +
6449 + n_highs = (sector_t *) dm_vcalloc(num + 1, sizeof(struct dm_target) +
6450 sizeof(sector_t));
6451 if (!n_highs)
6452 return -ENOMEM;
6453 @@ -862,6 +864,9 @@ struct dm_target *dm_table_get_target(struct dm_table *t, unsigned int index)
6454
6455 /*
6456 * Search the btree for the correct target.
6457 + *
6458 + * Caller should check returned pointer with dm_target_is_valid()
6459 + * to trap I/O beyond end of device.
6460 */
6461 struct dm_target *dm_table_find_target(struct dm_table *t, sector_t sector)
6462 {
6463 diff --git a/drivers/md/dm.c b/drivers/md/dm.c
6464 index 998d450..fac09d5 100644
6465 --- a/drivers/md/dm.c
6466 +++ b/drivers/md/dm.c
6467 @@ -663,13 +663,19 @@ static struct bio *clone_bio(struct bio *bio, sector_t sector,
6468 return clone;
6469 }
6470
6471 -static void __clone_and_map(struct clone_info *ci)
6472 +static int __clone_and_map(struct clone_info *ci)
6473 {
6474 struct bio *clone, *bio = ci->bio;
6475 - struct dm_target *ti = dm_table_find_target(ci->map, ci->sector);
6476 - sector_t len = 0, max = max_io_len(ci->md, ci->sector, ti);
6477 + struct dm_target *ti;
6478 + sector_t len = 0, max;
6479 struct dm_target_io *tio;
6480
6481 + ti = dm_table_find_target(ci->map, ci->sector);
6482 + if (!dm_target_is_valid(ti))
6483 + return -EIO;
6484 +
6485 + max = max_io_len(ci->md, ci->sector, ti);
6486 +
6487 /*
6488 * Allocate a target io object.
6489 */
6490 @@ -727,6 +733,9 @@ static void __clone_and_map(struct clone_info *ci)
6491 do {
6492 if (offset) {
6493 ti = dm_table_find_target(ci->map, ci->sector);
6494 + if (!dm_target_is_valid(ti))
6495 + return -EIO;
6496 +
6497 max = max_io_len(ci->md, ci->sector, ti);
6498
6499 tio = alloc_tio(ci->md);
6500 @@ -750,6 +759,8 @@ static void __clone_and_map(struct clone_info *ci)
6501
6502 ci->idx++;
6503 }
6504 +
6505 + return 0;
6506 }
6507
6508 /*
6509 @@ -758,6 +769,7 @@ static void __clone_and_map(struct clone_info *ci)
6510 static void __split_bio(struct mapped_device *md, struct bio *bio)
6511 {
6512 struct clone_info ci;
6513 + int error = 0;
6514
6515 ci.map = dm_get_table(md);
6516 if (!ci.map) {
6517 @@ -777,11 +789,11 @@ static void __split_bio(struct mapped_device *md, struct bio *bio)
6518 ci.idx = bio->bi_idx;
6519
6520 start_io_acct(ci.io);
6521 - while (ci.sector_count)
6522 - __clone_and_map(&ci);
6523 + while (ci.sector_count && !error)
6524 + error = __clone_and_map(&ci);
6525
6526 /* drop the extra reference count */
6527 - dec_pending(ci.io, 0);
6528 + dec_pending(ci.io, error);
6529 dm_table_put(ci.map);
6530 }
6531 /*-----------------------------------------------------------------
6532 diff --git a/drivers/md/dm.h b/drivers/md/dm.h
6533 index 462ee65..07298a3 100644
6534 --- a/drivers/md/dm.h
6535 +++ b/drivers/md/dm.h
6536 @@ -113,6 +113,11 @@ int dm_table_any_congested(struct dm_table *t, int bdi_bits);
6537 void dm_table_unplug_all(struct dm_table *t);
6538 int dm_table_flush_all(struct dm_table *t);
6539
6540 +/*
6541 + * To check the return value from dm_table_find_target().
6542 + */
6543 +#define dm_target_is_valid(t) ((t)->table)
6544 +
6545 /*-----------------------------------------------------------------
6546 * A registry of target types.
6547 *---------------------------------------------------------------*/
6548 diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
6549 index e86cacb..3085228 100644
6550 --- a/drivers/md/raid5.c
6551 +++ b/drivers/md/raid5.c
6552 @@ -2875,7 +2875,8 @@ static void handle_stripe5(struct stripe_head *sh)
6553 md_done_sync(conf->mddev, STRIPE_SECTORS, 1);
6554 }
6555
6556 - if (s.expanding && s.locked == 0)
6557 + if (s.expanding && s.locked == 0 &&
6558 + !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending))
6559 handle_stripe_expansion(conf, sh, NULL);
6560
6561 if (sh->ops.count)
6562 @@ -3077,7 +3078,8 @@ static void handle_stripe6(struct stripe_head *sh, struct page *tmp_page)
6563 md_done_sync(conf->mddev, STRIPE_SECTORS, 1);
6564 }
6565
6566 - if (s.expanding && s.locked == 0)
6567 + if (s.expanding && s.locked == 0 &&
6568 + !test_bit(STRIPE_OP_COMPUTE_BLK, &sh->ops.pending))
6569 handle_stripe_expansion(conf, sh, &r6s);
6570
6571 spin_unlock(&sh->lock);
6572 diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
6573 index 0222bba..91047c7 100644
6574 --- a/drivers/misc/thinkpad_acpi.c
6575 +++ b/drivers/misc/thinkpad_acpi.c
6576 @@ -968,9 +968,9 @@ static int __init hotkey_init(struct ibm_init_struct *iibm)
6577 KEY_UNKNOWN, /* 0x0C: FN+BACKSPACE */
6578 KEY_UNKNOWN, /* 0x0D: FN+INSERT */
6579 KEY_UNKNOWN, /* 0x0E: FN+DELETE */
6580 - KEY_BRIGHTNESSUP, /* 0x0F: FN+HOME (brightness up) */
6581 + KEY_RESERVED, /* 0x0F: FN+HOME (brightness up) */
6582 /* Scan codes 0x10 to 0x1F: Extended ACPI HKEY hot keys */
6583 - KEY_BRIGHTNESSDOWN, /* 0x10: FN+END (brightness down) */
6584 + KEY_RESERVED, /* 0x10: FN+END (brightness down) */
6585 KEY_RESERVED, /* 0x11: FN+PGUP (thinklight toggle) */
6586 KEY_UNKNOWN, /* 0x12: FN+PGDOWN */
6587 KEY_ZOOM, /* 0x13: FN+SPACE (zoom) */
6588 diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c
6589 index f23e13c..d2d4730 100644
6590 --- a/drivers/net/atl1/atl1_main.c
6591 +++ b/drivers/net/atl1/atl1_main.c
6592 @@ -121,7 +121,7 @@ static int __devinit atl1_sw_init(struct atl1_adapter *adapter)
6593 struct atl1_hw *hw = &adapter->hw;
6594 struct net_device *netdev = adapter->netdev;
6595
6596 - hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN;
6597 + hw->max_frame_size = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
6598 hw->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
6599
6600 adapter->wol = 0;
6601 @@ -689,7 +689,7 @@ static int atl1_change_mtu(struct net_device *netdev, int new_mtu)
6602 {
6603 struct atl1_adapter *adapter = netdev_priv(netdev);
6604 int old_mtu = netdev->mtu;
6605 - int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN;
6606 + int max_frame = new_mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN;
6607
6608 if ((max_frame < ETH_ZLEN + ETH_FCS_LEN) ||
6609 (max_frame > MAX_JUMBO_FRAME_SIZE)) {
6610 @@ -854,8 +854,8 @@ static u32 atl1_configure(struct atl1_adapter *adapter)
6611 /* set Interrupt Clear Timer */
6612 iowrite16(adapter->ict, hw->hw_addr + REG_CMBDISDMA_TIMER);
6613
6614 - /* set MTU, 4 : VLAN */
6615 - iowrite32(hw->max_frame_size + 4, hw->hw_addr + REG_MTU);
6616 + /* set max frame size hw will accept */
6617 + iowrite32(hw->max_frame_size, hw->hw_addr + REG_MTU);
6618
6619 /* jumbo size & rrd retirement timer */
6620 value = (((u32) hw->rx_jumbo_th & RXQ_JMBOSZ_TH_MASK)
6621 diff --git a/drivers/net/cassini.c b/drivers/net/cassini.c
6622 index f6e4030..0883112 100644
6623 --- a/drivers/net/cassini.c
6624 +++ b/drivers/net/cassini.c
6625 @@ -336,30 +336,6 @@ static inline void cas_mask_intr(struct cas *cp)
6626 cas_disable_irq(cp, i);
6627 }
6628
6629 -static inline void cas_buffer_init(cas_page_t *cp)
6630 -{
6631 - struct page *page = cp->buffer;
6632 - atomic_set((atomic_t *)&page->lru.next, 1);
6633 -}
6634 -
6635 -static inline int cas_buffer_count(cas_page_t *cp)
6636 -{
6637 - struct page *page = cp->buffer;
6638 - return atomic_read((atomic_t *)&page->lru.next);
6639 -}
6640 -
6641 -static inline void cas_buffer_inc(cas_page_t *cp)
6642 -{
6643 - struct page *page = cp->buffer;
6644 - atomic_inc((atomic_t *)&page->lru.next);
6645 -}
6646 -
6647 -static inline void cas_buffer_dec(cas_page_t *cp)
6648 -{
6649 - struct page *page = cp->buffer;
6650 - atomic_dec((atomic_t *)&page->lru.next);
6651 -}
6652 -
6653 static void cas_enable_irq(struct cas *cp, const int ring)
6654 {
6655 if (ring == 0) { /* all but TX_DONE */
6656 @@ -497,7 +473,6 @@ static int cas_page_free(struct cas *cp, cas_page_t *page)
6657 {
6658 pci_unmap_page(cp->pdev, page->dma_addr, cp->page_size,
6659 PCI_DMA_FROMDEVICE);
6660 - cas_buffer_dec(page);
6661 __free_pages(page->buffer, cp->page_order);
6662 kfree(page);
6663 return 0;
6664 @@ -527,7 +502,6 @@ static cas_page_t *cas_page_alloc(struct cas *cp, const gfp_t flags)
6665 page->buffer = alloc_pages(flags, cp->page_order);
6666 if (!page->buffer)
6667 goto page_err;
6668 - cas_buffer_init(page);
6669 page->dma_addr = pci_map_page(cp->pdev, page->buffer, 0,
6670 cp->page_size, PCI_DMA_FROMDEVICE);
6671 return page;
6672 @@ -606,7 +580,7 @@ static void cas_spare_recover(struct cas *cp, const gfp_t flags)
6673 list_for_each_safe(elem, tmp, &list) {
6674 cas_page_t *page = list_entry(elem, cas_page_t, list);
6675
6676 - if (cas_buffer_count(page) > 1)
6677 + if (page_count(page->buffer) > 1)
6678 continue;
6679
6680 list_del(elem);
6681 @@ -1374,7 +1348,7 @@ static inline cas_page_t *cas_page_spare(struct cas *cp, const int index)
6682 cas_page_t *page = cp->rx_pages[1][index];
6683 cas_page_t *new;
6684
6685 - if (cas_buffer_count(page) == 1)
6686 + if (page_count(page->buffer) == 1)
6687 return page;
6688
6689 new = cas_page_dequeue(cp);
6690 @@ -1394,7 +1368,7 @@ static cas_page_t *cas_page_swap(struct cas *cp, const int ring,
6691 cas_page_t **page1 = cp->rx_pages[1];
6692
6693 /* swap if buffer is in use */
6694 - if (cas_buffer_count(page0[index]) > 1) {
6695 + if (page_count(page0[index]->buffer) > 1) {
6696 cas_page_t *new = cas_page_spare(cp, index);
6697 if (new) {
6698 page1[index] = page0[index];
6699 @@ -1979,6 +1953,7 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
6700 struct cas_page *page;
6701 struct sk_buff *skb;
6702 void *addr, *crcaddr;
6703 + __sum16 csum;
6704 char *p;
6705
6706 hlen = CAS_VAL(RX_COMP2_HDR_SIZE, words[1]);
6707 @@ -2062,10 +2037,10 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
6708
6709 skb_shinfo(skb)->nr_frags++;
6710 skb->data_len += hlen - swivel;
6711 + skb->truesize += hlen - swivel;
6712 skb->len += hlen - swivel;
6713
6714 get_page(page->buffer);
6715 - cas_buffer_inc(page);
6716 frag->page = page->buffer;
6717 frag->page_offset = off;
6718 frag->size = hlen - swivel;
6719 @@ -2090,7 +2065,6 @@ static int cas_rx_process_pkt(struct cas *cp, struct cas_rx_comp *rxc,
6720 frag++;
6721
6722 get_page(page->buffer);
6723 - cas_buffer_inc(page);
6724 frag->page = page->buffer;
6725 frag->page_offset = 0;
6726 frag->size = hlen;
6727 @@ -2158,14 +2132,15 @@ end_copy_pkt:
6728 skb_put(skb, alloclen);
6729 }
6730
6731 - i = CAS_VAL(RX_COMP4_TCP_CSUM, words[3]);
6732 + csum = (__force __sum16)htons(CAS_VAL(RX_COMP4_TCP_CSUM, words[3]));
6733 if (cp->crc_size) {
6734 /* checksum includes FCS. strip it out. */
6735 - i = csum_fold(csum_partial(crcaddr, cp->crc_size, i));
6736 + csum = csum_fold(csum_partial(crcaddr, cp->crc_size,
6737 + csum_unfold(csum)));
6738 if (addr)
6739 cas_page_unmap(addr);
6740 }
6741 - skb->csum = ntohs(i ^ 0xffff);
6742 + skb->csum = csum_unfold(~csum);
6743 skb->ip_summed = CHECKSUM_COMPLETE;
6744 skb->protocol = eth_type_trans(skb, cp->dev);
6745 return len;
6746 @@ -2253,7 +2228,7 @@ static int cas_post_rxds_ringN(struct cas *cp, int ring, int num)
6747 released = 0;
6748 while (entry != last) {
6749 /* make a new buffer if it's still in use */
6750 - if (cas_buffer_count(page[entry]) > 1) {
6751 + if (page_count(page[entry]->buffer) > 1) {
6752 cas_page_t *new = cas_page_dequeue(cp);
6753 if (!new) {
6754 /* let the timer know that we need to
6755 diff --git a/drivers/net/cassini.h b/drivers/net/cassini.h
6756 index a970804..a201431 100644
6757 --- a/drivers/net/cassini.h
6758 +++ b/drivers/net/cassini.h
6759 @@ -4122,8 +4122,8 @@ cas_saturn_patch_t cas_saturn_patch[] = {
6760 inserted into
6761 outgoing frame. */
6762 struct cas_tx_desc {
6763 - u64 control;
6764 - u64 buffer;
6765 + __le64 control;
6766 + __le64 buffer;
6767 };
6768
6769 /* descriptor ring for free buffers contains page-sized buffers. the index
6770 @@ -4131,8 +4131,8 @@ struct cas_tx_desc {
6771 * the completion ring.
6772 */
6773 struct cas_rx_desc {
6774 - u64 index;
6775 - u64 buffer;
6776 + __le64 index;
6777 + __le64 buffer;
6778 };
6779
6780 /* received packets are put on the completion ring. */
6781 @@ -4210,10 +4210,10 @@ struct cas_rx_desc {
6782 #define RX_INDEX_RELEASE 0x0000000000002000ULL
6783
6784 struct cas_rx_comp {
6785 - u64 word1;
6786 - u64 word2;
6787 - u64 word3;
6788 - u64 word4;
6789 + __le64 word1;
6790 + __le64 word2;
6791 + __le64 word3;
6792 + __le64 word4;
6793 };
6794
6795 enum link_state {
6796 @@ -4252,7 +4252,7 @@ struct cas_init_block {
6797 struct cas_rx_comp rxcs[N_RX_COMP_RINGS][INIT_BLOCK_RX_COMP];
6798 struct cas_rx_desc rxds[N_RX_DESC_RINGS][INIT_BLOCK_RX_DESC];
6799 struct cas_tx_desc txds[N_TX_RINGS][INIT_BLOCK_TX];
6800 - u64 tx_compwb;
6801 + __le64 tx_compwb;
6802 };
6803
6804 /* tiny buffers to deal with target abort issue. we allocate a bit
6805 diff --git a/drivers/net/chelsio/cxgb2.c b/drivers/net/chelsio/cxgb2.c
6806 index 231ce43..a82a1fa 100644
6807 --- a/drivers/net/chelsio/cxgb2.c
6808 +++ b/drivers/net/chelsio/cxgb2.c
6809 @@ -370,6 +370,8 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
6810 "TxInternalMACXmitError",
6811 "TxFramesWithExcessiveDeferral",
6812 "TxFCSErrors",
6813 + "TxJumboFramesOk",
6814 + "TxJumboOctetsOk",
6815
6816 "RxOctetsOK",
6817 "RxOctetsBad",
6818 @@ -388,15 +390,16 @@ static char stats_strings[][ETH_GSTRING_LEN] = {
6819 "RxInRangeLengthErrors",
6820 "RxOutOfRangeLengthField",
6821 "RxFrameTooLongErrors",
6822 + "RxJumboFramesOk",
6823 + "RxJumboOctetsOk",
6824
6825 /* Port stats */
6826 - "RxPackets",
6827 "RxCsumGood",
6828 - "TxPackets",
6829 "TxCsumOffload",
6830 "TxTso",
6831 "RxVlan",
6832 "TxVlan",
6833 + "TxNeedHeadroom",
6834
6835 /* Interrupt stats */
6836 "rx drops",
6837 @@ -454,23 +457,56 @@ static void get_stats(struct net_device *dev, struct ethtool_stats *stats,
6838 const struct cmac_statistics *s;
6839 const struct sge_intr_counts *t;
6840 struct sge_port_stats ss;
6841 - unsigned int len;
6842
6843 s = mac->ops->statistics_update(mac, MAC_STATS_UPDATE_FULL);
6844 -
6845 - len = sizeof(u64)*(&s->TxFCSErrors + 1 - &s->TxOctetsOK);
6846 - memcpy(data, &s->TxOctetsOK, len);
6847 - data += len;
6848 -
6849 - len = sizeof(u64)*(&s->RxFrameTooLongErrors + 1 - &s->RxOctetsOK);
6850 - memcpy(data, &s->RxOctetsOK, len);
6851 - data += len;
6852 -
6853 + t = t1_sge_get_intr_counts(adapter->sge);
6854 t1_sge_get_port_stats(adapter->sge, dev->if_port, &ss);
6855 - memcpy(data, &ss, sizeof(ss));
6856 - data += sizeof(ss);
6857
6858 - t = t1_sge_get_intr_counts(adapter->sge);
6859 + *data++ = s->TxOctetsOK;
6860 + *data++ = s->TxOctetsBad;
6861 + *data++ = s->TxUnicastFramesOK;
6862 + *data++ = s->TxMulticastFramesOK;
6863 + *data++ = s->TxBroadcastFramesOK;
6864 + *data++ = s->TxPauseFrames;
6865 + *data++ = s->TxFramesWithDeferredXmissions;
6866 + *data++ = s->TxLateCollisions;
6867 + *data++ = s->TxTotalCollisions;
6868 + *data++ = s->TxFramesAbortedDueToXSCollisions;
6869 + *data++ = s->TxUnderrun;
6870 + *data++ = s->TxLengthErrors;
6871 + *data++ = s->TxInternalMACXmitError;
6872 + *data++ = s->TxFramesWithExcessiveDeferral;
6873 + *data++ = s->TxFCSErrors;
6874 + *data++ = s->TxJumboFramesOK;
6875 + *data++ = s->TxJumboOctetsOK;
6876 +
6877 + *data++ = s->RxOctetsOK;
6878 + *data++ = s->RxOctetsBad;
6879 + *data++ = s->RxUnicastFramesOK;
6880 + *data++ = s->RxMulticastFramesOK;
6881 + *data++ = s->RxBroadcastFramesOK;
6882 + *data++ = s->RxPauseFrames;
6883 + *data++ = s->RxFCSErrors;
6884 + *data++ = s->RxAlignErrors;
6885 + *data++ = s->RxSymbolErrors;
6886 + *data++ = s->RxDataErrors;
6887 + *data++ = s->RxSequenceErrors;
6888 + *data++ = s->RxRuntErrors;
6889 + *data++ = s->RxJabberErrors;
6890 + *data++ = s->RxInternalMACRcvError;
6891 + *data++ = s->RxInRangeLengthErrors;
6892 + *data++ = s->RxOutOfRangeLengthField;
6893 + *data++ = s->RxFrameTooLongErrors;
6894 + *data++ = s->RxJumboFramesOK;
6895 + *data++ = s->RxJumboOctetsOK;
6896 +
6897 + *data++ = ss.rx_cso_good;
6898 + *data++ = ss.tx_cso;
6899 + *data++ = ss.tx_tso;
6900 + *data++ = ss.vlan_xtract;
6901 + *data++ = ss.vlan_insert;
6902 + *data++ = ss.tx_need_hdrroom;
6903 +
6904 *data++ = t->rx_drops;
6905 *data++ = t->pure_rsps;
6906 *data++ = t->unhandled_irqs;
6907 diff --git a/drivers/net/chelsio/pm3393.c b/drivers/net/chelsio/pm3393.c
6908 index 678778a..2117c4f 100644
6909 --- a/drivers/net/chelsio/pm3393.c
6910 +++ b/drivers/net/chelsio/pm3393.c
6911 @@ -45,7 +45,7 @@
6912
6913 #include <linux/crc32.h>
6914
6915 -#define OFFSET(REG_ADDR) (REG_ADDR << 2)
6916 +#define OFFSET(REG_ADDR) ((REG_ADDR) << 2)
6917
6918 /* Max frame size PM3393 can handle. Includes Ethernet header and CRC. */
6919 #define MAX_FRAME_SIZE 9600
6920 @@ -428,69 +428,26 @@ static int pm3393_set_speed_duplex_fc(struct cmac *cmac, int speed, int duplex,
6921 return 0;
6922 }
6923
6924 -static void pm3393_rmon_update(struct adapter *adapter, u32 offs, u64 *val,
6925 - int over)
6926 -{
6927 - u32 val0, val1, val2;
6928 -
6929 - t1_tpi_read(adapter, offs, &val0);
6930 - t1_tpi_read(adapter, offs + 4, &val1);
6931 - t1_tpi_read(adapter, offs + 8, &val2);
6932 -
6933 - *val &= ~0ull << 40;
6934 - *val |= val0 & 0xffff;
6935 - *val |= (val1 & 0xffff) << 16;
6936 - *val |= (u64)(val2 & 0xff) << 32;
6937 -
6938 - if (over)
6939 - *val += 1ull << 40;
6940 +#define RMON_UPDATE(mac, name, stat_name) \
6941 +{ \
6942 + t1_tpi_read((mac)->adapter, OFFSET(name), &val0); \
6943 + t1_tpi_read((mac)->adapter, OFFSET((name)+1), &val1); \
6944 + t1_tpi_read((mac)->adapter, OFFSET((name)+2), &val2); \
6945 + (mac)->stats.stat_name = (u64)(val0 & 0xffff) | \
6946 + ((u64)(val1 & 0xffff) << 16) | \
6947 + ((u64)(val2 & 0xff) << 32) | \
6948 + ((mac)->stats.stat_name & \
6949 + 0xffffff0000000000ULL); \
6950 + if (ro & \
6951 + (1ULL << ((name - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW) >> 2))) \
6952 + (mac)->stats.stat_name += 1ULL << 40; \
6953 }
6954
6955 static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
6956 int flag)
6957 {
6958 - static struct {
6959 - unsigned int reg;
6960 - unsigned int offset;
6961 - } hw_stats [] = {
6962 -
6963 -#define HW_STAT(name, stat_name) \
6964 - { name, (&((struct cmac_statistics *)NULL)->stat_name) - (u64 *)NULL }
6965 -
6966 - /* Rx stats */
6967 - HW_STAT(RxOctetsReceivedOK, RxOctetsOK),
6968 - HW_STAT(RxUnicastFramesReceivedOK, RxUnicastFramesOK),
6969 - HW_STAT(RxMulticastFramesReceivedOK, RxMulticastFramesOK),
6970 - HW_STAT(RxBroadcastFramesReceivedOK, RxBroadcastFramesOK),
6971 - HW_STAT(RxPAUSEMACCtrlFramesReceived, RxPauseFrames),
6972 - HW_STAT(RxFrameCheckSequenceErrors, RxFCSErrors),
6973 - HW_STAT(RxFramesLostDueToInternalMACErrors,
6974 - RxInternalMACRcvError),
6975 - HW_STAT(RxSymbolErrors, RxSymbolErrors),
6976 - HW_STAT(RxInRangeLengthErrors, RxInRangeLengthErrors),
6977 - HW_STAT(RxFramesTooLongErrors , RxFrameTooLongErrors),
6978 - HW_STAT(RxJabbers, RxJabberErrors),
6979 - HW_STAT(RxFragments, RxRuntErrors),
6980 - HW_STAT(RxUndersizedFrames, RxRuntErrors),
6981 - HW_STAT(RxJumboFramesReceivedOK, RxJumboFramesOK),
6982 - HW_STAT(RxJumboOctetsReceivedOK, RxJumboOctetsOK),
6983 -
6984 - /* Tx stats */
6985 - HW_STAT(TxOctetsTransmittedOK, TxOctetsOK),
6986 - HW_STAT(TxFramesLostDueToInternalMACTransmissionError,
6987 - TxInternalMACXmitError),
6988 - HW_STAT(TxTransmitSystemError, TxFCSErrors),
6989 - HW_STAT(TxUnicastFramesTransmittedOK, TxUnicastFramesOK),
6990 - HW_STAT(TxMulticastFramesTransmittedOK, TxMulticastFramesOK),
6991 - HW_STAT(TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK),
6992 - HW_STAT(TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames),
6993 - HW_STAT(TxJumboFramesReceivedOK, TxJumboFramesOK),
6994 - HW_STAT(TxJumboOctetsReceivedOK, TxJumboOctetsOK)
6995 - }, *p = hw_stats;
6996 - u64 ro;
6997 - u32 val0, val1, val2, val3;
6998 - u64 *stats = (u64 *) &mac->stats;
6999 - unsigned int i;
7000 + u64 ro;
7001 + u32 val0, val1, val2, val3;
7002
7003 /* Snap the counters */
7004 pmwrite(mac, SUNI1x10GEXP_REG_MSTAT_CONTROL,
7005 @@ -504,14 +461,35 @@ static const struct cmac_statistics *pm3393_update_statistics(struct cmac *mac,
7006 ro = ((u64)val0 & 0xffff) | (((u64)val1 & 0xffff) << 16) |
7007 (((u64)val2 & 0xffff) << 32) | (((u64)val3 & 0xffff) << 48);
7008
7009 - for (i = 0; i < ARRAY_SIZE(hw_stats); i++) {
7010 - unsigned reg = p->reg - SUNI1x10GEXP_REG_MSTAT_COUNTER_0_LOW;
7011 -
7012 - pm3393_rmon_update((mac)->adapter, OFFSET(p->reg),
7013 - stats + p->offset, ro & (reg >> 2));
7014 - }
7015 -
7016 -
7017 + /* Rx stats */
7018 + RMON_UPDATE(mac, RxOctetsReceivedOK, RxOctetsOK);
7019 + RMON_UPDATE(mac, RxUnicastFramesReceivedOK, RxUnicastFramesOK);
7020 + RMON_UPDATE(mac, RxMulticastFramesReceivedOK, RxMulticastFramesOK);
7021 + RMON_UPDATE(mac, RxBroadcastFramesReceivedOK, RxBroadcastFramesOK);
7022 + RMON_UPDATE(mac, RxPAUSEMACCtrlFramesReceived, RxPauseFrames);
7023 + RMON_UPDATE(mac, RxFrameCheckSequenceErrors, RxFCSErrors);
7024 + RMON_UPDATE(mac, RxFramesLostDueToInternalMACErrors,
7025 + RxInternalMACRcvError);
7026 + RMON_UPDATE(mac, RxSymbolErrors, RxSymbolErrors);
7027 + RMON_UPDATE(mac, RxInRangeLengthErrors, RxInRangeLengthErrors);
7028 + RMON_UPDATE(mac, RxFramesTooLongErrors , RxFrameTooLongErrors);
7029 + RMON_UPDATE(mac, RxJabbers, RxJabberErrors);
7030 + RMON_UPDATE(mac, RxFragments, RxRuntErrors);
7031 + RMON_UPDATE(mac, RxUndersizedFrames, RxRuntErrors);
7032 + RMON_UPDATE(mac, RxJumboFramesReceivedOK, RxJumboFramesOK);
7033 + RMON_UPDATE(mac, RxJumboOctetsReceivedOK, RxJumboOctetsOK);
7034 +
7035 + /* Tx stats */
7036 + RMON_UPDATE(mac, TxOctetsTransmittedOK, TxOctetsOK);
7037 + RMON_UPDATE(mac, TxFramesLostDueToInternalMACTransmissionError,
7038 + TxInternalMACXmitError);
7039 + RMON_UPDATE(mac, TxTransmitSystemError, TxFCSErrors);
7040 + RMON_UPDATE(mac, TxUnicastFramesTransmittedOK, TxUnicastFramesOK);
7041 + RMON_UPDATE(mac, TxMulticastFramesTransmittedOK, TxMulticastFramesOK);
7042 + RMON_UPDATE(mac, TxBroadcastFramesTransmittedOK, TxBroadcastFramesOK);
7043 + RMON_UPDATE(mac, TxPAUSEMACCtrlFramesTransmitted, TxPauseFrames);
7044 + RMON_UPDATE(mac, TxJumboFramesReceivedOK, TxJumboFramesOK);
7045 + RMON_UPDATE(mac, TxJumboOctetsReceivedOK, TxJumboOctetsOK);
7046
7047 return &mac->stats;
7048 }
7049 diff --git a/drivers/net/chelsio/sge.c b/drivers/net/chelsio/sge.c
7050 index e4f874a..d77f1eb 100644
7051 --- a/drivers/net/chelsio/sge.c
7052 +++ b/drivers/net/chelsio/sge.c
7053 @@ -986,11 +986,10 @@ void t1_sge_get_port_stats(const struct sge *sge, int port,
7054 for_each_possible_cpu(cpu) {
7055 struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[port], cpu);
7056
7057 - ss->rx_packets += st->rx_packets;
7058 ss->rx_cso_good += st->rx_cso_good;
7059 - ss->tx_packets += st->tx_packets;
7060 ss->tx_cso += st->tx_cso;
7061 ss->tx_tso += st->tx_tso;
7062 + ss->tx_need_hdrroom += st->tx_need_hdrroom;
7063 ss->vlan_xtract += st->vlan_xtract;
7064 ss->vlan_insert += st->vlan_insert;
7065 }
7066 @@ -1379,11 +1378,10 @@ static void sge_rx(struct sge *sge, struct freelQ *fl, unsigned int len)
7067 }
7068 __skb_pull(skb, sizeof(*p));
7069
7070 - skb->dev->last_rx = jiffies;
7071 st = per_cpu_ptr(sge->port_stats[p->iff], smp_processor_id());
7072 - st->rx_packets++;
7073
7074 skb->protocol = eth_type_trans(skb, adapter->port[p->iff].dev);
7075 + skb->dev->last_rx = jiffies;
7076 if ((adapter->flags & RX_CSUM_ENABLED) && p->csum == 0xffff &&
7077 skb->protocol == htons(ETH_P_IP) &&
7078 (skb->data[9] == IPPROTO_TCP || skb->data[9] == IPPROTO_UDP)) {
7079 @@ -1851,7 +1849,8 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
7080 {
7081 struct adapter *adapter = dev->priv;
7082 struct sge *sge = adapter->sge;
7083 - struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[dev->if_port], smp_processor_id());
7084 + struct sge_port_stats *st = per_cpu_ptr(sge->port_stats[dev->if_port],
7085 + smp_processor_id());
7086 struct cpl_tx_pkt *cpl;
7087 struct sk_buff *orig_skb = skb;
7088 int ret;
7089 @@ -1859,6 +1858,18 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
7090 if (skb->protocol == htons(ETH_P_CPL5))
7091 goto send;
7092
7093 + /*
7094 + * We are using a non-standard hard_header_len.
7095 + * Allocate more header room in the rare cases it is not big enough.
7096 + */
7097 + if (unlikely(skb_headroom(skb) < dev->hard_header_len - ETH_HLEN)) {
7098 + skb = skb_realloc_headroom(skb, sizeof(struct cpl_tx_pkt_lso));
7099 + ++st->tx_need_hdrroom;
7100 + dev_kfree_skb_any(orig_skb);
7101 + if (!skb)
7102 + return NETDEV_TX_OK;
7103 + }
7104 +
7105 if (skb_shinfo(skb)->gso_size) {
7106 int eth_type;
7107 struct cpl_tx_pkt_lso *hdr;
7108 @@ -1892,24 +1903,6 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
7109 return NETDEV_TX_OK;
7110 }
7111
7112 - /*
7113 - * We are using a non-standard hard_header_len and some kernel
7114 - * components, such as pktgen, do not handle it right.
7115 - * Complain when this happens but try to fix things up.
7116 - */
7117 - if (unlikely(skb_headroom(skb) < dev->hard_header_len - ETH_HLEN)) {
7118 - pr_debug("%s: headroom %d header_len %d\n", dev->name,
7119 - skb_headroom(skb), dev->hard_header_len);
7120 -
7121 - if (net_ratelimit())
7122 - printk(KERN_ERR "%s: inadequate headroom in "
7123 - "Tx packet\n", dev->name);
7124 - skb = skb_realloc_headroom(skb, sizeof(*cpl));
7125 - dev_kfree_skb_any(orig_skb);
7126 - if (!skb)
7127 - return NETDEV_TX_OK;
7128 - }
7129 -
7130 if (!(adapter->flags & UDP_CSUM_CAPABLE) &&
7131 skb->ip_summed == CHECKSUM_PARTIAL &&
7132 ip_hdr(skb)->protocol == IPPROTO_UDP) {
7133 @@ -1955,7 +1948,6 @@ int t1_start_xmit(struct sk_buff *skb, struct net_device *dev)
7134 cpl->vlan_valid = 0;
7135
7136 send:
7137 - st->tx_packets++;
7138 dev->trans_start = jiffies;
7139 ret = t1_sge_tx(skb, adapter, 0, dev);
7140
7141 diff --git a/drivers/net/chelsio/sge.h b/drivers/net/chelsio/sge.h
7142 index d132a0e..80165f9 100644
7143 --- a/drivers/net/chelsio/sge.h
7144 +++ b/drivers/net/chelsio/sge.h
7145 @@ -57,13 +57,12 @@ struct sge_intr_counts {
7146 };
7147
7148 struct sge_port_stats {
7149 - u64 rx_packets; /* # of Ethernet packets received */
7150 u64 rx_cso_good; /* # of successful RX csum offloads */
7151 - u64 tx_packets; /* # of TX packets */
7152 u64 tx_cso; /* # of TX checksum offloads */
7153 u64 tx_tso; /* # of TSO requests */
7154 u64 vlan_xtract; /* # of VLAN tag extractions */
7155 u64 vlan_insert; /* # of VLAN tag insertions */
7156 + u64 tx_need_hdrroom; /* # of TX skbs in need of more header room */
7157 };
7158
7159 struct sk_buff;
7160 diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
7161 index fcbe508..cbcdf14 100644
7162 --- a/drivers/net/forcedeth.c
7163 +++ b/drivers/net/forcedeth.c
7164 @@ -5564,35 +5564,35 @@ static struct pci_device_id pci_tbl[] = {
7165 },
7166 { /* MCP77 Ethernet Controller */
7167 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_32),
7168 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7169 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7170 },
7171 { /* MCP77 Ethernet Controller */
7172 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_33),
7173 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7174 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7175 },
7176 { /* MCP77 Ethernet Controller */
7177 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_34),
7178 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7179 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7180 },
7181 { /* MCP77 Ethernet Controller */
7182 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_35),
7183 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7184 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7185 },
7186 { /* MCP79 Ethernet Controller */
7187 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_36),
7188 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7189 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7190 },
7191 { /* MCP79 Ethernet Controller */
7192 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_37),
7193 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7194 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7195 },
7196 { /* MCP79 Ethernet Controller */
7197 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_38),
7198 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7199 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7200 },
7201 { /* MCP79 Ethernet Controller */
7202 PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NVENET_39),
7203 - .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT,
7204 + .driver_data = DEV_NEED_TIMERIRQ|DEV_NEED_LINKTIMER|DEV_HAS_CHECKSUM|DEV_HAS_HIGH_DMA|DEV_HAS_MSI|DEV_HAS_POWER_CNTRL|DEV_HAS_PAUSEFRAME_TX|DEV_HAS_STATISTICS_V2|DEV_HAS_TEST_EXTENDED|DEV_HAS_MGMT_UNIT|DEV_HAS_CORRECT_MACADDR,
7205 },
7206 {0,},
7207 };
7208 diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
7209 index 2575077..3ed45a3 100644
7210 --- a/drivers/net/sky2.c
7211 +++ b/drivers/net/sky2.c
7212 @@ -812,8 +812,13 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
7213
7214 sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), rx_reg);
7215
7216 - /* Flush Rx MAC FIFO on any flow control or error */
7217 - sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR);
7218 + if (hw->chip_id == CHIP_ID_YUKON_XL) {
7219 + /* Hardware errata - clear flush mask */
7220 + sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), 0);
7221 + } else {
7222 + /* Flush Rx MAC FIFO on any flow control or error */
7223 + sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR);
7224 + }
7225
7226 /* Set threshold to 0xa (64 bytes) + 1 to workaround pause bug */
7227 reg = RX_GMF_FL_THR_DEF + 1;
7228 @@ -1307,15 +1312,11 @@ static int sky2_up(struct net_device *dev)
7229 */
7230 if (otherdev && netif_running(otherdev) &&
7231 (cap = pci_find_capability(hw->pdev, PCI_CAP_ID_PCIX))) {
7232 - struct sky2_port *osky2 = netdev_priv(otherdev);
7233 u16 cmd;
7234
7235 cmd = sky2_pci_read16(hw, cap + PCI_X_CMD);
7236 cmd &= ~PCI_X_CMD_MAX_SPLIT;
7237 sky2_pci_write16(hw, cap + PCI_X_CMD, cmd);
7238 -
7239 - sky2->rx_csum = 0;
7240 - osky2->rx_csum = 0;
7241 }
7242
7243 if (netif_msg_ifup(sky2))
7244 @@ -4017,7 +4018,7 @@ static __devinit struct net_device *sky2_init_netdev(struct sky2_hw *hw,
7245 sky2->duplex = -1;
7246 sky2->speed = -1;
7247 sky2->advertising = sky2_supported_modes(hw);
7248 - sky2->rx_csum = 1;
7249 + sky2->rx_csum = (hw->chip_id != CHIP_ID_YUKON_XL);
7250 sky2->wol = wol;
7251
7252 spin_lock_init(&sky2->phy_lock);
7253 diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c
7254 index 524dc5f..9057d71 100644
7255 --- a/drivers/net/usb/kaweth.c
7256 +++ b/drivers/net/usb/kaweth.c
7257 @@ -70,7 +70,7 @@
7258 #define KAWETH_TX_TIMEOUT (5 * HZ)
7259 #define KAWETH_SCRATCH_SIZE 32
7260 #define KAWETH_FIRMWARE_BUF_SIZE 4096
7261 -#define KAWETH_CONTROL_TIMEOUT (30 * HZ)
7262 +#define KAWETH_CONTROL_TIMEOUT (30000)
7263
7264 #define KAWETH_STATUS_BROKEN 0x0000001
7265 #define KAWETH_STATUS_CLOSING 0x0000002
7266 diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c
7267 index 6240b97..3bbc5c4 100644
7268 --- a/drivers/net/usb/mcs7830.c
7269 +++ b/drivers/net/usb/mcs7830.c
7270 @@ -94,7 +94,7 @@ static int mcs7830_get_reg(struct usbnet *dev, u16 index, u16 size, void *data)
7271
7272 ret = usb_control_msg(xdev, usb_rcvctrlpipe(xdev, 0), MCS7830_RD_BREQ,
7273 MCS7830_RD_BMREQ, 0x0000, index, data,
7274 - size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT));
7275 + size, MCS7830_CTRL_TIMEOUT);
7276 return ret;
7277 }
7278
7279 @@ -105,7 +105,7 @@ static int mcs7830_set_reg(struct usbnet *dev, u16 index, u16 size, void *data)
7280
7281 ret = usb_control_msg(xdev, usb_sndctrlpipe(xdev, 0), MCS7830_WR_BREQ,
7282 MCS7830_WR_BMREQ, 0x0000, index, data,
7283 - size, msecs_to_jiffies(MCS7830_CTRL_TIMEOUT));
7284 + size, MCS7830_CTRL_TIMEOUT);
7285 return ret;
7286 }
7287
7288 diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
7289 index 027f686..02a09d5 100644
7290 --- a/drivers/pci/hotplug/fakephp.c
7291 +++ b/drivers/pci/hotplug/fakephp.c
7292 @@ -39,6 +39,7 @@
7293 #include <linux/init.h>
7294 #include <linux/string.h>
7295 #include <linux/slab.h>
7296 +#include <linux/workqueue.h>
7297 #include "../pci.h"
7298
7299 #if !defined(MODULE)
7300 @@ -63,10 +64,16 @@ struct dummy_slot {
7301 struct list_head node;
7302 struct hotplug_slot *slot;
7303 struct pci_dev *dev;
7304 + struct work_struct remove_work;
7305 + unsigned long removed;
7306 };
7307
7308 static int debug;
7309 static LIST_HEAD(slot_list);
7310 +static struct workqueue_struct *dummyphp_wq;
7311 +
7312 +static void pci_rescan_worker(struct work_struct *work);
7313 +static DECLARE_WORK(pci_rescan_work, pci_rescan_worker);
7314
7315 static int enable_slot (struct hotplug_slot *slot);
7316 static int disable_slot (struct hotplug_slot *slot);
7317 @@ -109,7 +116,7 @@ static int add_slot(struct pci_dev *dev)
7318 slot->name = &dev->dev.bus_id[0];
7319 dbg("slot->name = %s\n", slot->name);
7320
7321 - dslot = kmalloc(sizeof(struct dummy_slot), GFP_KERNEL);
7322 + dslot = kzalloc(sizeof(struct dummy_slot), GFP_KERNEL);
7323 if (!dslot)
7324 goto error_info;
7325
7326 @@ -164,6 +171,14 @@ static void remove_slot(struct dummy_slot *dslot)
7327 err("Problem unregistering a slot %s\n", dslot->slot->name);
7328 }
7329
7330 +/* called from the single-threaded workqueue handler to remove a slot */
7331 +static void remove_slot_worker(struct work_struct *work)
7332 +{
7333 + struct dummy_slot *dslot =
7334 + container_of(work, struct dummy_slot, remove_work);
7335 + remove_slot(dslot);
7336 +}
7337 +
7338 /**
7339 * Rescan slot.
7340 * Tries hard not to re-enable already existing devices
7341 @@ -267,11 +282,17 @@ static inline void pci_rescan(void) {
7342 pci_rescan_buses(&pci_root_buses);
7343 }
7344
7345 +/* called from the single-threaded workqueue handler to rescan all pci buses */
7346 +static void pci_rescan_worker(struct work_struct *work)
7347 +{
7348 + pci_rescan();
7349 +}
7350
7351 static int enable_slot(struct hotplug_slot *hotplug_slot)
7352 {
7353 /* mis-use enable_slot for rescanning of the pci bus */
7354 - pci_rescan();
7355 + cancel_work_sync(&pci_rescan_work);
7356 + queue_work(dummyphp_wq, &pci_rescan_work);
7357 return -ENODEV;
7358 }
7359
7360 @@ -306,6 +327,10 @@ static int disable_slot(struct hotplug_slot *slot)
7361 err("Can't remove PCI devices with other PCI devices behind it yet.\n");
7362 return -ENODEV;
7363 }
7364 + if (test_and_set_bit(0, &dslot->removed)) {
7365 + dbg("Slot already scheduled for removal\n");
7366 + return -ENODEV;
7367 + }
7368 /* search for subfunctions and disable them first */
7369 if (!(dslot->dev->devfn & 7)) {
7370 for (func = 1; func < 8; func++) {
7371 @@ -328,8 +353,9 @@ static int disable_slot(struct hotplug_slot *slot)
7372 /* remove the device from the pci core */
7373 pci_remove_bus_device(dslot->dev);
7374
7375 - /* blow away this sysfs entry and other parts. */
7376 - remove_slot(dslot);
7377 + /* queue work item to blow away this sysfs entry and other parts. */
7378 + INIT_WORK(&dslot->remove_work, remove_slot_worker);
7379 + queue_work(dummyphp_wq, &dslot->remove_work);
7380
7381 return 0;
7382 }
7383 @@ -340,6 +366,7 @@ static void cleanup_slots (void)
7384 struct list_head *next;
7385 struct dummy_slot *dslot;
7386
7387 + destroy_workqueue(dummyphp_wq);
7388 list_for_each_safe (tmp, next, &slot_list) {
7389 dslot = list_entry (tmp, struct dummy_slot, node);
7390 remove_slot(dslot);
7391 @@ -351,6 +378,10 @@ static int __init dummyphp_init(void)
7392 {
7393 info(DRIVER_DESC "\n");
7394
7395 + dummyphp_wq = create_singlethread_workqueue(MY_NAME);
7396 + if (!dummyphp_wq)
7397 + return -ENOMEM;
7398 +
7399 return pci_scan_buses();
7400 }
7401
7402 diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
7403 index 50f2dd9..75831c8 100644
7404 --- a/drivers/pci/quirks.c
7405 +++ b/drivers/pci/quirks.c
7406 @@ -465,6 +465,12 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH7_31, quirk
7407 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_0, quirk_ich6_lpc_acpi );
7408 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_2, quirk_ich6_lpc_acpi );
7409 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_3, quirk_ich6_lpc_acpi );
7410 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_1, quirk_ich6_lpc_acpi );
7411 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH8_4, quirk_ich6_lpc_acpi );
7412 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_2, quirk_ich6_lpc_acpi );
7413 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_4, quirk_ich6_lpc_acpi );
7414 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_7, quirk_ich6_lpc_acpi );
7415 +DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH9_8, quirk_ich6_lpc_acpi );
7416
7417 /*
7418 * VIA ACPI: One IO region pointed to by longword at
7419 diff --git a/drivers/spi/omap2_mcspi.c b/drivers/spi/omap2_mcspi.c
7420 index 6b357cd..5a827ea 100644
7421 --- a/drivers/spi/omap2_mcspi.c
7422 +++ b/drivers/spi/omap2_mcspi.c
7423 @@ -350,6 +350,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7424 tx = xfer->tx_buf;
7425
7426 do {
7427 + c -= 1;
7428 if (tx != NULL) {
7429 if (mcspi_wait_for_reg_bit(chstat_reg,
7430 OMAP2_MCSPI_CHSTAT_TXS) < 0) {
7431 @@ -380,7 +381,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7432 word_len, *(rx - 1));
7433 #endif
7434 }
7435 - c -= 1;
7436 } while (c);
7437 } else if (word_len <= 16) {
7438 u16 *rx;
7439 @@ -389,6 +389,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7440 rx = xfer->rx_buf;
7441 tx = xfer->tx_buf;
7442 do {
7443 + c -= 2;
7444 if (tx != NULL) {
7445 if (mcspi_wait_for_reg_bit(chstat_reg,
7446 OMAP2_MCSPI_CHSTAT_TXS) < 0) {
7447 @@ -419,7 +420,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7448 word_len, *(rx - 1));
7449 #endif
7450 }
7451 - c -= 2;
7452 } while (c);
7453 } else if (word_len <= 32) {
7454 u32 *rx;
7455 @@ -428,6 +428,7 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7456 rx = xfer->rx_buf;
7457 tx = xfer->tx_buf;
7458 do {
7459 + c -= 4;
7460 if (tx != NULL) {
7461 if (mcspi_wait_for_reg_bit(chstat_reg,
7462 OMAP2_MCSPI_CHSTAT_TXS) < 0) {
7463 @@ -458,7 +459,6 @@ omap2_mcspi_txrx_pio(struct spi_device *spi, struct spi_transfer *xfer)
7464 word_len, *(rx - 1));
7465 #endif
7466 }
7467 - c -= 4;
7468 } while (c);
7469 }
7470
7471 diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
7472 index 0bb8de4..7cf21d7 100644
7473 --- a/drivers/usb/serial/sierra.c
7474 +++ b/drivers/usb/serial/sierra.c
7475 @@ -100,6 +100,7 @@ static struct usb_device_id id_table [] = {
7476 { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
7477 { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
7478 { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
7479 + { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
7480 { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
7481 { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
7482 { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U */
7483 @@ -108,6 +109,7 @@ static struct usb_device_id id_table [] = {
7484 { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
7485 { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
7486 { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
7487 + { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
7488 { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
7489 { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
7490 { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
7491 @@ -136,6 +138,7 @@ static struct usb_device_id id_table_3port [] = {
7492 { USB_DEVICE(0x0f30, 0x1b1d) }, /* Sierra Wireless MC5720 */
7493 { USB_DEVICE(0x1199, 0x0218) }, /* Sierra Wireless MC5720 */
7494 { USB_DEVICE(0x1199, 0x0020) }, /* Sierra Wireless MC5725 */
7495 + { USB_DEVICE(0x1199, 0x0220) }, /* Sierra Wireless MC5725 */
7496 { USB_DEVICE(0x1199, 0x0019) }, /* Sierra Wireless AirCard 595 */
7497 { USB_DEVICE(0x1199, 0x0021) }, /* Sierra Wireless AirCard 597E */
7498 { USB_DEVICE(0x1199, 0x0120) }, /* Sierra Wireless USB Dongle 595U*/
7499 @@ -144,6 +147,7 @@ static struct usb_device_id id_table_3port [] = {
7500 { USB_DEVICE(0x1199, 0x6804) }, /* Sierra Wireless MC8755 */
7501 { USB_DEVICE(0x1199, 0x6803) }, /* Sierra Wireless MC8765 */
7502 { USB_DEVICE(0x1199, 0x6812) }, /* Sierra Wireless MC8775 & AC 875U */
7503 + { USB_DEVICE(0x1199, 0x6813) }, /* Sierra Wireless MC8775 (Thinkpad internal) */
7504 { USB_DEVICE(0x1199, 0x6820) }, /* Sierra Wireless AirCard 875 */
7505 { USB_DEVICE(0x1199, 0x6832) }, /* Sierra Wireless MC8780*/
7506 { USB_DEVICE(0x1199, 0x6833) }, /* Sierra Wireless MC8781*/
7507 diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
7508 index dd41677..48a61da 100644
7509 --- a/fs/cifs/inode.c
7510 +++ b/fs/cifs/inode.c
7511 @@ -919,6 +919,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
7512 goto mkdir_out;
7513 }
7514
7515 + mode &= ~current->fs->umask;
7516 rc = CIFSPOSIXCreate(xid, pTcon, SMB_O_DIRECTORY | SMB_O_CREAT,
7517 mode, NULL /* netfid */, pInfo, &oplock,
7518 full_path, cifs_sb->local_nls,
7519 diff --git a/fs/exec.c b/fs/exec.c
7520 index 073b0b8..401b850 100644
7521 --- a/fs/exec.c
7522 +++ b/fs/exec.c
7523 @@ -1786,6 +1786,12 @@ int do_coredump(long signr, int exit_code, struct pt_regs * regs)
7524 but keep the previous behaviour for now. */
7525 if (!ispipe && !S_ISREG(inode->i_mode))
7526 goto close_fail;
7527 + /*
7528 + * Dont allow local users get cute and trick others to coredump
7529 + * into their pre-created files:
7530 + */
7531 + if (inode->i_uid != current->fsuid)
7532 + goto close_fail;
7533 if (!file->f_op)
7534 goto close_fail;
7535 if (!file->f_op->write)
7536 diff --git a/fs/ncpfs/mmap.c b/fs/ncpfs/mmap.c
7537 index a94473d..5d8dcb9 100644
7538 --- a/fs/ncpfs/mmap.c
7539 +++ b/fs/ncpfs/mmap.c
7540 @@ -50,10 +50,6 @@ static int ncp_file_mmap_fault(struct vm_area_struct *area,
7541 pos = vmf->pgoff << PAGE_SHIFT;
7542
7543 count = PAGE_SIZE;
7544 - if ((unsigned long)vmf->virtual_address + PAGE_SIZE > area->vm_end) {
7545 - WARN_ON(1); /* shouldn't happen? */
7546 - count = area->vm_end - (unsigned long)vmf->virtual_address;
7547 - }
7548 /* what we can read in one go */
7549 bufsize = NCP_SERVER(inode)->buffer_size;
7550
7551 diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
7552 index 10f6e7d..2dc0a54 100644
7553 --- a/fs/nfsd/nfs3xdr.c
7554 +++ b/fs/nfsd/nfs3xdr.c
7555 @@ -396,8 +396,11 @@ nfs3svc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
7556 * Round the length of the data which was specified up to
7557 * the next multiple of XDR units and then compare that
7558 * against the length which was actually received.
7559 + * Note that when RPCSEC/GSS (for example) is used, the
7560 + * data buffer can be padded so dlen might be larger
7561 + * than required. It must never be smaller.
7562 */
7563 - if (dlen != XDR_QUADLEN(len)*4)
7564 + if (dlen < XDR_QUADLEN(len)*4)
7565 return 0;
7566
7567 if (args->count > max_blocksize) {
7568 diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
7569 index cb3e7fa..bd3d5b9 100644
7570 --- a/fs/nfsd/nfsxdr.c
7571 +++ b/fs/nfsd/nfsxdr.c
7572 @@ -313,8 +313,11 @@ nfssvc_decode_writeargs(struct svc_rqst *rqstp, __be32 *p,
7573 * Round the length of the data which was specified up to
7574 * the next multiple of XDR units and then compare that
7575 * against the length which was actually received.
7576 + * Note that when RPCSEC/GSS (for example) is used, the
7577 + * data buffer can be padded so dlen might be larger
7578 + * than required. It must never be smaller.
7579 */
7580 - if (dlen != XDR_QUADLEN(len)*4)
7581 + if (dlen < XDR_QUADLEN(len)*4)
7582 return 0;
7583
7584 rqstp->rq_vec[0].iov_base = (void*)p;
7585 diff --git a/fs/splice.c b/fs/splice.c
7586 index 02c39ae..2aa8f5a 100644
7587 --- a/fs/splice.c
7588 +++ b/fs/splice.c
7589 @@ -1234,6 +1234,9 @@ static int copy_from_user_mmap_sem(void *dst, const void __user *src, size_t n)
7590 {
7591 int partial;
7592
7593 + if (!access_ok(VERIFY_READ, src, n))
7594 + return -EFAULT;
7595 +
7596 pagefault_disable();
7597 partial = __copy_from_user_inatomic(dst, src, n);
7598 pagefault_enable();
7599 @@ -1442,6 +1445,11 @@ static long vmsplice_to_user(struct file *file, const struct iovec __user *iov,
7600 break;
7601 }
7602
7603 + if (unlikely(!access_ok(VERIFY_WRITE, base, len))) {
7604 + error = -EFAULT;
7605 + break;
7606 + }
7607 +
7608 sd.len = 0;
7609 sd.total_len = len;
7610 sd.flags = flags;
7611 diff --git a/include/asm-m68k/Kbuild b/include/asm-m68k/Kbuild
7612 index c68e168..1a922fa 100644
7613 --- a/include/asm-m68k/Kbuild
7614 +++ b/include/asm-m68k/Kbuild
7615 @@ -1 +1,2 @@
7616 include include/asm-generic/Kbuild.asm
7617 +header-y += cachectl.h
7618 diff --git a/include/asm-powerpc/systbl.h b/include/asm-powerpc/systbl.h
7619 index cc6d872..11d5383 100644
7620 --- a/include/asm-powerpc/systbl.h
7621 +++ b/include/asm-powerpc/systbl.h
7622 @@ -308,8 +308,8 @@ COMPAT_SYS_SPU(move_pages)
7623 SYSCALL_SPU(getcpu)
7624 COMPAT_SYS(epoll_pwait)
7625 COMPAT_SYS_SPU(utimensat)
7626 -COMPAT_SYS(fallocate)
7627 COMPAT_SYS_SPU(signalfd)
7628 COMPAT_SYS_SPU(timerfd)
7629 SYSCALL_SPU(eventfd)
7630 COMPAT_SYS_SPU(sync_file_range2)
7631 +COMPAT_SYS(fallocate)
7632 diff --git a/include/asm-sparc64/dma-mapping.h b/include/asm-sparc64/dma-mapping.h
7633 index 1fc6554..38cbec7 100644
7634 --- a/include/asm-sparc64/dma-mapping.h
7635 +++ b/include/asm-sparc64/dma-mapping.h
7636 @@ -25,15 +25,9 @@ struct dma_ops {
7637 void (*sync_single_for_cpu)(struct device *dev,
7638 dma_addr_t dma_handle, size_t size,
7639 enum dma_data_direction direction);
7640 - void (*sync_single_for_device)(struct device *dev,
7641 - dma_addr_t dma_handle, size_t size,
7642 - enum dma_data_direction direction);
7643 void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg,
7644 int nelems,
7645 enum dma_data_direction direction);
7646 - void (*sync_sg_for_device)(struct device *dev, struct scatterlist *sg,
7647 - int nelems,
7648 - enum dma_data_direction direction);
7649 };
7650 extern const struct dma_ops *dma_ops;
7651
7652 @@ -105,7 +99,7 @@ static inline void dma_sync_single_for_device(struct device *dev,
7653 size_t size,
7654 enum dma_data_direction direction)
7655 {
7656 - dma_ops->sync_single_for_device(dev, dma_handle, size, direction);
7657 + /* No flushing needed to sync cpu writes to the device. */
7658 }
7659
7660 static inline void dma_sync_single_range_for_cpu(struct device *dev,
7661 @@ -123,7 +117,7 @@ static inline void dma_sync_single_range_for_device(struct device *dev,
7662 size_t size,
7663 enum dma_data_direction direction)
7664 {
7665 - dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
7666 + /* No flushing needed to sync cpu writes to the device. */
7667 }
7668
7669
7670 @@ -138,7 +132,7 @@ static inline void dma_sync_sg_for_device(struct device *dev,
7671 struct scatterlist *sg, int nelems,
7672 enum dma_data_direction direction)
7673 {
7674 - dma_ops->sync_sg_for_device(dev, sg, nelems, direction);
7675 + /* No flushing needed to sync cpu writes to the device. */
7676 }
7677
7678 static inline int dma_mapping_error(dma_addr_t dma_addr)
7679 diff --git a/include/asm-sparc64/hypervisor.h b/include/asm-sparc64/hypervisor.h
7680 index 524d498..3ad45df 100644
7681 --- a/include/asm-sparc64/hypervisor.h
7682 +++ b/include/asm-sparc64/hypervisor.h
7683 @@ -709,6 +709,10 @@ extern unsigned long sun4v_mmu_tsb_ctx0(unsigned long num_descriptions,
7684 */
7685 #define HV_FAST_MMU_DEMAP_ALL 0x24
7686
7687 +#ifndef __ASSEMBLY__
7688 +extern void sun4v_mmu_demap_all(void);
7689 +#endif
7690 +
7691 /* mmu_map_perm_addr()
7692 * TRAP: HV_FAST_TRAP
7693 * FUNCTION: HV_FAST_MMU_MAP_PERM_ADDR
7694 diff --git a/include/asm-sparc64/pci.h b/include/asm-sparc64/pci.h
7695 index 1393e57..f59f257 100644
7696 --- a/include/asm-sparc64/pci.h
7697 +++ b/include/asm-sparc64/pci.h
7698 @@ -200,6 +200,10 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
7699 struct device_node;
7700 extern struct device_node *pci_device_to_OF_node(struct pci_dev *pdev);
7701
7702 +#define HAVE_ARCH_PCI_RESOURCE_TO_USER
7703 +extern void pci_resource_to_user(const struct pci_dev *dev, int bar,
7704 + const struct resource *rsrc,
7705 + resource_size_t *start, resource_size_t *end);
7706 #endif /* __KERNEL__ */
7707
7708 #endif /* __SPARC64_PCI_H */
7709 diff --git a/include/linux/acpi.h b/include/linux/acpi.h
7710 index bf5e000..919e0a5 100644
7711 --- a/include/linux/acpi.h
7712 +++ b/include/linux/acpi.h
7713 @@ -40,6 +40,7 @@
7714 #include <acpi/acpi_drivers.h>
7715 #include <acpi/acpi_numa.h>
7716 #include <asm/acpi.h>
7717 +#include <linux/dmi.h>
7718
7719
7720 #ifdef CONFIG_ACPI
7721 @@ -187,7 +188,9 @@ extern int ec_transaction(u8 command,
7722 #endif /*CONFIG_ACPI_EC*/
7723
7724 extern int acpi_blacklisted(void);
7725 -extern void acpi_bios_year(char *s);
7726 +#ifdef CONFIG_DMI
7727 +extern void acpi_dmi_osi_linux(int enable, const struct dmi_system_id *d);
7728 +#endif
7729
7730 #define ACPI_CSTATE_LIMIT_DEFINED /* for driver builds */
7731 #ifdef CONFIG_ACPI
7732 @@ -247,5 +250,5 @@ static inline int acpi_boot_table_init(void)
7733 return 0;
7734 }
7735
7736 -#endif /* CONFIG_ACPI */
7737 +#endif /* !CONFIG_ACPI */
7738 #endif /*_LINUX_ACPI_H*/
7739 diff --git a/include/linux/dmi.h b/include/linux/dmi.h
7740 index b8ac7b0..d8a946f 100644
7741 --- a/include/linux/dmi.h
7742 +++ b/include/linux/dmi.h
7743 @@ -78,6 +78,7 @@ extern struct dmi_device * dmi_find_device(int type, const char *name,
7744 extern void dmi_scan_machine(void);
7745 extern int dmi_get_year(int field);
7746 extern int dmi_name_in_vendors(char *str);
7747 +extern int dmi_available;
7748
7749 #else
7750
7751 @@ -87,6 +88,7 @@ static inline struct dmi_device * dmi_find_device(int type, const char *name,
7752 struct dmi_device *from) { return NULL; }
7753 static inline int dmi_get_year(int year) { return 0; }
7754 static inline int dmi_name_in_vendors(char *s) { return 0; }
7755 +#define dmi_available 0
7756
7757 #endif
7758
7759 diff --git a/include/linux/freezer.h b/include/linux/freezer.h
7760 index efded00..7fa9500 100644
7761 --- a/include/linux/freezer.h
7762 +++ b/include/linux/freezer.h
7763 @@ -4,6 +4,7 @@
7764 #define FREEZER_H_INCLUDED
7765
7766 #include <linux/sched.h>
7767 +#include <linux/wait.h>
7768
7769 #ifdef CONFIG_PM_SLEEP
7770 /*
7771 @@ -126,6 +127,24 @@ static inline void set_freezable(void)
7772 current->flags &= ~PF_NOFREEZE;
7773 }
7774
7775 +/*
7776 + * Freezer-friendly wrapper around wait_event_interruptible(), originally
7777 + * defined in <linux/wait.h>
7778 + */
7779 +
7780 +#define wait_event_freezable(wq, condition) \
7781 +({ \
7782 + int __retval; \
7783 + do { \
7784 + __retval = wait_event_interruptible(wq, \
7785 + (condition) || freezing(current)); \
7786 + if (__retval && !freezing(current)) \
7787 + break; \
7788 + else if (!(condition)) \
7789 + __retval = -ERESTARTSYS; \
7790 + } while (try_to_freeze()); \
7791 + __retval; \
7792 +})
7793 #else /* !CONFIG_PM_SLEEP */
7794 static inline int frozen(struct task_struct *p) { return 0; }
7795 static inline int freezing(struct task_struct *p) { return 0; }
7796 @@ -143,6 +162,10 @@ static inline void freezer_do_not_count(void) {}
7797 static inline void freezer_count(void) {}
7798 static inline int freezer_should_skip(struct task_struct *p) { return 0; }
7799 static inline void set_freezable(void) {}
7800 +
7801 +#define wait_event_freezable(wq, condition) \
7802 + wait_event_interruptible(wq, condition)
7803 +
7804 #endif /* !CONFIG_PM_SLEEP */
7805
7806 #endif /* FREEZER_H_INCLUDED */
7807 diff --git a/include/linux/input.h b/include/linux/input.h
7808 index 36e00aa..5ec6b68 100644
7809 --- a/include/linux/input.h
7810 +++ b/include/linux/input.h
7811 @@ -853,7 +853,7 @@ struct ff_rumble_effect {
7812 * defining effect parameters
7813 *
7814 * This structure is sent through ioctl from the application to the driver.
7815 - * To create a new effect aplication should set its @id to -1; the kernel
7816 + * To create a new effect application should set its @id to -1; the kernel
7817 * will return assigned @id which can later be used to update or delete
7818 * this effect.
7819 *
7820 @@ -933,9 +933,82 @@ struct ff_effect {
7821 #define BIT(x) (1UL<<((x)%BITS_PER_LONG))
7822 #define LONG(x) ((x)/BITS_PER_LONG)
7823
7824 +/**
7825 + * struct input_dev - represents an input device
7826 + * @name: name of the device
7827 + * @phys: physical path to the device in the system hierarchy
7828 + * @uniq: unique identification code for the device (if device has it)
7829 + * @id: id of the device (struct input_id)
7830 + * @evbit: bitmap of types of events supported by the device (EV_KEY,
7831 + * EV_REL, etc.)
7832 + * @keybit: bitmap of keys/buttons this device has
7833 + * @relbit: bitmap of relative axes for the device
7834 + * @absbit: bitmap of absolute axes for the device
7835 + * @mscbit: bitmap of miscellaneous events supported by the device
7836 + * @ledbit: bitmap of leds present on the device
7837 + * @sndbit: bitmap of sound effects supported by the device
7838 + * @ffbit: bitmap of force feedback effects supported by the device
7839 + * @swbit: bitmap of switches present on the device
7840 + * @keycodemax: size of keycode table
7841 + * @keycodesize: size of elements in keycode table
7842 + * @keycode: map of scancodes to keycodes for this device
7843 + * @setkeycode: optional method to alter current keymap, used to implement
7844 + * sparse keymaps. If not supplied default mechanism will be used
7845 + * @getkeycode: optional method to retrieve current keymap. If not supplied
7846 + * default mechanism will be used
7847 + * @ff: force feedback structure associated with the device if device
7848 + * supports force feedback effects
7849 + * @repeat_key: stores key code of the last key pressed; used to implement
7850 + * software autorepeat
7851 + * @timer: timer for software autorepeat
7852 + * @sync: set to 1 when there were no new events since last EV_SYNC
7853 + * @abs: current values for reports from absolute axes
7854 + * @rep: current values for autorepeat parameters (delay, rate)
7855 + * @key: reflects current state of device's keys/buttons
7856 + * @led: reflects current state of device's LEDs
7857 + * @snd: reflects current state of sound effects
7858 + * @sw: reflects current state of device's switches
7859 + * @absmax: maximum values for events coming from absolute axes
7860 + * @absmin: minimum values for events coming from absolute axes
7861 + * @absfuzz: describes noisiness for axes
7862 + * @absflat: size of the center flat position (used by joydev)
7863 + * @open: this method is called when the very first user calls
7864 + * input_open_device(). The driver must prepare the device
7865 + * to start generating events (start polling thread,
7866 + * request an IRQ, submit URB, etc.)
7867 + * @close: this method is called when the very last user calls
7868 + * input_close_device().
7869 + * @flush: purges the device. Most commonly used to get rid of force
7870 + * feedback effects loaded into the device when disconnecting
7871 + * from it
7872 + * @event: event handler for events sent _to_ the device, like EV_LED
7873 + * or EV_SND. The device is expected to carry out the requested
7874 + * action (turn on a LED, play sound, etc.) The call is protected
7875 + * by @event_lock and must not sleep
7876 + * @grab: input handle that currently has the device grabbed (via
7877 + * EVIOCGRAB ioctl). When a handle grabs a device it becomes sole
7878 + * recipient for all input events coming from the device
7879 + * @event_lock: this spinlock is is taken when input core receives
7880 + * and processes a new event for the device (in input_event()).
7881 + * Code that accesses and/or modifies parameters of a device
7882 + * (such as keymap or absmin, absmax, absfuzz, etc.) after device
7883 + * has been registered with input core must take this lock.
7884 + * @mutex: serializes calls to open(), close() and flush() methods
7885 + * @users: stores number of users (input handlers) that opened this
7886 + * device. It is used by input_open_device() and input_close_device()
7887 + * to make sure that dev->open() is only called when the first
7888 + * user opens device and dev->close() is called when the very
7889 + * last user closes the device
7890 + * @going_away: marks devices that are in a middle of unregistering and
7891 + * causes input_open_device*() fail with -ENODEV.
7892 + * @dev: driver model's view of this device
7893 + * @h_list: list of input handles associated with the device. When
7894 + * accessing the list dev->mutex must be held
7895 + * @node: used to place the device onto input_dev_list
7896 + */
7897 struct input_dev {
7898
7899 - void *private;
7900 + void *private; /* do not use */
7901
7902 const char *name;
7903 const char *phys;
7904 @@ -963,8 +1036,6 @@ struct input_dev {
7905 unsigned int repeat_key;
7906 struct timer_list timer;
7907
7908 - int state;
7909 -
7910 int sync;
7911
7912 int abs[ABS_MAX + 1];
7913 @@ -987,8 +1058,11 @@ struct input_dev {
7914
7915 struct input_handle *grab;
7916
7917 - struct mutex mutex; /* serializes open and close operations */
7918 + spinlock_t event_lock;
7919 + struct mutex mutex;
7920 +
7921 unsigned int users;
7922 + int going_away;
7923
7924 struct device dev;
7925 union { /* temporarily so while we switching to struct device */
7926 @@ -1054,7 +1128,9 @@ struct input_handle;
7927 /**
7928 * struct input_handler - implements one of interfaces for input devices
7929 * @private: driver-specific data
7930 - * @event: event handler
7931 + * @event: event handler. This method is being called by input core with
7932 + * interrupts disabled and dev->event_lock spinlock held and so
7933 + * it may not sleep
7934 * @connect: called when attaching a handler to an input device
7935 * @disconnect: disconnects a handler from input device
7936 * @start: starts handler for given handle. This function is called by
7937 @@ -1066,10 +1142,18 @@ struct input_handle;
7938 * @name: name of the handler, to be shown in /proc/bus/input/handlers
7939 * @id_table: pointer to a table of input_device_ids this driver can
7940 * handle
7941 - * @blacklist: prointer to a table of input_device_ids this driver should
7942 + * @blacklist: pointer to a table of input_device_ids this driver should
7943 * ignore even if they match @id_table
7944 * @h_list: list of input handles associated with the handler
7945 * @node: for placing the driver onto input_handler_list
7946 + *
7947 + * Input handlers attach to input devices and create input handles. There
7948 + * are likely several handlers attached to any given input device at the
7949 + * same time. All of them will get their copy of input event generated by
7950 + * the device.
7951 + *
7952 + * Note that input core serializes calls to connect() and disconnect()
7953 + * methods.
7954 */
7955 struct input_handler {
7956
7957 @@ -1091,6 +1175,18 @@ struct input_handler {
7958 struct list_head node;
7959 };
7960
7961 +/**
7962 + * struct input_handle - links input device with an input handler
7963 + * @private: handler-specific data
7964 + * @open: counter showing whether the handle is 'open', i.e. should deliver
7965 + * events from its device
7966 + * @name: name given to the handle by handler that created it
7967 + * @dev: input device the handle is attached to
7968 + * @handler: handler that works with the device through this handle
7969 + * @d_node: used to put the handle on device's list of attached handles
7970 + * @h_node: used to put the handle on handler's list of handles from which
7971 + * it gets events
7972 + */
7973 struct input_handle {
7974
7975 void *private;
7976 @@ -1213,7 +1309,7 @@ extern struct class input_class;
7977 * @max_effects: maximum number of effects supported by device
7978 * @effects: pointer to an array of effects currently loaded into device
7979 * @effect_owners: array of effect owners; when file handle owning
7980 - * an effect gets closed the effcet is automatically erased
7981 + * an effect gets closed the effect is automatically erased
7982 *
7983 * Every force-feedback device must implement upload() and playback()
7984 * methods; erase() is optional. set_gain() and set_autocenter() need
7985 diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
7986 index 97de8aa..0349e82 100644
7987 --- a/include/linux/pci_ids.h
7988 +++ b/include/linux/pci_ids.h
7989 @@ -2287,6 +2287,8 @@
7990 #define PCI_DEVICE_ID_INTEL_ICH9_4 0x2914
7991 #define PCI_DEVICE_ID_INTEL_ICH9_5 0x2919
7992 #define PCI_DEVICE_ID_INTEL_ICH9_6 0x2930
7993 +#define PCI_DEVICE_ID_INTEL_ICH9_7 0x2916
7994 +#define PCI_DEVICE_ID_INTEL_ICH9_8 0x2918
7995 #define PCI_DEVICE_ID_INTEL_82855PM_HB 0x3340
7996 #define PCI_DEVICE_ID_INTEL_82830_HB 0x3575
7997 #define PCI_DEVICE_ID_INTEL_82830_CGC 0x3577
7998 diff --git a/include/linux/pm.h b/include/linux/pm.h
7999 index 48b71ba..71e589b 100644
8000 --- a/include/linux/pm.h
8001 +++ b/include/linux/pm.h
8002 @@ -344,6 +344,15 @@ static inline int call_platform_enable_wakeup(struct device *dev, int is_on)
8003 device_set_wakeup_enable(dev,val); \
8004 } while(0)
8005
8006 +/*
8007 + * Global Power Management flags
8008 + * Used to keep APM and ACPI from both being active
8009 + */
8010 +extern unsigned int pm_flags;
8011 +
8012 +#define PM_APM 1
8013 +#define PM_ACPI 2
8014 +
8015 #endif /* __KERNEL__ */
8016
8017 #endif /* _LINUX_PM_H */
8018 diff --git a/include/linux/pm_legacy.h b/include/linux/pm_legacy.h
8019 index 514729a..446f4f4 100644
8020 --- a/include/linux/pm_legacy.h
8021 +++ b/include/linux/pm_legacy.h
8022 @@ -4,10 +4,6 @@
8023
8024 #ifdef CONFIG_PM_LEGACY
8025
8026 -extern int pm_active;
8027 -
8028 -#define PM_IS_ACTIVE() (pm_active != 0)
8029 -
8030 /*
8031 * Register a device with power management
8032 */
8033 @@ -21,8 +17,6 @@ int __deprecated pm_send_all(pm_request_t rqst, void *data);
8034
8035 #else /* CONFIG_PM_LEGACY */
8036
8037 -#define PM_IS_ACTIVE() 0
8038 -
8039 static inline struct pm_dev *pm_register(pm_dev_t type,
8040 unsigned long id,
8041 pm_callback callback)
8042 diff --git a/include/linux/quicklist.h b/include/linux/quicklist.h
8043 index 9371c61..39b6671 100644
8044 --- a/include/linux/quicklist.h
8045 +++ b/include/linux/quicklist.h
8046 @@ -56,14 +56,6 @@ static inline void __quicklist_free(int nr, void (*dtor)(void *), void *p,
8047 struct page *page)
8048 {
8049 struct quicklist *q;
8050 - int nid = page_to_nid(page);
8051 -
8052 - if (unlikely(nid != numa_node_id())) {
8053 - if (dtor)
8054 - dtor(p);
8055 - __free_page(page);
8056 - return;
8057 - }
8058
8059 q = &get_cpu_var(quicklist)[nr];
8060 *(void **)p = q->page;
8061 diff --git a/kernel/kmod.c b/kernel/kmod.c
8062 index c6a4f8a..bb7df2a 100644
8063 --- a/kernel/kmod.c
8064 +++ b/kernel/kmod.c
8065 @@ -451,13 +451,11 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
8066 enum umh_wait wait)
8067 {
8068 DECLARE_COMPLETION_ONSTACK(done);
8069 - int retval;
8070 + int retval = 0;
8071
8072 helper_lock();
8073 - if (sub_info->path[0] == '\0') {
8074 - retval = 0;
8075 + if (sub_info->path[0] == '\0')
8076 goto out;
8077 - }
8078
8079 if (!khelper_wq || usermodehelper_disabled) {
8080 retval = -EBUSY;
8081 @@ -468,13 +466,14 @@ int call_usermodehelper_exec(struct subprocess_info *sub_info,
8082 sub_info->wait = wait;
8083
8084 queue_work(khelper_wq, &sub_info->work);
8085 - if (wait == UMH_NO_WAIT) /* task has freed sub_info */
8086 - return 0;
8087 + if (wait == UMH_NO_WAIT) /* task has freed sub_info */
8088 + goto unlock;
8089 wait_for_completion(&done);
8090 retval = sub_info->retval;
8091
8092 - out:
8093 +out:
8094 call_usermodehelper_freeinfo(sub_info);
8095 +unlock:
8096 helper_unlock();
8097 return retval;
8098 }
8099 diff --git a/kernel/power/main.c b/kernel/power/main.c
8100 index 350b485..0e44534 100644
8101 --- a/kernel/power/main.c
8102 +++ b/kernel/power/main.c
8103 @@ -27,6 +27,9 @@ BLOCKING_NOTIFIER_HEAD(pm_chain_head);
8104
8105 DEFINE_MUTEX(pm_mutex);
8106
8107 +unsigned int pm_flags;
8108 +EXPORT_SYMBOL(pm_flags);
8109 +
8110 #ifdef CONFIG_SUSPEND
8111
8112 /* This is just an arbitrary number */
8113 diff --git a/kernel/power/pm.c b/kernel/power/pm.c
8114 index c50d152..60c73fa 100644
8115 --- a/kernel/power/pm.c
8116 +++ b/kernel/power/pm.c
8117 @@ -27,8 +27,6 @@
8118 #include <linux/interrupt.h>
8119 #include <linux/mutex.h>
8120
8121 -int pm_active;
8122 -
8123 /*
8124 * Locking notes:
8125 * pm_devs_lock can be a semaphore providing pm ops are not called
8126 @@ -204,6 +202,4 @@ int pm_send_all(pm_request_t rqst, void *data)
8127
8128 EXPORT_SYMBOL(pm_register);
8129 EXPORT_SYMBOL(pm_send_all);
8130 -EXPORT_SYMBOL(pm_active);
8131 -
8132
8133 diff --git a/kernel/relay.c b/kernel/relay.c
8134 index ad85501..91bbfb7 100644
8135 --- a/kernel/relay.c
8136 +++ b/kernel/relay.c
8137 @@ -92,6 +92,7 @@ static int relay_mmap_buf(struct rchan_buf *buf, struct vm_area_struct *vma)
8138 return -EINVAL;
8139
8140 vma->vm_ops = &relay_file_mmap_ops;
8141 + vma->vm_flags |= VM_DONTEXPAND;
8142 vma->vm_private_data = buf;
8143 buf->chan->cb->buf_mapped(buf, filp);
8144
8145 diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c
8146 index 0962e05..1984669 100644
8147 --- a/kernel/time/tick-broadcast.c
8148 +++ b/kernel/time/tick-broadcast.c
8149 @@ -387,45 +387,19 @@ int tick_resume_broadcast_oneshot(struct clock_event_device *bc)
8150 }
8151
8152 /*
8153 - * Reprogram the broadcast device:
8154 - *
8155 - * Called with tick_broadcast_lock held and interrupts disabled.
8156 - */
8157 -static int tick_broadcast_reprogram(void)
8158 -{
8159 - ktime_t expires = { .tv64 = KTIME_MAX };
8160 - struct tick_device *td;
8161 - int cpu;
8162 -
8163 - /*
8164 - * Find the event which expires next:
8165 - */
8166 - for (cpu = first_cpu(tick_broadcast_oneshot_mask); cpu != NR_CPUS;
8167 - cpu = next_cpu(cpu, tick_broadcast_oneshot_mask)) {
8168 - td = &per_cpu(tick_cpu_device, cpu);
8169 - if (td->evtdev->next_event.tv64 < expires.tv64)
8170 - expires = td->evtdev->next_event;
8171 - }
8172 -
8173 - if (expires.tv64 == KTIME_MAX)
8174 - return 0;
8175 -
8176 - return tick_broadcast_set_event(expires, 0);
8177 -}
8178 -
8179 -/*
8180 * Handle oneshot mode broadcasting
8181 */
8182 static void tick_handle_oneshot_broadcast(struct clock_event_device *dev)
8183 {
8184 struct tick_device *td;
8185 cpumask_t mask;
8186 - ktime_t now;
8187 + ktime_t now, next_event;
8188 int cpu;
8189
8190 spin_lock(&tick_broadcast_lock);
8191 again:
8192 dev->next_event.tv64 = KTIME_MAX;
8193 + next_event.tv64 = KTIME_MAX;
8194 mask = CPU_MASK_NONE;
8195 now = ktime_get();
8196 /* Find all expired events */
8197 @@ -434,19 +408,31 @@ again:
8198 td = &per_cpu(tick_cpu_device, cpu);
8199 if (td->evtdev->next_event.tv64 <= now.tv64)
8200 cpu_set(cpu, mask);
8201 + else if (td->evtdev->next_event.tv64 < next_event.tv64)
8202 + next_event.tv64 = td->evtdev->next_event.tv64;
8203 }
8204
8205 /*
8206 - * Wakeup the cpus which have an expired event. The broadcast
8207 - * device is reprogrammed in the return from idle code.
8208 + * Wakeup the cpus which have an expired event.
8209 + */
8210 + tick_do_broadcast(mask);
8211 +
8212 + /*
8213 + * Two reasons for reprogram:
8214 + *
8215 + * - The global event did not expire any CPU local
8216 + * events. This happens in dyntick mode, as the maximum PIT
8217 + * delta is quite small.
8218 + *
8219 + * - There are pending events on sleeping CPUs which were not
8220 + * in the event mask
8221 */
8222 - if (!tick_do_broadcast(mask)) {
8223 + if (next_event.tv64 != KTIME_MAX) {
8224 /*
8225 - * The global event did not expire any CPU local
8226 - * events. This happens in dyntick mode, as the
8227 - * maximum PIT delta is quite small.
8228 + * Rearm the broadcast device. If event expired,
8229 + * repeat the above
8230 */
8231 - if (tick_broadcast_reprogram())
8232 + if (tick_broadcast_set_event(next_event, 0))
8233 goto again;
8234 }
8235 spin_unlock(&tick_broadcast_lock);
8236 diff --git a/mm/mmap.c b/mm/mmap.c
8237 index 0d40e66..f6058f6 100644
8238 --- a/mm/mmap.c
8239 +++ b/mm/mmap.c
8240 @@ -1619,6 +1619,12 @@ static inline int expand_downwards(struct vm_area_struct *vma,
8241 */
8242 if (unlikely(anon_vma_prepare(vma)))
8243 return -ENOMEM;
8244 +
8245 + address &= PAGE_MASK;
8246 + error = security_file_mmap(0, 0, 0, 0, address, 1);
8247 + if (error)
8248 + return error;
8249 +
8250 anon_vma_lock(vma);
8251
8252 /*
8253 @@ -1626,8 +1632,6 @@ static inline int expand_downwards(struct vm_area_struct *vma,
8254 * is required to hold the mmap_sem in read mode. We need the
8255 * anon_vma lock to serialize against concurrent expand_stacks.
8256 */
8257 - address &= PAGE_MASK;
8258 - error = 0;
8259
8260 /* Somebody else might have raced and expanded it already */
8261 if (address < vma->vm_start) {
8262 @@ -1938,6 +1942,10 @@ unsigned long do_brk(unsigned long addr, unsigned long len)
8263 if (is_hugepage_only_range(mm, addr, len))
8264 return -EINVAL;
8265
8266 + error = security_file_mmap(0, 0, 0, 0, addr, 1);
8267 + if (error)
8268 + return error;
8269 +
8270 flags = VM_DATA_DEFAULT_FLAGS | VM_ACCOUNT | mm->def_flags;
8271
8272 error = arch_mmap_check(addr, len, flags);
8273 @@ -2209,7 +2217,7 @@ int install_special_mapping(struct mm_struct *mm,
8274 vma->vm_start = addr;
8275 vma->vm_end = addr + len;
8276
8277 - vma->vm_flags = vm_flags | mm->def_flags;
8278 + vma->vm_flags = vm_flags | mm->def_flags | VM_DONTEXPAND;
8279 vma->vm_page_prot = protection_map[vma->vm_flags & 7];
8280
8281 vma->vm_ops = &special_mapping_vmops;
8282 diff --git a/mm/quicklist.c b/mm/quicklist.c
8283 index ae8189c..3f703f7 100644
8284 --- a/mm/quicklist.c
8285 +++ b/mm/quicklist.c
8286 @@ -26,9 +26,17 @@ DEFINE_PER_CPU(struct quicklist, quicklist)[CONFIG_NR_QUICK];
8287 static unsigned long max_pages(unsigned long min_pages)
8288 {
8289 unsigned long node_free_pages, max;
8290 + struct zone *zones = NODE_DATA(numa_node_id())->node_zones;
8291 +
8292 + node_free_pages =
8293 +#ifdef CONFIG_ZONE_DMA
8294 + zone_page_state(&zones[ZONE_DMA], NR_FREE_PAGES) +
8295 +#endif
8296 +#ifdef CONFIG_ZONE_DMA32
8297 + zone_page_state(&zones[ZONE_DMA32], NR_FREE_PAGES) +
8298 +#endif
8299 + zone_page_state(&zones[ZONE_NORMAL], NR_FREE_PAGES);
8300
8301 - node_free_pages = node_page_state(numa_node_id(),
8302 - NR_FREE_PAGES);
8303 max = node_free_pages / FRACTION_OF_NODE_MEM;
8304 return max(max, min_pages);
8305 }
8306 diff --git a/mm/truncate.c b/mm/truncate.c
8307 index 5cdfbc1..39da569 100644
8308 --- a/mm/truncate.c
8309 +++ b/mm/truncate.c
8310 @@ -95,11 +95,11 @@ truncate_complete_page(struct address_space *mapping, struct page *page)
8311 if (page->mapping != mapping)
8312 return;
8313
8314 - cancel_dirty_page(page, PAGE_CACHE_SIZE);
8315 -
8316 if (PagePrivate(page))
8317 do_invalidatepage(page, 0);
8318
8319 + cancel_dirty_page(page, PAGE_CACHE_SIZE);
8320 +
8321 remove_from_page_cache(page);
8322 ClearPageUptodate(page);
8323 ClearPageMappedToDisk(page);
8324 diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c
8325 index ef3f789..21af441 100644
8326 --- a/net/8021q/vlan.c
8327 +++ b/net/8021q/vlan.c
8328 @@ -768,7 +768,7 @@ static int vlan_ioctl_handler(void __user *arg)
8329 case SET_VLAN_NAME_TYPE_CMD:
8330 err = -EPERM;
8331 if (!capable(CAP_NET_ADMIN))
8332 - return -EPERM;
8333 + break;
8334 if ((args.u.name_type >= 0) &&
8335 (args.u.name_type < VLAN_NAME_TYPE_HIGHEST)) {
8336 vlan_name_type = args.u.name_type;
8337 diff --git a/net/atm/mpc.c b/net/atm/mpc.c
8338 index 7c85aa5..181c1c8 100644
8339 --- a/net/atm/mpc.c
8340 +++ b/net/atm/mpc.c
8341 @@ -542,6 +542,13 @@ static int mpc_send_packet(struct sk_buff *skb, struct net_device *dev)
8342 if (eth->h_proto != htons(ETH_P_IP))
8343 goto non_ip; /* Multi-Protocol Over ATM :-) */
8344
8345 + /* Weed out funny packets (e.g., AF_PACKET or raw). */
8346 + if (skb->len < ETH_HLEN + sizeof(struct iphdr))
8347 + goto non_ip;
8348 + skb_set_network_header(skb, ETH_HLEN);
8349 + if (skb->len < ETH_HLEN + ip_hdr(skb)->ihl * 4 || ip_hdr(skb)->ihl < 5)
8350 + goto non_ip;
8351 +
8352 while (i < mpc->number_of_mps_macs) {
8353 if (!compare_ether_addr(eth->h_dest, (mpc->mps_macs + i*ETH_ALEN)))
8354 if ( send_via_shortcut(skb, mpc) == 0 ) /* try shortcut */
8355 diff --git a/net/ax25/ax25_in.c b/net/ax25/ax25_in.c
8356 index 0ddaff0..8a9f0ac 100644
8357 --- a/net/ax25/ax25_in.c
8358 +++ b/net/ax25/ax25_in.c
8359 @@ -124,7 +124,7 @@ int ax25_rx_iframe(ax25_cb *ax25, struct sk_buff *skb)
8360 }
8361
8362 skb_pull(skb, 1); /* Remove PID */
8363 - skb_reset_mac_header(skb);
8364 + skb->mac_header = skb->network_header;
8365 skb_reset_network_header(skb);
8366 skb->dev = ax25->ax25_dev->dev;
8367 skb->pkt_type = PACKET_HOST;
8368 diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
8369 index fc13130..22545bd 100644
8370 --- a/net/bridge/br_netfilter.c
8371 +++ b/net/bridge/br_netfilter.c
8372 @@ -142,6 +142,23 @@ static inline struct nf_bridge_info *nf_bridge_alloc(struct sk_buff *skb)
8373 return skb->nf_bridge;
8374 }
8375
8376 +static inline struct nf_bridge_info *nf_bridge_unshare(struct sk_buff *skb)
8377 +{
8378 + struct nf_bridge_info *nf_bridge = skb->nf_bridge;
8379 +
8380 + if (atomic_read(&nf_bridge->use) > 1) {
8381 + struct nf_bridge_info *tmp = nf_bridge_alloc(skb);
8382 +
8383 + if (tmp) {
8384 + memcpy(tmp, nf_bridge, sizeof(struct nf_bridge_info));
8385 + atomic_set(&tmp->use, 1);
8386 + nf_bridge_put(nf_bridge);
8387 + }
8388 + nf_bridge = tmp;
8389 + }
8390 + return nf_bridge;
8391 +}
8392 +
8393 static inline void nf_bridge_push_encap_header(struct sk_buff *skb)
8394 {
8395 unsigned int len = nf_bridge_encap_header_len(skb);
8396 @@ -247,8 +264,9 @@ static void __br_dnat_complain(void)
8397 * Let us first consider the case that ip_route_input() succeeds:
8398 *
8399 * If skb->dst->dev equals the logical bridge device the packet
8400 - * came in on, we can consider this bridging. We then call
8401 - * skb->dst->output() which will make the packet enter br_nf_local_out()
8402 + * came in on, we can consider this bridging. The packet is passed
8403 + * through the neighbour output function to build a new destination
8404 + * MAC address, which will make the packet enter br_nf_local_out()
8405 * not much later. In that function it is assured that the iptables
8406 * FORWARD chain is traversed for the packet.
8407 *
8408 @@ -285,12 +303,17 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
8409 skb->nf_bridge->mask ^= BRNF_NF_BRIDGE_PREROUTING;
8410
8411 skb->dev = bridge_parent(skb->dev);
8412 - if (!skb->dev)
8413 - kfree_skb(skb);
8414 - else {
8415 + if (skb->dev) {
8416 + struct dst_entry *dst = skb->dst;
8417 +
8418 nf_bridge_pull_encap_header(skb);
8419 - skb->dst->output(skb);
8420 +
8421 + if (dst->hh)
8422 + return neigh_hh_output(dst->hh, skb);
8423 + else if (dst->neighbour)
8424 + return dst->neighbour->output(skb);
8425 }
8426 + kfree_skb(skb);
8427 return 0;
8428 }
8429
8430 @@ -638,6 +661,11 @@ static unsigned int br_nf_forward_ip(unsigned int hook, struct sk_buff **pskb,
8431 if (!skb->nf_bridge)
8432 return NF_ACCEPT;
8433
8434 + /* Need exclusive nf_bridge_info since we might have multiple
8435 + * different physoutdevs. */
8436 + if (!nf_bridge_unshare(skb))
8437 + return NF_DROP;
8438 +
8439 parent = bridge_parent(out);
8440 if (!parent)
8441 return NF_DROP;
8442 @@ -721,6 +749,11 @@ static unsigned int br_nf_local_out(unsigned int hook, struct sk_buff **pskb,
8443 if (!skb->nf_bridge)
8444 return NF_ACCEPT;
8445
8446 + /* Need exclusive nf_bridge_info since we might have multiple
8447 + * different physoutdevs. */
8448 + if (!nf_bridge_unshare(skb))
8449 + return NF_DROP;
8450 +
8451 nf_bridge = skb->nf_bridge;
8452 if (!(nf_bridge->mask & BRNF_BRIDGED_DNAT))
8453 return NF_ACCEPT;
8454 diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
8455 index 5dbe580..5ccc2d1 100644
8456 --- a/net/ipv4/devinet.c
8457 +++ b/net/ipv4/devinet.c
8458 @@ -1030,7 +1030,7 @@ static void inetdev_changename(struct net_device *dev, struct in_device *in_dev)
8459 memcpy(ifa->ifa_label, dev->name, IFNAMSIZ);
8460 if (named++ == 0)
8461 continue;
8462 - dot = strchr(ifa->ifa_label, ':');
8463 + dot = strchr(old, ':');
8464 if (dot == NULL) {
8465 sprintf(old, ":%d", named);
8466 dot = old;
8467 diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
8468 index 5c14ed6..4b09b25 100644
8469 --- a/net/ipv4/ip_gre.c
8470 +++ b/net/ipv4/ip_gre.c
8471 @@ -613,7 +613,7 @@ static int ipgre_rcv(struct sk_buff *skb)
8472 offset += 4;
8473 }
8474
8475 - skb_reset_mac_header(skb);
8476 + skb->mac_header = skb->network_header;
8477 __pskb_pull(skb, offset);
8478 skb_reset_network_header(skb);
8479 skb_postpull_rcsum(skb, skb_transport_header(skb), offset);
8480 diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
8481 index c6d7152..b45a610 100644
8482 --- a/net/ipv4/raw.c
8483 +++ b/net/ipv4/raw.c
8484 @@ -270,6 +270,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
8485 int hh_len;
8486 struct iphdr *iph;
8487 struct sk_buff *skb;
8488 + unsigned int iphlen;
8489 int err;
8490
8491 if (length > rt->u.dst.dev->mtu) {
8492 @@ -303,7 +304,8 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length,
8493 goto error_fault;
8494
8495 /* We don't modify invalid header */
8496 - if (length >= sizeof(*iph) && iph->ihl * 4U <= length) {
8497 + iphlen = iph->ihl * 4;
8498 + if (iphlen >= sizeof(*iph) && iphlen <= length) {
8499 if (!iph->saddr)
8500 iph->saddr = rt->rt_src;
8501 iph->check = 0;
8502 diff --git a/net/ipv4/route.c b/net/ipv4/route.c
8503 index 198b732..efc4a3d 100644
8504 --- a/net/ipv4/route.c
8505 +++ b/net/ipv4/route.c
8506 @@ -2648,11 +2648,10 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
8507 int idx, s_idx;
8508
8509 s_h = cb->args[0];
8510 + if (s_h < 0)
8511 + s_h = 0;
8512 s_idx = idx = cb->args[1];
8513 - for (h = 0; h <= rt_hash_mask; h++) {
8514 - if (h < s_h) continue;
8515 - if (h > s_h)
8516 - s_idx = 0;
8517 + for (h = s_h; h <= rt_hash_mask; h++) {
8518 rcu_read_lock_bh();
8519 for (rt = rcu_dereference(rt_hash_table[h].chain), idx = 0; rt;
8520 rt = rcu_dereference(rt->u.dst.rt_next), idx++) {
8521 @@ -2669,6 +2668,7 @@ int ip_rt_dump(struct sk_buff *skb, struct netlink_callback *cb)
8522 dst_release(xchg(&skb->dst, NULL));
8523 }
8524 rcu_read_unlock_bh();
8525 + s_idx = 0;
8526 }
8527
8528 done:
8529 diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
8530 index 4c670cf..82fdca2 100644
8531 --- a/net/irda/af_irda.c
8532 +++ b/net/irda/af_irda.c
8533 @@ -1115,8 +1115,6 @@ static int irda_create(struct socket *sock, int protocol)
8534 self->max_sdu_size_rx = TTP_SAR_UNBOUND;
8535 break;
8536 default:
8537 - IRDA_ERROR("%s: protocol not supported!\n",
8538 - __FUNCTION__);
8539 return -ESOCKTNOSUPPORT;
8540 }
8541 break;
8542 diff --git a/net/key/af_key.c b/net/key/af_key.c
8543 index 7a5e993..9c75b9e 100644
8544 --- a/net/key/af_key.c
8545 +++ b/net/key/af_key.c
8546 @@ -2780,12 +2780,22 @@ static struct sadb_msg *pfkey_get_base_msg(struct sk_buff *skb, int *errp)
8547
8548 static inline int aalg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
8549 {
8550 - return t->aalgos & (1 << d->desc.sadb_alg_id);
8551 + unsigned int id = d->desc.sadb_alg_id;
8552 +
8553 + if (id >= sizeof(t->aalgos) * 8)
8554 + return 0;
8555 +
8556 + return (t->aalgos >> id) & 1;
8557 }
8558
8559 static inline int ealg_tmpl_set(struct xfrm_tmpl *t, struct xfrm_algo_desc *d)
8560 {
8561 - return t->ealgos & (1 << d->desc.sadb_alg_id);
8562 + unsigned int id = d->desc.sadb_alg_id;
8563 +
8564 + if (id >= sizeof(t->ealgos) * 8)
8565 + return 0;
8566 +
8567 + return (t->ealgos >> id) & 1;
8568 }
8569
8570 static int count_ah_combs(struct xfrm_tmpl *t)
8571 diff --git a/net/netrom/nr_dev.c b/net/netrom/nr_dev.c
8572 index c7b5d93..69e77d5 100644
8573 --- a/net/netrom/nr_dev.c
8574 +++ b/net/netrom/nr_dev.c
8575 @@ -56,7 +56,7 @@ int nr_rx_ip(struct sk_buff *skb, struct net_device *dev)
8576
8577 /* Spoof incoming device */
8578 skb->dev = dev;
8579 - skb_reset_mac_header(skb);
8580 + skb->mac_header = skb->network_header;
8581 skb_reset_network_header(skb);
8582 skb->pkt_type = PACKET_HOST;
8583
8584 diff --git a/net/x25/x25_forward.c b/net/x25/x25_forward.c
8585 index 8738ec7..3447803 100644
8586 --- a/net/x25/x25_forward.c
8587 +++ b/net/x25/x25_forward.c
8588 @@ -118,13 +118,14 @@ int x25_forward_data(int lci, struct x25_neigh *from, struct sk_buff *skb) {
8589 goto out;
8590
8591 if ( (skbn = pskb_copy(skb, GFP_ATOMIC)) == NULL){
8592 - goto out;
8593 + goto output;
8594
8595 }
8596 x25_transmit_link(skbn, nb);
8597
8598 - x25_neigh_put(nb);
8599 rc = 1;
8600 +output:
8601 + x25_neigh_put(nb);
8602 out:
8603 return rc;
8604 }
8605 diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
8606 index 7012891..75629f4 100644
8607 --- a/net/xfrm/xfrm_policy.c
8608 +++ b/net/xfrm/xfrm_policy.c
8609 @@ -1479,8 +1479,9 @@ restart:
8610
8611 if (sk && sk->sk_policy[1]) {
8612 policy = xfrm_sk_policy_lookup(sk, XFRM_POLICY_OUT, fl);
8613 + err = PTR_ERR(policy);
8614 if (IS_ERR(policy))
8615 - return PTR_ERR(policy);
8616 + goto dropdst;
8617 }
8618
8619 if (!policy) {
8620 @@ -1491,8 +1492,9 @@ restart:
8621
8622 policy = flow_cache_lookup(fl, dst_orig->ops->family,
8623 dir, xfrm_policy_lookup);
8624 + err = PTR_ERR(policy);
8625 if (IS_ERR(policy))
8626 - return PTR_ERR(policy);
8627 + goto dropdst;
8628 }
8629
8630 if (!policy)
8631 @@ -1661,8 +1663,9 @@ restart:
8632 return 0;
8633
8634 error:
8635 - dst_release(dst_orig);
8636 xfrm_pols_put(pols, npols);
8637 +dropdst:
8638 + dst_release(dst_orig);
8639 *dst_p = NULL;
8640 return err;
8641 }
8642 diff --git a/sound/oss/via82cxxx_audio.c b/sound/oss/via82cxxx_audio.c
8643 index 5d3c037..f95aa09 100644
8644 --- a/sound/oss/via82cxxx_audio.c
8645 +++ b/sound/oss/via82cxxx_audio.c
8646 @@ -2104,6 +2104,7 @@ static struct page * via_mm_nopage (struct vm_area_struct * vma,
8647 {
8648 struct via_info *card = vma->vm_private_data;
8649 struct via_channel *chan = &card->ch_out;
8650 + unsigned long max_bufs;
8651 struct page *dmapage;
8652 unsigned long pgoff;
8653 int rd, wr;
8654 @@ -2127,14 +2128,11 @@ static struct page * via_mm_nopage (struct vm_area_struct * vma,
8655 rd = card->ch_in.is_mapped;
8656 wr = card->ch_out.is_mapped;
8657
8658 -#ifndef VIA_NDEBUG
8659 - {
8660 - unsigned long max_bufs = chan->frag_number;
8661 - if (rd && wr) max_bufs *= 2;
8662 - /* via_dsp_mmap() should ensure this */
8663 - assert (pgoff < max_bufs);
8664 - }
8665 -#endif
8666 + max_bufs = chan->frag_number;
8667 + if (rd && wr)
8668 + max_bufs *= 2;
8669 + if (pgoff >= max_bufs)
8670 + return NOPAGE_SIGBUS;
8671
8672 /* if full-duplex (read+write) and we have two sets of bufs,
8673 * then the playback buffers come first, sez soundcard.c */
8674 diff --git a/sound/usb/usx2y/usX2Yhwdep.c b/sound/usb/usx2y/usX2Yhwdep.c
8675 index b76b3dd..e617d7e 100644
8676 --- a/sound/usb/usx2y/usX2Yhwdep.c
8677 +++ b/sound/usb/usx2y/usX2Yhwdep.c
8678 @@ -88,7 +88,7 @@ static int snd_us428ctls_mmap(struct snd_hwdep * hw, struct file *filp, struct v
8679 us428->us428ctls_sharedmem->CtlSnapShotLast = -2;
8680 }
8681 area->vm_ops = &us428ctls_vm_ops;
8682 - area->vm_flags |= VM_RESERVED;
8683 + area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
8684 area->vm_private_data = hw->private_data;
8685 return 0;
8686 }
8687 diff --git a/sound/usb/usx2y/usx2yhwdeppcm.c b/sound/usb/usx2y/usx2yhwdeppcm.c
8688 index a5e7bcd..6e70520 100644
8689 --- a/sound/usb/usx2y/usx2yhwdeppcm.c
8690 +++ b/sound/usb/usx2y/usx2yhwdeppcm.c
8691 @@ -728,7 +728,7 @@ static int snd_usX2Y_hwdep_pcm_mmap(struct snd_hwdep * hw, struct file *filp, st
8692 return -ENODEV;
8693 }
8694 area->vm_ops = &snd_usX2Y_hwdep_pcm_vm_ops;
8695 - area->vm_flags |= VM_RESERVED;
8696 + area->vm_flags |= VM_RESERVED | VM_DONTEXPAND;
8697 area->vm_private_data = hw->private_data;
8698 return 0;
8699 }