Contents of /trunk/kernel26-alx/patches-2.6.37-r1/0101-2.6.37.2-all-fixes.patch
Parent Directory
|
Revision Log
Revision 1311 -
(show annotations)
(download)
Tue Apr 12 14:29:09 2011 UTC (13 years, 1 month ago) by niro
File size: 82804 byte(s)
Tue Apr 12 14:29:09 2011 UTC (13 years, 1 month ago) by niro
File size: 82804 byte(s)
kernel 2.6.37-alx-r1
1 | diff --git a/Documentation/hwmon/jc42 b/Documentation/hwmon/jc42 |
2 | index 0e76ef1..a22ecf4 100644 |
3 | --- a/Documentation/hwmon/jc42 |
4 | +++ b/Documentation/hwmon/jc42 |
5 | @@ -51,7 +51,8 @@ Supported chips: |
6 | * JEDEC JC 42.4 compliant temperature sensor chips |
7 | Prefix: 'jc42' |
8 | Addresses scanned: I2C 0x18 - 0x1f |
9 | - Datasheet: - |
10 | + Datasheet: |
11 | + http://www.jedec.org/sites/default/files/docs/4_01_04R19.pdf |
12 | |
13 | Author: |
14 | Guenter Roeck <guenter.roeck@ericsson.com> |
15 | @@ -60,7 +61,11 @@ Author: |
16 | Description |
17 | ----------- |
18 | |
19 | -This driver implements support for JEDEC JC 42.4 compliant temperature sensors. |
20 | +This driver implements support for JEDEC JC 42.4 compliant temperature sensors, |
21 | +which are used on many DDR3 memory modules for mobile devices and servers. Some |
22 | +systems use the sensor to prevent memory overheating by automatically throttling |
23 | +the memory controller. |
24 | + |
25 | The driver auto-detects the chips listed above, but can be manually instantiated |
26 | to support other JC 42.4 compliant chips. |
27 | |
28 | @@ -81,15 +86,19 @@ limits. The chip supports only a single register to configure the hysteresis, |
29 | which applies to all limits. This register can be written by writing into |
30 | temp1_crit_hyst. Other hysteresis attributes are read-only. |
31 | |
32 | +If the BIOS has configured the sensor for automatic temperature management, it |
33 | +is likely that it has locked the registers, i.e., that the temperature limits |
34 | +cannot be changed. |
35 | + |
36 | Sysfs entries |
37 | ------------- |
38 | |
39 | temp1_input Temperature (RO) |
40 | -temp1_min Minimum temperature (RW) |
41 | -temp1_max Maximum temperature (RW) |
42 | -temp1_crit Critical high temperature (RW) |
43 | +temp1_min Minimum temperature (RO or RW) |
44 | +temp1_max Maximum temperature (RO or RW) |
45 | +temp1_crit Critical high temperature (RO or RW) |
46 | |
47 | -temp1_crit_hyst Critical hysteresis temperature (RW) |
48 | +temp1_crit_hyst Critical hysteresis temperature (RO or RW) |
49 | temp1_max_hyst Maximum hysteresis temperature (RO) |
50 | |
51 | temp1_min_alarm Temperature low alarm |
52 | diff --git a/Documentation/hwmon/k10temp b/Documentation/hwmon/k10temp |
53 | index 6526eee..d2b56a4 100644 |
54 | --- a/Documentation/hwmon/k10temp |
55 | +++ b/Documentation/hwmon/k10temp |
56 | @@ -9,6 +9,8 @@ Supported chips: |
57 | Socket S1G3: Athlon II, Sempron, Turion II |
58 | * AMD Family 11h processors: |
59 | Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra) |
60 | +* AMD Family 12h processors: "Llano" |
61 | +* AMD Family 14h processors: "Brazos" (C/E/G-Series) |
62 | |
63 | Prefix: 'k10temp' |
64 | Addresses scanned: PCI space |
65 | @@ -17,10 +19,14 @@ Supported chips: |
66 | http://support.amd.com/us/Processor_TechDocs/31116.pdf |
67 | BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors: |
68 | http://support.amd.com/us/Processor_TechDocs/41256.pdf |
69 | + BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors: |
70 | + http://support.amd.com/us/Processor_TechDocs/43170.pdf |
71 | Revision Guide for AMD Family 10h Processors: |
72 | http://support.amd.com/us/Processor_TechDocs/41322.pdf |
73 | Revision Guide for AMD Family 11h Processors: |
74 | http://support.amd.com/us/Processor_TechDocs/41788.pdf |
75 | + Revision Guide for AMD Family 14h Models 00h-0Fh Processors: |
76 | + http://support.amd.com/us/Processor_TechDocs/47534.pdf |
77 | AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks: |
78 | http://support.amd.com/us/Processor_TechDocs/43373.pdf |
79 | AMD Family 10h Server and Workstation Processor Power and Thermal Data Sheet: |
80 | @@ -34,7 +40,7 @@ Description |
81 | ----------- |
82 | |
83 | This driver permits reading of the internal temperature sensor of AMD |
84 | -Family 10h and 11h processors. |
85 | +Family 10h/11h/12h/14h processors. |
86 | |
87 | All these processors have a sensor, but on those for Socket F or AM2+, |
88 | the sensor may return inconsistent values (erratum 319). The driver |
89 | diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c |
90 | index 907d5a6..abaf844 100644 |
91 | --- a/arch/arm/kernel/signal.c |
92 | +++ b/arch/arm/kernel/signal.c |
93 | @@ -474,7 +474,9 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, |
94 | unsigned long handler = (unsigned long)ka->sa.sa_handler; |
95 | unsigned long retcode; |
96 | int thumb = 0; |
97 | - unsigned long cpsr = regs->ARM_cpsr & ~PSR_f; |
98 | + unsigned long cpsr = regs->ARM_cpsr & ~(PSR_f | PSR_E_BIT); |
99 | + |
100 | + cpsr |= PSR_ENDSTATE; |
101 | |
102 | /* |
103 | * Maybe we need to deliver a 32-bit signal to a 26-bit task. |
104 | diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S |
105 | index cead889..223ba96 100644 |
106 | --- a/arch/arm/kernel/vmlinux.lds.S |
107 | +++ b/arch/arm/kernel/vmlinux.lds.S |
108 | @@ -21,6 +21,12 @@ |
109 | #define ARM_CPU_KEEP(x) |
110 | #endif |
111 | |
112 | +#if defined(CONFIG_SMP_ON_UP) && !defined(CONFIG_DEBUG_SPINLOCK) |
113 | +#define ARM_EXIT_KEEP(x) x |
114 | +#else |
115 | +#define ARM_EXIT_KEEP(x) |
116 | +#endif |
117 | + |
118 | OUTPUT_ARCH(arm) |
119 | ENTRY(stext) |
120 | |
121 | @@ -43,6 +49,7 @@ SECTIONS |
122 | _sinittext = .; |
123 | HEAD_TEXT |
124 | INIT_TEXT |
125 | + ARM_EXIT_KEEP(EXIT_TEXT) |
126 | _einittext = .; |
127 | ARM_CPU_DISCARD(PROC_INFO) |
128 | __arch_info_begin = .; |
129 | @@ -67,6 +74,7 @@ SECTIONS |
130 | #ifndef CONFIG_XIP_KERNEL |
131 | __init_begin = _stext; |
132 | INIT_DATA |
133 | + ARM_EXIT_KEEP(EXIT_DATA) |
134 | #endif |
135 | } |
136 | |
137 | @@ -161,6 +169,7 @@ SECTIONS |
138 | . = ALIGN(PAGE_SIZE); |
139 | __init_begin = .; |
140 | INIT_DATA |
141 | + ARM_EXIT_KEEP(EXIT_DATA) |
142 | . = ALIGN(PAGE_SIZE); |
143 | __init_end = .; |
144 | #endif |
145 | diff --git a/arch/arm/mach-sa1100/simpad.c b/arch/arm/mach-sa1100/simpad.c |
146 | index 27692d0..cfb7607 100644 |
147 | --- a/arch/arm/mach-sa1100/simpad.c |
148 | +++ b/arch/arm/mach-sa1100/simpad.c |
149 | @@ -166,9 +166,6 @@ static void __init simpad_map_io(void) |
150 | PCFR = 0; |
151 | PSDR = 0; |
152 | |
153 | - sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, |
154 | - ARRAY_SIZE(simpad_flash_resources)); |
155 | - sa11x0_register_mcp(&simpad_mcp_data); |
156 | } |
157 | |
158 | static void simpad_power_off(void) |
159 | @@ -216,6 +213,10 @@ static int __init simpad_init(void) |
160 | |
161 | pm_power_off = simpad_power_off; |
162 | |
163 | + sa11x0_register_mtd(&simpad_flash_data, simpad_flash_resources, |
164 | + ARRAY_SIZE(simpad_flash_resources)); |
165 | + sa11x0_register_mcp(&simpad_mcp_data); |
166 | + |
167 | ret = platform_add_devices(devices, ARRAY_SIZE(devices)); |
168 | if(ret) |
169 | printk(KERN_WARNING "simpad: Unable to register mq200 framebuffer device"); |
170 | diff --git a/arch/s390/include/asm/processor.h b/arch/s390/include/asm/processor.h |
171 | index 8d6f871..b7cbfab 100644 |
172 | --- a/arch/s390/include/asm/processor.h |
173 | +++ b/arch/s390/include/asm/processor.h |
174 | @@ -148,11 +148,6 @@ extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); |
175 | */ |
176 | extern unsigned long thread_saved_pc(struct task_struct *t); |
177 | |
178 | -/* |
179 | - * Print register of task into buffer. Used in fs/proc/array.c. |
180 | - */ |
181 | -extern void task_show_regs(struct seq_file *m, struct task_struct *task); |
182 | - |
183 | extern void show_code(struct pt_regs *regs); |
184 | |
185 | unsigned long get_wchan(struct task_struct *p); |
186 | diff --git a/arch/s390/kernel/traps.c b/arch/s390/kernel/traps.c |
187 | index 7064082..5aa4183 100644 |
188 | --- a/arch/s390/kernel/traps.c |
189 | +++ b/arch/s390/kernel/traps.c |
190 | @@ -237,43 +237,6 @@ void show_regs(struct pt_regs *regs) |
191 | show_last_breaking_event(regs); |
192 | } |
193 | |
194 | -/* This is called from fs/proc/array.c */ |
195 | -void task_show_regs(struct seq_file *m, struct task_struct *task) |
196 | -{ |
197 | - struct pt_regs *regs; |
198 | - |
199 | - regs = task_pt_regs(task); |
200 | - seq_printf(m, "task: %p, ksp: %p\n", |
201 | - task, (void *)task->thread.ksp); |
202 | - seq_printf(m, "User PSW : %p %p\n", |
203 | - (void *) regs->psw.mask, (void *)regs->psw.addr); |
204 | - |
205 | - seq_printf(m, "User GPRS: " FOURLONG, |
206 | - regs->gprs[0], regs->gprs[1], |
207 | - regs->gprs[2], regs->gprs[3]); |
208 | - seq_printf(m, " " FOURLONG, |
209 | - regs->gprs[4], regs->gprs[5], |
210 | - regs->gprs[6], regs->gprs[7]); |
211 | - seq_printf(m, " " FOURLONG, |
212 | - regs->gprs[8], regs->gprs[9], |
213 | - regs->gprs[10], regs->gprs[11]); |
214 | - seq_printf(m, " " FOURLONG, |
215 | - regs->gprs[12], regs->gprs[13], |
216 | - regs->gprs[14], regs->gprs[15]); |
217 | - seq_printf(m, "User ACRS: %08x %08x %08x %08x\n", |
218 | - task->thread.acrs[0], task->thread.acrs[1], |
219 | - task->thread.acrs[2], task->thread.acrs[3]); |
220 | - seq_printf(m, " %08x %08x %08x %08x\n", |
221 | - task->thread.acrs[4], task->thread.acrs[5], |
222 | - task->thread.acrs[6], task->thread.acrs[7]); |
223 | - seq_printf(m, " %08x %08x %08x %08x\n", |
224 | - task->thread.acrs[8], task->thread.acrs[9], |
225 | - task->thread.acrs[10], task->thread.acrs[11]); |
226 | - seq_printf(m, " %08x %08x %08x %08x\n", |
227 | - task->thread.acrs[12], task->thread.acrs[13], |
228 | - task->thread.acrs[14], task->thread.acrs[15]); |
229 | -} |
230 | - |
231 | static DEFINE_SPINLOCK(die_lock); |
232 | |
233 | void die(const char * str, struct pt_regs * regs, long err) |
234 | diff --git a/arch/x86/include/asm/cpu.h b/arch/x86/include/asm/cpu.h |
235 | index 4fab24d..4564c8e 100644 |
236 | --- a/arch/x86/include/asm/cpu.h |
237 | +++ b/arch/x86/include/asm/cpu.h |
238 | @@ -32,5 +32,6 @@ extern void arch_unregister_cpu(int); |
239 | |
240 | DECLARE_PER_CPU(int, cpu_state); |
241 | |
242 | +int mwait_usable(const struct cpuinfo_x86 *); |
243 | |
244 | #endif /* _ASM_X86_CPU_H */ |
245 | diff --git a/arch/x86/kernel/apb_timer.c b/arch/x86/kernel/apb_timer.c |
246 | index 92543c7..5181673 100644 |
247 | --- a/arch/x86/kernel/apb_timer.c |
248 | +++ b/arch/x86/kernel/apb_timer.c |
249 | @@ -313,10 +313,12 @@ static void apbt_setup_irq(struct apbt_dev *adev) |
250 | if (adev->irq == 0) |
251 | return; |
252 | |
253 | + irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT); |
254 | + irq_set_affinity(adev->irq, cpumask_of(adev->cpu)); |
255 | + /* APB timer irqs are set up as mp_irqs, timer is edge type */ |
256 | + __set_irq_handler(adev->irq, handle_edge_irq, 0, "edge"); |
257 | + |
258 | if (system_state == SYSTEM_BOOTING) { |
259 | - irq_modify_status(adev->irq, 0, IRQ_MOVE_PCNTXT); |
260 | - /* APB timer irqs are set up as mp_irqs, timer is edge type */ |
261 | - __set_irq_handler(adev->irq, handle_edge_irq, 0, "edge"); |
262 | if (request_irq(adev->irq, apbt_interrupt_handler, |
263 | IRQF_TIMER | IRQF_DISABLED | IRQF_NOBALANCING, |
264 | adev->name, adev)) { |
265 | diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c |
266 | index 96656f2..5206bb9 100644 |
267 | --- a/arch/x86/kernel/irq_32.c |
268 | +++ b/arch/x86/kernel/irq_32.c |
269 | @@ -129,8 +129,7 @@ void __cpuinit irq_ctx_init(int cpu) |
270 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
271 | THREAD_FLAGS, |
272 | THREAD_ORDER)); |
273 | - irqctx->tinfo.task = NULL; |
274 | - irqctx->tinfo.exec_domain = NULL; |
275 | + memset(&irqctx->tinfo, 0, sizeof(struct thread_info)); |
276 | irqctx->tinfo.cpu = cpu; |
277 | irqctx->tinfo.preempt_count = HARDIRQ_OFFSET; |
278 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); |
279 | @@ -140,10 +139,8 @@ void __cpuinit irq_ctx_init(int cpu) |
280 | irqctx = page_address(alloc_pages_node(cpu_to_node(cpu), |
281 | THREAD_FLAGS, |
282 | THREAD_ORDER)); |
283 | - irqctx->tinfo.task = NULL; |
284 | - irqctx->tinfo.exec_domain = NULL; |
285 | + memset(&irqctx->tinfo, 0, sizeof(struct thread_info)); |
286 | irqctx->tinfo.cpu = cpu; |
287 | - irqctx->tinfo.preempt_count = 0; |
288 | irqctx->tinfo.addr_limit = MAKE_MM_SEG(0); |
289 | |
290 | per_cpu(softirq_ctx, cpu) = irqctx; |
291 | diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c |
292 | index 2502aaf..12d4bf1 100644 |
293 | --- a/arch/x86/kernel/process.c |
294 | +++ b/arch/x86/kernel/process.c |
295 | @@ -14,6 +14,7 @@ |
296 | #include <linux/utsname.h> |
297 | #include <trace/events/power.h> |
298 | #include <linux/hw_breakpoint.h> |
299 | +#include <asm/cpu.h> |
300 | #include <asm/system.h> |
301 | #include <asm/apic.h> |
302 | #include <asm/syscalls.h> |
303 | @@ -509,13 +510,13 @@ static void poll_idle(void) |
304 | * |
305 | * idle=mwait overrides this decision and forces the usage of mwait. |
306 | */ |
307 | -static int __cpuinitdata force_mwait; |
308 | +static int force_mwait; |
309 | |
310 | #define MWAIT_INFO 0x05 |
311 | #define MWAIT_ECX_EXTENDED_INFO 0x01 |
312 | #define MWAIT_EDX_C1 0xf0 |
313 | |
314 | -static int __cpuinit mwait_usable(const struct cpuinfo_x86 *c) |
315 | +int mwait_usable(const struct cpuinfo_x86 *c) |
316 | { |
317 | u32 eax, ebx, ecx, edx; |
318 | |
319 | diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c |
320 | index 083e99d..d8fd571 100644 |
321 | --- a/arch/x86/kernel/smpboot.c |
322 | +++ b/arch/x86/kernel/smpboot.c |
323 | @@ -1396,8 +1396,9 @@ static inline void mwait_play_dead(void) |
324 | unsigned int highest_subcstate = 0; |
325 | int i; |
326 | void *mwait_ptr; |
327 | + struct cpuinfo_x86 *c = ¤t_cpu_data; |
328 | |
329 | - if (!cpu_has(¤t_cpu_data, X86_FEATURE_MWAIT)) |
330 | + if (!(cpu_has(c, X86_FEATURE_MWAIT) && mwait_usable(c))) |
331 | return; |
332 | if (!cpu_has(¤t_cpu_data, X86_FEATURE_CLFLSH)) |
333 | return; |
334 | diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c |
335 | index 44924e5..198df8d 100644 |
336 | --- a/arch/x86/xen/mmu.c |
337 | +++ b/arch/x86/xen/mmu.c |
338 | @@ -395,6 +395,18 @@ void __init xen_build_dynamic_phys_to_machine(void) |
339 | p2m_top[topidx] = mid; |
340 | } |
341 | |
342 | + /* |
343 | + * As long as the mfn_list has enough entries to completely |
344 | + * fill a p2m page, pointing into the array is ok. But if |
345 | + * not the entries beyond the last pfn will be undefined. |
346 | + */ |
347 | + if (unlikely(pfn + P2M_PER_PAGE > max_pfn)) { |
348 | + unsigned long p2midx; |
349 | + |
350 | + p2midx = max_pfn % P2M_PER_PAGE; |
351 | + for ( ; p2midx < P2M_PER_PAGE; p2midx++) |
352 | + mfn_list[pfn + p2midx] = INVALID_P2M_ENTRY; |
353 | + } |
354 | p2m_top[topidx][mididx] = &mfn_list[pfn]; |
355 | } |
356 | } |
357 | diff --git a/drivers/acpi/wakeup.c b/drivers/acpi/wakeup.c |
358 | index f62a50c..3f3ab8f 100644 |
359 | --- a/drivers/acpi/wakeup.c |
360 | +++ b/drivers/acpi/wakeup.c |
361 | @@ -84,8 +84,12 @@ int __init acpi_wakeup_device_init(void) |
362 | struct acpi_device *dev = container_of(node, |
363 | struct acpi_device, |
364 | wakeup_list); |
365 | - if (dev->wakeup.flags.always_enabled) |
366 | + if (dev->wakeup.flags.always_enabled) { |
367 | + /* Button GPEs are supposed to be always enabled. */ |
368 | + acpi_enable_gpe(dev->wakeup.gpe_device, |
369 | + dev->wakeup.gpe_number); |
370 | dev->wakeup.state.enabled = 1; |
371 | + } |
372 | } |
373 | mutex_unlock(&acpi_device_lock); |
374 | return 0; |
375 | diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c |
376 | index 55d0466..d5284bc 100644 |
377 | --- a/drivers/char/tpm/tpm.c |
378 | +++ b/drivers/char/tpm/tpm.c |
379 | @@ -577,11 +577,9 @@ duration: |
380 | if (rc) |
381 | return; |
382 | |
383 | - if (be32_to_cpu(tpm_cmd.header.out.return_code) != 0 || |
384 | - be32_to_cpu(tpm_cmd.header.out.length) |
385 | - != sizeof(tpm_cmd.header.out) + sizeof(u32) + 3 * sizeof(u32)) |
386 | + if (be32_to_cpu(tpm_cmd.header.out.return_code) |
387 | + != 3 * sizeof(u32)) |
388 | return; |
389 | - |
390 | duration_cap = &tpm_cmd.params.getcap_out.cap.duration; |
391 | chip->vendor.duration[TPM_SHORT] = |
392 | usecs_to_jiffies(be32_to_cpu(duration_cap->tpm_short)); |
393 | @@ -925,18 +923,6 @@ ssize_t tpm_show_caps_1_2(struct device * dev, |
394 | } |
395 | EXPORT_SYMBOL_GPL(tpm_show_caps_1_2); |
396 | |
397 | -ssize_t tpm_show_timeouts(struct device *dev, struct device_attribute *attr, |
398 | - char *buf) |
399 | -{ |
400 | - struct tpm_chip *chip = dev_get_drvdata(dev); |
401 | - |
402 | - return sprintf(buf, "%d %d %d\n", |
403 | - jiffies_to_usecs(chip->vendor.duration[TPM_SHORT]), |
404 | - jiffies_to_usecs(chip->vendor.duration[TPM_MEDIUM]), |
405 | - jiffies_to_usecs(chip->vendor.duration[TPM_LONG])); |
406 | -} |
407 | -EXPORT_SYMBOL_GPL(tpm_show_timeouts); |
408 | - |
409 | ssize_t tpm_store_cancel(struct device *dev, struct device_attribute *attr, |
410 | const char *buf, size_t count) |
411 | { |
412 | diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h |
413 | index ba1779c..792868d 100644 |
414 | --- a/drivers/char/tpm/tpm.h |
415 | +++ b/drivers/char/tpm/tpm.h |
416 | @@ -56,8 +56,6 @@ extern ssize_t tpm_show_owned(struct device *, struct device_attribute *attr, |
417 | char *); |
418 | extern ssize_t tpm_show_temp_deactivated(struct device *, |
419 | struct device_attribute *attr, char *); |
420 | -extern ssize_t tpm_show_timeouts(struct device *, |
421 | - struct device_attribute *attr, char *); |
422 | |
423 | struct tpm_chip; |
424 | |
425 | diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c |
426 | index 0d1d38e..dd21df5 100644 |
427 | --- a/drivers/char/tpm/tpm_tis.c |
428 | +++ b/drivers/char/tpm/tpm_tis.c |
429 | @@ -376,7 +376,6 @@ static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated, |
430 | NULL); |
431 | static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps_1_2, NULL); |
432 | static DEVICE_ATTR(cancel, S_IWUSR | S_IWGRP, NULL, tpm_store_cancel); |
433 | -static DEVICE_ATTR(timeouts, S_IRUGO, tpm_show_timeouts, NULL); |
434 | |
435 | static struct attribute *tis_attrs[] = { |
436 | &dev_attr_pubek.attr, |
437 | @@ -386,8 +385,7 @@ static struct attribute *tis_attrs[] = { |
438 | &dev_attr_owned.attr, |
439 | &dev_attr_temp_deactivated.attr, |
440 | &dev_attr_caps.attr, |
441 | - &dev_attr_cancel.attr, |
442 | - &dev_attr_timeouts.attr, NULL, |
443 | + &dev_attr_cancel.attr, NULL, |
444 | }; |
445 | |
446 | static struct attribute_group tis_attr_grp = { |
447 | diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c |
448 | index c1f13bf..5f08e2c 100644 |
449 | --- a/drivers/gpu/drm/i915/intel_dp.c |
450 | +++ b/drivers/gpu/drm/i915/intel_dp.c |
451 | @@ -1343,17 +1343,24 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) |
452 | struct drm_device *dev = intel_dp->base.base.dev; |
453 | struct drm_i915_private *dev_priv = dev->dev_private; |
454 | bool channel_eq = false; |
455 | - int tries; |
456 | + int tries, cr_tries; |
457 | u32 reg; |
458 | uint32_t DP = intel_dp->DP; |
459 | |
460 | /* channel equalization */ |
461 | tries = 0; |
462 | + cr_tries = 0; |
463 | channel_eq = false; |
464 | for (;;) { |
465 | /* Use intel_dp->train_set[0] to set the voltage and pre emphasis values */ |
466 | uint32_t signal_levels; |
467 | |
468 | + if (cr_tries > 5) { |
469 | + DRM_ERROR("failed to train DP, aborting\n"); |
470 | + intel_dp_link_down(intel_dp); |
471 | + break; |
472 | + } |
473 | + |
474 | if (IS_GEN6(dev) && is_edp(intel_dp)) { |
475 | signal_levels = intel_gen6_edp_signal_levels(intel_dp->train_set[0]); |
476 | DP = (DP & ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB) | signal_levels; |
477 | @@ -1376,14 +1383,26 @@ intel_dp_complete_link_train(struct intel_dp *intel_dp) |
478 | if (!intel_dp_get_link_status(intel_dp)) |
479 | break; |
480 | |
481 | + /* Make sure clock is still ok */ |
482 | + if (!intel_clock_recovery_ok(intel_dp->link_status, intel_dp->lane_count)) { |
483 | + intel_dp_start_link_train(intel_dp); |
484 | + cr_tries++; |
485 | + continue; |
486 | + } |
487 | + |
488 | if (intel_channel_eq_ok(intel_dp)) { |
489 | channel_eq = true; |
490 | break; |
491 | } |
492 | |
493 | - /* Try 5 times */ |
494 | - if (tries > 5) |
495 | - break; |
496 | + /* Try 5 times, then try clock recovery if that fails */ |
497 | + if (tries > 5) { |
498 | + intel_dp_link_down(intel_dp); |
499 | + intel_dp_start_link_train(intel_dp); |
500 | + tries = 0; |
501 | + cr_tries++; |
502 | + continue; |
503 | + } |
504 | |
505 | /* Compute new intel_dp->train_set as requested by target */ |
506 | intel_get_adjust_train(intel_dp); |
507 | diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c |
508 | index 920ca27..c0de519 100644 |
509 | --- a/drivers/gpu/drm/i915/intel_sdvo.c |
510 | +++ b/drivers/gpu/drm/i915/intel_sdvo.c |
511 | @@ -46,6 +46,7 @@ |
512 | SDVO_TV_MASK) |
513 | |
514 | #define IS_TV(c) (c->output_flag & SDVO_TV_MASK) |
515 | +#define IS_TMDS(c) (c->output_flag & SDVO_TMDS_MASK) |
516 | #define IS_LVDS(c) (c->output_flag & SDVO_LVDS_MASK) |
517 | #define IS_TV_OR_LVDS(c) (c->output_flag & (SDVO_TV_MASK | SDVO_LVDS_MASK)) |
518 | |
519 | @@ -1356,7 +1357,8 @@ intel_sdvo_hdmi_sink_detect(struct drm_connector *connector) |
520 | intel_sdvo->has_hdmi_monitor = drm_detect_hdmi_monitor(edid); |
521 | intel_sdvo->has_hdmi_audio = drm_detect_monitor_audio(edid); |
522 | } |
523 | - } |
524 | + } else |
525 | + status = connector_status_disconnected; |
526 | connector->display_info.raw_edid = NULL; |
527 | kfree(edid); |
528 | } |
529 | @@ -1404,10 +1406,25 @@ intel_sdvo_detect(struct drm_connector *connector, bool force) |
530 | |
531 | if ((intel_sdvo_connector->output_flag & response) == 0) |
532 | ret = connector_status_disconnected; |
533 | - else if (response & SDVO_TMDS_MASK) |
534 | + else if (IS_TMDS(intel_sdvo_connector)) |
535 | ret = intel_sdvo_hdmi_sink_detect(connector); |
536 | - else |
537 | - ret = connector_status_connected; |
538 | + else { |
539 | + struct edid *edid; |
540 | + |
541 | + /* if we have an edid check it matches the connection */ |
542 | + edid = intel_sdvo_get_edid(connector); |
543 | + if (edid == NULL) |
544 | + edid = intel_sdvo_get_analog_edid(connector); |
545 | + if (edid != NULL) { |
546 | + if (edid->input & DRM_EDID_INPUT_DIGITAL) |
547 | + ret = connector_status_disconnected; |
548 | + else |
549 | + ret = connector_status_connected; |
550 | + connector->display_info.raw_edid = NULL; |
551 | + kfree(edid); |
552 | + } else |
553 | + ret = connector_status_connected; |
554 | + } |
555 | |
556 | /* May update encoder flag for like clock for SDVO TV, etc.*/ |
557 | if (ret == connector_status_connected) { |
558 | @@ -1443,10 +1460,15 @@ static void intel_sdvo_get_ddc_modes(struct drm_connector *connector) |
559 | edid = intel_sdvo_get_analog_edid(connector); |
560 | |
561 | if (edid != NULL) { |
562 | - if (edid->input & DRM_EDID_INPUT_DIGITAL) { |
563 | + struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); |
564 | + bool monitor_is_digital = !!(edid->input & DRM_EDID_INPUT_DIGITAL); |
565 | + bool connector_is_digital = !!IS_TMDS(intel_sdvo_connector); |
566 | + |
567 | + if (connector_is_digital == monitor_is_digital) { |
568 | drm_mode_connector_update_edid_property(connector, edid); |
569 | drm_add_edid_modes(connector, edid); |
570 | } |
571 | + |
572 | connector->display_info.raw_edid = NULL; |
573 | kfree(edid); |
574 | } |
575 | diff --git a/drivers/gpu/drm/nouveau/Kconfig b/drivers/gpu/drm/nouveau/Kconfig |
576 | index 72730e9..21d6c29 100644 |
577 | --- a/drivers/gpu/drm/nouveau/Kconfig |
578 | +++ b/drivers/gpu/drm/nouveau/Kconfig |
579 | @@ -10,7 +10,7 @@ config DRM_NOUVEAU |
580 | select FB |
581 | select FRAMEBUFFER_CONSOLE if !EMBEDDED |
582 | select FB_BACKLIGHT if DRM_NOUVEAU_BACKLIGHT |
583 | - select ACPI_VIDEO if ACPI |
584 | + select ACPI_VIDEO if ACPI && X86 && BACKLIGHT_CLASS_DEVICE && VIDEO_OUTPUT_CONTROL && INPUT |
585 | help |
586 | Choose this option for open-source nVidia support. |
587 | |
588 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c |
589 | index 6b7fc4b..ee14b8a 100644 |
590 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c |
591 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c |
592 | @@ -514,7 +514,6 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, |
593 | pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; |
594 | else |
595 | pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV; |
596 | - |
597 | } |
598 | |
599 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
600 | @@ -531,29 +530,28 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, |
601 | dp_clock = dig_connector->dp_clock; |
602 | } |
603 | } |
604 | -/* this might work properly with the new pll algo */ |
605 | -#if 0 /* doesn't work properly on some laptops */ |
606 | + |
607 | /* use recommended ref_div for ss */ |
608 | if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) { |
609 | if (ss_enabled) { |
610 | if (ss->refdiv) { |
611 | + pll->flags |= RADEON_PLL_PREFER_MINM_OVER_MAXP; |
612 | pll->flags |= RADEON_PLL_USE_REF_DIV; |
613 | pll->reference_div = ss->refdiv; |
614 | + if (ASIC_IS_AVIVO(rdev)) |
615 | + pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; |
616 | } |
617 | } |
618 | } |
619 | -#endif |
620 | + |
621 | if (ASIC_IS_AVIVO(rdev)) { |
622 | /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */ |
623 | if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1) |
624 | adjusted_clock = mode->clock * 2; |
625 | if (radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)) |
626 | pll->flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; |
627 | - /* rv515 needs more testing with this option */ |
628 | - if (rdev->family != CHIP_RV515) { |
629 | - if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) |
630 | - pll->flags |= RADEON_PLL_IS_LCD; |
631 | - } |
632 | + if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) |
633 | + pll->flags |= RADEON_PLL_IS_LCD; |
634 | } else { |
635 | if (encoder->encoder_type != DRM_MODE_ENCODER_DAC) |
636 | pll->flags |= RADEON_PLL_NO_ODD_POST_DIV; |
637 | @@ -652,10 +650,12 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, |
638 | index, (uint32_t *)&args); |
639 | adjusted_clock = le32_to_cpu(args.v3.sOutput.ulDispPllFreq) * 10; |
640 | if (args.v3.sOutput.ucRefDiv) { |
641 | + pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; |
642 | pll->flags |= RADEON_PLL_USE_REF_DIV; |
643 | pll->reference_div = args.v3.sOutput.ucRefDiv; |
644 | } |
645 | if (args.v3.sOutput.ucPostDiv) { |
646 | + pll->flags |= RADEON_PLL_USE_FRAC_FB_DIV; |
647 | pll->flags |= RADEON_PLL_USE_POST_DIV; |
648 | pll->post_div = args.v3.sOutput.ucPostDiv; |
649 | } |
650 | @@ -921,11 +921,7 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode |
651 | /* adjust pixel clock as needed */ |
652 | adjusted_clock = atombios_adjust_pll(crtc, mode, pll, ss_enabled, &ss); |
653 | |
654 | - /* rv515 seems happier with the old algo */ |
655 | - if (rdev->family == CHIP_RV515) |
656 | - radeon_compute_pll_legacy(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
657 | - &ref_div, &post_div); |
658 | - else if (ASIC_IS_AVIVO(rdev)) |
659 | + if (ASIC_IS_AVIVO(rdev)) |
660 | radeon_compute_pll_avivo(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, |
661 | &ref_div, &post_div); |
662 | else |
663 | @@ -959,9 +955,9 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode |
664 | } |
665 | } |
666 | |
667 | -static int evergreen_crtc_do_set_base(struct drm_crtc *crtc, |
668 | - struct drm_framebuffer *fb, |
669 | - int x, int y, int atomic) |
670 | +static int dce4_crtc_do_set_base(struct drm_crtc *crtc, |
671 | + struct drm_framebuffer *fb, |
672 | + int x, int y, int atomic) |
673 | { |
674 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
675 | struct drm_device *dev = crtc->dev; |
676 | @@ -1093,12 +1089,6 @@ static int evergreen_crtc_do_set_base(struct drm_crtc *crtc, |
677 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
678 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
679 | |
680 | - if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) |
681 | - WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, |
682 | - EVERGREEN_INTERLEAVE_EN); |
683 | - else |
684 | - WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0); |
685 | - |
686 | if (!atomic && fb && fb != crtc->fb) { |
687 | radeon_fb = to_radeon_framebuffer(fb); |
688 | rbo = radeon_fb->obj->driver_private; |
689 | @@ -1247,12 +1237,6 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc, |
690 | WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
691 | (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); |
692 | |
693 | - if (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) |
694 | - WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, |
695 | - AVIVO_D1MODE_INTERLEAVE_EN); |
696 | - else |
697 | - WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0); |
698 | - |
699 | if (!atomic && fb && fb != crtc->fb) { |
700 | radeon_fb = to_radeon_framebuffer(fb); |
701 | rbo = radeon_fb->obj->driver_private; |
702 | @@ -1276,7 +1260,7 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
703 | struct radeon_device *rdev = dev->dev_private; |
704 | |
705 | if (ASIC_IS_DCE4(rdev)) |
706 | - return evergreen_crtc_do_set_base(crtc, old_fb, x, y, 0); |
707 | + return dce4_crtc_do_set_base(crtc, old_fb, x, y, 0); |
708 | else if (ASIC_IS_AVIVO(rdev)) |
709 | return avivo_crtc_do_set_base(crtc, old_fb, x, y, 0); |
710 | else |
711 | @@ -1291,7 +1275,7 @@ int atombios_crtc_set_base_atomic(struct drm_crtc *crtc, |
712 | struct radeon_device *rdev = dev->dev_private; |
713 | |
714 | if (ASIC_IS_DCE4(rdev)) |
715 | - return evergreen_crtc_do_set_base(crtc, fb, x, y, 1); |
716 | + return dce4_crtc_do_set_base(crtc, fb, x, y, 1); |
717 | else if (ASIC_IS_AVIVO(rdev)) |
718 | return avivo_crtc_do_set_base(crtc, fb, x, y, 1); |
719 | else |
720 | diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c |
721 | index 7831e08..153095f 100644 |
722 | --- a/drivers/gpu/drm/radeon/r600_cs.c |
723 | +++ b/drivers/gpu/drm/radeon/r600_cs.c |
724 | @@ -295,17 +295,18 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) |
725 | } |
726 | |
727 | if (!IS_ALIGNED(pitch, pitch_align)) { |
728 | - dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", |
729 | - __func__, __LINE__, pitch); |
730 | + dev_warn(p->dev, "%s:%d cb pitch (%d, 0x%x, %d) invalid\n", |
731 | + __func__, __LINE__, pitch, pitch_align, array_mode); |
732 | return -EINVAL; |
733 | } |
734 | if (!IS_ALIGNED(height, height_align)) { |
735 | - dev_warn(p->dev, "%s:%d cb height (%d) invalid\n", |
736 | - __func__, __LINE__, height); |
737 | + dev_warn(p->dev, "%s:%d cb height (%d, 0x%x, %d) invalid\n", |
738 | + __func__, __LINE__, height, height_align, array_mode); |
739 | return -EINVAL; |
740 | } |
741 | if (!IS_ALIGNED(base_offset, base_align)) { |
742 | - dev_warn(p->dev, "%s offset[%d] 0x%llx not aligned\n", __func__, i, base_offset); |
743 | + dev_warn(p->dev, "%s offset[%d] 0x%llx 0x%llx, %d not aligned\n", __func__, i, |
744 | + base_offset, base_align, array_mode); |
745 | return -EINVAL; |
746 | } |
747 | |
748 | @@ -320,7 +321,10 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i) |
749 | * broken userspace. |
750 | */ |
751 | } else { |
752 | - dev_warn(p->dev, "%s offset[%d] %d %d %lu too big\n", __func__, i, track->cb_color_bo_offset[i], tmp, radeon_bo_size(track->cb_color_bo[i])); |
753 | + dev_warn(p->dev, "%s offset[%d] %d %d %d %lu too big\n", __func__, i, |
754 | + array_mode, |
755 | + track->cb_color_bo_offset[i], tmp, |
756 | + radeon_bo_size(track->cb_color_bo[i])); |
757 | return -EINVAL; |
758 | } |
759 | } |
760 | @@ -455,17 +459,18 @@ static int r600_cs_track_check(struct radeon_cs_parser *p) |
761 | } |
762 | |
763 | if (!IS_ALIGNED(pitch, pitch_align)) { |
764 | - dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n", |
765 | - __func__, __LINE__, pitch); |
766 | + dev_warn(p->dev, "%s:%d db pitch (%d, 0x%x, %d) invalid\n", |
767 | + __func__, __LINE__, pitch, pitch_align, array_mode); |
768 | return -EINVAL; |
769 | } |
770 | if (!IS_ALIGNED(height, height_align)) { |
771 | - dev_warn(p->dev, "%s:%d db height (%d) invalid\n", |
772 | - __func__, __LINE__, height); |
773 | + dev_warn(p->dev, "%s:%d db height (%d, 0x%x, %d) invalid\n", |
774 | + __func__, __LINE__, height, height_align, array_mode); |
775 | return -EINVAL; |
776 | } |
777 | if (!IS_ALIGNED(base_offset, base_align)) { |
778 | - dev_warn(p->dev, "%s offset[%d] 0x%llx not aligned\n", __func__, i, base_offset); |
779 | + dev_warn(p->dev, "%s offset[%d] 0x%llx, 0x%llx, %d not aligned\n", __func__, i, |
780 | + base_offset, base_align, array_mode); |
781 | return -EINVAL; |
782 | } |
783 | |
784 | @@ -473,9 +478,10 @@ static int r600_cs_track_check(struct radeon_cs_parser *p) |
785 | nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1; |
786 | tmp = ntiles * bpe * 64 * nviews; |
787 | if ((tmp + track->db_offset) > radeon_bo_size(track->db_bo)) { |
788 | - dev_warn(p->dev, "z/stencil buffer too small (0x%08X %d %d %d -> %u have %lu)\n", |
789 | - track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset, |
790 | - radeon_bo_size(track->db_bo)); |
791 | + dev_warn(p->dev, "z/stencil buffer (%d) too small (0x%08X %d %d %d -> %u have %lu)\n", |
792 | + array_mode, |
793 | + track->db_depth_size, ntiles, nviews, bpe, tmp + track->db_offset, |
794 | + radeon_bo_size(track->db_bo)); |
795 | return -EINVAL; |
796 | } |
797 | } |
798 | @@ -1227,18 +1233,18 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p, u32 i |
799 | /* XXX check height as well... */ |
800 | |
801 | if (!IS_ALIGNED(pitch, pitch_align)) { |
802 | - dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", |
803 | - __func__, __LINE__, pitch); |
804 | + dev_warn(p->dev, "%s:%d tex pitch (%d, 0x%x, %d) invalid\n", |
805 | + __func__, __LINE__, pitch, pitch_align, G_038000_TILE_MODE(word0)); |
806 | return -EINVAL; |
807 | } |
808 | if (!IS_ALIGNED(base_offset, base_align)) { |
809 | - dev_warn(p->dev, "%s:%d tex base offset (0x%llx) invalid\n", |
810 | - __func__, __LINE__, base_offset); |
811 | + dev_warn(p->dev, "%s:%d tex base offset (0x%llx, 0x%llx, %d) invalid\n", |
812 | + __func__, __LINE__, base_offset, base_align, G_038000_TILE_MODE(word0)); |
813 | return -EINVAL; |
814 | } |
815 | if (!IS_ALIGNED(mip_offset, base_align)) { |
816 | - dev_warn(p->dev, "%s:%d tex mip offset (0x%llx) invalid\n", |
817 | - __func__, __LINE__, mip_offset); |
818 | + dev_warn(p->dev, "%s:%d tex mip offset (0x%llx, 0x%llx, %d) invalid\n", |
819 | + __func__, __LINE__, mip_offset, base_align, G_038000_TILE_MODE(word0)); |
820 | return -EINVAL; |
821 | } |
822 | |
823 | diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c |
824 | index 137b807..57bee7e 100644 |
825 | --- a/drivers/gpu/drm/radeon/radeon_combios.c |
826 | +++ b/drivers/gpu/drm/radeon/radeon_combios.c |
827 | @@ -1503,6 +1503,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) |
828 | (rdev->pdev->subsystem_device == 0x4a48)) { |
829 | /* Mac X800 */ |
830 | rdev->mode_info.connector_table = CT_MAC_X800; |
831 | + } else if ((rdev->pdev->device == 0x4150) && |
832 | + (rdev->pdev->subsystem_vendor == 0x1002) && |
833 | + (rdev->pdev->subsystem_device == 0x4150)) { |
834 | + /* Mac G5 9600 */ |
835 | + rdev->mode_info.connector_table = CT_MAC_G5_9600; |
836 | } else |
837 | #endif /* CONFIG_PPC_PMAC */ |
838 | #ifdef CONFIG_PPC64 |
839 | @@ -2021,6 +2026,48 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) |
840 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, |
841 | &hpd); |
842 | break; |
843 | + case CT_MAC_G5_9600: |
844 | + DRM_INFO("Connector Table: %d (mac g5 9600)\n", |
845 | + rdev->mode_info.connector_table); |
846 | + /* DVI - tv dac, dvo */ |
847 | + ddc_i2c = combios_setup_i2c_bus(rdev, DDC_DVI, 0, 0); |
848 | + hpd.hpd = RADEON_HPD_1; /* ??? */ |
849 | + radeon_add_legacy_encoder(dev, |
850 | + radeon_get_encoder_enum(dev, |
851 | + ATOM_DEVICE_DFP2_SUPPORT, |
852 | + 0), |
853 | + ATOM_DEVICE_DFP2_SUPPORT); |
854 | + radeon_add_legacy_encoder(dev, |
855 | + radeon_get_encoder_enum(dev, |
856 | + ATOM_DEVICE_CRT2_SUPPORT, |
857 | + 2), |
858 | + ATOM_DEVICE_CRT2_SUPPORT); |
859 | + radeon_add_legacy_connector(dev, 0, |
860 | + ATOM_DEVICE_DFP2_SUPPORT | |
861 | + ATOM_DEVICE_CRT2_SUPPORT, |
862 | + DRM_MODE_CONNECTOR_DVII, &ddc_i2c, |
863 | + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, |
864 | + &hpd); |
865 | + /* ADC - primary dac, internal tmds */ |
866 | + ddc_i2c = combios_setup_i2c_bus(rdev, DDC_VGA, 0, 0); |
867 | + hpd.hpd = RADEON_HPD_2; /* ??? */ |
868 | + radeon_add_legacy_encoder(dev, |
869 | + radeon_get_encoder_enum(dev, |
870 | + ATOM_DEVICE_DFP1_SUPPORT, |
871 | + 0), |
872 | + ATOM_DEVICE_DFP1_SUPPORT); |
873 | + radeon_add_legacy_encoder(dev, |
874 | + radeon_get_encoder_enum(dev, |
875 | + ATOM_DEVICE_CRT1_SUPPORT, |
876 | + 1), |
877 | + ATOM_DEVICE_CRT1_SUPPORT); |
878 | + radeon_add_legacy_connector(dev, 1, |
879 | + ATOM_DEVICE_DFP1_SUPPORT | |
880 | + ATOM_DEVICE_CRT1_SUPPORT, |
881 | + DRM_MODE_CONNECTOR_DVII, &ddc_i2c, |
882 | + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I, |
883 | + &hpd); |
884 | + break; |
885 | default: |
886 | DRM_INFO("Connector table: %d (invalid)\n", |
887 | rdev->mode_info.connector_table); |
888 | diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c |
889 | index a26a70d..c7d1fca 100644 |
890 | --- a/drivers/gpu/drm/radeon/radeon_display.c |
891 | +++ b/drivers/gpu/drm/radeon/radeon_display.c |
892 | @@ -461,6 +461,11 @@ static void avivo_get_fb_div(struct radeon_pll *pll, |
893 | tmp *= target_clock; |
894 | *fb_div = tmp / pll->reference_freq; |
895 | *frac_fb_div = tmp % pll->reference_freq; |
896 | + |
897 | + if (*fb_div > pll->max_feedback_div) |
898 | + *fb_div = pll->max_feedback_div; |
899 | + else if (*fb_div < pll->min_feedback_div) |
900 | + *fb_div = pll->min_feedback_div; |
901 | } |
902 | |
903 | static u32 avivo_get_post_div(struct radeon_pll *pll, |
904 | @@ -494,6 +499,11 @@ static u32 avivo_get_post_div(struct radeon_pll *pll, |
905 | post_div--; |
906 | } |
907 | |
908 | + if (post_div > pll->max_post_div) |
909 | + post_div = pll->max_post_div; |
910 | + else if (post_div < pll->min_post_div) |
911 | + post_div = pll->min_post_div; |
912 | + |
913 | return post_div; |
914 | } |
915 | |
916 | diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c |
917 | index 041943d..6a3d063 100644 |
918 | --- a/drivers/gpu/drm/radeon/radeon_encoders.c |
919 | +++ b/drivers/gpu/drm/radeon/radeon_encoders.c |
920 | @@ -1465,11 +1465,21 @@ atombios_apply_encoder_quirks(struct drm_encoder *encoder, |
921 | } |
922 | |
923 | /* set scaler clears this on some chips */ |
924 | - /* XXX check DCE4 */ |
925 | - if (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT))) { |
926 | - if (ASIC_IS_AVIVO(rdev) && (mode->flags & DRM_MODE_FLAG_INTERLACE)) |
927 | - WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, |
928 | - AVIVO_D1MODE_INTERLEAVE_EN); |
929 | + if (ASIC_IS_AVIVO(rdev) && |
930 | + (!(radeon_encoder->active_device & (ATOM_DEVICE_TV_SUPPORT)))) { |
931 | + if (ASIC_IS_DCE4(rdev)) { |
932 | + if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
933 | + WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, |
934 | + EVERGREEN_INTERLEAVE_EN); |
935 | + else |
936 | + WREG32(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0); |
937 | + } else { |
938 | + if (mode->flags & DRM_MODE_FLAG_INTERLACE) |
939 | + WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, |
940 | + AVIVO_D1MODE_INTERLEAVE_EN); |
941 | + else |
942 | + WREG32(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0); |
943 | + } |
944 | } |
945 | } |
946 | |
947 | diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h |
948 | index aa22570..2615e51 100644 |
949 | --- a/drivers/gpu/drm/radeon/radeon_mode.h |
950 | +++ b/drivers/gpu/drm/radeon/radeon_mode.h |
951 | @@ -209,6 +209,7 @@ enum radeon_connector_table { |
952 | CT_EMAC, |
953 | CT_RN50_POWER, |
954 | CT_MAC_X800, |
955 | + CT_MAC_G5_9600, |
956 | }; |
957 | |
958 | enum radeon_dvo_chip { |
959 | diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c |
960 | index 1272e4b..e5b2cf1 100644 |
961 | --- a/drivers/gpu/drm/radeon/radeon_ttm.c |
962 | +++ b/drivers/gpu/drm/radeon/radeon_ttm.c |
963 | @@ -787,9 +787,9 @@ static int radeon_ttm_debugfs_init(struct radeon_device *rdev) |
964 | radeon_mem_types_list[i].show = &radeon_mm_dump_table; |
965 | radeon_mem_types_list[i].driver_features = 0; |
966 | if (i == 0) |
967 | - radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_VRAM].priv; |
968 | + radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_VRAM].priv; |
969 | else |
970 | - radeon_mem_types_list[i].data = &rdev->mman.bdev.man[TTM_PL_TT].priv; |
971 | + radeon_mem_types_list[i].data = rdev->mman.bdev.man[TTM_PL_TT].priv; |
972 | |
973 | } |
974 | /* Add ttm page pool to debugfs */ |
975 | diff --git a/drivers/hid/hid-cando.c b/drivers/hid/hid-cando.c |
976 | index 5925bdc..343c41b 100644 |
977 | --- a/drivers/hid/hid-cando.c |
978 | +++ b/drivers/hid/hid-cando.c |
979 | @@ -236,6 +236,8 @@ static const struct hid_device_id cando_devices[] = { |
980 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, |
981 | USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, |
982 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, |
983 | + USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, |
984 | + { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, |
985 | USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, |
986 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, |
987 | USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, |
988 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
989 | index 88cb04e..52cf7ca 100644 |
990 | --- a/drivers/hid/hid-core.c |
991 | +++ b/drivers/hid/hid-core.c |
992 | @@ -1287,6 +1287,7 @@ static const struct hid_device_id hid_blacklist[] = { |
993 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE) }, |
994 | { HID_USB_DEVICE(USB_VENDOR_ID_BTC, USB_DEVICE_ID_BTC_EMPREX_REMOTE_2) }, |
995 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH) }, |
996 | + { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1) }, |
997 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6) }, |
998 | { HID_USB_DEVICE(USB_VENDOR_ID_CANDO, USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6) }, |
999 | { HID_USB_DEVICE(USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION) }, |
1000 | @@ -1390,6 +1391,7 @@ static const struct hid_device_id hid_blacklist[] = { |
1001 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED, USB_DEVICE_ID_TOPSEED_CYBERLINK) }, |
1002 | { HID_USB_DEVICE(USB_VENDOR_ID_TOPSEED2, USB_DEVICE_ID_TOPSEED2_RF_COMBO) }, |
1003 | { HID_USB_DEVICE(USB_VENDOR_ID_TWINHAN, USB_DEVICE_ID_TWINHAN_IR_REMOTE) }, |
1004 | + { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, |
1005 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_PF1209) }, |
1006 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP4030U) }, |
1007 | { HID_USB_DEVICE(USB_VENDOR_ID_UCLOGIC, USB_DEVICE_ID_UCLOGIC_TABLET_WP5540U) }, |
1008 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
1009 | index 3341baa..f04789d 100644 |
1010 | --- a/drivers/hid/hid-ids.h |
1011 | +++ b/drivers/hid/hid-ids.h |
1012 | @@ -135,6 +135,7 @@ |
1013 | |
1014 | #define USB_VENDOR_ID_CANDO 0x2087 |
1015 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH 0x0a01 |
1016 | +#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_10_1 0x0a02 |
1017 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03 |
1018 | #define USB_DEVICE_ID_CANDO_MULTI_TOUCH_15_6 0x0f01 |
1019 | |
1020 | diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c |
1021 | index e6dc151..ed732b7 100644 |
1022 | --- a/drivers/hid/hid-magicmouse.c |
1023 | +++ b/drivers/hid/hid-magicmouse.c |
1024 | @@ -433,6 +433,11 @@ static int magicmouse_input_mapping(struct hid_device *hdev, |
1025 | if (!msc->input) |
1026 | msc->input = hi->input; |
1027 | |
1028 | + /* Magic Trackpad does not give relative data after switching to MT */ |
1029 | + if (hi->input->id.product == USB_DEVICE_ID_APPLE_MAGICTRACKPAD && |
1030 | + field->flags & HID_MAIN_ITEM_RELATIVE) |
1031 | + return -1; |
1032 | + |
1033 | return 0; |
1034 | } |
1035 | |
1036 | diff --git a/drivers/hid/hid-mosart.c b/drivers/hid/hid-mosart.c |
1037 | index ac5421d..251eaa4 100644 |
1038 | --- a/drivers/hid/hid-mosart.c |
1039 | +++ b/drivers/hid/hid-mosart.c |
1040 | @@ -240,6 +240,7 @@ static void mosart_remove(struct hid_device *hdev) |
1041 | static const struct hid_device_id mosart_devices[] = { |
1042 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUS_T91MT) }, |
1043 | { HID_USB_DEVICE(USB_VENDOR_ID_ASUS, USB_DEVICE_ID_ASUSTEK_MULTITOUCH_YFO) }, |
1044 | + { HID_USB_DEVICE(USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART) }, |
1045 | { } |
1046 | }; |
1047 | MODULE_DEVICE_TABLE(hid, mosart_devices); |
1048 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c |
1049 | index 2c18547..af34376 100644 |
1050 | --- a/drivers/hid/usbhid/hid-quirks.c |
1051 | +++ b/drivers/hid/usbhid/hid-quirks.c |
1052 | @@ -35,7 +35,6 @@ static const struct hid_blacklist { |
1053 | { USB_VENDOR_ID_CHIC, USB_DEVICE_ID_CHIC_GAMEPAD, HID_QUIRK_BADPAD }, |
1054 | { USB_VENDOR_ID_DWAV, USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER, HID_QUIRK_MULTI_INPUT | HID_QUIRK_NOGET }, |
1055 | { USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER, HID_QUIRK_MULTI_INPUT }, |
1056 | - { USB_VENDOR_ID_TURBOX, USB_DEVICE_ID_TURBOX_TOUCHSCREEN_MOSART, HID_QUIRK_MULTI_INPUT }, |
1057 | { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_DRIVING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, |
1058 | { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FLYING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, |
1059 | { USB_VENDOR_ID_HAPP, USB_DEVICE_ID_UGCI_FIGHTING, HID_QUIRK_BADPAD | HID_QUIRK_MULTI_INPUT }, |
1060 | diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig |
1061 | index a56f6ad..004ff55 100644 |
1062 | --- a/drivers/hwmon/Kconfig |
1063 | +++ b/drivers/hwmon/Kconfig |
1064 | @@ -238,13 +238,13 @@ config SENSORS_K8TEMP |
1065 | will be called k8temp. |
1066 | |
1067 | config SENSORS_K10TEMP |
1068 | - tristate "AMD Phenom/Sempron/Turion/Opteron temperature sensor" |
1069 | + tristate "AMD Family 10h/11h/12h/14h temperature sensor" |
1070 | depends on X86 && PCI |
1071 | help |
1072 | If you say yes here you get support for the temperature |
1073 | sensor(s) inside your CPU. Supported are later revisions of |
1074 | - the AMD Family 10h and all revisions of the AMD Family 11h |
1075 | - microarchitectures. |
1076 | + the AMD Family 10h and all revisions of the AMD Family 11h, |
1077 | + 12h (Llano), and 14h (Brazos) microarchitectures. |
1078 | |
1079 | This driver can also be built as a module. If so, the module |
1080 | will be called k10temp. |
1081 | @@ -445,13 +445,14 @@ config SENSORS_JZ4740 |
1082 | called jz4740-hwmon. |
1083 | |
1084 | config SENSORS_JC42 |
1085 | - tristate "JEDEC JC42.4 compliant temperature sensors" |
1086 | + tristate "JEDEC JC42.4 compliant memory module temperature sensors" |
1087 | depends on I2C |
1088 | help |
1089 | - If you say yes here you get support for Jedec JC42.4 compliant |
1090 | - temperature sensors. Support will include, but not be limited to, |
1091 | - ADT7408, CAT34TS02,, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243, |
1092 | - MCP9843, SE97, SE98, STTS424, TSE2002B3, and TS3000B3. |
1093 | + If you say yes here, you get support for JEDEC JC42.4 compliant |
1094 | + temperature sensors, which are used on many DDR3 memory modules for |
1095 | + mobile devices and servers. Support will include, but not be limited |
1096 | + to, ADT7408, CAT34TS02, CAT6095, MAX6604, MCP9805, MCP98242, MCP98243, |
1097 | + MCP9843, SE97, SE98, STTS424(E), TSE2002B3, and TS3000B3. |
1098 | |
1099 | This driver can also be built as a module. If so, the module |
1100 | will be called jc42. |
1101 | @@ -564,7 +565,7 @@ config SENSORS_LM85 |
1102 | help |
1103 | If you say yes here you get support for National Semiconductor LM85 |
1104 | sensor chips and clones: ADM1027, ADT7463, ADT7468, EMC6D100, |
1105 | - EMC6D101 and EMC6D102. |
1106 | + EMC6D101, EMC6D102, and EMC6D103. |
1107 | |
1108 | This driver can also be built as a module. If so, the module |
1109 | will be called lm85. |
1110 | diff --git a/drivers/hwmon/jc42.c b/drivers/hwmon/jc42.c |
1111 | index 340fc78..9349912 100644 |
1112 | --- a/drivers/hwmon/jc42.c |
1113 | +++ b/drivers/hwmon/jc42.c |
1114 | @@ -53,6 +53,8 @@ static const unsigned short normal_i2c[] = { |
1115 | |
1116 | /* Configuration register defines */ |
1117 | #define JC42_CFG_CRIT_ONLY (1 << 2) |
1118 | +#define JC42_CFG_TCRIT_LOCK (1 << 6) |
1119 | +#define JC42_CFG_EVENT_LOCK (1 << 7) |
1120 | #define JC42_CFG_SHUTDOWN (1 << 8) |
1121 | #define JC42_CFG_HYST_SHIFT 9 |
1122 | #define JC42_CFG_HYST_MASK 0x03 |
1123 | @@ -332,7 +334,7 @@ static ssize_t set_temp_crit_hyst(struct device *dev, |
1124 | { |
1125 | struct i2c_client *client = to_i2c_client(dev); |
1126 | struct jc42_data *data = i2c_get_clientdata(client); |
1127 | - long val; |
1128 | + unsigned long val; |
1129 | int diff, hyst; |
1130 | int err; |
1131 | int ret = count; |
1132 | @@ -380,14 +382,14 @@ static ssize_t show_alarm(struct device *dev, |
1133 | |
1134 | static DEVICE_ATTR(temp1_input, S_IRUGO, |
1135 | show_temp_input, NULL); |
1136 | -static DEVICE_ATTR(temp1_crit, S_IWUSR | S_IRUGO, |
1137 | +static DEVICE_ATTR(temp1_crit, S_IRUGO, |
1138 | show_temp_crit, set_temp_crit); |
1139 | -static DEVICE_ATTR(temp1_min, S_IWUSR | S_IRUGO, |
1140 | +static DEVICE_ATTR(temp1_min, S_IRUGO, |
1141 | show_temp_min, set_temp_min); |
1142 | -static DEVICE_ATTR(temp1_max, S_IWUSR | S_IRUGO, |
1143 | +static DEVICE_ATTR(temp1_max, S_IRUGO, |
1144 | show_temp_max, set_temp_max); |
1145 | |
1146 | -static DEVICE_ATTR(temp1_crit_hyst, S_IWUSR | S_IRUGO, |
1147 | +static DEVICE_ATTR(temp1_crit_hyst, S_IRUGO, |
1148 | show_temp_crit_hyst, set_temp_crit_hyst); |
1149 | static DEVICE_ATTR(temp1_max_hyst, S_IRUGO, |
1150 | show_temp_max_hyst, NULL); |
1151 | @@ -412,8 +414,31 @@ static struct attribute *jc42_attributes[] = { |
1152 | NULL |
1153 | }; |
1154 | |
1155 | +static mode_t jc42_attribute_mode(struct kobject *kobj, |
1156 | + struct attribute *attr, int index) |
1157 | +{ |
1158 | + struct device *dev = container_of(kobj, struct device, kobj); |
1159 | + struct i2c_client *client = to_i2c_client(dev); |
1160 | + struct jc42_data *data = i2c_get_clientdata(client); |
1161 | + unsigned int config = data->config; |
1162 | + bool readonly; |
1163 | + |
1164 | + if (attr == &dev_attr_temp1_crit.attr) |
1165 | + readonly = config & JC42_CFG_TCRIT_LOCK; |
1166 | + else if (attr == &dev_attr_temp1_min.attr || |
1167 | + attr == &dev_attr_temp1_max.attr) |
1168 | + readonly = config & JC42_CFG_EVENT_LOCK; |
1169 | + else if (attr == &dev_attr_temp1_crit_hyst.attr) |
1170 | + readonly = config & (JC42_CFG_EVENT_LOCK | JC42_CFG_TCRIT_LOCK); |
1171 | + else |
1172 | + readonly = true; |
1173 | + |
1174 | + return S_IRUGO | (readonly ? 0 : S_IWUSR); |
1175 | +} |
1176 | + |
1177 | static const struct attribute_group jc42_group = { |
1178 | .attrs = jc42_attributes, |
1179 | + .is_visible = jc42_attribute_mode, |
1180 | }; |
1181 | |
1182 | /* Return 0 if detection is successful, -ENODEV otherwise */ |
1183 | diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c |
1184 | index da5a240..82bf65a 100644 |
1185 | --- a/drivers/hwmon/k10temp.c |
1186 | +++ b/drivers/hwmon/k10temp.c |
1187 | @@ -1,5 +1,5 @@ |
1188 | /* |
1189 | - * k10temp.c - AMD Family 10h/11h processor hardware monitoring |
1190 | + * k10temp.c - AMD Family 10h/11h/12h/14h processor hardware monitoring |
1191 | * |
1192 | * Copyright (c) 2009 Clemens Ladisch <clemens@ladisch.de> |
1193 | * |
1194 | @@ -25,7 +25,7 @@ |
1195 | #include <linux/pci.h> |
1196 | #include <asm/processor.h> |
1197 | |
1198 | -MODULE_DESCRIPTION("AMD Family 10h/11h CPU core temperature monitor"); |
1199 | +MODULE_DESCRIPTION("AMD Family 10h/11h/12h/14h CPU core temperature monitor"); |
1200 | MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>"); |
1201 | MODULE_LICENSE("GPL"); |
1202 | |
1203 | @@ -208,6 +208,7 @@ static void __devexit k10temp_remove(struct pci_dev *pdev) |
1204 | static const struct pci_device_id k10temp_id_table[] = { |
1205 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_10H_NB_MISC) }, |
1206 | { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_11H_NB_MISC) }, |
1207 | + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) }, |
1208 | {} |
1209 | }; |
1210 | MODULE_DEVICE_TABLE(pci, k10temp_id_table); |
1211 | diff --git a/drivers/hwmon/lm85.c b/drivers/hwmon/lm85.c |
1212 | index 1e22984..d2cc286 100644 |
1213 | --- a/drivers/hwmon/lm85.c |
1214 | +++ b/drivers/hwmon/lm85.c |
1215 | @@ -41,7 +41,7 @@ static const unsigned short normal_i2c[] = { 0x2c, 0x2d, 0x2e, I2C_CLIENT_END }; |
1216 | enum chips { |
1217 | any_chip, lm85b, lm85c, |
1218 | adm1027, adt7463, adt7468, |
1219 | - emc6d100, emc6d102 |
1220 | + emc6d100, emc6d102, emc6d103 |
1221 | }; |
1222 | |
1223 | /* The LM85 registers */ |
1224 | @@ -90,6 +90,9 @@ enum chips { |
1225 | #define LM85_VERSTEP_EMC6D100_A0 0x60 |
1226 | #define LM85_VERSTEP_EMC6D100_A1 0x61 |
1227 | #define LM85_VERSTEP_EMC6D102 0x65 |
1228 | +#define LM85_VERSTEP_EMC6D103_A0 0x68 |
1229 | +#define LM85_VERSTEP_EMC6D103_A1 0x69 |
1230 | +#define LM85_VERSTEP_EMC6D103S 0x6A /* Also known as EMC6D103:A2 */ |
1231 | |
1232 | #define LM85_REG_CONFIG 0x40 |
1233 | |
1234 | @@ -348,6 +351,7 @@ static const struct i2c_device_id lm85_id[] = { |
1235 | { "emc6d100", emc6d100 }, |
1236 | { "emc6d101", emc6d100 }, |
1237 | { "emc6d102", emc6d102 }, |
1238 | + { "emc6d103", emc6d103 }, |
1239 | { } |
1240 | }; |
1241 | MODULE_DEVICE_TABLE(i2c, lm85_id); |
1242 | @@ -1250,6 +1254,20 @@ static int lm85_detect(struct i2c_client *client, struct i2c_board_info *info) |
1243 | case LM85_VERSTEP_EMC6D102: |
1244 | type_name = "emc6d102"; |
1245 | break; |
1246 | + case LM85_VERSTEP_EMC6D103_A0: |
1247 | + case LM85_VERSTEP_EMC6D103_A1: |
1248 | + type_name = "emc6d103"; |
1249 | + break; |
1250 | + /* |
1251 | + * Registers apparently missing in EMC6D103S/EMC6D103:A2 |
1252 | + * compared to EMC6D103:A0, EMC6D103:A1, and EMC6D102 |
1253 | + * (according to the data sheets), but used unconditionally |
1254 | + * in the driver: 62[5:7], 6D[0:7], and 6E[0:7]. |
1255 | + * So skip EMC6D103S for now. |
1256 | + case LM85_VERSTEP_EMC6D103S: |
1257 | + type_name = "emc6d103s"; |
1258 | + break; |
1259 | + */ |
1260 | } |
1261 | } else { |
1262 | dev_dbg(&adapter->dev, |
1263 | @@ -1283,6 +1301,7 @@ static int lm85_probe(struct i2c_client *client, |
1264 | case adt7468: |
1265 | case emc6d100: |
1266 | case emc6d102: |
1267 | + case emc6d103: |
1268 | data->freq_map = adm1027_freq_map; |
1269 | break; |
1270 | default: |
1271 | @@ -1468,7 +1487,7 @@ static struct lm85_data *lm85_update_device(struct device *dev) |
1272 | /* More alarm bits */ |
1273 | data->alarms |= lm85_read_value(client, |
1274 | EMC6D100_REG_ALARM3) << 16; |
1275 | - } else if (data->type == emc6d102) { |
1276 | + } else if (data->type == emc6d102 || data->type == emc6d103) { |
1277 | /* Have to read LSB bits after the MSB ones because |
1278 | the reading of the MSB bits has frozen the |
1279 | LSBs (backward from the ADM1027). |
1280 | diff --git a/drivers/media/dvb/ttpci/av7110_ca.c b/drivers/media/dvb/ttpci/av7110_ca.c |
1281 | index 122c728..9fc1dd0 100644 |
1282 | --- a/drivers/media/dvb/ttpci/av7110_ca.c |
1283 | +++ b/drivers/media/dvb/ttpci/av7110_ca.c |
1284 | @@ -277,7 +277,7 @@ static int dvb_ca_ioctl(struct file *file, unsigned int cmd, void *parg) |
1285 | { |
1286 | ca_slot_info_t *info=(ca_slot_info_t *)parg; |
1287 | |
1288 | - if (info->num > 1) |
1289 | + if (info->num < 0 || info->num > 1) |
1290 | return -EINVAL; |
1291 | av7110->ci_slot[info->num].num = info->num; |
1292 | av7110->ci_slot[info->num].type = FW_CI_LL_SUPPORT(av7110->arm_app) ? |
1293 | diff --git a/drivers/media/radio/radio-aimslab.c b/drivers/media/radio/radio-aimslab.c |
1294 | index 6cc5d13..4ce10db 100644 |
1295 | --- a/drivers/media/radio/radio-aimslab.c |
1296 | +++ b/drivers/media/radio/radio-aimslab.c |
1297 | @@ -31,6 +31,7 @@ |
1298 | #include <linux/module.h> /* Modules */ |
1299 | #include <linux/init.h> /* Initdata */ |
1300 | #include <linux/ioport.h> /* request_region */ |
1301 | +#include <linux/delay.h> /* msleep */ |
1302 | #include <linux/videodev2.h> /* kernel radio structs */ |
1303 | #include <linux/version.h> /* for KERNEL_VERSION MACRO */ |
1304 | #include <linux/io.h> /* outb, outb_p */ |
1305 | diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c |
1306 | index a3856ed..e8deb8e 100644 |
1307 | --- a/drivers/message/fusion/mptctl.c |
1308 | +++ b/drivers/message/fusion/mptctl.c |
1309 | @@ -597,6 +597,13 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply) |
1310 | } |
1311 | |
1312 | static int |
1313 | +mptctl_release(struct inode *inode, struct file *filep) |
1314 | +{ |
1315 | + fasync_helper(-1, filep, 0, &async_queue); |
1316 | + return 0; |
1317 | +} |
1318 | + |
1319 | +static int |
1320 | mptctl_fasync(int fd, struct file *filep, int mode) |
1321 | { |
1322 | MPT_ADAPTER *ioc; |
1323 | @@ -2815,6 +2822,7 @@ static const struct file_operations mptctl_fops = { |
1324 | .llseek = no_llseek, |
1325 | .fasync = mptctl_fasync, |
1326 | .unlocked_ioctl = mptctl_ioctl, |
1327 | + .release = mptctl_release, |
1328 | #ifdef CONFIG_COMPAT |
1329 | .compat_ioctl = compat_mpctl_ioctl, |
1330 | #endif |
1331 | diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c |
1332 | index 59b8f53..0d9b82a 100644 |
1333 | --- a/drivers/message/fusion/mptscsih.c |
1334 | +++ b/drivers/message/fusion/mptscsih.c |
1335 | @@ -1873,8 +1873,9 @@ mptscsih_abort(struct scsi_cmnd * SCpnt) |
1336 | } |
1337 | |
1338 | out: |
1339 | - printk(MYIOC_s_INFO_FMT "task abort: %s (sc=%p)\n", |
1340 | - ioc->name, ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), SCpnt); |
1341 | + printk(MYIOC_s_INFO_FMT "task abort: %s (rv=%04x) (sc=%p) (sn=%ld)\n", |
1342 | + ioc->name, ((retval == SUCCESS) ? "SUCCESS" : "FAILED"), retval, |
1343 | + SCpnt, SCpnt->serial_number); |
1344 | |
1345 | return retval; |
1346 | } |
1347 | @@ -1911,7 +1912,7 @@ mptscsih_dev_reset(struct scsi_cmnd * SCpnt) |
1348 | |
1349 | vdevice = SCpnt->device->hostdata; |
1350 | if (!vdevice || !vdevice->vtarget) { |
1351 | - retval = SUCCESS; |
1352 | + retval = 0; |
1353 | goto out; |
1354 | } |
1355 | |
1356 | diff --git a/drivers/net/can/janz-ican3.c b/drivers/net/can/janz-ican3.c |
1357 | index 6e533dc..e733f2c 100644 |
1358 | --- a/drivers/net/can/janz-ican3.c |
1359 | +++ b/drivers/net/can/janz-ican3.c |
1360 | @@ -1627,7 +1627,7 @@ static ssize_t ican3_sysfs_set_term(struct device *dev, |
1361 | return count; |
1362 | } |
1363 | |
1364 | -static DEVICE_ATTR(termination, S_IWUGO | S_IRUGO, ican3_sysfs_show_term, |
1365 | +static DEVICE_ATTR(termination, S_IWUSR | S_IRUGO, ican3_sysfs_show_term, |
1366 | ican3_sysfs_set_term); |
1367 | |
1368 | static struct attribute *ican3_sysfs_attrs[] = { |
1369 | diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c |
1370 | index 176e525..e7fe35c 100644 |
1371 | --- a/drivers/net/wireless/iwlwifi/iwl-3945.c |
1372 | +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c |
1373 | @@ -2727,7 +2727,6 @@ static struct iwl_lib_ops iwl3945_lib = { |
1374 | .config_ap = iwl3945_config_ap, |
1375 | .manage_ibss_station = iwl3945_manage_ibss_station, |
1376 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
1377 | - .check_plcp_health = iwl3945_good_plcp_health, |
1378 | |
1379 | .debugfs_ops = { |
1380 | .rx_stats_read = iwl3945_ucode_rx_stats_read, |
1381 | diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c |
1382 | index 63d5042..1539d2c 100644 |
1383 | --- a/drivers/pci/pci-sysfs.c |
1384 | +++ b/drivers/pci/pci-sysfs.c |
1385 | @@ -23,6 +23,7 @@ |
1386 | #include <linux/mm.h> |
1387 | #include <linux/fs.h> |
1388 | #include <linux/capability.h> |
1389 | +#include <linux/security.h> |
1390 | #include <linux/pci-aspm.h> |
1391 | #include <linux/slab.h> |
1392 | #include "pci.h" |
1393 | @@ -368,7 +369,7 @@ pci_read_config(struct file *filp, struct kobject *kobj, |
1394 | u8 *data = (u8*) buf; |
1395 | |
1396 | /* Several chips lock up trying to read undefined config space */ |
1397 | - if (cap_raised(filp->f_cred->cap_effective, CAP_SYS_ADMIN)) { |
1398 | + if (security_capable(filp->f_cred, CAP_SYS_ADMIN) == 0) { |
1399 | size = dev->cfg_size; |
1400 | } else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { |
1401 | size = 128; |
1402 | diff --git a/drivers/pcmcia/pcmcia_resource.c b/drivers/pcmcia/pcmcia_resource.c |
1403 | index 0bdda5b..42fbf1a 100644 |
1404 | --- a/drivers/pcmcia/pcmcia_resource.c |
1405 | +++ b/drivers/pcmcia/pcmcia_resource.c |
1406 | @@ -518,6 +518,8 @@ int pcmcia_enable_device(struct pcmcia_device *p_dev) |
1407 | flags |= CONF_ENABLE_IOCARD; |
1408 | if (flags & CONF_ENABLE_IOCARD) |
1409 | s->socket.flags |= SS_IOCARD; |
1410 | + if (flags & CONF_ENABLE_ZVCARD) |
1411 | + s->socket.flags |= SS_ZVCARD | SS_IOCARD; |
1412 | if (flags & CONF_ENABLE_SPKR) { |
1413 | s->socket.flags |= SS_SPKR_ENA; |
1414 | status = CCSR_AUDIO_ENA; |
1415 | diff --git a/drivers/platform/x86/acer-wmi.c b/drivers/platform/x86/acer-wmi.c |
1416 | index c8c6537..196a59e 100644 |
1417 | --- a/drivers/platform/x86/acer-wmi.c |
1418 | +++ b/drivers/platform/x86/acer-wmi.c |
1419 | @@ -80,7 +80,7 @@ MODULE_LICENSE("GPL"); |
1420 | */ |
1421 | #define AMW0_GUID1 "67C3371D-95A3-4C37-BB61-DD47B491DAAB" |
1422 | #define AMW0_GUID2 "431F16ED-0C2B-444C-B267-27DEB140CF9C" |
1423 | -#define WMID_GUID1 "6AF4F258-B401-42fd-BE91-3D4AC2D7C0D3" |
1424 | +#define WMID_GUID1 "6AF4F258-B401-42FD-BE91-3D4AC2D7C0D3" |
1425 | #define WMID_GUID2 "95764E09-FB56-4e83-B31A-37761F60994A" |
1426 | |
1427 | MODULE_ALIAS("wmi:67C3371D-95A3-4C37-BB61-DD47B491DAAB"); |
1428 | @@ -1065,7 +1065,7 @@ static ssize_t set_bool_threeg(struct device *dev, |
1429 | return -EINVAL; |
1430 | return count; |
1431 | } |
1432 | -static DEVICE_ATTR(threeg, S_IWUGO | S_IRUGO | S_IWUSR, show_bool_threeg, |
1433 | +static DEVICE_ATTR(threeg, S_IRUGO | S_IWUSR, show_bool_threeg, |
1434 | set_bool_threeg); |
1435 | |
1436 | static ssize_t show_interface(struct device *dev, struct device_attribute *attr, |
1437 | diff --git a/drivers/platform/x86/asus_acpi.c b/drivers/platform/x86/asus_acpi.c |
1438 | index ca05aef..cfab7b1 100644 |
1439 | --- a/drivers/platform/x86/asus_acpi.c |
1440 | +++ b/drivers/platform/x86/asus_acpi.c |
1441 | @@ -1081,14 +1081,8 @@ static int asus_hotk_add_fs(struct acpi_device *device) |
1442 | struct proc_dir_entry *proc; |
1443 | mode_t mode; |
1444 | |
1445 | - /* |
1446 | - * If parameter uid or gid is not changed, keep the default setting for |
1447 | - * our proc entries (-rw-rw-rw-) else, it means we care about security, |
1448 | - * and then set to -rw-rw---- |
1449 | - */ |
1450 | - |
1451 | if ((asus_uid == 0) && (asus_gid == 0)) { |
1452 | - mode = S_IFREG | S_IRUGO | S_IWUGO; |
1453 | + mode = S_IFREG | S_IRUGO | S_IWUSR | S_IWGRP; |
1454 | } else { |
1455 | mode = S_IFREG | S_IRUSR | S_IRGRP | S_IWUSR | S_IWGRP; |
1456 | printk(KERN_WARNING " asus_uid and asus_gid parameters are " |
1457 | diff --git a/drivers/platform/x86/tc1100-wmi.c b/drivers/platform/x86/tc1100-wmi.c |
1458 | index 1fe0f1f..865ef78 100644 |
1459 | --- a/drivers/platform/x86/tc1100-wmi.c |
1460 | +++ b/drivers/platform/x86/tc1100-wmi.c |
1461 | @@ -162,7 +162,7 @@ set_bool_##value(struct device *dev, struct device_attribute *attr, \ |
1462 | return -EINVAL; \ |
1463 | return count; \ |
1464 | } \ |
1465 | -static DEVICE_ATTR(value, S_IWUGO | S_IRUGO | S_IWUSR, \ |
1466 | +static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, \ |
1467 | show_bool_##value, set_bool_##value); |
1468 | |
1469 | show_set_bool(wireless, TC1100_INSTANCE_WIRELESS); |
1470 | diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c |
1471 | index a8ec48e..9130699 100644 |
1472 | --- a/drivers/tty/vt/vt.c |
1473 | +++ b/drivers/tty/vt/vt.c |
1474 | @@ -3524,7 +3524,7 @@ int register_con_driver(const struct consw *csw, int first, int last) |
1475 | |
1476 | /* already registered */ |
1477 | if (con_driver->con == csw) |
1478 | - retval = -EINVAL; |
1479 | + retval = -EBUSY; |
1480 | } |
1481 | |
1482 | if (retval) |
1483 | @@ -3635,7 +3635,12 @@ int take_over_console(const struct consw *csw, int first, int last, int deflt) |
1484 | int err; |
1485 | |
1486 | err = register_con_driver(csw, first, last); |
1487 | - |
1488 | + /* if we get an busy error we still want to bind the console driver |
1489 | + * and return success, as we may have unbound the console driver |
1490 | + Â * but not unregistered it. |
1491 | + */ |
1492 | + if (err == -EBUSY) |
1493 | + err = 0; |
1494 | if (!err) |
1495 | bind_con_driver(csw, first, last, deflt); |
1496 | |
1497 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
1498 | index 31edd87..32d0ad2 100644 |
1499 | --- a/drivers/usb/core/hub.c |
1500 | +++ b/drivers/usb/core/hub.c |
1501 | @@ -2744,11 +2744,6 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, |
1502 | udev->ttport = hdev->ttport; |
1503 | } else if (udev->speed != USB_SPEED_HIGH |
1504 | && hdev->speed == USB_SPEED_HIGH) { |
1505 | - if (!hub->tt.hub) { |
1506 | - dev_err(&udev->dev, "parent hub has no TT\n"); |
1507 | - retval = -EINVAL; |
1508 | - goto fail; |
1509 | - } |
1510 | udev->tt = &hub->tt; |
1511 | udev->ttport = port1; |
1512 | } |
1513 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
1514 | index f87552a..866a1d5 100644 |
1515 | --- a/fs/btrfs/ioctl.c |
1516 | +++ b/fs/btrfs/ioctl.c |
1517 | @@ -2087,7 +2087,7 @@ long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg) |
1518 | int num_types = 4; |
1519 | int alloc_size; |
1520 | int ret = 0; |
1521 | - int slot_count = 0; |
1522 | + u64 slot_count = 0; |
1523 | int i, c; |
1524 | |
1525 | if (copy_from_user(&space_args, |
1526 | @@ -2126,7 +2126,7 @@ long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg) |
1527 | goto out; |
1528 | } |
1529 | |
1530 | - slot_count = min_t(int, space_args.space_slots, slot_count); |
1531 | + slot_count = min_t(u64, space_args.space_slots, slot_count); |
1532 | |
1533 | alloc_size = sizeof(*dest) * slot_count; |
1534 | |
1535 | @@ -2146,6 +2146,9 @@ long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg) |
1536 | for (i = 0; i < num_types; i++) { |
1537 | struct btrfs_space_info *tmp; |
1538 | |
1539 | + if (!slot_count) |
1540 | + break; |
1541 | + |
1542 | info = NULL; |
1543 | rcu_read_lock(); |
1544 | list_for_each_entry_rcu(tmp, &root->fs_info->space_info, |
1545 | @@ -2167,7 +2170,10 @@ long btrfs_ioctl_space_info(struct btrfs_root *root, void __user *arg) |
1546 | memcpy(dest, &space, sizeof(space)); |
1547 | dest++; |
1548 | space_args.total_spaces++; |
1549 | + slot_count--; |
1550 | } |
1551 | + if (!slot_count) |
1552 | + break; |
1553 | } |
1554 | up_read(&info->groups_sem); |
1555 | } |
1556 | diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c |
1557 | index 9aad47a..23b741d 100644 |
1558 | --- a/fs/cifs/netmisc.c |
1559 | +++ b/fs/cifs/netmisc.c |
1560 | @@ -170,7 +170,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) |
1561 | { |
1562 | int rc, alen, slen; |
1563 | const char *pct; |
1564 | - char *endp, scope_id[13]; |
1565 | + char scope_id[13]; |
1566 | struct sockaddr_in *s4 = (struct sockaddr_in *) dst; |
1567 | struct sockaddr_in6 *s6 = (struct sockaddr_in6 *) dst; |
1568 | |
1569 | @@ -197,9 +197,9 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) |
1570 | memcpy(scope_id, pct + 1, slen); |
1571 | scope_id[slen] = '\0'; |
1572 | |
1573 | - s6->sin6_scope_id = (u32) simple_strtoul(pct, &endp, 0); |
1574 | - if (endp != scope_id + slen) |
1575 | - return 0; |
1576 | + rc = strict_strtoul(scope_id, 0, |
1577 | + (unsigned long *)&s6->sin6_scope_id); |
1578 | + rc = (rc == 0) ? 1 : 0; |
1579 | } |
1580 | |
1581 | return rc; |
1582 | diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c |
1583 | index 7b01d3f..a91f8d2 100644 |
1584 | --- a/fs/cifs/sess.c |
1585 | +++ b/fs/cifs/sess.c |
1586 | @@ -667,13 +667,13 @@ ssetup_ntlmssp_authenticate: |
1587 | |
1588 | if (type == LANMAN) { |
1589 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
1590 | - char lnm_session_key[CIFS_SESS_KEY_SIZE]; |
1591 | + char lnm_session_key[CIFS_AUTH_RESP_SIZE]; |
1592 | |
1593 | pSMB->req.hdr.Flags2 &= ~SMBFLG2_UNICODE; |
1594 | |
1595 | /* no capabilities flags in old lanman negotiation */ |
1596 | |
1597 | - pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_SESS_KEY_SIZE); |
1598 | + pSMB->old_req.PasswordLength = cpu_to_le16(CIFS_AUTH_RESP_SIZE); |
1599 | |
1600 | /* Calculate hash with password and copy into bcc_ptr. |
1601 | * Encryption Key (stored as in cryptkey) gets used if the |
1602 | @@ -686,8 +686,8 @@ ssetup_ntlmssp_authenticate: |
1603 | true : false, lnm_session_key); |
1604 | |
1605 | ses->flags |= CIFS_SES_LANMAN; |
1606 | - memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_SESS_KEY_SIZE); |
1607 | - bcc_ptr += CIFS_SESS_KEY_SIZE; |
1608 | + memcpy(bcc_ptr, (char *)lnm_session_key, CIFS_AUTH_RESP_SIZE); |
1609 | + bcc_ptr += CIFS_AUTH_RESP_SIZE; |
1610 | |
1611 | /* can not sign if LANMAN negotiated so no need |
1612 | to calculate signing key? but what if server |
1613 | diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c |
1614 | index 9d1a22d..89edfe3 100644 |
1615 | --- a/fs/ecryptfs/inode.c |
1616 | +++ b/fs/ecryptfs/inode.c |
1617 | @@ -1095,6 +1095,8 @@ int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry, |
1618 | rc = vfs_getattr(ecryptfs_dentry_to_lower_mnt(dentry), |
1619 | ecryptfs_dentry_to_lower(dentry), &lower_stat); |
1620 | if (!rc) { |
1621 | + fsstack_copy_attr_all(dentry->d_inode, |
1622 | + ecryptfs_inode_to_lower(dentry->d_inode)); |
1623 | generic_fillattr(dentry->d_inode, stat); |
1624 | stat->blocks = lower_stat.blocks; |
1625 | } |
1626 | diff --git a/fs/file_table.c b/fs/file_table.c |
1627 | index c3dee38..079940a 100644 |
1628 | --- a/fs/file_table.c |
1629 | +++ b/fs/file_table.c |
1630 | @@ -125,13 +125,13 @@ struct file *get_empty_filp(void) |
1631 | goto fail; |
1632 | |
1633 | percpu_counter_inc(&nr_files); |
1634 | + f->f_cred = get_cred(cred); |
1635 | if (security_file_alloc(f)) |
1636 | goto fail_sec; |
1637 | |
1638 | INIT_LIST_HEAD(&f->f_u.fu_list); |
1639 | atomic_long_set(&f->f_count, 1); |
1640 | rwlock_init(&f->f_owner.lock); |
1641 | - f->f_cred = get_cred(cred); |
1642 | spin_lock_init(&f->f_lock); |
1643 | eventpoll_init_file(f); |
1644 | /* f->f_version: 0 */ |
1645 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
1646 | index f35a94a..67080e4 100644 |
1647 | --- a/fs/nfsd/nfs4xdr.c |
1648 | +++ b/fs/nfsd/nfs4xdr.c |
1649 | @@ -316,8 +316,8 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, |
1650 | READ_BUF(dummy32); |
1651 | len += (XDR_QUADLEN(dummy32) << 2); |
1652 | READMEM(buf, dummy32); |
1653 | - if ((host_err = nfsd_map_name_to_uid(argp->rqstp, buf, dummy32, &iattr->ia_uid))) |
1654 | - goto out_nfserr; |
1655 | + if ((status = nfsd_map_name_to_uid(argp->rqstp, buf, dummy32, &iattr->ia_uid))) |
1656 | + return status; |
1657 | iattr->ia_valid |= ATTR_UID; |
1658 | } |
1659 | if (bmval[1] & FATTR4_WORD1_OWNER_GROUP) { |
1660 | @@ -327,8 +327,8 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval, |
1661 | READ_BUF(dummy32); |
1662 | len += (XDR_QUADLEN(dummy32) << 2); |
1663 | READMEM(buf, dummy32); |
1664 | - if ((host_err = nfsd_map_name_to_gid(argp->rqstp, buf, dummy32, &iattr->ia_gid))) |
1665 | - goto out_nfserr; |
1666 | + if ((status = nfsd_map_name_to_gid(argp->rqstp, buf, dummy32, &iattr->ia_gid))) |
1667 | + return status; |
1668 | iattr->ia_valid |= ATTR_GID; |
1669 | } |
1670 | if (bmval[1] & FATTR4_WORD1_TIME_ACCESS_SET) { |
1671 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
1672 | index 184938f..f1b0951 100644 |
1673 | --- a/fs/nfsd/vfs.c |
1674 | +++ b/fs/nfsd/vfs.c |
1675 | @@ -809,7 +809,7 @@ nfsd_get_raparms(dev_t dev, ino_t ino) |
1676 | if (ra->p_count == 0) |
1677 | frap = rap; |
1678 | } |
1679 | - depth = nfsdstats.ra_size*11/10; |
1680 | + depth = nfsdstats.ra_size; |
1681 | if (!frap) { |
1682 | spin_unlock(&rab->pb_lock); |
1683 | return NULL; |
1684 | diff --git a/fs/partitions/mac.c b/fs/partitions/mac.c |
1685 | index 68d6a21..11f688b 100644 |
1686 | --- a/fs/partitions/mac.c |
1687 | +++ b/fs/partitions/mac.c |
1688 | @@ -29,10 +29,9 @@ static inline void mac_fix_string(char *stg, int len) |
1689 | |
1690 | int mac_partition(struct parsed_partitions *state) |
1691 | { |
1692 | - int slot = 1; |
1693 | Sector sect; |
1694 | unsigned char *data; |
1695 | - int blk, blocks_in_map; |
1696 | + int slot, blocks_in_map; |
1697 | unsigned secsize; |
1698 | #ifdef CONFIG_PPC_PMAC |
1699 | int found_root = 0; |
1700 | @@ -59,10 +58,14 @@ int mac_partition(struct parsed_partitions *state) |
1701 | put_dev_sector(sect); |
1702 | return 0; /* not a MacOS disk */ |
1703 | } |
1704 | - strlcat(state->pp_buf, " [mac]", PAGE_SIZE); |
1705 | blocks_in_map = be32_to_cpu(part->map_count); |
1706 | - for (blk = 1; blk <= blocks_in_map; ++blk) { |
1707 | - int pos = blk * secsize; |
1708 | + if (blocks_in_map < 0 || blocks_in_map >= DISK_MAX_PARTS) { |
1709 | + put_dev_sector(sect); |
1710 | + return 0; |
1711 | + } |
1712 | + strlcat(state->pp_buf, " [mac]", PAGE_SIZE); |
1713 | + for (slot = 1; slot <= blocks_in_map; ++slot) { |
1714 | + int pos = slot * secsize; |
1715 | put_dev_sector(sect); |
1716 | data = read_part_sector(state, pos/512, §); |
1717 | if (!data) |
1718 | @@ -113,13 +116,11 @@ int mac_partition(struct parsed_partitions *state) |
1719 | } |
1720 | |
1721 | if (goodness > found_root_goodness) { |
1722 | - found_root = blk; |
1723 | + found_root = slot; |
1724 | found_root_goodness = goodness; |
1725 | } |
1726 | } |
1727 | #endif /* CONFIG_PPC_PMAC */ |
1728 | - |
1729 | - ++slot; |
1730 | } |
1731 | #ifdef CONFIG_PPC_PMAC |
1732 | if (found_root_goodness) |
1733 | diff --git a/fs/proc/array.c b/fs/proc/array.c |
1734 | index fff6572..3d88fe1 100644 |
1735 | --- a/fs/proc/array.c |
1736 | +++ b/fs/proc/array.c |
1737 | @@ -353,9 +353,6 @@ int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, |
1738 | task_cap(m, task); |
1739 | task_cpus_allowed(m, task); |
1740 | cpuset_task_status_allowed(m, task); |
1741 | -#if defined(CONFIG_S390) |
1742 | - task_show_regs(m, task); |
1743 | -#endif |
1744 | task_context_switch_counts(m, task); |
1745 | return 0; |
1746 | } |
1747 | diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c |
1748 | index f8e854b..206a281 100644 |
1749 | --- a/fs/xfs/quota/xfs_qm.c |
1750 | +++ b/fs/xfs/quota/xfs_qm.c |
1751 | @@ -1863,12 +1863,14 @@ xfs_qm_dqreclaim_one(void) |
1752 | xfs_dquot_t *dqpout; |
1753 | xfs_dquot_t *dqp; |
1754 | int restarts; |
1755 | + int startagain; |
1756 | |
1757 | restarts = 0; |
1758 | dqpout = NULL; |
1759 | |
1760 | /* lockorder: hashchainlock, freelistlock, mplistlock, dqlock, dqflock */ |
1761 | -startagain: |
1762 | +again: |
1763 | + startagain = 0; |
1764 | mutex_lock(&xfs_Gqm->qm_dqfrlist_lock); |
1765 | |
1766 | list_for_each_entry(dqp, &xfs_Gqm->qm_dqfrlist, q_freelist) { |
1767 | @@ -1885,13 +1887,10 @@ startagain: |
1768 | ASSERT(! (dqp->dq_flags & XFS_DQ_INACTIVE)); |
1769 | |
1770 | trace_xfs_dqreclaim_want(dqp); |
1771 | - |
1772 | - xfs_dqunlock(dqp); |
1773 | - mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); |
1774 | - if (++restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) |
1775 | - return NULL; |
1776 | XQM_STATS_INC(xqmstats.xs_qm_dqwants); |
1777 | - goto startagain; |
1778 | + restarts++; |
1779 | + startagain = 1; |
1780 | + goto dqunlock; |
1781 | } |
1782 | |
1783 | /* |
1784 | @@ -1906,23 +1905,20 @@ startagain: |
1785 | ASSERT(list_empty(&dqp->q_mplist)); |
1786 | list_del_init(&dqp->q_freelist); |
1787 | xfs_Gqm->qm_dqfrlist_cnt--; |
1788 | - xfs_dqunlock(dqp); |
1789 | dqpout = dqp; |
1790 | XQM_STATS_INC(xqmstats.xs_qm_dqinact_reclaims); |
1791 | - break; |
1792 | + goto dqunlock; |
1793 | } |
1794 | |
1795 | ASSERT(dqp->q_hash); |
1796 | ASSERT(!list_empty(&dqp->q_mplist)); |
1797 | |
1798 | /* |
1799 | - * Try to grab the flush lock. If this dquot is in the process of |
1800 | - * getting flushed to disk, we don't want to reclaim it. |
1801 | + * Try to grab the flush lock. If this dquot is in the process |
1802 | + * of getting flushed to disk, we don't want to reclaim it. |
1803 | */ |
1804 | - if (!xfs_dqflock_nowait(dqp)) { |
1805 | - xfs_dqunlock(dqp); |
1806 | - continue; |
1807 | - } |
1808 | + if (!xfs_dqflock_nowait(dqp)) |
1809 | + goto dqunlock; |
1810 | |
1811 | /* |
1812 | * We have the flush lock so we know that this is not in the |
1813 | @@ -1944,8 +1940,7 @@ startagain: |
1814 | xfs_fs_cmn_err(CE_WARN, mp, |
1815 | "xfs_qm_dqreclaim: dquot %p flush failed", dqp); |
1816 | } |
1817 | - xfs_dqunlock(dqp); /* dqflush unlocks dqflock */ |
1818 | - continue; |
1819 | + goto dqunlock; |
1820 | } |
1821 | |
1822 | /* |
1823 | @@ -1967,13 +1962,8 @@ startagain: |
1824 | */ |
1825 | if (!mutex_trylock(&mp->m_quotainfo->qi_dqlist_lock)) { |
1826 | restarts++; |
1827 | - mutex_unlock(&dqp->q_hash->qh_lock); |
1828 | - xfs_dqfunlock(dqp); |
1829 | - xfs_dqunlock(dqp); |
1830 | - mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); |
1831 | - if (restarts++ >= XFS_QM_RECLAIM_MAX_RESTARTS) |
1832 | - return NULL; |
1833 | - goto startagain; |
1834 | + startagain = 1; |
1835 | + goto qhunlock; |
1836 | } |
1837 | |
1838 | ASSERT(dqp->q_nrefs == 0); |
1839 | @@ -1986,14 +1976,20 @@ startagain: |
1840 | xfs_Gqm->qm_dqfrlist_cnt--; |
1841 | dqpout = dqp; |
1842 | mutex_unlock(&mp->m_quotainfo->qi_dqlist_lock); |
1843 | +qhunlock: |
1844 | mutex_unlock(&dqp->q_hash->qh_lock); |
1845 | dqfunlock: |
1846 | xfs_dqfunlock(dqp); |
1847 | +dqunlock: |
1848 | xfs_dqunlock(dqp); |
1849 | if (dqpout) |
1850 | break; |
1851 | if (restarts >= XFS_QM_RECLAIM_MAX_RESTARTS) |
1852 | - return NULL; |
1853 | + break; |
1854 | + if (startagain) { |
1855 | + mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); |
1856 | + goto again; |
1857 | + } |
1858 | } |
1859 | mutex_unlock(&xfs_Gqm->qm_dqfrlist_lock); |
1860 | return dqpout; |
1861 | diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h |
1862 | index cb845c1..dd7d4e2 100644 |
1863 | --- a/include/linux/pci_ids.h |
1864 | +++ b/include/linux/pci_ids.h |
1865 | @@ -518,6 +518,7 @@ |
1866 | #define PCI_DEVICE_ID_AMD_11H_NB_MISC 0x1303 |
1867 | #define PCI_DEVICE_ID_AMD_11H_NB_LINK 0x1304 |
1868 | #define PCI_DEVICE_ID_AMD_15H_NB_MISC 0x1603 |
1869 | +#define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703 |
1870 | #define PCI_DEVICE_ID_AMD_LANCE 0x2000 |
1871 | #define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001 |
1872 | #define PCI_DEVICE_ID_AMD_SCSI 0x2020 |
1873 | diff --git a/include/linux/security.h b/include/linux/security.h |
1874 | index d47a4c2..b3f2f47 100644 |
1875 | --- a/include/linux/security.h |
1876 | +++ b/include/linux/security.h |
1877 | @@ -1664,7 +1664,7 @@ int security_capset(struct cred *new, const struct cred *old, |
1878 | const kernel_cap_t *effective, |
1879 | const kernel_cap_t *inheritable, |
1880 | const kernel_cap_t *permitted); |
1881 | -int security_capable(int cap); |
1882 | +int security_capable(const struct cred *cred, int cap); |
1883 | int security_real_capable(struct task_struct *tsk, int cap); |
1884 | int security_real_capable_noaudit(struct task_struct *tsk, int cap); |
1885 | int security_sysctl(struct ctl_table *table, int op); |
1886 | @@ -1857,9 +1857,9 @@ static inline int security_capset(struct cred *new, |
1887 | return cap_capset(new, old, effective, inheritable, permitted); |
1888 | } |
1889 | |
1890 | -static inline int security_capable(int cap) |
1891 | +static inline int security_capable(const struct cred *cred, int cap) |
1892 | { |
1893 | - return cap_capable(current, current_cred(), cap, SECURITY_CAP_AUDIT); |
1894 | + return cap_capable(current, cred, cap, SECURITY_CAP_AUDIT); |
1895 | } |
1896 | |
1897 | static inline int security_real_capable(struct task_struct *tsk, int cap) |
1898 | diff --git a/include/pcmcia/ds.h b/include/pcmcia/ds.h |
1899 | index 8479b66..3fd5064 100644 |
1900 | --- a/include/pcmcia/ds.h |
1901 | +++ b/include/pcmcia/ds.h |
1902 | @@ -261,6 +261,7 @@ void pcmcia_disable_device(struct pcmcia_device *p_dev); |
1903 | #define CONF_ENABLE_ESR 0x0008 |
1904 | #define CONF_ENABLE_IOCARD 0x0010 /* auto-enabled if IO resources or IRQ |
1905 | * (CONF_ENABLE_IRQ) in use */ |
1906 | +#define CONF_ENABLE_ZVCARD 0x0020 |
1907 | |
1908 | /* flags used by pcmcia_loop_config() autoconfiguration */ |
1909 | #define CONF_AUTO_CHECK_VCC 0x0100 /* check for matching Vcc? */ |
1910 | diff --git a/kernel/capability.c b/kernel/capability.c |
1911 | index 2f05303..9e9385f 100644 |
1912 | --- a/kernel/capability.c |
1913 | +++ b/kernel/capability.c |
1914 | @@ -306,7 +306,7 @@ int capable(int cap) |
1915 | BUG(); |
1916 | } |
1917 | |
1918 | - if (security_capable(cap) == 0) { |
1919 | + if (security_capable(current_cred(), cap) == 0) { |
1920 | current->flags |= PF_SUPERPRIV; |
1921 | return 1; |
1922 | } |
1923 | diff --git a/kernel/cred.c b/kernel/cred.c |
1924 | index 6a1aa00..3a9d6dd 100644 |
1925 | --- a/kernel/cred.c |
1926 | +++ b/kernel/cred.c |
1927 | @@ -252,13 +252,13 @@ struct cred *cred_alloc_blank(void) |
1928 | #endif |
1929 | |
1930 | atomic_set(&new->usage, 1); |
1931 | +#ifdef CONFIG_DEBUG_CREDENTIALS |
1932 | + new->magic = CRED_MAGIC; |
1933 | +#endif |
1934 | |
1935 | if (security_cred_alloc_blank(new, GFP_KERNEL) < 0) |
1936 | goto error; |
1937 | |
1938 | -#ifdef CONFIG_DEBUG_CREDENTIALS |
1939 | - new->magic = CRED_MAGIC; |
1940 | -#endif |
1941 | return new; |
1942 | |
1943 | error: |
1944 | @@ -657,6 +657,8 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon) |
1945 | validate_creds(old); |
1946 | |
1947 | *new = *old; |
1948 | + atomic_set(&new->usage, 1); |
1949 | + set_cred_subscribers(new, 0); |
1950 | get_uid(new->user); |
1951 | get_group_info(new->group_info); |
1952 | |
1953 | @@ -674,8 +676,6 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon) |
1954 | if (security_prepare_creds(new, old, GFP_KERNEL) < 0) |
1955 | goto error; |
1956 | |
1957 | - atomic_set(&new->usage, 1); |
1958 | - set_cred_subscribers(new, 0); |
1959 | put_cred(old); |
1960 | validate_creds(new); |
1961 | return new; |
1962 | @@ -748,7 +748,11 @@ bool creds_are_invalid(const struct cred *cred) |
1963 | if (cred->magic != CRED_MAGIC) |
1964 | return true; |
1965 | #ifdef CONFIG_SECURITY_SELINUX |
1966 | - if (selinux_is_enabled()) { |
1967 | + /* |
1968 | + * cred->security == NULL if security_cred_alloc_blank() or |
1969 | + * security_prepare_creds() returned an error. |
1970 | + */ |
1971 | + if (selinux_is_enabled() && cred->security) { |
1972 | if ((unsigned long) cred->security < PAGE_SIZE) |
1973 | return true; |
1974 | if ((*(u32 *)cred->security & 0xffffff00) == |
1975 | diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h |
1976 | index 4571ae7..99c3bc8 100644 |
1977 | --- a/kernel/irq/internals.h |
1978 | +++ b/kernel/irq/internals.h |
1979 | @@ -3,6 +3,12 @@ |
1980 | */ |
1981 | #include <linux/irqdesc.h> |
1982 | |
1983 | +#ifdef CONFIG_SPARSE_IRQ |
1984 | +# define IRQ_BITMAP_BITS (NR_IRQS + 8196) |
1985 | +#else |
1986 | +# define IRQ_BITMAP_BITS NR_IRQS |
1987 | +#endif |
1988 | + |
1989 | extern int noirqdebug; |
1990 | |
1991 | #define irq_data_to_desc(data) container_of(data, struct irq_desc, irq_data) |
1992 | diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c |
1993 | index 9988d03..49b8394 100644 |
1994 | --- a/kernel/irq/irqdesc.c |
1995 | +++ b/kernel/irq/irqdesc.c |
1996 | @@ -91,7 +91,7 @@ int nr_irqs = NR_IRQS; |
1997 | EXPORT_SYMBOL_GPL(nr_irqs); |
1998 | |
1999 | static DEFINE_MUTEX(sparse_irq_lock); |
2000 | -static DECLARE_BITMAP(allocated_irqs, NR_IRQS); |
2001 | +static DECLARE_BITMAP(allocated_irqs, IRQ_BITMAP_BITS); |
2002 | |
2003 | #ifdef CONFIG_SPARSE_IRQ |
2004 | |
2005 | @@ -215,6 +215,15 @@ int __init early_irq_init(void) |
2006 | initcnt = arch_probe_nr_irqs(); |
2007 | printk(KERN_INFO "NR_IRQS:%d nr_irqs:%d %d\n", NR_IRQS, nr_irqs, initcnt); |
2008 | |
2009 | + if (WARN_ON(nr_irqs > IRQ_BITMAP_BITS)) |
2010 | + nr_irqs = IRQ_BITMAP_BITS; |
2011 | + |
2012 | + if (WARN_ON(initcnt > IRQ_BITMAP_BITS)) |
2013 | + initcnt = IRQ_BITMAP_BITS; |
2014 | + |
2015 | + if (initcnt > nr_irqs) |
2016 | + nr_irqs = initcnt; |
2017 | + |
2018 | for (i = 0; i < initcnt; i++) { |
2019 | desc = alloc_desc(i, node); |
2020 | set_bit(i, allocated_irqs); |
2021 | diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c |
2022 | index 5f92acc5..6f7c114 100644 |
2023 | --- a/kernel/irq/manage.c |
2024 | +++ b/kernel/irq/manage.c |
2025 | @@ -1098,7 +1098,7 @@ int request_threaded_irq(unsigned int irq, irq_handler_t handler, |
2026 | if (retval) |
2027 | kfree(action); |
2028 | |
2029 | -#ifdef CONFIG_DEBUG_SHIRQ |
2030 | +#ifdef CONFIG_DEBUG_SHIRQ_FIXME |
2031 | if (!retval && (irqflags & IRQF_SHARED)) { |
2032 | /* |
2033 | * It's a shared IRQ -- the driver ought to be prepared for it |
2034 | diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c |
2035 | index 891115a..dc49358 100644 |
2036 | --- a/kernel/irq/resend.c |
2037 | +++ b/kernel/irq/resend.c |
2038 | @@ -23,7 +23,7 @@ |
2039 | #ifdef CONFIG_HARDIRQS_SW_RESEND |
2040 | |
2041 | /* Bitmap to handle software resend of interrupts: */ |
2042 | -static DECLARE_BITMAP(irqs_resend, NR_IRQS); |
2043 | +static DECLARE_BITMAP(irqs_resend, IRQ_BITMAP_BITS); |
2044 | |
2045 | /* |
2046 | * Run software resends of IRQ's |
2047 | diff --git a/kernel/perf_event.c b/kernel/perf_event.c |
2048 | index 64668bd..785c66a 100644 |
2049 | --- a/kernel/perf_event.c |
2050 | +++ b/kernel/perf_event.c |
2051 | @@ -652,6 +652,10 @@ retry: |
2052 | raw_spin_unlock_irq(&ctx->lock); |
2053 | } |
2054 | |
2055 | +#define MAX_INTERRUPTS (~0ULL) |
2056 | + |
2057 | +static void perf_log_throttle(struct perf_event *event, int enable); |
2058 | + |
2059 | static int |
2060 | event_sched_in(struct perf_event *event, |
2061 | struct perf_cpu_context *cpuctx, |
2062 | @@ -662,6 +666,17 @@ event_sched_in(struct perf_event *event, |
2063 | |
2064 | event->state = PERF_EVENT_STATE_ACTIVE; |
2065 | event->oncpu = smp_processor_id(); |
2066 | + |
2067 | + /* |
2068 | + * Unthrottle events, since we scheduled we might have missed several |
2069 | + * ticks already, also for a heavily scheduling task there is little |
2070 | + * guarantee it'll get a tick in a timely manner. |
2071 | + */ |
2072 | + if (unlikely(event->hw.interrupts == MAX_INTERRUPTS)) { |
2073 | + perf_log_throttle(event, 1); |
2074 | + event->hw.interrupts = 0; |
2075 | + } |
2076 | + |
2077 | /* |
2078 | * The new state must be visible before we turn it on in the hardware: |
2079 | */ |
2080 | @@ -1469,10 +1484,6 @@ void __perf_event_task_sched_in(struct task_struct *task) |
2081 | } |
2082 | } |
2083 | |
2084 | -#define MAX_INTERRUPTS (~0ULL) |
2085 | - |
2086 | -static void perf_log_throttle(struct perf_event *event, int enable); |
2087 | - |
2088 | static u64 perf_calculate_period(struct perf_event *event, u64 nsec, u64 count) |
2089 | { |
2090 | u64 frequency = event->attr.sample_freq; |
2091 | diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c |
2092 | index 0dac75e..64db648 100644 |
2093 | --- a/kernel/power/snapshot.c |
2094 | +++ b/kernel/power/snapshot.c |
2095 | @@ -1519,11 +1519,8 @@ static int |
2096 | swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm, |
2097 | unsigned int nr_pages, unsigned int nr_highmem) |
2098 | { |
2099 | - int error = 0; |
2100 | - |
2101 | if (nr_highmem > 0) { |
2102 | - error = get_highmem_buffer(PG_ANY); |
2103 | - if (error) |
2104 | + if (get_highmem_buffer(PG_ANY)) |
2105 | goto err_out; |
2106 | if (nr_highmem > alloc_highmem) { |
2107 | nr_highmem -= alloc_highmem; |
2108 | @@ -1546,7 +1543,7 @@ swsusp_alloc(struct memory_bitmap *orig_bm, struct memory_bitmap *copy_bm, |
2109 | |
2110 | err_out: |
2111 | swsusp_free(); |
2112 | - return error; |
2113 | + return -ENOMEM; |
2114 | } |
2115 | |
2116 | asmlinkage int swsusp_save(void) |
2117 | diff --git a/kernel/workqueue.c b/kernel/workqueue.c |
2118 | index 4be7fa5..c95f321 100644 |
2119 | --- a/kernel/workqueue.c |
2120 | +++ b/kernel/workqueue.c |
2121 | @@ -79,7 +79,9 @@ enum { |
2122 | MAX_IDLE_WORKERS_RATIO = 4, /* 1/4 of busy can be idle */ |
2123 | IDLE_WORKER_TIMEOUT = 300 * HZ, /* keep idle ones for 5 mins */ |
2124 | |
2125 | - MAYDAY_INITIAL_TIMEOUT = HZ / 100, /* call for help after 10ms */ |
2126 | + MAYDAY_INITIAL_TIMEOUT = HZ / 100 >= 2 ? HZ / 100 : 2, |
2127 | + /* call for help after 10ms |
2128 | + (min two ticks) */ |
2129 | MAYDAY_INTERVAL = HZ / 10, /* and then every 100ms */ |
2130 | CREATE_COOLDOWN = HZ, /* time to breath after fail */ |
2131 | TRUSTEE_COOLDOWN = HZ / 10, /* for trustee draining */ |
2132 | @@ -2009,6 +2011,15 @@ repeat: |
2133 | move_linked_works(work, scheduled, &n); |
2134 | |
2135 | process_scheduled_works(rescuer); |
2136 | + |
2137 | + /* |
2138 | + * Leave this gcwq. If keep_working() is %true, notify a |
2139 | + * regular worker; otherwise, we end up with 0 concurrency |
2140 | + * and stalling the execution. |
2141 | + */ |
2142 | + if (keep_working(gcwq)) |
2143 | + wake_up_worker(gcwq); |
2144 | + |
2145 | spin_unlock_irq(&gcwq->lock); |
2146 | } |
2147 | |
2148 | diff --git a/net/core/dev.c b/net/core/dev.c |
2149 | index 0dd54a6..c0d3b5f 100644 |
2150 | --- a/net/core/dev.c |
2151 | +++ b/net/core/dev.c |
2152 | @@ -4945,6 +4945,7 @@ static void rollback_registered(struct net_device *dev) |
2153 | |
2154 | list_add(&dev->unreg_list, &single); |
2155 | rollback_registered_many(&single); |
2156 | + list_del(&single); |
2157 | } |
2158 | |
2159 | unsigned long netdev_fix_features(unsigned long features, const char *name) |
2160 | @@ -6114,6 +6115,7 @@ static void __net_exit default_device_exit_batch(struct list_head *net_list) |
2161 | } |
2162 | } |
2163 | unregister_netdevice_many(&dev_kill_list); |
2164 | + list_del(&dev_kill_list); |
2165 | rtnl_unlock(); |
2166 | } |
2167 | |
2168 | diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c |
2169 | index b729ace..742a6dc 100644 |
2170 | --- a/net/netfilter/nf_conntrack_netlink.c |
2171 | +++ b/net/netfilter/nf_conntrack_netlink.c |
2172 | @@ -642,30 +642,29 @@ ctnetlink_dump_table(struct sk_buff *skb, struct netlink_callback *cb) |
2173 | struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh); |
2174 | u_int8_t l3proto = nfmsg->nfgen_family; |
2175 | |
2176 | - rcu_read_lock(); |
2177 | + spin_lock_bh(&nf_conntrack_lock); |
2178 | last = (struct nf_conn *)cb->args[1]; |
2179 | for (; cb->args[0] < net->ct.htable_size; cb->args[0]++) { |
2180 | restart: |
2181 | - hlist_nulls_for_each_entry_rcu(h, n, &net->ct.hash[cb->args[0]], |
2182 | + hlist_nulls_for_each_entry(h, n, &net->ct.hash[cb->args[0]], |
2183 | hnnode) { |
2184 | if (NF_CT_DIRECTION(h) != IP_CT_DIR_ORIGINAL) |
2185 | continue; |
2186 | ct = nf_ct_tuplehash_to_ctrack(h); |
2187 | - if (!atomic_inc_not_zero(&ct->ct_general.use)) |
2188 | - continue; |
2189 | /* Dump entries of a given L3 protocol number. |
2190 | * If it is not specified, ie. l3proto == 0, |
2191 | * then dump everything. */ |
2192 | if (l3proto && nf_ct_l3num(ct) != l3proto) |
2193 | - goto releasect; |
2194 | + continue; |
2195 | if (cb->args[1]) { |
2196 | if (ct != last) |
2197 | - goto releasect; |
2198 | + continue; |
2199 | cb->args[1] = 0; |
2200 | } |
2201 | if (ctnetlink_fill_info(skb, NETLINK_CB(cb->skb).pid, |
2202 | cb->nlh->nlmsg_seq, |
2203 | IPCTNL_MSG_CT_NEW, ct) < 0) { |
2204 | + nf_conntrack_get(&ct->ct_general); |
2205 | cb->args[1] = (unsigned long)ct; |
2206 | goto out; |
2207 | } |
2208 | @@ -678,8 +677,6 @@ restart: |
2209 | if (acct) |
2210 | memset(acct, 0, sizeof(struct nf_conn_counter[IP_CT_DIR_MAX])); |
2211 | } |
2212 | -releasect: |
2213 | - nf_ct_put(ct); |
2214 | } |
2215 | if (cb->args[1]) { |
2216 | cb->args[1] = 0; |
2217 | @@ -687,7 +684,7 @@ releasect: |
2218 | } |
2219 | } |
2220 | out: |
2221 | - rcu_read_unlock(); |
2222 | + spin_unlock_bh(&nf_conntrack_lock); |
2223 | if (last) |
2224 | nf_ct_put(last); |
2225 | |
2226 | diff --git a/security/security.c b/security/security.c |
2227 | index e5fb07a..8d57dbb 100644 |
2228 | --- a/security/security.c |
2229 | +++ b/security/security.c |
2230 | @@ -154,10 +154,9 @@ int security_capset(struct cred *new, const struct cred *old, |
2231 | effective, inheritable, permitted); |
2232 | } |
2233 | |
2234 | -int security_capable(int cap) |
2235 | +int security_capable(const struct cred *cred, int cap) |
2236 | { |
2237 | - return security_ops->capable(current, current_cred(), cap, |
2238 | - SECURITY_CAP_AUDIT); |
2239 | + return security_ops->capable(current, cred, cap, SECURITY_CAP_AUDIT); |
2240 | } |
2241 | |
2242 | int security_real_capable(struct task_struct *tsk, int cap) |
2243 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
2244 | index 11d5c47..a373ab6 100644 |
2245 | --- a/security/selinux/hooks.c |
2246 | +++ b/security/selinux/hooks.c |
2247 | @@ -3198,7 +3198,11 @@ static void selinux_cred_free(struct cred *cred) |
2248 | { |
2249 | struct task_security_struct *tsec = cred->security; |
2250 | |
2251 | - BUG_ON((unsigned long) cred->security < PAGE_SIZE); |
2252 | + /* |
2253 | + * cred->security == NULL if security_cred_alloc_blank() or |
2254 | + * security_prepare_creds() returned an error. |
2255 | + */ |
2256 | + BUG_ON(cred->security && (unsigned long) cred->security < PAGE_SIZE); |
2257 | cred->security = (void *) 0x7UL; |
2258 | kfree(tsec); |
2259 | } |
2260 | diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c |
2261 | index a1c4008..5825d18 100644 |
2262 | --- a/sound/pci/hda/hda_intel.c |
2263 | +++ b/sound/pci/hda/hda_intel.c |
2264 | @@ -2305,6 +2305,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = { |
2265 | SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB), |
2266 | SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB), |
2267 | SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB), |
2268 | + SND_PCI_QUIRK(0x1043, 0x8410, "ASUS", POS_FIX_LPIB), |
2269 | SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB), |
2270 | SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB), |
2271 | SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB), |
2272 | diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c |
2273 | index 5667fb9..fc5e027 100644 |
2274 | --- a/sound/pci/hda/patch_conexant.c |
2275 | +++ b/sound/pci/hda/patch_conexant.c |
2276 | @@ -3401,7 +3401,7 @@ static void cx_auto_parse_output(struct hda_codec *codec) |
2277 | } |
2278 | } |
2279 | spec->multiout.dac_nids = spec->private_dac_nids; |
2280 | - spec->multiout.max_channels = nums * 2; |
2281 | + spec->multiout.max_channels = spec->multiout.num_dacs * 2; |
2282 | |
2283 | if (cfg->hp_outs > 0) |
2284 | spec->auto_mute = 1; |
2285 | diff --git a/sound/soc/codecs/wm8903.c b/sound/soc/codecs/wm8903.c |
2286 | index 622b602..8b87e04 100644 |
2287 | --- a/sound/soc/codecs/wm8903.c |
2288 | +++ b/sound/soc/codecs/wm8903.c |
2289 | @@ -1479,7 +1479,7 @@ int wm8903_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack, |
2290 | WM8903_MICDET_EINT | WM8903_MICSHRT_EINT, |
2291 | irq_mask); |
2292 | |
2293 | - if (det && shrt) { |
2294 | + if (det || shrt) { |
2295 | /* Enable mic detection, this may not have been set through |
2296 | * platform data (eg, if the defaults are OK). */ |
2297 | snd_soc_update_bits(codec, WM8903_WRITE_SEQUENCER_0, |
2298 | diff --git a/sound/usb/caiaq/audio.c b/sound/usb/caiaq/audio.c |
2299 | index 68b9747..66eabaf 100644 |
2300 | --- a/sound/usb/caiaq/audio.c |
2301 | +++ b/sound/usb/caiaq/audio.c |
2302 | @@ -785,7 +785,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev) |
2303 | } |
2304 | |
2305 | dev->pcm->private_data = dev; |
2306 | - strcpy(dev->pcm->name, dev->product_name); |
2307 | + strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name)); |
2308 | |
2309 | memset(dev->sub_playback, 0, sizeof(dev->sub_playback)); |
2310 | memset(dev->sub_capture, 0, sizeof(dev->sub_capture)); |
2311 | diff --git a/sound/usb/caiaq/midi.c b/sound/usb/caiaq/midi.c |
2312 | index 2f218c7..a1a4708 100644 |
2313 | --- a/sound/usb/caiaq/midi.c |
2314 | +++ b/sound/usb/caiaq/midi.c |
2315 | @@ -136,7 +136,7 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device) |
2316 | if (ret < 0) |
2317 | return ret; |
2318 | |
2319 | - strcpy(rmidi->name, device->product_name); |
2320 | + strlcpy(rmidi->name, device->product_name, sizeof(rmidi->name)); |
2321 | |
2322 | rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX; |
2323 | rmidi->private_data = device; |
2324 | diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c |
2325 | index 9bcc38f..b3028eb 100644 |
2326 | --- a/tools/perf/builtin-timechart.c |
2327 | +++ b/tools/perf/builtin-timechart.c |
2328 | @@ -502,7 +502,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) |
2329 | c_state_start(pe->cpu_id, data.time, pe->value); |
2330 | |
2331 | if (strcmp(event_str, "power:power_end") == 0) |
2332 | - c_state_end(pe->cpu_id, data.time); |
2333 | + c_state_end(data.cpu, data.time); |
2334 | |
2335 | if (strcmp(event_str, "power:power_frequency") == 0) |
2336 | p_state_change(pe->cpu_id, data.time, pe->value); |