Annotation of /trunk/kernel26-alx/patches-2.6.37/0101-2.6.37.2-all-fixes.patch
Parent Directory | Revision Log
Revision 1714 -
(hide annotations)
(download)
Tue Mar 27 14:22:06 2012 UTC (12 years, 6 months ago) by niro
File size: 82804 byte(s)
Tue Mar 27 14:22:06 2012 UTC (12 years, 6 months ago) by niro
File size: 82804 byte(s)
1 | niro | 1311 | 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); |