diff options
author | Jody McIntyre <scjody@modernduck.com> | 2005-11-22 12:38:34 -0500 |
---|---|---|
committer | Jody McIntyre <scjody@modernduck.com> | 2005-11-22 12:38:34 -0500 |
commit | 899a1fc084ef3dcb57737d8847bf219cbf353ed3 (patch) | |
tree | a9dc1c8530524e0ac345f06de6df105f847a7604 | |
parent | c64d472abc68dcad4d34f365545058c3f11973d8 (diff) | |
parent | 989e4d6cbc69191c41ddf4b1c492457410376b43 (diff) |
Merge with http://kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
186 files changed, 2849 insertions, 2337 deletions
@@ -611,8 +611,7 @@ S: USA | |||
611 | N: Randolph Chung | 611 | N: Randolph Chung |
612 | E: tausq@debian.org | 612 | E: tausq@debian.org |
613 | D: Linux/PA-RISC hacker | 613 | D: Linux/PA-RISC hacker |
614 | S: Los Altos, CA 94022 | 614 | S: Hong Kong |
615 | S: USA | ||
616 | 615 | ||
617 | N: Juan Jose Ciarlante | 616 | N: Juan Jose Ciarlante |
618 | W: http://juanjox.kernelnotes.org/ | 617 | W: http://juanjox.kernelnotes.org/ |
@@ -3405,6 +3404,15 @@ S: Chudenicka 8 | |||
3405 | S: 10200 Prague 10, Hostivar | 3404 | S: 10200 Prague 10, Hostivar |
3406 | S: Czech Republic | 3405 | S: Czech Republic |
3407 | 3406 | ||
3407 | N: Thibaut Varene | ||
3408 | E: T-Bone@parisc-linux.org | ||
3409 | W: http://www.parisc-linux.org/ | ||
3410 | P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063 | ||
3411 | D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits | ||
3412 | D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there | ||
3413 | D: AD1889 sound driver | ||
3414 | S: Paris, France | ||
3415 | |||
3408 | N: Heikki Vatiainen | 3416 | N: Heikki Vatiainen |
3409 | E: hessu@cs.tut.fi | 3417 | E: hessu@cs.tut.fi |
3410 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks | 3418 | D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks |
diff --git a/Documentation/DocBook/kernel-api.tmpl b/Documentation/DocBook/kernel-api.tmpl index 096aed62c326..767433bdbc40 100644 --- a/Documentation/DocBook/kernel-api.tmpl +++ b/Documentation/DocBook/kernel-api.tmpl | |||
@@ -237,8 +237,10 @@ X!Ilib/string.c | |||
237 | <sect1><title>Driver Support</title> | 237 | <sect1><title>Driver Support</title> |
238 | !Enet/core/dev.c | 238 | !Enet/core/dev.c |
239 | !Enet/ethernet/eth.c | 239 | !Enet/ethernet/eth.c |
240 | !Einclude/linux/etherdevice.h | 240 | !Iinclude/linux/etherdevice.h |
241 | !Enet/core/wireless.c | 241 | <!-- FIXME: Removed for now since no structured comments in source |
242 | X!Enet/core/wireless.c | ||
243 | --> | ||
242 | </sect1> | 244 | </sect1> |
243 | <sect1><title>Synchronous PPP</title> | 245 | <sect1><title>Synchronous PPP</title> |
244 | !Edrivers/net/wan/syncppp.c | 246 | !Edrivers/net/wan/syncppp.c |
diff --git a/Documentation/arm/memory.txt b/Documentation/arm/memory.txt index 4b1c93a8177b..dc6045577a8b 100644 --- a/Documentation/arm/memory.txt +++ b/Documentation/arm/memory.txt | |||
@@ -1,7 +1,7 @@ | |||
1 | Kernel Memory Layout on ARM Linux | 1 | Kernel Memory Layout on ARM Linux |
2 | 2 | ||
3 | Russell King <rmk@arm.linux.org.uk> | 3 | Russell King <rmk@arm.linux.org.uk> |
4 | May 21, 2004 (2.6.6) | 4 | November 17, 2005 (2.6.15) |
5 | 5 | ||
6 | This document describes the virtual memory layout which the Linux | 6 | This document describes the virtual memory layout which the Linux |
7 | kernel uses for ARM processors. It indicates which regions are | 7 | kernel uses for ARM processors. It indicates which regions are |
@@ -37,6 +37,8 @@ ff000000 ffbfffff Reserved for future expansion of DMA | |||
37 | mapping region. | 37 | mapping region. |
38 | 38 | ||
39 | VMALLOC_END feffffff Free for platform use, recommended. | 39 | VMALLOC_END feffffff Free for platform use, recommended. |
40 | VMALLOC_END must be aligned to a 2MB | ||
41 | boundary. | ||
40 | 42 | ||
41 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. | 43 | VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space. |
42 | Memory returned by vmalloc/ioremap will | 44 | Memory returned by vmalloc/ioremap will |
diff --git a/MAINTAINERS b/MAINTAINERS index f239ac4762dd..c5cf7d7e58b2 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -2907,6 +2907,11 @@ M: zaga@fly.cc.fer.hr | |||
2907 | L: linux-scsi@vger.kernel.org | 2907 | L: linux-scsi@vger.kernel.org |
2908 | S: Maintained | 2908 | S: Maintained |
2909 | 2909 | ||
2910 | WISTRON LAPTOP BUTTON DRIVER | ||
2911 | P: Miloslav Trmac | ||
2912 | M: mitr@volny.cz | ||
2913 | S: Maintained | ||
2914 | |||
2910 | WL3501 WIRELESS PCMCIA CARD DRIVER | 2915 | WL3501 WIRELESS PCMCIA CARD DRIVER |
2911 | P: Arnaldo Carvalho de Melo | 2916 | P: Arnaldo Carvalho de Melo |
2912 | M: acme@conectiva.com.br | 2917 | M: acme@conectiva.com.br |
@@ -1,7 +1,7 @@ | |||
1 | VERSION = 2 | 1 | VERSION = 2 |
2 | PATCHLEVEL = 6 | 2 | PATCHLEVEL = 6 |
3 | SUBLEVEL = 15 | 3 | SUBLEVEL = 15 |
4 | EXTRAVERSION =-rc1 | 4 | EXTRAVERSION =-rc2 |
5 | NAME=Affluent Albatross | 5 | NAME=Affluent Albatross |
6 | 6 | ||
7 | # *DOCUMENTATION* | 7 | # *DOCUMENTATION* |
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index 7a3261f0bf79..9997098009a9 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c | |||
@@ -120,7 +120,6 @@ EXPORT_SYMBOL(__arch_strncpy_from_user); | |||
120 | EXPORT_SYMBOL(__get_user_1); | 120 | EXPORT_SYMBOL(__get_user_1); |
121 | EXPORT_SYMBOL(__get_user_2); | 121 | EXPORT_SYMBOL(__get_user_2); |
122 | EXPORT_SYMBOL(__get_user_4); | 122 | EXPORT_SYMBOL(__get_user_4); |
123 | EXPORT_SYMBOL(__get_user_8); | ||
124 | 123 | ||
125 | EXPORT_SYMBOL(__put_user_1); | 124 | EXPORT_SYMBOL(__put_user_1); |
126 | EXPORT_SYMBOL(__put_user_2); | 125 | EXPORT_SYMBOL(__put_user_2); |
diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 066597f4345a..f7f183075237 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S | |||
@@ -48,8 +48,7 @@ work_pending: | |||
48 | mov r0, sp @ 'regs' | 48 | mov r0, sp @ 'regs' |
49 | mov r2, why @ 'syscall' | 49 | mov r2, why @ 'syscall' |
50 | bl do_notify_resume | 50 | bl do_notify_resume |
51 | disable_irq @ disable interrupts | 51 | b ret_slow_syscall @ Check work again |
52 | b no_work_pending | ||
53 | 52 | ||
54 | work_resched: | 53 | work_resched: |
55 | bl schedule | 54 | bl schedule |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index a917e3dd3666..765922bcf9e7 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -595,23 +595,22 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, | |||
595 | */ | 595 | */ |
596 | ret |= !valid_user_regs(regs); | 596 | ret |= !valid_user_regs(regs); |
597 | 597 | ||
598 | /* | ||
599 | * Block the signal if we were unsuccessful. | ||
600 | */ | ||
601 | if (ret != 0) { | 598 | if (ret != 0) { |
602 | spin_lock_irq(&tsk->sighand->siglock); | 599 | force_sigsegv(sig, tsk); |
603 | sigorsets(&tsk->blocked, &tsk->blocked, | 600 | return; |
604 | &ka->sa.sa_mask); | ||
605 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
606 | sigaddset(&tsk->blocked, sig); | ||
607 | recalc_sigpending(); | ||
608 | spin_unlock_irq(&tsk->sighand->siglock); | ||
609 | } | 601 | } |
610 | 602 | ||
611 | if (ret == 0) | 603 | /* |
612 | return; | 604 | * Block the signal if we were successful. |
605 | */ | ||
606 | spin_lock_irq(&tsk->sighand->siglock); | ||
607 | sigorsets(&tsk->blocked, &tsk->blocked, | ||
608 | &ka->sa.sa_mask); | ||
609 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
610 | sigaddset(&tsk->blocked, sig); | ||
611 | recalc_sigpending(); | ||
612 | spin_unlock_irq(&tsk->sighand->siglock); | ||
613 | 613 | ||
614 | force_sigsegv(sig, tsk); | ||
615 | } | 614 | } |
616 | 615 | ||
617 | /* | 616 | /* |
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S index 80c8e4c8cefa..9a47770114d4 100644 --- a/arch/arm/kernel/vmlinux.lds.S +++ b/arch/arm/kernel/vmlinux.lds.S | |||
@@ -172,6 +172,10 @@ SECTIONS | |||
172 | .comment 0 : { *(.comment) } | 172 | .comment 0 : { *(.comment) } |
173 | } | 173 | } |
174 | 174 | ||
175 | /* those must never be empty */ | 175 | /* |
176 | * These must never be empty | ||
177 | * If you have to comment these two assert statements out, your | ||
178 | * binutils is too old (for other reasons as well) | ||
179 | */ | ||
176 | ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") | 180 | ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support") |
177 | ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") | 181 | ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined") |
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S index d204018070a4..c03ea8e666ba 100644 --- a/arch/arm/lib/getuser.S +++ b/arch/arm/lib/getuser.S | |||
@@ -54,15 +54,6 @@ __get_user_4: | |||
54 | mov r0, #0 | 54 | mov r0, #0 |
55 | mov pc, lr | 55 | mov pc, lr |
56 | 56 | ||
57 | .global __get_user_8 | ||
58 | __get_user_8: | ||
59 | 5: ldrt r2, [r0], #4 | ||
60 | 6: ldrt r3, [r0] | ||
61 | mov r0, #0 | ||
62 | mov pc, lr | ||
63 | |||
64 | __get_user_bad_8: | ||
65 | mov r3, #0 | ||
66 | __get_user_bad: | 57 | __get_user_bad: |
67 | mov r2, #0 | 58 | mov r2, #0 |
68 | mov r0, #-EFAULT | 59 | mov r0, #-EFAULT |
@@ -73,6 +64,4 @@ __get_user_bad: | |||
73 | .long 2b, __get_user_bad | 64 | .long 2b, __get_user_bad |
74 | .long 3b, __get_user_bad | 65 | .long 3b, __get_user_bad |
75 | .long 4b, __get_user_bad | 66 | .long 4b, __get_user_bad |
76 | .long 5b, __get_user_bad_8 | ||
77 | .long 6b, __get_user_bad_8 | ||
78 | .previous | 67 | .previous |
diff --git a/arch/arm/mach-clps7500/core.c b/arch/arm/mach-clps7500/core.c index 0364ba4b539e..d869af0023f8 100644 --- a/arch/arm/mach-clps7500/core.c +++ b/arch/arm/mach-clps7500/core.c | |||
@@ -260,7 +260,7 @@ static void __init clps7500_init_irq(void) | |||
260 | 260 | ||
261 | static struct map_desc cl7500_io_desc[] __initdata = { | 261 | static struct map_desc cl7500_io_desc[] __initdata = { |
262 | { /* IO space */ | 262 | { /* IO space */ |
263 | .virtual = IO_BASE, | 263 | .virtual = (unsigned long)IO_BASE, |
264 | .pfn = __phys_to_pfn(IO_START), | 264 | .pfn = __phys_to_pfn(IO_START), |
265 | .length = IO_SIZE, | 265 | .length = IO_SIZE, |
266 | .type = MT_DEVICE | 266 | .type = MT_DEVICE |
diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c index c312054dfb88..e4f92efc616e 100644 --- a/arch/arm/mach-pxa/tosa.c +++ b/arch/arm/mach-pxa/tosa.c | |||
@@ -14,7 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
16 | #include <linux/init.h> | 16 | #include <linux/init.h> |
17 | #include <linux/device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/major.h> | 18 | #include <linux/major.h> |
19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
20 | #include <linux/interrupt.h> | 20 | #include <linux/interrupt.h> |
diff --git a/arch/arm/mach-sa1100/assabet.c b/arch/arm/mach-sa1100/assabet.c index 75efb5da5b6d..a66ac61233a2 100644 --- a/arch/arm/mach-sa1100/assabet.c +++ b/arch/arm/mach-sa1100/assabet.c | |||
@@ -293,7 +293,8 @@ static void __init get_assabet_scr(void) | |||
293 | GPDR |= 0x3fc; /* Configure GPIO 9:2 as outputs */ | 293 | GPDR |= 0x3fc; /* Configure GPIO 9:2 as outputs */ |
294 | GPSR = 0x3fc; /* Write 0xFF to GPIO 9:2 */ | 294 | GPSR = 0x3fc; /* Write 0xFF to GPIO 9:2 */ |
295 | GPDR &= ~(0x3fc); /* Configure GPIO 9:2 as inputs */ | 295 | GPDR &= ~(0x3fc); /* Configure GPIO 9:2 as inputs */ |
296 | for(i = 100; i--; scr = GPLR); /* Read GPIO 9:2 */ | 296 | for(i = 100; i--; ) /* Read GPIO 9:2 */ |
297 | scr = GPLR; | ||
297 | GPDR |= 0x3fc; /* restore correct pin direction */ | 298 | GPDR |= 0x3fc; /* restore correct pin direction */ |
298 | scr &= 0x3fc; /* save as system configuration byte. */ | 299 | scr &= 0x3fc; /* save as system configuration byte. */ |
299 | SCR_value = scr; | 300 | SCR_value = scr; |
diff --git a/arch/arm/mm/Makefile b/arch/arm/mm/Makefile index 59f47d4c2dfe..ffe73ba2bf17 100644 --- a/arch/arm/mm/Makefile +++ b/arch/arm/mm/Makefile | |||
@@ -51,4 +51,4 @@ obj-$(CONFIG_CPU_ARM1026) += proc-arm1026.o | |||
51 | obj-$(CONFIG_CPU_SA110) += proc-sa110.o | 51 | obj-$(CONFIG_CPU_SA110) += proc-sa110.o |
52 | obj-$(CONFIG_CPU_SA1100) += proc-sa1100.o | 52 | obj-$(CONFIG_CPU_SA1100) += proc-sa1100.o |
53 | obj-$(CONFIG_CPU_XSCALE) += proc-xscale.o | 53 | obj-$(CONFIG_CPU_XSCALE) += proc-xscale.o |
54 | obj-$(CONFIG_CPU_V6) += proc-v6.o blockops.o | 54 | obj-$(CONFIG_CPU_V6) += proc-v6.o |
diff --git a/arch/arm/mm/blockops.c b/arch/arm/mm/blockops.c deleted file mode 100644 index 4f5ee2d08996..000000000000 --- a/arch/arm/mm/blockops.c +++ /dev/null | |||
@@ -1,185 +0,0 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | #include <linux/init.h> | ||
3 | #include <linux/errno.h> | ||
4 | #include <linux/mm.h> | ||
5 | |||
6 | #include <asm/memory.h> | ||
7 | #include <asm/ptrace.h> | ||
8 | #include <asm/cacheflush.h> | ||
9 | #include <asm/traps.h> | ||
10 | |||
11 | extern struct cpu_cache_fns blk_cache_fns; | ||
12 | |||
13 | #define HARVARD_CACHE | ||
14 | |||
15 | /* | ||
16 | * blk_flush_kern_dcache_page(kaddr) | ||
17 | * | ||
18 | * Ensure that the data held in the page kaddr is written back | ||
19 | * to the page in question. | ||
20 | * | ||
21 | * - kaddr - kernel address (guaranteed to be page aligned) | ||
22 | */ | ||
23 | static void __attribute__((naked)) | ||
24 | blk_flush_kern_dcache_page(void *kaddr) | ||
25 | { | ||
26 | asm( | ||
27 | "add r1, r0, %0 \n\ | ||
28 | sub r1, r1, %1 \n\ | ||
29 | 1: .word 0xec401f0e @ mcrr p15, 0, r0, r1, c14, 0 @ blocking \n\ | ||
30 | mov r0, #0 \n\ | ||
31 | mcr p15, 0, r0, c7, c5, 0 \n\ | ||
32 | mcr p15, 0, r0, c7, c10, 4 \n\ | ||
33 | mov pc, lr" | ||
34 | : | ||
35 | : "I" (PAGE_SIZE), "I" (L1_CACHE_BYTES)); | ||
36 | } | ||
37 | |||
38 | /* | ||
39 | * blk_dma_inv_range(start,end) | ||
40 | * | ||
41 | * Invalidate the data cache within the specified region; we will | ||
42 | * be performing a DMA operation in this region and we want to | ||
43 | * purge old data in the cache. | ||
44 | * | ||
45 | * - start - virtual start address of region | ||
46 | * - end - virtual end address of region | ||
47 | */ | ||
48 | static void __attribute__((naked)) | ||
49 | blk_dma_inv_range_unified(unsigned long start, unsigned long end) | ||
50 | { | ||
51 | asm( | ||
52 | "tst r0, %0 \n\ | ||
53 | mcrne p15, 0, r0, c7, c11, 1 @ clean unified line \n\ | ||
54 | tst r1, %0 \n\ | ||
55 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line\n\ | ||
56 | .word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0 @ blocking \n\ | ||
57 | mov r0, #0 \n\ | ||
58 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\ | ||
59 | mov pc, lr" | ||
60 | : | ||
61 | : "I" (L1_CACHE_BYTES - 1)); | ||
62 | } | ||
63 | |||
64 | static void __attribute__((naked)) | ||
65 | blk_dma_inv_range_harvard(unsigned long start, unsigned long end) | ||
66 | { | ||
67 | asm( | ||
68 | "tst r0, %0 \n\ | ||
69 | mcrne p15, 0, r0, c7, c10, 1 @ clean D line \n\ | ||
70 | tst r1, %0 \n\ | ||
71 | mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line \n\ | ||
72 | .word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0 @ blocking \n\ | ||
73 | mov r0, #0 \n\ | ||
74 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\ | ||
75 | mov pc, lr" | ||
76 | : | ||
77 | : "I" (L1_CACHE_BYTES - 1)); | ||
78 | } | ||
79 | |||
80 | /* | ||
81 | * blk_dma_clean_range(start,end) | ||
82 | * - start - virtual start address of region | ||
83 | * - end - virtual end address of region | ||
84 | */ | ||
85 | static void __attribute__((naked)) | ||
86 | blk_dma_clean_range(unsigned long start, unsigned long end) | ||
87 | { | ||
88 | asm( | ||
89 | ".word 0xec401f0c @ mcrr p15, 0, r1, r0, c12, 0 @ blocking \n\ | ||
90 | mov r0, #0 \n\ | ||
91 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer \n\ | ||
92 | mov pc, lr"); | ||
93 | } | ||
94 | |||
95 | /* | ||
96 | * blk_dma_flush_range(start,end) | ||
97 | * - start - virtual start address of region | ||
98 | * - end - virtual end address of region | ||
99 | */ | ||
100 | static void __attribute__((naked)) | ||
101 | blk_dma_flush_range(unsigned long start, unsigned long end) | ||
102 | { | ||
103 | asm( | ||
104 | ".word 0xec401f0e @ mcrr p15, 0, r1, r0, c14, 0 @ blocking \n\ | ||
105 | mov pc, lr"); | ||
106 | } | ||
107 | |||
108 | static int blockops_trap(struct pt_regs *regs, unsigned int instr) | ||
109 | { | ||
110 | regs->ARM_r4 |= regs->ARM_r2; | ||
111 | regs->ARM_pc += 4; | ||
112 | return 0; | ||
113 | } | ||
114 | |||
115 | static char *func[] = { | ||
116 | "Prefetch data range", | ||
117 | "Clean+Invalidate data range", | ||
118 | "Clean data range", | ||
119 | "Invalidate data range", | ||
120 | "Invalidate instr range" | ||
121 | }; | ||
122 | |||
123 | static struct undef_hook blockops_hook __initdata = { | ||
124 | .instr_mask = 0x0fffffd0, | ||
125 | .instr_val = 0x0c401f00, | ||
126 | .cpsr_mask = PSR_T_BIT, | ||
127 | .cpsr_val = 0, | ||
128 | .fn = blockops_trap, | ||
129 | }; | ||
130 | |||
131 | static int __init blockops_check(void) | ||
132 | { | ||
133 | register unsigned int err asm("r4") = 0; | ||
134 | unsigned int err_pos = 1; | ||
135 | unsigned int cache_type; | ||
136 | int i; | ||
137 | |||
138 | asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_type)); | ||
139 | |||
140 | printk("Checking V6 block cache operations:\n"); | ||
141 | register_undef_hook(&blockops_hook); | ||
142 | |||
143 | __asm__ ("mov r0, %0\n\t" | ||
144 | "mov r1, %1\n\t" | ||
145 | "mov r2, #1\n\t" | ||
146 | ".word 0xec401f2c @ mcrr p15, 0, r1, r0, c12, 2\n\t" | ||
147 | "mov r2, #2\n\t" | ||
148 | ".word 0xec401f0e @ mcrr p15, 0, r1, r0, c14, 0\n\t" | ||
149 | "mov r2, #4\n\t" | ||
150 | ".word 0xec401f0c @ mcrr p15, 0, r1, r0, c12, 0\n\t" | ||
151 | "mov r2, #8\n\t" | ||
152 | ".word 0xec401f06 @ mcrr p15, 0, r1, r0, c6, 0\n\t" | ||
153 | "mov r2, #16\n\t" | ||
154 | ".word 0xec401f05 @ mcrr p15, 0, r1, r0, c5, 0\n\t" | ||
155 | : | ||
156 | : "r" (PAGE_OFFSET), "r" (PAGE_OFFSET + 128) | ||
157 | : "r0", "r1", "r2"); | ||
158 | |||
159 | unregister_undef_hook(&blockops_hook); | ||
160 | |||
161 | for (i = 0; i < ARRAY_SIZE(func); i++, err_pos <<= 1) | ||
162 | printk("%30s: %ssupported\n", func[i], err & err_pos ? "not " : ""); | ||
163 | |||
164 | if ((err & 8) == 0) { | ||
165 | printk(" --> Using %s block cache invalidate\n", | ||
166 | cache_type & (1 << 24) ? "harvard" : "unified"); | ||
167 | if (cache_type & (1 << 24)) | ||
168 | cpu_cache.dma_inv_range = blk_dma_inv_range_harvard; | ||
169 | else | ||
170 | cpu_cache.dma_inv_range = blk_dma_inv_range_unified; | ||
171 | } | ||
172 | if ((err & 4) == 0) { | ||
173 | printk(" --> Using block cache clean\n"); | ||
174 | cpu_cache.dma_clean_range = blk_dma_clean_range; | ||
175 | } | ||
176 | if ((err & 2) == 0) { | ||
177 | printk(" --> Using block cache clean+invalidate\n"); | ||
178 | cpu_cache.dma_flush_range = blk_dma_flush_range; | ||
179 | cpu_cache.flush_kern_dcache_page = blk_flush_kern_dcache_page; | ||
180 | } | ||
181 | |||
182 | return 0; | ||
183 | } | ||
184 | |||
185 | __initcall(blockops_check); | ||
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index c168f322ef8c..8b276ee38acf 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -420,7 +420,8 @@ static void __init bootmem_init(struct meminfo *mi) | |||
420 | * Set up device the mappings. Since we clear out the page tables for all | 420 | * Set up device the mappings. Since we clear out the page tables for all |
421 | * mappings above VMALLOC_END, we will remove any debug device mappings. | 421 | * mappings above VMALLOC_END, we will remove any debug device mappings. |
422 | * This means you have to be careful how you debug this function, or any | 422 | * This means you have to be careful how you debug this function, or any |
423 | * called function. (Do it by code inspection!) | 423 | * called function. This means you can't use any function or debugging |
424 | * method which may touch any device, otherwise the kernel _will_ crash. | ||
424 | */ | 425 | */ |
425 | static void __init devicemaps_init(struct machine_desc *mdesc) | 426 | static void __init devicemaps_init(struct machine_desc *mdesc) |
426 | { | 427 | { |
@@ -428,6 +429,12 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
428 | unsigned long addr; | 429 | unsigned long addr; |
429 | void *vectors; | 430 | void *vectors; |
430 | 431 | ||
432 | /* | ||
433 | * Allocate the vector page early. | ||
434 | */ | ||
435 | vectors = alloc_bootmem_low_pages(PAGE_SIZE); | ||
436 | BUG_ON(!vectors); | ||
437 | |||
431 | for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) | 438 | for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) |
432 | pmd_clear(pmd_off_k(addr)); | 439 | pmd_clear(pmd_off_k(addr)); |
433 | 440 | ||
@@ -461,12 +468,6 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
461 | create_mapping(&map); | 468 | create_mapping(&map); |
462 | #endif | 469 | #endif |
463 | 470 | ||
464 | flush_cache_all(); | ||
465 | local_flush_tlb_all(); | ||
466 | |||
467 | vectors = alloc_bootmem_low_pages(PAGE_SIZE); | ||
468 | BUG_ON(!vectors); | ||
469 | |||
470 | /* | 471 | /* |
471 | * Create a mapping for the machine vectors at the high-vectors | 472 | * Create a mapping for the machine vectors at the high-vectors |
472 | * location (0xffff0000). If we aren't using high-vectors, also | 473 | * location (0xffff0000). If we aren't using high-vectors, also |
@@ -491,12 +492,13 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
491 | mdesc->map_io(); | 492 | mdesc->map_io(); |
492 | 493 | ||
493 | /* | 494 | /* |
494 | * Finally flush the tlb again - this ensures that we're in a | 495 | * Finally flush the caches and tlb to ensure that we're in a |
495 | * consistent state wrt the writebuffer if the writebuffer needs | 496 | * consistent state wrt the writebuffer. This also ensures that |
496 | * draining. After this point, we can start to touch devices | 497 | * any write-allocated cache lines in the vector page are written |
497 | * again. | 498 | * back. After this point, we can start to touch devices again. |
498 | */ | 499 | */ |
499 | local_flush_tlb_all(); | 500 | local_flush_tlb_all(); |
501 | flush_cache_all(); | ||
500 | } | 502 | } |
501 | 503 | ||
502 | /* | 504 | /* |
diff --git a/arch/arm/mm/ioremap.c b/arch/arm/mm/ioremap.c index 0f128c28fee4..10901398e4a2 100644 --- a/arch/arm/mm/ioremap.c +++ b/arch/arm/mm/ioremap.c | |||
@@ -130,8 +130,7 @@ remap_area_pages(unsigned long start, unsigned long phys_addr, | |||
130 | * mapping. See include/asm-arm/proc-armv/pgtable.h for more information. | 130 | * mapping. See include/asm-arm/proc-armv/pgtable.h for more information. |
131 | */ | 131 | */ |
132 | void __iomem * | 132 | void __iomem * |
133 | __ioremap(unsigned long phys_addr, size_t size, unsigned long flags, | 133 | __ioremap(unsigned long phys_addr, size_t size, unsigned long flags) |
134 | unsigned long align) | ||
135 | { | 134 | { |
136 | void * addr; | 135 | void * addr; |
137 | struct vm_struct * area; | 136 | struct vm_struct * area; |
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c index f36677241ecd..76b1135d401a 100644 --- a/arch/i386/kernel/acpi/boot.c +++ b/arch/i386/kernel/acpi/boot.c | |||
@@ -248,9 +248,7 @@ acpi_parse_lapic(acpi_table_entry_header * header, const unsigned long end) | |||
248 | 248 | ||
249 | acpi_table_print_madt_entry(header); | 249 | acpi_table_print_madt_entry(header); |
250 | 250 | ||
251 | /* no utility in registering a disabled processor */ | 251 | /* Register even disabled CPUs for cpu hotplug */ |
252 | if (processor->flags.enabled == 0) | ||
253 | return 0; | ||
254 | 252 | ||
255 | x86_acpiid_to_apicid[processor->acpi_id] = processor->id; | 253 | x86_acpiid_to_apicid[processor->acpi_id] = processor->id; |
256 | 254 | ||
diff --git a/arch/i386/kernel/mpparse.c b/arch/i386/kernel/mpparse.c index 8f767d9aa45d..1ca5269b1e86 100644 --- a/arch/i386/kernel/mpparse.c +++ b/arch/i386/kernel/mpparse.c | |||
@@ -220,8 +220,9 @@ static void __devinit MP_processor_info (struct mpc_config_processor *m) | |||
220 | num_processors++; | 220 | num_processors++; |
221 | 221 | ||
222 | if ((num_processors > 8) && | 222 | if ((num_processors > 8) && |
223 | APIC_XAPIC(ver) && | 223 | ((APIC_XAPIC(ver) && |
224 | (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)) | 224 | (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)) || |
225 | (boot_cpu_data.x86_vendor == X86_VENDOR_AMD))) | ||
225 | def_to_bigsmp = 1; | 226 | def_to_bigsmp = 1; |
226 | else | 227 | else |
227 | def_to_bigsmp = 0; | 228 | def_to_bigsmp = 0; |
diff --git a/arch/ia64/sn/kernel/bte.c b/arch/ia64/sn/kernel/bte.c index d71f4de44f79..dd73c0cb754b 100644 --- a/arch/ia64/sn/kernel/bte.c +++ b/arch/ia64/sn/kernel/bte.c | |||
@@ -137,6 +137,7 @@ retry_bteop: | |||
137 | bte = bte_if_on_node(nasid_to_try[nasid_index],bte_if_index); | 137 | bte = bte_if_on_node(nasid_to_try[nasid_index],bte_if_index); |
138 | 138 | ||
139 | if (bte == NULL) { | 139 | if (bte == NULL) { |
140 | nasid_index++; | ||
140 | continue; | 141 | continue; |
141 | } | 142 | } |
142 | 143 | ||
diff --git a/arch/ia64/sn/kernel/sn2/sn2_smp.c b/arch/ia64/sn/kernel/sn2/sn2_smp.c index 49b530c39a42..5d54f5f4e926 100644 --- a/arch/ia64/sn/kernel/sn2/sn2_smp.c +++ b/arch/ia64/sn/kernel/sn2/sn2_smp.c | |||
@@ -492,6 +492,9 @@ static struct proc_dir_entry *proc_sn2_ptc; | |||
492 | 492 | ||
493 | static int __init sn2_ptc_init(void) | 493 | static int __init sn2_ptc_init(void) |
494 | { | 494 | { |
495 | if (!ia64_platform_is("sn2")) | ||
496 | return -ENOSYS; | ||
497 | |||
495 | if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) { | 498 | if (!(proc_sn2_ptc = create_proc_entry(PTC_BASENAME, 0444, NULL))) { |
496 | printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME); | 499 | printk(KERN_ERR "unable to create %s proc entry", PTC_BASENAME); |
497 | return -EINVAL; | 500 | return -EINVAL; |
diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c index 6c6fbca3229c..19b54fbcd7ea 100644 --- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c | |||
@@ -743,13 +743,14 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg) | |||
743 | if ((r = sn_hwperf_enum_objects(&nobj, &objs)) == 0) { | 743 | if ((r = sn_hwperf_enum_objects(&nobj, &objs)) == 0) { |
744 | memset(p, 0, a.sz); | 744 | memset(p, 0, a.sz); |
745 | for (i = 0; i < nobj; i++) { | 745 | for (i = 0; i < nobj; i++) { |
746 | int cpuobj_index = 0; | ||
746 | if (!SN_HWPERF_IS_NODE(objs + i)) | 747 | if (!SN_HWPERF_IS_NODE(objs + i)) |
747 | continue; | 748 | continue; |
748 | node = sn_hwperf_obj_to_cnode(objs + i); | 749 | node = sn_hwperf_obj_to_cnode(objs + i); |
749 | for_each_online_cpu(j) { | 750 | for_each_online_cpu(j) { |
750 | if (node != cpu_to_node(j)) | 751 | if (node != cpu_to_node(j)) |
751 | continue; | 752 | continue; |
752 | cpuobj = (struct sn_hwperf_object_info *) p + j; | 753 | cpuobj = (struct sn_hwperf_object_info *) p + cpuobj_index++; |
753 | slice = 'a' + cpuid_to_slice(j); | 754 | slice = 'a' + cpuid_to_slice(j); |
754 | cdata = cpu_data(j); | 755 | cdata = cpu_data(j); |
755 | cpuobj->id = j; | 756 | cpuobj->id = j; |
diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c index 988844a169e6..d016d672ec2b 100644 --- a/arch/parisc/kernel/drivers.c +++ b/arch/parisc/kernel/drivers.c | |||
@@ -499,8 +499,12 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path) | |||
499 | 499 | ||
500 | dev = create_parisc_device(mod_path); | 500 | dev = create_parisc_device(mod_path); |
501 | if (dev->id.hw_type != HPHW_FAULTY) { | 501 | if (dev->id.hw_type != HPHW_FAULTY) { |
502 | printk("Two devices have hardware path %s. Please file a bug with HP.\n" | 502 | printk(KERN_ERR "Two devices have hardware path [%s]. " |
503 | "In the meantime, you could try rearranging your cards.\n", parisc_pathname(dev)); | 503 | "IODC data for second device: " |
504 | "%02x%02x%02x%02x%02x%02x\n" | ||
505 | "Rearranging GSC cards sometimes helps\n", | ||
506 | parisc_pathname(dev), iodc_data[0], iodc_data[1], | ||
507 | iodc_data[3], iodc_data[4], iodc_data[5], iodc_data[6]); | ||
504 | return NULL; | 508 | return NULL; |
505 | } | 509 | } |
506 | 510 | ||
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index c7e66ee5b083..9af4b22a6d77 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -1846,6 +1846,7 @@ sys_clone_wrapper: | |||
1846 | ldo -16(%r30),%r29 /* Reference param save area */ | 1846 | ldo -16(%r30),%r29 /* Reference param save area */ |
1847 | #endif | 1847 | #endif |
1848 | 1848 | ||
1849 | /* WARNING - Clobbers r19 and r21, userspace must save these! */ | ||
1849 | STREG %r2,PT_GR19(%r1) /* save for child */ | 1850 | STREG %r2,PT_GR19(%r1) /* save for child */ |
1850 | STREG %r30,PT_GR21(%r1) | 1851 | STREG %r30,PT_GR21(%r1) |
1851 | BL sys_clone,%r2 | 1852 | BL sys_clone,%r2 |
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c index 1a1c66422736..8f563871e83c 100644 --- a/arch/parisc/kernel/inventory.c +++ b/arch/parisc/kernel/inventory.c | |||
@@ -188,7 +188,7 @@ pat_query_module(ulong pcell_loc, ulong mod_index) | |||
188 | temp = pa_pdc_cell.cba; | 188 | temp = pa_pdc_cell.cba; |
189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); | 189 | dev = alloc_pa_dev(PAT_GET_CBA(temp), &pa_pdc_cell.mod_path); |
190 | if (!dev) { | 190 | if (!dev) { |
191 | return PDC_NE_MOD; | 191 | return PDC_OK; |
192 | } | 192 | } |
193 | 193 | ||
194 | /* alloc_pa_dev sets dev->hpa */ | 194 | /* alloc_pa_dev sets dev->hpa */ |
diff --git a/arch/parisc/kernel/ioctl32.c b/arch/parisc/kernel/ioctl32.c index 0a331104ad56..4eada1bb27f0 100644 --- a/arch/parisc/kernel/ioctl32.c +++ b/arch/parisc/kernel/ioctl32.c | |||
@@ -19,536 +19,6 @@ | |||
19 | #define CODE | 19 | #define CODE |
20 | #include "compat_ioctl.c" | 20 | #include "compat_ioctl.c" |
21 | 21 | ||
22 | /* Use this to get at 32-bit user passed pointers. | ||
23 | See sys_sparc32.c for description about these. */ | ||
24 | #define A(__x) ((unsigned long)(__x)) | ||
25 | /* The same for use with copy_from_user() and copy_to_user(). */ | ||
26 | #define B(__x) ((void *)(unsigned long)(__x)) | ||
27 | |||
28 | #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE) | ||
29 | /* This really belongs in include/linux/drm.h -DaveM */ | ||
30 | #include "../../../drivers/char/drm/drm.h" | ||
31 | |||
32 | typedef struct drm32_version { | ||
33 | int version_major; /* Major version */ | ||
34 | int version_minor; /* Minor version */ | ||
35 | int version_patchlevel;/* Patch level */ | ||
36 | int name_len; /* Length of name buffer */ | ||
37 | u32 name; /* Name of driver */ | ||
38 | int date_len; /* Length of date buffer */ | ||
39 | u32 date; /* User-space buffer to hold date */ | ||
40 | int desc_len; /* Length of desc buffer */ | ||
41 | u32 desc; /* User-space buffer to hold desc */ | ||
42 | } drm32_version_t; | ||
43 | #define DRM32_IOCTL_VERSION DRM_IOWR(0x00, drm32_version_t) | ||
44 | |||
45 | static int drm32_version(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
46 | { | ||
47 | drm32_version_t *uversion = (drm32_version_t *)arg; | ||
48 | char *name_ptr, *date_ptr, *desc_ptr; | ||
49 | u32 tmp1, tmp2, tmp3; | ||
50 | drm_version_t kversion; | ||
51 | mm_segment_t old_fs; | ||
52 | int ret; | ||
53 | |||
54 | memset(&kversion, 0, sizeof(kversion)); | ||
55 | if (get_user(kversion.name_len, &uversion->name_len) || | ||
56 | get_user(kversion.date_len, &uversion->date_len) || | ||
57 | get_user(kversion.desc_len, &uversion->desc_len) || | ||
58 | get_user(tmp1, &uversion->name) || | ||
59 | get_user(tmp2, &uversion->date) || | ||
60 | get_user(tmp3, &uversion->desc)) | ||
61 | return -EFAULT; | ||
62 | |||
63 | name_ptr = (char *) A(tmp1); | ||
64 | date_ptr = (char *) A(tmp2); | ||
65 | desc_ptr = (char *) A(tmp3); | ||
66 | |||
67 | ret = -ENOMEM; | ||
68 | if (kversion.name_len && name_ptr) { | ||
69 | kversion.name = kmalloc(kversion.name_len, GFP_KERNEL); | ||
70 | if (!kversion.name) | ||
71 | goto out; | ||
72 | } | ||
73 | if (kversion.date_len && date_ptr) { | ||
74 | kversion.date = kmalloc(kversion.date_len, GFP_KERNEL); | ||
75 | if (!kversion.date) | ||
76 | goto out; | ||
77 | } | ||
78 | if (kversion.desc_len && desc_ptr) { | ||
79 | kversion.desc = kmalloc(kversion.desc_len, GFP_KERNEL); | ||
80 | if (!kversion.desc) | ||
81 | goto out; | ||
82 | } | ||
83 | |||
84 | old_fs = get_fs(); | ||
85 | set_fs(KERNEL_DS); | ||
86 | ret = sys_ioctl (fd, DRM_IOCTL_VERSION, (unsigned long)&kversion); | ||
87 | set_fs(old_fs); | ||
88 | |||
89 | if (!ret) { | ||
90 | if ((kversion.name && | ||
91 | copy_to_user(name_ptr, kversion.name, kversion.name_len)) || | ||
92 | (kversion.date && | ||
93 | copy_to_user(date_ptr, kversion.date, kversion.date_len)) || | ||
94 | (kversion.desc && | ||
95 | copy_to_user(desc_ptr, kversion.desc, kversion.desc_len))) | ||
96 | ret = -EFAULT; | ||
97 | if (put_user(kversion.version_major, &uversion->version_major) || | ||
98 | put_user(kversion.version_minor, &uversion->version_minor) || | ||
99 | put_user(kversion.version_patchlevel, &uversion->version_patchlevel) || | ||
100 | put_user(kversion.name_len, &uversion->name_len) || | ||
101 | put_user(kversion.date_len, &uversion->date_len) || | ||
102 | put_user(kversion.desc_len, &uversion->desc_len)) | ||
103 | ret = -EFAULT; | ||
104 | } | ||
105 | |||
106 | out: | ||
107 | kfree(kversion.name); | ||
108 | kfree(kversion.date); | ||
109 | kfree(kversion.desc); | ||
110 | return ret; | ||
111 | } | ||
112 | |||
113 | typedef struct drm32_unique { | ||
114 | int unique_len; /* Length of unique */ | ||
115 | u32 unique; /* Unique name for driver instantiation */ | ||
116 | } drm32_unique_t; | ||
117 | #define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t) | ||
118 | #define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t) | ||
119 | |||
120 | static int drm32_getsetunique(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
121 | { | ||
122 | drm32_unique_t *uarg = (drm32_unique_t *)arg; | ||
123 | drm_unique_t karg; | ||
124 | mm_segment_t old_fs; | ||
125 | char *uptr; | ||
126 | u32 tmp; | ||
127 | int ret; | ||
128 | |||
129 | if (get_user(karg.unique_len, &uarg->unique_len)) | ||
130 | return -EFAULT; | ||
131 | karg.unique = NULL; | ||
132 | |||
133 | if (get_user(tmp, &uarg->unique)) | ||
134 | return -EFAULT; | ||
135 | |||
136 | uptr = (char *) A(tmp); | ||
137 | |||
138 | if (uptr) { | ||
139 | karg.unique = kmalloc(karg.unique_len, GFP_KERNEL); | ||
140 | if (!karg.unique) | ||
141 | return -ENOMEM; | ||
142 | if (cmd == DRM32_IOCTL_SET_UNIQUE && | ||
143 | copy_from_user(karg.unique, uptr, karg.unique_len)) { | ||
144 | kfree(karg.unique); | ||
145 | return -EFAULT; | ||
146 | } | ||
147 | } | ||
148 | |||
149 | old_fs = get_fs(); | ||
150 | set_fs(KERNEL_DS); | ||
151 | if (cmd == DRM32_IOCTL_GET_UNIQUE) | ||
152 | ret = sys_ioctl (fd, DRM_IOCTL_GET_UNIQUE, (unsigned long)&karg); | ||
153 | else | ||
154 | ret = sys_ioctl (fd, DRM_IOCTL_SET_UNIQUE, (unsigned long)&karg); | ||
155 | set_fs(old_fs); | ||
156 | |||
157 | if (!ret) { | ||
158 | if (cmd == DRM32_IOCTL_GET_UNIQUE && | ||
159 | uptr != NULL && | ||
160 | copy_to_user(uptr, karg.unique, karg.unique_len)) | ||
161 | ret = -EFAULT; | ||
162 | if (put_user(karg.unique_len, &uarg->unique_len)) | ||
163 | ret = -EFAULT; | ||
164 | } | ||
165 | |||
166 | kfree(karg.unique); | ||
167 | return ret; | ||
168 | } | ||
169 | |||
170 | typedef struct drm32_map { | ||
171 | u32 offset; /* Requested physical address (0 for SAREA)*/ | ||
172 | u32 size; /* Requested physical size (bytes) */ | ||
173 | drm_map_type_t type; /* Type of memory to map */ | ||
174 | drm_map_flags_t flags; /* Flags */ | ||
175 | u32 handle; /* User-space: "Handle" to pass to mmap */ | ||
176 | /* Kernel-space: kernel-virtual address */ | ||
177 | int mtrr; /* MTRR slot used */ | ||
178 | /* Private data */ | ||
179 | } drm32_map_t; | ||
180 | #define DRM32_IOCTL_ADD_MAP DRM_IOWR(0x15, drm32_map_t) | ||
181 | |||
182 | static int drm32_addmap(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
183 | { | ||
184 | drm32_map_t *uarg = (drm32_map_t *) arg; | ||
185 | drm_map_t karg; | ||
186 | mm_segment_t old_fs; | ||
187 | u32 tmp; | ||
188 | int ret; | ||
189 | |||
190 | ret = get_user(karg.offset, &uarg->offset); | ||
191 | ret |= get_user(karg.size, &uarg->size); | ||
192 | ret |= get_user(karg.type, &uarg->type); | ||
193 | ret |= get_user(karg.flags, &uarg->flags); | ||
194 | ret |= get_user(tmp, &uarg->handle); | ||
195 | ret |= get_user(karg.mtrr, &uarg->mtrr); | ||
196 | if (ret) | ||
197 | return -EFAULT; | ||
198 | |||
199 | karg.handle = (void *) A(tmp); | ||
200 | |||
201 | old_fs = get_fs(); | ||
202 | set_fs(KERNEL_DS); | ||
203 | ret = sys_ioctl(fd, DRM_IOCTL_ADD_MAP, (unsigned long) &karg); | ||
204 | set_fs(old_fs); | ||
205 | |||
206 | if (!ret) { | ||
207 | ret = put_user(karg.offset, &uarg->offset); | ||
208 | ret |= put_user(karg.size, &uarg->size); | ||
209 | ret |= put_user(karg.type, &uarg->type); | ||
210 | ret |= put_user(karg.flags, &uarg->flags); | ||
211 | tmp = (u32) (long)karg.handle; | ||
212 | ret |= put_user(tmp, &uarg->handle); | ||
213 | ret |= put_user(karg.mtrr, &uarg->mtrr); | ||
214 | if (ret) | ||
215 | ret = -EFAULT; | ||
216 | } | ||
217 | |||
218 | return ret; | ||
219 | } | ||
220 | |||
221 | typedef struct drm32_buf_info { | ||
222 | int count; /* Entries in list */ | ||
223 | u32 list; /* (drm_buf_desc_t *) */ | ||
224 | } drm32_buf_info_t; | ||
225 | #define DRM32_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm32_buf_info_t) | ||
226 | |||
227 | static int drm32_info_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
228 | { | ||
229 | drm32_buf_info_t *uarg = (drm32_buf_info_t *)arg; | ||
230 | drm_buf_desc_t *ulist; | ||
231 | drm_buf_info_t karg; | ||
232 | mm_segment_t old_fs; | ||
233 | int orig_count, ret; | ||
234 | u32 tmp; | ||
235 | |||
236 | if (get_user(karg.count, &uarg->count) || | ||
237 | get_user(tmp, &uarg->list)) | ||
238 | return -EFAULT; | ||
239 | |||
240 | ulist = (drm_buf_desc_t *) A(tmp); | ||
241 | |||
242 | orig_count = karg.count; | ||
243 | |||
244 | karg.list = kmalloc(karg.count * sizeof(drm_buf_desc_t), GFP_KERNEL); | ||
245 | if (!karg.list) | ||
246 | return -EFAULT; | ||
247 | |||
248 | old_fs = get_fs(); | ||
249 | set_fs(KERNEL_DS); | ||
250 | ret = sys_ioctl(fd, DRM_IOCTL_INFO_BUFS, (unsigned long) &karg); | ||
251 | set_fs(old_fs); | ||
252 | |||
253 | if (!ret) { | ||
254 | if (karg.count <= orig_count && | ||
255 | (copy_to_user(ulist, karg.list, | ||
256 | karg.count * sizeof(drm_buf_desc_t)))) | ||
257 | ret = -EFAULT; | ||
258 | if (put_user(karg.count, &uarg->count)) | ||
259 | ret = -EFAULT; | ||
260 | } | ||
261 | |||
262 | kfree(karg.list); | ||
263 | return ret; | ||
264 | } | ||
265 | |||
266 | typedef struct drm32_buf_free { | ||
267 | int count; | ||
268 | u32 list; /* (int *) */ | ||
269 | } drm32_buf_free_t; | ||
270 | #define DRM32_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm32_buf_free_t) | ||
271 | |||
272 | static int drm32_free_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
273 | { | ||
274 | drm32_buf_free_t *uarg = (drm32_buf_free_t *)arg; | ||
275 | drm_buf_free_t karg; | ||
276 | mm_segment_t old_fs; | ||
277 | int *ulist; | ||
278 | int ret; | ||
279 | u32 tmp; | ||
280 | |||
281 | if (get_user(karg.count, &uarg->count) || | ||
282 | get_user(tmp, &uarg->list)) | ||
283 | return -EFAULT; | ||
284 | |||
285 | ulist = (int *) A(tmp); | ||
286 | |||
287 | karg.list = kmalloc(karg.count * sizeof(int), GFP_KERNEL); | ||
288 | if (!karg.list) | ||
289 | return -ENOMEM; | ||
290 | |||
291 | ret = -EFAULT; | ||
292 | if (copy_from_user(karg.list, ulist, (karg.count * sizeof(int)))) | ||
293 | goto out; | ||
294 | |||
295 | old_fs = get_fs(); | ||
296 | set_fs(KERNEL_DS); | ||
297 | ret = sys_ioctl(fd, DRM_IOCTL_FREE_BUFS, (unsigned long) &karg); | ||
298 | set_fs(old_fs); | ||
299 | |||
300 | out: | ||
301 | kfree(karg.list); | ||
302 | return ret; | ||
303 | } | ||
304 | |||
305 | typedef struct drm32_buf_pub { | ||
306 | int idx; /* Index into master buflist */ | ||
307 | int total; /* Buffer size */ | ||
308 | int used; /* Amount of buffer in use (for DMA) */ | ||
309 | u32 address; /* Address of buffer (void *) */ | ||
310 | } drm32_buf_pub_t; | ||
311 | |||
312 | typedef struct drm32_buf_map { | ||
313 | int count; /* Length of buflist */ | ||
314 | u32 virtual; /* Mmaped area in user-virtual (void *) */ | ||
315 | u32 list; /* Buffer information (drm_buf_pub_t *) */ | ||
316 | } drm32_buf_map_t; | ||
317 | #define DRM32_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm32_buf_map_t) | ||
318 | |||
319 | static int drm32_map_bufs(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
320 | { | ||
321 | drm32_buf_map_t *uarg = (drm32_buf_map_t *)arg; | ||
322 | drm32_buf_pub_t *ulist; | ||
323 | drm_buf_map_t karg; | ||
324 | mm_segment_t old_fs; | ||
325 | int orig_count, ret, i; | ||
326 | u32 tmp1, tmp2; | ||
327 | |||
328 | if (get_user(karg.count, &uarg->count) || | ||
329 | get_user(tmp1, &uarg->virtual) || | ||
330 | get_user(tmp2, &uarg->list)) | ||
331 | return -EFAULT; | ||
332 | |||
333 | karg.virtual = (void *) A(tmp1); | ||
334 | ulist = (drm32_buf_pub_t *) A(tmp2); | ||
335 | |||
336 | orig_count = karg.count; | ||
337 | |||
338 | karg.list = kmalloc(karg.count * sizeof(drm_buf_pub_t), GFP_KERNEL); | ||
339 | if (!karg.list) | ||
340 | return -ENOMEM; | ||
341 | |||
342 | ret = -EFAULT; | ||
343 | for (i = 0; i < karg.count; i++) { | ||
344 | if (get_user(karg.list[i].idx, &ulist[i].idx) || | ||
345 | get_user(karg.list[i].total, &ulist[i].total) || | ||
346 | get_user(karg.list[i].used, &ulist[i].used) || | ||
347 | get_user(tmp1, &ulist[i].address)) | ||
348 | goto out; | ||
349 | |||
350 | karg.list[i].address = (void *) A(tmp1); | ||
351 | } | ||
352 | |||
353 | old_fs = get_fs(); | ||
354 | set_fs(KERNEL_DS); | ||
355 | ret = sys_ioctl(fd, DRM_IOCTL_MAP_BUFS, (unsigned long) &karg); | ||
356 | set_fs(old_fs); | ||
357 | |||
358 | if (!ret) { | ||
359 | for (i = 0; i < orig_count; i++) { | ||
360 | tmp1 = (u32) (long) karg.list[i].address; | ||
361 | if (put_user(karg.list[i].idx, &ulist[i].idx) || | ||
362 | put_user(karg.list[i].total, &ulist[i].total) || | ||
363 | put_user(karg.list[i].used, &ulist[i].used) || | ||
364 | put_user(tmp1, &ulist[i].address)) { | ||
365 | ret = -EFAULT; | ||
366 | goto out; | ||
367 | } | ||
368 | } | ||
369 | if (put_user(karg.count, &uarg->count)) | ||
370 | ret = -EFAULT; | ||
371 | } | ||
372 | |||
373 | out: | ||
374 | kfree(karg.list); | ||
375 | return ret; | ||
376 | } | ||
377 | |||
378 | typedef struct drm32_dma { | ||
379 | /* Indices here refer to the offset into | ||
380 | buflist in drm_buf_get_t. */ | ||
381 | int context; /* Context handle */ | ||
382 | int send_count; /* Number of buffers to send */ | ||
383 | u32 send_indices; /* List of handles to buffers (int *) */ | ||
384 | u32 send_sizes; /* Lengths of data to send (int *) */ | ||
385 | drm_dma_flags_t flags; /* Flags */ | ||
386 | int request_count; /* Number of buffers requested */ | ||
387 | int request_size; /* Desired size for buffers */ | ||
388 | u32 request_indices; /* Buffer information (int *) */ | ||
389 | u32 request_sizes; /* (int *) */ | ||
390 | int granted_count; /* Number of buffers granted */ | ||
391 | } drm32_dma_t; | ||
392 | #define DRM32_IOCTL_DMA DRM_IOWR(0x29, drm32_dma_t) | ||
393 | |||
394 | /* RED PEN The DRM layer blindly dereferences the send/request | ||
395 | * indice/size arrays even though they are userland | ||
396 | * pointers. -DaveM | ||
397 | */ | ||
398 | static int drm32_dma(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
399 | { | ||
400 | drm32_dma_t *uarg = (drm32_dma_t *) arg; | ||
401 | int *u_si, *u_ss, *u_ri, *u_rs; | ||
402 | drm_dma_t karg; | ||
403 | mm_segment_t old_fs; | ||
404 | int ret; | ||
405 | u32 tmp1, tmp2, tmp3, tmp4; | ||
406 | |||
407 | karg.send_indices = karg.send_sizes = NULL; | ||
408 | karg.request_indices = karg.request_sizes = NULL; | ||
409 | |||
410 | if (get_user(karg.context, &uarg->context) || | ||
411 | get_user(karg.send_count, &uarg->send_count) || | ||
412 | get_user(tmp1, &uarg->send_indices) || | ||
413 | get_user(tmp2, &uarg->send_sizes) || | ||
414 | get_user(karg.flags, &uarg->flags) || | ||
415 | get_user(karg.request_count, &uarg->request_count) || | ||
416 | get_user(karg.request_size, &uarg->request_size) || | ||
417 | get_user(tmp3, &uarg->request_indices) || | ||
418 | get_user(tmp4, &uarg->request_sizes) || | ||
419 | get_user(karg.granted_count, &uarg->granted_count)) | ||
420 | return -EFAULT; | ||
421 | |||
422 | u_si = (int *) A(tmp1); | ||
423 | u_ss = (int *) A(tmp2); | ||
424 | u_ri = (int *) A(tmp3); | ||
425 | u_rs = (int *) A(tmp4); | ||
426 | |||
427 | if (karg.send_count) { | ||
428 | karg.send_indices = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL); | ||
429 | karg.send_sizes = kmalloc(karg.send_count * sizeof(int), GFP_KERNEL); | ||
430 | |||
431 | ret = -ENOMEM; | ||
432 | if (!karg.send_indices || !karg.send_sizes) | ||
433 | goto out; | ||
434 | |||
435 | ret = -EFAULT; | ||
436 | if (copy_from_user(karg.send_indices, u_si, | ||
437 | (karg.send_count * sizeof(int))) || | ||
438 | copy_from_user(karg.send_sizes, u_ss, | ||
439 | (karg.send_count * sizeof(int)))) | ||
440 | goto out; | ||
441 | } | ||
442 | |||
443 | if (karg.request_count) { | ||
444 | karg.request_indices = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL); | ||
445 | karg.request_sizes = kmalloc(karg.request_count * sizeof(int), GFP_KERNEL); | ||
446 | |||
447 | ret = -ENOMEM; | ||
448 | if (!karg.request_indices || !karg.request_sizes) | ||
449 | goto out; | ||
450 | |||
451 | ret = -EFAULT; | ||
452 | if (copy_from_user(karg.request_indices, u_ri, | ||
453 | (karg.request_count * sizeof(int))) || | ||
454 | copy_from_user(karg.request_sizes, u_rs, | ||
455 | (karg.request_count * sizeof(int)))) | ||
456 | goto out; | ||
457 | } | ||
458 | |||
459 | old_fs = get_fs(); | ||
460 | set_fs(KERNEL_DS); | ||
461 | ret = sys_ioctl(fd, DRM_IOCTL_DMA, (unsigned long) &karg); | ||
462 | set_fs(old_fs); | ||
463 | |||
464 | if (!ret) { | ||
465 | if (put_user(karg.context, &uarg->context) || | ||
466 | put_user(karg.send_count, &uarg->send_count) || | ||
467 | put_user(karg.flags, &uarg->flags) || | ||
468 | put_user(karg.request_count, &uarg->request_count) || | ||
469 | put_user(karg.request_size, &uarg->request_size) || | ||
470 | put_user(karg.granted_count, &uarg->granted_count)) | ||
471 | ret = -EFAULT; | ||
472 | |||
473 | if (karg.send_count) { | ||
474 | if (copy_to_user(u_si, karg.send_indices, | ||
475 | (karg.send_count * sizeof(int))) || | ||
476 | copy_to_user(u_ss, karg.send_sizes, | ||
477 | (karg.send_count * sizeof(int)))) | ||
478 | ret = -EFAULT; | ||
479 | } | ||
480 | if (karg.request_count) { | ||
481 | if (copy_to_user(u_ri, karg.request_indices, | ||
482 | (karg.request_count * sizeof(int))) || | ||
483 | copy_to_user(u_rs, karg.request_sizes, | ||
484 | (karg.request_count * sizeof(int)))) | ||
485 | ret = -EFAULT; | ||
486 | } | ||
487 | } | ||
488 | |||
489 | out: | ||
490 | kfree(karg.send_indices); | ||
491 | kfree(karg.send_sizes); | ||
492 | kfree(karg.request_indices); | ||
493 | kfree(karg.request_sizes); | ||
494 | return ret; | ||
495 | } | ||
496 | |||
497 | typedef struct drm32_ctx_res { | ||
498 | int count; | ||
499 | u32 contexts; /* (drm_ctx_t *) */ | ||
500 | } drm32_ctx_res_t; | ||
501 | #define DRM32_IOCTL_RES_CTX DRM_IOWR(0x26, drm32_ctx_res_t) | ||
502 | |||
503 | static int drm32_res_ctx(unsigned int fd, unsigned int cmd, unsigned long arg) | ||
504 | { | ||
505 | drm32_ctx_res_t *uarg = (drm32_ctx_res_t *) arg; | ||
506 | drm_ctx_t *ulist; | ||
507 | drm_ctx_res_t karg; | ||
508 | mm_segment_t old_fs; | ||
509 | int orig_count, ret; | ||
510 | u32 tmp; | ||
511 | |||
512 | karg.contexts = NULL; | ||
513 | if (get_user(karg.count, &uarg->count) || | ||
514 | get_user(tmp, &uarg->contexts)) | ||
515 | return -EFAULT; | ||
516 | |||
517 | ulist = (drm_ctx_t *) A(tmp); | ||
518 | |||
519 | orig_count = karg.count; | ||
520 | if (karg.count && ulist) { | ||
521 | karg.contexts = kmalloc((karg.count * sizeof(drm_ctx_t)), GFP_KERNEL); | ||
522 | if (!karg.contexts) | ||
523 | return -ENOMEM; | ||
524 | if (copy_from_user(karg.contexts, ulist, | ||
525 | (karg.count * sizeof(drm_ctx_t)))) { | ||
526 | kfree(karg.contexts); | ||
527 | return -EFAULT; | ||
528 | } | ||
529 | } | ||
530 | |||
531 | old_fs = get_fs(); | ||
532 | set_fs(KERNEL_DS); | ||
533 | ret = sys_ioctl(fd, DRM_IOCTL_RES_CTX, (unsigned long) &karg); | ||
534 | set_fs(old_fs); | ||
535 | |||
536 | if (!ret) { | ||
537 | if (orig_count) { | ||
538 | if (copy_to_user(ulist, karg.contexts, | ||
539 | (orig_count * sizeof(drm_ctx_t)))) | ||
540 | ret = -EFAULT; | ||
541 | } | ||
542 | if (put_user(karg.count, &uarg->count)) | ||
543 | ret = -EFAULT; | ||
544 | } | ||
545 | |||
546 | kfree(karg.contexts); | ||
547 | return ret; | ||
548 | } | ||
549 | |||
550 | #endif | ||
551 | |||
552 | #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL }, | 22 | #define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL }, |
553 | #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) | 23 | #define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl) |
554 | 24 | ||
@@ -561,11 +31,6 @@ IOCTL_TABLE_START | |||
561 | #define DECLARES | 31 | #define DECLARES |
562 | #include "compat_ioctl.c" | 32 | #include "compat_ioctl.c" |
563 | 33 | ||
564 | /* PA-specific ioctls */ | ||
565 | COMPATIBLE_IOCTL(PA_PERF_ON) | ||
566 | COMPATIBLE_IOCTL(PA_PERF_OFF) | ||
567 | COMPATIBLE_IOCTL(PA_PERF_VERSION) | ||
568 | |||
569 | /* And these ioctls need translation */ | 34 | /* And these ioctls need translation */ |
570 | HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc) | 35 | HANDLE_IOCTL(SIOCGPPPSTATS, dev_ifsioc) |
571 | HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc) | 36 | HANDLE_IOCTL(SIOCGPPPCSTATS, dev_ifsioc) |
@@ -590,17 +55,6 @@ HANDLE_IOCTL(RTC_EPOCH_READ, w_long) | |||
590 | COMPATIBLE_IOCTL(RTC_EPOCH_SET) | 55 | COMPATIBLE_IOCTL(RTC_EPOCH_SET) |
591 | #endif | 56 | #endif |
592 | 57 | ||
593 | #if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE) | ||
594 | HANDLE_IOCTL(DRM32_IOCTL_VERSION, drm32_version); | ||
595 | HANDLE_IOCTL(DRM32_IOCTL_GET_UNIQUE, drm32_getsetunique); | ||
596 | HANDLE_IOCTL(DRM32_IOCTL_SET_UNIQUE, drm32_getsetunique); | ||
597 | HANDLE_IOCTL(DRM32_IOCTL_ADD_MAP, drm32_addmap); | ||
598 | HANDLE_IOCTL(DRM32_IOCTL_INFO_BUFS, drm32_info_bufs); | ||
599 | HANDLE_IOCTL(DRM32_IOCTL_FREE_BUFS, drm32_free_bufs); | ||
600 | HANDLE_IOCTL(DRM32_IOCTL_MAP_BUFS, drm32_map_bufs); | ||
601 | HANDLE_IOCTL(DRM32_IOCTL_DMA, drm32_dma); | ||
602 | HANDLE_IOCTL(DRM32_IOCTL_RES_CTX, drm32_res_ctx); | ||
603 | #endif /* DRM */ | ||
604 | IOCTL_TABLE_END | 58 | IOCTL_TABLE_END |
605 | 59 | ||
606 | int ioctl_table_size = ARRAY_SIZE(ioctl_start); | 60 | int ioctl_table_size = ARRAY_SIZE(ioctl_start); |
diff --git a/arch/parisc/kernel/irq.c b/arch/parisc/kernel/irq.c index 006385dbee66..197936d9359a 100644 --- a/arch/parisc/kernel/irq.c +++ b/arch/parisc/kernel/irq.c | |||
@@ -30,6 +30,9 @@ | |||
30 | #include <linux/seq_file.h> | 30 | #include <linux/seq_file.h> |
31 | #include <linux/spinlock.h> | 31 | #include <linux/spinlock.h> |
32 | #include <linux/types.h> | 32 | #include <linux/types.h> |
33 | #include <asm/io.h> | ||
34 | |||
35 | #include <asm/smp.h> | ||
33 | 36 | ||
34 | #undef PARISC_IRQ_CR16_COUNTS | 37 | #undef PARISC_IRQ_CR16_COUNTS |
35 | 38 | ||
@@ -43,26 +46,34 @@ extern irqreturn_t ipi_interrupt(int, void *, struct pt_regs *); | |||
43 | */ | 46 | */ |
44 | static volatile unsigned long cpu_eiem = 0; | 47 | static volatile unsigned long cpu_eiem = 0; |
45 | 48 | ||
46 | static void cpu_set_eiem(void *info) | 49 | static void cpu_disable_irq(unsigned int irq) |
47 | { | ||
48 | set_eiem((unsigned long) info); | ||
49 | } | ||
50 | |||
51 | static inline void cpu_disable_irq(unsigned int irq) | ||
52 | { | 50 | { |
53 | unsigned long eirr_bit = EIEM_MASK(irq); | 51 | unsigned long eirr_bit = EIEM_MASK(irq); |
54 | 52 | ||
55 | cpu_eiem &= ~eirr_bit; | 53 | cpu_eiem &= ~eirr_bit; |
56 | on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1); | 54 | /* Do nothing on the other CPUs. If they get this interrupt, |
55 | * The & cpu_eiem in the do_cpu_irq_mask() ensures they won't | ||
56 | * handle it, and the set_eiem() at the bottom will ensure it | ||
57 | * then gets disabled */ | ||
57 | } | 58 | } |
58 | 59 | ||
59 | static void cpu_enable_irq(unsigned int irq) | 60 | static void cpu_enable_irq(unsigned int irq) |
60 | { | 61 | { |
61 | unsigned long eirr_bit = EIEM_MASK(irq); | 62 | unsigned long eirr_bit = EIEM_MASK(irq); |
62 | 63 | ||
63 | mtctl(eirr_bit, 23); /* clear EIRR bit before unmasking */ | ||
64 | cpu_eiem |= eirr_bit; | 64 | cpu_eiem |= eirr_bit; |
65 | on_each_cpu(cpu_set_eiem, (void *) cpu_eiem, 1, 1); | 65 | |
66 | /* FIXME: while our interrupts aren't nested, we cannot reset | ||
67 | * the eiem mask if we're already in an interrupt. Once we | ||
68 | * implement nested interrupts, this can go away | ||
69 | */ | ||
70 | if (!in_interrupt()) | ||
71 | set_eiem(cpu_eiem); | ||
72 | |||
73 | /* This is just a simple NOP IPI. But what it does is cause | ||
74 | * all the other CPUs to do a set_eiem(cpu_eiem) at the end | ||
75 | * of the interrupt handler */ | ||
76 | smp_send_all_nop(); | ||
66 | } | 77 | } |
67 | 78 | ||
68 | static unsigned int cpu_startup_irq(unsigned int irq) | 79 | static unsigned int cpu_startup_irq(unsigned int irq) |
@@ -74,6 +85,35 @@ static unsigned int cpu_startup_irq(unsigned int irq) | |||
74 | void no_ack_irq(unsigned int irq) { } | 85 | void no_ack_irq(unsigned int irq) { } |
75 | void no_end_irq(unsigned int irq) { } | 86 | void no_end_irq(unsigned int irq) { } |
76 | 87 | ||
88 | #ifdef CONFIG_SMP | ||
89 | int cpu_check_affinity(unsigned int irq, cpumask_t *dest) | ||
90 | { | ||
91 | int cpu_dest; | ||
92 | |||
93 | /* timer and ipi have to always be received on all CPUs */ | ||
94 | if (irq == TIMER_IRQ || irq == IPI_IRQ) { | ||
95 | /* Bad linux design decision. The mask has already | ||
96 | * been set; we must reset it */ | ||
97 | irq_affinity[irq] = CPU_MASK_ALL; | ||
98 | return -EINVAL; | ||
99 | } | ||
100 | |||
101 | /* whatever mask they set, we just allow one CPU */ | ||
102 | cpu_dest = first_cpu(*dest); | ||
103 | *dest = cpumask_of_cpu(cpu_dest); | ||
104 | |||
105 | return 0; | ||
106 | } | ||
107 | |||
108 | static void cpu_set_affinity_irq(unsigned int irq, cpumask_t dest) | ||
109 | { | ||
110 | if (cpu_check_affinity(irq, &dest)) | ||
111 | return; | ||
112 | |||
113 | irq_affinity[irq] = dest; | ||
114 | } | ||
115 | #endif | ||
116 | |||
77 | static struct hw_interrupt_type cpu_interrupt_type = { | 117 | static struct hw_interrupt_type cpu_interrupt_type = { |
78 | .typename = "CPU", | 118 | .typename = "CPU", |
79 | .startup = cpu_startup_irq, | 119 | .startup = cpu_startup_irq, |
@@ -82,7 +122,9 @@ static struct hw_interrupt_type cpu_interrupt_type = { | |||
82 | .disable = cpu_disable_irq, | 122 | .disable = cpu_disable_irq, |
83 | .ack = no_ack_irq, | 123 | .ack = no_ack_irq, |
84 | .end = no_end_irq, | 124 | .end = no_end_irq, |
85 | // .set_affinity = cpu_set_affinity_irq, | 125 | #ifdef CONFIG_SMP |
126 | .set_affinity = cpu_set_affinity_irq, | ||
127 | #endif | ||
86 | }; | 128 | }; |
87 | 129 | ||
88 | int show_interrupts(struct seq_file *p, void *v) | 130 | int show_interrupts(struct seq_file *p, void *v) |
@@ -219,6 +261,17 @@ int txn_alloc_irq(unsigned int bits_wide) | |||
219 | return -1; | 261 | return -1; |
220 | } | 262 | } |
221 | 263 | ||
264 | |||
265 | unsigned long txn_affinity_addr(unsigned int irq, int cpu) | ||
266 | { | ||
267 | #ifdef CONFIG_SMP | ||
268 | irq_affinity[irq] = cpumask_of_cpu(cpu); | ||
269 | #endif | ||
270 | |||
271 | return cpu_data[cpu].txn_addr; | ||
272 | } | ||
273 | |||
274 | |||
222 | unsigned long txn_alloc_addr(unsigned int virt_irq) | 275 | unsigned long txn_alloc_addr(unsigned int virt_irq) |
223 | { | 276 | { |
224 | static int next_cpu = -1; | 277 | static int next_cpu = -1; |
@@ -233,7 +286,7 @@ unsigned long txn_alloc_addr(unsigned int virt_irq) | |||
233 | if (next_cpu >= NR_CPUS) | 286 | if (next_cpu >= NR_CPUS) |
234 | next_cpu = 0; /* nothing else, assign monarch */ | 287 | next_cpu = 0; /* nothing else, assign monarch */ |
235 | 288 | ||
236 | return cpu_data[next_cpu].txn_addr; | 289 | return txn_affinity_addr(virt_irq, next_cpu); |
237 | } | 290 | } |
238 | 291 | ||
239 | 292 | ||
@@ -250,10 +303,11 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
250 | irq_enter(); | 303 | irq_enter(); |
251 | 304 | ||
252 | /* | 305 | /* |
253 | * Only allow interrupt processing to be interrupted by the | 306 | * Don't allow TIMER or IPI nested interrupts. |
254 | * timer tick | 307 | * Allowing any single interrupt to nest can lead to that CPU |
308 | * handling interrupts with all enabled interrupts unmasked. | ||
255 | */ | 309 | */ |
256 | set_eiem(EIEM_MASK(TIMER_IRQ)); | 310 | set_eiem(0UL); |
257 | 311 | ||
258 | /* 1) only process IRQs that are enabled/unmasked (cpu_eiem) | 312 | /* 1) only process IRQs that are enabled/unmasked (cpu_eiem) |
259 | * 2) We loop here on EIRR contents in order to avoid | 313 | * 2) We loop here on EIRR contents in order to avoid |
@@ -267,23 +321,41 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
267 | if (!eirr_val) | 321 | if (!eirr_val) |
268 | break; | 322 | break; |
269 | 323 | ||
270 | if (eirr_val & EIEM_MASK(TIMER_IRQ)) | ||
271 | set_eiem(0); | ||
272 | |||
273 | mtctl(eirr_val, 23); /* reset bits we are going to process */ | 324 | mtctl(eirr_val, 23); /* reset bits we are going to process */ |
274 | 325 | ||
275 | /* Work our way from MSb to LSb...same order we alloc EIRs */ | 326 | /* Work our way from MSb to LSb...same order we alloc EIRs */ |
276 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { | 327 | for (irq = TIMER_IRQ; eirr_val && bit; bit>>=1, irq++) { |
328 | #ifdef CONFIG_SMP | ||
329 | cpumask_t dest = irq_affinity[irq]; | ||
330 | #endif | ||
277 | if (!(bit & eirr_val)) | 331 | if (!(bit & eirr_val)) |
278 | continue; | 332 | continue; |
279 | 333 | ||
280 | /* clear bit in mask - can exit loop sooner */ | 334 | /* clear bit in mask - can exit loop sooner */ |
281 | eirr_val &= ~bit; | 335 | eirr_val &= ~bit; |
282 | 336 | ||
337 | #ifdef CONFIG_SMP | ||
338 | /* FIXME: because generic set affinity mucks | ||
339 | * with the affinity before sending it to us | ||
340 | * we can get the situation where the affinity is | ||
341 | * wrong for our CPU type interrupts */ | ||
342 | if (irq != TIMER_IRQ && irq != IPI_IRQ && | ||
343 | !cpu_isset(smp_processor_id(), dest)) { | ||
344 | int cpu = first_cpu(dest); | ||
345 | |||
346 | printk(KERN_DEBUG "redirecting irq %d from CPU %d to %d\n", | ||
347 | irq, smp_processor_id(), cpu); | ||
348 | gsc_writel(irq + CPU_IRQ_BASE, | ||
349 | cpu_data[cpu].hpa); | ||
350 | continue; | ||
351 | } | ||
352 | #endif | ||
353 | |||
283 | __do_IRQ(irq, regs); | 354 | __do_IRQ(irq, regs); |
284 | } | 355 | } |
285 | } | 356 | } |
286 | set_eiem(cpu_eiem); | 357 | |
358 | set_eiem(cpu_eiem); /* restore original mask */ | ||
287 | irq_exit(); | 359 | irq_exit(); |
288 | } | 360 | } |
289 | 361 | ||
@@ -291,12 +363,14 @@ void do_cpu_irq_mask(struct pt_regs *regs) | |||
291 | static struct irqaction timer_action = { | 363 | static struct irqaction timer_action = { |
292 | .handler = timer_interrupt, | 364 | .handler = timer_interrupt, |
293 | .name = "timer", | 365 | .name = "timer", |
366 | .flags = SA_INTERRUPT, | ||
294 | }; | 367 | }; |
295 | 368 | ||
296 | #ifdef CONFIG_SMP | 369 | #ifdef CONFIG_SMP |
297 | static struct irqaction ipi_action = { | 370 | static struct irqaction ipi_action = { |
298 | .handler = ipi_interrupt, | 371 | .handler = ipi_interrupt, |
299 | .name = "IPI", | 372 | .name = "IPI", |
373 | .flags = SA_INTERRUPT, | ||
300 | }; | 374 | }; |
301 | #endif | 375 | #endif |
302 | 376 | ||
diff --git a/arch/parisc/kernel/perf.c b/arch/parisc/kernel/perf.c index 44670d6e06f4..f6fec62b6a2f 100644 --- a/arch/parisc/kernel/perf.c +++ b/arch/parisc/kernel/perf.c | |||
@@ -196,8 +196,7 @@ static int perf_open(struct inode *inode, struct file *file); | |||
196 | static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos); | 196 | static ssize_t perf_read(struct file *file, char __user *buf, size_t cnt, loff_t *ppos); |
197 | static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, | 197 | static ssize_t perf_write(struct file *file, const char __user *buf, size_t count, |
198 | loff_t *ppos); | 198 | loff_t *ppos); |
199 | static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 199 | static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg); |
200 | unsigned long arg); | ||
201 | static void perf_start_counters(void); | 200 | static void perf_start_counters(void); |
202 | static int perf_stop_counters(uint32_t *raddr); | 201 | static int perf_stop_counters(uint32_t *raddr); |
203 | static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); | 202 | static struct rdr_tbl_ent * perf_rdr_get_entry(uint32_t rdr_num); |
@@ -438,48 +437,56 @@ static void perf_patch_images(void) | |||
438 | * must be running on the processor that you wish to change. | 437 | * must be running on the processor that you wish to change. |
439 | */ | 438 | */ |
440 | 439 | ||
441 | static int perf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | 440 | static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
442 | unsigned long arg) | ||
443 | { | 441 | { |
444 | long error_start; | 442 | long error_start; |
445 | uint32_t raddr[4]; | 443 | uint32_t raddr[4]; |
444 | int error = 0; | ||
446 | 445 | ||
446 | lock_kernel(); | ||
447 | switch (cmd) { | 447 | switch (cmd) { |
448 | 448 | ||
449 | case PA_PERF_ON: | 449 | case PA_PERF_ON: |
450 | /* Start the counters */ | 450 | /* Start the counters */ |
451 | perf_start_counters(); | 451 | perf_start_counters(); |
452 | return 0; | 452 | break; |
453 | 453 | ||
454 | case PA_PERF_OFF: | 454 | case PA_PERF_OFF: |
455 | error_start = perf_stop_counters(raddr); | 455 | error_start = perf_stop_counters(raddr); |
456 | if (error_start != 0) { | 456 | if (error_start != 0) { |
457 | printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start); | 457 | printk(KERN_ERR "perf_off: perf_stop_counters = %ld\n", error_start); |
458 | return -EFAULT; | 458 | error = -EFAULT; |
459 | break; | ||
459 | } | 460 | } |
460 | 461 | ||
461 | /* copy out the Counters */ | 462 | /* copy out the Counters */ |
462 | if (copy_to_user((void __user *)arg, raddr, | 463 | if (copy_to_user((void __user *)arg, raddr, |
463 | sizeof (raddr)) != 0) { | 464 | sizeof (raddr)) != 0) { |
464 | return -EFAULT; | 465 | error = -EFAULT; |
466 | break; | ||
465 | } | 467 | } |
466 | return 0; | 468 | break; |
467 | 469 | ||
468 | case PA_PERF_VERSION: | 470 | case PA_PERF_VERSION: |
469 | /* Return the version # */ | 471 | /* Return the version # */ |
470 | return put_user(PERF_VERSION, (int *)arg); | 472 | error = put_user(PERF_VERSION, (int *)arg); |
473 | break; | ||
471 | 474 | ||
472 | default: | 475 | default: |
473 | break; | 476 | error = -ENOTTY; |
474 | } | 477 | } |
475 | return -ENOTTY; | 478 | |
479 | unlock_kernel(); | ||
480 | |||
481 | return error; | ||
476 | } | 482 | } |
477 | 483 | ||
478 | static struct file_operations perf_fops = { | 484 | static struct file_operations perf_fops = { |
479 | .llseek = no_llseek, | 485 | .llseek = no_llseek, |
480 | .read = perf_read, | 486 | .read = perf_read, |
481 | .write = perf_write, | 487 | .write = perf_write, |
482 | .ioctl = perf_ioctl, | 488 | .unlocked_ioctl = perf_ioctl, |
489 | .compat_ioctl = perf_ioctl, | ||
483 | .open = perf_open, | 490 | .open = perf_open, |
484 | .release = perf_release | 491 | .release = perf_release |
485 | }; | 492 | }; |
diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c index b6fe202a620d..27160e8bf15b 100644 --- a/arch/parisc/kernel/ptrace.c +++ b/arch/parisc/kernel/ptrace.c | |||
@@ -264,6 +264,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
264 | * sigkill. perhaps it should be put in the status | 264 | * sigkill. perhaps it should be put in the status |
265 | * that it wants to exit. | 265 | * that it wants to exit. |
266 | */ | 266 | */ |
267 | ret = 0; | ||
267 | DBG("sys_ptrace(KILL)\n"); | 268 | DBG("sys_ptrace(KILL)\n"); |
268 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | 269 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ |
269 | goto out_tsk; | 270 | goto out_tsk; |
@@ -344,11 +345,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
344 | 345 | ||
345 | case PTRACE_GETEVENTMSG: | 346 | case PTRACE_GETEVENTMSG: |
346 | ret = put_user(child->ptrace_message, (unsigned int __user *) data); | 347 | ret = put_user(child->ptrace_message, (unsigned int __user *) data); |
347 | goto out; | 348 | goto out_tsk; |
348 | 349 | ||
349 | default: | 350 | default: |
350 | ret = ptrace_request(child, request, addr, data); | 351 | ret = ptrace_request(child, request, addr, data); |
351 | goto out; | 352 | goto out_tsk; |
352 | } | 353 | } |
353 | 354 | ||
354 | out_wake_notrap: | 355 | out_wake_notrap: |
diff --git a/arch/parisc/kernel/signal.c b/arch/parisc/kernel/signal.c index 82c24e62ab63..3a25a7bd673e 100644 --- a/arch/parisc/kernel/signal.c +++ b/arch/parisc/kernel/signal.c | |||
@@ -296,7 +296,6 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info, | |||
296 | struct rt_sigframe __user *frame; | 296 | struct rt_sigframe __user *frame; |
297 | unsigned long rp, usp; | 297 | unsigned long rp, usp; |
298 | unsigned long haddr, sigframe_size; | 298 | unsigned long haddr, sigframe_size; |
299 | struct siginfo si; | ||
300 | int err = 0; | 299 | int err = 0; |
301 | #ifdef __LP64__ | 300 | #ifdef __LP64__ |
302 | compat_int_t compat_val; | 301 | compat_int_t compat_val; |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index a9ecf6465784..ce89da0f654d 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -181,12 +181,19 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
181 | while (ops) { | 181 | while (ops) { |
182 | unsigned long which = ffz(~ops); | 182 | unsigned long which = ffz(~ops); |
183 | 183 | ||
184 | ops &= ~(1 << which); | ||
185 | |||
184 | switch (which) { | 186 | switch (which) { |
187 | case IPI_NOP: | ||
188 | #if (kDEBUG>=100) | ||
189 | printk(KERN_DEBUG "CPU%d IPI_NOP\n",this_cpu); | ||
190 | #endif /* kDEBUG */ | ||
191 | break; | ||
192 | |||
185 | case IPI_RESCHEDULE: | 193 | case IPI_RESCHEDULE: |
186 | #if (kDEBUG>=100) | 194 | #if (kDEBUG>=100) |
187 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); | 195 | printk(KERN_DEBUG "CPU%d IPI_RESCHEDULE\n",this_cpu); |
188 | #endif /* kDEBUG */ | 196 | #endif /* kDEBUG */ |
189 | ops &= ~(1 << IPI_RESCHEDULE); | ||
190 | /* | 197 | /* |
191 | * Reschedule callback. Everything to be | 198 | * Reschedule callback. Everything to be |
192 | * done is done by the interrupt return path. | 199 | * done is done by the interrupt return path. |
@@ -197,7 +204,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
197 | #if (kDEBUG>=100) | 204 | #if (kDEBUG>=100) |
198 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); | 205 | printk(KERN_DEBUG "CPU%d IPI_CALL_FUNC\n",this_cpu); |
199 | #endif /* kDEBUG */ | 206 | #endif /* kDEBUG */ |
200 | ops &= ~(1 << IPI_CALL_FUNC); | ||
201 | { | 207 | { |
202 | volatile struct smp_call_struct *data; | 208 | volatile struct smp_call_struct *data; |
203 | void (*func)(void *info); | 209 | void (*func)(void *info); |
@@ -231,7 +237,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
231 | #if (kDEBUG>=100) | 237 | #if (kDEBUG>=100) |
232 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); | 238 | printk(KERN_DEBUG "CPU%d IPI_CPU_START\n",this_cpu); |
233 | #endif /* kDEBUG */ | 239 | #endif /* kDEBUG */ |
234 | ops &= ~(1 << IPI_CPU_START); | ||
235 | #ifdef ENTRY_SYS_CPUS | 240 | #ifdef ENTRY_SYS_CPUS |
236 | p->state = STATE_RUNNING; | 241 | p->state = STATE_RUNNING; |
237 | #endif | 242 | #endif |
@@ -241,7 +246,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
241 | #if (kDEBUG>=100) | 246 | #if (kDEBUG>=100) |
242 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); | 247 | printk(KERN_DEBUG "CPU%d IPI_CPU_STOP\n",this_cpu); |
243 | #endif /* kDEBUG */ | 248 | #endif /* kDEBUG */ |
244 | ops &= ~(1 << IPI_CPU_STOP); | ||
245 | #ifdef ENTRY_SYS_CPUS | 249 | #ifdef ENTRY_SYS_CPUS |
246 | #else | 250 | #else |
247 | halt_processor(); | 251 | halt_processor(); |
@@ -252,13 +256,11 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
252 | #if (kDEBUG>=100) | 256 | #if (kDEBUG>=100) |
253 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); | 257 | printk(KERN_DEBUG "CPU%d is alive!\n",this_cpu); |
254 | #endif /* kDEBUG */ | 258 | #endif /* kDEBUG */ |
255 | ops &= ~(1 << IPI_CPU_TEST); | ||
256 | break; | 259 | break; |
257 | 260 | ||
258 | default: | 261 | default: |
259 | printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n", | 262 | printk(KERN_CRIT "Unknown IPI num on CPU%d: %lu\n", |
260 | this_cpu, which); | 263 | this_cpu, which); |
261 | ops &= ~(1 << which); | ||
262 | return IRQ_NONE; | 264 | return IRQ_NONE; |
263 | } /* Switch */ | 265 | } /* Switch */ |
264 | } /* while (ops) */ | 266 | } /* while (ops) */ |
@@ -312,6 +314,12 @@ smp_send_start(void) { send_IPI_allbutself(IPI_CPU_START); } | |||
312 | void | 314 | void |
313 | smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); } | 315 | smp_send_reschedule(int cpu) { send_IPI_single(cpu, IPI_RESCHEDULE); } |
314 | 316 | ||
317 | void | ||
318 | smp_send_all_nop(void) | ||
319 | { | ||
320 | send_IPI_allbutself(IPI_NOP); | ||
321 | } | ||
322 | |||
315 | 323 | ||
316 | /** | 324 | /** |
317 | * Run a function on all other CPUs. | 325 | * Run a function on all other CPUs. |
@@ -338,6 +346,10 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait) | |||
338 | 346 | ||
339 | /* Can deadlock when called with interrupts disabled */ | 347 | /* Can deadlock when called with interrupts disabled */ |
340 | WARN_ON(irqs_disabled()); | 348 | WARN_ON(irqs_disabled()); |
349 | |||
350 | /* can also deadlock if IPIs are disabled */ | ||
351 | WARN_ON((get_eiem() & (1UL<<(CPU_IRQ_MAX - IPI_IRQ))) == 0); | ||
352 | |||
341 | 353 | ||
342 | data.func = func; | 354 | data.func = func; |
343 | data.info = info; | 355 | data.info = info; |
diff --git a/arch/parisc/kernel/syscall.S b/arch/parisc/kernel/syscall.S index b29b76b42bb7..d66163492890 100644 --- a/arch/parisc/kernel/syscall.S +++ b/arch/parisc/kernel/syscall.S | |||
@@ -164,7 +164,7 @@ linux_gateway_entry: | |||
164 | #endif | 164 | #endif |
165 | STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */ | 165 | STREG %r2, TASK_PT_GR30(%r1) /* ... and save it */ |
166 | 166 | ||
167 | STREG %r20, TASK_PT_GR20(%r1) | 167 | STREG %r20, TASK_PT_GR20(%r1) /* Syscall number */ |
168 | STREG %r21, TASK_PT_GR21(%r1) | 168 | STREG %r21, TASK_PT_GR21(%r1) |
169 | STREG %r22, TASK_PT_GR22(%r1) | 169 | STREG %r22, TASK_PT_GR22(%r1) |
170 | STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */ | 170 | STREG %r23, TASK_PT_GR23(%r1) /* 4th argument */ |
@@ -527,6 +527,7 @@ lws_compare_and_swap: | |||
527 | We *must* giveup this call and fail. | 527 | We *must* giveup this call and fail. |
528 | */ | 528 | */ |
529 | ldw 4(%sr2,%r20), %r28 /* Load thread register */ | 529 | ldw 4(%sr2,%r20), %r28 /* Load thread register */ |
530 | /* WARNING: If cr27 cycles to the same value we have problems */ | ||
530 | mfctl %cr27, %r21 /* Get current thread register */ | 531 | mfctl %cr27, %r21 /* Get current thread register */ |
531 | cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */ | 532 | cmpb,<>,n %r21, %r28, cas_lock /* Called recursive? */ |
532 | b lws_exit /* Return error! */ | 533 | b lws_exit /* Return error! */ |
diff --git a/arch/powerpc/kernel/pci_64.c b/arch/powerpc/kernel/pci_64.c index 5a5b24685081..8b6008ab217d 100644 --- a/arch/powerpc/kernel/pci_64.c +++ b/arch/powerpc/kernel/pci_64.c | |||
@@ -40,7 +40,7 @@ | |||
40 | #endif | 40 | #endif |
41 | 41 | ||
42 | unsigned long pci_probe_only = 1; | 42 | unsigned long pci_probe_only = 1; |
43 | unsigned long pci_assign_all_buses = 0; | 43 | int pci_assign_all_buses = 0; |
44 | 44 | ||
45 | /* | 45 | /* |
46 | * legal IO pages under MAX_ISA_PORT. This is to ensure we don't touch | 46 | * legal IO pages under MAX_ISA_PORT. This is to ensure we don't touch |
@@ -55,11 +55,6 @@ static void fixup_resource(struct resource *res, struct pci_dev *dev); | |||
55 | static void do_bus_setup(struct pci_bus *bus); | 55 | static void do_bus_setup(struct pci_bus *bus); |
56 | #endif | 56 | #endif |
57 | 57 | ||
58 | unsigned int pcibios_assign_all_busses(void) | ||
59 | { | ||
60 | return pci_assign_all_buses; | ||
61 | } | ||
62 | |||
63 | /* pci_io_base -- the base address from which io bars are offsets. | 58 | /* pci_io_base -- the base address from which io bars are offsets. |
64 | * This is the lowest I/O base address (so bar values are always positive), | 59 | * This is the lowest I/O base address (so bar values are always positive), |
65 | * and it *must* be the start of ISA space if an ISA bus exists because | 60 | * and it *must* be the start of ISA space if an ISA bus exists because |
@@ -1186,17 +1181,6 @@ void phbs_remap_io(void) | |||
1186 | remap_bus_range(hose->bus); | 1181 | remap_bus_range(hose->bus); |
1187 | } | 1182 | } |
1188 | 1183 | ||
1189 | /* | ||
1190 | * ppc64 can have multifunction devices that do not respond to function 0. | ||
1191 | * In this case we must scan all functions. | ||
1192 | * XXX this can go now, we use the OF device tree in all the | ||
1193 | * cases that caused problems. -- paulus | ||
1194 | */ | ||
1195 | int pcibios_scan_all_fns(struct pci_bus *bus, int devfn) | ||
1196 | { | ||
1197 | return 0; | ||
1198 | } | ||
1199 | |||
1200 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) | 1184 | static void __devinit fixup_resource(struct resource *res, struct pci_dev *dev) |
1201 | { | 1185 | { |
1202 | struct pci_controller *hose = pci_bus_to_host(dev->bus); | 1186 | struct pci_controller *hose = pci_bus_to_host(dev->bus); |
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index 59846b40d521..af4d1bc9a2eb 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -146,9 +146,6 @@ EXPORT_SYMBOL(pci_bus_io_base); | |||
146 | EXPORT_SYMBOL(pci_bus_io_base_phys); | 146 | EXPORT_SYMBOL(pci_bus_io_base_phys); |
147 | EXPORT_SYMBOL(pci_bus_mem_base_phys); | 147 | EXPORT_SYMBOL(pci_bus_mem_base_phys); |
148 | EXPORT_SYMBOL(pci_bus_to_hose); | 148 | EXPORT_SYMBOL(pci_bus_to_hose); |
149 | EXPORT_SYMBOL(pci_resource_to_bus); | ||
150 | EXPORT_SYMBOL(pci_phys_to_bus); | ||
151 | EXPORT_SYMBOL(pci_bus_to_phys); | ||
152 | #endif /* CONFIG_PCI */ | 149 | #endif /* CONFIG_PCI */ |
153 | 150 | ||
154 | #ifdef CONFIG_NOT_COHERENT_CACHE | 151 | #ifdef CONFIG_NOT_COHERENT_CACHE |
diff --git a/include/asm-ppc64/ptrace-common.h b/arch/powerpc/kernel/ptrace-common.h index b1babb729673..b1babb729673 100644 --- a/include/asm-ppc64/ptrace-common.h +++ b/arch/powerpc/kernel/ptrace-common.h | |||
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c index 3d2abd95c7ae..400793c71304 100644 --- a/arch/powerpc/kernel/ptrace.c +++ b/arch/powerpc/kernel/ptrace.c | |||
@@ -36,8 +36,9 @@ | |||
36 | #include <asm/page.h> | 36 | #include <asm/page.h> |
37 | #include <asm/pgtable.h> | 37 | #include <asm/pgtable.h> |
38 | #include <asm/system.h> | 38 | #include <asm/system.h> |
39 | |||
39 | #ifdef CONFIG_PPC64 | 40 | #ifdef CONFIG_PPC64 |
40 | #include <asm/ptrace-common.h> | 41 | #include "ptrace-common.h" |
41 | #endif | 42 | #endif |
42 | 43 | ||
43 | #ifdef CONFIG_PPC32 | 44 | #ifdef CONFIG_PPC32 |
diff --git a/arch/powerpc/kernel/ptrace32.c b/arch/powerpc/kernel/ptrace32.c index 91eb952e0293..61762640b877 100644 --- a/arch/powerpc/kernel/ptrace32.c +++ b/arch/powerpc/kernel/ptrace32.c | |||
@@ -33,7 +33,8 @@ | |||
33 | #include <asm/page.h> | 33 | #include <asm/page.h> |
34 | #include <asm/pgtable.h> | 34 | #include <asm/pgtable.h> |
35 | #include <asm/system.h> | 35 | #include <asm/system.h> |
36 | #include <asm/ptrace-common.h> | 36 | |
37 | #include "ptrace-common.h" | ||
37 | 38 | ||
38 | /* | 39 | /* |
39 | * does not yet catch signals sent when the child dies. | 40 | * does not yet catch signals sent when the child dies. |
diff --git a/arch/powerpc/mm/imalloc.c b/arch/powerpc/mm/imalloc.c index f4ca29cf5364..f9587bcc6a48 100644 --- a/arch/powerpc/mm/imalloc.c +++ b/arch/powerpc/mm/imalloc.c | |||
@@ -14,9 +14,10 @@ | |||
14 | #include <asm/pgalloc.h> | 14 | #include <asm/pgalloc.h> |
15 | #include <asm/pgtable.h> | 15 | #include <asm/pgtable.h> |
16 | #include <asm/semaphore.h> | 16 | #include <asm/semaphore.h> |
17 | #include <asm/imalloc.h> | ||
18 | #include <asm/cacheflush.h> | 17 | #include <asm/cacheflush.h> |
19 | 18 | ||
19 | #include "mmu_decl.h" | ||
20 | |||
20 | static DECLARE_MUTEX(imlist_sem); | 21 | static DECLARE_MUTEX(imlist_sem); |
21 | struct vm_struct * imlist = NULL; | 22 | struct vm_struct * imlist = NULL; |
22 | 23 | ||
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c index 1134f70f231d..81cfb0c2ec58 100644 --- a/arch/powerpc/mm/init_64.c +++ b/arch/powerpc/mm/init_64.c | |||
@@ -64,7 +64,8 @@ | |||
64 | #include <asm/iommu.h> | 64 | #include <asm/iommu.h> |
65 | #include <asm/abs_addr.h> | 65 | #include <asm/abs_addr.h> |
66 | #include <asm/vdso.h> | 66 | #include <asm/vdso.h> |
67 | #include <asm/imalloc.h> | 67 | |
68 | #include "mmu_decl.h" | ||
68 | 69 | ||
69 | #ifdef DEBUG | 70 | #ifdef DEBUG |
70 | #define DBG(fmt...) printk(fmt) | 71 | #define DBG(fmt...) printk(fmt) |
diff --git a/arch/powerpc/mm/mmu_decl.h b/arch/powerpc/mm/mmu_decl.h index a4d7a327c0e5..bea2d21ac6f7 100644 --- a/arch/powerpc/mm/mmu_decl.h +++ b/arch/powerpc/mm/mmu_decl.h | |||
@@ -33,7 +33,6 @@ extern void invalidate_tlbcam_entry(int index); | |||
33 | 33 | ||
34 | extern int __map_without_bats; | 34 | extern int __map_without_bats; |
35 | extern unsigned long ioremap_base; | 35 | extern unsigned long ioremap_base; |
36 | extern unsigned long ioremap_bot; | ||
37 | extern unsigned int rtas_data, rtas_size; | 36 | extern unsigned int rtas_data, rtas_size; |
38 | 37 | ||
39 | extern PTE *Hash, *Hash_end; | 38 | extern PTE *Hash, *Hash_end; |
@@ -42,6 +41,7 @@ extern unsigned long Hash_size, Hash_mask; | |||
42 | extern unsigned int num_tlbcam_entries; | 41 | extern unsigned int num_tlbcam_entries; |
43 | #endif | 42 | #endif |
44 | 43 | ||
44 | extern unsigned long ioremap_bot; | ||
45 | extern unsigned long __max_low_memory; | 45 | extern unsigned long __max_low_memory; |
46 | extern unsigned long __initial_memory_limit; | 46 | extern unsigned long __initial_memory_limit; |
47 | extern unsigned long total_memory; | 47 | extern unsigned long total_memory; |
@@ -84,4 +84,16 @@ static inline void flush_HPTE(unsigned context, unsigned long va, | |||
84 | else | 84 | else |
85 | _tlbie(va); | 85 | _tlbie(va); |
86 | } | 86 | } |
87 | #else /* CONFIG_PPC64 */ | ||
88 | /* imalloc region types */ | ||
89 | #define IM_REGION_UNUSED 0x1 | ||
90 | #define IM_REGION_SUBSET 0x2 | ||
91 | #define IM_REGION_EXISTS 0x4 | ||
92 | #define IM_REGION_OVERLAP 0x8 | ||
93 | #define IM_REGION_SUPERSET 0x10 | ||
94 | |||
95 | extern struct vm_struct * im_get_free_area(unsigned long size); | ||
96 | extern struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size, | ||
97 | int region_type); | ||
98 | extern void im_free(void *addr); | ||
87 | #endif | 99 | #endif |
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index c7f7bb6f30b3..2ffca63602c5 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
@@ -64,7 +64,8 @@ | |||
64 | #include <asm/iommu.h> | 64 | #include <asm/iommu.h> |
65 | #include <asm/abs_addr.h> | 65 | #include <asm/abs_addr.h> |
66 | #include <asm/vdso.h> | 66 | #include <asm/vdso.h> |
67 | #include <asm/imalloc.h> | 67 | |
68 | #include "mmu_decl.h" | ||
68 | 69 | ||
69 | unsigned long ioremap_bot = IMALLOC_BASE; | 70 | unsigned long ioremap_bot = IMALLOC_BASE; |
70 | static unsigned long phbs_io_bot = PHBS_IO_BASE; | 71 | static unsigned long phbs_io_bot = PHBS_IO_BASE; |
diff --git a/arch/powerpc/platforms/powermac/smp.c b/arch/powerpc/platforms/powermac/smp.c index 957b09103422..fb2a7c798e82 100644 --- a/arch/powerpc/platforms/powermac/smp.c +++ b/arch/powerpc/platforms/powermac/smp.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
35 | #include <linux/hardirq.h> | 35 | #include <linux/hardirq.h> |
36 | #include <linux/cpu.h> | 36 | #include <linux/cpu.h> |
37 | #include <linux/compiler.h> | ||
37 | 38 | ||
38 | #include <asm/ptrace.h> | 39 | #include <asm/ptrace.h> |
39 | #include <asm/atomic.h> | 40 | #include <asm/atomic.h> |
@@ -631,8 +632,9 @@ void smp_core99_give_timebase(void) | |||
631 | mb(); | 632 | mb(); |
632 | 633 | ||
633 | /* wait for the secondary to have taken it */ | 634 | /* wait for the secondary to have taken it */ |
634 | for (t = 100000; t > 0 && sec_tb_reset; --t) | 635 | /* note: can't use udelay here, since it needs the timebase running */ |
635 | udelay(10); | 636 | for (t = 10000000; t > 0 && sec_tb_reset; --t) |
637 | barrier(); | ||
636 | if (sec_tb_reset) | 638 | if (sec_tb_reset) |
637 | /* XXX BUG_ON here? */ | 639 | /* XXX BUG_ON here? */ |
638 | printk(KERN_WARNING "Timeout waiting sync(2) on second CPU\n"); | 640 | printk(KERN_WARNING "Timeout waiting sync(2) on second CPU\n"); |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 105f05341a41..58d1cc2023c8 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
@@ -361,7 +361,8 @@ static void mpic_enable_irq(unsigned int irq) | |||
361 | DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src); | 361 | DBG("%p: %s: enable_irq: %d (src %d)\n", mpic, mpic->name, irq, src); |
362 | 362 | ||
363 | mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, | 363 | mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, |
364 | mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) & ~MPIC_VECPRI_MASK); | 364 | mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) & |
365 | ~MPIC_VECPRI_MASK); | ||
365 | 366 | ||
366 | /* make sure mask gets to controller before we return to user */ | 367 | /* make sure mask gets to controller before we return to user */ |
367 | do { | 368 | do { |
@@ -381,7 +382,8 @@ static void mpic_disable_irq(unsigned int irq) | |||
381 | DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src); | 382 | DBG("%s: disable_irq: %d (src %d)\n", mpic->name, irq, src); |
382 | 383 | ||
383 | mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, | 384 | mpic_irq_write(src, MPIC_IRQ_VECTOR_PRI, |
384 | mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) | MPIC_VECPRI_MASK); | 385 | mpic_irq_read(src, MPIC_IRQ_VECTOR_PRI) | |
386 | MPIC_VECPRI_MASK); | ||
385 | 387 | ||
386 | /* make sure mask gets to controller before we return to user */ | 388 | /* make sure mask gets to controller before we return to user */ |
387 | do { | 389 | do { |
@@ -735,12 +737,13 @@ void mpic_irq_set_priority(unsigned int irq, unsigned int pri) | |||
735 | 737 | ||
736 | spin_lock_irqsave(&mpic_lock, flags); | 738 | spin_lock_irqsave(&mpic_lock, flags); |
737 | if (is_ipi) { | 739 | if (is_ipi) { |
738 | reg = mpic_ipi_read(irq - mpic->ipi_offset) & MPIC_VECPRI_PRIORITY_MASK; | 740 | reg = mpic_ipi_read(irq - mpic->ipi_offset) & |
741 | ~MPIC_VECPRI_PRIORITY_MASK; | ||
739 | mpic_ipi_write(irq - mpic->ipi_offset, | 742 | mpic_ipi_write(irq - mpic->ipi_offset, |
740 | reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); | 743 | reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); |
741 | } else { | 744 | } else { |
742 | reg = mpic_irq_read(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI) | 745 | reg = mpic_irq_read(irq - mpic->irq_offset,MPIC_IRQ_VECTOR_PRI) |
743 | & MPIC_VECPRI_PRIORITY_MASK; | 746 | & ~MPIC_VECPRI_PRIORITY_MASK; |
744 | mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI, | 747 | mpic_irq_write(irq - mpic->irq_offset, MPIC_IRQ_VECTOR_PRI, |
745 | reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); | 748 | reg | (pri << MPIC_VECPRI_PRIORITY_SHIFT)); |
746 | } | 749 | } |
diff --git a/block/as-iosched.c b/block/as-iosched.c index a78e160b59a3..43fa20495688 100644 --- a/block/as-iosched.c +++ b/block/as-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/as-iosched.c | ||
3 | * | ||
4 | * Anticipatory & deadline i/o scheduler. | 2 | * Anticipatory & deadline i/o scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> | 4 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> |
@@ -1373,10 +1371,6 @@ static void as_add_request(request_queue_t *q, struct request *rq) | |||
1373 | struct as_rq *alias; | 1371 | struct as_rq *alias; |
1374 | int data_dir; | 1372 | int data_dir; |
1375 | 1373 | ||
1376 | if (arq->state != AS_RQ_PRESCHED) { | ||
1377 | printk("arq->state: %d\n", arq->state); | ||
1378 | WARN_ON(1); | ||
1379 | } | ||
1380 | arq->state = AS_RQ_NEW; | 1374 | arq->state = AS_RQ_NEW; |
1381 | 1375 | ||
1382 | if (rq_data_dir(arq->request) == READ | 1376 | if (rq_data_dir(arq->request) == READ |
diff --git a/block/cfq-iosched.c b/block/cfq-iosched.c index 2b64f5852bfd..ee0bb41694b0 100644 --- a/block/cfq-iosched.c +++ b/block/cfq-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/cfq-iosched.c | ||
3 | * | ||
4 | * CFQ, or complete fairness queueing, disk scheduler. | 2 | * CFQ, or complete fairness queueing, disk scheduler. |
5 | * | 3 | * |
6 | * Based on ideas from a previously unfinished io | 4 | * Based on ideas from a previously unfinished io |
diff --git a/block/deadline-iosched.c b/block/deadline-iosched.c index 7929471d7df7..9cbec09e8415 100644 --- a/block/deadline-iosched.c +++ b/block/deadline-iosched.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/deadline-iosched.c | ||
3 | * | ||
4 | * Deadline i/o scheduler. | 2 | * Deadline i/o scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> | 4 | * Copyright (C) 2002 Jens Axboe <axboe@suse.de> |
diff --git a/block/elevator.c b/block/elevator.c index e4c58827bb46..6c3fc8a10bf2 100644 --- a/block/elevator.c +++ b/block/elevator.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/elevator.c | ||
3 | * | ||
4 | * Block device elevator/IO-scheduler. | 2 | * Block device elevator/IO-scheduler. |
5 | * | 3 | * |
6 | * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE | 4 | * Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE |
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c index 5f52e30b43f8..99c9ca6d5992 100644 --- a/block/ll_rw_blk.c +++ b/block/ll_rw_blk.c | |||
@@ -1,6 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/block/ll_rw_blk.c | ||
3 | * | ||
4 | * Copyright (C) 1991, 1992 Linus Torvalds | 2 | * Copyright (C) 1991, 1992 Linus Torvalds |
5 | * Copyright (C) 1994, Karl Keyte: Added support for disk statistics | 3 | * Copyright (C) 1994, Karl Keyte: Added support for disk statistics |
6 | * Elevator latency, (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE | 4 | * Elevator latency, (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index e239a6c29230..a9e33db46e68 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1017,10 +1017,11 @@ static int cciss_ioctl(struct inode *inode, struct file *filep, | |||
1017 | status = -ENOMEM; | 1017 | status = -ENOMEM; |
1018 | goto cleanup1; | 1018 | goto cleanup1; |
1019 | } | 1019 | } |
1020 | if (ioc->Request.Type.Direction == XFER_WRITE && | 1020 | if (ioc->Request.Type.Direction == XFER_WRITE) { |
1021 | copy_from_user(buff[sg_used], data_ptr, sz)) { | 1021 | if (copy_from_user(buff[sg_used], data_ptr, sz)) { |
1022 | status = -ENOMEM; | 1022 | status = -ENOMEM; |
1023 | goto cleanup1; | 1023 | goto cleanup1; |
1024 | } | ||
1024 | } else { | 1025 | } else { |
1025 | memset(buff[sg_used], 0, sz); | 1026 | memset(buff[sg_used], 0, sz); |
1026 | } | 1027 | } |
@@ -1138,8 +1139,15 @@ static int revalidate_allvol(ctlr_info_t *host) | |||
1138 | 1139 | ||
1139 | for(i=0; i< NWD; i++) { | 1140 | for(i=0; i< NWD; i++) { |
1140 | struct gendisk *disk = host->gendisk[i]; | 1141 | struct gendisk *disk = host->gendisk[i]; |
1141 | if (disk->flags & GENHD_FL_UP) | 1142 | if (disk) { |
1142 | del_gendisk(disk); | 1143 | request_queue_t *q = disk->queue; |
1144 | |||
1145 | if (disk->flags & GENHD_FL_UP) | ||
1146 | del_gendisk(disk); | ||
1147 | if (q) | ||
1148 | blk_cleanup_queue(q); | ||
1149 | put_disk(disk); | ||
1150 | } | ||
1143 | } | 1151 | } |
1144 | 1152 | ||
1145 | /* | 1153 | /* |
@@ -1453,10 +1461,13 @@ static int deregister_disk(struct gendisk *disk, drive_info_struct *drv, | |||
1453 | * allows us to delete disk zero but keep the controller registered. | 1461 | * allows us to delete disk zero but keep the controller registered. |
1454 | */ | 1462 | */ |
1455 | if (h->gendisk[0] != disk){ | 1463 | if (h->gendisk[0] != disk){ |
1456 | if (disk->flags & GENHD_FL_UP){ | 1464 | if (disk) { |
1457 | blk_cleanup_queue(disk->queue); | 1465 | request_queue_t *q = disk->queue; |
1458 | del_gendisk(disk); | 1466 | if (disk->flags & GENHD_FL_UP) |
1459 | drv->queue = NULL; | 1467 | del_gendisk(disk); |
1468 | if (q) | ||
1469 | blk_cleanup_queue(q); | ||
1470 | put_disk(disk); | ||
1460 | } | 1471 | } |
1461 | } | 1472 | } |
1462 | 1473 | ||
@@ -3225,9 +3236,14 @@ static void __devexit cciss_remove_one (struct pci_dev *pdev) | |||
3225 | /* remove it from the disk list */ | 3236 | /* remove it from the disk list */ |
3226 | for (j = 0; j < NWD; j++) { | 3237 | for (j = 0; j < NWD; j++) { |
3227 | struct gendisk *disk = hba[i]->gendisk[j]; | 3238 | struct gendisk *disk = hba[i]->gendisk[j]; |
3228 | if (disk->flags & GENHD_FL_UP) { | 3239 | if (disk) { |
3229 | del_gendisk(disk); | 3240 | request_queue_t *q = disk->queue; |
3230 | blk_cleanup_queue(disk->queue); | 3241 | |
3242 | if (disk->flags & GENHD_FL_UP) | ||
3243 | del_gendisk(disk); | ||
3244 | if (q) | ||
3245 | blk_cleanup_queue(q); | ||
3246 | put_disk(disk); | ||
3231 | } | 3247 | } |
3232 | } | 3248 | } |
3233 | 3249 | ||
diff --git a/drivers/char/agp/amd64-agp.c b/drivers/char/agp/amd64-agp.c index 76589782adcb..810679dcbbb0 100644 --- a/drivers/char/agp/amd64-agp.c +++ b/drivers/char/agp/amd64-agp.c | |||
@@ -416,7 +416,7 @@ static void __devinit amd8151_init(struct pci_dev *pdev, struct agp_bridge_data | |||
416 | } | 416 | } |
417 | 417 | ||
418 | 418 | ||
419 | static struct aper_size_info_32 uli_sizes[7] = | 419 | static const struct aper_size_info_32 uli_sizes[7] = |
420 | { | 420 | { |
421 | {256, 65536, 6, 10}, | 421 | {256, 65536, 6, 10}, |
422 | {128, 32768, 5, 9}, | 422 | {128, 32768, 5, 9}, |
@@ -470,7 +470,7 @@ static int __devinit uli_agp_init(struct pci_dev *pdev) | |||
470 | } | 470 | } |
471 | 471 | ||
472 | 472 | ||
473 | static struct aper_size_info_32 nforce3_sizes[5] = | 473 | static const struct aper_size_info_32 nforce3_sizes[5] = |
474 | { | 474 | { |
475 | {512, 131072, 7, 0x00000000 }, | 475 | {512, 131072, 7, 0x00000000 }, |
476 | {256, 65536, 6, 0x00000008 }, | 476 | {256, 65536, 6, 0x00000008 }, |
diff --git a/drivers/char/agp/backend.c b/drivers/char/agp/backend.c index 27bca34b4a65..80ee17a8fc23 100644 --- a/drivers/char/agp/backend.c +++ b/drivers/char/agp/backend.c | |||
@@ -97,7 +97,7 @@ void agp_backend_release(struct agp_bridge_data *bridge) | |||
97 | EXPORT_SYMBOL(agp_backend_release); | 97 | EXPORT_SYMBOL(agp_backend_release); |
98 | 98 | ||
99 | 99 | ||
100 | static struct { int mem, agp; } maxes_table[] = { | 100 | static const struct { int mem, agp; } maxes_table[] = { |
101 | {0, 0}, | 101 | {0, 0}, |
102 | {32, 4}, | 102 | {32, 4}, |
103 | {64, 28}, | 103 | {64, 28}, |
diff --git a/drivers/char/agp/via-agp.c b/drivers/char/agp/via-agp.c index c847df575cf5..97b0a890ba7f 100644 --- a/drivers/char/agp/via-agp.c +++ b/drivers/char/agp/via-agp.c | |||
@@ -371,6 +371,11 @@ static struct agp_device_ids via_agp_device_ids[] __devinitdata = | |||
371 | .device_id = PCI_DEVICE_ID_VIA_3296_0, | 371 | .device_id = PCI_DEVICE_ID_VIA_3296_0, |
372 | .chipset_name = "P4M800", | 372 | .chipset_name = "P4M800", |
373 | }, | 373 | }, |
374 | /* P4M800CE */ | ||
375 | { | ||
376 | .device_id = PCI_DEVICE_ID_VIA_P4M800CE, | ||
377 | .chipset_name = "P4M800CE", | ||
378 | }, | ||
374 | 379 | ||
375 | { }, /* dummy final entry, always present */ | 380 | { }, /* dummy final entry, always present */ |
376 | }; | 381 | }; |
@@ -511,6 +516,7 @@ static struct pci_device_id agp_via_pci_table[] = { | |||
511 | ID(PCI_DEVICE_ID_VIA_3269_0), | 516 | ID(PCI_DEVICE_ID_VIA_3269_0), |
512 | ID(PCI_DEVICE_ID_VIA_83_87XX_1), | 517 | ID(PCI_DEVICE_ID_VIA_83_87XX_1), |
513 | ID(PCI_DEVICE_ID_VIA_3296_0), | 518 | ID(PCI_DEVICE_ID_VIA_3296_0), |
519 | ID(PCI_DEVICE_ID_VIA_P4M800CE), | ||
514 | { } | 520 | { } |
515 | }; | 521 | }; |
516 | 522 | ||
diff --git a/drivers/i2c/busses/i2c-ixp2000.c b/drivers/i2c/busses/i2c-ixp2000.c index cef024a7d048..cd6f45d186ab 100644 --- a/drivers/i2c/busses/i2c-ixp2000.c +++ b/drivers/i2c/busses/i2c-ixp2000.c | |||
@@ -36,8 +36,6 @@ | |||
36 | #include <asm/hardware.h> /* Pick up IXP2000-specific bits */ | 36 | #include <asm/hardware.h> /* Pick up IXP2000-specific bits */ |
37 | #include <asm/arch/gpio.h> | 37 | #include <asm/arch/gpio.h> |
38 | 38 | ||
39 | static struct device_driver ixp2000_i2c_driver; | ||
40 | |||
41 | static inline int ixp2000_scl_pin(void *data) | 39 | static inline int ixp2000_scl_pin(void *data) |
42 | { | 40 | { |
43 | return ((struct ixp2000_i2c_pins*)data)->scl_pin; | 41 | return ((struct ixp2000_i2c_pins*)data)->scl_pin; |
@@ -120,7 +118,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev) | |||
120 | drv_data->algo_data.timeout = 100; | 118 | drv_data->algo_data.timeout = 100; |
121 | 119 | ||
122 | drv_data->adapter.id = I2C_HW_B_IXP2000, | 120 | drv_data->adapter.id = I2C_HW_B_IXP2000, |
123 | strlcpy(drv_data->adapter.name, ixp2000_i2c_driver.name, | 121 | strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name, |
124 | I2C_NAME_SIZE); | 122 | I2C_NAME_SIZE); |
125 | drv_data->adapter.algo_data = &drv_data->algo_data, | 123 | drv_data->adapter.algo_data = &drv_data->algo_data, |
126 | 124 | ||
@@ -132,7 +130,7 @@ static int ixp2000_i2c_probe(struct platform_device *plat_dev) | |||
132 | gpio_line_set(gpio->sda_pin, 0); | 130 | gpio_line_set(gpio->sda_pin, 0); |
133 | 131 | ||
134 | if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) { | 132 | if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) { |
135 | dev_err(dev, "Could not install, error %d\n", err); | 133 | dev_err(&plat_dev->dev, "Could not install, error %d\n", err); |
136 | kfree(drv_data); | 134 | kfree(drv_data); |
137 | return err; | 135 | return err; |
138 | } | 136 | } |
diff --git a/drivers/i2c/busses/i2c-ixp4xx.c b/drivers/i2c/busses/i2c-ixp4xx.c index f87220be3c87..e422d8b2d4d6 100644 --- a/drivers/i2c/busses/i2c-ixp4xx.c +++ b/drivers/i2c/busses/i2c-ixp4xx.c | |||
@@ -35,8 +35,6 @@ | |||
35 | 35 | ||
36 | #include <asm/hardware.h> /* Pick up IXP4xx-specific bits */ | 36 | #include <asm/hardware.h> /* Pick up IXP4xx-specific bits */ |
37 | 37 | ||
38 | static struct platform_driver ixp4xx_i2c_driver; | ||
39 | |||
40 | static inline int ixp4xx_scl_pin(void *data) | 38 | static inline int ixp4xx_scl_pin(void *data) |
41 | { | 39 | { |
42 | return ((struct ixp4xx_i2c_pins*)data)->scl_pin; | 40 | return ((struct ixp4xx_i2c_pins*)data)->scl_pin; |
@@ -128,7 +126,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
128 | drv_data->algo_data.timeout = 100; | 126 | drv_data->algo_data.timeout = 100; |
129 | 127 | ||
130 | drv_data->adapter.id = I2C_HW_B_IXP4XX; | 128 | drv_data->adapter.id = I2C_HW_B_IXP4XX; |
131 | strlcpy(drv_data->adapter.name, ixp4xx_i2c_driver.driver.name, | 129 | strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name, |
132 | I2C_NAME_SIZE); | 130 | I2C_NAME_SIZE); |
133 | drv_data->adapter.algo_data = &drv_data->algo_data; | 131 | drv_data->adapter.algo_data = &drv_data->algo_data; |
134 | 132 | ||
@@ -140,8 +138,7 @@ static int ixp4xx_i2c_probe(struct platform_device *plat_dev) | |||
140 | gpio_line_set(gpio->sda_pin, 0); | 138 | gpio_line_set(gpio->sda_pin, 0); |
141 | 139 | ||
142 | if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { | 140 | if ((err = i2c_bit_add_bus(&drv_data->adapter) != 0)) { |
143 | printk(KERN_ERR "ERROR: Could not install %s\n", | 141 | printk(KERN_ERR "ERROR: Could not install %s\n", plat_dev->dev.bus_id); |
144 | plat_dev->dev.bus_id); | ||
145 | 142 | ||
146 | kfree(drv_data); | 143 | kfree(drv_data); |
147 | return err; | 144 | return err; |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index ed2bc87f475b..31e649a9ff71 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -625,7 +625,7 @@ config BLK_DEV_NS87415 | |||
625 | tristate "NS87415 chipset support" | 625 | tristate "NS87415 chipset support" |
626 | help | 626 | help |
627 | This driver adds detection and support for the NS87415 chip | 627 | This driver adds detection and support for the NS87415 chip |
628 | (used in SPARC64, among others). | 628 | (used mainly on SPARC64 and PA-RISC machines). |
629 | 629 | ||
630 | Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>. | 630 | Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>. |
631 | 631 | ||
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index c2f47923d174..9455e42abb23 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -3328,8 +3328,8 @@ static ide_proc_entry_t idecd_proc[] = { | |||
3328 | #endif | 3328 | #endif |
3329 | 3329 | ||
3330 | static ide_driver_t ide_cdrom_driver = { | 3330 | static ide_driver_t ide_cdrom_driver = { |
3331 | .owner = THIS_MODULE, | ||
3332 | .gen_driver = { | 3331 | .gen_driver = { |
3332 | .owner = THIS_MODULE, | ||
3333 | .name = "ide-cdrom", | 3333 | .name = "ide-cdrom", |
3334 | .bus = &ide_bus_type, | 3334 | .bus = &ide_bus_type, |
3335 | .probe = ide_cd_probe, | 3335 | .probe = ide_cd_probe, |
@@ -3510,8 +3510,8 @@ static void __exit ide_cdrom_exit(void) | |||
3510 | { | 3510 | { |
3511 | driver_unregister(&ide_cdrom_driver.gen_driver); | 3511 | driver_unregister(&ide_cdrom_driver.gen_driver); |
3512 | } | 3512 | } |
3513 | 3513 | ||
3514 | static int ide_cdrom_init(void) | 3514 | static int __init ide_cdrom_init(void) |
3515 | { | 3515 | { |
3516 | return driver_register(&ide_cdrom_driver.gen_driver); | 3516 | return driver_register(&ide_cdrom_driver.gen_driver); |
3517 | } | 3517 | } |
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index e827b39e4b3c..f4e3d3527b0e 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -1089,8 +1089,8 @@ static void ide_device_shutdown(struct device *dev) | |||
1089 | } | 1089 | } |
1090 | 1090 | ||
1091 | static ide_driver_t idedisk_driver = { | 1091 | static ide_driver_t idedisk_driver = { |
1092 | .owner = THIS_MODULE, | ||
1093 | .gen_driver = { | 1092 | .gen_driver = { |
1093 | .owner = THIS_MODULE, | ||
1094 | .name = "ide-disk", | 1094 | .name = "ide-disk", |
1095 | .bus = &ide_bus_type, | 1095 | .bus = &ide_bus_type, |
1096 | .probe = ide_disk_probe, | 1096 | .probe = ide_disk_probe, |
@@ -1266,7 +1266,7 @@ static void __exit idedisk_exit (void) | |||
1266 | driver_unregister(&idedisk_driver.gen_driver); | 1266 | driver_unregister(&idedisk_driver.gen_driver); |
1267 | } | 1267 | } |
1268 | 1268 | ||
1269 | static int idedisk_init (void) | 1269 | static int __init idedisk_init(void) |
1270 | { | 1270 | { |
1271 | return driver_register(&idedisk_driver.gen_driver); | 1271 | return driver_register(&idedisk_driver.gen_driver); |
1272 | } | 1272 | } |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index f615ab759962..9e293c8063dc 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -1925,8 +1925,8 @@ static ide_proc_entry_t idefloppy_proc[] = { | |||
1925 | static int ide_floppy_probe(struct device *); | 1925 | static int ide_floppy_probe(struct device *); |
1926 | 1926 | ||
1927 | static ide_driver_t idefloppy_driver = { | 1927 | static ide_driver_t idefloppy_driver = { |
1928 | .owner = THIS_MODULE, | ||
1929 | .gen_driver = { | 1928 | .gen_driver = { |
1929 | .owner = THIS_MODULE, | ||
1930 | .name = "ide-floppy", | 1930 | .name = "ide-floppy", |
1931 | .bus = &ide_bus_type, | 1931 | .bus = &ide_bus_type, |
1932 | .probe = ide_floppy_probe, | 1932 | .probe = ide_floppy_probe, |
@@ -2191,10 +2191,7 @@ static void __exit idefloppy_exit (void) | |||
2191 | driver_unregister(&idefloppy_driver.gen_driver); | 2191 | driver_unregister(&idefloppy_driver.gen_driver); |
2192 | } | 2192 | } |
2193 | 2193 | ||
2194 | /* | 2194 | static int __init idefloppy_init(void) |
2195 | * idefloppy_init will register the driver for each floppy. | ||
2196 | */ | ||
2197 | static int idefloppy_init (void) | ||
2198 | { | 2195 | { |
2199 | printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); | 2196 | printk("ide-floppy driver " IDEFLOPPY_VERSION "\n"); |
2200 | return driver_register(&idefloppy_driver.gen_driver); | 2197 | return driver_register(&idefloppy_driver.gen_driver); |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 5275cbb1afe9..ecfafcdafea4 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -1629,12 +1629,6 @@ EXPORT_SYMBOL(ide_init_drive_cmd); | |||
1629 | * for the new rq to be completed. This is VERY DANGEROUS, and is | 1629 | * for the new rq to be completed. This is VERY DANGEROUS, and is |
1630 | * intended for careful use by the ATAPI tape/cdrom driver code. | 1630 | * intended for careful use by the ATAPI tape/cdrom driver code. |
1631 | * | 1631 | * |
1632 | * If action is ide_next, then the rq is queued immediately after | ||
1633 | * the currently-being-processed-request (if any), and the function | ||
1634 | * returns without waiting for the new rq to be completed. As above, | ||
1635 | * This is VERY DANGEROUS, and is intended for careful use by the | ||
1636 | * ATAPI tape/cdrom driver code. | ||
1637 | * | ||
1638 | * If action is ide_end, then the rq is queued at the end of the | 1632 | * If action is ide_end, then the rq is queued at the end of the |
1639 | * request queue, and the function returns immediately without waiting | 1633 | * request queue, and the function returns immediately without waiting |
1640 | * for the new rq to be completed. This is again intended for careful | 1634 | * for the new rq to be completed. This is again intended for careful |
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index b09a6537c7a8..41d46dbe6c24 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
@@ -410,10 +410,10 @@ void ide_toggle_bounce(ide_drive_t *drive, int on) | |||
410 | { | 410 | { |
411 | u64 addr = BLK_BOUNCE_HIGH; /* dma64_addr_t */ | 411 | u64 addr = BLK_BOUNCE_HIGH; /* dma64_addr_t */ |
412 | 412 | ||
413 | if (on && drive->media == ide_disk) { | 413 | if (!PCI_DMA_BUS_IS_PHYS) { |
414 | if (!PCI_DMA_BUS_IS_PHYS) | 414 | addr = BLK_BOUNCE_ANY; |
415 | addr = BLK_BOUNCE_ANY; | 415 | } else if (on && drive->media == ide_disk) { |
416 | else if (HWIF(drive)->pci_dev) | 416 | if (HWIF(drive)->pci_dev) |
417 | addr = HWIF(drive)->pci_dev->dma_mask; | 417 | addr = HWIF(drive)->pci_dev->dma_mask; |
418 | } | 418 | } |
419 | 419 | ||
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 0ac7eb8f40d5..7d7944ed4158 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -4748,8 +4748,8 @@ static ide_proc_entry_t idetape_proc[] = { | |||
4748 | static int ide_tape_probe(struct device *); | 4748 | static int ide_tape_probe(struct device *); |
4749 | 4749 | ||
4750 | static ide_driver_t idetape_driver = { | 4750 | static ide_driver_t idetape_driver = { |
4751 | .owner = THIS_MODULE, | ||
4752 | .gen_driver = { | 4751 | .gen_driver = { |
4752 | .owner = THIS_MODULE, | ||
4753 | .name = "ide-tape", | 4753 | .name = "ide-tape", |
4754 | .bus = &ide_bus_type, | 4754 | .bus = &ide_bus_type, |
4755 | .probe = ide_tape_probe, | 4755 | .probe = ide_tape_probe, |
@@ -4916,10 +4916,7 @@ static void __exit idetape_exit (void) | |||
4916 | unregister_chrdev(IDETAPE_MAJOR, "ht"); | 4916 | unregister_chrdev(IDETAPE_MAJOR, "ht"); |
4917 | } | 4917 | } |
4918 | 4918 | ||
4919 | /* | 4919 | static int __init idetape_init(void) |
4920 | * idetape_init will register the driver for each tape. | ||
4921 | */ | ||
4922 | static int idetape_init (void) | ||
4923 | { | 4920 | { |
4924 | int error = 1; | 4921 | int error = 1; |
4925 | idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape"); | 4922 | idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape"); |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 54f9639c2a8c..62ebefd6394a 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -51,8 +51,6 @@ | |||
51 | #include <asm/uaccess.h> | 51 | #include <asm/uaccess.h> |
52 | #include <asm/io.h> | 52 | #include <asm/io.h> |
53 | 53 | ||
54 | #define DEBUG_TASKFILE 0 /* unset when fixed */ | ||
55 | |||
56 | static void ata_bswap_data (void *buffer, int wcount) | 54 | static void ata_bswap_data (void *buffer, int wcount) |
57 | { | 55 | { |
58 | u16 *p = buffer; | 56 | u16 *p = buffer; |
@@ -765,9 +763,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
765 | ide_hwif_t *hwif = HWIF(drive); | 763 | ide_hwif_t *hwif = HWIF(drive); |
766 | task_struct_t *taskfile = (task_struct_t *) task->tfRegister; | 764 | task_struct_t *taskfile = (task_struct_t *) task->tfRegister; |
767 | hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister; | 765 | hob_struct_t *hobfile = (hob_struct_t *) task->hobRegister; |
768 | #if DEBUG_TASKFILE | ||
769 | u8 status; | ||
770 | #endif | ||
771 | 766 | ||
772 | if (task->data_phase == TASKFILE_MULTI_IN || | 767 | if (task->data_phase == TASKFILE_MULTI_IN || |
773 | task->data_phase == TASKFILE_MULTI_OUT) { | 768 | task->data_phase == TASKFILE_MULTI_OUT) { |
@@ -778,19 +773,13 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
778 | } | 773 | } |
779 | 774 | ||
780 | /* | 775 | /* |
781 | * (ks) Check taskfile in/out flags. | 776 | * (ks) Check taskfile in flags. |
782 | * If set, then execute as it is defined. | 777 | * If set, then execute as it is defined. |
783 | * If not set, then define default settings. | 778 | * If not set, then define default settings. |
784 | * The default values are: | 779 | * The default values are: |
785 | * write and read all taskfile registers (except data) | 780 | * read all taskfile registers (except data) |
786 | * write and read the hob registers (sector,nsector,lcyl,hcyl) | 781 | * read the hob registers (sector, nsector, lcyl, hcyl) |
787 | */ | 782 | */ |
788 | if (task->tf_out_flags.all == 0) { | ||
789 | task->tf_out_flags.all = IDE_TASKFILE_STD_OUT_FLAGS; | ||
790 | if (drive->addressing == 1) | ||
791 | task->tf_out_flags.all |= (IDE_HOB_STD_OUT_FLAGS << 8); | ||
792 | } | ||
793 | |||
794 | if (task->tf_in_flags.all == 0) { | 783 | if (task->tf_in_flags.all == 0) { |
795 | task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; | 784 | task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; |
796 | if (drive->addressing == 1) | 785 | if (drive->addressing == 1) |
@@ -803,16 +792,6 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
803 | hwif->OUTB(drive->ctl, IDE_CONTROL_REG); | 792 | hwif->OUTB(drive->ctl, IDE_CONTROL_REG); |
804 | SELECT_MASK(drive, 0); | 793 | SELECT_MASK(drive, 0); |
805 | 794 | ||
806 | #if DEBUG_TASKFILE | ||
807 | status = hwif->INB(IDE_STATUS_REG); | ||
808 | if (status & 0x80) { | ||
809 | printk("flagged_taskfile -> Bad status. Status = %02x. wait 100 usec ...\n", status); | ||
810 | udelay(100); | ||
811 | status = hwif->INB(IDE_STATUS_REG); | ||
812 | printk("flagged_taskfile -> Status = %02x\n", status); | ||
813 | } | ||
814 | #endif | ||
815 | |||
816 | if (task->tf_out_flags.b.data) { | 795 | if (task->tf_out_flags.b.data) { |
817 | u16 data = taskfile->data + (hobfile->data << 8); | 796 | u16 data = taskfile->data + (hobfile->data << 8); |
818 | hwif->OUTW(data, IDE_DATA_REG); | 797 | hwif->OUTW(data, IDE_DATA_REG); |
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 52cadc005d72..a21b1e11eef4 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -65,23 +65,6 @@ static struct chipset_bus_clock_list_entry aec6xxx_34_base [] = { | |||
65 | #define BUSCLOCK(D) \ | 65 | #define BUSCLOCK(D) \ |
66 | ((struct chipset_bus_clock_list_entry *) pci_get_drvdata((D))) | 66 | ((struct chipset_bus_clock_list_entry *) pci_get_drvdata((D))) |
67 | 67 | ||
68 | #if 0 | ||
69 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) { | ||
70 | (void) pci_read_config_byte(dev, 0x54, &art); | ||
71 | p += sprintf(p, "DMA Mode: %s(%s)", | ||
72 | (c0&0x20)?((art&0x03)?"UDMA":" DMA"):" PIO", | ||
73 | (art&0x02)?"2":(art&0x01)?"1":"0"); | ||
74 | p += sprintf(p, " %s(%s)", | ||
75 | (c0&0x40)?((art&0x0c)?"UDMA":" DMA"):" PIO", | ||
76 | (art&0x08)?"2":(art&0x04)?"1":"0"); | ||
77 | p += sprintf(p, " %s(%s)", | ||
78 | (c1&0x20)?((art&0x30)?"UDMA":" DMA"):" PIO", | ||
79 | (art&0x20)?"2":(art&0x10)?"1":"0"); | ||
80 | p += sprintf(p, " %s(%s)\n", | ||
81 | (c1&0x40)?((art&0xc0)?"UDMA":" DMA"):" PIO", | ||
82 | (art&0x80)?"2":(art&0x40)?"1":"0"); | ||
83 | } else { | ||
84 | #endif | ||
85 | 68 | ||
86 | /* | 69 | /* |
87 | * TO DO: active tuning and correction of cards without a bios. | 70 | * TO DO: active tuning and correction of cards without a bios. |
@@ -112,13 +95,9 @@ static u8 aec62xx_ratemask (ide_drive_t *drive) | |||
112 | switch(hwif->pci_dev->device) { | 95 | switch(hwif->pci_dev->device) { |
113 | case PCI_DEVICE_ID_ARTOP_ATP865: | 96 | case PCI_DEVICE_ID_ARTOP_ATP865: |
114 | case PCI_DEVICE_ID_ARTOP_ATP865R: | 97 | case PCI_DEVICE_ID_ARTOP_ATP865R: |
115 | #if 0 | ||
116 | mode = (hwif->INB(hwif->dma_master) & 0x10) ? 4 : 3; | ||
117 | #else | ||
118 | mode = (hwif->INB(((hwif->channel) ? | 98 | mode = (hwif->INB(((hwif->channel) ? |
119 | hwif->mate->dma_status : | 99 | hwif->mate->dma_status : |
120 | hwif->dma_status)) & 0x10) ? 4 : 3; | 100 | hwif->dma_status)) & 0x10) ? 4 : 3; |
121 | #endif | ||
122 | break; | 101 | break; |
123 | case PCI_DEVICE_ID_ARTOP_ATP860: | 102 | case PCI_DEVICE_ID_ARTOP_ATP860: |
124 | case PCI_DEVICE_ID_ARTOP_ATP860R: | 103 | case PCI_DEVICE_ID_ARTOP_ATP860R: |
@@ -263,35 +242,9 @@ static int aec62xx_irq_timeout (ide_drive_t *drive) | |||
263 | case PCI_DEVICE_ID_ARTOP_ATP865: | 242 | case PCI_DEVICE_ID_ARTOP_ATP865: |
264 | case PCI_DEVICE_ID_ARTOP_ATP865R: | 243 | case PCI_DEVICE_ID_ARTOP_ATP865R: |
265 | printk(" AEC62XX time out "); | 244 | printk(" AEC62XX time out "); |
266 | #if 0 | ||
267 | { | ||
268 | int i = 0; | ||
269 | u8 reg49h = 0; | ||
270 | pci_read_config_byte(HWIF(drive)->pci_dev, 0x49, ®49h); | ||
271 | for (i=0;i<256;i++) | ||
272 | pci_write_config_byte(HWIF(drive)->pci_dev, 0x49, reg49h|0x10); | ||
273 | pci_write_config_byte(HWIF(drive)->pci_dev, 0x49, reg49h & ~0x10); | ||
274 | } | ||
275 | return 0; | ||
276 | #endif | ||
277 | default: | 245 | default: |
278 | break; | 246 | break; |
279 | } | 247 | } |
280 | #if 0 | ||
281 | { | ||
282 | ide_hwif_t *hwif = HWIF(drive); | ||
283 | struct pci_dev *dev = hwif->pci_dev; | ||
284 | u8 tmp1 = 0, tmp2 = 0, mode6 = 0; | ||
285 | |||
286 | pci_read_config_byte(dev, 0x44, &tmp1); | ||
287 | pci_read_config_byte(dev, 0x45, &tmp2); | ||
288 | printk(" AEC6280 r44=%x r45=%x ",tmp1,tmp2); | ||
289 | mode6 = HWIF(drive)->INB(((hwif->channel) ? | ||
290 | hwif->mate->dma_status : | ||
291 | hwif->dma_status)); | ||
292 | printk(" AEC6280 133=%x ", (mode6 & 0x10)); | ||
293 | } | ||
294 | #endif | ||
295 | return 0; | 248 | return 0; |
296 | } | 249 | } |
297 | 250 | ||
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 6cf49394a80f..cf84350efc55 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -876,10 +876,15 @@ static ide_pci_device_t ali15x3_chipset __devinitdata = { | |||
876 | 876 | ||
877 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 877 | static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
878 | { | 878 | { |
879 | static struct pci_device_id ati_rs100[] = { | ||
880 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100) }, | ||
881 | { }, | ||
882 | }; | ||
883 | |||
879 | ide_pci_device_t *d = &ali15x3_chipset; | 884 | ide_pci_device_t *d = &ali15x3_chipset; |
880 | 885 | ||
881 | if(pci_find_device(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS100, NULL)) | 886 | if (pci_dev_present(ati_rs100)) |
882 | printk(KERN_ERR "Warning: ATI Radeon IGP Northbridge is not yet fully tested.\n"); | 887 | printk(KERN_WARNING "alim15x3: ATI Radeon IGP Northbridge is not yet fully tested.\n"); |
883 | 888 | ||
884 | #if defined(CONFIG_SPARC64) | 889 | #if defined(CONFIG_SPARC64) |
885 | d->init_hwif = init_hwif_common_ali15x3; | 890 | d->init_hwif = init_hwif_common_ali15x3; |
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index 7dc24682d197..ea3c52cc8ac1 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -222,10 +222,9 @@ static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_devic | |||
222 | 222 | ||
223 | /* We must not grab the entire device, it has 'ISA' space in its | 223 | /* We must not grab the entire device, it has 'ISA' space in its |
224 | BARS too and we will freak out other bits of the kernel */ | 224 | BARS too and we will freak out other bits of the kernel */ |
225 | if(pci_enable_device_bars(dev, 1<<2)) | 225 | if (pci_enable_device_bars(dev, 1<<2)) { |
226 | { | ||
227 | printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name); | 226 | printk(KERN_WARNING "%s: Unable to enable 55x0.\n", d->name); |
228 | return 1; | 227 | return -ENODEV; |
229 | } | 228 | } |
230 | pci_set_master(dev); | 229 | pci_set_master(dev); |
231 | if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) { | 230 | if (pci_set_dma_mask(dev, DMA_32BIT_MASK)) { |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index 022d244f2eb0..f1ca154dd52c 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -6,7 +6,13 @@ | |||
6 | * | 6 | * |
7 | * May be copied or modified under the terms of the GNU General Public License | 7 | * May be copied or modified under the terms of the GNU General Public License |
8 | * | 8 | * |
9 | * Documentation available under NDA only | 9 | * Documentation for CMD680: |
10 | * http://gkernel.sourceforge.net/specs/sii/sii-0680a-v1.31.pdf.bz2 | ||
11 | * | ||
12 | * Documentation for SiI 3112: | ||
13 | * http://gkernel.sourceforge.net/specs/sii/3112A_SiI-DS-0095-B2.pdf.bz2 | ||
14 | * | ||
15 | * Errata and other documentation only available under NDA. | ||
10 | * | 16 | * |
11 | * | 17 | * |
12 | * FAQ Items: | 18 | * FAQ Items: |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index 16b3e2d8bfb1..75a2253a3e68 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
@@ -87,6 +87,7 @@ static const struct { | |||
87 | u8 chipset_family; | 87 | u8 chipset_family; |
88 | u8 flags; | 88 | u8 flags; |
89 | } SiSHostChipInfo[] = { | 89 | } SiSHostChipInfo[] = { |
90 | { "SiS965", PCI_DEVICE_ID_SI_965, ATA_133 }, | ||
90 | { "SiS745", PCI_DEVICE_ID_SI_745, ATA_100 }, | 91 | { "SiS745", PCI_DEVICE_ID_SI_745, ATA_100 }, |
91 | { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100 }, | 92 | { "SiS735", PCI_DEVICE_ID_SI_735, ATA_100 }, |
92 | { "SiS733", PCI_DEVICE_ID_SI_733, ATA_100 }, | 93 | { "SiS733", PCI_DEVICE_ID_SI_733, ATA_100 }, |
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c index a4d099c937ff..7161ce0ef5aa 100644 --- a/drivers/ide/pci/via82cxxx.c +++ b/drivers/ide/pci/via82cxxx.c | |||
@@ -79,6 +79,7 @@ static struct via_isa_bridge { | |||
79 | u8 rev_max; | 79 | u8 rev_max; |
80 | u16 flags; | 80 | u16 flags; |
81 | } via_isa_bridges[] = { | 81 | } via_isa_bridges[] = { |
82 | { "vt6410", PCI_DEVICE_ID_VIA_6410, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | ||
82 | { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 83 | { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
83 | { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 84 | { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
84 | { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, | 85 | { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST }, |
@@ -100,185 +101,14 @@ static struct via_isa_bridge { | |||
100 | { NULL } | 101 | { NULL } |
101 | }; | 102 | }; |
102 | 103 | ||
103 | static struct via_isa_bridge *via_config; | ||
104 | static unsigned int via_80w; | ||
105 | static unsigned int via_clock; | 104 | static unsigned int via_clock; |
106 | static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; | 105 | static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" }; |
107 | 106 | ||
108 | /* | 107 | struct via82cxxx_dev |
109 | * VIA /proc entry. | ||
110 | */ | ||
111 | |||
112 | #if defined(DISPLAY_VIA_TIMINGS) && defined(CONFIG_PROC_FS) | ||
113 | |||
114 | #include <linux/stat.h> | ||
115 | #include <linux/proc_fs.h> | ||
116 | |||
117 | static u8 via_proc = 0; | ||
118 | static unsigned long via_base; | ||
119 | static struct pci_dev *bmide_dev, *isa_dev; | ||
120 | |||
121 | static char *via_control3[] = { "No limit", "64", "128", "192" }; | ||
122 | |||
123 | #define via_print(format, arg...) p += sprintf(p, format "\n" , ## arg) | ||
124 | #define via_print_drive(name, format, arg...)\ | ||
125 | p += sprintf(p, name); for (i = 0; i < 4; i++) p += sprintf(p, format, ## arg); p += sprintf(p, "\n"); | ||
126 | |||
127 | |||
128 | /** | ||
129 | * via_get_info - generate via /proc file | ||
130 | * @buffer: buffer for data | ||
131 | * @addr: set to start of data to use | ||
132 | * @offset: current file offset | ||
133 | * @count: size of read | ||
134 | * | ||
135 | * Fills in buffer with the debugging/configuration information for | ||
136 | * the VIA chipset tuning and attached drives | ||
137 | */ | ||
138 | |||
139 | static int via_get_info(char *buffer, char **addr, off_t offset, int count) | ||
140 | { | 108 | { |
141 | int speed[4], cycle[4], setup[4], active[4], recover[4], den[4], | 109 | struct via_isa_bridge *via_config; |
142 | uen[4], udma[4], umul[4], active8b[4], recover8b[4]; | 110 | unsigned int via_80w; |
143 | struct pci_dev *dev = bmide_dev; | 111 | }; |
144 | unsigned int v, u, i; | ||
145 | int len; | ||
146 | u16 c, w; | ||
147 | u8 t, x; | ||
148 | char *p = buffer; | ||
149 | |||
150 | via_print("----------VIA BusMastering IDE Configuration" | ||
151 | "----------------"); | ||
152 | |||
153 | via_print("Driver Version: 3.38"); | ||
154 | via_print("South Bridge: VIA %s", | ||
155 | via_config->name); | ||
156 | |||
157 | pci_read_config_byte(isa_dev, PCI_REVISION_ID, &t); | ||
158 | pci_read_config_byte(dev, PCI_REVISION_ID, &x); | ||
159 | via_print("Revision: ISA %#x IDE %#x", t, x); | ||
160 | via_print("Highest DMA rate: %s", | ||
161 | via_dma[via_config->flags & VIA_UDMA]); | ||
162 | |||
163 | via_print("BM-DMA base: %#lx", via_base); | ||
164 | via_print("PCI clock: %d.%dMHz", | ||
165 | via_clock / 1000, via_clock / 100 % 10); | ||
166 | |||
167 | pci_read_config_byte(dev, VIA_MISC_1, &t); | ||
168 | via_print("Master Read Cycle IRDY: %dws", | ||
169 | (t & 64) >> 6); | ||
170 | via_print("Master Write Cycle IRDY: %dws", | ||
171 | (t & 32) >> 5); | ||
172 | via_print("BM IDE Status Register Read Retry: %s", | ||
173 | (t & 8) ? "yes" : "no"); | ||
174 | |||
175 | pci_read_config_byte(dev, VIA_MISC_3, &t); | ||
176 | via_print("Max DRDY Pulse Width: %s%s", | ||
177 | via_control3[(t & 0x03)], (t & 0x03) ? " PCI clocks" : ""); | ||
178 | |||
179 | via_print("-----------------------Primary IDE" | ||
180 | "-------Secondary IDE------"); | ||
181 | via_print("Read DMA FIFO flush: %10s%20s", | ||
182 | (t & 0x80) ? "yes" : "no", (t & 0x40) ? "yes" : "no"); | ||
183 | via_print("End Sector FIFO flush: %10s%20s", | ||
184 | (t & 0x20) ? "yes" : "no", (t & 0x10) ? "yes" : "no"); | ||
185 | |||
186 | pci_read_config_byte(dev, VIA_IDE_CONFIG, &t); | ||
187 | via_print("Prefetch Buffer: %10s%20s", | ||
188 | (t & 0x80) ? "yes" : "no", (t & 0x20) ? "yes" : "no"); | ||
189 | via_print("Post Write Buffer: %10s%20s", | ||
190 | (t & 0x40) ? "yes" : "no", (t & 0x10) ? "yes" : "no"); | ||
191 | |||
192 | pci_read_config_byte(dev, VIA_IDE_ENABLE, &t); | ||
193 | via_print("Enabled: %10s%20s", | ||
194 | (t & 0x02) ? "yes" : "no", (t & 0x01) ? "yes" : "no"); | ||
195 | |||
196 | c = inb(via_base + 0x02) | (inb(via_base + 0x0a) << 8); | ||
197 | via_print("Simplex only: %10s%20s", | ||
198 | (c & 0x80) ? "yes" : "no", (c & 0x8000) ? "yes" : "no"); | ||
199 | |||
200 | via_print("Cable Type: %10s%20s", | ||
201 | (via_80w & 1) ? "80w" : "40w", (via_80w & 2) ? "80w" : "40w"); | ||
202 | |||
203 | via_print("-------------------drive0----drive1" | ||
204 | "----drive2----drive3-----"); | ||
205 | |||
206 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); | ||
207 | pci_read_config_dword(dev, VIA_DRIVE_TIMING, &v); | ||
208 | pci_read_config_word(dev, VIA_8BIT_TIMING, &w); | ||
209 | |||
210 | if (via_config->flags & VIA_UDMA) | ||
211 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
212 | else u = 0; | ||
213 | |||
214 | for (i = 0; i < 4; i++) { | ||
215 | |||
216 | setup[i] = ((t >> ((3 - i) << 1)) & 0x3) + 1; | ||
217 | recover8b[i] = ((w >> ((1 - (i >> 1)) << 3)) & 0xf) + 1; | ||
218 | active8b[i] = ((w >> (((1 - (i >> 1)) << 3) + 4)) & 0xf) + 1; | ||
219 | active[i] = ((v >> (((3 - i) << 3) + 4)) & 0xf) + 1; | ||
220 | recover[i] = ((v >> ((3 - i) << 3)) & 0xf) + 1; | ||
221 | udma[i] = ((u >> ((3 - i) << 3)) & 0x7) + 2; | ||
222 | umul[i] = ((u >> (((3 - i) & 2) << 3)) & 0x8) ? 1 : 2; | ||
223 | uen[i] = ((u >> ((3 - i) << 3)) & 0x20); | ||
224 | den[i] = (c & ((i & 1) ? 0x40 : 0x20) << ((i & 2) << 2)); | ||
225 | |||
226 | speed[i] = 2 * via_clock / (active[i] + recover[i]); | ||
227 | cycle[i] = 1000000 * (active[i] + recover[i]) / via_clock; | ||
228 | |||
229 | if (!uen[i] || !den[i]) | ||
230 | continue; | ||
231 | |||
232 | switch (via_config->flags & VIA_UDMA) { | ||
233 | |||
234 | case VIA_UDMA_33: | ||
235 | speed[i] = 2 * via_clock / udma[i]; | ||
236 | cycle[i] = 1000000 * udma[i] / via_clock; | ||
237 | break; | ||
238 | |||
239 | case VIA_UDMA_66: | ||
240 | speed[i] = 4 * via_clock / (udma[i] * umul[i]); | ||
241 | cycle[i] = 500000 * (udma[i] * umul[i]) / via_clock; | ||
242 | break; | ||
243 | |||
244 | case VIA_UDMA_100: | ||
245 | speed[i] = 6 * via_clock / udma[i]; | ||
246 | cycle[i] = 333333 * udma[i] / via_clock; | ||
247 | break; | ||
248 | |||
249 | case VIA_UDMA_133: | ||
250 | speed[i] = 8 * via_clock / udma[i]; | ||
251 | cycle[i] = 250000 * udma[i] / via_clock; | ||
252 | break; | ||
253 | } | ||
254 | } | ||
255 | |||
256 | via_print_drive("Transfer Mode: ", "%10s", | ||
257 | den[i] ? (uen[i] ? "UDMA" : "DMA") : "PIO"); | ||
258 | |||
259 | via_print_drive("Address Setup: ", "%8dns", | ||
260 | 1000000 * setup[i] / via_clock); | ||
261 | via_print_drive("Cmd Active: ", "%8dns", | ||
262 | 1000000 * active8b[i] / via_clock); | ||
263 | via_print_drive("Cmd Recovery: ", "%8dns", | ||
264 | 1000000 * recover8b[i] / via_clock); | ||
265 | via_print_drive("Data Active: ", "%8dns", | ||
266 | 1000000 * active[i] / via_clock); | ||
267 | via_print_drive("Data Recovery: ", "%8dns", | ||
268 | 1000000 * recover[i] / via_clock); | ||
269 | via_print_drive("Cycle Time: ", "%8dns", | ||
270 | cycle[i]); | ||
271 | via_print_drive("Transfer Rate: ", "%4d.%dMB/s", | ||
272 | speed[i] / 1000, speed[i] / 100 % 10); | ||
273 | |||
274 | /* hoping it is less than 4K... */ | ||
275 | len = (p - buffer) - offset; | ||
276 | *addr = buffer + offset; | ||
277 | |||
278 | return len > count ? count : len; | ||
279 | } | ||
280 | |||
281 | #endif /* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */ | ||
282 | 112 | ||
283 | /** | 113 | /** |
284 | * via_set_speed - write timing registers | 114 | * via_set_speed - write timing registers |
@@ -289,11 +119,13 @@ static int via_get_info(char *buffer, char **addr, off_t offset, int count) | |||
289 | * via_set_speed writes timing values to the chipset registers | 119 | * via_set_speed writes timing values to the chipset registers |
290 | */ | 120 | */ |
291 | 121 | ||
292 | static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | 122 | static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing) |
293 | { | 123 | { |
124 | struct pci_dev *dev = hwif->pci_dev; | ||
125 | struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif); | ||
294 | u8 t; | 126 | u8 t; |
295 | 127 | ||
296 | if (~via_config->flags & VIA_BAD_AST) { | 128 | if (~vdev->via_config->flags & VIA_BAD_AST) { |
297 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); | 129 | pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t); |
298 | t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(timing->setup, 1, 4) - 1) << ((3 - dn) << 1)); | 130 | t = (t & ~(3 << ((3 - dn) << 1))) | ((FIT(timing->setup, 1, 4) - 1) << ((3 - dn) << 1)); |
299 | pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t); | 131 | pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t); |
@@ -305,7 +137,7 @@ static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | |||
305 | pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn), | 137 | pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn), |
306 | ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1)); | 138 | ((FIT(timing->active, 1, 16) - 1) << 4) | (FIT(timing->recover, 1, 16) - 1)); |
307 | 139 | ||
308 | switch (via_config->flags & VIA_UDMA) { | 140 | switch (vdev->via_config->flags & VIA_UDMA) { |
309 | case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break; | 141 | case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break; |
310 | case VIA_UDMA_66: t = timing->udma ? (0xe8 | (FIT(timing->udma, 2, 9) - 2)) : 0x0f; break; | 142 | case VIA_UDMA_66: t = timing->udma ? (0xe8 | (FIT(timing->udma, 2, 9) - 2)) : 0x0f; break; |
311 | case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break; | 143 | case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break; |
@@ -329,6 +161,7 @@ static void via_set_speed(struct pci_dev *dev, u8 dn, struct ide_timing *timing) | |||
329 | static int via_set_drive(ide_drive_t *drive, u8 speed) | 161 | static int via_set_drive(ide_drive_t *drive, u8 speed) |
330 | { | 162 | { |
331 | ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); | 163 | ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); |
164 | struct via82cxxx_dev *vdev = ide_get_hwifdata(drive->hwif); | ||
332 | struct ide_timing t, p; | 165 | struct ide_timing t, p; |
333 | unsigned int T, UT; | 166 | unsigned int T, UT; |
334 | 167 | ||
@@ -337,7 +170,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed) | |||
337 | 170 | ||
338 | T = 1000000000 / via_clock; | 171 | T = 1000000000 / via_clock; |
339 | 172 | ||
340 | switch (via_config->flags & VIA_UDMA) { | 173 | switch (vdev->via_config->flags & VIA_UDMA) { |
341 | case VIA_UDMA_33: UT = T; break; | 174 | case VIA_UDMA_33: UT = T; break; |
342 | case VIA_UDMA_66: UT = T/2; break; | 175 | case VIA_UDMA_66: UT = T/2; break; |
343 | case VIA_UDMA_100: UT = T/3; break; | 176 | case VIA_UDMA_100: UT = T/3; break; |
@@ -352,7 +185,7 @@ static int via_set_drive(ide_drive_t *drive, u8 speed) | |||
352 | ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); | 185 | ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT); |
353 | } | 186 | } |
354 | 187 | ||
355 | via_set_speed(HWIF(drive)->pci_dev, drive->dn, &t); | 188 | via_set_speed(HWIF(drive), drive->dn, &t); |
356 | 189 | ||
357 | if (!drive->init_speed) | 190 | if (!drive->init_speed) |
358 | drive->init_speed = speed; | 191 | drive->init_speed = speed; |
@@ -390,20 +223,41 @@ static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio) | |||
390 | 223 | ||
391 | static int via82cxxx_ide_dma_check (ide_drive_t *drive) | 224 | static int via82cxxx_ide_dma_check (ide_drive_t *drive) |
392 | { | 225 | { |
393 | u16 w80 = HWIF(drive)->udma_four; | 226 | ide_hwif_t *hwif = HWIF(drive); |
227 | struct via82cxxx_dev *vdev = ide_get_hwifdata(hwif); | ||
228 | u16 w80 = hwif->udma_four; | ||
394 | 229 | ||
395 | u16 speed = ide_find_best_mode(drive, | 230 | u16 speed = ide_find_best_mode(drive, |
396 | XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | | 231 | XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA | |
397 | (via_config->flags & VIA_UDMA ? XFER_UDMA : 0) | | 232 | (vdev->via_config->flags & VIA_UDMA ? XFER_UDMA : 0) | |
398 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) | | 233 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) | |
399 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0) | | 234 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0) | |
400 | (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0)); | 235 | (w80 && (vdev->via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0)); |
401 | 236 | ||
402 | via_set_drive(drive, speed); | 237 | via_set_drive(drive, speed); |
403 | 238 | ||
404 | if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) | 239 | if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) |
405 | return HWIF(drive)->ide_dma_on(drive); | 240 | return hwif->ide_dma_on(drive); |
406 | return HWIF(drive)->ide_dma_off_quietly(drive); | 241 | return hwif->ide_dma_off_quietly(drive); |
242 | } | ||
243 | |||
244 | static struct via_isa_bridge *via_config_find(struct pci_dev **isa) | ||
245 | { | ||
246 | struct via_isa_bridge *via_config; | ||
247 | u8 t; | ||
248 | |||
249 | for (via_config = via_isa_bridges; via_config->id; via_config++) | ||
250 | if ((*isa = pci_find_device(PCI_VENDOR_ID_VIA + | ||
251 | !!(via_config->flags & VIA_BAD_ID), | ||
252 | via_config->id, NULL))) { | ||
253 | |||
254 | pci_read_config_byte(*isa, PCI_REVISION_ID, &t); | ||
255 | if (t >= via_config->rev_min && | ||
256 | t <= via_config->rev_max) | ||
257 | break; | ||
258 | } | ||
259 | |||
260 | return via_config; | ||
407 | } | 261 | } |
408 | 262 | ||
409 | /** | 263 | /** |
@@ -418,82 +272,28 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive) | |||
418 | static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) | 272 | static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const char *name) |
419 | { | 273 | { |
420 | struct pci_dev *isa = NULL; | 274 | struct pci_dev *isa = NULL; |
275 | struct via_isa_bridge *via_config; | ||
421 | u8 t, v; | 276 | u8 t, v; |
422 | unsigned int u; | 277 | unsigned int u; |
423 | int i; | ||
424 | 278 | ||
425 | /* | 279 | /* |
426 | * Find the ISA bridge to see how good the IDE is. | 280 | * Find the ISA bridge to see how good the IDE is. |
427 | */ | 281 | */ |
428 | 282 | via_config = via_config_find(&isa); | |
429 | for (via_config = via_isa_bridges; via_config->id; via_config++) | ||
430 | if ((isa = pci_find_device(PCI_VENDOR_ID_VIA + | ||
431 | !!(via_config->flags & VIA_BAD_ID), | ||
432 | via_config->id, NULL))) { | ||
433 | |||
434 | pci_read_config_byte(isa, PCI_REVISION_ID, &t); | ||
435 | if (t >= via_config->rev_min && | ||
436 | t <= via_config->rev_max) | ||
437 | break; | ||
438 | } | ||
439 | |||
440 | if (!via_config->id) { | 283 | if (!via_config->id) { |
441 | printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n"); | 284 | printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, disabling DMA.\n"); |
442 | return -ENODEV; | 285 | return -ENODEV; |
443 | } | 286 | } |
444 | 287 | ||
445 | /* | 288 | /* |
446 | * Check 80-wire cable presence and setup Clk66. | 289 | * Setup or disable Clk66 if appropriate |
447 | */ | 290 | */ |
448 | 291 | ||
449 | switch (via_config->flags & VIA_UDMA) { | 292 | if ((via_config->flags & VIA_UDMA) == VIA_UDMA_66) { |
450 | 293 | /* Enable Clk66 */ | |
451 | case VIA_UDMA_66: | 294 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); |
452 | /* Enable Clk66 */ | 295 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008); |
453 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | 296 | } else if (via_config->flags & VIA_BAD_CLK66) { |
454 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008); | ||
455 | for (i = 24; i >= 0; i -= 8) | ||
456 | if (((u >> (i & 16)) & 8) && | ||
457 | ((u >> i) & 0x20) && | ||
458 | (((u >> i) & 7) < 2)) { | ||
459 | /* | ||
460 | * 2x PCI clock and | ||
461 | * UDMA w/ < 3T/cycle | ||
462 | */ | ||
463 | via_80w |= (1 << (1 - (i >> 4))); | ||
464 | } | ||
465 | break; | ||
466 | |||
467 | case VIA_UDMA_100: | ||
468 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
469 | for (i = 24; i >= 0; i -= 8) | ||
470 | if (((u >> i) & 0x10) || | ||
471 | (((u >> i) & 0x20) && | ||
472 | (((u >> i) & 7) < 4))) { | ||
473 | /* BIOS 80-wire bit or | ||
474 | * UDMA w/ < 60ns/cycle | ||
475 | */ | ||
476 | via_80w |= (1 << (1 - (i >> 4))); | ||
477 | } | ||
478 | break; | ||
479 | |||
480 | case VIA_UDMA_133: | ||
481 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
482 | for (i = 24; i >= 0; i -= 8) | ||
483 | if (((u >> i) & 0x10) || | ||
484 | (((u >> i) & 0x20) && | ||
485 | (((u >> i) & 7) < 6))) { | ||
486 | /* BIOS 80-wire bit or | ||
487 | * UDMA w/ < 60ns/cycle | ||
488 | */ | ||
489 | via_80w |= (1 << (1 - (i >> 4))); | ||
490 | } | ||
491 | break; | ||
492 | |||
493 | } | ||
494 | |||
495 | /* Disable Clk66 */ | ||
496 | if (via_config->flags & VIA_BAD_CLK66) { | ||
497 | /* Would cause trouble on 596a and 686 */ | 297 | /* Would cause trouble on 596a and 686 */ |
498 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | 298 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); |
499 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); | 299 | pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008); |
@@ -560,26 +360,78 @@ static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const | |||
560 | via_dma[via_config->flags & VIA_UDMA], | 360 | via_dma[via_config->flags & VIA_UDMA], |
561 | pci_name(dev)); | 361 | pci_name(dev)); |
562 | 362 | ||
563 | /* | 363 | return 0; |
564 | * Setup /proc/ide/via entry. | 364 | } |
565 | */ | 365 | |
366 | /* | ||
367 | * Check and handle 80-wire cable presence | ||
368 | */ | ||
369 | static void __devinit via_cable_detect(struct pci_dev *dev, struct via82cxxx_dev *vdev) | ||
370 | { | ||
371 | unsigned int u; | ||
372 | int i; | ||
373 | pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); | ||
374 | |||
375 | switch (vdev->via_config->flags & VIA_UDMA) { | ||
376 | |||
377 | case VIA_UDMA_66: | ||
378 | for (i = 24; i >= 0; i -= 8) | ||
379 | if (((u >> (i & 16)) & 8) && | ||
380 | ((u >> i) & 0x20) && | ||
381 | (((u >> i) & 7) < 2)) { | ||
382 | /* | ||
383 | * 2x PCI clock and | ||
384 | * UDMA w/ < 3T/cycle | ||
385 | */ | ||
386 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
387 | } | ||
388 | break; | ||
389 | |||
390 | case VIA_UDMA_100: | ||
391 | for (i = 24; i >= 0; i -= 8) | ||
392 | if (((u >> i) & 0x10) || | ||
393 | (((u >> i) & 0x20) && | ||
394 | (((u >> i) & 7) < 4))) { | ||
395 | /* BIOS 80-wire bit or | ||
396 | * UDMA w/ < 60ns/cycle | ||
397 | */ | ||
398 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
399 | } | ||
400 | break; | ||
401 | |||
402 | case VIA_UDMA_133: | ||
403 | for (i = 24; i >= 0; i -= 8) | ||
404 | if (((u >> i) & 0x10) || | ||
405 | (((u >> i) & 0x20) && | ||
406 | (((u >> i) & 7) < 6))) { | ||
407 | /* BIOS 80-wire bit or | ||
408 | * UDMA w/ < 60ns/cycle | ||
409 | */ | ||
410 | vdev->via_80w |= (1 << (1 - (i >> 4))); | ||
411 | } | ||
412 | break; | ||
566 | 413 | ||
567 | #if defined(DISPLAY_VIA_TIMINGS) && defined(CONFIG_PROC_FS) | ||
568 | if (!via_proc) { | ||
569 | via_base = pci_resource_start(dev, 4); | ||
570 | bmide_dev = dev; | ||
571 | isa_dev = isa; | ||
572 | ide_pci_create_host_proc("via", via_get_info); | ||
573 | via_proc = 1; | ||
574 | } | 414 | } |
575 | #endif /* DISPLAY_VIA_TIMINGS && CONFIG_PROC_FS */ | ||
576 | return 0; | ||
577 | } | 415 | } |
578 | 416 | ||
579 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | 417 | static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) |
580 | { | 418 | { |
419 | struct via82cxxx_dev *vdev = kmalloc(sizeof(struct via82cxxx_dev), | ||
420 | GFP_KERNEL); | ||
421 | struct pci_dev *isa = NULL; | ||
581 | int i; | 422 | int i; |
582 | 423 | ||
424 | if (vdev == NULL) { | ||
425 | printk(KERN_ERR "VP_IDE: out of memory :(\n"); | ||
426 | return; | ||
427 | } | ||
428 | |||
429 | memset(vdev, 0, sizeof(struct via82cxxx_dev)); | ||
430 | ide_set_hwifdata(hwif, vdev); | ||
431 | |||
432 | vdev->via_config = via_config_find(&isa); | ||
433 | via_cable_detect(hwif->pci_dev, vdev); | ||
434 | |||
583 | hwif->autodma = 0; | 435 | hwif->autodma = 0; |
584 | 436 | ||
585 | hwif->tuneproc = &via82cxxx_tune_drive; | 437 | hwif->tuneproc = &via82cxxx_tune_drive; |
@@ -594,7 +446,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
594 | 446 | ||
595 | for (i = 0; i < 2; i++) { | 447 | for (i = 0; i < 2; i++) { |
596 | hwif->drives[i].io_32bit = 1; | 448 | hwif->drives[i].io_32bit = 1; |
597 | hwif->drives[i].unmask = (via_config->flags & VIA_NO_UNMASK) ? 0 : 1; | 449 | hwif->drives[i].unmask = (vdev->via_config->flags & VIA_NO_UNMASK) ? 0 : 1; |
598 | hwif->drives[i].autotune = 1; | 450 | hwif->drives[i].autotune = 1; |
599 | hwif->drives[i].dn = hwif->channel * 2 + i; | 451 | hwif->drives[i].dn = hwif->channel * 2 + i; |
600 | } | 452 | } |
@@ -608,7 +460,7 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
608 | hwif->swdma_mask = 0x07; | 460 | hwif->swdma_mask = 0x07; |
609 | 461 | ||
610 | if (!hwif->udma_four) | 462 | if (!hwif->udma_four) |
611 | hwif->udma_four = (via_80w >> hwif->channel) & 1; | 463 | hwif->udma_four = (vdev->via_80w >> hwif->channel) & 1; |
612 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; | 464 | hwif->ide_dma_check = &via82cxxx_ide_dma_check; |
613 | if (!noautodma) | 465 | if (!noautodma) |
614 | hwif->autodma = 1; | 466 | hwif->autodma = 1; |
@@ -616,24 +468,35 @@ static void __devinit init_hwif_via82cxxx(ide_hwif_t *hwif) | |||
616 | hwif->drives[1].autodma = hwif->autodma; | 468 | hwif->drives[1].autodma = hwif->autodma; |
617 | } | 469 | } |
618 | 470 | ||
619 | static ide_pci_device_t via82cxxx_chipset __devinitdata = { | 471 | static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = { |
620 | .name = "VP_IDE", | 472 | { /* 0 */ |
621 | .init_chipset = init_chipset_via82cxxx, | 473 | .name = "VP_IDE", |
622 | .init_hwif = init_hwif_via82cxxx, | 474 | .init_chipset = init_chipset_via82cxxx, |
623 | .channels = 2, | 475 | .init_hwif = init_hwif_via82cxxx, |
624 | .autodma = NOAUTODMA, | 476 | .channels = 2, |
625 | .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, | 477 | .autodma = NOAUTODMA, |
626 | .bootable = ON_BOARD, | 478 | .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, |
479 | .bootable = ON_BOARD | ||
480 | },{ /* 1 */ | ||
481 | .name = "VP_IDE", | ||
482 | .init_chipset = init_chipset_via82cxxx, | ||
483 | .init_hwif = init_hwif_via82cxxx, | ||
484 | .channels = 2, | ||
485 | .autodma = AUTODMA, | ||
486 | .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, | ||
487 | .bootable = ON_BOARD, | ||
488 | } | ||
627 | }; | 489 | }; |
628 | 490 | ||
629 | static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 491 | static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
630 | { | 492 | { |
631 | return ide_setup_pci_device(dev, &via82cxxx_chipset); | 493 | return ide_setup_pci_device(dev, &via82cxxx_chipsets[id->driver_data]); |
632 | } | 494 | } |
633 | 495 | ||
634 | static struct pci_device_id via_pci_tbl[] = { | 496 | static struct pci_device_id via_pci_tbl[] = { |
635 | { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 497 | { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
636 | { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 498 | { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_1, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, |
499 | { PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_6410, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | ||
637 | { 0, }, | 500 | { 0, }, |
638 | }; | 501 | }; |
639 | MODULE_DEVICE_TABLE(pci, via_pci_tbl); | 502 | MODULE_DEVICE_TABLE(pci, via_pci_tbl); |
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 136911a86e84..16b28357885b 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -1401,20 +1401,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif) | |||
1401 | /* We probe the hwif now */ | 1401 | /* We probe the hwif now */ |
1402 | probe_hwif_init(hwif); | 1402 | probe_hwif_init(hwif); |
1403 | 1403 | ||
1404 | /* The code IDE code will have set hwif->present if we have devices attached, | ||
1405 | * if we don't, the discard the interface except if we are on a media bay slot | ||
1406 | */ | ||
1407 | if (!hwif->present && !pmif->mediabay) { | ||
1408 | printk(KERN_INFO "ide%d: Bus empty, interface released.\n", | ||
1409 | hwif->index); | ||
1410 | default_hwif_iops(hwif); | ||
1411 | for (i = IDE_DATA_OFFSET; i <= IDE_CONTROL_OFFSET; ++i) | ||
1412 | hwif->io_ports[i] = 0; | ||
1413 | hwif->chipset = ide_unknown; | ||
1414 | hwif->noprobe = 1; | ||
1415 | return -ENODEV; | ||
1416 | } | ||
1417 | |||
1418 | return 0; | 1404 | return 0; |
1419 | } | 1405 | } |
1420 | 1406 | ||
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index d4f2111d4364..7ebf992e8c2f 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -787,7 +787,7 @@ static int pre_init = 1; /* Before first ordered IDE scan */ | |||
787 | static LIST_HEAD(ide_pci_drivers); | 787 | static LIST_HEAD(ide_pci_drivers); |
788 | 788 | ||
789 | /* | 789 | /* |
790 | * __ide_register_pci_driver - attach IDE driver | 790 | * __ide_pci_register_driver - attach IDE driver |
791 | * @driver: pci driver | 791 | * @driver: pci driver |
792 | * @module: owner module of the driver | 792 | * @module: owner module of the driver |
793 | * | 793 | * |
diff --git a/drivers/infiniband/core/user_mad.c b/drivers/infiniband/core/user_mad.c index 5ea741f47fc8..e73f81c22381 100644 --- a/drivers/infiniband/core/user_mad.c +++ b/drivers/infiniband/core/user_mad.c | |||
@@ -312,7 +312,7 @@ static ssize_t ib_umad_write(struct file *filp, const char __user *buf, | |||
312 | int ret, length, hdr_len, copy_offset; | 312 | int ret, length, hdr_len, copy_offset; |
313 | int rmpp_active = 0; | 313 | int rmpp_active = 0; |
314 | 314 | ||
315 | if (count < sizeof (struct ib_user_mad)) | 315 | if (count < sizeof (struct ib_user_mad) + IB_MGMT_RMPP_HDR) |
316 | return -EINVAL; | 316 | return -EINVAL; |
317 | 317 | ||
318 | length = count - sizeof (struct ib_user_mad); | 318 | length = count - sizeof (struct ib_user_mad); |
diff --git a/drivers/infiniband/hw/mthca/mthca_qp.c b/drivers/infiniband/hw/mthca/mthca_qp.c index 760c418d5bc9..dd4e13303e96 100644 --- a/drivers/infiniband/hw/mthca/mthca_qp.c +++ b/drivers/infiniband/hw/mthca/mthca_qp.c | |||
@@ -730,15 +730,16 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
730 | } | 730 | } |
731 | 731 | ||
732 | if (attr_mask & IB_QP_ACCESS_FLAGS) { | 732 | if (attr_mask & IB_QP_ACCESS_FLAGS) { |
733 | qp_context->params2 |= | ||
734 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE ? | ||
735 | MTHCA_QP_BIT_RWE : 0); | ||
736 | |||
733 | /* | 737 | /* |
734 | * Only enable RDMA/atomics if we have responder | 738 | * Only enable RDMA reads and atomics if we have |
735 | * resources set to a non-zero value. | 739 | * responder resources set to a non-zero value. |
736 | */ | 740 | */ |
737 | if (qp->resp_depth) { | 741 | if (qp->resp_depth) { |
738 | qp_context->params2 |= | 742 | qp_context->params2 |= |
739 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE ? | ||
740 | MTHCA_QP_BIT_RWE : 0); | ||
741 | qp_context->params2 |= | ||
742 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_READ ? | 743 | cpu_to_be32(attr->qp_access_flags & IB_ACCESS_REMOTE_READ ? |
743 | MTHCA_QP_BIT_RRE : 0); | 744 | MTHCA_QP_BIT_RRE : 0); |
744 | qp_context->params2 |= | 745 | qp_context->params2 |= |
@@ -759,31 +760,27 @@ int mthca_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, int attr_mask) | |||
759 | if (qp->resp_depth && !attr->max_dest_rd_atomic) { | 760 | if (qp->resp_depth && !attr->max_dest_rd_atomic) { |
760 | /* | 761 | /* |
761 | * Lowering our responder resources to zero. | 762 | * Lowering our responder resources to zero. |
762 | * Turn off RDMA/atomics as responder. | 763 | * Turn off reads RDMA and atomics as responder. |
763 | * (RWE/RRE/RAE in params2 already zero) | 764 | * (RRE/RAE in params2 already zero) |
764 | */ | 765 | */ |
765 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RWE | | 766 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RRE | |
766 | MTHCA_QP_OPTPAR_RRE | | ||
767 | MTHCA_QP_OPTPAR_RAE); | 767 | MTHCA_QP_OPTPAR_RAE); |
768 | } | 768 | } |
769 | 769 | ||
770 | if (!qp->resp_depth && attr->max_dest_rd_atomic) { | 770 | if (!qp->resp_depth && attr->max_dest_rd_atomic) { |
771 | /* | 771 | /* |
772 | * Increasing our responder resources from | 772 | * Increasing our responder resources from |
773 | * zero. Turn on RDMA/atomics as appropriate. | 773 | * zero. Turn on RDMA reads and atomics as |
774 | * appropriate. | ||
774 | */ | 775 | */ |
775 | qp_context->params2 |= | 776 | qp_context->params2 |= |
776 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_WRITE ? | ||
777 | MTHCA_QP_BIT_RWE : 0); | ||
778 | qp_context->params2 |= | ||
779 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_READ ? | 777 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_READ ? |
780 | MTHCA_QP_BIT_RRE : 0); | 778 | MTHCA_QP_BIT_RRE : 0); |
781 | qp_context->params2 |= | 779 | qp_context->params2 |= |
782 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_ATOMIC ? | 780 | cpu_to_be32(qp->atomic_rd_en & IB_ACCESS_REMOTE_ATOMIC ? |
783 | MTHCA_QP_BIT_RAE : 0); | 781 | MTHCA_QP_BIT_RAE : 0); |
784 | 782 | ||
785 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RWE | | 783 | qp_param->opt_param_mask |= cpu_to_be32(MTHCA_QP_OPTPAR_RRE | |
786 | MTHCA_QP_OPTPAR_RRE | | ||
787 | MTHCA_QP_OPTPAR_RAE); | 784 | MTHCA_QP_OPTPAR_RAE); |
788 | } | 785 | } |
789 | 786 | ||
@@ -921,10 +918,12 @@ static void mthca_adjust_qp_caps(struct mthca_dev *dev, | |||
921 | else | 918 | else |
922 | qp->max_inline_data = max_data_size - MTHCA_INLINE_HEADER_SIZE; | 919 | qp->max_inline_data = max_data_size - MTHCA_INLINE_HEADER_SIZE; |
923 | 920 | ||
924 | qp->sq.max_gs = max_data_size / sizeof (struct mthca_data_seg); | 921 | qp->sq.max_gs = min_t(int, dev->limits.max_sg, |
925 | qp->rq.max_gs = (min(dev->limits.max_desc_sz, 1 << qp->rq.wqe_shift) - | 922 | max_data_size / sizeof (struct mthca_data_seg)); |
926 | sizeof (struct mthca_next_seg)) / | 923 | qp->rq.max_gs = min_t(int, dev->limits.max_sg, |
927 | sizeof (struct mthca_data_seg); | 924 | (min(dev->limits.max_desc_sz, 1 << qp->rq.wqe_shift) - |
925 | sizeof (struct mthca_next_seg)) / | ||
926 | sizeof (struct mthca_data_seg)); | ||
928 | } | 927 | } |
929 | 928 | ||
930 | /* | 929 | /* |
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c index 321a3a10e69b..ee9fe226ae99 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.c +++ b/drivers/infiniband/ulp/srp/ib_srp.c | |||
@@ -802,13 +802,21 @@ static int srp_post_recv(struct srp_target_port *target) | |||
802 | 802 | ||
803 | /* | 803 | /* |
804 | * Must be called with target->scsi_host->host_lock held to protect | 804 | * Must be called with target->scsi_host->host_lock held to protect |
805 | * req_lim and tx_head. | 805 | * req_lim and tx_head. Lock cannot be dropped between call here and |
806 | * call to __srp_post_send(). | ||
806 | */ | 807 | */ |
807 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) | 808 | static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target) |
808 | { | 809 | { |
809 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) | 810 | if (target->tx_head - target->tx_tail >= SRP_SQ_SIZE) |
810 | return NULL; | 811 | return NULL; |
811 | 812 | ||
813 | if (unlikely(target->req_lim < 1)) { | ||
814 | if (printk_ratelimit()) | ||
815 | printk(KERN_DEBUG PFX "Target has req_lim %d\n", | ||
816 | target->req_lim); | ||
817 | return NULL; | ||
818 | } | ||
819 | |||
812 | return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; | 820 | return target->tx_ring[target->tx_head & SRP_SQ_SIZE]; |
813 | } | 821 | } |
814 | 822 | ||
@@ -823,11 +831,6 @@ static int __srp_post_send(struct srp_target_port *target, | |||
823 | struct ib_send_wr wr, *bad_wr; | 831 | struct ib_send_wr wr, *bad_wr; |
824 | int ret = 0; | 832 | int ret = 0; |
825 | 833 | ||
826 | if (target->req_lim < 1) { | ||
827 | printk(KERN_ERR PFX "Target has req_lim %d\n", target->req_lim); | ||
828 | return -EAGAIN; | ||
829 | } | ||
830 | |||
831 | list.addr = iu->dma; | 834 | list.addr = iu->dma; |
832 | list.length = len; | 835 | list.length = len; |
833 | list.lkey = target->srp_host->mr->lkey; | 836 | list.lkey = target->srp_host->mr->lkey; |
@@ -1417,6 +1420,8 @@ static ssize_t srp_create_target(struct class_device *class_dev, | |||
1417 | if (!target_host) | 1420 | if (!target_host) |
1418 | return -ENOMEM; | 1421 | return -ENOMEM; |
1419 | 1422 | ||
1423 | target_host->max_lun = SRP_MAX_LUN; | ||
1424 | |||
1420 | target = host_to_target(target_host); | 1425 | target = host_to_target(target_host); |
1421 | memset(target, 0, sizeof *target); | 1426 | memset(target, 0, sizeof *target); |
1422 | 1427 | ||
diff --git a/drivers/infiniband/ulp/srp/ib_srp.h b/drivers/infiniband/ulp/srp/ib_srp.h index 4fec28a71367..b564f18caf78 100644 --- a/drivers/infiniband/ulp/srp/ib_srp.h +++ b/drivers/infiniband/ulp/srp/ib_srp.h | |||
@@ -54,6 +54,7 @@ enum { | |||
54 | SRP_PORT_REDIRECT = 1, | 54 | SRP_PORT_REDIRECT = 1, |
55 | SRP_DLID_REDIRECT = 2, | 55 | SRP_DLID_REDIRECT = 2, |
56 | 56 | ||
57 | SRP_MAX_LUN = 512, | ||
57 | SRP_MAX_IU_LEN = 256, | 58 | SRP_MAX_IU_LEN = 256, |
58 | 59 | ||
59 | SRP_RQ_SHIFT = 6, | 60 | SRP_RQ_SHIFT = 6, |
diff --git a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c index 0506934244f0..caac6d63d46f 100644 --- a/drivers/input/gameport/gameport.c +++ b/drivers/input/gameport/gameport.c | |||
@@ -339,14 +339,20 @@ static struct gameport_event *gameport_get_event(void) | |||
339 | return event; | 339 | return event; |
340 | } | 340 | } |
341 | 341 | ||
342 | static void gameport_handle_events(void) | 342 | static void gameport_handle_event(void) |
343 | { | 343 | { |
344 | struct gameport_event *event; | 344 | struct gameport_event *event; |
345 | struct gameport_driver *gameport_drv; | 345 | struct gameport_driver *gameport_drv; |
346 | 346 | ||
347 | down(&gameport_sem); | 347 | down(&gameport_sem); |
348 | 348 | ||
349 | while ((event = gameport_get_event())) { | 349 | /* |
350 | * Note that we handle only one event here to give swsusp | ||
351 | * a chance to freeze kgameportd thread. Gameport events | ||
352 | * should be pretty rare so we are not concerned about | ||
353 | * taking performance hit. | ||
354 | */ | ||
355 | if ((event = gameport_get_event())) { | ||
350 | 356 | ||
351 | switch (event->type) { | 357 | switch (event->type) { |
352 | case GAMEPORT_REGISTER_PORT: | 358 | case GAMEPORT_REGISTER_PORT: |
@@ -433,7 +439,7 @@ static struct gameport *gameport_get_pending_child(struct gameport *parent) | |||
433 | static int gameport_thread(void *nothing) | 439 | static int gameport_thread(void *nothing) |
434 | { | 440 | { |
435 | do { | 441 | do { |
436 | gameport_handle_events(); | 442 | gameport_handle_event(); |
437 | wait_event_interruptible(gameport_wait, | 443 | wait_event_interruptible(gameport_wait, |
438 | kthread_should_stop() || !list_empty(&gameport_event_list)); | 444 | kthread_should_stop() || !list_empty(&gameport_event_list)); |
439 | try_to_freeze(); | 445 | try_to_freeze(); |
diff --git a/drivers/input/input.c b/drivers/input/input.c index c8ae2bb054e0..bdd2a7fc268d 100644 --- a/drivers/input/input.c +++ b/drivers/input/input.c | |||
@@ -536,7 +536,7 @@ static struct attribute *input_dev_attrs[] = { | |||
536 | NULL | 536 | NULL |
537 | }; | 537 | }; |
538 | 538 | ||
539 | static struct attribute_group input_dev_group = { | 539 | static struct attribute_group input_dev_attr_group = { |
540 | .attrs = input_dev_attrs, | 540 | .attrs = input_dev_attrs, |
541 | }; | 541 | }; |
542 | 542 | ||
@@ -717,35 +717,14 @@ struct input_dev *input_allocate_device(void) | |||
717 | return dev; | 717 | return dev; |
718 | } | 718 | } |
719 | 719 | ||
720 | static void input_register_classdevice(struct input_dev *dev) | ||
721 | { | ||
722 | static atomic_t input_no = ATOMIC_INIT(0); | ||
723 | const char *path; | ||
724 | |||
725 | __module_get(THIS_MODULE); | ||
726 | |||
727 | dev->dev = dev->cdev.dev; | ||
728 | |||
729 | snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id), | ||
730 | "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1); | ||
731 | |||
732 | path = kobject_get_path(&dev->cdev.class->subsys.kset.kobj, GFP_KERNEL); | ||
733 | printk(KERN_INFO "input: %s as %s/%s\n", | ||
734 | dev->name ? dev->name : "Unspecified device", | ||
735 | path ? path : "", dev->cdev.class_id); | ||
736 | kfree(path); | ||
737 | |||
738 | class_device_add(&dev->cdev); | ||
739 | sysfs_create_group(&dev->cdev.kobj, &input_dev_group); | ||
740 | sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group); | ||
741 | sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group); | ||
742 | } | ||
743 | |||
744 | int input_register_device(struct input_dev *dev) | 720 | int input_register_device(struct input_dev *dev) |
745 | { | 721 | { |
722 | static atomic_t input_no = ATOMIC_INIT(0); | ||
746 | struct input_handle *handle; | 723 | struct input_handle *handle; |
747 | struct input_handler *handler; | 724 | struct input_handler *handler; |
748 | struct input_device_id *id; | 725 | struct input_device_id *id; |
726 | const char *path; | ||
727 | int error; | ||
749 | 728 | ||
750 | if (!dev->dynalloc) { | 729 | if (!dev->dynalloc) { |
751 | printk(KERN_WARNING "input: device %s is statically allocated, will not register\n" | 730 | printk(KERN_WARNING "input: device %s is statically allocated, will not register\n" |
@@ -773,7 +752,32 @@ int input_register_device(struct input_dev *dev) | |||
773 | INIT_LIST_HEAD(&dev->h_list); | 752 | INIT_LIST_HEAD(&dev->h_list); |
774 | list_add_tail(&dev->node, &input_dev_list); | 753 | list_add_tail(&dev->node, &input_dev_list); |
775 | 754 | ||
776 | input_register_classdevice(dev); | 755 | dev->cdev.class = &input_class; |
756 | snprintf(dev->cdev.class_id, sizeof(dev->cdev.class_id), | ||
757 | "input%ld", (unsigned long) atomic_inc_return(&input_no) - 1); | ||
758 | |||
759 | error = class_device_add(&dev->cdev); | ||
760 | if (error) | ||
761 | return error; | ||
762 | |||
763 | error = sysfs_create_group(&dev->cdev.kobj, &input_dev_attr_group); | ||
764 | if (error) | ||
765 | goto fail1; | ||
766 | |||
767 | error = sysfs_create_group(&dev->cdev.kobj, &input_dev_id_attr_group); | ||
768 | if (error) | ||
769 | goto fail2; | ||
770 | |||
771 | error = sysfs_create_group(&dev->cdev.kobj, &input_dev_caps_attr_group); | ||
772 | if (error) | ||
773 | goto fail3; | ||
774 | |||
775 | __module_get(THIS_MODULE); | ||
776 | |||
777 | path = kobject_get_path(&dev->cdev.kobj, GFP_KERNEL); | ||
778 | printk(KERN_INFO "input: %s as %s\n", | ||
779 | dev->name ? dev->name : "Unspecified device", path ? path : "N/A"); | ||
780 | kfree(path); | ||
777 | 781 | ||
778 | list_for_each_entry(handler, &input_handler_list, node) | 782 | list_for_each_entry(handler, &input_handler_list, node) |
779 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) | 783 | if (!handler->blacklist || !input_match_device(handler->blacklist, dev)) |
@@ -784,6 +788,11 @@ int input_register_device(struct input_dev *dev) | |||
784 | input_wakeup_procfs_readers(); | 788 | input_wakeup_procfs_readers(); |
785 | 789 | ||
786 | return 0; | 790 | return 0; |
791 | |||
792 | fail3: sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group); | ||
793 | fail2: sysfs_remove_group(&dev->cdev.kobj, &input_dev_attr_group); | ||
794 | fail1: class_device_del(&dev->cdev); | ||
795 | return error; | ||
787 | } | 796 | } |
788 | 797 | ||
789 | void input_unregister_device(struct input_dev *dev) | 798 | void input_unregister_device(struct input_dev *dev) |
@@ -805,7 +814,7 @@ void input_unregister_device(struct input_dev *dev) | |||
805 | 814 | ||
806 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group); | 815 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_caps_attr_group); |
807 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group); | 816 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_id_attr_group); |
808 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_group); | 817 | sysfs_remove_group(&dev->cdev.kobj, &input_dev_attr_group); |
809 | class_device_unregister(&dev->cdev); | 818 | class_device_unregister(&dev->cdev); |
810 | 819 | ||
811 | input_wakeup_procfs_readers(); | 820 | input_wakeup_procfs_readers(); |
diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c index 820c7fd9a604..a0256f8de8ef 100644 --- a/drivers/input/keyboard/atkbd.c +++ b/drivers/input/keyboard/atkbd.c | |||
@@ -166,6 +166,9 @@ static unsigned char atkbd_unxlate_table[128] = { | |||
166 | 166 | ||
167 | #define ATKBD_SPECIAL 248 | 167 | #define ATKBD_SPECIAL 248 |
168 | 168 | ||
169 | #define ATKBD_LED_EVENT_BIT 0 | ||
170 | #define ATKBD_REP_EVENT_BIT 1 | ||
171 | |||
169 | static struct { | 172 | static struct { |
170 | unsigned char keycode; | 173 | unsigned char keycode; |
171 | unsigned char set2; | 174 | unsigned char set2; |
@@ -211,6 +214,10 @@ struct atkbd { | |||
211 | unsigned char err_xl; | 214 | unsigned char err_xl; |
212 | unsigned int last; | 215 | unsigned int last; |
213 | unsigned long time; | 216 | unsigned long time; |
217 | |||
218 | struct work_struct event_work; | ||
219 | struct semaphore event_sem; | ||
220 | unsigned long event_mask; | ||
214 | }; | 221 | }; |
215 | 222 | ||
216 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, | 223 | static ssize_t atkbd_attr_show_helper(struct device *dev, char *buf, |
@@ -424,58 +431,86 @@ out: | |||
424 | } | 431 | } |
425 | 432 | ||
426 | /* | 433 | /* |
427 | * Event callback from the input module. Events that change the state of | 434 | * atkbd_event_work() is used to complete processing of events that |
428 | * the hardware are processed here. | 435 | * can not be processed by input_event() which is often called from |
436 | * interrupt context. | ||
429 | */ | 437 | */ |
430 | 438 | ||
431 | static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | 439 | static void atkbd_event_work(void *data) |
432 | { | 440 | { |
433 | struct atkbd *atkbd = dev->private; | ||
434 | const short period[32] = | 441 | const short period[32] = |
435 | { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, | 442 | { 33, 37, 42, 46, 50, 54, 58, 63, 67, 75, 83, 92, 100, 109, 116, 125, |
436 | 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 }; | 443 | 133, 149, 167, 182, 200, 217, 232, 250, 270, 303, 333, 370, 400, 435, 470, 500 }; |
437 | const short delay[4] = | 444 | const short delay[4] = |
438 | { 250, 500, 750, 1000 }; | 445 | { 250, 500, 750, 1000 }; |
446 | |||
447 | struct atkbd *atkbd = data; | ||
448 | struct input_dev *dev = atkbd->dev; | ||
439 | unsigned char param[2]; | 449 | unsigned char param[2]; |
440 | int i, j; | 450 | int i, j; |
441 | 451 | ||
452 | down(&atkbd->event_sem); | ||
453 | |||
454 | if (test_and_clear_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask)) { | ||
455 | param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) | ||
456 | | (test_bit(LED_NUML, dev->led) ? 2 : 0) | ||
457 | | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); | ||
458 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS); | ||
459 | |||
460 | if (atkbd->extra) { | ||
461 | param[0] = 0; | ||
462 | param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) | ||
463 | | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) | ||
464 | | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) | ||
465 | | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) | ||
466 | | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); | ||
467 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS); | ||
468 | } | ||
469 | } | ||
470 | |||
471 | if (test_and_clear_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask)) { | ||
472 | i = j = 0; | ||
473 | while (i < 31 && period[i] < dev->rep[REP_PERIOD]) | ||
474 | i++; | ||
475 | while (j < 3 && delay[j] < dev->rep[REP_DELAY]) | ||
476 | j++; | ||
477 | dev->rep[REP_PERIOD] = period[i]; | ||
478 | dev->rep[REP_DELAY] = delay[j]; | ||
479 | param[0] = i | (j << 5); | ||
480 | ps2_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP); | ||
481 | } | ||
482 | |||
483 | up(&atkbd->event_sem); | ||
484 | } | ||
485 | |||
486 | /* | ||
487 | * Event callback from the input module. Events that change the state of | ||
488 | * the hardware are processed here. If action can not be performed in | ||
489 | * interrupt context it is offloaded to atkbd_event_work. | ||
490 | */ | ||
491 | |||
492 | static int atkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) | ||
493 | { | ||
494 | struct atkbd *atkbd = dev->private; | ||
495 | |||
442 | if (!atkbd->write) | 496 | if (!atkbd->write) |
443 | return -1; | 497 | return -1; |
444 | 498 | ||
445 | switch (type) { | 499 | switch (type) { |
446 | 500 | ||
447 | case EV_LED: | 501 | case EV_LED: |
448 | 502 | set_bit(ATKBD_LED_EVENT_BIT, &atkbd->event_mask); | |
449 | param[0] = (test_bit(LED_SCROLLL, dev->led) ? 1 : 0) | 503 | wmb(); |
450 | | (test_bit(LED_NUML, dev->led) ? 2 : 0) | 504 | schedule_work(&atkbd->event_work); |
451 | | (test_bit(LED_CAPSL, dev->led) ? 4 : 0); | ||
452 | ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETLEDS); | ||
453 | |||
454 | if (atkbd->extra) { | ||
455 | param[0] = 0; | ||
456 | param[1] = (test_bit(LED_COMPOSE, dev->led) ? 0x01 : 0) | ||
457 | | (test_bit(LED_SLEEP, dev->led) ? 0x02 : 0) | ||
458 | | (test_bit(LED_SUSPEND, dev->led) ? 0x04 : 0) | ||
459 | | (test_bit(LED_MISC, dev->led) ? 0x10 : 0) | ||
460 | | (test_bit(LED_MUTE, dev->led) ? 0x20 : 0); | ||
461 | ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_EX_SETLEDS); | ||
462 | } | ||
463 | |||
464 | return 0; | 505 | return 0; |
465 | 506 | ||
466 | case EV_REP: | 507 | case EV_REP: |
467 | 508 | ||
468 | if (atkbd->softrepeat) return 0; | 509 | if (!atkbd->softrepeat) { |
469 | 510 | set_bit(ATKBD_REP_EVENT_BIT, &atkbd->event_mask); | |
470 | i = j = 0; | 511 | wmb(); |
471 | while (i < 31 && period[i] < dev->rep[REP_PERIOD]) | 512 | schedule_work(&atkbd->event_work); |
472 | i++; | 513 | } |
473 | while (j < 3 && delay[j] < dev->rep[REP_DELAY]) | ||
474 | j++; | ||
475 | dev->rep[REP_PERIOD] = period[i]; | ||
476 | dev->rep[REP_DELAY] = delay[j]; | ||
477 | param[0] = i | (j << 5); | ||
478 | ps2_schedule_command(&atkbd->ps2dev, param, ATKBD_CMD_SETREP); | ||
479 | 514 | ||
480 | return 0; | 515 | return 0; |
481 | } | 516 | } |
@@ -810,6 +845,8 @@ static int atkbd_connect(struct serio *serio, struct serio_driver *drv) | |||
810 | 845 | ||
811 | atkbd->dev = dev; | 846 | atkbd->dev = dev; |
812 | ps2_init(&atkbd->ps2dev, serio); | 847 | ps2_init(&atkbd->ps2dev, serio); |
848 | INIT_WORK(&atkbd->event_work, atkbd_event_work, atkbd); | ||
849 | init_MUTEX(&atkbd->event_sem); | ||
813 | 850 | ||
814 | switch (serio->id.type) { | 851 | switch (serio->id.type) { |
815 | 852 | ||
diff --git a/drivers/input/misc/Kconfig b/drivers/input/misc/Kconfig index b3eaac1b35b6..07813fc0523f 100644 --- a/drivers/input/misc/Kconfig +++ b/drivers/input/misc/Kconfig | |||
@@ -40,6 +40,16 @@ config INPUT_M68K_BEEP | |||
40 | tristate "M68k Beeper support" | 40 | tristate "M68k Beeper support" |
41 | depends on M68K | 41 | depends on M68K |
42 | 42 | ||
43 | config INPUT_WISTRON_BTNS | ||
44 | tristate "x86 Wistron laptop button interface" | ||
45 | depends on X86 && !X86_64 | ||
46 | help | ||
47 | Say Y here for support of Winstron laptop button interface, used on | ||
48 | laptops of various brands, including Acer and Fujitsu-Siemens. | ||
49 | |||
50 | To compile this driver as a module, choose M here: the module will | ||
51 | be called wistron_btns. | ||
52 | |||
43 | config INPUT_UINPUT | 53 | config INPUT_UINPUT |
44 | tristate "User level driver support" | 54 | tristate "User level driver support" |
45 | help | 55 | help |
diff --git a/drivers/input/misc/Makefile b/drivers/input/misc/Makefile index f8d01c69f349..ce44cce01285 100644 --- a/drivers/input/misc/Makefile +++ b/drivers/input/misc/Makefile | |||
@@ -9,4 +9,5 @@ obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o | |||
9 | obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o | 9 | obj-$(CONFIG_INPUT_M68K_BEEP) += m68kspkr.o |
10 | obj-$(CONFIG_INPUT_98SPKR) += 98spkr.o | 10 | obj-$(CONFIG_INPUT_98SPKR) += 98spkr.o |
11 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o | 11 | obj-$(CONFIG_INPUT_UINPUT) += uinput.o |
12 | obj-$(CONFIG_INPUT_WISTRON_BTNS) += wistron_btns.o | ||
12 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o | 13 | obj-$(CONFIG_HP_SDC_RTC) += hp_sdc_rtc.o |
diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c index 948c1cc01bc9..546ed9b4901d 100644 --- a/drivers/input/misc/uinput.c +++ b/drivers/input/misc/uinput.c | |||
@@ -92,24 +92,19 @@ static void uinput_request_done(struct uinput_device *udev, struct uinput_reques | |||
92 | { | 92 | { |
93 | /* Mark slot as available */ | 93 | /* Mark slot as available */ |
94 | udev->requests[request->id] = NULL; | 94 | udev->requests[request->id] = NULL; |
95 | wake_up_interruptible(&udev->requests_waitq); | 95 | wake_up(&udev->requests_waitq); |
96 | 96 | ||
97 | complete(&request->done); | 97 | complete(&request->done); |
98 | } | 98 | } |
99 | 99 | ||
100 | static int uinput_request_submit(struct input_dev *dev, struct uinput_request *request) | 100 | static int uinput_request_submit(struct input_dev *dev, struct uinput_request *request) |
101 | { | 101 | { |
102 | int retval; | ||
103 | |||
104 | /* Tell our userspace app about this new request by queueing an input event */ | 102 | /* Tell our userspace app about this new request by queueing an input event */ |
105 | uinput_dev_event(dev, EV_UINPUT, request->code, request->id); | 103 | uinput_dev_event(dev, EV_UINPUT, request->code, request->id); |
106 | 104 | ||
107 | /* Wait for the request to complete */ | 105 | /* Wait for the request to complete */ |
108 | retval = wait_for_completion_interruptible(&request->done); | 106 | wait_for_completion(&request->done); |
109 | if (!retval) | 107 | return request->retval; |
110 | retval = request->retval; | ||
111 | |||
112 | return retval; | ||
113 | } | 108 | } |
114 | 109 | ||
115 | static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect) | 110 | static int uinput_dev_upload_effect(struct input_dev *dev, struct ff_effect *effect) |
@@ -152,67 +147,62 @@ static int uinput_dev_erase_effect(struct input_dev *dev, int effect_id) | |||
152 | return retval; | 147 | return retval; |
153 | } | 148 | } |
154 | 149 | ||
155 | static int uinput_create_device(struct uinput_device *udev) | 150 | static void uinput_destroy_device(struct uinput_device *udev) |
156 | { | 151 | { |
157 | if (!udev->dev->name) { | 152 | const char *name, *phys; |
158 | printk(KERN_DEBUG "%s: write device info first\n", UINPUT_NAME); | 153 | |
159 | return -EINVAL; | 154 | if (udev->dev) { |
155 | name = udev->dev->name; | ||
156 | phys = udev->dev->phys; | ||
157 | if (udev->state == UIST_CREATED) | ||
158 | input_unregister_device(udev->dev); | ||
159 | else | ||
160 | input_free_device(udev->dev); | ||
161 | kfree(name); | ||
162 | kfree(phys); | ||
163 | udev->dev = NULL; | ||
160 | } | 164 | } |
161 | 165 | ||
162 | udev->dev->event = uinput_dev_event; | 166 | udev->state = UIST_NEW_DEVICE; |
163 | udev->dev->upload_effect = uinput_dev_upload_effect; | ||
164 | udev->dev->erase_effect = uinput_dev_erase_effect; | ||
165 | udev->dev->private = udev; | ||
166 | |||
167 | init_waitqueue_head(&udev->waitq); | ||
168 | |||
169 | input_register_device(udev->dev); | ||
170 | |||
171 | set_bit(UIST_CREATED, &udev->state); | ||
172 | |||
173 | return 0; | ||
174 | } | 167 | } |
175 | 168 | ||
176 | static int uinput_destroy_device(struct uinput_device *udev) | 169 | static int uinput_create_device(struct uinput_device *udev) |
177 | { | 170 | { |
178 | if (!test_bit(UIST_CREATED, &udev->state)) { | 171 | int error; |
179 | printk(KERN_WARNING "%s: create the device first\n", UINPUT_NAME); | 172 | |
173 | if (udev->state != UIST_SETUP_COMPLETE) { | ||
174 | printk(KERN_DEBUG "%s: write device info first\n", UINPUT_NAME); | ||
180 | return -EINVAL; | 175 | return -EINVAL; |
181 | } | 176 | } |
182 | 177 | ||
183 | input_unregister_device(udev->dev); | 178 | error = input_register_device(udev->dev); |
179 | if (error) { | ||
180 | uinput_destroy_device(udev); | ||
181 | return error; | ||
182 | } | ||
184 | 183 | ||
185 | clear_bit(UIST_CREATED, &udev->state); | 184 | udev->state = UIST_CREATED; |
186 | 185 | ||
187 | return 0; | 186 | return 0; |
188 | } | 187 | } |
189 | 188 | ||
190 | static int uinput_open(struct inode *inode, struct file *file) | 189 | static int uinput_open(struct inode *inode, struct file *file) |
191 | { | 190 | { |
192 | struct uinput_device *newdev; | 191 | struct uinput_device *newdev; |
193 | struct input_dev *newinput; | ||
194 | 192 | ||
195 | newdev = kmalloc(sizeof(struct uinput_device), GFP_KERNEL); | 193 | newdev = kzalloc(sizeof(struct uinput_device), GFP_KERNEL); |
196 | if (!newdev) | 194 | if (!newdev) |
197 | goto error; | 195 | return -ENOMEM; |
198 | memset(newdev, 0, sizeof(struct uinput_device)); | 196 | |
197 | init_MUTEX(&newdev->sem); | ||
199 | spin_lock_init(&newdev->requests_lock); | 198 | spin_lock_init(&newdev->requests_lock); |
200 | init_waitqueue_head(&newdev->requests_waitq); | 199 | init_waitqueue_head(&newdev->requests_waitq); |
201 | 200 | init_waitqueue_head(&newdev->waitq); | |
202 | newinput = kmalloc(sizeof(struct input_dev), GFP_KERNEL); | 201 | newdev->state = UIST_NEW_DEVICE; |
203 | if (!newinput) | ||
204 | goto cleanup; | ||
205 | memset(newinput, 0, sizeof(struct input_dev)); | ||
206 | |||
207 | newdev->dev = newinput; | ||
208 | 202 | ||
209 | file->private_data = newdev; | 203 | file->private_data = newdev; |
210 | 204 | ||
211 | return 0; | 205 | return 0; |
212 | cleanup: | ||
213 | kfree(newdev); | ||
214 | error: | ||
215 | return -ENOMEM; | ||
216 | } | 206 | } |
217 | 207 | ||
218 | static int uinput_validate_absbits(struct input_dev *dev) | 208 | static int uinput_validate_absbits(struct input_dev *dev) |
@@ -246,34 +236,55 @@ static int uinput_validate_absbits(struct input_dev *dev) | |||
246 | return retval; | 236 | return retval; |
247 | } | 237 | } |
248 | 238 | ||
249 | static int uinput_alloc_device(struct file *file, const char __user *buffer, size_t count) | 239 | static int uinput_allocate_device(struct uinput_device *udev) |
240 | { | ||
241 | udev->dev = input_allocate_device(); | ||
242 | if (!udev->dev) | ||
243 | return -ENOMEM; | ||
244 | |||
245 | udev->dev->event = uinput_dev_event; | ||
246 | udev->dev->upload_effect = uinput_dev_upload_effect; | ||
247 | udev->dev->erase_effect = uinput_dev_erase_effect; | ||
248 | udev->dev->private = udev; | ||
249 | |||
250 | return 0; | ||
251 | } | ||
252 | |||
253 | static int uinput_setup_device(struct uinput_device *udev, const char __user *buffer, size_t count) | ||
250 | { | 254 | { |
251 | struct uinput_user_dev *user_dev; | 255 | struct uinput_user_dev *user_dev; |
252 | struct input_dev *dev; | 256 | struct input_dev *dev; |
253 | struct uinput_device *udev; | ||
254 | char *name; | 257 | char *name; |
255 | int size; | 258 | int size; |
256 | int retval; | 259 | int retval; |
257 | 260 | ||
258 | retval = count; | 261 | if (count != sizeof(struct uinput_user_dev)) |
262 | return -EINVAL; | ||
263 | |||
264 | if (!udev->dev) { | ||
265 | retval = uinput_allocate_device(udev); | ||
266 | if (retval) | ||
267 | return retval; | ||
268 | } | ||
259 | 269 | ||
260 | udev = file->private_data; | ||
261 | dev = udev->dev; | 270 | dev = udev->dev; |
262 | 271 | ||
263 | user_dev = kmalloc(sizeof(struct uinput_user_dev), GFP_KERNEL); | 272 | user_dev = kmalloc(sizeof(struct uinput_user_dev), GFP_KERNEL); |
264 | if (!user_dev) { | 273 | if (!user_dev) |
265 | retval = -ENOMEM; | 274 | return -ENOMEM; |
266 | goto exit; | ||
267 | } | ||
268 | 275 | ||
269 | if (copy_from_user(user_dev, buffer, sizeof(struct uinput_user_dev))) { | 276 | if (copy_from_user(user_dev, buffer, sizeof(struct uinput_user_dev))) { |
270 | retval = -EFAULT; | 277 | retval = -EFAULT; |
271 | goto exit; | 278 | goto exit; |
272 | } | 279 | } |
273 | 280 | ||
274 | kfree(dev->name); | ||
275 | |||
276 | size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1; | 281 | size = strnlen(user_dev->name, UINPUT_MAX_NAME_SIZE) + 1; |
282 | if (!size) { | ||
283 | retval = -EINVAL; | ||
284 | goto exit; | ||
285 | } | ||
286 | |||
287 | kfree(dev->name); | ||
277 | dev->name = name = kmalloc(size, GFP_KERNEL); | 288 | dev->name = name = kmalloc(size, GFP_KERNEL); |
278 | if (!name) { | 289 | if (!name) { |
279 | retval = -ENOMEM; | 290 | retval = -ENOMEM; |
@@ -296,32 +307,50 @@ static int uinput_alloc_device(struct file *file, const char __user *buffer, siz | |||
296 | /* check if absmin/absmax/absfuzz/absflat are filled as | 307 | /* check if absmin/absmax/absfuzz/absflat are filled as |
297 | * told in Documentation/input/input-programming.txt */ | 308 | * told in Documentation/input/input-programming.txt */ |
298 | if (test_bit(EV_ABS, dev->evbit)) { | 309 | if (test_bit(EV_ABS, dev->evbit)) { |
299 | int err = uinput_validate_absbits(dev); | 310 | retval = uinput_validate_absbits(dev); |
300 | if (err < 0) { | 311 | if (retval < 0) |
301 | retval = err; | 312 | goto exit; |
302 | kfree(dev->name); | ||
303 | } | ||
304 | } | 313 | } |
305 | 314 | ||
306 | exit: | 315 | udev->state = UIST_SETUP_COMPLETE; |
316 | retval = count; | ||
317 | |||
318 | exit: | ||
307 | kfree(user_dev); | 319 | kfree(user_dev); |
308 | return retval; | 320 | return retval; |
309 | } | 321 | } |
310 | 322 | ||
323 | static inline ssize_t uinput_inject_event(struct uinput_device *udev, const char __user *buffer, size_t count) | ||
324 | { | ||
325 | struct input_event ev; | ||
326 | |||
327 | if (count != sizeof(struct input_event)) | ||
328 | return -EINVAL; | ||
329 | |||
330 | if (copy_from_user(&ev, buffer, sizeof(struct input_event))) | ||
331 | return -EFAULT; | ||
332 | |||
333 | input_event(udev->dev, ev.type, ev.code, ev.value); | ||
334 | |||
335 | return sizeof(struct input_event); | ||
336 | } | ||
337 | |||
311 | static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) | 338 | static ssize_t uinput_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) |
312 | { | 339 | { |
313 | struct uinput_device *udev = file->private_data; | 340 | struct uinput_device *udev = file->private_data; |
341 | int retval; | ||
342 | |||
343 | retval = down_interruptible(&udev->sem); | ||
344 | if (retval) | ||
345 | return retval; | ||
314 | 346 | ||
315 | if (test_bit(UIST_CREATED, &udev->state)) { | 347 | retval = udev->state == UIST_CREATED ? |
316 | struct input_event ev; | 348 | uinput_inject_event(udev, buffer, count) : |
349 | uinput_setup_device(udev, buffer, count); | ||
317 | 350 | ||
318 | if (copy_from_user(&ev, buffer, sizeof(struct input_event))) | 351 | up(&udev->sem); |
319 | return -EFAULT; | ||
320 | input_event(udev->dev, ev.type, ev.code, ev.value); | ||
321 | } else | ||
322 | count = uinput_alloc_device(file, buffer, count); | ||
323 | 352 | ||
324 | return count; | 353 | return retval; |
325 | } | 354 | } |
326 | 355 | ||
327 | static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) | 356 | static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) |
@@ -329,28 +358,38 @@ static ssize_t uinput_read(struct file *file, char __user *buffer, size_t count, | |||
329 | struct uinput_device *udev = file->private_data; | 358 | struct uinput_device *udev = file->private_data; |
330 | int retval = 0; | 359 | int retval = 0; |
331 | 360 | ||
332 | if (!test_bit(UIST_CREATED, &udev->state)) | 361 | if (udev->state != UIST_CREATED) |
333 | return -ENODEV; | 362 | return -ENODEV; |
334 | 363 | ||
335 | if (udev->head == udev->tail && (file->f_flags & O_NONBLOCK)) | 364 | if (udev->head == udev->tail && (file->f_flags & O_NONBLOCK)) |
336 | return -EAGAIN; | 365 | return -EAGAIN; |
337 | 366 | ||
338 | retval = wait_event_interruptible(udev->waitq, | 367 | retval = wait_event_interruptible(udev->waitq, |
339 | udev->head != udev->tail || !test_bit(UIST_CREATED, &udev->state)); | 368 | udev->head != udev->tail || udev->state != UIST_CREATED); |
340 | if (retval) | 369 | if (retval) |
341 | return retval; | 370 | return retval; |
342 | 371 | ||
343 | if (!test_bit(UIST_CREATED, &udev->state)) | 372 | retval = down_interruptible(&udev->sem); |
344 | return -ENODEV; | 373 | if (retval) |
374 | return retval; | ||
345 | 375 | ||
346 | while ((udev->head != udev->tail) && | 376 | if (udev->state != UIST_CREATED) { |
347 | (retval + sizeof(struct input_event) <= count)) { | 377 | retval = -ENODEV; |
348 | if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event))) | 378 | goto out; |
349 | return -EFAULT; | 379 | } |
380 | |||
381 | while (udev->head != udev->tail && retval + sizeof(struct input_event) <= count) { | ||
382 | if (copy_to_user(buffer + retval, &udev->buff[udev->tail], sizeof(struct input_event))) { | ||
383 | retval = -EFAULT; | ||
384 | goto out; | ||
385 | } | ||
350 | udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; | 386 | udev->tail = (udev->tail + 1) % UINPUT_BUFFER_SIZE; |
351 | retval += sizeof(struct input_event); | 387 | retval += sizeof(struct input_event); |
352 | } | 388 | } |
353 | 389 | ||
390 | out: | ||
391 | up(&udev->sem); | ||
392 | |||
354 | return retval; | 393 | return retval; |
355 | } | 394 | } |
356 | 395 | ||
@@ -366,28 +405,30 @@ static unsigned int uinput_poll(struct file *file, poll_table *wait) | |||
366 | return 0; | 405 | return 0; |
367 | } | 406 | } |
368 | 407 | ||
369 | static int uinput_burn_device(struct uinput_device *udev) | 408 | static int uinput_release(struct inode *inode, struct file *file) |
370 | { | 409 | { |
371 | if (test_bit(UIST_CREATED, &udev->state)) | 410 | struct uinput_device *udev = file->private_data; |
372 | uinput_destroy_device(udev); | ||
373 | 411 | ||
374 | kfree(udev->dev->name); | 412 | uinput_destroy_device(udev); |
375 | kfree(udev->dev->phys); | ||
376 | kfree(udev->dev); | ||
377 | kfree(udev); | 413 | kfree(udev); |
378 | 414 | ||
379 | return 0; | 415 | return 0; |
380 | } | 416 | } |
381 | 417 | ||
382 | static int uinput_close(struct inode *inode, struct file *file) | 418 | #define uinput_set_bit(_arg, _bit, _max) \ |
419 | ({ \ | ||
420 | int __ret = 0; \ | ||
421 | if (udev->state == UIST_CREATED) \ | ||
422 | __ret = -EINVAL; \ | ||
423 | else if ((_arg) > (_max)) \ | ||
424 | __ret = -EINVAL; \ | ||
425 | else set_bit((_arg), udev->dev->_bit); \ | ||
426 | __ret; \ | ||
427 | }) | ||
428 | |||
429 | static long uinput_ioctl(struct file *file, unsigned int cmd, unsigned long arg) | ||
383 | { | 430 | { |
384 | uinput_burn_device(file->private_data); | 431 | int retval; |
385 | return 0; | ||
386 | } | ||
387 | |||
388 | static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | ||
389 | { | ||
390 | int retval = 0; | ||
391 | struct uinput_device *udev; | 432 | struct uinput_device *udev; |
392 | void __user *p = (void __user *)arg; | 433 | void __user *p = (void __user *)arg; |
393 | struct uinput_ff_upload ff_up; | 434 | struct uinput_ff_upload ff_up; |
@@ -398,19 +439,14 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
398 | 439 | ||
399 | udev = file->private_data; | 440 | udev = file->private_data; |
400 | 441 | ||
401 | /* device attributes can not be changed after the device is created */ | 442 | retval = down_interruptible(&udev->sem); |
402 | switch (cmd) { | 443 | if (retval) |
403 | case UI_SET_EVBIT: | 444 | return retval; |
404 | case UI_SET_KEYBIT: | 445 | |
405 | case UI_SET_RELBIT: | 446 | if (!udev->dev) { |
406 | case UI_SET_ABSBIT: | 447 | retval = uinput_allocate_device(udev); |
407 | case UI_SET_MSCBIT: | 448 | if (retval) |
408 | case UI_SET_LEDBIT: | 449 | goto out; |
409 | case UI_SET_SNDBIT: | ||
410 | case UI_SET_FFBIT: | ||
411 | case UI_SET_PHYS: | ||
412 | if (test_bit(UIST_CREATED, &udev->state)) | ||
413 | return -EINVAL; | ||
414 | } | 450 | } |
415 | 451 | ||
416 | switch (cmd) { | 452 | switch (cmd) { |
@@ -419,74 +455,50 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
419 | break; | 455 | break; |
420 | 456 | ||
421 | case UI_DEV_DESTROY: | 457 | case UI_DEV_DESTROY: |
422 | retval = uinput_destroy_device(udev); | 458 | uinput_destroy_device(udev); |
423 | break; | 459 | break; |
424 | 460 | ||
425 | case UI_SET_EVBIT: | 461 | case UI_SET_EVBIT: |
426 | if (arg > EV_MAX) { | 462 | retval = uinput_set_bit(arg, evbit, EV_MAX); |
427 | retval = -EINVAL; | ||
428 | break; | ||
429 | } | ||
430 | set_bit(arg, udev->dev->evbit); | ||
431 | break; | 463 | break; |
432 | 464 | ||
433 | case UI_SET_KEYBIT: | 465 | case UI_SET_KEYBIT: |
434 | if (arg > KEY_MAX) { | 466 | retval = uinput_set_bit(arg, keybit, KEY_MAX); |
435 | retval = -EINVAL; | ||
436 | break; | ||
437 | } | ||
438 | set_bit(arg, udev->dev->keybit); | ||
439 | break; | 467 | break; |
440 | 468 | ||
441 | case UI_SET_RELBIT: | 469 | case UI_SET_RELBIT: |
442 | if (arg > REL_MAX) { | 470 | retval = uinput_set_bit(arg, relbit, REL_MAX); |
443 | retval = -EINVAL; | ||
444 | break; | ||
445 | } | ||
446 | set_bit(arg, udev->dev->relbit); | ||
447 | break; | 471 | break; |
448 | 472 | ||
449 | case UI_SET_ABSBIT: | 473 | case UI_SET_ABSBIT: |
450 | if (arg > ABS_MAX) { | 474 | retval = uinput_set_bit(arg, absbit, ABS_MAX); |
451 | retval = -EINVAL; | ||
452 | break; | ||
453 | } | ||
454 | set_bit(arg, udev->dev->absbit); | ||
455 | break; | 475 | break; |
456 | 476 | ||
457 | case UI_SET_MSCBIT: | 477 | case UI_SET_MSCBIT: |
458 | if (arg > MSC_MAX) { | 478 | retval = uinput_set_bit(arg, mscbit, MSC_MAX); |
459 | retval = -EINVAL; | ||
460 | break; | ||
461 | } | ||
462 | set_bit(arg, udev->dev->mscbit); | ||
463 | break; | 479 | break; |
464 | 480 | ||
465 | case UI_SET_LEDBIT: | 481 | case UI_SET_LEDBIT: |
466 | if (arg > LED_MAX) { | 482 | retval = uinput_set_bit(arg, ledbit, LED_MAX); |
467 | retval = -EINVAL; | ||
468 | break; | ||
469 | } | ||
470 | set_bit(arg, udev->dev->ledbit); | ||
471 | break; | 483 | break; |
472 | 484 | ||
473 | case UI_SET_SNDBIT: | 485 | case UI_SET_SNDBIT: |
474 | if (arg > SND_MAX) { | 486 | retval = uinput_set_bit(arg, sndbit, SND_MAX); |
475 | retval = -EINVAL; | ||
476 | break; | ||
477 | } | ||
478 | set_bit(arg, udev->dev->sndbit); | ||
479 | break; | 487 | break; |
480 | 488 | ||
481 | case UI_SET_FFBIT: | 489 | case UI_SET_FFBIT: |
482 | if (arg > FF_MAX) { | 490 | retval = uinput_set_bit(arg, ffbit, FF_MAX); |
483 | retval = -EINVAL; | 491 | break; |
484 | break; | 492 | |
485 | } | 493 | case UI_SET_SWBIT: |
486 | set_bit(arg, udev->dev->ffbit); | 494 | retval = uinput_set_bit(arg, swbit, SW_MAX); |
487 | break; | 495 | break; |
488 | 496 | ||
489 | case UI_SET_PHYS: | 497 | case UI_SET_PHYS: |
498 | if (udev->state == UIST_CREATED) { | ||
499 | retval = -EINVAL; | ||
500 | goto out; | ||
501 | } | ||
490 | length = strnlen_user(p, 1024); | 502 | length = strnlen_user(p, 1024); |
491 | if (length <= 0) { | 503 | if (length <= 0) { |
492 | retval = -EFAULT; | 504 | retval = -EFAULT; |
@@ -575,23 +587,26 @@ static int uinput_ioctl(struct inode *inode, struct file *file, unsigned int cmd | |||
575 | default: | 587 | default: |
576 | retval = -EINVAL; | 588 | retval = -EINVAL; |
577 | } | 589 | } |
590 | |||
591 | out: | ||
592 | up(&udev->sem); | ||
578 | return retval; | 593 | return retval; |
579 | } | 594 | } |
580 | 595 | ||
581 | static struct file_operations uinput_fops = { | 596 | static struct file_operations uinput_fops = { |
582 | .owner = THIS_MODULE, | 597 | .owner = THIS_MODULE, |
583 | .open = uinput_open, | 598 | .open = uinput_open, |
584 | .release = uinput_close, | 599 | .release = uinput_release, |
585 | .read = uinput_read, | 600 | .read = uinput_read, |
586 | .write = uinput_write, | 601 | .write = uinput_write, |
587 | .poll = uinput_poll, | 602 | .poll = uinput_poll, |
588 | .ioctl = uinput_ioctl, | 603 | .unlocked_ioctl = uinput_ioctl, |
589 | }; | 604 | }; |
590 | 605 | ||
591 | static struct miscdevice uinput_misc = { | 606 | static struct miscdevice uinput_misc = { |
592 | .fops = &uinput_fops, | 607 | .fops = &uinput_fops, |
593 | .minor = UINPUT_MINOR, | 608 | .minor = UINPUT_MINOR, |
594 | .name = UINPUT_NAME, | 609 | .name = UINPUT_NAME, |
595 | }; | 610 | }; |
596 | 611 | ||
597 | static int __init uinput_init(void) | 612 | static int __init uinput_init(void) |
diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c new file mode 100644 index 000000000000..49d0416a2a9a --- /dev/null +++ b/drivers/input/misc/wistron_btns.c | |||
@@ -0,0 +1,561 @@ | |||
1 | /* | ||
2 | * Wistron laptop button driver | ||
3 | * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz> | ||
4 | * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org> | ||
5 | * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru> | ||
6 | * | ||
7 | * You can redistribute and/or modify this program under the terms of the | ||
8 | * GNU General Public License version 2 as published by the Free Software | ||
9 | * Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General | ||
14 | * Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License along | ||
17 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
18 | * 59 Temple Place Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | #include <asm/io.h> | ||
21 | #include <linux/dmi.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/input.h> | ||
24 | #include <linux/interrupt.h> | ||
25 | #include <linux/kernel.h> | ||
26 | #include <linux/mc146818rtc.h> | ||
27 | #include <linux/module.h> | ||
28 | #include <linux/preempt.h> | ||
29 | #include <linux/string.h> | ||
30 | #include <linux/timer.h> | ||
31 | #include <linux/types.h> | ||
32 | #include <linux/platform_device.h> | ||
33 | |||
34 | /* | ||
35 | * Number of attempts to read data from queue per poll; | ||
36 | * the queue can hold up to 31 entries | ||
37 | */ | ||
38 | #define MAX_POLL_ITERATIONS 64 | ||
39 | |||
40 | #define POLL_FREQUENCY 10 /* Number of polls per second */ | ||
41 | |||
42 | #if POLL_FREQUENCY > HZ | ||
43 | #error "POLL_FREQUENCY too high" | ||
44 | #endif | ||
45 | |||
46 | /* BIOS subsystem IDs */ | ||
47 | #define WIFI 0x35 | ||
48 | #define BLUETOOTH 0x34 | ||
49 | |||
50 | MODULE_AUTHOR("Miloslav Trmac <mitr@volny.cz>"); | ||
51 | MODULE_DESCRIPTION("Wistron laptop button driver"); | ||
52 | MODULE_LICENSE("GPL v2"); | ||
53 | MODULE_VERSION("0.1"); | ||
54 | |||
55 | static int force; /* = 0; */ | ||
56 | module_param(force, bool, 0); | ||
57 | MODULE_PARM_DESC(force, "Load even if computer is not in database"); | ||
58 | |||
59 | static char *keymap_name; /* = NULL; */ | ||
60 | module_param_named(keymap, keymap_name, charp, 0); | ||
61 | MODULE_PARM_DESC(keymap, "Keymap name, if it can't be autodetected"); | ||
62 | |||
63 | static struct platform_device *wistron_device; | ||
64 | |||
65 | /* BIOS interface implementation */ | ||
66 | |||
67 | static void __iomem *bios_entry_point; /* BIOS routine entry point */ | ||
68 | static void __iomem *bios_code_map_base; | ||
69 | static void __iomem *bios_data_map_base; | ||
70 | |||
71 | static u8 cmos_address; | ||
72 | |||
73 | struct regs { | ||
74 | u32 eax, ebx, ecx; | ||
75 | }; | ||
76 | |||
77 | static void call_bios(struct regs *regs) | ||
78 | { | ||
79 | unsigned long flags; | ||
80 | |||
81 | preempt_disable(); | ||
82 | local_irq_save(flags); | ||
83 | asm volatile ("pushl %%ebp;" | ||
84 | "movl %7, %%ebp;" | ||
85 | "call *%6;" | ||
86 | "popl %%ebp" | ||
87 | : "=a" (regs->eax), "=b" (regs->ebx), "=c" (regs->ecx) | ||
88 | : "0" (regs->eax), "1" (regs->ebx), "2" (regs->ecx), | ||
89 | "m" (bios_entry_point), "m" (bios_data_map_base) | ||
90 | : "edx", "edi", "esi", "memory"); | ||
91 | local_irq_restore(flags); | ||
92 | preempt_enable(); | ||
93 | } | ||
94 | |||
95 | static size_t __init locate_wistron_bios(void __iomem *base) | ||
96 | { | ||
97 | static const unsigned char __initdata signature[] = | ||
98 | { 0x42, 0x21, 0x55, 0x30 }; | ||
99 | size_t offset; | ||
100 | |||
101 | for (offset = 0; offset < 0x10000; offset += 0x10) { | ||
102 | if (check_signature(base + offset, signature, | ||
103 | sizeof(signature)) != 0) | ||
104 | return offset; | ||
105 | } | ||
106 | return -1; | ||
107 | } | ||
108 | |||
109 | static int __init map_bios(void) | ||
110 | { | ||
111 | void __iomem *base; | ||
112 | size_t offset; | ||
113 | u32 entry_point; | ||
114 | |||
115 | base = ioremap(0xF0000, 0x10000); /* Can't fail */ | ||
116 | offset = locate_wistron_bios(base); | ||
117 | if (offset < 0) { | ||
118 | printk(KERN_ERR "wistron_btns: BIOS entry point not found\n"); | ||
119 | iounmap(base); | ||
120 | return -ENODEV; | ||
121 | } | ||
122 | |||
123 | entry_point = readl(base + offset + 5); | ||
124 | printk(KERN_DEBUG | ||
125 | "wistron_btns: BIOS signature found at %p, entry point %08X\n", | ||
126 | base + offset, entry_point); | ||
127 | |||
128 | if (entry_point >= 0xF0000) { | ||
129 | bios_code_map_base = base; | ||
130 | bios_entry_point = bios_code_map_base + (entry_point & 0xFFFF); | ||
131 | } else { | ||
132 | iounmap(base); | ||
133 | bios_code_map_base = ioremap(entry_point & ~0x3FFF, 0x4000); | ||
134 | if (bios_code_map_base == NULL) { | ||
135 | printk(KERN_ERR | ||
136 | "wistron_btns: Can't map BIOS code at %08X\n", | ||
137 | entry_point & ~0x3FFF); | ||
138 | goto err; | ||
139 | } | ||
140 | bios_entry_point = bios_code_map_base + (entry_point & 0x3FFF); | ||
141 | } | ||
142 | /* The Windows driver maps 0x10000 bytes, we keep only one page... */ | ||
143 | bios_data_map_base = ioremap(0x400, 0xc00); | ||
144 | if (bios_data_map_base == NULL) { | ||
145 | printk(KERN_ERR "wistron_btns: Can't map BIOS data\n"); | ||
146 | goto err_code; | ||
147 | } | ||
148 | return 0; | ||
149 | |||
150 | err_code: | ||
151 | iounmap(bios_code_map_base); | ||
152 | err: | ||
153 | return -ENOMEM; | ||
154 | } | ||
155 | |||
156 | static inline void unmap_bios(void) | ||
157 | { | ||
158 | iounmap(bios_code_map_base); | ||
159 | iounmap(bios_data_map_base); | ||
160 | } | ||
161 | |||
162 | /* BIOS calls */ | ||
163 | |||
164 | static u16 bios_pop_queue(void) | ||
165 | { | ||
166 | struct regs regs; | ||
167 | |||
168 | memset(®s, 0, sizeof (regs)); | ||
169 | regs.eax = 0x9610; | ||
170 | regs.ebx = 0x061C; | ||
171 | regs.ecx = 0x0000; | ||
172 | call_bios(®s); | ||
173 | |||
174 | return regs.eax; | ||
175 | } | ||
176 | |||
177 | static void __init bios_attach(void) | ||
178 | { | ||
179 | struct regs regs; | ||
180 | |||
181 | memset(®s, 0, sizeof (regs)); | ||
182 | regs.eax = 0x9610; | ||
183 | regs.ebx = 0x012E; | ||
184 | call_bios(®s); | ||
185 | } | ||
186 | |||
187 | static void bios_detach(void) | ||
188 | { | ||
189 | struct regs regs; | ||
190 | |||
191 | memset(®s, 0, sizeof (regs)); | ||
192 | regs.eax = 0x9610; | ||
193 | regs.ebx = 0x002E; | ||
194 | call_bios(®s); | ||
195 | } | ||
196 | |||
197 | static u8 __init bios_get_cmos_address(void) | ||
198 | { | ||
199 | struct regs regs; | ||
200 | |||
201 | memset(®s, 0, sizeof (regs)); | ||
202 | regs.eax = 0x9610; | ||
203 | regs.ebx = 0x051C; | ||
204 | call_bios(®s); | ||
205 | |||
206 | return regs.ecx; | ||
207 | } | ||
208 | |||
209 | static u16 __init bios_get_default_setting(u8 subsys) | ||
210 | { | ||
211 | struct regs regs; | ||
212 | |||
213 | memset(®s, 0, sizeof (regs)); | ||
214 | regs.eax = 0x9610; | ||
215 | regs.ebx = 0x0200 | subsys; | ||
216 | call_bios(®s); | ||
217 | |||
218 | return regs.eax; | ||
219 | } | ||
220 | |||
221 | static void bios_set_state(u8 subsys, int enable) | ||
222 | { | ||
223 | struct regs regs; | ||
224 | |||
225 | memset(®s, 0, sizeof (regs)); | ||
226 | regs.eax = 0x9610; | ||
227 | regs.ebx = (enable ? 0x0100 : 0x0000) | subsys; | ||
228 | call_bios(®s); | ||
229 | } | ||
230 | |||
231 | /* Hardware database */ | ||
232 | |||
233 | struct key_entry { | ||
234 | char type; /* See KE_* below */ | ||
235 | u8 code; | ||
236 | unsigned keycode; /* For KE_KEY */ | ||
237 | }; | ||
238 | |||
239 | enum { KE_END, KE_KEY, KE_WIFI, KE_BLUETOOTH }; | ||
240 | |||
241 | static const struct key_entry *keymap; /* = NULL; Current key map */ | ||
242 | static int have_wifi; | ||
243 | static int have_bluetooth; | ||
244 | |||
245 | static int __init dmi_matched(struct dmi_system_id *dmi) | ||
246 | { | ||
247 | const struct key_entry *key; | ||
248 | |||
249 | keymap = dmi->driver_data; | ||
250 | for (key = keymap; key->type != KE_END; key++) { | ||
251 | if (key->type == KE_WIFI) { | ||
252 | have_wifi = 1; | ||
253 | break; | ||
254 | } else if (key->type == KE_BLUETOOTH) { | ||
255 | have_bluetooth = 1; | ||
256 | break; | ||
257 | } | ||
258 | } | ||
259 | return 1; | ||
260 | } | ||
261 | |||
262 | static struct key_entry keymap_empty[] = { | ||
263 | { KE_END, 0 } | ||
264 | }; | ||
265 | |||
266 | static struct key_entry keymap_fs_amilo_pro_v2000[] = { | ||
267 | { KE_KEY, 0x01, KEY_HELP }, | ||
268 | { KE_KEY, 0x11, KEY_PROG1 }, | ||
269 | { KE_KEY, 0x12, KEY_PROG2 }, | ||
270 | { KE_WIFI, 0x30, 0 }, | ||
271 | { KE_KEY, 0x31, KEY_MAIL }, | ||
272 | { KE_KEY, 0x36, KEY_WWW }, | ||
273 | { KE_END, 0 } | ||
274 | }; | ||
275 | |||
276 | static struct key_entry keymap_wistron_ms2141[] = { | ||
277 | { KE_KEY, 0x11, KEY_PROG1 }, | ||
278 | { KE_KEY, 0x12, KEY_PROG2 }, | ||
279 | { KE_WIFI, 0x30, 0 }, | ||
280 | { KE_KEY, 0x22, KEY_REWIND }, | ||
281 | { KE_KEY, 0x23, KEY_FORWARD }, | ||
282 | { KE_KEY, 0x24, KEY_PLAYPAUSE }, | ||
283 | { KE_KEY, 0x25, KEY_STOPCD }, | ||
284 | { KE_KEY, 0x31, KEY_MAIL }, | ||
285 | { KE_KEY, 0x36, KEY_WWW }, | ||
286 | { KE_END, 0 } | ||
287 | }; | ||
288 | |||
289 | static struct key_entry keymap_acer_aspire_1500[] = { | ||
290 | { KE_KEY, 0x11, KEY_PROG1 }, | ||
291 | { KE_KEY, 0x12, KEY_PROG2 }, | ||
292 | { KE_WIFI, 0x30, 0 }, | ||
293 | { KE_KEY, 0x31, KEY_MAIL }, | ||
294 | { KE_KEY, 0x36, KEY_WWW }, | ||
295 | { KE_BLUETOOTH, 0x44, 0 }, | ||
296 | { KE_END, 0 } | ||
297 | }; | ||
298 | |||
299 | /* | ||
300 | * If your machine is not here (which is currently rather likely), please send | ||
301 | * a list of buttons and their key codes (reported when loading this module | ||
302 | * with force=1) and the output of dmidecode to $MODULE_AUTHOR. | ||
303 | */ | ||
304 | static struct dmi_system_id dmi_ids[] = { | ||
305 | { | ||
306 | .callback = dmi_matched, | ||
307 | .ident = "Fujitsu-Siemens Amilo Pro V2000", | ||
308 | .matches = { | ||
309 | DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU SIEMENS"), | ||
310 | DMI_MATCH(DMI_PRODUCT_NAME, "AMILO Pro V2000"), | ||
311 | }, | ||
312 | .driver_data = keymap_fs_amilo_pro_v2000 | ||
313 | }, | ||
314 | { | ||
315 | .callback = dmi_matched, | ||
316 | .ident = "Acer Aspire 1500", | ||
317 | .matches = { | ||
318 | DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
319 | DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 1500"), | ||
320 | }, | ||
321 | .driver_data = keymap_acer_aspire_1500 | ||
322 | }, | ||
323 | { 0, } | ||
324 | }; | ||
325 | |||
326 | static int __init select_keymap(void) | ||
327 | { | ||
328 | if (keymap_name != NULL) { | ||
329 | if (strcmp (keymap_name, "1557/MS2141") == 0) | ||
330 | keymap = keymap_wistron_ms2141; | ||
331 | else { | ||
332 | printk(KERN_ERR "wistron_btns: Keymap unknown\n"); | ||
333 | return -EINVAL; | ||
334 | } | ||
335 | } | ||
336 | dmi_check_system(dmi_ids); | ||
337 | if (keymap == NULL) { | ||
338 | if (!force) { | ||
339 | printk(KERN_ERR "wistron_btns: System unknown\n"); | ||
340 | return -ENODEV; | ||
341 | } | ||
342 | keymap = keymap_empty; | ||
343 | } | ||
344 | return 0; | ||
345 | } | ||
346 | |||
347 | /* Input layer interface */ | ||
348 | |||
349 | static struct input_dev *input_dev; | ||
350 | |||
351 | static int __init setup_input_dev(void) | ||
352 | { | ||
353 | const struct key_entry *key; | ||
354 | int error; | ||
355 | |||
356 | input_dev = input_allocate_device(); | ||
357 | if (!input_dev) | ||
358 | return -ENOMEM; | ||
359 | |||
360 | input_dev->name = "Wistron laptop buttons"; | ||
361 | input_dev->phys = "wistron/input0"; | ||
362 | input_dev->id.bustype = BUS_HOST; | ||
363 | input_dev->cdev.dev = &wistron_device->dev; | ||
364 | |||
365 | for (key = keymap; key->type != KE_END; key++) { | ||
366 | if (key->type == KE_KEY) { | ||
367 | input_dev->evbit[LONG(EV_KEY)] = BIT(EV_KEY); | ||
368 | set_bit(key->keycode, input_dev->keybit); | ||
369 | } | ||
370 | } | ||
371 | |||
372 | error = input_register_device(input_dev); | ||
373 | if (error) { | ||
374 | input_free_device(input_dev); | ||
375 | return error; | ||
376 | } | ||
377 | |||
378 | return 0; | ||
379 | } | ||
380 | |||
381 | static void report_key(unsigned keycode) | ||
382 | { | ||
383 | input_report_key(input_dev, keycode, 1); | ||
384 | input_sync(input_dev); | ||
385 | input_report_key(input_dev, keycode, 0); | ||
386 | input_sync(input_dev); | ||
387 | } | ||
388 | |||
389 | /* Driver core */ | ||
390 | |||
391 | static int wifi_enabled; | ||
392 | static int bluetooth_enabled; | ||
393 | |||
394 | static void poll_bios(unsigned long); | ||
395 | |||
396 | static struct timer_list poll_timer = TIMER_INITIALIZER(poll_bios, 0, 0); | ||
397 | |||
398 | static void handle_key(u8 code) | ||
399 | { | ||
400 | const struct key_entry *key; | ||
401 | |||
402 | for (key = keymap; key->type != KE_END; key++) { | ||
403 | if (code == key->code) { | ||
404 | switch (key->type) { | ||
405 | case KE_KEY: | ||
406 | report_key(key->keycode); | ||
407 | break; | ||
408 | |||
409 | case KE_WIFI: | ||
410 | if (have_wifi) { | ||
411 | wifi_enabled = !wifi_enabled; | ||
412 | bios_set_state(WIFI, wifi_enabled); | ||
413 | } | ||
414 | break; | ||
415 | |||
416 | case KE_BLUETOOTH: | ||
417 | if (have_bluetooth) { | ||
418 | bluetooth_enabled = !bluetooth_enabled; | ||
419 | bios_set_state(BLUETOOTH, bluetooth_enabled); | ||
420 | } | ||
421 | break; | ||
422 | |||
423 | case KE_END: | ||
424 | default: | ||
425 | BUG(); | ||
426 | } | ||
427 | return; | ||
428 | } | ||
429 | } | ||
430 | printk(KERN_NOTICE "wistron_btns: Unknown key code %02X\n", code); | ||
431 | } | ||
432 | |||
433 | static void poll_bios(unsigned long discard) | ||
434 | { | ||
435 | u8 qlen; | ||
436 | u16 val; | ||
437 | |||
438 | for (;;) { | ||
439 | qlen = CMOS_READ(cmos_address); | ||
440 | if (qlen == 0) | ||
441 | break; | ||
442 | val = bios_pop_queue(); | ||
443 | if (val != 0 && !discard) | ||
444 | handle_key((u8)val); | ||
445 | } | ||
446 | |||
447 | mod_timer(&poll_timer, jiffies + HZ / POLL_FREQUENCY); | ||
448 | } | ||
449 | |||
450 | static int wistron_suspend(struct platform_device *dev, pm_message_t state) | ||
451 | { | ||
452 | del_timer_sync(&poll_timer); | ||
453 | |||
454 | if (have_wifi) | ||
455 | bios_set_state(WIFI, 0); | ||
456 | |||
457 | if (have_bluetooth) | ||
458 | bios_set_state(BLUETOOTH, 0); | ||
459 | |||
460 | return 0; | ||
461 | } | ||
462 | |||
463 | static int wistron_resume(struct platform_device *dev) | ||
464 | { | ||
465 | if (have_wifi) | ||
466 | bios_set_state(WIFI, wifi_enabled); | ||
467 | |||
468 | if (have_bluetooth) | ||
469 | bios_set_state(BLUETOOTH, bluetooth_enabled); | ||
470 | |||
471 | poll_bios(1); | ||
472 | |||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static struct platform_driver wistron_driver = { | ||
477 | .suspend = wistron_suspend, | ||
478 | .resume = wistron_resume, | ||
479 | .driver = { | ||
480 | .name = "wistron-bios", | ||
481 | }, | ||
482 | }; | ||
483 | |||
484 | static int __init wb_module_init(void) | ||
485 | { | ||
486 | int err; | ||
487 | |||
488 | err = select_keymap(); | ||
489 | if (err) | ||
490 | return err; | ||
491 | |||
492 | err = map_bios(); | ||
493 | if (err) | ||
494 | return err; | ||
495 | |||
496 | bios_attach(); | ||
497 | cmos_address = bios_get_cmos_address(); | ||
498 | |||
499 | err = platform_driver_register(&wistron_driver); | ||
500 | if (err) | ||
501 | goto err_detach_bios; | ||
502 | |||
503 | wistron_device = platform_device_register_simple("wistron-bios", -1, NULL, 0); | ||
504 | if (IS_ERR(wistron_device)) { | ||
505 | err = PTR_ERR(wistron_device); | ||
506 | goto err_unregister_driver; | ||
507 | } | ||
508 | |||
509 | if (have_wifi) { | ||
510 | u16 wifi = bios_get_default_setting(WIFI); | ||
511 | if (wifi & 1) | ||
512 | wifi_enabled = (wifi & 2) ? 1 : 0; | ||
513 | else | ||
514 | have_wifi = 0; | ||
515 | |||
516 | if (have_wifi) | ||
517 | bios_set_state(WIFI, wifi_enabled); | ||
518 | } | ||
519 | |||
520 | if (have_bluetooth) { | ||
521 | u16 bt = bios_get_default_setting(BLUETOOTH); | ||
522 | if (bt & 1) | ||
523 | bluetooth_enabled = (bt & 2) ? 1 : 0; | ||
524 | else | ||
525 | have_bluetooth = 0; | ||
526 | |||
527 | if (have_bluetooth) | ||
528 | bios_set_state(BLUETOOTH, bluetooth_enabled); | ||
529 | } | ||
530 | |||
531 | err = setup_input_dev(); | ||
532 | if (err) | ||
533 | goto err_unregister_device; | ||
534 | |||
535 | poll_bios(1); /* Flush stale event queue and arm timer */ | ||
536 | |||
537 | return 0; | ||
538 | |||
539 | err_unregister_device: | ||
540 | platform_device_unregister(wistron_device); | ||
541 | err_unregister_driver: | ||
542 | platform_driver_unregister(&wistron_driver); | ||
543 | err_detach_bios: | ||
544 | bios_detach(); | ||
545 | unmap_bios(); | ||
546 | |||
547 | return err; | ||
548 | } | ||
549 | |||
550 | static void __exit wb_module_exit(void) | ||
551 | { | ||
552 | del_timer_sync(&poll_timer); | ||
553 | input_unregister_device(input_dev); | ||
554 | platform_device_unregister(wistron_device); | ||
555 | platform_driver_unregister(&wistron_driver); | ||
556 | bios_detach(); | ||
557 | unmap_bios(); | ||
558 | } | ||
559 | |||
560 | module_init(wb_module_init); | ||
561 | module_exit(wb_module_exit); | ||
diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index edd15db17715..fbb69ef6a77b 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c | |||
@@ -269,14 +269,20 @@ static struct serio_event *serio_get_event(void) | |||
269 | return event; | 269 | return event; |
270 | } | 270 | } |
271 | 271 | ||
272 | static void serio_handle_events(void) | 272 | static void serio_handle_event(void) |
273 | { | 273 | { |
274 | struct serio_event *event; | 274 | struct serio_event *event; |
275 | struct serio_driver *serio_drv; | 275 | struct serio_driver *serio_drv; |
276 | 276 | ||
277 | down(&serio_sem); | 277 | down(&serio_sem); |
278 | 278 | ||
279 | while ((event = serio_get_event())) { | 279 | /* |
280 | * Note that we handle only one event here to give swsusp | ||
281 | * a chance to freeze kseriod thread. Serio events should | ||
282 | * be pretty rare so we are not concerned about taking | ||
283 | * performance hit. | ||
284 | */ | ||
285 | if ((event = serio_get_event())) { | ||
280 | 286 | ||
281 | switch (event->type) { | 287 | switch (event->type) { |
282 | case SERIO_REGISTER_PORT: | 288 | case SERIO_REGISTER_PORT: |
@@ -368,7 +374,7 @@ static struct serio *serio_get_pending_child(struct serio *parent) | |||
368 | static int serio_thread(void *nothing) | 374 | static int serio_thread(void *nothing) |
369 | { | 375 | { |
370 | do { | 376 | do { |
371 | serio_handle_events(); | 377 | serio_handle_event(); |
372 | wait_event_interruptible(serio_wait, | 378 | wait_event_interruptible(serio_wait, |
373 | kthread_should_stop() || !list_empty(&serio_event_list)); | 379 | kthread_should_stop() || !list_empty(&serio_event_list)); |
374 | try_to_freeze(); | 380 | try_to_freeze(); |
diff --git a/drivers/isdn/hisax/Kconfig b/drivers/isdn/hisax/Kconfig index 801c98f30e5c..c82105920d71 100644 --- a/drivers/isdn/hisax/Kconfig +++ b/drivers/isdn/hisax/Kconfig | |||
@@ -110,7 +110,7 @@ config HISAX_16_3 | |||
110 | 110 | ||
111 | config HISAX_TELESPCI | 111 | config HISAX_TELESPCI |
112 | bool "Teles PCI" | 112 | bool "Teles PCI" |
113 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 113 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
114 | help | 114 | help |
115 | This enables HiSax support for the Teles PCI. | 115 | This enables HiSax support for the Teles PCI. |
116 | See <file:Documentation/isdn/README.HiSax> on how to configure it. | 116 | See <file:Documentation/isdn/README.HiSax> on how to configure it. |
@@ -238,7 +238,7 @@ config HISAX_MIC | |||
238 | 238 | ||
239 | config HISAX_NETJET | 239 | config HISAX_NETJET |
240 | bool "NETjet card" | 240 | bool "NETjet card" |
241 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 241 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
242 | help | 242 | help |
243 | This enables HiSax support for the NetJet from Traverse | 243 | This enables HiSax support for the NetJet from Traverse |
244 | Technologies. | 244 | Technologies. |
@@ -249,7 +249,7 @@ config HISAX_NETJET | |||
249 | 249 | ||
250 | config HISAX_NETJET_U | 250 | config HISAX_NETJET_U |
251 | bool "NETspider U card" | 251 | bool "NETspider U card" |
252 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 252 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
253 | help | 253 | help |
254 | This enables HiSax support for the Netspider U interface ISDN card | 254 | This enables HiSax support for the Netspider U interface ISDN card |
255 | from Traverse Technologies. | 255 | from Traverse Technologies. |
@@ -317,7 +317,7 @@ config HISAX_GAZEL | |||
317 | 317 | ||
318 | config HISAX_HFC_PCI | 318 | config HISAX_HFC_PCI |
319 | bool "HFC PCI-Bus cards" | 319 | bool "HFC PCI-Bus cards" |
320 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 320 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
321 | help | 321 | help |
322 | This enables HiSax support for the HFC-S PCI 2BDS0 based cards. | 322 | This enables HiSax support for the HFC-S PCI 2BDS0 based cards. |
323 | 323 | ||
@@ -344,14 +344,14 @@ config HISAX_HFC_SX | |||
344 | 344 | ||
345 | config HISAX_ENTERNOW_PCI | 345 | config HISAX_ENTERNOW_PCI |
346 | bool "Formula-n enter:now PCI card" | 346 | bool "Formula-n enter:now PCI card" |
347 | depends on PCI && (BROKEN || !(SPARC64 || PPC)) | 347 | depends on PCI && (BROKEN || !(SPARC || PPC || PARISC || M68K)) |
348 | help | 348 | help |
349 | This enables HiSax support for the Formula-n enter:now PCI | 349 | This enables HiSax support for the Formula-n enter:now PCI |
350 | ISDN card. | 350 | ISDN card. |
351 | 351 | ||
352 | config HISAX_AMD7930 | 352 | config HISAX_AMD7930 |
353 | bool "Am7930 (EXPERIMENTAL)" | 353 | bool "Am7930 (EXPERIMENTAL)" |
354 | depends on EXPERIMENTAL && (SPARC32 || SPARC64) | 354 | depends on EXPERIMENTAL && SPARC |
355 | help | 355 | help |
356 | This enables HiSax support for the AMD7930 chips on some SPARCs. | 356 | This enables HiSax support for the AMD7930 chips on some SPARCs. |
357 | This code is not finished yet. | 357 | This code is not finished yet. |
diff --git a/drivers/isdn/pcbit/Kconfig b/drivers/isdn/pcbit/Kconfig index f06997faef16..0933881ab0c2 100644 --- a/drivers/isdn/pcbit/Kconfig +++ b/drivers/isdn/pcbit/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | config ISDN_DRV_PCBIT | 4 | config ISDN_DRV_PCBIT |
5 | tristate "PCBIT-D support" | 5 | tristate "PCBIT-D support" |
6 | depends on ISDN_I4L && ISA && (BROKEN || !PPC) | 6 | depends on ISDN_I4L && ISA && (BROKEN || X86) |
7 | help | 7 | help |
8 | This enables support for the PCBIT ISDN-card. This card is | 8 | This enables support for the PCBIT ISDN-card. This card is |
9 | manufactured in Portugal by Octal. For running this card, | 9 | manufactured in Portugal by Octal. For running this card, |
diff --git a/drivers/media/dvb/cinergyT2/cinergyT2.c b/drivers/media/dvb/cinergyT2/cinergyT2.c index fb394a0d838c..336fc284fa52 100644 --- a/drivers/media/dvb/cinergyT2/cinergyT2.c +++ b/drivers/media/dvb/cinergyT2/cinergyT2.c | |||
@@ -772,7 +772,7 @@ static int cinergyt2_register_rc(struct cinergyt2 *cinergyt2) | |||
772 | input_dev->name = DRIVER_NAME " remote control"; | 772 | input_dev->name = DRIVER_NAME " remote control"; |
773 | input_dev->phys = cinergyt2->phys; | 773 | input_dev->phys = cinergyt2->phys; |
774 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); | 774 | input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_REP); |
775 | for (i = 0; ARRAY_SIZE(rc_keys); i += 3) | 775 | for (i = 0; i < ARRAY_SIZE(rc_keys); i += 3) |
776 | set_bit(rc_keys[i + 2], input_dev->keybit); | 776 | set_bit(rc_keys[i + 2], input_dev->keybit); |
777 | input_dev->keycodesize = 0; | 777 | input_dev->keycodesize = 0; |
778 | input_dev->keycodemax = 0; | 778 | input_dev->keycodemax = 0; |
diff --git a/drivers/media/video/ir-kbd-gpio.c b/drivers/media/video/ir-kbd-gpio.c index 5abfc0fbf6de..6345e29e4951 100644 --- a/drivers/media/video/ir-kbd-gpio.c +++ b/drivers/media/video/ir-kbd-gpio.c | |||
@@ -673,7 +673,6 @@ static int ir_probe(struct device *dev) | |||
673 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", | 673 | snprintf(ir->phys, sizeof(ir->phys), "pci-%s/ir0", |
674 | pci_name(sub->core->pci)); | 674 | pci_name(sub->core->pci)); |
675 | 675 | ||
676 | ir->sub = sub; | ||
677 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); | 676 | ir_input_init(input_dev, &ir->ir, ir_type, ir_codes); |
678 | input_dev->name = ir->name; | 677 | input_dev->name = ir->name; |
679 | input_dev->phys = ir->phys; | 678 | input_dev->phys = ir->phys; |
@@ -688,6 +687,9 @@ static int ir_probe(struct device *dev) | |||
688 | } | 687 | } |
689 | input_dev->cdev.dev = &sub->core->pci->dev; | 688 | input_dev->cdev.dev = &sub->core->pci->dev; |
690 | 689 | ||
690 | ir->input = input_dev; | ||
691 | ir->sub = sub; | ||
692 | |||
691 | if (ir->polling) { | 693 | if (ir->polling) { |
692 | INIT_WORK(&ir->work, ir_work, ir); | 694 | INIT_WORK(&ir->work, ir_work, ir); |
693 | init_timer(&ir->timer); | 695 | init_timer(&ir->timer); |
@@ -708,7 +710,6 @@ static int ir_probe(struct device *dev) | |||
708 | /* all done */ | 710 | /* all done */ |
709 | dev_set_drvdata(dev, ir); | 711 | dev_set_drvdata(dev, ir); |
710 | input_register_device(ir->input); | 712 | input_register_device(ir->input); |
711 | printk(DEVNAME ": %s detected at %s\n",ir->name,ir->phys); | ||
712 | 713 | ||
713 | /* the remote isn't as bouncy as a keyboard */ | 714 | /* the remote isn't as bouncy as a keyboard */ |
714 | ir->input->rep[REP_DELAY] = repeat_delay; | 715 | ir->input->rep[REP_DELAY] = repeat_delay; |
diff --git a/drivers/media/video/saa7134/saa7134-input.c b/drivers/media/video/saa7134/saa7134-input.c index e648cc3bc96d..ab75ca5ac356 100644 --- a/drivers/media/video/saa7134/saa7134-input.c +++ b/drivers/media/video/saa7134/saa7134-input.c | |||
@@ -713,6 +713,8 @@ int saa7134_input_init1(struct saa7134_dev *dev) | |||
713 | return -ENOMEM; | 713 | return -ENOMEM; |
714 | } | 714 | } |
715 | 715 | ||
716 | ir->dev = input_dev; | ||
717 | |||
716 | /* init hardware-specific stuff */ | 718 | /* init hardware-specific stuff */ |
717 | ir->mask_keycode = mask_keycode; | 719 | ir->mask_keycode = mask_keycode; |
718 | ir->mask_keydown = mask_keydown; | 720 | ir->mask_keydown = mask_keydown; |
diff --git a/drivers/mtd/maps/ipaq-flash.c b/drivers/mtd/maps/ipaq-flash.c index 35097c9bbf50..b8ccb0a95789 100644 --- a/drivers/mtd/maps/ipaq-flash.c +++ b/drivers/mtd/maps/ipaq-flash.c | |||
@@ -246,7 +246,7 @@ int __init ipaq_mtd_init(void) | |||
246 | ipaq_map[i].size = h3xxx_max_flash_size; | 246 | ipaq_map[i].size = h3xxx_max_flash_size; |
247 | ipaq_map[i].set_vpp = h3xxx_set_vpp; | 247 | ipaq_map[i].set_vpp = h3xxx_set_vpp; |
248 | ipaq_map[i].phys = cs_phys[i]; | 248 | ipaq_map[i].phys = cs_phys[i]; |
249 | ipaq_map[i].virt = __ioremap(cs_phys[i], 0x04000000, 0, 1); | 249 | ipaq_map[i].virt = ioremap(cs_phys[i], 0x04000000); |
250 | if (machine_is_h3100 () || machine_is_h1900()) | 250 | if (machine_is_h3100 () || machine_is_h1900()) |
251 | ipaq_map[i].bankwidth = 2; | 251 | ipaq_map[i].bankwidth = 2; |
252 | } | 252 | } |
@@ -280,7 +280,7 @@ int __init ipaq_mtd_init(void) | |||
280 | nb_parts = ARRAY_SIZE(jornada_partitions); | 280 | nb_parts = ARRAY_SIZE(jornada_partitions); |
281 | ipaq_map[0].size = jornada_max_flash_size; | 281 | ipaq_map[0].size = jornada_max_flash_size; |
282 | ipaq_map[0].set_vpp = jornada56x_set_vpp; | 282 | ipaq_map[0].set_vpp = jornada56x_set_vpp; |
283 | ipaq_map[0].virt = (__u32)__ioremap(0x0, 0x04000000, 0, 1); | 283 | ipaq_map[0].virt = (__u32)ioremap(0x0, 0x04000000); |
284 | } | 284 | } |
285 | #endif | 285 | #endif |
286 | #ifdef CONFIG_SA1100_JORNADA720 | 286 | #ifdef CONFIG_SA1100_JORNADA720 |
@@ -442,7 +442,7 @@ static int __init h1900_special_case(void) | |||
442 | ipaq_map[0].size = 0x80000; | 442 | ipaq_map[0].size = 0x80000; |
443 | ipaq_map[0].set_vpp = h3xxx_set_vpp; | 443 | ipaq_map[0].set_vpp = h3xxx_set_vpp; |
444 | ipaq_map[0].phys = 0x0; | 444 | ipaq_map[0].phys = 0x0; |
445 | ipaq_map[0].virt = __ioremap(0x0, 0x04000000, 0, 1); | 445 | ipaq_map[0].virt = ioremap(0x0, 0x04000000); |
446 | ipaq_map[0].bankwidth = 2; | 446 | ipaq_map[0].bankwidth = 2; |
447 | 447 | ||
448 | printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt); | 448 | printk(KERN_NOTICE "iPAQ flash: probing %d-bit flash bus, window=%lx with JEDEC.\n", ipaq_map[0].bankwidth*8, ipaq_map[0].virt); |
diff --git a/drivers/mtd/maps/ixp2000.c b/drivers/mtd/maps/ixp2000.c index fc7a78e31735..2c9cc7f37e92 100644 --- a/drivers/mtd/maps/ixp2000.c +++ b/drivers/mtd/maps/ixp2000.c | |||
@@ -159,12 +159,12 @@ static int ixp2000_flash_probe(struct platform_device *dev) | |||
159 | return -ENODEV; | 159 | return -ENODEV; |
160 | 160 | ||
161 | window_size = dev->resource->end - dev->resource->start + 1; | 161 | window_size = dev->resource->end - dev->resource->start + 1; |
162 | dev_info(_dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n", | 162 | dev_info(&dev->dev, "Probe of IXP2000 flash(%d banks x %dMiB)\n", |
163 | ixp_data->nr_banks, ((u32)window_size >> 20)); | 163 | ixp_data->nr_banks, ((u32)window_size >> 20)); |
164 | 164 | ||
165 | if (plat->width != 1) { | 165 | if (plat->width != 1) { |
166 | dev_err(_dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n", | 166 | dev_err(&dev->dev, "IXP2000 MTD map only supports 8-bit mode, asking for %d\n", |
167 | plat->width * 8); | 167 | plat->width * 8); |
168 | return -EIO; | 168 | return -EIO; |
169 | } | 169 | } |
170 | 170 | ||
@@ -202,7 +202,7 @@ static int ixp2000_flash_probe(struct platform_device *dev) | |||
202 | dev->resource->end - dev->resource->start + 1, | 202 | dev->resource->end - dev->resource->start + 1, |
203 | dev->dev.bus_id); | 203 | dev->dev.bus_id); |
204 | if (!info->res) { | 204 | if (!info->res) { |
205 | dev_err(_dev, "Could not reserve memory region\n"); | 205 | dev_err(&dev->dev, "Could not reserve memory region\n"); |
206 | err = -ENOMEM; | 206 | err = -ENOMEM; |
207 | goto Error; | 207 | goto Error; |
208 | } | 208 | } |
@@ -210,7 +210,7 @@ static int ixp2000_flash_probe(struct platform_device *dev) | |||
210 | info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start, | 210 | info->map.map_priv_1 = (unsigned long) ioremap(dev->resource->start, |
211 | dev->resource->end - dev->resource->start + 1); | 211 | dev->resource->end - dev->resource->start + 1); |
212 | if (!info->map.map_priv_1) { | 212 | if (!info->map.map_priv_1) { |
213 | dev_err(_dev, "Failed to ioremap flash region\n"); | 213 | dev_err(&dev->dev, "Failed to ioremap flash region\n"); |
214 | err = -EIO; | 214 | err = -EIO; |
215 | goto Error; | 215 | goto Error; |
216 | } | 216 | } |
@@ -221,13 +221,13 @@ static int ixp2000_flash_probe(struct platform_device *dev) | |||
221 | */ | 221 | */ |
222 | 222 | ||
223 | erratum44_workaround = ixp2000_has_broken_slowport(); | 223 | erratum44_workaround = ixp2000_has_broken_slowport(); |
224 | dev_info(_dev, "Erratum 44 workaround %s\n", | 224 | dev_info(&dev->dev, "Erratum 44 workaround %s\n", |
225 | erratum44_workaround ? "enabled" : "disabled"); | 225 | erratum44_workaround ? "enabled" : "disabled"); |
226 | #endif | 226 | #endif |
227 | 227 | ||
228 | info->mtd = do_map_probe(plat->map_name, &info->map); | 228 | info->mtd = do_map_probe(plat->map_name, &info->map); |
229 | if (!info->mtd) { | 229 | if (!info->mtd) { |
230 | dev_err(_dev, "map_probe failed\n"); | 230 | dev_err(&dev->dev, "map_probe failed\n"); |
231 | err = -ENXIO; | 231 | err = -ENXIO; |
232 | goto Error; | 232 | goto Error; |
233 | } | 233 | } |
@@ -237,7 +237,7 @@ static int ixp2000_flash_probe(struct platform_device *dev) | |||
237 | if (err > 0) { | 237 | if (err > 0) { |
238 | err = add_mtd_partitions(info->mtd, info->partitions, err); | 238 | err = add_mtd_partitions(info->mtd, info->partitions, err); |
239 | if(err) | 239 | if(err) |
240 | dev_err(_dev, "Could not parse partitions\n"); | 240 | dev_err(&dev->dev, "Could not parse partitions\n"); |
241 | } | 241 | } |
242 | 242 | ||
243 | if (err) | 243 | if (err) |
@@ -251,8 +251,8 @@ Error: | |||
251 | } | 251 | } |
252 | 252 | ||
253 | static struct platform_driver ixp2000_flash_driver = { | 253 | static struct platform_driver ixp2000_flash_driver = { |
254 | .probe = &ixp2000_flash_probe, | 254 | .probe = ixp2000_flash_probe, |
255 | .remove = &ixp2000_flash_remove | 255 | .remove = ixp2000_flash_remove, |
256 | .driver = { | 256 | .driver = { |
257 | .name = "IXP2000-Flash", | 257 | .name = "IXP2000-Flash", |
258 | }, | 258 | }, |
diff --git a/drivers/mtd/nand/h1910.c b/drivers/mtd/nand/h1910.c index 041e4b3358fb..f68f7a99a630 100644 --- a/drivers/mtd/nand/h1910.c +++ b/drivers/mtd/nand/h1910.c | |||
@@ -112,7 +112,7 @@ static int __init h1910_init (void) | |||
112 | if (!machine_is_h1900()) | 112 | if (!machine_is_h1900()) |
113 | return -ENODEV; | 113 | return -ENODEV; |
114 | 114 | ||
115 | nandaddr = __ioremap(0x08000000, 0x1000, 0, 1); | 115 | nandaddr = ioremap(0x08000000, 0x1000); |
116 | if (!nandaddr) { | 116 | if (!nandaddr) { |
117 | printk("Failed to ioremap nand flash.\n"); | 117 | printk("Failed to ioremap nand flash.\n"); |
118 | return -ENOMEM; | 118 | return -ENOMEM; |
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index 332e9953c55c..cd0b1dccfb61 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
@@ -32,6 +32,7 @@ | |||
32 | * | 32 | * |
33 | */ | 33 | */ |
34 | 34 | ||
35 | #include <linux/config.h> | ||
35 | #include <linux/module.h> | 36 | #include <linux/module.h> |
36 | #include <linux/kernel.h> | 37 | #include <linux/kernel.h> |
37 | #include <linux/sched.h> | 38 | #include <linux/sched.h> |
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 7a6aeae2c9fa..22cd04556707 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c | |||
@@ -156,7 +156,7 @@ | |||
156 | 156 | ||
157 | #define DRV_NAME "e100" | 157 | #define DRV_NAME "e100" |
158 | #define DRV_EXT "-NAPI" | 158 | #define DRV_EXT "-NAPI" |
159 | #define DRV_VERSION "3.4.14-k2"DRV_EXT | 159 | #define DRV_VERSION "3.4.14-k4"DRV_EXT |
160 | #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" | 160 | #define DRV_DESCRIPTION "Intel(R) PRO/100 Network Driver" |
161 | #define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation" | 161 | #define DRV_COPYRIGHT "Copyright(c) 1999-2005 Intel Corporation" |
162 | #define PFX DRV_NAME ": " | 162 | #define PFX DRV_NAME ": " |
@@ -903,8 +903,8 @@ static void mdio_write(struct net_device *netdev, int addr, int reg, int data) | |||
903 | 903 | ||
904 | static void e100_get_defaults(struct nic *nic) | 904 | static void e100_get_defaults(struct nic *nic) |
905 | { | 905 | { |
906 | struct param_range rfds = { .min = 16, .max = 256, .count = 64 }; | 906 | struct param_range rfds = { .min = 16, .max = 256, .count = 256 }; |
907 | struct param_range cbs = { .min = 64, .max = 256, .count = 64 }; | 907 | struct param_range cbs = { .min = 64, .max = 256, .count = 128 }; |
908 | 908 | ||
909 | pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id); | 909 | pci_read_config_byte(nic->pdev, PCI_REVISION_ID, &nic->rev_id); |
910 | /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */ | 910 | /* MAC type is encoded as rev ID; exception: ICH is treated as 82559 */ |
@@ -1007,25 +1007,264 @@ static void e100_configure(struct nic *nic, struct cb *cb, struct sk_buff *skb) | |||
1007 | c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]); | 1007 | c[16], c[17], c[18], c[19], c[20], c[21], c[22], c[23]); |
1008 | } | 1008 | } |
1009 | 1009 | ||
1010 | /********************************************************/ | ||
1011 | /* Micro code for 8086:1229 Rev 8 */ | ||
1012 | /********************************************************/ | ||
1013 | |||
1014 | /* Parameter values for the D101M B-step */ | ||
1015 | #define D101M_CPUSAVER_TIMER_DWORD 78 | ||
1016 | #define D101M_CPUSAVER_BUNDLE_DWORD 65 | ||
1017 | #define D101M_CPUSAVER_MIN_SIZE_DWORD 126 | ||
1018 | |||
1019 | #define D101M_B_RCVBUNDLE_UCODE \ | ||
1020 | {\ | ||
1021 | 0x00550215, 0xFFFF0437, 0xFFFFFFFF, 0x06A70789, 0xFFFFFFFF, 0x0558FFFF, \ | ||
1022 | 0x000C0001, 0x00101312, 0x000C0008, 0x00380216, \ | ||
1023 | 0x0010009C, 0x00204056, 0x002380CC, 0x00380056, \ | ||
1024 | 0x0010009C, 0x00244C0B, 0x00000800, 0x00124818, \ | ||
1025 | 0x00380438, 0x00000000, 0x00140000, 0x00380555, \ | ||
1026 | 0x00308000, 0x00100662, 0x00100561, 0x000E0408, \ | ||
1027 | 0x00134861, 0x000C0002, 0x00103093, 0x00308000, \ | ||
1028 | 0x00100624, 0x00100561, 0x000E0408, 0x00100861, \ | ||
1029 | 0x000C007E, 0x00222C21, 0x000C0002, 0x00103093, \ | ||
1030 | 0x00380C7A, 0x00080000, 0x00103090, 0x00380C7A, \ | ||
1031 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1032 | 0x0010009C, 0x00244C2D, 0x00010004, 0x00041000, \ | ||
1033 | 0x003A0437, 0x00044010, 0x0038078A, 0x00000000, \ | ||
1034 | 0x00100099, 0x00206C7A, 0x0010009C, 0x00244C48, \ | ||
1035 | 0x00130824, 0x000C0001, 0x00101213, 0x00260C75, \ | ||
1036 | 0x00041000, 0x00010004, 0x00130826, 0x000C0006, \ | ||
1037 | 0x002206A8, 0x0013C926, 0x00101313, 0x003806A8, \ | ||
1038 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1039 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1040 | 0x00080600, 0x00101B10, 0x00050004, 0x00100826, \ | ||
1041 | 0x00101210, 0x00380C34, 0x00000000, 0x00000000, \ | ||
1042 | 0x0021155B, 0x00100099, 0x00206559, 0x0010009C, \ | ||
1043 | 0x00244559, 0x00130836, 0x000C0000, 0x00220C62, \ | ||
1044 | 0x000C0001, 0x00101B13, 0x00229C0E, 0x00210C0E, \ | ||
1045 | 0x00226C0E, 0x00216C0E, 0x0022FC0E, 0x00215C0E, \ | ||
1046 | 0x00214C0E, 0x00380555, 0x00010004, 0x00041000, \ | ||
1047 | 0x00278C67, 0x00040800, 0x00018100, 0x003A0437, \ | ||
1048 | 0x00130826, 0x000C0001, 0x00220559, 0x00101313, \ | ||
1049 | 0x00380559, 0x00000000, 0x00000000, 0x00000000, \ | ||
1050 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1051 | 0x00000000, 0x00130831, 0x0010090B, 0x00124813, \ | ||
1052 | 0x000CFF80, 0x002606AB, 0x00041000, 0x00010004, \ | ||
1053 | 0x003806A8, 0x00000000, 0x00000000, 0x00000000, \ | ||
1054 | } | ||
1055 | |||
1056 | /********************************************************/ | ||
1057 | /* Micro code for 8086:1229 Rev 9 */ | ||
1058 | /********************************************************/ | ||
1059 | |||
1060 | /* Parameter values for the D101S */ | ||
1061 | #define D101S_CPUSAVER_TIMER_DWORD 78 | ||
1062 | #define D101S_CPUSAVER_BUNDLE_DWORD 67 | ||
1063 | #define D101S_CPUSAVER_MIN_SIZE_DWORD 128 | ||
1064 | |||
1065 | #define D101S_RCVBUNDLE_UCODE \ | ||
1066 | {\ | ||
1067 | 0x00550242, 0xFFFF047E, 0xFFFFFFFF, 0x06FF0818, 0xFFFFFFFF, 0x05A6FFFF, \ | ||
1068 | 0x000C0001, 0x00101312, 0x000C0008, 0x00380243, \ | ||
1069 | 0x0010009C, 0x00204056, 0x002380D0, 0x00380056, \ | ||
1070 | 0x0010009C, 0x00244F8B, 0x00000800, 0x00124818, \ | ||
1071 | 0x0038047F, 0x00000000, 0x00140000, 0x003805A3, \ | ||
1072 | 0x00308000, 0x00100610, 0x00100561, 0x000E0408, \ | ||
1073 | 0x00134861, 0x000C0002, 0x00103093, 0x00308000, \ | ||
1074 | 0x00100624, 0x00100561, 0x000E0408, 0x00100861, \ | ||
1075 | 0x000C007E, 0x00222FA1, 0x000C0002, 0x00103093, \ | ||
1076 | 0x00380F90, 0x00080000, 0x00103090, 0x00380F90, \ | ||
1077 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1078 | 0x0010009C, 0x00244FAD, 0x00010004, 0x00041000, \ | ||
1079 | 0x003A047E, 0x00044010, 0x00380819, 0x00000000, \ | ||
1080 | 0x00100099, 0x00206FFD, 0x0010009A, 0x0020AFFD, \ | ||
1081 | 0x0010009C, 0x00244FC8, 0x00130824, 0x000C0001, \ | ||
1082 | 0x00101213, 0x00260FF7, 0x00041000, 0x00010004, \ | ||
1083 | 0x00130826, 0x000C0006, 0x00220700, 0x0013C926, \ | ||
1084 | 0x00101313, 0x00380700, 0x00000000, 0x00000000, \ | ||
1085 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1086 | 0x00080600, 0x00101B10, 0x00050004, 0x00100826, \ | ||
1087 | 0x00101210, 0x00380FB6, 0x00000000, 0x00000000, \ | ||
1088 | 0x002115A9, 0x00100099, 0x002065A7, 0x0010009A, \ | ||
1089 | 0x0020A5A7, 0x0010009C, 0x002445A7, 0x00130836, \ | ||
1090 | 0x000C0000, 0x00220FE4, 0x000C0001, 0x00101B13, \ | ||
1091 | 0x00229F8E, 0x00210F8E, 0x00226F8E, 0x00216F8E, \ | ||
1092 | 0x0022FF8E, 0x00215F8E, 0x00214F8E, 0x003805A3, \ | ||
1093 | 0x00010004, 0x00041000, 0x00278FE9, 0x00040800, \ | ||
1094 | 0x00018100, 0x003A047E, 0x00130826, 0x000C0001, \ | ||
1095 | 0x002205A7, 0x00101313, 0x003805A7, 0x00000000, \ | ||
1096 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1097 | 0x00000000, 0x00000000, 0x00000000, 0x00130831, \ | ||
1098 | 0x0010090B, 0x00124813, 0x000CFF80, 0x00260703, \ | ||
1099 | 0x00041000, 0x00010004, 0x00380700 \ | ||
1100 | } | ||
1101 | |||
1102 | /********************************************************/ | ||
1103 | /* Micro code for the 8086:1229 Rev F/10 */ | ||
1104 | /********************************************************/ | ||
1105 | |||
1106 | /* Parameter values for the D102 E-step */ | ||
1107 | #define D102_E_CPUSAVER_TIMER_DWORD 42 | ||
1108 | #define D102_E_CPUSAVER_BUNDLE_DWORD 54 | ||
1109 | #define D102_E_CPUSAVER_MIN_SIZE_DWORD 46 | ||
1110 | |||
1111 | #define D102_E_RCVBUNDLE_UCODE \ | ||
1112 | {\ | ||
1113 | 0x007D028F, 0x0E4204F9, 0x14ED0C85, 0x14FA14E9, 0x0EF70E36, 0x1FFF1FFF, \ | ||
1114 | 0x00E014B9, 0x00000000, 0x00000000, 0x00000000, \ | ||
1115 | 0x00E014BD, 0x00000000, 0x00000000, 0x00000000, \ | ||
1116 | 0x00E014D5, 0x00000000, 0x00000000, 0x00000000, \ | ||
1117 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1118 | 0x00E014C1, 0x00000000, 0x00000000, 0x00000000, \ | ||
1119 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1120 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1121 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1122 | 0x00E014C8, 0x00000000, 0x00000000, 0x00000000, \ | ||
1123 | 0x00200600, 0x00E014EE, 0x00000000, 0x00000000, \ | ||
1124 | 0x0030FF80, 0x00940E46, 0x00038200, 0x00102000, \ | ||
1125 | 0x00E00E43, 0x00000000, 0x00000000, 0x00000000, \ | ||
1126 | 0x00300006, 0x00E014FB, 0x00000000, 0x00000000, \ | ||
1127 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1128 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1129 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1130 | 0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, \ | ||
1131 | 0x00906EFD, 0x00900EFD, 0x00E00EF8, 0x00000000, \ | ||
1132 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1133 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1134 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1135 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1136 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1137 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1138 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1139 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1140 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1141 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1142 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1143 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1144 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1145 | 0x00000000, 0x00000000, 0x00000000, 0x00000000, \ | ||
1146 | } | ||
1147 | |||
1010 | static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb) | 1148 | static void e100_load_ucode(struct nic *nic, struct cb *cb, struct sk_buff *skb) |
1011 | { | 1149 | { |
1012 | int i; | 1150 | /* *INDENT-OFF* */ |
1013 | static const u32 ucode[UCODE_SIZE] = { | 1151 | static struct { |
1014 | /* NFS packets are misinterpreted as TCO packets and | 1152 | u32 ucode[UCODE_SIZE + 1]; |
1015 | * incorrectly routed to the BMC over SMBus. This | 1153 | u8 mac; |
1016 | * microcode patch checks the fragmented IP bit in the | 1154 | u8 timer_dword; |
1017 | * NFS/UDP header to distinguish between NFS and TCO. */ | 1155 | u8 bundle_dword; |
1018 | 0x0EF70E36, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, 0x1FFF1FFF, | 1156 | u8 min_size_dword; |
1019 | 0x1FFF1FFF, 0x00906E41, 0x00800E3C, 0x00E00E39, 0x00000000, | 1157 | } ucode_opts[] = { |
1020 | 0x00906EFD, 0x00900EFD, 0x00E00EF8, | 1158 | { D101M_B_RCVBUNDLE_UCODE, |
1021 | }; | 1159 | mac_82559_D101M, |
1022 | 1160 | D101M_CPUSAVER_TIMER_DWORD, | |
1023 | if(nic->mac == mac_82551_F || nic->mac == mac_82551_10) { | 1161 | D101M_CPUSAVER_BUNDLE_DWORD, |
1024 | for(i = 0; i < UCODE_SIZE; i++) | 1162 | D101M_CPUSAVER_MIN_SIZE_DWORD }, |
1163 | { D101S_RCVBUNDLE_UCODE, | ||
1164 | mac_82559_D101S, | ||
1165 | D101S_CPUSAVER_TIMER_DWORD, | ||
1166 | D101S_CPUSAVER_BUNDLE_DWORD, | ||
1167 | D101S_CPUSAVER_MIN_SIZE_DWORD }, | ||
1168 | { D102_E_RCVBUNDLE_UCODE, | ||
1169 | mac_82551_F, | ||
1170 | D102_E_CPUSAVER_TIMER_DWORD, | ||
1171 | D102_E_CPUSAVER_BUNDLE_DWORD, | ||
1172 | D102_E_CPUSAVER_MIN_SIZE_DWORD }, | ||
1173 | { D102_E_RCVBUNDLE_UCODE, | ||
1174 | mac_82551_10, | ||
1175 | D102_E_CPUSAVER_TIMER_DWORD, | ||
1176 | D102_E_CPUSAVER_BUNDLE_DWORD, | ||
1177 | D102_E_CPUSAVER_MIN_SIZE_DWORD }, | ||
1178 | { {0}, 0, 0, 0, 0} | ||
1179 | }, *opts; | ||
1180 | /* *INDENT-ON* */ | ||
1181 | |||
1182 | /************************************************************************* | ||
1183 | * CPUSaver parameters | ||
1184 | * | ||
1185 | * All CPUSaver parameters are 16-bit literals that are part of a | ||
1186 | * "move immediate value" instruction. By changing the value of | ||
1187 | * the literal in the instruction before the code is loaded, the | ||
1188 | * driver can change the algorithm. | ||
1189 | * | ||
1190 | * INTDELAY - This loads the dead-man timer with its inital value. | ||
1191 | * When this timer expires the interrupt is asserted, and the | ||
1192 | * timer is reset each time a new packet is received. (see | ||
1193 | * BUNDLEMAX below to set the limit on number of chained packets) | ||
1194 | * The current default is 0x600 or 1536. Experiments show that | ||
1195 | * the value should probably stay within the 0x200 - 0x1000. | ||
1196 | * | ||
1197 | * BUNDLEMAX - | ||
1198 | * This sets the maximum number of frames that will be bundled. In | ||
1199 | * some situations, such as the TCP windowing algorithm, it may be | ||
1200 | * better to limit the growth of the bundle size than let it go as | ||
1201 | * high as it can, because that could cause too much added latency. | ||
1202 | * The default is six, because this is the number of packets in the | ||
1203 | * default TCP window size. A value of 1 would make CPUSaver indicate | ||
1204 | * an interrupt for every frame received. If you do not want to put | ||
1205 | * a limit on the bundle size, set this value to xFFFF. | ||
1206 | * | ||
1207 | * BUNDLESMALL - | ||
1208 | * This contains a bit-mask describing the minimum size frame that | ||
1209 | * will be bundled. The default masks the lower 7 bits, which means | ||
1210 | * that any frame less than 128 bytes in length will not be bundled, | ||
1211 | * but will instead immediately generate an interrupt. This does | ||
1212 | * not affect the current bundle in any way. Any frame that is 128 | ||
1213 | * bytes or large will be bundled normally. This feature is meant | ||
1214 | * to provide immediate indication of ACK frames in a TCP environment. | ||
1215 | * Customers were seeing poor performance when a machine with CPUSaver | ||
1216 | * enabled was sending but not receiving. The delay introduced when | ||
1217 | * the ACKs were received was enough to reduce total throughput, because | ||
1218 | * the sender would sit idle until the ACK was finally seen. | ||
1219 | * | ||
1220 | * The current default is 0xFF80, which masks out the lower 7 bits. | ||
1221 | * This means that any frame which is x7F (127) bytes or smaller | ||
1222 | * will cause an immediate interrupt. Because this value must be a | ||
1223 | * bit mask, there are only a few valid values that can be used. To | ||
1224 | * turn this feature off, the driver can write the value xFFFF to the | ||
1225 | * lower word of this instruction (in the same way that the other | ||
1226 | * parameters are used). Likewise, a value of 0xF800 (2047) would | ||
1227 | * cause an interrupt to be generated for every frame, because all | ||
1228 | * standard Ethernet frames are <= 2047 bytes in length. | ||
1229 | *************************************************************************/ | ||
1230 | |||
1231 | /* if you wish to disable the ucode functionality, while maintaining the | ||
1232 | * workarounds it provides, set the following defines to: | ||
1233 | * BUNDLESMALL 0 | ||
1234 | * BUNDLEMAX 1 | ||
1235 | * INTDELAY 1 | ||
1236 | */ | ||
1237 | #define BUNDLESMALL 1 | ||
1238 | #define BUNDLEMAX (u16)6 | ||
1239 | #define INTDELAY (u16)1536 /* 0x600 */ | ||
1240 | |||
1241 | /* do not load u-code for ICH devices */ | ||
1242 | if (nic->flags & ich) | ||
1243 | goto noloaducode; | ||
1244 | |||
1245 | /* Search for ucode match against h/w rev_id */ | ||
1246 | for (opts = ucode_opts; opts->mac; opts++) { | ||
1247 | int i; | ||
1248 | u32 *ucode = opts->ucode; | ||
1249 | if (nic->mac != opts->mac) | ||
1250 | continue; | ||
1251 | |||
1252 | /* Insert user-tunable settings */ | ||
1253 | ucode[opts->timer_dword] &= 0xFFFF0000; | ||
1254 | ucode[opts->timer_dword] |= INTDELAY; | ||
1255 | ucode[opts->bundle_dword] &= 0xFFFF0000; | ||
1256 | ucode[opts->bundle_dword] |= BUNDLEMAX; | ||
1257 | ucode[opts->min_size_dword] &= 0xFFFF0000; | ||
1258 | ucode[opts->min_size_dword] |= (BUNDLESMALL) ? 0xFFFF : 0xFF80; | ||
1259 | |||
1260 | for (i = 0; i < UCODE_SIZE; i++) | ||
1025 | cb->u.ucode[i] = cpu_to_le32(ucode[i]); | 1261 | cb->u.ucode[i] = cpu_to_le32(ucode[i]); |
1026 | cb->command = cpu_to_le16(cb_ucode); | 1262 | cb->command = cpu_to_le16(cb_ucode); |
1027 | } else | 1263 | return; |
1028 | cb->command = cpu_to_le16(cb_nop); | 1264 | } |
1265 | |||
1266 | noloaducode: | ||
1267 | cb->command = cpu_to_le16(cb_nop); | ||
1029 | } | 1268 | } |
1030 | 1269 | ||
1031 | static void e100_setup_iaaddr(struct nic *nic, struct cb *cb, | 1270 | static void e100_setup_iaaddr(struct nic *nic, struct cb *cb, |
diff --git a/drivers/net/fec_8xx/Kconfig b/drivers/net/fec_8xx/Kconfig index 94e7a9af8705..a84c232395e3 100644 --- a/drivers/net/fec_8xx/Kconfig +++ b/drivers/net/fec_8xx/Kconfig | |||
@@ -1,6 +1,6 @@ | |||
1 | config FEC_8XX | 1 | config FEC_8XX |
2 | tristate "Motorola 8xx FEC driver" | 2 | tristate "Motorola 8xx FEC driver" |
3 | depends on NET_ETHERNET && FEC | 3 | depends on NET_ETHERNET && 8xx |
4 | select MII | 4 | select MII |
5 | 5 | ||
6 | config FEC_8XX_GENERIC_PHY | 6 | config FEC_8XX_GENERIC_PHY |
diff --git a/drivers/net/ioc3-eth.c b/drivers/net/ioc3-eth.c index 6a3129bc15a6..9b8295ee06ef 100644 --- a/drivers/net/ioc3-eth.c +++ b/drivers/net/ioc3-eth.c | |||
@@ -1360,7 +1360,7 @@ static struct pci_driver ioc3_driver = { | |||
1360 | 1360 | ||
1361 | static int __init ioc3_init_module(void) | 1361 | static int __init ioc3_init_module(void) |
1362 | { | 1362 | { |
1363 | return pci_module_init(&ioc3_driver); | 1363 | return pci_register_driver(&ioc3_driver); |
1364 | } | 1364 | } |
1365 | 1365 | ||
1366 | static void __exit ioc3_cleanup_module(void) | 1366 | static void __exit ioc3_cleanup_module(void) |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 159b56a56ef4..14a76f7cf900 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -1346,10 +1346,8 @@ rtl8169_init_board(struct pci_dev *pdev, struct net_device **dev_out, | |||
1346 | } else { | 1346 | } else { |
1347 | if (netif_msg_probe(tp)) { | 1347 | if (netif_msg_probe(tp)) { |
1348 | printk(KERN_ERR PFX | 1348 | printk(KERN_ERR PFX |
1349 | "Cannot find PowerManagement capability. " | 1349 | "PowerManagement capability not found.\n"); |
1350 | "Aborting.\n"); | ||
1351 | } | 1350 | } |
1352 | goto err_out_mwi; | ||
1353 | } | 1351 | } |
1354 | 1352 | ||
1355 | /* make sure PCI base addr 1 is MMIO */ | 1353 | /* make sure PCI base addr 1 is MMIO */ |
@@ -2516,7 +2514,7 @@ rtl8169_interrupt(int irq, void *dev_instance, struct pt_regs *regs) | |||
2516 | } while (boguscnt > 0); | 2514 | } while (boguscnt > 0); |
2517 | 2515 | ||
2518 | if (boguscnt <= 0) { | 2516 | if (boguscnt <= 0) { |
2519 | if (net_ratelimit() && netif_msg_intr(tp)) { | 2517 | if (netif_msg_intr(tp) && net_ratelimit() ) { |
2520 | printk(KERN_WARNING | 2518 | printk(KERN_WARNING |
2521 | "%s: Too much work at interrupt!\n", dev->name); | 2519 | "%s: Too much work at interrupt!\n", dev->name); |
2522 | } | 2520 | } |
diff --git a/drivers/net/saa9730.h b/drivers/net/saa9730.h index 9e9da6b4080f..a7e9d29a86a7 100644 --- a/drivers/net/saa9730.h +++ b/drivers/net/saa9730.h | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Carsten Langgaard, carstenl@mips.com | 2 | * Copyright (C) 2000, 2005 MIPS Technologies, Inc. All rights reserved. |
3 | * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved. | 3 | * Authors: Carsten Langgaard <carstenl@mips.com> |
4 | * Maciej W. Rozycki <macro@mips.com> | ||
4 | * | 5 | * |
5 | * ######################################################################## | 6 | * ######################################################################## |
6 | * | 7 | * |
@@ -265,6 +266,7 @@ | |||
265 | 266 | ||
266 | /* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */ | 267 | /* The SAA9730 (LAN) controller register map, as seen via the PCI-bus. */ |
267 | #define SAA9730_LAN_REGS_ADDR 0x20400 | 268 | #define SAA9730_LAN_REGS_ADDR 0x20400 |
269 | #define SAA9730_LAN_REGS_SIZE 0x00400 | ||
268 | 270 | ||
269 | struct lan_saa9730_regmap { | 271 | struct lan_saa9730_regmap { |
270 | volatile unsigned int TxBuffA; /* 0x20400 */ | 272 | volatile unsigned int TxBuffA; /* 0x20400 */ |
@@ -309,6 +311,7 @@ typedef volatile struct lan_saa9730_regmap t_lan_saa9730_regmap; | |||
309 | 311 | ||
310 | /* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */ | 312 | /* The SAA9730 (EVM) controller register map, as seen via the PCI-bus. */ |
311 | #define SAA9730_EVM_REGS_ADDR 0x02000 | 313 | #define SAA9730_EVM_REGS_ADDR 0x02000 |
314 | #define SAA9730_EVM_REGS_SIZE 0x00400 | ||
312 | 315 | ||
313 | struct evm_saa9730_regmap { | 316 | struct evm_saa9730_regmap { |
314 | volatile unsigned int InterruptStatus1; /* 0x2000 */ | 317 | volatile unsigned int InterruptStatus1; /* 0x2000 */ |
@@ -329,16 +332,32 @@ typedef volatile struct evm_saa9730_regmap t_evm_saa9730_regmap; | |||
329 | 332 | ||
330 | 333 | ||
331 | struct lan_saa9730_private { | 334 | struct lan_saa9730_private { |
335 | /* | ||
336 | * Rx/Tx packet buffers. | ||
337 | * The Rx and Tx packets must be PACKET_SIZE aligned. | ||
338 | */ | ||
339 | void *buffer_start; | ||
340 | unsigned int buffer_size; | ||
341 | |||
342 | /* | ||
343 | * DMA address of beginning of this object, returned | ||
344 | * by pci_alloc_consistent(). | ||
345 | */ | ||
346 | dma_addr_t dma_addr; | ||
347 | |||
348 | /* Pointer to the associated pci device structure */ | ||
349 | struct pci_dev *pci_dev; | ||
350 | |||
332 | /* Pointer for the SAA9730 LAN controller register set. */ | 351 | /* Pointer for the SAA9730 LAN controller register set. */ |
333 | t_lan_saa9730_regmap *lan_saa9730_regs; | 352 | t_lan_saa9730_regmap *lan_saa9730_regs; |
334 | 353 | ||
335 | /* Pointer to the SAA9730 EVM register. */ | 354 | /* Pointer to the SAA9730 EVM register. */ |
336 | t_evm_saa9730_regmap *evm_saa9730_regs; | 355 | t_evm_saa9730_regmap *evm_saa9730_regs; |
337 | 356 | ||
338 | /* TRUE if the next buffer to write is RxBuffA, FALSE if RxBuffB. */ | ||
339 | unsigned char NextRcvToUseIsA; | ||
340 | /* Rcv buffer Index. */ | 357 | /* Rcv buffer Index. */ |
341 | unsigned char NextRcvPacketIndex; | 358 | unsigned char NextRcvPacketIndex; |
359 | /* Next buffer index. */ | ||
360 | unsigned char NextRcvBufferIndex; | ||
342 | 361 | ||
343 | /* Index of next packet to use in that buffer. */ | 362 | /* Index of next packet to use in that buffer. */ |
344 | unsigned char NextTxmPacketIndex; | 363 | unsigned char NextTxmPacketIndex; |
@@ -353,13 +372,8 @@ struct lan_saa9730_private { | |||
353 | unsigned char DmaRcvPackets; | 372 | unsigned char DmaRcvPackets; |
354 | unsigned char DmaTxmPackets; | 373 | unsigned char DmaTxmPackets; |
355 | 374 | ||
356 | unsigned char RcvAIndex; /* index into RcvBufferSpace[] for Blk A */ | 375 | void *TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE]; |
357 | unsigned char RcvBIndex; /* index into RcvBufferSpace[] for Blk B */ | 376 | void *RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE]; |
358 | |||
359 | unsigned int | ||
360 | TxmBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_TXM_Q_SIZE]; | ||
361 | unsigned int | ||
362 | RcvBuffer[LAN_SAA9730_BUFFERS][LAN_SAA9730_RCV_Q_SIZE]; | ||
363 | unsigned int TxBufferFree[LAN_SAA9730_BUFFERS]; | 377 | unsigned int TxBufferFree[LAN_SAA9730_BUFFERS]; |
364 | 378 | ||
365 | unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES][6]; | 379 | unsigned char PhysicalAddress[LAN_SAA9730_CAM_ENTRIES][6]; |
diff --git a/drivers/net/smc91x.c b/drivers/net/smc91x.c index c91e2e81f131..28bf2e69eb5e 100644 --- a/drivers/net/smc91x.c +++ b/drivers/net/smc91x.c | |||
@@ -155,6 +155,12 @@ MODULE_LICENSE("GPL"); | |||
155 | #define MEMORY_WAIT_TIME 16 | 155 | #define MEMORY_WAIT_TIME 16 |
156 | 156 | ||
157 | /* | 157 | /* |
158 | * The maximum number of processing loops allowed for each call to the | ||
159 | * IRQ handler. | ||
160 | */ | ||
161 | #define MAX_IRQ_LOOPS 8 | ||
162 | |||
163 | /* | ||
158 | * This selects whether TX packets are sent one by one to the SMC91x internal | 164 | * This selects whether TX packets are sent one by one to the SMC91x internal |
159 | * memory and throttled until transmission completes. This may prevent | 165 | * memory and throttled until transmission completes. This may prevent |
160 | * RX overruns a litle by keeping much of the memory free for RX packets | 166 | * RX overruns a litle by keeping much of the memory free for RX packets |
@@ -684,7 +690,6 @@ static void smc_hardware_send_pkt(unsigned long data) | |||
684 | 690 | ||
685 | /* queue the packet for TX */ | 691 | /* queue the packet for TX */ |
686 | SMC_SET_MMU_CMD(MC_ENQUEUE); | 692 | SMC_SET_MMU_CMD(MC_ENQUEUE); |
687 | SMC_ACK_INT(IM_TX_EMPTY_INT); | ||
688 | smc_special_unlock(&lp->lock); | 693 | smc_special_unlock(&lp->lock); |
689 | 694 | ||
690 | dev->trans_start = jiffies; | 695 | dev->trans_start = jiffies; |
@@ -1207,6 +1212,7 @@ static void smc_phy_configure(void *data) | |||
1207 | smc_phy_check_media(dev, 1); | 1212 | smc_phy_check_media(dev, 1); |
1208 | 1213 | ||
1209 | smc_phy_configure_exit: | 1214 | smc_phy_configure_exit: |
1215 | SMC_SELECT_BANK(2); | ||
1210 | spin_unlock_irq(&lp->lock); | 1216 | spin_unlock_irq(&lp->lock); |
1211 | lp->work_pending = 0; | 1217 | lp->work_pending = 0; |
1212 | } | 1218 | } |
@@ -1305,7 +1311,7 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
1305 | SMC_SET_INT_MASK(0); | 1311 | SMC_SET_INT_MASK(0); |
1306 | 1312 | ||
1307 | /* set a timeout value, so I don't stay here forever */ | 1313 | /* set a timeout value, so I don't stay here forever */ |
1308 | timeout = 8; | 1314 | timeout = MAX_IRQ_LOOPS; |
1309 | 1315 | ||
1310 | do { | 1316 | do { |
1311 | status = SMC_GET_INT(); | 1317 | status = SMC_GET_INT(); |
@@ -1372,10 +1378,13 @@ static irqreturn_t smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
1372 | /* restore register states */ | 1378 | /* restore register states */ |
1373 | SMC_SET_PTR(saved_pointer); | 1379 | SMC_SET_PTR(saved_pointer); |
1374 | SMC_SET_INT_MASK(mask); | 1380 | SMC_SET_INT_MASK(mask); |
1375 | |||
1376 | spin_unlock(&lp->lock); | 1381 | spin_unlock(&lp->lock); |
1377 | 1382 | ||
1378 | DBG(3, "%s: Interrupt done (%d loops)\n", dev->name, 8-timeout); | 1383 | if (timeout == MAX_IRQ_LOOPS) |
1384 | PRINTK("%s: spurious interrupt (mask = 0x%02x)\n", | ||
1385 | dev->name, mask); | ||
1386 | DBG(3, "%s: Interrupt done (%d loops)\n", | ||
1387 | dev->name, MAX_IRQ_LOOPS - timeout); | ||
1379 | 1388 | ||
1380 | /* | 1389 | /* |
1381 | * We return IRQ_HANDLED unconditionally here even if there was | 1390 | * We return IRQ_HANDLED unconditionally here even if there was |
diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c index a01efa6d5c62..1fd04662c4fc 100644 --- a/drivers/net/wan/hdlc_cisco.c +++ b/drivers/net/wan/hdlc_cisco.c | |||
@@ -192,7 +192,9 @@ static int cisco_rx(struct sk_buff *skb) | |||
192 | "uptime %ud%uh%um%us)\n", | 192 | "uptime %ud%uh%um%us)\n", |
193 | dev->name, days, hrs, | 193 | dev->name, days, hrs, |
194 | min, sec); | 194 | min, sec); |
195 | #if 0 | ||
195 | netif_carrier_on(dev); | 196 | netif_carrier_on(dev); |
197 | #endif | ||
196 | hdlc->state.cisco.up = 1; | 198 | hdlc->state.cisco.up = 1; |
197 | } | 199 | } |
198 | } | 200 | } |
@@ -225,7 +227,9 @@ static void cisco_timer(unsigned long arg) | |||
225 | hdlc->state.cisco.settings.timeout * HZ)) { | 227 | hdlc->state.cisco.settings.timeout * HZ)) { |
226 | hdlc->state.cisco.up = 0; | 228 | hdlc->state.cisco.up = 0; |
227 | printk(KERN_INFO "%s: Link down\n", dev->name); | 229 | printk(KERN_INFO "%s: Link down\n", dev->name); |
230 | #if 0 | ||
228 | netif_carrier_off(dev); | 231 | netif_carrier_off(dev); |
232 | #endif | ||
229 | } | 233 | } |
230 | 234 | ||
231 | cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, | 235 | cisco_keepalive_send(dev, CISCO_KEEPALIVE_REQ, |
@@ -261,8 +265,10 @@ static void cisco_stop(struct net_device *dev) | |||
261 | { | 265 | { |
262 | hdlc_device *hdlc = dev_to_hdlc(dev); | 266 | hdlc_device *hdlc = dev_to_hdlc(dev); |
263 | del_timer_sync(&hdlc->state.cisco.timer); | 267 | del_timer_sync(&hdlc->state.cisco.timer); |
268 | #if 0 | ||
264 | if (netif_carrier_ok(dev)) | 269 | if (netif_carrier_ok(dev)) |
265 | netif_carrier_off(dev); | 270 | netif_carrier_off(dev); |
271 | #endif | ||
266 | hdlc->state.cisco.up = 0; | 272 | hdlc->state.cisco.up = 0; |
267 | hdlc->state.cisco.request_sent = 0; | 273 | hdlc->state.cisco.request_sent = 0; |
268 | } | 274 | } |
diff --git a/drivers/net/wan/hdlc_fr.c b/drivers/net/wan/hdlc_fr.c index e1601d35dced..523afe17564e 100644 --- a/drivers/net/wan/hdlc_fr.c +++ b/drivers/net/wan/hdlc_fr.c | |||
@@ -545,8 +545,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev) | |||
545 | 545 | ||
546 | hdlc->state.fr.reliable = reliable; | 546 | hdlc->state.fr.reliable = reliable; |
547 | if (reliable) { | 547 | if (reliable) { |
548 | #if 0 | ||
548 | if (!netif_carrier_ok(dev)) | 549 | if (!netif_carrier_ok(dev)) |
549 | netif_carrier_on(dev); | 550 | netif_carrier_on(dev); |
551 | #endif | ||
550 | 552 | ||
551 | hdlc->state.fr.n391cnt = 0; /* Request full status */ | 553 | hdlc->state.fr.n391cnt = 0; /* Request full status */ |
552 | hdlc->state.fr.dce_changed = 1; | 554 | hdlc->state.fr.dce_changed = 1; |
@@ -560,8 +562,10 @@ static void fr_set_link_state(int reliable, struct net_device *dev) | |||
560 | } | 562 | } |
561 | } | 563 | } |
562 | } else { | 564 | } else { |
565 | #if 0 | ||
563 | if (netif_carrier_ok(dev)) | 566 | if (netif_carrier_ok(dev)) |
564 | netif_carrier_off(dev); | 567 | netif_carrier_off(dev); |
568 | #endif | ||
565 | 569 | ||
566 | while (pvc) { /* Deactivate all PVCs */ | 570 | while (pvc) { /* Deactivate all PVCs */ |
567 | pvc_carrier(0, pvc); | 571 | pvc_carrier(0, pvc); |
diff --git a/drivers/net/wan/hdlc_generic.c b/drivers/net/wan/hdlc_generic.c index cdd4c09c2d90..46cef8f92133 100644 --- a/drivers/net/wan/hdlc_generic.c +++ b/drivers/net/wan/hdlc_generic.c | |||
@@ -79,11 +79,13 @@ static void __hdlc_set_carrier_on(struct net_device *dev) | |||
79 | hdlc_device *hdlc = dev_to_hdlc(dev); | 79 | hdlc_device *hdlc = dev_to_hdlc(dev); |
80 | if (hdlc->proto.start) | 80 | if (hdlc->proto.start) |
81 | return hdlc->proto.start(dev); | 81 | return hdlc->proto.start(dev); |
82 | #if 0 | ||
82 | #ifdef DEBUG_LINK | 83 | #ifdef DEBUG_LINK |
83 | if (netif_carrier_ok(dev)) | 84 | if (netif_carrier_ok(dev)) |
84 | printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); | 85 | printk(KERN_ERR "hdlc_set_carrier_on(): already on\n"); |
85 | #endif | 86 | #endif |
86 | netif_carrier_on(dev); | 87 | netif_carrier_on(dev); |
88 | #endif | ||
87 | } | 89 | } |
88 | 90 | ||
89 | 91 | ||
@@ -94,11 +96,13 @@ static void __hdlc_set_carrier_off(struct net_device *dev) | |||
94 | if (hdlc->proto.stop) | 96 | if (hdlc->proto.stop) |
95 | return hdlc->proto.stop(dev); | 97 | return hdlc->proto.stop(dev); |
96 | 98 | ||
99 | #if 0 | ||
97 | #ifdef DEBUG_LINK | 100 | #ifdef DEBUG_LINK |
98 | if (!netif_carrier_ok(dev)) | 101 | if (!netif_carrier_ok(dev)) |
99 | printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); | 102 | printk(KERN_ERR "hdlc_set_carrier_off(): already off\n"); |
100 | #endif | 103 | #endif |
101 | netif_carrier_off(dev); | 104 | netif_carrier_off(dev); |
105 | #endif | ||
102 | } | 106 | } |
103 | 107 | ||
104 | 108 | ||
@@ -294,8 +298,10 @@ int register_hdlc_device(struct net_device *dev) | |||
294 | if (result != 0) | 298 | if (result != 0) |
295 | return -EIO; | 299 | return -EIO; |
296 | 300 | ||
301 | #if 0 | ||
297 | if (netif_carrier_ok(dev)) | 302 | if (netif_carrier_ok(dev)) |
298 | netif_carrier_off(dev); /* no carrier until DCD goes up */ | 303 | netif_carrier_off(dev); /* no carrier until DCD goes up */ |
304 | #endif | ||
299 | 305 | ||
300 | return 0; | 306 | return 0; |
301 | } | 307 | } |
diff --git a/drivers/net/wireless/hermes.c b/drivers/net/wireless/hermes.c index 579480dad374..346c6febb033 100644 --- a/drivers/net/wireless/hermes.c +++ b/drivers/net/wireless/hermes.c | |||
@@ -398,7 +398,7 @@ static int hermes_bap_seek(hermes_t *hw, int bap, u16 id, u16 offset) | |||
398 | * | 398 | * |
399 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware | 399 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware |
400 | */ | 400 | */ |
401 | int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len, | 401 | int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, |
402 | u16 id, u16 offset) | 402 | u16 id, u16 offset) |
403 | { | 403 | { |
404 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; | 404 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; |
@@ -424,7 +424,7 @@ int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len, | |||
424 | * | 424 | * |
425 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware | 425 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware |
426 | */ | 426 | */ |
427 | int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len, | 427 | int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, |
428 | u16 id, u16 offset) | 428 | u16 id, u16 offset) |
429 | { | 429 | { |
430 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; | 430 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; |
@@ -450,7 +450,7 @@ int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len, | |||
450 | * | 450 | * |
451 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware | 451 | * Returns: < 0 on internal failure (errno), 0 on success, > 0 on error from firmware |
452 | */ | 452 | */ |
453 | int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, unsigned len, | 453 | int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, unsigned data_len, int len, |
454 | u16 id, u16 offset) | 454 | u16 id, u16 offset) |
455 | { | 455 | { |
456 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; | 456 | int dreg = bap ? HERMES_DATA1 : HERMES_DATA0; |
diff --git a/drivers/net/wireless/hermes.h b/drivers/net/wireless/hermes.h index a6bd472d75d4..7644f72a9f4e 100644 --- a/drivers/net/wireless/hermes.h +++ b/drivers/net/wireless/hermes.h | |||
@@ -372,12 +372,12 @@ int hermes_docmd_wait(hermes_t *hw, u16 cmd, u16 parm0, | |||
372 | struct hermes_response *resp); | 372 | struct hermes_response *resp); |
373 | int hermes_allocate(hermes_t *hw, u16 size, u16 *fid); | 373 | int hermes_allocate(hermes_t *hw, u16 size, u16 *fid); |
374 | 374 | ||
375 | int hermes_bap_pread(hermes_t *hw, int bap, void *buf, unsigned len, | 375 | int hermes_bap_pread(hermes_t *hw, int bap, void *buf, int len, |
376 | u16 id, u16 offset); | 376 | u16 id, u16 offset); |
377 | int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, unsigned len, | 377 | int hermes_bap_pwrite(hermes_t *hw, int bap, const void *buf, int len, |
378 | u16 id, u16 offset); | 378 | u16 id, u16 offset); |
379 | int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, | 379 | int hermes_bap_pwrite_pad(hermes_t *hw, int bap, const void *buf, |
380 | unsigned data_len, unsigned len, u16 id, u16 offset); | 380 | unsigned data_len, int len, u16 id, u16 offset); |
381 | int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen, | 381 | int hermes_read_ltv(hermes_t *hw, int bap, u16 rid, unsigned buflen, |
382 | u16 *length, void *buf); | 382 | u16 *length, void *buf); |
383 | int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, | 383 | int hermes_write_ltv(hermes_t *hw, int bap, u16 rid, |
diff --git a/drivers/net/wireless/i82593.h b/drivers/net/wireless/i82593.h index 33acb8add4d6..afac5c7a323d 100644 --- a/drivers/net/wireless/i82593.h +++ b/drivers/net/wireless/i82593.h | |||
@@ -7,11 +7,16 @@ | |||
7 | * | 7 | * |
8 | * Copyright 1994, Anders Klemets <klemets@it.kth.se> | 8 | * Copyright 1994, Anders Klemets <klemets@it.kth.se> |
9 | * | 9 | * |
10 | * This software may be freely distributed for noncommercial purposes | ||
11 | * as long as this notice is retained. | ||
12 | * | ||
13 | * HISTORY | 10 | * HISTORY |
14 | * i82593.h,v | 11 | * i82593.h,v |
12 | * Revision 1.4 2005/11/4 09:15:00 baroniunas | ||
13 | * Modified copyright with permission of author as follows: | ||
14 | * | ||
15 | * "If I82539.H is the only file with my copyright statement | ||
16 | * that is included in the Source Forge project, then you have | ||
17 | * my approval to change the copyright statement to be a GPL | ||
18 | * license, in the way you proposed on October 10." | ||
19 | * | ||
15 | * Revision 1.1 1996/07/17 15:23:12 root | 20 | * Revision 1.1 1996/07/17 15:23:12 root |
16 | * Initial revision | 21 | * Initial revision |
17 | * | 22 | * |
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index a2e6214169e9..77d2a21d4cd0 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c | |||
@@ -6344,7 +6344,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, | |||
6344 | dev->ethtool_ops = &ipw2100_ethtool_ops; | 6344 | dev->ethtool_ops = &ipw2100_ethtool_ops; |
6345 | dev->tx_timeout = ipw2100_tx_timeout; | 6345 | dev->tx_timeout = ipw2100_tx_timeout; |
6346 | dev->wireless_handlers = &ipw2100_wx_handler_def; | 6346 | dev->wireless_handlers = &ipw2100_wx_handler_def; |
6347 | dev->get_wireless_stats = ipw2100_wx_wireless_stats; | 6347 | priv->wireless_data.ieee80211 = priv->ieee; |
6348 | dev->wireless_data = &priv->wireless_data; | ||
6348 | dev->set_mac_address = ipw2100_set_address; | 6349 | dev->set_mac_address = ipw2100_set_address; |
6349 | dev->watchdog_timeo = 3 * HZ; | 6350 | dev->watchdog_timeo = 3 * HZ; |
6350 | dev->irq = 0; | 6351 | dev->irq = 0; |
@@ -7178,6 +7179,11 @@ static int ipw2100_wx_get_range(struct net_device *dev, | |||
7178 | } | 7179 | } |
7179 | range->num_frequency = val; | 7180 | range->num_frequency = val; |
7180 | 7181 | ||
7182 | /* Event capability (kernel + driver) */ | ||
7183 | range->event_capa[0] = (IW_EVENT_CAPA_K_0 | | ||
7184 | IW_EVENT_CAPA_MASK(SIOCGIWAP)); | ||
7185 | range->event_capa[1] = IW_EVENT_CAPA_K_1; | ||
7186 | |||
7181 | IPW_DEBUG_WX("GET Range\n"); | 7187 | IPW_DEBUG_WX("GET Range\n"); |
7182 | 7188 | ||
7183 | return 0; | 7189 | return 0; |
@@ -8446,16 +8452,6 @@ static iw_handler ipw2100_private_handler[] = { | |||
8446 | #endif /* CONFIG_IPW2100_MONITOR */ | 8452 | #endif /* CONFIG_IPW2100_MONITOR */ |
8447 | }; | 8453 | }; |
8448 | 8454 | ||
8449 | static struct iw_handler_def ipw2100_wx_handler_def = { | ||
8450 | .standard = ipw2100_wx_handlers, | ||
8451 | .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler), | ||
8452 | .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler), | ||
8453 | .num_private_args = sizeof(ipw2100_private_args) / | ||
8454 | sizeof(struct iw_priv_args), | ||
8455 | .private = (iw_handler *) ipw2100_private_handler, | ||
8456 | .private_args = (struct iw_priv_args *)ipw2100_private_args, | ||
8457 | }; | ||
8458 | |||
8459 | /* | 8455 | /* |
8460 | * Get wireless statistics. | 8456 | * Get wireless statistics. |
8461 | * Called by /proc/net/wireless | 8457 | * Called by /proc/net/wireless |
@@ -8597,6 +8593,17 @@ static struct iw_statistics *ipw2100_wx_wireless_stats(struct net_device *dev) | |||
8597 | return (struct iw_statistics *)NULL; | 8593 | return (struct iw_statistics *)NULL; |
8598 | } | 8594 | } |
8599 | 8595 | ||
8596 | static struct iw_handler_def ipw2100_wx_handler_def = { | ||
8597 | .standard = ipw2100_wx_handlers, | ||
8598 | .num_standard = sizeof(ipw2100_wx_handlers) / sizeof(iw_handler), | ||
8599 | .num_private = sizeof(ipw2100_private_handler) / sizeof(iw_handler), | ||
8600 | .num_private_args = sizeof(ipw2100_private_args) / | ||
8601 | sizeof(struct iw_priv_args), | ||
8602 | .private = (iw_handler *) ipw2100_private_handler, | ||
8603 | .private_args = (struct iw_priv_args *)ipw2100_private_args, | ||
8604 | .get_wireless_stats = ipw2100_wx_wireless_stats, | ||
8605 | }; | ||
8606 | |||
8600 | static void ipw2100_wx_event_work(struct ipw2100_priv *priv) | 8607 | static void ipw2100_wx_event_work(struct ipw2100_priv *priv) |
8601 | { | 8608 | { |
8602 | union iwreq_data wrqu; | 8609 | union iwreq_data wrqu; |
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h index 140fdf2a0a09..7c65b10bb164 100644 --- a/drivers/net/wireless/ipw2100.h +++ b/drivers/net/wireless/ipw2100.h | |||
@@ -571,6 +571,8 @@ struct ipw2100_priv { | |||
571 | struct net_device *net_dev; | 571 | struct net_device *net_dev; |
572 | struct iw_statistics wstats; | 572 | struct iw_statistics wstats; |
573 | 573 | ||
574 | struct iw_public_data wireless_data; | ||
575 | |||
574 | struct tasklet_struct irq_tasklet; | 576 | struct tasklet_struct irq_tasklet; |
575 | 577 | ||
576 | struct workqueue_struct *workqueue; | 578 | struct workqueue_struct *workqueue; |
diff --git a/drivers/net/wireless/prism54/isl_38xx.c b/drivers/net/wireless/prism54/isl_38xx.c index 109a96d90007..23deee69974b 100644 --- a/drivers/net/wireless/prism54/isl_38xx.c +++ b/drivers/net/wireless/prism54/isl_38xx.c | |||
@@ -164,12 +164,12 @@ isl38xx_trigger_device(int asleep, void __iomem *device_base) | |||
164 | /* assert the Wakeup interrupt in the Device Interrupt Register */ | 164 | /* assert the Wakeup interrupt in the Device Interrupt Register */ |
165 | isl38xx_w32_flush(device_base, ISL38XX_DEV_INT_WAKEUP, | 165 | isl38xx_w32_flush(device_base, ISL38XX_DEV_INT_WAKEUP, |
166 | ISL38XX_DEV_INT_REG); | 166 | ISL38XX_DEV_INT_REG); |
167 | |||
168 | #if VERBOSE > SHOW_ERROR_MESSAGES | ||
167 | udelay(ISL38XX_WRITEIO_DELAY); | 169 | udelay(ISL38XX_WRITEIO_DELAY); |
168 | 170 | ||
169 | /* perform another read on the Device Status Register */ | 171 | /* perform another read on the Device Status Register */ |
170 | reg = readl(device_base + ISL38XX_CTRL_STAT_REG); | 172 | reg = readl(device_base + ISL38XX_CTRL_STAT_REG); |
171 | |||
172 | #if VERBOSE > SHOW_ERROR_MESSAGES | ||
173 | do_gettimeofday(¤t_time); | 173 | do_gettimeofday(¤t_time); |
174 | DEBUG(SHOW_TRACING, "%08li.%08li Device register read %08x\n", | 174 | DEBUG(SHOW_TRACING, "%08li.%08li Device register read %08x\n", |
175 | current_time.tv_sec, (long)current_time.tv_usec, reg); | 175 | current_time.tv_sec, (long)current_time.tv_usec, reg); |
diff --git a/drivers/parisc/iosapic.c b/drivers/parisc/iosapic.c index a39fbfef789a..19657efa8dc3 100644 --- a/drivers/parisc/iosapic.c +++ b/drivers/parisc/iosapic.c | |||
@@ -700,6 +700,28 @@ static unsigned int iosapic_startup_irq(unsigned int irq) | |||
700 | return 0; | 700 | return 0; |
701 | } | 701 | } |
702 | 702 | ||
703 | #ifdef CONFIG_SMP | ||
704 | static void iosapic_set_affinity_irq(unsigned int irq, cpumask_t dest) | ||
705 | { | ||
706 | struct vector_info *vi = iosapic_get_vector(irq); | ||
707 | u32 d0, d1, dummy_d0; | ||
708 | unsigned long flags; | ||
709 | |||
710 | if (cpu_check_affinity(irq, &dest)) | ||
711 | return; | ||
712 | |||
713 | vi->txn_addr = txn_affinity_addr(irq, first_cpu(dest)); | ||
714 | |||
715 | spin_lock_irqsave(&iosapic_lock, flags); | ||
716 | /* d1 contains the destination CPU, so only want to set that | ||
717 | * entry */ | ||
718 | iosapic_rd_irt_entry(vi, &d0, &d1); | ||
719 | iosapic_set_irt_data(vi, &dummy_d0, &d1); | ||
720 | iosapic_wr_irt_entry(vi, d0, d1); | ||
721 | spin_unlock_irqrestore(&iosapic_lock, flags); | ||
722 | } | ||
723 | #endif | ||
724 | |||
703 | static struct hw_interrupt_type iosapic_interrupt_type = { | 725 | static struct hw_interrupt_type iosapic_interrupt_type = { |
704 | .typename = "IO-SAPIC-level", | 726 | .typename = "IO-SAPIC-level", |
705 | .startup = iosapic_startup_irq, | 727 | .startup = iosapic_startup_irq, |
@@ -708,7 +730,9 @@ static struct hw_interrupt_type iosapic_interrupt_type = { | |||
708 | .disable = iosapic_disable_irq, | 730 | .disable = iosapic_disable_irq, |
709 | .ack = no_ack_irq, | 731 | .ack = no_ack_irq, |
710 | .end = iosapic_end_irq, | 732 | .end = iosapic_end_irq, |
711 | // .set_affinity = iosapic_set_affinity_irq, | 733 | #ifdef CONFIG_SMP |
734 | .set_affinity = iosapic_set_affinity_irq, | ||
735 | #endif | ||
712 | }; | 736 | }; |
713 | 737 | ||
714 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) | 738 | int iosapic_fixup_irq(void *isi_obj, struct pci_dev *pcidev) |
diff --git a/drivers/parisc/superio.c b/drivers/parisc/superio.c index bab3bcabcb6e..d14888e149bb 100644 --- a/drivers/parisc/superio.c +++ b/drivers/parisc/superio.c | |||
@@ -24,6 +24,9 @@ | |||
24 | * Major changes to get basic interrupt infrastructure working to | 24 | * Major changes to get basic interrupt infrastructure working to |
25 | * hopefully be able to support all SuperIO devices. Currently | 25 | * hopefully be able to support all SuperIO devices. Currently |
26 | * works with serial. -- John Marvin <jsm@fc.hp.com> | 26 | * works with serial. -- John Marvin <jsm@fc.hp.com> |
27 | * | ||
28 | * Converted superio_init() to be a PCI_FIXUP_FINAL callee. | ||
29 | * -- Kyle McMartin <kyle@parisc-linux.org> | ||
27 | */ | 30 | */ |
28 | 31 | ||
29 | 32 | ||
@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs) | |||
141 | } | 144 | } |
142 | 145 | ||
143 | /* Initialize Super I/O device */ | 146 | /* Initialize Super I/O device */ |
144 | 147 | static void | |
145 | static void __devinit | 148 | superio_init(struct pci_dev *pcidev) |
146 | superio_init(struct superio_device *sio) | ||
147 | { | 149 | { |
150 | struct superio_device *sio = &sio_dev; | ||
148 | struct pci_dev *pdev = sio->lio_pdev; | 151 | struct pci_dev *pdev = sio->lio_pdev; |
149 | u16 word; | 152 | u16 word; |
150 | 153 | ||
@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio) | |||
160 | /* ...then properly fixup the USB to point at suckyio PIC */ | 163 | /* ...then properly fixup the USB to point at suckyio PIC */ |
161 | sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); | 164 | sio->usb_pdev->irq = superio_fixup_irq(sio->usb_pdev); |
162 | 165 | ||
163 | printk (KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", | 166 | printk(KERN_INFO "SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i) \n", |
164 | pci_name(pdev),pdev->irq); | 167 | pci_name(pdev), pdev->irq); |
165 | 168 | ||
166 | pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); | 169 | pci_read_config_dword (pdev, SIO_SP1BAR, &sio->sp1_base); |
167 | sio->sp1_base &= ~1; | 170 | sio->sp1_base &= ~1; |
@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio) | |||
274 | 277 | ||
275 | sio->suckyio_irq_enabled = 1; | 278 | sio->suckyio_irq_enabled = 1; |
276 | } | 279 | } |
277 | 280 | DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO, superio_init); | |
278 | 281 | ||
279 | static void superio_disable_irq(unsigned int irq) | 282 | static void superio_disable_irq(unsigned int irq) |
280 | { | 283 | { |
@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev) | |||
452 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); | 455 | DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415, superio_fixup_pci); |
453 | 456 | ||
454 | 457 | ||
455 | static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_id *id) | 458 | static int __devinit |
459 | superio_probe(struct pci_dev *dev, const struct pci_device_id *id) | ||
456 | { | 460 | { |
461 | struct superio_device *sio = &sio_dev; | ||
457 | 462 | ||
458 | /* | 463 | /* |
459 | ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a | 464 | ** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a |
@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ | |||
466 | dev->subsystem_vendor, dev->subsystem_device, | 471 | dev->subsystem_vendor, dev->subsystem_device, |
467 | dev->class); | 472 | dev->class); |
468 | 473 | ||
469 | superio_init(&sio_dev); | 474 | if (!sio->suckyio_irq_enabled) |
475 | BUG(); /* Enabled by PCI_FIXUP_FINAL */ | ||
470 | 476 | ||
471 | if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ | 477 | if (dev->device == PCI_DEVICE_ID_NS_87560_LIO) { /* Function 1 */ |
472 | superio_parport_init(); | 478 | superio_parport_init(); |
@@ -481,19 +487,21 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_ | |||
481 | DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); | 487 | DBG_INIT("superio_probe: WTF? Fire Extinguisher?\n"); |
482 | } | 488 | } |
483 | 489 | ||
484 | /* Let appropriate other driver claim this device. */ | 490 | /* Let appropriate other driver claim this device. */ |
485 | return -ENODEV; | 491 | return -ENODEV; |
486 | } | 492 | } |
487 | 493 | ||
488 | static struct pci_device_id superio_tbl[] = { | 494 | static struct pci_device_id superio_tbl[] = { |
489 | { PCI_VENDOR_ID_NS, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0 }, | 495 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_LIO) }, |
496 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87560_USB) }, | ||
497 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_87415) }, | ||
490 | { 0, } | 498 | { 0, } |
491 | }; | 499 | }; |
492 | 500 | ||
493 | static struct pci_driver superio_driver = { | 501 | static struct pci_driver superio_driver = { |
494 | .name = "SuperIO", | 502 | .name = "SuperIO", |
495 | .id_table = superio_tbl, | 503 | .id_table = superio_tbl, |
496 | .probe = superio_probe, | 504 | .probe = superio_probe, |
497 | }; | 505 | }; |
498 | 506 | ||
499 | static int __init superio_modinit(void) | 507 | static int __init superio_modinit(void) |
@@ -506,6 +514,5 @@ static void __exit superio_exit(void) | |||
506 | pci_unregister_driver(&superio_driver); | 514 | pci_unregister_driver(&superio_driver); |
507 | } | 515 | } |
508 | 516 | ||
509 | |||
510 | module_init(superio_modinit); | 517 | module_init(superio_modinit); |
511 | module_exit(superio_exit); | 518 | module_exit(superio_exit); |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index e1960d69fb90..4cb1f3ed9100 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -784,8 +784,8 @@ static ide_proc_entry_t idescsi_proc[] = { | |||
784 | #endif | 784 | #endif |
785 | 785 | ||
786 | static ide_driver_t idescsi_driver = { | 786 | static ide_driver_t idescsi_driver = { |
787 | .owner = THIS_MODULE, | ||
788 | .gen_driver = { | 787 | .gen_driver = { |
788 | .owner = THIS_MODULE, | ||
789 | .name = "ide-scsi", | 789 | .name = "ide-scsi", |
790 | .bus = &ide_bus_type, | 790 | .bus = &ide_bus_type, |
791 | .probe = ide_scsi_probe, | 791 | .probe = ide_scsi_probe, |
diff --git a/drivers/scsi/sata_mv.c b/drivers/scsi/sata_mv.c index ac184e60797e..ab7432a5778e 100644 --- a/drivers/scsi/sata_mv.c +++ b/drivers/scsi/sata_mv.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * sata_mv.c - Marvell SATA support | 2 | * sata_mv.c - Marvell SATA support |
3 | * | 3 | * |
4 | * Copyright 2005: EMC Corporation, all rights reserved. | 4 | * Copyright 2005: EMC Corporation, all rights reserved. |
5 | * Copyright 2005 Red Hat, Inc. All rights reserved. | ||
5 | * | 6 | * |
6 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. | 7 | * Please ALWAYS copy linux-ide@vger.kernel.org on emails. |
7 | * | 8 | * |
@@ -36,7 +37,7 @@ | |||
36 | #include <asm/io.h> | 37 | #include <asm/io.h> |
37 | 38 | ||
38 | #define DRV_NAME "sata_mv" | 39 | #define DRV_NAME "sata_mv" |
39 | #define DRV_VERSION "0.25" | 40 | #define DRV_VERSION "0.5" |
40 | 41 | ||
41 | enum { | 42 | enum { |
42 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | 43 | /* BAR's are enumerated in terms of pci_resource_start() terms */ |
diff --git a/drivers/scsi/sata_sil24.c b/drivers/scsi/sata_sil24.c index cb1933a3bd55..e0d6f194f54f 100644 --- a/drivers/scsi/sata_sil24.c +++ b/drivers/scsi/sata_sil24.c | |||
@@ -5,17 +5,6 @@ | |||
5 | * | 5 | * |
6 | * Based on preview driver from Silicon Image. | 6 | * Based on preview driver from Silicon Image. |
7 | * | 7 | * |
8 | * NOTE: No NCQ/ATAPI support yet. The preview driver didn't support | ||
9 | * NCQ nor ATAPI, and, unfortunately, I couldn't find out how to make | ||
10 | * those work. Enabling those shouldn't be difficult. Basic | ||
11 | * structure is all there (in libata-dev tree). If you have any | ||
12 | * information about this hardware, please contact me or linux-ide. | ||
13 | * Info is needed on... | ||
14 | * | ||
15 | * - How to issue tagged commands and turn on sactive on issue accordingly. | ||
16 | * - Where to put an ATAPI command and how to tell the device to send it. | ||
17 | * - How to enable/use 64bit. | ||
18 | * | ||
19 | * This program is free software; you can redistribute it and/or modify it | 8 | * This program is free software; you can redistribute it and/or modify it |
20 | * under the terms of the GNU General Public License as published by the | 9 | * under the terms of the GNU General Public License as published by the |
21 | * Free Software Foundation; either version 2, or (at your option) any | 10 | * Free Software Foundation; either version 2, or (at your option) any |
@@ -42,7 +31,7 @@ | |||
42 | #include <asm/io.h> | 31 | #include <asm/io.h> |
43 | 32 | ||
44 | #define DRV_NAME "sata_sil24" | 33 | #define DRV_NAME "sata_sil24" |
45 | #define DRV_VERSION "0.22" /* Silicon Image's preview driver was 0.10 */ | 34 | #define DRV_VERSION "0.23" |
46 | 35 | ||
47 | /* | 36 | /* |
48 | * Port request block (PRB) 32 bytes | 37 | * Port request block (PRB) 32 bytes |
@@ -221,11 +210,22 @@ enum { | |||
221 | IRQ_STAT_4PORTS = 0xf, | 210 | IRQ_STAT_4PORTS = 0xf, |
222 | }; | 211 | }; |
223 | 212 | ||
224 | struct sil24_cmd_block { | 213 | struct sil24_ata_block { |
225 | struct sil24_prb prb; | 214 | struct sil24_prb prb; |
226 | struct sil24_sge sge[LIBATA_MAX_PRD]; | 215 | struct sil24_sge sge[LIBATA_MAX_PRD]; |
227 | }; | 216 | }; |
228 | 217 | ||
218 | struct sil24_atapi_block { | ||
219 | struct sil24_prb prb; | ||
220 | u8 cdb[16]; | ||
221 | struct sil24_sge sge[LIBATA_MAX_PRD - 1]; | ||
222 | }; | ||
223 | |||
224 | union sil24_cmd_block { | ||
225 | struct sil24_ata_block ata; | ||
226 | struct sil24_atapi_block atapi; | ||
227 | }; | ||
228 | |||
229 | /* | 229 | /* |
230 | * ap->private_data | 230 | * ap->private_data |
231 | * | 231 | * |
@@ -233,7 +233,7 @@ struct sil24_cmd_block { | |||
233 | * here from the previous interrupt. | 233 | * here from the previous interrupt. |
234 | */ | 234 | */ |
235 | struct sil24_port_priv { | 235 | struct sil24_port_priv { |
236 | struct sil24_cmd_block *cmd_block; /* 32 cmd blocks */ | 236 | union sil24_cmd_block *cmd_block; /* 32 cmd blocks */ |
237 | dma_addr_t cmd_block_dma; /* DMA base addr for them */ | 237 | dma_addr_t cmd_block_dma; /* DMA base addr for them */ |
238 | struct ata_taskfile tf; /* Cached taskfile registers */ | 238 | struct ata_taskfile tf; /* Cached taskfile registers */ |
239 | }; | 239 | }; |
@@ -244,6 +244,7 @@ struct sil24_host_priv { | |||
244 | void __iomem *port_base; /* port registers (4 * 8192 bytes @BAR2) */ | 244 | void __iomem *port_base; /* port registers (4 * 8192 bytes @BAR2) */ |
245 | }; | 245 | }; |
246 | 246 | ||
247 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev); | ||
247 | static u8 sil24_check_status(struct ata_port *ap); | 248 | static u8 sil24_check_status(struct ata_port *ap); |
248 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); | 249 | static u32 sil24_scr_read(struct ata_port *ap, unsigned sc_reg); |
249 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); | 250 | static void sil24_scr_write(struct ata_port *ap, unsigned sc_reg, u32 val); |
@@ -297,6 +298,8 @@ static struct scsi_host_template sil24_sht = { | |||
297 | static const struct ata_port_operations sil24_ops = { | 298 | static const struct ata_port_operations sil24_ops = { |
298 | .port_disable = ata_port_disable, | 299 | .port_disable = ata_port_disable, |
299 | 300 | ||
301 | .dev_config = sil24_dev_config, | ||
302 | |||
300 | .check_status = sil24_check_status, | 303 | .check_status = sil24_check_status, |
301 | .check_altstatus = sil24_check_status, | 304 | .check_altstatus = sil24_check_status, |
302 | .dev_select = ata_noop_dev_select, | 305 | .dev_select = ata_noop_dev_select, |
@@ -333,7 +336,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
333 | { | 336 | { |
334 | .sht = &sil24_sht, | 337 | .sht = &sil24_sht, |
335 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 338 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
336 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 339 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
337 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), | 340 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(4), |
338 | .pio_mask = 0x1f, /* pio0-4 */ | 341 | .pio_mask = 0x1f, /* pio0-4 */ |
339 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 342 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -344,7 +347,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
344 | { | 347 | { |
345 | .sht = &sil24_sht, | 348 | .sht = &sil24_sht, |
346 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 349 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
347 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 350 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
348 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), | 351 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(2), |
349 | .pio_mask = 0x1f, /* pio0-4 */ | 352 | .pio_mask = 0x1f, /* pio0-4 */ |
350 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 353 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -355,7 +358,7 @@ static struct ata_port_info sil24_port_info[] = { | |||
355 | { | 358 | { |
356 | .sht = &sil24_sht, | 359 | .sht = &sil24_sht, |
357 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 360 | .host_flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
358 | ATA_FLAG_SATA_RESET | ATA_FLAG_MMIO | | 361 | ATA_FLAG_SRST | ATA_FLAG_MMIO | |
359 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), | 362 | ATA_FLAG_PIO_DMA | SIL24_NPORTS2FLAG(1), |
360 | .pio_mask = 0x1f, /* pio0-4 */ | 363 | .pio_mask = 0x1f, /* pio0-4 */ |
361 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 364 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
@@ -364,6 +367,16 @@ static struct ata_port_info sil24_port_info[] = { | |||
364 | }, | 367 | }, |
365 | }; | 368 | }; |
366 | 369 | ||
370 | static void sil24_dev_config(struct ata_port *ap, struct ata_device *dev) | ||
371 | { | ||
372 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; | ||
373 | |||
374 | if (ap->cdb_len == 16) | ||
375 | writel(PORT_CS_CDB16, port + PORT_CTRL_STAT); | ||
376 | else | ||
377 | writel(PORT_CS_CDB16, port + PORT_CTRL_CLR); | ||
378 | } | ||
379 | |||
367 | static inline void sil24_update_tf(struct ata_port *ap) | 380 | static inline void sil24_update_tf(struct ata_port *ap) |
368 | { | 381 | { |
369 | struct sil24_port_priv *pp = ap->private_data; | 382 | struct sil24_port_priv *pp = ap->private_data; |
@@ -415,22 +428,73 @@ static void sil24_tf_read(struct ata_port *ap, struct ata_taskfile *tf) | |||
415 | *tf = pp->tf; | 428 | *tf = pp->tf; |
416 | } | 429 | } |
417 | 430 | ||
418 | static void sil24_phy_reset(struct ata_port *ap) | 431 | static int sil24_issue_SRST(struct ata_port *ap) |
419 | { | 432 | { |
420 | __sata_phy_reset(ap); | 433 | void __iomem *port = (void __iomem *)ap->ioaddr.cmd_addr; |
434 | struct sil24_port_priv *pp = ap->private_data; | ||
435 | struct sil24_prb *prb = &pp->cmd_block[0].ata.prb; | ||
436 | dma_addr_t paddr = pp->cmd_block_dma; | ||
437 | u32 irq_enable, irq_stat; | ||
438 | int cnt; | ||
439 | |||
440 | /* temporarily turn off IRQs during SRST */ | ||
441 | irq_enable = readl(port + PORT_IRQ_ENABLE_SET); | ||
442 | writel(irq_enable, port + PORT_IRQ_ENABLE_CLR); | ||
443 | |||
421 | /* | 444 | /* |
422 | * No ATAPI yet. Just unconditionally indicate ATA device. | 445 | * XXX: Not sure whether the following sleep is needed or not. |
423 | * If ATAPI device is attached, it will fail ATA_CMD_ID_ATA | 446 | * The original driver had it. So.... |
424 | * and libata core will ignore the device. | ||
425 | */ | 447 | */ |
426 | if (!(ap->flags & ATA_FLAG_PORT_DISABLED)) | 448 | msleep(10); |
427 | ap->device[0].class = ATA_DEV_ATA; | 449 | |
450 | prb->ctrl = PRB_CTRL_SRST; | ||
451 | prb->fis[1] = 0; /* no PM yet */ | ||
452 | |||
453 | writel((u32)paddr, port + PORT_CMD_ACTIVATE); | ||
454 | |||
455 | for (cnt = 0; cnt < 100; cnt++) { | ||
456 | irq_stat = readl(port + PORT_IRQ_STAT); | ||
457 | writel(irq_stat, port + PORT_IRQ_STAT); /* clear irq */ | ||
458 | |||
459 | irq_stat >>= PORT_IRQ_RAW_SHIFT; | ||
460 | if (irq_stat & (PORT_IRQ_COMPLETE | PORT_IRQ_ERROR)) | ||
461 | break; | ||
462 | |||
463 | msleep(1); | ||
464 | } | ||
465 | |||
466 | /* restore IRQs */ | ||
467 | writel(irq_enable, port + PORT_IRQ_ENABLE_SET); | ||
468 | |||
469 | if (!(irq_stat & PORT_IRQ_COMPLETE)) | ||
470 | return -1; | ||
471 | |||
472 | /* update TF */ | ||
473 | sil24_update_tf(ap); | ||
474 | return 0; | ||
475 | } | ||
476 | |||
477 | static void sil24_phy_reset(struct ata_port *ap) | ||
478 | { | ||
479 | struct sil24_port_priv *pp = ap->private_data; | ||
480 | |||
481 | __sata_phy_reset(ap); | ||
482 | if (ap->flags & ATA_FLAG_PORT_DISABLED) | ||
483 | return; | ||
484 | |||
485 | if (sil24_issue_SRST(ap) < 0) { | ||
486 | printk(KERN_ERR DRV_NAME | ||
487 | " ata%u: SRST failed, disabling port\n", ap->id); | ||
488 | ap->ops->port_disable(ap); | ||
489 | return; | ||
490 | } | ||
491 | |||
492 | ap->device->class = ata_dev_classify(&pp->tf); | ||
428 | } | 493 | } |
429 | 494 | ||
430 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, | 495 | static inline void sil24_fill_sg(struct ata_queued_cmd *qc, |
431 | struct sil24_cmd_block *cb) | 496 | struct sil24_sge *sge) |
432 | { | 497 | { |
433 | struct sil24_sge *sge = cb->sge; | ||
434 | struct scatterlist *sg; | 498 | struct scatterlist *sg; |
435 | unsigned int idx = 0; | 499 | unsigned int idx = 0; |
436 | 500 | ||
@@ -451,23 +515,47 @@ static void sil24_qc_prep(struct ata_queued_cmd *qc) | |||
451 | { | 515 | { |
452 | struct ata_port *ap = qc->ap; | 516 | struct ata_port *ap = qc->ap; |
453 | struct sil24_port_priv *pp = ap->private_data; | 517 | struct sil24_port_priv *pp = ap->private_data; |
454 | struct sil24_cmd_block *cb = pp->cmd_block + qc->tag; | 518 | union sil24_cmd_block *cb = pp->cmd_block + qc->tag; |
455 | struct sil24_prb *prb = &cb->prb; | 519 | struct sil24_prb *prb; |
520 | struct sil24_sge *sge; | ||
456 | 521 | ||
457 | switch (qc->tf.protocol) { | 522 | switch (qc->tf.protocol) { |
458 | case ATA_PROT_PIO: | 523 | case ATA_PROT_PIO: |
459 | case ATA_PROT_DMA: | 524 | case ATA_PROT_DMA: |
460 | case ATA_PROT_NODATA: | 525 | case ATA_PROT_NODATA: |
526 | prb = &cb->ata.prb; | ||
527 | sge = cb->ata.sge; | ||
528 | prb->ctrl = 0; | ||
529 | break; | ||
530 | |||
531 | case ATA_PROT_ATAPI: | ||
532 | case ATA_PROT_ATAPI_DMA: | ||
533 | case ATA_PROT_ATAPI_NODATA: | ||
534 | prb = &cb->atapi.prb; | ||
535 | sge = cb->atapi.sge; | ||
536 | memset(cb->atapi.cdb, 0, 32); | ||
537 | memcpy(cb->atapi.cdb, qc->cdb, ap->cdb_len); | ||
538 | |||
539 | if (qc->tf.protocol != ATA_PROT_ATAPI_NODATA) { | ||
540 | if (qc->tf.flags & ATA_TFLAG_WRITE) | ||
541 | prb->ctrl = PRB_CTRL_PACKET_WRITE; | ||
542 | else | ||
543 | prb->ctrl = PRB_CTRL_PACKET_READ; | ||
544 | } else | ||
545 | prb->ctrl = 0; | ||
546 | |||
461 | break; | 547 | break; |
548 | |||
462 | default: | 549 | default: |
463 | /* ATAPI isn't supported yet */ | 550 | prb = NULL; /* shut up, gcc */ |
551 | sge = NULL; | ||
464 | BUG(); | 552 | BUG(); |
465 | } | 553 | } |
466 | 554 | ||
467 | ata_tf_to_fis(&qc->tf, prb->fis, 0); | 555 | ata_tf_to_fis(&qc->tf, prb->fis, 0); |
468 | 556 | ||
469 | if (qc->flags & ATA_QCFLAG_DMAMAP) | 557 | if (qc->flags & ATA_QCFLAG_DMAMAP) |
470 | sil24_fill_sg(qc, cb); | 558 | sil24_fill_sg(qc, sge); |
471 | } | 559 | } |
472 | 560 | ||
473 | static int sil24_qc_issue(struct ata_queued_cmd *qc) | 561 | static int sil24_qc_issue(struct ata_queued_cmd *qc) |
@@ -486,6 +574,31 @@ static void sil24_irq_clear(struct ata_port *ap) | |||
486 | /* unused */ | 574 | /* unused */ |
487 | } | 575 | } |
488 | 576 | ||
577 | static int __sil24_restart_controller(void __iomem *port) | ||
578 | { | ||
579 | u32 tmp; | ||
580 | int cnt; | ||
581 | |||
582 | writel(PORT_CS_INIT, port + PORT_CTRL_STAT); | ||
583 | |||
584 | /* Max ~10ms */ | ||
585 | for (cnt = 0; cnt < 10000; cnt++) { | ||
586 | tmp = readl(port + PORT_CTRL_STAT); | ||
587 | if (tmp & PORT_CS_RDY) | ||
588 | return 0; | ||
589 | udelay(1); | ||
590 | } | ||
591 | |||
592 | return -1; | ||
593 | } | ||
594 | |||
595 | static void sil24_restart_controller(struct ata_port *ap) | ||
596 | { | ||
597 | if (__sil24_restart_controller((void __iomem *)ap->ioaddr.cmd_addr)) | ||
598 | printk(KERN_ERR DRV_NAME | ||
599 | " ata%u: failed to restart controller\n", ap->id); | ||
600 | } | ||
601 | |||
489 | static int __sil24_reset_controller(void __iomem *port) | 602 | static int __sil24_reset_controller(void __iomem *port) |
490 | { | 603 | { |
491 | int cnt; | 604 | int cnt; |
@@ -505,7 +618,11 @@ static int __sil24_reset_controller(void __iomem *port) | |||
505 | 618 | ||
506 | if (tmp & PORT_CS_DEV_RST) | 619 | if (tmp & PORT_CS_DEV_RST) |
507 | return -1; | 620 | return -1; |
508 | return 0; | 621 | |
622 | if (tmp & PORT_CS_RDY) | ||
623 | return 0; | ||
624 | |||
625 | return __sil24_restart_controller(port); | ||
509 | } | 626 | } |
510 | 627 | ||
511 | static void sil24_reset_controller(struct ata_port *ap) | 628 | static void sil24_reset_controller(struct ata_port *ap) |
@@ -567,9 +684,15 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
567 | if (serror) | 684 | if (serror) |
568 | writel(serror, port + PORT_SERROR); | 685 | writel(serror, port + PORT_SERROR); |
569 | 686 | ||
570 | printk(KERN_ERR DRV_NAME " ata%u: error interrupt on port%d\n" | 687 | /* |
571 | " stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n", | 688 | * Don't log ATAPI device errors. They're supposed to happen |
572 | ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror); | 689 | * and any serious errors will be logged using sense data by |
690 | * the SCSI layer. | ||
691 | */ | ||
692 | if (ap->device[0].class != ATA_DEV_ATAPI || cmd_err > PORT_CERR_SDB) | ||
693 | printk("ata%u: error interrupt on port%d\n" | ||
694 | " stat=0x%x irq=0x%x cmd_err=%d sstatus=0x%x serror=0x%x\n", | ||
695 | ap->id, ap->port_no, slot_stat, irq_stat, cmd_err, sstatus, serror); | ||
573 | 696 | ||
574 | if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) { | 697 | if (cmd_err == PORT_CERR_DEV || cmd_err == PORT_CERR_SDB) { |
575 | /* | 698 | /* |
@@ -577,6 +700,7 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
577 | */ | 700 | */ |
578 | sil24_update_tf(ap); | 701 | sil24_update_tf(ap); |
579 | err_mask = ac_err_mask(pp->tf.command); | 702 | err_mask = ac_err_mask(pp->tf.command); |
703 | sil24_restart_controller(ap); | ||
580 | } else { | 704 | } else { |
581 | /* | 705 | /* |
582 | * Other errors. libata currently doesn't have any | 706 | * Other errors. libata currently doesn't have any |
@@ -584,12 +708,11 @@ static void sil24_error_intr(struct ata_port *ap, u32 slot_stat) | |||
584 | * ATA_ERR. | 708 | * ATA_ERR. |
585 | */ | 709 | */ |
586 | err_mask = AC_ERR_OTHER; | 710 | err_mask = AC_ERR_OTHER; |
711 | sil24_reset_controller(ap); | ||
587 | } | 712 | } |
588 | 713 | ||
589 | if (qc) | 714 | if (qc) |
590 | ata_qc_complete(qc, err_mask); | 715 | ata_qc_complete(qc, err_mask); |
591 | |||
592 | sil24_reset_controller(ap); | ||
593 | } | 716 | } |
594 | 717 | ||
595 | static inline void sil24_host_intr(struct ata_port *ap) | 718 | static inline void sil24_host_intr(struct ata_port *ap) |
@@ -665,7 +788,7 @@ static int sil24_port_start(struct ata_port *ap) | |||
665 | { | 788 | { |
666 | struct device *dev = ap->host_set->dev; | 789 | struct device *dev = ap->host_set->dev; |
667 | struct sil24_port_priv *pp; | 790 | struct sil24_port_priv *pp; |
668 | struct sil24_cmd_block *cb; | 791 | union sil24_cmd_block *cb; |
669 | size_t cb_size = sizeof(*cb); | 792 | size_t cb_size = sizeof(*cb); |
670 | dma_addr_t cb_dma; | 793 | dma_addr_t cb_dma; |
671 | int rc = -ENOMEM; | 794 | int rc = -ENOMEM; |
diff --git a/drivers/serial/Kconfig b/drivers/serial/Kconfig index ff36f0c9fdad..ad47c1b84c3f 100644 --- a/drivers/serial/Kconfig +++ b/drivers/serial/Kconfig | |||
@@ -507,7 +507,7 @@ config SERIAL_SUNSU_CONSOLE | |||
507 | 507 | ||
508 | config SERIAL_MUX | 508 | config SERIAL_MUX |
509 | tristate "Serial MUX support" | 509 | tristate "Serial MUX support" |
510 | depends on PARISC | 510 | depends on GSC |
511 | select SERIAL_CORE | 511 | select SERIAL_CORE |
512 | default y | 512 | default y |
513 | ---help--- | 513 | ---help--- |
diff --git a/drivers/serial/amba-pl011.c b/drivers/serial/amba-pl011.c index 938d185841c9..89d7bd3eaee3 100644 --- a/drivers/serial/amba-pl011.c +++ b/drivers/serial/amba-pl011.c | |||
@@ -49,7 +49,6 @@ | |||
49 | #include <linux/serial.h> | 49 | #include <linux/serial.h> |
50 | 50 | ||
51 | #include <asm/io.h> | 51 | #include <asm/io.h> |
52 | #include <asm/irq.h> | ||
53 | #include <asm/sizes.h> | 52 | #include <asm/sizes.h> |
54 | #include <asm/hardware/amba.h> | 53 | #include <asm/hardware/amba.h> |
55 | #include <asm/hardware/clock.h> | 54 | #include <asm/hardware/clock.h> |
@@ -63,7 +62,8 @@ | |||
63 | 62 | ||
64 | #define AMBA_ISR_PASS_LIMIT 256 | 63 | #define AMBA_ISR_PASS_LIMIT 256 |
65 | 64 | ||
66 | #define UART_DUMMY_RSR_RX 256 | 65 | #define UART_DR_ERROR (UART011_DR_OE|UART011_DR_BE|UART011_DR_PE|UART011_DR_FE) |
66 | #define UART_DUMMY_DR_RX (1 << 16) | ||
67 | 67 | ||
68 | /* | 68 | /* |
69 | * We wrap our port structure around the generic uart_port. | 69 | * We wrap our port structure around the generic uart_port. |
@@ -116,7 +116,7 @@ pl011_rx_chars(struct uart_amba_port *uap) | |||
116 | #endif | 116 | #endif |
117 | { | 117 | { |
118 | struct tty_struct *tty = uap->port.info->tty; | 118 | struct tty_struct *tty = uap->port.info->tty; |
119 | unsigned int status, ch, flag, rsr, max_count = 256; | 119 | unsigned int status, ch, flag, max_count = 256; |
120 | 120 | ||
121 | status = readw(uap->port.membase + UART01x_FR); | 121 | status = readw(uap->port.membase + UART01x_FR); |
122 | while ((status & UART01x_FR_RXFE) == 0 && max_count--) { | 122 | while ((status & UART01x_FR_RXFE) == 0 && max_count--) { |
@@ -129,7 +129,7 @@ pl011_rx_chars(struct uart_amba_port *uap) | |||
129 | */ | 129 | */ |
130 | } | 130 | } |
131 | 131 | ||
132 | ch = readw(uap->port.membase + UART01x_DR); | 132 | ch = readw(uap->port.membase + UART01x_DR) | UART_DUMMY_DR_RX; |
133 | flag = TTY_NORMAL; | 133 | flag = TTY_NORMAL; |
134 | uap->port.icount.rx++; | 134 | uap->port.icount.rx++; |
135 | 135 | ||
@@ -137,34 +137,33 @@ pl011_rx_chars(struct uart_amba_port *uap) | |||
137 | * Note that the error handling code is | 137 | * Note that the error handling code is |
138 | * out of the main execution path | 138 | * out of the main execution path |
139 | */ | 139 | */ |
140 | rsr = readw(uap->port.membase + UART01x_RSR) | UART_DUMMY_RSR_RX; | 140 | if (unlikely(ch & UART_DR_ERROR)) { |
141 | if (unlikely(rsr & UART01x_RSR_ANY)) { | 141 | if (ch & UART011_DR_BE) { |
142 | if (rsr & UART01x_RSR_BE) { | 142 | ch &= ~(UART011_DR_FE | UART011_DR_PE); |
143 | rsr &= ~(UART01x_RSR_FE | UART01x_RSR_PE); | ||
144 | uap->port.icount.brk++; | 143 | uap->port.icount.brk++; |
145 | if (uart_handle_break(&uap->port)) | 144 | if (uart_handle_break(&uap->port)) |
146 | goto ignore_char; | 145 | goto ignore_char; |
147 | } else if (rsr & UART01x_RSR_PE) | 146 | } else if (ch & UART011_DR_PE) |
148 | uap->port.icount.parity++; | 147 | uap->port.icount.parity++; |
149 | else if (rsr & UART01x_RSR_FE) | 148 | else if (ch & UART011_DR_FE) |
150 | uap->port.icount.frame++; | 149 | uap->port.icount.frame++; |
151 | if (rsr & UART01x_RSR_OE) | 150 | if (ch & UART011_DR_OE) |
152 | uap->port.icount.overrun++; | 151 | uap->port.icount.overrun++; |
153 | 152 | ||
154 | rsr &= uap->port.read_status_mask; | 153 | ch &= uap->port.read_status_mask; |
155 | 154 | ||
156 | if (rsr & UART01x_RSR_BE) | 155 | if (ch & UART011_DR_BE) |
157 | flag = TTY_BREAK; | 156 | flag = TTY_BREAK; |
158 | else if (rsr & UART01x_RSR_PE) | 157 | else if (ch & UART011_DR_PE) |
159 | flag = TTY_PARITY; | 158 | flag = TTY_PARITY; |
160 | else if (rsr & UART01x_RSR_FE) | 159 | else if (ch & UART011_DR_FE) |
161 | flag = TTY_FRAME; | 160 | flag = TTY_FRAME; |
162 | } | 161 | } |
163 | 162 | ||
164 | if (uart_handle_sysrq_char(&uap->port, ch, regs)) | 163 | if (uart_handle_sysrq_char(&uap->port, ch, regs)) |
165 | goto ignore_char; | 164 | goto ignore_char; |
166 | 165 | ||
167 | uart_insert_char(&uap->port, rsr, UART01x_RSR_OE, ch, flag); | 166 | uart_insert_char(&uap->port, ch, UART011_DR_OE, ch, flag); |
168 | 167 | ||
169 | ignore_char: | 168 | ignore_char: |
170 | status = readw(uap->port.membase + UART01x_FR); | 169 | status = readw(uap->port.membase + UART01x_FR); |
@@ -476,33 +475,33 @@ pl011_set_termios(struct uart_port *port, struct termios *termios, | |||
476 | */ | 475 | */ |
477 | uart_update_timeout(port, termios->c_cflag, baud); | 476 | uart_update_timeout(port, termios->c_cflag, baud); |
478 | 477 | ||
479 | port->read_status_mask = UART01x_RSR_OE; | 478 | port->read_status_mask = UART011_DR_OE | 255; |
480 | if (termios->c_iflag & INPCK) | 479 | if (termios->c_iflag & INPCK) |
481 | port->read_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE; | 480 | port->read_status_mask |= UART011_DR_FE | UART011_DR_PE; |
482 | if (termios->c_iflag & (BRKINT | PARMRK)) | 481 | if (termios->c_iflag & (BRKINT | PARMRK)) |
483 | port->read_status_mask |= UART01x_RSR_BE; | 482 | port->read_status_mask |= UART011_DR_BE; |
484 | 483 | ||
485 | /* | 484 | /* |
486 | * Characters to ignore | 485 | * Characters to ignore |
487 | */ | 486 | */ |
488 | port->ignore_status_mask = 0; | 487 | port->ignore_status_mask = 0; |
489 | if (termios->c_iflag & IGNPAR) | 488 | if (termios->c_iflag & IGNPAR) |
490 | port->ignore_status_mask |= UART01x_RSR_FE | UART01x_RSR_PE; | 489 | port->ignore_status_mask |= UART011_DR_FE | UART011_DR_PE; |
491 | if (termios->c_iflag & IGNBRK) { | 490 | if (termios->c_iflag & IGNBRK) { |
492 | port->ignore_status_mask |= UART01x_RSR_BE; | 491 | port->ignore_status_mask |= UART011_DR_BE; |
493 | /* | 492 | /* |
494 | * If we're ignoring parity and break indicators, | 493 | * If we're ignoring parity and break indicators, |
495 | * ignore overruns too (for real raw support). | 494 | * ignore overruns too (for real raw support). |
496 | */ | 495 | */ |
497 | if (termios->c_iflag & IGNPAR) | 496 | if (termios->c_iflag & IGNPAR) |
498 | port->ignore_status_mask |= UART01x_RSR_OE; | 497 | port->ignore_status_mask |= UART011_DR_OE; |
499 | } | 498 | } |
500 | 499 | ||
501 | /* | 500 | /* |
502 | * Ignore all characters if CREAD is not set. | 501 | * Ignore all characters if CREAD is not set. |
503 | */ | 502 | */ |
504 | if ((termios->c_cflag & CREAD) == 0) | 503 | if ((termios->c_cflag & CREAD) == 0) |
505 | port->ignore_status_mask |= UART_DUMMY_RSR_RX; | 504 | port->ignore_status_mask |= UART_DUMMY_DR_RX; |
506 | 505 | ||
507 | if (UART_ENABLE_MS(port, termios->c_cflag)) | 506 | if (UART_ENABLE_MS(port, termios->c_cflag)) |
508 | pl011_enable_ms(port); | 507 | pl011_enable_ms(port); |
diff --git a/drivers/serial/imx.c b/drivers/serial/imx.c index 355cd93a8a87..83c4c1216587 100644 --- a/drivers/serial/imx.c +++ b/drivers/serial/imx.c | |||
@@ -994,7 +994,7 @@ static int __init imx_serial_init(void) | |||
994 | static void __exit imx_serial_exit(void) | 994 | static void __exit imx_serial_exit(void) |
995 | { | 995 | { |
996 | uart_unregister_driver(&imx_reg); | 996 | uart_unregister_driver(&imx_reg); |
997 | driver_unregister(&serial_imx_driver); | 997 | platform_driver_unregister(&serial_imx_driver); |
998 | } | 998 | } |
999 | 999 | ||
1000 | module_init(imx_serial_init); | 1000 | module_init(imx_serial_init); |
diff --git a/drivers/serial/mux.c b/drivers/serial/mux.c index 660bae5ba179..7633132a10aa 100644 --- a/drivers/serial/mux.c +++ b/drivers/serial/mux.c | |||
@@ -65,8 +65,8 @@ static struct uart_driver mux_driver = { | |||
65 | 65 | ||
66 | static struct timer_list mux_timer; | 66 | static struct timer_list mux_timer; |
67 | 67 | ||
68 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (unsigned long)(p)->membase + IO_DATA_REG_OFFSET) | 68 | #define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET) |
69 | #define UART_GET_FIFO_CNT(p) __raw_readl((unsigned long)(p)->membase + IO_DCOUNT_REG_OFFSET) | 69 | #define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET) |
70 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 | 70 | #define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8 |
71 | 71 | ||
72 | /** | 72 | /** |
@@ -79,10 +79,7 @@ static struct timer_list mux_timer; | |||
79 | */ | 79 | */ |
80 | static unsigned int mux_tx_empty(struct uart_port *port) | 80 | static unsigned int mux_tx_empty(struct uart_port *port) |
81 | { | 81 | { |
82 | unsigned int cnt = __raw_readl((unsigned long)port->membase | 82 | return UART_GET_FIFO_CNT(port) ? 0 : TIOCSER_TEMT; |
83 | + IO_DCOUNT_REG_OFFSET); | ||
84 | |||
85 | return cnt ? 0 : TIOCSER_TEMT; | ||
86 | } | 83 | } |
87 | 84 | ||
88 | /** | 85 | /** |
@@ -218,8 +215,7 @@ static void mux_read(struct uart_port *port) | |||
218 | __u32 start_count = port->icount.rx; | 215 | __u32 start_count = port->icount.rx; |
219 | 216 | ||
220 | while(1) { | 217 | while(1) { |
221 | data = __raw_readl((unsigned long)port->membase | 218 | data = __raw_readl(port->membase + IO_DATA_REG_OFFSET); |
222 | + IO_DATA_REG_OFFSET); | ||
223 | 219 | ||
224 | if (MUX_STATUS(data)) | 220 | if (MUX_STATUS(data)) |
225 | continue; | 221 | continue; |
@@ -481,6 +477,13 @@ static int __init mux_probe(struct parisc_device *dev) | |||
481 | port->ops = &mux_pops; | 477 | port->ops = &mux_pops; |
482 | port->flags = UPF_BOOT_AUTOCONF; | 478 | port->flags = UPF_BOOT_AUTOCONF; |
483 | port->line = port_cnt; | 479 | port->line = port_cnt; |
480 | |||
481 | /* The port->timeout needs to match what is present in | ||
482 | * uart_wait_until_sent in serial_core.c. Otherwise | ||
483 | * the time spent in msleep_interruptable will be very | ||
484 | * long, causing the appearance of a console hang. | ||
485 | */ | ||
486 | port->timeout = HZ / 50; | ||
484 | spin_lock_init(&port->lock); | 487 | spin_lock_init(&port->lock); |
485 | status = uart_add_one_port(&mux_driver, port); | 488 | status = uart_add_one_port(&mux_driver, port); |
486 | BUG_ON(status); | 489 | BUG_ON(status); |
diff --git a/drivers/serial/sa1100.c b/drivers/serial/sa1100.c index 0e3daf6d7b50..25a086458ab9 100644 --- a/drivers/serial/sa1100.c +++ b/drivers/serial/sa1100.c | |||
@@ -161,7 +161,6 @@ static void sa1100_stop_tx(struct uart_port *port) | |||
161 | static void sa1100_start_tx(struct uart_port *port) | 161 | static void sa1100_start_tx(struct uart_port *port) |
162 | { | 162 | { |
163 | struct sa1100_port *sport = (struct sa1100_port *)port; | 163 | struct sa1100_port *sport = (struct sa1100_port *)port; |
164 | unsigned long flags; | ||
165 | u32 utcr3; | 164 | u32 utcr3; |
166 | 165 | ||
167 | utcr3 = UART_GET_UTCR3(sport); | 166 | utcr3 = UART_GET_UTCR3(sport); |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index eab3750cf304..6bded10c0d50 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -3,6 +3,8 @@ Version 1.39 | |||
3 | Defer close of a file handle slightly if pending writes depend on that file handle | 3 | Defer close of a file handle slightly if pending writes depend on that file handle |
4 | (this reduces the EBADF bad file handle errors that can be logged under heavy | 4 | (this reduces the EBADF bad file handle errors that can be logged under heavy |
5 | stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 | 5 | stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 |
6 | Fix SFU style symlinks and mknod needed for servers which do not support the CIFS | ||
7 | Unix Extensions. Fix setfacl/getfacl on bigendian. | ||
6 | 8 | ||
7 | Version 1.38 | 9 | Version 1.38 |
8 | ------------ | 10 | ------------ |
diff --git a/fs/cifs/cifs_unicode.c b/fs/cifs/cifs_unicode.c index 4e12053f0806..d2b128255944 100644 --- a/fs/cifs/cifs_unicode.c +++ b/fs/cifs/cifs_unicode.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * fs/cifs/cifs_unicode.c | 2 | * fs/cifs/cifs_unicode.c |
3 | * | 3 | * |
4 | * Copyright (c) International Business Machines Corp., 2000,2002 | 4 | * Copyright (c) International Business Machines Corp., 2000,2005 |
5 | * Modified by Steve French (sfrench@us.ibm.com) | 5 | * Modified by Steve French (sfrench@us.ibm.com) |
6 | * | 6 | * |
7 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
@@ -31,7 +31,7 @@ | |||
31 | * | 31 | * |
32 | */ | 32 | */ |
33 | int | 33 | int |
34 | cifs_strfromUCS_le(char *to, const wchar_t * from, /* LITTLE ENDIAN */ | 34 | cifs_strfromUCS_le(char *to, const __le16 * from, |
35 | int len, const struct nls_table *codepage) | 35 | int len, const struct nls_table *codepage) |
36 | { | 36 | { |
37 | int i; | 37 | int i; |
@@ -60,25 +60,26 @@ cifs_strfromUCS_le(char *to, const wchar_t * from, /* LITTLE ENDIAN */ | |||
60 | * | 60 | * |
61 | */ | 61 | */ |
62 | int | 62 | int |
63 | cifs_strtoUCS(wchar_t * to, const char *from, int len, | 63 | cifs_strtoUCS(__le16 * to, const char *from, int len, |
64 | const struct nls_table *codepage) | 64 | const struct nls_table *codepage) |
65 | { | 65 | { |
66 | int charlen; | 66 | int charlen; |
67 | int i; | 67 | int i; |
68 | wchar_t * wchar_to = (wchar_t *)to; /* needed to quiet sparse */ | ||
68 | 69 | ||
69 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { | 70 | for (i = 0; len && *from; i++, from += charlen, len -= charlen) { |
70 | 71 | ||
71 | /* works for 2.4.0 kernel or later */ | 72 | /* works for 2.4.0 kernel or later */ |
72 | charlen = codepage->char2uni(from, len, &to[i]); | 73 | charlen = codepage->char2uni(from, len, &wchar_to[i]); |
73 | if (charlen < 1) { | 74 | if (charlen < 1) { |
74 | cERROR(1, | 75 | cERROR(1, |
75 | ("cifs_strtoUCS: char2uni returned %d", | 76 | ("cifs_strtoUCS: char2uni returned %d", |
76 | charlen)); | 77 | charlen)); |
77 | /* A question mark */ | 78 | /* A question mark */ |
78 | to[i] = (wchar_t)cpu_to_le16(0x003f); | 79 | to[i] = cpu_to_le16(0x003f); |
79 | charlen = 1; | 80 | charlen = 1; |
80 | } else | 81 | } else |
81 | to[i] = (wchar_t)cpu_to_le16(to[i]); | 82 | to[i] = cpu_to_le16(wchar_to[i]); |
82 | 83 | ||
83 | } | 84 | } |
84 | 85 | ||
diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h index da8dde965275..39e5b970325f 100644 --- a/fs/cifs/cifs_unicode.h +++ b/fs/cifs/cifs_unicode.h | |||
@@ -5,7 +5,7 @@ | |||
5 | * Convert a unicode character to upper or lower case using | 5 | * Convert a unicode character to upper or lower case using |
6 | * compressed tables. | 6 | * compressed tables. |
7 | * | 7 | * |
8 | * Copyright (c) International Business Machines Corp., 2000,2002 | 8 | * Copyright (c) International Business Machines Corp., 2000,2005555555555555555555555555555555555555555555555555555555 |
9 | * | 9 | * |
10 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
11 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
@@ -59,8 +59,8 @@ extern struct UniCaseRange UniLowerRange[]; | |||
59 | #endif /* UNIUPR_NOLOWER */ | 59 | #endif /* UNIUPR_NOLOWER */ |
60 | 60 | ||
61 | #ifdef __KERNEL__ | 61 | #ifdef __KERNEL__ |
62 | int cifs_strfromUCS_le(char *, const wchar_t *, int, const struct nls_table *); | 62 | int cifs_strfromUCS_le(char *, const __le16 *, int, const struct nls_table *); |
63 | int cifs_strtoUCS(wchar_t *, const char *, int, const struct nls_table *); | 63 | int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *); |
64 | #endif | 64 | #endif |
65 | 65 | ||
66 | /* | 66 | /* |
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c index 1959c7c4b185..fe2bb7c4c912 100644 --- a/fs/cifs/cifsencrypt.c +++ b/fs/cifs/cifsencrypt.c | |||
@@ -149,7 +149,7 @@ int CalcNTLMv2_partial_mac_key(struct cifsSesInfo * ses, struct nls_table * nls_ | |||
149 | char temp_hash[16]; | 149 | char temp_hash[16]; |
150 | struct HMACMD5Context ctx; | 150 | struct HMACMD5Context ctx; |
151 | char * ucase_buf; | 151 | char * ucase_buf; |
152 | wchar_t * unicode_buf; | 152 | __le16 * unicode_buf; |
153 | unsigned int i,user_name_len,dom_name_len; | 153 | unsigned int i,user_name_len,dom_name_len; |
154 | 154 | ||
155 | if(ses == NULL) | 155 | if(ses == NULL) |
diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 682b0235ad9a..51548ed2e9cc 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c | |||
@@ -483,57 +483,30 @@ cifs_get_sb(struct file_system_type *fs_type, | |||
483 | return sb; | 483 | return sb; |
484 | } | 484 | } |
485 | 485 | ||
486 | static ssize_t | 486 | static ssize_t cifs_file_writev(struct file *file, const struct iovec *iov, |
487 | cifs_read_wrapper(struct file * file, char __user *read_data, size_t read_size, | 487 | unsigned long nr_segs, loff_t *ppos) |
488 | loff_t * poffset) | ||
489 | { | 488 | { |
490 | if(file->f_dentry == NULL) | 489 | struct inode *inode = file->f_dentry->d_inode; |
491 | return -EIO; | 490 | ssize_t written; |
492 | else if(file->f_dentry->d_inode == NULL) | ||
493 | return -EIO; | ||
494 | |||
495 | cFYI(1,("In read_wrapper size %zd at %lld",read_size,*poffset)); | ||
496 | 491 | ||
497 | if(CIFS_I(file->f_dentry->d_inode)->clientCanCacheRead) { | 492 | written = generic_file_writev(file, iov, nr_segs, ppos); |
498 | return generic_file_read(file,read_data,read_size,poffset); | 493 | if (!CIFS_I(inode)->clientCanCacheAll) |
499 | } else { | 494 | filemap_fdatawrite(inode->i_mapping); |
500 | /* BB do we need to lock inode from here until after invalidate? */ | 495 | return written; |
501 | /* if(file->f_dentry->d_inode->i_mapping) { | ||
502 | filemap_fdatawrite(file->f_dentry->d_inode->i_mapping); | ||
503 | filemap_fdatawait(file->f_dentry->d_inode->i_mapping); | ||
504 | }*/ | ||
505 | /* cifs_revalidate(file->f_dentry);*/ /* BB fixme */ | ||
506 | |||
507 | /* BB we should make timer configurable - perhaps | ||
508 | by simply calling cifs_revalidate here */ | ||
509 | /* invalidate_remote_inode(file->f_dentry->d_inode);*/ | ||
510 | return generic_file_read(file,read_data,read_size,poffset); | ||
511 | } | ||
512 | } | 496 | } |
513 | 497 | ||
514 | static ssize_t | 498 | static ssize_t cifs_file_aio_write(struct kiocb *iocb, const char __user *buf, |
515 | cifs_write_wrapper(struct file * file, const char __user *write_data, | 499 | size_t count, loff_t pos) |
516 | size_t write_size, loff_t * poffset) | ||
517 | { | 500 | { |
501 | struct inode *inode = iocb->ki_filp->f_dentry->d_inode; | ||
518 | ssize_t written; | 502 | ssize_t written; |
519 | 503 | ||
520 | if(file->f_dentry == NULL) | 504 | written = generic_file_aio_write(iocb, buf, count, pos); |
521 | return -EIO; | 505 | if (!CIFS_I(inode)->clientCanCacheAll) |
522 | else if(file->f_dentry->d_inode == NULL) | 506 | filemap_fdatawrite(inode->i_mapping); |
523 | return -EIO; | ||
524 | |||
525 | cFYI(1,("In write_wrapper size %zd at %lld",write_size,*poffset)); | ||
526 | |||
527 | written = generic_file_write(file,write_data,write_size,poffset); | ||
528 | if(!CIFS_I(file->f_dentry->d_inode)->clientCanCacheAll) { | ||
529 | if(file->f_dentry->d_inode->i_mapping) { | ||
530 | filemap_fdatawrite(file->f_dentry->d_inode->i_mapping); | ||
531 | } | ||
532 | } | ||
533 | return written; | 507 | return written; |
534 | } | 508 | } |
535 | 509 | ||
536 | |||
537 | static struct file_system_type cifs_fs_type = { | 510 | static struct file_system_type cifs_fs_type = { |
538 | .owner = THIS_MODULE, | 511 | .owner = THIS_MODULE, |
539 | .name = "cifs", | 512 | .name = "cifs", |
@@ -594,8 +567,12 @@ struct inode_operations cifs_symlink_inode_ops = { | |||
594 | }; | 567 | }; |
595 | 568 | ||
596 | struct file_operations cifs_file_ops = { | 569 | struct file_operations cifs_file_ops = { |
597 | .read = cifs_read_wrapper, | 570 | .read = do_sync_read, |
598 | .write = cifs_write_wrapper, | 571 | .write = do_sync_write, |
572 | .readv = generic_file_readv, | ||
573 | .writev = cifs_file_writev, | ||
574 | .aio_read = generic_file_aio_read, | ||
575 | .aio_write = cifs_file_aio_write, | ||
599 | .open = cifs_open, | 576 | .open = cifs_open, |
600 | .release = cifs_close, | 577 | .release = cifs_close, |
601 | .lock = cifs_lock, | 578 | .lock = cifs_lock, |
@@ -608,10 +585,6 @@ struct file_operations cifs_file_ops = { | |||
608 | #endif /* CONFIG_CIFS_POSIX */ | 585 | #endif /* CONFIG_CIFS_POSIX */ |
609 | 586 | ||
610 | #ifdef CONFIG_CIFS_EXPERIMENTAL | 587 | #ifdef CONFIG_CIFS_EXPERIMENTAL |
611 | .readv = generic_file_readv, | ||
612 | .writev = generic_file_writev, | ||
613 | .aio_read = generic_file_aio_read, | ||
614 | .aio_write = generic_file_aio_write, | ||
615 | .dir_notify = cifs_dir_notify, | 588 | .dir_notify = cifs_dir_notify, |
616 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | 589 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ |
617 | }; | 590 | }; |
@@ -635,6 +608,46 @@ struct file_operations cifs_file_direct_ops = { | |||
635 | .dir_notify = cifs_dir_notify, | 608 | .dir_notify = cifs_dir_notify, |
636 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | 609 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ |
637 | }; | 610 | }; |
611 | struct file_operations cifs_file_nobrl_ops = { | ||
612 | .read = do_sync_read, | ||
613 | .write = do_sync_write, | ||
614 | .readv = generic_file_readv, | ||
615 | .writev = cifs_file_writev, | ||
616 | .aio_read = generic_file_aio_read, | ||
617 | .aio_write = cifs_file_aio_write, | ||
618 | .open = cifs_open, | ||
619 | .release = cifs_close, | ||
620 | .fsync = cifs_fsync, | ||
621 | .flush = cifs_flush, | ||
622 | .mmap = cifs_file_mmap, | ||
623 | .sendfile = generic_file_sendfile, | ||
624 | #ifdef CONFIG_CIFS_POSIX | ||
625 | .ioctl = cifs_ioctl, | ||
626 | #endif /* CONFIG_CIFS_POSIX */ | ||
627 | |||
628 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
629 | .dir_notify = cifs_dir_notify, | ||
630 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
631 | }; | ||
632 | |||
633 | struct file_operations cifs_file_direct_nobrl_ops = { | ||
634 | /* no mmap, no aio, no readv - | ||
635 | BB reevaluate whether they can be done with directio, no cache */ | ||
636 | .read = cifs_user_read, | ||
637 | .write = cifs_user_write, | ||
638 | .open = cifs_open, | ||
639 | .release = cifs_close, | ||
640 | .fsync = cifs_fsync, | ||
641 | .flush = cifs_flush, | ||
642 | .sendfile = generic_file_sendfile, /* BB removeme BB */ | ||
643 | #ifdef CONFIG_CIFS_POSIX | ||
644 | .ioctl = cifs_ioctl, | ||
645 | #endif /* CONFIG_CIFS_POSIX */ | ||
646 | |||
647 | #ifdef CONFIG_CIFS_EXPERIMENTAL | ||
648 | .dir_notify = cifs_dir_notify, | ||
649 | #endif /* CONFIG_CIFS_EXPERIMENTAL */ | ||
650 | }; | ||
638 | 651 | ||
639 | struct file_operations cifs_dir_ops = { | 652 | struct file_operations cifs_dir_ops = { |
640 | .readdir = cifs_readdir, | 653 | .readdir = cifs_readdir, |
diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h index 1223fa81dbd2..9ec40e0e54fc 100644 --- a/fs/cifs/cifsfs.h +++ b/fs/cifs/cifsfs.h | |||
@@ -63,6 +63,8 @@ extern struct inode_operations cifs_symlink_inode_ops; | |||
63 | /* Functions related to files and directories */ | 63 | /* Functions related to files and directories */ |
64 | extern struct file_operations cifs_file_ops; | 64 | extern struct file_operations cifs_file_ops; |
65 | extern struct file_operations cifs_file_direct_ops; /* if directio mount */ | 65 | extern struct file_operations cifs_file_direct_ops; /* if directio mount */ |
66 | extern struct file_operations cifs_file_nobrl_ops; | ||
67 | extern struct file_operations cifs_file_direct_nobrl_ops; /* if directio mount */ | ||
66 | extern int cifs_open(struct inode *inode, struct file *file); | 68 | extern int cifs_open(struct inode *inode, struct file *file); |
67 | extern int cifs_close(struct inode *inode, struct file *file); | 69 | extern int cifs_close(struct inode *inode, struct file *file); |
68 | extern int cifs_closedir(struct inode *inode, struct file *file); | 70 | extern int cifs_closedir(struct inode *inode, struct file *file); |
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index 48a05b9df7eb..33e1859fd2f6 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
@@ -603,7 +603,9 @@ typedef struct smb_com_logoff_andx_rsp { | |||
603 | __u16 ByteCount; | 603 | __u16 ByteCount; |
604 | } __attribute__((packed)) LOGOFF_ANDX_RSP; | 604 | } __attribute__((packed)) LOGOFF_ANDX_RSP; |
605 | 605 | ||
606 | typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on tree_connect PDU to effect disconnect *//* probably the simplest SMB PDU */ | 606 | typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on |
607 | tree_connect PDU to effect disconnect */ | ||
608 | /* tdis is probably simplest SMB PDU */ | ||
607 | struct { | 609 | struct { |
608 | struct smb_hdr hdr; /* wct = 0 */ | 610 | struct smb_hdr hdr; /* wct = 0 */ |
609 | __u16 ByteCount; /* bcc = 0 */ | 611 | __u16 ByteCount; /* bcc = 0 */ |
@@ -2025,6 +2027,12 @@ typedef struct { | |||
2025 | } __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FF response data area */ | 2027 | } __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FF response data area */ |
2026 | 2028 | ||
2027 | 2029 | ||
2030 | struct win_dev { | ||
2031 | unsigned char type[8]; /* IntxCHR or IntxBLK */ | ||
2032 | __le64 major; | ||
2033 | __le64 minor; | ||
2034 | } __attribute__((packed)); | ||
2035 | |||
2028 | struct gea { | 2036 | struct gea { |
2029 | unsigned char name_len; | 2037 | unsigned char name_len; |
2030 | char name[1]; | 2038 | char name[1]; |
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index a53c596e1082..d179b0c3eee4 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -1142,7 +1142,9 @@ CIFSSMBWrite2(const int xid, struct cifsTconInfo *tcon, | |||
1142 | int bytes_returned, wct; | 1142 | int bytes_returned, wct; |
1143 | int smb_hdr_len; | 1143 | int smb_hdr_len; |
1144 | 1144 | ||
1145 | cFYI(1,("write2 at %lld %d bytes",offset,count)); /* BB removeme BB */ | 1145 | /* BB removeme BB */ |
1146 | cFYI(1,("write2 at %lld %d bytes", (long long)offset, count)); | ||
1147 | |||
1146 | if(tcon->ses->capabilities & CAP_LARGE_FILES) | 1148 | if(tcon->ses->capabilities & CAP_LARGE_FILES) |
1147 | wct = 14; | 1149 | wct = 14; |
1148 | else | 1150 | else |
@@ -1553,7 +1555,7 @@ createSymLinkRetry: | |||
1553 | 1555 | ||
1554 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1556 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1555 | name_len = | 1557 | name_len = |
1556 | cifs_strtoUCS((wchar_t *) pSMB->FileName, fromName, PATH_MAX | 1558 | cifs_strtoUCS((__le16 *) pSMB->FileName, fromName, PATH_MAX |
1557 | /* find define for this maxpathcomponent */ | 1559 | /* find define for this maxpathcomponent */ |
1558 | , nls_codepage); | 1560 | , nls_codepage); |
1559 | name_len++; /* trailing null */ | 1561 | name_len++; /* trailing null */ |
@@ -1577,7 +1579,7 @@ createSymLinkRetry: | |||
1577 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 1579 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; |
1578 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1580 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1579 | name_len_target = | 1581 | name_len_target = |
1580 | cifs_strtoUCS((wchar_t *) data_offset, toName, PATH_MAX | 1582 | cifs_strtoUCS((__le16 *) data_offset, toName, PATH_MAX |
1581 | /* find define for this maxpathcomponent */ | 1583 | /* find define for this maxpathcomponent */ |
1582 | , nls_codepage); | 1584 | , nls_codepage); |
1583 | name_len_target++; /* trailing null */ | 1585 | name_len_target++; /* trailing null */ |
@@ -1803,7 +1805,7 @@ querySymLinkRetry: | |||
1803 | 1805 | ||
1804 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { | 1806 | if (pSMB->hdr.Flags2 & SMBFLG2_UNICODE) { |
1805 | name_len = | 1807 | name_len = |
1806 | cifs_strtoUCS((wchar_t *) pSMB->FileName, searchName, PATH_MAX | 1808 | cifs_strtoUCS((__le16 *) pSMB->FileName, searchName, PATH_MAX |
1807 | /* find define for this maxpathcomponent */ | 1809 | /* find define for this maxpathcomponent */ |
1808 | , nls_codepage); | 1810 | , nls_codepage); |
1809 | name_len++; /* trailing null */ | 1811 | name_len++; /* trailing null */ |
@@ -1860,7 +1862,7 @@ querySymLinkRetry: | |||
1860 | min_t(const int, buflen,count) / 2); | 1862 | min_t(const int, buflen,count) / 2); |
1861 | /* BB FIXME investigate remapping reserved chars here */ | 1863 | /* BB FIXME investigate remapping reserved chars here */ |
1862 | cifs_strfromUCS_le(symlinkinfo, | 1864 | cifs_strfromUCS_le(symlinkinfo, |
1863 | (wchar_t *) ((char *)&pSMBr->hdr.Protocol + | 1865 | (__le16 *) ((char *)&pSMBr->hdr.Protocol + |
1864 | data_offset), | 1866 | data_offset), |
1865 | name_len, nls_codepage); | 1867 | name_len, nls_codepage); |
1866 | } else { | 1868 | } else { |
@@ -1951,7 +1953,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon, | |||
1951 | reparse_buf->TargetNameOffset), | 1953 | reparse_buf->TargetNameOffset), |
1952 | min(buflen/2, reparse_buf->TargetNameLen / 2)); | 1954 | min(buflen/2, reparse_buf->TargetNameLen / 2)); |
1953 | cifs_strfromUCS_le(symlinkinfo, | 1955 | cifs_strfromUCS_le(symlinkinfo, |
1954 | (wchar_t *) (reparse_buf->LinkNamesBuf + | 1956 | (__le16 *) (reparse_buf->LinkNamesBuf + |
1955 | reparse_buf->TargetNameOffset), | 1957 | reparse_buf->TargetNameOffset), |
1956 | name_len, nls_codepage); | 1958 | name_len, nls_codepage); |
1957 | } else { /* ASCII names */ | 1959 | } else { /* ASCII names */ |
@@ -1983,9 +1985,9 @@ qreparse_out: | |||
1983 | static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace * cifs_ace) | 1985 | static void cifs_convert_ace(posix_acl_xattr_entry * ace, struct cifs_posix_ace * cifs_ace) |
1984 | { | 1986 | { |
1985 | /* u8 cifs fields do not need le conversion */ | 1987 | /* u8 cifs fields do not need le conversion */ |
1986 | ace->e_perm = (__u16)cifs_ace->cifs_e_perm; | 1988 | ace->e_perm = cpu_to_le16(cifs_ace->cifs_e_perm); |
1987 | ace->e_tag = (__u16)cifs_ace->cifs_e_tag; | 1989 | ace->e_tag = cpu_to_le16(cifs_ace->cifs_e_tag); |
1988 | ace->e_id = (__u32)le64_to_cpu(cifs_ace->cifs_uid); | 1990 | ace->e_id = cpu_to_le32(le64_to_cpu(cifs_ace->cifs_uid)); |
1989 | /* cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id)); */ | 1991 | /* cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id)); */ |
1990 | 1992 | ||
1991 | return; | 1993 | return; |
@@ -2037,7 +2039,7 @@ static int cifs_copy_posix_acl(char * trgt,char * src, const int buflen, | |||
2037 | } else if(size > buflen) { | 2039 | } else if(size > buflen) { |
2038 | return -ERANGE; | 2040 | return -ERANGE; |
2039 | } else /* buffer big enough */ { | 2041 | } else /* buffer big enough */ { |
2040 | local_acl->a_version = POSIX_ACL_XATTR_VERSION; | 2042 | local_acl->a_version = cpu_to_le32(POSIX_ACL_XATTR_VERSION); |
2041 | for(i = 0;i < count ;i++) { | 2043 | for(i = 0;i < count ;i++) { |
2042 | cifs_convert_ace(&local_acl->a_entries[i],pACE); | 2044 | cifs_convert_ace(&local_acl->a_entries[i],pACE); |
2043 | pACE ++; | 2045 | pACE ++; |
@@ -2051,14 +2053,14 @@ static __u16 convert_ace_to_cifs_ace(struct cifs_posix_ace * cifs_ace, | |||
2051 | { | 2053 | { |
2052 | __u16 rc = 0; /* 0 = ACL converted ok */ | 2054 | __u16 rc = 0; /* 0 = ACL converted ok */ |
2053 | 2055 | ||
2054 | cifs_ace->cifs_e_perm = (__u8)cpu_to_le16(local_ace->e_perm); | 2056 | cifs_ace->cifs_e_perm = le16_to_cpu(local_ace->e_perm); |
2055 | cifs_ace->cifs_e_tag = (__u8)cpu_to_le16(local_ace->e_tag); | 2057 | cifs_ace->cifs_e_tag = le16_to_cpu(local_ace->e_tag); |
2056 | /* BB is there a better way to handle the large uid? */ | 2058 | /* BB is there a better way to handle the large uid? */ |
2057 | if(local_ace->e_id == -1) { | 2059 | if(local_ace->e_id == cpu_to_le32(-1)) { |
2058 | /* Probably no need to le convert -1 on any arch but can not hurt */ | 2060 | /* Probably no need to le convert -1 on any arch but can not hurt */ |
2059 | cifs_ace->cifs_uid = cpu_to_le64(-1); | 2061 | cifs_ace->cifs_uid = cpu_to_le64(-1); |
2060 | } else | 2062 | } else |
2061 | cifs_ace->cifs_uid = (__u64)cpu_to_le32(local_ace->e_id); | 2063 | cifs_ace->cifs_uid = cpu_to_le64(le32_to_cpu(local_ace->e_id)); |
2062 | /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/ | 2064 | /*cFYI(1,("perm %d tag %d id %d",ace->e_perm,ace->e_tag,ace->e_id));*/ |
2063 | return rc; | 2065 | return rc; |
2064 | } | 2066 | } |
@@ -2078,16 +2080,17 @@ static __u16 ACL_to_cifs_posix(char * parm_data,const char * pACL,const int bufl | |||
2078 | 2080 | ||
2079 | count = posix_acl_xattr_count((size_t)buflen); | 2081 | count = posix_acl_xattr_count((size_t)buflen); |
2080 | cFYI(1,("setting acl with %d entries from buf of length %d and version of %d", | 2082 | cFYI(1,("setting acl with %d entries from buf of length %d and version of %d", |
2081 | count,buflen,local_acl->a_version)); | 2083 | count, buflen, le32_to_cpu(local_acl->a_version))); |
2082 | if(local_acl->a_version != 2) { | 2084 | if(le32_to_cpu(local_acl->a_version) != 2) { |
2083 | cFYI(1,("unknown POSIX ACL version %d",local_acl->a_version)); | 2085 | cFYI(1,("unknown POSIX ACL version %d", |
2086 | le32_to_cpu(local_acl->a_version))); | ||
2084 | return 0; | 2087 | return 0; |
2085 | } | 2088 | } |
2086 | cifs_acl->version = cpu_to_le16(1); | 2089 | cifs_acl->version = cpu_to_le16(1); |
2087 | if(acl_type == ACL_TYPE_ACCESS) | 2090 | if(acl_type == ACL_TYPE_ACCESS) |
2088 | cifs_acl->access_entry_count = count; | 2091 | cifs_acl->access_entry_count = cpu_to_le16(count); |
2089 | else if(acl_type == ACL_TYPE_DEFAULT) | 2092 | else if(acl_type == ACL_TYPE_DEFAULT) |
2090 | cifs_acl->default_entry_count = count; | 2093 | cifs_acl->default_entry_count = cpu_to_le16(count); |
2091 | else { | 2094 | else { |
2092 | cFYI(1,("unknown ACL type %d",acl_type)); | 2095 | cFYI(1,("unknown ACL type %d",acl_type)); |
2093 | return 0; | 2096 | return 0; |
@@ -3203,7 +3206,7 @@ getDFSRetry: | |||
3203 | temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset); | 3206 | temp = ((char *)referrals) + le16_to_cpu(referrals->DfsPathOffset); |
3204 | if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { | 3207 | if (pSMBr->hdr.Flags2 & SMBFLG2_UNICODE) { |
3205 | cifs_strfromUCS_le(*targetUNCs, | 3208 | cifs_strfromUCS_le(*targetUNCs, |
3206 | (wchar_t *) temp, name_len, nls_codepage); | 3209 | (__le16 *) temp, name_len, nls_codepage); |
3207 | } else { | 3210 | } else { |
3208 | strncpy(*targetUNCs,temp,name_len); | 3211 | strncpy(*targetUNCs,temp,name_len); |
3209 | } | 3212 | } |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 2cb620716bc1..c467de857610 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1986,32 +1986,32 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
1986 | bytes_returned = 0; /* skill null user */ | 1986 | bytes_returned = 0; /* skill null user */ |
1987 | else | 1987 | else |
1988 | bytes_returned = | 1988 | bytes_returned = |
1989 | cifs_strtoUCS((wchar_t *) bcc_ptr, user, 100, | 1989 | cifs_strtoUCS((__le16 *) bcc_ptr, user, 100, |
1990 | nls_codepage); | 1990 | nls_codepage); |
1991 | /* convert number of 16 bit words to bytes */ | 1991 | /* convert number of 16 bit words to bytes */ |
1992 | bcc_ptr += 2 * bytes_returned; | 1992 | bcc_ptr += 2 * bytes_returned; |
1993 | bcc_ptr += 2; /* trailing null */ | 1993 | bcc_ptr += 2; /* trailing null */ |
1994 | if (domain == NULL) | 1994 | if (domain == NULL) |
1995 | bytes_returned = | 1995 | bytes_returned = |
1996 | cifs_strtoUCS((wchar_t *) bcc_ptr, | 1996 | cifs_strtoUCS((__le16 *) bcc_ptr, |
1997 | "CIFS_LINUX_DOM", 32, nls_codepage); | 1997 | "CIFS_LINUX_DOM", 32, nls_codepage); |
1998 | else | 1998 | else |
1999 | bytes_returned = | 1999 | bytes_returned = |
2000 | cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64, | 2000 | cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64, |
2001 | nls_codepage); | 2001 | nls_codepage); |
2002 | bcc_ptr += 2 * bytes_returned; | 2002 | bcc_ptr += 2 * bytes_returned; |
2003 | bcc_ptr += 2; | 2003 | bcc_ptr += 2; |
2004 | bytes_returned = | 2004 | bytes_returned = |
2005 | cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ", | 2005 | cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ", |
2006 | 32, nls_codepage); | 2006 | 32, nls_codepage); |
2007 | bcc_ptr += 2 * bytes_returned; | 2007 | bcc_ptr += 2 * bytes_returned; |
2008 | bytes_returned = | 2008 | bytes_returned = |
2009 | cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, | 2009 | cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, |
2010 | 32, nls_codepage); | 2010 | 32, nls_codepage); |
2011 | bcc_ptr += 2 * bytes_returned; | 2011 | bcc_ptr += 2 * bytes_returned; |
2012 | bcc_ptr += 2; | 2012 | bcc_ptr += 2; |
2013 | bytes_returned = | 2013 | bytes_returned = |
2014 | cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS, | 2014 | cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
2015 | 64, nls_codepage); | 2015 | 64, nls_codepage); |
2016 | bcc_ptr += 2 * bytes_returned; | 2016 | bcc_ptr += 2 * bytes_returned; |
2017 | bcc_ptr += 2; | 2017 | bcc_ptr += 2; |
@@ -2081,7 +2081,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2081 | if(ses->serverOS == NULL) | 2081 | if(ses->serverOS == NULL) |
2082 | goto sesssetup_nomem; | 2082 | goto sesssetup_nomem; |
2083 | cifs_strfromUCS_le(ses->serverOS, | 2083 | cifs_strfromUCS_le(ses->serverOS, |
2084 | (wchar_t *)bcc_ptr, len,nls_codepage); | 2084 | (__le16 *)bcc_ptr, len,nls_codepage); |
2085 | bcc_ptr += 2 * (len + 1); | 2085 | bcc_ptr += 2 * (len + 1); |
2086 | remaining_words -= len + 1; | 2086 | remaining_words -= len + 1; |
2087 | ses->serverOS[2 * len] = 0; | 2087 | ses->serverOS[2 * len] = 0; |
@@ -2093,7 +2093,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2093 | if(ses->serverNOS == NULL) | 2093 | if(ses->serverNOS == NULL) |
2094 | goto sesssetup_nomem; | 2094 | goto sesssetup_nomem; |
2095 | cifs_strfromUCS_le(ses->serverNOS, | 2095 | cifs_strfromUCS_le(ses->serverNOS, |
2096 | (wchar_t *)bcc_ptr,len,nls_codepage); | 2096 | (__le16 *)bcc_ptr,len,nls_codepage); |
2097 | bcc_ptr += 2 * (len + 1); | 2097 | bcc_ptr += 2 * (len + 1); |
2098 | ses->serverNOS[2 * len] = 0; | 2098 | ses->serverNOS[2 * len] = 0; |
2099 | ses->serverNOS[1 + (2 * len)] = 0; | 2099 | ses->serverNOS[1 + (2 * len)] = 0; |
@@ -2111,7 +2111,7 @@ CIFSSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2111 | if(ses->serverDomain == NULL) | 2111 | if(ses->serverDomain == NULL) |
2112 | goto sesssetup_nomem; | 2112 | goto sesssetup_nomem; |
2113 | cifs_strfromUCS_le(ses->serverDomain, | 2113 | cifs_strfromUCS_le(ses->serverDomain, |
2114 | (wchar_t *)bcc_ptr,len,nls_codepage); | 2114 | (__le16 *)bcc_ptr,len,nls_codepage); |
2115 | bcc_ptr += 2 * (len + 1); | 2115 | bcc_ptr += 2 * (len + 1); |
2116 | ses->serverDomain[2*len] = 0; | 2116 | ses->serverDomain[2*len] = 0; |
2117 | ses->serverDomain[1+(2*len)] = 0; | 2117 | ses->serverDomain[1+(2*len)] = 0; |
@@ -2255,30 +2255,30 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2255 | bcc_ptr++; | 2255 | bcc_ptr++; |
2256 | } | 2256 | } |
2257 | bytes_returned = | 2257 | bytes_returned = |
2258 | cifs_strtoUCS((wchar_t *) bcc_ptr, user, 100, nls_codepage); | 2258 | cifs_strtoUCS((__le16 *) bcc_ptr, user, 100, nls_codepage); |
2259 | bcc_ptr += 2 * bytes_returned; /* convert num of 16 bit words to bytes */ | 2259 | bcc_ptr += 2 * bytes_returned; /* convert num of 16 bit words to bytes */ |
2260 | bcc_ptr += 2; /* trailing null */ | 2260 | bcc_ptr += 2; /* trailing null */ |
2261 | if (domain == NULL) | 2261 | if (domain == NULL) |
2262 | bytes_returned = | 2262 | bytes_returned = |
2263 | cifs_strtoUCS((wchar_t *) bcc_ptr, | 2263 | cifs_strtoUCS((__le16 *) bcc_ptr, |
2264 | "CIFS_LINUX_DOM", 32, nls_codepage); | 2264 | "CIFS_LINUX_DOM", 32, nls_codepage); |
2265 | else | 2265 | else |
2266 | bytes_returned = | 2266 | bytes_returned = |
2267 | cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64, | 2267 | cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64, |
2268 | nls_codepage); | 2268 | nls_codepage); |
2269 | bcc_ptr += 2 * bytes_returned; | 2269 | bcc_ptr += 2 * bytes_returned; |
2270 | bcc_ptr += 2; | 2270 | bcc_ptr += 2; |
2271 | bytes_returned = | 2271 | bytes_returned = |
2272 | cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ", | 2272 | cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ", |
2273 | 32, nls_codepage); | 2273 | 32, nls_codepage); |
2274 | bcc_ptr += 2 * bytes_returned; | 2274 | bcc_ptr += 2 * bytes_returned; |
2275 | bytes_returned = | 2275 | bytes_returned = |
2276 | cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32, | 2276 | cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, |
2277 | nls_codepage); | 2277 | nls_codepage); |
2278 | bcc_ptr += 2 * bytes_returned; | 2278 | bcc_ptr += 2 * bytes_returned; |
2279 | bcc_ptr += 2; | 2279 | bcc_ptr += 2; |
2280 | bytes_returned = | 2280 | bytes_returned = |
2281 | cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS, | 2281 | cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
2282 | 64, nls_codepage); | 2282 | 64, nls_codepage); |
2283 | bcc_ptr += 2 * bytes_returned; | 2283 | bcc_ptr += 2 * bytes_returned; |
2284 | bcc_ptr += 2; | 2284 | bcc_ptr += 2; |
@@ -2357,7 +2357,7 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2357 | ses->serverOS = | 2357 | ses->serverOS = |
2358 | kzalloc(2 * (len + 1), GFP_KERNEL); | 2358 | kzalloc(2 * (len + 1), GFP_KERNEL); |
2359 | cifs_strfromUCS_le(ses->serverOS, | 2359 | cifs_strfromUCS_le(ses->serverOS, |
2360 | (wchar_t *) | 2360 | (__le16 *) |
2361 | bcc_ptr, len, | 2361 | bcc_ptr, len, |
2362 | nls_codepage); | 2362 | nls_codepage); |
2363 | bcc_ptr += 2 * (len + 1); | 2363 | bcc_ptr += 2 * (len + 1); |
@@ -2372,7 +2372,7 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2372 | kzalloc(2 * (len + 1), | 2372 | kzalloc(2 * (len + 1), |
2373 | GFP_KERNEL); | 2373 | GFP_KERNEL); |
2374 | cifs_strfromUCS_le(ses->serverNOS, | 2374 | cifs_strfromUCS_le(ses->serverNOS, |
2375 | (wchar_t *)bcc_ptr, | 2375 | (__le16 *)bcc_ptr, |
2376 | len, | 2376 | len, |
2377 | nls_codepage); | 2377 | nls_codepage); |
2378 | bcc_ptr += 2 * (len + 1); | 2378 | bcc_ptr += 2 * (len + 1); |
@@ -2384,9 +2384,8 @@ CIFSSpnegoSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2384 | /* last string is not always null terminated (for e.g. for Windows XP & 2000) */ | 2384 | /* last string is not always null terminated (for e.g. for Windows XP & 2000) */ |
2385 | ses->serverDomain = kzalloc(2*(len+1),GFP_KERNEL); | 2385 | ses->serverDomain = kzalloc(2*(len+1),GFP_KERNEL); |
2386 | cifs_strfromUCS_le(ses->serverDomain, | 2386 | cifs_strfromUCS_le(ses->serverDomain, |
2387 | (wchar_t *)bcc_ptr, | 2387 | (__le16 *)bcc_ptr, |
2388 | len, | 2388 | len, nls_codepage); |
2389 | nls_codepage); | ||
2390 | bcc_ptr += 2*(len+1); | 2389 | bcc_ptr += 2*(len+1); |
2391 | ses->serverDomain[2*len] = 0; | 2390 | ses->serverDomain[2*len] = 0; |
2392 | ses->serverDomain[1+(2*len)] = 0; | 2391 | ses->serverDomain[1+(2*len)] = 0; |
@@ -2560,16 +2559,16 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, | |||
2560 | } | 2559 | } |
2561 | 2560 | ||
2562 | bytes_returned = | 2561 | bytes_returned = |
2563 | cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ", | 2562 | cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ", |
2564 | 32, nls_codepage); | 2563 | 32, nls_codepage); |
2565 | bcc_ptr += 2 * bytes_returned; | 2564 | bcc_ptr += 2 * bytes_returned; |
2566 | bytes_returned = | 2565 | bytes_returned = |
2567 | cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32, | 2566 | cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, |
2568 | nls_codepage); | 2567 | nls_codepage); |
2569 | bcc_ptr += 2 * bytes_returned; | 2568 | bcc_ptr += 2 * bytes_returned; |
2570 | bcc_ptr += 2; /* null terminate Linux version */ | 2569 | bcc_ptr += 2; /* null terminate Linux version */ |
2571 | bytes_returned = | 2570 | bytes_returned = |
2572 | cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS, | 2571 | cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
2573 | 64, nls_codepage); | 2572 | 64, nls_codepage); |
2574 | bcc_ptr += 2 * bytes_returned; | 2573 | bcc_ptr += 2 * bytes_returned; |
2575 | *(bcc_ptr + 1) = 0; | 2574 | *(bcc_ptr + 1) = 0; |
@@ -2673,7 +2672,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, | |||
2673 | ses->serverOS = | 2672 | ses->serverOS = |
2674 | kzalloc(2 * (len + 1), GFP_KERNEL); | 2673 | kzalloc(2 * (len + 1), GFP_KERNEL); |
2675 | cifs_strfromUCS_le(ses->serverOS, | 2674 | cifs_strfromUCS_le(ses->serverOS, |
2676 | (wchar_t *) | 2675 | (__le16 *) |
2677 | bcc_ptr, len, | 2676 | bcc_ptr, len, |
2678 | nls_codepage); | 2677 | nls_codepage); |
2679 | bcc_ptr += 2 * (len + 1); | 2678 | bcc_ptr += 2 * (len + 1); |
@@ -2690,7 +2689,7 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, | |||
2690 | GFP_KERNEL); | 2689 | GFP_KERNEL); |
2691 | cifs_strfromUCS_le(ses-> | 2690 | cifs_strfromUCS_le(ses-> |
2692 | serverNOS, | 2691 | serverNOS, |
2693 | (wchar_t *) | 2692 | (__le16 *) |
2694 | bcc_ptr, | 2693 | bcc_ptr, |
2695 | len, | 2694 | len, |
2696 | nls_codepage); | 2695 | nls_codepage); |
@@ -2708,23 +2707,15 @@ CIFSNTLMSSPNegotiateSessSetup(unsigned int xid, | |||
2708 | 1), | 2707 | 1), |
2709 | GFP_KERNEL); | 2708 | GFP_KERNEL); |
2710 | cifs_strfromUCS_le | 2709 | cifs_strfromUCS_le |
2711 | (ses-> | 2710 | (ses->serverDomain, |
2712 | serverDomain, | 2711 | (__le16 *)bcc_ptr, |
2713 | (wchar_t *) | 2712 | len, nls_codepage); |
2714 | bcc_ptr, len, | ||
2715 | nls_codepage); | ||
2716 | bcc_ptr += | 2713 | bcc_ptr += |
2717 | 2 * (len + 1); | 2714 | 2 * (len + 1); |
2718 | ses-> | 2715 | ses->serverDomain[2*len] |
2719 | serverDomain[2 | ||
2720 | * len] | ||
2721 | = 0; | 2716 | = 0; |
2722 | ses-> | 2717 | ses->serverDomain |
2723 | serverDomain[1 | 2718 | [1 + (2 * len)] |
2724 | + | ||
2725 | (2 | ||
2726 | * | ||
2727 | len)] | ||
2728 | = 0; | 2719 | = 0; |
2729 | } /* else no more room so create dummy domain string */ | 2720 | } /* else no more room so create dummy domain string */ |
2730 | else | 2721 | else |
@@ -2903,7 +2894,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2903 | SecurityBlob->DomainName.MaximumLength = 0; | 2894 | SecurityBlob->DomainName.MaximumLength = 0; |
2904 | } else { | 2895 | } else { |
2905 | __u16 len = | 2896 | __u16 len = |
2906 | cifs_strtoUCS((wchar_t *) bcc_ptr, domain, 64, | 2897 | cifs_strtoUCS((__le16 *) bcc_ptr, domain, 64, |
2907 | nls_codepage); | 2898 | nls_codepage); |
2908 | len *= 2; | 2899 | len *= 2; |
2909 | SecurityBlob->DomainName.MaximumLength = | 2900 | SecurityBlob->DomainName.MaximumLength = |
@@ -2921,7 +2912,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2921 | SecurityBlob->UserName.MaximumLength = 0; | 2912 | SecurityBlob->UserName.MaximumLength = 0; |
2922 | } else { | 2913 | } else { |
2923 | __u16 len = | 2914 | __u16 len = |
2924 | cifs_strtoUCS((wchar_t *) bcc_ptr, user, 64, | 2915 | cifs_strtoUCS((__le16 *) bcc_ptr, user, 64, |
2925 | nls_codepage); | 2916 | nls_codepage); |
2926 | len *= 2; | 2917 | len *= 2; |
2927 | SecurityBlob->UserName.MaximumLength = | 2918 | SecurityBlob->UserName.MaximumLength = |
@@ -2934,7 +2925,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2934 | cpu_to_le16(len); | 2925 | cpu_to_le16(len); |
2935 | } | 2926 | } |
2936 | 2927 | ||
2937 | /* SecurityBlob->WorkstationName.Length = cifs_strtoUCS((wchar_t *) bcc_ptr, "AMACHINE",64, nls_codepage); | 2928 | /* SecurityBlob->WorkstationName.Length = cifs_strtoUCS((__le16 *) bcc_ptr, "AMACHINE",64, nls_codepage); |
2938 | SecurityBlob->WorkstationName.Length *= 2; | 2929 | SecurityBlob->WorkstationName.Length *= 2; |
2939 | SecurityBlob->WorkstationName.MaximumLength = cpu_to_le16(SecurityBlob->WorkstationName.Length); | 2930 | SecurityBlob->WorkstationName.MaximumLength = cpu_to_le16(SecurityBlob->WorkstationName.Length); |
2940 | SecurityBlob->WorkstationName.Buffer = cpu_to_le32(SecurityBlobLength); | 2931 | SecurityBlob->WorkstationName.Buffer = cpu_to_le32(SecurityBlobLength); |
@@ -2947,16 +2938,16 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
2947 | bcc_ptr++; | 2938 | bcc_ptr++; |
2948 | } | 2939 | } |
2949 | bytes_returned = | 2940 | bytes_returned = |
2950 | cifs_strtoUCS((wchar_t *) bcc_ptr, "Linux version ", | 2941 | cifs_strtoUCS((__le16 *) bcc_ptr, "Linux version ", |
2951 | 32, nls_codepage); | 2942 | 32, nls_codepage); |
2952 | bcc_ptr += 2 * bytes_returned; | 2943 | bcc_ptr += 2 * bytes_returned; |
2953 | bytes_returned = | 2944 | bytes_returned = |
2954 | cifs_strtoUCS((wchar_t *) bcc_ptr, system_utsname.release, 32, | 2945 | cifs_strtoUCS((__le16 *) bcc_ptr, system_utsname.release, 32, |
2955 | nls_codepage); | 2946 | nls_codepage); |
2956 | bcc_ptr += 2 * bytes_returned; | 2947 | bcc_ptr += 2 * bytes_returned; |
2957 | bcc_ptr += 2; /* null term version string */ | 2948 | bcc_ptr += 2; /* null term version string */ |
2958 | bytes_returned = | 2949 | bytes_returned = |
2959 | cifs_strtoUCS((wchar_t *) bcc_ptr, CIFS_NETWORK_OPSYS, | 2950 | cifs_strtoUCS((__le16 *) bcc_ptr, CIFS_NETWORK_OPSYS, |
2960 | 64, nls_codepage); | 2951 | 64, nls_codepage); |
2961 | bcc_ptr += 2 * bytes_returned; | 2952 | bcc_ptr += 2 * bytes_returned; |
2962 | *(bcc_ptr + 1) = 0; | 2953 | *(bcc_ptr + 1) = 0; |
@@ -3069,7 +3060,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
3069 | ses->serverOS = | 3060 | ses->serverOS = |
3070 | kzalloc(2 * (len + 1), GFP_KERNEL); | 3061 | kzalloc(2 * (len + 1), GFP_KERNEL); |
3071 | cifs_strfromUCS_le(ses->serverOS, | 3062 | cifs_strfromUCS_le(ses->serverOS, |
3072 | (wchar_t *) | 3063 | (__le16 *) |
3073 | bcc_ptr, len, | 3064 | bcc_ptr, len, |
3074 | nls_codepage); | 3065 | nls_codepage); |
3075 | bcc_ptr += 2 * (len + 1); | 3066 | bcc_ptr += 2 * (len + 1); |
@@ -3086,7 +3077,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
3086 | GFP_KERNEL); | 3077 | GFP_KERNEL); |
3087 | cifs_strfromUCS_le(ses-> | 3078 | cifs_strfromUCS_le(ses-> |
3088 | serverNOS, | 3079 | serverNOS, |
3089 | (wchar_t *) | 3080 | (__le16 *) |
3090 | bcc_ptr, | 3081 | bcc_ptr, |
3091 | len, | 3082 | len, |
3092 | nls_codepage); | 3083 | nls_codepage); |
@@ -3105,7 +3096,7 @@ CIFSNTLMSSPAuthSessSetup(unsigned int xid, struct cifsSesInfo *ses, | |||
3105 | cifs_strfromUCS_le | 3096 | cifs_strfromUCS_le |
3106 | (ses-> | 3097 | (ses-> |
3107 | serverDomain, | 3098 | serverDomain, |
3108 | (wchar_t *) | 3099 | (__le16 *) |
3109 | bcc_ptr, len, | 3100 | bcc_ptr, len, |
3110 | nls_codepage); | 3101 | nls_codepage); |
3111 | bcc_ptr += | 3102 | bcc_ptr += |
@@ -3227,7 +3218,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
3227 | if (ses->capabilities & CAP_UNICODE) { | 3218 | if (ses->capabilities & CAP_UNICODE) { |
3228 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; | 3219 | smb_buffer->Flags2 |= SMBFLG2_UNICODE; |
3229 | length = | 3220 | length = |
3230 | cifs_strtoUCS((wchar_t *) bcc_ptr, tree, 100, nls_codepage); | 3221 | cifs_strtoUCS((__le16 *) bcc_ptr, tree, 100, nls_codepage); |
3231 | bcc_ptr += 2 * length; /* convert num of 16 bit words to bytes */ | 3222 | bcc_ptr += 2 * length; /* convert num of 16 bit words to bytes */ |
3232 | bcc_ptr += 2; /* skip trailing null */ | 3223 | bcc_ptr += 2; /* skip trailing null */ |
3233 | } else { /* ASCII */ | 3224 | } else { /* ASCII */ |
@@ -3263,7 +3254,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
3263 | tcon->nativeFileSystem = | 3254 | tcon->nativeFileSystem = |
3264 | kzalloc(length + 2, GFP_KERNEL); | 3255 | kzalloc(length + 2, GFP_KERNEL); |
3265 | cifs_strfromUCS_le(tcon->nativeFileSystem, | 3256 | cifs_strfromUCS_le(tcon->nativeFileSystem, |
3266 | (wchar_t *) bcc_ptr, | 3257 | (__le16 *) bcc_ptr, |
3267 | length, nls_codepage); | 3258 | length, nls_codepage); |
3268 | bcc_ptr += 2 * length; | 3259 | bcc_ptr += 2 * length; |
3269 | bcc_ptr[0] = 0; /* null terminate the string */ | 3260 | bcc_ptr[0] = 0; /* null terminate the string */ |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 8dfe717a332a..16b21522e8fe 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -292,7 +292,8 @@ cifs_create_out: | |||
292 | return rc; | 292 | return rc; |
293 | } | 293 | } |
294 | 294 | ||
295 | int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t device_number) | 295 | int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, |
296 | dev_t device_number) | ||
296 | { | 297 | { |
297 | int rc = -EPERM; | 298 | int rc = -EPERM; |
298 | int xid; | 299 | int xid; |
@@ -368,7 +369,34 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev | |||
368 | 369 | ||
369 | if(!rc) { | 370 | if(!rc) { |
370 | /* BB Do not bother to decode buf since no | 371 | /* BB Do not bother to decode buf since no |
371 | local inode yet to put timestamps in */ | 372 | local inode yet to put timestamps in, |
373 | but we can reuse it safely */ | ||
374 | int bytes_written; | ||
375 | struct win_dev *pdev; | ||
376 | pdev = (struct win_dev *)buf; | ||
377 | if(S_ISCHR(mode)) { | ||
378 | memcpy(pdev->type, "IntxCHR", 8); | ||
379 | pdev->major = | ||
380 | cpu_to_le64(MAJOR(device_number)); | ||
381 | pdev->minor = | ||
382 | cpu_to_le64(MINOR(device_number)); | ||
383 | rc = CIFSSMBWrite(xid, pTcon, | ||
384 | fileHandle, | ||
385 | sizeof(struct win_dev), | ||
386 | 0, &bytes_written, (char *)pdev, | ||
387 | NULL, 0); | ||
388 | } else if(S_ISBLK(mode)) { | ||
389 | memcpy(pdev->type, "IntxBLK", 8); | ||
390 | pdev->major = | ||
391 | cpu_to_le64(MAJOR(device_number)); | ||
392 | pdev->minor = | ||
393 | cpu_to_le64(MINOR(device_number)); | ||
394 | rc = CIFSSMBWrite(xid, pTcon, | ||
395 | fileHandle, | ||
396 | sizeof(struct win_dev), | ||
397 | 0, &bytes_written, (char *)pdev, | ||
398 | NULL, 0); | ||
399 | } /* else if(S_ISFIFO */ | ||
372 | CIFSSMBClose(xid, pTcon, fileHandle); | 400 | CIFSSMBClose(xid, pTcon, fileHandle); |
373 | d_drop(direntry); | 401 | d_drop(direntry); |
374 | } | 402 | } |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index da4f5e10b3cc..14a1c72ced92 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -489,8 +489,10 @@ int cifs_close(struct inode *inode, struct file *file) | |||
489 | the struct would be in each open file, | 489 | the struct would be in each open file, |
490 | but this should give enough time to | 490 | but this should give enough time to |
491 | clear the socket */ | 491 | clear the socket */ |
492 | write_unlock(&file->f_owner.lock); | ||
492 | cERROR(1,("close with pending writes")); | 493 | cERROR(1,("close with pending writes")); |
493 | msleep(timeout); | 494 | msleep(timeout); |
495 | write_lock(&file->f_owner.lock); | ||
494 | timeout *= 4; | 496 | timeout *= 4; |
495 | } | 497 | } |
496 | write_unlock(&file->f_owner.lock); | 498 | write_unlock(&file->f_owner.lock); |
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 923d071163b2..05b525812adb 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c | |||
@@ -41,7 +41,7 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
41 | char *tmp_path; | 41 | char *tmp_path; |
42 | 42 | ||
43 | pTcon = cifs_sb->tcon; | 43 | pTcon = cifs_sb->tcon; |
44 | cFYI(1, (" Getting info on %s ", search_path)); | 44 | cFYI(1, ("Getting info on %s ", search_path)); |
45 | /* could have done a find first instead but this returns more info */ | 45 | /* could have done a find first instead but this returns more info */ |
46 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData, | 46 | rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData, |
47 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & | 47 | cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & |
@@ -97,9 +97,9 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
97 | inode = *pinode; | 97 | inode = *pinode; |
98 | cifsInfo = CIFS_I(inode); | 98 | cifsInfo = CIFS_I(inode); |
99 | 99 | ||
100 | cFYI(1, (" Old time %ld ", cifsInfo->time)); | 100 | cFYI(1, ("Old time %ld ", cifsInfo->time)); |
101 | cifsInfo->time = jiffies; | 101 | cifsInfo->time = jiffies; |
102 | cFYI(1, (" New time %ld ", cifsInfo->time)); | 102 | cFYI(1, ("New time %ld ", cifsInfo->time)); |
103 | /* this is ok to set on every inode revalidate */ | 103 | /* this is ok to set on every inode revalidate */ |
104 | atomic_set(&cifsInfo->inUse,1); | 104 | atomic_set(&cifsInfo->inUse,1); |
105 | 105 | ||
@@ -111,6 +111,9 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
111 | inode->i_ctime = | 111 | inode->i_ctime = |
112 | cifs_NTtimeToUnix(le64_to_cpu(findData.LastStatusChange)); | 112 | cifs_NTtimeToUnix(le64_to_cpu(findData.LastStatusChange)); |
113 | inode->i_mode = le64_to_cpu(findData.Permissions); | 113 | inode->i_mode = le64_to_cpu(findData.Permissions); |
114 | /* since we set the inode type below we need to mask off | ||
115 | to avoid strange results if bits set above */ | ||
116 | inode->i_mode &= ~S_IFMT; | ||
114 | if (type == UNIX_FILE) { | 117 | if (type == UNIX_FILE) { |
115 | inode->i_mode |= S_IFREG; | 118 | inode->i_mode |= S_IFREG; |
116 | } else if (type == UNIX_SYMLINK) { | 119 | } else if (type == UNIX_SYMLINK) { |
@@ -129,6 +132,10 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
129 | inode->i_mode |= S_IFIFO; | 132 | inode->i_mode |= S_IFIFO; |
130 | } else if (type == UNIX_SOCKET) { | 133 | } else if (type == UNIX_SOCKET) { |
131 | inode->i_mode |= S_IFSOCK; | 134 | inode->i_mode |= S_IFSOCK; |
135 | } else { | ||
136 | /* safest to call it a file if we do not know */ | ||
137 | inode->i_mode |= S_IFREG; | ||
138 | cFYI(1,("unknown type %d",type)); | ||
132 | } | 139 | } |
133 | inode->i_uid = le64_to_cpu(findData.Uid); | 140 | inode->i_uid = le64_to_cpu(findData.Uid); |
134 | inode->i_gid = le64_to_cpu(findData.Gid); | 141 | inode->i_gid = le64_to_cpu(findData.Gid); |
@@ -155,34 +162,39 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
155 | } | 162 | } |
156 | 163 | ||
157 | if (num_of_bytes < end_of_file) | 164 | if (num_of_bytes < end_of_file) |
158 | cFYI(1, ("allocation size less than end of file ")); | 165 | cFYI(1, ("allocation size less than end of file")); |
159 | cFYI(1, | 166 | cFYI(1, |
160 | ("Size %ld and blocks %ld", | 167 | ("Size %ld and blocks %ld", |
161 | (unsigned long) inode->i_size, inode->i_blocks)); | 168 | (unsigned long) inode->i_size, inode->i_blocks)); |
162 | if (S_ISREG(inode->i_mode)) { | 169 | if (S_ISREG(inode->i_mode)) { |
163 | cFYI(1, (" File inode ")); | 170 | cFYI(1, ("File inode")); |
164 | inode->i_op = &cifs_file_inode_ops; | 171 | inode->i_op = &cifs_file_inode_ops; |
165 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) | 172 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { |
166 | inode->i_fop = &cifs_file_direct_ops; | 173 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) |
167 | else | 174 | inode->i_fop = |
175 | &cifs_file_direct_nobrl_ops; | ||
176 | else | ||
177 | inode->i_fop = &cifs_file_direct_ops; | ||
178 | } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
179 | inode->i_fop = &cifs_file_nobrl_ops; | ||
180 | else /* not direct, send byte range locks */ | ||
168 | inode->i_fop = &cifs_file_ops; | 181 | inode->i_fop = &cifs_file_ops; |
169 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | 182 | |
170 | inode->i_fop->lock = NULL; | ||
171 | inode->i_data.a_ops = &cifs_addr_ops; | 183 | inode->i_data.a_ops = &cifs_addr_ops; |
172 | /* check if server can support readpages */ | 184 | /* check if server can support readpages */ |
173 | if(pTcon->ses->server->maxBuf < | 185 | if(pTcon->ses->server->maxBuf < |
174 | 4096 + MAX_CIFS_HDR_SIZE) | 186 | 4096 + MAX_CIFS_HDR_SIZE) |
175 | inode->i_data.a_ops->readpages = NULL; | 187 | inode->i_data.a_ops->readpages = NULL; |
176 | } else if (S_ISDIR(inode->i_mode)) { | 188 | } else if (S_ISDIR(inode->i_mode)) { |
177 | cFYI(1, (" Directory inode")); | 189 | cFYI(1, ("Directory inode")); |
178 | inode->i_op = &cifs_dir_inode_ops; | 190 | inode->i_op = &cifs_dir_inode_ops; |
179 | inode->i_fop = &cifs_dir_ops; | 191 | inode->i_fop = &cifs_dir_ops; |
180 | } else if (S_ISLNK(inode->i_mode)) { | 192 | } else if (S_ISLNK(inode->i_mode)) { |
181 | cFYI(1, (" Symbolic Link inode ")); | 193 | cFYI(1, ("Symbolic Link inode")); |
182 | inode->i_op = &cifs_symlink_inode_ops; | 194 | inode->i_op = &cifs_symlink_inode_ops; |
183 | /* tmp_inode->i_fop = */ /* do not need to set to anything */ | 195 | /* tmp_inode->i_fop = */ /* do not need to set to anything */ |
184 | } else { | 196 | } else { |
185 | cFYI(1, (" Init special inode ")); | 197 | cFYI(1, ("Init special inode")); |
186 | init_special_inode(inode, inode->i_mode, | 198 | init_special_inode(inode, inode->i_mode, |
187 | inode->i_rdev); | 199 | inode->i_rdev); |
188 | } | 200 | } |
@@ -190,6 +202,111 @@ int cifs_get_inode_info_unix(struct inode **pinode, | |||
190 | return rc; | 202 | return rc; |
191 | } | 203 | } |
192 | 204 | ||
205 | static int decode_sfu_inode(struct inode * inode, __u64 size, | ||
206 | const unsigned char *path, | ||
207 | struct cifs_sb_info *cifs_sb, int xid) | ||
208 | { | ||
209 | int rc; | ||
210 | int oplock = FALSE; | ||
211 | __u16 netfid; | ||
212 | struct cifsTconInfo *pTcon = cifs_sb->tcon; | ||
213 | char buf[24]; | ||
214 | unsigned int bytes_read; | ||
215 | char * pbuf; | ||
216 | |||
217 | pbuf = buf; | ||
218 | |||
219 | if(size == 0) { | ||
220 | inode->i_mode |= S_IFIFO; | ||
221 | return 0; | ||
222 | } else if (size < 8) { | ||
223 | return -EINVAL; /* EOPNOTSUPP? */ | ||
224 | } | ||
225 | |||
226 | rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ, | ||
227 | CREATE_NOT_DIR, &netfid, &oplock, NULL, | ||
228 | cifs_sb->local_nls, | ||
229 | cifs_sb->mnt_cifs_flags & | ||
230 | CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
231 | if (rc==0) { | ||
232 | /* Read header */ | ||
233 | rc = CIFSSMBRead(xid, pTcon, | ||
234 | netfid, | ||
235 | 24 /* length */, 0 /* offset */, | ||
236 | &bytes_read, &pbuf); | ||
237 | if((rc == 0) && (bytes_read >= 8)) { | ||
238 | if(memcmp("IntxBLK", pbuf, 8) == 0) { | ||
239 | cFYI(1,("Block device")); | ||
240 | inode->i_mode |= S_IFBLK; | ||
241 | if(bytes_read == 24) { | ||
242 | /* we have enough to decode dev num */ | ||
243 | __u64 mjr; /* major */ | ||
244 | __u64 mnr; /* minor */ | ||
245 | mjr = le64_to_cpu(*(__le64 *)(pbuf+8)); | ||
246 | mnr = le64_to_cpu(*(__le64 *)(pbuf+16)); | ||
247 | inode->i_rdev = MKDEV(mjr, mnr); | ||
248 | } | ||
249 | } else if(memcmp("IntxCHR", pbuf, 8) == 0) { | ||
250 | cFYI(1,("Char device")); | ||
251 | inode->i_mode |= S_IFCHR; | ||
252 | if(bytes_read == 24) { | ||
253 | /* we have enough to decode dev num */ | ||
254 | __u64 mjr; /* major */ | ||
255 | __u64 mnr; /* minor */ | ||
256 | mjr = le64_to_cpu(*(__le64 *)(pbuf+8)); | ||
257 | mnr = le64_to_cpu(*(__le64 *)(pbuf+16)); | ||
258 | inode->i_rdev = MKDEV(mjr, mnr); | ||
259 | } | ||
260 | } else if(memcmp("IntxLNK", pbuf, 7) == 0) { | ||
261 | cFYI(1,("Symlink")); | ||
262 | inode->i_mode |= S_IFLNK; | ||
263 | } else { | ||
264 | inode->i_mode |= S_IFREG; /* file? */ | ||
265 | rc = -EOPNOTSUPP; | ||
266 | } | ||
267 | } else { | ||
268 | inode->i_mode |= S_IFREG; /* then it is a file */ | ||
269 | rc = -EOPNOTSUPP; /* or some unknown SFU type */ | ||
270 | } | ||
271 | CIFSSMBClose(xid, pTcon, netfid); | ||
272 | } | ||
273 | return rc; | ||
274 | |||
275 | } | ||
276 | |||
277 | #define SFBITS_MASK (S_ISVTX | S_ISGID | S_ISUID) /* SETFILEBITS valid bits */ | ||
278 | |||
279 | static int get_sfu_uid_mode(struct inode * inode, | ||
280 | const unsigned char *path, | ||
281 | struct cifs_sb_info *cifs_sb, int xid) | ||
282 | { | ||
283 | #ifdef CONFIG_CIFS_XATTR | ||
284 | ssize_t rc; | ||
285 | char ea_value[4]; | ||
286 | __u32 mode; | ||
287 | |||
288 | rc = CIFSSMBQueryEA(xid, cifs_sb->tcon, path, "SETFILEBITS", | ||
289 | ea_value, 4 /* size of buf */, cifs_sb->local_nls, | ||
290 | cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); | ||
291 | if(rc < 0) | ||
292 | return (int)rc; | ||
293 | else if (rc > 3) { | ||
294 | mode = le32_to_cpu(*((__le32 *)ea_value)); | ||
295 | inode->i_mode &= ~SFBITS_MASK; | ||
296 | cFYI(1,("special bits 0%o org mode 0%o", mode, inode->i_mode)); | ||
297 | inode->i_mode = (mode & SFBITS_MASK) | inode->i_mode; | ||
298 | cFYI(1,("special mode bits 0%o", mode)); | ||
299 | return 0; | ||
300 | } else { | ||
301 | return 0; | ||
302 | } | ||
303 | #else | ||
304 | return -EOPNOTSUPP; | ||
305 | #endif | ||
306 | |||
307 | |||
308 | } | ||
309 | |||
193 | int cifs_get_inode_info(struct inode **pinode, | 310 | int cifs_get_inode_info(struct inode **pinode, |
194 | const unsigned char *search_path, FILE_ALL_INFO *pfindData, | 311 | const unsigned char *search_path, FILE_ALL_INFO *pfindData, |
195 | struct super_block *sb, int xid) | 312 | struct super_block *sb, int xid) |
@@ -202,7 +319,7 @@ int cifs_get_inode_info(struct inode **pinode, | |||
202 | char *buf = NULL; | 319 | char *buf = NULL; |
203 | 320 | ||
204 | pTcon = cifs_sb->tcon; | 321 | pTcon = cifs_sb->tcon; |
205 | cFYI(1,("Getting info on %s ", search_path)); | 322 | cFYI(1,("Getting info on %s", search_path)); |
206 | 323 | ||
207 | if ((pfindData == NULL) && (*pinode != NULL)) { | 324 | if ((pfindData == NULL) && (*pinode != NULL)) { |
208 | if (CIFS_I(*pinode)->clientCanCacheRead) { | 325 | if (CIFS_I(*pinode)->clientCanCacheRead) { |
@@ -303,9 +420,9 @@ int cifs_get_inode_info(struct inode **pinode, | |||
303 | inode = *pinode; | 420 | inode = *pinode; |
304 | cifsInfo = CIFS_I(inode); | 421 | cifsInfo = CIFS_I(inode); |
305 | cifsInfo->cifsAttrs = attr; | 422 | cifsInfo->cifsAttrs = attr; |
306 | cFYI(1, (" Old time %ld ", cifsInfo->time)); | 423 | cFYI(1, ("Old time %ld ", cifsInfo->time)); |
307 | cifsInfo->time = jiffies; | 424 | cifsInfo->time = jiffies; |
308 | cFYI(1, (" New time %ld ", cifsInfo->time)); | 425 | cFYI(1, ("New time %ld ", cifsInfo->time)); |
309 | 426 | ||
310 | /* blksize needs to be multiple of two. So safer to default to | 427 | /* blksize needs to be multiple of two. So safer to default to |
311 | blksize and blkbits set in superblock so 2**blkbits and blksize | 428 | blksize and blkbits set in superblock so 2**blkbits and blksize |
@@ -319,13 +436,15 @@ int cifs_get_inode_info(struct inode **pinode, | |||
319 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime)); | 436 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime)); |
320 | inode->i_ctime = | 437 | inode->i_ctime = |
321 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); | 438 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); |
322 | cFYI(0, (" Attributes came in as 0x%x ", attr)); | 439 | cFYI(0, ("Attributes came in as 0x%x ", attr)); |
323 | 440 | ||
324 | /* set default mode. will override for dirs below */ | 441 | /* set default mode. will override for dirs below */ |
325 | if (atomic_read(&cifsInfo->inUse) == 0) | 442 | if (atomic_read(&cifsInfo->inUse) == 0) |
326 | /* new inode, can safely set these fields */ | 443 | /* new inode, can safely set these fields */ |
327 | inode->i_mode = cifs_sb->mnt_file_mode; | 444 | inode->i_mode = cifs_sb->mnt_file_mode; |
328 | 445 | else /* since we set the inode type below we need to mask off | |
446 | to avoid strange results if type changes and both get orred in */ | ||
447 | inode->i_mode &= ~S_IFMT; | ||
329 | /* if (attr & ATTR_REPARSE) */ | 448 | /* if (attr & ATTR_REPARSE) */ |
330 | /* We no longer handle these as symlinks because we could not | 449 | /* We no longer handle these as symlinks because we could not |
331 | follow them due to the absolute path with drive letter */ | 450 | follow them due to the absolute path with drive letter */ |
@@ -340,10 +459,16 @@ int cifs_get_inode_info(struct inode **pinode, | |||
340 | (pfindData->EndOfFile == 0)) { | 459 | (pfindData->EndOfFile == 0)) { |
341 | inode->i_mode = cifs_sb->mnt_file_mode; | 460 | inode->i_mode = cifs_sb->mnt_file_mode; |
342 | inode->i_mode |= S_IFIFO; | 461 | inode->i_mode |= S_IFIFO; |
343 | /* BB Finish for SFU style symlinks and devies */ | 462 | /* BB Finish for SFU style symlinks and devices */ |
344 | /* } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && | 463 | } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && |
345 | (cifsInfo->cifsAttrs & ATTR_SYSTEM) && ) */ | 464 | (cifsInfo->cifsAttrs & ATTR_SYSTEM)) { |
346 | 465 | if (decode_sfu_inode(inode, | |
466 | le64_to_cpu(pfindData->EndOfFile), | ||
467 | search_path, | ||
468 | cifs_sb, xid)) { | ||
469 | cFYI(1,("Unrecognized sfu inode type")); | ||
470 | } | ||
471 | cFYI(1,("sfu mode 0%o",inode->i_mode)); | ||
347 | } else { | 472 | } else { |
348 | inode->i_mode |= S_IFREG; | 473 | inode->i_mode |= S_IFREG; |
349 | /* treat the dos attribute of read-only as read-only | 474 | /* treat the dos attribute of read-only as read-only |
@@ -368,7 +493,10 @@ int cifs_get_inode_info(struct inode **pinode, | |||
368 | 493 | ||
369 | /* BB fill in uid and gid here? with help from winbind? | 494 | /* BB fill in uid and gid here? with help from winbind? |
370 | or retrieve from NTFS stream extended attribute */ | 495 | or retrieve from NTFS stream extended attribute */ |
371 | if (atomic_read(&cifsInfo->inUse) == 0) { | 496 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) { |
497 | /* fill in uid, gid, mode from server ACL */ | ||
498 | get_sfu_uid_mode(inode, search_path, cifs_sb, xid); | ||
499 | } else if (atomic_read(&cifsInfo->inUse) == 0) { | ||
372 | inode->i_uid = cifs_sb->mnt_uid; | 500 | inode->i_uid = cifs_sb->mnt_uid; |
373 | inode->i_gid = cifs_sb->mnt_gid; | 501 | inode->i_gid = cifs_sb->mnt_gid; |
374 | /* set so we do not keep refreshing these fields with | 502 | /* set so we do not keep refreshing these fields with |
@@ -377,24 +505,29 @@ int cifs_get_inode_info(struct inode **pinode, | |||
377 | } | 505 | } |
378 | 506 | ||
379 | if (S_ISREG(inode->i_mode)) { | 507 | if (S_ISREG(inode->i_mode)) { |
380 | cFYI(1, (" File inode ")); | 508 | cFYI(1, ("File inode")); |
381 | inode->i_op = &cifs_file_inode_ops; | 509 | inode->i_op = &cifs_file_inode_ops; |
382 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) | 510 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { |
383 | inode->i_fop = &cifs_file_direct_ops; | 511 | if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) |
384 | else | 512 | inode->i_fop = |
513 | &cifs_file_direct_nobrl_ops; | ||
514 | else | ||
515 | inode->i_fop = &cifs_file_direct_ops; | ||
516 | } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
517 | inode->i_fop = &cifs_file_nobrl_ops; | ||
518 | else /* not direct, send byte range locks */ | ||
385 | inode->i_fop = &cifs_file_ops; | 519 | inode->i_fop = &cifs_file_ops; |
386 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | 520 | |
387 | inode->i_fop->lock = NULL; | ||
388 | inode->i_data.a_ops = &cifs_addr_ops; | 521 | inode->i_data.a_ops = &cifs_addr_ops; |
389 | if(pTcon->ses->server->maxBuf < | 522 | if(pTcon->ses->server->maxBuf < |
390 | 4096 + MAX_CIFS_HDR_SIZE) | 523 | 4096 + MAX_CIFS_HDR_SIZE) |
391 | inode->i_data.a_ops->readpages = NULL; | 524 | inode->i_data.a_ops->readpages = NULL; |
392 | } else if (S_ISDIR(inode->i_mode)) { | 525 | } else if (S_ISDIR(inode->i_mode)) { |
393 | cFYI(1, (" Directory inode ")); | 526 | cFYI(1, ("Directory inode")); |
394 | inode->i_op = &cifs_dir_inode_ops; | 527 | inode->i_op = &cifs_dir_inode_ops; |
395 | inode->i_fop = &cifs_dir_ops; | 528 | inode->i_fop = &cifs_dir_ops; |
396 | } else if (S_ISLNK(inode->i_mode)) { | 529 | } else if (S_ISLNK(inode->i_mode)) { |
397 | cFYI(1, (" Symbolic Link inode ")); | 530 | cFYI(1, ("Symbolic Link inode")); |
398 | inode->i_op = &cifs_symlink_inode_ops; | 531 | inode->i_op = &cifs_symlink_inode_ops; |
399 | } else { | 532 | } else { |
400 | init_special_inode(inode, inode->i_mode, | 533 | init_special_inode(inode, inode->i_mode, |
@@ -431,7 +564,7 @@ int cifs_unlink(struct inode *inode, struct dentry *direntry) | |||
431 | struct cifsInodeInfo *cifsInode; | 564 | struct cifsInodeInfo *cifsInode; |
432 | FILE_BASIC_INFO *pinfo_buf; | 565 | FILE_BASIC_INFO *pinfo_buf; |
433 | 566 | ||
434 | cFYI(1, (" cifs_unlink, inode = 0x%p with ", inode)); | 567 | cFYI(1, ("cifs_unlink, inode = 0x%p with ", inode)); |
435 | 568 | ||
436 | xid = GetXid(); | 569 | xid = GetXid(); |
437 | 570 | ||
@@ -651,7 +784,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry) | |||
651 | char *full_path = NULL; | 784 | char *full_path = NULL; |
652 | struct cifsInodeInfo *cifsInode; | 785 | struct cifsInodeInfo *cifsInode; |
653 | 786 | ||
654 | cFYI(1, (" cifs_rmdir, inode = 0x%p with ", inode)); | 787 | cFYI(1, ("cifs_rmdir, inode = 0x%p with ", inode)); |
655 | 788 | ||
656 | xid = GetXid(); | 789 | xid = GetXid(); |
657 | 790 | ||
@@ -970,7 +1103,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
970 | 1103 | ||
971 | xid = GetXid(); | 1104 | xid = GetXid(); |
972 | 1105 | ||
973 | cFYI(1, (" In cifs_setattr, name = %s attrs->iavalid 0x%x ", | 1106 | cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ", |
974 | direntry->d_name.name, attrs->ia_valid)); | 1107 | direntry->d_name.name, attrs->ia_valid)); |
975 | cifs_sb = CIFS_SB(direntry->d_inode->i_sb); | 1108 | cifs_sb = CIFS_SB(direntry->d_inode->i_sb); |
976 | pTcon = cifs_sb->tcon; | 1109 | pTcon = cifs_sb->tcon; |
@@ -1086,6 +1219,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs) | |||
1086 | cifs_sb->mnt_cifs_flags & | 1219 | cifs_sb->mnt_cifs_flags & |
1087 | CIFS_MOUNT_MAP_SPECIAL_CHR); | 1220 | CIFS_MOUNT_MAP_SPECIAL_CHR); |
1088 | else if (attrs->ia_valid & ATTR_MODE) { | 1221 | else if (attrs->ia_valid & ATTR_MODE) { |
1222 | rc = 0; | ||
1089 | if ((mode & S_IWUGO) == 0) /* not writeable */ { | 1223 | if ((mode & S_IWUGO) == 0) /* not writeable */ { |
1090 | if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) | 1224 | if ((cifsInode->cifsAttrs & ATTR_READONLY) == 0) |
1091 | time_buf.Attributes = | 1225 | time_buf.Attributes = |
diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c index 34a06692e4fa..ca27a82c54cd 100644 --- a/fs/cifs/misc.c +++ b/fs/cifs/misc.c | |||
@@ -678,7 +678,7 @@ cifsConvertToUCS(__le16 * target, const char *source, int maxlen, | |||
678 | __u16 temp; | 678 | __u16 temp; |
679 | 679 | ||
680 | if(!mapChars) | 680 | if(!mapChars) |
681 | return cifs_strtoUCS((wchar_t *) target, source, PATH_MAX, cp); | 681 | return cifs_strtoUCS(target, source, PATH_MAX, cp); |
682 | 682 | ||
683 | for(i = 0, j = 0; i < maxlen; j++) { | 683 | for(i = 0, j = 0; i < maxlen; j++) { |
684 | src_char = source[i]; | 684 | src_char = source[i]; |
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index a86bd1c07602..9bdaaecae36f 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c | |||
@@ -142,6 +142,11 @@ static void fill_in_inode(struct inode *tmp_inode, | |||
142 | tmp_inode->i_gid = cifs_sb->mnt_gid; | 142 | tmp_inode->i_gid = cifs_sb->mnt_gid; |
143 | /* set default mode. will override for dirs below */ | 143 | /* set default mode. will override for dirs below */ |
144 | tmp_inode->i_mode = cifs_sb->mnt_file_mode; | 144 | tmp_inode->i_mode = cifs_sb->mnt_file_mode; |
145 | } else { | ||
146 | /* mask off the type bits since it gets set | ||
147 | below and we do not want to get two type | ||
148 | bits set */ | ||
149 | tmp_inode->i_mode &= ~S_IFMT; | ||
145 | } | 150 | } |
146 | 151 | ||
147 | if (attr & ATTR_DIRECTORY) { | 152 | if (attr & ATTR_DIRECTORY) { |
@@ -152,12 +157,18 @@ static void fill_in_inode(struct inode *tmp_inode, | |||
152 | } | 157 | } |
153 | tmp_inode->i_mode |= S_IFDIR; | 158 | tmp_inode->i_mode |= S_IFDIR; |
154 | } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && | 159 | } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && |
155 | (attr & ATTR_SYSTEM) && (end_of_file == 0)) { | 160 | (attr & ATTR_SYSTEM)) { |
156 | *pobject_type = DT_FIFO; | 161 | if (end_of_file == 0) { |
157 | tmp_inode->i_mode |= S_IFIFO; | 162 | *pobject_type = DT_FIFO; |
158 | /* BB Finish for SFU style symlinks and devies */ | 163 | tmp_inode->i_mode |= S_IFIFO; |
159 | /* } else if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL) && | 164 | } else { |
160 | (attr & ATTR_SYSTEM) && ) { */ | 165 | /* rather than get the type here, we mark the |
166 | inode as needing revalidate and get the real type | ||
167 | (blk vs chr vs. symlink) later ie in lookup */ | ||
168 | *pobject_type = DT_REG; | ||
169 | tmp_inode->i_mode |= S_IFREG; | ||
170 | cifsInfo->time = 0; | ||
171 | } | ||
161 | /* we no longer mark these because we could not follow them */ | 172 | /* we no longer mark these because we could not follow them */ |
162 | /* } else if (attr & ATTR_REPARSE) { | 173 | /* } else if (attr & ATTR_REPARSE) { |
163 | *pobject_type = DT_LNK; | 174 | *pobject_type = DT_LNK; |
@@ -193,8 +204,14 @@ static void fill_in_inode(struct inode *tmp_inode, | |||
193 | if (S_ISREG(tmp_inode->i_mode)) { | 204 | if (S_ISREG(tmp_inode->i_mode)) { |
194 | cFYI(1, ("File inode")); | 205 | cFYI(1, ("File inode")); |
195 | tmp_inode->i_op = &cifs_file_inode_ops; | 206 | tmp_inode->i_op = &cifs_file_inode_ops; |
196 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) | 207 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_DIRECT_IO) { |
197 | tmp_inode->i_fop = &cifs_file_direct_ops; | 208 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) |
209 | tmp_inode->i_fop = &cifs_file_direct_nobrl_ops; | ||
210 | else | ||
211 | tmp_inode->i_fop = &cifs_file_direct_ops; | ||
212 | |||
213 | } else if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | ||
214 | tmp_inode->i_fop = &cifs_file_nobrl_ops; | ||
198 | else | 215 | else |
199 | tmp_inode->i_fop = &cifs_file_ops; | 216 | tmp_inode->i_fop = &cifs_file_ops; |
200 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) | 217 | if(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NO_BRL) |
@@ -258,6 +275,9 @@ static void unix_fill_in_inode(struct inode *tmp_inode, | |||
258 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastStatusChange)); | 275 | cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastStatusChange)); |
259 | 276 | ||
260 | tmp_inode->i_mode = le64_to_cpu(pfindData->Permissions); | 277 | tmp_inode->i_mode = le64_to_cpu(pfindData->Permissions); |
278 | /* since we set the inode type below we need to mask off type | ||
279 | to avoid strange results if bits above were corrupt */ | ||
280 | tmp_inode->i_mode &= ~S_IFMT; | ||
261 | if (type == UNIX_FILE) { | 281 | if (type == UNIX_FILE) { |
262 | *pobject_type = DT_REG; | 282 | *pobject_type = DT_REG; |
263 | tmp_inode->i_mode |= S_IFREG; | 283 | tmp_inode->i_mode |= S_IFREG; |
@@ -283,6 +303,11 @@ static void unix_fill_in_inode(struct inode *tmp_inode, | |||
283 | } else if (type == UNIX_SOCKET) { | 303 | } else if (type == UNIX_SOCKET) { |
284 | *pobject_type = DT_SOCK; | 304 | *pobject_type = DT_SOCK; |
285 | tmp_inode->i_mode |= S_IFSOCK; | 305 | tmp_inode->i_mode |= S_IFSOCK; |
306 | } else { | ||
307 | /* safest to just call it a file */ | ||
308 | *pobject_type = DT_REG; | ||
309 | tmp_inode->i_mode |= S_IFREG; | ||
310 | cFYI(1,("unknown inode type %d",type)); | ||
286 | } | 311 | } |
287 | 312 | ||
288 | tmp_inode->i_uid = le64_to_cpu(pfindData->Uid); | 313 | tmp_inode->i_uid = le64_to_cpu(pfindData->Uid); |
@@ -699,7 +724,7 @@ static int cifs_get_name_from_search_buf(struct qstr *pqst, | |||
699 | (__le16 *)filename, len/2, nlt); | 724 | (__le16 *)filename, len/2, nlt); |
700 | else | 725 | else |
701 | pqst->len = cifs_strfromUCS_le((char *)pqst->name, | 726 | pqst->len = cifs_strfromUCS_le((char *)pqst->name, |
702 | (wchar_t *)filename,len/2,nlt); | 727 | (__le16 *)filename,len/2,nlt); |
703 | } else { | 728 | } else { |
704 | pqst->name = filename; | 729 | pqst->name = filename; |
705 | pqst->len = len; | 730 | pqst->len = len; |
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 981ea0d8b9cd..41a9659c16bc 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c | |||
@@ -522,7 +522,7 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses, | |||
522 | sizeof (struct smb_hdr) - | 522 | sizeof (struct smb_hdr) - |
523 | 4 /* do not count RFC1001 header */ + | 523 | 4 /* do not count RFC1001 header */ + |
524 | (2 * in_buf->WordCount) + 2 /* bcc */ ) | 524 | (2 * in_buf->WordCount) + 2 /* bcc */ ) |
525 | BCC(in_buf) = le16_to_cpu(BCC(in_buf)); | 525 | BCC(in_buf) = le16_to_cpu(BCC_LE(in_buf)); |
526 | } else { | 526 | } else { |
527 | rc = -EIO; | 527 | rc = -EIO; |
528 | cFYI(1,("Bad MID state?")); | 528 | cFYI(1,("Bad MID state?")); |
@@ -786,7 +786,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses, | |||
786 | sizeof (struct smb_hdr) - | 786 | sizeof (struct smb_hdr) - |
787 | 4 /* do not count RFC1001 header */ + | 787 | 4 /* do not count RFC1001 header */ + |
788 | (2 * out_buf->WordCount) + 2 /* bcc */ ) | 788 | (2 * out_buf->WordCount) + 2 /* bcc */ ) |
789 | BCC(out_buf) = le16_to_cpu(BCC(out_buf)); | 789 | BCC(out_buf) = le16_to_cpu(BCC_LE(out_buf)); |
790 | } else { | 790 | } else { |
791 | rc = -EIO; | 791 | rc = -EIO; |
792 | cERROR(1,("Bad MID state? ")); | 792 | cERROR(1,("Bad MID state? ")); |
diff --git a/fs/compat.c b/fs/compat.c index 8e71cdbecc7c..0f7abf246d32 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
@@ -268,7 +268,6 @@ out: | |||
268 | 268 | ||
269 | #define IOCTL_HASHSIZE 256 | 269 | #define IOCTL_HASHSIZE 256 |
270 | static struct ioctl_trans *ioctl32_hash_table[IOCTL_HASHSIZE]; | 270 | static struct ioctl_trans *ioctl32_hash_table[IOCTL_HASHSIZE]; |
271 | static DECLARE_RWSEM(ioctl32_sem); | ||
272 | 271 | ||
273 | extern struct ioctl_trans ioctl_start[]; | 272 | extern struct ioctl_trans ioctl_start[]; |
274 | extern int ioctl_table_size; | 273 | extern int ioctl_table_size; |
@@ -390,14 +389,10 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, | |||
390 | break; | 389 | break; |
391 | } | 390 | } |
392 | 391 | ||
393 | /* When register_ioctl32_conversion is finally gone remove | ||
394 | this lock! -AK */ | ||
395 | down_read(&ioctl32_sem); | ||
396 | for (t = ioctl32_hash_table[ioctl32_hash(cmd)]; t; t = t->next) { | 392 | for (t = ioctl32_hash_table[ioctl32_hash(cmd)]; t; t = t->next) { |
397 | if (t->cmd == cmd) | 393 | if (t->cmd == cmd) |
398 | goto found_handler; | 394 | goto found_handler; |
399 | } | 395 | } |
400 | up_read(&ioctl32_sem); | ||
401 | 396 | ||
402 | if (S_ISSOCK(filp->f_dentry->d_inode->i_mode) && | 397 | if (S_ISSOCK(filp->f_dentry->d_inode->i_mode) && |
403 | cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { | 398 | cmd >= SIOCDEVPRIVATE && cmd <= (SIOCDEVPRIVATE + 15)) { |
@@ -417,11 +412,9 @@ asmlinkage long compat_sys_ioctl(unsigned int fd, unsigned int cmd, | |||
417 | lock_kernel(); | 412 | lock_kernel(); |
418 | error = t->handler(fd, cmd, arg, filp); | 413 | error = t->handler(fd, cmd, arg, filp); |
419 | unlock_kernel(); | 414 | unlock_kernel(); |
420 | up_read(&ioctl32_sem); | ||
421 | goto out_fput; | 415 | goto out_fput; |
422 | } | 416 | } |
423 | 417 | ||
424 | up_read(&ioctl32_sem); | ||
425 | do_ioctl: | 418 | do_ioctl: |
426 | error = vfs_ioctl(filp, fd, cmd, arg); | 419 | error = vfs_ioctl(filp, fd, cmd, arg); |
427 | out_fput: | 420 | out_fput: |
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index 991c00de5c4e..43a2508ac696 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c | |||
@@ -137,7 +137,7 @@ | |||
137 | #define EXT2_IOC32_GETFLAGS _IOR('f', 1, int) | 137 | #define EXT2_IOC32_GETFLAGS _IOR('f', 1, int) |
138 | #define EXT2_IOC32_SETFLAGS _IOW('f', 2, int) | 138 | #define EXT2_IOC32_SETFLAGS _IOW('f', 2, int) |
139 | #define EXT3_IOC32_GETVERSION _IOR('f', 3, int) | 139 | #define EXT3_IOC32_GETVERSION _IOR('f', 3, int) |
140 | #define EXT3_IOC32_SETVERSION _IOR('f', 4, int) | 140 | #define EXT3_IOC32_SETVERSION _IOW('f', 4, int) |
141 | #define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int) | 141 | #define EXT3_IOC32_GETRSVSZ _IOR('f', 5, int) |
142 | #define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int) | 142 | #define EXT3_IOC32_SETRSVSZ _IOW('f', 6, int) |
143 | #define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) | 143 | #define EXT3_IOC32_GROUP_EXTEND _IOW('f', 7, unsigned int) |
@@ -686,7 +686,8 @@ static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
686 | 686 | ||
687 | ifr = ifc.ifc_req; | 687 | ifr = ifc.ifc_req; |
688 | ifr32 = compat_ptr(ifc32.ifcbuf); | 688 | ifr32 = compat_ptr(ifc32.ifcbuf); |
689 | for (i = 0, j = 0; i < ifc32.ifc_len && j < ifc.ifc_len; | 689 | for (i = 0, j = 0; |
690 | i + sizeof (struct ifreq32) < ifc32.ifc_len && j < ifc.ifc_len; | ||
690 | i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) { | 691 | i += sizeof (struct ifreq32), j += sizeof (struct ifreq)) { |
691 | if (copy_in_user(ifr32, ifr, sizeof (struct ifreq32))) | 692 | if (copy_in_user(ifr32, ifr, sizeof (struct ifreq32))) |
692 | return -EFAULT; | 693 | return -EFAULT; |
@@ -702,10 +703,7 @@ static int dev_ifconf(unsigned int fd, unsigned int cmd, unsigned long arg) | |||
702 | i = ((i / sizeof(struct ifreq)) * sizeof(struct ifreq32)); | 703 | i = ((i / sizeof(struct ifreq)) * sizeof(struct ifreq32)); |
703 | ifc32.ifc_len = i; | 704 | ifc32.ifc_len = i; |
704 | } else { | 705 | } else { |
705 | if (i <= ifc32.ifc_len) | 706 | ifc32.ifc_len = i; |
706 | ifc32.ifc_len = i; | ||
707 | else | ||
708 | ifc32.ifc_len = i - sizeof (struct ifreq32); | ||
709 | } | 707 | } |
710 | if (copy_to_user(compat_ptr(arg), &ifc32, sizeof(struct ifconf32))) | 708 | if (copy_to_user(compat_ptr(arg), &ifc32, sizeof(struct ifconf32))) |
711 | return -EFAULT; | 709 | return -EFAULT; |
diff --git a/include/asm-arm/arch-ebsa110/io.h b/include/asm-arm/arch-ebsa110/io.h index 68e04c0bb3f7..ae048441c9ed 100644 --- a/include/asm-arm/arch-ebsa110/io.h +++ b/include/asm-arm/arch-ebsa110/io.h | |||
@@ -64,7 +64,7 @@ void __writel(u32 val, void __iomem *addr); | |||
64 | #define writew(v,b) __writew(v,b) | 64 | #define writew(v,b) __writew(v,b) |
65 | #define writel(v,b) __writel(v,b) | 65 | #define writel(v,b) __writel(v,b) |
66 | 66 | ||
67 | #define __arch_ioremap(cookie,sz,c,a) ((void __iomem *)(cookie)) | 67 | #define __arch_ioremap(cookie,sz,c) ((void __iomem *)(cookie)) |
68 | #define __arch_iounmap(cookie) do { } while (0) | 68 | #define __arch_iounmap(cookie) do { } while (0) |
69 | 69 | ||
70 | extern void insb(unsigned int port, void *buf, int sz); | 70 | extern void insb(unsigned int port, void *buf, int sz); |
diff --git a/include/asm-arm/arch-ixp4xx/io.h b/include/asm-arm/arch-ixp4xx/io.h index 688f7f90d93e..942b622455bc 100644 --- a/include/asm-arm/arch-ixp4xx/io.h +++ b/include/asm-arm/arch-ixp4xx/io.h | |||
@@ -59,11 +59,10 @@ extern int ixp4xx_pci_write(u32 addr, u32 cmd, u32 data); | |||
59 | * fallback to the default. | 59 | * fallback to the default. |
60 | */ | 60 | */ |
61 | static inline void __iomem * | 61 | static inline void __iomem * |
62 | __ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned long align) | 62 | __ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags) |
63 | { | 63 | { |
64 | extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long); | ||
65 | if((addr < 0x48000000) || (addr > 0x4fffffff)) | 64 | if((addr < 0x48000000) || (addr > 0x4fffffff)) |
66 | return __ioremap(addr, size, flags, align); | 65 | return __ioremap(addr, size, flags); |
67 | 66 | ||
68 | return (void *)addr; | 67 | return (void *)addr; |
69 | } | 68 | } |
@@ -71,13 +70,11 @@ __ixp4xx_ioremap(unsigned long addr, size_t size, unsigned long flags, unsigned | |||
71 | static inline void | 70 | static inline void |
72 | __ixp4xx_iounmap(void __iomem *addr) | 71 | __ixp4xx_iounmap(void __iomem *addr) |
73 | { | 72 | { |
74 | extern void __iounmap(void __iomem *addr); | ||
75 | |||
76 | if ((u32)addr >= VMALLOC_START) | 73 | if ((u32)addr >= VMALLOC_START) |
77 | __iounmap(addr); | 74 | __iounmap(addr); |
78 | } | 75 | } |
79 | 76 | ||
80 | #define __arch_ioremap(a, s, f, x) __ixp4xx_ioremap(a, s, f, x) | 77 | #define __arch_ioremap(a, s, f) __ixp4xx_ioremap(a, s, f) |
81 | #define __arch_iounmap(a) __ixp4xx_iounmap(a) | 78 | #define __arch_iounmap(a) __ixp4xx_iounmap(a) |
82 | 79 | ||
83 | #define writeb(v, p) __ixp4xx_writeb(v, p) | 80 | #define writeb(v, p) __ixp4xx_writeb(v, p) |
diff --git a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h b/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h index 2b149ed59149..9444958bec1e 100644 --- a/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h +++ b/include/asm-arm/arch-ixp4xx/ixp4xx-regs.h | |||
@@ -47,6 +47,7 @@ | |||
47 | * Queue Manager | 47 | * Queue Manager |
48 | */ | 48 | */ |
49 | #define IXP4XX_QMGR_BASE_PHYS (0x60000000) | 49 | #define IXP4XX_QMGR_BASE_PHYS (0x60000000) |
50 | #define IXP4XX_QMGR_REGION_SIZE (0x00004000) | ||
50 | 51 | ||
51 | /* | 52 | /* |
52 | * Expansion BUS Configuration registers | 53 | * Expansion BUS Configuration registers |
diff --git a/include/asm-arm/hardware/amba_serial.h b/include/asm-arm/hardware/amba_serial.h index 71770aa6389f..dc726ffccebd 100644 --- a/include/asm-arm/hardware/amba_serial.h +++ b/include/asm-arm/hardware/amba_serial.h | |||
@@ -50,6 +50,11 @@ | |||
50 | #define UART011_ICR 0x44 /* Interrupt clear register. */ | 50 | #define UART011_ICR 0x44 /* Interrupt clear register. */ |
51 | #define UART011_DMACR 0x48 /* DMA control register. */ | 51 | #define UART011_DMACR 0x48 /* DMA control register. */ |
52 | 52 | ||
53 | #define UART011_DR_OE (1 << 11) | ||
54 | #define UART011_DR_BE (1 << 10) | ||
55 | #define UART011_DR_PE (1 << 9) | ||
56 | #define UART011_DR_FE (1 << 8) | ||
57 | |||
53 | #define UART01x_RSR_OE 0x08 | 58 | #define UART01x_RSR_OE 0x08 |
54 | #define UART01x_RSR_BE 0x04 | 59 | #define UART01x_RSR_BE 0x04 |
55 | #define UART01x_RSR_PE 0x02 | 60 | #define UART01x_RSR_PE 0x02 |
diff --git a/include/asm-arm/io.h b/include/asm-arm/io.h index 2e6799632f12..ae69db4a1010 100644 --- a/include/asm-arm/io.h +++ b/include/asm-arm/io.h | |||
@@ -55,6 +55,12 @@ extern void __raw_readsl(void __iomem *addr, void *data, int longlen); | |||
55 | #define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a)) | 55 | #define __raw_readl(a) (__chk_io_ptr(a), *(volatile unsigned int __force *)(a)) |
56 | 56 | ||
57 | /* | 57 | /* |
58 | * Architecture ioremap implementation. | ||
59 | */ | ||
60 | extern void __iomem * __ioremap(unsigned long, size_t, unsigned long); | ||
61 | extern void __iounmap(void __iomem *addr); | ||
62 | |||
63 | /* | ||
58 | * Bad read/write accesses... | 64 | * Bad read/write accesses... |
59 | */ | 65 | */ |
60 | extern void __readwrite_bug(const char *fn); | 66 | extern void __readwrite_bug(const char *fn); |
@@ -256,18 +262,15 @@ out: | |||
256 | * ioremap takes a PCI memory address, as specified in | 262 | * ioremap takes a PCI memory address, as specified in |
257 | * Documentation/IO-mapping.txt. | 263 | * Documentation/IO-mapping.txt. |
258 | */ | 264 | */ |
259 | extern void __iomem * __ioremap(unsigned long, size_t, unsigned long, unsigned long); | ||
260 | extern void __iounmap(void __iomem *addr); | ||
261 | |||
262 | #ifndef __arch_ioremap | 265 | #ifndef __arch_ioremap |
263 | #define ioremap(cookie,size) __ioremap(cookie,size,0,1) | 266 | #define ioremap(cookie,size) __ioremap(cookie,size,0) |
264 | #define ioremap_nocache(cookie,size) __ioremap(cookie,size,0,1) | 267 | #define ioremap_nocache(cookie,size) __ioremap(cookie,size,0) |
265 | #define ioremap_cached(cookie,size) __ioremap(cookie,size,L_PTE_CACHEABLE,1) | 268 | #define ioremap_cached(cookie,size) __ioremap(cookie,size,L_PTE_CACHEABLE) |
266 | #define iounmap(cookie) __iounmap(cookie) | 269 | #define iounmap(cookie) __iounmap(cookie) |
267 | #else | 270 | #else |
268 | #define ioremap(cookie,size) __arch_ioremap((cookie),(size),0,1) | 271 | #define ioremap(cookie,size) __arch_ioremap((cookie),(size),0) |
269 | #define ioremap_nocache(cookie,size) __arch_ioremap((cookie),(size),0,1) | 272 | #define ioremap_nocache(cookie,size) __arch_ioremap((cookie),(size),0) |
270 | #define ioremap_cached(cookie,size) __arch_ioremap((cookie),(size),L_PTE_CACHEABLE,1) | 273 | #define ioremap_cached(cookie,size) __arch_ioremap((cookie),(size),L_PTE_CACHEABLE) |
271 | #define iounmap(cookie) __arch_iounmap(cookie) | 274 | #define iounmap(cookie) __arch_iounmap(cookie) |
272 | #endif | 275 | #endif |
273 | 276 | ||
diff --git a/include/asm-arm/numnodes.h b/include/asm-arm/numnodes.h index 5d2a1034a02e..8df36818ebc9 100644 --- a/include/asm-arm/numnodes.h +++ b/include/asm-arm/numnodes.h | |||
@@ -17,6 +17,8 @@ | |||
17 | #ifndef __ASM_ARM_NUMNODES_H | 17 | #ifndef __ASM_ARM_NUMNODES_H |
18 | #define __ASM_ARM_NUMNODES_H | 18 | #define __ASM_ARM_NUMNODES_H |
19 | 19 | ||
20 | #include <asm/memory.h> | ||
21 | |||
20 | #ifndef NODES_SHIFT | 22 | #ifndef NODES_SHIFT |
21 | # define NODES_SHIFT 2 /* Normally, Max 4 Nodes */ | 23 | # define NODES_SHIFT 2 /* Normally, Max 4 Nodes */ |
22 | #endif | 24 | #endif |
diff --git a/include/asm-arm/uaccess.h b/include/asm-arm/uaccess.h index a2fdad0138b3..064f0f5e8e2b 100644 --- a/include/asm-arm/uaccess.h +++ b/include/asm-arm/uaccess.h | |||
@@ -100,7 +100,6 @@ static inline void set_fs (mm_segment_t fs) | |||
100 | extern int __get_user_1(void *); | 100 | extern int __get_user_1(void *); |
101 | extern int __get_user_2(void *); | 101 | extern int __get_user_2(void *); |
102 | extern int __get_user_4(void *); | 102 | extern int __get_user_4(void *); |
103 | extern int __get_user_8(void *); | ||
104 | extern int __get_user_bad(void); | 103 | extern int __get_user_bad(void); |
105 | 104 | ||
106 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ | 105 | #define __get_user_x(__r2,__p,__e,__s,__i...) \ |
@@ -114,7 +113,7 @@ extern int __get_user_bad(void); | |||
114 | #define get_user(x,p) \ | 113 | #define get_user(x,p) \ |
115 | ({ \ | 114 | ({ \ |
116 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ | 115 | const register typeof(*(p)) __user *__p asm("r0") = (p);\ |
117 | register typeof(*(p)) __r2 asm("r2"); \ | 116 | register unsigned int __r2 asm("r2"); \ |
118 | register int __e asm("r0"); \ | 117 | register int __e asm("r0"); \ |
119 | switch (sizeof(*(__p))) { \ | 118 | switch (sizeof(*(__p))) { \ |
120 | case 1: \ | 119 | case 1: \ |
@@ -126,12 +125,9 @@ extern int __get_user_bad(void); | |||
126 | case 4: \ | 125 | case 4: \ |
127 | __get_user_x(__r2, __p, __e, 4, "lr"); \ | 126 | __get_user_x(__r2, __p, __e, 4, "lr"); \ |
128 | break; \ | 127 | break; \ |
129 | case 8: \ | ||
130 | __get_user_x(__r2, __p, __e, 8, "lr"); \ | ||
131 | break; \ | ||
132 | default: __e = __get_user_bad(); break; \ | 128 | default: __e = __get_user_bad(); break; \ |
133 | } \ | 129 | } \ |
134 | x = __r2; \ | 130 | x = (typeof(*(p))) __r2; \ |
135 | __e; \ | 131 | __e; \ |
136 | }) | 132 | }) |
137 | 133 | ||
diff --git a/include/asm-ia64/sn/sn_sal.h b/include/asm-ia64/sn/sn_sal.h index 3f7564dc0aa9..2a8b0d92a5d6 100644 --- a/include/asm-ia64/sn/sn_sal.h +++ b/include/asm-ia64/sn/sn_sal.h | |||
@@ -56,6 +56,7 @@ | |||
56 | #define SN_SAL_BUS_CONFIG 0x02000037 | 56 | #define SN_SAL_BUS_CONFIG 0x02000037 |
57 | #define SN_SAL_SYS_SERIAL_GET 0x02000038 | 57 | #define SN_SAL_SYS_SERIAL_GET 0x02000038 |
58 | #define SN_SAL_PARTITION_SERIAL_GET 0x02000039 | 58 | #define SN_SAL_PARTITION_SERIAL_GET 0x02000039 |
59 | #define SN_SAL_SYSCTL_PARTITION_GET 0x0200003a | ||
59 | #define SN_SAL_SYSTEM_POWER_DOWN 0x0200003b | 60 | #define SN_SAL_SYSTEM_POWER_DOWN 0x0200003b |
60 | #define SN_SAL_GET_MASTER_BASEIO_NASID 0x0200003c | 61 | #define SN_SAL_GET_MASTER_BASEIO_NASID 0x0200003c |
61 | #define SN_SAL_COHERENCE 0x0200003d | 62 | #define SN_SAL_COHERENCE 0x0200003d |
@@ -581,6 +582,21 @@ sn_partition_serial_number_val(void) { | |||
581 | } | 582 | } |
582 | 583 | ||
583 | /* | 584 | /* |
585 | * Returns the partition id of the nasid passed in as an argument, | ||
586 | * or INVALID_PARTID if the partition id cannot be retrieved. | ||
587 | */ | ||
588 | static inline partid_t | ||
589 | ia64_sn_sysctl_partition_get(nasid_t nasid) | ||
590 | { | ||
591 | struct ia64_sal_retval ret_stuff; | ||
592 | SAL_CALL(ret_stuff, SN_SAL_SYSCTL_PARTITION_GET, nasid, | ||
593 | 0, 0, 0, 0, 0, 0); | ||
594 | if (ret_stuff.status != 0) | ||
595 | return -1; | ||
596 | return ((partid_t)ret_stuff.v0); | ||
597 | } | ||
598 | |||
599 | /* | ||
584 | * Returns the physical address of the partition's reserved page through | 600 | * Returns the physical address of the partition's reserved page through |
585 | * an iterative number of calls. | 601 | * an iterative number of calls. |
586 | * | 602 | * |
@@ -1018,6 +1034,24 @@ ia64_sn_get_sn_info(int fc, u8 *shubtype, u16 *nasid_bitmask, u8 *nasid_shift, | |||
1018 | ret_stuff.v2 = 0; | 1034 | ret_stuff.v2 = 0; |
1019 | SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO, fc, 0, 0, 0, 0, 0, 0); | 1035 | SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO, fc, 0, 0, 0, 0, 0, 0); |
1020 | 1036 | ||
1037 | /***** BEGIN HACK - temp til old proms no longer supported ********/ | ||
1038 | if (ret_stuff.status == SALRET_NOT_IMPLEMENTED) { | ||
1039 | int nasid = get_sapicid() & 0xfff;; | ||
1040 | #define SH_SHUB_ID_NODES_PER_BIT_MASK 0x001f000000000000UL | ||
1041 | #define SH_SHUB_ID_NODES_PER_BIT_SHFT 48 | ||
1042 | if (shubtype) *shubtype = 0; | ||
1043 | if (nasid_bitmask) *nasid_bitmask = 0x7ff; | ||
1044 | if (nasid_shift) *nasid_shift = 38; | ||
1045 | if (systemsize) *systemsize = 10; | ||
1046 | if (sharing_domain_size) *sharing_domain_size = 8; | ||
1047 | if (partid) *partid = ia64_sn_sysctl_partition_get(nasid); | ||
1048 | if (coher) *coher = nasid >> 9; | ||
1049 | if (reg) *reg = (HUB_L((u64 *) LOCAL_MMR_ADDR(SH1_SHUB_ID)) & SH_SHUB_ID_NODES_PER_BIT_MASK) >> | ||
1050 | SH_SHUB_ID_NODES_PER_BIT_SHFT; | ||
1051 | return 0; | ||
1052 | } | ||
1053 | /***** END HACK *******/ | ||
1054 | |||
1021 | if (ret_stuff.status < 0) | 1055 | if (ret_stuff.status < 0) |
1022 | return ret_stuff.status; | 1056 | return ret_stuff.status; |
1023 | 1057 | ||
diff --git a/include/asm-ia64/sn/tioce.h b/include/asm-ia64/sn/tioce.h index 22879853e46c..ecaddf960086 100644 --- a/include/asm-ia64/sn/tioce.h +++ b/include/asm-ia64/sn/tioce.h | |||
@@ -1,22 +1,10 @@ | |||
1 | /************************************************************************** | 1 | /* |
2 | * * | 2 | * This file is subject to the terms and conditions of the GNU General Public |
3 | * Unpublished copyright (c) 2005, Silicon Graphics, Inc. * | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * THIS IS UNPUBLISHED CONFIDENTIAL AND PROPRIETARY SOURCE CODE OF SGI. * | 4 | * for more details. |
5 | * * | 5 | * |
6 | * The copyright notice above does not evidence any actual or intended * | 6 | * Copyright (c) 2003-2005 Silicon Graphics, Inc. All rights reserved. |
7 | * publication or disclosure of this source code, which includes * | 7 | */ |
8 | * information that is confidential and/or proprietary, and is a trade * | ||
9 | * secret, of Silicon Graphics, Inc. ANY REPRODUCTION, MODIFICATION, * | ||
10 | * DISTRIBUTION, PUBLIC PERFORMANCE, OR PUBLIC DISPLAY OF OR THROUGH * | ||
11 | * USE OF THIS SOURCE CODE WITHOUT THE EXPRESS WRITTEN CONSENT OF * | ||
12 | * SILICON GRAPHICS, INC. IS STRICTLY PROHIBITED, AND IN VIOLATION OF * | ||
13 | * APPLICABLE LAWS AND INTERNATIONAL TREATIES. THE RECEIPT OR * | ||
14 | * POSSESSION OF THIS SOURCE CODE AND/OR RELATED INFORMATION DOES NOT * | ||
15 | * CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS * | ||
16 | * CONTENTS, OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT MAY * | ||
17 | * DESCRIBE, IN WHOLE OR IN PART. * | ||
18 | * * | ||
19 | **************************************************************************/ | ||
20 | 8 | ||
21 | #ifndef __ASM_IA64_SN_TIOCE_H__ | 9 | #ifndef __ASM_IA64_SN_TIOCE_H__ |
22 | #define __ASM_IA64_SN_TIOCE_H__ | 10 | #define __ASM_IA64_SN_TIOCE_H__ |
diff --git a/include/asm-ia64/sn/tioce_provider.h b/include/asm-ia64/sn/tioce_provider.h index 7f63dec0a79a..cb414908671d 100644 --- a/include/asm-ia64/sn/tioce_provider.h +++ b/include/asm-ia64/sn/tioce_provider.h | |||
@@ -1,13 +1,10 @@ | |||
1 | /************************************************************************** | 1 | /* |
2 | * Copyright (C) 2005, Silicon Graphics, Inc. * | 2 | * This file is subject to the terms and conditions of the GNU General Public |
3 | * * | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * These coded instructions, statements, and computer programs contain * | 4 | * for more details. |
5 | * unpublished proprietary information of Silicon Graphics, Inc., and * | 5 | * |
6 | * are protected by Federal copyright law. They may not be disclosed * | 6 | * Copyright (c) 2003-2005 Silicon Graphics, Inc. All rights reserved. |
7 | * to third parties or copied or duplicated in any form, in whole or * | 7 | */ |
8 | * in part, without the prior written consent of Silicon Graphics, Inc. * | ||
9 | * * | ||
10 | **************************************************************************/ | ||
11 | 8 | ||
12 | #ifndef _ASM_IA64_SN_CE_PROVIDER_H | 9 | #ifndef _ASM_IA64_SN_CE_PROVIDER_H |
13 | #define _ASM_IA64_SN_CE_PROVIDER_H | 10 | #define _ASM_IA64_SN_CE_PROVIDER_H |
diff --git a/include/asm-parisc/irq.h b/include/asm-parisc/irq.h index f876bdf22056..b0a30e2c9813 100644 --- a/include/asm-parisc/irq.h +++ b/include/asm-parisc/irq.h | |||
@@ -8,6 +8,7 @@ | |||
8 | #define _ASM_PARISC_IRQ_H | 8 | #define _ASM_PARISC_IRQ_H |
9 | 9 | ||
10 | #include <linux/config.h> | 10 | #include <linux/config.h> |
11 | #include <linux/cpumask.h> | ||
11 | #include <asm/types.h> | 12 | #include <asm/types.h> |
12 | 13 | ||
13 | #define NO_IRQ (-1) | 14 | #define NO_IRQ (-1) |
@@ -49,10 +50,10 @@ extern int txn_alloc_irq(unsigned int nbits); | |||
49 | extern int txn_claim_irq(int); | 50 | extern int txn_claim_irq(int); |
50 | extern unsigned int txn_alloc_data(unsigned int); | 51 | extern unsigned int txn_alloc_data(unsigned int); |
51 | extern unsigned long txn_alloc_addr(unsigned int); | 52 | extern unsigned long txn_alloc_addr(unsigned int); |
53 | extern unsigned long txn_affinity_addr(unsigned int irq, int cpu); | ||
52 | 54 | ||
53 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); | 55 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); |
54 | 56 | extern int cpu_check_affinity(unsigned int irq, cpumask_t *dest); | |
55 | extern int cpu_claim_irq(unsigned int irq, struct hw_interrupt_type *, void *); | ||
56 | 57 | ||
57 | /* soft power switch support (power.c) */ | 58 | /* soft power switch support (power.c) */ |
58 | extern struct tasklet_struct power_tasklet; | 59 | extern struct tasklet_struct power_tasklet; |
diff --git a/include/asm-parisc/smp.h b/include/asm-parisc/smp.h index 9413f67a540b..dbdbd2e9fdf9 100644 --- a/include/asm-parisc/smp.h +++ b/include/asm-parisc/smp.h | |||
@@ -29,6 +29,7 @@ extern cpumask_t cpu_online_map; | |||
29 | #define cpu_logical_map(cpu) (cpu) | 29 | #define cpu_logical_map(cpu) (cpu) |
30 | 30 | ||
31 | extern void smp_send_reschedule(int cpu); | 31 | extern void smp_send_reschedule(int cpu); |
32 | extern void smp_send_all_nop(void); | ||
32 | 33 | ||
33 | #endif /* !ASSEMBLY */ | 34 | #endif /* !ASSEMBLY */ |
34 | 35 | ||
@@ -53,7 +54,11 @@ extern unsigned long cpu_present_mask; | |||
53 | 54 | ||
54 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 55 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
55 | 56 | ||
56 | #endif /* CONFIG_SMP */ | 57 | #else /* CONFIG_SMP */ |
58 | |||
59 | static inline void smp_send_all_nop(void) { return; } | ||
60 | |||
61 | #endif | ||
57 | 62 | ||
58 | #define NO_PROC_ID 0xFF /* No processor magic marker */ | 63 | #define NO_PROC_ID 0xFF /* No processor magic marker */ |
59 | #define ANY_PROC_ID 0xFF /* Any processor magic marker */ | 64 | #define ANY_PROC_ID 0xFF /* Any processor magic marker */ |
diff --git a/include/asm-parisc/spinlock.h b/include/asm-parisc/spinlock.h index 7c3f406a746a..16c2ac075fc5 100644 --- a/include/asm-parisc/spinlock.h +++ b/include/asm-parisc/spinlock.h | |||
@@ -11,18 +11,25 @@ static inline int __raw_spin_is_locked(raw_spinlock_t *x) | |||
11 | return *a == 0; | 11 | return *a == 0; |
12 | } | 12 | } |
13 | 13 | ||
14 | #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock) | 14 | #define __raw_spin_lock(lock) __raw_spin_lock_flags(lock, 0) |
15 | #define __raw_spin_unlock_wait(x) \ | 15 | #define __raw_spin_unlock_wait(x) \ |
16 | do { cpu_relax(); } while (__raw_spin_is_locked(x)) | 16 | do { cpu_relax(); } while (__raw_spin_is_locked(x)) |
17 | 17 | ||
18 | static inline void __raw_spin_lock(raw_spinlock_t *x) | 18 | static inline void __raw_spin_lock_flags(raw_spinlock_t *x, |
19 | unsigned long flags) | ||
19 | { | 20 | { |
20 | volatile unsigned int *a; | 21 | volatile unsigned int *a; |
21 | 22 | ||
22 | mb(); | 23 | mb(); |
23 | a = __ldcw_align(x); | 24 | a = __ldcw_align(x); |
24 | while (__ldcw(a) == 0) | 25 | while (__ldcw(a) == 0) |
25 | while (*a == 0); | 26 | while (*a == 0) |
27 | if (flags & PSW_SM_I) { | ||
28 | local_irq_enable(); | ||
29 | cpu_relax(); | ||
30 | local_irq_disable(); | ||
31 | } else | ||
32 | cpu_relax(); | ||
26 | mb(); | 33 | mb(); |
27 | } | 34 | } |
28 | 35 | ||
@@ -60,26 +67,20 @@ static inline int __raw_spin_trylock(raw_spinlock_t *x) | |||
60 | 67 | ||
61 | static __inline__ void __raw_read_lock(raw_rwlock_t *rw) | 68 | static __inline__ void __raw_read_lock(raw_rwlock_t *rw) |
62 | { | 69 | { |
63 | unsigned long flags; | ||
64 | local_irq_save(flags); | ||
65 | __raw_spin_lock(&rw->lock); | 70 | __raw_spin_lock(&rw->lock); |
66 | 71 | ||
67 | rw->counter++; | 72 | rw->counter++; |
68 | 73 | ||
69 | __raw_spin_unlock(&rw->lock); | 74 | __raw_spin_unlock(&rw->lock); |
70 | local_irq_restore(flags); | ||
71 | } | 75 | } |
72 | 76 | ||
73 | static __inline__ void __raw_read_unlock(raw_rwlock_t *rw) | 77 | static __inline__ void __raw_read_unlock(raw_rwlock_t *rw) |
74 | { | 78 | { |
75 | unsigned long flags; | ||
76 | local_irq_save(flags); | ||
77 | __raw_spin_lock(&rw->lock); | 79 | __raw_spin_lock(&rw->lock); |
78 | 80 | ||
79 | rw->counter--; | 81 | rw->counter--; |
80 | 82 | ||
81 | __raw_spin_unlock(&rw->lock); | 83 | __raw_spin_unlock(&rw->lock); |
82 | local_irq_restore(flags); | ||
83 | } | 84 | } |
84 | 85 | ||
85 | /* write_lock is less trivial. We optimistically grab the lock and check | 86 | /* write_lock is less trivial. We optimistically grab the lock and check |
diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h index e97aa8d1eff5..c9ec39c6fc6c 100644 --- a/include/asm-parisc/tlbflush.h +++ b/include/asm-parisc/tlbflush.h | |||
@@ -12,21 +12,15 @@ | |||
12 | * N class systems, only one PxTLB inter processor broadcast can be | 12 | * N class systems, only one PxTLB inter processor broadcast can be |
13 | * active at any one time on the Merced bus. This tlb purge | 13 | * active at any one time on the Merced bus. This tlb purge |
14 | * synchronisation is fairly lightweight and harmless so we activate | 14 | * synchronisation is fairly lightweight and harmless so we activate |
15 | * it on all SMP systems not just the N class. */ | 15 | * it on all SMP systems not just the N class. We also need to have |
16 | #ifdef CONFIG_SMP | 16 | * preemption disabled on uniprocessor machines, and spin_lock does that |
17 | * nicely. | ||
18 | */ | ||
17 | extern spinlock_t pa_tlb_lock; | 19 | extern spinlock_t pa_tlb_lock; |
18 | 20 | ||
19 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) | 21 | #define purge_tlb_start(x) spin_lock(&pa_tlb_lock) |
20 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) | 22 | #define purge_tlb_end(x) spin_unlock(&pa_tlb_lock) |
21 | 23 | ||
22 | #else | ||
23 | |||
24 | #define purge_tlb_start(x) do { } while(0) | ||
25 | #define purge_tlb_end(x) do { } while (0) | ||
26 | |||
27 | #endif | ||
28 | |||
29 | |||
30 | extern void flush_tlb_all(void); | 24 | extern void flush_tlb_all(void); |
31 | 25 | ||
32 | /* | 26 | /* |
@@ -88,7 +82,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
88 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ | 82 | if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */ |
89 | flush_tlb_all(); | 83 | flush_tlb_all(); |
90 | else { | 84 | else { |
91 | preempt_disable(); | ||
92 | mtsp(vma->vm_mm->context,1); | 85 | mtsp(vma->vm_mm->context,1); |
93 | purge_tlb_start(); | 86 | purge_tlb_start(); |
94 | if (split_tlb) { | 87 | if (split_tlb) { |
@@ -102,7 +95,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, | |||
102 | pdtlb(start); | 95 | pdtlb(start); |
103 | start += PAGE_SIZE; | 96 | start += PAGE_SIZE; |
104 | } | 97 | } |
105 | preempt_enable(); | ||
106 | } | 98 | } |
107 | purge_tlb_end(); | 99 | purge_tlb_end(); |
108 | } | 100 | } |
diff --git a/include/asm-ppc/dma-mapping.h b/include/asm-powerpc/dma-mapping.h index 6e9635114433..59a80163f75f 100644 --- a/include/asm-ppc/dma-mapping.h +++ b/include/asm-powerpc/dma-mapping.h | |||
@@ -1,15 +1,22 @@ | |||
1 | /* | 1 | /* |
2 | * This is based on both include/asm-sh/dma-mapping.h and | 2 | * Copyright (C) 2004 IBM |
3 | * include/asm-ppc/pci.h | 3 | * |
4 | * Implements the generic device dma API for powerpc. | ||
5 | * the pci and vio busses | ||
4 | */ | 6 | */ |
5 | #ifndef __ASM_PPC_DMA_MAPPING_H | 7 | #ifndef _ASM_DMA_MAPPING_H |
6 | #define __ASM_PPC_DMA_MAPPING_H | 8 | #define _ASM_DMA_MAPPING_H |
7 | 9 | ||
8 | #include <linux/config.h> | 10 | #include <linux/config.h> |
11 | #include <linux/types.h> | ||
12 | #include <linux/cache.h> | ||
9 | /* need struct page definitions */ | 13 | /* need struct page definitions */ |
10 | #include <linux/mm.h> | 14 | #include <linux/mm.h> |
11 | #include <asm/scatterlist.h> | 15 | #include <asm/scatterlist.h> |
12 | #include <asm/io.h> | 16 | #include <asm/io.h> |
17 | #include <asm/bug.h> | ||
18 | |||
19 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
13 | 20 | ||
14 | #ifdef CONFIG_NOT_COHERENT_CACHE | 21 | #ifdef CONFIG_NOT_COHERENT_CACHE |
15 | /* | 22 | /* |
@@ -24,22 +31,12 @@ extern void __dma_free_coherent(size_t size, void *vaddr); | |||
24 | extern void __dma_sync(void *vaddr, size_t size, int direction); | 31 | extern void __dma_sync(void *vaddr, size_t size, int direction); |
25 | extern void __dma_sync_page(struct page *page, unsigned long offset, | 32 | extern void __dma_sync_page(struct page *page, unsigned long offset, |
26 | size_t size, int direction); | 33 | size_t size, int direction); |
27 | #define dma_cache_inv(_start,_size) \ | ||
28 | invalidate_dcache_range(_start, (_start + _size)) | ||
29 | #define dma_cache_wback(_start,_size) \ | ||
30 | clean_dcache_range(_start, (_start + _size)) | ||
31 | #define dma_cache_wback_inv(_start,_size) \ | ||
32 | flush_dcache_range(_start, (_start + _size)) | ||
33 | 34 | ||
34 | #else /* ! CONFIG_NOT_COHERENT_CACHE */ | 35 | #else /* ! CONFIG_NOT_COHERENT_CACHE */ |
35 | /* | 36 | /* |
36 | * Cache coherent cores. | 37 | * Cache coherent cores. |
37 | */ | 38 | */ |
38 | 39 | ||
39 | #define dma_cache_inv(_start,_size) do { } while (0) | ||
40 | #define dma_cache_wback(_start,_size) do { } while (0) | ||
41 | #define dma_cache_wback_inv(_start,_size) do { } while (0) | ||
42 | |||
43 | #define __dma_alloc_coherent(gfp, size, handle) NULL | 40 | #define __dma_alloc_coherent(gfp, size, handle) NULL |
44 | #define __dma_free_coherent(size, addr) do { } while (0) | 41 | #define __dma_free_coherent(size, addr) do { } while (0) |
45 | #define __dma_sync(addr, size, rw) do { } while (0) | 42 | #define __dma_sync(addr, size, rw) do { } while (0) |
@@ -47,6 +44,30 @@ extern void __dma_sync_page(struct page *page, unsigned long offset, | |||
47 | 44 | ||
48 | #endif /* ! CONFIG_NOT_COHERENT_CACHE */ | 45 | #endif /* ! CONFIG_NOT_COHERENT_CACHE */ |
49 | 46 | ||
47 | #ifdef CONFIG_PPC64 | ||
48 | |||
49 | extern int dma_supported(struct device *dev, u64 mask); | ||
50 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | ||
51 | extern void *dma_alloc_coherent(struct device *dev, size_t size, | ||
52 | dma_addr_t *dma_handle, gfp_t flag); | ||
53 | extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | ||
54 | dma_addr_t dma_handle); | ||
55 | extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
56 | size_t size, enum dma_data_direction direction); | ||
57 | extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
58 | size_t size, enum dma_data_direction direction); | ||
59 | extern dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
60 | unsigned long offset, size_t size, | ||
61 | enum dma_data_direction direction); | ||
62 | extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | ||
63 | size_t size, enum dma_data_direction direction); | ||
64 | extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
65 | enum dma_data_direction direction); | ||
66 | extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
67 | int nhwentries, enum dma_data_direction direction); | ||
68 | |||
69 | #else /* CONFIG_PPC64 */ | ||
70 | |||
50 | #define dma_supported(dev, mask) (1) | 71 | #define dma_supported(dev, mask) (1) |
51 | 72 | ||
52 | static inline int dma_set_mask(struct device *dev, u64 dma_mask) | 73 | static inline int dma_set_mask(struct device *dev, u64 dma_mask) |
@@ -144,29 +165,27 @@ dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | |||
144 | /* We don't do anything here. */ | 165 | /* We don't do anything here. */ |
145 | #define dma_unmap_sg(dev, sg, nents, dir) do { } while (0) | 166 | #define dma_unmap_sg(dev, sg, nents, dir) do { } while (0) |
146 | 167 | ||
147 | static inline void | 168 | #endif /* CONFIG_PPC64 */ |
148 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | 169 | |
149 | size_t size, | 170 | static inline void dma_sync_single_for_cpu(struct device *dev, |
150 | enum dma_data_direction direction) | 171 | dma_addr_t dma_handle, size_t size, |
172 | enum dma_data_direction direction) | ||
151 | { | 173 | { |
152 | BUG_ON(direction == DMA_NONE); | 174 | BUG_ON(direction == DMA_NONE); |
153 | |||
154 | __dma_sync(bus_to_virt(dma_handle), size, direction); | 175 | __dma_sync(bus_to_virt(dma_handle), size, direction); |
155 | } | 176 | } |
156 | 177 | ||
157 | static inline void | 178 | static inline void dma_sync_single_for_device(struct device *dev, |
158 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, | 179 | dma_addr_t dma_handle, size_t size, |
159 | size_t size, | 180 | enum dma_data_direction direction) |
160 | enum dma_data_direction direction) | ||
161 | { | 181 | { |
162 | BUG_ON(direction == DMA_NONE); | 182 | BUG_ON(direction == DMA_NONE); |
163 | |||
164 | __dma_sync(bus_to_virt(dma_handle), size, direction); | 183 | __dma_sync(bus_to_virt(dma_handle), size, direction); |
165 | } | 184 | } |
166 | 185 | ||
167 | static inline void | 186 | static inline void dma_sync_sg_for_cpu(struct device *dev, |
168 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, | 187 | struct scatterlist *sg, int nents, |
169 | enum dma_data_direction direction) | 188 | enum dma_data_direction direction) |
170 | { | 189 | { |
171 | int i; | 190 | int i; |
172 | 191 | ||
@@ -176,9 +195,9 @@ dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nents, | |||
176 | __dma_sync_page(sg->page, sg->offset, sg->length, direction); | 195 | __dma_sync_page(sg->page, sg->offset, sg->length, direction); |
177 | } | 196 | } |
178 | 197 | ||
179 | static inline void | 198 | static inline void dma_sync_sg_for_device(struct device *dev, |
180 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, | 199 | struct scatterlist *sg, int nents, |
181 | enum dma_data_direction direction) | 200 | enum dma_data_direction direction) |
182 | { | 201 | { |
183 | int i; | 202 | int i; |
184 | 203 | ||
@@ -188,6 +207,15 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, | |||
188 | __dma_sync_page(sg->page, sg->offset, sg->length, direction); | 207 | __dma_sync_page(sg->page, sg->offset, sg->length, direction); |
189 | } | 208 | } |
190 | 209 | ||
210 | static inline int dma_mapping_error(dma_addr_t dma_addr) | ||
211 | { | ||
212 | #ifdef CONFIG_PPC64 | ||
213 | return (dma_addr == DMA_ERROR_CODE); | ||
214 | #else | ||
215 | return 0; | ||
216 | #endif | ||
217 | } | ||
218 | |||
191 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | 219 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) |
192 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | 220 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) |
193 | #ifdef CONFIG_NOT_COHERENT_CACHE | 221 | #ifdef CONFIG_NOT_COHERENT_CACHE |
@@ -198,40 +226,60 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents, | |||
198 | 226 | ||
199 | static inline int dma_get_cache_alignment(void) | 227 | static inline int dma_get_cache_alignment(void) |
200 | { | 228 | { |
229 | #ifdef CONFIG_PPC64 | ||
230 | /* no easy way to get cache size on all processors, so return | ||
231 | * the maximum possible, to be safe */ | ||
232 | return (1 << L1_CACHE_SHIFT_MAX); | ||
233 | #else | ||
201 | /* | 234 | /* |
202 | * Each processor family will define its own L1_CACHE_SHIFT, | 235 | * Each processor family will define its own L1_CACHE_SHIFT, |
203 | * L1_CACHE_BYTES wraps to this, so this is always safe. | 236 | * L1_CACHE_BYTES wraps to this, so this is always safe. |
204 | */ | 237 | */ |
205 | return L1_CACHE_BYTES; | 238 | return L1_CACHE_BYTES; |
239 | #endif | ||
206 | } | 240 | } |
207 | 241 | ||
208 | static inline void | 242 | static inline void dma_sync_single_range_for_cpu(struct device *dev, |
209 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, | 243 | dma_addr_t dma_handle, unsigned long offset, size_t size, |
210 | unsigned long offset, size_t size, | 244 | enum dma_data_direction direction) |
211 | enum dma_data_direction direction) | ||
212 | { | 245 | { |
213 | /* just sync everything for now */ | 246 | /* just sync everything for now */ |
214 | dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction); | 247 | dma_sync_single_for_cpu(dev, dma_handle, offset + size, direction); |
215 | } | 248 | } |
216 | 249 | ||
217 | static inline void | 250 | static inline void dma_sync_single_range_for_device(struct device *dev, |
218 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, | 251 | dma_addr_t dma_handle, unsigned long offset, size_t size, |
219 | unsigned long offset, size_t size, | 252 | enum dma_data_direction direction) |
220 | enum dma_data_direction direction) | ||
221 | { | 253 | { |
222 | /* just sync everything for now */ | 254 | /* just sync everything for now */ |
223 | dma_sync_single_for_device(dev, dma_handle, offset + size, direction); | 255 | dma_sync_single_for_device(dev, dma_handle, offset + size, direction); |
224 | } | 256 | } |
225 | 257 | ||
226 | static inline void dma_cache_sync(void *vaddr, size_t size, | 258 | static inline void dma_cache_sync(void *vaddr, size_t size, |
227 | enum dma_data_direction direction) | 259 | enum dma_data_direction direction) |
228 | { | 260 | { |
261 | BUG_ON(direction == DMA_NONE); | ||
229 | __dma_sync(vaddr, size, (int)direction); | 262 | __dma_sync(vaddr, size, (int)direction); |
230 | } | 263 | } |
231 | 264 | ||
232 | static inline int dma_mapping_error(dma_addr_t dma_addr) | 265 | /* |
233 | { | 266 | * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO |
234 | return 0; | 267 | */ |
235 | } | 268 | struct dma_mapping_ops { |
236 | 269 | void * (*alloc_coherent)(struct device *dev, size_t size, | |
237 | #endif /* __ASM_PPC_DMA_MAPPING_H */ | 270 | dma_addr_t *dma_handle, gfp_t flag); |
271 | void (*free_coherent)(struct device *dev, size_t size, | ||
272 | void *vaddr, dma_addr_t dma_handle); | ||
273 | dma_addr_t (*map_single)(struct device *dev, void *ptr, | ||
274 | size_t size, enum dma_data_direction direction); | ||
275 | void (*unmap_single)(struct device *dev, dma_addr_t dma_addr, | ||
276 | size_t size, enum dma_data_direction direction); | ||
277 | int (*map_sg)(struct device *dev, struct scatterlist *sg, | ||
278 | int nents, enum dma_data_direction direction); | ||
279 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, | ||
280 | int nents, enum dma_data_direction direction); | ||
281 | int (*dma_supported)(struct device *dev, u64 mask); | ||
282 | int (*dac_dma_supported)(struct device *dev, u64 mask); | ||
283 | }; | ||
284 | |||
285 | #endif /* _ASM_DMA_MAPPING_H */ | ||
diff --git a/include/asm-ppc64/io.h b/include/asm-powerpc/io.h index 77fc07c3c6bd..48938d84d055 100644 --- a/include/asm-ppc64/io.h +++ b/include/asm-powerpc/io.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef _PPC64_IO_H | 1 | #ifndef _ASM_POWERPC_IO_H |
2 | #define _PPC64_IO_H | 2 | #define _ASM_POWERPC_IO_H |
3 | 3 | ||
4 | /* | 4 | /* |
5 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
@@ -8,7 +8,10 @@ | |||
8 | * 2 of the License, or (at your option) any later version. | 8 | * 2 of the License, or (at your option) any later version. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/config.h> | 11 | #ifndef CONFIG_PPC64 |
12 | #include <asm-ppc/io.h> | ||
13 | #else | ||
14 | |||
12 | #include <linux/compiler.h> | 15 | #include <linux/compiler.h> |
13 | #include <asm/page.h> | 16 | #include <asm/page.h> |
14 | #include <asm/byteorder.h> | 17 | #include <asm/byteorder.h> |
@@ -455,4 +458,5 @@ extern int check_legacy_ioport(unsigned long base_port); | |||
455 | 458 | ||
456 | #endif /* __KERNEL__ */ | 459 | #endif /* __KERNEL__ */ |
457 | 460 | ||
458 | #endif /* _PPC64_IO_H */ | 461 | #endif /* CONFIG_PPC64 */ |
462 | #endif /* _ASM_POWERPC_IO_H */ | ||
diff --git a/include/asm-ppc64/mmu.h b/include/asm-powerpc/mmu.h index 1a7e0afa2dc6..c1b4bbabbe97 100644 --- a/include/asm-ppc64/mmu.h +++ b/include/asm-powerpc/mmu.h | |||
@@ -1,3 +1,10 @@ | |||
1 | #ifndef _ASM_POWERPC_MMU_H_ | ||
2 | #define _ASM_POWERPC_MMU_H_ | ||
3 | |||
4 | #ifndef CONFIG_PPC64 | ||
5 | #include <asm-ppc/mmu.h> | ||
6 | #else | ||
7 | |||
1 | /* | 8 | /* |
2 | * PowerPC memory management structures | 9 | * PowerPC memory management structures |
3 | * | 10 | * |
@@ -10,10 +17,6 @@ | |||
10 | * 2 of the License, or (at your option) any later version. | 17 | * 2 of the License, or (at your option) any later version. |
11 | */ | 18 | */ |
12 | 19 | ||
13 | #ifndef _PPC64_MMU_H_ | ||
14 | #define _PPC64_MMU_H_ | ||
15 | |||
16 | #include <linux/config.h> | ||
17 | #include <asm/asm-compat.h> | 20 | #include <asm/asm-compat.h> |
18 | #include <asm/page.h> | 21 | #include <asm/page.h> |
19 | 22 | ||
@@ -392,4 +395,5 @@ static inline unsigned long get_vsid(unsigned long context, unsigned long ea) | |||
392 | 395 | ||
393 | #endif /* __ASSEMBLY */ | 396 | #endif /* __ASSEMBLY */ |
394 | 397 | ||
395 | #endif /* _PPC64_MMU_H_ */ | 398 | #endif /* CONFIG_PPC64 */ |
399 | #endif /* _ASM_POWERPC_MMU_H_ */ | ||
diff --git a/include/asm-ppc64/mmu_context.h b/include/asm-powerpc/mmu_context.h index 4f512e9fa6b8..ea6798c7d5fc 100644 --- a/include/asm-ppc64/mmu_context.h +++ b/include/asm-powerpc/mmu_context.h | |||
@@ -1,7 +1,10 @@ | |||
1 | #ifndef __PPC64_MMU_CONTEXT_H | 1 | #ifndef __ASM_POWERPC_MMU_CONTEXT_H |
2 | #define __PPC64_MMU_CONTEXT_H | 2 | #define __ASM_POWERPC_MMU_CONTEXT_H |
3 | |||
4 | #ifndef CONFIG_PPC64 | ||
5 | #include <asm-ppc/mmu_context.h> | ||
6 | #else | ||
3 | 7 | ||
4 | #include <linux/config.h> | ||
5 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
6 | #include <linux/mm.h> | 9 | #include <linux/mm.h> |
7 | #include <asm/mmu.h> | 10 | #include <asm/mmu.h> |
@@ -82,4 +85,5 @@ static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next) | |||
82 | local_irq_restore(flags); | 85 | local_irq_restore(flags); |
83 | } | 86 | } |
84 | 87 | ||
85 | #endif /* __PPC64_MMU_CONTEXT_H */ | 88 | #endif /* CONFIG_PPC64 */ |
89 | #endif /* __ASM_POWERPC_MMU_CONTEXT_H */ | ||
diff --git a/include/asm-ppc64/mmzone.h b/include/asm-powerpc/mmzone.h index 54958d6cae04..54958d6cae04 100644 --- a/include/asm-ppc64/mmzone.h +++ b/include/asm-powerpc/mmzone.h | |||
diff --git a/include/asm-ppc64/pci-bridge.h b/include/asm-powerpc/pci-bridge.h index cf04327a597a..223ec7bd81da 100644 --- a/include/asm-ppc64/pci-bridge.h +++ b/include/asm-powerpc/pci-bridge.h | |||
@@ -1,8 +1,10 @@ | |||
1 | #ifdef __KERNEL__ | 1 | #ifndef _ASM_POWERPC_PCI_BRIDGE_H |
2 | #ifndef _ASM_PCI_BRIDGE_H | 2 | #define _ASM_POWERPC_PCI_BRIDGE_H |
3 | #define _ASM_PCI_BRIDGE_H | 3 | |
4 | #ifndef CONFIG_PPC64 | ||
5 | #include <asm-ppc/pci-bridge.h> | ||
6 | #else | ||
4 | 7 | ||
5 | #include <linux/config.h> | ||
6 | #include <linux/pci.h> | 8 | #include <linux/pci.h> |
7 | #include <linux/list.h> | 9 | #include <linux/list.h> |
8 | 10 | ||
@@ -147,5 +149,5 @@ extern void pcibios_free_controller(struct pci_controller *phb); | |||
147 | #define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ | 149 | #define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ |
148 | #define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ | 150 | #define PCI_PROBE_DEVTREE 1 /* Instantiate from device tree */ |
149 | 151 | ||
152 | #endif /* CONFIG_PPC64 */ | ||
150 | #endif | 153 | #endif |
151 | #endif /* __KERNEL__ */ | ||
diff --git a/include/asm-ppc64/pci.h b/include/asm-powerpc/pci.h index fafdf885a3cc..d5934a076bd0 100644 --- a/include/asm-ppc64/pci.h +++ b/include/asm-powerpc/pci.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifndef __PPC64_PCI_H | 1 | #ifndef __ASM_POWERPC_PCI_H |
2 | #define __PPC64_PCI_H | 2 | #define __ASM_POWERPC_PCI_H |
3 | #ifdef __KERNEL__ | 3 | #ifdef __KERNEL__ |
4 | 4 | ||
5 | /* | 5 | /* |
@@ -18,6 +18,7 @@ | |||
18 | #include <asm/scatterlist.h> | 18 | #include <asm/scatterlist.h> |
19 | #include <asm/io.h> | 19 | #include <asm/io.h> |
20 | #include <asm/prom.h> | 20 | #include <asm/prom.h> |
21 | #include <asm/pci-bridge.h> | ||
21 | 22 | ||
22 | #include <asm-generic/pci-dma-compat.h> | 23 | #include <asm-generic/pci-dma-compat.h> |
23 | 24 | ||
@@ -26,11 +27,21 @@ | |||
26 | 27 | ||
27 | struct pci_dev; | 28 | struct pci_dev; |
28 | 29 | ||
29 | #ifdef CONFIG_PPC_ISERIES | 30 | /* Values for the `which' argument to sys_pciconfig_iobase syscall. */ |
31 | #define IOBASE_BRIDGE_NUMBER 0 | ||
32 | #define IOBASE_MEMORY 1 | ||
33 | #define IOBASE_IO 2 | ||
34 | #define IOBASE_ISA_IO 3 | ||
35 | #define IOBASE_ISA_MEM 4 | ||
36 | |||
37 | /* | ||
38 | * Set this to 1 if you want the kernel to re-assign all PCI | ||
39 | * bus numbers | ||
40 | */ | ||
41 | extern int pci_assign_all_buses; | ||
42 | #define pcibios_assign_all_busses() (pci_assign_all_buses) | ||
43 | |||
30 | #define pcibios_scan_all_fns(a, b) 0 | 44 | #define pcibios_scan_all_fns(a, b) 0 |
31 | #else | ||
32 | extern int pcibios_scan_all_fns(struct pci_bus *bus, int devfn); | ||
33 | #endif | ||
34 | 45 | ||
35 | static inline void pcibios_set_master(struct pci_dev *dev) | 46 | static inline void pcibios_set_master(struct pci_dev *dev) |
36 | { | 47 | { |
@@ -50,6 +61,7 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | |||
50 | return channel ? 15 : 14; | 61 | return channel ? 15 : 14; |
51 | } | 62 | } |
52 | 63 | ||
64 | #ifdef CONFIG_PPC64 | ||
53 | #define HAVE_ARCH_PCI_MWI 1 | 65 | #define HAVE_ARCH_PCI_MWI 1 |
54 | static inline int pcibios_prep_mwi(struct pci_dev *dev) | 66 | static inline int pcibios_prep_mwi(struct pci_dev *dev) |
55 | { | 67 | { |
@@ -64,12 +76,10 @@ static inline int pcibios_prep_mwi(struct pci_dev *dev) | |||
64 | return 0; | 76 | return 0; |
65 | } | 77 | } |
66 | 78 | ||
67 | extern unsigned int pcibios_assign_all_busses(void); | ||
68 | |||
69 | extern struct dma_mapping_ops pci_dma_ops; | 79 | extern struct dma_mapping_ops pci_dma_ops; |
70 | 80 | ||
71 | /* For DAC DMA, we currently don't support it by default, but | 81 | /* For DAC DMA, we currently don't support it by default, but |
72 | * we let the platform override this | 82 | * we let 64-bit platforms override this. |
73 | */ | 83 | */ |
74 | static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask) | 84 | static inline int pci_dac_dma_supported(struct pci_dev *hwdev,u64 mask) |
75 | { | 85 | { |
@@ -102,6 +112,35 @@ extern int pci_domain_nr(struct pci_bus *bus); | |||
102 | /* Decide whether to display the domain number in /proc */ | 112 | /* Decide whether to display the domain number in /proc */ |
103 | extern int pci_proc_domain(struct pci_bus *bus); | 113 | extern int pci_proc_domain(struct pci_bus *bus); |
104 | 114 | ||
115 | #else /* 32-bit */ | ||
116 | |||
117 | #ifdef CONFIG_PCI | ||
118 | static inline void pci_dma_burst_advice(struct pci_dev *pdev, | ||
119 | enum pci_dma_burst_strategy *strat, | ||
120 | unsigned long *strategy_parameter) | ||
121 | { | ||
122 | *strat = PCI_DMA_BURST_INFINITY; | ||
123 | *strategy_parameter = ~0UL; | ||
124 | } | ||
125 | #endif | ||
126 | |||
127 | /* | ||
128 | * At present there are very few 32-bit PPC machines that can have | ||
129 | * memory above the 4GB point, and we don't support that. | ||
130 | */ | ||
131 | #define pci_dac_dma_supported(pci_dev, mask) (0) | ||
132 | |||
133 | /* Return the index of the PCI controller for device PDEV. */ | ||
134 | #define pci_domain_nr(bus) ((struct pci_controller *)(bus)->sysdata)->index | ||
135 | |||
136 | /* Set the name of the bus as it appears in /proc/bus/pci */ | ||
137 | static inline int pci_proc_domain(struct pci_bus *bus) | ||
138 | { | ||
139 | return 0; | ||
140 | } | ||
141 | |||
142 | #endif /* CONFIG_PPC64 */ | ||
143 | |||
105 | struct vm_area_struct; | 144 | struct vm_area_struct; |
106 | /* Map a range of PCI memory or I/O space for a device into user space */ | 145 | /* Map a range of PCI memory or I/O space for a device into user space */ |
107 | int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, | 146 | int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, |
@@ -110,6 +149,7 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, | |||
110 | /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ | 149 | /* Tell drivers/pci/proc.c that we have pci_mmap_page_range() */ |
111 | #define HAVE_PCI_MMAP 1 | 150 | #define HAVE_PCI_MMAP 1 |
112 | 151 | ||
152 | #ifdef CONFIG_PPC64 | ||
113 | /* pci_unmap_{single,page} is not a nop, thus... */ | 153 | /* pci_unmap_{single,page} is not a nop, thus... */ |
114 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ | 154 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) \ |
115 | dma_addr_t ADDR_NAME; | 155 | dma_addr_t ADDR_NAME; |
@@ -124,22 +164,40 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, | |||
124 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ | 164 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) \ |
125 | (((PTR)->LEN_NAME) = (VAL)) | 165 | (((PTR)->LEN_NAME) = (VAL)) |
126 | 166 | ||
127 | /* The PCI address space does equal the physical memory | 167 | /* The PCI address space does not equal the physical memory address |
128 | * address space. The networking and block device layers use | 168 | * space (we have an IOMMU). The IDE and SCSI device layers use |
129 | * this boolean for bounce buffer decisions. | 169 | * this boolean for bounce buffer decisions. |
130 | */ | 170 | */ |
131 | #define PCI_DMA_BUS_IS_PHYS (0) | 171 | #define PCI_DMA_BUS_IS_PHYS (0) |
172 | |||
173 | #else /* 32-bit */ | ||
174 | |||
175 | /* The PCI address space does equal the physical memory | ||
176 | * address space (no IOMMU). The IDE and SCSI device layers use | ||
177 | * this boolean for bounce buffer decisions. | ||
178 | */ | ||
179 | #define PCI_DMA_BUS_IS_PHYS (1) | ||
180 | |||
181 | /* pci_unmap_{page,single} is a nop so... */ | ||
182 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
183 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
184 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
185 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
186 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
187 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
188 | |||
189 | #endif /* CONFIG_PPC64 */ | ||
132 | 190 | ||
133 | extern void | 191 | extern void pcibios_resource_to_bus(struct pci_dev *dev, |
134 | pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, | 192 | struct pci_bus_region *region, |
135 | struct resource *res); | 193 | struct resource *res); |
136 | 194 | ||
137 | extern void | 195 | extern void pcibios_bus_to_resource(struct pci_dev *dev, |
138 | pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 196 | struct resource *res, |
139 | struct pci_bus_region *region); | 197 | struct pci_bus_region *region); |
140 | 198 | ||
141 | static inline struct resource * | 199 | static inline struct resource *pcibios_select_root(struct pci_dev *pdev, |
142 | pcibios_select_root(struct pci_dev *pdev, struct resource *res) | 200 | struct resource *res) |
143 | { | 201 | { |
144 | struct resource *root = NULL; | 202 | struct resource *root = NULL; |
145 | 203 | ||
@@ -151,14 +209,12 @@ pcibios_select_root(struct pci_dev *pdev, struct resource *res) | |||
151 | return root; | 209 | return root; |
152 | } | 210 | } |
153 | 211 | ||
154 | extern int | 212 | extern int unmap_bus_range(struct pci_bus *bus); |
155 | unmap_bus_range(struct pci_bus *bus); | ||
156 | 213 | ||
157 | extern int | 214 | extern int remap_bus_range(struct pci_bus *bus); |
158 | remap_bus_range(struct pci_bus *bus); | ||
159 | 215 | ||
160 | extern void | 216 | extern void pcibios_fixup_device_resources(struct pci_dev *dev, |
161 | pcibios_fixup_device_resources(struct pci_dev *dev, struct pci_bus *bus); | 217 | struct pci_bus *bus); |
162 | 218 | ||
163 | extern struct pci_controller *init_phb_dynamic(struct device_node *dn); | 219 | extern struct pci_controller *init_phb_dynamic(struct device_node *dn); |
164 | 220 | ||
@@ -180,14 +236,12 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, | |||
180 | unsigned long size, | 236 | unsigned long size, |
181 | pgprot_t prot); | 237 | pgprot_t prot); |
182 | 238 | ||
183 | #ifdef CONFIG_PPC_MULTIPLATFORM | 239 | #if defined(CONFIG_PPC_MULTIPLATFORM) || defined(CONFIG_PPC32) |
184 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER | 240 | #define HAVE_ARCH_PCI_RESOURCE_TO_USER |
185 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, | 241 | extern void pci_resource_to_user(const struct pci_dev *dev, int bar, |
186 | const struct resource *rsrc, | 242 | const struct resource *rsrc, |
187 | u64 *start, u64 *end); | 243 | u64 *start, u64 *end); |
188 | #endif /* CONFIG_PPC_MULTIPLATFORM */ | 244 | #endif /* CONFIG_PPC_MULTIPLATFORM || CONFIG_PPC32 */ |
189 | |||
190 | 245 | ||
191 | #endif /* __KERNEL__ */ | 246 | #endif /* __KERNEL__ */ |
192 | 247 | #endif /* __ASM_POWERPC_PCI_H */ | |
193 | #endif /* __PPC64_PCI_H */ | ||
diff --git a/include/asm-ppc64/pgalloc.h b/include/asm-powerpc/pgalloc.h index dcf3622d1946..bfc2113b3630 100644 --- a/include/asm-ppc64/pgalloc.h +++ b/include/asm-powerpc/pgalloc.h | |||
@@ -1,5 +1,9 @@ | |||
1 | #ifndef _PPC64_PGALLOC_H | 1 | #ifndef _ASM_POWERPC_PGALLOC_H |
2 | #define _PPC64_PGALLOC_H | 2 | #define _ASM_POWERPC_PGALLOC_H |
3 | |||
4 | #ifndef CONFIG_PPC64 | ||
5 | #include <asm-ppc/pgalloc.h> | ||
6 | #else | ||
3 | 7 | ||
4 | #include <linux/mm.h> | 8 | #include <linux/mm.h> |
5 | #include <linux/slab.h> | 9 | #include <linux/slab.h> |
@@ -148,4 +152,5 @@ extern void pgtable_free_tlb(struct mmu_gather *tlb, pgtable_free_t pgf); | |||
148 | 152 | ||
149 | #define check_pgt_cache() do { } while (0) | 153 | #define check_pgt_cache() do { } while (0) |
150 | 154 | ||
151 | #endif /* _PPC64_PGALLOC_H */ | 155 | #endif /* CONFIG_PPC64 */ |
156 | #endif /* _ASM_POWERPC_PGALLOC_H */ | ||
diff --git a/include/asm-ppc64/pgtable-4k.h b/include/asm-powerpc/pgtable-4k.h index e9590c06ad92..e9590c06ad92 100644 --- a/include/asm-ppc64/pgtable-4k.h +++ b/include/asm-powerpc/pgtable-4k.h | |||
diff --git a/include/asm-ppc64/pgtable-64k.h b/include/asm-powerpc/pgtable-64k.h index 154f1840ece4..154f1840ece4 100644 --- a/include/asm-ppc64/pgtable-64k.h +++ b/include/asm-powerpc/pgtable-64k.h | |||
diff --git a/include/asm-ppc64/pgtable.h b/include/asm-powerpc/pgtable.h index a9783ba7fe98..0303f57366c1 100644 --- a/include/asm-ppc64/pgtable.h +++ b/include/asm-powerpc/pgtable.h | |||
@@ -1,5 +1,9 @@ | |||
1 | #ifndef _PPC64_PGTABLE_H | 1 | #ifndef _ASM_POWERPC_PGTABLE_H |
2 | #define _PPC64_PGTABLE_H | 2 | #define _ASM_POWERPC_PGTABLE_H |
3 | |||
4 | #ifndef CONFIG_PPC64 | ||
5 | #include <asm-ppc/pgtable.h> | ||
6 | #else | ||
3 | 7 | ||
4 | /* | 8 | /* |
5 | * This file contains the functions and defines necessary to modify and use | 9 | * This file contains the functions and defines necessary to modify and use |
@@ -47,6 +51,13 @@ struct mm_struct; | |||
47 | #define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) | 51 | #define VMALLOC_END (VMALLOC_START + VMALLOC_SIZE) |
48 | 52 | ||
49 | /* | 53 | /* |
54 | * Define the address range of the imalloc VM area. | ||
55 | */ | ||
56 | #define PHBS_IO_BASE VMALLOC_END | ||
57 | #define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul) /* Reserve 2 gigs for PHBs */ | ||
58 | #define IMALLOC_END (VMALLOC_START + PGTABLE_RANGE) | ||
59 | |||
60 | /* | ||
50 | * Common bits in a linux-style PTE. These match the bits in the | 61 | * Common bits in a linux-style PTE. These match the bits in the |
51 | * (hardware-defined) PowerPC PTE as closely as possible. Additional | 62 | * (hardware-defined) PowerPC PTE as closely as possible. Additional |
52 | * bits may be defined in pgtable-*.h | 63 | * bits may be defined in pgtable-*.h |
@@ -69,7 +80,7 @@ struct mm_struct; | |||
69 | 80 | ||
70 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) | 81 | #define _PAGE_WRENABLE (_PAGE_RW | _PAGE_DIRTY) |
71 | 82 | ||
72 | /* __pgprot defined in asm-ppc64/page.h */ | 83 | /* __pgprot defined in asm-powerpc/page.h */ |
73 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) | 84 | #define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED) |
74 | 85 | ||
75 | #define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER) | 86 | #define PAGE_SHARED __pgprot(_PAGE_BASE | _PAGE_RW | _PAGE_USER) |
@@ -509,4 +520,5 @@ void pgtable_cache_init(void); | |||
509 | 520 | ||
510 | #endif /* __ASSEMBLY__ */ | 521 | #endif /* __ASSEMBLY__ */ |
511 | 522 | ||
512 | #endif /* _PPC64_PGTABLE_H */ | 523 | #endif /* CONFIG_PPC64 */ |
524 | #endif /* _ASM_POWERPC_PGTABLE_H */ | ||
diff --git a/include/asm-powerpc/ppc-pci.h b/include/asm-powerpc/ppc-pci.h index 2e36e5a7f4f3..36cdc869e580 100644 --- a/include/asm-powerpc/ppc-pci.h +++ b/include/asm-powerpc/ppc-pci.h | |||
@@ -48,8 +48,6 @@ extern void pSeries_final_fixup(void); | |||
48 | extern void pSeries_irq_bus_setup(struct pci_bus *bus); | 48 | extern void pSeries_irq_bus_setup(struct pci_bus *bus); |
49 | 49 | ||
50 | extern unsigned long pci_probe_only; | 50 | extern unsigned long pci_probe_only; |
51 | extern unsigned long pci_assign_all_buses; | ||
52 | extern int pci_read_irq_line(struct pci_dev *pci_dev); | ||
53 | 51 | ||
54 | /* ---- EEH internal-use-only related routines ---- */ | 52 | /* ---- EEH internal-use-only related routines ---- */ |
55 | #ifdef CONFIG_EEH | 53 | #ifdef CONFIG_EEH |
diff --git a/include/asm-ppc64/spinlock.h b/include/asm-powerpc/spinlock.h index 7d84fb5e39f1..caa4b14e0e94 100644 --- a/include/asm-ppc64/spinlock.h +++ b/include/asm-powerpc/spinlock.h | |||
@@ -18,31 +18,41 @@ | |||
18 | * | 18 | * |
19 | * (the type definitions are in asm/spinlock_types.h) | 19 | * (the type definitions are in asm/spinlock_types.h) |
20 | */ | 20 | */ |
21 | #include <linux/config.h> | 21 | #ifdef CONFIG_PPC64 |
22 | #include <asm/paca.h> | 22 | #include <asm/paca.h> |
23 | #include <asm/hvcall.h> | 23 | #include <asm/hvcall.h> |
24 | #include <asm/iseries/hv_call.h> | 24 | #include <asm/iseries/hv_call.h> |
25 | #endif | ||
26 | #include <asm/asm-compat.h> | ||
27 | #include <asm/synch.h> | ||
25 | 28 | ||
26 | #define __raw_spin_is_locked(x) ((x)->slock != 0) | 29 | #define __raw_spin_is_locked(x) ((x)->slock != 0) |
27 | 30 | ||
31 | #ifdef CONFIG_PPC64 | ||
32 | /* use 0x800000yy when locked, where yy == CPU number */ | ||
33 | #define LOCK_TOKEN (*(u32 *)(&get_paca()->lock_token)) | ||
34 | #else | ||
35 | #define LOCK_TOKEN 1 | ||
36 | #endif | ||
37 | |||
28 | /* | 38 | /* |
29 | * This returns the old value in the lock, so we succeeded | 39 | * This returns the old value in the lock, so we succeeded |
30 | * in getting the lock if the return value is 0. | 40 | * in getting the lock if the return value is 0. |
31 | */ | 41 | */ |
32 | static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) | 42 | static __inline__ unsigned long __spin_trylock(raw_spinlock_t *lock) |
33 | { | 43 | { |
34 | unsigned long tmp, tmp2; | 44 | unsigned long tmp, token; |
35 | 45 | ||
46 | token = LOCK_TOKEN; | ||
36 | __asm__ __volatile__( | 47 | __asm__ __volatile__( |
37 | " lwz %1,%3(13) # __spin_trylock\n\ | 48 | "1: lwarx %0,0,%2 # __spin_trylock\n\ |
38 | 1: lwarx %0,0,%2\n\ | ||
39 | cmpwi 0,%0,0\n\ | 49 | cmpwi 0,%0,0\n\ |
40 | bne- 2f\n\ | 50 | bne- 2f\n\ |
41 | stwcx. %1,0,%2\n\ | 51 | stwcx. %1,0,%2\n\ |
42 | bne- 1b\n\ | 52 | bne- 1b\n\ |
43 | isync\n\ | 53 | isync\n\ |
44 | 2:" : "=&r" (tmp), "=&r" (tmp2) | 54 | 2:" : "=&r" (tmp) |
45 | : "r" (&lock->slock), "i" (offsetof(struct paca_struct, lock_token)) | 55 | : "r" (token), "r" (&lock->slock) |
46 | : "cr0", "memory"); | 56 | : "cr0", "memory"); |
47 | 57 | ||
48 | return tmp; | 58 | return tmp; |
@@ -113,11 +123,17 @@ static void __inline__ __raw_spin_lock_flags(raw_spinlock_t *lock, unsigned long | |||
113 | 123 | ||
114 | static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) | 124 | static __inline__ void __raw_spin_unlock(raw_spinlock_t *lock) |
115 | { | 125 | { |
116 | __asm__ __volatile__("lwsync # __raw_spin_unlock": : :"memory"); | 126 | __asm__ __volatile__(SYNC_ON_SMP" # __raw_spin_unlock" |
127 | : : :"memory"); | ||
117 | lock->slock = 0; | 128 | lock->slock = 0; |
118 | } | 129 | } |
119 | 130 | ||
131 | #ifdef CONFIG_PPC64 | ||
120 | extern void __raw_spin_unlock_wait(raw_spinlock_t *lock); | 132 | extern void __raw_spin_unlock_wait(raw_spinlock_t *lock); |
133 | #else | ||
134 | #define __raw_spin_unlock_wait(lock) \ | ||
135 | do { while (__raw_spin_is_locked(lock)) cpu_relax(); } while (0) | ||
136 | #endif | ||
121 | 137 | ||
122 | /* | 138 | /* |
123 | * Read-write spinlocks, allowing multiple readers | 139 | * Read-write spinlocks, allowing multiple readers |
@@ -133,6 +149,14 @@ extern void __raw_spin_unlock_wait(raw_spinlock_t *lock); | |||
133 | #define __raw_read_can_lock(rw) ((rw)->lock >= 0) | 149 | #define __raw_read_can_lock(rw) ((rw)->lock >= 0) |
134 | #define __raw_write_can_lock(rw) (!(rw)->lock) | 150 | #define __raw_write_can_lock(rw) (!(rw)->lock) |
135 | 151 | ||
152 | #ifdef CONFIG_PPC64 | ||
153 | #define __DO_SIGN_EXTEND "extsw %0,%0\n" | ||
154 | #define WRLOCK_TOKEN LOCK_TOKEN /* it's negative */ | ||
155 | #else | ||
156 | #define __DO_SIGN_EXTEND | ||
157 | #define WRLOCK_TOKEN (-1) | ||
158 | #endif | ||
159 | |||
136 | /* | 160 | /* |
137 | * This returns the old value in the lock + 1, | 161 | * This returns the old value in the lock + 1, |
138 | * so we got a read lock if the return value is > 0. | 162 | * so we got a read lock if the return value is > 0. |
@@ -142,11 +166,12 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw) | |||
142 | long tmp; | 166 | long tmp; |
143 | 167 | ||
144 | __asm__ __volatile__( | 168 | __asm__ __volatile__( |
145 | "1: lwarx %0,0,%1 # read_trylock\n\ | 169 | "1: lwarx %0,0,%1 # read_trylock\n" |
146 | extsw %0,%0\n\ | 170 | __DO_SIGN_EXTEND |
147 | addic. %0,%0,1\n\ | 171 | " addic. %0,%0,1\n\ |
148 | ble- 2f\n\ | 172 | ble- 2f\n" |
149 | stwcx. %0,0,%1\n\ | 173 | PPC405_ERR77(0,%1) |
174 | " stwcx. %0,0,%1\n\ | ||
150 | bne- 1b\n\ | 175 | bne- 1b\n\ |
151 | isync\n\ | 176 | isync\n\ |
152 | 2:" : "=&r" (tmp) | 177 | 2:" : "=&r" (tmp) |
@@ -162,18 +187,19 @@ static long __inline__ __read_trylock(raw_rwlock_t *rw) | |||
162 | */ | 187 | */ |
163 | static __inline__ long __write_trylock(raw_rwlock_t *rw) | 188 | static __inline__ long __write_trylock(raw_rwlock_t *rw) |
164 | { | 189 | { |
165 | long tmp, tmp2; | 190 | long tmp, token; |
166 | 191 | ||
192 | token = WRLOCK_TOKEN; | ||
167 | __asm__ __volatile__( | 193 | __asm__ __volatile__( |
168 | " lwz %1,%3(13) # write_trylock\n\ | 194 | "1: lwarx %0,0,%2 # write_trylock\n\ |
169 | 1: lwarx %0,0,%2\n\ | ||
170 | cmpwi 0,%0,0\n\ | 195 | cmpwi 0,%0,0\n\ |
171 | bne- 2f\n\ | 196 | bne- 2f\n" |
172 | stwcx. %1,0,%2\n\ | 197 | PPC405_ERR77(0,%1) |
198 | " stwcx. %1,0,%2\n\ | ||
173 | bne- 1b\n\ | 199 | bne- 1b\n\ |
174 | isync\n\ | 200 | isync\n\ |
175 | 2:" : "=&r" (tmp), "=&r" (tmp2) | 201 | 2:" : "=&r" (tmp) |
176 | : "r" (&rw->lock), "i" (offsetof(struct paca_struct, lock_token)) | 202 | : "r" (token), "r" (&rw->lock) |
177 | : "cr0", "memory"); | 203 | : "cr0", "memory"); |
178 | 204 | ||
179 | return tmp; | 205 | return tmp; |
@@ -224,8 +250,9 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw) | |||
224 | __asm__ __volatile__( | 250 | __asm__ __volatile__( |
225 | "eieio # read_unlock\n\ | 251 | "eieio # read_unlock\n\ |
226 | 1: lwarx %0,0,%1\n\ | 252 | 1: lwarx %0,0,%1\n\ |
227 | addic %0,%0,-1\n\ | 253 | addic %0,%0,-1\n" |
228 | stwcx. %0,0,%1\n\ | 254 | PPC405_ERR77(0,%1) |
255 | " stwcx. %0,0,%1\n\ | ||
229 | bne- 1b" | 256 | bne- 1b" |
230 | : "=&r"(tmp) | 257 | : "=&r"(tmp) |
231 | : "r"(&rw->lock) | 258 | : "r"(&rw->lock) |
@@ -234,7 +261,8 @@ static void __inline__ __raw_read_unlock(raw_rwlock_t *rw) | |||
234 | 261 | ||
235 | static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) | 262 | static __inline__ void __raw_write_unlock(raw_rwlock_t *rw) |
236 | { | 263 | { |
237 | __asm__ __volatile__("lwsync # write_unlock": : :"memory"); | 264 | __asm__ __volatile__(SYNC_ON_SMP" # write_unlock" |
265 | : : :"memory"); | ||
238 | rw->lock = 0; | 266 | rw->lock = 0; |
239 | } | 267 | } |
240 | 268 | ||
diff --git a/include/asm-ppc/io.h b/include/asm-ppc/io.h index 2bfdf9c98459..84ac6e258eef 100644 --- a/include/asm-ppc/io.h +++ b/include/asm-ppc/io.h | |||
@@ -545,6 +545,23 @@ extern void pci_iounmap(struct pci_dev *dev, void __iomem *); | |||
545 | #include <asm/mpc8260_pci9.h> | 545 | #include <asm/mpc8260_pci9.h> |
546 | #endif | 546 | #endif |
547 | 547 | ||
548 | #ifdef CONFIG_NOT_COHERENT_CACHE | ||
549 | |||
550 | #define dma_cache_inv(_start,_size) \ | ||
551 | invalidate_dcache_range(_start, (_start + _size)) | ||
552 | #define dma_cache_wback(_start,_size) \ | ||
553 | clean_dcache_range(_start, (_start + _size)) | ||
554 | #define dma_cache_wback_inv(_start,_size) \ | ||
555 | flush_dcache_range(_start, (_start + _size)) | ||
556 | |||
557 | #else | ||
558 | |||
559 | #define dma_cache_inv(_start,_size) do { } while (0) | ||
560 | #define dma_cache_wback(_start,_size) do { } while (0) | ||
561 | #define dma_cache_wback_inv(_start,_size) do { } while (0) | ||
562 | |||
563 | #endif | ||
564 | |||
548 | /* | 565 | /* |
549 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem | 566 | * Convert a physical pointer to a virtual kernel pointer for /dev/mem |
550 | * access | 567 | * access |
diff --git a/include/asm-ppc64/dma-mapping.h b/include/asm-ppc64/dma-mapping.h deleted file mode 100644 index fb68fa23bea8..000000000000 --- a/include/asm-ppc64/dma-mapping.h +++ /dev/null | |||
@@ -1,136 +0,0 @@ | |||
1 | /* Copyright (C) 2004 IBM | ||
2 | * | ||
3 | * Implements the generic device dma API for ppc64. Handles | ||
4 | * the pci and vio busses | ||
5 | */ | ||
6 | |||
7 | #ifndef _ASM_DMA_MAPPING_H | ||
8 | #define _ASM_DMA_MAPPING_H | ||
9 | |||
10 | #include <linux/types.h> | ||
11 | #include <linux/cache.h> | ||
12 | /* need struct page definitions */ | ||
13 | #include <linux/mm.h> | ||
14 | #include <asm/scatterlist.h> | ||
15 | #include <asm/bug.h> | ||
16 | |||
17 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
18 | |||
19 | extern int dma_supported(struct device *dev, u64 mask); | ||
20 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | ||
21 | extern void *dma_alloc_coherent(struct device *dev, size_t size, | ||
22 | dma_addr_t *dma_handle, gfp_t flag); | ||
23 | extern void dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, | ||
24 | dma_addr_t dma_handle); | ||
25 | extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
26 | size_t size, enum dma_data_direction direction); | ||
27 | extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
28 | size_t size, enum dma_data_direction direction); | ||
29 | extern dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
30 | unsigned long offset, size_t size, | ||
31 | enum dma_data_direction direction); | ||
32 | extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | ||
33 | size_t size, enum dma_data_direction direction); | ||
34 | extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, | ||
35 | enum dma_data_direction direction); | ||
36 | extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
37 | int nhwentries, enum dma_data_direction direction); | ||
38 | |||
39 | static inline void | ||
40 | dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
41 | enum dma_data_direction direction) | ||
42 | { | ||
43 | BUG_ON(direction == DMA_NONE); | ||
44 | /* nothing to do */ | ||
45 | } | ||
46 | |||
47 | static inline void | ||
48 | dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size, | ||
49 | enum dma_data_direction direction) | ||
50 | { | ||
51 | BUG_ON(direction == DMA_NONE); | ||
52 | /* nothing to do */ | ||
53 | } | ||
54 | |||
55 | static inline void | ||
56 | dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems, | ||
57 | enum dma_data_direction direction) | ||
58 | { | ||
59 | BUG_ON(direction == DMA_NONE); | ||
60 | /* nothing to do */ | ||
61 | } | ||
62 | |||
63 | static inline void | ||
64 | dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems, | ||
65 | enum dma_data_direction direction) | ||
66 | { | ||
67 | BUG_ON(direction == DMA_NONE); | ||
68 | /* nothing to do */ | ||
69 | } | ||
70 | |||
71 | static inline int dma_mapping_error(dma_addr_t dma_addr) | ||
72 | { | ||
73 | return (dma_addr == DMA_ERROR_CODE); | ||
74 | } | ||
75 | |||
76 | /* Now for the API extensions over the pci_ one */ | ||
77 | |||
78 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
79 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
80 | #define dma_is_consistent(d) (1) | ||
81 | |||
82 | static inline int | ||
83 | dma_get_cache_alignment(void) | ||
84 | { | ||
85 | /* no easy way to get cache size on all processors, so return | ||
86 | * the maximum possible, to be safe */ | ||
87 | return (1 << L1_CACHE_SHIFT_MAX); | ||
88 | } | ||
89 | |||
90 | static inline void | ||
91 | dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, | ||
92 | unsigned long offset, size_t size, | ||
93 | enum dma_data_direction direction) | ||
94 | { | ||
95 | BUG_ON(direction == DMA_NONE); | ||
96 | /* nothing to do */ | ||
97 | } | ||
98 | |||
99 | static inline void | ||
100 | dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, | ||
101 | unsigned long offset, size_t size, | ||
102 | enum dma_data_direction direction) | ||
103 | { | ||
104 | BUG_ON(direction == DMA_NONE); | ||
105 | /* nothing to do */ | ||
106 | } | ||
107 | |||
108 | static inline void | ||
109 | dma_cache_sync(void *vaddr, size_t size, | ||
110 | enum dma_data_direction direction) | ||
111 | { | ||
112 | BUG_ON(direction == DMA_NONE); | ||
113 | /* nothing to do */ | ||
114 | } | ||
115 | |||
116 | /* | ||
117 | * DMA operations are abstracted for G5 vs. i/pSeries, PCI vs. VIO | ||
118 | */ | ||
119 | struct dma_mapping_ops { | ||
120 | void * (*alloc_coherent)(struct device *dev, size_t size, | ||
121 | dma_addr_t *dma_handle, gfp_t flag); | ||
122 | void (*free_coherent)(struct device *dev, size_t size, | ||
123 | void *vaddr, dma_addr_t dma_handle); | ||
124 | dma_addr_t (*map_single)(struct device *dev, void *ptr, | ||
125 | size_t size, enum dma_data_direction direction); | ||
126 | void (*unmap_single)(struct device *dev, dma_addr_t dma_addr, | ||
127 | size_t size, enum dma_data_direction direction); | ||
128 | int (*map_sg)(struct device *dev, struct scatterlist *sg, | ||
129 | int nents, enum dma_data_direction direction); | ||
130 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, | ||
131 | int nents, enum dma_data_direction direction); | ||
132 | int (*dma_supported)(struct device *dev, u64 mask); | ||
133 | int (*dac_dma_supported)(struct device *dev, u64 mask); | ||
134 | }; | ||
135 | |||
136 | #endif /* _ASM_DMA_MAPPING_H */ | ||
diff --git a/include/asm-ppc64/imalloc.h b/include/asm-ppc64/imalloc.h deleted file mode 100644 index 42adf7033a81..000000000000 --- a/include/asm-ppc64/imalloc.h +++ /dev/null | |||
@@ -1,26 +0,0 @@ | |||
1 | #ifndef _PPC64_IMALLOC_H | ||
2 | #define _PPC64_IMALLOC_H | ||
3 | |||
4 | /* | ||
5 | * Define the address range of the imalloc VM area. | ||
6 | */ | ||
7 | #define PHBS_IO_BASE VMALLOC_END | ||
8 | #define IMALLOC_BASE (PHBS_IO_BASE + 0x80000000ul) /* Reserve 2 gigs for PHBs */ | ||
9 | #define IMALLOC_END (VMALLOC_START + PGTABLE_RANGE) | ||
10 | |||
11 | |||
12 | /* imalloc region types */ | ||
13 | #define IM_REGION_UNUSED 0x1 | ||
14 | #define IM_REGION_SUBSET 0x2 | ||
15 | #define IM_REGION_EXISTS 0x4 | ||
16 | #define IM_REGION_OVERLAP 0x8 | ||
17 | #define IM_REGION_SUPERSET 0x10 | ||
18 | |||
19 | extern struct vm_struct * im_get_free_area(unsigned long size); | ||
20 | extern struct vm_struct * im_get_area(unsigned long v_addr, unsigned long size, | ||
21 | int region_type); | ||
22 | extern void im_free(void *addr); | ||
23 | |||
24 | extern unsigned long ioremap_bot; | ||
25 | |||
26 | #endif /* _PPC64_IMALLOC_H */ | ||
diff --git a/include/asm-x86_64/msr.h b/include/asm-x86_64/msr.h index 24dc39651bc4..10f8b51cec8b 100644 --- a/include/asm-x86_64/msr.h +++ b/include/asm-x86_64/msr.h | |||
@@ -56,7 +56,7 @@ | |||
56 | ".section __ex_table,\"a\"\n" \ | 56 | ".section __ex_table,\"a\"\n" \ |
57 | " .align 8\n" \ | 57 | " .align 8\n" \ |
58 | " .quad 1b,3b\n" \ | 58 | " .quad 1b,3b\n" \ |
59 | ".previous":"=&bDS" (ret__), "=a"(a), "=d"(b)\ | 59 | ".previous":"=&bDS" (ret__), "=a"(*(a)), "=d"(*(b))\ |
60 | :"c"(msr), "i"(-EIO), "0"(0)); \ | 60 | :"c"(msr), "i"(-EIO), "0"(0)); \ |
61 | ret__; }) | 61 | ret__; }) |
62 | 62 | ||
diff --git a/include/linux/cciss_ioctl.h b/include/linux/cciss_ioctl.h index 424d5e622b43..6e27f42e3a57 100644 --- a/include/linux/cciss_ioctl.h +++ b/include/linux/cciss_ioctl.h | |||
@@ -10,8 +10,8 @@ | |||
10 | typedef struct _cciss_pci_info_struct | 10 | typedef struct _cciss_pci_info_struct |
11 | { | 11 | { |
12 | unsigned char bus; | 12 | unsigned char bus; |
13 | unsigned short domain; | ||
14 | unsigned char dev_fn; | 13 | unsigned char dev_fn; |
14 | unsigned short domain; | ||
15 | __u32 board_id; | 15 | __u32 board_id; |
16 | } cciss_pci_info_struct; | 16 | } cciss_pci_info_struct; |
17 | 17 | ||
diff --git a/include/linux/hdreg.h b/include/linux/hdreg.h index b5d660089de4..2b54eac738ea 100644 --- a/include/linux/hdreg.h +++ b/include/linux/hdreg.h | |||
@@ -80,10 +80,12 @@ | |||
80 | /* | 80 | /* |
81 | * Define standard taskfile in/out register | 81 | * Define standard taskfile in/out register |
82 | */ | 82 | */ |
83 | #define IDE_TASKFILE_STD_OUT_FLAGS 0xFE | ||
84 | #define IDE_TASKFILE_STD_IN_FLAGS 0xFE | 83 | #define IDE_TASKFILE_STD_IN_FLAGS 0xFE |
85 | #define IDE_HOB_STD_OUT_FLAGS 0x3C | ||
86 | #define IDE_HOB_STD_IN_FLAGS 0x3C | 84 | #define IDE_HOB_STD_IN_FLAGS 0x3C |
85 | #ifndef __KERNEL__ | ||
86 | #define IDE_TASKFILE_STD_OUT_FLAGS 0xFE | ||
87 | #define IDE_HOB_STD_OUT_FLAGS 0x3C | ||
88 | #endif | ||
87 | 89 | ||
88 | typedef unsigned char task_ioreg_t; | 90 | typedef unsigned char task_ioreg_t; |
89 | typedef unsigned long sata_ioreg_t; | 91 | typedef unsigned long sata_ioreg_t; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index ac8b25fa6506..a39c3c59789d 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -1089,9 +1089,11 @@ enum { | |||
1089 | 1089 | ||
1090 | /* | 1090 | /* |
1091 | * Subdrivers support. | 1091 | * Subdrivers support. |
1092 | * | ||
1093 | * The gendriver.owner field should be set to the module owner of this driver. | ||
1094 | * The gendriver.name field should be set to the name of this driver | ||
1092 | */ | 1095 | */ |
1093 | typedef struct ide_driver_s { | 1096 | typedef struct ide_driver_s { |
1094 | struct module *owner; | ||
1095 | const char *version; | 1097 | const char *version; |
1096 | u8 media; | 1098 | u8 media; |
1097 | unsigned supports_dsc_overlap : 1; | 1099 | unsigned supports_dsc_overlap : 1; |
@@ -1199,37 +1201,11 @@ extern u64 ide_get_error_location(ide_drive_t *, char *); | |||
1199 | */ | 1201 | */ |
1200 | typedef enum { | 1202 | typedef enum { |
1201 | ide_wait, /* insert rq at end of list, and wait for it */ | 1203 | ide_wait, /* insert rq at end of list, and wait for it */ |
1202 | ide_next, /* insert rq immediately after current request */ | ||
1203 | ide_preempt, /* insert rq in front of current request */ | 1204 | ide_preempt, /* insert rq in front of current request */ |
1204 | ide_head_wait, /* insert rq in front of current request and wait for it */ | 1205 | ide_head_wait, /* insert rq in front of current request and wait for it */ |
1205 | ide_end /* insert rq at end of list, but don't wait for it */ | 1206 | ide_end /* insert rq at end of list, but don't wait for it */ |
1206 | } ide_action_t; | 1207 | } ide_action_t; |
1207 | 1208 | ||
1208 | /* | ||
1209 | * This function issues a special IDE device request | ||
1210 | * onto the request queue. | ||
1211 | * | ||
1212 | * If action is ide_wait, then the rq is queued at the end of the | ||
1213 | * request queue, and the function sleeps until it has been processed. | ||
1214 | * This is for use when invoked from an ioctl handler. | ||
1215 | * | ||
1216 | * If action is ide_preempt, then the rq is queued at the head of | ||
1217 | * the request queue, displacing the currently-being-processed | ||
1218 | * request and this function returns immediately without waiting | ||
1219 | * for the new rq to be completed. This is VERY DANGEROUS, and is | ||
1220 | * intended for careful use by the ATAPI tape/cdrom driver code. | ||
1221 | * | ||
1222 | * If action is ide_next, then the rq is queued immediately after | ||
1223 | * the currently-being-processed-request (if any), and the function | ||
1224 | * returns without waiting for the new rq to be completed. As above, | ||
1225 | * This is VERY DANGEROUS, and is intended for careful use by the | ||
1226 | * ATAPI tape/cdrom driver code. | ||
1227 | * | ||
1228 | * If action is ide_end, then the rq is queued at the end of the | ||
1229 | * request queue, and the function returns immediately without waiting | ||
1230 | * for the new rq to be completed. This is again intended for careful | ||
1231 | * use by the ATAPI tape/cdrom driver code. | ||
1232 | */ | ||
1233 | extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t); | 1209 | extern int ide_do_drive_cmd(ide_drive_t *, struct request *, ide_action_t); |
1234 | 1210 | ||
1235 | /* | 1211 | /* |
diff --git a/include/linux/mm.h b/include/linux/mm.h index 1013a42d10b1..0986d19be0b7 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
@@ -940,7 +940,9 @@ unsigned long max_sane_readahead(unsigned long nr); | |||
940 | 940 | ||
941 | /* Do stack extension */ | 941 | /* Do stack extension */ |
942 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); | 942 | extern int expand_stack(struct vm_area_struct *vma, unsigned long address); |
943 | #ifdef CONFIG_IA64 | ||
943 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); | 944 | extern int expand_upwards(struct vm_area_struct *vma, unsigned long address); |
945 | #endif | ||
944 | 946 | ||
945 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ | 947 | /* Look up the first VMA which satisfies addr < vm_end, NULL if none. */ |
946 | extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); | 948 | extern struct vm_area_struct * find_vma(struct mm_struct * mm, unsigned long addr); |
diff --git a/include/linux/netfilter_ipv4/ipt_sctp.h b/include/linux/netfilter_ipv4/ipt_sctp.h index e93a9ec99fc2..80b3dbacd193 100644 --- a/include/linux/netfilter_ipv4/ipt_sctp.h +++ b/include/linux/netfilter_ipv4/ipt_sctp.h | |||
@@ -7,8 +7,6 @@ | |||
7 | 7 | ||
8 | #define IPT_SCTP_VALID_FLAGS 0x07 | 8 | #define IPT_SCTP_VALID_FLAGS 0x07 |
9 | 9 | ||
10 | #define ELEMCOUNT(x) (sizeof(x)/sizeof(x[0])) | ||
11 | |||
12 | 10 | ||
13 | struct ipt_sctp_flag_info { | 11 | struct ipt_sctp_flag_info { |
14 | u_int8_t chunktype; | 12 | u_int8_t chunktype; |
@@ -59,21 +57,21 @@ struct ipt_sctp_info { | |||
59 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ | 57 | #define SCTP_CHUNKMAP_RESET(chunkmap) \ |
60 | do { \ | 58 | do { \ |
61 | int i; \ | 59 | int i; \ |
62 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 60 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
63 | chunkmap[i] = 0; \ | 61 | chunkmap[i] = 0; \ |
64 | } while (0) | 62 | } while (0) |
65 | 63 | ||
66 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ | 64 | #define SCTP_CHUNKMAP_SET_ALL(chunkmap) \ |
67 | do { \ | 65 | do { \ |
68 | int i; \ | 66 | int i; \ |
69 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 67 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
70 | chunkmap[i] = ~0; \ | 68 | chunkmap[i] = ~0; \ |
71 | } while (0) | 69 | } while (0) |
72 | 70 | ||
73 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ | 71 | #define SCTP_CHUNKMAP_COPY(destmap, srcmap) \ |
74 | do { \ | 72 | do { \ |
75 | int i; \ | 73 | int i; \ |
76 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) \ | 74 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) \ |
77 | destmap[i] = srcmap[i]; \ | 75 | destmap[i] = srcmap[i]; \ |
78 | } while (0) | 76 | } while (0) |
79 | 77 | ||
@@ -81,7 +79,7 @@ struct ipt_sctp_info { | |||
81 | ({ \ | 79 | ({ \ |
82 | int i; \ | 80 | int i; \ |
83 | int flag = 1; \ | 81 | int flag = 1; \ |
84 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 82 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
85 | if (chunkmap[i]) { \ | 83 | if (chunkmap[i]) { \ |
86 | flag = 0; \ | 84 | flag = 0; \ |
87 | break; \ | 85 | break; \ |
@@ -94,7 +92,7 @@ struct ipt_sctp_info { | |||
94 | ({ \ | 92 | ({ \ |
95 | int i; \ | 93 | int i; \ |
96 | int flag = 1; \ | 94 | int flag = 1; \ |
97 | for (i = 0; i < ELEMCOUNT(chunkmap); i++) { \ | 95 | for (i = 0; i < ARRAY_SIZE(chunkmap); i++) { \ |
98 | if (chunkmap[i] != ~0) { \ | 96 | if (chunkmap[i] != ~0) { \ |
99 | flag = 0; \ | 97 | flag = 0; \ |
100 | break; \ | 98 | break; \ |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 7b387faedb4d..1e737e269db9 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
@@ -620,6 +620,7 @@ | |||
620 | #define PCI_DEVICE_ID_SI_961 0x0961 | 620 | #define PCI_DEVICE_ID_SI_961 0x0961 |
621 | #define PCI_DEVICE_ID_SI_962 0x0962 | 621 | #define PCI_DEVICE_ID_SI_962 0x0962 |
622 | #define PCI_DEVICE_ID_SI_963 0x0963 | 622 | #define PCI_DEVICE_ID_SI_963 0x0963 |
623 | #define PCI_DEVICE_ID_SI_965 0x0965 | ||
623 | #define PCI_DEVICE_ID_SI_5511 0x5511 | 624 | #define PCI_DEVICE_ID_SI_5511 0x5511 |
624 | #define PCI_DEVICE_ID_SI_5513 0x5513 | 625 | #define PCI_DEVICE_ID_SI_5513 0x5513 |
625 | #define PCI_DEVICE_ID_SI_5518 0x5518 | 626 | #define PCI_DEVICE_ID_SI_5518 0x5518 |
@@ -1198,6 +1199,7 @@ | |||
1198 | #define PCI_DEVICE_ID_VIA_3269_0 0x0269 | 1199 | #define PCI_DEVICE_ID_VIA_3269_0 0x0269 |
1199 | #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282 | 1200 | #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282 |
1200 | #define PCI_DEVICE_ID_VIA_8363_0 0x0305 | 1201 | #define PCI_DEVICE_ID_VIA_8363_0 0x0305 |
1202 | #define PCI_DEVICE_ID_VIA_P4M800CE 0x0314 | ||
1201 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 | 1203 | #define PCI_DEVICE_ID_VIA_8371_0 0x0391 |
1202 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 | 1204 | #define PCI_DEVICE_ID_VIA_8501_0 0x0501 |
1203 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 | 1205 | #define PCI_DEVICE_ID_VIA_82C561 0x0561 |
@@ -1234,6 +1236,7 @@ | |||
1234 | #define PCI_DEVICE_ID_VIA_8703_51_0 0x3148 | 1236 | #define PCI_DEVICE_ID_VIA_8703_51_0 0x3148 |
1235 | #define PCI_DEVICE_ID_VIA_8237_SATA 0x3149 | 1237 | #define PCI_DEVICE_ID_VIA_8237_SATA 0x3149 |
1236 | #define PCI_DEVICE_ID_VIA_XN266 0x3156 | 1238 | #define PCI_DEVICE_ID_VIA_XN266 0x3156 |
1239 | #define PCI_DEVICE_ID_VIA_6410 0x3164 | ||
1237 | #define PCI_DEVICE_ID_VIA_8754C_0 0x3168 | 1240 | #define PCI_DEVICE_ID_VIA_8754C_0 0x3168 |
1238 | #define PCI_DEVICE_ID_VIA_8235 0x3177 | 1241 | #define PCI_DEVICE_ID_VIA_8235 0x3177 |
1239 | #define PCI_DEVICE_ID_VIA_8385_0 0x3188 | 1242 | #define PCI_DEVICE_ID_VIA_8385_0 0x3188 |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 0a8ea8b35816..8c5d6001a923 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -206,6 +206,7 @@ enum { | |||
206 | * @nfct: Associated connection, if any | 206 | * @nfct: Associated connection, if any |
207 | * @ipvs_property: skbuff is owned by ipvs | 207 | * @ipvs_property: skbuff is owned by ipvs |
208 | * @nfctinfo: Relationship of this skb to the connection | 208 | * @nfctinfo: Relationship of this skb to the connection |
209 | * @nfct_reasm: netfilter conntrack re-assembly pointer | ||
209 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c | 210 | * @nf_bridge: Saved data about a bridged frame - see br_netfilter.c |
210 | * @tc_index: Traffic control index | 211 | * @tc_index: Traffic control index |
211 | * @tc_verd: traffic control verdict | 212 | * @tc_verd: traffic control verdict |
@@ -264,16 +265,14 @@ struct sk_buff { | |||
264 | nohdr:1, | 265 | nohdr:1, |
265 | nfctinfo:3; | 266 | nfctinfo:3; |
266 | __u8 pkt_type:3, | 267 | __u8 pkt_type:3, |
267 | fclone:2; | 268 | fclone:2, |
269 | ipvs_property:1; | ||
268 | __be16 protocol; | 270 | __be16 protocol; |
269 | 271 | ||
270 | void (*destructor)(struct sk_buff *skb); | 272 | void (*destructor)(struct sk_buff *skb); |
271 | #ifdef CONFIG_NETFILTER | 273 | #ifdef CONFIG_NETFILTER |
272 | __u32 nfmark; | 274 | __u32 nfmark; |
273 | struct nf_conntrack *nfct; | 275 | struct nf_conntrack *nfct; |
274 | #if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE) | ||
275 | __u8 ipvs_property:1; | ||
276 | #endif | ||
277 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) | 276 | #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE) |
278 | struct sk_buff *nfct_reasm; | 277 | struct sk_buff *nfct_reasm; |
279 | #endif | 278 | #endif |
diff --git a/include/linux/uinput.h b/include/linux/uinput.h index 84876077027f..0ff7ca68e5c5 100644 --- a/include/linux/uinput.h +++ b/include/linux/uinput.h | |||
@@ -34,8 +34,7 @@ | |||
34 | #define UINPUT_BUFFER_SIZE 16 | 34 | #define UINPUT_BUFFER_SIZE 16 |
35 | #define UINPUT_NUM_REQUESTS 16 | 35 | #define UINPUT_NUM_REQUESTS 16 |
36 | 36 | ||
37 | /* state flags => bit index for {set|clear|test}_bit ops */ | 37 | enum uinput_state { UIST_NEW_DEVICE, UIST_SETUP_COMPLETE, UIST_CREATED }; |
38 | #define UIST_CREATED 0 | ||
39 | 38 | ||
40 | struct uinput_request { | 39 | struct uinput_request { |
41 | int id; | 40 | int id; |
@@ -52,11 +51,12 @@ struct uinput_request { | |||
52 | 51 | ||
53 | struct uinput_device { | 52 | struct uinput_device { |
54 | struct input_dev *dev; | 53 | struct input_dev *dev; |
55 | unsigned long state; | 54 | struct semaphore sem; |
55 | enum uinput_state state; | ||
56 | wait_queue_head_t waitq; | 56 | wait_queue_head_t waitq; |
57 | unsigned char ready, | 57 | unsigned char ready; |
58 | head, | 58 | unsigned char head; |
59 | tail; | 59 | unsigned char tail; |
60 | struct input_event buff[UINPUT_BUFFER_SIZE]; | 60 | struct input_event buff[UINPUT_BUFFER_SIZE]; |
61 | 61 | ||
62 | struct uinput_request *requests[UINPUT_NUM_REQUESTS]; | 62 | struct uinput_request *requests[UINPUT_NUM_REQUESTS]; |
@@ -91,6 +91,7 @@ struct uinput_ff_erase { | |||
91 | #define UI_SET_SNDBIT _IOW(UINPUT_IOCTL_BASE, 106, int) | 91 | #define UI_SET_SNDBIT _IOW(UINPUT_IOCTL_BASE, 106, int) |
92 | #define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int) | 92 | #define UI_SET_FFBIT _IOW(UINPUT_IOCTL_BASE, 107, int) |
93 | #define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*) | 93 | #define UI_SET_PHYS _IOW(UINPUT_IOCTL_BASE, 108, char*) |
94 | #define UI_SET_SWBIT _IOW(UINPUT_IOCTL_BASE, 109, int) | ||
94 | 95 | ||
95 | #define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload) | 96 | #define UI_BEGIN_FF_UPLOAD _IOWR(UINPUT_IOCTL_BASE, 200, struct uinput_ff_upload) |
96 | #define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload) | 97 | #define UI_END_FF_UPLOAD _IOW(UINPUT_IOCTL_BASE, 201, struct uinput_ff_upload) |
diff --git a/include/net/ieee80211.h b/include/net/ieee80211.h index b93fd8c1d884..cde2f4f4f501 100644 --- a/include/net/ieee80211.h +++ b/include/net/ieee80211.h | |||
@@ -1042,7 +1042,7 @@ static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr) | |||
1042 | case IEEE80211_4ADDR_LEN: | 1042 | case IEEE80211_4ADDR_LEN: |
1043 | return ((struct ieee80211_hdr_4addr *)hdr)->payload; | 1043 | return ((struct ieee80211_hdr_4addr *)hdr)->payload; |
1044 | } | 1044 | } |
1045 | 1045 | return NULL; | |
1046 | } | 1046 | } |
1047 | 1047 | ||
1048 | static inline int ieee80211_is_ofdm_rate(u8 rate) | 1048 | static inline int ieee80211_is_ofdm_rate(u8 rate) |
diff --git a/include/net/ipv6.h b/include/net/ipv6.h index 6addb4d464d6..0a2ad51cff82 100644 --- a/include/net/ipv6.h +++ b/include/net/ipv6.h | |||
@@ -237,6 +237,8 @@ extern struct ipv6_txoptions * ipv6_renew_options(struct sock *sk, struct ipv6_t | |||
237 | int newtype, | 237 | int newtype, |
238 | struct ipv6_opt_hdr __user *newopt, | 238 | struct ipv6_opt_hdr __user *newopt, |
239 | int newoptlen); | 239 | int newoptlen); |
240 | struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space, | ||
241 | struct ipv6_txoptions *opt); | ||
240 | 242 | ||
241 | extern int ip6_frag_nqueues; | 243 | extern int ip6_frag_nqueues; |
242 | extern atomic_t ip6_frag_mem; | 244 | extern atomic_t ip6_frag_mem; |
@@ -1501,7 +1501,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un | |||
1501 | * PA-RISC uses this for its stack; IA64 for its Register Backing Store. | 1501 | * PA-RISC uses this for its stack; IA64 for its Register Backing Store. |
1502 | * vma is the last one with address > vma->vm_end. Have to extend vma. | 1502 | * vma is the last one with address > vma->vm_end. Have to extend vma. |
1503 | */ | 1503 | */ |
1504 | #ifdef CONFIG_STACK_GROWSUP | 1504 | #ifndef CONFIG_IA64 |
1505 | static inline | 1505 | static inline |
1506 | #endif | 1506 | #endif |
1507 | int expand_upwards(struct vm_area_struct *vma, unsigned long address) | 1507 | int expand_upwards(struct vm_area_struct *vma, unsigned long address) |
diff --git a/net/core/filter.c b/net/core/filter.c index 079c2edff789..2841bfce29d6 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
@@ -116,8 +116,6 @@ int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) | |||
116 | A /= X; | 116 | A /= X; |
117 | continue; | 117 | continue; |
118 | case BPF_ALU|BPF_DIV|BPF_K: | 118 | case BPF_ALU|BPF_DIV|BPF_K: |
119 | if (fentry->k == 0) | ||
120 | return 0; | ||
121 | A /= fentry->k; | 119 | A /= fentry->k; |
122 | continue; | 120 | continue; |
123 | case BPF_ALU|BPF_AND|BPF_X: | 121 | case BPF_ALU|BPF_AND|BPF_X: |
@@ -320,6 +318,10 @@ int sk_chk_filter(struct sock_filter *filter, int flen) | |||
320 | } | 318 | } |
321 | } | 319 | } |
322 | 320 | ||
321 | /* check for division by zero -Kris Katterjohn 2005-10-30 */ | ||
322 | if (ftest->code == (BPF_ALU|BPF_DIV|BPF_K) && ftest->k == 0) | ||
323 | return -EINVAL; | ||
324 | |||
323 | /* check that memory operations use valid addresses. */ | 325 | /* check that memory operations use valid addresses. */ |
324 | if (ftest->k >= BPF_MEMWORDS) { | 326 | if (ftest->k >= BPF_MEMWORDS) { |
325 | /* but it might not be a memory operation... */ | 327 | /* but it might not be a memory operation... */ |
diff --git a/net/dccp/proto.c b/net/dccp/proto.c index e0ace7cbb996..8a6b2a9e4581 100644 --- a/net/dccp/proto.c +++ b/net/dccp/proto.c | |||
@@ -46,6 +46,7 @@ atomic_t dccp_orphan_count = ATOMIC_INIT(0); | |||
46 | static struct net_protocol dccp_protocol = { | 46 | static struct net_protocol dccp_protocol = { |
47 | .handler = dccp_v4_rcv, | 47 | .handler = dccp_v4_rcv, |
48 | .err_handler = dccp_v4_err, | 48 | .err_handler = dccp_v4_err, |
49 | .no_policy = 1, | ||
49 | }; | 50 | }; |
50 | 51 | ||
51 | const char *dccp_packet_name(const int type) | 52 | const char *dccp_packet_name(const int type) |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index 66247f38b371..705e3ce86df9 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -2378,6 +2378,7 @@ static unsigned fib_flag_trans(int type, u32 mask, const struct fib_info *fi) | |||
2378 | */ | 2378 | */ |
2379 | static int fib_route_seq_show(struct seq_file *seq, void *v) | 2379 | static int fib_route_seq_show(struct seq_file *seq, void *v) |
2380 | { | 2380 | { |
2381 | const struct fib_trie_iter *iter = seq->private; | ||
2381 | struct leaf *l = v; | 2382 | struct leaf *l = v; |
2382 | int i; | 2383 | int i; |
2383 | char bf[128]; | 2384 | char bf[128]; |
@@ -2389,6 +2390,8 @@ static int fib_route_seq_show(struct seq_file *seq, void *v) | |||
2389 | return 0; | 2390 | return 0; |
2390 | } | 2391 | } |
2391 | 2392 | ||
2393 | if (iter->trie == trie_local) | ||
2394 | return 0; | ||
2392 | if (IS_TNODE(l)) | 2395 | if (IS_TNODE(l)) |
2393 | return 0; | 2396 | return 0; |
2394 | 2397 | ||
diff --git a/net/ipv4/netfilter/Kconfig b/net/ipv4/netfilter/Kconfig index 9d3c8b5f327e..0bc00528d888 100644 --- a/net/ipv4/netfilter/Kconfig +++ b/net/ipv4/netfilter/Kconfig | |||
@@ -440,7 +440,7 @@ config IP_NF_MATCH_COMMENT | |||
440 | config IP_NF_MATCH_CONNMARK | 440 | config IP_NF_MATCH_CONNMARK |
441 | tristate 'Connection mark match support' | 441 | tristate 'Connection mark match support' |
442 | depends on IP_NF_IPTABLES | 442 | depends on IP_NF_IPTABLES |
443 | depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) | 443 | depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) |
444 | help | 444 | help |
445 | This option adds a `connmark' match, which allows you to match the | 445 | This option adds a `connmark' match, which allows you to match the |
446 | connection mark value previously set for the session by `CONNMARK'. | 446 | connection mark value previously set for the session by `CONNMARK'. |
@@ -452,7 +452,7 @@ config IP_NF_MATCH_CONNMARK | |||
452 | config IP_NF_MATCH_CONNBYTES | 452 | config IP_NF_MATCH_CONNBYTES |
453 | tristate 'Connection byte/packet counter match support' | 453 | tristate 'Connection byte/packet counter match support' |
454 | depends on IP_NF_IPTABLES | 454 | depends on IP_NF_IPTABLES |
455 | depends on IP_NF_CT_ACCT || (NF_CT_ACCT && NF_CONNTRACK_IPV4) | 455 | depends on (IP_NF_CONNTRACK && IP_NF_CT_ACCT) || (NF_CT_ACCT && NF_CONNTRACK_IPV4) |
456 | help | 456 | help |
457 | This option adds a `connbytes' match, which allows you to match the | 457 | This option adds a `connbytes' match, which allows you to match the |
458 | number of bytes and/or packets for each direction within a connection. | 458 | number of bytes and/or packets for each direction within a connection. |
@@ -767,7 +767,7 @@ config IP_NF_TARGET_TTL | |||
767 | config IP_NF_TARGET_CONNMARK | 767 | config IP_NF_TARGET_CONNMARK |
768 | tristate 'CONNMARK target support' | 768 | tristate 'CONNMARK target support' |
769 | depends on IP_NF_MANGLE | 769 | depends on IP_NF_MANGLE |
770 | depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) | 770 | depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) |
771 | help | 771 | help |
772 | This option adds a `CONNMARK' target, which allows one to manipulate | 772 | This option adds a `CONNMARK' target, which allows one to manipulate |
773 | the connection mark value. Similar to the MARK target, but | 773 | the connection mark value. Similar to the MARK target, but |
@@ -779,8 +779,8 @@ config IP_NF_TARGET_CONNMARK | |||
779 | 779 | ||
780 | config IP_NF_TARGET_CLUSTERIP | 780 | config IP_NF_TARGET_CLUSTERIP |
781 | tristate "CLUSTERIP target support (EXPERIMENTAL)" | 781 | tristate "CLUSTERIP target support (EXPERIMENTAL)" |
782 | depends on IP_NF_IPTABLES && EXPERIMENTAL | 782 | depends on IP_NF_MANGLE && EXPERIMENTAL |
783 | depends on IP_NF_CONNTRACK_MARK || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) | 783 | depends on (IP_NF_CONNTRACK && IP_NF_CONNTRACK_MARK) || (NF_CONNTRACK_MARK && NF_CONNTRACK_IPV4) |
784 | help | 784 | help |
785 | The CLUSTERIP target allows you to build load-balancing clusters of | 785 | The CLUSTERIP target allows you to build load-balancing clusters of |
786 | network servers without having a dedicated load-balancing | 786 | network servers without having a dedicated load-balancing |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 56a09a4ac410..a16064ba0caf 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2627,7 +2627,7 @@ static void addrconf_verify(unsigned long foo) | |||
2627 | for (i=0; i < IN6_ADDR_HSIZE; i++) { | 2627 | for (i=0; i < IN6_ADDR_HSIZE; i++) { |
2628 | 2628 | ||
2629 | restart: | 2629 | restart: |
2630 | write_lock(&addrconf_hash_lock); | 2630 | read_lock(&addrconf_hash_lock); |
2631 | for (ifp=inet6_addr_lst[i]; ifp; ifp=ifp->lst_next) { | 2631 | for (ifp=inet6_addr_lst[i]; ifp; ifp=ifp->lst_next) { |
2632 | unsigned long age; | 2632 | unsigned long age; |
2633 | #ifdef CONFIG_IPV6_PRIVACY | 2633 | #ifdef CONFIG_IPV6_PRIVACY |
@@ -2649,7 +2649,7 @@ restart: | |||
2649 | if (age >= ifp->valid_lft) { | 2649 | if (age >= ifp->valid_lft) { |
2650 | spin_unlock(&ifp->lock); | 2650 | spin_unlock(&ifp->lock); |
2651 | in6_ifa_hold(ifp); | 2651 | in6_ifa_hold(ifp); |
2652 | write_unlock(&addrconf_hash_lock); | 2652 | read_unlock(&addrconf_hash_lock); |
2653 | ipv6_del_addr(ifp); | 2653 | ipv6_del_addr(ifp); |
2654 | goto restart; | 2654 | goto restart; |
2655 | } else if (age >= ifp->prefered_lft) { | 2655 | } else if (age >= ifp->prefered_lft) { |
@@ -2668,7 +2668,7 @@ restart: | |||
2668 | 2668 | ||
2669 | if (deprecate) { | 2669 | if (deprecate) { |
2670 | in6_ifa_hold(ifp); | 2670 | in6_ifa_hold(ifp); |
2671 | write_unlock(&addrconf_hash_lock); | 2671 | read_unlock(&addrconf_hash_lock); |
2672 | 2672 | ||
2673 | ipv6_ifa_notify(0, ifp); | 2673 | ipv6_ifa_notify(0, ifp); |
2674 | in6_ifa_put(ifp); | 2674 | in6_ifa_put(ifp); |
@@ -2686,7 +2686,7 @@ restart: | |||
2686 | in6_ifa_hold(ifp); | 2686 | in6_ifa_hold(ifp); |
2687 | in6_ifa_hold(ifpub); | 2687 | in6_ifa_hold(ifpub); |
2688 | spin_unlock(&ifp->lock); | 2688 | spin_unlock(&ifp->lock); |
2689 | write_unlock(&addrconf_hash_lock); | 2689 | read_unlock(&addrconf_hash_lock); |
2690 | ipv6_create_tempaddr(ifpub, ifp); | 2690 | ipv6_create_tempaddr(ifpub, ifp); |
2691 | in6_ifa_put(ifpub); | 2691 | in6_ifa_put(ifpub); |
2692 | in6_ifa_put(ifp); | 2692 | in6_ifa_put(ifp); |
@@ -2703,7 +2703,7 @@ restart: | |||
2703 | spin_unlock(&ifp->lock); | 2703 | spin_unlock(&ifp->lock); |
2704 | } | 2704 | } |
2705 | } | 2705 | } |
2706 | write_unlock(&addrconf_hash_lock); | 2706 | read_unlock(&addrconf_hash_lock); |
2707 | } | 2707 | } |
2708 | 2708 | ||
2709 | addr_chk_timer.expires = time_before(next, jiffies + HZ) ? jiffies + HZ : next; | 2709 | addr_chk_timer.expires = time_before(next, jiffies + HZ) ? jiffies + HZ : next; |
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c index cc518405b3e1..c4a3a993acb7 100644 --- a/net/ipv6/datagram.c +++ b/net/ipv6/datagram.c | |||
@@ -437,7 +437,7 @@ int datagram_recv_ctl(struct sock *sk, struct msghdr *msg, struct sk_buff *skb) | |||
437 | break; | 437 | break; |
438 | case IPPROTO_AH: | 438 | case IPPROTO_AH: |
439 | nexthdr = ptr[0]; | 439 | nexthdr = ptr[0]; |
440 | len = (ptr[1] + 1) << 2; | 440 | len = (ptr[1] + 2) << 2; |
441 | break; | 441 | break; |
442 | default: | 442 | default: |
443 | nexthdr = ptr[0]; | 443 | nexthdr = ptr[0]; |
diff --git a/net/ipv6/exthdrs.c b/net/ipv6/exthdrs.c index 922549581abc..be6faf311387 100644 --- a/net/ipv6/exthdrs.c +++ b/net/ipv6/exthdrs.c | |||
@@ -628,6 +628,7 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | |||
628 | if (!tot_len) | 628 | if (!tot_len) |
629 | return NULL; | 629 | return NULL; |
630 | 630 | ||
631 | tot_len += sizeof(*opt2); | ||
631 | opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC); | 632 | opt2 = sock_kmalloc(sk, tot_len, GFP_ATOMIC); |
632 | if (!opt2) | 633 | if (!opt2) |
633 | return ERR_PTR(-ENOBUFS); | 634 | return ERR_PTR(-ENOBUFS); |
@@ -668,7 +669,26 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt, | |||
668 | 669 | ||
669 | return opt2; | 670 | return opt2; |
670 | out: | 671 | out: |
671 | sock_kfree_s(sk, p, tot_len); | 672 | sock_kfree_s(sk, opt2, opt2->tot_len); |
672 | return ERR_PTR(err); | 673 | return ERR_PTR(err); |
673 | } | 674 | } |
674 | 675 | ||
676 | struct ipv6_txoptions *ipv6_fixup_options(struct ipv6_txoptions *opt_space, | ||
677 | struct ipv6_txoptions *opt) | ||
678 | { | ||
679 | /* | ||
680 | * ignore the dest before srcrt unless srcrt is being included. | ||
681 | * --yoshfuji | ||
682 | */ | ||
683 | if (opt && opt->dst0opt && !opt->srcrt) { | ||
684 | if (opt_space != opt) { | ||
685 | memcpy(opt_space, opt, sizeof(*opt_space)); | ||
686 | opt = opt_space; | ||
687 | } | ||
688 | opt->opt_nflen -= ipv6_optlen(opt->dst0opt); | ||
689 | opt->dst0opt = NULL; | ||
690 | } | ||
691 | |||
692 | return opt; | ||
693 | } | ||
694 | |||
diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c index bbbe80cdaf72..1cf02765fb5c 100644 --- a/net/ipv6/ip6_flowlabel.c +++ b/net/ipv6/ip6_flowlabel.c | |||
@@ -225,20 +225,16 @@ struct ipv6_txoptions *fl6_merge_options(struct ipv6_txoptions * opt_space, | |||
225 | struct ip6_flowlabel * fl, | 225 | struct ip6_flowlabel * fl, |
226 | struct ipv6_txoptions * fopt) | 226 | struct ipv6_txoptions * fopt) |
227 | { | 227 | { |
228 | struct ipv6_txoptions * fl_opt = fl ? fl->opt : NULL; | 228 | struct ipv6_txoptions * fl_opt = fl->opt; |
229 | 229 | ||
230 | if (fopt == NULL || fopt->opt_flen == 0) { | 230 | if (fopt == NULL || fopt->opt_flen == 0) |
231 | if (!fl_opt || !fl_opt->dst0opt || fl_opt->srcrt) | 231 | return fl_opt; |
232 | return fl_opt; | 232 | |
233 | } | ||
234 | |||
235 | if (fl_opt != NULL) { | 233 | if (fl_opt != NULL) { |
236 | opt_space->hopopt = fl_opt->hopopt; | 234 | opt_space->hopopt = fl_opt->hopopt; |
237 | opt_space->dst0opt = fl_opt->srcrt ? fl_opt->dst0opt : NULL; | 235 | opt_space->dst0opt = fl_opt->dst0opt; |
238 | opt_space->srcrt = fl_opt->srcrt; | 236 | opt_space->srcrt = fl_opt->srcrt; |
239 | opt_space->opt_nflen = fl_opt->opt_nflen; | 237 | opt_space->opt_nflen = fl_opt->opt_nflen; |
240 | if (fl_opt->dst0opt && !fl_opt->srcrt) | ||
241 | opt_space->opt_nflen -= ipv6_optlen(fl_opt->dst0opt); | ||
242 | } else { | 238 | } else { |
243 | if (fopt->opt_nflen == 0) | 239 | if (fopt->opt_nflen == 0) |
244 | return fopt; | 240 | return fopt; |
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 8e9628f1c4c5..a66900cda2af 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -748,7 +748,9 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
748 | } | 748 | } |
749 | if (opt == NULL) | 749 | if (opt == NULL) |
750 | opt = np->opt; | 750 | opt = np->opt; |
751 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | 751 | if (flowlabel) |
752 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
753 | opt = ipv6_fixup_options(&opt_space, opt); | ||
752 | 754 | ||
753 | fl.proto = proto; | 755 | fl.proto = proto; |
754 | rawv6_probe_proto_opt(&fl, msg); | 756 | rawv6_probe_proto_opt(&fl, msg); |
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index e671153b47b2..5cc8731eb55b 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c | |||
@@ -771,7 +771,9 @@ do_udp_sendmsg: | |||
771 | } | 771 | } |
772 | if (opt == NULL) | 772 | if (opt == NULL) |
773 | opt = np->opt; | 773 | opt = np->opt; |
774 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | 774 | if (flowlabel) |
775 | opt = fl6_merge_options(&opt_space, flowlabel, opt); | ||
776 | opt = ipv6_fixup_options(&opt_space, opt); | ||
775 | 777 | ||
776 | fl->proto = IPPROTO_UDP; | 778 | fl->proto = IPPROTO_UDP; |
777 | ipv6_addr_copy(&fl->fl6_dst, daddr); | 779 | ipv6_addr_copy(&fl->fl6_dst, daddr); |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index cdc8d283791c..82fb07aa06a5 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -464,7 +464,7 @@ static int tfifo_enqueue(struct sk_buff *nskb, struct Qdisc *sch) | |||
464 | const struct netem_skb_cb *cb | 464 | const struct netem_skb_cb *cb |
465 | = (const struct netem_skb_cb *)skb->cb; | 465 | = (const struct netem_skb_cb *)skb->cb; |
466 | 466 | ||
467 | if (PSCHED_TLESS(cb->time_to_send, ncb->time_to_send)) | 467 | if (!PSCHED_TLESS(ncb->time_to_send, cb->time_to_send)) |
468 | break; | 468 | break; |
469 | } | 469 | } |
470 | 470 | ||