Contents of /trunk/kernel-magellan/patches-3.2/0115-3.2.16-all-fixes.patch
Parent Directory | Revision Log
Revision 1747 -
(show 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 | 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 |