Annotation of /trunk/kernel-magellan/patches-3.2/0115-3.2.16-all-fixes.patch
Parent Directory | Revision Log
Revision 1747 -
(hide annotations)
(download)
Mon Apr 23 16:05:01 2012 UTC (12 years, 5 months ago) by niro
File size: 67988 byte(s)
Mon Apr 23 16:05:01 2012 UTC (12 years, 5 months ago) by niro
File size: 67988 byte(s)
-linux 3.2.16
1 | niro | 1747 | diff --git a/arch/arm/boot/compressed/head.S b/arch/arm/boot/compressed/head.S |
2 | index c2effc9..9c18ebd 100644 | ||
3 | --- a/arch/arm/boot/compressed/head.S | ||
4 | +++ b/arch/arm/boot/compressed/head.S | ||
5 | @@ -273,7 +273,7 @@ restart: adr r0, LC0 | ||
6 | add r0, r0, #0x100 | ||
7 | mov r1, r6 | ||
8 | sub r2, sp, r6 | ||
9 | - blne atags_to_fdt | ||
10 | + bleq atags_to_fdt | ||
11 | |||
12 | ldmfd sp!, {r0-r3, ip, lr} | ||
13 | sub sp, sp, #0x10000 | ||
14 | diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S | ||
15 | index 82ef81d..785365e 100644 | ||
16 | --- a/arch/arm/mm/proc-v7.S | ||
17 | +++ b/arch/arm/mm/proc-v7.S | ||
18 | @@ -382,6 +382,18 @@ __v7_setup: | ||
19 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | ||
20 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR | ||
21 | #endif | ||
22 | +#ifndef CONFIG_ARM_THUMBEE | ||
23 | + mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE | ||
24 | + and r0, r0, #(0xf << 12) @ ThumbEE enabled field | ||
25 | + teq r0, #(1 << 12) @ check if ThumbEE is present | ||
26 | + bne 1f | ||
27 | + mov r5, #0 | ||
28 | + mcr p14, 6, r5, c1, c0, 0 @ Initialize TEEHBR to 0 | ||
29 | + mrc p14, 6, r0, c0, c0, 0 @ load TEECR | ||
30 | + orr r0, r0, #1 @ set the 1st bit in order to | ||
31 | + mcr p14, 6, r0, c0, c0, 0 @ stop userspace TEEHBR access | ||
32 | +1: | ||
33 | +#endif | ||
34 | adr r5, v7_crval | ||
35 | ldmia r5, {r5, r6} | ||
36 | #ifdef CONFIG_CPU_ENDIAN_BE8 | ||
37 | diff --git a/arch/ia64/include/asm/futex.h b/arch/ia64/include/asm/futex.h | ||
38 | index 8428525..21ab376 100644 | ||
39 | --- a/arch/ia64/include/asm/futex.h | ||
40 | +++ b/arch/ia64/include/asm/futex.h | ||
41 | @@ -107,15 +107,16 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, | ||
42 | return -EFAULT; | ||
43 | |||
44 | { | ||
45 | - register unsigned long r8 __asm ("r8") = 0; | ||
46 | + register unsigned long r8 __asm ("r8"); | ||
47 | unsigned long prev; | ||
48 | __asm__ __volatile__( | ||
49 | " mf;; \n" | ||
50 | - " mov ar.ccv=%3;; \n" | ||
51 | - "[1:] cmpxchg4.acq %0=[%1],%2,ar.ccv \n" | ||
52 | + " mov %0=r0 \n" | ||
53 | + " mov ar.ccv=%4;; \n" | ||
54 | + "[1:] cmpxchg4.acq %1=[%2],%3,ar.ccv \n" | ||
55 | " .xdata4 \"__ex_table\", 1b-., 2f-. \n" | ||
56 | "[2:]" | ||
57 | - : "=r" (prev) | ||
58 | + : "=r" (r8), "=r" (prev) | ||
59 | : "r" (uaddr), "r" (newval), | ||
60 | "rO" ((long) (unsigned) oldval) | ||
61 | : "memory"); | ||
62 | diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig | ||
63 | index f929db9..a3c40e8 100644 | ||
64 | --- a/arch/s390/Kconfig | ||
65 | +++ b/arch/s390/Kconfig | ||
66 | @@ -90,7 +90,6 @@ config S390 | ||
67 | select HAVE_GET_USER_PAGES_FAST | ||
68 | select HAVE_ARCH_MUTEX_CPU_RELAX | ||
69 | select HAVE_ARCH_JUMP_LABEL if !MARCH_G5 | ||
70 | - select HAVE_RCU_TABLE_FREE if SMP | ||
71 | select ARCH_SAVE_PAGE_KEYS if HIBERNATION | ||
72 | select ARCH_INLINE_SPIN_TRYLOCK | ||
73 | select ARCH_INLINE_SPIN_TRYLOCK_BH | ||
74 | diff --git a/arch/s390/include/asm/pgalloc.h b/arch/s390/include/asm/pgalloc.h | ||
75 | index 8eef9b5..78e3041 100644 | ||
76 | --- a/arch/s390/include/asm/pgalloc.h | ||
77 | +++ b/arch/s390/include/asm/pgalloc.h | ||
78 | @@ -22,10 +22,7 @@ void crst_table_free(struct mm_struct *, unsigned long *); | ||
79 | |||
80 | unsigned long *page_table_alloc(struct mm_struct *, unsigned long); | ||
81 | void page_table_free(struct mm_struct *, unsigned long *); | ||
82 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
83 | void page_table_free_rcu(struct mmu_gather *, unsigned long *); | ||
84 | -void __tlb_remove_table(void *_table); | ||
85 | -#endif | ||
86 | |||
87 | static inline void clear_table(unsigned long *s, unsigned long val, size_t n) | ||
88 | { | ||
89 | diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h | ||
90 | index c687a2c..775a5ee 100644 | ||
91 | --- a/arch/s390/include/asm/tlb.h | ||
92 | +++ b/arch/s390/include/asm/tlb.h | ||
93 | @@ -30,14 +30,10 @@ | ||
94 | |||
95 | struct mmu_gather { | ||
96 | struct mm_struct *mm; | ||
97 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
98 | struct mmu_table_batch *batch; | ||
99 | -#endif | ||
100 | unsigned int fullmm; | ||
101 | - unsigned int need_flush; | ||
102 | }; | ||
103 | |||
104 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
105 | struct mmu_table_batch { | ||
106 | struct rcu_head rcu; | ||
107 | unsigned int nr; | ||
108 | @@ -49,7 +45,6 @@ struct mmu_table_batch { | ||
109 | |||
110 | extern void tlb_table_flush(struct mmu_gather *tlb); | ||
111 | extern void tlb_remove_table(struct mmu_gather *tlb, void *table); | ||
112 | -#endif | ||
113 | |||
114 | static inline void tlb_gather_mmu(struct mmu_gather *tlb, | ||
115 | struct mm_struct *mm, | ||
116 | @@ -57,29 +52,20 @@ static inline void tlb_gather_mmu(struct mmu_gather *tlb, | ||
117 | { | ||
118 | tlb->mm = mm; | ||
119 | tlb->fullmm = full_mm_flush; | ||
120 | - tlb->need_flush = 0; | ||
121 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
122 | tlb->batch = NULL; | ||
123 | -#endif | ||
124 | if (tlb->fullmm) | ||
125 | __tlb_flush_mm(mm); | ||
126 | } | ||
127 | |||
128 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | ||
129 | { | ||
130 | - if (!tlb->need_flush) | ||
131 | - return; | ||
132 | - tlb->need_flush = 0; | ||
133 | - __tlb_flush_mm(tlb->mm); | ||
134 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
135 | tlb_table_flush(tlb); | ||
136 | -#endif | ||
137 | } | ||
138 | |||
139 | static inline void tlb_finish_mmu(struct mmu_gather *tlb, | ||
140 | unsigned long start, unsigned long end) | ||
141 | { | ||
142 | - tlb_flush_mmu(tlb); | ||
143 | + tlb_table_flush(tlb); | ||
144 | } | ||
145 | |||
146 | /* | ||
147 | @@ -105,10 +91,8 @@ static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||
148 | static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | ||
149 | unsigned long address) | ||
150 | { | ||
151 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
152 | if (!tlb->fullmm) | ||
153 | return page_table_free_rcu(tlb, (unsigned long *) pte); | ||
154 | -#endif | ||
155 | page_table_free(tlb->mm, (unsigned long *) pte); | ||
156 | } | ||
157 | |||
158 | @@ -125,10 +109,8 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd, | ||
159 | #ifdef __s390x__ | ||
160 | if (tlb->mm->context.asce_limit <= (1UL << 31)) | ||
161 | return; | ||
162 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
163 | if (!tlb->fullmm) | ||
164 | return tlb_remove_table(tlb, pmd); | ||
165 | -#endif | ||
166 | crst_table_free(tlb->mm, (unsigned long *) pmd); | ||
167 | #endif | ||
168 | } | ||
169 | @@ -146,10 +128,8 @@ static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud, | ||
170 | #ifdef __s390x__ | ||
171 | if (tlb->mm->context.asce_limit <= (1UL << 42)) | ||
172 | return; | ||
173 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
174 | if (!tlb->fullmm) | ||
175 | return tlb_remove_table(tlb, pud); | ||
176 | -#endif | ||
177 | crst_table_free(tlb->mm, (unsigned long *) pud); | ||
178 | #endif | ||
179 | } | ||
180 | diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c | ||
181 | index 301c84d..f8ceac4 100644 | ||
182 | --- a/arch/s390/mm/pgtable.c | ||
183 | +++ b/arch/s390/mm/pgtable.c | ||
184 | @@ -687,8 +687,6 @@ void page_table_free(struct mm_struct *mm, unsigned long *table) | ||
185 | } | ||
186 | } | ||
187 | |||
188 | -#ifdef CONFIG_HAVE_RCU_TABLE_FREE | ||
189 | - | ||
190 | static void __page_table_free_rcu(void *table, unsigned bit) | ||
191 | { | ||
192 | struct page *page; | ||
193 | @@ -742,7 +740,66 @@ void __tlb_remove_table(void *_table) | ||
194 | free_pages((unsigned long) table, ALLOC_ORDER); | ||
195 | } | ||
196 | |||
197 | -#endif | ||
198 | +static void tlb_remove_table_smp_sync(void *arg) | ||
199 | +{ | ||
200 | + /* Simply deliver the interrupt */ | ||
201 | +} | ||
202 | + | ||
203 | +static void tlb_remove_table_one(void *table) | ||
204 | +{ | ||
205 | + /* | ||
206 | + * This isn't an RCU grace period and hence the page-tables cannot be | ||
207 | + * assumed to be actually RCU-freed. | ||
208 | + * | ||
209 | + * It is however sufficient for software page-table walkers that rely | ||
210 | + * on IRQ disabling. See the comment near struct mmu_table_batch. | ||
211 | + */ | ||
212 | + smp_call_function(tlb_remove_table_smp_sync, NULL, 1); | ||
213 | + __tlb_remove_table(table); | ||
214 | +} | ||
215 | + | ||
216 | +static void tlb_remove_table_rcu(struct rcu_head *head) | ||
217 | +{ | ||
218 | + struct mmu_table_batch *batch; | ||
219 | + int i; | ||
220 | + | ||
221 | + batch = container_of(head, struct mmu_table_batch, rcu); | ||
222 | + | ||
223 | + for (i = 0; i < batch->nr; i++) | ||
224 | + __tlb_remove_table(batch->tables[i]); | ||
225 | + | ||
226 | + free_page((unsigned long)batch); | ||
227 | +} | ||
228 | + | ||
229 | +void tlb_table_flush(struct mmu_gather *tlb) | ||
230 | +{ | ||
231 | + struct mmu_table_batch **batch = &tlb->batch; | ||
232 | + | ||
233 | + if (*batch) { | ||
234 | + __tlb_flush_mm(tlb->mm); | ||
235 | + call_rcu_sched(&(*batch)->rcu, tlb_remove_table_rcu); | ||
236 | + *batch = NULL; | ||
237 | + } | ||
238 | +} | ||
239 | + | ||
240 | +void tlb_remove_table(struct mmu_gather *tlb, void *table) | ||
241 | +{ | ||
242 | + struct mmu_table_batch **batch = &tlb->batch; | ||
243 | + | ||
244 | + if (*batch == NULL) { | ||
245 | + *batch = (struct mmu_table_batch *) | ||
246 | + __get_free_page(GFP_NOWAIT | __GFP_NOWARN); | ||
247 | + if (*batch == NULL) { | ||
248 | + __tlb_flush_mm(tlb->mm); | ||
249 | + tlb_remove_table_one(table); | ||
250 | + return; | ||
251 | + } | ||
252 | + (*batch)->nr = 0; | ||
253 | + } | ||
254 | + (*batch)->tables[(*batch)->nr++] = table; | ||
255 | + if ((*batch)->nr == MAX_TABLE_BATCH) | ||
256 | + tlb_table_flush(tlb); | ||
257 | +} | ||
258 | |||
259 | /* | ||
260 | * switch on pgstes for its userspace process (for kvm) | ||
261 | diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c | ||
262 | index 381edcd..27728e1 100644 | ||
263 | --- a/arch/sparc/kernel/ds.c | ||
264 | +++ b/arch/sparc/kernel/ds.c | ||
265 | @@ -1267,4 +1267,4 @@ static int __init ds_init(void) | ||
266 | return vio_register_driver(&ds_driver); | ||
267 | } | ||
268 | |||
269 | -subsys_initcall(ds_init); | ||
270 | +fs_initcall(ds_init); | ||
271 | diff --git a/arch/sparc/kernel/rtrap_64.S b/arch/sparc/kernel/rtrap_64.S | ||
272 | index 77f1b95..9171fc2 100644 | ||
273 | --- a/arch/sparc/kernel/rtrap_64.S | ||
274 | +++ b/arch/sparc/kernel/rtrap_64.S | ||
275 | @@ -20,11 +20,6 @@ | ||
276 | |||
277 | .text | ||
278 | .align 32 | ||
279 | -__handle_softirq: | ||
280 | - call do_softirq | ||
281 | - nop | ||
282 | - ba,a,pt %xcc, __handle_softirq_continue | ||
283 | - nop | ||
284 | __handle_preemption: | ||
285 | call schedule | ||
286 | wrpr %g0, RTRAP_PSTATE, %pstate | ||
287 | @@ -89,9 +84,7 @@ rtrap: | ||
288 | cmp %l1, 0 | ||
289 | |||
290 | /* mm/ultra.S:xcall_report_regs KNOWS about this load. */ | ||
291 | - bne,pn %icc, __handle_softirq | ||
292 | ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 | ||
293 | -__handle_softirq_continue: | ||
294 | rtrap_xcall: | ||
295 | sethi %hi(0xf << 20), %l4 | ||
296 | and %l1, %l4, %l4 | ||
297 | diff --git a/drivers/acpi/acpica/acobject.h b/drivers/acpi/acpica/acobject.h | ||
298 | index 1055769..6d276c2 100644 | ||
299 | --- a/drivers/acpi/acpica/acobject.h | ||
300 | +++ b/drivers/acpi/acpica/acobject.h | ||
301 | @@ -358,6 +358,7 @@ typedef enum { | ||
302 | */ | ||
303 | struct acpi_object_extra { | ||
304 | ACPI_OBJECT_COMMON_HEADER struct acpi_namespace_node *method_REG; /* _REG method for this region (if any) */ | ||
305 | + struct acpi_namespace_node *scope_node; | ||
306 | void *region_context; /* Region-specific data */ | ||
307 | u8 *aml_start; | ||
308 | u32 aml_length; | ||
309 | diff --git a/drivers/acpi/acpica/dsargs.c b/drivers/acpi/acpica/dsargs.c | ||
310 | index 42163d8..d69e4a5 100644 | ||
311 | --- a/drivers/acpi/acpica/dsargs.c | ||
312 | +++ b/drivers/acpi/acpica/dsargs.c | ||
313 | @@ -384,7 +384,7 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc) | ||
314 | |||
315 | /* Execute the argument AML */ | ||
316 | |||
317 | - status = acpi_ds_execute_arguments(node, node->parent, | ||
318 | + status = acpi_ds_execute_arguments(node, extra_desc->extra.scope_node, | ||
319 | extra_desc->extra.aml_length, | ||
320 | extra_desc->extra.aml_start); | ||
321 | if (ACPI_FAILURE(status)) { | ||
322 | diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c | ||
323 | index 110711a..8a06dc5 100644 | ||
324 | --- a/drivers/acpi/acpica/excreate.c | ||
325 | +++ b/drivers/acpi/acpica/excreate.c | ||
326 | @@ -330,6 +330,12 @@ acpi_ex_create_region(u8 * aml_start, | ||
327 | region_obj2 = obj_desc->common.next_object; | ||
328 | region_obj2->extra.aml_start = aml_start; | ||
329 | region_obj2->extra.aml_length = aml_length; | ||
330 | + if (walk_state->scope_info) { | ||
331 | + region_obj2->extra.scope_node = | ||
332 | + walk_state->scope_info->scope.node; | ||
333 | + } else { | ||
334 | + region_obj2->extra.scope_node = node; | ||
335 | + } | ||
336 | |||
337 | /* Init the region from the operands */ | ||
338 | |||
339 | diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c | ||
340 | index e820b68..acda773 100644 | ||
341 | --- a/drivers/block/cciss_scsi.c | ||
342 | +++ b/drivers/block/cciss_scsi.c | ||
343 | @@ -866,6 +866,7 @@ cciss_scsi_detect(ctlr_info_t *h) | ||
344 | sh->can_queue = cciss_tape_cmds; | ||
345 | sh->sg_tablesize = h->maxsgentries; | ||
346 | sh->max_cmd_len = MAX_COMMAND_SIZE; | ||
347 | + sh->max_sectors = h->cciss_max_sectors; | ||
348 | |||
349 | ((struct cciss_scsi_adapter_data_t *) | ||
350 | h->scsi_ctlr)->scsi_host = sh; | ||
351 | @@ -1410,7 +1411,7 @@ static void cciss_scatter_gather(ctlr_info_t *h, CommandList_struct *c, | ||
352 | /* track how many SG entries we are using */ | ||
353 | if (request_nsgs > h->maxSG) | ||
354 | h->maxSG = request_nsgs; | ||
355 | - c->Header.SGTotal = (__u8) request_nsgs + chained; | ||
356 | + c->Header.SGTotal = (u16) request_nsgs + chained; | ||
357 | if (request_nsgs > h->max_cmd_sgentries) | ||
358 | c->Header.SGList = h->max_cmd_sgentries; | ||
359 | else | ||
360 | diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c | ||
361 | index db811d2..003cd8d 100644 | ||
362 | --- a/drivers/bluetooth/ath3k.c | ||
363 | +++ b/drivers/bluetooth/ath3k.c | ||
364 | @@ -71,6 +71,8 @@ static struct usb_device_id ath3k_table[] = { | ||
365 | |||
366 | /* Atheros AR3012 with sflash firmware*/ | ||
367 | { USB_DEVICE(0x0CF3, 0x3004) }, | ||
368 | + { USB_DEVICE(0x0CF3, 0x311D) }, | ||
369 | + { USB_DEVICE(0x13d3, 0x3375) }, | ||
370 | |||
371 | /* Atheros AR5BBU12 with sflash firmware */ | ||
372 | { USB_DEVICE(0x0489, 0xE02C) }, | ||
373 | @@ -87,6 +89,8 @@ static struct usb_device_id ath3k_blist_tbl[] = { | ||
374 | |||
375 | /* Atheros AR3012 with sflash firmware*/ | ||
376 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
377 | + { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, | ||
378 | + { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | ||
379 | |||
380 | { } /* Terminating entry */ | ||
381 | }; | ||
382 | diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c | ||
383 | index c16c750..db44ad5 100644 | ||
384 | --- a/drivers/bluetooth/btusb.c | ||
385 | +++ b/drivers/bluetooth/btusb.c | ||
386 | @@ -101,6 +101,7 @@ static struct usb_device_id btusb_table[] = { | ||
387 | { USB_DEVICE(0x0c10, 0x0000) }, | ||
388 | |||
389 | /* Broadcom BCM20702A0 */ | ||
390 | + { USB_DEVICE(0x0a5c, 0x21e3) }, | ||
391 | { USB_DEVICE(0x413c, 0x8197) }, | ||
392 | |||
393 | { } /* Terminating entry */ | ||
394 | @@ -126,6 +127,8 @@ static struct usb_device_id blacklist_table[] = { | ||
395 | |||
396 | /* Atheros 3012 with sflash firmware */ | ||
397 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | ||
398 | + { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, | ||
399 | + { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | ||
400 | |||
401 | /* Atheros AR5BBU12 with sflash firmware */ | ||
402 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, | ||
403 | diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c | ||
404 | index 48ad2a7..8f3d6db 100644 | ||
405 | --- a/drivers/bluetooth/hci_ldisc.c | ||
406 | +++ b/drivers/bluetooth/hci_ldisc.c | ||
407 | @@ -237,7 +237,6 @@ static void hci_uart_destruct(struct hci_dev *hdev) | ||
408 | return; | ||
409 | |||
410 | BT_DBG("%s", hdev->name); | ||
411 | - kfree(hdev->driver_data); | ||
412 | } | ||
413 | |||
414 | /* ------ LDISC part ------ */ | ||
415 | @@ -310,12 +309,13 @@ static void hci_uart_tty_close(struct tty_struct *tty) | ||
416 | hci_uart_close(hdev); | ||
417 | |||
418 | if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { | ||
419 | - hu->proto->close(hu); | ||
420 | if (hdev) { | ||
421 | hci_unregister_dev(hdev); | ||
422 | hci_free_dev(hdev); | ||
423 | } | ||
424 | + hu->proto->close(hu); | ||
425 | } | ||
426 | + kfree(hu); | ||
427 | } | ||
428 | } | ||
429 | |||
430 | diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig | ||
431 | index 5a99bb3..da85c0d 100644 | ||
432 | --- a/drivers/dma/Kconfig | ||
433 | +++ b/drivers/dma/Kconfig | ||
434 | @@ -201,18 +201,17 @@ config PL330_DMA | ||
435 | platform_data for a dma-pl330 device. | ||
436 | |||
437 | config PCH_DMA | ||
438 | - tristate "Intel EG20T PCH / OKI Semi IOH(ML7213/ML7223) DMA support" | ||
439 | + tristate "Intel EG20T PCH / OKI Semi IOH(ML7213/ML7223/ML7831) DMA support" | ||
440 | depends on PCI && X86 | ||
441 | select DMA_ENGINE | ||
442 | help | ||
443 | Enable support for Intel EG20T PCH DMA engine. | ||
444 | - | ||
445 | This driver also can be used for OKI SEMICONDUCTOR IOH(Input/ | ||
446 | - Output Hub), ML7213 and ML7223. | ||
447 | - ML7213 IOH is for IVI(In-Vehicle Infotainment) use and ML7223 IOH is | ||
448 | - for MP(Media Phone) use. | ||
449 | - ML7213/ML7223 is companion chip for Intel Atom E6xx series. | ||
450 | - ML7213/ML7223 is completely compatible for Intel EG20T PCH. | ||
451 | + Output Hub), ML7213, ML7223 and ML7831. | ||
452 | + ML7213 IOH is for IVI(In-Vehicle Infotainment) use, ML7223 IOH is | ||
453 | + for MP(Media Phone) use and ML7831 IOH is for general purpose use. | ||
454 | + ML7213/ML7223/ML7831 is companion chip for Intel Atom E6xx series. | ||
455 | + ML7213/ML7223/ML7831 is completely compatible for Intel EG20T PCH. | ||
456 | |||
457 | config IMX_SDMA | ||
458 | tristate "i.MX SDMA support" | ||
459 | diff --git a/drivers/dma/pch_dma.c b/drivers/dma/pch_dma.c | ||
460 | index a6d0e3d..629c430 100644 | ||
461 | --- a/drivers/dma/pch_dma.c | ||
462 | +++ b/drivers/dma/pch_dma.c | ||
463 | @@ -1018,6 +1018,8 @@ static void __devexit pch_dma_remove(struct pci_dev *pdev) | ||
464 | #define PCI_DEVICE_ID_ML7223_DMA2_4CH 0x800E | ||
465 | #define PCI_DEVICE_ID_ML7223_DMA3_4CH 0x8017 | ||
466 | #define PCI_DEVICE_ID_ML7223_DMA4_4CH 0x803B | ||
467 | +#define PCI_DEVICE_ID_ML7831_DMA1_8CH 0x8810 | ||
468 | +#define PCI_DEVICE_ID_ML7831_DMA2_4CH 0x8815 | ||
469 | |||
470 | DEFINE_PCI_DEVICE_TABLE(pch_dma_id_table) = { | ||
471 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_EG20T_PCH_DMA_8CH), 8 }, | ||
472 | @@ -1030,6 +1032,8 @@ DEFINE_PCI_DEVICE_TABLE(pch_dma_id_table) = { | ||
473 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA2_4CH), 4}, /* Video SPI */ | ||
474 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA3_4CH), 4}, /* Security */ | ||
475 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_DMA4_4CH), 4}, /* FPGA */ | ||
476 | + { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_DMA1_8CH), 8}, /* UART */ | ||
477 | + { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_DMA2_4CH), 4}, /* SPI */ | ||
478 | { 0, }, | ||
479 | }; | ||
480 | |||
481 | @@ -1057,7 +1061,7 @@ static void __exit pch_dma_exit(void) | ||
482 | module_init(pch_dma_init); | ||
483 | module_exit(pch_dma_exit); | ||
484 | |||
485 | -MODULE_DESCRIPTION("Intel EG20T PCH / OKI SEMICONDUCTOR ML7213 IOH " | ||
486 | - "DMA controller driver"); | ||
487 | +MODULE_DESCRIPTION("Intel EG20T PCH / OKI SEMICON ML7213/ML7223/ML7831 IOH" | ||
488 | + "DMA controller driver"); | ||
489 | MODULE_AUTHOR("Yong Wang <yong.y.wang@intel.com>"); | ||
490 | MODULE_LICENSE("GPL v2"); | ||
491 | diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig | ||
492 | index 8482a23..4e04157 100644 | ||
493 | --- a/drivers/gpio/Kconfig | ||
494 | +++ b/drivers/gpio/Kconfig | ||
495 | @@ -387,7 +387,7 @@ config GPIO_LANGWELL | ||
496 | Say Y here to support Intel Langwell/Penwell GPIO. | ||
497 | |||
498 | config GPIO_PCH | ||
499 | - tristate "Intel EG20T PCH / OKI SEMICONDUCTOR ML7223 IOH GPIO" | ||
500 | + tristate "Intel EG20T PCH/LAPIS Semiconductor IOH(ML7223/ML7831) GPIO" | ||
501 | depends on PCI && X86 | ||
502 | select GENERIC_IRQ_CHIP | ||
503 | help | ||
504 | @@ -395,11 +395,12 @@ config GPIO_PCH | ||
505 | which is an IOH(Input/Output Hub) for x86 embedded processor. | ||
506 | This driver can access PCH GPIO device. | ||
507 | |||
508 | - This driver also can be used for OKI SEMICONDUCTOR IOH(Input/ | ||
509 | - Output Hub), ML7223. | ||
510 | + This driver also can be used for LAPIS Semiconductor IOH(Input/ | ||
511 | + Output Hub), ML7223 and ML7831. | ||
512 | ML7223 IOH is for MP(Media Phone) use. | ||
513 | - ML7223 is companion chip for Intel Atom E6xx series. | ||
514 | - ML7223 is completely compatible for Intel EG20T PCH. | ||
515 | + ML7831 IOH is for general purpose use. | ||
516 | + ML7223/ML7831 is companion chip for Intel Atom E6xx series. | ||
517 | + ML7223/ML7831 is completely compatible for Intel EG20T PCH. | ||
518 | |||
519 | config GPIO_ML_IOH | ||
520 | tristate "OKI SEMICONDUCTOR ML7213 IOH GPIO support" | ||
521 | diff --git a/drivers/gpio/gpio-pch.c b/drivers/gpio/gpio-pch.c | ||
522 | index a6008e1..779ff70 100644 | ||
523 | --- a/drivers/gpio/gpio-pch.c | ||
524 | +++ b/drivers/gpio/gpio-pch.c | ||
525 | @@ -392,6 +392,7 @@ static int __devinit pch_gpio_probe(struct pci_dev *pdev, | ||
526 | chip->reg = chip->base; | ||
527 | pci_set_drvdata(pdev, chip); | ||
528 | mutex_init(&chip->lock); | ||
529 | + spin_lock_init(&chip->spinlock); | ||
530 | pch_gpio_setup(chip); | ||
531 | ret = gpiochip_add(&chip->gpio); | ||
532 | if (ret) { | ||
533 | @@ -524,6 +525,7 @@ static DEFINE_PCI_DEVICE_TABLE(pch_gpio_pcidev_id) = { | ||
534 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x8803) }, | ||
535 | { PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8014) }, | ||
536 | { PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8043) }, | ||
537 | + { PCI_DEVICE(PCI_VENDOR_ID_ROHM, 0x8803) }, | ||
538 | { 0, } | ||
539 | }; | ||
540 | MODULE_DEVICE_TABLE(pci, pch_gpio_pcidev_id); | ||
541 | diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c | ||
542 | index e52b705..d0f8830 100644 | ||
543 | --- a/drivers/gpu/drm/i915/i915_drv.c | ||
544 | +++ b/drivers/gpu/drm/i915/i915_drv.c | ||
545 | @@ -64,7 +64,7 @@ MODULE_PARM_DESC(semaphores, | ||
546 | "Use semaphores for inter-ring sync (default: -1 (use per-chip defaults))"); | ||
547 | |||
548 | int i915_enable_rc6 __read_mostly = -1; | ||
549 | -module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600); | ||
550 | +module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0400); | ||
551 | MODULE_PARM_DESC(i915_enable_rc6, | ||
552 | "Enable power-saving render C-state 6 (default: -1 (use per-chip default)"); | ||
553 | |||
554 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c | ||
555 | index 9011f48..390768f 100644 | ||
556 | --- a/drivers/gpu/drm/i915/intel_display.c | ||
557 | +++ b/drivers/gpu/drm/i915/intel_display.c | ||
558 | @@ -5646,12 +5646,15 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | ||
559 | if (is_lvds) { | ||
560 | temp = I915_READ(PCH_LVDS); | ||
561 | temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; | ||
562 | - if (HAS_PCH_CPT(dev)) | ||
563 | + if (HAS_PCH_CPT(dev)) { | ||
564 | + temp &= ~PORT_TRANS_SEL_MASK; | ||
565 | temp |= PORT_TRANS_SEL_CPT(pipe); | ||
566 | - else if (pipe == 1) | ||
567 | - temp |= LVDS_PIPEB_SELECT; | ||
568 | - else | ||
569 | - temp &= ~LVDS_PIPEB_SELECT; | ||
570 | + } else { | ||
571 | + if (pipe == 1) | ||
572 | + temp |= LVDS_PIPEB_SELECT; | ||
573 | + else | ||
574 | + temp &= ~LVDS_PIPEB_SELECT; | ||
575 | + } | ||
576 | |||
577 | /* set the corresponsding LVDS_BORDER bit */ | ||
578 | temp |= dev_priv->lvds_border_bits; | ||
579 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c | ||
580 | index 94f860c..12eb789 100644 | ||
581 | --- a/drivers/gpu/drm/i915/intel_dp.c | ||
582 | +++ b/drivers/gpu/drm/i915/intel_dp.c | ||
583 | @@ -219,14 +219,38 @@ intel_dp_max_data_rate(int max_link_clock, int max_lanes) | ||
584 | return (max_link_clock * max_lanes * 8) / 10; | ||
585 | } | ||
586 | |||
587 | +static bool | ||
588 | +intel_dp_adjust_dithering(struct intel_dp *intel_dp, | ||
589 | + struct drm_display_mode *mode, | ||
590 | + struct drm_display_mode *adjusted_mode) | ||
591 | +{ | ||
592 | + int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); | ||
593 | + int max_lanes = intel_dp_max_lane_count(intel_dp); | ||
594 | + int max_rate, mode_rate; | ||
595 | + | ||
596 | + mode_rate = intel_dp_link_required(mode->clock, 24); | ||
597 | + max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); | ||
598 | + | ||
599 | + if (mode_rate > max_rate) { | ||
600 | + mode_rate = intel_dp_link_required(mode->clock, 18); | ||
601 | + if (mode_rate > max_rate) | ||
602 | + return false; | ||
603 | + | ||
604 | + if (adjusted_mode) | ||
605 | + adjusted_mode->private_flags | ||
606 | + |= INTEL_MODE_DP_FORCE_6BPC; | ||
607 | + | ||
608 | + return true; | ||
609 | + } | ||
610 | + | ||
611 | + return true; | ||
612 | +} | ||
613 | + | ||
614 | static int | ||
615 | intel_dp_mode_valid(struct drm_connector *connector, | ||
616 | struct drm_display_mode *mode) | ||
617 | { | ||
618 | struct intel_dp *intel_dp = intel_attached_dp(connector); | ||
619 | - int max_link_clock = intel_dp_link_clock(intel_dp_max_link_bw(intel_dp)); | ||
620 | - int max_lanes = intel_dp_max_lane_count(intel_dp); | ||
621 | - int max_rate, mode_rate; | ||
622 | |||
623 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { | ||
624 | if (mode->hdisplay > intel_dp->panel_fixed_mode->hdisplay) | ||
625 | @@ -236,16 +260,8 @@ intel_dp_mode_valid(struct drm_connector *connector, | ||
626 | return MODE_PANEL; | ||
627 | } | ||
628 | |||
629 | - mode_rate = intel_dp_link_required(mode->clock, 24); | ||
630 | - max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); | ||
631 | - | ||
632 | - if (mode_rate > max_rate) { | ||
633 | - mode_rate = intel_dp_link_required(mode->clock, 18); | ||
634 | - if (mode_rate > max_rate) | ||
635 | - return MODE_CLOCK_HIGH; | ||
636 | - else | ||
637 | - mode->private_flags |= INTEL_MODE_DP_FORCE_6BPC; | ||
638 | - } | ||
639 | + if (!intel_dp_adjust_dithering(intel_dp, mode, NULL)) | ||
640 | + return MODE_CLOCK_HIGH; | ||
641 | |||
642 | if (mode->clock < 10000) | ||
643 | return MODE_CLOCK_LOW; | ||
644 | @@ -673,7 +689,7 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | ||
645 | int lane_count, clock; | ||
646 | int max_lane_count = intel_dp_max_lane_count(intel_dp); | ||
647 | int max_clock = intel_dp_max_link_bw(intel_dp) == DP_LINK_BW_2_7 ? 1 : 0; | ||
648 | - int bpp = mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; | ||
649 | + int bpp; | ||
650 | static int bws[2] = { DP_LINK_BW_1_62, DP_LINK_BW_2_7 }; | ||
651 | |||
652 | if (is_edp(intel_dp) && intel_dp->panel_fixed_mode) { | ||
653 | @@ -687,6 +703,11 @@ intel_dp_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode, | ||
654 | mode->clock = intel_dp->panel_fixed_mode->clock; | ||
655 | } | ||
656 | |||
657 | + if (!intel_dp_adjust_dithering(intel_dp, mode, adjusted_mode)) | ||
658 | + return false; | ||
659 | + | ||
660 | + bpp = adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; | ||
661 | + | ||
662 | for (lane_count = 1; lane_count <= max_lane_count; lane_count <<= 1) { | ||
663 | for (clock = 0; clock <= max_clock; clock++) { | ||
664 | int link_avail = intel_dp_max_data_rate(intel_dp_link_clock(bws[clock]), lane_count); | ||
665 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
666 | index 30a9af9..8673581 100644 | ||
667 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
668 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
669 | @@ -1052,7 +1052,7 @@ int intel_init_ring_buffer(struct drm_device *dev, | ||
670 | * of the buffer. | ||
671 | */ | ||
672 | ring->effective_size = ring->size; | ||
673 | - if (IS_I830(ring->dev)) | ||
674 | + if (IS_I830(ring->dev) || IS_845G(ring->dev)) | ||
675 | ring->effective_size -= 128; | ||
676 | |||
677 | return 0; | ||
678 | diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
679 | index 0f8eb48..5351ee1 100644 | ||
680 | --- a/drivers/gpu/drm/radeon/atombios_encoders.c | ||
681 | +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | ||
682 | @@ -246,6 +246,10 @@ atombios_dvo_setup(struct drm_encoder *encoder, int action) | ||
683 | if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) | ||
684 | return; | ||
685 | |||
686 | + /* some R4xx chips have the wrong frev */ | ||
687 | + if (rdev->family <= CHIP_RV410) | ||
688 | + frev = 1; | ||
689 | + | ||
690 | switch (frev) { | ||
691 | case 1: | ||
692 | switch (crev) { | ||
693 | diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
694 | index f7d39ac..4a4493f 100644 | ||
695 | --- a/drivers/gpu/drm/radeon/radeon_connectors.c | ||
696 | +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | ||
697 | @@ -946,7 +946,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
698 | |||
699 | encoder = obj_to_encoder(obj); | ||
700 | |||
701 | - if (encoder->encoder_type != DRM_MODE_ENCODER_DAC || | ||
702 | + if (encoder->encoder_type != DRM_MODE_ENCODER_DAC && | ||
703 | encoder->encoder_type != DRM_MODE_ENCODER_TVDAC) | ||
704 | continue; | ||
705 | |||
706 | @@ -976,6 +976,7 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
707 | * cases the DVI port is actually a virtual KVM port connected to the service | ||
708 | * processor. | ||
709 | */ | ||
710 | +out: | ||
711 | if ((!rdev->is_atom_bios) && | ||
712 | (ret == connector_status_disconnected) && | ||
713 | rdev->mode_info.bios_hardcoded_edid_size) { | ||
714 | @@ -983,7 +984,6 @@ radeon_dvi_detect(struct drm_connector *connector, bool force) | ||
715 | ret = connector_status_connected; | ||
716 | } | ||
717 | |||
718 | -out: | ||
719 | /* updated in get modes as well since we need to know if it's analog or digital */ | ||
720 | radeon_connector_update_scratch_regs(connector, ret); | ||
721 | return ret; | ||
722 | diff --git a/drivers/gpu/drm/radeon/radeon_i2c.c b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
723 | index 7bb1b07..1441b00 100644 | ||
724 | --- a/drivers/gpu/drm/radeon/radeon_i2c.c | ||
725 | +++ b/drivers/gpu/drm/radeon/radeon_i2c.c | ||
726 | @@ -890,6 +890,10 @@ struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev, | ||
727 | struct radeon_i2c_chan *i2c; | ||
728 | int ret; | ||
729 | |||
730 | + /* don't add the mm_i2c bus unless hw_i2c is enabled */ | ||
731 | + if (rec->mm_i2c && (radeon_hw_i2c == 0)) | ||
732 | + return NULL; | ||
733 | + | ||
734 | i2c = kzalloc(sizeof(struct radeon_i2c_chan), GFP_KERNEL); | ||
735 | if (i2c == NULL) | ||
736 | return NULL; | ||
737 | diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
738 | index e7ddb49..baa019e 100644 | ||
739 | --- a/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
740 | +++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c | ||
741 | @@ -143,6 +143,12 @@ static bool radeon_msi_ok(struct radeon_device *rdev) | ||
742 | (rdev->pdev->subsystem_device == 0x01fd)) | ||
743 | return true; | ||
744 | |||
745 | + /* RV515 seems to have MSI issues where it loses | ||
746 | + * MSI rearms occasionally. This leads to lockups and freezes. | ||
747 | + * disable it by default. | ||
748 | + */ | ||
749 | + if (rdev->family == CHIP_RV515) | ||
750 | + return false; | ||
751 | if (rdev->flags & RADEON_IS_IGP) { | ||
752 | /* APUs work fine with MSIs */ | ||
753 | if (rdev->family >= CHIP_PALM) | ||
754 | diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c | ||
755 | index 2a8722b..62a8e68 100644 | ||
756 | --- a/drivers/md/bitmap.c | ||
757 | +++ b/drivers/md/bitmap.c | ||
758 | @@ -1819,7 +1819,9 @@ int bitmap_load(struct mddev *mddev) | ||
759 | * re-add of a missing device */ | ||
760 | start = mddev->recovery_cp; | ||
761 | |||
762 | + mutex_lock(&mddev->bitmap_info.mutex); | ||
763 | err = bitmap_init_from_disk(bitmap, start); | ||
764 | + mutex_unlock(&mddev->bitmap_info.mutex); | ||
765 | |||
766 | if (err) | ||
767 | goto out; | ||
768 | diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | ||
769 | index 48406ca..43c7b25 100644 | ||
770 | --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | ||
771 | +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_main.c | ||
772 | @@ -1745,6 +1745,12 @@ int pch_gbe_up(struct pch_gbe_adapter *adapter) | ||
773 | struct pch_gbe_rx_ring *rx_ring = adapter->rx_ring; | ||
774 | int err; | ||
775 | |||
776 | + /* Ensure we have a valid MAC */ | ||
777 | + if (!is_valid_ether_addr(adapter->hw.mac.addr)) { | ||
778 | + pr_err("Error: Invalid MAC address\n"); | ||
779 | + return -EINVAL; | ||
780 | + } | ||
781 | + | ||
782 | /* hardware has been reset, we need to reload some things */ | ||
783 | pch_gbe_set_multi(netdev); | ||
784 | |||
785 | @@ -2467,9 +2473,14 @@ static int pch_gbe_probe(struct pci_dev *pdev, | ||
786 | |||
787 | memcpy(netdev->dev_addr, adapter->hw.mac.addr, netdev->addr_len); | ||
788 | if (!is_valid_ether_addr(netdev->dev_addr)) { | ||
789 | - dev_err(&pdev->dev, "Invalid MAC Address\n"); | ||
790 | - ret = -EIO; | ||
791 | - goto err_free_adapter; | ||
792 | + /* | ||
793 | + * If the MAC is invalid (or just missing), display a warning | ||
794 | + * but do not abort setting up the device. pch_gbe_up will | ||
795 | + * prevent the interface from being brought up until a valid MAC | ||
796 | + * is set. | ||
797 | + */ | ||
798 | + dev_err(&pdev->dev, "Invalid MAC address, " | ||
799 | + "interface disabled.\n"); | ||
800 | } | ||
801 | setup_timer(&adapter->watchdog_timer, pch_gbe_watchdog, | ||
802 | (unsigned long)adapter); | ||
803 | diff --git a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | ||
804 | index 9cb5f91..29e23be 100644 | ||
805 | --- a/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | ||
806 | +++ b/drivers/net/ethernet/oki-semi/pch_gbe/pch_gbe_param.c | ||
807 | @@ -321,10 +321,10 @@ static void pch_gbe_check_copper_options(struct pch_gbe_adapter *adapter) | ||
808 | pr_debug("AutoNeg specified along with Speed or Duplex, AutoNeg parameter ignored\n"); | ||
809 | hw->phy.autoneg_advertised = opt.def; | ||
810 | } else { | ||
811 | - hw->phy.autoneg_advertised = AutoNeg; | ||
812 | - pch_gbe_validate_option( | ||
813 | - (int *)(&hw->phy.autoneg_advertised), | ||
814 | - &opt, adapter); | ||
815 | + int tmp = AutoNeg; | ||
816 | + | ||
817 | + pch_gbe_validate_option(&tmp, &opt, adapter); | ||
818 | + hw->phy.autoneg_advertised = tmp; | ||
819 | } | ||
820 | } | ||
821 | |||
822 | @@ -495,9 +495,10 @@ void pch_gbe_check_options(struct pch_gbe_adapter *adapter) | ||
823 | .arg = { .l = { .nr = (int)ARRAY_SIZE(fc_list), | ||
824 | .p = fc_list } } | ||
825 | }; | ||
826 | - hw->mac.fc = FlowControl; | ||
827 | - pch_gbe_validate_option((int *)(&hw->mac.fc), | ||
828 | - &opt, adapter); | ||
829 | + int tmp = FlowControl; | ||
830 | + | ||
831 | + pch_gbe_validate_option(&tmp, &opt, adapter); | ||
832 | + hw->mac.fc = tmp; | ||
833 | } | ||
834 | |||
835 | pch_gbe_check_copper_options(adapter); | ||
836 | diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c | ||
837 | index 8ddef3e..d771de5 100644 | ||
838 | --- a/drivers/net/wireless/ath/ath9k/calib.c | ||
839 | +++ b/drivers/net/wireless/ath/ath9k/calib.c | ||
840 | @@ -20,7 +20,6 @@ | ||
841 | |||
842 | /* Common calibration code */ | ||
843 | |||
844 | -#define ATH9K_NF_TOO_HIGH -60 | ||
845 | |||
846 | static int16_t ath9k_hw_get_nf_hist_mid(int16_t *nfCalBuffer) | ||
847 | { | ||
848 | @@ -348,10 +347,10 @@ static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) | ||
849 | "NF calibrated [%s] [chain %d] is %d\n", | ||
850 | (i >= 3 ? "ext" : "ctl"), i % 3, nf[i]); | ||
851 | |||
852 | - if (nf[i] > ATH9K_NF_TOO_HIGH) { | ||
853 | + if (nf[i] > limit->max) { | ||
854 | ath_dbg(common, ATH_DBG_CALIBRATE, | ||
855 | "NF[%d] (%d) > MAX (%d), correcting to MAX\n", | ||
856 | - i, nf[i], ATH9K_NF_TOO_HIGH); | ||
857 | + i, nf[i], limit->max); | ||
858 | nf[i] = limit->max; | ||
859 | } else if (nf[i] < limit->min) { | ||
860 | ath_dbg(common, ATH_DBG_CALIBRATE, | ||
861 | diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c | ||
862 | index 9afcad3..d44d398 100644 | ||
863 | --- a/drivers/net/wireless/rtlwifi/pci.c | ||
864 | +++ b/drivers/net/wireless/rtlwifi/pci.c | ||
865 | @@ -926,8 +926,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) | ||
866 | memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); | ||
867 | ring = &rtlpci->tx_ring[BEACON_QUEUE]; | ||
868 | pskb = __skb_dequeue(&ring->queue); | ||
869 | - if (pskb) | ||
870 | + if (pskb) { | ||
871 | + struct rtl_tx_desc *entry = &ring->desc[ring->idx]; | ||
872 | + pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc( | ||
873 | + (u8 *) entry, true, HW_DESC_TXBUFF_ADDR), | ||
874 | + pskb->len, PCI_DMA_TODEVICE); | ||
875 | kfree_skb(pskb); | ||
876 | + } | ||
877 | |||
878 | /*NB: the beacon data buffer must be 32-bit aligned. */ | ||
879 | pskb = ieee80211_beacon_get(hw, mac->vif); | ||
880 | diff --git a/drivers/rtc/rtc-pl031.c b/drivers/rtc/rtc-pl031.c | ||
881 | index ff1b84b..e86edfc 100644 | ||
882 | --- a/drivers/rtc/rtc-pl031.c | ||
883 | +++ b/drivers/rtc/rtc-pl031.c | ||
884 | @@ -339,8 +339,7 @@ static int pl031_probe(struct amba_device *adev, const struct amba_id *id) | ||
885 | dev_dbg(&adev->dev, "revision = 0x%01x\n", ldata->hw_revision); | ||
886 | |||
887 | /* Enable the clockwatch on ST Variants */ | ||
888 | - if ((ldata->hw_designer == AMBA_VENDOR_ST) && | ||
889 | - (ldata->hw_revision > 1)) | ||
890 | + if (ldata->hw_designer == AMBA_VENDOR_ST) | ||
891 | writel(readl(ldata->base + RTC_CR) | RTC_CR_CWEN, | ||
892 | ldata->base + RTC_CR); | ||
893 | |||
894 | diff --git a/drivers/spi/Kconfig b/drivers/spi/Kconfig | ||
895 | index 8ba4510..7587796 100644 | ||
896 | --- a/drivers/spi/Kconfig | ||
897 | +++ b/drivers/spi/Kconfig | ||
898 | @@ -346,14 +346,14 @@ config SPI_TI_SSP | ||
899 | serial port. | ||
900 | |||
901 | config SPI_TOPCLIFF_PCH | ||
902 | - tristate "Intel EG20T PCH/OKI SEMICONDUCTOR ML7213 IOH SPI controller" | ||
903 | + tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) SPI" | ||
904 | depends on PCI | ||
905 | help | ||
906 | SPI driver for the Topcliff PCH (Platform Controller Hub) SPI bus | ||
907 | used in some x86 embedded processors. | ||
908 | |||
909 | - This driver also supports the ML7213, a companion chip for the | ||
910 | - Atom E6xx series and compatible with the Intel EG20T PCH. | ||
911 | + This driver also supports the ML7213/ML7223/ML7831, a companion chip | ||
912 | + for the Atom E6xx series and compatible with the Intel EG20T PCH. | ||
913 | |||
914 | config SPI_TXX9 | ||
915 | tristate "Toshiba TXx9 SPI controller" | ||
916 | diff --git a/drivers/spi/spi-topcliff-pch.c b/drivers/spi/spi-topcliff-pch.c | ||
917 | index 027b6d0..54b9d2e 100644 | ||
918 | --- a/drivers/spi/spi-topcliff-pch.c | ||
919 | +++ b/drivers/spi/spi-topcliff-pch.c | ||
920 | @@ -95,16 +95,18 @@ | ||
921 | #define PCH_CLOCK_HZ 50000000 | ||
922 | #define PCH_MAX_SPBR 1023 | ||
923 | |||
924 | -/* Definition for ML7213 by OKI SEMICONDUCTOR */ | ||
925 | +/* Definition for ML7213/ML7831 by OKI SEMICONDUCTOR */ | ||
926 | #define PCI_VENDOR_ID_ROHM 0x10DB | ||
927 | #define PCI_DEVICE_ID_ML7213_SPI 0x802c | ||
928 | #define PCI_DEVICE_ID_ML7223_SPI 0x800F | ||
929 | +#define PCI_DEVICE_ID_ML7831_SPI 0x8816 | ||
930 | |||
931 | /* | ||
932 | * Set the number of SPI instance max | ||
933 | * Intel EG20T PCH : 1ch | ||
934 | * OKI SEMICONDUCTOR ML7213 IOH : 2ch | ||
935 | * OKI SEMICONDUCTOR ML7223 IOH : 1ch | ||
936 | + * OKI SEMICONDUCTOR ML7831 IOH : 1ch | ||
937 | */ | ||
938 | #define PCH_SPI_MAX_DEV 2 | ||
939 | |||
940 | @@ -218,6 +220,7 @@ static struct pci_device_id pch_spi_pcidev_id[] = { | ||
941 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_GE_SPI), 1, }, | ||
942 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_SPI), 2, }, | ||
943 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_SPI), 1, }, | ||
944 | + { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7831_SPI), 1, }, | ||
945 | { } | ||
946 | }; | ||
947 | |||
948 | @@ -315,22 +318,23 @@ static void pch_spi_handler_sub(struct pch_spi_data *data, u32 reg_spsr_val, | ||
949 | data->tx_index = tx_index; | ||
950 | data->rx_index = rx_index; | ||
951 | |||
952 | - } | ||
953 | - | ||
954 | - /* if transfer complete interrupt */ | ||
955 | - if (reg_spsr_val & SPSR_FI_BIT) { | ||
956 | - if ((tx_index == bpw_len) && (rx_index == tx_index)) { | ||
957 | - /* disable interrupts */ | ||
958 | - pch_spi_setclr_reg(data->master, PCH_SPCR, 0, PCH_ALL); | ||
959 | - | ||
960 | - /* transfer is completed; | ||
961 | - inform pch_spi_process_messages */ | ||
962 | - data->transfer_complete = true; | ||
963 | - data->transfer_active = false; | ||
964 | - wake_up(&data->wait); | ||
965 | - } else { | ||
966 | - dev_err(&data->master->dev, | ||
967 | - "%s : Transfer is not completed", __func__); | ||
968 | + /* if transfer complete interrupt */ | ||
969 | + if (reg_spsr_val & SPSR_FI_BIT) { | ||
970 | + if ((tx_index == bpw_len) && (rx_index == tx_index)) { | ||
971 | + /* disable interrupts */ | ||
972 | + pch_spi_setclr_reg(data->master, PCH_SPCR, 0, | ||
973 | + PCH_ALL); | ||
974 | + | ||
975 | + /* transfer is completed; | ||
976 | + inform pch_spi_process_messages */ | ||
977 | + data->transfer_complete = true; | ||
978 | + data->transfer_active = false; | ||
979 | + wake_up(&data->wait); | ||
980 | + } else { | ||
981 | + dev_err(&data->master->dev, | ||
982 | + "%s : Transfer is not completed", | ||
983 | + __func__); | ||
984 | + } | ||
985 | } | ||
986 | } | ||
987 | } | ||
988 | diff --git a/drivers/staging/iio/magnetometer/hmc5843.c b/drivers/staging/iio/magnetometer/hmc5843.c | ||
989 | index fc9ee97..870db4f 100644 | ||
990 | --- a/drivers/staging/iio/magnetometer/hmc5843.c | ||
991 | +++ b/drivers/staging/iio/magnetometer/hmc5843.c | ||
992 | @@ -521,7 +521,9 @@ static int hmc5843_detect(struct i2c_client *client, | ||
993 | /* Called when we have found a new HMC5843. */ | ||
994 | static void hmc5843_init_client(struct i2c_client *client) | ||
995 | { | ||
996 | - struct hmc5843_data *data = i2c_get_clientdata(client); | ||
997 | + struct iio_dev *indio_dev = i2c_get_clientdata(client); | ||
998 | + struct hmc5843_data *data = iio_priv(indio_dev); | ||
999 | + | ||
1000 | hmc5843_set_meas_conf(client, data->meas_conf); | ||
1001 | hmc5843_set_rate(client, data->rate); | ||
1002 | hmc5843_configure(client, data->operating_mode); | ||
1003 | diff --git a/drivers/tty/serial/altera_uart.c b/drivers/tty/serial/altera_uart.c | ||
1004 | index 1d04c50..5ba0898 100644 | ||
1005 | --- a/drivers/tty/serial/altera_uart.c | ||
1006 | +++ b/drivers/tty/serial/altera_uart.c | ||
1007 | @@ -555,7 +555,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) | ||
1008 | res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
1009 | if (res_mem) | ||
1010 | port->mapbase = res_mem->start; | ||
1011 | - else if (platp->mapbase) | ||
1012 | + else if (platp) | ||
1013 | port->mapbase = platp->mapbase; | ||
1014 | else | ||
1015 | return -EINVAL; | ||
1016 | @@ -563,7 +563,7 @@ static int __devinit altera_uart_probe(struct platform_device *pdev) | ||
1017 | res_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | ||
1018 | if (res_irq) | ||
1019 | port->irq = res_irq->start; | ||
1020 | - else if (platp->irq) | ||
1021 | + else if (platp) | ||
1022 | port->irq = platp->irq; | ||
1023 | |||
1024 | /* Check platform data first so we can override device node data */ | ||
1025 | diff --git a/drivers/tty/serial/amba-pl011.c b/drivers/tty/serial/amba-pl011.c | ||
1026 | index 8e00926..6da8cf8 100644 | ||
1027 | --- a/drivers/tty/serial/amba-pl011.c | ||
1028 | +++ b/drivers/tty/serial/amba-pl011.c | ||
1029 | @@ -1380,6 +1380,10 @@ static int pl011_startup(struct uart_port *port) | ||
1030 | |||
1031 | uap->port.uartclk = clk_get_rate(uap->clk); | ||
1032 | |||
1033 | + /* Clear pending error and receive interrupts */ | ||
1034 | + writew(UART011_OEIS | UART011_BEIS | UART011_PEIS | UART011_FEIS | | ||
1035 | + UART011_RTIS | UART011_RXIS, uap->port.membase + UART011_ICR); | ||
1036 | + | ||
1037 | /* | ||
1038 | * Allocate the IRQ | ||
1039 | */ | ||
1040 | @@ -1414,10 +1418,6 @@ static int pl011_startup(struct uart_port *port) | ||
1041 | cr = UART01x_CR_UARTEN | UART011_CR_RXE | UART011_CR_TXE; | ||
1042 | writew(cr, uap->port.membase + UART011_CR); | ||
1043 | |||
1044 | - /* Clear pending error interrupts */ | ||
1045 | - writew(UART011_OEIS | UART011_BEIS | UART011_PEIS | UART011_FEIS, | ||
1046 | - uap->port.membase + UART011_ICR); | ||
1047 | - | ||
1048 | /* | ||
1049 | * initialise the old status of the modem signals | ||
1050 | */ | ||
1051 | @@ -1432,6 +1432,9 @@ static int pl011_startup(struct uart_port *port) | ||
1052 | * as well. | ||
1053 | */ | ||
1054 | spin_lock_irq(&uap->port.lock); | ||
1055 | + /* Clear out any spuriously appearing RX interrupts */ | ||
1056 | + writew(UART011_RTIS | UART011_RXIS, | ||
1057 | + uap->port.membase + UART011_ICR); | ||
1058 | uap->im = UART011_RTIM; | ||
1059 | if (!pl011_dma_rx_running(uap)) | ||
1060 | uap->im |= UART011_RXIM; | ||
1061 | @@ -1932,6 +1935,10 @@ static int pl011_probe(struct amba_device *dev, const struct amba_id *id) | ||
1062 | uap->port.line = i; | ||
1063 | pl011_dma_probe(uap); | ||
1064 | |||
1065 | + /* Ensure interrupts from this UART are masked and cleared */ | ||
1066 | + writew(0, uap->port.membase + UART011_IMSC); | ||
1067 | + writew(0xffff, uap->port.membase + UART011_ICR); | ||
1068 | + | ||
1069 | snprintf(uap->type, sizeof(uap->type), "PL011 rev%u", amba_rev(dev)); | ||
1070 | |||
1071 | amba_ports[i] = uap; | ||
1072 | diff --git a/drivers/tty/serial/pch_uart.c b/drivers/tty/serial/pch_uart.c | ||
1073 | index d6aba8c..da776a0 100644 | ||
1074 | --- a/drivers/tty/serial/pch_uart.c | ||
1075 | +++ b/drivers/tty/serial/pch_uart.c | ||
1076 | @@ -1438,6 +1438,7 @@ static struct eg20t_port *pch_uart_init_port(struct pci_dev *pdev, | ||
1077 | } | ||
1078 | |||
1079 | pci_enable_msi(pdev); | ||
1080 | + pci_set_master(pdev); | ||
1081 | |||
1082 | iobase = pci_resource_start(pdev, 0); | ||
1083 | mapbase = pci_resource_start(pdev, 1); | ||
1084 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c | ||
1085 | index 45887a0..c77f0d6 100644 | ||
1086 | --- a/drivers/usb/core/driver.c | ||
1087 | +++ b/drivers/usb/core/driver.c | ||
1088 | @@ -1198,8 +1198,13 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | ||
1089 | if (status == 0) { | ||
1090 | status = usb_suspend_device(udev, msg); | ||
1091 | |||
1092 | - /* Again, ignore errors during system sleep transitions */ | ||
1093 | - if (!PMSG_IS_AUTO(msg)) | ||
1094 | + /* | ||
1095 | + * Ignore errors from non-root-hub devices during | ||
1096 | + * system sleep transitions. For the most part, | ||
1097 | + * these devices should go to low power anyway when | ||
1098 | + * the entire bus is suspended. | ||
1099 | + */ | ||
1100 | + if (udev->parent && !PMSG_IS_AUTO(msg)) | ||
1101 | status = 0; | ||
1102 | } | ||
1103 | |||
1104 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
1105 | index bc06a8f..e238b3b 100644 | ||
1106 | --- a/drivers/usb/core/hub.c | ||
1107 | +++ b/drivers/usb/core/hub.c | ||
1108 | @@ -3072,6 +3072,22 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | ||
1109 | if (retval) | ||
1110 | goto fail; | ||
1111 | |||
1112 | + /* | ||
1113 | + * Some superspeed devices have finished the link training process | ||
1114 | + * and attached to a superspeed hub port, but the device descriptor | ||
1115 | + * got from those devices show they aren't superspeed devices. Warm | ||
1116 | + * reset the port attached by the devices can fix them. | ||
1117 | + */ | ||
1118 | + if ((udev->speed == USB_SPEED_SUPER) && | ||
1119 | + (le16_to_cpu(udev->descriptor.bcdUSB) < 0x0300)) { | ||
1120 | + dev_err(&udev->dev, "got a wrong device descriptor, " | ||
1121 | + "warm reset device\n"); | ||
1122 | + hub_port_reset(hub, port1, udev, | ||
1123 | + HUB_BH_RESET_TIME, true); | ||
1124 | + retval = -EINVAL; | ||
1125 | + goto fail; | ||
1126 | + } | ||
1127 | + | ||
1128 | if (udev->descriptor.bMaxPacketSize0 == 0xff || | ||
1129 | udev->speed == USB_SPEED_SUPER) | ||
1130 | i = 512; | ||
1131 | diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c | ||
1132 | index b3bdfed..aed3e07 100644 | ||
1133 | --- a/drivers/usb/core/message.c | ||
1134 | +++ b/drivers/usb/core/message.c | ||
1135 | @@ -308,7 +308,8 @@ static void sg_complete(struct urb *urb) | ||
1136 | retval = usb_unlink_urb(io->urbs [i]); | ||
1137 | if (retval != -EINPROGRESS && | ||
1138 | retval != -ENODEV && | ||
1139 | - retval != -EBUSY) | ||
1140 | + retval != -EBUSY && | ||
1141 | + retval != -EIDRM) | ||
1142 | dev_err(&io->dev->dev, | ||
1143 | "%s, unlink --> %d\n", | ||
1144 | __func__, retval); | ||
1145 | @@ -317,7 +318,6 @@ static void sg_complete(struct urb *urb) | ||
1146 | } | ||
1147 | spin_lock(&io->lock); | ||
1148 | } | ||
1149 | - urb->dev = NULL; | ||
1150 | |||
1151 | /* on the last completion, signal usb_sg_wait() */ | ||
1152 | io->bytes += urb->actual_length; | ||
1153 | @@ -524,7 +524,6 @@ void usb_sg_wait(struct usb_sg_request *io) | ||
1154 | case -ENXIO: /* hc didn't queue this one */ | ||
1155 | case -EAGAIN: | ||
1156 | case -ENOMEM: | ||
1157 | - io->urbs[i]->dev = NULL; | ||
1158 | retval = 0; | ||
1159 | yield(); | ||
1160 | break; | ||
1161 | @@ -542,7 +541,6 @@ void usb_sg_wait(struct usb_sg_request *io) | ||
1162 | |||
1163 | /* fail any uncompleted urbs */ | ||
1164 | default: | ||
1165 | - io->urbs[i]->dev = NULL; | ||
1166 | io->urbs[i]->status = retval; | ||
1167 | dev_dbg(&io->dev->dev, "%s, submit --> %d\n", | ||
1168 | __func__, retval); | ||
1169 | @@ -593,7 +591,10 @@ void usb_sg_cancel(struct usb_sg_request *io) | ||
1170 | if (!io->urbs [i]->dev) | ||
1171 | continue; | ||
1172 | retval = usb_unlink_urb(io->urbs [i]); | ||
1173 | - if (retval != -EINPROGRESS && retval != -EBUSY) | ||
1174 | + if (retval != -EINPROGRESS | ||
1175 | + && retval != -ENODEV | ||
1176 | + && retval != -EBUSY | ||
1177 | + && retval != -EIDRM) | ||
1178 | dev_warn(&io->dev->dev, "%s, unlink --> %d\n", | ||
1179 | __func__, retval); | ||
1180 | } | ||
1181 | diff --git a/drivers/usb/gadget/pch_udc.c b/drivers/usb/gadget/pch_udc.c | ||
1182 | index 5048a0c..e7fb1a3 100644 | ||
1183 | --- a/drivers/usb/gadget/pch_udc.c | ||
1184 | +++ b/drivers/usb/gadget/pch_udc.c | ||
1185 | @@ -311,6 +311,7 @@ struct pch_udc_ep { | ||
1186 | * @registered: driver regsitered with system | ||
1187 | * @suspended: driver in suspended state | ||
1188 | * @connected: gadget driver associated | ||
1189 | + * @vbus_session: required vbus_session state | ||
1190 | * @set_cfg_not_acked: pending acknowledgement 4 setup | ||
1191 | * @waiting_zlp_ack: pending acknowledgement 4 ZLP | ||
1192 | * @data_requests: DMA pool for data requests | ||
1193 | @@ -337,6 +338,7 @@ struct pch_udc_dev { | ||
1194 | registered:1, | ||
1195 | suspended:1, | ||
1196 | connected:1, | ||
1197 | + vbus_session:1, | ||
1198 | set_cfg_not_acked:1, | ||
1199 | waiting_zlp_ack:1; | ||
1200 | struct pci_pool *data_requests; | ||
1201 | @@ -554,6 +556,29 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev) | ||
1202 | } | ||
1203 | |||
1204 | /** | ||
1205 | + * pch_udc_reconnect() - This API initializes usb device controller, | ||
1206 | + * and clear the disconnect status. | ||
1207 | + * @dev: Reference to pch_udc_regs structure | ||
1208 | + */ | ||
1209 | +static void pch_udc_init(struct pch_udc_dev *dev); | ||
1210 | +static void pch_udc_reconnect(struct pch_udc_dev *dev) | ||
1211 | +{ | ||
1212 | + pch_udc_init(dev); | ||
1213 | + | ||
1214 | + /* enable device interrupts */ | ||
1215 | + /* pch_udc_enable_interrupts() */ | ||
1216 | + pch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR, | ||
1217 | + UDC_DEVINT_UR | UDC_DEVINT_ENUM); | ||
1218 | + | ||
1219 | + /* Clear the disconnect */ | ||
1220 | + pch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES); | ||
1221 | + pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD); | ||
1222 | + mdelay(1); | ||
1223 | + /* Resume USB signalling */ | ||
1224 | + pch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES); | ||
1225 | +} | ||
1226 | + | ||
1227 | +/** | ||
1228 | * pch_udc_vbus_session() - set or clearr the disconnect status. | ||
1229 | * @dev: Reference to pch_udc_regs structure | ||
1230 | * @is_active: Parameter specifying the action | ||
1231 | @@ -563,10 +588,18 @@ static void pch_udc_clear_disconnect(struct pch_udc_dev *dev) | ||
1232 | static inline void pch_udc_vbus_session(struct pch_udc_dev *dev, | ||
1233 | int is_active) | ||
1234 | { | ||
1235 | - if (is_active) | ||
1236 | - pch_udc_clear_disconnect(dev); | ||
1237 | - else | ||
1238 | + if (is_active) { | ||
1239 | + pch_udc_reconnect(dev); | ||
1240 | + dev->vbus_session = 1; | ||
1241 | + } else { | ||
1242 | + if (dev->driver && dev->driver->disconnect) { | ||
1243 | + spin_unlock(&dev->lock); | ||
1244 | + dev->driver->disconnect(&dev->gadget); | ||
1245 | + spin_lock(&dev->lock); | ||
1246 | + } | ||
1247 | pch_udc_set_disconnect(dev); | ||
1248 | + dev->vbus_session = 0; | ||
1249 | + } | ||
1250 | } | ||
1251 | |||
1252 | /** | ||
1253 | @@ -1126,7 +1159,17 @@ static int pch_udc_pcd_pullup(struct usb_gadget *gadget, int is_on) | ||
1254 | if (!gadget) | ||
1255 | return -EINVAL; | ||
1256 | dev = container_of(gadget, struct pch_udc_dev, gadget); | ||
1257 | - pch_udc_vbus_session(dev, is_on); | ||
1258 | + if (is_on) { | ||
1259 | + pch_udc_reconnect(dev); | ||
1260 | + } else { | ||
1261 | + if (dev->driver && dev->driver->disconnect) { | ||
1262 | + spin_unlock(&dev->lock); | ||
1263 | + dev->driver->disconnect(&dev->gadget); | ||
1264 | + spin_lock(&dev->lock); | ||
1265 | + } | ||
1266 | + pch_udc_set_disconnect(dev); | ||
1267 | + } | ||
1268 | + | ||
1269 | return 0; | ||
1270 | } | ||
1271 | |||
1272 | @@ -2335,8 +2378,11 @@ static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev) | ||
1273 | /* Complete request queue */ | ||
1274 | empty_req_queue(ep); | ||
1275 | } | ||
1276 | - if (dev->driver && dev->driver->disconnect) | ||
1277 | + if (dev->driver && dev->driver->disconnect) { | ||
1278 | + spin_unlock(&dev->lock); | ||
1279 | dev->driver->disconnect(&dev->gadget); | ||
1280 | + spin_lock(&dev->lock); | ||
1281 | + } | ||
1282 | } | ||
1283 | |||
1284 | /** | ||
1285 | @@ -2371,6 +2417,11 @@ static void pch_udc_svc_enum_interrupt(struct pch_udc_dev *dev) | ||
1286 | pch_udc_set_dma(dev, DMA_DIR_TX); | ||
1287 | pch_udc_set_dma(dev, DMA_DIR_RX); | ||
1288 | pch_udc_ep_set_rrdy(&(dev->ep[UDC_EP0OUT_IDX])); | ||
1289 | + | ||
1290 | + /* enable device interrupts */ | ||
1291 | + pch_udc_enable_interrupts(dev, UDC_DEVINT_UR | UDC_DEVINT_US | | ||
1292 | + UDC_DEVINT_ES | UDC_DEVINT_ENUM | | ||
1293 | + UDC_DEVINT_SI | UDC_DEVINT_SC); | ||
1294 | } | ||
1295 | |||
1296 | /** | ||
1297 | @@ -2472,8 +2523,24 @@ static void pch_udc_dev_isr(struct pch_udc_dev *dev, u32 dev_intr) | ||
1298 | if (dev_intr & UDC_DEVINT_SC) | ||
1299 | pch_udc_svc_cfg_interrupt(dev); | ||
1300 | /* USB Suspend interrupt */ | ||
1301 | - if (dev_intr & UDC_DEVINT_US) | ||
1302 | + if (dev_intr & UDC_DEVINT_US) { | ||
1303 | + if (dev->driver | ||
1304 | + && dev->driver->suspend) { | ||
1305 | + spin_unlock(&dev->lock); | ||
1306 | + dev->driver->suspend(&dev->gadget); | ||
1307 | + spin_lock(&dev->lock); | ||
1308 | + } | ||
1309 | + | ||
1310 | + if (dev->vbus_session == 0) { | ||
1311 | + if (dev->driver && dev->driver->disconnect) { | ||
1312 | + spin_unlock(&dev->lock); | ||
1313 | + dev->driver->disconnect(&dev->gadget); | ||
1314 | + spin_lock(&dev->lock); | ||
1315 | + } | ||
1316 | + pch_udc_reconnect(dev); | ||
1317 | + } | ||
1318 | dev_dbg(&dev->pdev->dev, "USB_SUSPEND\n"); | ||
1319 | + } | ||
1320 | /* Clear the SOF interrupt, if enabled */ | ||
1321 | if (dev_intr & UDC_DEVINT_SOF) | ||
1322 | dev_dbg(&dev->pdev->dev, "SOF\n"); | ||
1323 | @@ -2499,6 +2566,14 @@ static irqreturn_t pch_udc_isr(int irq, void *pdev) | ||
1324 | dev_intr = pch_udc_read_device_interrupts(dev); | ||
1325 | ep_intr = pch_udc_read_ep_interrupts(dev); | ||
1326 | |||
1327 | + /* For a hot plug, this find that the controller is hung up. */ | ||
1328 | + if (dev_intr == ep_intr) | ||
1329 | + if (dev_intr == pch_udc_readl(dev, UDC_DEVCFG_ADDR)) { | ||
1330 | + dev_dbg(&dev->pdev->dev, "UDC: Hung up\n"); | ||
1331 | + /* The controller is reset */ | ||
1332 | + pch_udc_writel(dev, UDC_SRST, UDC_SRST_ADDR); | ||
1333 | + return IRQ_HANDLED; | ||
1334 | + } | ||
1335 | if (dev_intr) | ||
1336 | /* Clear device interrupts */ | ||
1337 | pch_udc_write_device_interrupts(dev, dev_intr); | ||
1338 | @@ -2912,8 +2987,10 @@ static int pch_udc_probe(struct pci_dev *pdev, | ||
1339 | } | ||
1340 | pch_udc = dev; | ||
1341 | /* initialize the hardware */ | ||
1342 | - if (pch_udc_pcd_init(dev)) | ||
1343 | + if (pch_udc_pcd_init(dev)) { | ||
1344 | + retval = -ENODEV; | ||
1345 | goto finished; | ||
1346 | + } | ||
1347 | if (request_irq(pdev->irq, pch_udc_isr, IRQF_SHARED, KBUILD_MODNAME, | ||
1348 | dev)) { | ||
1349 | dev_err(&pdev->dev, "%s: request_irq(%d) fail\n", __func__, | ||
1350 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c | ||
1351 | index 7732d69..2afff88 100644 | ||
1352 | --- a/drivers/usb/host/pci-quirks.c | ||
1353 | +++ b/drivers/usb/host/pci-quirks.c | ||
1354 | @@ -825,9 +825,13 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | ||
1355 | } | ||
1356 | } | ||
1357 | |||
1358 | - /* Disable any BIOS SMIs */ | ||
1359 | - writel(XHCI_LEGACY_DISABLE_SMI, | ||
1360 | - base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); | ||
1361 | + val = readl(base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); | ||
1362 | + /* Mask off (turn off) any enabled SMIs */ | ||
1363 | + val &= XHCI_LEGACY_DISABLE_SMI; | ||
1364 | + /* Mask all SMI events bits, RW1C */ | ||
1365 | + val |= XHCI_LEGACY_SMI_EVENTS; | ||
1366 | + /* Disable any BIOS SMIs and clear all SMI events*/ | ||
1367 | + writel(val, base + ext_cap_offset + XHCI_LEGACY_CONTROL_OFFSET); | ||
1368 | |||
1369 | if (usb_is_intel_switchable_xhci(pdev)) | ||
1370 | usb_enable_xhci_ports(pdev); | ||
1371 | diff --git a/drivers/usb/host/xhci-ext-caps.h b/drivers/usb/host/xhci-ext-caps.h | ||
1372 | index c7f3312..377f424 100644 | ||
1373 | --- a/drivers/usb/host/xhci-ext-caps.h | ||
1374 | +++ b/drivers/usb/host/xhci-ext-caps.h | ||
1375 | @@ -62,8 +62,9 @@ | ||
1376 | /* USB Legacy Support Control and Status Register - section 7.1.2 */ | ||
1377 | /* Add this offset, plus the value of xECP in HCCPARAMS to the base address */ | ||
1378 | #define XHCI_LEGACY_CONTROL_OFFSET (0x04) | ||
1379 | -/* bits 1:2, 5:12, and 17:19 need to be preserved; bits 21:28 should be zero */ | ||
1380 | -#define XHCI_LEGACY_DISABLE_SMI ((0x3 << 1) + (0xff << 5) + (0x7 << 17)) | ||
1381 | +/* bits 1:3, 5:12, and 17:19 need to be preserved; bits 21:28 should be zero */ | ||
1382 | +#define XHCI_LEGACY_DISABLE_SMI ((0x7 << 1) + (0xff << 5) + (0x7 << 17)) | ||
1383 | +#define XHCI_LEGACY_SMI_EVENTS (0x7 << 29) | ||
1384 | |||
1385 | /* USB 2.0 xHCI 0.96 L1C capability - section 7.2.2.1.3.2 */ | ||
1386 | #define XHCI_L1C (1 << 16) | ||
1387 | diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c | ||
1388 | index c69cf54..01c3800 100644 | ||
1389 | --- a/drivers/usb/host/xhci-mem.c | ||
1390 | +++ b/drivers/usb/host/xhci-mem.c | ||
1391 | @@ -1704,11 +1704,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
1392 | int i; | ||
1393 | |||
1394 | /* Free the Event Ring Segment Table and the actual Event Ring */ | ||
1395 | - if (xhci->ir_set) { | ||
1396 | - xhci_writel(xhci, 0, &xhci->ir_set->erst_size); | ||
1397 | - xhci_write_64(xhci, 0, &xhci->ir_set->erst_base); | ||
1398 | - xhci_write_64(xhci, 0, &xhci->ir_set->erst_dequeue); | ||
1399 | - } | ||
1400 | size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); | ||
1401 | if (xhci->erst.entries) | ||
1402 | dma_free_coherent(&pdev->dev, size, | ||
1403 | @@ -1720,7 +1715,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
1404 | xhci->event_ring = NULL; | ||
1405 | xhci_dbg(xhci, "Freed event ring\n"); | ||
1406 | |||
1407 | - xhci_write_64(xhci, 0, &xhci->op_regs->cmd_ring); | ||
1408 | if (xhci->cmd_ring) | ||
1409 | xhci_ring_free(xhci, xhci->cmd_ring); | ||
1410 | xhci->cmd_ring = NULL; | ||
1411 | @@ -1749,7 +1743,6 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | ||
1412 | xhci->medium_streams_pool = NULL; | ||
1413 | xhci_dbg(xhci, "Freed medium stream array pool\n"); | ||
1414 | |||
1415 | - xhci_write_64(xhci, 0, &xhci->op_regs->dcbaa_ptr); | ||
1416 | if (xhci->dcbaa) | ||
1417 | dma_free_coherent(&pdev->dev, sizeof(*xhci->dcbaa), | ||
1418 | xhci->dcbaa, xhci->dcbaa->dma); | ||
1419 | @@ -2358,6 +2351,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | ||
1420 | |||
1421 | fail: | ||
1422 | xhci_warn(xhci, "Couldn't initialize memory\n"); | ||
1423 | + xhci_halt(xhci); | ||
1424 | + xhci_reset(xhci); | ||
1425 | xhci_mem_cleanup(xhci); | ||
1426 | return -ENOMEM; | ||
1427 | } | ||
1428 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c | ||
1429 | index ef98b38..211296a 100644 | ||
1430 | --- a/drivers/usb/host/xhci-pci.c | ||
1431 | +++ b/drivers/usb/host/xhci-pci.c | ||
1432 | @@ -95,6 +95,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | ||
1433 | xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
1434 | xhci_dbg(xhci, "QUIRK: Resetting on resume\n"); | ||
1435 | } | ||
1436 | + if (pdev->vendor == PCI_VENDOR_ID_VIA) | ||
1437 | + xhci->quirks |= XHCI_RESET_ON_RESUME; | ||
1438 | } | ||
1439 | |||
1440 | /* called during probe() after chip reset completes */ | ||
1441 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
1442 | index ae92dc4..43b3447 100644 | ||
1443 | --- a/drivers/usb/host/xhci-ring.c | ||
1444 | +++ b/drivers/usb/host/xhci-ring.c | ||
1445 | @@ -2343,7 +2343,7 @@ hw_died: | ||
1446 | u32 irq_pending; | ||
1447 | /* Acknowledge the PCI interrupt */ | ||
1448 | irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); | ||
1449 | - irq_pending |= 0x3; | ||
1450 | + irq_pending |= IMAN_IP; | ||
1451 | xhci_writel(xhci, irq_pending, &xhci->ir_set->irq_pending); | ||
1452 | } | ||
1453 | |||
1454 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c | ||
1455 | index 034f554..4c00606 100644 | ||
1456 | --- a/drivers/usb/host/xhci.c | ||
1457 | +++ b/drivers/usb/host/xhci.c | ||
1458 | @@ -664,11 +664,11 @@ static void xhci_save_registers(struct xhci_hcd *xhci) | ||
1459 | xhci->s3.dev_nt = xhci_readl(xhci, &xhci->op_regs->dev_notification); | ||
1460 | xhci->s3.dcbaa_ptr = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); | ||
1461 | xhci->s3.config_reg = xhci_readl(xhci, &xhci->op_regs->config_reg); | ||
1462 | - xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); | ||
1463 | - xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control); | ||
1464 | xhci->s3.erst_size = xhci_readl(xhci, &xhci->ir_set->erst_size); | ||
1465 | xhci->s3.erst_base = xhci_read_64(xhci, &xhci->ir_set->erst_base); | ||
1466 | xhci->s3.erst_dequeue = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); | ||
1467 | + xhci->s3.irq_pending = xhci_readl(xhci, &xhci->ir_set->irq_pending); | ||
1468 | + xhci->s3.irq_control = xhci_readl(xhci, &xhci->ir_set->irq_control); | ||
1469 | } | ||
1470 | |||
1471 | static void xhci_restore_registers(struct xhci_hcd *xhci) | ||
1472 | @@ -677,10 +677,11 @@ static void xhci_restore_registers(struct xhci_hcd *xhci) | ||
1473 | xhci_writel(xhci, xhci->s3.dev_nt, &xhci->op_regs->dev_notification); | ||
1474 | xhci_write_64(xhci, xhci->s3.dcbaa_ptr, &xhci->op_regs->dcbaa_ptr); | ||
1475 | xhci_writel(xhci, xhci->s3.config_reg, &xhci->op_regs->config_reg); | ||
1476 | - xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending); | ||
1477 | - xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control); | ||
1478 | xhci_writel(xhci, xhci->s3.erst_size, &xhci->ir_set->erst_size); | ||
1479 | xhci_write_64(xhci, xhci->s3.erst_base, &xhci->ir_set->erst_base); | ||
1480 | + xhci_write_64(xhci, xhci->s3.erst_dequeue, &xhci->ir_set->erst_dequeue); | ||
1481 | + xhci_writel(xhci, xhci->s3.irq_pending, &xhci->ir_set->irq_pending); | ||
1482 | + xhci_writel(xhci, xhci->s3.irq_control, &xhci->ir_set->irq_control); | ||
1483 | } | ||
1484 | |||
1485 | static void xhci_set_cmd_ring_deq(struct xhci_hcd *xhci) | ||
1486 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h | ||
1487 | index 09eda3a..4850c4d 100644 | ||
1488 | --- a/drivers/usb/host/xhci.h | ||
1489 | +++ b/drivers/usb/host/xhci.h | ||
1490 | @@ -205,6 +205,10 @@ struct xhci_op_regs { | ||
1491 | #define CMD_PM_INDEX (1 << 11) | ||
1492 | /* bits 12:31 are reserved (and should be preserved on writes). */ | ||
1493 | |||
1494 | +/* IMAN - Interrupt Management Register */ | ||
1495 | +#define IMAN_IP (1 << 1) | ||
1496 | +#define IMAN_IE (1 << 0) | ||
1497 | + | ||
1498 | /* USBSTS - USB status - status bitmasks */ | ||
1499 | /* HC not running - set to 1 when run/stop bit is cleared. */ | ||
1500 | #define STS_HALT XHCI_STS_HALT | ||
1501 | diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c | ||
1502 | index f2c9ef7..c4cf3f3 100644 | ||
1503 | --- a/drivers/usb/serial/ftdi_sio.c | ||
1504 | +++ b/drivers/usb/serial/ftdi_sio.c | ||
1505 | @@ -75,7 +75,8 @@ struct ftdi_private { | ||
1506 | unsigned long last_dtr_rts; /* saved modem control outputs */ | ||
1507 | struct async_icount icount; | ||
1508 | wait_queue_head_t delta_msr_wait; /* Used for TIOCMIWAIT */ | ||
1509 | - char prev_status, diff_status; /* Used for TIOCMIWAIT */ | ||
1510 | + char prev_status; /* Used for TIOCMIWAIT */ | ||
1511 | + bool dev_gone; /* Used to abort TIOCMIWAIT */ | ||
1512 | char transmit_empty; /* If transmitter is empty or not */ | ||
1513 | struct usb_serial_port *port; | ||
1514 | __u16 interface; /* FT2232C, FT2232H or FT4232H port interface | ||
1515 | @@ -1679,6 +1680,7 @@ static int ftdi_sio_port_probe(struct usb_serial_port *port) | ||
1516 | init_waitqueue_head(&priv->delta_msr_wait); | ||
1517 | |||
1518 | priv->flags = ASYNC_LOW_LATENCY; | ||
1519 | + priv->dev_gone = false; | ||
1520 | |||
1521 | if (quirk && quirk->port_probe) | ||
1522 | quirk->port_probe(priv); | ||
1523 | @@ -1836,6 +1838,9 @@ static int ftdi_sio_port_remove(struct usb_serial_port *port) | ||
1524 | |||
1525 | dbg("%s", __func__); | ||
1526 | |||
1527 | + priv->dev_gone = true; | ||
1528 | + wake_up_interruptible_all(&priv->delta_msr_wait); | ||
1529 | + | ||
1530 | remove_sysfs_attrs(port); | ||
1531 | |||
1532 | kref_put(&priv->kref, ftdi_sio_priv_release); | ||
1533 | @@ -1979,17 +1984,19 @@ static int ftdi_process_packet(struct tty_struct *tty, | ||
1534 | N.B. packet may be processed more than once, but differences | ||
1535 | are only processed once. */ | ||
1536 | status = packet[0] & FTDI_STATUS_B0_MASK; | ||
1537 | - if (status & FTDI_RS0_CTS) | ||
1538 | - priv->icount.cts++; | ||
1539 | - if (status & FTDI_RS0_DSR) | ||
1540 | - priv->icount.dsr++; | ||
1541 | - if (status & FTDI_RS0_RI) | ||
1542 | - priv->icount.rng++; | ||
1543 | - if (status & FTDI_RS0_RLSD) | ||
1544 | - priv->icount.dcd++; | ||
1545 | if (status != priv->prev_status) { | ||
1546 | - priv->diff_status |= status ^ priv->prev_status; | ||
1547 | - wake_up_interruptible(&priv->delta_msr_wait); | ||
1548 | + char diff_status = status ^ priv->prev_status; | ||
1549 | + | ||
1550 | + if (diff_status & FTDI_RS0_CTS) | ||
1551 | + priv->icount.cts++; | ||
1552 | + if (diff_status & FTDI_RS0_DSR) | ||
1553 | + priv->icount.dsr++; | ||
1554 | + if (diff_status & FTDI_RS0_RI) | ||
1555 | + priv->icount.rng++; | ||
1556 | + if (diff_status & FTDI_RS0_RLSD) | ||
1557 | + priv->icount.dcd++; | ||
1558 | + | ||
1559 | + wake_up_interruptible_all(&priv->delta_msr_wait); | ||
1560 | priv->prev_status = status; | ||
1561 | } | ||
1562 | |||
1563 | @@ -2388,15 +2395,12 @@ static int ftdi_ioctl(struct tty_struct *tty, | ||
1564 | */ | ||
1565 | case TIOCMIWAIT: | ||
1566 | cprev = priv->icount; | ||
1567 | - while (1) { | ||
1568 | + while (!priv->dev_gone) { | ||
1569 | interruptible_sleep_on(&priv->delta_msr_wait); | ||
1570 | /* see if a signal did it */ | ||
1571 | if (signal_pending(current)) | ||
1572 | return -ERESTARTSYS; | ||
1573 | cnow = priv->icount; | ||
1574 | - if (cnow.rng == cprev.rng && cnow.dsr == cprev.dsr && | ||
1575 | - cnow.dcd == cprev.dcd && cnow.cts == cprev.cts) | ||
1576 | - return -EIO; /* no change => error */ | ||
1577 | if (((arg & TIOCM_RNG) && (cnow.rng != cprev.rng)) || | ||
1578 | ((arg & TIOCM_DSR) && (cnow.dsr != cprev.dsr)) || | ||
1579 | ((arg & TIOCM_CD) && (cnow.dcd != cprev.dcd)) || | ||
1580 | @@ -2405,7 +2409,7 @@ static int ftdi_ioctl(struct tty_struct *tty, | ||
1581 | } | ||
1582 | cprev = cnow; | ||
1583 | } | ||
1584 | - /* not reached */ | ||
1585 | + return -EIO; | ||
1586 | break; | ||
1587 | case TIOCSERGETLSR: | ||
1588 | return get_lsr_info(port, (struct serial_struct __user *)arg); | ||
1589 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c | ||
1590 | index 54898c9..cbe3451 100644 | ||
1591 | --- a/drivers/usb/serial/option.c | ||
1592 | +++ b/drivers/usb/serial/option.c | ||
1593 | @@ -708,6 +708,7 @@ static const struct usb_device_id option_ids[] = { | ||
1594 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, | ||
1595 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, | ||
1596 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, | ||
1597 | + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, | ||
1598 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED3) }, | ||
1599 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED4) }, | ||
1600 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED5) }, | ||
1601 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c | ||
1602 | index fc2d66f..5532ea5 100644 | ||
1603 | --- a/drivers/usb/serial/pl2303.c | ||
1604 | +++ b/drivers/usb/serial/pl2303.c | ||
1605 | @@ -421,7 +421,7 @@ static void pl2303_set_termios(struct tty_struct *tty, | ||
1606 | control = priv->line_control; | ||
1607 | if ((cflag & CBAUD) == B0) | ||
1608 | priv->line_control &= ~(CONTROL_DTR | CONTROL_RTS); | ||
1609 | - else | ||
1610 | + else if ((old_termios->c_cflag & CBAUD) == B0) | ||
1611 | priv->line_control |= (CONTROL_DTR | CONTROL_RTS); | ||
1612 | if (control != priv->line_control) { | ||
1613 | control = priv->line_control; | ||
1614 | diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c | ||
1615 | index b18179b..7c3ec9e 100644 | ||
1616 | --- a/drivers/usb/serial/sierra.c | ||
1617 | +++ b/drivers/usb/serial/sierra.c | ||
1618 | @@ -289,6 +289,7 @@ static const struct usb_device_id id_table[] = { | ||
1619 | { USB_DEVICE(0x1199, 0x6856) }, /* Sierra Wireless AirCard 881 U */ | ||
1620 | { USB_DEVICE(0x1199, 0x6859) }, /* Sierra Wireless AirCard 885 E */ | ||
1621 | { USB_DEVICE(0x1199, 0x685A) }, /* Sierra Wireless AirCard 885 E */ | ||
1622 | + { USB_DEVICE(0x1199, 0x68A2) }, /* Sierra Wireless MC7710 */ | ||
1623 | /* Sierra Wireless C885 */ | ||
1624 | { USB_DEVICE_AND_INTERFACE_INFO(0x1199, 0x6880, 0xFF, 0xFF, 0xFF)}, | ||
1625 | /* Sierra Wireless C888, Air Card 501, USB 303, USB 304 */ | ||
1626 | diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c | ||
1627 | index cc274fd..38d7ebd 100644 | ||
1628 | --- a/drivers/usb/serial/usb-serial.c | ||
1629 | +++ b/drivers/usb/serial/usb-serial.c | ||
1630 | @@ -1059,6 +1059,12 @@ int usb_serial_probe(struct usb_interface *interface, | ||
1631 | serial->attached = 1; | ||
1632 | } | ||
1633 | |||
1634 | + /* Avoid race with tty_open and serial_install by setting the | ||
1635 | + * disconnected flag and not clearing it until all ports have been | ||
1636 | + * registered. | ||
1637 | + */ | ||
1638 | + serial->disconnected = 1; | ||
1639 | + | ||
1640 | if (get_free_serial(serial, num_ports, &minor) == NULL) { | ||
1641 | dev_err(&interface->dev, "No more free serial devices\n"); | ||
1642 | goto probe_error; | ||
1643 | @@ -1083,6 +1089,8 @@ int usb_serial_probe(struct usb_interface *interface, | ||
1644 | } | ||
1645 | } | ||
1646 | |||
1647 | + serial->disconnected = 0; | ||
1648 | + | ||
1649 | usb_serial_console_init(debug, minor); | ||
1650 | |||
1651 | exit: | ||
1652 | diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c | ||
1653 | index 7f8472c..8813588 100644 | ||
1654 | --- a/drivers/video/uvesafb.c | ||
1655 | +++ b/drivers/video/uvesafb.c | ||
1656 | @@ -815,8 +815,15 @@ static int __devinit uvesafb_vbe_init(struct fb_info *info) | ||
1657 | par->pmi_setpal = pmi_setpal; | ||
1658 | par->ypan = ypan; | ||
1659 | |||
1660 | - if (par->pmi_setpal || par->ypan) | ||
1661 | - uvesafb_vbe_getpmi(task, par); | ||
1662 | + if (par->pmi_setpal || par->ypan) { | ||
1663 | + if (__supported_pte_mask & _PAGE_NX) { | ||
1664 | + par->pmi_setpal = par->ypan = 0; | ||
1665 | + printk(KERN_WARNING "uvesafb: NX protection is actively." | ||
1666 | + "We have better not to use the PMI.\n"); | ||
1667 | + } else { | ||
1668 | + uvesafb_vbe_getpmi(task, par); | ||
1669 | + } | ||
1670 | + } | ||
1671 | #else | ||
1672 | /* The protected mode interface is not available on non-x86. */ | ||
1673 | par->pmi_setpal = par->ypan = 0; | ||
1674 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h | ||
1675 | index dbae4d9..7b1cd5c 100644 | ||
1676 | --- a/fs/ext4/ext4.h | ||
1677 | +++ b/fs/ext4/ext4.h | ||
1678 | @@ -1185,9 +1185,6 @@ struct ext4_sb_info { | ||
1679 | unsigned long s_ext_blocks; | ||
1680 | unsigned long s_ext_extents; | ||
1681 | #endif | ||
1682 | - /* ext4 extent cache stats */ | ||
1683 | - unsigned long extent_cache_hits; | ||
1684 | - unsigned long extent_cache_misses; | ||
1685 | |||
1686 | /* for buddy allocator */ | ||
1687 | struct ext4_group_info ***s_group_info; | ||
1688 | diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c | ||
1689 | index 7507036..c2a2012 100644 | ||
1690 | --- a/fs/ext4/extents.c | ||
1691 | +++ b/fs/ext4/extents.c | ||
1692 | @@ -2052,10 +2052,6 @@ static int ext4_ext_check_cache(struct inode *inode, ext4_lblk_t block, | ||
1693 | ret = 1; | ||
1694 | } | ||
1695 | errout: | ||
1696 | - if (!ret) | ||
1697 | - sbi->extent_cache_misses++; | ||
1698 | - else | ||
1699 | - sbi->extent_cache_hits++; | ||
1700 | trace_ext4_ext_in_cache(inode, block, ret); | ||
1701 | spin_unlock(&EXT4_I(inode)->i_block_reservation_lock); | ||
1702 | return ret; | ||
1703 | diff --git a/fs/ext4/super.c b/fs/ext4/super.c | ||
1704 | index 9281dbe..961059b 100644 | ||
1705 | --- a/fs/ext4/super.c | ||
1706 | +++ b/fs/ext4/super.c | ||
1707 | @@ -2504,18 +2504,6 @@ static ssize_t lifetime_write_kbytes_show(struct ext4_attr *a, | ||
1708 | EXT4_SB(sb)->s_sectors_written_start) >> 1))); | ||
1709 | } | ||
1710 | |||
1711 | -static ssize_t extent_cache_hits_show(struct ext4_attr *a, | ||
1712 | - struct ext4_sb_info *sbi, char *buf) | ||
1713 | -{ | ||
1714 | - return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_hits); | ||
1715 | -} | ||
1716 | - | ||
1717 | -static ssize_t extent_cache_misses_show(struct ext4_attr *a, | ||
1718 | - struct ext4_sb_info *sbi, char *buf) | ||
1719 | -{ | ||
1720 | - return snprintf(buf, PAGE_SIZE, "%lu\n", sbi->extent_cache_misses); | ||
1721 | -} | ||
1722 | - | ||
1723 | static ssize_t inode_readahead_blks_store(struct ext4_attr *a, | ||
1724 | struct ext4_sb_info *sbi, | ||
1725 | const char *buf, size_t count) | ||
1726 | @@ -2573,8 +2561,6 @@ static struct ext4_attr ext4_attr_##name = __ATTR(name, mode, show, store) | ||
1727 | EXT4_RO_ATTR(delayed_allocation_blocks); | ||
1728 | EXT4_RO_ATTR(session_write_kbytes); | ||
1729 | EXT4_RO_ATTR(lifetime_write_kbytes); | ||
1730 | -EXT4_RO_ATTR(extent_cache_hits); | ||
1731 | -EXT4_RO_ATTR(extent_cache_misses); | ||
1732 | EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, sbi_ui_show, | ||
1733 | inode_readahead_blks_store, s_inode_readahead_blks); | ||
1734 | EXT4_RW_ATTR_SBI_UI(inode_goal, s_inode_goal); | ||
1735 | @@ -2590,8 +2576,6 @@ static struct attribute *ext4_attrs[] = { | ||
1736 | ATTR_LIST(delayed_allocation_blocks), | ||
1737 | ATTR_LIST(session_write_kbytes), | ||
1738 | ATTR_LIST(lifetime_write_kbytes), | ||
1739 | - ATTR_LIST(extent_cache_hits), | ||
1740 | - ATTR_LIST(extent_cache_misses), | ||
1741 | ATTR_LIST(inode_readahead_blks), | ||
1742 | ATTR_LIST(inode_goal), | ||
1743 | ATTR_LIST(mb_stats), | ||
1744 | diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h | ||
1745 | index aaf79af..a7e13bf 100644 | ||
1746 | --- a/include/net/bluetooth/hci.h | ||
1747 | +++ b/include/net/bluetooth/hci.h | ||
1748 | @@ -84,6 +84,7 @@ enum { | ||
1749 | HCI_SERVICE_CACHE, | ||
1750 | HCI_LINK_KEYS, | ||
1751 | HCI_DEBUG_KEYS, | ||
1752 | + HCI_UNREGISTER, | ||
1753 | |||
1754 | HCI_RESET, | ||
1755 | }; | ||
1756 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
1757 | index 0677023..866c9d5 100644 | ||
1758 | --- a/kernel/futex.c | ||
1759 | +++ b/kernel/futex.c | ||
1760 | @@ -59,6 +59,7 @@ | ||
1761 | #include <linux/magic.h> | ||
1762 | #include <linux/pid.h> | ||
1763 | #include <linux/nsproxy.h> | ||
1764 | +#include <linux/ptrace.h> | ||
1765 | |||
1766 | #include <asm/futex.h> | ||
1767 | |||
1768 | @@ -2443,40 +2444,29 @@ SYSCALL_DEFINE3(get_robust_list, int, pid, | ||
1769 | { | ||
1770 | struct robust_list_head __user *head; | ||
1771 | unsigned long ret; | ||
1772 | - const struct cred *cred = current_cred(), *pcred; | ||
1773 | + struct task_struct *p; | ||
1774 | |||
1775 | if (!futex_cmpxchg_enabled) | ||
1776 | return -ENOSYS; | ||
1777 | |||
1778 | + rcu_read_lock(); | ||
1779 | + | ||
1780 | + ret = -ESRCH; | ||
1781 | if (!pid) | ||
1782 | - head = current->robust_list; | ||
1783 | + p = current; | ||
1784 | else { | ||
1785 | - struct task_struct *p; | ||
1786 | - | ||
1787 | - ret = -ESRCH; | ||
1788 | - rcu_read_lock(); | ||
1789 | p = find_task_by_vpid(pid); | ||
1790 | if (!p) | ||
1791 | goto err_unlock; | ||
1792 | - ret = -EPERM; | ||
1793 | - pcred = __task_cred(p); | ||
1794 | - /* If victim is in different user_ns, then uids are not | ||
1795 | - comparable, so we must have CAP_SYS_PTRACE */ | ||
1796 | - if (cred->user->user_ns != pcred->user->user_ns) { | ||
1797 | - if (!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE)) | ||
1798 | - goto err_unlock; | ||
1799 | - goto ok; | ||
1800 | - } | ||
1801 | - /* If victim is in same user_ns, then uids are comparable */ | ||
1802 | - if (cred->euid != pcred->euid && | ||
1803 | - cred->euid != pcred->uid && | ||
1804 | - !ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE)) | ||
1805 | - goto err_unlock; | ||
1806 | -ok: | ||
1807 | - head = p->robust_list; | ||
1808 | - rcu_read_unlock(); | ||
1809 | } | ||
1810 | |||
1811 | + ret = -EPERM; | ||
1812 | + if (!ptrace_may_access(p, PTRACE_MODE_READ)) | ||
1813 | + goto err_unlock; | ||
1814 | + | ||
1815 | + head = p->robust_list; | ||
1816 | + rcu_read_unlock(); | ||
1817 | + | ||
1818 | if (put_user(sizeof(*head), len_ptr)) | ||
1819 | return -EFAULT; | ||
1820 | return put_user(head, head_ptr); | ||
1821 | diff --git a/kernel/futex_compat.c b/kernel/futex_compat.c | ||
1822 | index 5f9e689..a9642d5 100644 | ||
1823 | --- a/kernel/futex_compat.c | ||
1824 | +++ b/kernel/futex_compat.c | ||
1825 | @@ -10,6 +10,7 @@ | ||
1826 | #include <linux/compat.h> | ||
1827 | #include <linux/nsproxy.h> | ||
1828 | #include <linux/futex.h> | ||
1829 | +#include <linux/ptrace.h> | ||
1830 | |||
1831 | #include <asm/uaccess.h> | ||
1832 | |||
1833 | @@ -136,40 +137,29 @@ compat_sys_get_robust_list(int pid, compat_uptr_t __user *head_ptr, | ||
1834 | { | ||
1835 | struct compat_robust_list_head __user *head; | ||
1836 | unsigned long ret; | ||
1837 | - const struct cred *cred = current_cred(), *pcred; | ||
1838 | + struct task_struct *p; | ||
1839 | |||
1840 | if (!futex_cmpxchg_enabled) | ||
1841 | return -ENOSYS; | ||
1842 | |||
1843 | + rcu_read_lock(); | ||
1844 | + | ||
1845 | + ret = -ESRCH; | ||
1846 | if (!pid) | ||
1847 | - head = current->compat_robust_list; | ||
1848 | + p = current; | ||
1849 | else { | ||
1850 | - struct task_struct *p; | ||
1851 | - | ||
1852 | - ret = -ESRCH; | ||
1853 | - rcu_read_lock(); | ||
1854 | p = find_task_by_vpid(pid); | ||
1855 | if (!p) | ||
1856 | goto err_unlock; | ||
1857 | - ret = -EPERM; | ||
1858 | - pcred = __task_cred(p); | ||
1859 | - /* If victim is in different user_ns, then uids are not | ||
1860 | - comparable, so we must have CAP_SYS_PTRACE */ | ||
1861 | - if (cred->user->user_ns != pcred->user->user_ns) { | ||
1862 | - if (!ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE)) | ||
1863 | - goto err_unlock; | ||
1864 | - goto ok; | ||
1865 | - } | ||
1866 | - /* If victim is in same user_ns, then uids are comparable */ | ||
1867 | - if (cred->euid != pcred->euid && | ||
1868 | - cred->euid != pcred->uid && | ||
1869 | - !ns_capable(pcred->user->user_ns, CAP_SYS_PTRACE)) | ||
1870 | - goto err_unlock; | ||
1871 | -ok: | ||
1872 | - head = p->compat_robust_list; | ||
1873 | - rcu_read_unlock(); | ||
1874 | } | ||
1875 | |||
1876 | + ret = -EPERM; | ||
1877 | + if (!ptrace_may_access(p, PTRACE_MODE_READ)) | ||
1878 | + goto err_unlock; | ||
1879 | + | ||
1880 | + head = p->compat_robust_list; | ||
1881 | + rcu_read_unlock(); | ||
1882 | + | ||
1883 | if (put_user(sizeof(*head), len_ptr)) | ||
1884 | return -EFAULT; | ||
1885 | return put_user(ptr_to_compat(head), head_ptr); | ||
1886 | diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c | ||
1887 | index 4042064..c923640 100644 | ||
1888 | --- a/kernel/time/tick-sched.c | ||
1889 | +++ b/kernel/time/tick-sched.c | ||
1890 | @@ -508,9 +508,9 @@ static void tick_nohz_restart(struct tick_sched *ts, ktime_t now) | ||
1891 | hrtimer_get_expires(&ts->sched_timer), 0)) | ||
1892 | break; | ||
1893 | } | ||
1894 | - /* Update jiffies and reread time */ | ||
1895 | - tick_do_update_jiffies64(now); | ||
1896 | + /* Reread time and update jiffies */ | ||
1897 | now = ktime_get(); | ||
1898 | + tick_do_update_jiffies64(now); | ||
1899 | } | ||
1900 | } | ||
1901 | |||
1902 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
1903 | index 2316840..bd936ed 100644 | ||
1904 | --- a/mm/hugetlb.c | ||
1905 | +++ b/mm/hugetlb.c | ||
1906 | @@ -2686,6 +2686,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, | ||
1907 | * so no worry about deadlock. | ||
1908 | */ | ||
1909 | page = pte_page(entry); | ||
1910 | + get_page(page); | ||
1911 | if (page != pagecache_page) | ||
1912 | lock_page(page); | ||
1913 | |||
1914 | @@ -2717,6 +2718,7 @@ out_page_table_lock: | ||
1915 | } | ||
1916 | if (page != pagecache_page) | ||
1917 | unlock_page(page); | ||
1918 | + put_page(page); | ||
1919 | |||
1920 | out_mutex: | ||
1921 | mutex_unlock(&hugetlb_instantiation_mutex); | ||
1922 | diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c | ||
1923 | index b84458d..857dc88 100644 | ||
1924 | --- a/net/bluetooth/hci_core.c | ||
1925 | +++ b/net/bluetooth/hci_core.c | ||
1926 | @@ -510,6 +510,11 @@ int hci_dev_open(__u16 dev) | ||
1927 | |||
1928 | hci_req_lock(hdev); | ||
1929 | |||
1930 | + if (test_bit(HCI_UNREGISTER, &hdev->flags)) { | ||
1931 | + ret = -ENODEV; | ||
1932 | + goto done; | ||
1933 | + } | ||
1934 | + | ||
1935 | if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { | ||
1936 | ret = -ERFKILL; | ||
1937 | goto done; | ||
1938 | @@ -1540,6 +1545,8 @@ int hci_unregister_dev(struct hci_dev *hdev) | ||
1939 | |||
1940 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); | ||
1941 | |||
1942 | + set_bit(HCI_UNREGISTER, &hdev->flags); | ||
1943 | + | ||
1944 | write_lock_bh(&hci_dev_list_lock); | ||
1945 | list_del(&hdev->list); | ||
1946 | write_unlock_bh(&hci_dev_list_lock); | ||
1947 | diff --git a/security/commoncap.c b/security/commoncap.c | ||
1948 | index ee4f848..12440ee 100644 | ||
1949 | --- a/security/commoncap.c | ||
1950 | +++ b/security/commoncap.c | ||
1951 | @@ -28,6 +28,7 @@ | ||
1952 | #include <linux/prctl.h> | ||
1953 | #include <linux/securebits.h> | ||
1954 | #include <linux/user_namespace.h> | ||
1955 | +#include <linux/personality.h> | ||
1956 | |||
1957 | /* | ||
1958 | * If a non-root user executes a setuid-root binary in | ||
1959 | @@ -514,6 +515,11 @@ int cap_bprm_set_creds(struct linux_binprm *bprm) | ||
1960 | } | ||
1961 | skip: | ||
1962 | |||
1963 | + /* if we have fs caps, clear dangerous personality flags */ | ||
1964 | + if (!cap_issubset(new->cap_permitted, old->cap_permitted)) | ||
1965 | + bprm->per_clear |= PER_CLEAR_ON_SETID; | ||
1966 | + | ||
1967 | + | ||
1968 | /* Don't let someone trace a set[ug]id/setpcap binary with the revised | ||
1969 | * credentials unless they have the appropriate permit | ||
1970 | */ | ||
1971 | diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c | ||
1972 | index 216e33a..adb372d 100644 | ||
1973 | --- a/tools/perf/util/hist.c | ||
1974 | +++ b/tools/perf/util/hist.c | ||
1975 | @@ -230,6 +230,18 @@ struct hist_entry *__hists__add_entry(struct hists *hists, | ||
1976 | if (!cmp) { | ||
1977 | he->period += period; | ||
1978 | ++he->nr_events; | ||
1979 | + | ||
1980 | + /* If the map of an existing hist_entry has | ||
1981 | + * become out-of-date due to an exec() or | ||
1982 | + * similar, update it. Otherwise we will | ||
1983 | + * mis-adjust symbol addresses when computing | ||
1984 | + * the history counter to increment. | ||
1985 | + */ | ||
1986 | + if (he->ms.map != entry->ms.map) { | ||
1987 | + he->ms.map = entry->ms.map; | ||
1988 | + if (he->ms.map) | ||
1989 | + he->ms.map->referenced = true; | ||
1990 | + } | ||
1991 | goto out; | ||
1992 | } | ||
1993 |