1 |
Author: mpagano |
2 |
Date: 2010-10-31 23:04:30 +0000 (Sun, 31 Oct 2010) |
3 |
New Revision: 1819 |
4 |
|
5 |
Added: |
6 |
genpatches-2.6/trunk/2.6.35/1007_linux-2.6.35.8.patch |
7 |
Removed: |
8 |
genpatches-2.6/trunk/2.6.35/1500_CVE-2010-3904-RDS-Priv-Escal-fix.patch |
9 |
Modified: |
10 |
genpatches-2.6/trunk/2.6.35/0000_README |
11 |
Log: |
12 |
Linux patch 2.6.35.8 and removal of redundant patch. |
13 |
|
14 |
Modified: genpatches-2.6/trunk/2.6.35/0000_README |
15 |
=================================================================== |
16 |
--- genpatches-2.6/trunk/2.6.35/0000_README 2010-10-31 22:55:31 UTC (rev 1818) |
17 |
+++ genpatches-2.6/trunk/2.6.35/0000_README 2010-10-31 23:04:30 UTC (rev 1819) |
18 |
@@ -67,9 +67,9 @@ |
19 |
From: http://www.kernel.org |
20 |
Desc: Linux 2.6.35.7 |
21 |
|
22 |
-Patch: 1500_CVE-2010-3904-RDS-Priv-Escal-fix.patch |
23 |
+Patch: 1007_linux-2.6.35.8.patch |
24 |
From: http://www.kernel.org |
25 |
-Desc: CVE-2010-3904 RDS Protocol priviledge escalation |
26 |
+Desc: Linux 2.6.35.8 |
27 |
|
28 |
Patch: 1900_create-mount-for-cgroupsfs.patch |
29 |
From: http://bugs.gentoo.org/show_bug.cgi?id=318365 |
30 |
|
31 |
Added: genpatches-2.6/trunk/2.6.35/1007_linux-2.6.35.8.patch |
32 |
=================================================================== |
33 |
--- genpatches-2.6/trunk/2.6.35/1007_linux-2.6.35.8.patch (rev 0) |
34 |
+++ genpatches-2.6/trunk/2.6.35/1007_linux-2.6.35.8.patch 2010-10-31 23:04:30 UTC (rev 1819) |
35 |
@@ -0,0 +1,3171 @@ |
36 |
+diff --git a/Documentation/sound/alsa/HD-Audio-Models.txt b/Documentation/sound/alsa/HD-Audio-Models.txt |
37 |
+index dc25bb8..50faa7e 100644 |
38 |
+--- a/Documentation/sound/alsa/HD-Audio-Models.txt |
39 |
++++ b/Documentation/sound/alsa/HD-Audio-Models.txt |
40 |
+@@ -282,6 +282,7 @@ Conexant 5051 |
41 |
+ hp HP Spartan laptop |
42 |
+ hp-dv6736 HP dv6736 |
43 |
+ hp-f700 HP Compaq Presario F700 |
44 |
++ ideapad Lenovo IdeaPad laptop |
45 |
+ lenovo-x200 Lenovo X200 laptop |
46 |
+ toshiba Toshiba Satellite M300 |
47 |
+ |
48 |
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig |
49 |
+index 4824fb4..831acd06 100644 |
50 |
+--- a/arch/arm/Kconfig |
51 |
++++ b/arch/arm/Kconfig |
52 |
+@@ -273,7 +273,6 @@ config ARCH_AT91 |
53 |
+ bool "Atmel AT91" |
54 |
+ select ARCH_REQUIRE_GPIOLIB |
55 |
+ select HAVE_CLK |
56 |
+- select ARCH_USES_GETTIMEOFFSET |
57 |
+ help |
58 |
+ This enables support for systems based on the Atmel AT91RM9200, |
59 |
+ AT91SAM9 and AT91CAP9 processors. |
60 |
+diff --git a/arch/arm/mach-vexpress/ct-ca9x4.c b/arch/arm/mach-vexpress/ct-ca9x4.c |
61 |
+index 6353459..d6dd6f6 100644 |
62 |
+--- a/arch/arm/mach-vexpress/ct-ca9x4.c |
63 |
++++ b/arch/arm/mach-vexpress/ct-ca9x4.c |
64 |
+@@ -225,7 +225,7 @@ static void ct_ca9x4_init(void) |
65 |
+ int i; |
66 |
+ |
67 |
+ #ifdef CONFIG_CACHE_L2X0 |
68 |
+- l2x0_init(MMIO_P2V(CT_CA9X4_L2CC), 0x00000000, 0xfe0fffff); |
69 |
++ l2x0_init(MMIO_P2V(CT_CA9X4_L2CC), 0x00400000, 0xfe0fffff); |
70 |
+ #endif |
71 |
+ |
72 |
+ clkdev_add_table(lookups, ARRAY_SIZE(lookups)); |
73 |
+diff --git a/arch/arm/oprofile/common.c b/arch/arm/oprofile/common.c |
74 |
+index 0691176..72e09eb 100644 |
75 |
+--- a/arch/arm/oprofile/common.c |
76 |
++++ b/arch/arm/oprofile/common.c |
77 |
+@@ -102,6 +102,7 @@ static int op_create_counter(int cpu, int event) |
78 |
+ if (IS_ERR(pevent)) { |
79 |
+ ret = PTR_ERR(pevent); |
80 |
+ } else if (pevent->state != PERF_EVENT_STATE_ACTIVE) { |
81 |
++ perf_event_release_kernel(pevent); |
82 |
+ pr_warning("oprofile: failed to enable event %d " |
83 |
+ "on CPU %d\n", event, cpu); |
84 |
+ ret = -EBUSY; |
85 |
+@@ -365,6 +366,7 @@ int __init oprofile_arch_init(struct oprofile_operations *ops) |
86 |
+ ret = init_driverfs(); |
87 |
+ if (ret) { |
88 |
+ kfree(counter_config); |
89 |
++ counter_config = NULL; |
90 |
+ return ret; |
91 |
+ } |
92 |
+ |
93 |
+@@ -402,7 +404,6 @@ void oprofile_arch_exit(void) |
94 |
+ struct perf_event *event; |
95 |
+ |
96 |
+ if (*perf_events) { |
97 |
+- exit_driverfs(); |
98 |
+ for_each_possible_cpu(cpu) { |
99 |
+ for (id = 0; id < perf_num_counters; ++id) { |
100 |
+ event = perf_events[cpu][id]; |
101 |
+@@ -413,8 +414,10 @@ void oprofile_arch_exit(void) |
102 |
+ } |
103 |
+ } |
104 |
+ |
105 |
+- if (counter_config) |
106 |
++ if (counter_config) { |
107 |
+ kfree(counter_config); |
108 |
++ exit_driverfs(); |
109 |
++ } |
110 |
+ } |
111 |
+ #else |
112 |
+ int __init oprofile_arch_init(struct oprofile_operations *ops) |
113 |
+diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S |
114 |
+index 844a44b..c571cd3 100644 |
115 |
+--- a/arch/powerpc/kernel/head_64.S |
116 |
++++ b/arch/powerpc/kernel/head_64.S |
117 |
+@@ -572,15 +572,21 @@ __secondary_start: |
118 |
+ /* Set thread priority to MEDIUM */ |
119 |
+ HMT_MEDIUM |
120 |
+ |
121 |
+- /* Do early setup for that CPU (stab, slb, hash table pointer) */ |
122 |
+- bl .early_setup_secondary |
123 |
+- |
124 |
+ /* Initialize the kernel stack. Just a repeat for iSeries. */ |
125 |
+ LOAD_REG_ADDR(r3, current_set) |
126 |
+ sldi r28,r24,3 /* get current_set[cpu#] */ |
127 |
+- ldx r1,r3,r28 |
128 |
+- addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD |
129 |
+- std r1,PACAKSAVE(r13) |
130 |
++ ldx r14,r3,r28 |
131 |
++ addi r14,r14,THREAD_SIZE-STACK_FRAME_OVERHEAD |
132 |
++ std r14,PACAKSAVE(r13) |
133 |
++ |
134 |
++ /* Do early setup for that CPU (stab, slb, hash table pointer) */ |
135 |
++ bl .early_setup_secondary |
136 |
++ |
137 |
++ /* |
138 |
++ * setup the new stack pointer, but *don't* use this until |
139 |
++ * translation is on. |
140 |
++ */ |
141 |
++ mr r1, r14 |
142 |
+ |
143 |
+ /* Clear backchain so we get nice backtraces */ |
144 |
+ li r7,0 |
145 |
+diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c |
146 |
+index da992a3..3d63b83 100644 |
147 |
+--- a/arch/um/drivers/ubd_kern.c |
148 |
++++ b/arch/um/drivers/ubd_kern.c |
149 |
+@@ -162,6 +162,7 @@ struct ubd { |
150 |
+ struct scatterlist sg[MAX_SG]; |
151 |
+ struct request *request; |
152 |
+ int start_sg, end_sg; |
153 |
++ sector_t rq_pos; |
154 |
+ }; |
155 |
+ |
156 |
+ #define DEFAULT_COW { \ |
157 |
+@@ -186,6 +187,7 @@ struct ubd { |
158 |
+ .request = NULL, \ |
159 |
+ .start_sg = 0, \ |
160 |
+ .end_sg = 0, \ |
161 |
++ .rq_pos = 0, \ |
162 |
+ } |
163 |
+ |
164 |
+ /* Protected by ubd_lock */ |
165 |
+@@ -1223,7 +1225,6 @@ static void do_ubd_request(struct request_queue *q) |
166 |
+ { |
167 |
+ struct io_thread_req *io_req; |
168 |
+ struct request *req; |
169 |
+- sector_t sector; |
170 |
+ int n; |
171 |
+ |
172 |
+ while(1){ |
173 |
+@@ -1234,12 +1235,12 @@ static void do_ubd_request(struct request_queue *q) |
174 |
+ return; |
175 |
+ |
176 |
+ dev->request = req; |
177 |
++ dev->rq_pos = blk_rq_pos(req); |
178 |
+ dev->start_sg = 0; |
179 |
+ dev->end_sg = blk_rq_map_sg(q, req, dev->sg); |
180 |
+ } |
181 |
+ |
182 |
+ req = dev->request; |
183 |
+- sector = blk_rq_pos(req); |
184 |
+ while(dev->start_sg < dev->end_sg){ |
185 |
+ struct scatterlist *sg = &dev->sg[dev->start_sg]; |
186 |
+ |
187 |
+@@ -1251,10 +1252,9 @@ static void do_ubd_request(struct request_queue *q) |
188 |
+ return; |
189 |
+ } |
190 |
+ prepare_request(req, io_req, |
191 |
+- (unsigned long long)sector << 9, |
192 |
++ (unsigned long long)dev->rq_pos << 9, |
193 |
+ sg->offset, sg->length, sg_page(sg)); |
194 |
+ |
195 |
+- sector += sg->length >> 9; |
196 |
+ n = os_write_file(thread_fd, &io_req, |
197 |
+ sizeof(struct io_thread_req *)); |
198 |
+ if(n != sizeof(struct io_thread_req *)){ |
199 |
+@@ -1267,6 +1267,7 @@ static void do_ubd_request(struct request_queue *q) |
200 |
+ return; |
201 |
+ } |
202 |
+ |
203 |
++ dev->rq_pos += sg->length >> 9; |
204 |
+ dev->start_sg++; |
205 |
+ } |
206 |
+ dev->end_sg = 0; |
207 |
+diff --git a/arch/x86/include/asm/amd_iommu_proto.h b/arch/x86/include/asm/amd_iommu_proto.h |
208 |
+index d2544f1..cb03037 100644 |
209 |
+--- a/arch/x86/include/asm/amd_iommu_proto.h |
210 |
++++ b/arch/x86/include/asm/amd_iommu_proto.h |
211 |
+@@ -38,4 +38,10 @@ static inline void amd_iommu_stats_init(void) { } |
212 |
+ |
213 |
+ #endif /* !CONFIG_AMD_IOMMU_STATS */ |
214 |
+ |
215 |
++static inline bool is_rd890_iommu(struct pci_dev *pdev) |
216 |
++{ |
217 |
++ return (pdev->vendor == PCI_VENDOR_ID_ATI) && |
218 |
++ (pdev->device == PCI_DEVICE_ID_RD890_IOMMU); |
219 |
++} |
220 |
++ |
221 |
+ #endif /* _ASM_X86_AMD_IOMMU_PROTO_H */ |
222 |
+diff --git a/arch/x86/include/asm/amd_iommu_types.h b/arch/x86/include/asm/amd_iommu_types.h |
223 |
+index 7014e88..0861618 100644 |
224 |
+--- a/arch/x86/include/asm/amd_iommu_types.h |
225 |
++++ b/arch/x86/include/asm/amd_iommu_types.h |
226 |
+@@ -368,6 +368,9 @@ struct amd_iommu { |
227 |
+ /* capabilities of that IOMMU read from ACPI */ |
228 |
+ u32 cap; |
229 |
+ |
230 |
++ /* flags read from acpi table */ |
231 |
++ u8 acpi_flags; |
232 |
++ |
233 |
+ /* |
234 |
+ * Capability pointer. There could be more than one IOMMU per PCI |
235 |
+ * device function if there are more than one AMD IOMMU capability |
236 |
+@@ -411,6 +414,15 @@ struct amd_iommu { |
237 |
+ |
238 |
+ /* default dma_ops domain for that IOMMU */ |
239 |
+ struct dma_ops_domain *default_dom; |
240 |
++ |
241 |
++ /* |
242 |
++ * This array is required to work around a potential BIOS bug. |
243 |
++ * The BIOS may miss to restore parts of the PCI configuration |
244 |
++ * space when the system resumes from S3. The result is that the |
245 |
++ * IOMMU does not execute commands anymore which leads to system |
246 |
++ * failure. |
247 |
++ */ |
248 |
++ u32 cache_cfg[4]; |
249 |
+ }; |
250 |
+ |
251 |
+ /* |
252 |
+diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h |
253 |
+index 2984a25..f686f49 100644 |
254 |
+--- a/arch/x86/include/asm/pgtable_32.h |
255 |
++++ b/arch/x86/include/asm/pgtable_32.h |
256 |
+@@ -26,6 +26,7 @@ struct mm_struct; |
257 |
+ struct vm_area_struct; |
258 |
+ |
259 |
+ extern pgd_t swapper_pg_dir[1024]; |
260 |
++extern pgd_t trampoline_pg_dir[1024]; |
261 |
+ |
262 |
+ static inline void pgtable_cache_init(void) { } |
263 |
+ static inline void check_pgt_cache(void) { } |
264 |
+diff --git a/arch/x86/include/asm/trampoline.h b/arch/x86/include/asm/trampoline.h |
265 |
+index cb507bb..4dde797 100644 |
266 |
+--- a/arch/x86/include/asm/trampoline.h |
267 |
++++ b/arch/x86/include/asm/trampoline.h |
268 |
+@@ -13,14 +13,17 @@ extern unsigned char *trampoline_base; |
269 |
+ |
270 |
+ extern unsigned long init_rsp; |
271 |
+ extern unsigned long initial_code; |
272 |
++extern unsigned long initial_page_table; |
273 |
+ extern unsigned long initial_gs; |
274 |
+ |
275 |
+ #define TRAMPOLINE_SIZE roundup(trampoline_end - trampoline_data, PAGE_SIZE) |
276 |
+ |
277 |
+ extern unsigned long setup_trampoline(void); |
278 |
++extern void __init setup_trampoline_page_table(void); |
279 |
+ extern void __init reserve_trampoline_memory(void); |
280 |
+ #else |
281 |
+-static inline void reserve_trampoline_memory(void) {}; |
282 |
++static inline void setup_trampoline_page_table(void) {} |
283 |
++static inline void reserve_trampoline_memory(void) {} |
284 |
+ #endif /* CONFIG_X86_TRAMPOLINE */ |
285 |
+ |
286 |
+ #endif /* __ASSEMBLY__ */ |
287 |
+diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile |
288 |
+index e77b220..0357c51 100644 |
289 |
+--- a/arch/x86/kernel/Makefile |
290 |
++++ b/arch/x86/kernel/Makefile |
291 |
+@@ -11,6 +11,8 @@ ifdef CONFIG_FUNCTION_TRACER |
292 |
+ CFLAGS_REMOVE_tsc.o = -pg |
293 |
+ CFLAGS_REMOVE_rtc.o = -pg |
294 |
+ CFLAGS_REMOVE_paravirt-spinlocks.o = -pg |
295 |
++CFLAGS_REMOVE_pvclock.o = -pg |
296 |
++CFLAGS_REMOVE_kvmclock.o = -pg |
297 |
+ CFLAGS_REMOVE_ftrace.o = -pg |
298 |
+ CFLAGS_REMOVE_early_printk.o = -pg |
299 |
+ endif |
300 |
+diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c |
301 |
+index 0d20286..4424c73 100644 |
302 |
+--- a/arch/x86/kernel/amd_iommu.c |
303 |
++++ b/arch/x86/kernel/amd_iommu.c |
304 |
+@@ -1953,6 +1953,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, |
305 |
+ size_t size, |
306 |
+ int dir) |
307 |
+ { |
308 |
++ dma_addr_t flush_addr; |
309 |
+ dma_addr_t i, start; |
310 |
+ unsigned int pages; |
311 |
+ |
312 |
+@@ -1960,6 +1961,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, |
313 |
+ (dma_addr + size > dma_dom->aperture_size)) |
314 |
+ return; |
315 |
+ |
316 |
++ flush_addr = dma_addr; |
317 |
+ pages = iommu_num_pages(dma_addr, size, PAGE_SIZE); |
318 |
+ dma_addr &= PAGE_MASK; |
319 |
+ start = dma_addr; |
320 |
+@@ -1974,7 +1976,7 @@ static void __unmap_single(struct dma_ops_domain *dma_dom, |
321 |
+ dma_ops_free_addresses(dma_dom, dma_addr, pages); |
322 |
+ |
323 |
+ if (amd_iommu_unmap_flush || dma_dom->need_flush) { |
324 |
+- iommu_flush_pages(&dma_dom->domain, dma_addr, size); |
325 |
++ iommu_flush_pages(&dma_dom->domain, flush_addr, size); |
326 |
+ dma_dom->need_flush = false; |
327 |
+ } |
328 |
+ } |
329 |
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c |
330 |
+index 3cc63e2..5a170cb 100644 |
331 |
+--- a/arch/x86/kernel/amd_iommu_init.c |
332 |
++++ b/arch/x86/kernel/amd_iommu_init.c |
333 |
+@@ -632,6 +632,13 @@ static void __init init_iommu_from_pci(struct amd_iommu *iommu) |
334 |
+ iommu->last_device = calc_devid(MMIO_GET_BUS(range), |
335 |
+ MMIO_GET_LD(range)); |
336 |
+ iommu->evt_msi_num = MMIO_MSI_NUM(misc); |
337 |
++ |
338 |
++ if (is_rd890_iommu(iommu->dev)) { |
339 |
++ pci_read_config_dword(iommu->dev, 0xf0, &iommu->cache_cfg[0]); |
340 |
++ pci_read_config_dword(iommu->dev, 0xf4, &iommu->cache_cfg[1]); |
341 |
++ pci_read_config_dword(iommu->dev, 0xf8, &iommu->cache_cfg[2]); |
342 |
++ pci_read_config_dword(iommu->dev, 0xfc, &iommu->cache_cfg[3]); |
343 |
++ } |
344 |
+ } |
345 |
+ |
346 |
+ /* |
347 |
+@@ -649,29 +656,9 @@ static void __init init_iommu_from_acpi(struct amd_iommu *iommu, |
348 |
+ struct ivhd_entry *e; |
349 |
+ |
350 |
+ /* |
351 |
+- * First set the recommended feature enable bits from ACPI |
352 |
+- * into the IOMMU control registers |
353 |
++ * First save the recommended feature enable bits from ACPI |
354 |
+ */ |
355 |
+- h->flags & IVHD_FLAG_HT_TUN_EN_MASK ? |
356 |
+- iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : |
357 |
+- iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); |
358 |
+- |
359 |
+- h->flags & IVHD_FLAG_PASSPW_EN_MASK ? |
360 |
+- iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : |
361 |
+- iommu_feature_disable(iommu, CONTROL_PASSPW_EN); |
362 |
+- |
363 |
+- h->flags & IVHD_FLAG_RESPASSPW_EN_MASK ? |
364 |
+- iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : |
365 |
+- iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); |
366 |
+- |
367 |
+- h->flags & IVHD_FLAG_ISOC_EN_MASK ? |
368 |
+- iommu_feature_enable(iommu, CONTROL_ISOC_EN) : |
369 |
+- iommu_feature_disable(iommu, CONTROL_ISOC_EN); |
370 |
+- |
371 |
+- /* |
372 |
+- * make IOMMU memory accesses cache coherent |
373 |
+- */ |
374 |
+- iommu_feature_enable(iommu, CONTROL_COHERENT_EN); |
375 |
++ iommu->acpi_flags = h->flags; |
376 |
+ |
377 |
+ /* |
378 |
+ * Done. Now parse the device entries |
379 |
+@@ -1116,6 +1103,40 @@ static void init_device_table(void) |
380 |
+ } |
381 |
+ } |
382 |
+ |
383 |
++static void iommu_init_flags(struct amd_iommu *iommu) |
384 |
++{ |
385 |
++ iommu->acpi_flags & IVHD_FLAG_HT_TUN_EN_MASK ? |
386 |
++ iommu_feature_enable(iommu, CONTROL_HT_TUN_EN) : |
387 |
++ iommu_feature_disable(iommu, CONTROL_HT_TUN_EN); |
388 |
++ |
389 |
++ iommu->acpi_flags & IVHD_FLAG_PASSPW_EN_MASK ? |
390 |
++ iommu_feature_enable(iommu, CONTROL_PASSPW_EN) : |
391 |
++ iommu_feature_disable(iommu, CONTROL_PASSPW_EN); |
392 |
++ |
393 |
++ iommu->acpi_flags & IVHD_FLAG_RESPASSPW_EN_MASK ? |
394 |
++ iommu_feature_enable(iommu, CONTROL_RESPASSPW_EN) : |
395 |
++ iommu_feature_disable(iommu, CONTROL_RESPASSPW_EN); |
396 |
++ |
397 |
++ iommu->acpi_flags & IVHD_FLAG_ISOC_EN_MASK ? |
398 |
++ iommu_feature_enable(iommu, CONTROL_ISOC_EN) : |
399 |
++ iommu_feature_disable(iommu, CONTROL_ISOC_EN); |
400 |
++ |
401 |
++ /* |
402 |
++ * make IOMMU memory accesses cache coherent |
403 |
++ */ |
404 |
++ iommu_feature_enable(iommu, CONTROL_COHERENT_EN); |
405 |
++} |
406 |
++ |
407 |
++static void iommu_apply_quirks(struct amd_iommu *iommu) |
408 |
++{ |
409 |
++ if (is_rd890_iommu(iommu->dev)) { |
410 |
++ pci_write_config_dword(iommu->dev, 0xf0, iommu->cache_cfg[0]); |
411 |
++ pci_write_config_dword(iommu->dev, 0xf4, iommu->cache_cfg[1]); |
412 |
++ pci_write_config_dword(iommu->dev, 0xf8, iommu->cache_cfg[2]); |
413 |
++ pci_write_config_dword(iommu->dev, 0xfc, iommu->cache_cfg[3]); |
414 |
++ } |
415 |
++} |
416 |
++ |
417 |
+ /* |
418 |
+ * This function finally enables all IOMMUs found in the system after |
419 |
+ * they have been initialized |
420 |
+@@ -1126,6 +1147,8 @@ static void enable_iommus(void) |
421 |
+ |
422 |
+ for_each_iommu(iommu) { |
423 |
+ iommu_disable(iommu); |
424 |
++ iommu_apply_quirks(iommu); |
425 |
++ iommu_init_flags(iommu); |
426 |
+ iommu_set_device_table(iommu); |
427 |
+ iommu_enable_command_buffer(iommu); |
428 |
+ iommu_enable_event_buffer(iommu); |
429 |
+diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c |
430 |
+index f1efeba..5c5b8f3 100644 |
431 |
+--- a/arch/x86/kernel/apic/io_apic.c |
432 |
++++ b/arch/x86/kernel/apic/io_apic.c |
433 |
+@@ -306,14 +306,19 @@ void arch_init_copy_chip_data(struct irq_desc *old_desc, |
434 |
+ |
435 |
+ old_cfg = old_desc->chip_data; |
436 |
+ |
437 |
+- memcpy(cfg, old_cfg, sizeof(struct irq_cfg)); |
438 |
++ cfg->vector = old_cfg->vector; |
439 |
++ cfg->move_in_progress = old_cfg->move_in_progress; |
440 |
++ cpumask_copy(cfg->domain, old_cfg->domain); |
441 |
++ cpumask_copy(cfg->old_domain, old_cfg->old_domain); |
442 |
+ |
443 |
+ init_copy_irq_2_pin(old_cfg, cfg, node); |
444 |
+ } |
445 |
+ |
446 |
+-static void free_irq_cfg(struct irq_cfg *old_cfg) |
447 |
++static void free_irq_cfg(struct irq_cfg *cfg) |
448 |
+ { |
449 |
+- kfree(old_cfg); |
450 |
++ free_cpumask_var(cfg->domain); |
451 |
++ free_cpumask_var(cfg->old_domain); |
452 |
++ kfree(cfg); |
453 |
+ } |
454 |
+ |
455 |
+ void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc) |
456 |
+diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c |
457 |
+index 68e4a6f..d938871 100644 |
458 |
+--- a/arch/x86/kernel/cpu/common.c |
459 |
++++ b/arch/x86/kernel/cpu/common.c |
460 |
+@@ -537,7 +537,7 @@ void __cpuinit cpu_detect(struct cpuinfo_x86 *c) |
461 |
+ } |
462 |
+ } |
463 |
+ |
464 |
+-static void __cpuinit get_cpu_cap(struct cpuinfo_x86 *c) |
465 |
++void __cpuinit get_cpu_cap(struct cpuinfo_x86 *c) |
466 |
+ { |
467 |
+ u32 tfms, xlvl; |
468 |
+ u32 ebx; |
469 |
+@@ -576,6 +576,7 @@ static void __cpuinit get_cpu_cap(struct cpuinfo_x86 *c) |
470 |
+ if (c->extended_cpuid_level >= 0x80000007) |
471 |
+ c->x86_power = cpuid_edx(0x80000007); |
472 |
+ |
473 |
++ init_scattered_cpuid_features(c); |
474 |
+ } |
475 |
+ |
476 |
+ static void __cpuinit identify_cpu_without_cpuid(struct cpuinfo_x86 *c) |
477 |
+@@ -731,7 +732,6 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 *c) |
478 |
+ |
479 |
+ get_model_name(c); /* Default name */ |
480 |
+ |
481 |
+- init_scattered_cpuid_features(c); |
482 |
+ detect_nopl(c); |
483 |
+ } |
484 |
+ |
485 |
+diff --git a/arch/x86/kernel/cpu/cpu.h b/arch/x86/kernel/cpu/cpu.h |
486 |
+index 3624e8a..f668bb1 100644 |
487 |
+--- a/arch/x86/kernel/cpu/cpu.h |
488 |
++++ b/arch/x86/kernel/cpu/cpu.h |
489 |
+@@ -33,5 +33,6 @@ extern const struct cpu_dev *const __x86_cpu_dev_start[], |
490 |
+ *const __x86_cpu_dev_end[]; |
491 |
+ |
492 |
+ extern void cpu_detect_cache_sizes(struct cpuinfo_x86 *c); |
493 |
++extern void get_cpu_cap(struct cpuinfo_x86 *c); |
494 |
+ |
495 |
+ #endif |
496 |
+diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c |
497 |
+index 85f69cd..b438944 100644 |
498 |
+--- a/arch/x86/kernel/cpu/intel.c |
499 |
++++ b/arch/x86/kernel/cpu/intel.c |
500 |
+@@ -39,6 +39,7 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) |
501 |
+ misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID; |
502 |
+ wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); |
503 |
+ c->cpuid_level = cpuid_eax(0); |
504 |
++ get_cpu_cap(c); |
505 |
+ } |
506 |
+ } |
507 |
+ |
508 |
+diff --git a/arch/x86/kernel/cpu/mcheck/mce_amd.c b/arch/x86/kernel/cpu/mcheck/mce_amd.c |
509 |
+index 224392d..f80ff85 100644 |
510 |
+--- a/arch/x86/kernel/cpu/mcheck/mce_amd.c |
511 |
++++ b/arch/x86/kernel/cpu/mcheck/mce_amd.c |
512 |
+@@ -141,6 +141,7 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) |
513 |
+ address = (low & MASK_BLKPTR_LO) >> 21; |
514 |
+ if (!address) |
515 |
+ break; |
516 |
++ |
517 |
+ address += MCG_XBLK_ADDR; |
518 |
+ } else |
519 |
+ ++address; |
520 |
+@@ -148,12 +149,8 @@ void mce_amd_feature_init(struct cpuinfo_x86 *c) |
521 |
+ if (rdmsr_safe(address, &low, &high)) |
522 |
+ break; |
523 |
+ |
524 |
+- if (!(high & MASK_VALID_HI)) { |
525 |
+- if (block) |
526 |
+- continue; |
527 |
+- else |
528 |
+- break; |
529 |
+- } |
530 |
++ if (!(high & MASK_VALID_HI)) |
531 |
++ continue; |
532 |
+ |
533 |
+ if (!(high & MASK_CNTP_HI) || |
534 |
+ (high & MASK_LOCKED_HI)) |
535 |
+diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S |
536 |
+index 37c3d4b..75e3981 100644 |
537 |
+--- a/arch/x86/kernel/head_32.S |
538 |
++++ b/arch/x86/kernel/head_32.S |
539 |
+@@ -328,7 +328,7 @@ ENTRY(startup_32_smp) |
540 |
+ /* |
541 |
+ * Enable paging |
542 |
+ */ |
543 |
+- movl $pa(swapper_pg_dir),%eax |
544 |
++ movl pa(initial_page_table), %eax |
545 |
+ movl %eax,%cr3 /* set the page table pointer.. */ |
546 |
+ movl %cr0,%eax |
547 |
+ orl $X86_CR0_PG,%eax |
548 |
+@@ -608,6 +608,8 @@ ignore_int: |
549 |
+ .align 4 |
550 |
+ ENTRY(initial_code) |
551 |
+ .long i386_start_kernel |
552 |
++ENTRY(initial_page_table) |
553 |
++ .long pa(swapper_pg_dir) |
554 |
+ |
555 |
+ /* |
556 |
+ * BSS section |
557 |
+@@ -623,6 +625,10 @@ ENTRY(swapper_pg_dir) |
558 |
+ #endif |
559 |
+ swapper_pg_fixmap: |
560 |
+ .fill 1024,4,0 |
561 |
++#ifdef CONFIG_X86_TRAMPOLINE |
562 |
++ENTRY(trampoline_pg_dir) |
563 |
++ .fill 1024,4,0 |
564 |
++#endif |
565 |
+ ENTRY(empty_zero_page) |
566 |
+ .fill 4096,1,0 |
567 |
+ |
568 |
+diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c |
569 |
+index 7cd1886..917c66f 100644 |
570 |
+--- a/arch/x86/kernel/hpet.c |
571 |
++++ b/arch/x86/kernel/hpet.c |
572 |
+@@ -507,7 +507,7 @@ static int hpet_assign_irq(struct hpet_dev *dev) |
573 |
+ { |
574 |
+ unsigned int irq; |
575 |
+ |
576 |
+- irq = create_irq(); |
577 |
++ irq = create_irq_nr(0, -1); |
578 |
+ if (!irq) |
579 |
+ return -EINVAL; |
580 |
+ |
581 |
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c |
582 |
+index b4ae4ac..6600cfd 100644 |
583 |
+--- a/arch/x86/kernel/setup.c |
584 |
++++ b/arch/x86/kernel/setup.c |
585 |
+@@ -1008,6 +1008,8 @@ void __init setup_arch(char **cmdline_p) |
586 |
+ paging_init(); |
587 |
+ x86_init.paging.pagetable_setup_done(swapper_pg_dir); |
588 |
+ |
589 |
++ setup_trampoline_page_table(); |
590 |
++ |
591 |
+ tboot_probe(); |
592 |
+ |
593 |
+ #ifdef CONFIG_X86_64 |
594 |
+diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c |
595 |
+index 0bf2ece..821ee1b 100644 |
596 |
+--- a/arch/x86/kernel/smpboot.c |
597 |
++++ b/arch/x86/kernel/smpboot.c |
598 |
+@@ -73,7 +73,6 @@ |
599 |
+ |
600 |
+ #ifdef CONFIG_X86_32 |
601 |
+ u8 apicid_2_node[MAX_APICID]; |
602 |
+-static int low_mappings; |
603 |
+ #endif |
604 |
+ |
605 |
+ /* State of each CPU */ |
606 |
+@@ -300,6 +299,18 @@ notrace static void __cpuinit start_secondary(void *unused) |
607 |
+ * fragile that we want to limit the things done here to the |
608 |
+ * most necessary things. |
609 |
+ */ |
610 |
++ |
611 |
++#ifdef CONFIG_X86_32 |
612 |
++ /* |
613 |
++ * Switch away from the trampoline page-table |
614 |
++ * |
615 |
++ * Do this before cpu_init() because it needs to access per-cpu |
616 |
++ * data which may not be mapped in the trampoline page-table. |
617 |
++ */ |
618 |
++ load_cr3(swapper_pg_dir); |
619 |
++ __flush_tlb_all(); |
620 |
++#endif |
621 |
++ |
622 |
+ vmi_bringup(); |
623 |
+ cpu_init(); |
624 |
+ preempt_disable(); |
625 |
+@@ -318,12 +329,6 @@ notrace static void __cpuinit start_secondary(void *unused) |
626 |
+ legacy_pic->chip->unmask(0); |
627 |
+ } |
628 |
+ |
629 |
+-#ifdef CONFIG_X86_32 |
630 |
+- while (low_mappings) |
631 |
+- cpu_relax(); |
632 |
+- __flush_tlb_all(); |
633 |
+-#endif |
634 |
+- |
635 |
+ /* This must be done before setting cpu_online_mask */ |
636 |
+ set_cpu_sibling_map(raw_smp_processor_id()); |
637 |
+ wmb(); |
638 |
+@@ -773,6 +778,7 @@ do_rest: |
639 |
+ #ifdef CONFIG_X86_32 |
640 |
+ /* Stack for startup_32 can be just as for start_secondary onwards */ |
641 |
+ irq_ctx_init(cpu); |
642 |
++ initial_page_table = __pa(&trampoline_pg_dir); |
643 |
+ #else |
644 |
+ clear_tsk_thread_flag(c_idle.idle, TIF_FORK); |
645 |
+ initial_gs = per_cpu_offset(cpu); |
646 |
+@@ -920,20 +926,8 @@ int __cpuinit native_cpu_up(unsigned int cpu) |
647 |
+ |
648 |
+ per_cpu(cpu_state, cpu) = CPU_UP_PREPARE; |
649 |
+ |
650 |
+-#ifdef CONFIG_X86_32 |
651 |
+- /* init low mem mapping */ |
652 |
+- clone_pgd_range(swapper_pg_dir, swapper_pg_dir + KERNEL_PGD_BOUNDARY, |
653 |
+- min_t(unsigned long, KERNEL_PGD_PTRS, KERNEL_PGD_BOUNDARY)); |
654 |
+- flush_tlb_all(); |
655 |
+- low_mappings = 1; |
656 |
+- |
657 |
+ err = do_boot_cpu(apicid, cpu); |
658 |
+ |
659 |
+- zap_low_mappings(false); |
660 |
+- low_mappings = 0; |
661 |
+-#else |
662 |
+- err = do_boot_cpu(apicid, cpu); |
663 |
+-#endif |
664 |
+ if (err) { |
665 |
+ pr_debug("do_boot_cpu failed %d\n", err); |
666 |
+ return -EIO; |
667 |
+diff --git a/arch/x86/kernel/trampoline.c b/arch/x86/kernel/trampoline.c |
668 |
+index c652ef6..e2a5952 100644 |
669 |
+--- a/arch/x86/kernel/trampoline.c |
670 |
++++ b/arch/x86/kernel/trampoline.c |
671 |
+@@ -1,6 +1,7 @@ |
672 |
+ #include <linux/io.h> |
673 |
+ |
674 |
+ #include <asm/trampoline.h> |
675 |
++#include <asm/pgtable.h> |
676 |
+ #include <asm/e820.h> |
677 |
+ |
678 |
+ #if defined(CONFIG_X86_64) && defined(CONFIG_ACPI_SLEEP) |
679 |
+@@ -37,3 +38,19 @@ unsigned long __trampinit setup_trampoline(void) |
680 |
+ memcpy(trampoline_base, trampoline_data, TRAMPOLINE_SIZE); |
681 |
+ return virt_to_phys(trampoline_base); |
682 |
+ } |
683 |
++ |
684 |
++void __init setup_trampoline_page_table(void) |
685 |
++{ |
686 |
++#ifdef CONFIG_X86_32 |
687 |
++ /* Copy kernel address range */ |
688 |
++ clone_pgd_range(trampoline_pg_dir + KERNEL_PGD_BOUNDARY, |
689 |
++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, |
690 |
++ KERNEL_PGD_PTRS); |
691 |
++ |
692 |
++ /* Initialize low mappings */ |
693 |
++ clone_pgd_range(trampoline_pg_dir, |
694 |
++ swapper_pg_dir + KERNEL_PGD_BOUNDARY, |
695 |
++ min_t(unsigned long, KERNEL_PGD_PTRS, |
696 |
++ KERNEL_PGD_BOUNDARY)); |
697 |
++#endif |
698 |
++} |
699 |
+diff --git a/arch/x86/kvm/irq.h b/arch/x86/kvm/irq.h |
700 |
+index cd1f362..4227b1a 100644 |
701 |
+--- a/arch/x86/kvm/irq.h |
702 |
++++ b/arch/x86/kvm/irq.h |
703 |
+@@ -45,7 +45,6 @@ struct kvm_kpic_state { |
704 |
+ u8 irr; /* interrupt request register */ |
705 |
+ u8 imr; /* interrupt mask register */ |
706 |
+ u8 isr; /* interrupt service register */ |
707 |
+- u8 isr_ack; /* interrupt ack detection */ |
708 |
+ u8 priority_add; /* highest irq priority */ |
709 |
+ u8 irq_base; |
710 |
+ u8 read_reg_select; |
711 |
+@@ -58,6 +57,7 @@ struct kvm_kpic_state { |
712 |
+ u8 init4; /* true if 4 byte init */ |
713 |
+ u8 elcr; /* PIIX edge/trigger selection */ |
714 |
+ u8 elcr_mask; |
715 |
++ u8 isr_ack; /* interrupt ack detection */ |
716 |
+ struct kvm_pic *pics_state; |
717 |
+ }; |
718 |
+ |
719 |
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c |
720 |
+index ce438e0..93730fe 100644 |
721 |
+--- a/arch/x86/kvm/svm.c |
722 |
++++ b/arch/x86/kvm/svm.c |
723 |
+@@ -766,7 +766,6 @@ static void init_vmcb(struct vcpu_svm *svm) |
724 |
+ |
725 |
+ control->iopm_base_pa = iopm_base; |
726 |
+ control->msrpm_base_pa = __pa(svm->msrpm); |
727 |
+- control->tsc_offset = 0; |
728 |
+ control->int_ctl = V_INTR_MASKING_MASK; |
729 |
+ |
730 |
+ init_seg(&save->es); |
731 |
+@@ -902,6 +901,7 @@ static struct kvm_vcpu *svm_create_vcpu(struct kvm *kvm, unsigned int id) |
732 |
+ svm->vmcb_pa = page_to_pfn(page) << PAGE_SHIFT; |
733 |
+ svm->asid_generation = 0; |
734 |
+ init_vmcb(svm); |
735 |
++ svm->vmcb->control.tsc_offset = 0-native_read_tsc(); |
736 |
+ |
737 |
+ fx_init(&svm->vcpu); |
738 |
+ svm->vcpu.arch.apic_base = 0xfee00000 | MSR_IA32_APICBASE_ENABLE; |
739 |
+diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c |
740 |
+index f9897f7..9c0d0d3 100644 |
741 |
+--- a/arch/x86/mm/srat_64.c |
742 |
++++ b/arch/x86/mm/srat_64.c |
743 |
+@@ -420,9 +420,11 @@ int __init acpi_scan_nodes(unsigned long start, unsigned long end) |
744 |
+ return -1; |
745 |
+ } |
746 |
+ |
747 |
+- for_each_node_mask(i, nodes_parsed) |
748 |
+- e820_register_active_regions(i, nodes[i].start >> PAGE_SHIFT, |
749 |
+- nodes[i].end >> PAGE_SHIFT); |
750 |
++ for (i = 0; i < num_node_memblks; i++) |
751 |
++ e820_register_active_regions(memblk_nodeid[i], |
752 |
++ node_memblk_range[i].start >> PAGE_SHIFT, |
753 |
++ node_memblk_range[i].end >> PAGE_SHIFT); |
754 |
++ |
755 |
+ /* for out of order entries in SRAT */ |
756 |
+ sort_node_map(); |
757 |
+ if (!nodes_cover_memory(nodes)) { |
758 |
+diff --git a/arch/x86/oprofile/nmi_int.c b/arch/x86/oprofile/nmi_int.c |
759 |
+index 009b819..f1575c9 100644 |
760 |
+--- a/arch/x86/oprofile/nmi_int.c |
761 |
++++ b/arch/x86/oprofile/nmi_int.c |
762 |
+@@ -674,6 +674,7 @@ static int __init ppro_init(char **cpu_type) |
763 |
+ case 0x0f: |
764 |
+ case 0x16: |
765 |
+ case 0x17: |
766 |
++ case 0x1d: |
767 |
+ *cpu_type = "i386/core_2"; |
768 |
+ break; |
769 |
+ case 0x1a: |
770 |
+diff --git a/block/bsg.c b/block/bsg.c |
771 |
+index 82d5882..0c00870 100644 |
772 |
+--- a/block/bsg.c |
773 |
++++ b/block/bsg.c |
774 |
+@@ -426,7 +426,7 @@ static int blk_complete_sgv4_hdr_rq(struct request *rq, struct sg_io_v4 *hdr, |
775 |
+ /* |
776 |
+ * fill in all the output members |
777 |
+ */ |
778 |
+- hdr->device_status = status_byte(rq->errors); |
779 |
++ hdr->device_status = rq->errors & 0xff; |
780 |
+ hdr->transport_status = host_byte(rq->errors); |
781 |
+ hdr->driver_status = driver_byte(rq->errors); |
782 |
+ hdr->info = 0; |
783 |
+diff --git a/drivers/acpi/acpica/aclocal.h b/drivers/acpi/acpica/aclocal.h |
784 |
+index 147a7e6..9f82a38 100644 |
785 |
+--- a/drivers/acpi/acpica/aclocal.h |
786 |
++++ b/drivers/acpi/acpica/aclocal.h |
787 |
+@@ -853,6 +853,7 @@ struct acpi_bit_register_info { |
788 |
+ ACPI_BITMASK_POWER_BUTTON_STATUS | \ |
789 |
+ ACPI_BITMASK_SLEEP_BUTTON_STATUS | \ |
790 |
+ ACPI_BITMASK_RT_CLOCK_STATUS | \ |
791 |
++ ACPI_BITMASK_PCIEXP_WAKE_DISABLE | \ |
792 |
+ ACPI_BITMASK_WAKE_STATUS) |
793 |
+ |
794 |
+ #define ACPI_BITMASK_TIMER_ENABLE 0x0001 |
795 |
+diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c |
796 |
+index 2bb28b9..51cada7 100644 |
797 |
+--- a/drivers/acpi/blacklist.c |
798 |
++++ b/drivers/acpi/blacklist.c |
799 |
+@@ -226,6 +226,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
800 |
+ }, |
801 |
+ }, |
802 |
+ { |
803 |
++ .callback = dmi_disable_osi_vista, |
804 |
++ .ident = "Toshiba Satellite L355", |
805 |
++ .matches = { |
806 |
++ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
807 |
++ DMI_MATCH(DMI_PRODUCT_VERSION, "Satellite L355"), |
808 |
++ }, |
809 |
++ }, |
810 |
++ { |
811 |
+ .callback = dmi_disable_osi_win7, |
812 |
+ .ident = "ASUS K50IJ", |
813 |
+ .matches = { |
814 |
+@@ -233,6 +241,14 @@ static struct dmi_system_id acpi_osi_dmi_table[] __initdata = { |
815 |
+ DMI_MATCH(DMI_PRODUCT_NAME, "K50IJ"), |
816 |
+ }, |
817 |
+ }, |
818 |
++ { |
819 |
++ .callback = dmi_disable_osi_vista, |
820 |
++ .ident = "Toshiba P305D", |
821 |
++ .matches = { |
822 |
++ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
823 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "Satellite P305D"), |
824 |
++ }, |
825 |
++ }, |
826 |
+ |
827 |
+ /* |
828 |
+ * BIOS invocation of _OSI(Linux) is almost always a BIOS bug. |
829 |
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c |
830 |
+index c1d23cd..a33fbc9 100644 |
831 |
+--- a/drivers/acpi/bus.c |
832 |
++++ b/drivers/acpi/bus.c |
833 |
+@@ -80,23 +80,15 @@ static int set_copy_dsdt(const struct dmi_system_id *id) |
834 |
+ |
835 |
+ static struct dmi_system_id dsdt_dmi_table[] __initdata = { |
836 |
+ /* |
837 |
+- * Insyde BIOS on some TOSHIBA machines corrupt the DSDT. |
838 |
++ * Invoke DSDT corruption work-around on all Toshiba Satellite. |
839 |
+ * https://bugzilla.kernel.org/show_bug.cgi?id=14679 |
840 |
+ */ |
841 |
+ { |
842 |
+ .callback = set_copy_dsdt, |
843 |
+- .ident = "TOSHIBA Satellite A505", |
844 |
++ .ident = "TOSHIBA Satellite", |
845 |
+ .matches = { |
846 |
+ DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
847 |
+- DMI_MATCH(DMI_PRODUCT_NAME, "Satellite A505"), |
848 |
+- }, |
849 |
+- }, |
850 |
+- { |
851 |
+- .callback = set_copy_dsdt, |
852 |
+- .ident = "TOSHIBA Satellite L505D", |
853 |
+- .matches = { |
854 |
+- DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"), |
855 |
+- DMI_MATCH(DMI_PRODUCT_NAME, "Satellite L505D"), |
856 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"), |
857 |
+ }, |
858 |
+ }, |
859 |
+ {} |
860 |
+diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c |
861 |
+index e9699aa..bec561c 100644 |
862 |
+--- a/drivers/acpi/processor_core.c |
863 |
++++ b/drivers/acpi/processor_core.c |
864 |
+@@ -29,12 +29,6 @@ static int set_no_mwait(const struct dmi_system_id *id) |
865 |
+ |
866 |
+ static struct dmi_system_id __cpuinitdata processor_idle_dmi_table[] = { |
867 |
+ { |
868 |
+- set_no_mwait, "IFL91 board", { |
869 |
+- DMI_MATCH(DMI_BIOS_VENDOR, "COMPAL"), |
870 |
+- DMI_MATCH(DMI_SYS_VENDOR, "ZEPTO"), |
871 |
+- DMI_MATCH(DMI_PRODUCT_VERSION, "3215W"), |
872 |
+- DMI_MATCH(DMI_BOARD_NAME, "IFL91") }, NULL}, |
873 |
+- { |
874 |
+ set_no_mwait, "Extensa 5220", { |
875 |
+ DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies LTD"), |
876 |
+ DMI_MATCH(DMI_SYS_VENDOR, "Acer"), |
877 |
+@@ -352,4 +346,5 @@ void __init acpi_early_processor_set_pdc(void) |
878 |
+ acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, |
879 |
+ ACPI_UINT32_MAX, |
880 |
+ early_init_pdc, NULL, NULL, NULL); |
881 |
++ acpi_get_devices("ACPI0007", early_init_pdc, NULL, NULL); |
882 |
+ } |
883 |
+diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c |
884 |
+index 2862c78..4882bc1 100644 |
885 |
+--- a/drivers/acpi/sleep.c |
886 |
++++ b/drivers/acpi/sleep.c |
887 |
+@@ -362,6 +362,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d) |
888 |
+ return 0; |
889 |
+ } |
890 |
+ |
891 |
++static int __init init_nvs_nosave(const struct dmi_system_id *d) |
892 |
++{ |
893 |
++ acpi_nvs_nosave(); |
894 |
++ return 0; |
895 |
++} |
896 |
++ |
897 |
+ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
898 |
+ { |
899 |
+ .callback = init_old_suspend_ordering, |
900 |
+@@ -396,6 +402,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = { |
901 |
+ DMI_MATCH(DMI_BOARD_NAME, "CF51-2L"), |
902 |
+ }, |
903 |
+ }, |
904 |
++ { |
905 |
++ .callback = init_nvs_nosave, |
906 |
++ .ident = "Sony Vaio VGN-SR11M", |
907 |
++ .matches = { |
908 |
++ DMI_MATCH(DMI_SYS_VENDOR, "Sony Corporation"), |
909 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "VGN-SR11M"), |
910 |
++ }, |
911 |
++ }, |
912 |
++ { |
913 |
++ .callback = init_nvs_nosave, |
914 |
++ .ident = "Everex StepNote Series", |
915 |
++ .matches = { |
916 |
++ DMI_MATCH(DMI_SYS_VENDOR, "Everex Systems, Inc."), |
917 |
++ DMI_MATCH(DMI_PRODUCT_NAME, "Everex StepNote Series"), |
918 |
++ }, |
919 |
++ }, |
920 |
+ {}, |
921 |
+ }; |
922 |
+ #endif /* CONFIG_SUSPEND */ |
923 |
+diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c |
924 |
+index f252253..d571e3f 100644 |
925 |
+--- a/drivers/ata/ahci.c |
926 |
++++ b/drivers/ata/ahci.c |
927 |
+@@ -89,6 +89,10 @@ static int ahci_pci_device_suspend(struct pci_dev *pdev, pm_message_t mesg); |
928 |
+ static int ahci_pci_device_resume(struct pci_dev *pdev); |
929 |
+ #endif |
930 |
+ |
931 |
++static struct scsi_host_template ahci_sht = { |
932 |
++ AHCI_SHT("ahci"), |
933 |
++}; |
934 |
++ |
935 |
+ static struct ata_port_operations ahci_vt8251_ops = { |
936 |
+ .inherits = &ahci_ops, |
937 |
+ .hardreset = ahci_vt8251_hardreset, |
938 |
+diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h |
939 |
+index 7113c57..88aa888 100644 |
940 |
+--- a/drivers/ata/ahci.h |
941 |
++++ b/drivers/ata/ahci.h |
942 |
+@@ -297,7 +297,17 @@ struct ahci_host_priv { |
943 |
+ |
944 |
+ extern int ahci_ignore_sss; |
945 |
+ |
946 |
+-extern struct scsi_host_template ahci_sht; |
947 |
++extern struct device_attribute *ahci_shost_attrs[]; |
948 |
++extern struct device_attribute *ahci_sdev_attrs[]; |
949 |
++ |
950 |
++#define AHCI_SHT(drv_name) \ |
951 |
++ ATA_NCQ_SHT(drv_name), \ |
952 |
++ .can_queue = AHCI_MAX_CMDS - 1, \ |
953 |
++ .sg_tablesize = AHCI_MAX_SG, \ |
954 |
++ .dma_boundary = AHCI_DMA_BOUNDARY, \ |
955 |
++ .shost_attrs = ahci_shost_attrs, \ |
956 |
++ .sdev_attrs = ahci_sdev_attrs |
957 |
++ |
958 |
+ extern struct ata_port_operations ahci_ops; |
959 |
+ |
960 |
+ void ahci_save_initial_config(struct device *dev, |
961 |
+diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c |
962 |
+index 5e11b16..9366743 100644 |
963 |
+--- a/drivers/ata/ahci_platform.c |
964 |
++++ b/drivers/ata/ahci_platform.c |
965 |
+@@ -23,6 +23,10 @@ |
966 |
+ #include <linux/ahci_platform.h> |
967 |
+ #include "ahci.h" |
968 |
+ |
969 |
++static struct scsi_host_template ahci_platform_sht = { |
970 |
++ AHCI_SHT("ahci_platform"), |
971 |
++}; |
972 |
++ |
973 |
+ static int __init ahci_probe(struct platform_device *pdev) |
974 |
+ { |
975 |
+ struct device *dev = &pdev->dev; |
976 |
+@@ -140,7 +144,7 @@ static int __init ahci_probe(struct platform_device *pdev) |
977 |
+ ahci_print_info(host, "platform"); |
978 |
+ |
979 |
+ rc = ata_host_activate(host, irq, ahci_interrupt, IRQF_SHARED, |
980 |
+- &ahci_sht); |
981 |
++ &ahci_platform_sht); |
982 |
+ if (rc) |
983 |
+ goto err0; |
984 |
+ |
985 |
+diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c |
986 |
+index 98c80e1..b765a01 100644 |
987 |
+--- a/drivers/ata/libahci.c |
988 |
++++ b/drivers/ata/libahci.c |
989 |
+@@ -121,7 +121,7 @@ static DEVICE_ATTR(ahci_port_cmd, S_IRUGO, ahci_show_port_cmd, NULL); |
990 |
+ static DEVICE_ATTR(em_buffer, S_IWUSR | S_IRUGO, |
991 |
+ ahci_read_em_buffer, ahci_store_em_buffer); |
992 |
+ |
993 |
+-static struct device_attribute *ahci_shost_attrs[] = { |
994 |
++struct device_attribute *ahci_shost_attrs[] = { |
995 |
+ &dev_attr_link_power_management_policy, |
996 |
+ &dev_attr_em_message_type, |
997 |
+ &dev_attr_em_message, |
998 |
+@@ -132,22 +132,14 @@ static struct device_attribute *ahci_shost_attrs[] = { |
999 |
+ &dev_attr_em_buffer, |
1000 |
+ NULL |
1001 |
+ }; |
1002 |
++EXPORT_SYMBOL_GPL(ahci_shost_attrs); |
1003 |
+ |
1004 |
+-static struct device_attribute *ahci_sdev_attrs[] = { |
1005 |
++struct device_attribute *ahci_sdev_attrs[] = { |
1006 |
+ &dev_attr_sw_activity, |
1007 |
+ &dev_attr_unload_heads, |
1008 |
+ NULL |
1009 |
+ }; |
1010 |
+- |
1011 |
+-struct scsi_host_template ahci_sht = { |
1012 |
+- ATA_NCQ_SHT("ahci"), |
1013 |
+- .can_queue = AHCI_MAX_CMDS - 1, |
1014 |
+- .sg_tablesize = AHCI_MAX_SG, |
1015 |
+- .dma_boundary = AHCI_DMA_BOUNDARY, |
1016 |
+- .shost_attrs = ahci_shost_attrs, |
1017 |
+- .sdev_attrs = ahci_sdev_attrs, |
1018 |
+-}; |
1019 |
+-EXPORT_SYMBOL_GPL(ahci_sht); |
1020 |
++EXPORT_SYMBOL_GPL(ahci_sdev_attrs); |
1021 |
+ |
1022 |
+ struct ata_port_operations ahci_ops = { |
1023 |
+ .inherits = &sata_pmp_port_ops, |
1024 |
+diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c |
1025 |
+index 258bc2a..3c108bc 100644 |
1026 |
+--- a/drivers/block/virtio_blk.c |
1027 |
++++ b/drivers/block/virtio_blk.c |
1028 |
+@@ -203,6 +203,7 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str) |
1029 |
+ struct virtio_blk *vblk = disk->private_data; |
1030 |
+ struct request *req; |
1031 |
+ struct bio *bio; |
1032 |
++ int err; |
1033 |
+ |
1034 |
+ bio = bio_map_kern(vblk->disk->queue, id_str, VIRTIO_BLK_ID_BYTES, |
1035 |
+ GFP_KERNEL); |
1036 |
+@@ -216,7 +217,10 @@ static int virtblk_get_id(struct gendisk *disk, char *id_str) |
1037 |
+ } |
1038 |
+ |
1039 |
+ req->cmd_type = REQ_TYPE_SPECIAL; |
1040 |
+- return blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); |
1041 |
++ err = blk_execute_rq(vblk->disk->queue, vblk->disk, req, false); |
1042 |
++ blk_put_request(req); |
1043 |
++ |
1044 |
++ return err; |
1045 |
+ } |
1046 |
+ |
1047 |
+ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode, |
1048 |
+diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c |
1049 |
+index adc0f89..4187121 100644 |
1050 |
+--- a/drivers/char/agp/intel-agp.c |
1051 |
++++ b/drivers/char/agp/intel-agp.c |
1052 |
+@@ -12,6 +12,7 @@ |
1053 |
+ #include <asm/smp.h> |
1054 |
+ #include "agp.h" |
1055 |
+ #include "intel-agp.h" |
1056 |
++#include <linux/intel-gtt.h> |
1057 |
+ |
1058 |
+ #include "intel-gtt.c" |
1059 |
+ |
1060 |
+diff --git a/drivers/char/agp/intel-agp.h b/drivers/char/agp/intel-agp.h |
1061 |
+index bc9a4ad..4c8949a 100644 |
1062 |
+--- a/drivers/char/agp/intel-agp.h |
1063 |
++++ b/drivers/char/agp/intel-agp.h |
1064 |
+@@ -60,6 +60,12 @@ |
1065 |
+ #define I810_PTE_LOCAL 0x00000002 |
1066 |
+ #define I810_PTE_VALID 0x00000001 |
1067 |
+ #define I830_PTE_SYSTEM_CACHED 0x00000006 |
1068 |
++/* GT PTE cache control fields */ |
1069 |
++#define GEN6_PTE_UNCACHED 0x00000002 |
1070 |
++#define GEN6_PTE_LLC 0x00000004 |
1071 |
++#define GEN6_PTE_LLC_MLC 0x00000006 |
1072 |
++#define GEN6_PTE_GFDT 0x00000008 |
1073 |
++ |
1074 |
+ #define I810_SMRAM_MISCC 0x70 |
1075 |
+ #define I810_GFX_MEM_WIN_SIZE 0x00010000 |
1076 |
+ #define I810_GFX_MEM_WIN_32M 0x00010000 |
1077 |
+diff --git a/drivers/char/agp/intel-gtt.c b/drivers/char/agp/intel-gtt.c |
1078 |
+index ed11c77..86f5337 100644 |
1079 |
+--- a/drivers/char/agp/intel-gtt.c |
1080 |
++++ b/drivers/char/agp/intel-gtt.c |
1081 |
+@@ -49,6 +49,26 @@ static struct gatt_mask intel_i810_masks[] = |
1082 |
+ .type = INTEL_AGP_CACHED_MEMORY} |
1083 |
+ }; |
1084 |
+ |
1085 |
++#define INTEL_AGP_UNCACHED_MEMORY 0 |
1086 |
++#define INTEL_AGP_CACHED_MEMORY_LLC 1 |
1087 |
++#define INTEL_AGP_CACHED_MEMORY_LLC_GFDT 2 |
1088 |
++#define INTEL_AGP_CACHED_MEMORY_LLC_MLC 3 |
1089 |
++#define INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT 4 |
1090 |
++ |
1091 |
++static struct gatt_mask intel_gen6_masks[] = |
1092 |
++{ |
1093 |
++ {.mask = I810_PTE_VALID | GEN6_PTE_UNCACHED, |
1094 |
++ .type = INTEL_AGP_UNCACHED_MEMORY }, |
1095 |
++ {.mask = I810_PTE_VALID | GEN6_PTE_LLC, |
1096 |
++ .type = INTEL_AGP_CACHED_MEMORY_LLC }, |
1097 |
++ {.mask = I810_PTE_VALID | GEN6_PTE_LLC | GEN6_PTE_GFDT, |
1098 |
++ .type = INTEL_AGP_CACHED_MEMORY_LLC_GFDT }, |
1099 |
++ {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC, |
1100 |
++ .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC }, |
1101 |
++ {.mask = I810_PTE_VALID | GEN6_PTE_LLC_MLC | GEN6_PTE_GFDT, |
1102 |
++ .type = INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT }, |
1103 |
++}; |
1104 |
++ |
1105 |
+ static struct _intel_private { |
1106 |
+ struct pci_dev *pcidev; /* device one */ |
1107 |
+ u8 __iomem *registers; |
1108 |
+@@ -175,13 +195,6 @@ static void intel_agp_insert_sg_entries(struct agp_memory *mem, |
1109 |
+ off_t pg_start, int mask_type) |
1110 |
+ { |
1111 |
+ int i, j; |
1112 |
+- u32 cache_bits = 0; |
1113 |
+- |
1114 |
+- if (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_HB || |
1115 |
+- agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_SANDYBRIDGE_M_HB) |
1116 |
+- { |
1117 |
+- cache_bits = I830_PTE_SYSTEM_CACHED; |
1118 |
+- } |
1119 |
+ |
1120 |
+ for (i = 0, j = pg_start; i < mem->page_count; i++, j++) { |
1121 |
+ writel(agp_bridge->driver->mask_memory(agp_bridge, |
1122 |
+@@ -314,6 +327,23 @@ static int intel_i830_type_to_mask_type(struct agp_bridge_data *bridge, |
1123 |
+ return 0; |
1124 |
+ } |
1125 |
+ |
1126 |
++static int intel_gen6_type_to_mask_type(struct agp_bridge_data *bridge, |
1127 |
++ int type) |
1128 |
++{ |
1129 |
++ unsigned int type_mask = type & ~AGP_USER_CACHED_MEMORY_GFDT; |
1130 |
++ unsigned int gfdt = type & AGP_USER_CACHED_MEMORY_GFDT; |
1131 |
++ |
1132 |
++ if (type_mask == AGP_USER_UNCACHED_MEMORY) |
1133 |
++ return INTEL_AGP_UNCACHED_MEMORY; |
1134 |
++ else if (type_mask == AGP_USER_CACHED_MEMORY_LLC_MLC) |
1135 |
++ return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_MLC_GFDT : |
1136 |
++ INTEL_AGP_CACHED_MEMORY_LLC_MLC; |
1137 |
++ else /* set 'normal'/'cached' to LLC by default */ |
1138 |
++ return gfdt ? INTEL_AGP_CACHED_MEMORY_LLC_GFDT : |
1139 |
++ INTEL_AGP_CACHED_MEMORY_LLC; |
1140 |
++} |
1141 |
++ |
1142 |
++ |
1143 |
+ static int intel_i810_insert_entries(struct agp_memory *mem, off_t pg_start, |
1144 |
+ int type) |
1145 |
+ { |
1146 |
+@@ -1155,7 +1185,7 @@ static int intel_i915_insert_entries(struct agp_memory *mem, off_t pg_start, |
1147 |
+ |
1148 |
+ mask_type = agp_bridge->driver->agp_type_to_mask_type(agp_bridge, type); |
1149 |
+ |
1150 |
+- if (mask_type != 0 && mask_type != AGP_PHYS_MEMORY && |
1151 |
++ if (!IS_SNB && mask_type != 0 && mask_type != AGP_PHYS_MEMORY && |
1152 |
+ mask_type != INTEL_AGP_CACHED_MEMORY) |
1153 |
+ goto out_err; |
1154 |
+ |
1155 |
+@@ -1546,7 +1576,7 @@ static const struct agp_bridge_driver intel_gen6_driver = { |
1156 |
+ .fetch_size = intel_i9xx_fetch_size, |
1157 |
+ .cleanup = intel_i915_cleanup, |
1158 |
+ .mask_memory = intel_gen6_mask_memory, |
1159 |
+- .masks = intel_i810_masks, |
1160 |
++ .masks = intel_gen6_masks, |
1161 |
+ .agp_enable = intel_i810_agp_enable, |
1162 |
+ .cache_flush = global_cache_flush, |
1163 |
+ .create_gatt_table = intel_i965_create_gatt_table, |
1164 |
+@@ -1559,7 +1589,7 @@ static const struct agp_bridge_driver intel_gen6_driver = { |
1165 |
+ .agp_alloc_pages = agp_generic_alloc_pages, |
1166 |
+ .agp_destroy_page = agp_generic_destroy_page, |
1167 |
+ .agp_destroy_pages = agp_generic_destroy_pages, |
1168 |
+- .agp_type_to_mask_type = intel_i830_type_to_mask_type, |
1169 |
++ .agp_type_to_mask_type = intel_gen6_type_to_mask_type, |
1170 |
+ .chipset_flush = intel_i915_chipset_flush, |
1171 |
+ #ifdef USE_PCI_DMA_API |
1172 |
+ .agp_map_page = intel_agp_map_page, |
1173 |
+diff --git a/drivers/char/virtio_console.c b/drivers/char/virtio_console.c |
1174 |
+index c810481..0f69c5e 100644 |
1175 |
+--- a/drivers/char/virtio_console.c |
1176 |
++++ b/drivers/char/virtio_console.c |
1177 |
+@@ -459,9 +459,12 @@ static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count, |
1178 |
+ |
1179 |
+ /* |
1180 |
+ * Wait till the host acknowledges it pushed out the data we |
1181 |
+- * sent. This is done for ports in blocking mode or for data |
1182 |
+- * from the hvc_console; the tty operations are performed with |
1183 |
+- * spinlocks held so we can't sleep here. |
1184 |
++ * sent. This is done for data from the hvc_console; the tty |
1185 |
++ * operations are performed with spinlocks held so we can't |
1186 |
++ * sleep here. An alternative would be to copy the data to a |
1187 |
++ * buffer and relax the spinning requirement. The downside is |
1188 |
++ * we need to kmalloc a GFP_ATOMIC buffer each time the |
1189 |
++ * console driver writes something out. |
1190 |
+ */ |
1191 |
+ while (!virtqueue_get_buf(out_vq, &len)) |
1192 |
+ cpu_relax(); |
1193 |
+@@ -626,6 +629,14 @@ static ssize_t port_fops_write(struct file *filp, const char __user *ubuf, |
1194 |
+ goto free_buf; |
1195 |
+ } |
1196 |
+ |
1197 |
++ /* |
1198 |
++ * We now ask send_buf() to not spin for generic ports -- we |
1199 |
++ * can re-use the same code path that non-blocking file |
1200 |
++ * descriptors take for blocking file descriptors since the |
1201 |
++ * wait is already done and we're certain the write will go |
1202 |
++ * through to the host. |
1203 |
++ */ |
1204 |
++ nonblock = true; |
1205 |
+ ret = send_buf(port, buf, count, nonblock); |
1206 |
+ |
1207 |
+ if (nonblock && ret > 0) |
1208 |
+diff --git a/drivers/dma/ioat/dma_v2.c b/drivers/dma/ioat/dma_v2.c |
1209 |
+index 216f9d3..effd140 100644 |
1210 |
+--- a/drivers/dma/ioat/dma_v2.c |
1211 |
++++ b/drivers/dma/ioat/dma_v2.c |
1212 |
+@@ -879,7 +879,7 @@ int __devinit ioat2_dma_probe(struct ioatdma_device *device, int dca) |
1213 |
+ dma->device_issue_pending = ioat2_issue_pending; |
1214 |
+ dma->device_alloc_chan_resources = ioat2_alloc_chan_resources; |
1215 |
+ dma->device_free_chan_resources = ioat2_free_chan_resources; |
1216 |
+- dma->device_tx_status = ioat_tx_status; |
1217 |
++ dma->device_tx_status = ioat_dma_tx_status; |
1218 |
+ |
1219 |
+ err = ioat_probe(device); |
1220 |
+ if (err) |
1221 |
+diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c |
1222 |
+index 86c5ae9..411d5bf 100644 |
1223 |
+--- a/drivers/dma/mv_xor.c |
1224 |
++++ b/drivers/dma/mv_xor.c |
1225 |
+@@ -162,7 +162,7 @@ static int mv_is_err_intr(u32 intr_cause) |
1226 |
+ |
1227 |
+ static void mv_xor_device_clear_eoc_cause(struct mv_xor_chan *chan) |
1228 |
+ { |
1229 |
+- u32 val = (1 << (1 + (chan->idx * 16))); |
1230 |
++ u32 val = ~(1 << (chan->idx * 16)); |
1231 |
+ dev_dbg(chan->device->common.dev, "%s, val 0x%08x\n", __func__, val); |
1232 |
+ __raw_writel(val, XOR_INTR_CAUSE(chan)); |
1233 |
+ } |
1234 |
+diff --git a/drivers/edac/i7core_edac.c b/drivers/edac/i7core_edac.c |
1235 |
+index e0187d1..0fd5b85 100644 |
1236 |
+--- a/drivers/edac/i7core_edac.c |
1237 |
++++ b/drivers/edac/i7core_edac.c |
1238 |
+@@ -1140,6 +1140,7 @@ static struct mcidev_sysfs_attribute i7core_udimm_counters_attrs[] = { |
1239 |
+ ATTR_COUNTER(0), |
1240 |
+ ATTR_COUNTER(1), |
1241 |
+ ATTR_COUNTER(2), |
1242 |
++ { .attr = { .name = NULL } } |
1243 |
+ }; |
1244 |
+ |
1245 |
+ static struct mcidev_sysfs_group i7core_udimm_counters = { |
1246 |
+diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c |
1247 |
+index 9f627e7..4b521dd 100644 |
1248 |
+--- a/drivers/firewire/ohci.c |
1249 |
++++ b/drivers/firewire/ohci.c |
1250 |
+@@ -2439,7 +2439,7 @@ static int __devinit pci_probe(struct pci_dev *dev, |
1251 |
+ const struct pci_device_id *ent) |
1252 |
+ { |
1253 |
+ struct fw_ohci *ohci; |
1254 |
+- u32 bus_options, max_receive, link_speed, version, link_enh; |
1255 |
++ u32 bus_options, max_receive, link_speed, version; |
1256 |
+ u64 guid; |
1257 |
+ int i, err, n_ir, n_it; |
1258 |
+ size_t size; |
1259 |
+@@ -2492,23 +2492,6 @@ static int __devinit pci_probe(struct pci_dev *dev, |
1260 |
+ if (param_quirks) |
1261 |
+ ohci->quirks = param_quirks; |
1262 |
+ |
1263 |
+- /* TI OHCI-Lynx and compatible: set recommended configuration bits. */ |
1264 |
+- if (dev->vendor == PCI_VENDOR_ID_TI) { |
1265 |
+- pci_read_config_dword(dev, PCI_CFG_TI_LinkEnh, &link_enh); |
1266 |
+- |
1267 |
+- /* adjust latency of ATx FIFO: use 1.7 KB threshold */ |
1268 |
+- link_enh &= ~TI_LinkEnh_atx_thresh_mask; |
1269 |
+- link_enh |= TI_LinkEnh_atx_thresh_1_7K; |
1270 |
+- |
1271 |
+- /* use priority arbitration for asynchronous responses */ |
1272 |
+- link_enh |= TI_LinkEnh_enab_unfair; |
1273 |
+- |
1274 |
+- /* required for aPhyEnhanceEnable to work */ |
1275 |
+- link_enh |= TI_LinkEnh_enab_accel; |
1276 |
+- |
1277 |
+- pci_write_config_dword(dev, PCI_CFG_TI_LinkEnh, link_enh); |
1278 |
+- } |
1279 |
+- |
1280 |
+ ar_context_init(&ohci->ar_request_ctx, ohci, |
1281 |
+ OHCI1394_AsReqRcvContextControlSet); |
1282 |
+ |
1283 |
+diff --git a/drivers/firewire/ohci.h b/drivers/firewire/ohci.h |
1284 |
+index 3bc9a5d..d49e146 100644 |
1285 |
+--- a/drivers/firewire/ohci.h |
1286 |
++++ b/drivers/firewire/ohci.h |
1287 |
+@@ -154,12 +154,4 @@ |
1288 |
+ |
1289 |
+ #define OHCI1394_phy_tcode 0xe |
1290 |
+ |
1291 |
+-/* TI extensions */ |
1292 |
+- |
1293 |
+-#define PCI_CFG_TI_LinkEnh 0xf4 |
1294 |
+-#define TI_LinkEnh_enab_accel 0x00000002 |
1295 |
+-#define TI_LinkEnh_enab_unfair 0x00000080 |
1296 |
+-#define TI_LinkEnh_atx_thresh_mask 0x00003000 |
1297 |
+-#define TI_LinkEnh_atx_thresh_1_7K 0x00001000 |
1298 |
+- |
1299 |
+ #endif /* _FIREWIRE_OHCI_H */ |
1300 |
+diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c |
1301 |
+index 33dad3f..f353cdf 100644 |
1302 |
+--- a/drivers/gpu/drm/drm_gem.c |
1303 |
++++ b/drivers/gpu/drm/drm_gem.c |
1304 |
+@@ -451,28 +451,6 @@ drm_gem_object_free(struct kref *kref) |
1305 |
+ } |
1306 |
+ EXPORT_SYMBOL(drm_gem_object_free); |
1307 |
+ |
1308 |
+-/** |
1309 |
+- * Called after the last reference to the object has been lost. |
1310 |
+- * Must be called without holding struct_mutex |
1311 |
+- * |
1312 |
+- * Frees the object |
1313 |
+- */ |
1314 |
+-void |
1315 |
+-drm_gem_object_free_unlocked(struct kref *kref) |
1316 |
+-{ |
1317 |
+- struct drm_gem_object *obj = (struct drm_gem_object *) kref; |
1318 |
+- struct drm_device *dev = obj->dev; |
1319 |
+- |
1320 |
+- if (dev->driver->gem_free_object_unlocked != NULL) |
1321 |
+- dev->driver->gem_free_object_unlocked(obj); |
1322 |
+- else if (dev->driver->gem_free_object != NULL) { |
1323 |
+- mutex_lock(&dev->struct_mutex); |
1324 |
+- dev->driver->gem_free_object(obj); |
1325 |
+- mutex_unlock(&dev->struct_mutex); |
1326 |
+- } |
1327 |
+-} |
1328 |
+-EXPORT_SYMBOL(drm_gem_object_free_unlocked); |
1329 |
+- |
1330 |
+ static void drm_gem_object_ref_bug(struct kref *list_kref) |
1331 |
+ { |
1332 |
+ BUG(); |
1333 |
+@@ -517,6 +495,10 @@ void drm_gem_vm_open(struct vm_area_struct *vma) |
1334 |
+ struct drm_gem_object *obj = vma->vm_private_data; |
1335 |
+ |
1336 |
+ drm_gem_object_reference(obj); |
1337 |
++ |
1338 |
++ mutex_lock(&obj->dev->struct_mutex); |
1339 |
++ drm_vm_open_locked(vma); |
1340 |
++ mutex_unlock(&obj->dev->struct_mutex); |
1341 |
+ } |
1342 |
+ EXPORT_SYMBOL(drm_gem_vm_open); |
1343 |
+ |
1344 |
+@@ -524,7 +506,10 @@ void drm_gem_vm_close(struct vm_area_struct *vma) |
1345 |
+ { |
1346 |
+ struct drm_gem_object *obj = vma->vm_private_data; |
1347 |
+ |
1348 |
+- drm_gem_object_unreference_unlocked(obj); |
1349 |
++ mutex_lock(&obj->dev->struct_mutex); |
1350 |
++ drm_vm_close_locked(vma); |
1351 |
++ drm_gem_object_unreference(obj); |
1352 |
++ mutex_unlock(&obj->dev->struct_mutex); |
1353 |
+ } |
1354 |
+ EXPORT_SYMBOL(drm_gem_vm_close); |
1355 |
+ |
1356 |
+diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c |
1357 |
+index c3b13fb..3813e84 100644 |
1358 |
+--- a/drivers/gpu/drm/drm_vm.c |
1359 |
++++ b/drivers/gpu/drm/drm_vm.c |
1360 |
+@@ -433,15 +433,7 @@ static void drm_vm_open(struct vm_area_struct *vma) |
1361 |
+ mutex_unlock(&dev->struct_mutex); |
1362 |
+ } |
1363 |
+ |
1364 |
+-/** |
1365 |
+- * \c close method for all virtual memory types. |
1366 |
+- * |
1367 |
+- * \param vma virtual memory area. |
1368 |
+- * |
1369 |
+- * Search the \p vma private data entry in drm_device::vmalist, unlink it, and |
1370 |
+- * free it. |
1371 |
+- */ |
1372 |
+-static void drm_vm_close(struct vm_area_struct *vma) |
1373 |
++void drm_vm_close_locked(struct vm_area_struct *vma) |
1374 |
+ { |
1375 |
+ struct drm_file *priv = vma->vm_file->private_data; |
1376 |
+ struct drm_device *dev = priv->minor->dev; |
1377 |
+@@ -451,7 +443,6 @@ static void drm_vm_close(struct vm_area_struct *vma) |
1378 |
+ vma->vm_start, vma->vm_end - vma->vm_start); |
1379 |
+ atomic_dec(&dev->vma_count); |
1380 |
+ |
1381 |
+- mutex_lock(&dev->struct_mutex); |
1382 |
+ list_for_each_entry_safe(pt, temp, &dev->vmalist, head) { |
1383 |
+ if (pt->vma == vma) { |
1384 |
+ list_del(&pt->head); |
1385 |
+@@ -459,6 +450,23 @@ static void drm_vm_close(struct vm_area_struct *vma) |
1386 |
+ break; |
1387 |
+ } |
1388 |
+ } |
1389 |
++} |
1390 |
++ |
1391 |
++/** |
1392 |
++ * \c close method for all virtual memory types. |
1393 |
++ * |
1394 |
++ * \param vma virtual memory area. |
1395 |
++ * |
1396 |
++ * Search the \p vma private data entry in drm_device::vmalist, unlink it, and |
1397 |
++ * free it. |
1398 |
++ */ |
1399 |
++static void drm_vm_close(struct vm_area_struct *vma) |
1400 |
++{ |
1401 |
++ struct drm_file *priv = vma->vm_file->private_data; |
1402 |
++ struct drm_device *dev = priv->minor->dev; |
1403 |
++ |
1404 |
++ mutex_lock(&dev->struct_mutex); |
1405 |
++ drm_vm_close_locked(vma); |
1406 |
+ mutex_unlock(&dev->struct_mutex); |
1407 |
+ } |
1408 |
+ |
1409 |
+diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c |
1410 |
+index ce8ff0e..d396fe5 100644 |
1411 |
+--- a/drivers/gpu/drm/i915/i915_dma.c |
1412 |
++++ b/drivers/gpu/drm/i915/i915_dma.c |
1413 |
+@@ -1778,9 +1778,9 @@ unsigned long i915_chipset_val(struct drm_i915_private *dev_priv) |
1414 |
+ } |
1415 |
+ } |
1416 |
+ |
1417 |
+- div_u64(diff, diff1); |
1418 |
++ diff = div_u64(diff, diff1); |
1419 |
+ ret = ((m * diff) + c); |
1420 |
+- div_u64(ret, 10); |
1421 |
++ ret = div_u64(ret, 10); |
1422 |
+ |
1423 |
+ dev_priv->last_count1 = total_count; |
1424 |
+ dev_priv->last_time1 = now; |
1425 |
+@@ -1849,7 +1849,7 @@ void i915_update_gfx_val(struct drm_i915_private *dev_priv) |
1426 |
+ |
1427 |
+ /* More magic constants... */ |
1428 |
+ diff = diff * 1181; |
1429 |
+- div_u64(diff, diffms * 10); |
1430 |
++ diff = div_u64(diff, diffms * 10); |
1431 |
+ dev_priv->gfx_power = diff; |
1432 |
+ } |
1433 |
+ |
1434 |
+@@ -2222,6 +2222,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) |
1435 |
+ dev_priv->mchdev_lock = &mchdev_lock; |
1436 |
+ spin_unlock(&mchdev_lock); |
1437 |
+ |
1438 |
++ /* XXX Prevent module unload due to memory corruption bugs. */ |
1439 |
++ __module_get(THIS_MODULE); |
1440 |
++ |
1441 |
+ return 0; |
1442 |
+ |
1443 |
+ out_workqueue_free: |
1444 |
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c |
1445 |
+index 06f8238..dc5d2ef 100644 |
1446 |
+--- a/drivers/gpu/drm/i915/i915_gem.c |
1447 |
++++ b/drivers/gpu/drm/i915/i915_gem.c |
1448 |
+@@ -34,6 +34,7 @@ |
1449 |
+ #include <linux/slab.h> |
1450 |
+ #include <linux/swap.h> |
1451 |
+ #include <linux/pci.h> |
1452 |
++#include <linux/intel-gtt.h> |
1453 |
+ |
1454 |
+ static void i915_gem_object_flush_gpu_write_domain(struct drm_gem_object *obj); |
1455 |
+ static void i915_gem_object_flush_gtt_write_domain(struct drm_gem_object *obj); |
1456 |
+@@ -465,8 +466,15 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, |
1457 |
+ */ |
1458 |
+ if (args->offset > obj->size || args->size > obj->size || |
1459 |
+ args->offset + args->size > obj->size) { |
1460 |
+- drm_gem_object_unreference_unlocked(obj); |
1461 |
+- return -EINVAL; |
1462 |
++ ret = -EINVAL; |
1463 |
++ goto err; |
1464 |
++ } |
1465 |
++ |
1466 |
++ if (!access_ok(VERIFY_WRITE, |
1467 |
++ (char __user *)(uintptr_t)args->data_ptr, |
1468 |
++ args->size)) { |
1469 |
++ ret = -EFAULT; |
1470 |
++ goto err; |
1471 |
+ } |
1472 |
+ |
1473 |
+ if (i915_gem_object_needs_bit17_swizzle(obj)) { |
1474 |
+@@ -478,8 +486,8 @@ i915_gem_pread_ioctl(struct drm_device *dev, void *data, |
1475 |
+ file_priv); |
1476 |
+ } |
1477 |
+ |
1478 |
++err: |
1479 |
+ drm_gem_object_unreference_unlocked(obj); |
1480 |
+- |
1481 |
+ return ret; |
1482 |
+ } |
1483 |
+ |
1484 |
+@@ -568,8 +576,6 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev, struct drm_gem_object *obj, |
1485 |
+ |
1486 |
+ user_data = (char __user *) (uintptr_t) args->data_ptr; |
1487 |
+ remain = args->size; |
1488 |
+- if (!access_ok(VERIFY_READ, user_data, remain)) |
1489 |
+- return -EFAULT; |
1490 |
+ |
1491 |
+ |
1492 |
+ mutex_lock(&dev->struct_mutex); |
1493 |
+@@ -928,8 +934,15 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, |
1494 |
+ */ |
1495 |
+ if (args->offset > obj->size || args->size > obj->size || |
1496 |
+ args->offset + args->size > obj->size) { |
1497 |
+- drm_gem_object_unreference_unlocked(obj); |
1498 |
+- return -EINVAL; |
1499 |
++ ret = -EINVAL; |
1500 |
++ goto err; |
1501 |
++ } |
1502 |
++ |
1503 |
++ if (!access_ok(VERIFY_READ, |
1504 |
++ (char __user *)(uintptr_t)args->data_ptr, |
1505 |
++ args->size)) { |
1506 |
++ ret = -EFAULT; |
1507 |
++ goto err; |
1508 |
+ } |
1509 |
+ |
1510 |
+ /* We can only do the GTT pwrite on untiled buffers, as otherwise |
1511 |
+@@ -963,8 +976,8 @@ i915_gem_pwrite_ioctl(struct drm_device *dev, void *data, |
1512 |
+ DRM_INFO("pwrite failed %d\n", ret); |
1513 |
+ #endif |
1514 |
+ |
1515 |
++err: |
1516 |
+ drm_gem_object_unreference_unlocked(obj); |
1517 |
+- |
1518 |
+ return ret; |
1519 |
+ } |
1520 |
+ |
1521 |
+@@ -3367,6 +3380,8 @@ i915_gem_object_pin_and_relocate(struct drm_gem_object *obj, |
1522 |
+ (int) reloc->offset, |
1523 |
+ reloc->read_domains, |
1524 |
+ reloc->write_domain); |
1525 |
++ drm_gem_object_unreference(target_obj); |
1526 |
++ i915_gem_object_unpin(obj); |
1527 |
+ return -EINVAL; |
1528 |
+ } |
1529 |
+ if (reloc->write_domain & I915_GEM_DOMAIN_CPU || |
1530 |
+diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c |
1531 |
+index d448c25..82cc369 100644 |
1532 |
+--- a/drivers/gpu/drm/radeon/evergreen.c |
1533 |
++++ b/drivers/gpu/drm/radeon/evergreen.c |
1534 |
+@@ -1120,7 +1120,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) |
1535 |
+ |
1536 |
+ WREG32(RCU_IND_INDEX, 0x203); |
1537 |
+ efuse_straps_3 = RREG32(RCU_IND_DATA); |
1538 |
+- efuse_box_bit_127_124 = (u8)(efuse_straps_3 & 0xF0000000) >> 28; |
1539 |
++ efuse_box_bit_127_124 = (u8)((efuse_straps_3 & 0xF0000000) >> 28); |
1540 |
+ |
1541 |
+ switch(efuse_box_bit_127_124) { |
1542 |
+ case 0x0: |
1543 |
+@@ -1389,6 +1389,8 @@ int evergreen_mc_init(struct radeon_device *rdev) |
1544 |
+ rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; |
1545 |
+ rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; |
1546 |
+ rdev->mc.visible_vram_size = rdev->mc.aper_size; |
1547 |
++ /* limit it to the aperture size for now as there is no blit support in 2.6.35/36*/ |
1548 |
++ rdev->mc.real_vram_size = rdev->mc.visible_vram_size; |
1549 |
+ r600_vram_gtt_location(rdev, &rdev->mc); |
1550 |
+ radeon_update_bandwidth_info(rdev); |
1551 |
+ |
1552 |
+diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c |
1553 |
+index 952cc78..eddeff3 100644 |
1554 |
+--- a/drivers/gpu/drm/radeon/r600.c |
1555 |
++++ b/drivers/gpu/drm/radeon/r600.c |
1556 |
+@@ -3522,7 +3522,8 @@ void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo) |
1557 |
+ /* r7xx hw bug. write to HDP_DEBUG1 followed by fb read |
1558 |
+ * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL |
1559 |
+ */ |
1560 |
+- if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { |
1561 |
++ if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740) && |
1562 |
++ rdev->vram_scratch.ptr) { |
1563 |
+ void __iomem *ptr = (void *)rdev->vram_scratch.ptr; |
1564 |
+ u32 tmp; |
1565 |
+ |
1566 |
+diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c |
1567 |
+index 6bfef51..d7c18e5 100644 |
1568 |
+--- a/drivers/gpu/drm/radeon/radeon_atombios.c |
1569 |
++++ b/drivers/gpu/drm/radeon/radeon_atombios.c |
1570 |
+@@ -226,6 +226,15 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, |
1571 |
+ *connector_type = DRM_MODE_CONNECTOR_DVID; |
1572 |
+ } |
1573 |
+ |
1574 |
++ /* MSI K9A2GM V2/V3 board has no HDMI or DVI */ |
1575 |
++ if ((dev->pdev->device == 0x796e) && |
1576 |
++ (dev->pdev->subsystem_vendor == 0x1462) && |
1577 |
++ (dev->pdev->subsystem_device == 0x7302)) { |
1578 |
++ if ((supported_device == ATOM_DEVICE_DFP2_SUPPORT) || |
1579 |
++ (supported_device == ATOM_DEVICE_DFP3_SUPPORT)) |
1580 |
++ return false; |
1581 |
++ } |
1582 |
++ |
1583 |
+ /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */ |
1584 |
+ if ((dev->pdev->device == 0x7941) && |
1585 |
+ (dev->pdev->subsystem_vendor == 0x147b) && |
1586 |
+diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c |
1587 |
+index 4eb67c0..f7ce8e1 100644 |
1588 |
+--- a/drivers/gpu/drm/radeon/radeon_cursor.c |
1589 |
++++ b/drivers/gpu/drm/radeon/radeon_cursor.c |
1590 |
+@@ -203,6 +203,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
1591 |
+ struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
1592 |
+ struct radeon_device *rdev = crtc->dev->dev_private; |
1593 |
+ int xorigin = 0, yorigin = 0; |
1594 |
++ int w = radeon_crtc->cursor_width; |
1595 |
+ |
1596 |
+ if (x < 0) |
1597 |
+ xorigin = -x + 1; |
1598 |
+@@ -213,22 +214,7 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
1599 |
+ if (yorigin >= CURSOR_HEIGHT) |
1600 |
+ yorigin = CURSOR_HEIGHT - 1; |
1601 |
+ |
1602 |
+- radeon_lock_cursor(crtc, true); |
1603 |
+- if (ASIC_IS_DCE4(rdev)) { |
1604 |
+- /* cursors are offset into the total surface */ |
1605 |
+- x += crtc->x; |
1606 |
+- y += crtc->y; |
1607 |
+- DRM_DEBUG("x %d y %d c->x %d c->y %d\n", x, y, crtc->x, crtc->y); |
1608 |
+- |
1609 |
+- /* XXX: check if evergreen has the same issues as avivo chips */ |
1610 |
+- WREG32(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset, |
1611 |
+- ((xorigin ? 0 : x) << 16) | |
1612 |
+- (yorigin ? 0 : y)); |
1613 |
+- WREG32(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin); |
1614 |
+- WREG32(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset, |
1615 |
+- ((radeon_crtc->cursor_width - 1) << 16) | (radeon_crtc->cursor_height - 1)); |
1616 |
+- } else if (ASIC_IS_AVIVO(rdev)) { |
1617 |
+- int w = radeon_crtc->cursor_width; |
1618 |
++ if (ASIC_IS_AVIVO(rdev)) { |
1619 |
+ int i = 0; |
1620 |
+ struct drm_crtc *crtc_p; |
1621 |
+ |
1622 |
+@@ -260,7 +246,17 @@ int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
1623 |
+ if (w <= 0) |
1624 |
+ w = 1; |
1625 |
+ } |
1626 |
++ } |
1627 |
+ |
1628 |
++ radeon_lock_cursor(crtc, true); |
1629 |
++ if (ASIC_IS_DCE4(rdev)) { |
1630 |
++ WREG32(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset, |
1631 |
++ ((xorigin ? 0 : x) << 16) | |
1632 |
++ (yorigin ? 0 : y)); |
1633 |
++ WREG32(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin); |
1634 |
++ WREG32(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset, |
1635 |
++ ((w - 1) << 16) | (radeon_crtc->cursor_height - 1)); |
1636 |
++ } else if (ASIC_IS_AVIVO(rdev)) { |
1637 |
+ WREG32(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset, |
1638 |
+ ((xorigin ? 0 : x) << 16) | |
1639 |
+ (yorigin ? 0 : y)); |
1640 |
+diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
1641 |
+index 8154cdf..2d95376 100644 |
1642 |
+--- a/drivers/gpu/drm/radeon/radeon_display.c |
1643 |
++++ b/drivers/gpu/drm/radeon/radeon_display.c |
1644 |
+@@ -349,6 +349,8 @@ static void radeon_print_display_setup(struct drm_device *dev) |
1645 |
+ DRM_INFO(" DFP4: %s\n", encoder_names[radeon_encoder->encoder_id]); |
1646 |
+ if (devices & ATOM_DEVICE_DFP5_SUPPORT) |
1647 |
+ DRM_INFO(" DFP5: %s\n", encoder_names[radeon_encoder->encoder_id]); |
1648 |
++ if (devices & ATOM_DEVICE_DFP6_SUPPORT) |
1649 |
++ DRM_INFO(" DFP6: %s\n", encoder_names[radeon_encoder->encoder_id]); |
1650 |
+ if (devices & ATOM_DEVICE_TV1_SUPPORT) |
1651 |
+ DRM_INFO(" TV1: %s\n", encoder_names[radeon_encoder->encoder_id]); |
1652 |
+ if (devices & ATOM_DEVICE_CV_SUPPORT) |
1653 |
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c |
1654 |
+index 3ccd478..7dca2fa 100644 |
1655 |
+--- a/drivers/hid/hidraw.c |
1656 |
++++ b/drivers/hid/hidraw.c |
1657 |
+@@ -111,6 +111,12 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t |
1658 |
+ int ret = 0; |
1659 |
+ |
1660 |
+ mutex_lock(&minors_lock); |
1661 |
++ |
1662 |
++ if (!hidraw_table[minor]) { |
1663 |
++ ret = -ENODEV; |
1664 |
++ goto out; |
1665 |
++ } |
1666 |
++ |
1667 |
+ dev = hidraw_table[minor]->hid; |
1668 |
+ |
1669 |
+ if (!dev->hid_output_raw_report) { |
1670 |
+@@ -246,6 +252,10 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, |
1671 |
+ |
1672 |
+ mutex_lock(&minors_lock); |
1673 |
+ dev = hidraw_table[minor]; |
1674 |
++ if (!dev) { |
1675 |
++ ret = -ENODEV; |
1676 |
++ goto out; |
1677 |
++ } |
1678 |
+ |
1679 |
+ switch (cmd) { |
1680 |
+ case HIDIOCGRDESCSIZE: |
1681 |
+@@ -319,6 +329,7 @@ static long hidraw_ioctl(struct file *file, unsigned int cmd, |
1682 |
+ |
1683 |
+ ret = -ENOTTY; |
1684 |
+ } |
1685 |
++out: |
1686 |
+ mutex_unlock(&minors_lock); |
1687 |
+ return ret; |
1688 |
+ } |
1689 |
+diff --git a/drivers/hwmon/lis3lv02d.c b/drivers/hwmon/lis3lv02d.c |
1690 |
+index 6138f03..fc591ae 100644 |
1691 |
+--- a/drivers/hwmon/lis3lv02d.c |
1692 |
++++ b/drivers/hwmon/lis3lv02d.c |
1693 |
+@@ -277,7 +277,7 @@ static irqreturn_t lis302dl_interrupt(int irq, void *dummy) |
1694 |
+ wake_up_interruptible(&lis3_dev.misc_wait); |
1695 |
+ kill_fasync(&lis3_dev.async_queue, SIGIO, POLL_IN); |
1696 |
+ out: |
1697 |
+- if (lis3_dev.whoami == WAI_8B && lis3_dev.idev && |
1698 |
++ if (lis3_dev.pdata && lis3_dev.whoami == WAI_8B && lis3_dev.idev && |
1699 |
+ lis3_dev.idev->input->users) |
1700 |
+ return IRQ_WAKE_THREAD; |
1701 |
+ return IRQ_HANDLED; |
1702 |
+@@ -718,7 +718,7 @@ int lis3lv02d_init_device(struct lis3lv02d *dev) |
1703 |
+ * io-apic is not configurable (and generates a warning) but I keep it |
1704 |
+ * in case of support for other hardware. |
1705 |
+ */ |
1706 |
+- if (dev->whoami == WAI_8B) |
1707 |
++ if (dev->pdata && dev->whoami == WAI_8B) |
1708 |
+ thread_fn = lis302dl_interrupt_thread1_8b; |
1709 |
+ else |
1710 |
+ thread_fn = NULL; |
1711 |
+diff --git a/drivers/i2c/busses/i2c-pca-isa.c b/drivers/i2c/busses/i2c-pca-isa.c |
1712 |
+index bbd7760..29933f8 100644 |
1713 |
+--- a/drivers/i2c/busses/i2c-pca-isa.c |
1714 |
++++ b/drivers/i2c/busses/i2c-pca-isa.c |
1715 |
+@@ -71,8 +71,8 @@ static int pca_isa_readbyte(void *pd, int reg) |
1716 |
+ |
1717 |
+ static int pca_isa_waitforcompletion(void *pd) |
1718 |
+ { |
1719 |
+- long ret = ~0; |
1720 |
+ unsigned long timeout; |
1721 |
++ long ret; |
1722 |
+ |
1723 |
+ if (irq > -1) { |
1724 |
+ ret = wait_event_timeout(pca_wait, |
1725 |
+@@ -81,11 +81,15 @@ static int pca_isa_waitforcompletion(void *pd) |
1726 |
+ } else { |
1727 |
+ /* Do polling */ |
1728 |
+ timeout = jiffies + pca_isa_ops.timeout; |
1729 |
+- while (((pca_isa_readbyte(pd, I2C_PCA_CON) |
1730 |
+- & I2C_PCA_CON_SI) == 0) |
1731 |
+- && (ret = time_before(jiffies, timeout))) |
1732 |
++ do { |
1733 |
++ ret = time_before(jiffies, timeout); |
1734 |
++ if (pca_isa_readbyte(pd, I2C_PCA_CON) |
1735 |
++ & I2C_PCA_CON_SI) |
1736 |
++ break; |
1737 |
+ udelay(100); |
1738 |
++ } while (ret); |
1739 |
+ } |
1740 |
++ |
1741 |
+ return ret > 0; |
1742 |
+ } |
1743 |
+ |
1744 |
+diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c |
1745 |
+index ef5c784..5f6d7f8 100644 |
1746 |
+--- a/drivers/i2c/busses/i2c-pca-platform.c |
1747 |
++++ b/drivers/i2c/busses/i2c-pca-platform.c |
1748 |
+@@ -80,8 +80,8 @@ static void i2c_pca_pf_writebyte32(void *pd, int reg, int val) |
1749 |
+ static int i2c_pca_pf_waitforcompletion(void *pd) |
1750 |
+ { |
1751 |
+ struct i2c_pca_pf_data *i2c = pd; |
1752 |
+- long ret = ~0; |
1753 |
+ unsigned long timeout; |
1754 |
++ long ret; |
1755 |
+ |
1756 |
+ if (i2c->irq) { |
1757 |
+ ret = wait_event_timeout(i2c->wait, |
1758 |
+@@ -90,10 +90,13 @@ static int i2c_pca_pf_waitforcompletion(void *pd) |
1759 |
+ } else { |
1760 |
+ /* Do polling */ |
1761 |
+ timeout = jiffies + i2c->adap.timeout; |
1762 |
+- while (((i2c->algo_data.read_byte(i2c, I2C_PCA_CON) |
1763 |
+- & I2C_PCA_CON_SI) == 0) |
1764 |
+- && (ret = time_before(jiffies, timeout))) |
1765 |
++ do { |
1766 |
++ ret = time_before(jiffies, timeout); |
1767 |
++ if (i2c->algo_data.read_byte(i2c, I2C_PCA_CON) |
1768 |
++ & I2C_PCA_CON_SI) |
1769 |
++ break; |
1770 |
+ udelay(100); |
1771 |
++ } while (ret); |
1772 |
+ } |
1773 |
+ |
1774 |
+ return ret > 0; |
1775 |
+diff --git a/drivers/infiniband/hw/cxgb3/iwch_cm.c b/drivers/infiniband/hw/cxgb3/iwch_cm.c |
1776 |
+index ebfb117..9c05ddd 100644 |
1777 |
+--- a/drivers/infiniband/hw/cxgb3/iwch_cm.c |
1778 |
++++ b/drivers/infiniband/hw/cxgb3/iwch_cm.c |
1779 |
+@@ -463,7 +463,8 @@ static int send_connect(struct iwch_ep *ep) |
1780 |
+ V_MSS_IDX(mtu_idx) | |
1781 |
+ V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx); |
1782 |
+ opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10); |
1783 |
+- opt2 = V_FLAVORS_VALID(1) | V_CONG_CONTROL_FLAVOR(cong_flavor); |
1784 |
++ opt2 = F_RX_COALESCE_VALID | V_RX_COALESCE(0) | V_FLAVORS_VALID(1) | |
1785 |
++ V_CONG_CONTROL_FLAVOR(cong_flavor); |
1786 |
+ skb->priority = CPL_PRIORITY_SETUP; |
1787 |
+ set_arp_failure_handler(skb, act_open_req_arp_failure); |
1788 |
+ |
1789 |
+@@ -1280,7 +1281,8 @@ static void accept_cr(struct iwch_ep *ep, __be32 peer_ip, struct sk_buff *skb) |
1790 |
+ V_MSS_IDX(mtu_idx) | |
1791 |
+ V_L2T_IDX(ep->l2t->idx) | V_TX_CHANNEL(ep->l2t->smt_idx); |
1792 |
+ opt0l = V_TOS((ep->tos >> 2) & M_TOS) | V_RCV_BUFSIZ(rcv_win>>10); |
1793 |
+- opt2 = V_FLAVORS_VALID(1) | V_CONG_CONTROL_FLAVOR(cong_flavor); |
1794 |
++ opt2 = F_RX_COALESCE_VALID | V_RX_COALESCE(0) | V_FLAVORS_VALID(1) | |
1795 |
++ V_CONG_CONTROL_FLAVOR(cong_flavor); |
1796 |
+ |
1797 |
+ rpl = cplhdr(skb); |
1798 |
+ rpl->wr.wr_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD)); |
1799 |
+diff --git a/drivers/input/joydev.c b/drivers/input/joydev.c |
1800 |
+index 34157bb..f5320b5 100644 |
1801 |
+--- a/drivers/input/joydev.c |
1802 |
++++ b/drivers/input/joydev.c |
1803 |
+@@ -483,6 +483,9 @@ static int joydev_handle_JSIOCSAXMAP(struct joydev *joydev, |
1804 |
+ |
1805 |
+ memcpy(joydev->abspam, abspam, len); |
1806 |
+ |
1807 |
++ for (i = 0; i < joydev->nabs; i++) |
1808 |
++ joydev->absmap[joydev->abspam[i]] = i; |
1809 |
++ |
1810 |
+ out: |
1811 |
+ kfree(abspam); |
1812 |
+ return retval; |
1813 |
+diff --git a/drivers/input/tablet/wacom_wac.c b/drivers/input/tablet/wacom_wac.c |
1814 |
+index 415f630..8a6a2a1 100644 |
1815 |
+--- a/drivers/input/tablet/wacom_wac.c |
1816 |
++++ b/drivers/input/tablet/wacom_wac.c |
1817 |
+@@ -409,8 +409,10 @@ static void wacom_intuos_general(struct wacom_wac *wacom) |
1818 |
+ /* general pen packet */ |
1819 |
+ if ((data[1] & 0xb8) == 0xa0) { |
1820 |
+ t = (data[6] << 2) | ((data[7] >> 6) & 3); |
1821 |
+- if (features->type >= INTUOS4S && features->type <= INTUOS4L) |
1822 |
++ if ((features->type >= INTUOS4S && features->type <= INTUOS4L) || |
1823 |
++ features->type == WACOM_21UX2) { |
1824 |
+ t = (t << 1) | (data[1] & 1); |
1825 |
++ } |
1826 |
+ input_report_abs(input, ABS_PRESSURE, t); |
1827 |
+ input_report_abs(input, ABS_TILT_X, |
1828 |
+ ((data[7] << 1) & 0x7e) | (data[8] >> 7)); |
1829 |
+diff --git a/drivers/media/IR/ir-keytable.c b/drivers/media/IR/ir-keytable.c |
1830 |
+index 94a8577..78eb8cb 100644 |
1831 |
+--- a/drivers/media/IR/ir-keytable.c |
1832 |
++++ b/drivers/media/IR/ir-keytable.c |
1833 |
+@@ -319,7 +319,7 @@ static void ir_timer_keyup(unsigned long cookie) |
1834 |
+ * a keyup event might follow immediately after the keydown. |
1835 |
+ */ |
1836 |
+ spin_lock_irqsave(&ir->keylock, flags); |
1837 |
+- if (time_is_after_eq_jiffies(ir->keyup_jiffies)) |
1838 |
++ if (time_is_before_eq_jiffies(ir->keyup_jiffies)) |
1839 |
+ ir_keyup(ir); |
1840 |
+ spin_unlock_irqrestore(&ir->keylock, flags); |
1841 |
+ } |
1842 |
+diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c |
1843 |
+index 800800a..33af683 100644 |
1844 |
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c |
1845 |
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c |
1846 |
+@@ -1240,6 +1240,57 @@ static int stk7070p_frontend_attach(struct dvb_usb_adapter *adap) |
1847 |
+ return adap->fe == NULL ? -ENODEV : 0; |
1848 |
+ } |
1849 |
+ |
1850 |
++/* STK7770P */ |
1851 |
++static struct dib7000p_config dib7770p_dib7000p_config = { |
1852 |
++ .output_mpeg2_in_188_bytes = 1, |
1853 |
++ |
1854 |
++ .agc_config_count = 1, |
1855 |
++ .agc = &dib7070_agc_config, |
1856 |
++ .bw = &dib7070_bw_config_12_mhz, |
1857 |
++ .tuner_is_baseband = 1, |
1858 |
++ .spur_protect = 1, |
1859 |
++ |
1860 |
++ .gpio_dir = DIB7000P_GPIO_DEFAULT_DIRECTIONS, |
1861 |
++ .gpio_val = DIB7000P_GPIO_DEFAULT_VALUES, |
1862 |
++ .gpio_pwm_pos = DIB7000P_GPIO_DEFAULT_PWM_POS, |
1863 |
++ |
1864 |
++ .hostbus_diversity = 1, |
1865 |
++ .enable_current_mirror = 1, |
1866 |
++}; |
1867 |
++ |
1868 |
++static int stk7770p_frontend_attach(struct dvb_usb_adapter *adap) |
1869 |
++{ |
1870 |
++ struct usb_device_descriptor *p = &adap->dev->udev->descriptor; |
1871 |
++ if (p->idVendor == cpu_to_le16(USB_VID_PINNACLE) && |
1872 |
++ p->idProduct == cpu_to_le16(USB_PID_PINNACLE_PCTV72E)) |
1873 |
++ dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 0); |
1874 |
++ else |
1875 |
++ dib0700_set_gpio(adap->dev, GPIO6, GPIO_OUT, 1); |
1876 |
++ msleep(10); |
1877 |
++ dib0700_set_gpio(adap->dev, GPIO9, GPIO_OUT, 1); |
1878 |
++ dib0700_set_gpio(adap->dev, GPIO4, GPIO_OUT, 1); |
1879 |
++ dib0700_set_gpio(adap->dev, GPIO7, GPIO_OUT, 1); |
1880 |
++ dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 0); |
1881 |
++ |
1882 |
++ dib0700_ctrl_clock(adap->dev, 72, 1); |
1883 |
++ |
1884 |
++ msleep(10); |
1885 |
++ dib0700_set_gpio(adap->dev, GPIO10, GPIO_OUT, 1); |
1886 |
++ msleep(10); |
1887 |
++ dib0700_set_gpio(adap->dev, GPIO0, GPIO_OUT, 1); |
1888 |
++ |
1889 |
++ if (dib7000p_i2c_enumeration(&adap->dev->i2c_adap, 1, 18, |
1890 |
++ &dib7770p_dib7000p_config) != 0) { |
1891 |
++ err("%s: dib7000p_i2c_enumeration failed. Cannot continue\n", |
1892 |
++ __func__); |
1893 |
++ return -ENODEV; |
1894 |
++ } |
1895 |
++ |
1896 |
++ adap->fe = dvb_attach(dib7000p_attach, &adap->dev->i2c_adap, 0x80, |
1897 |
++ &dib7770p_dib7000p_config); |
1898 |
++ return adap->fe == NULL ? -ENODEV : 0; |
1899 |
++} |
1900 |
++ |
1901 |
+ /* DIB807x generic */ |
1902 |
+ static struct dibx000_agc_config dib807x_agc_config[2] = { |
1903 |
+ { |
1904 |
+@@ -2081,7 +2132,7 @@ struct usb_device_id dib0700_usb_id_table[] = { |
1905 |
+ /* 60 */{ USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS_2) }, |
1906 |
+ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XPVR) }, |
1907 |
+ { USB_DEVICE(USB_VID_DIBCOM, USB_PID_DIBCOM_STK807XP) }, |
1908 |
+- { USB_DEVICE(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD) }, |
1909 |
++ { USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x000, 0x3f00) }, |
1910 |
+ { USB_DEVICE(USB_VID_EVOLUTEPC, USB_PID_TVWAY_PLUS) }, |
1911 |
+ /* 65 */{ USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV73ESE) }, |
1912 |
+ { USB_DEVICE(USB_VID_PINNACLE, USB_PID_PINNACLE_PCTV282E) }, |
1913 |
+@@ -2592,7 +2643,7 @@ struct dvb_usb_device_properties dib0700_devices[] = { |
1914 |
+ .pid_filter_count = 32, |
1915 |
+ .pid_filter = stk70x0p_pid_filter, |
1916 |
+ .pid_filter_ctrl = stk70x0p_pid_filter_ctrl, |
1917 |
+- .frontend_attach = stk7070p_frontend_attach, |
1918 |
++ .frontend_attach = stk7770p_frontend_attach, |
1919 |
+ .tuner_attach = dib7770p_tuner_attach, |
1920 |
+ |
1921 |
+ DIB0700_DEFAULT_STREAMING_CONFIG(0x02), |
1922 |
+diff --git a/drivers/media/dvb/frontends/dib7000p.c b/drivers/media/dvb/frontends/dib7000p.c |
1923 |
+index 2e28b97..73f59ab 100644 |
1924 |
+--- a/drivers/media/dvb/frontends/dib7000p.c |
1925 |
++++ b/drivers/media/dvb/frontends/dib7000p.c |
1926 |
+@@ -260,6 +260,8 @@ static void dib7000p_set_adc_state(struct dib7000p_state *state, enum dibx000_ad |
1927 |
+ |
1928 |
+ // dprintk( "908: %x, 909: %x\n", reg_908, reg_909); |
1929 |
+ |
1930 |
++ reg_908 |= (state->cfg.enable_current_mirror & 1) << 7; |
1931 |
++ |
1932 |
+ dib7000p_write_word(state, 908, reg_908); |
1933 |
+ dib7000p_write_word(state, 909, reg_909); |
1934 |
+ } |
1935 |
+diff --git a/drivers/media/dvb/frontends/dib7000p.h b/drivers/media/dvb/frontends/dib7000p.h |
1936 |
+index 805dd13..04a7449 100644 |
1937 |
+--- a/drivers/media/dvb/frontends/dib7000p.h |
1938 |
++++ b/drivers/media/dvb/frontends/dib7000p.h |
1939 |
+@@ -33,6 +33,9 @@ struct dib7000p_config { |
1940 |
+ int (*agc_control) (struct dvb_frontend *, u8 before); |
1941 |
+ |
1942 |
+ u8 output_mode; |
1943 |
++ |
1944 |
++ u8 enable_current_mirror : 1; |
1945 |
++ |
1946 |
+ }; |
1947 |
+ |
1948 |
+ #define DEFAULT_DIB7000P_I2C_ADDRESS 18 |
1949 |
+diff --git a/drivers/media/video/cx231xx/Makefile b/drivers/media/video/cx231xx/Makefile |
1950 |
+index 755dd0c..6f2b573 100644 |
1951 |
+--- a/drivers/media/video/cx231xx/Makefile |
1952 |
++++ b/drivers/media/video/cx231xx/Makefile |
1953 |
+@@ -11,4 +11,5 @@ EXTRA_CFLAGS += -Idrivers/media/video |
1954 |
+ EXTRA_CFLAGS += -Idrivers/media/common/tuners |
1955 |
+ EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-core |
1956 |
+ EXTRA_CFLAGS += -Idrivers/media/dvb/frontends |
1957 |
++EXTRA_CFLAGS += -Idrivers/media/dvb/dvb-usb |
1958 |
+ |
1959 |
+diff --git a/drivers/media/video/cx231xx/cx231xx-cards.c b/drivers/media/video/cx231xx/cx231xx-cards.c |
1960 |
+index 6bdc0ef..f2a4900 100644 |
1961 |
+--- a/drivers/media/video/cx231xx/cx231xx-cards.c |
1962 |
++++ b/drivers/media/video/cx231xx/cx231xx-cards.c |
1963 |
+@@ -32,6 +32,7 @@ |
1964 |
+ #include <media/v4l2-chip-ident.h> |
1965 |
+ |
1966 |
+ #include <media/cx25840.h> |
1967 |
++#include "dvb-usb-ids.h" |
1968 |
+ #include "xc5000.h" |
1969 |
+ |
1970 |
+ #include "cx231xx.h" |
1971 |
+@@ -175,6 +176,8 @@ struct usb_device_id cx231xx_id_table[] = { |
1972 |
+ .driver_info = CX231XX_BOARD_CNXT_RDE_250}, |
1973 |
+ {USB_DEVICE(0x0572, 0x58A1), |
1974 |
+ .driver_info = CX231XX_BOARD_CNXT_RDU_250}, |
1975 |
++ {USB_DEVICE_VER(USB_VID_PIXELVIEW, USB_PID_PIXELVIEW_SBTVD, 0x4000,0x4fff), |
1976 |
++ .driver_info = CX231XX_BOARD_UNKNOWN}, |
1977 |
+ {}, |
1978 |
+ }; |
1979 |
+ |
1980 |
+@@ -226,14 +229,16 @@ void cx231xx_pre_card_setup(struct cx231xx *dev) |
1981 |
+ dev->board.name, dev->model); |
1982 |
+ |
1983 |
+ /* set the direction for GPIO pins */ |
1984 |
+- cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1); |
1985 |
+- cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1); |
1986 |
+- cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1); |
1987 |
++ if (dev->board.tuner_gpio) { |
1988 |
++ cx231xx_set_gpio_direction(dev, dev->board.tuner_gpio->bit, 1); |
1989 |
++ cx231xx_set_gpio_value(dev, dev->board.tuner_gpio->bit, 1); |
1990 |
++ cx231xx_set_gpio_direction(dev, dev->board.tuner_sif_gpio, 1); |
1991 |
+ |
1992 |
+- /* request some modules if any required */ |
1993 |
++ /* request some modules if any required */ |
1994 |
+ |
1995 |
+- /* reset the Tuner */ |
1996 |
+- cx231xx_gpio_set(dev, dev->board.tuner_gpio); |
1997 |
++ /* reset the Tuner */ |
1998 |
++ cx231xx_gpio_set(dev, dev->board.tuner_gpio); |
1999 |
++ } |
2000 |
+ |
2001 |
+ /* set the mode to Analog mode initially */ |
2002 |
+ cx231xx_set_mode(dev, CX231XX_ANALOG_MODE); |
2003 |
+diff --git a/drivers/media/video/gspca/gspca.c b/drivers/media/video/gspca/gspca.c |
2004 |
+index 678675b..59aba24 100644 |
2005 |
+--- a/drivers/media/video/gspca/gspca.c |
2006 |
++++ b/drivers/media/video/gspca/gspca.c |
2007 |
+@@ -223,6 +223,7 @@ static int alloc_and_submit_int_urb(struct gspca_dev *gspca_dev, |
2008 |
+ usb_rcvintpipe(dev, ep->bEndpointAddress), |
2009 |
+ buffer, buffer_len, |
2010 |
+ int_irq, (void *)gspca_dev, interval); |
2011 |
++ urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP; |
2012 |
+ gspca_dev->int_urb = urb; |
2013 |
+ ret = usb_submit_urb(urb, GFP_KERNEL); |
2014 |
+ if (ret < 0) { |
2015 |
+diff --git a/drivers/media/video/gspca/sn9c20x.c b/drivers/media/video/gspca/sn9c20x.c |
2016 |
+index 644a7fd..74a005f 100644 |
2017 |
+--- a/drivers/media/video/gspca/sn9c20x.c |
2018 |
++++ b/drivers/media/video/gspca/sn9c20x.c |
2019 |
+@@ -2368,8 +2368,7 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, |
2020 |
+ (data[33] << 10); |
2021 |
+ avg_lum >>= 9; |
2022 |
+ atomic_set(&sd->avg_lum, avg_lum); |
2023 |
+- gspca_frame_add(gspca_dev, LAST_PACKET, |
2024 |
+- data, len); |
2025 |
++ gspca_frame_add(gspca_dev, LAST_PACKET, NULL, 0); |
2026 |
+ return; |
2027 |
+ } |
2028 |
+ if (gspca_dev->last_packet_type == LAST_PACKET) { |
2029 |
+diff --git a/drivers/media/video/v4l2-compat-ioctl32.c b/drivers/media/video/v4l2-compat-ioctl32.c |
2030 |
+index 9004a5f..85b175d 100644 |
2031 |
+--- a/drivers/media/video/v4l2-compat-ioctl32.c |
2032 |
++++ b/drivers/media/video/v4l2-compat-ioctl32.c |
2033 |
+@@ -193,17 +193,24 @@ static int put_video_window32(struct video_window *kp, struct video_window32 __u |
2034 |
+ struct video_code32 { |
2035 |
+ char loadwhat[16]; /* name or tag of file being passed */ |
2036 |
+ compat_int_t datasize; |
2037 |
+- unsigned char *data; |
2038 |
++ compat_uptr_t data; |
2039 |
+ }; |
2040 |
+ |
2041 |
+-static int get_microcode32(struct video_code *kp, struct video_code32 __user *up) |
2042 |
++static struct video_code __user *get_microcode32(struct video_code32 *kp) |
2043 |
+ { |
2044 |
+- if (!access_ok(VERIFY_READ, up, sizeof(struct video_code32)) || |
2045 |
+- copy_from_user(kp->loadwhat, up->loadwhat, sizeof(up->loadwhat)) || |
2046 |
+- get_user(kp->datasize, &up->datasize) || |
2047 |
+- copy_from_user(kp->data, up->data, up->datasize)) |
2048 |
+- return -EFAULT; |
2049 |
+- return 0; |
2050 |
++ struct video_code __user *up; |
2051 |
++ |
2052 |
++ up = compat_alloc_user_space(sizeof(*up)); |
2053 |
++ |
2054 |
++ /* |
2055 |
++ * NOTE! We don't actually care if these fail. If the |
2056 |
++ * user address is invalid, the native ioctl will do |
2057 |
++ * the error handling for us |
2058 |
++ */ |
2059 |
++ (void) copy_to_user(up->loadwhat, kp->loadwhat, sizeof(up->loadwhat)); |
2060 |
++ (void) put_user(kp->datasize, &up->datasize); |
2061 |
++ (void) put_user(compat_ptr(kp->data), &up->data); |
2062 |
++ return up; |
2063 |
+ } |
2064 |
+ |
2065 |
+ #define VIDIOCGTUNER32 _IOWR('v', 4, struct video_tuner32) |
2066 |
+@@ -744,7 +751,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar |
2067 |
+ struct video_tuner vt; |
2068 |
+ struct video_buffer vb; |
2069 |
+ struct video_window vw; |
2070 |
+- struct video_code vc; |
2071 |
++ struct video_code32 vc; |
2072 |
+ struct video_audio va; |
2073 |
+ #endif |
2074 |
+ struct v4l2_format v2f; |
2075 |
+@@ -823,8 +830,11 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar |
2076 |
+ break; |
2077 |
+ |
2078 |
+ case VIDIOCSMICROCODE: |
2079 |
+- err = get_microcode32(&karg.vc, up); |
2080 |
+- compatible_arg = 0; |
2081 |
++ /* Copy the 32-bit "video_code32" to kernel space */ |
2082 |
++ if (copy_from_user(&karg.vc, up, sizeof(karg.vc))) |
2083 |
++ return -EFAULT; |
2084 |
++ /* Convert the 32-bit version to a 64-bit version in user space */ |
2085 |
++ up = get_microcode32(&karg.vc); |
2086 |
+ break; |
2087 |
+ |
2088 |
+ case VIDIOCSFREQ: |
2089 |
+diff --git a/drivers/mfd/wm831x-irq.c b/drivers/mfd/wm831x-irq.c |
2090 |
+index 7dabe4d..294183b 100644 |
2091 |
+--- a/drivers/mfd/wm831x-irq.c |
2092 |
++++ b/drivers/mfd/wm831x-irq.c |
2093 |
+@@ -394,8 +394,13 @@ static int wm831x_irq_set_type(unsigned int irq, unsigned int type) |
2094 |
+ |
2095 |
+ irq = irq - wm831x->irq_base; |
2096 |
+ |
2097 |
+- if (irq < WM831X_IRQ_GPIO_1 || irq > WM831X_IRQ_GPIO_11) |
2098 |
+- return -EINVAL; |
2099 |
++ if (irq < WM831X_IRQ_GPIO_1 || irq > WM831X_IRQ_GPIO_11) { |
2100 |
++ /* Ignore internal-only IRQs */ |
2101 |
++ if (irq >= 0 && irq < WM831X_NUM_IRQS) |
2102 |
++ return 0; |
2103 |
++ else |
2104 |
++ return -EINVAL; |
2105 |
++ } |
2106 |
+ |
2107 |
+ switch (type) { |
2108 |
+ case IRQ_TYPE_EDGE_BOTH: |
2109 |
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c |
2110 |
+index 83e7543..2876c3d 100644 |
2111 |
+--- a/drivers/mmc/core/core.c |
2112 |
++++ b/drivers/mmc/core/core.c |
2113 |
+@@ -1277,6 +1277,19 @@ int mmc_suspend_host(struct mmc_host *host) |
2114 |
+ if (host->bus_ops && !host->bus_dead) { |
2115 |
+ if (host->bus_ops->suspend) |
2116 |
+ err = host->bus_ops->suspend(host); |
2117 |
++ if (err == -ENOSYS || !host->bus_ops->resume) { |
2118 |
++ /* |
2119 |
++ * We simply "remove" the card in this case. |
2120 |
++ * It will be redetected on resume. |
2121 |
++ */ |
2122 |
++ if (host->bus_ops->remove) |
2123 |
++ host->bus_ops->remove(host); |
2124 |
++ mmc_claim_host(host); |
2125 |
++ mmc_detach_bus(host); |
2126 |
++ mmc_release_host(host); |
2127 |
++ host->pm_flags = 0; |
2128 |
++ err = 0; |
2129 |
++ } |
2130 |
+ } |
2131 |
+ mmc_bus_put(host); |
2132 |
+ |
2133 |
+diff --git a/drivers/mmc/host/sdhci-s3c.c b/drivers/mmc/host/sdhci-s3c.c |
2134 |
+index ad30f07..76c0ec3 100644 |
2135 |
+--- a/drivers/mmc/host/sdhci-s3c.c |
2136 |
++++ b/drivers/mmc/host/sdhci-s3c.c |
2137 |
+@@ -372,8 +372,10 @@ static int __devexit sdhci_s3c_remove(struct platform_device *pdev) |
2138 |
+ sdhci_remove_host(host, 1); |
2139 |
+ |
2140 |
+ for (ptr = 0; ptr < 3; ptr++) { |
2141 |
+- clk_disable(sc->clk_bus[ptr]); |
2142 |
+- clk_put(sc->clk_bus[ptr]); |
2143 |
++ if (sc->clk_bus[ptr]) { |
2144 |
++ clk_disable(sc->clk_bus[ptr]); |
2145 |
++ clk_put(sc->clk_bus[ptr]); |
2146 |
++ } |
2147 |
+ } |
2148 |
+ clk_disable(sc->clk_io); |
2149 |
+ clk_put(sc->clk_io); |
2150 |
+diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c |
2151 |
+index 63b9ba0..bbd6e30 100644 |
2152 |
+--- a/drivers/net/atlx/atl1.c |
2153 |
++++ b/drivers/net/atlx/atl1.c |
2154 |
+@@ -2847,10 +2847,11 @@ static int atl1_resume(struct pci_dev *pdev) |
2155 |
+ pci_enable_wake(pdev, PCI_D3cold, 0); |
2156 |
+ |
2157 |
+ atl1_reset_hw(&adapter->hw); |
2158 |
+- adapter->cmb.cmb->int_stats = 0; |
2159 |
+ |
2160 |
+- if (netif_running(netdev)) |
2161 |
++ if (netif_running(netdev)) { |
2162 |
++ adapter->cmb.cmb->int_stats = 0; |
2163 |
+ atl1_up(adapter); |
2164 |
++ } |
2165 |
+ netif_device_attach(netdev); |
2166 |
+ |
2167 |
+ return 0; |
2168 |
+diff --git a/drivers/net/b44.c b/drivers/net/b44.c |
2169 |
+index 293f9c1..4173759 100644 |
2170 |
+--- a/drivers/net/b44.c |
2171 |
++++ b/drivers/net/b44.c |
2172 |
+@@ -2168,8 +2168,6 @@ static int __devinit b44_init_one(struct ssb_device *sdev, |
2173 |
+ dev->irq = sdev->irq; |
2174 |
+ SET_ETHTOOL_OPS(dev, &b44_ethtool_ops); |
2175 |
+ |
2176 |
+- netif_carrier_off(dev); |
2177 |
+- |
2178 |
+ err = ssb_bus_powerup(sdev->bus, 0); |
2179 |
+ if (err) { |
2180 |
+ dev_err(sdev->dev, |
2181 |
+@@ -2209,6 +2207,8 @@ static int __devinit b44_init_one(struct ssb_device *sdev, |
2182 |
+ goto err_out_powerdown; |
2183 |
+ } |
2184 |
+ |
2185 |
++ netif_carrier_off(dev); |
2186 |
++ |
2187 |
+ ssb_set_drvdata(sdev, dev); |
2188 |
+ |
2189 |
+ /* Chip reset provides power to the b44 MAC & PCI cores, which |
2190 |
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c |
2191 |
+index cdc6a5c..ad9833b 100644 |
2192 |
+--- a/drivers/net/r8169.c |
2193 |
++++ b/drivers/net/r8169.c |
2194 |
+@@ -4008,7 +4008,7 @@ static inline void rtl8169_map_to_asic(struct RxDesc *desc, dma_addr_t mapping, |
2195 |
+ static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev, |
2196 |
+ struct net_device *dev, |
2197 |
+ struct RxDesc *desc, int rx_buf_sz, |
2198 |
+- unsigned int align) |
2199 |
++ unsigned int align, gfp_t gfp) |
2200 |
+ { |
2201 |
+ struct sk_buff *skb; |
2202 |
+ dma_addr_t mapping; |
2203 |
+@@ -4016,7 +4016,7 @@ static struct sk_buff *rtl8169_alloc_rx_skb(struct pci_dev *pdev, |
2204 |
+ |
2205 |
+ pad = align ? align : NET_IP_ALIGN; |
2206 |
+ |
2207 |
+- skb = netdev_alloc_skb(dev, rx_buf_sz + pad); |
2208 |
++ skb = __netdev_alloc_skb(dev, rx_buf_sz + pad, gfp); |
2209 |
+ if (!skb) |
2210 |
+ goto err_out; |
2211 |
+ |
2212 |
+@@ -4047,7 +4047,7 @@ static void rtl8169_rx_clear(struct rtl8169_private *tp) |
2213 |
+ } |
2214 |
+ |
2215 |
+ static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev, |
2216 |
+- u32 start, u32 end) |
2217 |
++ u32 start, u32 end, gfp_t gfp) |
2218 |
+ { |
2219 |
+ u32 cur; |
2220 |
+ |
2221 |
+@@ -4062,7 +4062,7 @@ static u32 rtl8169_rx_fill(struct rtl8169_private *tp, struct net_device *dev, |
2222 |
+ |
2223 |
+ skb = rtl8169_alloc_rx_skb(tp->pci_dev, dev, |
2224 |
+ tp->RxDescArray + i, |
2225 |
+- tp->rx_buf_sz, tp->align); |
2226 |
++ tp->rx_buf_sz, tp->align, gfp); |
2227 |
+ if (!skb) |
2228 |
+ break; |
2229 |
+ |
2230 |
+@@ -4090,7 +4090,7 @@ static int rtl8169_init_ring(struct net_device *dev) |
2231 |
+ memset(tp->tx_skb, 0x0, NUM_TX_DESC * sizeof(struct ring_info)); |
2232 |
+ memset(tp->Rx_skbuff, 0x0, NUM_RX_DESC * sizeof(struct sk_buff *)); |
2233 |
+ |
2234 |
+- if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC) != NUM_RX_DESC) |
2235 |
++ if (rtl8169_rx_fill(tp, dev, 0, NUM_RX_DESC, GFP_KERNEL) != NUM_RX_DESC) |
2236 |
+ goto err_out; |
2237 |
+ |
2238 |
+ rtl8169_mark_as_last_descriptor(tp->RxDescArray + NUM_RX_DESC - 1); |
2239 |
+@@ -4591,7 +4591,7 @@ static int rtl8169_rx_interrupt(struct net_device *dev, |
2240 |
+ count = cur_rx - tp->cur_rx; |
2241 |
+ tp->cur_rx = cur_rx; |
2242 |
+ |
2243 |
+- delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx); |
2244 |
++ delta = rtl8169_rx_fill(tp, dev, tp->dirty_rx, tp->cur_rx, GFP_ATOMIC); |
2245 |
+ if (!delta && count) |
2246 |
+ netif_info(tp, intr, dev, "no Rx buffer allocated\n"); |
2247 |
+ tp->dirty_rx += delta; |
2248 |
+diff --git a/drivers/net/skge.c b/drivers/net/skge.c |
2249 |
+index 40e5c46..465ae7e 100644 |
2250 |
+--- a/drivers/net/skge.c |
2251 |
++++ b/drivers/net/skge.c |
2252 |
+@@ -43,6 +43,7 @@ |
2253 |
+ #include <linux/seq_file.h> |
2254 |
+ #include <linux/mii.h> |
2255 |
+ #include <linux/slab.h> |
2256 |
++#include <linux/dmi.h> |
2257 |
+ #include <asm/irq.h> |
2258 |
+ |
2259 |
+ #include "skge.h" |
2260 |
+@@ -3868,6 +3869,8 @@ static void __devinit skge_show_addr(struct net_device *dev) |
2261 |
+ netif_info(skge, probe, skge->netdev, "addr %pM\n", dev->dev_addr); |
2262 |
+ } |
2263 |
+ |
2264 |
++static int only_32bit_dma; |
2265 |
++ |
2266 |
+ static int __devinit skge_probe(struct pci_dev *pdev, |
2267 |
+ const struct pci_device_id *ent) |
2268 |
+ { |
2269 |
+@@ -3889,7 +3892,7 @@ static int __devinit skge_probe(struct pci_dev *pdev, |
2270 |
+ |
2271 |
+ pci_set_master(pdev); |
2272 |
+ |
2273 |
+- if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { |
2274 |
++ if (!only_32bit_dma && !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) { |
2275 |
+ using_dac = 1; |
2276 |
+ err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64)); |
2277 |
+ } else if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) { |
2278 |
+@@ -4147,8 +4150,21 @@ static struct pci_driver skge_driver = { |
2279 |
+ .shutdown = skge_shutdown, |
2280 |
+ }; |
2281 |
+ |
2282 |
++static struct dmi_system_id skge_32bit_dma_boards[] = { |
2283 |
++ { |
2284 |
++ .ident = "Gigabyte nForce boards", |
2285 |
++ .matches = { |
2286 |
++ DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co"), |
2287 |
++ DMI_MATCH(DMI_BOARD_NAME, "nForce"), |
2288 |
++ }, |
2289 |
++ }, |
2290 |
++ {} |
2291 |
++}; |
2292 |
++ |
2293 |
+ static int __init skge_init_module(void) |
2294 |
+ { |
2295 |
++ if (dmi_check_system(skge_32bit_dma_boards)) |
2296 |
++ only_32bit_dma = 1; |
2297 |
+ skge_debug_init(); |
2298 |
+ return pci_register_driver(&skge_driver); |
2299 |
+ } |
2300 |
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c |
2301 |
+index e28524e..2a73ceb 100644 |
2302 |
+--- a/drivers/pci/quirks.c |
2303 |
++++ b/drivers/pci/quirks.c |
2304 |
+@@ -150,6 +150,26 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_2, quirk_isa_d |
2305 |
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NEC, PCI_DEVICE_ID_NEC_CBUS_3, quirk_isa_dma_hangs); |
2306 |
+ |
2307 |
+ /* |
2308 |
++ * Intel NM10 "TigerPoint" LPC PM1a_STS.BM_STS must be clear |
2309 |
++ * for some HT machines to use C4 w/o hanging. |
2310 |
++ */ |
2311 |
++static void __devinit quirk_tigerpoint_bm_sts(struct pci_dev *dev) |
2312 |
++{ |
2313 |
++ u32 pmbase; |
2314 |
++ u16 pm1a; |
2315 |
++ |
2316 |
++ pci_read_config_dword(dev, 0x40, &pmbase); |
2317 |
++ pmbase = pmbase & 0xff80; |
2318 |
++ pm1a = inw(pmbase); |
2319 |
++ |
2320 |
++ if (pm1a & 0x10) { |
2321 |
++ dev_info(&dev->dev, FW_BUG "TigerPoint LPC.BM_STS cleared\n"); |
2322 |
++ outw(0x10, pmbase); |
2323 |
++ } |
2324 |
++} |
2325 |
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TGP_LPC, quirk_tigerpoint_bm_sts); |
2326 |
++ |
2327 |
++/* |
2328 |
+ * Chipsets where PCI->PCI transfers vanish or hang |
2329 |
+ */ |
2330 |
+ static void __devinit quirk_nopcipci(struct pci_dev *dev) |
2331 |
+diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c |
2332 |
+index ad0ed21..348fba0 100644 |
2333 |
+--- a/drivers/scsi/scsi.c |
2334 |
++++ b/drivers/scsi/scsi.c |
2335 |
+@@ -1046,13 +1046,13 @@ int scsi_get_vpd_page(struct scsi_device *sdev, u8 page, unsigned char *buf, |
2336 |
+ |
2337 |
+ /* If the user actually wanted this page, we can skip the rest */ |
2338 |
+ if (page == 0) |
2339 |
+- return -EINVAL; |
2340 |
++ return 0; |
2341 |
+ |
2342 |
+ for (i = 0; i < min((int)buf[3], buf_len - 4); i++) |
2343 |
+ if (buf[i + 4] == page) |
2344 |
+ goto found; |
2345 |
+ |
2346 |
+- if (i < buf[3] && i > buf_len) |
2347 |
++ if (i < buf[3] && i >= buf_len - 4) |
2348 |
+ /* ran off the end of the buffer, give us benefit of doubt */ |
2349 |
+ goto found; |
2350 |
+ /* The device claims it doesn't support the requested page */ |
2351 |
+diff --git a/drivers/usb/core/file.c b/drivers/usb/core/file.c |
2352 |
+index f06f5db..1e6ccef 100644 |
2353 |
+--- a/drivers/usb/core/file.c |
2354 |
++++ b/drivers/usb/core/file.c |
2355 |
+@@ -159,9 +159,9 @@ void usb_major_cleanup(void) |
2356 |
+ int usb_register_dev(struct usb_interface *intf, |
2357 |
+ struct usb_class_driver *class_driver) |
2358 |
+ { |
2359 |
+- int retval = -EINVAL; |
2360 |
++ int retval; |
2361 |
+ int minor_base = class_driver->minor_base; |
2362 |
+- int minor = 0; |
2363 |
++ int minor; |
2364 |
+ char name[20]; |
2365 |
+ char *temp; |
2366 |
+ |
2367 |
+@@ -173,12 +173,17 @@ int usb_register_dev(struct usb_interface *intf, |
2368 |
+ */ |
2369 |
+ minor_base = 0; |
2370 |
+ #endif |
2371 |
+- intf->minor = -1; |
2372 |
+- |
2373 |
+- dbg ("looking for a minor, starting at %d", minor_base); |
2374 |
+ |
2375 |
+ if (class_driver->fops == NULL) |
2376 |
+- goto exit; |
2377 |
++ return -EINVAL; |
2378 |
++ if (intf->minor >= 0) |
2379 |
++ return -EADDRINUSE; |
2380 |
++ |
2381 |
++ retval = init_usb_class(); |
2382 |
++ if (retval) |
2383 |
++ return retval; |
2384 |
++ |
2385 |
++ dev_dbg(&intf->dev, "looking for a minor, starting at %d", minor_base); |
2386 |
+ |
2387 |
+ down_write(&minor_rwsem); |
2388 |
+ for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) { |
2389 |
+@@ -186,20 +191,12 @@ int usb_register_dev(struct usb_interface *intf, |
2390 |
+ continue; |
2391 |
+ |
2392 |
+ usb_minors[minor] = class_driver->fops; |
2393 |
+- |
2394 |
+- retval = 0; |
2395 |
++ intf->minor = minor; |
2396 |
+ break; |
2397 |
+ } |
2398 |
+ up_write(&minor_rwsem); |
2399 |
+- |
2400 |
+- if (retval) |
2401 |
+- goto exit; |
2402 |
+- |
2403 |
+- retval = init_usb_class(); |
2404 |
+- if (retval) |
2405 |
+- goto exit; |
2406 |
+- |
2407 |
+- intf->minor = minor; |
2408 |
++ if (intf->minor < 0) |
2409 |
++ return -EXFULL; |
2410 |
+ |
2411 |
+ /* create a usb class device for this usb interface */ |
2412 |
+ snprintf(name, sizeof(name), class_driver->name, minor - minor_base); |
2413 |
+@@ -213,11 +210,11 @@ int usb_register_dev(struct usb_interface *intf, |
2414 |
+ "%s", temp); |
2415 |
+ if (IS_ERR(intf->usb_dev)) { |
2416 |
+ down_write(&minor_rwsem); |
2417 |
+- usb_minors[intf->minor] = NULL; |
2418 |
++ usb_minors[minor] = NULL; |
2419 |
++ intf->minor = -1; |
2420 |
+ up_write(&minor_rwsem); |
2421 |
+ retval = PTR_ERR(intf->usb_dev); |
2422 |
+ } |
2423 |
+-exit: |
2424 |
+ return retval; |
2425 |
+ } |
2426 |
+ EXPORT_SYMBOL_GPL(usb_register_dev); |
2427 |
+diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c |
2428 |
+index 844683e..9f0ce7d 100644 |
2429 |
+--- a/drivers/usb/core/message.c |
2430 |
++++ b/drivers/usb/core/message.c |
2431 |
+@@ -1802,6 +1802,7 @@ free_interfaces: |
2432 |
+ intf->dev.groups = usb_interface_groups; |
2433 |
+ intf->dev.dma_mask = dev->dev.dma_mask; |
2434 |
+ INIT_WORK(&intf->reset_ws, __usb_queue_reset_device); |
2435 |
++ intf->minor = -1; |
2436 |
+ device_initialize(&intf->dev); |
2437 |
+ dev_set_name(&intf->dev, "%d-%s:%d.%d", |
2438 |
+ dev->bus->busnum, dev->devpath, |
2439 |
+diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c |
2440 |
+index 6fca870..180da4e 100644 |
2441 |
+--- a/drivers/usb/musb/musb_gadget.c |
2442 |
++++ b/drivers/usb/musb/musb_gadget.c |
2443 |
+@@ -568,11 +568,19 @@ static void rxstate(struct musb *musb, struct musb_request *req) |
2444 |
+ { |
2445 |
+ const u8 epnum = req->epnum; |
2446 |
+ struct usb_request *request = &req->request; |
2447 |
+- struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; |
2448 |
++ struct musb_ep *musb_ep; |
2449 |
+ void __iomem *epio = musb->endpoints[epnum].regs; |
2450 |
+ unsigned fifo_count = 0; |
2451 |
+- u16 len = musb_ep->packet_sz; |
2452 |
++ u16 len; |
2453 |
+ u16 csr = musb_readw(epio, MUSB_RXCSR); |
2454 |
++ struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; |
2455 |
++ |
2456 |
++ if (hw_ep->is_shared_fifo) |
2457 |
++ musb_ep = &hw_ep->ep_in; |
2458 |
++ else |
2459 |
++ musb_ep = &hw_ep->ep_out; |
2460 |
++ |
2461 |
++ len = musb_ep->packet_sz; |
2462 |
+ |
2463 |
+ /* We shouldn't get here while DMA is active, but we do... */ |
2464 |
+ if (dma_channel_status(musb_ep->dma) == MUSB_DMA_STATUS_BUSY) { |
2465 |
+@@ -740,9 +748,15 @@ void musb_g_rx(struct musb *musb, u8 epnum) |
2466 |
+ u16 csr; |
2467 |
+ struct usb_request *request; |
2468 |
+ void __iomem *mbase = musb->mregs; |
2469 |
+- struct musb_ep *musb_ep = &musb->endpoints[epnum].ep_out; |
2470 |
++ struct musb_ep *musb_ep; |
2471 |
+ void __iomem *epio = musb->endpoints[epnum].regs; |
2472 |
+ struct dma_channel *dma; |
2473 |
++ struct musb_hw_ep *hw_ep = &musb->endpoints[epnum]; |
2474 |
++ |
2475 |
++ if (hw_ep->is_shared_fifo) |
2476 |
++ musb_ep = &hw_ep->ep_in; |
2477 |
++ else |
2478 |
++ musb_ep = &hw_ep->ep_out; |
2479 |
+ |
2480 |
+ musb_ep_select(mbase, epnum); |
2481 |
+ |
2482 |
+@@ -1081,7 +1095,7 @@ struct free_record { |
2483 |
+ /* |
2484 |
+ * Context: controller locked, IRQs blocked. |
2485 |
+ */ |
2486 |
+-static void musb_ep_restart(struct musb *musb, struct musb_request *req) |
2487 |
++void musb_ep_restart(struct musb *musb, struct musb_request *req) |
2488 |
+ { |
2489 |
+ DBG(3, "<== %s request %p len %u on hw_ep%d\n", |
2490 |
+ req->tx ? "TX/IN" : "RX/OUT", |
2491 |
+diff --git a/drivers/usb/musb/musb_gadget.h b/drivers/usb/musb/musb_gadget.h |
2492 |
+index c8b1403..572b1da 100644 |
2493 |
+--- a/drivers/usb/musb/musb_gadget.h |
2494 |
++++ b/drivers/usb/musb/musb_gadget.h |
2495 |
+@@ -105,4 +105,6 @@ extern void musb_gadget_cleanup(struct musb *); |
2496 |
+ |
2497 |
+ extern void musb_g_giveback(struct musb_ep *, struct usb_request *, int); |
2498 |
+ |
2499 |
++extern void musb_ep_restart(struct musb *, struct musb_request *); |
2500 |
++ |
2501 |
+ #endif /* __MUSB_GADGET_H */ |
2502 |
+diff --git a/drivers/usb/musb/musb_gadget_ep0.c b/drivers/usb/musb/musb_gadget_ep0.c |
2503 |
+index 21b9788..ecae714 100644 |
2504 |
+--- a/drivers/usb/musb/musb_gadget_ep0.c |
2505 |
++++ b/drivers/usb/musb/musb_gadget_ep0.c |
2506 |
+@@ -261,6 +261,7 @@ __acquires(musb->lock) |
2507 |
+ ctrlrequest->wIndex & 0x0f; |
2508 |
+ struct musb_ep *musb_ep; |
2509 |
+ struct musb_hw_ep *ep; |
2510 |
++ struct musb_request *request; |
2511 |
+ void __iomem *regs; |
2512 |
+ int is_in; |
2513 |
+ u16 csr; |
2514 |
+@@ -302,6 +303,14 @@ __acquires(musb->lock) |
2515 |
+ musb_writew(regs, MUSB_RXCSR, csr); |
2516 |
+ } |
2517 |
+ |
2518 |
++ /* Maybe start the first request in the queue */ |
2519 |
++ request = to_musb_request( |
2520 |
++ next_request(musb_ep)); |
2521 |
++ if (!musb_ep->busy && request) { |
2522 |
++ DBG(3, "restarting the request\n"); |
2523 |
++ musb_ep_restart(musb, request); |
2524 |
++ } |
2525 |
++ |
2526 |
+ /* select ep0 again */ |
2527 |
+ musb_ep_select(mbase, 0); |
2528 |
+ } break; |
2529 |
+diff --git a/fs/exec.c b/fs/exec.c |
2530 |
+index e19de6a..956bd37 100644 |
2531 |
+--- a/fs/exec.c |
2532 |
++++ b/fs/exec.c |
2533 |
+@@ -377,6 +377,9 @@ static int count(char __user * __user * argv, int max) |
2534 |
+ argv++; |
2535 |
+ if (i++ >= max) |
2536 |
+ return -E2BIG; |
2537 |
++ |
2538 |
++ if (fatal_signal_pending(current)) |
2539 |
++ return -ERESTARTNOHAND; |
2540 |
+ cond_resched(); |
2541 |
+ } |
2542 |
+ } |
2543 |
+@@ -420,6 +423,12 @@ static int copy_strings(int argc, char __user * __user * argv, |
2544 |
+ while (len > 0) { |
2545 |
+ int offset, bytes_to_copy; |
2546 |
+ |
2547 |
++ if (fatal_signal_pending(current)) { |
2548 |
++ ret = -ERESTARTNOHAND; |
2549 |
++ goto out; |
2550 |
++ } |
2551 |
++ cond_resched(); |
2552 |
++ |
2553 |
+ offset = pos % PAGE_SIZE; |
2554 |
+ if (offset == 0) |
2555 |
+ offset = PAGE_SIZE; |
2556 |
+@@ -594,6 +603,11 @@ int setup_arg_pages(struct linux_binprm *bprm, |
2557 |
+ #else |
2558 |
+ stack_top = arch_align_stack(stack_top); |
2559 |
+ stack_top = PAGE_ALIGN(stack_top); |
2560 |
++ |
2561 |
++ if (unlikely(stack_top < mmap_min_addr) || |
2562 |
++ unlikely(vma->vm_end - vma->vm_start >= stack_top - mmap_min_addr)) |
2563 |
++ return -ENOMEM; |
2564 |
++ |
2565 |
+ stack_shift = vma->vm_end - stack_top; |
2566 |
+ |
2567 |
+ bprm->p -= stack_shift; |
2568 |
+diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c |
2569 |
+index 32499d21..9975457 100644 |
2570 |
+--- a/fs/ocfs2/symlink.c |
2571 |
++++ b/fs/ocfs2/symlink.c |
2572 |
+@@ -128,7 +128,7 @@ static void *ocfs2_fast_follow_link(struct dentry *dentry, |
2573 |
+ } |
2574 |
+ |
2575 |
+ /* Fast symlinks can't be large */ |
2576 |
+- len = strlen(target); |
2577 |
++ len = strnlen(target, ocfs2_fast_symlink_chars(inode->i_sb)); |
2578 |
+ link = kzalloc(len + 1, GFP_NOFS); |
2579 |
+ if (!link) { |
2580 |
+ status = -ENOMEM; |
2581 |
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c |
2582 |
+index 439fc1f..271afc4 100644 |
2583 |
+--- a/fs/proc/task_mmu.c |
2584 |
++++ b/fs/proc/task_mmu.c |
2585 |
+@@ -224,7 +224,8 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma) |
2586 |
+ /* We don't show the stack guard page in /proc/maps */ |
2587 |
+ start = vma->vm_start; |
2588 |
+ if (vma->vm_flags & VM_GROWSDOWN) |
2589 |
+- start += PAGE_SIZE; |
2590 |
++ if (!vma_stack_continue(vma->vm_prev, vma->vm_start)) |
2591 |
++ start += PAGE_SIZE; |
2592 |
+ |
2593 |
+ seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n", |
2594 |
+ start, |
2595 |
+diff --git a/fs/reiserfs/ioctl.c b/fs/reiserfs/ioctl.c |
2596 |
+index f53505d..5cbb81e 100644 |
2597 |
+--- a/fs/reiserfs/ioctl.c |
2598 |
++++ b/fs/reiserfs/ioctl.c |
2599 |
+@@ -170,6 +170,7 @@ int reiserfs_prepare_write(struct file *f, struct page *page, |
2600 |
+ int reiserfs_unpack(struct inode *inode, struct file *filp) |
2601 |
+ { |
2602 |
+ int retval = 0; |
2603 |
++ int depth; |
2604 |
+ int index; |
2605 |
+ struct page *page; |
2606 |
+ struct address_space *mapping; |
2607 |
+@@ -188,8 +189,8 @@ int reiserfs_unpack(struct inode *inode, struct file *filp) |
2608 |
+ /* we need to make sure nobody is changing the file size beneath |
2609 |
+ ** us |
2610 |
+ */ |
2611 |
+- mutex_lock(&inode->i_mutex); |
2612 |
+- reiserfs_write_lock(inode->i_sb); |
2613 |
++ reiserfs_mutex_lock_safe(&inode->i_mutex, inode->i_sb); |
2614 |
++ depth = reiserfs_write_lock_once(inode->i_sb); |
2615 |
+ |
2616 |
+ write_from = inode->i_size & (blocksize - 1); |
2617 |
+ /* if we are on a block boundary, we are already unpacked. */ |
2618 |
+@@ -224,6 +225,6 @@ int reiserfs_unpack(struct inode *inode, struct file *filp) |
2619 |
+ |
2620 |
+ out: |
2621 |
+ mutex_unlock(&inode->i_mutex); |
2622 |
+- reiserfs_write_unlock(inode->i_sb); |
2623 |
++ reiserfs_write_unlock_once(inode->i_sb, depth); |
2624 |
+ return retval; |
2625 |
+ } |
2626 |
+diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c |
2627 |
+index a51a07c..f38037d 100644 |
2628 |
+--- a/fs/xfs/linux-2.6/xfs_sync.c |
2629 |
++++ b/fs/xfs/linux-2.6/xfs_sync.c |
2630 |
+@@ -711,13 +711,10 @@ xfs_inode_set_reclaim_tag( |
2631 |
+ } |
2632 |
+ |
2633 |
+ void |
2634 |
+-__xfs_inode_clear_reclaim_tag( |
2635 |
+- xfs_mount_t *mp, |
2636 |
++__xfs_inode_clear_reclaim( |
2637 |
+ xfs_perag_t *pag, |
2638 |
+ xfs_inode_t *ip) |
2639 |
+ { |
2640 |
+- radix_tree_tag_clear(&pag->pag_ici_root, |
2641 |
+- XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); |
2642 |
+ pag->pag_ici_reclaimable--; |
2643 |
+ if (!pag->pag_ici_reclaimable) { |
2644 |
+ /* clear the reclaim tag from the perag radix tree */ |
2645 |
+@@ -731,6 +728,17 @@ __xfs_inode_clear_reclaim_tag( |
2646 |
+ } |
2647 |
+ } |
2648 |
+ |
2649 |
++void |
2650 |
++__xfs_inode_clear_reclaim_tag( |
2651 |
++ xfs_mount_t *mp, |
2652 |
++ xfs_perag_t *pag, |
2653 |
++ xfs_inode_t *ip) |
2654 |
++{ |
2655 |
++ radix_tree_tag_clear(&pag->pag_ici_root, |
2656 |
++ XFS_INO_TO_AGINO(mp, ip->i_ino), XFS_ICI_RECLAIM_TAG); |
2657 |
++ __xfs_inode_clear_reclaim(pag, ip); |
2658 |
++} |
2659 |
++ |
2660 |
+ /* |
2661 |
+ * Inodes in different states need to be treated differently, and the return |
2662 |
+ * value of xfs_iflush is not sufficient to get this right. The following table |
2663 |
+diff --git a/fs/xfs/linux-2.6/xfs_sync.h b/fs/xfs/linux-2.6/xfs_sync.h |
2664 |
+index e28139a..e4f7e1f 100644 |
2665 |
+--- a/fs/xfs/linux-2.6/xfs_sync.h |
2666 |
++++ b/fs/xfs/linux-2.6/xfs_sync.h |
2667 |
+@@ -47,6 +47,7 @@ int xfs_reclaim_inodes(struct xfs_mount *mp, int mode); |
2668 |
+ |
2669 |
+ void xfs_inode_set_reclaim_tag(struct xfs_inode *ip); |
2670 |
+ void __xfs_inode_set_reclaim_tag(struct xfs_perag *pag, struct xfs_inode *ip); |
2671 |
++void __xfs_inode_clear_reclaim(struct xfs_perag *pag, struct xfs_inode *ip); |
2672 |
+ void __xfs_inode_clear_reclaim_tag(struct xfs_mount *mp, struct xfs_perag *pag, |
2673 |
+ struct xfs_inode *ip); |
2674 |
+ |
2675 |
+diff --git a/fs/xfs/xfs_iget.c b/fs/xfs/xfs_iget.c |
2676 |
+index 8f8b91b..a8bb8c2 100644 |
2677 |
+--- a/fs/xfs/xfs_iget.c |
2678 |
++++ b/fs/xfs/xfs_iget.c |
2679 |
+@@ -492,6 +492,7 @@ xfs_ireclaim( |
2680 |
+ write_lock(&pag->pag_ici_lock); |
2681 |
+ if (!radix_tree_delete(&pag->pag_ici_root, agino)) |
2682 |
+ ASSERT(0); |
2683 |
++ __xfs_inode_clear_reclaim(pag, ip); |
2684 |
+ write_unlock(&pag->pag_ici_lock); |
2685 |
+ xfs_perag_put(pag); |
2686 |
+ |
2687 |
+diff --git a/include/drm/drmP.h b/include/drm/drmP.h |
2688 |
+index c1b9871..7c9d28d 100644 |
2689 |
+--- a/include/drm/drmP.h |
2690 |
++++ b/include/drm/drmP.h |
2691 |
+@@ -802,7 +802,6 @@ struct drm_driver { |
2692 |
+ */ |
2693 |
+ int (*gem_init_object) (struct drm_gem_object *obj); |
2694 |
+ void (*gem_free_object) (struct drm_gem_object *obj); |
2695 |
+- void (*gem_free_object_unlocked) (struct drm_gem_object *obj); |
2696 |
+ |
2697 |
+ /* vga arb irq handler */ |
2698 |
+ void (*vgaarb_irq)(struct drm_device *dev, bool state); |
2699 |
+@@ -1149,6 +1148,7 @@ extern int drm_release(struct inode *inode, struct file *filp); |
2700 |
+ extern int drm_mmap(struct file *filp, struct vm_area_struct *vma); |
2701 |
+ extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma); |
2702 |
+ extern void drm_vm_open_locked(struct vm_area_struct *vma); |
2703 |
++extern void drm_vm_close_locked(struct vm_area_struct *vma); |
2704 |
+ extern resource_size_t drm_core_get_map_ofs(struct drm_local_map * map); |
2705 |
+ extern resource_size_t drm_core_get_reg_ofs(struct drm_device *dev); |
2706 |
+ extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); |
2707 |
+@@ -1430,7 +1430,6 @@ int drm_gem_init(struct drm_device *dev); |
2708 |
+ void drm_gem_destroy(struct drm_device *dev); |
2709 |
+ void drm_gem_object_release(struct drm_gem_object *obj); |
2710 |
+ void drm_gem_object_free(struct kref *kref); |
2711 |
+-void drm_gem_object_free_unlocked(struct kref *kref); |
2712 |
+ struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, |
2713 |
+ size_t size); |
2714 |
+ int drm_gem_object_init(struct drm_device *dev, |
2715 |
+@@ -1456,8 +1455,12 @@ drm_gem_object_unreference(struct drm_gem_object *obj) |
2716 |
+ static inline void |
2717 |
+ drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) |
2718 |
+ { |
2719 |
+- if (obj != NULL) |
2720 |
+- kref_put(&obj->refcount, drm_gem_object_free_unlocked); |
2721 |
++ if (obj != NULL) { |
2722 |
++ struct drm_device *dev = obj->dev; |
2723 |
++ mutex_lock(&dev->struct_mutex); |
2724 |
++ kref_put(&obj->refcount, drm_gem_object_free); |
2725 |
++ mutex_unlock(&dev->struct_mutex); |
2726 |
++ } |
2727 |
+ } |
2728 |
+ |
2729 |
+ int drm_gem_handle_create(struct drm_file *file_priv, |
2730 |
+diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h |
2731 |
+index 3a9940e..883c1d4 100644 |
2732 |
+--- a/include/drm/drm_pciids.h |
2733 |
++++ b/include/drm/drm_pciids.h |
2734 |
+@@ -85,7 +85,6 @@ |
2735 |
+ {0x1002, 0x5460, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
2736 |
+ {0x1002, 0x5462, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
2737 |
+ {0x1002, 0x5464, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \ |
2738 |
+- {0x1002, 0x5657, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_NEW_MEMMAP}, \ |
2739 |
+ {0x1002, 0x5548, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ |
2740 |
+ {0x1002, 0x5549, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ |
2741 |
+ {0x1002, 0x554A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R423|RADEON_NEW_MEMMAP}, \ |
2742 |
+@@ -103,6 +102,7 @@ |
2743 |
+ {0x1002, 0x564F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
2744 |
+ {0x1002, 0x5652, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
2745 |
+ {0x1002, 0x5653, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ |
2746 |
++ {0x1002, 0x5657, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV410|RADEON_NEW_MEMMAP}, \ |
2747 |
+ {0x1002, 0x5834, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP}, \ |
2748 |
+ {0x1002, 0x5835, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY}, \ |
2749 |
+ {0x1002, 0x5954, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RS480|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_IS_IGPGART}, \ |
2750 |
+diff --git a/include/linux/intel-gtt.h b/include/linux/intel-gtt.h |
2751 |
+new file mode 100644 |
2752 |
+index 0000000..1d19ab2 |
2753 |
+--- /dev/null |
2754 |
++++ b/include/linux/intel-gtt.h |
2755 |
+@@ -0,0 +1,20 @@ |
2756 |
++/* |
2757 |
++ * Common Intel AGPGART and GTT definitions. |
2758 |
++ */ |
2759 |
++#ifndef _INTEL_GTT_H |
2760 |
++#define _INTEL_GTT_H |
2761 |
++ |
2762 |
++#include <linux/agp_backend.h> |
2763 |
++ |
2764 |
++/* This is for Intel only GTT controls. |
2765 |
++ * |
2766 |
++ * Sandybridge: AGP_USER_CACHED_MEMORY default to LLC only |
2767 |
++ */ |
2768 |
++ |
2769 |
++#define AGP_USER_CACHED_MEMORY_LLC_MLC (AGP_USER_TYPES + 2) |
2770 |
++#define AGP_USER_UNCACHED_MEMORY (AGP_USER_TYPES + 4) |
2771 |
++ |
2772 |
++/* flag for GFDT type */ |
2773 |
++#define AGP_USER_CACHED_MEMORY_GFDT (1 << 3) |
2774 |
++ |
2775 |
++#endif |
2776 |
+diff --git a/include/linux/mm.h b/include/linux/mm.h |
2777 |
+index c1f54d2..a724d89 100644 |
2778 |
+--- a/include/linux/mm.h |
2779 |
++++ b/include/linux/mm.h |
2780 |
+@@ -863,6 +863,12 @@ int set_page_dirty(struct page *page); |
2781 |
+ int set_page_dirty_lock(struct page *page); |
2782 |
+ int clear_page_dirty_for_io(struct page *page); |
2783 |
+ |
2784 |
++/* Is the vma a continuation of the stack vma above it? */ |
2785 |
++static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr) |
2786 |
++{ |
2787 |
++ return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); |
2788 |
++} |
2789 |
++ |
2790 |
+ extern unsigned long move_page_tables(struct vm_area_struct *vma, |
2791 |
+ unsigned long old_addr, struct vm_area_struct *new_vma, |
2792 |
+ unsigned long new_addr, unsigned long len); |
2793 |
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
2794 |
+index 3bedcc1..aa70205 100644 |
2795 |
+--- a/include/linux/pci_ids.h |
2796 |
++++ b/include/linux/pci_ids.h |
2797 |
+@@ -393,6 +393,9 @@ |
2798 |
+ #define PCI_DEVICE_ID_VLSI_82C147 0x0105 |
2799 |
+ #define PCI_DEVICE_ID_VLSI_VAS96011 0x0702 |
2800 |
+ |
2801 |
++/* AMD RD890 Chipset */ |
2802 |
++#define PCI_DEVICE_ID_RD890_IOMMU 0x5a23 |
2803 |
++ |
2804 |
+ #define PCI_VENDOR_ID_ADL 0x1005 |
2805 |
+ #define PCI_DEVICE_ID_ADL_2301 0x2301 |
2806 |
+ |
2807 |
+diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c |
2808 |
+index 5c69e99..21e0c5e 100644 |
2809 |
+--- a/kernel/hrtimer.c |
2810 |
++++ b/kernel/hrtimer.c |
2811 |
+@@ -936,6 +936,7 @@ static inline int |
2812 |
+ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base) |
2813 |
+ { |
2814 |
+ if (hrtimer_is_queued(timer)) { |
2815 |
++ unsigned long state; |
2816 |
+ int reprogram; |
2817 |
+ |
2818 |
+ /* |
2819 |
+@@ -949,8 +950,13 @@ remove_hrtimer(struct hrtimer *timer, struct hrtimer_clock_base *base) |
2820 |
+ debug_deactivate(timer); |
2821 |
+ timer_stats_hrtimer_clear_start_info(timer); |
2822 |
+ reprogram = base->cpu_base == &__get_cpu_var(hrtimer_bases); |
2823 |
+- __remove_hrtimer(timer, base, HRTIMER_STATE_INACTIVE, |
2824 |
+- reprogram); |
2825 |
++ /* |
2826 |
++ * We must preserve the CALLBACK state flag here, |
2827 |
++ * otherwise we could move the timer base in |
2828 |
++ * switch_hrtimer_base. |
2829 |
++ */ |
2830 |
++ state = timer->state & HRTIMER_STATE_CALLBACK; |
2831 |
++ __remove_hrtimer(timer, base, state, reprogram); |
2832 |
+ return 1; |
2833 |
+ } |
2834 |
+ return 0; |
2835 |
+@@ -1237,6 +1243,9 @@ static void __run_hrtimer(struct hrtimer *timer, ktime_t *now) |
2836 |
+ BUG_ON(timer->state != HRTIMER_STATE_CALLBACK); |
2837 |
+ enqueue_hrtimer(timer, base); |
2838 |
+ } |
2839 |
++ |
2840 |
++ WARN_ON_ONCE(!(timer->state & HRTIMER_STATE_CALLBACK)); |
2841 |
++ |
2842 |
+ timer->state &= ~HRTIMER_STATE_CALLBACK; |
2843 |
+ } |
2844 |
+ |
2845 |
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c |
2846 |
+index 5ec8f1d..6cd7334 100644 |
2847 |
+--- a/kernel/trace/ring_buffer.c |
2848 |
++++ b/kernel/trace/ring_buffer.c |
2849 |
+@@ -405,7 +405,7 @@ static inline int test_time_stamp(u64 delta) |
2850 |
+ #define BUF_MAX_DATA_SIZE (BUF_PAGE_SIZE - (sizeof(u32) * 2)) |
2851 |
+ |
2852 |
+ /* Max number of timestamps that can fit on a page */ |
2853 |
+-#define RB_TIMESTAMPS_PER_PAGE (BUF_PAGE_SIZE / RB_LEN_TIME_STAMP) |
2854 |
++#define RB_TIMESTAMPS_PER_PAGE (BUF_PAGE_SIZE / RB_LEN_TIME_EXTEND) |
2855 |
+ |
2856 |
+ int ring_buffer_print_page_header(struct trace_seq *s) |
2857 |
+ { |
2858 |
+diff --git a/lib/list_sort.c b/lib/list_sort.c |
2859 |
+index 4b5cb79..a7616fa 100644 |
2860 |
+--- a/lib/list_sort.c |
2861 |
++++ b/lib/list_sort.c |
2862 |
+@@ -70,7 +70,7 @@ static void merge_and_restore_back_links(void *priv, |
2863 |
+ * element comparison is needed, so the client's cmp() |
2864 |
+ * routine can invoke cond_resched() periodically. |
2865 |
+ */ |
2866 |
+- (*cmp)(priv, tail, tail); |
2867 |
++ (*cmp)(priv, tail->next, tail->next); |
2868 |
+ |
2869 |
+ tail->next->prev = tail; |
2870 |
+ tail = tail->next; |
2871 |
+diff --git a/mm/ksm.c b/mm/ksm.c |
2872 |
+index 17ee9df..79cd773 100644 |
2873 |
+--- a/mm/ksm.c |
2874 |
++++ b/mm/ksm.c |
2875 |
+@@ -731,7 +731,7 @@ static int write_protect_page(struct vm_area_struct *vma, struct page *page, |
2876 |
+ if (!ptep) |
2877 |
+ goto out; |
2878 |
+ |
2879 |
+- if (pte_write(*ptep)) { |
2880 |
++ if (pte_write(*ptep) || pte_dirty(*ptep)) { |
2881 |
+ pte_t entry; |
2882 |
+ |
2883 |
+ swapped = PageSwapCache(page); |
2884 |
+@@ -754,7 +754,9 @@ static int write_protect_page(struct vm_area_struct *vma, struct page *page, |
2885 |
+ set_pte_at(mm, addr, ptep, entry); |
2886 |
+ goto out_unlock; |
2887 |
+ } |
2888 |
+- entry = pte_wrprotect(entry); |
2889 |
++ if (pte_dirty(entry)) |
2890 |
++ set_page_dirty(page); |
2891 |
++ entry = pte_mkclean(pte_wrprotect(entry)); |
2892 |
+ set_pte_at_notify(mm, addr, ptep, entry); |
2893 |
+ } |
2894 |
+ *orig_pte = *ptep; |
2895 |
+diff --git a/mm/mlock.c b/mm/mlock.c |
2896 |
+index cbae7c5..b70919c 100644 |
2897 |
+--- a/mm/mlock.c |
2898 |
++++ b/mm/mlock.c |
2899 |
+@@ -135,12 +135,6 @@ void munlock_vma_page(struct page *page) |
2900 |
+ } |
2901 |
+ } |
2902 |
+ |
2903 |
+-/* Is the vma a continuation of the stack vma above it? */ |
2904 |
+-static inline int vma_stack_continue(struct vm_area_struct *vma, unsigned long addr) |
2905 |
+-{ |
2906 |
+- return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN); |
2907 |
+-} |
2908 |
+- |
2909 |
+ static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long addr) |
2910 |
+ { |
2911 |
+ return (vma->vm_flags & VM_GROWSDOWN) && |
2912 |
+diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
2913 |
+index be9abc2..af775e9 100644 |
2914 |
+--- a/net/mac80211/rx.c |
2915 |
++++ b/net/mac80211/rx.c |
2916 |
+@@ -2156,9 +2156,6 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx, |
2917 |
+ struct net_device *prev_dev = NULL; |
2918 |
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); |
2919 |
+ |
2920 |
+- if (status->flag & RX_FLAG_INTERNAL_CMTR) |
2921 |
+- goto out_free_skb; |
2922 |
+- |
2923 |
+ if (skb_headroom(skb) < sizeof(*rthdr) && |
2924 |
+ pskb_expand_head(skb, sizeof(*rthdr), 0, GFP_ATOMIC)) |
2925 |
+ goto out_free_skb; |
2926 |
+@@ -2217,7 +2214,6 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx, |
2927 |
+ } else |
2928 |
+ goto out_free_skb; |
2929 |
+ |
2930 |
+- status->flag |= RX_FLAG_INTERNAL_CMTR; |
2931 |
+ return; |
2932 |
+ |
2933 |
+ out_free_skb: |
2934 |
+diff --git a/net/rds/page.c b/net/rds/page.c |
2935 |
+index 595a952..1dfbfea 100644 |
2936 |
+--- a/net/rds/page.c |
2937 |
++++ b/net/rds/page.c |
2938 |
+@@ -57,30 +57,17 @@ int rds_page_copy_user(struct page *page, unsigned long offset, |
2939 |
+ unsigned long ret; |
2940 |
+ void *addr; |
2941 |
+ |
2942 |
+- if (to_user) |
2943 |
++ addr = kmap(page); |
2944 |
++ if (to_user) { |
2945 |
+ rds_stats_add(s_copy_to_user, bytes); |
2946 |
+- else |
2947 |
++ ret = copy_to_user(ptr, addr + offset, bytes); |
2948 |
++ } else { |
2949 |
+ rds_stats_add(s_copy_from_user, bytes); |
2950 |
+- |
2951 |
+- addr = kmap_atomic(page, KM_USER0); |
2952 |
+- if (to_user) |
2953 |
+- ret = __copy_to_user_inatomic(ptr, addr + offset, bytes); |
2954 |
+- else |
2955 |
+- ret = __copy_from_user_inatomic(addr + offset, ptr, bytes); |
2956 |
+- kunmap_atomic(addr, KM_USER0); |
2957 |
+- |
2958 |
+- if (ret) { |
2959 |
+- addr = kmap(page); |
2960 |
+- if (to_user) |
2961 |
+- ret = copy_to_user(ptr, addr + offset, bytes); |
2962 |
+- else |
2963 |
+- ret = copy_from_user(addr + offset, ptr, bytes); |
2964 |
+- kunmap(page); |
2965 |
+- if (ret) |
2966 |
+- return -EFAULT; |
2967 |
++ ret = copy_from_user(addr + offset, ptr, bytes); |
2968 |
+ } |
2969 |
++ kunmap(page); |
2970 |
+ |
2971 |
+- return 0; |
2972 |
++ return ret ? -EFAULT : 0; |
2973 |
+ } |
2974 |
+ EXPORT_SYMBOL_GPL(rds_page_copy_user); |
2975 |
+ |
2976 |
+diff --git a/net/wireless/wext-priv.c b/net/wireless/wext-priv.c |
2977 |
+index 3feb28e..674d426 100644 |
2978 |
+--- a/net/wireless/wext-priv.c |
2979 |
++++ b/net/wireless/wext-priv.c |
2980 |
+@@ -152,7 +152,7 @@ static int ioctl_private_iw_point(struct iw_point *iwp, unsigned int cmd, |
2981 |
+ } else if (!iwp->pointer) |
2982 |
+ return -EFAULT; |
2983 |
+ |
2984 |
+- extra = kmalloc(extra_size, GFP_KERNEL); |
2985 |
++ extra = kzalloc(extra_size, GFP_KERNEL); |
2986 |
+ if (!extra) |
2987 |
+ return -ENOMEM; |
2988 |
+ |
2989 |
+diff --git a/sound/core/control.c b/sound/core/control.c |
2990 |
+index 070aab4..45a8180 100644 |
2991 |
+--- a/sound/core/control.c |
2992 |
++++ b/sound/core/control.c |
2993 |
+@@ -31,6 +31,7 @@ |
2994 |
+ |
2995 |
+ /* max number of user-defined controls */ |
2996 |
+ #define MAX_USER_CONTROLS 32 |
2997 |
++#define MAX_CONTROL_COUNT 1028 |
2998 |
+ |
2999 |
+ struct snd_kctl_ioctl { |
3000 |
+ struct list_head list; /* list of all ioctls */ |
3001 |
+@@ -195,6 +196,10 @@ static struct snd_kcontrol *snd_ctl_new(struct snd_kcontrol *control, |
3002 |
+ |
3003 |
+ if (snd_BUG_ON(!control || !control->count)) |
3004 |
+ return NULL; |
3005 |
++ |
3006 |
++ if (control->count > MAX_CONTROL_COUNT) |
3007 |
++ return NULL; |
3008 |
++ |
3009 |
+ kctl = kzalloc(sizeof(*kctl) + sizeof(struct snd_kcontrol_volatile) * control->count, GFP_KERNEL); |
3010 |
+ if (kctl == NULL) { |
3011 |
+ snd_printk(KERN_ERR "Cannot allocate control instance\n"); |
3012 |
+diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c |
3013 |
+index eb68326..75490c6 100644 |
3014 |
+--- a/sound/core/rawmidi.c |
3015 |
++++ b/sound/core/rawmidi.c |
3016 |
+@@ -535,13 +535,15 @@ static int snd_rawmidi_release(struct inode *inode, struct file *file) |
3017 |
+ { |
3018 |
+ struct snd_rawmidi_file *rfile; |
3019 |
+ struct snd_rawmidi *rmidi; |
3020 |
++ struct module *module; |
3021 |
+ |
3022 |
+ rfile = file->private_data; |
3023 |
+ rmidi = rfile->rmidi; |
3024 |
+ rawmidi_release_priv(rfile); |
3025 |
+ kfree(rfile); |
3026 |
++ module = rmidi->card->module; |
3027 |
+ snd_card_file_remove(rmidi->card, file); |
3028 |
+- module_put(rmidi->card->module); |
3029 |
++ module_put(module); |
3030 |
+ return 0; |
3031 |
+ } |
3032 |
+ |
3033 |
+diff --git a/sound/oss/soundcard.c b/sound/oss/soundcard.c |
3034 |
+index 2d9c513..19ce86d 100644 |
3035 |
+--- a/sound/oss/soundcard.c |
3036 |
++++ b/sound/oss/soundcard.c |
3037 |
+@@ -389,11 +389,11 @@ static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg) |
3038 |
+ case SND_DEV_DSP: |
3039 |
+ case SND_DEV_DSP16: |
3040 |
+ case SND_DEV_AUDIO: |
3041 |
+- return audio_ioctl(dev, file, cmd, p); |
3042 |
++ ret = audio_ioctl(dev, file, cmd, p); |
3043 |
+ break; |
3044 |
+ |
3045 |
+ case SND_DEV_MIDIN: |
3046 |
+- return MIDIbuf_ioctl(dev, file, cmd, p); |
3047 |
++ ret = MIDIbuf_ioctl(dev, file, cmd, p); |
3048 |
+ break; |
3049 |
+ |
3050 |
+ } |
3051 |
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
3052 |
+index afbe314..6258a05 100644 |
3053 |
+--- a/sound/pci/hda/patch_analog.c |
3054 |
++++ b/sound/pci/hda/patch_analog.c |
3055 |
+@@ -3641,6 +3641,7 @@ static struct snd_pci_quirk ad1984_cfg_tbl[] = { |
3056 |
+ /* Lenovo Thinkpad T61/X61 */ |
3057 |
+ SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD), |
3058 |
+ SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP), |
3059 |
++ SND_PCI_QUIRK(0x1028, 0x0233, "Dell Latitude E6400", AD1984_DELL_DESKTOP), |
3060 |
+ {} |
3061 |
+ }; |
3062 |
+ |
3063 |
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
3064 |
+index 4eee494..15ba418 100644 |
3065 |
+--- a/sound/pci/hda/patch_conexant.c |
3066 |
++++ b/sound/pci/hda/patch_conexant.c |
3067 |
+@@ -1633,6 +1633,11 @@ static void cxt5051_update_speaker(struct hda_codec *codec) |
3068 |
+ pinctl = (!spec->hp_present && spec->cur_eapd) ? PIN_OUT : 0; |
3069 |
+ snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, |
3070 |
+ pinctl); |
3071 |
++ /* on ideapad there is an aditional speaker (subwoofer) to mute */ |
3072 |
++ if (spec->ideapad) |
3073 |
++ snd_hda_codec_write(codec, 0x1b, 0, |
3074 |
++ AC_VERB_SET_PIN_WIDGET_CONTROL, |
3075 |
++ pinctl); |
3076 |
+ } |
3077 |
+ |
3078 |
+ /* turn on/off EAPD (+ mute HP) as a master switch */ |
3079 |
+@@ -1889,6 +1894,13 @@ static void cxt5051_init_mic_port(struct hda_codec *codec, hda_nid_t nid, |
3080 |
+ #endif |
3081 |
+ } |
3082 |
+ |
3083 |
++static struct hda_verb cxt5051_ideapad_init_verbs[] = { |
3084 |
++ /* Subwoofer */ |
3085 |
++ {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, |
3086 |
++ {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, |
3087 |
++ { } /* end */ |
3088 |
++}; |
3089 |
++ |
3090 |
+ /* initialize jack-sensing, too */ |
3091 |
+ static int cxt5051_init(struct hda_codec *codec) |
3092 |
+ { |
3093 |
+@@ -1918,6 +1930,7 @@ enum { |
3094 |
+ CXT5051_LENOVO_X200, /* Lenovo X200 laptop, also used for Advanced Mini Dock 250410 */ |
3095 |
+ CXT5051_F700, /* HP Compaq Presario F700 */ |
3096 |
+ CXT5051_TOSHIBA, /* Toshiba M300 & co */ |
3097 |
++ CXT5051_IDEAPAD, /* Lenovo IdeaPad Y430 */ |
3098 |
+ CXT5051_MODELS |
3099 |
+ }; |
3100 |
+ |
3101 |
+@@ -1928,6 +1941,7 @@ static const char *cxt5051_models[CXT5051_MODELS] = { |
3102 |
+ [CXT5051_LENOVO_X200] = "lenovo-x200", |
3103 |
+ [CXT5051_F700] = "hp-700", |
3104 |
+ [CXT5051_TOSHIBA] = "toshiba", |
3105 |
++ [CXT5051_IDEAPAD] = "ideapad", |
3106 |
+ }; |
3107 |
+ |
3108 |
+ static struct snd_pci_quirk cxt5051_cfg_tbl[] = { |
3109 |
+@@ -1939,6 +1953,7 @@ static struct snd_pci_quirk cxt5051_cfg_tbl[] = { |
3110 |
+ CXT5051_LAPTOP), |
3111 |
+ SND_PCI_QUIRK(0x14f1, 0x5051, "HP Spartan 1.1", CXT5051_HP), |
3112 |
+ SND_PCI_QUIRK(0x17aa, 0x20f2, "Lenovo X200", CXT5051_LENOVO_X200), |
3113 |
++ SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo IdeaPad", CXT5051_IDEAPAD), |
3114 |
+ {} |
3115 |
+ }; |
3116 |
+ |
3117 |
+@@ -2000,6 +2015,11 @@ static int patch_cxt5051(struct hda_codec *codec) |
3118 |
+ spec->mixers[0] = cxt5051_toshiba_mixers; |
3119 |
+ spec->auto_mic = AUTO_MIC_PORTB; |
3120 |
+ break; |
3121 |
++ case CXT5051_IDEAPAD: |
3122 |
++ spec->init_verbs[spec->num_init_verbs++] = |
3123 |
++ cxt5051_ideapad_init_verbs; |
3124 |
++ spec->ideapad = 1; |
3125 |
++ break; |
3126 |
+ } |
3127 |
+ |
3128 |
+ return 0; |
3129 |
+diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c |
3130 |
+index 289cb4d..6c0a11a 100644 |
3131 |
+--- a/sound/pci/oxygen/oxygen.c |
3132 |
++++ b/sound/pci/oxygen/oxygen.c |
3133 |
+@@ -543,6 +543,10 @@ static int __devinit get_oxygen_model(struct oxygen *chip, |
3134 |
+ chip->model.suspend = claro_suspend; |
3135 |
+ chip->model.resume = claro_resume; |
3136 |
+ chip->model.set_adc_params = set_ak5385_params; |
3137 |
++ chip->model.device_config = PLAYBACK_0_TO_I2S | |
3138 |
++ PLAYBACK_1_TO_SPDIF | |
3139 |
++ CAPTURE_0_FROM_I2S_2 | |
3140 |
++ CAPTURE_1_FROM_SPDIF; |
3141 |
+ break; |
3142 |
+ } |
3143 |
+ if (id->driver_data == MODEL_MERIDIAN || |
3144 |
+diff --git a/sound/pci/rme9652/hdsp.c b/sound/pci/rme9652/hdsp.c |
3145 |
+index b92adef..d6fa7bf 100644 |
3146 |
+--- a/sound/pci/rme9652/hdsp.c |
3147 |
++++ b/sound/pci/rme9652/hdsp.c |
3148 |
+@@ -4609,6 +4609,7 @@ static int snd_hdsp_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, unsigne |
3149 |
+ if (err < 0) |
3150 |
+ return err; |
3151 |
+ |
3152 |
++ memset(&info, 0, sizeof(info)); |
3153 |
+ spin_lock_irqsave(&hdsp->lock, flags); |
3154 |
+ info.pref_sync_ref = (unsigned char)hdsp_pref_sync_ref(hdsp); |
3155 |
+ info.wordclock_sync_check = (unsigned char)hdsp_wc_sync_check(hdsp); |
3156 |
+diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c |
3157 |
+index 547b713..0c98ef9 100644 |
3158 |
+--- a/sound/pci/rme9652/hdspm.c |
3159 |
++++ b/sound/pci/rme9652/hdspm.c |
3160 |
+@@ -4127,6 +4127,7 @@ static int snd_hdspm_hwdep_ioctl(struct snd_hwdep * hw, struct file *file, |
3161 |
+ |
3162 |
+ case SNDRV_HDSPM_IOCTL_GET_CONFIG_INFO: |
3163 |
+ |
3164 |
++ memset(&info, 0, sizeof(info)); |
3165 |
+ spin_lock_irq(&hdspm->lock); |
3166 |
+ info.pref_sync_ref = hdspm_pref_sync_ref(hdspm); |
3167 |
+ info.wordclock_sync_check = hdspm_wc_sync_check(hdspm); |
3168 |
+diff --git a/virt/kvm/eventfd.c b/virt/kvm/eventfd.c |
3169 |
+index b81f0eb..33993e3 100644 |
3170 |
+--- a/virt/kvm/eventfd.c |
3171 |
++++ b/virt/kvm/eventfd.c |
3172 |
+@@ -217,7 +217,6 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) |
3173 |
+ events = file->f_op->poll(file, &irqfd->pt); |
3174 |
+ |
3175 |
+ list_add_tail(&irqfd->list, &kvm->irqfds.items); |
3176 |
+- spin_unlock_irq(&kvm->irqfds.lock); |
3177 |
+ |
3178 |
+ /* |
3179 |
+ * Check if there was an event already pending on the eventfd |
3180 |
+@@ -226,6 +225,8 @@ kvm_irqfd_assign(struct kvm *kvm, int fd, int gsi) |
3181 |
+ if (events & POLLIN) |
3182 |
+ schedule_work(&irqfd->inject); |
3183 |
+ |
3184 |
++ spin_unlock_irq(&kvm->irqfds.lock); |
3185 |
++ |
3186 |
+ /* |
3187 |
+ * do not drop the file until the irqfd is fully initialized, otherwise |
3188 |
+ * we might race against the POLLHUP |
3189 |
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
3190 |
+index 2774528..dd85e29 100644 |
3191 |
+--- a/virt/kvm/kvm_main.c |
3192 |
++++ b/virt/kvm/kvm_main.c |
3193 |
+@@ -1942,10 +1942,12 @@ static int kvm_cpu_hotplug(struct notifier_block *notifier, unsigned long val, |
3194 |
+ |
3195 |
+ asmlinkage void kvm_handle_fault_on_reboot(void) |
3196 |
+ { |
3197 |
+- if (kvm_rebooting) |
3198 |
++ if (kvm_rebooting) { |
3199 |
+ /* spin while reset goes on */ |
3200 |
++ local_irq_enable(); |
3201 |
+ while (true) |
3202 |
+ ; |
3203 |
++ } |
3204 |
+ /* Fault while not rebooting. We want the trace. */ |
3205 |
+ BUG(); |
3206 |
+ } |
3207 |
|
3208 |
Deleted: genpatches-2.6/trunk/2.6.35/1500_CVE-2010-3904-RDS-Priv-Escal-fix.patch |
3209 |
=================================================================== |
3210 |
--- genpatches-2.6/trunk/2.6.35/1500_CVE-2010-3904-RDS-Priv-Escal-fix.patch 2010-10-31 22:55:31 UTC (rev 1818) |
3211 |
+++ genpatches-2.6/trunk/2.6.35/1500_CVE-2010-3904-RDS-Priv-Escal-fix.patch 2010-10-31 23:04:30 UTC (rev 1819) |
3212 |
@@ -1,41 +0,0 @@ |
3213 |
---- a/net/rds/page.c 2010-10-19 16:40:45.060591205 -0400 |
3214 |
-+++ b/net/rds/page.c 2010-10-19 16:46:14.119044215 -0400 |
3215 |
-@@ -57,30 +57,18 @@ int rds_page_copy_user(struct page *page |
3216 |
- unsigned long ret; |
3217 |
- void *addr; |
3218 |
- |
3219 |
-- if (to_user) |
3220 |
-+ addr = kmap(page); |
3221 |
-+ if (to_user) { |
3222 |
- rds_stats_add(s_copy_to_user, bytes); |
3223 |
-- else |
3224 |
-+ ret = copy_to_user(ptr, addr + offset, bytes); |
3225 |
-+ } else { |
3226 |
- rds_stats_add(s_copy_from_user, bytes); |
3227 |
-- |
3228 |
-- addr = kmap_atomic(page, KM_USER0); |
3229 |
-- if (to_user) |
3230 |
-- ret = __copy_to_user_inatomic(ptr, addr + offset, bytes); |
3231 |
-- else |
3232 |
-- ret = __copy_from_user_inatomic(addr + offset, ptr, bytes); |
3233 |
-- kunmap_atomic(addr, KM_USER0); |
3234 |
-- |
3235 |
-- if (ret) { |
3236 |
-- addr = kmap(page); |
3237 |
-- if (to_user) |
3238 |
-- ret = copy_to_user(ptr, addr + offset, bytes); |
3239 |
-- else |
3240 |
-- ret = copy_from_user(addr + offset, ptr, bytes); |
3241 |
-- kunmap(page); |
3242 |
-- if (ret) |
3243 |
-- return -EFAULT; |
3244 |
-+ ret = copy_from_user(addr + offset, ptr, bytes); |
3245 |
- } |
3246 |
- |
3247 |
-- return 0; |
3248 |
-+ kunmap(page); |
3249 |
-+ |
3250 |
-+ return ret ? -EFAULT : 0; |
3251 |
- } |
3252 |
- EXPORT_SYMBOL_GPL(rds_page_copy_user); |
3253 |
- |