Annotation of /trunk/kernel-alx/patches-3.10/0176-3.10.77-all-fixes.patch
Parent Directory | Revision Log
Revision 2664 -
(hide annotations)
(download)
Tue Jul 21 16:20:24 2015 UTC (9 years, 2 months ago) by niro
File size: 63477 byte(s)
Tue Jul 21 16:20:24 2015 UTC (9 years, 2 months ago) by niro
File size: 63477 byte(s)
-linux-3.10.77
1 | niro | 2664 | diff --git a/Makefile b/Makefile |
2 | index 019a6a4b386d..923ad8a64e3b 100644 | ||
3 | --- a/Makefile | ||
4 | +++ b/Makefile | ||
5 | @@ -1,6 +1,6 @@ | ||
6 | VERSION = 3 | ||
7 | PATCHLEVEL = 10 | ||
8 | -SUBLEVEL = 76 | ||
9 | +SUBLEVEL = 77 | ||
10 | EXTRAVERSION = | ||
11 | NAME = TOSSUG Baby Fish | ||
12 | |||
13 | diff --git a/arch/arm/include/asm/elf.h b/arch/arm/include/asm/elf.h | ||
14 | index 56211f2084ef..ce6e30628cc1 100644 | ||
15 | --- a/arch/arm/include/asm/elf.h | ||
16 | +++ b/arch/arm/include/asm/elf.h | ||
17 | @@ -116,7 +116,7 @@ int dump_task_regs(struct task_struct *t, elf_gregset_t *elfregs); | ||
18 | the loader. We need to make sure that it is out of the way of the program | ||
19 | that it will "exec", and that there is sufficient room for the brk. */ | ||
20 | |||
21 | -#define ELF_ET_DYN_BASE (2 * TASK_SIZE / 3) | ||
22 | +#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) | ||
23 | |||
24 | /* When the program starts, a1 contains a pointer to a function to be | ||
25 | registered with atexit, as per the SVR4 ABI. A value of 0 means we | ||
26 | diff --git a/arch/arm/mach-s3c64xx/crag6410.h b/arch/arm/mach-s3c64xx/crag6410.h | ||
27 | index 4c3c9994fc2c..81dc722ced57 100644 | ||
28 | --- a/arch/arm/mach-s3c64xx/crag6410.h | ||
29 | +++ b/arch/arm/mach-s3c64xx/crag6410.h | ||
30 | @@ -14,6 +14,7 @@ | ||
31 | #include <linux/gpio.h> | ||
32 | |||
33 | #define GLENFARCLAS_PMIC_IRQ_BASE IRQ_BOARD_START | ||
34 | +#define BANFF_PMIC_IRQ_BASE (IRQ_BOARD_START + 64) | ||
35 | |||
36 | #define PCA935X_GPIO_BASE GPIO_BOARD_START | ||
37 | #define CODEC_GPIO_BASE (GPIO_BOARD_START + 8) | ||
38 | diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
39 | index 8ad88ace795a..5fa9ac9104e1 100644 | ||
40 | --- a/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
41 | +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | ||
42 | @@ -558,6 +558,7 @@ static struct wm831x_touch_pdata touch_pdata = { | ||
43 | |||
44 | static struct wm831x_pdata crag_pmic_pdata = { | ||
45 | .wm831x_num = 1, | ||
46 | + .irq_base = BANFF_PMIC_IRQ_BASE, | ||
47 | .gpio_base = BANFF_PMIC_GPIO_BASE, | ||
48 | .soft_shutdown = true, | ||
49 | |||
50 | diff --git a/arch/arm64/include/asm/timex.h b/arch/arm64/include/asm/timex.h | ||
51 | index b24a31a7e2c9..81a076eb37fa 100644 | ||
52 | --- a/arch/arm64/include/asm/timex.h | ||
53 | +++ b/arch/arm64/include/asm/timex.h | ||
54 | @@ -16,14 +16,14 @@ | ||
55 | #ifndef __ASM_TIMEX_H | ||
56 | #define __ASM_TIMEX_H | ||
57 | |||
58 | +#include <asm/arch_timer.h> | ||
59 | + | ||
60 | /* | ||
61 | * Use the current timer as a cycle counter since this is what we use for | ||
62 | * the delay loop. | ||
63 | */ | ||
64 | -#define get_cycles() ({ cycles_t c; read_current_timer(&c); c; }) | ||
65 | +#define get_cycles() arch_counter_get_cntvct() | ||
66 | |||
67 | #include <asm-generic/timex.h> | ||
68 | |||
69 | -#define ARCH_HAS_READ_CURRENT_TIMER | ||
70 | - | ||
71 | #endif | ||
72 | diff --git a/arch/arm64/kernel/time.c b/arch/arm64/kernel/time.c | ||
73 | index a551f88ae2c1..03dc3718eb13 100644 | ||
74 | --- a/arch/arm64/kernel/time.c | ||
75 | +++ b/arch/arm64/kernel/time.c | ||
76 | @@ -68,12 +68,6 @@ unsigned long long notrace sched_clock(void) | ||
77 | return arch_timer_read_counter() * sched_clock_mult; | ||
78 | } | ||
79 | |||
80 | -int read_current_timer(unsigned long *timer_value) | ||
81 | -{ | ||
82 | - *timer_value = arch_timer_read_counter(); | ||
83 | - return 0; | ||
84 | -} | ||
85 | - | ||
86 | void __init time_init(void) | ||
87 | { | ||
88 | u32 arch_timer_rate; | ||
89 | diff --git a/arch/c6x/kernel/time.c b/arch/c6x/kernel/time.c | ||
90 | index 356ee84cad95..04845aaf5985 100644 | ||
91 | --- a/arch/c6x/kernel/time.c | ||
92 | +++ b/arch/c6x/kernel/time.c | ||
93 | @@ -49,7 +49,7 @@ u64 sched_clock(void) | ||
94 | return (tsc * sched_clock_multiplier) >> SCHED_CLOCK_SHIFT; | ||
95 | } | ||
96 | |||
97 | -void time_init(void) | ||
98 | +void __init time_init(void) | ||
99 | { | ||
100 | u64 tmp = (u64)NSEC_PER_SEC << SCHED_CLOCK_SHIFT; | ||
101 | |||
102 | diff --git a/arch/mips/include/asm/suspend.h b/arch/mips/include/asm/suspend.h | ||
103 | deleted file mode 100644 | ||
104 | index 3adac3b53d19..000000000000 | ||
105 | --- a/arch/mips/include/asm/suspend.h | ||
106 | +++ /dev/null | ||
107 | @@ -1,7 +0,0 @@ | ||
108 | -#ifndef __ASM_SUSPEND_H | ||
109 | -#define __ASM_SUSPEND_H | ||
110 | - | ||
111 | -/* References to section boundaries */ | ||
112 | -extern const void __nosave_begin, __nosave_end; | ||
113 | - | ||
114 | -#endif /* __ASM_SUSPEND_H */ | ||
115 | diff --git a/arch/mips/power/cpu.c b/arch/mips/power/cpu.c | ||
116 | index 521e5963df05..2129e67723ff 100644 | ||
117 | --- a/arch/mips/power/cpu.c | ||
118 | +++ b/arch/mips/power/cpu.c | ||
119 | @@ -7,7 +7,7 @@ | ||
120 | * Author: Hu Hongbing <huhb@lemote.com> | ||
121 | * Wu Zhangjin <wuzhangjin@gmail.com> | ||
122 | */ | ||
123 | -#include <asm/suspend.h> | ||
124 | +#include <asm/sections.h> | ||
125 | #include <asm/fpu.h> | ||
126 | #include <asm/dsp.h> | ||
127 | |||
128 | diff --git a/arch/mips/power/hibernate.S b/arch/mips/power/hibernate.S | ||
129 | index 32a7c828f073..e7567c8a9e79 100644 | ||
130 | --- a/arch/mips/power/hibernate.S | ||
131 | +++ b/arch/mips/power/hibernate.S | ||
132 | @@ -30,6 +30,8 @@ LEAF(swsusp_arch_suspend) | ||
133 | END(swsusp_arch_suspend) | ||
134 | |||
135 | LEAF(swsusp_arch_resume) | ||
136 | + /* Avoid TLB mismatch during and after kernel resume */ | ||
137 | + jal local_flush_tlb_all | ||
138 | PTR_L t0, restore_pblist | ||
139 | 0: | ||
140 | PTR_L t1, PBE_ADDRESS(t0) /* source */ | ||
141 | @@ -43,7 +45,6 @@ LEAF(swsusp_arch_resume) | ||
142 | bne t1, t3, 1b | ||
143 | PTR_L t0, PBE_NEXT(t0) | ||
144 | bnez t0, 0b | ||
145 | - jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */ | ||
146 | PTR_LA t0, saved_regs | ||
147 | PTR_L ra, PT_R31(t0) | ||
148 | PTR_L sp, PT_R29(t0) | ||
149 | diff --git a/arch/powerpc/kernel/suspend.c b/arch/powerpc/kernel/suspend.c | ||
150 | index 0167d53da30c..a531154cc0f3 100644 | ||
151 | --- a/arch/powerpc/kernel/suspend.c | ||
152 | +++ b/arch/powerpc/kernel/suspend.c | ||
153 | @@ -9,9 +9,7 @@ | ||
154 | |||
155 | #include <linux/mm.h> | ||
156 | #include <asm/page.h> | ||
157 | - | ||
158 | -/* References to section boundaries */ | ||
159 | -extern const void __nosave_begin, __nosave_end; | ||
160 | +#include <asm/sections.h> | ||
161 | |||
162 | /* | ||
163 | * pfn_is_nosave - check if given pfn is in the 'nosave' section | ||
164 | diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c | ||
165 | index 2396dda282cd..ead55351b254 100644 | ||
166 | --- a/arch/powerpc/perf/callchain.c | ||
167 | +++ b/arch/powerpc/perf/callchain.c | ||
168 | @@ -243,7 +243,7 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry, | ||
169 | sp = regs->gpr[1]; | ||
170 | perf_callchain_store(entry, next_ip); | ||
171 | |||
172 | - for (;;) { | ||
173 | + while (entry->nr < PERF_MAX_STACK_DEPTH) { | ||
174 | fp = (unsigned long __user *) sp; | ||
175 | if (!valid_user_sp(sp, 1) || read_user_stack_64(fp, &next_sp)) | ||
176 | return; | ||
177 | diff --git a/arch/s390/kernel/suspend.c b/arch/s390/kernel/suspend.c | ||
178 | index c479d2f9605b..58cbb75e89e9 100644 | ||
179 | --- a/arch/s390/kernel/suspend.c | ||
180 | +++ b/arch/s390/kernel/suspend.c | ||
181 | @@ -9,12 +9,9 @@ | ||
182 | #include <linux/pfn.h> | ||
183 | #include <linux/suspend.h> | ||
184 | #include <linux/mm.h> | ||
185 | +#include <asm/sections.h> | ||
186 | #include <asm/ctl_reg.h> | ||
187 | - | ||
188 | -/* | ||
189 | - * References to section boundaries | ||
190 | - */ | ||
191 | -extern const void __nosave_begin, __nosave_end; | ||
192 | +#include <asm/ipl.h> | ||
193 | |||
194 | /* | ||
195 | * The restore of the saved pages in an hibernation image will set | ||
196 | @@ -138,6 +135,8 @@ int pfn_is_nosave(unsigned long pfn) | ||
197 | { | ||
198 | unsigned long nosave_begin_pfn = PFN_DOWN(__pa(&__nosave_begin)); | ||
199 | unsigned long nosave_end_pfn = PFN_DOWN(__pa(&__nosave_end)); | ||
200 | + unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1; | ||
201 | + unsigned long stext_pfn = PFN_DOWN(__pa(&_stext)); | ||
202 | |||
203 | /* Always save lowcore pages (LC protection might be enabled). */ | ||
204 | if (pfn <= LC_PAGES) | ||
205 | @@ -145,6 +144,8 @@ int pfn_is_nosave(unsigned long pfn) | ||
206 | if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn) | ||
207 | return 1; | ||
208 | /* Skip memory holes and read-only pages (NSS, DCSS, ...). */ | ||
209 | + if (pfn >= stext_pfn && pfn <= eshared_pfn) | ||
210 | + return ipl_info.type == IPL_TYPE_NSS ? 1 : 0; | ||
211 | if (tprot(PFN_PHYS(pfn))) | ||
212 | return 1; | ||
213 | return 0; | ||
214 | diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c | ||
215 | index 6bbd7b5a0bbe..0220c2ba7590 100644 | ||
216 | --- a/arch/s390/kvm/priv.c | ||
217 | +++ b/arch/s390/kvm/priv.c | ||
218 | @@ -328,6 +328,7 @@ static void handle_stsi_3_2_2(struct kvm_vcpu *vcpu, struct sysinfo_3_2_2 *mem) | ||
219 | for (n = mem->count - 1; n > 0 ; n--) | ||
220 | memcpy(&mem->vm[n], &mem->vm[n - 1], sizeof(mem->vm[0])); | ||
221 | |||
222 | + memset(&mem->vm[0], 0, sizeof(mem->vm[0])); | ||
223 | mem->vm[0].cpus_total = cpus; | ||
224 | mem->vm[0].cpus_configured = cpus; | ||
225 | mem->vm[0].cpus_standby = 0; | ||
226 | diff --git a/arch/sh/include/asm/sections.h b/arch/sh/include/asm/sections.h | ||
227 | index 1b6199740e98..7a99e6af6372 100644 | ||
228 | --- a/arch/sh/include/asm/sections.h | ||
229 | +++ b/arch/sh/include/asm/sections.h | ||
230 | @@ -3,7 +3,6 @@ | ||
231 | |||
232 | #include <asm-generic/sections.h> | ||
233 | |||
234 | -extern long __nosave_begin, __nosave_end; | ||
235 | extern long __machvec_start, __machvec_end; | ||
236 | extern char __uncached_start, __uncached_end; | ||
237 | extern char __start_eh_frame[], __stop_eh_frame[]; | ||
238 | diff --git a/arch/sparc/power/hibernate.c b/arch/sparc/power/hibernate.c | ||
239 | index 42b0b8ce699a..17bd2e167e07 100644 | ||
240 | --- a/arch/sparc/power/hibernate.c | ||
241 | +++ b/arch/sparc/power/hibernate.c | ||
242 | @@ -9,11 +9,9 @@ | ||
243 | #include <asm/hibernate.h> | ||
244 | #include <asm/visasm.h> | ||
245 | #include <asm/page.h> | ||
246 | +#include <asm/sections.h> | ||
247 | #include <asm/tlb.h> | ||
248 | |||
249 | -/* References to section boundaries */ | ||
250 | -extern const void __nosave_begin, __nosave_end; | ||
251 | - | ||
252 | struct saved_context saved_context; | ||
253 | |||
254 | /* | ||
255 | diff --git a/arch/unicore32/include/mach/pm.h b/arch/unicore32/include/mach/pm.h | ||
256 | index 4dcd34ae194c..77b522694e74 100644 | ||
257 | --- a/arch/unicore32/include/mach/pm.h | ||
258 | +++ b/arch/unicore32/include/mach/pm.h | ||
259 | @@ -36,8 +36,5 @@ extern int puv3_pm_enter(suspend_state_t state); | ||
260 | /* Defined in hibernate_asm.S */ | ||
261 | extern int restore_image(pgd_t *resume_pg_dir, struct pbe *restore_pblist); | ||
262 | |||
263 | -/* References to section boundaries */ | ||
264 | -extern const void __nosave_begin, __nosave_end; | ||
265 | - | ||
266 | extern struct pbe *restore_pblist; | ||
267 | #endif | ||
268 | diff --git a/arch/unicore32/kernel/hibernate.c b/arch/unicore32/kernel/hibernate.c | ||
269 | index d75ef8b6cb56..9969ec374abb 100644 | ||
270 | --- a/arch/unicore32/kernel/hibernate.c | ||
271 | +++ b/arch/unicore32/kernel/hibernate.c | ||
272 | @@ -18,6 +18,7 @@ | ||
273 | #include <asm/page.h> | ||
274 | #include <asm/pgtable.h> | ||
275 | #include <asm/pgalloc.h> | ||
276 | +#include <asm/sections.h> | ||
277 | #include <asm/suspend.h> | ||
278 | |||
279 | #include "mach/pm.h" | ||
280 | diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c | ||
281 | index 7d28c885d238..291226b952a9 100644 | ||
282 | --- a/arch/x86/power/hibernate_32.c | ||
283 | +++ b/arch/x86/power/hibernate_32.c | ||
284 | @@ -13,13 +13,11 @@ | ||
285 | #include <asm/page.h> | ||
286 | #include <asm/pgtable.h> | ||
287 | #include <asm/mmzone.h> | ||
288 | +#include <asm/sections.h> | ||
289 | |||
290 | /* Defined in hibernate_asm_32.S */ | ||
291 | extern int restore_image(void); | ||
292 | |||
293 | -/* References to section boundaries */ | ||
294 | -extern const void __nosave_begin, __nosave_end; | ||
295 | - | ||
296 | /* Pointer to the temporary resume page tables */ | ||
297 | pgd_t *resume_pg_dir; | ||
298 | |||
299 | diff --git a/arch/x86/power/hibernate_64.c b/arch/x86/power/hibernate_64.c | ||
300 | index a0fde91c16cf..8ecaed127634 100644 | ||
301 | --- a/arch/x86/power/hibernate_64.c | ||
302 | +++ b/arch/x86/power/hibernate_64.c | ||
303 | @@ -17,11 +17,9 @@ | ||
304 | #include <asm/page.h> | ||
305 | #include <asm/pgtable.h> | ||
306 | #include <asm/mtrr.h> | ||
307 | +#include <asm/sections.h> | ||
308 | #include <asm/suspend.h> | ||
309 | |||
310 | -/* References to section boundaries */ | ||
311 | -extern const void __nosave_begin, __nosave_end; | ||
312 | - | ||
313 | /* Defined in hibernate_asm_64.S */ | ||
314 | extern int restore_image(void); | ||
315 | |||
316 | diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig | ||
317 | index 0a1b95f81a32..2b086a6ae6c7 100644 | ||
318 | --- a/arch/xtensa/Kconfig | ||
319 | +++ b/arch/xtensa/Kconfig | ||
320 | @@ -287,6 +287,36 @@ menu "Executable file formats" | ||
321 | |||
322 | source "fs/Kconfig.binfmt" | ||
323 | |||
324 | +config XTFPGA_LCD | ||
325 | + bool "Enable XTFPGA LCD driver" | ||
326 | + depends on XTENSA_PLATFORM_XTFPGA | ||
327 | + default n | ||
328 | + help | ||
329 | + There's a 2x16 LCD on most of XTFPGA boards, kernel may output | ||
330 | + progress messages there during bootup/shutdown. It may be useful | ||
331 | + during board bringup. | ||
332 | + | ||
333 | + If unsure, say N. | ||
334 | + | ||
335 | +config XTFPGA_LCD_BASE_ADDR | ||
336 | + hex "XTFPGA LCD base address" | ||
337 | + depends on XTFPGA_LCD | ||
338 | + default "0x0d0c0000" | ||
339 | + help | ||
340 | + Base address of the LCD controller inside KIO region. | ||
341 | + Different boards from XTFPGA family have LCD controller at different | ||
342 | + addresses. Please consult prototyping user guide for your board for | ||
343 | + the correct address. Wrong address here may lead to hardware lockup. | ||
344 | + | ||
345 | +config XTFPGA_LCD_8BIT_ACCESS | ||
346 | + bool "Use 8-bit access to XTFPGA LCD" | ||
347 | + depends on XTFPGA_LCD | ||
348 | + default n | ||
349 | + help | ||
350 | + LCD may be connected with 4- or 8-bit interface, 8-bit access may | ||
351 | + only be used with 8-bit interface. Please consult prototyping user | ||
352 | + guide for your board for the correct interface width. | ||
353 | + | ||
354 | endmenu | ||
355 | |||
356 | source "net/Kconfig" | ||
357 | diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h | ||
358 | index 513effd48060..d07c1886bc8f 100644 | ||
359 | --- a/arch/xtensa/include/uapi/asm/unistd.h | ||
360 | +++ b/arch/xtensa/include/uapi/asm/unistd.h | ||
361 | @@ -715,7 +715,7 @@ __SYSCALL(323, sys_process_vm_writev, 6) | ||
362 | __SYSCALL(324, sys_name_to_handle_at, 5) | ||
363 | #define __NR_open_by_handle_at 325 | ||
364 | __SYSCALL(325, sys_open_by_handle_at, 3) | ||
365 | -#define __NR_sync_file_range 326 | ||
366 | +#define __NR_sync_file_range2 326 | ||
367 | __SYSCALL(326, sys_sync_file_range2, 6) | ||
368 | #define __NR_perf_event_open 327 | ||
369 | __SYSCALL(327, sys_perf_event_open, 5) | ||
370 | diff --git a/arch/xtensa/platforms/xtfpga/Makefile b/arch/xtensa/platforms/xtfpga/Makefile | ||
371 | index b9ae206340cd..7839d38b2337 100644 | ||
372 | --- a/arch/xtensa/platforms/xtfpga/Makefile | ||
373 | +++ b/arch/xtensa/platforms/xtfpga/Makefile | ||
374 | @@ -6,4 +6,5 @@ | ||
375 | # | ||
376 | # Note 2! The CFLAGS definitions are in the main makefile... | ||
377 | |||
378 | -obj-y = setup.o lcd.o | ||
379 | +obj-y += setup.o | ||
380 | +obj-$(CONFIG_XTFPGA_LCD) += lcd.o | ||
381 | diff --git a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
382 | index 4416773cbde5..b39fbcf5c611 100644 | ||
383 | --- a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
384 | +++ b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h | ||
385 | @@ -44,9 +44,6 @@ | ||
386 | |||
387 | /* UART */ | ||
388 | #define DUART16552_PADDR (XCHAL_KIO_PADDR + 0x0D050020) | ||
389 | -/* LCD instruction and data addresses. */ | ||
390 | -#define LCD_INSTR_ADDR ((char *)IOADDR(0x0D040000)) | ||
391 | -#define LCD_DATA_ADDR ((char *)IOADDR(0x0D040004)) | ||
392 | |||
393 | /* Misc. */ | ||
394 | #define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000) | ||
395 | diff --git a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
396 | index 0e435645af5a..4c8541ed1139 100644 | ||
397 | --- a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
398 | +++ b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h | ||
399 | @@ -11,10 +11,25 @@ | ||
400 | #ifndef __XTENSA_XTAVNET_LCD_H | ||
401 | #define __XTENSA_XTAVNET_LCD_H | ||
402 | |||
403 | +#ifdef CONFIG_XTFPGA_LCD | ||
404 | /* Display string STR at position POS on the LCD. */ | ||
405 | void lcd_disp_at_pos(char *str, unsigned char pos); | ||
406 | |||
407 | /* Shift the contents of the LCD display left or right. */ | ||
408 | void lcd_shiftleft(void); | ||
409 | void lcd_shiftright(void); | ||
410 | +#else | ||
411 | +static inline void lcd_disp_at_pos(char *str, unsigned char pos) | ||
412 | +{ | ||
413 | +} | ||
414 | + | ||
415 | +static inline void lcd_shiftleft(void) | ||
416 | +{ | ||
417 | +} | ||
418 | + | ||
419 | +static inline void lcd_shiftright(void) | ||
420 | +{ | ||
421 | +} | ||
422 | +#endif | ||
423 | + | ||
424 | #endif | ||
425 | diff --git a/arch/xtensa/platforms/xtfpga/lcd.c b/arch/xtensa/platforms/xtfpga/lcd.c | ||
426 | index 2872301598df..4dc0c1b43f4b 100644 | ||
427 | --- a/arch/xtensa/platforms/xtfpga/lcd.c | ||
428 | +++ b/arch/xtensa/platforms/xtfpga/lcd.c | ||
429 | @@ -1,50 +1,63 @@ | ||
430 | /* | ||
431 | - * Driver for the LCD display on the Tensilica LX60 Board. | ||
432 | + * Driver for the LCD display on the Tensilica XTFPGA board family. | ||
433 | + * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf | ||
434 | * | ||
435 | * This file is subject to the terms and conditions of the GNU General Public | ||
436 | * License. See the file "COPYING" in the main directory of this archive | ||
437 | * for more details. | ||
438 | * | ||
439 | * Copyright (C) 2001, 2006 Tensilica Inc. | ||
440 | + * Copyright (C) 2015 Cadence Design Systems Inc. | ||
441 | */ | ||
442 | |||
443 | -/* | ||
444 | - * | ||
445 | - * FIXME: this code is from the examples from the LX60 user guide. | ||
446 | - * | ||
447 | - * The lcd_pause function does busy waiting, which is probably not | ||
448 | - * great. Maybe the code could be changed to use kernel timers, or | ||
449 | - * change the hardware to not need to wait. | ||
450 | - */ | ||
451 | - | ||
452 | +#include <linux/delay.h> | ||
453 | #include <linux/init.h> | ||
454 | #include <linux/io.h> | ||
455 | |||
456 | #include <platform/hardware.h> | ||
457 | #include <platform/lcd.h> | ||
458 | -#include <linux/delay.h> | ||
459 | |||
460 | -#define LCD_PAUSE_ITERATIONS 4000 | ||
461 | +/* LCD instruction and data addresses. */ | ||
462 | +#define LCD_INSTR_ADDR ((char *)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR)) | ||
463 | +#define LCD_DATA_ADDR (LCD_INSTR_ADDR + 4) | ||
464 | + | ||
465 | #define LCD_CLEAR 0x1 | ||
466 | #define LCD_DISPLAY_ON 0xc | ||
467 | |||
468 | /* 8bit and 2 lines display */ | ||
469 | #define LCD_DISPLAY_MODE8BIT 0x38 | ||
470 | +#define LCD_DISPLAY_MODE4BIT 0x28 | ||
471 | #define LCD_DISPLAY_POS 0x80 | ||
472 | #define LCD_SHIFT_LEFT 0x18 | ||
473 | #define LCD_SHIFT_RIGHT 0x1c | ||
474 | |||
475 | +static void lcd_put_byte(u8 *addr, u8 data) | ||
476 | +{ | ||
477 | +#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS | ||
478 | + ACCESS_ONCE(*addr) = data; | ||
479 | +#else | ||
480 | + ACCESS_ONCE(*addr) = data & 0xf0; | ||
481 | + ACCESS_ONCE(*addr) = (data << 4) & 0xf0; | ||
482 | +#endif | ||
483 | +} | ||
484 | + | ||
485 | static int __init lcd_init(void) | ||
486 | { | ||
487 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
488 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
489 | mdelay(5); | ||
490 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
491 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
492 | udelay(200); | ||
493 | - *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; | ||
494 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT; | ||
495 | + udelay(50); | ||
496 | +#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS | ||
497 | + ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT; | ||
498 | + udelay(50); | ||
499 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT); | ||
500 | udelay(50); | ||
501 | - *LCD_INSTR_ADDR = LCD_DISPLAY_ON; | ||
502 | +#endif | ||
503 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON); | ||
504 | udelay(50); | ||
505 | - *LCD_INSTR_ADDR = LCD_CLEAR; | ||
506 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR); | ||
507 | mdelay(10); | ||
508 | lcd_disp_at_pos("XTENSA LINUX", 0); | ||
509 | return 0; | ||
510 | @@ -52,10 +65,10 @@ static int __init lcd_init(void) | ||
511 | |||
512 | void lcd_disp_at_pos(char *str, unsigned char pos) | ||
513 | { | ||
514 | - *LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos; | ||
515 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos); | ||
516 | udelay(100); | ||
517 | while (*str != 0) { | ||
518 | - *LCD_DATA_ADDR = *str; | ||
519 | + lcd_put_byte(LCD_DATA_ADDR, *str); | ||
520 | udelay(200); | ||
521 | str++; | ||
522 | } | ||
523 | @@ -63,13 +76,13 @@ void lcd_disp_at_pos(char *str, unsigned char pos) | ||
524 | |||
525 | void lcd_shiftleft(void) | ||
526 | { | ||
527 | - *LCD_INSTR_ADDR = LCD_SHIFT_LEFT; | ||
528 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT); | ||
529 | udelay(50); | ||
530 | } | ||
531 | |||
532 | void lcd_shiftright(void) | ||
533 | { | ||
534 | - *LCD_INSTR_ADDR = LCD_SHIFT_RIGHT; | ||
535 | + lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT); | ||
536 | udelay(50); | ||
537 | } | ||
538 | |||
539 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
540 | index 7695b5dd9d2d..35287ab445cd 100644 | ||
541 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
542 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
543 | @@ -909,6 +909,7 @@ | ||
544 | #define GMBUS_CYCLE_INDEX (2<<25) | ||
545 | #define GMBUS_CYCLE_STOP (4<<25) | ||
546 | #define GMBUS_BYTE_COUNT_SHIFT 16 | ||
547 | +#define GMBUS_BYTE_COUNT_MAX 256U | ||
548 | #define GMBUS_SLAVE_INDEX_SHIFT 8 | ||
549 | #define GMBUS_SLAVE_ADDR_SHIFT 1 | ||
550 | #define GMBUS_SLAVE_READ (1<<0) | ||
551 | diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c | ||
552 | index 639fe192997c..4a21e13cc58c 100644 | ||
553 | --- a/drivers/gpu/drm/i915/intel_i2c.c | ||
554 | +++ b/drivers/gpu/drm/i915/intel_i2c.c | ||
555 | @@ -276,18 +276,17 @@ gmbus_wait_idle(struct drm_i915_private *dev_priv) | ||
556 | } | ||
557 | |||
558 | static int | ||
559 | -gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
560 | - u32 gmbus1_index) | ||
561 | +gmbus_xfer_read_chunk(struct drm_i915_private *dev_priv, | ||
562 | + unsigned short addr, u8 *buf, unsigned int len, | ||
563 | + u32 gmbus1_index) | ||
564 | { | ||
565 | int reg_offset = dev_priv->gpio_mmio_base; | ||
566 | - u16 len = msg->len; | ||
567 | - u8 *buf = msg->buf; | ||
568 | |||
569 | I915_WRITE(GMBUS1 + reg_offset, | ||
570 | gmbus1_index | | ||
571 | GMBUS_CYCLE_WAIT | | ||
572 | (len << GMBUS_BYTE_COUNT_SHIFT) | | ||
573 | - (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
574 | + (addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
575 | GMBUS_SLAVE_READ | GMBUS_SW_RDY); | ||
576 | while (len) { | ||
577 | int ret; | ||
578 | @@ -309,11 +308,35 @@ gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
579 | } | ||
580 | |||
581 | static int | ||
582 | -gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
583 | +gmbus_xfer_read(struct drm_i915_private *dev_priv, struct i2c_msg *msg, | ||
584 | + u32 gmbus1_index) | ||
585 | { | ||
586 | - int reg_offset = dev_priv->gpio_mmio_base; | ||
587 | - u16 len = msg->len; | ||
588 | u8 *buf = msg->buf; | ||
589 | + unsigned int rx_size = msg->len; | ||
590 | + unsigned int len; | ||
591 | + int ret; | ||
592 | + | ||
593 | + do { | ||
594 | + len = min(rx_size, GMBUS_BYTE_COUNT_MAX); | ||
595 | + | ||
596 | + ret = gmbus_xfer_read_chunk(dev_priv, msg->addr, | ||
597 | + buf, len, gmbus1_index); | ||
598 | + if (ret) | ||
599 | + return ret; | ||
600 | + | ||
601 | + rx_size -= len; | ||
602 | + buf += len; | ||
603 | + } while (rx_size != 0); | ||
604 | + | ||
605 | + return 0; | ||
606 | +} | ||
607 | + | ||
608 | +static int | ||
609 | +gmbus_xfer_write_chunk(struct drm_i915_private *dev_priv, | ||
610 | + unsigned short addr, u8 *buf, unsigned int len) | ||
611 | +{ | ||
612 | + int reg_offset = dev_priv->gpio_mmio_base; | ||
613 | + unsigned int chunk_size = len; | ||
614 | u32 val, loop; | ||
615 | |||
616 | val = loop = 0; | ||
617 | @@ -325,8 +348,8 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
618 | I915_WRITE(GMBUS3 + reg_offset, val); | ||
619 | I915_WRITE(GMBUS1 + reg_offset, | ||
620 | GMBUS_CYCLE_WAIT | | ||
621 | - (msg->len << GMBUS_BYTE_COUNT_SHIFT) | | ||
622 | - (msg->addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
623 | + (chunk_size << GMBUS_BYTE_COUNT_SHIFT) | | ||
624 | + (addr << GMBUS_SLAVE_ADDR_SHIFT) | | ||
625 | GMBUS_SLAVE_WRITE | GMBUS_SW_RDY); | ||
626 | while (len) { | ||
627 | int ret; | ||
628 | @@ -343,6 +366,29 @@ gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
629 | if (ret) | ||
630 | return ret; | ||
631 | } | ||
632 | + | ||
633 | + return 0; | ||
634 | +} | ||
635 | + | ||
636 | +static int | ||
637 | +gmbus_xfer_write(struct drm_i915_private *dev_priv, struct i2c_msg *msg) | ||
638 | +{ | ||
639 | + u8 *buf = msg->buf; | ||
640 | + unsigned int tx_size = msg->len; | ||
641 | + unsigned int len; | ||
642 | + int ret; | ||
643 | + | ||
644 | + do { | ||
645 | + len = min(tx_size, GMBUS_BYTE_COUNT_MAX); | ||
646 | + | ||
647 | + ret = gmbus_xfer_write_chunk(dev_priv, msg->addr, buf, len); | ||
648 | + if (ret) | ||
649 | + return ret; | ||
650 | + | ||
651 | + buf += len; | ||
652 | + tx_size -= len; | ||
653 | + } while (tx_size != 0); | ||
654 | + | ||
655 | return 0; | ||
656 | } | ||
657 | |||
658 | diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
659 | index 971dd8795b68..8ac333094991 100644 | ||
660 | --- a/drivers/gpu/drm/radeon/atombios_crtc.c | ||
661 | +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | ||
662 | @@ -312,8 +312,10 @@ atombios_set_crtc_dtd_timing(struct drm_crtc *crtc, | ||
663 | misc |= ATOM_COMPOSITESYNC; | ||
664 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||
665 | misc |= ATOM_INTERLACE; | ||
666 | - if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
667 | + if (mode->flags & DRM_MODE_FLAG_DBLCLK) | ||
668 | misc |= ATOM_DOUBLE_CLOCK_MODE; | ||
669 | + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
670 | + misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2; | ||
671 | |||
672 | args.susModeMiscInfo.usAccess = cpu_to_le16(misc); | ||
673 | args.ucCRTC = radeon_crtc->crtc_id; | ||
674 | @@ -356,8 +358,10 @@ static void atombios_crtc_set_timing(struct drm_crtc *crtc, | ||
675 | misc |= ATOM_COMPOSITESYNC; | ||
676 | if (mode->flags & DRM_MODE_FLAG_INTERLACE) | ||
677 | misc |= ATOM_INTERLACE; | ||
678 | - if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
679 | + if (mode->flags & DRM_MODE_FLAG_DBLCLK) | ||
680 | misc |= ATOM_DOUBLE_CLOCK_MODE; | ||
681 | + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) | ||
682 | + misc |= ATOM_H_REPLICATIONBY2 | ATOM_V_REPLICATIONBY2; | ||
683 | |||
684 | args.susModeMiscInfo.usAccess = cpu_to_le16(misc); | ||
685 | args.ucCRTC = radeon_crtc->crtc_id; | ||
686 | diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c | ||
687 | index 92f34de7aee9..05e6a7d13d4e 100644 | ||
688 | --- a/drivers/hv/channel.c | ||
689 | +++ b/drivers/hv/channel.c | ||
690 | @@ -169,7 +169,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, | ||
691 | GFP_KERNEL); | ||
692 | if (!open_info) { | ||
693 | err = -ENOMEM; | ||
694 | - goto error0; | ||
695 | + goto error_gpadl; | ||
696 | } | ||
697 | |||
698 | init_completion(&open_info->waitevent); | ||
699 | @@ -185,7 +185,7 @@ int vmbus_open(struct vmbus_channel *newchannel, u32 send_ringbuffer_size, | ||
700 | |||
701 | if (userdatalen > MAX_USER_DEFINED_BYTES) { | ||
702 | err = -EINVAL; | ||
703 | - goto error0; | ||
704 | + goto error_gpadl; | ||
705 | } | ||
706 | |||
707 | if (userdatalen) | ||
708 | @@ -226,6 +226,9 @@ error1: | ||
709 | list_del(&open_info->msglistentry); | ||
710 | spin_unlock_irqrestore(&vmbus_connection.channelmsg_lock, flags); | ||
711 | |||
712 | +error_gpadl: | ||
713 | + vmbus_teardown_gpadl(newchannel, newchannel->ringbuffer_gpadlhandle); | ||
714 | + | ||
715 | error0: | ||
716 | free_pages((unsigned long)out, | ||
717 | get_order(send_ringbuffer_size + recv_ringbuffer_size)); | ||
718 | diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c | ||
719 | index 48e31ed69dbf..9d539cbfc833 100644 | ||
720 | --- a/drivers/i2c/i2c-core.c | ||
721 | +++ b/drivers/i2c/i2c-core.c | ||
722 | @@ -206,6 +206,7 @@ int i2c_generic_scl_recovery(struct i2c_adapter *adap) | ||
723 | adap->bus_recovery_info->set_scl(adap, 1); | ||
724 | return i2c_generic_recovery(adap); | ||
725 | } | ||
726 | +EXPORT_SYMBOL_GPL(i2c_generic_scl_recovery); | ||
727 | |||
728 | int i2c_generic_gpio_recovery(struct i2c_adapter *adap) | ||
729 | { | ||
730 | @@ -220,6 +221,7 @@ int i2c_generic_gpio_recovery(struct i2c_adapter *adap) | ||
731 | |||
732 | return ret; | ||
733 | } | ||
734 | +EXPORT_SYMBOL_GPL(i2c_generic_gpio_recovery); | ||
735 | |||
736 | int i2c_recover_bus(struct i2c_adapter *adap) | ||
737 | { | ||
738 | @@ -229,6 +231,7 @@ int i2c_recover_bus(struct i2c_adapter *adap) | ||
739 | dev_dbg(&adap->dev, "Trying i2c bus recovery\n"); | ||
740 | return adap->bus_recovery_info->recover_bus(adap); | ||
741 | } | ||
742 | +EXPORT_SYMBOL_GPL(i2c_recover_bus); | ||
743 | |||
744 | static int i2c_device_probe(struct device *dev) | ||
745 | { | ||
746 | diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c | ||
747 | index 055ebebc07dd..c1fef27010d4 100644 | ||
748 | --- a/drivers/infiniband/core/umem.c | ||
749 | +++ b/drivers/infiniband/core/umem.c | ||
750 | @@ -94,12 +94,15 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr, | ||
751 | if (dmasync) | ||
752 | dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs); | ||
753 | |||
754 | + if (!size) | ||
755 | + return ERR_PTR(-EINVAL); | ||
756 | + | ||
757 | /* | ||
758 | * If the combination of the addr and size requested for this memory | ||
759 | * region causes an integer overflow, return error. | ||
760 | */ | ||
761 | - if ((PAGE_ALIGN(addr + size) <= size) || | ||
762 | - (PAGE_ALIGN(addr + size) <= addr)) | ||
763 | + if (((addr + size) < addr) || | ||
764 | + PAGE_ALIGN(addr + size) < (addr + size)) | ||
765 | return ERR_PTR(-EINVAL); | ||
766 | |||
767 | if (!can_do_mlock()) | ||
768 | diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c | ||
769 | index 4f10af2905b5..262a18437ceb 100644 | ||
770 | --- a/drivers/infiniband/hw/mlx4/qp.c | ||
771 | +++ b/drivers/infiniband/hw/mlx4/qp.c | ||
772 | @@ -2174,8 +2174,7 @@ static int build_lso_seg(struct mlx4_wqe_lso_seg *wqe, struct ib_send_wr *wr, | ||
773 | |||
774 | memcpy(wqe->header, wr->wr.ud.header, wr->wr.ud.hlen); | ||
775 | |||
776 | - *lso_hdr_sz = cpu_to_be32((wr->wr.ud.mss - wr->wr.ud.hlen) << 16 | | ||
777 | - wr->wr.ud.hlen); | ||
778 | + *lso_hdr_sz = cpu_to_be32(wr->wr.ud.mss << 16 | wr->wr.ud.hlen); | ||
779 | *lso_seg_len = halign; | ||
780 | return 0; | ||
781 | } | ||
782 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c | ||
783 | index 85e75239c814..1af7df263368 100644 | ||
784 | --- a/drivers/input/mouse/elantech.c | ||
785 | +++ b/drivers/input/mouse/elantech.c | ||
786 | @@ -784,6 +784,21 @@ static psmouse_ret_t elantech_process_byte(struct psmouse *psmouse) | ||
787 | } | ||
788 | |||
789 | /* | ||
790 | + * This writes the reg_07 value again to the hardware at the end of every | ||
791 | + * set_rate call because the register loses its value. reg_07 allows setting | ||
792 | + * absolute mode on v4 hardware | ||
793 | + */ | ||
794 | +static void elantech_set_rate_restore_reg_07(struct psmouse *psmouse, | ||
795 | + unsigned int rate) | ||
796 | +{ | ||
797 | + struct elantech_data *etd = psmouse->private; | ||
798 | + | ||
799 | + etd->original_set_rate(psmouse, rate); | ||
800 | + if (elantech_write_reg(psmouse, 0x07, etd->reg_07)) | ||
801 | + psmouse_err(psmouse, "restoring reg_07 failed\n"); | ||
802 | +} | ||
803 | + | ||
804 | +/* | ||
805 | * Put the touchpad into absolute mode | ||
806 | */ | ||
807 | static int elantech_set_absolute_mode(struct psmouse *psmouse) | ||
808 | @@ -985,6 +1000,8 @@ static int elantech_get_resolution_v4(struct psmouse *psmouse, | ||
809 | * Asus K53SV 0x450f01 78, 15, 0c 2 hw buttons | ||
810 | * Asus G46VW 0x460f02 00, 18, 0c 2 hw buttons | ||
811 | * Asus G750JX 0x360f00 00, 16, 0c 2 hw buttons | ||
812 | + * Asus TP500LN 0x381f17 10, 14, 0e clickpad | ||
813 | + * Asus X750JN 0x381f17 10, 14, 0e clickpad | ||
814 | * Asus UX31 0x361f00 20, 15, 0e clickpad | ||
815 | * Asus UX32VD 0x361f02 00, 15, 0e clickpad | ||
816 | * Avatar AVIU-145A2 0x361f00 ? clickpad | ||
817 | @@ -1452,6 +1469,11 @@ int elantech_init(struct psmouse *psmouse) | ||
818 | goto init_fail; | ||
819 | } | ||
820 | |||
821 | + if (etd->fw_version == 0x381f17) { | ||
822 | + etd->original_set_rate = psmouse->set_rate; | ||
823 | + psmouse->set_rate = elantech_set_rate_restore_reg_07; | ||
824 | + } | ||
825 | + | ||
826 | if (elantech_set_input_params(psmouse)) { | ||
827 | psmouse_err(psmouse, "failed to query touchpad range.\n"); | ||
828 | goto init_fail; | ||
829 | diff --git a/drivers/input/mouse/elantech.h b/drivers/input/mouse/elantech.h | ||
830 | index c1c15ab6872d..13a12ccbff51 100644 | ||
831 | --- a/drivers/input/mouse/elantech.h | ||
832 | +++ b/drivers/input/mouse/elantech.h | ||
833 | @@ -138,6 +138,7 @@ struct elantech_data { | ||
834 | struct finger_pos mt[ETP_MAX_FINGERS]; | ||
835 | unsigned char parity[256]; | ||
836 | int (*send_cmd)(struct psmouse *psmouse, unsigned char c, unsigned char *param); | ||
837 | + void (*original_set_rate)(struct psmouse *psmouse, unsigned int rate); | ||
838 | }; | ||
839 | |||
840 | #ifdef CONFIG_MOUSE_PS2_ELANTECH | ||
841 | diff --git a/drivers/media/usb/stk1160/stk1160-v4l.c b/drivers/media/usb/stk1160/stk1160-v4l.c | ||
842 | index a59153d2f8bf..518a5299ff0b 100644 | ||
843 | --- a/drivers/media/usb/stk1160/stk1160-v4l.c | ||
844 | +++ b/drivers/media/usb/stk1160/stk1160-v4l.c | ||
845 | @@ -245,6 +245,11 @@ static int stk1160_stop_streaming(struct stk1160 *dev) | ||
846 | if (mutex_lock_interruptible(&dev->v4l_lock)) | ||
847 | return -ERESTARTSYS; | ||
848 | |||
849 | + /* | ||
850 | + * Once URBs are cancelled, the URB complete handler | ||
851 | + * won't be running. This is required to safely release the | ||
852 | + * current buffer (dev->isoc_ctl.buf). | ||
853 | + */ | ||
854 | stk1160_cancel_isoc(dev); | ||
855 | |||
856 | /* | ||
857 | @@ -665,8 +670,16 @@ void stk1160_clear_queue(struct stk1160 *dev) | ||
858 | stk1160_info("buffer [%p/%d] aborted\n", | ||
859 | buf, buf->vb.v4l2_buf.index); | ||
860 | } | ||
861 | - /* It's important to clear current buffer */ | ||
862 | - dev->isoc_ctl.buf = NULL; | ||
863 | + | ||
864 | + /* It's important to release the current buffer */ | ||
865 | + if (dev->isoc_ctl.buf) { | ||
866 | + buf = dev->isoc_ctl.buf; | ||
867 | + dev->isoc_ctl.buf = NULL; | ||
868 | + | ||
869 | + vb2_buffer_done(&buf->vb, VB2_BUF_STATE_ERROR); | ||
870 | + stk1160_info("buffer [%p/%d] aborted\n", | ||
871 | + buf, buf->vb.v4l2_buf.index); | ||
872 | + } | ||
873 | spin_unlock_irqrestore(&dev->buf_lock, flags); | ||
874 | } | ||
875 | |||
876 | diff --git a/drivers/memstick/core/mspro_block.c b/drivers/memstick/core/mspro_block.c | ||
877 | index f4176ca3a794..cdd61ab5c2b5 100644 | ||
878 | --- a/drivers/memstick/core/mspro_block.c | ||
879 | +++ b/drivers/memstick/core/mspro_block.c | ||
880 | @@ -758,7 +758,7 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error) | ||
881 | |||
882 | if (error || (card->current_mrq.tpc == MSPRO_CMD_STOP)) { | ||
883 | if (msb->data_dir == READ) { | ||
884 | - for (cnt = 0; cnt < msb->current_seg; cnt++) | ||
885 | + for (cnt = 0; cnt < msb->current_seg; cnt++) { | ||
886 | t_len += msb->req_sg[cnt].length | ||
887 | / msb->page_size; | ||
888 | |||
889 | @@ -766,6 +766,7 @@ static int mspro_block_complete_req(struct memstick_dev *card, int error) | ||
890 | t_len += msb->current_page - 1; | ||
891 | |||
892 | t_len *= msb->page_size; | ||
893 | + } | ||
894 | } | ||
895 | } else | ||
896 | t_len = blk_rq_bytes(msb->block_req); | ||
897 | diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c | ||
898 | index c071d410488f..79d69bd26dd2 100644 | ||
899 | --- a/drivers/mtd/ubi/attach.c | ||
900 | +++ b/drivers/mtd/ubi/attach.c | ||
901 | @@ -408,7 +408,7 @@ int ubi_compare_lebs(struct ubi_device *ubi, const struct ubi_ainf_peb *aeb, | ||
902 | second_is_newer = !second_is_newer; | ||
903 | } else { | ||
904 | dbg_bld("PEB %d CRC is OK", pnum); | ||
905 | - bitflips = !!err; | ||
906 | + bitflips |= !!err; | ||
907 | } | ||
908 | mutex_unlock(&ubi->buf_mutex); | ||
909 | |||
910 | diff --git a/drivers/mtd/ubi/cdev.c b/drivers/mtd/ubi/cdev.c | ||
911 | index 4f02848bb2bc..fc764e7976bd 100644 | ||
912 | --- a/drivers/mtd/ubi/cdev.c | ||
913 | +++ b/drivers/mtd/ubi/cdev.c | ||
914 | @@ -475,7 +475,7 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd, | ||
915 | /* Validate the request */ | ||
916 | err = -EINVAL; | ||
917 | if (req.lnum < 0 || req.lnum >= vol->reserved_pebs || | ||
918 | - req.bytes < 0 || req.lnum >= vol->usable_leb_size) | ||
919 | + req.bytes < 0 || req.bytes > vol->usable_leb_size) | ||
920 | break; | ||
921 | |||
922 | err = get_exclusive(desc); | ||
923 | diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c | ||
924 | index 0e11671dadc4..930cf2c77abb 100644 | ||
925 | --- a/drivers/mtd/ubi/eba.c | ||
926 | +++ b/drivers/mtd/ubi/eba.c | ||
927 | @@ -1362,7 +1362,8 @@ int ubi_eba_init(struct ubi_device *ubi, struct ubi_attach_info *ai) | ||
928 | * during re-size. | ||
929 | */ | ||
930 | ubi_move_aeb_to_list(av, aeb, &ai->erase); | ||
931 | - vol->eba_tbl[aeb->lnum] = aeb->pnum; | ||
932 | + else | ||
933 | + vol->eba_tbl[aeb->lnum] = aeb->pnum; | ||
934 | } | ||
935 | } | ||
936 | |||
937 | diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c | ||
938 | index 49e570abe58b..c08254016fe8 100644 | ||
939 | --- a/drivers/mtd/ubi/wl.c | ||
940 | +++ b/drivers/mtd/ubi/wl.c | ||
941 | @@ -999,7 +999,7 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, | ||
942 | int cancel) | ||
943 | { | ||
944 | int err, scrubbing = 0, torture = 0, protect = 0, erroneous = 0; | ||
945 | - int vol_id = -1, uninitialized_var(lnum); | ||
946 | + int vol_id = -1, lnum = -1; | ||
947 | #ifdef CONFIG_MTD_UBI_FASTMAP | ||
948 | int anchor = wrk->anchor; | ||
949 | #endif | ||
950 | diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
951 | index 59ad007dd5aa..a978fc82ceb5 100644 | ||
952 | --- a/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
953 | +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c | ||
954 | @@ -144,6 +144,11 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter, | ||
955 | static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter, | ||
956 | struct e1000_rx_ring *rx_ring, | ||
957 | int *work_done, int work_to_do); | ||
958 | +static void e1000_alloc_dummy_rx_buffers(struct e1000_adapter *adapter, | ||
959 | + struct e1000_rx_ring *rx_ring, | ||
960 | + int cleaned_count) | ||
961 | +{ | ||
962 | +} | ||
963 | static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter, | ||
964 | struct e1000_rx_ring *rx_ring, | ||
965 | int cleaned_count); | ||
966 | @@ -3555,8 +3560,11 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu) | ||
967 | msleep(1); | ||
968 | /* e1000_down has a dependency on max_frame_size */ | ||
969 | hw->max_frame_size = max_frame; | ||
970 | - if (netif_running(netdev)) | ||
971 | + if (netif_running(netdev)) { | ||
972 | + /* prevent buffers from being reallocated */ | ||
973 | + adapter->alloc_rx_buf = e1000_alloc_dummy_rx_buffers; | ||
974 | e1000_down(adapter); | ||
975 | + } | ||
976 | |||
977 | /* NOTE: netdev_alloc_skb reserves 16 bytes, and typically NET_IP_ALIGN | ||
978 | * means we reserve 2 more, this pushes us to allocate from the next | ||
979 | diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
980 | index e7a2af3ad05a..7555095e0b74 100644 | ||
981 | --- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
982 | +++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c | ||
983 | @@ -313,6 +313,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | ||
984 | {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ | ||
985 | {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ | ||
986 | {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ | ||
987 | + {RTL_USB_DEVICE(0x0b05, 0x17ba, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/ | ||
988 | {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ | ||
989 | {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | ||
990 | {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ | ||
991 | @@ -369,6 +370,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = { | ||
992 | {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ | ||
993 | {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ | ||
994 | {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ | ||
995 | + {RTL_USB_DEVICE(0x2001, 0x330d, rtl92cu_hal_cfg)}, /*D-Link DWA-131 */ | ||
996 | {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/ | ||
997 | {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/ | ||
998 | {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/ | ||
999 | diff --git a/drivers/net/wireless/ti/wl18xx/debugfs.c b/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
1000 | index 7f1669cdea09..779dc2b2ca75 100644 | ||
1001 | --- a/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
1002 | +++ b/drivers/net/wireless/ti/wl18xx/debugfs.c | ||
1003 | @@ -136,7 +136,7 @@ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u"); | ||
1004 | WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u"); | ||
1005 | WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u"); | ||
1006 | |||
1007 | -WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); | ||
1008 | +WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50); | ||
1009 | |||
1010 | WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate, | ||
1011 | AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE); | ||
1012 | diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h | ||
1013 | index f7381dd69009..1bce4325e86b 100644 | ||
1014 | --- a/drivers/net/wireless/ti/wlcore/debugfs.h | ||
1015 | +++ b/drivers/net/wireless/ti/wlcore/debugfs.h | ||
1016 | @@ -26,8 +26,8 @@ | ||
1017 | |||
1018 | #include "wlcore.h" | ||
1019 | |||
1020 | -int wl1271_format_buffer(char __user *userbuf, size_t count, | ||
1021 | - loff_t *ppos, char *fmt, ...); | ||
1022 | +__printf(4, 5) int wl1271_format_buffer(char __user *userbuf, size_t count, | ||
1023 | + loff_t *ppos, char *fmt, ...); | ||
1024 | |||
1025 | int wl1271_debugfs_init(struct wl1271 *wl); | ||
1026 | void wl1271_debugfs_exit(struct wl1271 *wl); | ||
1027 | diff --git a/drivers/parport/Kconfig b/drivers/parport/Kconfig | ||
1028 | index a50576081b34..46d2de24bf3e 100644 | ||
1029 | --- a/drivers/parport/Kconfig | ||
1030 | +++ b/drivers/parport/Kconfig | ||
1031 | @@ -36,7 +36,9 @@ if PARPORT | ||
1032 | config PARPORT_PC | ||
1033 | tristate "PC-style hardware" | ||
1034 | depends on (!SPARC64 || PCI) && !SPARC32 && !M32R && !FRV && !S390 && \ | ||
1035 | - (!M68K || ISA) && !MN10300 && !AVR32 && !BLACKFIN && !XTENSA | ||
1036 | + (!M68K || ISA) && !MN10300 && !AVR32 && !BLACKFIN && \ | ||
1037 | + !XTENSA && !CRIS && !H8300 && !ARM64 | ||
1038 | + | ||
1039 | ---help--- | ||
1040 | You should say Y here if you have a PC-style parallel port. All | ||
1041 | IBM PC compatible computers and some Alphas have PC-style | ||
1042 | diff --git a/drivers/power/lp8788-charger.c b/drivers/power/lp8788-charger.c | ||
1043 | index ed49b50b220b..72da2a6c22db 100644 | ||
1044 | --- a/drivers/power/lp8788-charger.c | ||
1045 | +++ b/drivers/power/lp8788-charger.c | ||
1046 | @@ -417,8 +417,10 @@ static int lp8788_psy_register(struct platform_device *pdev, | ||
1047 | pchg->battery.num_properties = ARRAY_SIZE(lp8788_battery_prop); | ||
1048 | pchg->battery.get_property = lp8788_battery_get_property; | ||
1049 | |||
1050 | - if (power_supply_register(&pdev->dev, &pchg->battery)) | ||
1051 | + if (power_supply_register(&pdev->dev, &pchg->battery)) { | ||
1052 | + power_supply_unregister(&pchg->charger); | ||
1053 | return -EPERM; | ||
1054 | + } | ||
1055 | |||
1056 | return 0; | ||
1057 | } | ||
1058 | diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c | ||
1059 | index c9e244984e30..fa50c7dc3d3e 100644 | ||
1060 | --- a/drivers/scsi/mvsas/mv_sas.c | ||
1061 | +++ b/drivers/scsi/mvsas/mv_sas.c | ||
1062 | @@ -441,14 +441,11 @@ static u32 mvs_get_ncq_tag(struct sas_task *task, u32 *tag) | ||
1063 | static int mvs_task_prep_ata(struct mvs_info *mvi, | ||
1064 | struct mvs_task_exec_info *tei) | ||
1065 | { | ||
1066 | - struct sas_ha_struct *sha = mvi->sas; | ||
1067 | struct sas_task *task = tei->task; | ||
1068 | struct domain_device *dev = task->dev; | ||
1069 | struct mvs_device *mvi_dev = dev->lldd_dev; | ||
1070 | struct mvs_cmd_hdr *hdr = tei->hdr; | ||
1071 | struct asd_sas_port *sas_port = dev->port; | ||
1072 | - struct sas_phy *sphy = dev->phy; | ||
1073 | - struct asd_sas_phy *sas_phy = sha->sas_phy[sphy->number]; | ||
1074 | struct mvs_slot_info *slot; | ||
1075 | void *buf_prd; | ||
1076 | u32 tag = tei->tag, hdr_tag; | ||
1077 | @@ -468,7 +465,7 @@ static int mvs_task_prep_ata(struct mvs_info *mvi, | ||
1078 | slot->tx = mvi->tx_prod; | ||
1079 | del_q = TXQ_MODE_I | tag | | ||
1080 | (TXQ_CMD_STP << TXQ_CMD_SHIFT) | | ||
1081 | - (MVS_PHY_ID << TXQ_PHY_SHIFT) | | ||
1082 | + ((sas_port->phy_mask & TXQ_PHY_MASK) << TXQ_PHY_SHIFT) | | ||
1083 | (mvi_dev->taskfileset << TXQ_SRS_SHIFT); | ||
1084 | mvi->tx[mvi->tx_prod] = cpu_to_le32(del_q); | ||
1085 | |||
1086 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c | ||
1087 | index a8990783ba66..913b91c78a22 100644 | ||
1088 | --- a/drivers/scsi/storvsc_drv.c | ||
1089 | +++ b/drivers/scsi/storvsc_drv.c | ||
1090 | @@ -631,21 +631,22 @@ static unsigned int copy_to_bounce_buffer(struct scatterlist *orig_sgl, | ||
1091 | if (bounce_sgl[j].length == PAGE_SIZE) { | ||
1092 | /* full..move to next entry */ | ||
1093 | sg_kunmap_atomic(bounce_addr); | ||
1094 | + bounce_addr = 0; | ||
1095 | j++; | ||
1096 | + } | ||
1097 | |||
1098 | - /* if we need to use another bounce buffer */ | ||
1099 | - if (srclen || i != orig_sgl_count - 1) | ||
1100 | - bounce_addr = sg_kmap_atomic(bounce_sgl,j); | ||
1101 | + /* if we need to use another bounce buffer */ | ||
1102 | + if (srclen && bounce_addr == 0) | ||
1103 | + bounce_addr = sg_kmap_atomic(bounce_sgl, j); | ||
1104 | |||
1105 | - } else if (srclen == 0 && i == orig_sgl_count - 1) { | ||
1106 | - /* unmap the last bounce that is < PAGE_SIZE */ | ||
1107 | - sg_kunmap_atomic(bounce_addr); | ||
1108 | - } | ||
1109 | } | ||
1110 | |||
1111 | sg_kunmap_atomic(src_addr - orig_sgl[i].offset); | ||
1112 | } | ||
1113 | |||
1114 | + if (bounce_addr) | ||
1115 | + sg_kunmap_atomic(bounce_addr); | ||
1116 | + | ||
1117 | local_irq_restore(flags); | ||
1118 | |||
1119 | return total_copied; | ||
1120 | diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c | ||
1121 | index 911e9e0711d2..a08f923b9925 100644 | ||
1122 | --- a/drivers/spi/spidev.c | ||
1123 | +++ b/drivers/spi/spidev.c | ||
1124 | @@ -243,7 +243,10 @@ static int spidev_message(struct spidev_data *spidev, | ||
1125 | k_tmp->len = u_tmp->len; | ||
1126 | |||
1127 | total += k_tmp->len; | ||
1128 | - if (total > bufsiz) { | ||
1129 | + /* Check total length of transfers. Also check each | ||
1130 | + * transfer length to avoid arithmetic overflow. | ||
1131 | + */ | ||
1132 | + if (total > bufsiz || k_tmp->len > bufsiz) { | ||
1133 | status = -EMSGSIZE; | ||
1134 | goto done; | ||
1135 | } | ||
1136 | diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c | ||
1137 | index 6463ca3bcfba..07133d0c971b 100644 | ||
1138 | --- a/drivers/usb/class/cdc-wdm.c | ||
1139 | +++ b/drivers/usb/class/cdc-wdm.c | ||
1140 | @@ -244,7 +244,7 @@ static void wdm_int_callback(struct urb *urb) | ||
1141 | case USB_CDC_NOTIFY_RESPONSE_AVAILABLE: | ||
1142 | dev_dbg(&desc->intf->dev, | ||
1143 | "NOTIFY_RESPONSE_AVAILABLE received: index %d len %d", | ||
1144 | - dr->wIndex, dr->wLength); | ||
1145 | + le16_to_cpu(dr->wIndex), le16_to_cpu(dr->wLength)); | ||
1146 | break; | ||
1147 | |||
1148 | case USB_CDC_NOTIFY_NETWORK_CONNECTION: | ||
1149 | @@ -257,7 +257,9 @@ static void wdm_int_callback(struct urb *urb) | ||
1150 | clear_bit(WDM_POLL_RUNNING, &desc->flags); | ||
1151 | dev_err(&desc->intf->dev, | ||
1152 | "unknown notification %d received: index %d len %d\n", | ||
1153 | - dr->bNotificationType, dr->wIndex, dr->wLength); | ||
1154 | + dr->bNotificationType, | ||
1155 | + le16_to_cpu(dr->wIndex), | ||
1156 | + le16_to_cpu(dr->wLength)); | ||
1157 | goto exit; | ||
1158 | } | ||
1159 | |||
1160 | @@ -403,7 +405,7 @@ static ssize_t wdm_write | ||
1161 | USB_RECIP_INTERFACE); | ||
1162 | req->bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND; | ||
1163 | req->wValue = 0; | ||
1164 | - req->wIndex = desc->inum; | ||
1165 | + req->wIndex = desc->inum; /* already converted */ | ||
1166 | req->wLength = cpu_to_le16(count); | ||
1167 | set_bit(WDM_IN_USE, &desc->flags); | ||
1168 | desc->outbuf = buf; | ||
1169 | @@ -417,7 +419,7 @@ static ssize_t wdm_write | ||
1170 | rv = usb_translate_errors(rv); | ||
1171 | } else { | ||
1172 | dev_dbg(&desc->intf->dev, "Tx URB has been submitted index=%d", | ||
1173 | - req->wIndex); | ||
1174 | + le16_to_cpu(req->wIndex)); | ||
1175 | } | ||
1176 | out: | ||
1177 | usb_autopm_put_interface(desc->intf); | ||
1178 | @@ -780,7 +782,7 @@ static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor | ||
1179 | desc->irq->bRequestType = (USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE); | ||
1180 | desc->irq->bRequest = USB_CDC_GET_ENCAPSULATED_RESPONSE; | ||
1181 | desc->irq->wValue = 0; | ||
1182 | - desc->irq->wIndex = desc->inum; | ||
1183 | + desc->irq->wIndex = desc->inum; /* already converted */ | ||
1184 | desc->irq->wLength = cpu_to_le16(desc->wMaxCommand); | ||
1185 | |||
1186 | usb_fill_control_urb( | ||
1187 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c | ||
1188 | index c9f56ffdba9a..11a073cda1d6 100644 | ||
1189 | --- a/drivers/usb/core/hub.c | ||
1190 | +++ b/drivers/usb/core/hub.c | ||
1191 | @@ -3282,10 +3282,10 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) | ||
1192 | dev_dbg(hub->intfdev, "can't resume port %d, status %d\n", | ||
1193 | port1, status); | ||
1194 | } else { | ||
1195 | - /* drive resume for at least 20 msec */ | ||
1196 | + /* drive resume for USB_RESUME_TIMEOUT msec */ | ||
1197 | dev_dbg(&udev->dev, "usb %sresume\n", | ||
1198 | (PMSG_IS_AUTO(msg) ? "auto-" : "")); | ||
1199 | - msleep(25); | ||
1200 | + msleep(USB_RESUME_TIMEOUT); | ||
1201 | |||
1202 | /* Virtual root hubs can trigger on GET_PORT_STATUS to | ||
1203 | * stop resume signaling. Then finish the resume | ||
1204 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c | ||
1205 | index 44a292b75012..a660716f9331 100644 | ||
1206 | --- a/drivers/usb/gadget/composite.c | ||
1207 | +++ b/drivers/usb/gadget/composite.c | ||
1208 | @@ -528,7 +528,7 @@ static int bos_desc(struct usb_composite_dev *cdev) | ||
1209 | usb_ext->bLength = USB_DT_USB_EXT_CAP_SIZE; | ||
1210 | usb_ext->bDescriptorType = USB_DT_DEVICE_CAPABILITY; | ||
1211 | usb_ext->bDevCapabilityType = USB_CAP_TYPE_EXT; | ||
1212 | - usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT); | ||
1213 | + usb_ext->bmAttributes = cpu_to_le32(USB_LPM_SUPPORT | USB_BESL_SUPPORT); | ||
1214 | |||
1215 | /* | ||
1216 | * The Superspeed USB Capability descriptor shall be implemented by all | ||
1217 | diff --git a/drivers/usb/host/isp116x-hcd.c b/drivers/usb/host/isp116x-hcd.c | ||
1218 | index b64e661618bb..baf2807934c1 100644 | ||
1219 | --- a/drivers/usb/host/isp116x-hcd.c | ||
1220 | +++ b/drivers/usb/host/isp116x-hcd.c | ||
1221 | @@ -1488,7 +1488,7 @@ static int isp116x_bus_resume(struct usb_hcd *hcd) | ||
1222 | spin_unlock_irq(&isp116x->lock); | ||
1223 | |||
1224 | hcd->state = HC_STATE_RESUMING; | ||
1225 | - msleep(20); | ||
1226 | + msleep(USB_RESUME_TIMEOUT); | ||
1227 | |||
1228 | /* Go operational */ | ||
1229 | spin_lock_irq(&isp116x->lock); | ||
1230 | diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c | ||
1231 | index a6fd8f5371df..6656dfda5665 100644 | ||
1232 | --- a/drivers/usb/host/r8a66597-hcd.c | ||
1233 | +++ b/drivers/usb/host/r8a66597-hcd.c | ||
1234 | @@ -2301,7 +2301,7 @@ static int r8a66597_bus_resume(struct usb_hcd *hcd) | ||
1235 | rh->port &= ~USB_PORT_STAT_SUSPEND; | ||
1236 | rh->port |= USB_PORT_STAT_C_SUSPEND << 16; | ||
1237 | r8a66597_mdfy(r8a66597, RESUME, RESUME | UACT, dvstctr_reg); | ||
1238 | - msleep(50); | ||
1239 | + msleep(USB_RESUME_TIMEOUT); | ||
1240 | r8a66597_mdfy(r8a66597, UACT, RESUME | UACT, dvstctr_reg); | ||
1241 | } | ||
1242 | |||
1243 | diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c | ||
1244 | index b2ec7fe758dd..b4cad9346035 100644 | ||
1245 | --- a/drivers/usb/host/sl811-hcd.c | ||
1246 | +++ b/drivers/usb/host/sl811-hcd.c | ||
1247 | @@ -1251,7 +1251,7 @@ sl811h_hub_control( | ||
1248 | sl811_write(sl811, SL11H_CTLREG1, sl811->ctrl1); | ||
1249 | |||
1250 | mod_timer(&sl811->timer, jiffies | ||
1251 | - + msecs_to_jiffies(20)); | ||
1252 | + + msecs_to_jiffies(USB_RESUME_TIMEOUT)); | ||
1253 | break; | ||
1254 | case USB_PORT_FEAT_POWER: | ||
1255 | port_power(sl811, 0); | ||
1256 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c | ||
1257 | index 9948890ef93e..bc7a886e3c36 100644 | ||
1258 | --- a/drivers/usb/host/xhci-ring.c | ||
1259 | +++ b/drivers/usb/host/xhci-ring.c | ||
1260 | @@ -1697,7 +1697,7 @@ static void handle_port_status(struct xhci_hcd *xhci, | ||
1261 | } else { | ||
1262 | xhci_dbg(xhci, "resume HS port %d\n", port_id); | ||
1263 | bus_state->resume_done[faked_port_index] = jiffies + | ||
1264 | - msecs_to_jiffies(20); | ||
1265 | + msecs_to_jiffies(USB_RESUME_TIMEOUT); | ||
1266 | set_bit(faked_port_index, &bus_state->resuming_ports); | ||
1267 | mod_timer(&hcd->rh_timer, | ||
1268 | bus_state->resume_done[faked_port_index]); | ||
1269 | diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c | ||
1270 | index a9984c700d2c..5f79d8e2caab 100644 | ||
1271 | --- a/drivers/usb/phy/phy.c | ||
1272 | +++ b/drivers/usb/phy/phy.c | ||
1273 | @@ -78,7 +78,9 @@ static void devm_usb_phy_release(struct device *dev, void *res) | ||
1274 | |||
1275 | static int devm_usb_phy_match(struct device *dev, void *res, void *match_data) | ||
1276 | { | ||
1277 | - return res == match_data; | ||
1278 | + struct usb_phy **phy = res; | ||
1279 | + | ||
1280 | + return *phy == match_data; | ||
1281 | } | ||
1282 | |||
1283 | /** | ||
1284 | diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig | ||
1285 | index bc922c47d046..37e62c7b3273 100644 | ||
1286 | --- a/drivers/video/console/Kconfig | ||
1287 | +++ b/drivers/video/console/Kconfig | ||
1288 | @@ -6,7 +6,10 @@ menu "Console display driver support" | ||
1289 | |||
1290 | config VGA_CONSOLE | ||
1291 | bool "VGA text console" if EXPERT || !X86 | ||
1292 | - depends on !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && !SUPERH && !BLACKFIN && !AVR32 && !MN10300 && (!ARM || ARCH_FOOTBRIDGE || ARCH_INTEGRATOR || ARCH_NETWINDER) | ||
1293 | + depends on !4xx && !8xx && !SPARC && !M68K && !PARISC && !FRV && \ | ||
1294 | + !SUPERH && !BLACKFIN && !AVR32 && !MN10300 && !CRIS && \ | ||
1295 | + (!ARM || ARCH_FOOTBRIDGE || ARCH_INTEGRATOR || ARCH_NETWINDER) && \ | ||
1296 | + !ARM64 | ||
1297 | default y | ||
1298 | help | ||
1299 | Saying Y here will allow you to use Linux in text mode through a | ||
1300 | diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c | ||
1301 | index 3c4d8797ea9a..53f620a4350e 100644 | ||
1302 | --- a/fs/binfmt_elf.c | ||
1303 | +++ b/fs/binfmt_elf.c | ||
1304 | @@ -756,6 +756,7 @@ static int load_elf_binary(struct linux_binprm *bprm) | ||
1305 | i < loc->elf_ex.e_phnum; i++, elf_ppnt++) { | ||
1306 | int elf_prot = 0, elf_flags; | ||
1307 | unsigned long k, vaddr; | ||
1308 | + unsigned long total_size = 0; | ||
1309 | |||
1310 | if (elf_ppnt->p_type != PT_LOAD) | ||
1311 | continue; | ||
1312 | @@ -820,10 +821,16 @@ static int load_elf_binary(struct linux_binprm *bprm) | ||
1313 | #else | ||
1314 | load_bias = ELF_PAGESTART(ELF_ET_DYN_BASE - vaddr); | ||
1315 | #endif | ||
1316 | + total_size = total_mapping_size(elf_phdata, | ||
1317 | + loc->elf_ex.e_phnum); | ||
1318 | + if (!total_size) { | ||
1319 | + error = -EINVAL; | ||
1320 | + goto out_free_dentry; | ||
1321 | + } | ||
1322 | } | ||
1323 | |||
1324 | error = elf_map(bprm->file, load_bias + vaddr, elf_ppnt, | ||
1325 | - elf_prot, elf_flags, 0); | ||
1326 | + elf_prot, elf_flags, total_size); | ||
1327 | if (BAD_ADDR(error)) { | ||
1328 | send_sig(SIGKILL, current, 0); | ||
1329 | retval = IS_ERR((void *)error) ? | ||
1330 | diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c | ||
1331 | index f99c71e40f8b..07f167a1d271 100644 | ||
1332 | --- a/fs/btrfs/extent-tree.c | ||
1333 | +++ b/fs/btrfs/extent-tree.c | ||
1334 | @@ -6363,12 +6363,11 @@ static int __btrfs_free_reserved_extent(struct btrfs_root *root, | ||
1335 | return -ENOSPC; | ||
1336 | } | ||
1337 | |||
1338 | - if (btrfs_test_opt(root, DISCARD)) | ||
1339 | - ret = btrfs_discard_extent(root, start, len, NULL); | ||
1340 | - | ||
1341 | if (pin) | ||
1342 | pin_down_extent(root, cache, start, len, 1); | ||
1343 | else { | ||
1344 | + if (btrfs_test_opt(root, DISCARD)) | ||
1345 | + ret = btrfs_discard_extent(root, start, len, NULL); | ||
1346 | btrfs_add_free_space(cache, start, len); | ||
1347 | btrfs_update_reserved_bytes(cache, len, RESERVE_FREE); | ||
1348 | } | ||
1349 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c | ||
1350 | index 783906c687b5..dbefa6c609f4 100644 | ||
1351 | --- a/fs/btrfs/ioctl.c | ||
1352 | +++ b/fs/btrfs/ioctl.c | ||
1353 | @@ -2572,6 +2572,11 @@ static noinline long btrfs_ioctl_clone(struct file *file, unsigned long srcfd, | ||
1354 | if (off + len == src->i_size) | ||
1355 | len = ALIGN(src->i_size, bs) - off; | ||
1356 | |||
1357 | + if (len == 0) { | ||
1358 | + ret = 0; | ||
1359 | + goto out_unlock; | ||
1360 | + } | ||
1361 | + | ||
1362 | /* verify the end result is block aligned */ | ||
1363 | if (!IS_ALIGNED(off, bs) || !IS_ALIGNED(off + len, bs) || | ||
1364 | !IS_ALIGNED(destoff, bs)) | ||
1365 | diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c | ||
1366 | index f1312173fa90..facf8590b714 100644 | ||
1367 | --- a/fs/ext4/namei.c | ||
1368 | +++ b/fs/ext4/namei.c | ||
1369 | @@ -1880,7 +1880,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
1370 | struct inode *inode) | ||
1371 | { | ||
1372 | struct inode *dir = dentry->d_parent->d_inode; | ||
1373 | - struct buffer_head *bh; | ||
1374 | + struct buffer_head *bh = NULL; | ||
1375 | struct ext4_dir_entry_2 *de; | ||
1376 | struct ext4_dir_entry_tail *t; | ||
1377 | struct super_block *sb; | ||
1378 | @@ -1905,14 +1905,14 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
1379 | return retval; | ||
1380 | if (retval == 1) { | ||
1381 | retval = 0; | ||
1382 | - return retval; | ||
1383 | + goto out; | ||
1384 | } | ||
1385 | } | ||
1386 | |||
1387 | if (is_dx(dir)) { | ||
1388 | retval = ext4_dx_add_entry(handle, dentry, inode); | ||
1389 | if (!retval || (retval != ERR_BAD_DX_DIR)) | ||
1390 | - return retval; | ||
1391 | + goto out; | ||
1392 | ext4_clear_inode_flag(dir, EXT4_INODE_INDEX); | ||
1393 | dx_fallback++; | ||
1394 | ext4_mark_inode_dirty(handle, dir); | ||
1395 | @@ -1924,14 +1924,15 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
1396 | return PTR_ERR(bh); | ||
1397 | |||
1398 | retval = add_dirent_to_buf(handle, dentry, inode, NULL, bh); | ||
1399 | - if (retval != -ENOSPC) { | ||
1400 | - brelse(bh); | ||
1401 | - return retval; | ||
1402 | - } | ||
1403 | + if (retval != -ENOSPC) | ||
1404 | + goto out; | ||
1405 | |||
1406 | if (blocks == 1 && !dx_fallback && | ||
1407 | - EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) | ||
1408 | - return make_indexed_dir(handle, dentry, inode, bh); | ||
1409 | + EXT4_HAS_COMPAT_FEATURE(sb, EXT4_FEATURE_COMPAT_DIR_INDEX)) { | ||
1410 | + retval = make_indexed_dir(handle, dentry, inode, bh); | ||
1411 | + bh = NULL; /* make_indexed_dir releases bh */ | ||
1412 | + goto out; | ||
1413 | + } | ||
1414 | brelse(bh); | ||
1415 | } | ||
1416 | bh = ext4_append(handle, dir, &block); | ||
1417 | @@ -1947,6 +1948,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, | ||
1418 | } | ||
1419 | |||
1420 | retval = add_dirent_to_buf(handle, dentry, inode, de, bh); | ||
1421 | +out: | ||
1422 | brelse(bh); | ||
1423 | if (retval == 0) | ||
1424 | ext4_set_inode_state(inode, EXT4_STATE_NEWENTRY); | ||
1425 | diff --git a/fs/namei.c b/fs/namei.c | ||
1426 | index f7c4393f8535..036c21246d6a 100644 | ||
1427 | --- a/fs/namei.c | ||
1428 | +++ b/fs/namei.c | ||
1429 | @@ -1542,7 +1542,8 @@ static inline int walk_component(struct nameidata *nd, struct path *path, | ||
1430 | |||
1431 | if (should_follow_link(inode, follow)) { | ||
1432 | if (nd->flags & LOOKUP_RCU) { | ||
1433 | - if (unlikely(unlazy_walk(nd, path->dentry))) { | ||
1434 | + if (unlikely(nd->path.mnt != path->mnt || | ||
1435 | + unlazy_walk(nd, path->dentry))) { | ||
1436 | err = -ECHILD; | ||
1437 | goto out_err; | ||
1438 | } | ||
1439 | @@ -2824,7 +2825,8 @@ finish_lookup: | ||
1440 | |||
1441 | if (should_follow_link(inode, !symlink_ok)) { | ||
1442 | if (nd->flags & LOOKUP_RCU) { | ||
1443 | - if (unlikely(unlazy_walk(nd, path->dentry))) { | ||
1444 | + if (unlikely(nd->path.mnt != path->mnt || | ||
1445 | + unlazy_walk(nd, path->dentry))) { | ||
1446 | error = -ECHILD; | ||
1447 | goto out; | ||
1448 | } | ||
1449 | diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h | ||
1450 | index a64adcc29ae5..f819e813c8ac 100644 | ||
1451 | --- a/include/acpi/actypes.h | ||
1452 | +++ b/include/acpi/actypes.h | ||
1453 | @@ -198,9 +198,29 @@ typedef int INT32; | ||
1454 | typedef s32 acpi_native_int; | ||
1455 | |||
1456 | typedef u32 acpi_size; | ||
1457 | + | ||
1458 | +#ifdef ACPI_32BIT_PHYSICAL_ADDRESS | ||
1459 | + | ||
1460 | +/* | ||
1461 | + * OSPMs can define this to shrink the size of the structures for 32-bit | ||
1462 | + * none PAE environment. ASL compiler may always define this to generate | ||
1463 | + * 32-bit OSPM compliant tables. | ||
1464 | + */ | ||
1465 | typedef u32 acpi_io_address; | ||
1466 | typedef u32 acpi_physical_address; | ||
1467 | |||
1468 | +#else /* ACPI_32BIT_PHYSICAL_ADDRESS */ | ||
1469 | + | ||
1470 | +/* | ||
1471 | + * It is reported that, after some calculations, the physical addresses can | ||
1472 | + * wrap over the 32-bit boundary on 32-bit PAE environment. | ||
1473 | + * https://bugzilla.kernel.org/show_bug.cgi?id=87971 | ||
1474 | + */ | ||
1475 | +typedef u64 acpi_io_address; | ||
1476 | +typedef u64 acpi_physical_address; | ||
1477 | + | ||
1478 | +#endif /* ACPI_32BIT_PHYSICAL_ADDRESS */ | ||
1479 | + | ||
1480 | #define ACPI_MAX_PTR ACPI_UINT32_MAX | ||
1481 | #define ACPI_SIZE_MAX ACPI_UINT32_MAX | ||
1482 | |||
1483 | diff --git a/include/acpi/platform/acenv.h b/include/acpi/platform/acenv.h | ||
1484 | index ef04b36ca6ed..f7db107abb04 100644 | ||
1485 | --- a/include/acpi/platform/acenv.h | ||
1486 | +++ b/include/acpi/platform/acenv.h | ||
1487 | @@ -76,6 +76,7 @@ | ||
1488 | #define ACPI_LARGE_NAMESPACE_NODE | ||
1489 | #define ACPI_DATA_TABLE_DISASSEMBLY | ||
1490 | #define ACPI_SINGLE_THREADED | ||
1491 | +#define ACPI_32BIT_PHYSICAL_ADDRESS | ||
1492 | #endif | ||
1493 | |||
1494 | /* acpi_exec configuration. Multithreaded with full AML debugger */ | ||
1495 | diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h | ||
1496 | index c1a1216e29ce..87b27263f5e2 100644 | ||
1497 | --- a/include/asm-generic/sections.h | ||
1498 | +++ b/include/asm-generic/sections.h | ||
1499 | @@ -3,6 +3,8 @@ | ||
1500 | |||
1501 | /* References to section boundaries */ | ||
1502 | |||
1503 | +#include <linux/compiler.h> | ||
1504 | + | ||
1505 | extern char _text[], _stext[], _etext[]; | ||
1506 | extern char _data[], _sdata[], _edata[]; | ||
1507 | extern char __bss_start[], __bss_stop[]; | ||
1508 | @@ -18,6 +20,8 @@ extern char __start_rodata[], __end_rodata[]; | ||
1509 | /* Start and end of .ctors section - used for constructor calls. */ | ||
1510 | extern char __ctors_start[], __ctors_end[]; | ||
1511 | |||
1512 | +extern __visible const void __nosave_begin, __nosave_end; | ||
1513 | + | ||
1514 | /* function descriptor handling (if any). Override | ||
1515 | * in asm/sections.h */ | ||
1516 | #ifndef dereference_function_descriptor | ||
1517 | diff --git a/include/linux/usb.h b/include/linux/usb.h | ||
1518 | index a0bee5a28d1a..28bd3a898cba 100644 | ||
1519 | --- a/include/linux/usb.h | ||
1520 | +++ b/include/linux/usb.h | ||
1521 | @@ -206,6 +206,32 @@ void usb_put_intf(struct usb_interface *intf); | ||
1522 | #define USB_MAXINTERFACES 32 | ||
1523 | #define USB_MAXIADS (USB_MAXINTERFACES/2) | ||
1524 | |||
1525 | +/* | ||
1526 | + * USB Resume Timer: Every Host controller driver should drive the resume | ||
1527 | + * signalling on the bus for the amount of time defined by this macro. | ||
1528 | + * | ||
1529 | + * That way we will have a 'stable' behavior among all HCDs supported by Linux. | ||
1530 | + * | ||
1531 | + * Note that the USB Specification states we should drive resume for *at least* | ||
1532 | + * 20 ms, but it doesn't give an upper bound. This creates two possible | ||
1533 | + * situations which we want to avoid: | ||
1534 | + * | ||
1535 | + * (a) sometimes an msleep(20) might expire slightly before 20 ms, which causes | ||
1536 | + * us to fail USB Electrical Tests, thus failing Certification | ||
1537 | + * | ||
1538 | + * (b) Some (many) devices actually need more than 20 ms of resume signalling, | ||
1539 | + * and while we can argue that's against the USB Specification, we don't have | ||
1540 | + * control over which devices a certification laboratory will be using for | ||
1541 | + * certification. If CertLab uses a device which was tested against Windows and | ||
1542 | + * that happens to have relaxed resume signalling rules, we might fall into | ||
1543 | + * situations where we fail interoperability and electrical tests. | ||
1544 | + * | ||
1545 | + * In order to avoid both conditions, we're using a 40 ms resume timeout, which | ||
1546 | + * should cope with both LPJ calibration errors and devices not following every | ||
1547 | + * detail of the USB Specification. | ||
1548 | + */ | ||
1549 | +#define USB_RESUME_TIMEOUT 40 /* ms */ | ||
1550 | + | ||
1551 | /** | ||
1552 | * struct usb_interface_cache - long-term representation of a device interface | ||
1553 | * @num_altsetting: number of altsettings defined. | ||
1554 | diff --git a/kernel/ptrace.c b/kernel/ptrace.c | ||
1555 | index afadcf7b4a22..118323bc8529 100644 | ||
1556 | --- a/kernel/ptrace.c | ||
1557 | +++ b/kernel/ptrace.c | ||
1558 | @@ -720,6 +720,8 @@ static int ptrace_peek_siginfo(struct task_struct *child, | ||
1559 | static int ptrace_resume(struct task_struct *child, long request, | ||
1560 | unsigned long data) | ||
1561 | { | ||
1562 | + bool need_siglock; | ||
1563 | + | ||
1564 | if (!valid_signal(data)) | ||
1565 | return -EIO; | ||
1566 | |||
1567 | @@ -747,8 +749,26 @@ static int ptrace_resume(struct task_struct *child, long request, | ||
1568 | user_disable_single_step(child); | ||
1569 | } | ||
1570 | |||
1571 | + /* | ||
1572 | + * Change ->exit_code and ->state under siglock to avoid the race | ||
1573 | + * with wait_task_stopped() in between; a non-zero ->exit_code will | ||
1574 | + * wrongly look like another report from tracee. | ||
1575 | + * | ||
1576 | + * Note that we need siglock even if ->exit_code == data and/or this | ||
1577 | + * status was not reported yet, the new status must not be cleared by | ||
1578 | + * wait_task_stopped() after resume. | ||
1579 | + * | ||
1580 | + * If data == 0 we do not care if wait_task_stopped() reports the old | ||
1581 | + * status and clears the code too; this can't race with the tracee, it | ||
1582 | + * takes siglock after resume. | ||
1583 | + */ | ||
1584 | + need_siglock = data && !thread_group_empty(current); | ||
1585 | + if (need_siglock) | ||
1586 | + spin_lock_irq(&child->sighand->siglock); | ||
1587 | child->exit_code = data; | ||
1588 | wake_up_state(child, __TASK_TRACED); | ||
1589 | + if (need_siglock) | ||
1590 | + spin_unlock_irq(&child->sighand->siglock); | ||
1591 | |||
1592 | return 0; | ||
1593 | } | ||
1594 | diff --git a/kernel/softirq.c b/kernel/softirq.c | ||
1595 | index 787b3a032429..21956f00cb51 100644 | ||
1596 | --- a/kernel/softirq.c | ||
1597 | +++ b/kernel/softirq.c | ||
1598 | @@ -774,9 +774,13 @@ static void run_ksoftirqd(unsigned int cpu) | ||
1599 | local_irq_disable(); | ||
1600 | if (local_softirq_pending()) { | ||
1601 | __do_softirq(); | ||
1602 | - rcu_note_context_switch(cpu); | ||
1603 | local_irq_enable(); | ||
1604 | cond_resched(); | ||
1605 | + | ||
1606 | + preempt_disable(); | ||
1607 | + rcu_note_context_switch(cpu); | ||
1608 | + preempt_enable(); | ||
1609 | + | ||
1610 | return; | ||
1611 | } | ||
1612 | local_irq_enable(); | ||
1613 | diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c | ||
1614 | index 3d9fee3a80b3..ab21b8c66535 100644 | ||
1615 | --- a/kernel/trace/ring_buffer.c | ||
1616 | +++ b/kernel/trace/ring_buffer.c | ||
1617 | @@ -2650,7 +2650,7 @@ static DEFINE_PER_CPU(unsigned int, current_context); | ||
1618 | |||
1619 | static __always_inline int trace_recursive_lock(void) | ||
1620 | { | ||
1621 | - unsigned int val = this_cpu_read(current_context); | ||
1622 | + unsigned int val = __this_cpu_read(current_context); | ||
1623 | int bit; | ||
1624 | |||
1625 | if (in_interrupt()) { | ||
1626 | @@ -2667,18 +2667,17 @@ static __always_inline int trace_recursive_lock(void) | ||
1627 | return 1; | ||
1628 | |||
1629 | val |= (1 << bit); | ||
1630 | - this_cpu_write(current_context, val); | ||
1631 | + __this_cpu_write(current_context, val); | ||
1632 | |||
1633 | return 0; | ||
1634 | } | ||
1635 | |||
1636 | static __always_inline void trace_recursive_unlock(void) | ||
1637 | { | ||
1638 | - unsigned int val = this_cpu_read(current_context); | ||
1639 | + unsigned int val = __this_cpu_read(current_context); | ||
1640 | |||
1641 | - val--; | ||
1642 | - val &= this_cpu_read(current_context); | ||
1643 | - this_cpu_write(current_context, val); | ||
1644 | + val &= val & (val - 1); | ||
1645 | + __this_cpu_write(current_context, val); | ||
1646 | } | ||
1647 | |||
1648 | #else | ||
1649 | diff --git a/lib/string.c b/lib/string.c | ||
1650 | index 43d0781daf47..cb9ea2181557 100644 | ||
1651 | --- a/lib/string.c | ||
1652 | +++ b/lib/string.c | ||
1653 | @@ -598,7 +598,7 @@ EXPORT_SYMBOL(memset); | ||
1654 | void memzero_explicit(void *s, size_t count) | ||
1655 | { | ||
1656 | memset(s, 0, count); | ||
1657 | - OPTIMIZER_HIDE_VAR(s); | ||
1658 | + barrier(); | ||
1659 | } | ||
1660 | EXPORT_SYMBOL(memzero_explicit); | ||
1661 | |||
1662 | diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c | ||
1663 | index 31ee5c6033df..479e8a63125a 100644 | ||
1664 | --- a/net/ipv4/ip_forward.c | ||
1665 | +++ b/net/ipv4/ip_forward.c | ||
1666 | @@ -126,6 +126,9 @@ int ip_forward(struct sk_buff *skb) | ||
1667 | struct rtable *rt; /* Route we use */ | ||
1668 | struct ip_options *opt = &(IPCB(skb)->opt); | ||
1669 | |||
1670 | + if (unlikely(skb->sk)) | ||
1671 | + goto drop; | ||
1672 | + | ||
1673 | if (skb_warn_if_lro(skb)) | ||
1674 | goto drop; | ||
1675 | |||
1676 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
1677 | index 7681a1bbd97f..76c80b59e80f 100644 | ||
1678 | --- a/net/ipv4/tcp_output.c | ||
1679 | +++ b/net/ipv4/tcp_output.c | ||
1680 | @@ -2571,39 +2571,65 @@ begin_fwd: | ||
1681 | } | ||
1682 | } | ||
1683 | |||
1684 | -/* Send a fin. The caller locks the socket for us. This cannot be | ||
1685 | - * allowed to fail queueing a FIN frame under any circumstances. | ||
1686 | +/* We allow to exceed memory limits for FIN packets to expedite | ||
1687 | + * connection tear down and (memory) recovery. | ||
1688 | + * Otherwise tcp_send_fin() could be tempted to either delay FIN | ||
1689 | + * or even be forced to close flow without any FIN. | ||
1690 | + */ | ||
1691 | +static void sk_forced_wmem_schedule(struct sock *sk, int size) | ||
1692 | +{ | ||
1693 | + int amt, status; | ||
1694 | + | ||
1695 | + if (size <= sk->sk_forward_alloc) | ||
1696 | + return; | ||
1697 | + amt = sk_mem_pages(size); | ||
1698 | + sk->sk_forward_alloc += amt * SK_MEM_QUANTUM; | ||
1699 | + sk_memory_allocated_add(sk, amt, &status); | ||
1700 | +} | ||
1701 | + | ||
1702 | +/* Send a FIN. The caller locks the socket for us. | ||
1703 | + * We should try to send a FIN packet really hard, but eventually give up. | ||
1704 | */ | ||
1705 | void tcp_send_fin(struct sock *sk) | ||
1706 | { | ||
1707 | + struct sk_buff *skb, *tskb = tcp_write_queue_tail(sk); | ||
1708 | struct tcp_sock *tp = tcp_sk(sk); | ||
1709 | - struct sk_buff *skb = tcp_write_queue_tail(sk); | ||
1710 | - int mss_now; | ||
1711 | |||
1712 | - /* Optimization, tack on the FIN if we have a queue of | ||
1713 | - * unsent frames. But be careful about outgoing SACKS | ||
1714 | - * and IP options. | ||
1715 | + /* Optimization, tack on the FIN if we have one skb in write queue and | ||
1716 | + * this skb was not yet sent, or we are under memory pressure. | ||
1717 | + * Note: in the latter case, FIN packet will be sent after a timeout, | ||
1718 | + * as TCP stack thinks it has already been transmitted. | ||
1719 | */ | ||
1720 | - mss_now = tcp_current_mss(sk); | ||
1721 | - | ||
1722 | - if (tcp_send_head(sk) != NULL) { | ||
1723 | - TCP_SKB_CB(skb)->tcp_flags |= TCPHDR_FIN; | ||
1724 | - TCP_SKB_CB(skb)->end_seq++; | ||
1725 | + if (tskb && (tcp_send_head(sk) || sk_under_memory_pressure(sk))) { | ||
1726 | +coalesce: | ||
1727 | + TCP_SKB_CB(tskb)->tcp_flags |= TCPHDR_FIN; | ||
1728 | + TCP_SKB_CB(tskb)->end_seq++; | ||
1729 | tp->write_seq++; | ||
1730 | + if (!tcp_send_head(sk)) { | ||
1731 | + /* This means tskb was already sent. | ||
1732 | + * Pretend we included the FIN on previous transmit. | ||
1733 | + * We need to set tp->snd_nxt to the value it would have | ||
1734 | + * if FIN had been sent. This is because retransmit path | ||
1735 | + * does not change tp->snd_nxt. | ||
1736 | + */ | ||
1737 | + tp->snd_nxt++; | ||
1738 | + return; | ||
1739 | + } | ||
1740 | } else { | ||
1741 | - /* Socket is locked, keep trying until memory is available. */ | ||
1742 | - for (;;) { | ||
1743 | - skb = sk_stream_alloc_skb(sk, 0, sk->sk_allocation); | ||
1744 | - if (skb) | ||
1745 | - break; | ||
1746 | - yield(); | ||
1747 | + skb = alloc_skb_fclone(MAX_TCP_HEADER, sk->sk_allocation); | ||
1748 | + if (unlikely(!skb)) { | ||
1749 | + if (tskb) | ||
1750 | + goto coalesce; | ||
1751 | + return; | ||
1752 | } | ||
1753 | + skb_reserve(skb, MAX_TCP_HEADER); | ||
1754 | + sk_forced_wmem_schedule(sk, skb->truesize); | ||
1755 | /* FIN eats a sequence byte, write_seq advanced by tcp_queue_skb(). */ | ||
1756 | tcp_init_nondata_skb(skb, tp->write_seq, | ||
1757 | TCPHDR_ACK | TCPHDR_FIN); | ||
1758 | tcp_queue_skb(sk, skb); | ||
1759 | } | ||
1760 | - __tcp_push_pending_frames(sk, mss_now, TCP_NAGLE_OFF); | ||
1761 | + __tcp_push_pending_frames(sk, tcp_current_mss(sk), TCP_NAGLE_OFF); | ||
1762 | } | ||
1763 | |||
1764 | /* We get here when a process closes a file descriptor (either due to | ||
1765 | diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c | ||
1766 | index 2ca9f2e93139..53745f4c2bf5 100644 | ||
1767 | --- a/sound/pci/emu10k1/emuproc.c | ||
1768 | +++ b/sound/pci/emu10k1/emuproc.c | ||
1769 | @@ -241,31 +241,22 @@ static void snd_emu10k1_proc_spdif_read(struct snd_info_entry *entry, | ||
1770 | struct snd_emu10k1 *emu = entry->private_data; | ||
1771 | u32 value; | ||
1772 | u32 value2; | ||
1773 | - unsigned long flags; | ||
1774 | u32 rate; | ||
1775 | |||
1776 | if (emu->card_capabilities->emu_model) { | ||
1777 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
1778 | snd_emu1010_fpga_read(emu, 0x38, &value); | ||
1779 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
1780 | if ((value & 0x1) == 0) { | ||
1781 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
1782 | snd_emu1010_fpga_read(emu, 0x2a, &value); | ||
1783 | snd_emu1010_fpga_read(emu, 0x2b, &value2); | ||
1784 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
1785 | rate = 0x1770000 / (((value << 5) | value2)+1); | ||
1786 | snd_iprintf(buffer, "ADAT Locked : %u\n", rate); | ||
1787 | } else { | ||
1788 | snd_iprintf(buffer, "ADAT Unlocked\n"); | ||
1789 | } | ||
1790 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
1791 | snd_emu1010_fpga_read(emu, 0x20, &value); | ||
1792 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
1793 | if ((value & 0x4) == 0) { | ||
1794 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
1795 | snd_emu1010_fpga_read(emu, 0x28, &value); | ||
1796 | snd_emu1010_fpga_read(emu, 0x29, &value2); | ||
1797 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
1798 | rate = 0x1770000 / (((value << 5) | value2)+1); | ||
1799 | snd_iprintf(buffer, "SPDIF Locked : %d\n", rate); | ||
1800 | } else { | ||
1801 | @@ -410,14 +401,11 @@ static void snd_emu_proc_emu1010_reg_read(struct snd_info_entry *entry, | ||
1802 | { | ||
1803 | struct snd_emu10k1 *emu = entry->private_data; | ||
1804 | u32 value; | ||
1805 | - unsigned long flags; | ||
1806 | int i; | ||
1807 | snd_iprintf(buffer, "EMU1010 Registers:\n\n"); | ||
1808 | |||
1809 | for(i = 0; i < 0x40; i+=1) { | ||
1810 | - spin_lock_irqsave(&emu->emu_lock, flags); | ||
1811 | snd_emu1010_fpga_read(emu, i, &value); | ||
1812 | - spin_unlock_irqrestore(&emu->emu_lock, flags); | ||
1813 | snd_iprintf(buffer, "%02X: %08X, %02X\n", i, value, (value >> 8) & 0x7f); | ||
1814 | } | ||
1815 | } | ||
1816 | diff --git a/tools/power/x86/turbostat/Makefile b/tools/power/x86/turbostat/Makefile | ||
1817 | index d1b3a361e526..4039854560d0 100644 | ||
1818 | --- a/tools/power/x86/turbostat/Makefile | ||
1819 | +++ b/tools/power/x86/turbostat/Makefile | ||
1820 | @@ -1,8 +1,12 @@ | ||
1821 | CC = $(CROSS_COMPILE)gcc | ||
1822 | -BUILD_OUTPUT := $(PWD) | ||
1823 | +BUILD_OUTPUT := $(CURDIR) | ||
1824 | PREFIX := /usr | ||
1825 | DESTDIR := | ||
1826 | |||
1827 | +ifeq ("$(origin O)", "command line") | ||
1828 | + BUILD_OUTPUT := $(O) | ||
1829 | +endif | ||
1830 | + | ||
1831 | turbostat : turbostat.c | ||
1832 | CFLAGS += -Wall | ||
1833 | CFLAGS += -DMSRHEADER='"../../../../arch/x86/include/uapi/asm/msr-index.h"' | ||
1834 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c | ||
1835 | index a17f190be58e..1d4b8bed4e48 100644 | ||
1836 | --- a/virt/kvm/kvm_main.c | ||
1837 | +++ b/virt/kvm/kvm_main.c | ||
1838 | @@ -1549,8 +1549,8 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc, | ||
1839 | ghc->generation = slots->generation; | ||
1840 | ghc->len = len; | ||
1841 | ghc->memslot = gfn_to_memslot(kvm, start_gfn); | ||
1842 | - ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, &nr_pages_avail); | ||
1843 | - if (!kvm_is_error_hva(ghc->hva) && nr_pages_avail >= nr_pages_needed) { | ||
1844 | + ghc->hva = gfn_to_hva_many(ghc->memslot, start_gfn, NULL); | ||
1845 | + if (!kvm_is_error_hva(ghc->hva) && nr_pages_needed <= 1) { | ||
1846 | ghc->hva += offset; | ||
1847 | } else { | ||
1848 | /* |