diff options
95 files changed, 774 insertions, 363 deletions
diff --git a/Documentation/slow-work.txt b/Documentation/slow-work.txt index 52bc31433723..9dbf4470c7e1 100644 --- a/Documentation/slow-work.txt +++ b/Documentation/slow-work.txt | |||
@@ -279,9 +279,9 @@ The slow-work thread pool has a number of configurables: | |||
279 | VIEWING EXECUTING AND QUEUED ITEMS | 279 | VIEWING EXECUTING AND QUEUED ITEMS |
280 | ================================== | 280 | ================================== |
281 | 281 | ||
282 | If CONFIG_SLOW_WORK_PROC is enabled, a proc file is made available: | 282 | If CONFIG_SLOW_WORK_DEBUG is enabled, a debugfs file is made available: |
283 | 283 | ||
284 | /proc/slow_work_rq | 284 | /sys/kernel/debug/slow_work/runqueue |
285 | 285 | ||
286 | through which the list of work items being executed and the queues of items to | 286 | through which the list of work items being executed and the queues of items to |
287 | be executed may be viewed. The owner of a work item is given the chance to | 287 | be executed may be viewed. The owner of a work item is given the chance to |
diff --git a/MAINTAINERS b/MAINTAINERS index 23d09d78a7b9..16129e67678a 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -512,10 +512,32 @@ W: http://www.arm.linux.org.uk/ | |||
512 | S: Maintained | 512 | S: Maintained |
513 | F: arch/arm/ | 513 | F: arch/arm/ |
514 | 514 | ||
515 | ARM PRIMECELL AACI PL041 DRIVER | ||
516 | M: Russell King <linux@arm.linux.org.uk> | ||
517 | S: Maintained | ||
518 | F: sound/arm/aaci.* | ||
519 | |||
520 | ARM PRIMECELL CLCD PL110 DRIVER | ||
521 | M: Russell King <linux@arm.linux.org.uk> | ||
522 | S: Maintained | ||
523 | F: drivers/video/amba-clcd.* | ||
524 | |||
525 | ARM PRIMECELL KMI PL050 DRIVER | ||
526 | M: Russell King <linux@arm.linux.org.uk> | ||
527 | S: Maintained | ||
528 | F: drivers/input/serio/ambakmi.* | ||
529 | F: include/linux/amba/kmi.h | ||
530 | |||
515 | ARM PRIMECELL MMCI PL180/1 DRIVER | 531 | ARM PRIMECELL MMCI PL180/1 DRIVER |
516 | S: Orphan | 532 | S: Orphan |
517 | F: drivers/mmc/host/mmci.* | 533 | F: drivers/mmc/host/mmci.* |
518 | 534 | ||
535 | ARM PRIMECELL BUS SUPPORT | ||
536 | M: Russell King <linux@arm.linux.org.uk> | ||
537 | S: Maintained | ||
538 | F: drivers/amba/ | ||
539 | F: include/linux/amba/bus.h | ||
540 | |||
519 | ARM/ADI ROADRUNNER MACHINE SUPPORT | 541 | ARM/ADI ROADRUNNER MACHINE SUPPORT |
520 | M: Lennert Buytenhek <kernel@wantstofly.org> | 542 | M: Lennert Buytenhek <kernel@wantstofly.org> |
521 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) | 543 | L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) |
@@ -2540,8 +2562,7 @@ S: Maintained | |||
2540 | F: Documentation/i2c/ | 2562 | F: Documentation/i2c/ |
2541 | F: drivers/i2c/ | 2563 | F: drivers/i2c/ |
2542 | F: include/linux/i2c.h | 2564 | F: include/linux/i2c.h |
2543 | F: include/linux/i2c-dev.h | 2565 | F: include/linux/i2c-*.h |
2544 | F: include/linux/i2c-id.h | ||
2545 | 2566 | ||
2546 | I2C-TINY-USB DRIVER | 2567 | I2C-TINY-USB DRIVER |
2547 | M: Till Harbaum <till@harbaum.org> | 2568 | M: Till Harbaum <till@harbaum.org> |
diff --git a/arch/alpha/include/asm/thread_info.h b/arch/alpha/include/asm/thread_info.h index 815680b585ed..b3e888638bb7 100644 --- a/arch/alpha/include/asm/thread_info.h +++ b/arch/alpha/include/asm/thread_info.h | |||
@@ -61,21 +61,24 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
61 | /* | 61 | /* |
62 | * Thread information flags: | 62 | * Thread information flags: |
63 | * - these are process state flags and used from assembly | 63 | * - these are process state flags and used from assembly |
64 | * - pending work-to-be-done flags come first to fit in and immediate operand. | 64 | * - pending work-to-be-done flags come first and must be assigned to be |
65 | * within bits 0 to 7 to fit in and immediate operand. | ||
66 | * - ALPHA_UAC_SHIFT below must be kept consistent with the unaligned | ||
67 | * control flags. | ||
65 | * | 68 | * |
66 | * TIF_SYSCALL_TRACE is known to be 0 via blbs. | 69 | * TIF_SYSCALL_TRACE is known to be 0 via blbs. |
67 | */ | 70 | */ |
68 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ | 71 | #define TIF_SYSCALL_TRACE 0 /* syscall trace active */ |
69 | #define TIF_SIGPENDING 1 /* signal pending */ | 72 | #define TIF_NOTIFY_RESUME 1 /* callback before returning to user */ |
70 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 73 | #define TIF_SIGPENDING 2 /* signal pending */ |
71 | #define TIF_POLLING_NRFLAG 3 /* poll_idle is polling NEED_RESCHED */ | 74 | #define TIF_NEED_RESCHED 3 /* rescheduling necessary */ |
72 | #define TIF_DIE_IF_KERNEL 4 /* dik recursion lock */ | 75 | #define TIF_POLLING_NRFLAG 8 /* poll_idle is polling NEED_RESCHED */ |
73 | #define TIF_UAC_NOPRINT 5 /* see sysinfo.h */ | 76 | #define TIF_DIE_IF_KERNEL 9 /* dik recursion lock */ |
74 | #define TIF_UAC_NOFIX 6 | 77 | #define TIF_UAC_NOPRINT 10 /* see sysinfo.h */ |
75 | #define TIF_UAC_SIGBUS 7 | 78 | #define TIF_UAC_NOFIX 11 |
76 | #define TIF_MEMDIE 8 | 79 | #define TIF_UAC_SIGBUS 12 |
77 | #define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal */ | 80 | #define TIF_MEMDIE 13 |
78 | #define TIF_NOTIFY_RESUME 10 /* callback before returning to user */ | 81 | #define TIF_RESTORE_SIGMASK 14 /* restore signal mask in do_signal */ |
79 | #define TIF_FREEZE 16 /* is freezing for suspend */ | 82 | #define TIF_FREEZE 16 /* is freezing for suspend */ |
80 | 83 | ||
81 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) | 84 | #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE) |
@@ -94,7 +97,7 @@ register struct thread_info *__current_thread_info __asm__("$8"); | |||
94 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ | 97 | #define _TIF_ALLWORK_MASK (_TIF_WORK_MASK \ |
95 | | _TIF_SYSCALL_TRACE) | 98 | | _TIF_SYSCALL_TRACE) |
96 | 99 | ||
97 | #define ALPHA_UAC_SHIFT 6 | 100 | #define ALPHA_UAC_SHIFT 10 |
98 | #define ALPHA_UAC_MASK (1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \ | 101 | #define ALPHA_UAC_MASK (1 << TIF_UAC_NOPRINT | 1 << TIF_UAC_NOFIX | \ |
99 | 1 << TIF_UAC_SIGBUS) | 102 | 1 << TIF_UAC_SIGBUS) |
100 | 103 | ||
diff --git a/arch/alpha/kernel/core_marvel.c b/arch/alpha/kernel/core_marvel.c index 8e059e58b0ac..53dd2f1a53aa 100644 --- a/arch/alpha/kernel/core_marvel.c +++ b/arch/alpha/kernel/core_marvel.c | |||
@@ -1103,6 +1103,8 @@ marvel_agp_info(void) | |||
1103 | * Allocate the info structure. | 1103 | * Allocate the info structure. |
1104 | */ | 1104 | */ |
1105 | agp = kmalloc(sizeof(*agp), GFP_KERNEL); | 1105 | agp = kmalloc(sizeof(*agp), GFP_KERNEL); |
1106 | if (!agp) | ||
1107 | return NULL; | ||
1106 | 1108 | ||
1107 | /* | 1109 | /* |
1108 | * Fill it in. | 1110 | * Fill it in. |
diff --git a/arch/alpha/kernel/core_titan.c b/arch/alpha/kernel/core_titan.c index 76686497b1e2..219bf271c0ba 100644 --- a/arch/alpha/kernel/core_titan.c +++ b/arch/alpha/kernel/core_titan.c | |||
@@ -757,6 +757,8 @@ titan_agp_info(void) | |||
757 | * Allocate the info structure. | 757 | * Allocate the info structure. |
758 | */ | 758 | */ |
759 | agp = kmalloc(sizeof(*agp), GFP_KERNEL); | 759 | agp = kmalloc(sizeof(*agp), GFP_KERNEL); |
760 | if (!agp) | ||
761 | return NULL; | ||
760 | 762 | ||
761 | /* | 763 | /* |
762 | * Fill it in. | 764 | * Fill it in. |
diff --git a/arch/alpha/kernel/irq.c b/arch/alpha/kernel/irq.c index cc7834661427..c0de072b8305 100644 --- a/arch/alpha/kernel/irq.c +++ b/arch/alpha/kernel/irq.c | |||
@@ -92,7 +92,7 @@ show_interrupts(struct seq_file *p, void *v) | |||
92 | for_each_online_cpu(j) | 92 | for_each_online_cpu(j) |
93 | seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j)); | 93 | seq_printf(p, "%10u ", kstat_irqs_cpu(irq, j)); |
94 | #endif | 94 | #endif |
95 | seq_printf(p, " %14s", irq_desc[irq].chip->typename); | 95 | seq_printf(p, " %14s", irq_desc[irq].chip->name); |
96 | seq_printf(p, " %c%s", | 96 | seq_printf(p, " %c%s", |
97 | (action->flags & IRQF_DISABLED)?'+':' ', | 97 | (action->flags & IRQF_DISABLED)?'+':' ', |
98 | action->name); | 98 | action->name); |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 38c805dfc544..cfde865b78e0 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
@@ -228,7 +228,7 @@ struct irqaction timer_irqaction = { | |||
228 | }; | 228 | }; |
229 | 229 | ||
230 | static struct irq_chip rtc_irq_type = { | 230 | static struct irq_chip rtc_irq_type = { |
231 | .typename = "RTC", | 231 | .name = "RTC", |
232 | .startup = rtc_startup, | 232 | .startup = rtc_startup, |
233 | .shutdown = rtc_enable_disable, | 233 | .shutdown = rtc_enable_disable, |
234 | .enable = rtc_enable_disable, | 234 | .enable = rtc_enable_disable, |
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 50bfec9b588f..83a9ac280890 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
@@ -84,7 +84,7 @@ i8259a_end_irq(unsigned int irq) | |||
84 | } | 84 | } |
85 | 85 | ||
86 | struct irq_chip i8259a_irq_type = { | 86 | struct irq_chip i8259a_irq_type = { |
87 | .typename = "XT-PIC", | 87 | .name = "XT-PIC", |
88 | .startup = i8259a_startup_irq, | 88 | .startup = i8259a_startup_irq, |
89 | .shutdown = i8259a_disable_irq, | 89 | .shutdown = i8259a_disable_irq, |
90 | .enable = i8259a_enable_irq, | 90 | .enable = i8259a_enable_irq, |
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index 69199a76ec4a..989ce46a0cf3 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c | |||
@@ -71,7 +71,7 @@ pyxis_mask_and_ack_irq(unsigned int irq) | |||
71 | } | 71 | } |
72 | 72 | ||
73 | static struct irq_chip pyxis_irq_type = { | 73 | static struct irq_chip pyxis_irq_type = { |
74 | .typename = "PYXIS", | 74 | .name = "PYXIS", |
75 | .startup = pyxis_startup_irq, | 75 | .startup = pyxis_startup_irq, |
76 | .shutdown = pyxis_disable_irq, | 76 | .shutdown = pyxis_disable_irq, |
77 | .enable = pyxis_enable_irq, | 77 | .enable = pyxis_enable_irq, |
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index 85229369a1f8..d63e93e1e8bf 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c | |||
@@ -49,7 +49,7 @@ srm_end_irq(unsigned int irq) | |||
49 | 49 | ||
50 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ | 50 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ |
51 | static struct irq_chip srm_irq_type = { | 51 | static struct irq_chip srm_irq_type = { |
52 | .typename = "SRM", | 52 | .name = "SRM", |
53 | .startup = srm_startup_irq, | 53 | .startup = srm_startup_irq, |
54 | .shutdown = srm_disable_irq, | 54 | .shutdown = srm_disable_irq, |
55 | .enable = srm_enable_irq, | 55 | .enable = srm_enable_irq, |
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index 382035ef7394..20a30b8b9655 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c | |||
@@ -90,7 +90,7 @@ alcor_end_irq(unsigned int irq) | |||
90 | } | 90 | } |
91 | 91 | ||
92 | static struct irq_chip alcor_irq_type = { | 92 | static struct irq_chip alcor_irq_type = { |
93 | .typename = "ALCOR", | 93 | .name = "ALCOR", |
94 | .startup = alcor_startup_irq, | 94 | .startup = alcor_startup_irq, |
95 | .shutdown = alcor_disable_irq, | 95 | .shutdown = alcor_disable_irq, |
96 | .enable = alcor_enable_irq, | 96 | .enable = alcor_enable_irq, |
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index ed349436732b..affd0f3f25df 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c | |||
@@ -72,7 +72,7 @@ cabriolet_end_irq(unsigned int irq) | |||
72 | } | 72 | } |
73 | 73 | ||
74 | static struct irq_chip cabriolet_irq_type = { | 74 | static struct irq_chip cabriolet_irq_type = { |
75 | .typename = "CABRIOLET", | 75 | .name = "CABRIOLET", |
76 | .startup = cabriolet_startup_irq, | 76 | .startup = cabriolet_startup_irq, |
77 | .shutdown = cabriolet_disable_irq, | 77 | .shutdown = cabriolet_disable_irq, |
78 | .enable = cabriolet_enable_irq, | 78 | .enable = cabriolet_enable_irq, |
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index 46e70ece5176..d64e1e497e76 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -199,7 +199,7 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) | |||
199 | } | 199 | } |
200 | 200 | ||
201 | static struct irq_chip dp264_irq_type = { | 201 | static struct irq_chip dp264_irq_type = { |
202 | .typename = "DP264", | 202 | .name = "DP264", |
203 | .startup = dp264_startup_irq, | 203 | .startup = dp264_startup_irq, |
204 | .shutdown = dp264_disable_irq, | 204 | .shutdown = dp264_disable_irq, |
205 | .enable = dp264_enable_irq, | 205 | .enable = dp264_enable_irq, |
@@ -210,7 +210,7 @@ static struct irq_chip dp264_irq_type = { | |||
210 | }; | 210 | }; |
211 | 211 | ||
212 | static struct irq_chip clipper_irq_type = { | 212 | static struct irq_chip clipper_irq_type = { |
213 | .typename = "CLIPPER", | 213 | .name = "CLIPPER", |
214 | .startup = clipper_startup_irq, | 214 | .startup = clipper_startup_irq, |
215 | .shutdown = clipper_disable_irq, | 215 | .shutdown = clipper_disable_irq, |
216 | .enable = clipper_enable_irq, | 216 | .enable = clipper_enable_irq, |
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 660c23ef661f..df2090ce5e7f 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c | |||
@@ -70,7 +70,7 @@ eb64p_end_irq(unsigned int irq) | |||
70 | } | 70 | } |
71 | 71 | ||
72 | static struct irq_chip eb64p_irq_type = { | 72 | static struct irq_chip eb64p_irq_type = { |
73 | .typename = "EB64P", | 73 | .name = "EB64P", |
74 | .startup = eb64p_startup_irq, | 74 | .startup = eb64p_startup_irq, |
75 | .shutdown = eb64p_disable_irq, | 75 | .shutdown = eb64p_disable_irq, |
76 | .enable = eb64p_enable_irq, | 76 | .enable = eb64p_enable_irq, |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index b99ea488d844..3ca1dbcf4044 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -81,7 +81,7 @@ eiger_end_irq(unsigned int irq) | |||
81 | } | 81 | } |
82 | 82 | ||
83 | static struct irq_chip eiger_irq_type = { | 83 | static struct irq_chip eiger_irq_type = { |
84 | .typename = "EIGER", | 84 | .name = "EIGER", |
85 | .startup = eiger_startup_irq, | 85 | .startup = eiger_startup_irq, |
86 | .shutdown = eiger_disable_irq, | 86 | .shutdown = eiger_disable_irq, |
87 | .enable = eiger_enable_irq, | 87 | .enable = eiger_enable_irq, |
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index ef0b83a070ac..7a7ae36fff91 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c | |||
@@ -119,7 +119,7 @@ jensen_local_end(unsigned int irq) | |||
119 | } | 119 | } |
120 | 120 | ||
121 | static struct irq_chip jensen_local_irq_type = { | 121 | static struct irq_chip jensen_local_irq_type = { |
122 | .typename = "LOCAL", | 122 | .name = "LOCAL", |
123 | .startup = jensen_local_startup, | 123 | .startup = jensen_local_startup, |
124 | .shutdown = jensen_local_shutdown, | 124 | .shutdown = jensen_local_shutdown, |
125 | .enable = jensen_local_enable, | 125 | .enable = jensen_local_enable, |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index bbfc4f20ca72..0bb3b5c4f693 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -170,7 +170,7 @@ marvel_irq_noop_return(unsigned int irq) | |||
170 | } | 170 | } |
171 | 171 | ||
172 | static struct irq_chip marvel_legacy_irq_type = { | 172 | static struct irq_chip marvel_legacy_irq_type = { |
173 | .typename = "LEGACY", | 173 | .name = "LEGACY", |
174 | .startup = marvel_irq_noop_return, | 174 | .startup = marvel_irq_noop_return, |
175 | .shutdown = marvel_irq_noop, | 175 | .shutdown = marvel_irq_noop, |
176 | .enable = marvel_irq_noop, | 176 | .enable = marvel_irq_noop, |
@@ -180,7 +180,7 @@ static struct irq_chip marvel_legacy_irq_type = { | |||
180 | }; | 180 | }; |
181 | 181 | ||
182 | static struct irq_chip io7_lsi_irq_type = { | 182 | static struct irq_chip io7_lsi_irq_type = { |
183 | .typename = "LSI", | 183 | .name = "LSI", |
184 | .startup = io7_startup_irq, | 184 | .startup = io7_startup_irq, |
185 | .shutdown = io7_disable_irq, | 185 | .shutdown = io7_disable_irq, |
186 | .enable = io7_enable_irq, | 186 | .enable = io7_enable_irq, |
@@ -190,7 +190,7 @@ static struct irq_chip io7_lsi_irq_type = { | |||
190 | }; | 190 | }; |
191 | 191 | ||
192 | static struct irq_chip io7_msi_irq_type = { | 192 | static struct irq_chip io7_msi_irq_type = { |
193 | .typename = "MSI", | 193 | .name = "MSI", |
194 | .startup = io7_startup_irq, | 194 | .startup = io7_startup_irq, |
195 | .shutdown = io7_disable_irq, | 195 | .shutdown = io7_disable_irq, |
196 | .enable = io7_enable_irq, | 196 | .enable = io7_enable_irq, |
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index 4e366641a08e..ee8865169811 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c | |||
@@ -69,7 +69,7 @@ mikasa_end_irq(unsigned int irq) | |||
69 | } | 69 | } |
70 | 70 | ||
71 | static struct irq_chip mikasa_irq_type = { | 71 | static struct irq_chip mikasa_irq_type = { |
72 | .typename = "MIKASA", | 72 | .name = "MIKASA", |
73 | .startup = mikasa_startup_irq, | 73 | .startup = mikasa_startup_irq, |
74 | .shutdown = mikasa_disable_irq, | 74 | .shutdown = mikasa_disable_irq, |
75 | .enable = mikasa_enable_irq, | 75 | .enable = mikasa_enable_irq, |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 35753a173bac..86503fe73a88 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -74,7 +74,7 @@ noritake_end_irq(unsigned int irq) | |||
74 | } | 74 | } |
75 | 75 | ||
76 | static struct irq_chip noritake_irq_type = { | 76 | static struct irq_chip noritake_irq_type = { |
77 | .typename = "NORITAKE", | 77 | .name = "NORITAKE", |
78 | .startup = noritake_startup_irq, | 78 | .startup = noritake_startup_irq, |
79 | .shutdown = noritake_disable_irq, | 79 | .shutdown = noritake_disable_irq, |
80 | .enable = noritake_enable_irq, | 80 | .enable = noritake_enable_irq, |
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index f3aec7e085c8..26c322bf89ee 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c | |||
@@ -136,7 +136,7 @@ rawhide_end_irq(unsigned int irq) | |||
136 | } | 136 | } |
137 | 137 | ||
138 | static struct irq_chip rawhide_irq_type = { | 138 | static struct irq_chip rawhide_irq_type = { |
139 | .typename = "RAWHIDE", | 139 | .name = "RAWHIDE", |
140 | .startup = rawhide_startup_irq, | 140 | .startup = rawhide_startup_irq, |
141 | .shutdown = rawhide_disable_irq, | 141 | .shutdown = rawhide_disable_irq, |
142 | .enable = rawhide_enable_irq, | 142 | .enable = rawhide_enable_irq, |
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index d9f9cfeb9931..8de1046fe91e 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c | |||
@@ -66,7 +66,7 @@ ruffian_init_irq(void) | |||
66 | common_init_isa_dma(); | 66 | common_init_isa_dma(); |
67 | } | 67 | } |
68 | 68 | ||
69 | #define RUFFIAN_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ) | 69 | #define RUFFIAN_LATCH DIV_ROUND_CLOSEST(PIT_TICK_RATE, HZ) |
70 | 70 | ||
71 | static void __init | 71 | static void __init |
72 | ruffian_init_rtc(void) | 72 | ruffian_init_rtc(void) |
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index fc9246373452..be161129eab9 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c | |||
@@ -73,7 +73,7 @@ rx164_end_irq(unsigned int irq) | |||
73 | } | 73 | } |
74 | 74 | ||
75 | static struct irq_chip rx164_irq_type = { | 75 | static struct irq_chip rx164_irq_type = { |
76 | .typename = "RX164", | 76 | .name = "RX164", |
77 | .startup = rx164_startup_irq, | 77 | .startup = rx164_startup_irq, |
78 | .shutdown = rx164_disable_irq, | 78 | .shutdown = rx164_disable_irq, |
79 | .enable = rx164_enable_irq, | 79 | .enable = rx164_enable_irq, |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 426eb6906d01..b2abe27a23cf 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -502,7 +502,7 @@ sable_lynx_mask_and_ack_irq(unsigned int irq) | |||
502 | } | 502 | } |
503 | 503 | ||
504 | static struct irq_chip sable_lynx_irq_type = { | 504 | static struct irq_chip sable_lynx_irq_type = { |
505 | .typename = "SABLE/LYNX", | 505 | .name = "SABLE/LYNX", |
506 | .startup = sable_lynx_startup_irq, | 506 | .startup = sable_lynx_startup_irq, |
507 | .shutdown = sable_lynx_disable_irq, | 507 | .shutdown = sable_lynx_disable_irq, |
508 | .enable = sable_lynx_enable_irq, | 508 | .enable = sable_lynx_enable_irq, |
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 830318c21661..230464885b5c 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c | |||
@@ -75,7 +75,7 @@ takara_end_irq(unsigned int irq) | |||
75 | } | 75 | } |
76 | 76 | ||
77 | static struct irq_chip takara_irq_type = { | 77 | static struct irq_chip takara_irq_type = { |
78 | .typename = "TAKARA", | 78 | .name = "TAKARA", |
79 | .startup = takara_startup_irq, | 79 | .startup = takara_startup_irq, |
80 | .shutdown = takara_disable_irq, | 80 | .shutdown = takara_disable_irq, |
81 | .enable = takara_enable_irq, | 81 | .enable = takara_enable_irq, |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 88978fc60f83..288053342c83 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -195,7 +195,7 @@ init_titan_irqs(struct irq_chip * ops, int imin, int imax) | |||
195 | } | 195 | } |
196 | 196 | ||
197 | static struct irq_chip titan_irq_type = { | 197 | static struct irq_chip titan_irq_type = { |
198 | .typename = "TITAN", | 198 | .name = "TITAN", |
199 | .startup = titan_startup_irq, | 199 | .startup = titan_startup_irq, |
200 | .shutdown = titan_disable_irq, | 200 | .shutdown = titan_disable_irq, |
201 | .enable = titan_enable_irq, | 201 | .enable = titan_enable_irq, |
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index e91b4c3838a8..62fd972e18ef 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c | |||
@@ -158,7 +158,7 @@ wildfire_end_irq(unsigned int irq) | |||
158 | } | 158 | } |
159 | 159 | ||
160 | static struct irq_chip wildfire_irq_type = { | 160 | static struct irq_chip wildfire_irq_type = { |
161 | .typename = "WILDFIRE", | 161 | .name = "WILDFIRE", |
162 | .startup = wildfire_startup_irq, | 162 | .startup = wildfire_startup_irq, |
163 | .shutdown = wildfire_disable_irq, | 163 | .shutdown = wildfire_disable_irq, |
164 | .enable = wildfire_enable_irq, | 164 | .enable = wildfire_enable_irq, |
diff --git a/arch/arm/include/asm/kmap_types.h b/arch/arm/include/asm/kmap_types.h index d16ec97ec9a9..c019949a5189 100644 --- a/arch/arm/include/asm/kmap_types.h +++ b/arch/arm/include/asm/kmap_types.h | |||
@@ -22,4 +22,10 @@ enum km_type { | |||
22 | KM_TYPE_NR | 22 | KM_TYPE_NR |
23 | }; | 23 | }; |
24 | 24 | ||
25 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
26 | #define KM_NMI (-1) | ||
27 | #define KM_NMI_PTE (-1) | ||
28 | #define KM_IRQ_PTE (-1) | ||
29 | #endif | ||
30 | |||
25 | #endif | 31 | #endif |
diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 2a573d4fea24..e7714f367eb8 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c | |||
@@ -662,8 +662,12 @@ static void do_signal(struct pt_regs *regs, int syscall) | |||
662 | regs->ARM_sp -= 4; | 662 | regs->ARM_sp -= 4; |
663 | usp = (u32 __user *)regs->ARM_sp; | 663 | usp = (u32 __user *)regs->ARM_sp; |
664 | 664 | ||
665 | put_user(regs->ARM_pc, usp); | 665 | if (put_user(regs->ARM_pc, usp) == 0) { |
666 | regs->ARM_pc = KERN_RESTART_CODE; | 666 | regs->ARM_pc = KERN_RESTART_CODE; |
667 | } else { | ||
668 | regs->ARM_sp += 4; | ||
669 | force_sigsegv(0, current); | ||
670 | } | ||
667 | #endif | 671 | #endif |
668 | } | 672 | } |
669 | } | 673 | } |
diff --git a/arch/arm/mach-pxa/cpufreq-pxa2xx.c b/arch/arm/mach-pxa/cpufreq-pxa2xx.c index 983cc8c20081..9e4d9816726a 100644 --- a/arch/arm/mach-pxa/cpufreq-pxa2xx.c +++ b/arch/arm/mach-pxa/cpufreq-pxa2xx.c | |||
@@ -447,6 +447,7 @@ static __init int pxa_cpufreq_init(struct cpufreq_policy *policy) | |||
447 | pxa27x_freq_table[i].frequency = freq; | 447 | pxa27x_freq_table[i].frequency = freq; |
448 | pxa27x_freq_table[i].index = i; | 448 | pxa27x_freq_table[i].index = i; |
449 | } | 449 | } |
450 | pxa27x_freq_table[i].index = i; | ||
450 | pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END; | 451 | pxa27x_freq_table[i].frequency = CPUFREQ_TABLE_END; |
451 | 452 | ||
452 | /* | 453 | /* |
diff --git a/arch/arm/mach-pxa/cpufreq-pxa3xx.c b/arch/arm/mach-pxa/cpufreq-pxa3xx.c index 67f34a8d8e60..149cdd9aee4d 100644 --- a/arch/arm/mach-pxa/cpufreq-pxa3xx.c +++ b/arch/arm/mach-pxa/cpufreq-pxa3xx.c | |||
@@ -102,7 +102,7 @@ static int setup_freqs_table(struct cpufreq_policy *policy, | |||
102 | table[i].index = i; | 102 | table[i].index = i; |
103 | table[i].frequency = freqs[i].cpufreq_mhz * 1000; | 103 | table[i].frequency = freqs[i].cpufreq_mhz * 1000; |
104 | } | 104 | } |
105 | table[num].frequency = i; | 105 | table[num].index = i; |
106 | table[num].frequency = CPUFREQ_TABLE_END; | 106 | table[num].frequency = CPUFREQ_TABLE_END; |
107 | 107 | ||
108 | pxa3xx_freqs = freqs; | 108 | pxa3xx_freqs = freqs; |
diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c index 3da45d051743..d98023f55503 100644 --- a/arch/arm/mach-pxa/spitz.c +++ b/arch/arm/mach-pxa/spitz.c | |||
@@ -802,10 +802,12 @@ static void __init spitz_init(void) | |||
802 | { | 802 | { |
803 | spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON; | 803 | spitz_ficp_platform_data.gpio_pwdown = SPITZ_GPIO_IR_ON; |
804 | 804 | ||
805 | #ifdef CONFIG_MACH_BORZOI | ||
805 | if (machine_is_borzoi()) { | 806 | if (machine_is_borzoi()) { |
806 | sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt; | 807 | sharpsl_nand_platform_data.badblock_pattern = &sharpsl_akita_bbt; |
807 | sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo; | 808 | sharpsl_nand_platform_data.ecc_layout = &akita_oobinfo; |
808 | } | 809 | } |
810 | #endif | ||
809 | 811 | ||
810 | platform_scoop_config = &spitz_pcmcia_config; | 812 | platform_scoop_config = &spitz_pcmcia_config; |
811 | 813 | ||
diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 94be7bb6cb9a..07b976da6174 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types | |||
@@ -12,7 +12,7 @@ | |||
12 | # | 12 | # |
13 | # http://www.arm.linux.org.uk/developer/machines/?action=new | 13 | # http://www.arm.linux.org.uk/developer/machines/?action=new |
14 | # | 14 | # |
15 | # Last update: Fri Sep 18 21:42:00 2009 | 15 | # Last update: Wed Nov 25 22:14:58 2009 |
16 | # | 16 | # |
17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number | 17 | # machine_is_xxx CONFIG_xxxx MACH_TYPE_xxx number |
18 | # | 18 | # |
@@ -928,7 +928,7 @@ palmt5 MACH_PALMT5 PALMT5 917 | |||
928 | palmtc MACH_PALMTC PALMTC 918 | 928 | palmtc MACH_PALMTC PALMTC 918 |
929 | omap_apollon MACH_OMAP_APOLLON OMAP_APOLLON 919 | 929 | omap_apollon MACH_OMAP_APOLLON OMAP_APOLLON 919 |
930 | mxc30030evb MACH_MXC30030EVB MXC30030EVB 920 | 930 | mxc30030evb MACH_MXC30030EVB MXC30030EVB 920 |
931 | rea_2d MACH_REA_2D REA_2D 921 | 931 | rea_cpu2 MACH_REA_2D REA_2D 921 |
932 | eti3e524 MACH_TI3E524 TI3E524 922 | 932 | eti3e524 MACH_TI3E524 TI3E524 922 |
933 | ateb9200 MACH_ATEB9200 ATEB9200 923 | 933 | ateb9200 MACH_ATEB9200 ATEB9200 923 |
934 | auckland MACH_AUCKLAND AUCKLAND 924 | 934 | auckland MACH_AUCKLAND AUCKLAND 924 |
@@ -2421,3 +2421,118 @@ liberty MACH_LIBERTY LIBERTY 2434 | |||
2421 | mh355 MACH_MH355 MH355 2435 | 2421 | mh355 MACH_MH355 MH355 2435 |
2422 | pc7802 MACH_PC7802 PC7802 2436 | 2422 | pc7802 MACH_PC7802 PC7802 2436 |
2423 | gnet_sgc MACH_GNET_SGC GNET_SGC 2437 | 2423 | gnet_sgc MACH_GNET_SGC GNET_SGC 2437 |
2424 | einstein15 MACH_EINSTEIN15 EINSTEIN15 2438 | ||
2425 | cmpd MACH_CMPD CMPD 2439 | ||
2426 | davinci_hase1 MACH_DAVINCI_HASE1 DAVINCI_HASE1 2440 | ||
2427 | lgeincitephone MACH_LGEINCITEPHONE LGEINCITEPHONE 2441 | ||
2428 | ea313x MACH_EA313X EA313X 2442 | ||
2429 | fwbd_39064 MACH_FWBD_39064 FWBD_39064 2443 | ||
2430 | fwbd_390128 MACH_FWBD_390128 FWBD_390128 2444 | ||
2431 | pelco_moe MACH_PELCO_MOE PELCO_MOE 2445 | ||
2432 | minimix27 MACH_MINIMIX27 MINIMIX27 2446 | ||
2433 | omap3_thunder MACH_OMAP3_THUNDER OMAP3_THUNDER 2447 | ||
2434 | passionc MACH_PASSIONC PASSIONC 2448 | ||
2435 | mx27amata MACH_MX27AMATA MX27AMATA 2449 | ||
2436 | bgat1 MACH_BGAT1 BGAT1 2450 | ||
2437 | buzz MACH_BUZZ BUZZ 2451 | ||
2438 | mb9g20 MACH_MB9G20 MB9G20 2452 | ||
2439 | yushan MACH_YUSHAN YUSHAN 2453 | ||
2440 | lizard MACH_LIZARD LIZARD 2454 | ||
2441 | omap3polycom MACH_OMAP3POLYCOM OMAP3POLYCOM 2455 | ||
2442 | smdkv210 MACH_SMDKV210 SMDKV210 2456 | ||
2443 | bravo MACH_BRAVO BRAVO 2457 | ||
2444 | siogentoo1 MACH_SIOGENTOO1 SIOGENTOO1 2458 | ||
2445 | siogentoo2 MACH_SIOGENTOO2 SIOGENTOO2 2459 | ||
2446 | sm3k MACH_SM3K SM3K 2460 | ||
2447 | acer_tempo_f900 MACH_ACER_TEMPO_F900 ACER_TEMPO_F900 2461 | ||
2448 | sst61vc010_dev MACH_SST61VC010_DEV SST61VC010_DEV 2462 | ||
2449 | glittertind MACH_GLITTERTIND GLITTERTIND 2463 | ||
2450 | omap_zoom3 MACH_OMAP_ZOOM3 OMAP_ZOOM3 2464 | ||
2451 | omap_3630sdp MACH_OMAP_3630SDP OMAP_3630SDP 2465 | ||
2452 | cybook2440 MACH_CYBOOK2440 CYBOOK2440 2466 | ||
2453 | torino_s MACH_TORINO_S TORINO_S 2467 | ||
2454 | havana MACH_HAVANA HAVANA 2468 | ||
2455 | beaumont_11 MACH_BEAUMONT_11 BEAUMONT_11 2469 | ||
2456 | vanguard MACH_VANGUARD VANGUARD 2470 | ||
2457 | s5pc110_draco MACH_S5PC110_DRACO S5PC110_DRACO 2471 | ||
2458 | cartesio_two MACH_CARTESIO_TWO CARTESIO_TWO 2472 | ||
2459 | aster MACH_ASTER ASTER 2473 | ||
2460 | voguesv210 MACH_VOGUESV210 VOGUESV210 2474 | ||
2461 | acm500x MACH_ACM500X ACM500X 2475 | ||
2462 | km9260 MACH_KM9260 KM9260 2476 | ||
2463 | nideflexg1 MACH_NIDEFLEXG1 NIDEFLEXG1 2477 | ||
2464 | ctera_plug_io MACH_CTERA_PLUG_IO CTERA_PLUG_IO 2478 | ||
2465 | smartq7 MACH_SMARTQ7 SMARTQ7 2479 | ||
2466 | at91sam9g10ek2 MACH_AT91SAM9G10EK2 AT91SAM9G10EK2 2480 | ||
2467 | asusp527 MACH_ASUSP527 ASUSP527 2481 | ||
2468 | at91sam9g20mpm2 MACH_AT91SAM9G20MPM2 AT91SAM9G20MPM2 2482 | ||
2469 | topasa900 MACH_TOPASA900 TOPASA900 2483 | ||
2470 | electrum_100 MACH_ELECTRUM_100 ELECTRUM_100 2484 | ||
2471 | mx51grb MACH_MX51GRB MX51GRB 2485 | ||
2472 | xea300 MACH_XEA300 XEA300 2486 | ||
2473 | htcstartrek MACH_HTCSTARTREK HTCSTARTREK 2487 | ||
2474 | lima MACH_LIMA LIMA 2488 | ||
2475 | csb740 MACH_CSB740 CSB740 2489 | ||
2476 | usb_s8815 MACH_USB_S8815 USB_S8815 2490 | ||
2477 | watson_efm_plugin MACH_WATSON_EFM_PLUGIN WATSON_EFM_PLUGIN 2491 | ||
2478 | milkyway MACH_MILKYWAY MILKYWAY 2492 | ||
2479 | g4evm MACH_G4EVM G4EVM 2493 | ||
2480 | picomod6 MACH_PICOMOD6 PICOMOD6 2494 | ||
2481 | omapl138_hawkboard MACH_OMAPL138_HAWKBOARD OMAPL138_HAWKBOARD 2495 | ||
2482 | ip6000 MACH_IP6000 IP6000 2496 | ||
2483 | ip6010 MACH_IP6010 IP6010 2497 | ||
2484 | utm400 MACH_UTM400 UTM400 2498 | ||
2485 | omap3_zybex MACH_OMAP3_ZYBEX OMAP3_ZYBEX 2499 | ||
2486 | wireless_space MACH_WIRELESS_SPACE WIRELESS_SPACE 2500 | ||
2487 | sx560 MACH_SX560 SX560 2501 | ||
2488 | ts41x MACH_TS41X TS41X 2502 | ||
2489 | elphel10373 MACH_ELPHEL10373 ELPHEL10373 2503 | ||
2490 | rhobot MACH_RHOBOT RHOBOT 2504 | ||
2491 | mx51_refresh MACH_MX51_REFRESH MX51_REFRESH 2505 | ||
2492 | ls9260 MACH_LS9260 LS9260 2506 | ||
2493 | shank MACH_SHANK SHANK 2507 | ||
2494 | qsd8x50_st1 MACH_QSD8X50_ST1 QSD8X50_ST1 2508 | ||
2495 | at91sam9m10ekes MACH_AT91SAM9M10EKES AT91SAM9M10EKES 2509 | ||
2496 | hiram MACH_HIRAM HIRAM 2510 | ||
2497 | phy3250 MACH_PHY3250 PHY3250 2511 | ||
2498 | ea3250 MACH_EA3250 EA3250 2512 | ||
2499 | fdi3250 MACH_FDI3250 FDI3250 2513 | ||
2500 | whitestone MACH_WHITESTONE WHITESTONE 2514 | ||
2501 | at91sam9263nit MACH_AT91SAM9263NIT AT91SAM9263NIT 2515 | ||
2502 | ccmx51 MACH_CCMX51 CCMX51 2516 | ||
2503 | ccmx51js MACH_CCMX51JS CCMX51JS 2517 | ||
2504 | ccwmx51 MACH_CCWMX51 CCWMX51 2518 | ||
2505 | ccwmx51js MACH_CCWMX51JS CCWMX51JS 2519 | ||
2506 | mini6410 MACH_MINI6410 MINI6410 2520 | ||
2507 | tiny6410 MACH_TINY6410 TINY6410 2521 | ||
2508 | nano6410 MACH_NANO6410 NANO6410 2522 | ||
2509 | at572d940hfnldb MACH_AT572D940HFNLDB AT572D940HFNLDB 2523 | ||
2510 | htcleo MACH_HTCLEO HTCLEO 2524 | ||
2511 | avp13 MACH_AVP13 AVP13 2525 | ||
2512 | xxsvideod MACH_XXSVIDEOD XXSVIDEOD 2526 | ||
2513 | vpnext MACH_VPNEXT VPNEXT 2527 | ||
2514 | swarco_itc3 MACH_SWARCO_ITC3 SWARCO_ITC3 2528 | ||
2515 | tx51 MACH_TX51 TX51 2529 | ||
2516 | dolby_cat1021 MACH_DOLBY_CAT1021 DOLBY_CAT1021 2530 | ||
2517 | mx28evk MACH_MX28EVK MX28EVK 2531 | ||
2518 | phoenix260 MACH_PHOENIX260 PHOENIX260 2532 | ||
2519 | uvaca_stork MACH_UVACA_STORK UVACA_STORK 2533 | ||
2520 | smartq5 MACH_SMARTQ5 SMARTQ5 2534 | ||
2521 | all3078 MACH_ALL3078 ALL3078 2535 | ||
2522 | ctera_2bay_ds MACH_CTERA_2BAY_DS CTERA_2BAY_DS 2536 | ||
2523 | siogentoo3 MACH_SIOGENTOO3 SIOGENTOO3 2537 | ||
2524 | epb5000 MACH_EPB5000 EPB5000 2538 | ||
2525 | hy9263 MACH_HY9263 HY9263 2539 | ||
2526 | acer_tempo_m900 MACH_ACER_TEMPO_M900 ACER_TEMPO_M900 2540 | ||
2527 | acer_tempo_dx650 MACH_ACER_TEMPO_DX900 ACER_TEMPO_DX900 2541 | ||
2528 | acer_tempo_x960 MACH_ACER_TEMPO_X960 ACER_TEMPO_X960 2542 | ||
2529 | acer_eten_v900 MACH_ACER_ETEN_V900 ACER_ETEN_V900 2543 | ||
2530 | acer_eten_x900 MACH_ACER_ETEN_X900 ACER_ETEN_X900 2544 | ||
2531 | bonnell MACH_BONNELL BONNELL 2545 | ||
2532 | oht_mx27 MACH_OHT_MX27 OHT_MX27 2546 | ||
2533 | htcquartz MACH_HTCQUARTZ HTCQUARTZ 2547 | ||
2534 | davinci_dm6467tevm MACH_DAVINCI_DM6467TEVM DAVINCI_DM6467TEVM 2548 | ||
2535 | c3ax03 MACH_C3AX03 C3AX03 2549 | ||
2536 | mxt_td60 MACH_MXT_TD60 MXT_TD60 2550 | ||
2537 | esyx MACH_ESYX ESYX 2551 | ||
2538 | bulldog MACH_BULLDOG BULLDOG 2553 | ||
diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c index 1f170216d2f9..3946aff4f414 100644 --- a/arch/blackfin/kernel/bfin_dma_5xx.c +++ b/arch/blackfin/kernel/bfin_dma_5xx.c | |||
@@ -225,8 +225,13 @@ int blackfin_dma_suspend(void) | |||
225 | void blackfin_dma_resume(void) | 225 | void blackfin_dma_resume(void) |
226 | { | 226 | { |
227 | int i; | 227 | int i; |
228 | for (i = 0; i < MAX_DMA_SUSPEND_CHANNELS; ++i) | 228 | |
229 | dma_ch[i].regs->peripheral_map = dma_ch[i].saved_peripheral_map; | 229 | for (i = 0; i < MAX_DMA_CHANNELS; ++i) { |
230 | dma_ch[i].regs->cfg = 0; | ||
231 | |||
232 | if (i < MAX_DMA_SUSPEND_CHANNELS) | ||
233 | dma_ch[i].regs->peripheral_map = dma_ch[i].saved_peripheral_map; | ||
234 | } | ||
230 | } | 235 | } |
231 | #endif | 236 | #endif |
232 | 237 | ||
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbinit.c b/arch/blackfin/kernel/cplb-mpu/cplbinit.c index f7b9cdce8239..b52c1f8c4bc0 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbinit.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbinit.c | |||
@@ -38,7 +38,7 @@ void __init generate_cplb_tables_cpu(unsigned int cpu) | |||
38 | 38 | ||
39 | #ifdef CONFIG_BFIN_EXTMEM_DCACHEABLE | 39 | #ifdef CONFIG_BFIN_EXTMEM_DCACHEABLE |
40 | d_cache = CPLB_L1_CHBL; | 40 | d_cache = CPLB_L1_CHBL; |
41 | #ifdef CONFIG_BFIN_EXTMEM_WRITETROUGH | 41 | #ifdef CONFIG_BFIN_EXTMEM_WRITETHROUGH |
42 | d_cache |= CPLB_L1_AOW | CPLB_WT; | 42 | d_cache |= CPLB_L1_AOW | CPLB_WT; |
43 | #endif | 43 | #endif |
44 | #endif | 44 | #endif |
diff --git a/arch/blackfin/kernel/process.c b/arch/blackfin/kernel/process.c index 430ae39456e8..5cc7e2e9e415 100644 --- a/arch/blackfin/kernel/process.c +++ b/arch/blackfin/kernel/process.c | |||
@@ -151,7 +151,7 @@ void start_thread(struct pt_regs *regs, unsigned long new_ip, unsigned long new_ | |||
151 | regs->pc = new_ip; | 151 | regs->pc = new_ip; |
152 | if (current->mm) | 152 | if (current->mm) |
153 | regs->p5 = current->mm->start_data; | 153 | regs->p5 = current->mm->start_data; |
154 | #ifdef CONFIG_SMP | 154 | #ifndef CONFIG_SMP |
155 | task_thread_info(current)->l1_task_info.stack_start = | 155 | task_thread_info(current)->l1_task_info.stack_start = |
156 | (void *)current->mm->context.stack_start; | 156 | (void *)current->mm->context.stack_start; |
157 | task_thread_info(current)->l1_task_info.lowest_sp = (void *)new_sp; | 157 | task_thread_info(current)->l1_task_info.lowest_sp = (void *)new_sp; |
diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index 0982b5d5af10..56b0ba12175f 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
@@ -315,7 +315,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
315 | case BFIN_MEM_ACCESS_CORE: | 315 | case BFIN_MEM_ACCESS_CORE: |
316 | case BFIN_MEM_ACCESS_CORE_ONLY: | 316 | case BFIN_MEM_ACCESS_CORE_ONLY: |
317 | copied = access_process_vm(child, addr, &data, | 317 | copied = access_process_vm(child, addr, &data, |
318 | to_copy, 0); | 318 | to_copy, 1); |
319 | if (copied) | 319 | if (copied) |
320 | break; | 320 | break; |
321 | 321 | ||
diff --git a/arch/blackfin/mach-bf518/include/mach/anomaly.h b/arch/blackfin/mach-bf518/include/mach/anomaly.h index e9c65390edd1..2829dd0400f1 100644 --- a/arch/blackfin/mach-bf518/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf518/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf518/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -70,6 +74,10 @@ | |||
70 | #define ANOMALY_05000461 (1) | 74 | #define ANOMALY_05000461 (1) |
71 | /* Synchronization Problem at Startup May Cause SPORT Transmit Channels to Misalign */ | 75 | /* Synchronization Problem at Startup May Cause SPORT Transmit Channels to Misalign */ |
72 | #define ANOMALY_05000462 (1) | 76 | #define ANOMALY_05000462 (1) |
77 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
78 | #define ANOMALY_05000473 (1) | ||
79 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
80 | #define ANOMALY_05000477 (1) | ||
73 | 81 | ||
74 | /* Anomalies that don't exist on this proc */ | 82 | /* Anomalies that don't exist on this proc */ |
75 | #define ANOMALY_05000099 (0) | 83 | #define ANOMALY_05000099 (0) |
@@ -133,5 +141,7 @@ | |||
133 | #define ANOMALY_05000450 (0) | 141 | #define ANOMALY_05000450 (0) |
134 | #define ANOMALY_05000465 (0) | 142 | #define ANOMALY_05000465 (0) |
135 | #define ANOMALY_05000467 (0) | 143 | #define ANOMALY_05000467 (0) |
144 | #define ANOMALY_05000474 (0) | ||
145 | #define ANOMALY_05000475 (0) | ||
136 | 146 | ||
137 | #endif | 147 | #endif |
diff --git a/arch/blackfin/mach-bf527/include/mach/anomaly.h b/arch/blackfin/mach-bf527/include/mach/anomaly.h index 3f9052687fa8..02040df8ec80 100644 --- a/arch/blackfin/mach-bf527/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf527/include/mach/anomaly.h | |||
@@ -1,14 +1,18 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf527/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
10 | * - Revision D, 08/14/2009; ADSP-BF526 Blackfin Processor Anomaly List | 14 | * - Revision D, 08/14/2009; ADSP-BF526 Blackfin Processor Anomaly List |
11 | * - Revision F, 03/03/2009; ADSP-BF527 Blackfin Processor Anomaly List | 15 | * - Revision G, 08/25/2009; ADSP-BF527 Blackfin Processor Anomaly List |
12 | */ | 16 | */ |
13 | 17 | ||
14 | #ifndef _MACH_ANOMALY_H_ | 18 | #ifndef _MACH_ANOMALY_H_ |
@@ -200,6 +204,10 @@ | |||
200 | #define ANOMALY_05000467 (1) | 204 | #define ANOMALY_05000467 (1) |
201 | /* PLL Latches Incorrect Settings During Reset */ | 205 | /* PLL Latches Incorrect Settings During Reset */ |
202 | #define ANOMALY_05000469 (1) | 206 | #define ANOMALY_05000469 (1) |
207 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
208 | #define ANOMALY_05000473 (1) | ||
209 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
210 | #define ANOMALY_05000477 (1) | ||
203 | 211 | ||
204 | /* Anomalies that don't exist on this proc */ | 212 | /* Anomalies that don't exist on this proc */ |
205 | #define ANOMALY_05000099 (0) | 213 | #define ANOMALY_05000099 (0) |
@@ -250,5 +258,7 @@ | |||
250 | #define ANOMALY_05000412 (0) | 258 | #define ANOMALY_05000412 (0) |
251 | #define ANOMALY_05000447 (0) | 259 | #define ANOMALY_05000447 (0) |
252 | #define ANOMALY_05000448 (0) | 260 | #define ANOMALY_05000448 (0) |
261 | #define ANOMALY_05000474 (0) | ||
262 | #define ANOMALY_05000475 (0) | ||
253 | 263 | ||
254 | #endif | 264 | #endif |
diff --git a/arch/blackfin/mach-bf533/include/mach/anomaly.h b/arch/blackfin/mach-bf533/include/mach/anomaly.h index cd83db2fb1a1..9b3f7a27714d 100644 --- a/arch/blackfin/mach-bf533/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf533/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf533/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -202,6 +206,10 @@ | |||
202 | #define ANOMALY_05000443 (1) | 206 | #define ANOMALY_05000443 (1) |
203 | /* False Hardware Error when RETI Points to Invalid Memory */ | 207 | /* False Hardware Error when RETI Points to Invalid Memory */ |
204 | #define ANOMALY_05000461 (1) | 208 | #define ANOMALY_05000461 (1) |
209 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
210 | #define ANOMALY_05000473 (1) | ||
211 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
212 | #define ANOMALY_05000477 (1) | ||
205 | 213 | ||
206 | /* These anomalies have been "phased" out of analog.com anomaly sheets and are | 214 | /* These anomalies have been "phased" out of analog.com anomaly sheets and are |
207 | * here to show running on older silicon just isn't feasible. | 215 | * here to show running on older silicon just isn't feasible. |
@@ -349,5 +357,7 @@ | |||
349 | #define ANOMALY_05000450 (0) | 357 | #define ANOMALY_05000450 (0) |
350 | #define ANOMALY_05000465 (0) | 358 | #define ANOMALY_05000465 (0) |
351 | #define ANOMALY_05000467 (0) | 359 | #define ANOMALY_05000467 (0) |
360 | #define ANOMALY_05000474 (0) | ||
361 | #define ANOMALY_05000475 (0) | ||
352 | 362 | ||
353 | #endif | 363 | #endif |
diff --git a/arch/blackfin/mach-bf537/include/mach/anomaly.h b/arch/blackfin/mach-bf537/include/mach/anomaly.h index f091ad2d8ea8..d2c427bc6656 100644 --- a/arch/blackfin/mach-bf537/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf537/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf537/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -156,6 +160,10 @@ | |||
156 | #define ANOMALY_05000443 (1) | 160 | #define ANOMALY_05000443 (1) |
157 | /* False Hardware Error when RETI Points to Invalid Memory */ | 161 | /* False Hardware Error when RETI Points to Invalid Memory */ |
158 | #define ANOMALY_05000461 (1) | 162 | #define ANOMALY_05000461 (1) |
163 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
164 | #define ANOMALY_05000473 (1) | ||
165 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
166 | #define ANOMALY_05000477 (1) | ||
159 | 167 | ||
160 | /* Anomalies that don't exist on this proc */ | 168 | /* Anomalies that don't exist on this proc */ |
161 | #define ANOMALY_05000099 (0) | 169 | #define ANOMALY_05000099 (0) |
@@ -202,5 +210,7 @@ | |||
202 | #define ANOMALY_05000450 (0) | 210 | #define ANOMALY_05000450 (0) |
203 | #define ANOMALY_05000465 (0) | 211 | #define ANOMALY_05000465 (0) |
204 | #define ANOMALY_05000467 (0) | 212 | #define ANOMALY_05000467 (0) |
213 | #define ANOMALY_05000474 (0) | ||
214 | #define ANOMALY_05000475 (0) | ||
205 | 215 | ||
206 | #endif | 216 | #endif |
diff --git a/arch/blackfin/mach-bf538/include/mach/anomaly.h b/arch/blackfin/mach-bf538/include/mach/anomaly.h index 26b76083e14c..d882b7e6f59b 100644 --- a/arch/blackfin/mach-bf538/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf538/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf538/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -128,6 +132,10 @@ | |||
128 | #define ANOMALY_05000443 (1) | 132 | #define ANOMALY_05000443 (1) |
129 | /* False Hardware Error when RETI Points to Invalid Memory */ | 133 | /* False Hardware Error when RETI Points to Invalid Memory */ |
130 | #define ANOMALY_05000461 (1) | 134 | #define ANOMALY_05000461 (1) |
135 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
136 | #define ANOMALY_05000473 (1) | ||
137 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
138 | #define ANOMALY_05000477 (1) | ||
131 | 139 | ||
132 | /* Anomalies that don't exist on this proc */ | 140 | /* Anomalies that don't exist on this proc */ |
133 | #define ANOMALY_05000099 (0) | 141 | #define ANOMALY_05000099 (0) |
@@ -176,5 +184,7 @@ | |||
176 | #define ANOMALY_05000450 (0) | 184 | #define ANOMALY_05000450 (0) |
177 | #define ANOMALY_05000465 (0) | 185 | #define ANOMALY_05000465 (0) |
178 | #define ANOMALY_05000467 (0) | 186 | #define ANOMALY_05000467 (0) |
187 | #define ANOMALY_05000474 (0) | ||
188 | #define ANOMALY_05000475 (0) | ||
179 | 189 | ||
180 | #endif | 190 | #endif |
diff --git a/arch/blackfin/mach-bf548/include/mach/anomaly.h b/arch/blackfin/mach-bf548/include/mach/anomaly.h index 52b116ae522a..7d08c7524498 100644 --- a/arch/blackfin/mach-bf548/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf548/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf548/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -24,6 +28,8 @@ | |||
24 | #define ANOMALY_05000119 (1) | 28 | #define ANOMALY_05000119 (1) |
25 | /* Rx.H Cannot Be Used to Access 16-bit System MMR Registers */ | 29 | /* Rx.H Cannot Be Used to Access 16-bit System MMR Registers */ |
26 | #define ANOMALY_05000122 (1) | 30 | #define ANOMALY_05000122 (1) |
31 | /* Data Corruption with Cached External Memory and Non-Cached On-Chip L2 Memory */ | ||
32 | #define ANOMALY_05000220 (1) | ||
27 | /* False Hardware Error from an Access in the Shadow of a Conditional Branch */ | 33 | /* False Hardware Error from an Access in the Shadow of a Conditional Branch */ |
28 | #define ANOMALY_05000245 (1) | 34 | #define ANOMALY_05000245 (1) |
29 | /* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */ | 35 | /* Sensitivity To Noise with Slow Input Edge Rates on External SPORT TX and RX Clocks */ |
@@ -200,6 +206,14 @@ | |||
200 | #define ANOMALY_05000466 (1) | 206 | #define ANOMALY_05000466 (1) |
201 | /* Possible RX data corruption when control & data EP FIFOs are accessed via the core */ | 207 | /* Possible RX data corruption when control & data EP FIFOs are accessed via the core */ |
202 | #define ANOMALY_05000467 (1) | 208 | #define ANOMALY_05000467 (1) |
209 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
210 | #define ANOMALY_05000473 (1) | ||
211 | /* Access to DDR-SDRAM causes system hang under certain PLL/VR settings */ | ||
212 | #define ANOMALY_05000474 (1) | ||
213 | /* Core Hang With L2/L3 Configured in Writeback Cache Mode */ | ||
214 | #define ANOMALY_05000475 (1) | ||
215 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
216 | #define ANOMALY_05000477 (1) | ||
203 | 217 | ||
204 | /* Anomalies that don't exist on this proc */ | 218 | /* Anomalies that don't exist on this proc */ |
205 | #define ANOMALY_05000099 (0) | 219 | #define ANOMALY_05000099 (0) |
@@ -215,7 +229,6 @@ | |||
215 | #define ANOMALY_05000198 (0) | 229 | #define ANOMALY_05000198 (0) |
216 | #define ANOMALY_05000202 (0) | 230 | #define ANOMALY_05000202 (0) |
217 | #define ANOMALY_05000215 (0) | 231 | #define ANOMALY_05000215 (0) |
218 | #define ANOMALY_05000220 (0) | ||
219 | #define ANOMALY_05000227 (0) | 232 | #define ANOMALY_05000227 (0) |
220 | #define ANOMALY_05000230 (0) | 233 | #define ANOMALY_05000230 (0) |
221 | #define ANOMALY_05000231 (0) | 234 | #define ANOMALY_05000231 (0) |
diff --git a/arch/blackfin/mach-bf561/atomic.S b/arch/blackfin/mach-bf561/atomic.S index 0261a5e751b3..f99f174b129f 100644 --- a/arch/blackfin/mach-bf561/atomic.S +++ b/arch/blackfin/mach-bf561/atomic.S | |||
@@ -19,6 +19,16 @@ | |||
19 | \reg\().h = _corelock; | 19 | \reg\().h = _corelock; |
20 | .endm | 20 | .endm |
21 | 21 | ||
22 | .macro safe_testset addr:req, scratch:req | ||
23 | #if ANOMALY_05000477 | ||
24 | cli \scratch; | ||
25 | testset (\addr); | ||
26 | sti \scratch; | ||
27 | #else | ||
28 | testset (\addr); | ||
29 | #endif | ||
30 | .endm | ||
31 | |||
22 | /* | 32 | /* |
23 | * r0 = address of atomic data to flush and invalidate (32bit). | 33 | * r0 = address of atomic data to flush and invalidate (32bit). |
24 | * | 34 | * |
@@ -33,7 +43,7 @@ ENTRY(_get_core_lock) | |||
33 | cli r0; | 43 | cli r0; |
34 | coreslot_loadaddr p0; | 44 | coreslot_loadaddr p0; |
35 | .Lretry_corelock: | 45 | .Lretry_corelock: |
36 | testset (p0); | 46 | safe_testset p0, r2; |
37 | if cc jump .Ldone_corelock; | 47 | if cc jump .Ldone_corelock; |
38 | SSYNC(r2); | 48 | SSYNC(r2); |
39 | jump .Lretry_corelock | 49 | jump .Lretry_corelock |
@@ -56,7 +66,7 @@ ENTRY(_get_core_lock_noflush) | |||
56 | cli r0; | 66 | cli r0; |
57 | coreslot_loadaddr p0; | 67 | coreslot_loadaddr p0; |
58 | .Lretry_corelock_noflush: | 68 | .Lretry_corelock_noflush: |
59 | testset (p0); | 69 | safe_testset p0, r2; |
60 | if cc jump .Ldone_corelock_noflush; | 70 | if cc jump .Ldone_corelock_noflush; |
61 | SSYNC(r2); | 71 | SSYNC(r2); |
62 | jump .Lretry_corelock_noflush | 72 | jump .Lretry_corelock_noflush |
diff --git a/arch/blackfin/mach-bf561/include/mach/anomaly.h b/arch/blackfin/mach-bf561/include/mach/anomaly.h index 70da495c9665..5ddc981e9937 100644 --- a/arch/blackfin/mach-bf561/include/mach/anomaly.h +++ b/arch/blackfin/mach-bf561/include/mach/anomaly.h | |||
@@ -1,9 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * File: include/asm-blackfin/mach-bf561/anomaly.h | 2 | * DO NOT EDIT THIS FILE |
3 | * Bugs: Enter bugs at http://blackfin.uclinux.org/ | 3 | * This file is under version control at |
4 | * svn://sources.blackfin.uclinux.org/toolchain/trunk/proc-defs/header-frags/ | ||
5 | * and can be replaced with that version at any time | ||
6 | * DO NOT EDIT THIS FILE | ||
4 | * | 7 | * |
5 | * Copyright (C) 2004-2009 Analog Devices Inc. | 8 | * Copyright 2004-2009 Analog Devices Inc. |
6 | * Licensed under the GPL-2 or later. | 9 | * Licensed under the ADI BSD license. |
10 | * https://docs.blackfin.uclinux.org/doku.php?id=adi_bsd | ||
7 | */ | 11 | */ |
8 | 12 | ||
9 | /* This file should be up to date with: | 13 | /* This file should be up to date with: |
@@ -213,7 +217,11 @@ | |||
213 | /* Disabling Peripherals with DMA Running May Cause DMA System Instability */ | 217 | /* Disabling Peripherals with DMA Running May Cause DMA System Instability */ |
214 | #define ANOMALY_05000278 (__SILICON_REVISION__ < 5) | 218 | #define ANOMALY_05000278 (__SILICON_REVISION__ < 5) |
215 | /* False Hardware Error Exception when ISR Context Is Not Restored */ | 219 | /* False Hardware Error Exception when ISR Context Is Not Restored */ |
216 | #define ANOMALY_05000281 (__SILICON_REVISION__ < 5) | 220 | /* Temporarily walk around for bug 5423 till this issue is confirmed by |
221 | * official anomaly document. It looks 05000281 still exists on bf561 | ||
222 | * v0.5. | ||
223 | */ | ||
224 | #define ANOMALY_05000281 (__SILICON_REVISION__ <= 5) | ||
217 | /* System MMR Write Is Stalled Indefinitely when Killed in a Particular Stage */ | 225 | /* System MMR Write Is Stalled Indefinitely when Killed in a Particular Stage */ |
218 | #define ANOMALY_05000283 (1) | 226 | #define ANOMALY_05000283 (1) |
219 | /* Reads Will Receive Incorrect Data under Certain Conditions */ | 227 | /* Reads Will Receive Incorrect Data under Certain Conditions */ |
@@ -280,6 +288,12 @@ | |||
280 | #define ANOMALY_05000443 (1) | 288 | #define ANOMALY_05000443 (1) |
281 | /* False Hardware Error when RETI Points to Invalid Memory */ | 289 | /* False Hardware Error when RETI Points to Invalid Memory */ |
282 | #define ANOMALY_05000461 (1) | 290 | #define ANOMALY_05000461 (1) |
291 | /* Interrupted 32-Bit SPORT Data Register Access Results In Underflow */ | ||
292 | #define ANOMALY_05000473 (1) | ||
293 | /* Core Hang With L2/L3 Configured in Writeback Cache Mode */ | ||
294 | #define ANOMALY_05000475 (__SILICON_REVISION__ < 4) | ||
295 | /* TESTSET Instruction Cannot Be Interrupted */ | ||
296 | #define ANOMALY_05000477 (1) | ||
283 | 297 | ||
284 | /* Anomalies that don't exist on this proc */ | 298 | /* Anomalies that don't exist on this proc */ |
285 | #define ANOMALY_05000119 (0) | 299 | #define ANOMALY_05000119 (0) |
@@ -304,5 +318,6 @@ | |||
304 | #define ANOMALY_05000450 (0) | 318 | #define ANOMALY_05000450 (0) |
305 | #define ANOMALY_05000465 (0) | 319 | #define ANOMALY_05000465 (0) |
306 | #define ANOMALY_05000467 (0) | 320 | #define ANOMALY_05000467 (0) |
321 | #define ANOMALY_05000474 (0) | ||
307 | 322 | ||
308 | #endif | 323 | #endif |
diff --git a/arch/blackfin/mach-common/arch_checks.c b/arch/blackfin/mach-common/arch_checks.c index 9dbafcdcf479..f2ca211a76a0 100644 --- a/arch/blackfin/mach-common/arch_checks.c +++ b/arch/blackfin/mach-common/arch_checks.c | |||
@@ -57,3 +57,8 @@ | |||
57 | (!defined(CONFIG_BFIN_EXTMEM_DCACHEABLE) && defined(CONFIG_BFIN_L2_WRITEBACK))) | 57 | (!defined(CONFIG_BFIN_EXTMEM_DCACHEABLE) && defined(CONFIG_BFIN_L2_WRITEBACK))) |
58 | # error You are exposing Anomaly 220 in this config, either config L2 as Write Through, or make External Memory WB. | 58 | # error You are exposing Anomaly 220 in this config, either config L2 as Write Through, or make External Memory WB. |
59 | #endif | 59 | #endif |
60 | |||
61 | #if ANOMALY_05000475 && \ | ||
62 | (defined(CONFIG_BFIN_EXTMEM_WRITEBACK) || defined(CONFIG_BFIN_L2_WRITEBACK)) | ||
63 | # error "Anomaly 475 does not allow you to use Write Back cache with L2 or External Memory" | ||
64 | #endif | ||
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index d98585f3237d..d92b168c8328 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c | |||
@@ -276,10 +276,9 @@ void smp_send_reschedule(int cpu) | |||
276 | if (cpu_is_offline(cpu)) | 276 | if (cpu_is_offline(cpu)) |
277 | return; | 277 | return; |
278 | 278 | ||
279 | msg = kmalloc(sizeof(*msg), GFP_ATOMIC); | 279 | msg = kzalloc(sizeof(*msg), GFP_ATOMIC); |
280 | if (!msg) | 280 | if (!msg) |
281 | return; | 281 | return; |
282 | memset(msg, 0, sizeof(msg)); | ||
283 | INIT_LIST_HEAD(&msg->list); | 282 | INIT_LIST_HEAD(&msg->list); |
284 | msg->type = BFIN_IPI_RESCHEDULE; | 283 | msg->type = BFIN_IPI_RESCHEDULE; |
285 | 284 | ||
@@ -305,10 +304,9 @@ void smp_send_stop(void) | |||
305 | if (cpus_empty(callmap)) | 304 | if (cpus_empty(callmap)) |
306 | return; | 305 | return; |
307 | 306 | ||
308 | msg = kmalloc(sizeof(*msg), GFP_ATOMIC); | 307 | msg = kzalloc(sizeof(*msg), GFP_ATOMIC); |
309 | if (!msg) | 308 | if (!msg) |
310 | return; | 309 | return; |
311 | memset(msg, 0, sizeof(msg)); | ||
312 | INIT_LIST_HEAD(&msg->list); | 310 | INIT_LIST_HEAD(&msg->list); |
313 | msg->type = BFIN_IPI_CPU_STOP; | 311 | msg->type = BFIN_IPI_CPU_STOP; |
314 | 312 | ||
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index 1aad0d9f5074..fd7620f025fa 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
@@ -358,7 +358,14 @@ config SGI_IP22 | |||
358 | select SWAP_IO_SPACE | 358 | select SWAP_IO_SPACE |
359 | select SYS_HAS_CPU_R4X00 | 359 | select SYS_HAS_CPU_R4X00 |
360 | select SYS_HAS_CPU_R5000 | 360 | select SYS_HAS_CPU_R5000 |
361 | select SYS_HAS_EARLY_PRINTK | 361 | # |
362 | # Disable EARLY_PRINTK for now since it leads to overwritten prom | ||
363 | # memory during early boot on some machines. | ||
364 | # | ||
365 | # See http://www.linux-mips.org/cgi-bin/mesg.cgi?a=linux-mips&i=20091119164009.GA15038%40deprecation.cyrius.com | ||
366 | # for a more details discussion | ||
367 | # | ||
368 | # select SYS_HAS_EARLY_PRINTK | ||
362 | select SYS_SUPPORTS_32BIT_KERNEL | 369 | select SYS_SUPPORTS_32BIT_KERNEL |
363 | select SYS_SUPPORTS_64BIT_KERNEL | 370 | select SYS_SUPPORTS_64BIT_KERNEL |
364 | select SYS_SUPPORTS_BIG_ENDIAN | 371 | select SYS_SUPPORTS_BIG_ENDIAN |
@@ -410,7 +417,14 @@ config SGI_IP28 | |||
410 | select SGI_HAS_ZILOG | 417 | select SGI_HAS_ZILOG |
411 | select SWAP_IO_SPACE | 418 | select SWAP_IO_SPACE |
412 | select SYS_HAS_CPU_R10000 | 419 | select SYS_HAS_CPU_R10000 |
413 | select SYS_HAS_EARLY_PRINTK | 420 | # |
421 | # Disable EARLY_PRINTK for now since it leads to overwritten prom | ||
422 | # memory during early boot on some machines. | ||
423 | # | ||
424 | # See http://www.linux-mips.org/cgi-bin/mesg.cgi?a=linux-mips&i=20091119164009.GA15038%40deprecation.cyrius.com | ||
425 | # for a more details discussion | ||
426 | # | ||
427 | # select SYS_HAS_EARLY_PRINTK | ||
414 | select SYS_SUPPORTS_64BIT_KERNEL | 428 | select SYS_SUPPORTS_64BIT_KERNEL |
415 | select SYS_SUPPORTS_BIG_ENDIAN | 429 | select SYS_SUPPORTS_BIG_ENDIAN |
416 | help | 430 | help |
@@ -1439,6 +1453,7 @@ choice | |||
1439 | 1453 | ||
1440 | config PAGE_SIZE_4KB | 1454 | config PAGE_SIZE_4KB |
1441 | bool "4kB" | 1455 | bool "4kB" |
1456 | depends on !CPU_LOONGSON2 | ||
1442 | help | 1457 | help |
1443 | This option select the standard 4kB Linux page size. On some | 1458 | This option select the standard 4kB Linux page size. On some |
1444 | R3000-family processors this is the only available page size. Using | 1459 | R3000-family processors this is the only available page size. Using |
@@ -1763,7 +1778,7 @@ config SYS_SUPPORTS_SMARTMIPS | |||
1763 | 1778 | ||
1764 | config ARCH_FLATMEM_ENABLE | 1779 | config ARCH_FLATMEM_ENABLE |
1765 | def_bool y | 1780 | def_bool y |
1766 | depends on !NUMA | 1781 | depends on !NUMA && !CPU_LOONGSON2 |
1767 | 1782 | ||
1768 | config ARCH_DISCONTIGMEM_ENABLE | 1783 | config ARCH_DISCONTIGMEM_ENABLE |
1769 | bool | 1784 | bool |
diff --git a/arch/mips/include/asm/mman.h b/arch/mips/include/asm/mman.h index a2250f390a29..c892bfb3e2c1 100644 --- a/arch/mips/include/asm/mman.h +++ b/arch/mips/include/asm/mman.h | |||
@@ -75,6 +75,7 @@ | |||
75 | 75 | ||
76 | #define MADV_MERGEABLE 12 /* KSM may merge identical pages */ | 76 | #define MADV_MERGEABLE 12 /* KSM may merge identical pages */ |
77 | #define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */ | 77 | #define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */ |
78 | #define MADV_HWPOISON 100 /* poison a page for testing */ | ||
78 | 79 | ||
79 | /* compatibility flags */ | 80 | /* compatibility flags */ |
80 | #define MAP_FILE 0 | 81 | #define MAP_FILE 0 |
diff --git a/arch/mips/include/asm/system.h b/arch/mips/include/asm/system.h index fcf5f98d90cc..83b5509e09e8 100644 --- a/arch/mips/include/asm/system.h +++ b/arch/mips/include/asm/system.h | |||
@@ -12,6 +12,7 @@ | |||
12 | #ifndef _ASM_SYSTEM_H | 12 | #ifndef _ASM_SYSTEM_H |
13 | #define _ASM_SYSTEM_H | 13 | #define _ASM_SYSTEM_H |
14 | 14 | ||
15 | #include <linux/kernel.h> | ||
15 | #include <linux/types.h> | 16 | #include <linux/types.h> |
16 | #include <linux/irqflags.h> | 17 | #include <linux/irqflags.h> |
17 | 18 | ||
@@ -193,10 +194,6 @@ extern __u64 __xchg_u64_unsupported_on_32bit_kernels(volatile __u64 * m, __u64 v | |||
193 | #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels | 194 | #define __xchg_u64 __xchg_u64_unsupported_on_32bit_kernels |
194 | #endif | 195 | #endif |
195 | 196 | ||
196 | /* This function doesn't exist, so you'll get a linker error | ||
197 | if something tries to do an invalid xchg(). */ | ||
198 | extern void __xchg_called_with_bad_pointer(void); | ||
199 | |||
200 | static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) | 197 | static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size) |
201 | { | 198 | { |
202 | switch (size) { | 199 | switch (size) { |
@@ -205,11 +202,17 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz | |||
205 | case 8: | 202 | case 8: |
206 | return __xchg_u64(ptr, x); | 203 | return __xchg_u64(ptr, x); |
207 | } | 204 | } |
208 | __xchg_called_with_bad_pointer(); | 205 | |
209 | return x; | 206 | return x; |
210 | } | 207 | } |
211 | 208 | ||
212 | #define xchg(ptr, x) ((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))) | 209 | #define xchg(ptr, x) \ |
210 | ({ \ | ||
211 | BUILD_BUG_ON(sizeof(*(ptr)) & ~0xc); \ | ||
212 | \ | ||
213 | ((__typeof__(*(ptr))) \ | ||
214 | __xchg((unsigned long)(x), (ptr), sizeof(*(ptr)))); \ | ||
215 | }) | ||
213 | 216 | ||
214 | extern void set_handler(unsigned long offset, void *addr, unsigned long len); | 217 | extern void set_handler(unsigned long offset, void *addr, unsigned long len); |
215 | extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len); | 218 | extern void set_uncached_handler(unsigned long offset, void *addr, unsigned long len); |
diff --git a/arch/powerpc/include/asm/kmap_types.h b/arch/powerpc/include/asm/kmap_types.h index b6bac6f61c16..916369575c97 100644 --- a/arch/powerpc/include/asm/kmap_types.h +++ b/arch/powerpc/include/asm/kmap_types.h | |||
@@ -29,5 +29,16 @@ enum km_type { | |||
29 | KM_TYPE_NR | 29 | KM_TYPE_NR |
30 | }; | 30 | }; |
31 | 31 | ||
32 | /* | ||
33 | * This is a temporary build fix that (so they say on lkml....) should no longer | ||
34 | * be required after 2.6.33, because of changes planned to the kmap code. | ||
35 | * Let's try to remove this cruft then. | ||
36 | */ | ||
37 | #ifdef CONFIG_DEBUG_HIGHMEM | ||
38 | #define KM_NMI (-1) | ||
39 | #define KM_NMI_PTE (-1) | ||
40 | #define KM_IRQ_PTE (-1) | ||
41 | #endif | ||
42 | |||
32 | #endif /* __KERNEL__ */ | 43 | #endif /* __KERNEL__ */ |
33 | #endif /* _ASM_POWERPC_KMAP_TYPES_H */ | 44 | #endif /* _ASM_POWERPC_KMAP_TYPES_H */ |
diff --git a/crypto/gcm.c b/crypto/gcm.c index 5fc3292483ef..c6547130624c 100644 --- a/crypto/gcm.c +++ b/crypto/gcm.c | |||
@@ -40,7 +40,7 @@ struct crypto_rfc4106_ctx { | |||
40 | struct crypto_gcm_ghash_ctx { | 40 | struct crypto_gcm_ghash_ctx { |
41 | unsigned int cryptlen; | 41 | unsigned int cryptlen; |
42 | struct scatterlist *src; | 42 | struct scatterlist *src; |
43 | crypto_completion_t complete; | 43 | void (*complete)(struct aead_request *req, int err); |
44 | }; | 44 | }; |
45 | 45 | ||
46 | struct crypto_gcm_req_priv_ctx { | 46 | struct crypto_gcm_req_priv_ctx { |
@@ -267,23 +267,26 @@ static int gcm_hash_final(struct aead_request *req, | |||
267 | return crypto_ahash_final(ahreq); | 267 | return crypto_ahash_final(ahreq); |
268 | } | 268 | } |
269 | 269 | ||
270 | static void gcm_hash_final_done(struct crypto_async_request *areq, | 270 | static void __gcm_hash_final_done(struct aead_request *req, int err) |
271 | int err) | ||
272 | { | 271 | { |
273 | struct aead_request *req = areq->data; | ||
274 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 272 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
275 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; | 273 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; |
276 | 274 | ||
277 | if (!err) | 275 | if (!err) |
278 | crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16); | 276 | crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16); |
279 | 277 | ||
280 | gctx->complete(areq, err); | 278 | gctx->complete(req, err); |
281 | } | 279 | } |
282 | 280 | ||
283 | static void gcm_hash_len_done(struct crypto_async_request *areq, | 281 | static void gcm_hash_final_done(struct crypto_async_request *areq, int err) |
284 | int err) | ||
285 | { | 282 | { |
286 | struct aead_request *req = areq->data; | 283 | struct aead_request *req = areq->data; |
284 | |||
285 | __gcm_hash_final_done(req, err); | ||
286 | } | ||
287 | |||
288 | static void __gcm_hash_len_done(struct aead_request *req, int err) | ||
289 | { | ||
287 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 290 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
288 | 291 | ||
289 | if (!err) { | 292 | if (!err) { |
@@ -292,13 +295,18 @@ static void gcm_hash_len_done(struct crypto_async_request *areq, | |||
292 | return; | 295 | return; |
293 | } | 296 | } |
294 | 297 | ||
295 | gcm_hash_final_done(areq, err); | 298 | __gcm_hash_final_done(req, err); |
296 | } | 299 | } |
297 | 300 | ||
298 | static void gcm_hash_crypt_remain_done(struct crypto_async_request *areq, | 301 | static void gcm_hash_len_done(struct crypto_async_request *areq, int err) |
299 | int err) | ||
300 | { | 302 | { |
301 | struct aead_request *req = areq->data; | 303 | struct aead_request *req = areq->data; |
304 | |||
305 | __gcm_hash_len_done(req, err); | ||
306 | } | ||
307 | |||
308 | static void __gcm_hash_crypt_remain_done(struct aead_request *req, int err) | ||
309 | { | ||
302 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 310 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
303 | 311 | ||
304 | if (!err) { | 312 | if (!err) { |
@@ -307,13 +315,19 @@ static void gcm_hash_crypt_remain_done(struct crypto_async_request *areq, | |||
307 | return; | 315 | return; |
308 | } | 316 | } |
309 | 317 | ||
310 | gcm_hash_len_done(areq, err); | 318 | __gcm_hash_len_done(req, err); |
311 | } | 319 | } |
312 | 320 | ||
313 | static void gcm_hash_crypt_done(struct crypto_async_request *areq, | 321 | static void gcm_hash_crypt_remain_done(struct crypto_async_request *areq, |
314 | int err) | 322 | int err) |
315 | { | 323 | { |
316 | struct aead_request *req = areq->data; | 324 | struct aead_request *req = areq->data; |
325 | |||
326 | __gcm_hash_crypt_remain_done(req, err); | ||
327 | } | ||
328 | |||
329 | static void __gcm_hash_crypt_done(struct aead_request *req, int err) | ||
330 | { | ||
317 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 331 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
318 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; | 332 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; |
319 | unsigned int remain; | 333 | unsigned int remain; |
@@ -327,13 +341,18 @@ static void gcm_hash_crypt_done(struct crypto_async_request *areq, | |||
327 | return; | 341 | return; |
328 | } | 342 | } |
329 | 343 | ||
330 | gcm_hash_crypt_remain_done(areq, err); | 344 | __gcm_hash_crypt_remain_done(req, err); |
331 | } | 345 | } |
332 | 346 | ||
333 | static void gcm_hash_assoc_remain_done(struct crypto_async_request *areq, | 347 | static void gcm_hash_crypt_done(struct crypto_async_request *areq, int err) |
334 | int err) | ||
335 | { | 348 | { |
336 | struct aead_request *req = areq->data; | 349 | struct aead_request *req = areq->data; |
350 | |||
351 | __gcm_hash_crypt_done(req, err); | ||
352 | } | ||
353 | |||
354 | static void __gcm_hash_assoc_remain_done(struct aead_request *req, int err) | ||
355 | { | ||
337 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 356 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
338 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; | 357 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; |
339 | crypto_completion_t complete; | 358 | crypto_completion_t complete; |
@@ -350,15 +369,21 @@ static void gcm_hash_assoc_remain_done(struct crypto_async_request *areq, | |||
350 | } | 369 | } |
351 | 370 | ||
352 | if (remain) | 371 | if (remain) |
353 | gcm_hash_crypt_done(areq, err); | 372 | __gcm_hash_crypt_done(req, err); |
354 | else | 373 | else |
355 | gcm_hash_crypt_remain_done(areq, err); | 374 | __gcm_hash_crypt_remain_done(req, err); |
356 | } | 375 | } |
357 | 376 | ||
358 | static void gcm_hash_assoc_done(struct crypto_async_request *areq, | 377 | static void gcm_hash_assoc_remain_done(struct crypto_async_request *areq, |
359 | int err) | 378 | int err) |
360 | { | 379 | { |
361 | struct aead_request *req = areq->data; | 380 | struct aead_request *req = areq->data; |
381 | |||
382 | __gcm_hash_assoc_remain_done(req, err); | ||
383 | } | ||
384 | |||
385 | static void __gcm_hash_assoc_done(struct aead_request *req, int err) | ||
386 | { | ||
362 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 387 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
363 | unsigned int remain; | 388 | unsigned int remain; |
364 | 389 | ||
@@ -371,13 +396,18 @@ static void gcm_hash_assoc_done(struct crypto_async_request *areq, | |||
371 | return; | 396 | return; |
372 | } | 397 | } |
373 | 398 | ||
374 | gcm_hash_assoc_remain_done(areq, err); | 399 | __gcm_hash_assoc_remain_done(req, err); |
375 | } | 400 | } |
376 | 401 | ||
377 | static void gcm_hash_init_done(struct crypto_async_request *areq, | 402 | static void gcm_hash_assoc_done(struct crypto_async_request *areq, int err) |
378 | int err) | ||
379 | { | 403 | { |
380 | struct aead_request *req = areq->data; | 404 | struct aead_request *req = areq->data; |
405 | |||
406 | __gcm_hash_assoc_done(req, err); | ||
407 | } | ||
408 | |||
409 | static void __gcm_hash_init_done(struct aead_request *req, int err) | ||
410 | { | ||
381 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 411 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
382 | crypto_completion_t complete; | 412 | crypto_completion_t complete; |
383 | unsigned int remain = 0; | 413 | unsigned int remain = 0; |
@@ -393,9 +423,16 @@ static void gcm_hash_init_done(struct crypto_async_request *areq, | |||
393 | } | 423 | } |
394 | 424 | ||
395 | if (remain) | 425 | if (remain) |
396 | gcm_hash_assoc_done(areq, err); | 426 | __gcm_hash_assoc_done(req, err); |
397 | else | 427 | else |
398 | gcm_hash_assoc_remain_done(areq, err); | 428 | __gcm_hash_assoc_remain_done(req, err); |
429 | } | ||
430 | |||
431 | static void gcm_hash_init_done(struct crypto_async_request *areq, int err) | ||
432 | { | ||
433 | struct aead_request *req = areq->data; | ||
434 | |||
435 | __gcm_hash_init_done(req, err); | ||
399 | } | 436 | } |
400 | 437 | ||
401 | static int gcm_hash(struct aead_request *req, | 438 | static int gcm_hash(struct aead_request *req, |
@@ -457,10 +494,8 @@ static void gcm_enc_copy_hash(struct aead_request *req, | |||
457 | crypto_aead_authsize(aead), 1); | 494 | crypto_aead_authsize(aead), 1); |
458 | } | 495 | } |
459 | 496 | ||
460 | static void gcm_enc_hash_done(struct crypto_async_request *areq, | 497 | static void gcm_enc_hash_done(struct aead_request *req, int err) |
461 | int err) | ||
462 | { | 498 | { |
463 | struct aead_request *req = areq->data; | ||
464 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 499 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
465 | 500 | ||
466 | if (!err) | 501 | if (!err) |
@@ -469,8 +504,7 @@ static void gcm_enc_hash_done(struct crypto_async_request *areq, | |||
469 | aead_request_complete(req, err); | 504 | aead_request_complete(req, err); |
470 | } | 505 | } |
471 | 506 | ||
472 | static void gcm_encrypt_done(struct crypto_async_request *areq, | 507 | static void gcm_encrypt_done(struct crypto_async_request *areq, int err) |
473 | int err) | ||
474 | { | 508 | { |
475 | struct aead_request *req = areq->data; | 509 | struct aead_request *req = areq->data; |
476 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 510 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
@@ -479,9 +513,13 @@ static void gcm_encrypt_done(struct crypto_async_request *areq, | |||
479 | err = gcm_hash(req, pctx); | 513 | err = gcm_hash(req, pctx); |
480 | if (err == -EINPROGRESS || err == -EBUSY) | 514 | if (err == -EINPROGRESS || err == -EBUSY) |
481 | return; | 515 | return; |
516 | else if (!err) { | ||
517 | crypto_xor(pctx->auth_tag, pctx->iauth_tag, 16); | ||
518 | gcm_enc_copy_hash(req, pctx); | ||
519 | } | ||
482 | } | 520 | } |
483 | 521 | ||
484 | gcm_enc_hash_done(areq, err); | 522 | aead_request_complete(req, err); |
485 | } | 523 | } |
486 | 524 | ||
487 | static int crypto_gcm_encrypt(struct aead_request *req) | 525 | static int crypto_gcm_encrypt(struct aead_request *req) |
@@ -538,9 +576,8 @@ static void gcm_decrypt_done(struct crypto_async_request *areq, int err) | |||
538 | aead_request_complete(req, err); | 576 | aead_request_complete(req, err); |
539 | } | 577 | } |
540 | 578 | ||
541 | static void gcm_dec_hash_done(struct crypto_async_request *areq, int err) | 579 | static void gcm_dec_hash_done(struct aead_request *req, int err) |
542 | { | 580 | { |
543 | struct aead_request *req = areq->data; | ||
544 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); | 581 | struct crypto_gcm_req_priv_ctx *pctx = crypto_gcm_reqctx(req); |
545 | struct ablkcipher_request *abreq = &pctx->u.abreq; | 582 | struct ablkcipher_request *abreq = &pctx->u.abreq; |
546 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; | 583 | struct crypto_gcm_ghash_ctx *gctx = &pctx->ghash_ctx; |
@@ -552,9 +589,11 @@ static void gcm_dec_hash_done(struct crypto_async_request *areq, int err) | |||
552 | err = crypto_ablkcipher_decrypt(abreq); | 589 | err = crypto_ablkcipher_decrypt(abreq); |
553 | if (err == -EINPROGRESS || err == -EBUSY) | 590 | if (err == -EINPROGRESS || err == -EBUSY) |
554 | return; | 591 | return; |
592 | else if (!err) | ||
593 | err = crypto_gcm_verify(req, pctx); | ||
555 | } | 594 | } |
556 | 595 | ||
557 | gcm_decrypt_done(areq, err); | 596 | aead_request_complete(req, err); |
558 | } | 597 | } |
559 | 598 | ||
560 | static int crypto_gcm_decrypt(struct aead_request *req) | 599 | static int crypto_gcm_decrypt(struct aead_request *req) |
diff --git a/drivers/char/tty_port.c b/drivers/char/tty_port.c index 2e8552dc5eda..c63f3d33914a 100644 --- a/drivers/char/tty_port.c +++ b/drivers/char/tty_port.c | |||
@@ -219,8 +219,11 @@ int tty_port_block_til_ready(struct tty_port *port, | |||
219 | 219 | ||
220 | /* if non-blocking mode is set we can pass directly to open unless | 220 | /* if non-blocking mode is set we can pass directly to open unless |
221 | the port has just hung up or is in another error state */ | 221 | the port has just hung up or is in another error state */ |
222 | if ((filp->f_flags & O_NONBLOCK) || | 222 | if (tty->flags & (1 << TTY_IO_ERROR)) { |
223 | (tty->flags & (1 << TTY_IO_ERROR))) { | 223 | port->flags |= ASYNC_NORMAL_ACTIVE; |
224 | return 0; | ||
225 | } | ||
226 | if (filp->f_flags & O_NONBLOCK) { | ||
224 | /* Indicate we are open */ | 227 | /* Indicate we are open */ |
225 | if (tty->termios->c_cflag & CBAUD) | 228 | if (tty->termios->c_cflag & CBAUD) |
226 | tty_port_raise_dtr_rts(port); | 229 | tty_port_raise_dtr_rts(port); |
diff --git a/drivers/crypto/padlock-aes.c b/drivers/crypto/padlock-aes.c index a9952b1236b0..84c51e177269 100644 --- a/drivers/crypto/padlock-aes.c +++ b/drivers/crypto/padlock-aes.c | |||
@@ -236,7 +236,7 @@ static inline void ecb_crypt(const u8 *in, u8 *out, u32 *key, | |||
236 | /* Padlock in ECB mode fetches at least ecb_fetch_bytes of data. | 236 | /* Padlock in ECB mode fetches at least ecb_fetch_bytes of data. |
237 | * We could avoid some copying here but it's probably not worth it. | 237 | * We could avoid some copying here but it's probably not worth it. |
238 | */ | 238 | */ |
239 | if (unlikely(((unsigned long)in & PAGE_SIZE) + ecb_fetch_bytes > PAGE_SIZE)) { | 239 | if (unlikely(((unsigned long)in & ~PAGE_MASK) + ecb_fetch_bytes > PAGE_SIZE)) { |
240 | ecb_crypt_copy(in, out, key, cword, count); | 240 | ecb_crypt_copy(in, out, key, cword, count); |
241 | return; | 241 | return; |
242 | } | 242 | } |
@@ -248,7 +248,7 @@ static inline u8 *cbc_crypt(const u8 *in, u8 *out, u32 *key, | |||
248 | u8 *iv, struct cword *cword, int count) | 248 | u8 *iv, struct cword *cword, int count) |
249 | { | 249 | { |
250 | /* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */ | 250 | /* Padlock in CBC mode fetches at least cbc_fetch_bytes of data. */ |
251 | if (unlikely(((unsigned long)in & PAGE_SIZE) + cbc_fetch_bytes > PAGE_SIZE)) | 251 | if (unlikely(((unsigned long)in & ~PAGE_MASK) + cbc_fetch_bytes > PAGE_SIZE)) |
252 | return cbc_crypt_copy(in, out, key, iv, cword, count); | 252 | return cbc_crypt_copy(in, out, key, iv, cword, count); |
253 | 253 | ||
254 | return rep_xcrypt_cbc(in, out, key, iv, cword, count); | 254 | return rep_xcrypt_cbc(in, out, key, iv, cword, count); |
diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c index 1fca59077949..fbab6846ae64 100644 --- a/drivers/i2c/busses/i2c-pnx.c +++ b/drivers/i2c/busses/i2c-pnx.c | |||
@@ -650,7 +650,7 @@ static int __devinit i2c_pnx_probe(struct platform_device *pdev) | |||
650 | return 0; | 650 | return 0; |
651 | 651 | ||
652 | out_irq: | 652 | out_irq: |
653 | free_irq(alg_data->irq, alg_data); | 653 | free_irq(alg_data->irq, i2c_pnx->adapter); |
654 | out_clock: | 654 | out_clock: |
655 | i2c_pnx->set_clock_stop(pdev); | 655 | i2c_pnx->set_clock_stop(pdev); |
656 | out_unmap: | 656 | out_unmap: |
@@ -669,7 +669,7 @@ static int __devexit i2c_pnx_remove(struct platform_device *pdev) | |||
669 | struct i2c_adapter *adap = i2c_pnx->adapter; | 669 | struct i2c_adapter *adap = i2c_pnx->adapter; |
670 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; | 670 | struct i2c_pnx_algo_data *alg_data = adap->algo_data; |
671 | 671 | ||
672 | free_irq(alg_data->irq, alg_data); | 672 | free_irq(alg_data->irq, i2c_pnx->adapter); |
673 | i2c_del_adapter(adap); | 673 | i2c_del_adapter(adap); |
674 | i2c_pnx->set_clock_stop(pdev); | 674 | i2c_pnx->set_clock_stop(pdev); |
675 | iounmap((void *)alg_data->ioaddr); | 675 | iounmap((void *)alg_data->ioaddr); |
diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index aa96bd2d27ea..a0702f36a72f 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c | |||
@@ -257,6 +257,7 @@ static DEVICE_ATTR(operating_mode, S_IWUSR | S_IRUGO, | |||
257 | 257 | ||
258 | static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) | 258 | static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) |
259 | { | 259 | { |
260 | struct tsl2550_data *data = i2c_get_clientdata(client); | ||
260 | u8 ch0, ch1; | 261 | u8 ch0, ch1; |
261 | int ret; | 262 | int ret; |
262 | 263 | ||
@@ -274,6 +275,8 @@ static ssize_t __tsl2550_show_lux(struct i2c_client *client, char *buf) | |||
274 | ret = tsl2550_calculate_lux(ch0, ch1); | 275 | ret = tsl2550_calculate_lux(ch0, ch1); |
275 | if (ret < 0) | 276 | if (ret < 0) |
276 | return ret; | 277 | return ret; |
278 | if (data->operating_mode == 1) | ||
279 | ret *= 5; | ||
277 | 280 | ||
278 | return sprintf(buf, "%d\n", ret); | 281 | return sprintf(buf, "%d\n", ret); |
279 | } | 282 | } |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 8d80fceca6a4..296504355142 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -762,6 +762,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
762 | { | 762 | { |
763 | int res = 0; | 763 | int res = 0; |
764 | struct i2c_adapter *found; | 764 | struct i2c_adapter *found; |
765 | struct i2c_client *client, *next; | ||
765 | 766 | ||
766 | /* First make sure that this adapter was ever added */ | 767 | /* First make sure that this adapter was ever added */ |
767 | mutex_lock(&core_lock); | 768 | mutex_lock(&core_lock); |
@@ -781,6 +782,16 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
781 | if (res) | 782 | if (res) |
782 | return res; | 783 | return res; |
783 | 784 | ||
785 | /* Remove devices instantiated from sysfs */ | ||
786 | list_for_each_entry_safe(client, next, &userspace_devices, detected) { | ||
787 | if (client->adapter == adap) { | ||
788 | dev_dbg(&adap->dev, "Removing %s at 0x%x\n", | ||
789 | client->name, client->addr); | ||
790 | list_del(&client->detected); | ||
791 | i2c_unregister_device(client); | ||
792 | } | ||
793 | } | ||
794 | |||
784 | /* Detach any active clients. This can't fail, thus we do not | 795 | /* Detach any active clients. This can't fail, thus we do not |
785 | checking the returned value. */ | 796 | checking the returned value. */ |
786 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); | 797 | res = device_for_each_child(&adap->dev, NULL, __unregister_client); |
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index db39f4a52f53..2cb2736d65aa 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c | |||
@@ -158,6 +158,7 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, | |||
158 | struct i2c_msg msg[2]; | 158 | struct i2c_msg msg[2]; |
159 | u8 msgbuf[2]; | 159 | u8 msgbuf[2]; |
160 | struct i2c_client *client; | 160 | struct i2c_client *client; |
161 | unsigned long timeout, read_time; | ||
161 | int status, i; | 162 | int status, i; |
162 | 163 | ||
163 | memset(msg, 0, sizeof(msg)); | 164 | memset(msg, 0, sizeof(msg)); |
@@ -183,47 +184,60 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, | |||
183 | if (count > io_limit) | 184 | if (count > io_limit) |
184 | count = io_limit; | 185 | count = io_limit; |
185 | 186 | ||
186 | /* Smaller eeproms can work given some SMBus extension calls */ | ||
187 | if (at24->use_smbus) { | 187 | if (at24->use_smbus) { |
188 | /* Smaller eeproms can work given some SMBus extension calls */ | ||
188 | if (count > I2C_SMBUS_BLOCK_MAX) | 189 | if (count > I2C_SMBUS_BLOCK_MAX) |
189 | count = I2C_SMBUS_BLOCK_MAX; | 190 | count = I2C_SMBUS_BLOCK_MAX; |
190 | status = i2c_smbus_read_i2c_block_data(client, offset, | 191 | } else { |
191 | count, buf); | 192 | /* |
192 | dev_dbg(&client->dev, "smbus read %zu@%d --> %d\n", | 193 | * When we have a better choice than SMBus calls, use a |
193 | count, offset, status); | 194 | * combined I2C message. Write address; then read up to |
194 | return (status < 0) ? -EIO : status; | 195 | * io_limit data bytes. Note that read page rollover helps us |
196 | * here (unlike writes). msgbuf is u8 and will cast to our | ||
197 | * needs. | ||
198 | */ | ||
199 | i = 0; | ||
200 | if (at24->chip.flags & AT24_FLAG_ADDR16) | ||
201 | msgbuf[i++] = offset >> 8; | ||
202 | msgbuf[i++] = offset; | ||
203 | |||
204 | msg[0].addr = client->addr; | ||
205 | msg[0].buf = msgbuf; | ||
206 | msg[0].len = i; | ||
207 | |||
208 | msg[1].addr = client->addr; | ||
209 | msg[1].flags = I2C_M_RD; | ||
210 | msg[1].buf = buf; | ||
211 | msg[1].len = count; | ||
195 | } | 212 | } |
196 | 213 | ||
197 | /* | 214 | /* |
198 | * When we have a better choice than SMBus calls, use a combined | 215 | * Reads fail if the previous write didn't complete yet. We may |
199 | * I2C message. Write address; then read up to io_limit data bytes. | 216 | * loop a few times until this one succeeds, waiting at least |
200 | * Note that read page rollover helps us here (unlike writes). | 217 | * long enough for one entire page write to work. |
201 | * msgbuf is u8 and will cast to our needs. | ||
202 | */ | 218 | */ |
203 | i = 0; | 219 | timeout = jiffies + msecs_to_jiffies(write_timeout); |
204 | if (at24->chip.flags & AT24_FLAG_ADDR16) | 220 | do { |
205 | msgbuf[i++] = offset >> 8; | 221 | read_time = jiffies; |
206 | msgbuf[i++] = offset; | 222 | if (at24->use_smbus) { |
207 | 223 | status = i2c_smbus_read_i2c_block_data(client, offset, | |
208 | msg[0].addr = client->addr; | 224 | count, buf); |
209 | msg[0].buf = msgbuf; | 225 | } else { |
210 | msg[0].len = i; | 226 | status = i2c_transfer(client->adapter, msg, 2); |
227 | if (status == 2) | ||
228 | status = count; | ||
229 | } | ||
230 | dev_dbg(&client->dev, "read %zu@%d --> %d (%ld)\n", | ||
231 | count, offset, status, jiffies); | ||
211 | 232 | ||
212 | msg[1].addr = client->addr; | 233 | if (status == count) |
213 | msg[1].flags = I2C_M_RD; | 234 | return count; |
214 | msg[1].buf = buf; | ||
215 | msg[1].len = count; | ||
216 | 235 | ||
217 | status = i2c_transfer(client->adapter, msg, 2); | 236 | /* REVISIT: at HZ=100, this is sloooow */ |
218 | dev_dbg(&client->dev, "i2c read %zu@%d --> %d\n", | 237 | msleep(1); |
219 | count, offset, status); | 238 | } while (time_before(read_time, timeout)); |
220 | 239 | ||
221 | if (status == 2) | 240 | return -ETIMEDOUT; |
222 | return count; | ||
223 | else if (status >= 0) | ||
224 | return -EIO; | ||
225 | else | ||
226 | return status; | ||
227 | } | 241 | } |
228 | 242 | ||
229 | static ssize_t at24_read(struct at24_data *at24, | 243 | static ssize_t at24_read(struct at24_data *at24, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index fb9bcfa6d947..b7e196e3c8d3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -1277,8 +1277,16 @@ int iwl_tx_agg_stop(struct iwl_priv *priv , const u8 *ra, u16 tid) | |||
1277 | return -ENXIO; | 1277 | return -ENXIO; |
1278 | } | 1278 | } |
1279 | 1279 | ||
1280 | if (priv->stations[sta_id].tid[tid].agg.state == | ||
1281 | IWL_EMPTYING_HW_QUEUE_ADDBA) { | ||
1282 | IWL_DEBUG_HT(priv, "AGG stop before setup done\n"); | ||
1283 | ieee80211_stop_tx_ba_cb_irqsafe(priv->hw, ra, tid); | ||
1284 | priv->stations[sta_id].tid[tid].agg.state = IWL_AGG_OFF; | ||
1285 | return 0; | ||
1286 | } | ||
1287 | |||
1280 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) | 1288 | if (priv->stations[sta_id].tid[tid].agg.state != IWL_AGG_ON) |
1281 | IWL_WARN(priv, "Stopping AGG while state not IWL_AGG_ON\n"); | 1289 | IWL_WARN(priv, "Stopping AGG while state not ON or starting\n"); |
1282 | 1290 | ||
1283 | tid_data = &priv->stations[sta_id].tid[tid]; | 1291 | tid_data = &priv->stations[sta_id].tid[tid]; |
1284 | ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4; | 1292 | ssn = (tid_data->seq_number & IEEE80211_SCTL_SEQ) >> 4; |
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c index 5fd2da494d08..c968cc31cd86 100644 --- a/drivers/scsi/hosts.c +++ b/drivers/scsi/hosts.c | |||
@@ -164,8 +164,8 @@ void scsi_remove_host(struct Scsi_Host *shost) | |||
164 | return; | 164 | return; |
165 | } | 165 | } |
166 | spin_unlock_irqrestore(shost->host_lock, flags); | 166 | spin_unlock_irqrestore(shost->host_lock, flags); |
167 | mutex_unlock(&shost->scan_mutex); | ||
168 | scsi_forget_host(shost); | 167 | scsi_forget_host(shost); |
168 | mutex_unlock(&shost->scan_mutex); | ||
169 | scsi_proc_host_rm(shost); | 169 | scsi_proc_host_rm(shost); |
170 | 170 | ||
171 | spin_lock_irqsave(shost->host_lock, flags); | 171 | spin_lock_irqsave(shost->host_lock, flags); |
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 0547a7f44d42..47291bcff0d5 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -952,16 +952,6 @@ static int scsi_add_lun(struct scsi_device *sdev, unsigned char *inq_result, | |||
952 | return SCSI_SCAN_LUN_PRESENT; | 952 | return SCSI_SCAN_LUN_PRESENT; |
953 | } | 953 | } |
954 | 954 | ||
955 | static inline void scsi_destroy_sdev(struct scsi_device *sdev) | ||
956 | { | ||
957 | scsi_device_set_state(sdev, SDEV_DEL); | ||
958 | if (sdev->host->hostt->slave_destroy) | ||
959 | sdev->host->hostt->slave_destroy(sdev); | ||
960 | transport_destroy_device(&sdev->sdev_gendev); | ||
961 | put_device(&sdev->sdev_dev); | ||
962 | put_device(&sdev->sdev_gendev); | ||
963 | } | ||
964 | |||
965 | #ifdef CONFIG_SCSI_LOGGING | 955 | #ifdef CONFIG_SCSI_LOGGING |
966 | /** | 956 | /** |
967 | * scsi_inq_str - print INQUIRY data from min to max index, strip trailing whitespace | 957 | * scsi_inq_str - print INQUIRY data from min to max index, strip trailing whitespace |
@@ -1139,7 +1129,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
1139 | } | 1129 | } |
1140 | } | 1130 | } |
1141 | } else | 1131 | } else |
1142 | scsi_destroy_sdev(sdev); | 1132 | __scsi_remove_device(sdev); |
1143 | out: | 1133 | out: |
1144 | return res; | 1134 | return res; |
1145 | } | 1135 | } |
@@ -1500,7 +1490,7 @@ static int scsi_report_lun_scan(struct scsi_target *starget, int bflags, | |||
1500 | /* | 1490 | /* |
1501 | * the sdev we used didn't appear in the report luns scan | 1491 | * the sdev we used didn't appear in the report luns scan |
1502 | */ | 1492 | */ |
1503 | scsi_destroy_sdev(sdev); | 1493 | __scsi_remove_device(sdev); |
1504 | return ret; | 1494 | return ret; |
1505 | } | 1495 | } |
1506 | 1496 | ||
@@ -1710,7 +1700,7 @@ static void scsi_sysfs_add_devices(struct Scsi_Host *shost) | |||
1710 | shost_for_each_device(sdev, shost) { | 1700 | shost_for_each_device(sdev, shost) { |
1711 | if (!scsi_host_scan_allowed(shost) || | 1701 | if (!scsi_host_scan_allowed(shost) || |
1712 | scsi_sysfs_add_sdev(sdev) != 0) | 1702 | scsi_sysfs_add_sdev(sdev) != 0) |
1713 | scsi_destroy_sdev(sdev); | 1703 | __scsi_remove_device(sdev); |
1714 | } | 1704 | } |
1715 | } | 1705 | } |
1716 | 1706 | ||
@@ -1943,7 +1933,7 @@ void scsi_free_host_dev(struct scsi_device *sdev) | |||
1943 | { | 1933 | { |
1944 | BUG_ON(sdev->id != sdev->host->this_id); | 1934 | BUG_ON(sdev->id != sdev->host->this_id); |
1945 | 1935 | ||
1946 | scsi_destroy_sdev(sdev); | 1936 | __scsi_remove_device(sdev); |
1947 | } | 1937 | } |
1948 | EXPORT_SYMBOL(scsi_free_host_dev); | 1938 | EXPORT_SYMBOL(scsi_free_host_dev); |
1949 | 1939 | ||
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 5c7eb63a19d1..392d8db33905 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -854,82 +854,73 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) | |||
854 | transport_configure_device(&starget->dev); | 854 | transport_configure_device(&starget->dev); |
855 | error = device_add(&sdev->sdev_gendev); | 855 | error = device_add(&sdev->sdev_gendev); |
856 | if (error) { | 856 | if (error) { |
857 | put_device(sdev->sdev_gendev.parent); | ||
858 | printk(KERN_INFO "error 1\n"); | 857 | printk(KERN_INFO "error 1\n"); |
859 | return error; | 858 | goto out_remove; |
860 | } | 859 | } |
861 | error = device_add(&sdev->sdev_dev); | 860 | error = device_add(&sdev->sdev_dev); |
862 | if (error) { | 861 | if (error) { |
863 | printk(KERN_INFO "error 2\n"); | 862 | printk(KERN_INFO "error 2\n"); |
864 | goto clean_device; | 863 | device_del(&sdev->sdev_gendev); |
864 | goto out_remove; | ||
865 | } | 865 | } |
866 | transport_add_device(&sdev->sdev_gendev); | ||
867 | sdev->is_visible = 1; | ||
866 | 868 | ||
867 | /* create queue files, which may be writable, depending on the host */ | 869 | /* create queue files, which may be writable, depending on the host */ |
868 | if (sdev->host->hostt->change_queue_depth) | 870 | if (sdev->host->hostt->change_queue_depth) |
869 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); | 871 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_depth_rw); |
870 | else | 872 | else |
871 | error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_depth); | 873 | error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_depth); |
872 | if (error) { | 874 | if (error) |
873 | __scsi_remove_device(sdev); | 875 | goto out_remove; |
874 | goto out; | 876 | |
875 | } | ||
876 | if (sdev->host->hostt->change_queue_type) | 877 | if (sdev->host->hostt->change_queue_type) |
877 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_type_rw); | 878 | error = device_create_file(&sdev->sdev_gendev, &sdev_attr_queue_type_rw); |
878 | else | 879 | else |
879 | error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_type); | 880 | error = device_create_file(&sdev->sdev_gendev, &dev_attr_queue_type); |
880 | if (error) { | 881 | if (error) |
881 | __scsi_remove_device(sdev); | 882 | goto out_remove; |
882 | goto out; | ||
883 | } | ||
884 | 883 | ||
885 | error = bsg_register_queue(rq, &sdev->sdev_gendev, NULL, NULL); | 884 | error = bsg_register_queue(rq, &sdev->sdev_gendev, NULL, NULL); |
886 | 885 | ||
887 | if (error) | 886 | if (error) |
887 | /* we're treating error on bsg register as non-fatal, | ||
888 | * so pretend nothing went wrong */ | ||
888 | sdev_printk(KERN_INFO, sdev, | 889 | sdev_printk(KERN_INFO, sdev, |
889 | "Failed to register bsg queue, errno=%d\n", error); | 890 | "Failed to register bsg queue, errno=%d\n", error); |
890 | 891 | ||
891 | /* we're treating error on bsg register as non-fatal, so pretend | ||
892 | * nothing went wrong */ | ||
893 | error = 0; | ||
894 | |||
895 | /* add additional host specific attributes */ | 892 | /* add additional host specific attributes */ |
896 | if (sdev->host->hostt->sdev_attrs) { | 893 | if (sdev->host->hostt->sdev_attrs) { |
897 | for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) { | 894 | for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) { |
898 | error = device_create_file(&sdev->sdev_gendev, | 895 | error = device_create_file(&sdev->sdev_gendev, |
899 | sdev->host->hostt->sdev_attrs[i]); | 896 | sdev->host->hostt->sdev_attrs[i]); |
900 | if (error) { | 897 | if (error) |
901 | __scsi_remove_device(sdev); | 898 | goto out_remove; |
902 | goto out; | ||
903 | } | ||
904 | } | 899 | } |
905 | } | 900 | } |
906 | 901 | ||
907 | transport_add_device(&sdev->sdev_gendev); | 902 | return 0; |
908 | out: | ||
909 | return error; | ||
910 | |||
911 | clean_device: | ||
912 | scsi_device_set_state(sdev, SDEV_CANCEL); | ||
913 | |||
914 | device_del(&sdev->sdev_gendev); | ||
915 | transport_destroy_device(&sdev->sdev_gendev); | ||
916 | put_device(&sdev->sdev_dev); | ||
917 | put_device(&sdev->sdev_gendev); | ||
918 | 903 | ||
904 | out_remove: | ||
905 | __scsi_remove_device(sdev); | ||
919 | return error; | 906 | return error; |
907 | |||
920 | } | 908 | } |
921 | 909 | ||
922 | void __scsi_remove_device(struct scsi_device *sdev) | 910 | void __scsi_remove_device(struct scsi_device *sdev) |
923 | { | 911 | { |
924 | struct device *dev = &sdev->sdev_gendev; | 912 | struct device *dev = &sdev->sdev_gendev; |
925 | 913 | ||
926 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) | 914 | if (sdev->is_visible) { |
927 | return; | 915 | if (scsi_device_set_state(sdev, SDEV_CANCEL) != 0) |
916 | return; | ||
928 | 917 | ||
929 | bsg_unregister_queue(sdev->request_queue); | 918 | bsg_unregister_queue(sdev->request_queue); |
930 | device_unregister(&sdev->sdev_dev); | 919 | device_unregister(&sdev->sdev_dev); |
931 | transport_remove_device(dev); | 920 | transport_remove_device(dev); |
932 | device_del(dev); | 921 | device_del(dev); |
922 | } else | ||
923 | put_device(&sdev->sdev_dev); | ||
933 | scsi_device_set_state(sdev, SDEV_DEL); | 924 | scsi_device_set_state(sdev, SDEV_DEL); |
934 | if (sdev->host->hostt->slave_destroy) | 925 | if (sdev->host->hostt->slave_destroy) |
935 | sdev->host->hostt->slave_destroy(sdev); | 926 | sdev->host->hostt->slave_destroy(sdev); |
diff --git a/drivers/scsi/sd_dif.c b/drivers/scsi/sd_dif.c index 88da97745710..84be62149c6c 100644 --- a/drivers/scsi/sd_dif.c +++ b/drivers/scsi/sd_dif.c | |||
@@ -418,7 +418,7 @@ error: | |||
418 | __func__, virt, phys, be32_to_cpu(sdt->ref_tag), | 418 | __func__, virt, phys, be32_to_cpu(sdt->ref_tag), |
419 | be16_to_cpu(sdt->app_tag)); | 419 | be16_to_cpu(sdt->app_tag)); |
420 | 420 | ||
421 | return -EIO; | 421 | return -EILSEQ; |
422 | } | 422 | } |
423 | 423 | ||
424 | /* | 424 | /* |
diff --git a/drivers/serial/bcm63xx_uart.c b/drivers/serial/bcm63xx_uart.c index beddaa6e9069..37ad0c449937 100644 --- a/drivers/serial/bcm63xx_uart.c +++ b/drivers/serial/bcm63xx_uart.c | |||
@@ -242,7 +242,7 @@ static void bcm_uart_do_rx(struct uart_port *port) | |||
242 | * higher than fifo size anyway since we're much faster than | 242 | * higher than fifo size anyway since we're much faster than |
243 | * serial port */ | 243 | * serial port */ |
244 | max_count = 32; | 244 | max_count = 32; |
245 | tty = port->info->port.tty; | 245 | tty = port->state->port.tty; |
246 | do { | 246 | do { |
247 | unsigned int iestat, c, cstat; | 247 | unsigned int iestat, c, cstat; |
248 | char flag; | 248 | char flag; |
@@ -318,7 +318,7 @@ static void bcm_uart_do_tx(struct uart_port *port) | |||
318 | return; | 318 | return; |
319 | } | 319 | } |
320 | 320 | ||
321 | xmit = &port->info->xmit; | 321 | xmit = &port->state->xmit; |
322 | if (uart_circ_empty(xmit)) | 322 | if (uart_circ_empty(xmit)) |
323 | goto txq_empty; | 323 | goto txq_empty; |
324 | 324 | ||
diff --git a/drivers/serial/of_serial.c b/drivers/serial/of_serial.c index 02406ba6da1c..cdf172eda2e3 100644 --- a/drivers/serial/of_serial.c +++ b/drivers/serial/of_serial.c | |||
@@ -161,6 +161,7 @@ static int of_platform_serial_remove(struct of_device *ofdev) | |||
161 | static struct of_device_id __devinitdata of_platform_serial_table[] = { | 161 | static struct of_device_id __devinitdata of_platform_serial_table[] = { |
162 | { .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, }, | 162 | { .type = "serial", .compatible = "ns8250", .data = (void *)PORT_8250, }, |
163 | { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, | 163 | { .type = "serial", .compatible = "ns16450", .data = (void *)PORT_16450, }, |
164 | { .type = "serial", .compatible = "ns16550a", .data = (void *)PORT_16550A, }, | ||
164 | { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, | 165 | { .type = "serial", .compatible = "ns16550", .data = (void *)PORT_16550, }, |
165 | { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, | 166 | { .type = "serial", .compatible = "ns16750", .data = (void *)PORT_16750, }, |
166 | { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, }, | 167 | { .type = "serial", .compatible = "ns16850", .data = (void *)PORT_16850, }, |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 5ce839137ad6..0f857e645058 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -444,7 +444,7 @@ resubmit: | |||
444 | static inline int | 444 | static inline int |
445 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) | 445 | hub_clear_tt_buffer (struct usb_device *hdev, u16 devinfo, u16 tt) |
446 | { | 446 | { |
447 | return usb_control_msg(hdev, usb_rcvctrlpipe(hdev, 0), | 447 | return usb_control_msg(hdev, usb_sndctrlpipe(hdev, 0), |
448 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, | 448 | HUB_CLEAR_TT_BUFFER, USB_RT_PORT, devinfo, |
449 | tt, NULL, 0, 1000); | 449 | tt, NULL, 0, 1000); |
450 | } | 450 | } |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index d5b65962dd36..731150d4b1d9 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
@@ -1213,7 +1213,12 @@ udc_queue(struct usb_ep *usbep, struct usb_request *usbreq, gfp_t gfp) | |||
1213 | tmp &= AMD_UNMASK_BIT(ep->num); | 1213 | tmp &= AMD_UNMASK_BIT(ep->num); |
1214 | writel(tmp, &dev->regs->ep_irqmsk); | 1214 | writel(tmp, &dev->regs->ep_irqmsk); |
1215 | } | 1215 | } |
1216 | } | 1216 | } else if (ep->in) { |
1217 | /* enable ep irq */ | ||
1218 | tmp = readl(&dev->regs->ep_irqmsk); | ||
1219 | tmp &= AMD_UNMASK_BIT(ep->num); | ||
1220 | writel(tmp, &dev->regs->ep_irqmsk); | ||
1221 | } | ||
1217 | 1222 | ||
1218 | } else if (ep->dma) { | 1223 | } else if (ep->dma) { |
1219 | 1224 | ||
@@ -2005,18 +2010,17 @@ __acquires(dev->lock) | |||
2005 | { | 2010 | { |
2006 | int tmp; | 2011 | int tmp; |
2007 | 2012 | ||
2008 | /* empty queues and init hardware */ | ||
2009 | udc_basic_init(dev); | ||
2010 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) { | ||
2011 | empty_req_queue(&dev->ep[tmp]); | ||
2012 | } | ||
2013 | |||
2014 | if (dev->gadget.speed != USB_SPEED_UNKNOWN) { | 2013 | if (dev->gadget.speed != USB_SPEED_UNKNOWN) { |
2015 | spin_unlock(&dev->lock); | 2014 | spin_unlock(&dev->lock); |
2016 | driver->disconnect(&dev->gadget); | 2015 | driver->disconnect(&dev->gadget); |
2017 | spin_lock(&dev->lock); | 2016 | spin_lock(&dev->lock); |
2018 | } | 2017 | } |
2019 | /* init */ | 2018 | |
2019 | /* empty queues and init hardware */ | ||
2020 | udc_basic_init(dev); | ||
2021 | for (tmp = 0; tmp < UDC_EP_NUM; tmp++) | ||
2022 | empty_req_queue(&dev->ep[tmp]); | ||
2023 | |||
2020 | udc_setup_endpoints(dev); | 2024 | udc_setup_endpoints(dev); |
2021 | } | 2025 | } |
2022 | 2026 | ||
@@ -2472,6 +2476,13 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix) | |||
2472 | } | 2476 | } |
2473 | } | 2477 | } |
2474 | 2478 | ||
2479 | } else if (!use_dma && ep->in) { | ||
2480 | /* disable interrupt */ | ||
2481 | tmp = readl( | ||
2482 | &dev->regs->ep_irqmsk); | ||
2483 | tmp |= AMD_BIT(ep->num); | ||
2484 | writel(tmp, | ||
2485 | &dev->regs->ep_irqmsk); | ||
2475 | } | 2486 | } |
2476 | } | 2487 | } |
2477 | /* clear status bits */ | 2488 | /* clear status bits */ |
@@ -3279,6 +3290,17 @@ static int udc_pci_probe( | |||
3279 | goto finished; | 3290 | goto finished; |
3280 | } | 3291 | } |
3281 | 3292 | ||
3293 | spin_lock_init(&dev->lock); | ||
3294 | /* udc csr registers base */ | ||
3295 | dev->csr = dev->virt_addr + UDC_CSR_ADDR; | ||
3296 | /* dev registers base */ | ||
3297 | dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; | ||
3298 | /* ep registers base */ | ||
3299 | dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; | ||
3300 | /* fifo's base */ | ||
3301 | dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); | ||
3302 | dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); | ||
3303 | |||
3282 | if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { | 3304 | if (request_irq(pdev->irq, udc_irq, IRQF_SHARED, name, dev) != 0) { |
3283 | dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); | 3305 | dev_dbg(&dev->pdev->dev, "request_irq(%d) fail\n", pdev->irq); |
3284 | kfree(dev); | 3306 | kfree(dev); |
@@ -3331,7 +3353,6 @@ static int udc_probe(struct udc *dev) | |||
3331 | udc_pollstall_timer.data = 0; | 3353 | udc_pollstall_timer.data = 0; |
3332 | 3354 | ||
3333 | /* device struct setup */ | 3355 | /* device struct setup */ |
3334 | spin_lock_init(&dev->lock); | ||
3335 | dev->gadget.ops = &udc_ops; | 3356 | dev->gadget.ops = &udc_ops; |
3336 | 3357 | ||
3337 | dev_set_name(&dev->gadget.dev, "gadget"); | 3358 | dev_set_name(&dev->gadget.dev, "gadget"); |
@@ -3340,16 +3361,6 @@ static int udc_probe(struct udc *dev) | |||
3340 | dev->gadget.name = name; | 3361 | dev->gadget.name = name; |
3341 | dev->gadget.is_dualspeed = 1; | 3362 | dev->gadget.is_dualspeed = 1; |
3342 | 3363 | ||
3343 | /* udc csr registers base */ | ||
3344 | dev->csr = dev->virt_addr + UDC_CSR_ADDR; | ||
3345 | /* dev registers base */ | ||
3346 | dev->regs = dev->virt_addr + UDC_DEVCFG_ADDR; | ||
3347 | /* ep registers base */ | ||
3348 | dev->ep_regs = dev->virt_addr + UDC_EPREGS_ADDR; | ||
3349 | /* fifo's base */ | ||
3350 | dev->rxfifo = (u32 __iomem *)(dev->virt_addr + UDC_RXFIFO_ADDR); | ||
3351 | dev->txfifo = (u32 __iomem *)(dev->virt_addr + UDC_TXFIFO_ADDR); | ||
3352 | |||
3353 | /* init registers, interrupts, ... */ | 3364 | /* init registers, interrupts, ... */ |
3354 | startup_registers(dev); | 3365 | startup_registers(dev); |
3355 | 3366 | ||
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9835e0713943..f5f5601701c9 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <linux/errno.h> | 28 | #include <linux/errno.h> |
29 | #include <linux/init.h> | 29 | #include <linux/init.h> |
30 | #include <linux/timer.h> | 30 | #include <linux/timer.h> |
31 | #include <linux/ktime.h> | ||
31 | #include <linux/list.h> | 32 | #include <linux/list.h> |
32 | #include <linux/interrupt.h> | 33 | #include <linux/interrupt.h> |
33 | #include <linux/usb.h> | 34 | #include <linux/usb.h> |
@@ -676,6 +677,7 @@ static int ehci_run (struct usb_hcd *hcd) | |||
676 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ | 677 | ehci_readl(ehci, &ehci->regs->command); /* unblock posted writes */ |
677 | msleep(5); | 678 | msleep(5); |
678 | up_write(&ehci_cf_port_reset_rwsem); | 679 | up_write(&ehci_cf_port_reset_rwsem); |
680 | ehci->last_periodic_enable = ktime_get_real(); | ||
679 | 681 | ||
680 | temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); | 682 | temp = HC_VERSION(ehci_readl(ehci, &ehci->caps->hc_capbase)); |
681 | ehci_info (ehci, | 683 | ehci_info (ehci, |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 378861b9d79a..ead5f4f2aa5a 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -111,6 +111,10 @@ static int ehci_pci_setup(struct usb_hcd *hcd) | |||
111 | switch (pdev->vendor) { | 111 | switch (pdev->vendor) { |
112 | case PCI_VENDOR_ID_INTEL: | 112 | case PCI_VENDOR_ID_INTEL: |
113 | ehci->need_io_watchdog = 0; | 113 | ehci->need_io_watchdog = 0; |
114 | if (pdev->device == 0x27cc) { | ||
115 | ehci->broken_periodic = 1; | ||
116 | ehci_info(ehci, "using broken periodic workaround\n"); | ||
117 | } | ||
114 | break; | 118 | break; |
115 | case PCI_VENDOR_ID_TDI: | 119 | case PCI_VENDOR_ID_TDI: |
116 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { | 120 | if (pdev->device == PCI_DEVICE_ID_TDI_EHCI) { |
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 00ad9ce392ed..139a2cc3f641 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c | |||
@@ -487,8 +487,20 @@ halt: | |||
487 | * we must clear the TT buffer (11.17.5). | 487 | * we must clear the TT buffer (11.17.5). |
488 | */ | 488 | */ |
489 | if (unlikely(last_status != -EINPROGRESS && | 489 | if (unlikely(last_status != -EINPROGRESS && |
490 | last_status != -EREMOTEIO)) | 490 | last_status != -EREMOTEIO)) { |
491 | ehci_clear_tt_buffer(ehci, qh, urb, token); | 491 | /* The TT's in some hubs malfunction when they |
492 | * receive this request following a STALL (they | ||
493 | * stop sending isochronous packets). Since a | ||
494 | * STALL can't leave the TT buffer in a busy | ||
495 | * state (if you believe Figures 11-48 - 11-51 | ||
496 | * in the USB 2.0 spec), we won't clear the TT | ||
497 | * buffer in this case. Strictly speaking this | ||
498 | * is a violation of the spec. | ||
499 | */ | ||
500 | if (last_status != -EPIPE) | ||
501 | ehci_clear_tt_buffer(ehci, qh, urb, | ||
502 | token); | ||
503 | } | ||
492 | } | 504 | } |
493 | 505 | ||
494 | /* if we're removing something not at the queue head, | 506 | /* if we're removing something not at the queue head, |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index b25cdea93a1f..a5535b5e3fe2 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
@@ -475,6 +475,8 @@ static int enable_periodic (struct ehci_hcd *ehci) | |||
475 | /* make sure ehci_work scans these */ | 475 | /* make sure ehci_work scans these */ |
476 | ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) | 476 | ehci->next_uframe = ehci_readl(ehci, &ehci->regs->frame_index) |
477 | % (ehci->periodic_size << 3); | 477 | % (ehci->periodic_size << 3); |
478 | if (unlikely(ehci->broken_periodic)) | ||
479 | ehci->last_periodic_enable = ktime_get_real(); | ||
478 | return 0; | 480 | return 0; |
479 | } | 481 | } |
480 | 482 | ||
@@ -486,6 +488,16 @@ static int disable_periodic (struct ehci_hcd *ehci) | |||
486 | if (--ehci->periodic_sched) | 488 | if (--ehci->periodic_sched) |
487 | return 0; | 489 | return 0; |
488 | 490 | ||
491 | if (unlikely(ehci->broken_periodic)) { | ||
492 | /* delay experimentally determined */ | ||
493 | ktime_t safe = ktime_add_us(ehci->last_periodic_enable, 1000); | ||
494 | ktime_t now = ktime_get_real(); | ||
495 | s64 delay = ktime_us_delta(safe, now); | ||
496 | |||
497 | if (unlikely(delay > 0)) | ||
498 | udelay(delay); | ||
499 | } | ||
500 | |||
489 | /* did setting PSE not take effect yet? | 501 | /* did setting PSE not take effect yet? |
490 | * takes effect only at frame boundaries... | 502 | * takes effect only at frame boundaries... |
491 | */ | 503 | */ |
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index 064e76821ff5..2d85e21ff282 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -118,6 +118,7 @@ struct ehci_hcd { /* one per controller */ | |||
118 | unsigned stamp; | 118 | unsigned stamp; |
119 | unsigned random_frame; | 119 | unsigned random_frame; |
120 | unsigned long next_statechange; | 120 | unsigned long next_statechange; |
121 | ktime_t last_periodic_enable; | ||
121 | u32 command; | 122 | u32 command; |
122 | 123 | ||
123 | /* SILICON QUIRKS */ | 124 | /* SILICON QUIRKS */ |
@@ -127,6 +128,7 @@ struct ehci_hcd { /* one per controller */ | |||
127 | unsigned big_endian_desc:1; | 128 | unsigned big_endian_desc:1; |
128 | unsigned has_amcc_usb23:1; | 129 | unsigned has_amcc_usb23:1; |
129 | unsigned need_io_watchdog:1; | 130 | unsigned need_io_watchdog:1; |
131 | unsigned broken_periodic:1; | ||
130 | 132 | ||
131 | /* required for usb32 quirk */ | 133 | /* required for usb32 quirk */ |
132 | #define OHCI_CTRL_HCFS (3 << 6) | 134 | #define OHCI_CTRL_HCFS (3 << 6) |
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index c3577bbbae6c..ef2332a9941d 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
@@ -1442,11 +1442,6 @@ static int cppi_channel_abort(struct dma_channel *channel) | |||
1442 | musb_writew(regs, MUSB_TXCSR, value); | 1442 | musb_writew(regs, MUSB_TXCSR, value); |
1443 | musb_writew(regs, MUSB_TXCSR, value); | 1443 | musb_writew(regs, MUSB_TXCSR, value); |
1444 | 1444 | ||
1445 | /* re-enable interrupt */ | ||
1446 | if (enabled) | ||
1447 | musb_writel(tibase, DAVINCI_TXCPPI_INTENAB_REG, | ||
1448 | (1 << cppi_ch->index)); | ||
1449 | |||
1450 | /* While we scrub the TX state RAM, ensure that we clean | 1445 | /* While we scrub the TX state RAM, ensure that we clean |
1451 | * up any interrupt that's currently asserted: | 1446 | * up any interrupt that's currently asserted: |
1452 | * 1. Write to completion Ptr value 0x1(bit 0 set) | 1447 | * 1. Write to completion Ptr value 0x1(bit 0 set) |
@@ -1459,6 +1454,11 @@ static int cppi_channel_abort(struct dma_channel *channel) | |||
1459 | cppi_reset_tx(tx_ram, 1); | 1454 | cppi_reset_tx(tx_ram, 1); |
1460 | musb_writel(&tx_ram->tx_complete, 0, 0); | 1455 | musb_writel(&tx_ram->tx_complete, 0, 0); |
1461 | 1456 | ||
1457 | /* re-enable interrupt */ | ||
1458 | if (enabled) | ||
1459 | musb_writel(tibase, DAVINCI_TXCPPI_INTENAB_REG, | ||
1460 | (1 << cppi_ch->index)); | ||
1461 | |||
1462 | cppi_dump_tx(5, cppi_ch, " (done teardown)"); | 1462 | cppi_dump_tx(5, cppi_ch, " (done teardown)"); |
1463 | 1463 | ||
1464 | /* REVISIT tx side _should_ clean up the same way | 1464 | /* REVISIT tx side _should_ clean up the same way |
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index 3a61ddb62bd2..547e0e390726 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -1450,7 +1450,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1450 | #endif | 1450 | #endif |
1451 | 1451 | ||
1452 | if (hw_ep->max_packet_sz_tx) { | 1452 | if (hw_ep->max_packet_sz_tx) { |
1453 | printk(KERN_DEBUG | 1453 | DBG(1, |
1454 | "%s: hw_ep %d%s, %smax %d\n", | 1454 | "%s: hw_ep %d%s, %smax %d\n", |
1455 | musb_driver_name, i, | 1455 | musb_driver_name, i, |
1456 | hw_ep->is_shared_fifo ? "shared" : "tx", | 1456 | hw_ep->is_shared_fifo ? "shared" : "tx", |
@@ -1459,7 +1459,7 @@ static int __init musb_core_init(u16 musb_type, struct musb *musb) | |||
1459 | hw_ep->max_packet_sz_tx); | 1459 | hw_ep->max_packet_sz_tx); |
1460 | } | 1460 | } |
1461 | if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) { | 1461 | if (hw_ep->max_packet_sz_rx && !hw_ep->is_shared_fifo) { |
1462 | printk(KERN_DEBUG | 1462 | DBG(1, |
1463 | "%s: hw_ep %d%s, %smax %d\n", | 1463 | "%s: hw_ep %d%s, %smax %d\n", |
1464 | musb_driver_name, i, | 1464 | musb_driver_name, i, |
1465 | "rx", | 1465 | "rx", |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 8b3c4e2ed7b8..74073f9a43f0 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -4,6 +4,7 @@ | |||
4 | * Copyright 2005 Mentor Graphics Corporation | 4 | * Copyright 2005 Mentor Graphics Corporation |
5 | * Copyright (C) 2005-2006 by Texas Instruments | 5 | * Copyright (C) 2005-2006 by Texas Instruments |
6 | * Copyright (C) 2006-2007 Nokia Corporation | 6 | * Copyright (C) 2006-2007 Nokia Corporation |
7 | * Copyright (C) 2009 MontaVista Software, Inc. <source@mvista.com> | ||
7 | * | 8 | * |
8 | * This program is free software; you can redistribute it and/or | 9 | * This program is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU General Public License | 10 | * modify it under the terms of the GNU General Public License |
@@ -436,14 +437,6 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
436 | csr |= MUSB_TXCSR_P_WZC_BITS; | 437 | csr |= MUSB_TXCSR_P_WZC_BITS; |
437 | csr &= ~MUSB_TXCSR_P_SENTSTALL; | 438 | csr &= ~MUSB_TXCSR_P_SENTSTALL; |
438 | musb_writew(epio, MUSB_TXCSR, csr); | 439 | musb_writew(epio, MUSB_TXCSR, csr); |
439 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | ||
440 | dma->status = MUSB_DMA_STATUS_CORE_ABORT; | ||
441 | musb->dma_controller->channel_abort(dma); | ||
442 | } | ||
443 | |||
444 | if (request) | ||
445 | musb_g_giveback(musb_ep, request, -EPIPE); | ||
446 | |||
447 | break; | 440 | break; |
448 | } | 441 | } |
449 | 442 | ||
@@ -582,15 +575,25 @@ void musb_g_tx(struct musb *musb, u8 epnum) | |||
582 | */ | 575 | */ |
583 | static void rxstate(struct musb *musb, struct musb_request *req) | 576 | static void rxstate(struct musb *musb, struct musb_request *req) |
584 | { | 577 | { |
585 | u16 csr = 0; | ||
586 | const u8 epnum = req->epnum; | 578 | const u8 epnum = req->epnum; |
587 | struct usb_request *request = &req->request; | 579 | struct usb_request *request = &req->request; |
588 | struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; | 580 | struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; |
589 | void __iomem *epio = musb->endpoints[epnum].regs; | 581 | void __iomem *epio = musb->endpoints[epnum].regs; |
590 | unsigned fifo_count = 0; | 582 | unsigned fifo_count = 0; |
591 | u16 len = musb_ep->packet_sz; | 583 | u16 len = musb_ep->packet_sz; |
584 | u16 csr = musb_readw(epio, MUSB_RXCSR); | ||
592 | 585 | ||
593 | csr = musb_readw(epio, MUSB_RXCSR); | 586 | /* We shouldn't get here while DMA is active, but we do... */ |
587 | if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { | ||
588 | DBG(4, "DMA pending...\n"); | ||
589 | return; | ||
590 | } | ||
591 | |||
592 | if (csr & MUSB_RXCSR_P_SENDSTALL) { | ||
593 | DBG(5, "%s stalling, RXCSR %04x\n", | ||
594 | musb_ep->end_point.name, csr); | ||
595 | return; | ||
596 | } | ||
594 | 597 | ||
595 | if (is_cppi_enabled() && musb_ep->dma) { | 598 | if (is_cppi_enabled() && musb_ep->dma) { |
596 | struct dma_controller *c = musb->dma_controller; | 599 | struct dma_controller *c = musb->dma_controller; |
@@ -761,19 +764,10 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
761 | csr, dma ? " (dma)" : "", request); | 764 | csr, dma ? " (dma)" : "", request); |
762 | 765 | ||
763 | if (csr & MUSB_RXCSR_P_SENTSTALL) { | 766 | if (csr & MUSB_RXCSR_P_SENTSTALL) { |
764 | if (dma_channel_status(dma) == MUSB_DMA_STATUS_BUSY) { | ||
765 | dma->status = MUSB_DMA_STATUS_CORE_ABORT; | ||
766 | (void) musb->dma_controller->channel_abort(dma); | ||
767 | request->actual += musb_ep->dma->actual_len; | ||
768 | } | ||
769 | |||
770 | csr |= MUSB_RXCSR_P_WZC_BITS; | 767 | csr |= MUSB_RXCSR_P_WZC_BITS; |
771 | csr &= ~MUSB_RXCSR_P_SENTSTALL; | 768 | csr &= ~MUSB_RXCSR_P_SENTSTALL; |
772 | musb_writew(epio, MUSB_RXCSR, csr); | 769 | musb_writew(epio, MUSB_RXCSR, csr); |
773 | 770 | return; | |
774 | if (request) | ||
775 | musb_g_giveback(musb_ep, request, -EPIPE); | ||
776 | goto done; | ||
777 | } | 771 | } |
778 | 772 | ||
779 | if (csr & MUSB_RXCSR_P_OVERRUN) { | 773 | if (csr & MUSB_RXCSR_P_OVERRUN) { |
@@ -795,7 +789,7 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
795 | DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1, | 789 | DBG((csr & MUSB_RXCSR_DMAENAB) ? 4 : 1, |
796 | "%s busy, csr %04x\n", | 790 | "%s busy, csr %04x\n", |
797 | musb_ep->end_point.name, csr); | 791 | musb_ep->end_point.name, csr); |
798 | goto done; | 792 | return; |
799 | } | 793 | } |
800 | 794 | ||
801 | if (dma && (csr & MUSB_RXCSR_DMAENAB)) { | 795 | if (dma && (csr & MUSB_RXCSR_DMAENAB)) { |
@@ -826,22 +820,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
826 | if ((request->actual < request->length) | 820 | if ((request->actual < request->length) |
827 | && (musb_ep->dma->actual_len | 821 | && (musb_ep->dma->actual_len |
828 | == musb_ep->packet_sz)) | 822 | == musb_ep->packet_sz)) |
829 | goto done; | 823 | return; |
830 | #endif | 824 | #endif |
831 | musb_g_giveback(musb_ep, request, 0); | 825 | musb_g_giveback(musb_ep, request, 0); |
832 | 826 | ||
833 | request = next_request(musb_ep); | 827 | request = next_request(musb_ep); |
834 | if (!request) | 828 | if (!request) |
835 | goto done; | 829 | return; |
836 | |||
837 | /* don't start more i/o till the stall clears */ | ||
838 | musb_ep_select(mbase, epnum); | ||
839 | csr = musb_readw(epio, MUSB_RXCSR); | ||
840 | if (csr & MUSB_RXCSR_P_SENDSTALL) | ||
841 | goto done; | ||
842 | } | 830 | } |
843 | 831 | ||
844 | |||
845 | /* analyze request if the ep is hot */ | 832 | /* analyze request if the ep is hot */ |
846 | if (request) | 833 | if (request) |
847 | rxstate(musb, to_musb_request(request)); | 834 | rxstate(musb, to_musb_request(request)); |
@@ -849,8 +836,6 @@ void musb_g_rx(struct musb *musb, u8 epnum) | |||
849 | DBG(3, "packet waiting for %s%s request\n", | 836 | DBG(3, "packet waiting for %s%s request\n", |
850 | musb_ep->desc ? "" : "inactive ", | 837 | musb_ep->desc ? "" : "inactive ", |
851 | musb_ep->end_point.name); | 838 | musb_ep->end_point.name); |
852 | |||
853 | done: | ||
854 | return; | 839 | return; |
855 | } | 840 | } |
856 | 841 | ||
@@ -1244,7 +1229,7 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
1244 | void __iomem *mbase; | 1229 | void __iomem *mbase; |
1245 | unsigned long flags; | 1230 | unsigned long flags; |
1246 | u16 csr; | 1231 | u16 csr; |
1247 | struct musb_request *request = NULL; | 1232 | struct musb_request *request; |
1248 | int status = 0; | 1233 | int status = 0; |
1249 | 1234 | ||
1250 | if (!ep) | 1235 | if (!ep) |
@@ -1260,24 +1245,29 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
1260 | 1245 | ||
1261 | musb_ep_select(mbase, epnum); | 1246 | musb_ep_select(mbase, epnum); |
1262 | 1247 | ||
1263 | /* cannot portably stall with non-empty FIFO */ | ||
1264 | request = to_musb_request(next_request(musb_ep)); | 1248 | request = to_musb_request(next_request(musb_ep)); |
1265 | if (value && musb_ep->is_in) { | 1249 | if (value) { |
1266 | csr = musb_readw(epio, MUSB_TXCSR); | 1250 | if (request) { |
1267 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | 1251 | DBG(3, "request in progress, cannot halt %s\n", |
1268 | DBG(3, "%s fifo busy, cannot halt\n", ep->name); | 1252 | ep->name); |
1269 | spin_unlock_irqrestore(&musb->lock, flags); | 1253 | status = -EAGAIN; |
1270 | return -EAGAIN; | 1254 | goto done; |
1255 | } | ||
1256 | /* Cannot portably stall with non-empty FIFO */ | ||
1257 | if (musb_ep->is_in) { | ||
1258 | csr = musb_readw(epio, MUSB_TXCSR); | ||
1259 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) { | ||
1260 | DBG(3, "FIFO busy, cannot halt %s\n", ep->name); | ||
1261 | status = -EAGAIN; | ||
1262 | goto done; | ||
1263 | } | ||
1271 | } | 1264 | } |
1272 | |||
1273 | } | 1265 | } |
1274 | 1266 | ||
1275 | /* set/clear the stall and toggle bits */ | 1267 | /* set/clear the stall and toggle bits */ |
1276 | DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); | 1268 | DBG(2, "%s: %s stall\n", ep->name, value ? "set" : "clear"); |
1277 | if (musb_ep->is_in) { | 1269 | if (musb_ep->is_in) { |
1278 | csr = musb_readw(epio, MUSB_TXCSR); | 1270 | csr = musb_readw(epio, MUSB_TXCSR); |
1279 | if (csr & MUSB_TXCSR_FIFONOTEMPTY) | ||
1280 | csr |= MUSB_TXCSR_FLUSHFIFO; | ||
1281 | csr |= MUSB_TXCSR_P_WZC_BITS | 1271 | csr |= MUSB_TXCSR_P_WZC_BITS |
1282 | | MUSB_TXCSR_CLRDATATOG; | 1272 | | MUSB_TXCSR_CLRDATATOG; |
1283 | if (value) | 1273 | if (value) |
@@ -1300,14 +1290,13 @@ int musb_gadget_set_halt(struct usb_ep *ep, int value) | |||
1300 | musb_writew(epio, MUSB_RXCSR, csr); | 1290 | musb_writew(epio, MUSB_RXCSR, csr); |
1301 | } | 1291 | } |
1302 | 1292 | ||
1303 | done: | ||
1304 | |||
1305 | /* maybe start the first request in the queue */ | 1293 | /* maybe start the first request in the queue */ |
1306 | if (!musb_ep->busy && !value && request) { | 1294 | if (!musb_ep->busy && !value && request) { |
1307 | DBG(3, "restarting the request\n"); | 1295 | DBG(3, "restarting the request\n"); |
1308 | musb_ep_restart(musb, request); | 1296 | musb_ep_restart(musb, request); |
1309 | } | 1297 | } |
1310 | 1298 | ||
1299 | done: | ||
1311 | spin_unlock_irqrestore(&musb->lock, flags); | 1300 | spin_unlock_irqrestore(&musb->lock, flags); |
1312 | return status; | 1301 | return status; |
1313 | } | 1302 | } |
diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c index 7a6778675ad3..522efb31b56b 100644 --- a/drivers/usb/musb/musb_gadget_ep0.c +++ b/drivers/usb/musb/musb_gadget_ep0.c | |||
@@ -511,7 +511,8 @@ static void ep0_txstate(struct musb *musb) | |||
511 | 511 | ||
512 | /* update the flags */ | 512 | /* update the flags */ |
513 | if (fifo_count < MUSB_MAX_END0_PACKET | 513 | if (fifo_count < MUSB_MAX_END0_PACKET |
514 | || request->actual == request->length) { | 514 | || (request->actual == request->length |
515 | && !request->zero)) { | ||
515 | musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; | 516 | musb->ep0_state = MUSB_EP0_STAGE_STATUSOUT; |
516 | csr |= MUSB_CSR0_P_DATAEND; | 517 | csr |= MUSB_CSR0_P_DATAEND; |
517 | } else | 518 | } else |
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c index cf94511485f2..e3ab40a966eb 100644 --- a/drivers/usb/musb/musb_host.c +++ b/drivers/usb/musb/musb_host.c | |||
@@ -1301,8 +1301,11 @@ void musb_host_tx(struct musb *musb, u8 epnum) | |||
1301 | return; | 1301 | return; |
1302 | } else if (usb_pipeisoc(pipe) && dma) { | 1302 | } else if (usb_pipeisoc(pipe) && dma) { |
1303 | if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, | 1303 | if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, |
1304 | offset, length)) | 1304 | offset, length)) { |
1305 | if (is_cppi_enabled() || tusb_dma_omap()) | ||
1306 | musb_h_tx_dma_start(hw_ep); | ||
1305 | return; | 1307 | return; |
1308 | } | ||
1306 | } else if (tx_csr & MUSB_TXCSR_DMAENAB) { | 1309 | } else if (tx_csr & MUSB_TXCSR_DMAENAB) { |
1307 | DBG(1, "not complete, but DMA enabled?\n"); | 1310 | DBG(1, "not complete, but DMA enabled?\n"); |
1308 | return; | 1311 | return; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 9c60d6d4908a..ebcc6d0e2e91 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -1937,7 +1937,7 @@ static void ftdi_write_bulk_callback(struct urb *urb) | |||
1937 | return; | 1937 | return; |
1938 | } | 1938 | } |
1939 | /* account for transferred data */ | 1939 | /* account for transferred data */ |
1940 | countback = urb->actual_length; | 1940 | countback = urb->transfer_buffer_length; |
1941 | data_offset = priv->write_offset; | 1941 | data_offset = priv->write_offset; |
1942 | if (data_offset > 0) { | 1942 | if (data_offset > 0) { |
1943 | /* Subtract the control bytes */ | 1943 | /* Subtract the control bytes */ |
@@ -1950,7 +1950,6 @@ static void ftdi_write_bulk_callback(struct urb *urb) | |||
1950 | 1950 | ||
1951 | if (status) { | 1951 | if (status) { |
1952 | dbg("nonzero write bulk status received: %d", status); | 1952 | dbg("nonzero write bulk status received: %d", status); |
1953 | return; | ||
1954 | } | 1953 | } |
1955 | 1954 | ||
1956 | usb_serial_port_softint(port); | 1955 | usb_serial_port_softint(port); |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 319aaf9725b3..0577e4b61114 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -336,6 +336,10 @@ static int option_resume(struct usb_serial *serial); | |||
336 | #define AIRPLUS_VENDOR_ID 0x1011 | 336 | #define AIRPLUS_VENDOR_ID 0x1011 |
337 | #define AIRPLUS_PRODUCT_MCD650 0x3198 | 337 | #define AIRPLUS_PRODUCT_MCD650 0x3198 |
338 | 338 | ||
339 | /* 4G Systems products */ | ||
340 | #define FOUR_G_SYSTEMS_VENDOR_ID 0x1c9e | ||
341 | #define FOUR_G_SYSTEMS_PRODUCT_W14 0x9603 | ||
342 | |||
339 | static struct usb_device_id option_ids[] = { | 343 | static struct usb_device_id option_ids[] = { |
340 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 344 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
341 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 345 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
@@ -599,6 +603,7 @@ static struct usb_device_id option_ids[] = { | |||
599 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, | 603 | { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S) }, |
600 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, | 604 | { USB_DEVICE(AIRPLUS_VENDOR_ID, AIRPLUS_PRODUCT_MCD650) }, |
601 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, | 605 | { USB_DEVICE(TLAYTECH_VENDOR_ID, TLAYTECH_PRODUCT_TEU800) }, |
606 | { USB_DEVICE(FOUR_G_SYSTEMS_VENDOR_ID, FOUR_G_SYSTEMS_PRODUCT_W14) }, | ||
602 | { } /* Terminating entry */ | 607 | { } /* Terminating entry */ |
603 | }; | 608 | }; |
604 | MODULE_DEVICE_TABLE(usb, option_ids); | 609 | MODULE_DEVICE_TABLE(usb, option_ids); |
diff --git a/drivers/watchdog/pnx4008_wdt.c b/drivers/watchdog/pnx4008_wdt.c index f24d04132eda..4d227b152001 100644 --- a/drivers/watchdog/pnx4008_wdt.c +++ b/drivers/watchdog/pnx4008_wdt.c | |||
@@ -317,7 +317,7 @@ static int __devexit pnx4008_wdt_remove(struct platform_device *pdev) | |||
317 | 317 | ||
318 | static struct platform_driver platform_wdt_driver = { | 318 | static struct platform_driver platform_wdt_driver = { |
319 | .driver = { | 319 | .driver = { |
320 | .name = "watchdog", | 320 | .name = "pnx4008-watchdog", |
321 | .owner = THIS_MODULE, | 321 | .owner = THIS_MODULE, |
322 | }, | 322 | }, |
323 | .probe = pnx4008_wdt_probe, | 323 | .probe = pnx4008_wdt_probe, |
@@ -352,4 +352,4 @@ MODULE_PARM_DESC(nowayout, | |||
352 | 352 | ||
353 | MODULE_LICENSE("GPL"); | 353 | MODULE_LICENSE("GPL"); |
354 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); | 354 | MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR); |
355 | MODULE_ALIAS("platform:watchdog"); | 355 | MODULE_ALIAS("platform:pnx4008-watchdog"); |
diff --git a/fs/9p/cache.c b/fs/9p/cache.c index bcc5357a9069..e777961939f3 100644 --- a/fs/9p/cache.c +++ b/fs/9p/cache.c | |||
@@ -343,7 +343,7 @@ int __v9fs_fscache_release_page(struct page *page, gfp_t gfp) | |||
343 | 343 | ||
344 | BUG_ON(!vcookie->fscache); | 344 | BUG_ON(!vcookie->fscache); |
345 | 345 | ||
346 | return fscache_maybe_release_page(vnode->cache, page, gfp); | 346 | return fscache_maybe_release_page(vcookie->fscache, page, gfp); |
347 | } | 347 | } |
348 | 348 | ||
349 | void __v9fs_fscache_invalidate_page(struct page *page) | 349 | void __v9fs_fscache_invalidate_page(struct page *page) |
diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c index 1d8332563863..a6c8c6fe8df9 100644 --- a/fs/cachefiles/rdwr.c +++ b/fs/cachefiles/rdwr.c | |||
@@ -11,6 +11,7 @@ | |||
11 | 11 | ||
12 | #include <linux/mount.h> | 12 | #include <linux/mount.h> |
13 | #include <linux/file.h> | 13 | #include <linux/file.h> |
14 | #include <linux/ima.h> | ||
14 | #include "internal.h" | 15 | #include "internal.h" |
15 | 16 | ||
16 | /* | 17 | /* |
@@ -922,6 +923,7 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page) | |||
922 | if (IS_ERR(file)) { | 923 | if (IS_ERR(file)) { |
923 | ret = PTR_ERR(file); | 924 | ret = PTR_ERR(file); |
924 | } else { | 925 | } else { |
926 | ima_counts_get(file); | ||
925 | ret = -EIO; | 927 | ret = -EIO; |
926 | if (file->f_op->write) { | 928 | if (file->f_op->write) { |
927 | pos = (loff_t) page->index << PAGE_SHIFT; | 929 | pos = (loff_t) page->index << PAGE_SHIFT; |
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES index 145540a316ab..094ea65afc85 100644 --- a/fs/cifs/CHANGES +++ b/fs/cifs/CHANGES | |||
@@ -1,3 +1,12 @@ | |||
1 | Version 1.61 | ||
2 | ------------ | ||
3 | Fix append problem to Samba servers (files opened with O_APPEND could | ||
4 | have duplicated data). Fix oops in cifs_lookup. Workaround problem | ||
5 | mounting to OS/400 Netserve. Fix oops in cifs_get_tcp_session. | ||
6 | Disable use of server inode numbers when server only | ||
7 | partially supports them (e.g. for one server querying inode numbers on | ||
8 | FindFirst fails but QPathInfo queries works). | ||
9 | |||
1 | Version 1.60 | 10 | Version 1.60 |
2 | ------------- | 11 | ------------- |
3 | Fix memory leak in reconnect. Fix oops in DFS mount error path. | 12 | Fix memory leak in reconnect. Fix oops in DFS mount error path. |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 627a60a6c1b1..1f42f772865a 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -214,8 +214,6 @@ int cifs_posix_open(char *full_path, struct inode **pinode, | |||
214 | posix_flags |= SMB_O_EXCL; | 214 | posix_flags |= SMB_O_EXCL; |
215 | if (oflags & O_TRUNC) | 215 | if (oflags & O_TRUNC) |
216 | posix_flags |= SMB_O_TRUNC; | 216 | posix_flags |= SMB_O_TRUNC; |
217 | if (oflags & O_APPEND) | ||
218 | posix_flags |= SMB_O_APPEND; | ||
219 | if (oflags & O_SYNC) | 217 | if (oflags & O_SYNC) |
220 | posix_flags |= SMB_O_SYNC; | 218 | posix_flags |= SMB_O_SYNC; |
221 | if (oflags & O_DIRECTORY) | 219 | if (oflags & O_DIRECTORY) |
@@ -643,9 +641,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
643 | * O_EXCL: optimize away the lookup, but don't hash the dentry. Let | 641 | * O_EXCL: optimize away the lookup, but don't hash the dentry. Let |
644 | * the VFS handle the create. | 642 | * the VFS handle the create. |
645 | */ | 643 | */ |
646 | if (nd->flags & LOOKUP_EXCL) { | 644 | if (nd && (nd->flags & LOOKUP_EXCL)) { |
647 | d_instantiate(direntry, NULL); | 645 | d_instantiate(direntry, NULL); |
648 | return 0; | 646 | return NULL; |
649 | } | 647 | } |
650 | 648 | ||
651 | /* can not grab the rename sem here since it would | 649 | /* can not grab the rename sem here since it would |
@@ -675,7 +673,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, | |||
675 | * reduction in network traffic in the other paths. | 673 | * reduction in network traffic in the other paths. |
676 | */ | 674 | */ |
677 | if (pTcon->unix_ext) { | 675 | if (pTcon->unix_ext) { |
678 | if (!(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && | 676 | if (nd && !(nd->flags & (LOOKUP_PARENT | LOOKUP_DIRECTORY)) && |
679 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && | 677 | (nd->flags & LOOKUP_OPEN) && !pTcon->broken_posix_open && |
680 | (nd->intent.open.flags & O_CREAT)) { | 678 | (nd->intent.open.flags & O_CREAT)) { |
681 | rc = cifs_posix_open(full_path, &newInode, nd->path.mnt, | 679 | rc = cifs_posix_open(full_path, &newInode, nd->path.mnt, |
diff --git a/include/linux/slow-work.h b/include/linux/slow-work.h index 5035a2691739..13337bf6c3f5 100644 --- a/include/linux/slow-work.h +++ b/include/linux/slow-work.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #include <linux/timer.h> | 20 | #include <linux/timer.h> |
21 | 21 | ||
22 | struct slow_work; | 22 | struct slow_work; |
23 | #ifdef CONFIG_SLOW_WORK_PROC | 23 | #ifdef CONFIG_SLOW_WORK_DEBUG |
24 | struct seq_file; | 24 | struct seq_file; |
25 | #endif | 25 | #endif |
26 | 26 | ||
@@ -42,8 +42,8 @@ struct slow_work_ops { | |||
42 | /* execute a work item */ | 42 | /* execute a work item */ |
43 | void (*execute)(struct slow_work *work); | 43 | void (*execute)(struct slow_work *work); |
44 | 44 | ||
45 | #ifdef CONFIG_SLOW_WORK_PROC | 45 | #ifdef CONFIG_SLOW_WORK_DEBUG |
46 | /* describe a work item for /proc */ | 46 | /* describe a work item for debugfs */ |
47 | void (*desc)(struct slow_work *work, struct seq_file *m); | 47 | void (*desc)(struct slow_work *work, struct seq_file *m); |
48 | #endif | 48 | #endif |
49 | }; | 49 | }; |
@@ -64,7 +64,7 @@ struct slow_work { | |||
64 | #define SLOW_WORK_DELAYED 5 /* item is struct delayed_slow_work with active timer */ | 64 | #define SLOW_WORK_DELAYED 5 /* item is struct delayed_slow_work with active timer */ |
65 | const struct slow_work_ops *ops; /* operations table for this item */ | 65 | const struct slow_work_ops *ops; /* operations table for this item */ |
66 | struct list_head link; /* link in queue */ | 66 | struct list_head link; /* link in queue */ |
67 | #ifdef CONFIG_SLOW_WORK_PROC | 67 | #ifdef CONFIG_SLOW_WORK_DEBUG |
68 | struct timespec mark; /* jiffies at which queued or exec begun */ | 68 | struct timespec mark; /* jiffies at which queued or exec begun */ |
69 | #endif | 69 | #endif |
70 | }; | 70 | }; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index c75b960c8ac8..998c30fc8981 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1283,6 +1283,12 @@ enum ieee80211_filter_flags { | |||
1283 | * | 1283 | * |
1284 | * These flags are used with the ampdu_action() callback in | 1284 | * These flags are used with the ampdu_action() callback in |
1285 | * &struct ieee80211_ops to indicate which action is needed. | 1285 | * &struct ieee80211_ops to indicate which action is needed. |
1286 | * | ||
1287 | * Note that drivers MUST be able to deal with a TX aggregation | ||
1288 | * session being stopped even before they OK'ed starting it by | ||
1289 | * calling ieee80211_start_tx_ba_cb(_irqsafe), because the peer | ||
1290 | * might receive the addBA frame and send a delBA right away! | ||
1291 | * | ||
1286 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation | 1292 | * @IEEE80211_AMPDU_RX_START: start Rx aggregation |
1287 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation | 1293 | * @IEEE80211_AMPDU_RX_STOP: stop Rx aggregation |
1288 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation | 1294 | * @IEEE80211_AMPDU_TX_START: start Tx aggregation |
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h index 9af48cbf0036..f097ae340bc1 100644 --- a/include/scsi/scsi_device.h +++ b/include/scsi/scsi_device.h | |||
@@ -145,6 +145,7 @@ struct scsi_device { | |||
145 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ | 145 | unsigned retry_hwerror:1; /* Retry HARDWARE_ERROR */ |
146 | unsigned last_sector_bug:1; /* do not use multisector accesses on | 146 | unsigned last_sector_bug:1; /* do not use multisector accesses on |
147 | SD_LAST_BUGGY_SECTORS */ | 147 | SD_LAST_BUGGY_SECTORS */ |
148 | unsigned is_visible:1; /* is the device visible in sysfs */ | ||
148 | 149 | ||
149 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ | 150 | DECLARE_BITMAP(supported_events, SDEV_EVT_MAXBITS); /* supported events */ |
150 | struct list_head event_list; /* asserted events */ | 151 | struct list_head event_list; /* asserted events */ |
diff --git a/init/Kconfig b/init/Kconfig index ab5c64801fe5..39923ccc287b 100644 --- a/init/Kconfig +++ b/init/Kconfig | |||
@@ -1098,12 +1098,12 @@ config SLOW_WORK | |||
1098 | 1098 | ||
1099 | See Documentation/slow-work.txt. | 1099 | See Documentation/slow-work.txt. |
1100 | 1100 | ||
1101 | config SLOW_WORK_PROC | 1101 | config SLOW_WORK_DEBUG |
1102 | bool "Slow work debugging through /proc" | 1102 | bool "Slow work debugging through debugfs" |
1103 | default n | 1103 | default n |
1104 | depends on SLOW_WORK && PROC_FS | 1104 | depends on SLOW_WORK && DEBUG_FS |
1105 | help | 1105 | help |
1106 | Display the contents of the slow work run queue through /proc, | 1106 | Display the contents of the slow work run queue through debugfs, |
1107 | including items currently executing. | 1107 | including items currently executing. |
1108 | 1108 | ||
1109 | See Documentation/slow-work.txt. | 1109 | See Documentation/slow-work.txt. |
diff --git a/kernel/Makefile b/kernel/Makefile index 776ffed1556d..d7c13d249b2d 100644 --- a/kernel/Makefile +++ b/kernel/Makefile | |||
@@ -94,7 +94,7 @@ obj-$(CONFIG_X86_DS) += trace/ | |||
94 | obj-$(CONFIG_RING_BUFFER) += trace/ | 94 | obj-$(CONFIG_RING_BUFFER) += trace/ |
95 | obj-$(CONFIG_SMP) += sched_cpupri.o | 95 | obj-$(CONFIG_SMP) += sched_cpupri.o |
96 | obj-$(CONFIG_SLOW_WORK) += slow-work.o | 96 | obj-$(CONFIG_SLOW_WORK) += slow-work.o |
97 | obj-$(CONFIG_SLOW_WORK_PROC) += slow-work-proc.o | 97 | obj-$(CONFIG_SLOW_WORK_DEBUG) += slow-work-debugfs.o |
98 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o | 98 | obj-$(CONFIG_PERF_EVENTS) += perf_event.o |
99 | 99 | ||
100 | ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) | 100 | ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) |
diff --git a/kernel/slow-work-proc.c b/kernel/slow-work-debugfs.c index 3988032571f5..e45c43645298 100644 --- a/kernel/slow-work-proc.c +++ b/kernel/slow-work-debugfs.c | |||
@@ -57,7 +57,7 @@ static void slow_work_print_mark(struct seq_file *m, struct slow_work *work) | |||
57 | } | 57 | } |
58 | 58 | ||
59 | /* | 59 | /* |
60 | * Describe a slow work item for /proc | 60 | * Describe a slow work item for debugfs |
61 | */ | 61 | */ |
62 | static int slow_work_runqueue_show(struct seq_file *m, void *v) | 62 | static int slow_work_runqueue_show(struct seq_file *m, void *v) |
63 | { | 63 | { |
@@ -211,7 +211,7 @@ static const struct seq_operations slow_work_runqueue_ops = { | |||
211 | }; | 211 | }; |
212 | 212 | ||
213 | /* | 213 | /* |
214 | * open "/proc/slow_work_rq" to list queue contents | 214 | * open "/sys/kernel/debug/slow_work/runqueue" to list queue contents |
215 | */ | 215 | */ |
216 | static int slow_work_runqueue_open(struct inode *inode, struct file *file) | 216 | static int slow_work_runqueue_open(struct inode *inode, struct file *file) |
217 | { | 217 | { |
diff --git a/kernel/slow-work.c b/kernel/slow-work.c index da94f3c101af..00889bd3c590 100644 --- a/kernel/slow-work.c +++ b/kernel/slow-work.c | |||
@@ -16,7 +16,7 @@ | |||
16 | #include <linux/kthread.h> | 16 | #include <linux/kthread.h> |
17 | #include <linux/freezer.h> | 17 | #include <linux/freezer.h> |
18 | #include <linux/wait.h> | 18 | #include <linux/wait.h> |
19 | #include <linux/proc_fs.h> | 19 | #include <linux/debugfs.h> |
20 | #include "slow-work.h" | 20 | #include "slow-work.h" |
21 | 21 | ||
22 | static void slow_work_cull_timeout(unsigned long); | 22 | static void slow_work_cull_timeout(unsigned long); |
@@ -109,12 +109,36 @@ static struct module *slow_work_unreg_module; | |||
109 | static struct slow_work *slow_work_unreg_work_item; | 109 | static struct slow_work *slow_work_unreg_work_item; |
110 | static DECLARE_WAIT_QUEUE_HEAD(slow_work_unreg_wq); | 110 | static DECLARE_WAIT_QUEUE_HEAD(slow_work_unreg_wq); |
111 | static DEFINE_MUTEX(slow_work_unreg_sync_lock); | 111 | static DEFINE_MUTEX(slow_work_unreg_sync_lock); |
112 | |||
113 | static void slow_work_set_thread_processing(int id, struct slow_work *work) | ||
114 | { | ||
115 | if (work) | ||
116 | slow_work_thread_processing[id] = work->owner; | ||
117 | } | ||
118 | static void slow_work_done_thread_processing(int id, struct slow_work *work) | ||
119 | { | ||
120 | struct module *module = slow_work_thread_processing[id]; | ||
121 | |||
122 | slow_work_thread_processing[id] = NULL; | ||
123 | smp_mb(); | ||
124 | if (slow_work_unreg_work_item == work || | ||
125 | slow_work_unreg_module == module) | ||
126 | wake_up_all(&slow_work_unreg_wq); | ||
127 | } | ||
128 | static void slow_work_clear_thread_processing(int id) | ||
129 | { | ||
130 | slow_work_thread_processing[id] = NULL; | ||
131 | } | ||
132 | #else | ||
133 | static void slow_work_set_thread_processing(int id, struct slow_work *work) {} | ||
134 | static void slow_work_done_thread_processing(int id, struct slow_work *work) {} | ||
135 | static void slow_work_clear_thread_processing(int id) {} | ||
112 | #endif | 136 | #endif |
113 | 137 | ||
114 | /* | 138 | /* |
115 | * Data for tracking currently executing items for indication through /proc | 139 | * Data for tracking currently executing items for indication through /proc |
116 | */ | 140 | */ |
117 | #ifdef CONFIG_SLOW_WORK_PROC | 141 | #ifdef CONFIG_SLOW_WORK_DEBUG |
118 | struct slow_work *slow_work_execs[SLOW_WORK_THREAD_LIMIT]; | 142 | struct slow_work *slow_work_execs[SLOW_WORK_THREAD_LIMIT]; |
119 | pid_t slow_work_pids[SLOW_WORK_THREAD_LIMIT]; | 143 | pid_t slow_work_pids[SLOW_WORK_THREAD_LIMIT]; |
120 | DEFINE_RWLOCK(slow_work_execs_lock); | 144 | DEFINE_RWLOCK(slow_work_execs_lock); |
@@ -197,9 +221,6 @@ static unsigned slow_work_calc_vsmax(void) | |||
197 | */ | 221 | */ |
198 | static noinline bool slow_work_execute(int id) | 222 | static noinline bool slow_work_execute(int id) |
199 | { | 223 | { |
200 | #ifdef CONFIG_MODULES | ||
201 | struct module *module; | ||
202 | #endif | ||
203 | struct slow_work *work = NULL; | 224 | struct slow_work *work = NULL; |
204 | unsigned vsmax; | 225 | unsigned vsmax; |
205 | bool very_slow; | 226 | bool very_slow; |
@@ -236,10 +257,7 @@ static noinline bool slow_work_execute(int id) | |||
236 | very_slow = false; /* avoid the compiler warning */ | 257 | very_slow = false; /* avoid the compiler warning */ |
237 | } | 258 | } |
238 | 259 | ||
239 | #ifdef CONFIG_MODULES | 260 | slow_work_set_thread_processing(id, work); |
240 | if (work) | ||
241 | slow_work_thread_processing[id] = work->owner; | ||
242 | #endif | ||
243 | if (work) { | 261 | if (work) { |
244 | slow_work_mark_time(work); | 262 | slow_work_mark_time(work); |
245 | slow_work_begin_exec(id, work); | 263 | slow_work_begin_exec(id, work); |
@@ -287,15 +305,7 @@ static noinline bool slow_work_execute(int id) | |||
287 | 305 | ||
288 | /* sort out the race between module unloading and put_ref() */ | 306 | /* sort out the race between module unloading and put_ref() */ |
289 | slow_work_put_ref(work); | 307 | slow_work_put_ref(work); |
290 | 308 | slow_work_done_thread_processing(id, work); | |
291 | #ifdef CONFIG_MODULES | ||
292 | module = slow_work_thread_processing[id]; | ||
293 | slow_work_thread_processing[id] = NULL; | ||
294 | smp_mb(); | ||
295 | if (slow_work_unreg_work_item == work || | ||
296 | slow_work_unreg_module == module) | ||
297 | wake_up_all(&slow_work_unreg_wq); | ||
298 | #endif | ||
299 | 309 | ||
300 | return true; | 310 | return true; |
301 | 311 | ||
@@ -310,7 +320,7 @@ auto_requeue: | |||
310 | else | 320 | else |
311 | list_add_tail(&work->link, &slow_work_queue); | 321 | list_add_tail(&work->link, &slow_work_queue); |
312 | spin_unlock_irq(&slow_work_queue_lock); | 322 | spin_unlock_irq(&slow_work_queue_lock); |
313 | slow_work_thread_processing[id] = NULL; | 323 | slow_work_clear_thread_processing(id); |
314 | return true; | 324 | return true; |
315 | } | 325 | } |
316 | 326 | ||
@@ -813,7 +823,7 @@ static void slow_work_new_thread_execute(struct slow_work *work) | |||
813 | static const struct slow_work_ops slow_work_new_thread_ops = { | 823 | static const struct slow_work_ops slow_work_new_thread_ops = { |
814 | .owner = THIS_MODULE, | 824 | .owner = THIS_MODULE, |
815 | .execute = slow_work_new_thread_execute, | 825 | .execute = slow_work_new_thread_execute, |
816 | #ifdef CONFIG_SLOW_WORK_PROC | 826 | #ifdef CONFIG_SLOW_WORK_DEBUG |
817 | .desc = slow_work_new_thread_desc, | 827 | .desc = slow_work_new_thread_desc, |
818 | #endif | 828 | #endif |
819 | }; | 829 | }; |
@@ -943,6 +953,7 @@ EXPORT_SYMBOL(slow_work_register_user); | |||
943 | */ | 953 | */ |
944 | static void slow_work_wait_for_items(struct module *module) | 954 | static void slow_work_wait_for_items(struct module *module) |
945 | { | 955 | { |
956 | #ifdef CONFIG_MODULES | ||
946 | DECLARE_WAITQUEUE(myself, current); | 957 | DECLARE_WAITQUEUE(myself, current); |
947 | struct slow_work *work; | 958 | struct slow_work *work; |
948 | int loop; | 959 | int loop; |
@@ -989,6 +1000,7 @@ static void slow_work_wait_for_items(struct module *module) | |||
989 | 1000 | ||
990 | remove_wait_queue(&slow_work_unreg_wq, &myself); | 1001 | remove_wait_queue(&slow_work_unreg_wq, &myself); |
991 | mutex_unlock(&slow_work_unreg_sync_lock); | 1002 | mutex_unlock(&slow_work_unreg_sync_lock); |
1003 | #endif /* CONFIG_MODULES */ | ||
992 | } | 1004 | } |
993 | 1005 | ||
994 | /** | 1006 | /** |
@@ -1043,9 +1055,15 @@ static int __init init_slow_work(void) | |||
1043 | if (slow_work_max_max_threads < nr_cpus * 2) | 1055 | if (slow_work_max_max_threads < nr_cpus * 2) |
1044 | slow_work_max_max_threads = nr_cpus * 2; | 1056 | slow_work_max_max_threads = nr_cpus * 2; |
1045 | #endif | 1057 | #endif |
1046 | #ifdef CONFIG_SLOW_WORK_PROC | 1058 | #ifdef CONFIG_SLOW_WORK_DEBUG |
1047 | proc_create("slow_work_rq", S_IFREG | 0400, NULL, | 1059 | { |
1048 | &slow_work_runqueue_fops); | 1060 | struct dentry *dbdir; |
1061 | |||
1062 | dbdir = debugfs_create_dir("slow_work", NULL); | ||
1063 | if (dbdir && !IS_ERR(dbdir)) | ||
1064 | debugfs_create_file("runqueue", S_IFREG | 0400, dbdir, | ||
1065 | NULL, &slow_work_runqueue_fops); | ||
1066 | } | ||
1049 | #endif | 1067 | #endif |
1050 | return 0; | 1068 | return 0; |
1051 | } | 1069 | } |
diff --git a/kernel/slow-work.h b/kernel/slow-work.h index 3c2f007f3ad6..321f3c59d732 100644 --- a/kernel/slow-work.h +++ b/kernel/slow-work.h | |||
@@ -19,7 +19,7 @@ | |||
19 | /* | 19 | /* |
20 | * slow-work.c | 20 | * slow-work.c |
21 | */ | 21 | */ |
22 | #ifdef CONFIG_SLOW_WORK_PROC | 22 | #ifdef CONFIG_SLOW_WORK_DEBUG |
23 | extern struct slow_work *slow_work_execs[]; | 23 | extern struct slow_work *slow_work_execs[]; |
24 | extern pid_t slow_work_pids[]; | 24 | extern pid_t slow_work_pids[]; |
25 | extern rwlock_t slow_work_execs_lock; | 25 | extern rwlock_t slow_work_execs_lock; |
@@ -30,9 +30,9 @@ extern struct list_head vslow_work_queue; | |||
30 | extern spinlock_t slow_work_queue_lock; | 30 | extern spinlock_t slow_work_queue_lock; |
31 | 31 | ||
32 | /* | 32 | /* |
33 | * slow-work-proc.c | 33 | * slow-work-debugfs.c |
34 | */ | 34 | */ |
35 | #ifdef CONFIG_SLOW_WORK_PROC | 35 | #ifdef CONFIG_SLOW_WORK_DEBUG |
36 | extern const struct file_operations slow_work_runqueue_fops; | 36 | extern const struct file_operations slow_work_runqueue_fops; |
37 | 37 | ||
38 | extern void slow_work_new_thread_desc(struct slow_work *, struct seq_file *); | 38 | extern void slow_work_new_thread_desc(struct slow_work *, struct seq_file *); |
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index bc064d7933ff..ce8e0e772bab 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -85,10 +85,6 @@ void ieee80211_sta_stop_rx_ba_session(struct ieee80211_sub_if_data *sdata, u8 *r | |||
85 | struct ieee80211_local *local = sdata->local; | 85 | struct ieee80211_local *local = sdata->local; |
86 | struct sta_info *sta; | 86 | struct sta_info *sta; |
87 | 87 | ||
88 | /* stop HW Rx aggregation. ampdu_action existence | ||
89 | * already verified in session init so we add the BUG_ON */ | ||
90 | BUG_ON(!local->ops->ampdu_action); | ||
91 | |||
92 | rcu_read_lock(); | 88 | rcu_read_lock(); |
93 | 89 | ||
94 | sta = sta_info_get(local, ra); | 90 | sta = sta_info_get(local, ra); |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 206fd82f0c76..89e238b001de 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -123,13 +123,18 @@ void ieee80211_send_bar(struct ieee80211_sub_if_data *sdata, u8 *ra, u16 tid, u1 | |||
123 | ieee80211_tx_skb(sdata, skb, 0); | 123 | ieee80211_tx_skb(sdata, skb, 0); |
124 | } | 124 | } |
125 | 125 | ||
126 | static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | 126 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
127 | enum ieee80211_back_parties initiator) | 127 | enum ieee80211_back_parties initiator) |
128 | { | 128 | { |
129 | struct ieee80211_local *local = sta->local; | 129 | struct ieee80211_local *local = sta->local; |
130 | int ret; | 130 | int ret; |
131 | u8 *state; | 131 | u8 *state; |
132 | 132 | ||
133 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
134 | printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
135 | sta->sta.addr, tid); | ||
136 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
137 | |||
133 | state = &sta->ampdu_mlme.tid_state_tx[tid]; | 138 | state = &sta->ampdu_mlme.tid_state_tx[tid]; |
134 | 139 | ||
135 | if (*state == HT_AGG_STATE_OPERATIONAL) | 140 | if (*state == HT_AGG_STATE_OPERATIONAL) |
@@ -143,7 +148,6 @@ static int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
143 | 148 | ||
144 | /* HW shall not deny going back to legacy */ | 149 | /* HW shall not deny going back to legacy */ |
145 | if (WARN_ON(ret)) { | 150 | if (WARN_ON(ret)) { |
146 | *state = HT_AGG_STATE_OPERATIONAL; | ||
147 | /* | 151 | /* |
148 | * We may have pending packets get stuck in this case... | 152 | * We may have pending packets get stuck in this case... |
149 | * Not bothering with a workaround for now. | 153 | * Not bothering with a workaround for now. |
@@ -525,11 +529,6 @@ int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | |||
525 | goto unlock; | 529 | goto unlock; |
526 | } | 530 | } |
527 | 531 | ||
528 | #ifdef CONFIG_MAC80211_HT_DEBUG | ||
529 | printk(KERN_DEBUG "Tx BA session stop requested for %pM tid %u\n", | ||
530 | sta->sta.addr, tid); | ||
531 | #endif /* CONFIG_MAC80211_HT_DEBUG */ | ||
532 | |||
533 | ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator); | 532 | ret = ___ieee80211_stop_tx_ba_session(sta, tid, initiator); |
534 | 533 | ||
535 | unlock: | 534 | unlock: |
@@ -545,7 +544,7 @@ int ieee80211_stop_tx_ba_session(struct ieee80211_hw *hw, | |||
545 | struct sta_info *sta; | 544 | struct sta_info *sta; |
546 | int ret = 0; | 545 | int ret = 0; |
547 | 546 | ||
548 | if (WARN_ON(!local->ops->ampdu_action)) | 547 | if (!local->ops->ampdu_action) |
549 | return -EINVAL; | 548 | return -EINVAL; |
550 | 549 | ||
551 | if (tid >= STA_TID_NUM) | 550 | if (tid >= STA_TID_NUM) |
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c index 48ef1a282b91..cdc58e61d921 100644 --- a/net/mac80211/ht.c +++ b/net/mac80211/ht.c | |||
@@ -141,7 +141,6 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | |||
141 | struct sta_info *sta, | 141 | struct sta_info *sta, |
142 | struct ieee80211_mgmt *mgmt, size_t len) | 142 | struct ieee80211_mgmt *mgmt, size_t len) |
143 | { | 143 | { |
144 | struct ieee80211_local *local = sdata->local; | ||
145 | u16 tid, params; | 144 | u16 tid, params; |
146 | u16 initiator; | 145 | u16 initiator; |
147 | 146 | ||
@@ -161,10 +160,9 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata, | |||
161 | WLAN_BACK_INITIATOR, 0); | 160 | WLAN_BACK_INITIATOR, 0); |
162 | else { /* WLAN_BACK_RECIPIENT */ | 161 | else { /* WLAN_BACK_RECIPIENT */ |
163 | spin_lock_bh(&sta->lock); | 162 | spin_lock_bh(&sta->lock); |
164 | sta->ampdu_mlme.tid_state_tx[tid] = | 163 | if (sta->ampdu_mlme.tid_state_tx[tid] & HT_ADDBA_REQUESTED_MSK) |
165 | HT_AGG_STATE_OPERATIONAL; | 164 | ___ieee80211_stop_tx_ba_session(sta, tid, |
165 | WLAN_BACK_RECIPIENT); | ||
166 | spin_unlock_bh(&sta->lock); | 166 | spin_unlock_bh(&sta->lock); |
167 | ieee80211_stop_tx_ba_session(&local->hw, sta->sta.addr, tid, | ||
168 | WLAN_BACK_RECIPIENT); | ||
169 | } | 167 | } |
170 | } | 168 | } |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index a910bf1f092f..10d316e455de 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1091,6 +1091,8 @@ void ieee80211_process_addba_request(struct ieee80211_local *local, | |||
1091 | 1091 | ||
1092 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | 1092 | int __ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, |
1093 | enum ieee80211_back_parties initiator); | 1093 | enum ieee80211_back_parties initiator); |
1094 | int ___ieee80211_stop_tx_ba_session(struct sta_info *sta, u16 tid, | ||
1095 | enum ieee80211_back_parties initiator); | ||
1094 | 1096 | ||
1095 | /* Spectrum management */ | 1097 | /* Spectrum management */ |
1096 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, | 1098 | void ieee80211_process_measurement_req(struct ieee80211_sub_if_data *sdata, |