Contents of /trunk/kernel-alx/patches-3.12/0105-3.12.6-all-fixes.patch
Parent Directory | Revision Log
Revision 2423 -
(show annotations)
(download)
Tue Mar 25 12:29:50 2014 UTC (10 years, 6 months ago) by niro
File size: 148385 byte(s)
Tue Mar 25 12:29:50 2014 UTC (10 years, 6 months ago) by niro
File size: 148385 byte(s)
-added 3.12 branch
1 | diff --git a/Makefile b/Makefile |
2 | index 986f3cdbad56..2b23383311ff 100644 |
3 | --- a/Makefile |
4 | +++ b/Makefile |
5 | @@ -1,6 +1,6 @@ |
6 | VERSION = 3 |
7 | PATCHLEVEL = 12 |
8 | -SUBLEVEL = 5 |
9 | +SUBLEVEL = 6 |
10 | EXTRAVERSION = |
11 | NAME = One Giant Leap for Frogkind |
12 | |
13 | diff --git a/arch/arm/boot/dts/sun6i-a31.dtsi b/arch/arm/boot/dts/sun6i-a31.dtsi |
14 | index f244f5f02365..9d1bfe445c3c 100644 |
15 | --- a/arch/arm/boot/dts/sun6i-a31.dtsi |
16 | +++ b/arch/arm/boot/dts/sun6i-a31.dtsi |
17 | @@ -193,7 +193,10 @@ |
18 | pio: pinctrl@01c20800 { |
19 | compatible = "allwinner,sun6i-a31-pinctrl"; |
20 | reg = <0x01c20800 0x400>; |
21 | - interrupts = <0 11 1>, <0 15 1>, <0 16 1>, <0 17 1>; |
22 | + interrupts = <0 11 4>, |
23 | + <0 15 4>, |
24 | + <0 16 4>, |
25 | + <0 17 4>; |
26 | clocks = <&apb1_gates 5>; |
27 | gpio-controller; |
28 | interrupt-controller; |
29 | @@ -212,11 +215,11 @@ |
30 | timer@01c20c00 { |
31 | compatible = "allwinner,sun4i-timer"; |
32 | reg = <0x01c20c00 0xa0>; |
33 | - interrupts = <0 18 1>, |
34 | - <0 19 1>, |
35 | - <0 20 1>, |
36 | - <0 21 1>, |
37 | - <0 22 1>; |
38 | + interrupts = <0 18 4>, |
39 | + <0 19 4>, |
40 | + <0 20 4>, |
41 | + <0 21 4>, |
42 | + <0 22 4>; |
43 | clocks = <&osc24M>; |
44 | }; |
45 | |
46 | @@ -228,7 +231,7 @@ |
47 | uart0: serial@01c28000 { |
48 | compatible = "snps,dw-apb-uart"; |
49 | reg = <0x01c28000 0x400>; |
50 | - interrupts = <0 0 1>; |
51 | + interrupts = <0 0 4>; |
52 | reg-shift = <2>; |
53 | reg-io-width = <4>; |
54 | clocks = <&apb2_gates 16>; |
55 | @@ -238,7 +241,7 @@ |
56 | uart1: serial@01c28400 { |
57 | compatible = "snps,dw-apb-uart"; |
58 | reg = <0x01c28400 0x400>; |
59 | - interrupts = <0 1 1>; |
60 | + interrupts = <0 1 4>; |
61 | reg-shift = <2>; |
62 | reg-io-width = <4>; |
63 | clocks = <&apb2_gates 17>; |
64 | @@ -248,7 +251,7 @@ |
65 | uart2: serial@01c28800 { |
66 | compatible = "snps,dw-apb-uart"; |
67 | reg = <0x01c28800 0x400>; |
68 | - interrupts = <0 2 1>; |
69 | + interrupts = <0 2 4>; |
70 | reg-shift = <2>; |
71 | reg-io-width = <4>; |
72 | clocks = <&apb2_gates 18>; |
73 | @@ -258,7 +261,7 @@ |
74 | uart3: serial@01c28c00 { |
75 | compatible = "snps,dw-apb-uart"; |
76 | reg = <0x01c28c00 0x400>; |
77 | - interrupts = <0 3 1>; |
78 | + interrupts = <0 3 4>; |
79 | reg-shift = <2>; |
80 | reg-io-width = <4>; |
81 | clocks = <&apb2_gates 19>; |
82 | @@ -268,7 +271,7 @@ |
83 | uart4: serial@01c29000 { |
84 | compatible = "snps,dw-apb-uart"; |
85 | reg = <0x01c29000 0x400>; |
86 | - interrupts = <0 4 1>; |
87 | + interrupts = <0 4 4>; |
88 | reg-shift = <2>; |
89 | reg-io-width = <4>; |
90 | clocks = <&apb2_gates 20>; |
91 | @@ -278,7 +281,7 @@ |
92 | uart5: serial@01c29400 { |
93 | compatible = "snps,dw-apb-uart"; |
94 | reg = <0x01c29400 0x400>; |
95 | - interrupts = <0 5 1>; |
96 | + interrupts = <0 5 4>; |
97 | reg-shift = <2>; |
98 | reg-io-width = <4>; |
99 | clocks = <&apb2_gates 21>; |
100 | diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c |
101 | index 94f6b05f9e24..92f7b15dd221 100644 |
102 | --- a/arch/arm/kernel/process.c |
103 | +++ b/arch/arm/kernel/process.c |
104 | @@ -404,6 +404,7 @@ EXPORT_SYMBOL(dump_fpu); |
105 | unsigned long get_wchan(struct task_struct *p) |
106 | { |
107 | struct stackframe frame; |
108 | + unsigned long stack_page; |
109 | int count = 0; |
110 | if (!p || p == current || p->state == TASK_RUNNING) |
111 | return 0; |
112 | @@ -412,9 +413,11 @@ unsigned long get_wchan(struct task_struct *p) |
113 | frame.sp = thread_saved_sp(p); |
114 | frame.lr = 0; /* recovered from the stack */ |
115 | frame.pc = thread_saved_pc(p); |
116 | + stack_page = (unsigned long)task_stack_page(p); |
117 | do { |
118 | - int ret = unwind_frame(&frame); |
119 | - if (ret < 0) |
120 | + if (frame.sp < stack_page || |
121 | + frame.sp >= stack_page + THREAD_SIZE || |
122 | + unwind_frame(&frame) < 0) |
123 | return 0; |
124 | if (!in_sched_functions(frame.pc)) |
125 | return frame.pc; |
126 | diff --git a/arch/arm/kernel/stacktrace.c b/arch/arm/kernel/stacktrace.c |
127 | index 00f79e59985b..af4e8c8a5422 100644 |
128 | --- a/arch/arm/kernel/stacktrace.c |
129 | +++ b/arch/arm/kernel/stacktrace.c |
130 | @@ -31,7 +31,7 @@ int notrace unwind_frame(struct stackframe *frame) |
131 | high = ALIGN(low, THREAD_SIZE); |
132 | |
133 | /* check current frame pointer is within bounds */ |
134 | - if (fp < (low + 12) || fp + 4 >= high) |
135 | + if (fp < low + 12 || fp > high - 4) |
136 | return -EINVAL; |
137 | |
138 | /* restore the registers from the stack frame */ |
139 | diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c |
140 | index 8fcda140358d..65ed63f68ef8 100644 |
141 | --- a/arch/arm/kernel/traps.c |
142 | +++ b/arch/arm/kernel/traps.c |
143 | @@ -503,9 +503,10 @@ static inline int |
144 | __do_cache_op(unsigned long start, unsigned long end) |
145 | { |
146 | int ret; |
147 | - unsigned long chunk = PAGE_SIZE; |
148 | |
149 | do { |
150 | + unsigned long chunk = min(PAGE_SIZE, end - start); |
151 | + |
152 | if (signal_pending(current)) { |
153 | struct thread_info *ti = current_thread_info(); |
154 | |
155 | diff --git a/arch/arm/mach-highbank/highbank.c b/arch/arm/mach-highbank/highbank.c |
156 | index 8e63ccdb0de3..8e44973b0139 100644 |
157 | --- a/arch/arm/mach-highbank/highbank.c |
158 | +++ b/arch/arm/mach-highbank/highbank.c |
159 | @@ -17,12 +17,15 @@ |
160 | #include <linux/clkdev.h> |
161 | #include <linux/clocksource.h> |
162 | #include <linux/dma-mapping.h> |
163 | +#include <linux/input.h> |
164 | #include <linux/io.h> |
165 | #include <linux/irqchip.h> |
166 | +#include <linux/mailbox.h> |
167 | #include <linux/of.h> |
168 | #include <linux/of_irq.h> |
169 | #include <linux/of_platform.h> |
170 | #include <linux/of_address.h> |
171 | +#include <linux/reboot.h> |
172 | #include <linux/amba/bus.h> |
173 | #include <linux/clk-provider.h> |
174 | |
175 | @@ -153,6 +156,24 @@ static struct notifier_block highbank_platform_nb = { |
176 | .notifier_call = highbank_platform_notifier, |
177 | }; |
178 | |
179 | +static int hb_keys_notifier(struct notifier_block *nb, unsigned long event, void *data) |
180 | +{ |
181 | + u32 key = *(u32 *)data; |
182 | + |
183 | + if (event != 0x1000) |
184 | + return 0; |
185 | + |
186 | + if (key == KEY_POWER) |
187 | + orderly_poweroff(false); |
188 | + else if (key == 0xffff) |
189 | + ctrl_alt_del(); |
190 | + |
191 | + return 0; |
192 | +} |
193 | +static struct notifier_block hb_keys_nb = { |
194 | + .notifier_call = hb_keys_notifier, |
195 | +}; |
196 | + |
197 | static void __init highbank_init(void) |
198 | { |
199 | pm_power_off = highbank_power_off; |
200 | @@ -161,6 +182,8 @@ static void __init highbank_init(void) |
201 | bus_register_notifier(&platform_bus_type, &highbank_platform_nb); |
202 | bus_register_notifier(&amba_bustype, &highbank_amba_nb); |
203 | |
204 | + pl320_ipc_register_notifier(&hb_keys_nb); |
205 | + |
206 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
207 | } |
208 | |
209 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c |
210 | index 3d5db8c83b3c..832adb1a6dd2 100644 |
211 | --- a/arch/arm/mach-omap2/omap_hwmod.c |
212 | +++ b/arch/arm/mach-omap2/omap_hwmod.c |
213 | @@ -399,7 +399,7 @@ static int _set_clockactivity(struct omap_hwmod *oh, u8 clockact, u32 *v) |
214 | } |
215 | |
216 | /** |
217 | - * _set_softreset: set OCP_SYSCONFIG.CLOCKACTIVITY bits in @v |
218 | + * _set_softreset: set OCP_SYSCONFIG.SOFTRESET bit in @v |
219 | * @oh: struct omap_hwmod * |
220 | * @v: pointer to register contents to modify |
221 | * |
222 | @@ -427,6 +427,36 @@ static int _set_softreset(struct omap_hwmod *oh, u32 *v) |
223 | } |
224 | |
225 | /** |
226 | + * _clear_softreset: clear OCP_SYSCONFIG.SOFTRESET bit in @v |
227 | + * @oh: struct omap_hwmod * |
228 | + * @v: pointer to register contents to modify |
229 | + * |
230 | + * Clear the SOFTRESET bit in @v for hwmod @oh. Returns -EINVAL upon |
231 | + * error or 0 upon success. |
232 | + */ |
233 | +static int _clear_softreset(struct omap_hwmod *oh, u32 *v) |
234 | +{ |
235 | + u32 softrst_mask; |
236 | + |
237 | + if (!oh->class->sysc || |
238 | + !(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET)) |
239 | + return -EINVAL; |
240 | + |
241 | + if (!oh->class->sysc->sysc_fields) { |
242 | + WARN(1, |
243 | + "omap_hwmod: %s: sysc_fields absent for sysconfig class\n", |
244 | + oh->name); |
245 | + return -EINVAL; |
246 | + } |
247 | + |
248 | + softrst_mask = (0x1 << oh->class->sysc->sysc_fields->srst_shift); |
249 | + |
250 | + *v &= ~softrst_mask; |
251 | + |
252 | + return 0; |
253 | +} |
254 | + |
255 | +/** |
256 | * _wait_softreset_complete - wait for an OCP softreset to complete |
257 | * @oh: struct omap_hwmod * to wait on |
258 | * |
259 | @@ -1911,6 +1941,12 @@ static int _ocp_softreset(struct omap_hwmod *oh) |
260 | ret = _set_softreset(oh, &v); |
261 | if (ret) |
262 | goto dis_opt_clks; |
263 | + |
264 | + _write_sysconfig(v, oh); |
265 | + ret = _clear_softreset(oh, &v); |
266 | + if (ret) |
267 | + goto dis_opt_clks; |
268 | + |
269 | _write_sysconfig(v, oh); |
270 | |
271 | if (oh->class->sysc->srst_udelay) |
272 | @@ -3159,6 +3195,11 @@ int omap_hwmod_softreset(struct omap_hwmod *oh) |
273 | goto error; |
274 | _write_sysconfig(v, oh); |
275 | |
276 | + ret = _clear_softreset(oh, &v); |
277 | + if (ret) |
278 | + goto error; |
279 | + _write_sysconfig(v, oh); |
280 | + |
281 | error: |
282 | return ret; |
283 | } |
284 | diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
285 | index 0c3a427da544..f234cbec0cb9 100644 |
286 | --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
287 | +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
288 | @@ -1943,7 +1943,8 @@ static struct omap_hwmod_class_sysconfig omap3xxx_usb_host_hs_sysc = { |
289 | .syss_offs = 0x0014, |
290 | .sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_CLOCKACTIVITY | |
291 | SYSC_HAS_SIDLEMODE | SYSC_HAS_ENAWAKEUP | |
292 | - SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE), |
293 | + SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE | |
294 | + SYSS_HAS_RESET_STATUS), |
295 | .idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART | |
296 | MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART), |
297 | .sysc_fields = &omap_hwmod_sysc_type1, |
298 | @@ -2021,15 +2022,7 @@ static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { |
299 | * hence HWMOD_SWSUP_MSTANDBY |
300 | */ |
301 | |
302 | - /* |
303 | - * During system boot; If the hwmod framework resets the module |
304 | - * the module will have smart idle settings; which can lead to deadlock |
305 | - * (above Errata Id:i660); so, dont reset the module during boot; |
306 | - * Use HWMOD_INIT_NO_RESET. |
307 | - */ |
308 | - |
309 | - .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY | |
310 | - HWMOD_INIT_NO_RESET, |
311 | + .flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY, |
312 | }; |
313 | |
314 | /* |
315 | diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c |
316 | index 0d5dd646f61f..263b15249b5b 100644 |
317 | --- a/arch/arm/mach-pxa/reset.c |
318 | +++ b/arch/arm/mach-pxa/reset.c |
319 | @@ -13,6 +13,7 @@ |
320 | |
321 | #include <mach/regs-ost.h> |
322 | #include <mach/reset.h> |
323 | +#include <mach/smemc.h> |
324 | |
325 | unsigned int reset_status; |
326 | EXPORT_SYMBOL(reset_status); |
327 | @@ -81,6 +82,12 @@ static void do_hw_reset(void) |
328 | writel_relaxed(OSSR_M3, OSSR); |
329 | /* ... in 100 ms */ |
330 | writel_relaxed(readl_relaxed(OSCR) + 368640, OSMR3); |
331 | + /* |
332 | + * SDRAM hangs on watchdog reset on Marvell PXA270 (erratum 71) |
333 | + * we put SDRAM into self-refresh to prevent that |
334 | + */ |
335 | + while (1) |
336 | + writel_relaxed(MDREFR_SLFRSH, MDREFR); |
337 | } |
338 | |
339 | void pxa_restart(enum reboot_mode mode, const char *cmd) |
340 | @@ -104,4 +111,3 @@ void pxa_restart(enum reboot_mode mode, const char *cmd) |
341 | break; |
342 | } |
343 | } |
344 | - |
345 | diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c |
346 | index 0206b915a6f6..ef5557b807ed 100644 |
347 | --- a/arch/arm/mach-pxa/tosa.c |
348 | +++ b/arch/arm/mach-pxa/tosa.c |
349 | @@ -425,57 +425,57 @@ static struct platform_device tosa_power_device = { |
350 | * Tosa Keyboard |
351 | */ |
352 | static const uint32_t tosakbd_keymap[] = { |
353 | - KEY(0, 2, KEY_W), |
354 | - KEY(0, 6, KEY_K), |
355 | - KEY(0, 7, KEY_BACKSPACE), |
356 | - KEY(0, 8, KEY_P), |
357 | - KEY(1, 1, KEY_Q), |
358 | - KEY(1, 2, KEY_E), |
359 | - KEY(1, 3, KEY_T), |
360 | - KEY(1, 4, KEY_Y), |
361 | - KEY(1, 6, KEY_O), |
362 | - KEY(1, 7, KEY_I), |
363 | - KEY(1, 8, KEY_COMMA), |
364 | - KEY(2, 1, KEY_A), |
365 | - KEY(2, 2, KEY_D), |
366 | - KEY(2, 3, KEY_G), |
367 | - KEY(2, 4, KEY_U), |
368 | - KEY(2, 6, KEY_L), |
369 | - KEY(2, 7, KEY_ENTER), |
370 | - KEY(2, 8, KEY_DOT), |
371 | - KEY(3, 1, KEY_Z), |
372 | - KEY(3, 2, KEY_C), |
373 | - KEY(3, 3, KEY_V), |
374 | - KEY(3, 4, KEY_J), |
375 | - KEY(3, 5, TOSA_KEY_ADDRESSBOOK), |
376 | - KEY(3, 6, TOSA_KEY_CANCEL), |
377 | - KEY(3, 7, TOSA_KEY_CENTER), |
378 | - KEY(3, 8, TOSA_KEY_OK), |
379 | - KEY(3, 9, KEY_LEFTSHIFT), |
380 | - KEY(4, 1, KEY_S), |
381 | - KEY(4, 2, KEY_R), |
382 | - KEY(4, 3, KEY_B), |
383 | - KEY(4, 4, KEY_N), |
384 | - KEY(4, 5, TOSA_KEY_CALENDAR), |
385 | - KEY(4, 6, TOSA_KEY_HOMEPAGE), |
386 | - KEY(4, 7, KEY_LEFTCTRL), |
387 | - KEY(4, 8, TOSA_KEY_LIGHT), |
388 | - KEY(4, 10, KEY_RIGHTSHIFT), |
389 | - KEY(5, 1, KEY_TAB), |
390 | - KEY(5, 2, KEY_SLASH), |
391 | - KEY(5, 3, KEY_H), |
392 | - KEY(5, 4, KEY_M), |
393 | - KEY(5, 5, TOSA_KEY_MENU), |
394 | - KEY(5, 7, KEY_UP), |
395 | - KEY(5, 11, TOSA_KEY_FN), |
396 | - KEY(6, 1, KEY_X), |
397 | - KEY(6, 2, KEY_F), |
398 | - KEY(6, 3, KEY_SPACE), |
399 | - KEY(6, 4, KEY_APOSTROPHE), |
400 | - KEY(6, 5, TOSA_KEY_MAIL), |
401 | - KEY(6, 6, KEY_LEFT), |
402 | - KEY(6, 7, KEY_DOWN), |
403 | - KEY(6, 8, KEY_RIGHT), |
404 | + KEY(0, 1, KEY_W), |
405 | + KEY(0, 5, KEY_K), |
406 | + KEY(0, 6, KEY_BACKSPACE), |
407 | + KEY(0, 7, KEY_P), |
408 | + KEY(1, 0, KEY_Q), |
409 | + KEY(1, 1, KEY_E), |
410 | + KEY(1, 2, KEY_T), |
411 | + KEY(1, 3, KEY_Y), |
412 | + KEY(1, 5, KEY_O), |
413 | + KEY(1, 6, KEY_I), |
414 | + KEY(1, 7, KEY_COMMA), |
415 | + KEY(2, 0, KEY_A), |
416 | + KEY(2, 1, KEY_D), |
417 | + KEY(2, 2, KEY_G), |
418 | + KEY(2, 3, KEY_U), |
419 | + KEY(2, 5, KEY_L), |
420 | + KEY(2, 6, KEY_ENTER), |
421 | + KEY(2, 7, KEY_DOT), |
422 | + KEY(3, 0, KEY_Z), |
423 | + KEY(3, 1, KEY_C), |
424 | + KEY(3, 2, KEY_V), |
425 | + KEY(3, 3, KEY_J), |
426 | + KEY(3, 4, TOSA_KEY_ADDRESSBOOK), |
427 | + KEY(3, 5, TOSA_KEY_CANCEL), |
428 | + KEY(3, 6, TOSA_KEY_CENTER), |
429 | + KEY(3, 7, TOSA_KEY_OK), |
430 | + KEY(3, 8, KEY_LEFTSHIFT), |
431 | + KEY(4, 0, KEY_S), |
432 | + KEY(4, 1, KEY_R), |
433 | + KEY(4, 2, KEY_B), |
434 | + KEY(4, 3, KEY_N), |
435 | + KEY(4, 4, TOSA_KEY_CALENDAR), |
436 | + KEY(4, 5, TOSA_KEY_HOMEPAGE), |
437 | + KEY(4, 6, KEY_LEFTCTRL), |
438 | + KEY(4, 7, TOSA_KEY_LIGHT), |
439 | + KEY(4, 9, KEY_RIGHTSHIFT), |
440 | + KEY(5, 0, KEY_TAB), |
441 | + KEY(5, 1, KEY_SLASH), |
442 | + KEY(5, 2, KEY_H), |
443 | + KEY(5, 3, KEY_M), |
444 | + KEY(5, 4, TOSA_KEY_MENU), |
445 | + KEY(5, 6, KEY_UP), |
446 | + KEY(5, 10, TOSA_KEY_FN), |
447 | + KEY(6, 0, KEY_X), |
448 | + KEY(6, 1, KEY_F), |
449 | + KEY(6, 2, KEY_SPACE), |
450 | + KEY(6, 3, KEY_APOSTROPHE), |
451 | + KEY(6, 4, TOSA_KEY_MAIL), |
452 | + KEY(6, 5, KEY_LEFT), |
453 | + KEY(6, 6, KEY_DOWN), |
454 | + KEY(6, 7, KEY_RIGHT), |
455 | }; |
456 | |
457 | static struct matrix_keymap_data tosakbd_keymap_data = { |
458 | diff --git a/arch/arm64/include/asm/pgtable-hwdef.h b/arch/arm64/include/asm/pgtable-hwdef.h |
459 | index d57e66845c86..2e9d83673ef6 100644 |
460 | --- a/arch/arm64/include/asm/pgtable-hwdef.h |
461 | +++ b/arch/arm64/include/asm/pgtable-hwdef.h |
462 | @@ -43,7 +43,7 @@ |
463 | * Section |
464 | */ |
465 | #define PMD_SECT_VALID (_AT(pmdval_t, 1) << 0) |
466 | -#define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 2) |
467 | +#define PMD_SECT_PROT_NONE (_AT(pmdval_t, 1) << 58) |
468 | #define PMD_SECT_USER (_AT(pmdval_t, 1) << 6) /* AP[1] */ |
469 | #define PMD_SECT_RDONLY (_AT(pmdval_t, 1) << 7) /* AP[2] */ |
470 | #define PMD_SECT_S (_AT(pmdval_t, 3) << 8) |
471 | diff --git a/arch/powerpc/include/asm/pgalloc-32.h b/arch/powerpc/include/asm/pgalloc-32.h |
472 | index 27b2386f738a..842846c1b711 100644 |
473 | --- a/arch/powerpc/include/asm/pgalloc-32.h |
474 | +++ b/arch/powerpc/include/asm/pgalloc-32.h |
475 | @@ -84,10 +84,8 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, |
476 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
477 | unsigned long address) |
478 | { |
479 | - struct page *page = page_address(table); |
480 | - |
481 | tlb_flush_pgtable(tlb, address); |
482 | - pgtable_page_dtor(page); |
483 | - pgtable_free_tlb(tlb, page, 0); |
484 | + pgtable_page_dtor(table); |
485 | + pgtable_free_tlb(tlb, page_address(table), 0); |
486 | } |
487 | #endif /* _ASM_POWERPC_PGALLOC_32_H */ |
488 | diff --git a/arch/powerpc/include/asm/pgalloc-64.h b/arch/powerpc/include/asm/pgalloc-64.h |
489 | index f65e27b09bd3..256d6f8a26a8 100644 |
490 | --- a/arch/powerpc/include/asm/pgalloc-64.h |
491 | +++ b/arch/powerpc/include/asm/pgalloc-64.h |
492 | @@ -144,11 +144,9 @@ static inline void pgtable_free_tlb(struct mmu_gather *tlb, |
493 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t table, |
494 | unsigned long address) |
495 | { |
496 | - struct page *page = page_address(table); |
497 | - |
498 | tlb_flush_pgtable(tlb, address); |
499 | - pgtable_page_dtor(page); |
500 | - pgtable_free_tlb(tlb, page, 0); |
501 | + pgtable_page_dtor(table); |
502 | + pgtable_free_tlb(tlb, page_address(table), 0); |
503 | } |
504 | |
505 | #else /* if CONFIG_PPC_64K_PAGES */ |
506 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile |
507 | index eda00f9be0cf..57d021507120 100644 |
508 | --- a/arch/x86/Makefile |
509 | +++ b/arch/x86/Makefile |
510 | @@ -31,8 +31,8 @@ ifeq ($(CONFIG_X86_32),y) |
511 | |
512 | KBUILD_CFLAGS += -msoft-float -mregparm=3 -freg-struct-return |
513 | |
514 | - # Don't autogenerate SSE instructions |
515 | - KBUILD_CFLAGS += -mno-sse |
516 | + # Don't autogenerate MMX or SSE instructions |
517 | + KBUILD_CFLAGS += -mno-mmx -mno-sse |
518 | |
519 | # Never want PIC in a 32-bit kernel, prevent breakage with GCC built |
520 | # with nonstandard options |
521 | @@ -60,8 +60,8 @@ else |
522 | KBUILD_AFLAGS += -m64 |
523 | KBUILD_CFLAGS += -m64 |
524 | |
525 | - # Don't autogenerate SSE instructions |
526 | - KBUILD_CFLAGS += -mno-sse |
527 | + # Don't autogenerate MMX or SSE instructions |
528 | + KBUILD_CFLAGS += -mno-mmx -mno-sse |
529 | |
530 | # Use -mpreferred-stack-boundary=3 if supported. |
531 | KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3) |
532 | diff --git a/arch/x86/boot/Makefile b/arch/x86/boot/Makefile |
533 | index 379814bc41e3..6cf0111783d3 100644 |
534 | --- a/arch/x86/boot/Makefile |
535 | +++ b/arch/x86/boot/Makefile |
536 | @@ -53,18 +53,18 @@ $(obj)/cpustr.h: $(obj)/mkcpustr FORCE |
537 | |
538 | # How to compile the 16-bit code. Note we always compile for -march=i386, |
539 | # that way we can complain to the user if the CPU is insufficient. |
540 | -KBUILD_CFLAGS := $(USERINCLUDE) -g -Os -D_SETUP -D__KERNEL__ \ |
541 | +KBUILD_CFLAGS := $(USERINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ \ |
542 | -DDISABLE_BRANCH_PROFILING \ |
543 | -Wall -Wstrict-prototypes \ |
544 | -march=i386 -mregparm=3 \ |
545 | -include $(srctree)/$(src)/code16gcc.h \ |
546 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ |
547 | + -mno-mmx -mno-sse \ |
548 | $(call cc-option, -ffreestanding) \ |
549 | $(call cc-option, -fno-toplevel-reorder,\ |
550 | - $(call cc-option, -fno-unit-at-a-time)) \ |
551 | + $(call cc-option, -fno-unit-at-a-time)) \ |
552 | $(call cc-option, -fno-stack-protector) \ |
553 | $(call cc-option, -mpreferred-stack-boundary=2) |
554 | -KBUILD_CFLAGS += $(call cc-option, -m32) |
555 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ |
556 | GCOV_PROFILE := n |
557 | |
558 | diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile |
559 | index dcd90df10ab4..c8a6792e7842 100644 |
560 | --- a/arch/x86/boot/compressed/Makefile |
561 | +++ b/arch/x86/boot/compressed/Makefile |
562 | @@ -13,6 +13,7 @@ KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING |
563 | cflags-$(CONFIG_X86_32) := -march=i386 |
564 | cflags-$(CONFIG_X86_64) := -mcmodel=small |
565 | KBUILD_CFLAGS += $(cflags-y) |
566 | +KBUILD_CFLAGS += -mno-mmx -mno-sse |
567 | KBUILD_CFLAGS += $(call cc-option,-ffreestanding) |
568 | KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector) |
569 | |
570 | diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c |
571 | index 5439117d5c4c..dec48bfaddb8 100644 |
572 | --- a/arch/x86/kvm/lapic.c |
573 | +++ b/arch/x86/kvm/lapic.c |
574 | @@ -143,6 +143,8 @@ static inline int kvm_apic_id(struct kvm_lapic *apic) |
575 | return (kvm_apic_get_reg(apic, APIC_ID) >> 24) & 0xff; |
576 | } |
577 | |
578 | +#define KVM_X2APIC_CID_BITS 0 |
579 | + |
580 | static void recalculate_apic_map(struct kvm *kvm) |
581 | { |
582 | struct kvm_apic_map *new, *old = NULL; |
583 | @@ -180,7 +182,8 @@ static void recalculate_apic_map(struct kvm *kvm) |
584 | if (apic_x2apic_mode(apic)) { |
585 | new->ldr_bits = 32; |
586 | new->cid_shift = 16; |
587 | - new->cid_mask = new->lid_mask = 0xffff; |
588 | + new->cid_mask = (1 << KVM_X2APIC_CID_BITS) - 1; |
589 | + new->lid_mask = 0xffff; |
590 | } else if (kvm_apic_sw_enabled(apic) && |
591 | !new->cid_mask /* flat mode */ && |
592 | kvm_apic_get_reg(apic, APIC_DFR) == APIC_DFR_CLUSTER) { |
593 | @@ -841,7 +844,8 @@ static u32 apic_get_tmcct(struct kvm_lapic *apic) |
594 | ASSERT(apic != NULL); |
595 | |
596 | /* if initial count is 0, current count should also be 0 */ |
597 | - if (kvm_apic_get_reg(apic, APIC_TMICT) == 0) |
598 | + if (kvm_apic_get_reg(apic, APIC_TMICT) == 0 || |
599 | + apic->lapic_timer.period == 0) |
600 | return 0; |
601 | |
602 | remaining = hrtimer_get_remaining(&apic->lapic_timer.timer); |
603 | @@ -1691,7 +1695,6 @@ static void apic_sync_pv_eoi_from_guest(struct kvm_vcpu *vcpu, |
604 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) |
605 | { |
606 | u32 data; |
607 | - void *vapic; |
608 | |
609 | if (test_bit(KVM_APIC_PV_EOI_PENDING, &vcpu->arch.apic_attention)) |
610 | apic_sync_pv_eoi_from_guest(vcpu, vcpu->arch.apic); |
611 | @@ -1699,9 +1702,8 @@ void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu) |
612 | if (!test_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention)) |
613 | return; |
614 | |
615 | - vapic = kmap_atomic(vcpu->arch.apic->vapic_page); |
616 | - data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)); |
617 | - kunmap_atomic(vapic); |
618 | + kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, |
619 | + sizeof(u32)); |
620 | |
621 | apic_set_tpr(vcpu->arch.apic, data & 0xff); |
622 | } |
623 | @@ -1737,7 +1739,6 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) |
624 | u32 data, tpr; |
625 | int max_irr, max_isr; |
626 | struct kvm_lapic *apic = vcpu->arch.apic; |
627 | - void *vapic; |
628 | |
629 | apic_sync_pv_eoi_to_guest(vcpu, apic); |
630 | |
631 | @@ -1753,18 +1754,24 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu) |
632 | max_isr = 0; |
633 | data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24); |
634 | |
635 | - vapic = kmap_atomic(vcpu->arch.apic->vapic_page); |
636 | - *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data; |
637 | - kunmap_atomic(vapic); |
638 | + kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data, |
639 | + sizeof(u32)); |
640 | } |
641 | |
642 | -void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) |
643 | +int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr) |
644 | { |
645 | - vcpu->arch.apic->vapic_addr = vapic_addr; |
646 | - if (vapic_addr) |
647 | + if (vapic_addr) { |
648 | + if (kvm_gfn_to_hva_cache_init(vcpu->kvm, |
649 | + &vcpu->arch.apic->vapic_cache, |
650 | + vapic_addr, sizeof(u32))) |
651 | + return -EINVAL; |
652 | __set_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); |
653 | - else |
654 | + } else { |
655 | __clear_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention); |
656 | + } |
657 | + |
658 | + vcpu->arch.apic->vapic_addr = vapic_addr; |
659 | + return 0; |
660 | } |
661 | |
662 | int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data) |
663 | diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h |
664 | index c730ac9fe801..c8b0d0d2da5c 100644 |
665 | --- a/arch/x86/kvm/lapic.h |
666 | +++ b/arch/x86/kvm/lapic.h |
667 | @@ -34,7 +34,7 @@ struct kvm_lapic { |
668 | */ |
669 | void *regs; |
670 | gpa_t vapic_addr; |
671 | - struct page *vapic_page; |
672 | + struct gfn_to_hva_cache vapic_cache; |
673 | unsigned long pending_events; |
674 | unsigned int sipi_vector; |
675 | }; |
676 | @@ -76,7 +76,7 @@ void kvm_set_lapic_tscdeadline_msr(struct kvm_vcpu *vcpu, u64 data); |
677 | void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset); |
678 | void kvm_apic_set_eoi_accelerated(struct kvm_vcpu *vcpu, int vector); |
679 | |
680 | -void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); |
681 | +int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr); |
682 | void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu); |
683 | void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu); |
684 | |
685 | diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c |
686 | index e5ca72a5cdb6..eb9b9c9fc3d9 100644 |
687 | --- a/arch/x86/kvm/x86.c |
688 | +++ b/arch/x86/kvm/x86.c |
689 | @@ -3192,8 +3192,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp, |
690 | r = -EFAULT; |
691 | if (copy_from_user(&va, argp, sizeof va)) |
692 | goto out; |
693 | - r = 0; |
694 | - kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); |
695 | + r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); |
696 | break; |
697 | } |
698 | case KVM_X86_SETUP_MCE: { |
699 | @@ -5718,36 +5717,6 @@ static void post_kvm_run_save(struct kvm_vcpu *vcpu) |
700 | !kvm_event_needs_reinjection(vcpu); |
701 | } |
702 | |
703 | -static int vapic_enter(struct kvm_vcpu *vcpu) |
704 | -{ |
705 | - struct kvm_lapic *apic = vcpu->arch.apic; |
706 | - struct page *page; |
707 | - |
708 | - if (!apic || !apic->vapic_addr) |
709 | - return 0; |
710 | - |
711 | - page = gfn_to_page(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); |
712 | - if (is_error_page(page)) |
713 | - return -EFAULT; |
714 | - |
715 | - vcpu->arch.apic->vapic_page = page; |
716 | - return 0; |
717 | -} |
718 | - |
719 | -static void vapic_exit(struct kvm_vcpu *vcpu) |
720 | -{ |
721 | - struct kvm_lapic *apic = vcpu->arch.apic; |
722 | - int idx; |
723 | - |
724 | - if (!apic || !apic->vapic_addr) |
725 | - return; |
726 | - |
727 | - idx = srcu_read_lock(&vcpu->kvm->srcu); |
728 | - kvm_release_page_dirty(apic->vapic_page); |
729 | - mark_page_dirty(vcpu->kvm, apic->vapic_addr >> PAGE_SHIFT); |
730 | - srcu_read_unlock(&vcpu->kvm->srcu, idx); |
731 | -} |
732 | - |
733 | static void update_cr8_intercept(struct kvm_vcpu *vcpu) |
734 | { |
735 | int max_irr, tpr; |
736 | @@ -6047,11 +6016,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) |
737 | struct kvm *kvm = vcpu->kvm; |
738 | |
739 | vcpu->srcu_idx = srcu_read_lock(&kvm->srcu); |
740 | - r = vapic_enter(vcpu); |
741 | - if (r) { |
742 | - srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); |
743 | - return r; |
744 | - } |
745 | |
746 | r = 1; |
747 | while (r > 0) { |
748 | @@ -6110,8 +6074,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu) |
749 | |
750 | srcu_read_unlock(&kvm->srcu, vcpu->srcu_idx); |
751 | |
752 | - vapic_exit(vcpu); |
753 | - |
754 | return r; |
755 | } |
756 | |
757 | diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c |
758 | index c7e22ab29a5a..220fa52b9bd0 100644 |
759 | --- a/arch/x86/platform/efi/efi.c |
760 | +++ b/arch/x86/platform/efi/efi.c |
761 | @@ -768,13 +768,6 @@ void __init efi_init(void) |
762 | |
763 | set_bit(EFI_MEMMAP, &x86_efi_facility); |
764 | |
765 | -#ifdef CONFIG_X86_32 |
766 | - if (efi_is_native()) { |
767 | - x86_platform.get_wallclock = efi_get_time; |
768 | - x86_platform.set_wallclock = efi_set_rtc_mmss; |
769 | - } |
770 | -#endif |
771 | - |
772 | #if EFI_DEBUG |
773 | print_efi_memmap(); |
774 | #endif |
775 | diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c |
776 | index 0f92173a12b6..efe4d7220397 100644 |
777 | --- a/arch/x86/platform/uv/tlb_uv.c |
778 | +++ b/arch/x86/platform/uv/tlb_uv.c |
779 | @@ -1070,12 +1070,13 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask, |
780 | unsigned long status; |
781 | |
782 | bcp = &per_cpu(bau_control, cpu); |
783 | - stat = bcp->statp; |
784 | - stat->s_enters++; |
785 | |
786 | if (bcp->nobau) |
787 | return cpumask; |
788 | |
789 | + stat = bcp->statp; |
790 | + stat->s_enters++; |
791 | + |
792 | if (bcp->busy) { |
793 | descriptor_status = |
794 | read_lmmr(UVH_LB_BAU_SB_ACTIVATION_STATUS_0); |
795 | diff --git a/arch/x86/realmode/rm/Makefile b/arch/x86/realmode/rm/Makefile |
796 | index 88692871823f..9cac82588cbc 100644 |
797 | --- a/arch/x86/realmode/rm/Makefile |
798 | +++ b/arch/x86/realmode/rm/Makefile |
799 | @@ -73,9 +73,10 @@ KBUILD_CFLAGS := $(LINUXINCLUDE) -m32 -g -Os -D_SETUP -D__KERNEL__ -D_WAKEUP \ |
800 | -march=i386 -mregparm=3 \ |
801 | -include $(srctree)/$(src)/../../boot/code16gcc.h \ |
802 | -fno-strict-aliasing -fomit-frame-pointer -fno-pic \ |
803 | + -mno-mmx -mno-sse \ |
804 | $(call cc-option, -ffreestanding) \ |
805 | $(call cc-option, -fno-toplevel-reorder,\ |
806 | - $(call cc-option, -fno-unit-at-a-time)) \ |
807 | + $(call cc-option, -fno-unit-at-a-time)) \ |
808 | $(call cc-option, -fno-stack-protector) \ |
809 | $(call cc-option, -mpreferred-stack-boundary=2) |
810 | KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__ |
811 | diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c |
812 | index 585c3b279feb..850246206b12 100644 |
813 | --- a/crypto/algif_hash.c |
814 | +++ b/crypto/algif_hash.c |
815 | @@ -117,9 +117,6 @@ static ssize_t hash_sendpage(struct socket *sock, struct page *page, |
816 | if (flags & MSG_SENDPAGE_NOTLAST) |
817 | flags |= MSG_MORE; |
818 | |
819 | - if (flags & MSG_SENDPAGE_NOTLAST) |
820 | - flags |= MSG_MORE; |
821 | - |
822 | lock_sock(sk); |
823 | sg_init_table(ctx->sgl.sg, 1); |
824 | sg_set_page(ctx->sgl.sg, page, size, offset); |
825 | diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c |
826 | index 918a3b4148b8..a19c027b29bd 100644 |
827 | --- a/crypto/algif_skcipher.c |
828 | +++ b/crypto/algif_skcipher.c |
829 | @@ -381,9 +381,6 @@ static ssize_t skcipher_sendpage(struct socket *sock, struct page *page, |
830 | if (flags & MSG_SENDPAGE_NOTLAST) |
831 | flags |= MSG_MORE; |
832 | |
833 | - if (flags & MSG_SENDPAGE_NOTLAST) |
834 | - flags |= MSG_MORE; |
835 | - |
836 | lock_sock(sk); |
837 | if (!ctx->more && ctx->used) |
838 | goto unlock; |
839 | diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
840 | index 333aa1bca13d..f535670b42d1 100644 |
841 | --- a/drivers/gpu/drm/i915/intel_display.c |
842 | +++ b/drivers/gpu/drm/i915/intel_display.c |
843 | @@ -1429,6 +1429,20 @@ static void i9xx_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) |
844 | POSTING_READ(DPLL(pipe)); |
845 | } |
846 | |
847 | +static void vlv_disable_pll(struct drm_i915_private *dev_priv, enum pipe pipe) |
848 | +{ |
849 | + u32 val = 0; |
850 | + |
851 | + /* Make sure the pipe isn't still relying on us */ |
852 | + assert_pipe_disabled(dev_priv, pipe); |
853 | + |
854 | + /* Leave integrated clock source enabled */ |
855 | + if (pipe == PIPE_B) |
856 | + val = DPLL_INTEGRATED_CRI_CLK_VLV; |
857 | + I915_WRITE(DPLL(pipe), val); |
858 | + POSTING_READ(DPLL(pipe)); |
859 | +} |
860 | + |
861 | void vlv_wait_port_ready(struct drm_i915_private *dev_priv, int port) |
862 | { |
863 | u32 port_mask; |
864 | @@ -3824,7 +3838,10 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) |
865 | if (encoder->post_disable) |
866 | encoder->post_disable(encoder); |
867 | |
868 | - i9xx_disable_pll(dev_priv, pipe); |
869 | + if (IS_VALLEYVIEW(dev)) |
870 | + vlv_disable_pll(dev_priv, pipe); |
871 | + else |
872 | + i9xx_disable_pll(dev_priv, pipe); |
873 | |
874 | intel_crtc->active = false; |
875 | intel_update_fbc(dev); |
876 | @@ -4553,9 +4570,9 @@ static void vlv_update_pll(struct intel_crtc *crtc) |
877 | /* Enable DPIO clock input */ |
878 | dpll = DPLL_EXT_BUFFER_ENABLE_VLV | DPLL_REFA_CLK_ENABLE_VLV | |
879 | DPLL_VGA_MODE_DIS | DPLL_INTEGRATED_CLOCK_VLV; |
880 | - if (pipe) |
881 | + /* We should never disable this, set it here for state tracking */ |
882 | + if (pipe == PIPE_B) |
883 | dpll |= DPLL_INTEGRATED_CRI_CLK_VLV; |
884 | - |
885 | dpll |= DPLL_VCO_ENABLE; |
886 | crtc->config.dpll_hw_state.dpll = dpll; |
887 | |
888 | @@ -5015,6 +5032,32 @@ static void i9xx_get_pfit_config(struct intel_crtc *crtc, |
889 | I915_READ(LVDS) & LVDS_BORDER_ENABLE; |
890 | } |
891 | |
892 | +static void vlv_crtc_clock_get(struct intel_crtc *crtc, |
893 | + struct intel_crtc_config *pipe_config) |
894 | +{ |
895 | + struct drm_device *dev = crtc->base.dev; |
896 | + struct drm_i915_private *dev_priv = dev->dev_private; |
897 | + int pipe = pipe_config->cpu_transcoder; |
898 | + intel_clock_t clock; |
899 | + u32 mdiv; |
900 | + int refclk = 100000; |
901 | + |
902 | + mutex_lock(&dev_priv->dpio_lock); |
903 | + mdiv = vlv_dpio_read(dev_priv, DPIO_DIV(pipe)); |
904 | + mutex_unlock(&dev_priv->dpio_lock); |
905 | + |
906 | + clock.m1 = (mdiv >> DPIO_M1DIV_SHIFT) & 7; |
907 | + clock.m2 = mdiv & DPIO_M2DIV_MASK; |
908 | + clock.n = (mdiv >> DPIO_N_SHIFT) & 0xf; |
909 | + clock.p1 = (mdiv >> DPIO_P1_SHIFT) & 7; |
910 | + clock.p2 = (mdiv >> DPIO_P2_SHIFT) & 0x1f; |
911 | + |
912 | + clock.vco = refclk * clock.m1 * clock.m2 / clock.n; |
913 | + clock.dot = 2 * clock.vco / (clock.p1 * clock.p2); |
914 | + |
915 | + pipe_config->adjusted_mode.clock = clock.dot / 10; |
916 | +} |
917 | + |
918 | static bool i9xx_get_pipe_config(struct intel_crtc *crtc, |
919 | struct intel_crtc_config *pipe_config) |
920 | { |
921 | @@ -5546,7 +5589,7 @@ static void intel_set_pipe_csc(struct drm_crtc *crtc) |
922 | uint16_t postoff = 0; |
923 | |
924 | if (intel_crtc->config.limited_color_range) |
925 | - postoff = (16 * (1 << 13) / 255) & 0x1fff; |
926 | + postoff = (16 * (1 << 12) / 255) & 0x1fff; |
927 | |
928 | I915_WRITE(PIPE_CSC_POSTOFF_HI(pipe), postoff); |
929 | I915_WRITE(PIPE_CSC_POSTOFF_ME(pipe), postoff); |
930 | @@ -6062,7 +6105,7 @@ void hsw_restore_lcpll(struct drm_i915_private *dev_priv) |
931 | |
932 | /* Make sure we're not on PC8 state before disabling PC8, otherwise |
933 | * we'll hang the machine! */ |
934 | - dev_priv->uncore.funcs.force_wake_get(dev_priv); |
935 | + gen6_gt_force_wake_get(dev_priv); |
936 | |
937 | if (val & LCPLL_POWER_DOWN_ALLOW) { |
938 | val &= ~LCPLL_POWER_DOWN_ALLOW; |
939 | @@ -6093,7 +6136,7 @@ void hsw_restore_lcpll(struct drm_i915_private *dev_priv) |
940 | DRM_ERROR("Switching back to LCPLL failed\n"); |
941 | } |
942 | |
943 | - dev_priv->uncore.funcs.force_wake_put(dev_priv); |
944 | + gen6_gt_force_wake_put(dev_priv); |
945 | } |
946 | |
947 | void hsw_enable_pc8_work(struct work_struct *__work) |
948 | @@ -9832,7 +9875,7 @@ static void intel_init_display(struct drm_device *dev) |
949 | dev_priv->display.update_plane = ironlake_update_plane; |
950 | } else if (IS_VALLEYVIEW(dev)) { |
951 | dev_priv->display.get_pipe_config = i9xx_get_pipe_config; |
952 | - dev_priv->display.get_clock = i9xx_crtc_clock_get; |
953 | + dev_priv->display.get_clock = vlv_crtc_clock_get; |
954 | dev_priv->display.crtc_mode_set = i9xx_crtc_mode_set; |
955 | dev_priv->display.crtc_enable = valleyview_crtc_enable; |
956 | dev_priv->display.crtc_disable = i9xx_crtc_disable; |
957 | @@ -10088,12 +10131,19 @@ static void i915_disable_vga(struct drm_device *dev) |
958 | |
959 | void intel_modeset_init_hw(struct drm_device *dev) |
960 | { |
961 | + struct drm_i915_private *dev_priv = dev->dev_private; |
962 | + |
963 | intel_init_power_well(dev); |
964 | |
965 | intel_prepare_ddi(dev); |
966 | |
967 | intel_init_clock_gating(dev); |
968 | |
969 | + /* Enable the CRI clock source so we can get at the display */ |
970 | + if (IS_VALLEYVIEW(dev)) |
971 | + I915_WRITE(DPLL(PIPE_B), I915_READ(DPLL(PIPE_B)) | |
972 | + DPLL_INTEGRATED_CRI_CLK_VLV); |
973 | + |
974 | mutex_lock(&dev->struct_mutex); |
975 | intel_enable_gt_powersave(dev); |
976 | mutex_unlock(&dev->struct_mutex); |
977 | diff --git a/drivers/gpu/drm/radeon/atombios_i2c.c b/drivers/gpu/drm/radeon/atombios_i2c.c |
978 | index 0652ee0a2098..f685035dbe39 100644 |
979 | --- a/drivers/gpu/drm/radeon/atombios_i2c.c |
980 | +++ b/drivers/gpu/drm/radeon/atombios_i2c.c |
981 | @@ -44,7 +44,7 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, |
982 | PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION args; |
983 | int index = GetIndexIntoMasterTable(COMMAND, ProcessI2cChannelTransaction); |
984 | unsigned char *base; |
985 | - u16 out; |
986 | + u16 out = cpu_to_le16(0); |
987 | |
988 | memset(&args, 0, sizeof(args)); |
989 | |
990 | @@ -55,11 +55,14 @@ static int radeon_process_i2c_ch(struct radeon_i2c_chan *chan, |
991 | DRM_ERROR("hw i2c: tried to write too many bytes (%d vs 3)\n", num); |
992 | return -EINVAL; |
993 | } |
994 | - args.ucRegIndex = buf[0]; |
995 | - if (num > 1) { |
996 | + if (buf == NULL) |
997 | + args.ucRegIndex = 0; |
998 | + else |
999 | + args.ucRegIndex = buf[0]; |
1000 | + if (num) |
1001 | num--; |
1002 | + if (num) |
1003 | memcpy(&out, &buf[1], num); |
1004 | - } |
1005 | args.lpI2CDataOut = cpu_to_le16(out); |
1006 | } else { |
1007 | if (num > ATOM_MAX_HW_I2C_READ) { |
1008 | @@ -96,14 +99,14 @@ int radeon_atom_hw_i2c_xfer(struct i2c_adapter *i2c_adap, |
1009 | struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap); |
1010 | struct i2c_msg *p; |
1011 | int i, remaining, current_count, buffer_offset, max_bytes, ret; |
1012 | - u8 buf = 0, flags; |
1013 | + u8 flags; |
1014 | |
1015 | /* check for bus probe */ |
1016 | p = &msgs[0]; |
1017 | if ((num == 1) && (p->len == 0)) { |
1018 | ret = radeon_process_i2c_ch(i2c, |
1019 | p->addr, HW_I2C_WRITE, |
1020 | - &buf, 1); |
1021 | + NULL, 0); |
1022 | if (ret) |
1023 | return ret; |
1024 | else |
1025 | diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c |
1026 | index 615c5b290e78..7f3b0d9aaada 100644 |
1027 | --- a/drivers/gpu/drm/radeon/r600_hdmi.c |
1028 | +++ b/drivers/gpu/drm/radeon/r600_hdmi.c |
1029 | @@ -304,9 +304,9 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
1030 | WREG32(DCCG_AUDIO_DTO1_MODULE, dto_modulo); |
1031 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
1032 | } |
1033 | - } else if (ASIC_IS_DCE3(rdev)) { |
1034 | + } else { |
1035 | /* according to the reg specs, this should DCE3.2 only, but in |
1036 | - * practice it seems to cover DCE3.0/3.1 as well. |
1037 | + * practice it seems to cover DCE2.0/3.0/3.1 as well. |
1038 | */ |
1039 | if (dig->dig_encoder == 0) { |
1040 | WREG32(DCCG_AUDIO_DTO0_PHASE, base_rate * 100); |
1041 | @@ -317,10 +317,6 @@ void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock) |
1042 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock * 100); |
1043 | WREG32(DCCG_AUDIO_DTO_SELECT, 1); /* select DTO1 */ |
1044 | } |
1045 | - } else { |
1046 | - /* according to the reg specs, this should be DCE2.0 and DCE3.0/3.1 */ |
1047 | - WREG32(AUDIO_DTO, AUDIO_DTO_PHASE(base_rate / 10) | |
1048 | - AUDIO_DTO_MODULE(clock / 10)); |
1049 | } |
1050 | } |
1051 | |
1052 | diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c |
1053 | index f79ee184ffd5..5c39bf7c3d88 100644 |
1054 | --- a/drivers/gpu/drm/radeon/radeon_atombios.c |
1055 | +++ b/drivers/gpu/drm/radeon/radeon_atombios.c |
1056 | @@ -2918,7 +2918,7 @@ int radeon_atom_get_memory_pll_dividers(struct radeon_device *rdev, |
1057 | mpll_param->dll_speed = args.ucDllSpeed; |
1058 | mpll_param->bwcntl = args.ucBWCntl; |
1059 | mpll_param->vco_mode = |
1060 | - (args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK) ? 1 : 0; |
1061 | + (args.ucPllCntlFlag & MPLL_CNTL_FLAG_VCO_MODE_MASK); |
1062 | mpll_param->yclk_sel = |
1063 | (args.ucPllCntlFlag & MPLL_CNTL_FLAG_BYPASS_DQ_PLL) ? 1 : 0; |
1064 | mpll_param->qdr = |
1065 | diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c |
1066 | index d96f7cbca0a1..fe0ec2cb2084 100644 |
1067 | --- a/drivers/gpu/drm/radeon/si.c |
1068 | +++ b/drivers/gpu/drm/radeon/si.c |
1069 | @@ -3887,8 +3887,15 @@ static int si_mc_init(struct radeon_device *rdev) |
1070 | rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); |
1071 | rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0); |
1072 | /* size in MB on si */ |
1073 | - rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
1074 | - rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024ULL * 1024ULL; |
1075 | + tmp = RREG32(CONFIG_MEMSIZE); |
1076 | + /* some boards may have garbage in the upper 16 bits */ |
1077 | + if (tmp & 0xffff0000) { |
1078 | + DRM_INFO("Probable bad vram size: 0x%08x\n", tmp); |
1079 | + if (tmp & 0xffff) |
1080 | + tmp &= 0xffff; |
1081 | + } |
1082 | + rdev->mc.mc_vram_size = tmp * 1024ULL * 1024ULL; |
1083 | + rdev->mc.real_vram_size = rdev->mc.mc_vram_size; |
1084 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
1085 | si_vram_gtt_location(rdev, &rdev->mc); |
1086 | radeon_update_bandwidth_info(rdev); |
1087 | diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c |
1088 | index 8bf646183bac..f738800c70cf 100644 |
1089 | --- a/drivers/gpu/drm/udl/udl_gem.c |
1090 | +++ b/drivers/gpu/drm/udl/udl_gem.c |
1091 | @@ -132,6 +132,12 @@ static int udl_gem_get_pages(struct udl_gem_object *obj, gfp_t gfpmask) |
1092 | |
1093 | static void udl_gem_put_pages(struct udl_gem_object *obj) |
1094 | { |
1095 | + if (obj->base.import_attach) { |
1096 | + drm_free_large(obj->pages); |
1097 | + obj->pages = NULL; |
1098 | + return; |
1099 | + } |
1100 | + |
1101 | drm_gem_put_pages(&obj->base, obj->pages, false, false); |
1102 | obj->pages = NULL; |
1103 | } |
1104 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c |
1105 | index c08b5c14fece..aedfe50d557a 100644 |
1106 | --- a/drivers/hid/hid-core.c |
1107 | +++ b/drivers/hid/hid-core.c |
1108 | @@ -1725,6 +1725,7 @@ static const struct hid_device_id hid_have_special_driver[] = { |
1109 | { HID_USB_DEVICE(USB_VENDOR_ID_KENSINGTON, USB_DEVICE_ID_KS_SLIMBLADE) }, |
1110 | { HID_USB_DEVICE(USB_VENDOR_ID_KEYTOUCH, USB_DEVICE_ID_KEYTOUCH_IEC) }, |
1111 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
1112 | + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_MANTICORE) }, |
1113 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, |
1114 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_ERGO_525V) }, |
1115 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_I405X) }, |
1116 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h |
1117 | index 9480b425b254..aeeea796f595 100644 |
1118 | --- a/drivers/hid/hid-ids.h |
1119 | +++ b/drivers/hid/hid-ids.h |
1120 | @@ -489,6 +489,7 @@ |
1121 | #define USB_VENDOR_ID_KYE 0x0458 |
1122 | #define USB_DEVICE_ID_KYE_ERGO_525V 0x0087 |
1123 | #define USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE 0x0138 |
1124 | +#define USB_DEVICE_ID_GENIUS_MANTICORE 0x0153 |
1125 | #define USB_DEVICE_ID_GENIUS_GX_IMPERATOR 0x4018 |
1126 | #define USB_DEVICE_ID_KYE_GPEN_560 0x5003 |
1127 | #define USB_DEVICE_ID_KYE_EASYPEN_I405X 0x5010 |
1128 | diff --git a/drivers/hid/hid-kye.c b/drivers/hid/hid-kye.c |
1129 | index 73845120295e..d645caa690dd 100644 |
1130 | --- a/drivers/hid/hid-kye.c |
1131 | +++ b/drivers/hid/hid-kye.c |
1132 | @@ -342,6 +342,10 @@ static __u8 *kye_report_fixup(struct hid_device *hdev, __u8 *rdesc, |
1133 | rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 83, |
1134 | "Genius Gx Imperator Keyboard"); |
1135 | break; |
1136 | + case USB_DEVICE_ID_GENIUS_MANTICORE: |
1137 | + rdesc = kye_consumer_control_fixup(hdev, rdesc, rsize, 104, |
1138 | + "Genius Manticore Keyboard"); |
1139 | + break; |
1140 | } |
1141 | return rdesc; |
1142 | } |
1143 | @@ -439,6 +443,8 @@ static const struct hid_device_id kye_devices[] = { |
1144 | USB_DEVICE_ID_GENIUS_GILA_GAMING_MOUSE) }, |
1145 | { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
1146 | USB_DEVICE_ID_GENIUS_GX_IMPERATOR) }, |
1147 | + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, |
1148 | + USB_DEVICE_ID_GENIUS_MANTICORE) }, |
1149 | { } |
1150 | }; |
1151 | MODULE_DEVICE_TABLE(hid, kye_devices); |
1152 | diff --git a/drivers/hwmon/hih6130.c b/drivers/hwmon/hih6130.c |
1153 | index 2dc37c7c6947..7d68a08baaa8 100644 |
1154 | --- a/drivers/hwmon/hih6130.c |
1155 | +++ b/drivers/hwmon/hih6130.c |
1156 | @@ -43,6 +43,7 @@ |
1157 | * @last_update: time of last update (jiffies) |
1158 | * @temperature: cached temperature measurement value |
1159 | * @humidity: cached humidity measurement value |
1160 | + * @write_length: length for I2C measurement request |
1161 | */ |
1162 | struct hih6130 { |
1163 | struct device *hwmon_dev; |
1164 | @@ -51,6 +52,7 @@ struct hih6130 { |
1165 | unsigned long last_update; |
1166 | int temperature; |
1167 | int humidity; |
1168 | + size_t write_length; |
1169 | }; |
1170 | |
1171 | /** |
1172 | @@ -121,8 +123,15 @@ static int hih6130_update_measurements(struct i2c_client *client) |
1173 | */ |
1174 | if (time_after(jiffies, hih6130->last_update + HZ) || !hih6130->valid) { |
1175 | |
1176 | - /* write to slave address, no data, to request a measurement */ |
1177 | - ret = i2c_master_send(client, tmp, 0); |
1178 | + /* |
1179 | + * Write to slave address to request a measurement. |
1180 | + * According with the datasheet it should be with no data, but |
1181 | + * for systems with I2C bus drivers that do not allow zero |
1182 | + * length packets we write one dummy byte to allow sensor |
1183 | + * measurements on them. |
1184 | + */ |
1185 | + tmp[0] = 0; |
1186 | + ret = i2c_master_send(client, tmp, hih6130->write_length); |
1187 | if (ret < 0) |
1188 | goto out; |
1189 | |
1190 | @@ -252,6 +261,9 @@ static int hih6130_probe(struct i2c_client *client, |
1191 | goto fail_remove_sysfs; |
1192 | } |
1193 | |
1194 | + if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_QUICK)) |
1195 | + hih6130->write_length = 1; |
1196 | + |
1197 | return 0; |
1198 | |
1199 | fail_remove_sysfs: |
1200 | diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c |
1201 | index 6cf6bff79003..a2f3b4a365e4 100644 |
1202 | --- a/drivers/hwmon/lm78.c |
1203 | +++ b/drivers/hwmon/lm78.c |
1204 | @@ -94,6 +94,8 @@ static inline u8 FAN_TO_REG(long rpm, int div) |
1205 | { |
1206 | if (rpm <= 0) |
1207 | return 255; |
1208 | + if (rpm > 1350000) |
1209 | + return 1; |
1210 | return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254); |
1211 | } |
1212 | |
1213 | diff --git a/drivers/hwmon/sis5595.c b/drivers/hwmon/sis5595.c |
1214 | index 1404e6319deb..72a889702f0d 100644 |
1215 | --- a/drivers/hwmon/sis5595.c |
1216 | +++ b/drivers/hwmon/sis5595.c |
1217 | @@ -141,6 +141,8 @@ static inline u8 FAN_TO_REG(long rpm, int div) |
1218 | { |
1219 | if (rpm <= 0) |
1220 | return 255; |
1221 | + if (rpm > 1350000) |
1222 | + return 1; |
1223 | return clamp_val((1350000 + rpm * div / 2) / (rpm * div), 1, 254); |
1224 | } |
1225 | |
1226 | diff --git a/drivers/hwmon/vt8231.c b/drivers/hwmon/vt8231.c |
1227 | index 0e7017841f7d..aee14e2192f8 100644 |
1228 | --- a/drivers/hwmon/vt8231.c |
1229 | +++ b/drivers/hwmon/vt8231.c |
1230 | @@ -145,7 +145,7 @@ static const u8 regtempmin[] = { 0x3a, 0x3e, 0x2c, 0x2e, 0x30, 0x32 }; |
1231 | */ |
1232 | static inline u8 FAN_TO_REG(long rpm, int div) |
1233 | { |
1234 | - if (rpm == 0) |
1235 | + if (rpm <= 0 || rpm > 1310720) |
1236 | return 0; |
1237 | return clamp_val(1310720 / (rpm * div), 1, 255); |
1238 | } |
1239 | diff --git a/drivers/hwmon/w83l786ng.c b/drivers/hwmon/w83l786ng.c |
1240 | index edb06cda5a68..6ed76ceb9270 100644 |
1241 | --- a/drivers/hwmon/w83l786ng.c |
1242 | +++ b/drivers/hwmon/w83l786ng.c |
1243 | @@ -481,9 +481,11 @@ store_pwm(struct device *dev, struct device_attribute *attr, |
1244 | if (err) |
1245 | return err; |
1246 | val = clamp_val(val, 0, 255); |
1247 | + val = DIV_ROUND_CLOSEST(val, 0x11); |
1248 | |
1249 | mutex_lock(&data->update_lock); |
1250 | - data->pwm[nr] = val; |
1251 | + data->pwm[nr] = val * 0x11; |
1252 | + val |= w83l786ng_read_value(client, W83L786NG_REG_PWM[nr]) & 0xf0; |
1253 | w83l786ng_write_value(client, W83L786NG_REG_PWM[nr], val); |
1254 | mutex_unlock(&data->update_lock); |
1255 | return count; |
1256 | @@ -510,7 +512,7 @@ store_pwm_enable(struct device *dev, struct device_attribute *attr, |
1257 | mutex_lock(&data->update_lock); |
1258 | reg = w83l786ng_read_value(client, W83L786NG_REG_FAN_CFG); |
1259 | data->pwm_enable[nr] = val; |
1260 | - reg &= ~(0x02 << W83L786NG_PWM_ENABLE_SHIFT[nr]); |
1261 | + reg &= ~(0x03 << W83L786NG_PWM_ENABLE_SHIFT[nr]); |
1262 | reg |= (val - 1) << W83L786NG_PWM_ENABLE_SHIFT[nr]; |
1263 | w83l786ng_write_value(client, W83L786NG_REG_FAN_CFG, reg); |
1264 | mutex_unlock(&data->update_lock); |
1265 | @@ -776,9 +778,10 @@ static struct w83l786ng_data *w83l786ng_update_device(struct device *dev) |
1266 | ((pwmcfg >> W83L786NG_PWM_MODE_SHIFT[i]) & 1) |
1267 | ? 0 : 1; |
1268 | data->pwm_enable[i] = |
1269 | - ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 2) + 1; |
1270 | - data->pwm[i] = w83l786ng_read_value(client, |
1271 | - W83L786NG_REG_PWM[i]); |
1272 | + ((pwmcfg >> W83L786NG_PWM_ENABLE_SHIFT[i]) & 3) + 1; |
1273 | + data->pwm[i] = |
1274 | + (w83l786ng_read_value(client, W83L786NG_REG_PWM[i]) |
1275 | + & 0x0f) * 0x11; |
1276 | } |
1277 | |
1278 | |
1279 | diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c |
1280 | index 8551dcaf24db..597e9b8fc18d 100644 |
1281 | --- a/drivers/input/mouse/elantech.c |
1282 | +++ b/drivers/input/mouse/elantech.c |
1283 | @@ -1313,6 +1313,7 @@ static int elantech_set_properties(struct elantech_data *etd) |
1284 | break; |
1285 | case 6: |
1286 | case 7: |
1287 | + case 8: |
1288 | etd->hw_version = 4; |
1289 | break; |
1290 | default: |
1291 | diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c |
1292 | index ae4b6b903629..5f87bed05467 100644 |
1293 | --- a/drivers/input/touchscreen/usbtouchscreen.c |
1294 | +++ b/drivers/input/touchscreen/usbtouchscreen.c |
1295 | @@ -106,6 +106,7 @@ struct usbtouch_device_info { |
1296 | struct usbtouch_usb { |
1297 | unsigned char *data; |
1298 | dma_addr_t data_dma; |
1299 | + int data_size; |
1300 | unsigned char *buffer; |
1301 | int buf_len; |
1302 | struct urb *irq; |
1303 | @@ -1521,7 +1522,7 @@ static int usbtouch_reset_resume(struct usb_interface *intf) |
1304 | static void usbtouch_free_buffers(struct usb_device *udev, |
1305 | struct usbtouch_usb *usbtouch) |
1306 | { |
1307 | - usb_free_coherent(udev, usbtouch->type->rept_size, |
1308 | + usb_free_coherent(udev, usbtouch->data_size, |
1309 | usbtouch->data, usbtouch->data_dma); |
1310 | kfree(usbtouch->buffer); |
1311 | } |
1312 | @@ -1566,7 +1567,20 @@ static int usbtouch_probe(struct usb_interface *intf, |
1313 | if (!type->process_pkt) |
1314 | type->process_pkt = usbtouch_process_pkt; |
1315 | |
1316 | - usbtouch->data = usb_alloc_coherent(udev, type->rept_size, |
1317 | + usbtouch->data_size = type->rept_size; |
1318 | + if (type->get_pkt_len) { |
1319 | + /* |
1320 | + * When dealing with variable-length packets we should |
1321 | + * not request more than wMaxPacketSize bytes at once |
1322 | + * as we do not know if there is more data coming or |
1323 | + * we filled exactly wMaxPacketSize bytes and there is |
1324 | + * nothing else. |
1325 | + */ |
1326 | + usbtouch->data_size = min(usbtouch->data_size, |
1327 | + usb_endpoint_maxp(endpoint)); |
1328 | + } |
1329 | + |
1330 | + usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size, |
1331 | GFP_KERNEL, &usbtouch->data_dma); |
1332 | if (!usbtouch->data) |
1333 | goto out_free; |
1334 | @@ -1626,12 +1640,12 @@ static int usbtouch_probe(struct usb_interface *intf, |
1335 | if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) |
1336 | usb_fill_int_urb(usbtouch->irq, udev, |
1337 | usb_rcvintpipe(udev, endpoint->bEndpointAddress), |
1338 | - usbtouch->data, type->rept_size, |
1339 | + usbtouch->data, usbtouch->data_size, |
1340 | usbtouch_irq, usbtouch, endpoint->bInterval); |
1341 | else |
1342 | usb_fill_bulk_urb(usbtouch->irq, udev, |
1343 | usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), |
1344 | - usbtouch->data, type->rept_size, |
1345 | + usbtouch->data, usbtouch->data_size, |
1346 | usbtouch_irq, usbtouch); |
1347 | |
1348 | usbtouch->irq->dev = udev; |
1349 | diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c |
1350 | index 181c9ba929cd..0046a619527d 100644 |
1351 | --- a/drivers/iommu/arm-smmu.c |
1352 | +++ b/drivers/iommu/arm-smmu.c |
1353 | @@ -392,7 +392,7 @@ struct arm_smmu_domain { |
1354 | struct arm_smmu_cfg root_cfg; |
1355 | phys_addr_t output_mask; |
1356 | |
1357 | - spinlock_t lock; |
1358 | + struct mutex lock; |
1359 | }; |
1360 | |
1361 | static DEFINE_SPINLOCK(arm_smmu_devices_lock); |
1362 | @@ -897,7 +897,7 @@ static int arm_smmu_domain_init(struct iommu_domain *domain) |
1363 | goto out_free_domain; |
1364 | smmu_domain->root_cfg.pgd = pgd; |
1365 | |
1366 | - spin_lock_init(&smmu_domain->lock); |
1367 | + mutex_init(&smmu_domain->lock); |
1368 | domain->priv = smmu_domain; |
1369 | return 0; |
1370 | |
1371 | @@ -1134,7 +1134,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) |
1372 | * Sanity check the domain. We don't currently support domains |
1373 | * that cross between different SMMU chains. |
1374 | */ |
1375 | - spin_lock(&smmu_domain->lock); |
1376 | + mutex_lock(&smmu_domain->lock); |
1377 | if (!smmu_domain->leaf_smmu) { |
1378 | /* Now that we have a master, we can finalise the domain */ |
1379 | ret = arm_smmu_init_domain_context(domain, dev); |
1380 | @@ -1149,7 +1149,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) |
1381 | dev_name(device_smmu->dev)); |
1382 | goto err_unlock; |
1383 | } |
1384 | - spin_unlock(&smmu_domain->lock); |
1385 | + mutex_unlock(&smmu_domain->lock); |
1386 | |
1387 | /* Looks ok, so add the device to the domain */ |
1388 | master = find_smmu_master(smmu_domain->leaf_smmu, dev->of_node); |
1389 | @@ -1159,7 +1159,7 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev) |
1390 | return arm_smmu_domain_add_master(smmu_domain, master); |
1391 | |
1392 | err_unlock: |
1393 | - spin_unlock(&smmu_domain->lock); |
1394 | + mutex_unlock(&smmu_domain->lock); |
1395 | return ret; |
1396 | } |
1397 | |
1398 | @@ -1388,7 +1388,7 @@ static int arm_smmu_handle_mapping(struct arm_smmu_domain *smmu_domain, |
1399 | if (paddr & ~output_mask) |
1400 | return -ERANGE; |
1401 | |
1402 | - spin_lock(&smmu_domain->lock); |
1403 | + mutex_lock(&smmu_domain->lock); |
1404 | pgd += pgd_index(iova); |
1405 | end = iova + size; |
1406 | do { |
1407 | @@ -1404,7 +1404,7 @@ static int arm_smmu_handle_mapping(struct arm_smmu_domain *smmu_domain, |
1408 | } while (pgd++, iova != end); |
1409 | |
1410 | out_unlock: |
1411 | - spin_unlock(&smmu_domain->lock); |
1412 | + mutex_unlock(&smmu_domain->lock); |
1413 | |
1414 | /* Ensure new page tables are visible to the hardware walker */ |
1415 | if (smmu->features & ARM_SMMU_FEAT_COHERENT_WALK) |
1416 | @@ -1443,44 +1443,34 @@ static size_t arm_smmu_unmap(struct iommu_domain *domain, unsigned long iova, |
1417 | static phys_addr_t arm_smmu_iova_to_phys(struct iommu_domain *domain, |
1418 | dma_addr_t iova) |
1419 | { |
1420 | - pgd_t *pgd; |
1421 | - pud_t *pud; |
1422 | - pmd_t *pmd; |
1423 | - pte_t *pte; |
1424 | + pgd_t *pgdp, pgd; |
1425 | + pud_t pud; |
1426 | + pmd_t pmd; |
1427 | + pte_t pte; |
1428 | struct arm_smmu_domain *smmu_domain = domain->priv; |
1429 | struct arm_smmu_cfg *root_cfg = &smmu_domain->root_cfg; |
1430 | - struct arm_smmu_device *smmu = root_cfg->smmu; |
1431 | |
1432 | - spin_lock(&smmu_domain->lock); |
1433 | - pgd = root_cfg->pgd; |
1434 | - if (!pgd) |
1435 | - goto err_unlock; |
1436 | + pgdp = root_cfg->pgd; |
1437 | + if (!pgdp) |
1438 | + return 0; |
1439 | |
1440 | - pgd += pgd_index(iova); |
1441 | - if (pgd_none_or_clear_bad(pgd)) |
1442 | - goto err_unlock; |
1443 | + pgd = *(pgdp + pgd_index(iova)); |
1444 | + if (pgd_none(pgd)) |
1445 | + return 0; |
1446 | |
1447 | - pud = pud_offset(pgd, iova); |
1448 | - if (pud_none_or_clear_bad(pud)) |
1449 | - goto err_unlock; |
1450 | + pud = *pud_offset(&pgd, iova); |
1451 | + if (pud_none(pud)) |
1452 | + return 0; |
1453 | |
1454 | - pmd = pmd_offset(pud, iova); |
1455 | - if (pmd_none_or_clear_bad(pmd)) |
1456 | - goto err_unlock; |
1457 | + pmd = *pmd_offset(&pud, iova); |
1458 | + if (pmd_none(pmd)) |
1459 | + return 0; |
1460 | |
1461 | - pte = pmd_page_vaddr(*pmd) + pte_index(iova); |
1462 | + pte = *(pmd_page_vaddr(pmd) + pte_index(iova)); |
1463 | if (pte_none(pte)) |
1464 | - goto err_unlock; |
1465 | - |
1466 | - spin_unlock(&smmu_domain->lock); |
1467 | - return __pfn_to_phys(pte_pfn(*pte)) | (iova & ~PAGE_MASK); |
1468 | + return 0; |
1469 | |
1470 | -err_unlock: |
1471 | - spin_unlock(&smmu_domain->lock); |
1472 | - dev_warn(smmu->dev, |
1473 | - "invalid (corrupt?) page tables detected for iova 0x%llx\n", |
1474 | - (unsigned long long)iova); |
1475 | - return -EINVAL; |
1476 | + return __pfn_to_phys(pte_pfn(pte)) | (iova & ~PAGE_MASK); |
1477 | } |
1478 | |
1479 | static int arm_smmu_domain_has_cap(struct iommu_domain *domain, |
1480 | diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c |
1481 | index 173cbb20d104..54bdd923316f 100644 |
1482 | --- a/drivers/md/dm-bufio.c |
1483 | +++ b/drivers/md/dm-bufio.c |
1484 | @@ -1717,6 +1717,11 @@ static int __init dm_bufio_init(void) |
1485 | { |
1486 | __u64 mem; |
1487 | |
1488 | + dm_bufio_allocated_kmem_cache = 0; |
1489 | + dm_bufio_allocated_get_free_pages = 0; |
1490 | + dm_bufio_allocated_vmalloc = 0; |
1491 | + dm_bufio_current_allocated = 0; |
1492 | + |
1493 | memset(&dm_bufio_caches, 0, sizeof dm_bufio_caches); |
1494 | memset(&dm_bufio_cache_names, 0, sizeof dm_bufio_cache_names); |
1495 | |
1496 | diff --git a/drivers/md/dm-delay.c b/drivers/md/dm-delay.c |
1497 | index 496d5f3646a5..2f91d6d4a2cc 100644 |
1498 | --- a/drivers/md/dm-delay.c |
1499 | +++ b/drivers/md/dm-delay.c |
1500 | @@ -20,6 +20,7 @@ |
1501 | struct delay_c { |
1502 | struct timer_list delay_timer; |
1503 | struct mutex timer_lock; |
1504 | + struct workqueue_struct *kdelayd_wq; |
1505 | struct work_struct flush_expired_bios; |
1506 | struct list_head delayed_bios; |
1507 | atomic_t may_delay; |
1508 | @@ -45,14 +46,13 @@ struct dm_delay_info { |
1509 | |
1510 | static DEFINE_MUTEX(delayed_bios_lock); |
1511 | |
1512 | -static struct workqueue_struct *kdelayd_wq; |
1513 | static struct kmem_cache *delayed_cache; |
1514 | |
1515 | static void handle_delayed_timer(unsigned long data) |
1516 | { |
1517 | struct delay_c *dc = (struct delay_c *)data; |
1518 | |
1519 | - queue_work(kdelayd_wq, &dc->flush_expired_bios); |
1520 | + queue_work(dc->kdelayd_wq, &dc->flush_expired_bios); |
1521 | } |
1522 | |
1523 | static void queue_timeout(struct delay_c *dc, unsigned long expires) |
1524 | @@ -191,6 +191,12 @@ out: |
1525 | goto bad_dev_write; |
1526 | } |
1527 | |
1528 | + dc->kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); |
1529 | + if (!dc->kdelayd_wq) { |
1530 | + DMERR("Couldn't start kdelayd"); |
1531 | + goto bad_queue; |
1532 | + } |
1533 | + |
1534 | setup_timer(&dc->delay_timer, handle_delayed_timer, (unsigned long)dc); |
1535 | |
1536 | INIT_WORK(&dc->flush_expired_bios, flush_expired_bios); |
1537 | @@ -203,6 +209,8 @@ out: |
1538 | ti->private = dc; |
1539 | return 0; |
1540 | |
1541 | +bad_queue: |
1542 | + mempool_destroy(dc->delayed_pool); |
1543 | bad_dev_write: |
1544 | if (dc->dev_write) |
1545 | dm_put_device(ti, dc->dev_write); |
1546 | @@ -217,7 +225,7 @@ static void delay_dtr(struct dm_target *ti) |
1547 | { |
1548 | struct delay_c *dc = ti->private; |
1549 | |
1550 | - flush_workqueue(kdelayd_wq); |
1551 | + destroy_workqueue(dc->kdelayd_wq); |
1552 | |
1553 | dm_put_device(ti, dc->dev_read); |
1554 | |
1555 | @@ -350,12 +358,6 @@ static int __init dm_delay_init(void) |
1556 | { |
1557 | int r = -ENOMEM; |
1558 | |
1559 | - kdelayd_wq = alloc_workqueue("kdelayd", WQ_MEM_RECLAIM, 0); |
1560 | - if (!kdelayd_wq) { |
1561 | - DMERR("Couldn't start kdelayd"); |
1562 | - goto bad_queue; |
1563 | - } |
1564 | - |
1565 | delayed_cache = KMEM_CACHE(dm_delay_info, 0); |
1566 | if (!delayed_cache) { |
1567 | DMERR("Couldn't create delayed bio cache."); |
1568 | @@ -373,8 +375,6 @@ static int __init dm_delay_init(void) |
1569 | bad_register: |
1570 | kmem_cache_destroy(delayed_cache); |
1571 | bad_memcache: |
1572 | - destroy_workqueue(kdelayd_wq); |
1573 | -bad_queue: |
1574 | return r; |
1575 | } |
1576 | |
1577 | @@ -382,7 +382,6 @@ static void __exit dm_delay_exit(void) |
1578 | { |
1579 | dm_unregister_target(&delay_target); |
1580 | kmem_cache_destroy(delayed_cache); |
1581 | - destroy_workqueue(kdelayd_wq); |
1582 | } |
1583 | |
1584 | /* Module hooks */ |
1585 | diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c |
1586 | index aec57d76db5d..944690bafd93 100644 |
1587 | --- a/drivers/md/dm-snap.c |
1588 | +++ b/drivers/md/dm-snap.c |
1589 | @@ -66,6 +66,18 @@ struct dm_snapshot { |
1590 | |
1591 | atomic_t pending_exceptions_count; |
1592 | |
1593 | + /* Protected by "lock" */ |
1594 | + sector_t exception_start_sequence; |
1595 | + |
1596 | + /* Protected by kcopyd single-threaded callback */ |
1597 | + sector_t exception_complete_sequence; |
1598 | + |
1599 | + /* |
1600 | + * A list of pending exceptions that completed out of order. |
1601 | + * Protected by kcopyd single-threaded callback. |
1602 | + */ |
1603 | + struct list_head out_of_order_list; |
1604 | + |
1605 | mempool_t *pending_pool; |
1606 | |
1607 | struct dm_exception_table pending; |
1608 | @@ -173,6 +185,14 @@ struct dm_snap_pending_exception { |
1609 | */ |
1610 | int started; |
1611 | |
1612 | + /* There was copying error. */ |
1613 | + int copy_error; |
1614 | + |
1615 | + /* A sequence number, it is used for in-order completion. */ |
1616 | + sector_t exception_sequence; |
1617 | + |
1618 | + struct list_head out_of_order_entry; |
1619 | + |
1620 | /* |
1621 | * For writing a complete chunk, bypassing the copy. |
1622 | */ |
1623 | @@ -1094,6 +1114,9 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) |
1624 | s->valid = 1; |
1625 | s->active = 0; |
1626 | atomic_set(&s->pending_exceptions_count, 0); |
1627 | + s->exception_start_sequence = 0; |
1628 | + s->exception_complete_sequence = 0; |
1629 | + INIT_LIST_HEAD(&s->out_of_order_list); |
1630 | init_rwsem(&s->lock); |
1631 | INIT_LIST_HEAD(&s->list); |
1632 | spin_lock_init(&s->pe_lock); |
1633 | @@ -1443,6 +1466,19 @@ static void commit_callback(void *context, int success) |
1634 | pending_complete(pe, success); |
1635 | } |
1636 | |
1637 | +static void complete_exception(struct dm_snap_pending_exception *pe) |
1638 | +{ |
1639 | + struct dm_snapshot *s = pe->snap; |
1640 | + |
1641 | + if (unlikely(pe->copy_error)) |
1642 | + pending_complete(pe, 0); |
1643 | + |
1644 | + else |
1645 | + /* Update the metadata if we are persistent */ |
1646 | + s->store->type->commit_exception(s->store, &pe->e, |
1647 | + commit_callback, pe); |
1648 | +} |
1649 | + |
1650 | /* |
1651 | * Called when the copy I/O has finished. kcopyd actually runs |
1652 | * this code so don't block. |
1653 | @@ -1452,13 +1488,32 @@ static void copy_callback(int read_err, unsigned long write_err, void *context) |
1654 | struct dm_snap_pending_exception *pe = context; |
1655 | struct dm_snapshot *s = pe->snap; |
1656 | |
1657 | - if (read_err || write_err) |
1658 | - pending_complete(pe, 0); |
1659 | + pe->copy_error = read_err || write_err; |
1660 | |
1661 | - else |
1662 | - /* Update the metadata if we are persistent */ |
1663 | - s->store->type->commit_exception(s->store, &pe->e, |
1664 | - commit_callback, pe); |
1665 | + if (pe->exception_sequence == s->exception_complete_sequence) { |
1666 | + s->exception_complete_sequence++; |
1667 | + complete_exception(pe); |
1668 | + |
1669 | + while (!list_empty(&s->out_of_order_list)) { |
1670 | + pe = list_entry(s->out_of_order_list.next, |
1671 | + struct dm_snap_pending_exception, out_of_order_entry); |
1672 | + if (pe->exception_sequence != s->exception_complete_sequence) |
1673 | + break; |
1674 | + s->exception_complete_sequence++; |
1675 | + list_del(&pe->out_of_order_entry); |
1676 | + complete_exception(pe); |
1677 | + } |
1678 | + } else { |
1679 | + struct list_head *lh; |
1680 | + struct dm_snap_pending_exception *pe2; |
1681 | + |
1682 | + list_for_each_prev(lh, &s->out_of_order_list) { |
1683 | + pe2 = list_entry(lh, struct dm_snap_pending_exception, out_of_order_entry); |
1684 | + if (pe2->exception_sequence < pe->exception_sequence) |
1685 | + break; |
1686 | + } |
1687 | + list_add(&pe->out_of_order_entry, lh); |
1688 | + } |
1689 | } |
1690 | |
1691 | /* |
1692 | @@ -1553,6 +1608,8 @@ __find_pending_exception(struct dm_snapshot *s, |
1693 | return NULL; |
1694 | } |
1695 | |
1696 | + pe->exception_sequence = s->exception_start_sequence++; |
1697 | + |
1698 | dm_insert_exception(&s->pending, &pe->e); |
1699 | |
1700 | return pe; |
1701 | @@ -2192,7 +2249,7 @@ static struct target_type origin_target = { |
1702 | |
1703 | static struct target_type snapshot_target = { |
1704 | .name = "snapshot", |
1705 | - .version = {1, 11, 1}, |
1706 | + .version = {1, 12, 0}, |
1707 | .module = THIS_MODULE, |
1708 | .ctr = snapshot_ctr, |
1709 | .dtr = snapshot_dtr, |
1710 | diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c |
1711 | index 3d404c1371ed..28a90122a5a8 100644 |
1712 | --- a/drivers/md/dm-stats.c |
1713 | +++ b/drivers/md/dm-stats.c |
1714 | @@ -964,6 +964,7 @@ int dm_stats_message(struct mapped_device *md, unsigned argc, char **argv, |
1715 | |
1716 | int __init dm_statistics_init(void) |
1717 | { |
1718 | + shared_memory_amount = 0; |
1719 | dm_stat_need_rcu_barrier = 0; |
1720 | return 0; |
1721 | } |
1722 | diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c |
1723 | index 41d907b58f7e..20a8cc0df7c6 100644 |
1724 | --- a/drivers/md/dm-table.c |
1725 | +++ b/drivers/md/dm-table.c |
1726 | @@ -200,6 +200,11 @@ int dm_table_create(struct dm_table **result, fmode_t mode, |
1727 | |
1728 | num_targets = dm_round_up(num_targets, KEYS_PER_NODE); |
1729 | |
1730 | + if (!num_targets) { |
1731 | + kfree(t); |
1732 | + return -ENOMEM; |
1733 | + } |
1734 | + |
1735 | if (alloc_targets(t, num_targets)) { |
1736 | kfree(t); |
1737 | return -ENOMEM; |
1738 | diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c |
1739 | index 60bce435f4fa..8a30ad54bd46 100644 |
1740 | --- a/drivers/md/dm-thin-metadata.c |
1741 | +++ b/drivers/md/dm-thin-metadata.c |
1742 | @@ -1697,6 +1697,14 @@ void dm_pool_metadata_read_only(struct dm_pool_metadata *pmd) |
1743 | up_write(&pmd->root_lock); |
1744 | } |
1745 | |
1746 | +void dm_pool_metadata_read_write(struct dm_pool_metadata *pmd) |
1747 | +{ |
1748 | + down_write(&pmd->root_lock); |
1749 | + pmd->read_only = false; |
1750 | + dm_bm_set_read_write(pmd->bm); |
1751 | + up_write(&pmd->root_lock); |
1752 | +} |
1753 | + |
1754 | int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, |
1755 | dm_block_t threshold, |
1756 | dm_sm_threshold_fn fn, |
1757 | diff --git a/drivers/md/dm-thin-metadata.h b/drivers/md/dm-thin-metadata.h |
1758 | index 845ebbe589a9..7bcc0e1d6238 100644 |
1759 | --- a/drivers/md/dm-thin-metadata.h |
1760 | +++ b/drivers/md/dm-thin-metadata.h |
1761 | @@ -193,6 +193,7 @@ int dm_pool_resize_metadata_dev(struct dm_pool_metadata *pmd, dm_block_t new_siz |
1762 | * that nothing is changing. |
1763 | */ |
1764 | void dm_pool_metadata_read_only(struct dm_pool_metadata *pmd); |
1765 | +void dm_pool_metadata_read_write(struct dm_pool_metadata *pmd); |
1766 | |
1767 | int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, |
1768 | dm_block_t threshold, |
1769 | diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c |
1770 | index 2c0cf511ec23..ee29037ffc2e 100644 |
1771 | --- a/drivers/md/dm-thin.c |
1772 | +++ b/drivers/md/dm-thin.c |
1773 | @@ -640,7 +640,9 @@ static void process_prepared_mapping(struct dm_thin_new_mapping *m) |
1774 | */ |
1775 | r = dm_thin_insert_block(tc->td, m->virt_block, m->data_block); |
1776 | if (r) { |
1777 | - DMERR_LIMIT("dm_thin_insert_block() failed"); |
1778 | + DMERR_LIMIT("%s: dm_thin_insert_block() failed: error = %d", |
1779 | + dm_device_name(pool->pool_md), r); |
1780 | + set_pool_mode(pool, PM_READ_ONLY); |
1781 | cell_error(pool, m->cell); |
1782 | goto out; |
1783 | } |
1784 | @@ -881,32 +883,23 @@ static void schedule_zero(struct thin_c *tc, dm_block_t virt_block, |
1785 | } |
1786 | } |
1787 | |
1788 | -static int commit(struct pool *pool) |
1789 | -{ |
1790 | - int r; |
1791 | - |
1792 | - r = dm_pool_commit_metadata(pool->pmd); |
1793 | - if (r) |
1794 | - DMERR_LIMIT("%s: commit failed: error = %d", |
1795 | - dm_device_name(pool->pool_md), r); |
1796 | - |
1797 | - return r; |
1798 | -} |
1799 | - |
1800 | /* |
1801 | * A non-zero return indicates read_only or fail_io mode. |
1802 | * Many callers don't care about the return value. |
1803 | */ |
1804 | -static int commit_or_fallback(struct pool *pool) |
1805 | +static int commit(struct pool *pool) |
1806 | { |
1807 | int r; |
1808 | |
1809 | if (get_pool_mode(pool) != PM_WRITE) |
1810 | return -EINVAL; |
1811 | |
1812 | - r = commit(pool); |
1813 | - if (r) |
1814 | + r = dm_pool_commit_metadata(pool->pmd); |
1815 | + if (r) { |
1816 | + DMERR_LIMIT("%s: dm_pool_commit_metadata failed: error = %d", |
1817 | + dm_device_name(pool->pool_md), r); |
1818 | set_pool_mode(pool, PM_READ_ONLY); |
1819 | + } |
1820 | |
1821 | return r; |
1822 | } |
1823 | @@ -943,7 +936,9 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
1824 | * Try to commit to see if that will free up some |
1825 | * more space. |
1826 | */ |
1827 | - (void) commit_or_fallback(pool); |
1828 | + r = commit(pool); |
1829 | + if (r) |
1830 | + return r; |
1831 | |
1832 | r = dm_pool_get_free_block_count(pool->pmd, &free_blocks); |
1833 | if (r) |
1834 | @@ -957,7 +952,7 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
1835 | * table reload). |
1836 | */ |
1837 | if (!free_blocks) { |
1838 | - DMWARN("%s: no free space available.", |
1839 | + DMWARN("%s: no free data space available.", |
1840 | dm_device_name(pool->pool_md)); |
1841 | spin_lock_irqsave(&pool->lock, flags); |
1842 | pool->no_free_space = 1; |
1843 | @@ -967,8 +962,16 @@ static int alloc_data_block(struct thin_c *tc, dm_block_t *result) |
1844 | } |
1845 | |
1846 | r = dm_pool_alloc_data_block(pool->pmd, result); |
1847 | - if (r) |
1848 | + if (r) { |
1849 | + if (r == -ENOSPC && |
1850 | + !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && |
1851 | + !free_blocks) { |
1852 | + DMWARN("%s: no free metadata space available.", |
1853 | + dm_device_name(pool->pool_md)); |
1854 | + set_pool_mode(pool, PM_READ_ONLY); |
1855 | + } |
1856 | return r; |
1857 | + } |
1858 | |
1859 | return 0; |
1860 | } |
1861 | @@ -1349,7 +1352,7 @@ static void process_deferred_bios(struct pool *pool) |
1862 | if (bio_list_empty(&bios) && !need_commit_due_to_time(pool)) |
1863 | return; |
1864 | |
1865 | - if (commit_or_fallback(pool)) { |
1866 | + if (commit(pool)) { |
1867 | while ((bio = bio_list_pop(&bios))) |
1868 | bio_io_error(bio); |
1869 | return; |
1870 | @@ -1397,6 +1400,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode) |
1871 | case PM_FAIL: |
1872 | DMERR("%s: switching pool to failure mode", |
1873 | dm_device_name(pool->pool_md)); |
1874 | + dm_pool_metadata_read_only(pool->pmd); |
1875 | pool->process_bio = process_bio_fail; |
1876 | pool->process_discard = process_bio_fail; |
1877 | pool->process_prepared_mapping = process_prepared_mapping_fail; |
1878 | @@ -1421,6 +1425,7 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode) |
1879 | break; |
1880 | |
1881 | case PM_WRITE: |
1882 | + dm_pool_metadata_read_write(pool->pmd); |
1883 | pool->process_bio = process_bio; |
1884 | pool->process_discard = process_discard; |
1885 | pool->process_prepared_mapping = process_prepared_mapping; |
1886 | @@ -1637,12 +1642,19 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti) |
1887 | struct pool_c *pt = ti->private; |
1888 | |
1889 | /* |
1890 | - * We want to make sure that degraded pools are never upgraded. |
1891 | + * We want to make sure that a pool in PM_FAIL mode is never upgraded. |
1892 | */ |
1893 | enum pool_mode old_mode = pool->pf.mode; |
1894 | enum pool_mode new_mode = pt->adjusted_pf.mode; |
1895 | |
1896 | - if (old_mode > new_mode) |
1897 | + /* |
1898 | + * If we were in PM_FAIL mode, rollback of metadata failed. We're |
1899 | + * not going to recover without a thin_repair. So we never let the |
1900 | + * pool move out of the old mode. On the other hand a PM_READ_ONLY |
1901 | + * may have been due to a lack of metadata or data space, and may |
1902 | + * now work (ie. if the underlying devices have been resized). |
1903 | + */ |
1904 | + if (old_mode == PM_FAIL) |
1905 | new_mode = old_mode; |
1906 | |
1907 | pool->ti = ti; |
1908 | @@ -2266,7 +2278,7 @@ static int pool_preresume(struct dm_target *ti) |
1909 | return r; |
1910 | |
1911 | if (need_commit1 || need_commit2) |
1912 | - (void) commit_or_fallback(pool); |
1913 | + (void) commit(pool); |
1914 | |
1915 | return 0; |
1916 | } |
1917 | @@ -2293,7 +2305,7 @@ static void pool_postsuspend(struct dm_target *ti) |
1918 | |
1919 | cancel_delayed_work(&pool->waker); |
1920 | flush_workqueue(pool->wq); |
1921 | - (void) commit_or_fallback(pool); |
1922 | + (void) commit(pool); |
1923 | } |
1924 | |
1925 | static int check_arg_count(unsigned argc, unsigned args_required) |
1926 | @@ -2427,7 +2439,7 @@ static int process_reserve_metadata_snap_mesg(unsigned argc, char **argv, struct |
1927 | if (r) |
1928 | return r; |
1929 | |
1930 | - (void) commit_or_fallback(pool); |
1931 | + (void) commit(pool); |
1932 | |
1933 | r = dm_pool_reserve_metadata_snap(pool->pmd); |
1934 | if (r) |
1935 | @@ -2489,7 +2501,7 @@ static int pool_message(struct dm_target *ti, unsigned argc, char **argv) |
1936 | DMWARN("Unrecognised thin pool target message received: %s", argv[0]); |
1937 | |
1938 | if (!r) |
1939 | - (void) commit_or_fallback(pool); |
1940 | + (void) commit(pool); |
1941 | |
1942 | return r; |
1943 | } |
1944 | @@ -2544,7 +2556,7 @@ static void pool_status(struct dm_target *ti, status_type_t type, |
1945 | |
1946 | /* Commit to ensure statistics aren't out-of-date */ |
1947 | if (!(status_flags & DM_STATUS_NOFLUSH_FLAG) && !dm_suspended(ti)) |
1948 | - (void) commit_or_fallback(pool); |
1949 | + (void) commit(pool); |
1950 | |
1951 | r = dm_pool_get_metadata_transaction_id(pool->pmd, &transaction_id); |
1952 | if (r) { |
1953 | diff --git a/drivers/md/persistent-data/dm-array.c b/drivers/md/persistent-data/dm-array.c |
1954 | index af96e24ec328..1d75b1dc1e2e 100644 |
1955 | --- a/drivers/md/persistent-data/dm-array.c |
1956 | +++ b/drivers/md/persistent-data/dm-array.c |
1957 | @@ -317,8 +317,16 @@ static int shadow_ablock(struct dm_array_info *info, dm_block_t *root, |
1958 | * The shadow op will often be a noop. Only insert if it really |
1959 | * copied data. |
1960 | */ |
1961 | - if (dm_block_location(*block) != b) |
1962 | + if (dm_block_location(*block) != b) { |
1963 | + /* |
1964 | + * dm_tm_shadow_block will have already decremented the old |
1965 | + * block, but it is still referenced by the btree. We |
1966 | + * increment to stop the insert decrementing it below zero |
1967 | + * when overwriting the old value. |
1968 | + */ |
1969 | + dm_tm_inc(info->btree_info.tm, b); |
1970 | r = insert_ablock(info, index, *block, root); |
1971 | + } |
1972 | |
1973 | return r; |
1974 | } |
1975 | diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c |
1976 | index a7e8bf296388..064a3c271baa 100644 |
1977 | --- a/drivers/md/persistent-data/dm-block-manager.c |
1978 | +++ b/drivers/md/persistent-data/dm-block-manager.c |
1979 | @@ -626,6 +626,12 @@ void dm_bm_set_read_only(struct dm_block_manager *bm) |
1980 | } |
1981 | EXPORT_SYMBOL_GPL(dm_bm_set_read_only); |
1982 | |
1983 | +void dm_bm_set_read_write(struct dm_block_manager *bm) |
1984 | +{ |
1985 | + bm->read_only = false; |
1986 | +} |
1987 | +EXPORT_SYMBOL_GPL(dm_bm_set_read_write); |
1988 | + |
1989 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor) |
1990 | { |
1991 | return crc32c(~(u32) 0, data, len) ^ init_xor; |
1992 | diff --git a/drivers/md/persistent-data/dm-block-manager.h b/drivers/md/persistent-data/dm-block-manager.h |
1993 | index 9a82083a66b6..13cd58e1fe69 100644 |
1994 | --- a/drivers/md/persistent-data/dm-block-manager.h |
1995 | +++ b/drivers/md/persistent-data/dm-block-manager.h |
1996 | @@ -108,9 +108,9 @@ int dm_bm_unlock(struct dm_block *b); |
1997 | int dm_bm_flush_and_unlock(struct dm_block_manager *bm, |
1998 | struct dm_block *superblock); |
1999 | |
2000 | - /* |
2001 | - * Request data be prefetched into the cache. |
2002 | - */ |
2003 | +/* |
2004 | + * Request data is prefetched into the cache. |
2005 | + */ |
2006 | void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b); |
2007 | |
2008 | /* |
2009 | @@ -125,6 +125,7 @@ void dm_bm_prefetch(struct dm_block_manager *bm, dm_block_t b); |
2010 | * be returned if you do. |
2011 | */ |
2012 | void dm_bm_set_read_only(struct dm_block_manager *bm); |
2013 | +void dm_bm_set_read_write(struct dm_block_manager *bm); |
2014 | |
2015 | u32 dm_bm_checksum(const void *data, size_t len, u32 init_xor); |
2016 | |
2017 | diff --git a/drivers/md/persistent-data/dm-space-map-common.c b/drivers/md/persistent-data/dm-space-map-common.c |
2018 | index 6058569fe86c..466a60bbd716 100644 |
2019 | --- a/drivers/md/persistent-data/dm-space-map-common.c |
2020 | +++ b/drivers/md/persistent-data/dm-space-map-common.c |
2021 | @@ -381,7 +381,7 @@ int sm_ll_find_free_block(struct ll_disk *ll, dm_block_t begin, |
2022 | } |
2023 | |
2024 | static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, |
2025 | - uint32_t (*mutator)(void *context, uint32_t old), |
2026 | + int (*mutator)(void *context, uint32_t old, uint32_t *new), |
2027 | void *context, enum allocation_event *ev) |
2028 | { |
2029 | int r; |
2030 | @@ -410,11 +410,17 @@ static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, |
2031 | |
2032 | if (old > 2) { |
2033 | r = sm_ll_lookup_big_ref_count(ll, b, &old); |
2034 | - if (r < 0) |
2035 | + if (r < 0) { |
2036 | + dm_tm_unlock(ll->tm, nb); |
2037 | return r; |
2038 | + } |
2039 | } |
2040 | |
2041 | - ref_count = mutator(context, old); |
2042 | + r = mutator(context, old, &ref_count); |
2043 | + if (r) { |
2044 | + dm_tm_unlock(ll->tm, nb); |
2045 | + return r; |
2046 | + } |
2047 | |
2048 | if (ref_count <= 2) { |
2049 | sm_set_bitmap(bm_le, bit, ref_count); |
2050 | @@ -465,9 +471,10 @@ static int sm_ll_mutate(struct ll_disk *ll, dm_block_t b, |
2051 | return ll->save_ie(ll, index, &ie_disk); |
2052 | } |
2053 | |
2054 | -static uint32_t set_ref_count(void *context, uint32_t old) |
2055 | +static int set_ref_count(void *context, uint32_t old, uint32_t *new) |
2056 | { |
2057 | - return *((uint32_t *) context); |
2058 | + *new = *((uint32_t *) context); |
2059 | + return 0; |
2060 | } |
2061 | |
2062 | int sm_ll_insert(struct ll_disk *ll, dm_block_t b, |
2063 | @@ -476,9 +483,10 @@ int sm_ll_insert(struct ll_disk *ll, dm_block_t b, |
2064 | return sm_ll_mutate(ll, b, set_ref_count, &ref_count, ev); |
2065 | } |
2066 | |
2067 | -static uint32_t inc_ref_count(void *context, uint32_t old) |
2068 | +static int inc_ref_count(void *context, uint32_t old, uint32_t *new) |
2069 | { |
2070 | - return old + 1; |
2071 | + *new = old + 1; |
2072 | + return 0; |
2073 | } |
2074 | |
2075 | int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev) |
2076 | @@ -486,9 +494,15 @@ int sm_ll_inc(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev) |
2077 | return sm_ll_mutate(ll, b, inc_ref_count, NULL, ev); |
2078 | } |
2079 | |
2080 | -static uint32_t dec_ref_count(void *context, uint32_t old) |
2081 | +static int dec_ref_count(void *context, uint32_t old, uint32_t *new) |
2082 | { |
2083 | - return old - 1; |
2084 | + if (!old) { |
2085 | + DMERR_LIMIT("unable to decrement a reference count below 0"); |
2086 | + return -EINVAL; |
2087 | + } |
2088 | + |
2089 | + *new = old - 1; |
2090 | + return 0; |
2091 | } |
2092 | |
2093 | int sm_ll_dec(struct ll_disk *ll, dm_block_t b, enum allocation_event *ev) |
2094 | diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c |
2095 | index 1c959684caef..58fc1eef7499 100644 |
2096 | --- a/drivers/md/persistent-data/dm-space-map-metadata.c |
2097 | +++ b/drivers/md/persistent-data/dm-space-map-metadata.c |
2098 | @@ -384,12 +384,16 @@ static int sm_metadata_new_block(struct dm_space_map *sm, dm_block_t *b) |
2099 | struct sm_metadata *smm = container_of(sm, struct sm_metadata, sm); |
2100 | |
2101 | int r = sm_metadata_new_block_(sm, b); |
2102 | - if (r) |
2103 | + if (r) { |
2104 | DMERR("unable to allocate new metadata block"); |
2105 | + return r; |
2106 | + } |
2107 | |
2108 | r = sm_metadata_get_nr_free(sm, &count); |
2109 | - if (r) |
2110 | + if (r) { |
2111 | DMERR("couldn't get free block count"); |
2112 | + return r; |
2113 | + } |
2114 | |
2115 | check_threshold(&smm->threshold, count); |
2116 | |
2117 | diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c |
2118 | index 30ee59052157..65728c25ea05 100644 |
2119 | --- a/drivers/media/dvb-frontends/af9033.c |
2120 | +++ b/drivers/media/dvb-frontends/af9033.c |
2121 | @@ -170,18 +170,18 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val, |
2122 | static int af9033_wr_reg_val_tab(struct af9033_state *state, |
2123 | const struct reg_val *tab, int tab_len) |
2124 | { |
2125 | +#define MAX_TAB_LEN 212 |
2126 | int ret, i, j; |
2127 | - u8 buf[MAX_XFER_SIZE]; |
2128 | + u8 buf[1 + MAX_TAB_LEN]; |
2129 | + |
2130 | + dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); |
2131 | |
2132 | if (tab_len > sizeof(buf)) { |
2133 | - dev_warn(&state->i2c->dev, |
2134 | - "%s: i2c wr len=%d is too big!\n", |
2135 | - KBUILD_MODNAME, tab_len); |
2136 | + dev_warn(&state->i2c->dev, "%s: tab len %d is too big\n", |
2137 | + KBUILD_MODNAME, tab_len); |
2138 | return -EINVAL; |
2139 | } |
2140 | |
2141 | - dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); |
2142 | - |
2143 | for (i = 0, j = 0; i < tab_len; i++) { |
2144 | buf[j] = tab[i].val; |
2145 | |
2146 | diff --git a/drivers/media/dvb-frontends/cxd2820r_core.c b/drivers/media/dvb-frontends/cxd2820r_core.c |
2147 | index 51447a04d8f2..03930d5e9fea 100644 |
2148 | --- a/drivers/media/dvb-frontends/cxd2820r_core.c |
2149 | +++ b/drivers/media/dvb-frontends/cxd2820r_core.c |
2150 | @@ -34,7 +34,7 @@ static int cxd2820r_wr_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg, |
2151 | { |
2152 | .addr = i2c, |
2153 | .flags = 0, |
2154 | - .len = sizeof(buf), |
2155 | + .len = len + 1, |
2156 | .buf = buf, |
2157 | } |
2158 | }; |
2159 | @@ -75,7 +75,7 @@ static int cxd2820r_rd_regs_i2c(struct cxd2820r_priv *priv, u8 i2c, u8 reg, |
2160 | }, { |
2161 | .addr = i2c, |
2162 | .flags = I2C_M_RD, |
2163 | - .len = sizeof(buf), |
2164 | + .len = len, |
2165 | .buf = buf, |
2166 | } |
2167 | }; |
2168 | diff --git a/drivers/media/i2c/wm8775.c b/drivers/media/i2c/wm8775.c |
2169 | index 3f584a7d0781..bee7946faa7c 100644 |
2170 | --- a/drivers/media/i2c/wm8775.c |
2171 | +++ b/drivers/media/i2c/wm8775.c |
2172 | @@ -130,12 +130,10 @@ static int wm8775_s_routing(struct v4l2_subdev *sd, |
2173 | return -EINVAL; |
2174 | } |
2175 | state->input = input; |
2176 | - if (!v4l2_ctrl_g_ctrl(state->mute)) |
2177 | + if (v4l2_ctrl_g_ctrl(state->mute)) |
2178 | return 0; |
2179 | if (!v4l2_ctrl_g_ctrl(state->vol)) |
2180 | return 0; |
2181 | - if (!v4l2_ctrl_g_ctrl(state->bal)) |
2182 | - return 0; |
2183 | wm8775_set_audio(sd, 1); |
2184 | return 0; |
2185 | } |
2186 | diff --git a/drivers/media/pci/bt8xx/bttv-driver.c b/drivers/media/pci/bt8xx/bttv-driver.c |
2187 | index c6532de0eac7..4f0aaa51ae0d 100644 |
2188 | --- a/drivers/media/pci/bt8xx/bttv-driver.c |
2189 | +++ b/drivers/media/pci/bt8xx/bttv-driver.c |
2190 | @@ -4182,7 +4182,8 @@ static int bttv_probe(struct pci_dev *dev, const struct pci_device_id *pci_id) |
2191 | } |
2192 | btv->std = V4L2_STD_PAL; |
2193 | init_irqreg(btv); |
2194 | - v4l2_ctrl_handler_setup(hdl); |
2195 | + if (!bttv_tvcards[btv->c.type].no_video) |
2196 | + v4l2_ctrl_handler_setup(hdl); |
2197 | if (hdl->error) { |
2198 | result = hdl->error; |
2199 | goto fail2; |
2200 | diff --git a/drivers/media/pci/saa7164/saa7164-core.c b/drivers/media/pci/saa7164/saa7164-core.c |
2201 | index d37ee37aaefe..896bd8b974b5 100644 |
2202 | --- a/drivers/media/pci/saa7164/saa7164-core.c |
2203 | +++ b/drivers/media/pci/saa7164/saa7164-core.c |
2204 | @@ -1354,9 +1354,11 @@ static int saa7164_initdev(struct pci_dev *pci_dev, |
2205 | if (fw_debug) { |
2206 | dev->kthread = kthread_run(saa7164_thread_function, dev, |
2207 | "saa7164 debug"); |
2208 | - if (!dev->kthread) |
2209 | + if (IS_ERR(dev->kthread)) { |
2210 | + dev->kthread = NULL; |
2211 | printk(KERN_ERR "%s() Failed to create " |
2212 | "debug kernel thread\n", __func__); |
2213 | + } |
2214 | } |
2215 | |
2216 | } /* != BOARD_UNKNOWN */ |
2217 | diff --git a/drivers/media/radio/radio-tea5764.c b/drivers/media/radio/radio-tea5764.c |
2218 | index 036e2f54f4db..3ed1f5669f79 100644 |
2219 | --- a/drivers/media/radio/radio-tea5764.c |
2220 | +++ b/drivers/media/radio/radio-tea5764.c |
2221 | @@ -356,7 +356,7 @@ static int vidioc_s_frequency(struct file *file, void *priv, |
2222 | So we keep it as-is. */ |
2223 | return -EINVAL; |
2224 | } |
2225 | - clamp(freq, FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL); |
2226 | + freq = clamp(freq, FREQ_MIN * FREQ_MUL, FREQ_MAX * FREQ_MUL); |
2227 | tea5764_power_up(radio); |
2228 | tea5764_tune(radio, (freq * 125) / 2); |
2229 | return 0; |
2230 | diff --git a/drivers/media/radio/tef6862.c b/drivers/media/radio/tef6862.c |
2231 | index 06ac69245ca1..f4bb456b9a23 100644 |
2232 | --- a/drivers/media/radio/tef6862.c |
2233 | +++ b/drivers/media/radio/tef6862.c |
2234 | @@ -112,7 +112,7 @@ static int tef6862_s_frequency(struct v4l2_subdev *sd, const struct v4l2_frequen |
2235 | if (f->tuner != 0) |
2236 | return -EINVAL; |
2237 | |
2238 | - clamp(freq, TEF6862_LO_FREQ, TEF6862_HI_FREQ); |
2239 | + freq = clamp(freq, TEF6862_LO_FREQ, TEF6862_HI_FREQ); |
2240 | pll = 1964 + ((freq - TEF6862_LO_FREQ) * 20) / FREQ_MUL; |
2241 | i2cmsg[0] = (MODE_PRESET << MODE_SHIFT) | WM_SUB_PLLM; |
2242 | i2cmsg[1] = (pll >> 8) & 0xff; |
2243 | diff --git a/drivers/media/usb/dvb-usb-v2/af9035.c b/drivers/media/usb/dvb-usb-v2/af9035.c |
2244 | index c8fcd78425bd..8f9b2cea88f0 100644 |
2245 | --- a/drivers/media/usb/dvb-usb-v2/af9035.c |
2246 | +++ b/drivers/media/usb/dvb-usb-v2/af9035.c |
2247 | @@ -131,7 +131,7 @@ static int af9035_wr_regs(struct dvb_usb_device *d, u32 reg, u8 *val, int len) |
2248 | { |
2249 | u8 wbuf[MAX_XFER_SIZE]; |
2250 | u8 mbox = (reg >> 16) & 0xff; |
2251 | - struct usb_req req = { CMD_MEM_WR, mbox, sizeof(wbuf), wbuf, 0, NULL }; |
2252 | + struct usb_req req = { CMD_MEM_WR, mbox, 6 + len, wbuf, 0, NULL }; |
2253 | |
2254 | if (6 + len > sizeof(wbuf)) { |
2255 | dev_warn(&d->udev->dev, "%s: i2c wr: len=%d is too big!\n", |
2256 | @@ -238,14 +238,15 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, |
2257 | } else { |
2258 | /* I2C */ |
2259 | u8 buf[MAX_XFER_SIZE]; |
2260 | - struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), |
2261 | + struct usb_req req = { CMD_I2C_RD, 0, 5 + msg[0].len, |
2262 | buf, msg[1].len, msg[1].buf }; |
2263 | |
2264 | if (5 + msg[0].len > sizeof(buf)) { |
2265 | dev_warn(&d->udev->dev, |
2266 | "%s: i2c xfer: len=%d is too big!\n", |
2267 | KBUILD_MODNAME, msg[0].len); |
2268 | - return -EOPNOTSUPP; |
2269 | + ret = -EOPNOTSUPP; |
2270 | + goto unlock; |
2271 | } |
2272 | req.mbox |= ((msg[0].addr & 0x80) >> 3); |
2273 | buf[0] = msg[1].len; |
2274 | @@ -274,14 +275,15 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, |
2275 | } else { |
2276 | /* I2C */ |
2277 | u8 buf[MAX_XFER_SIZE]; |
2278 | - struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, |
2279 | - 0, NULL }; |
2280 | + struct usb_req req = { CMD_I2C_WR, 0, 5 + msg[0].len, |
2281 | + buf, 0, NULL }; |
2282 | |
2283 | if (5 + msg[0].len > sizeof(buf)) { |
2284 | dev_warn(&d->udev->dev, |
2285 | "%s: i2c xfer: len=%d is too big!\n", |
2286 | KBUILD_MODNAME, msg[0].len); |
2287 | - return -EOPNOTSUPP; |
2288 | + ret = -EOPNOTSUPP; |
2289 | + goto unlock; |
2290 | } |
2291 | req.mbox |= ((msg[0].addr & 0x80) >> 3); |
2292 | buf[0] = msg[0].len; |
2293 | @@ -319,6 +321,7 @@ static int af9035_i2c_master_xfer(struct i2c_adapter *adap, |
2294 | ret = -EOPNOTSUPP; |
2295 | } |
2296 | |
2297 | +unlock: |
2298 | mutex_unlock(&d->i2c_mutex); |
2299 | |
2300 | if (ret < 0) |
2301 | @@ -1534,6 +1537,8 @@ static const struct usb_device_id af9035_id_table[] = { |
2302 | /* XXX: that same ID [0ccd:0099] is used by af9015 driver too */ |
2303 | { DVB_USB_DEVICE(USB_VID_TERRATEC, 0x0099, |
2304 | &af9035_props, "TerraTec Cinergy T Stick Dual RC (rev. 2)", NULL) }, |
2305 | + { DVB_USB_DEVICE(USB_VID_LEADTEK, 0x6a05, |
2306 | + &af9035_props, "Leadtek WinFast DTV Dongle Dual", NULL) }, |
2307 | { } |
2308 | }; |
2309 | MODULE_DEVICE_TABLE(usb, af9035_id_table); |
2310 | diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c |
2311 | index c28d4e29af1a..e76a733e8a28 100644 |
2312 | --- a/drivers/mtd/nand/pxa3xx_nand.c |
2313 | +++ b/drivers/mtd/nand/pxa3xx_nand.c |
2314 | @@ -1241,10 +1241,6 @@ static struct of_device_id pxa3xx_nand_dt_ids[] = { |
2315 | .compatible = "marvell,pxa3xx-nand", |
2316 | .data = (void *)PXA3XX_NAND_VARIANT_PXA, |
2317 | }, |
2318 | - { |
2319 | - .compatible = "marvell,armada370-nand", |
2320 | - .data = (void *)PXA3XX_NAND_VARIANT_ARMADA370, |
2321 | - }, |
2322 | {} |
2323 | }; |
2324 | MODULE_DEVICE_TABLE(of, pxa3xx_nand_dt_ids); |
2325 | diff --git a/drivers/net/ethernet/allwinner/sun4i-emac.c b/drivers/net/ethernet/allwinner/sun4i-emac.c |
2326 | index 50b853a79d77..46dfb1378c17 100644 |
2327 | --- a/drivers/net/ethernet/allwinner/sun4i-emac.c |
2328 | +++ b/drivers/net/ethernet/allwinner/sun4i-emac.c |
2329 | @@ -717,8 +717,7 @@ static int emac_open(struct net_device *dev) |
2330 | if (netif_msg_ifup(db)) |
2331 | dev_dbg(db->dev, "enabling %s\n", dev->name); |
2332 | |
2333 | - if (devm_request_irq(db->dev, dev->irq, &emac_interrupt, |
2334 | - 0, dev->name, dev)) |
2335 | + if (request_irq(dev->irq, &emac_interrupt, 0, dev->name, dev)) |
2336 | return -EAGAIN; |
2337 | |
2338 | /* Initialize EMAC board */ |
2339 | @@ -774,6 +773,8 @@ static int emac_stop(struct net_device *ndev) |
2340 | |
2341 | emac_shutdown(ndev); |
2342 | |
2343 | + free_irq(ndev->irq, ndev); |
2344 | + |
2345 | return 0; |
2346 | } |
2347 | |
2348 | diff --git a/drivers/net/ethernet/intel/igb/e1000_phy.c b/drivers/net/ethernet/intel/igb/e1000_phy.c |
2349 | index e7266759a10b..556da81ab092 100644 |
2350 | --- a/drivers/net/ethernet/intel/igb/e1000_phy.c |
2351 | +++ b/drivers/net/ethernet/intel/igb/e1000_phy.c |
2352 | @@ -1730,7 +1730,10 @@ s32 igb_phy_has_link(struct e1000_hw *hw, u32 iterations, |
2353 | * ownership of the resources, wait and try again to |
2354 | * see if they have relinquished the resources yet. |
2355 | */ |
2356 | - udelay(usec_interval); |
2357 | + if (usec_interval >= 1000) |
2358 | + mdelay(usec_interval/1000); |
2359 | + else |
2360 | + udelay(usec_interval); |
2361 | } |
2362 | ret_val = hw->phy.ops.read_reg(hw, PHY_STATUS, &phy_status); |
2363 | if (ret_val) |
2364 | diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
2365 | index f4864807e15b..e493150d50c3 100644 |
2366 | --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
2367 | +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c |
2368 | @@ -3966,18 +3966,20 @@ static void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq) |
2369 | int quick_drop; |
2370 | s32 t[3], f[3] = {5180, 5500, 5785}; |
2371 | |
2372 | - if (!(pBase->miscConfiguration & BIT(1))) |
2373 | + if (!(pBase->miscConfiguration & BIT(4))) |
2374 | return; |
2375 | |
2376 | - if (freq < 4000) |
2377 | - quick_drop = eep->modalHeader2G.quick_drop; |
2378 | - else { |
2379 | - t[0] = eep->base_ext1.quick_drop_low; |
2380 | - t[1] = eep->modalHeader5G.quick_drop; |
2381 | - t[2] = eep->base_ext1.quick_drop_high; |
2382 | - quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3); |
2383 | + if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9340(ah)) { |
2384 | + if (freq < 4000) { |
2385 | + quick_drop = eep->modalHeader2G.quick_drop; |
2386 | + } else { |
2387 | + t[0] = eep->base_ext1.quick_drop_low; |
2388 | + t[1] = eep->modalHeader5G.quick_drop; |
2389 | + t[2] = eep->base_ext1.quick_drop_high; |
2390 | + quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3); |
2391 | + } |
2392 | + REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop); |
2393 | } |
2394 | - REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop); |
2395 | } |
2396 | |
2397 | static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz) |
2398 | @@ -4017,7 +4019,7 @@ static void ar9003_hw_xlna_bias_strength_apply(struct ath_hw *ah, bool is2ghz) |
2399 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; |
2400 | u8 bias; |
2401 | |
2402 | - if (!(eep->baseEepHeader.featureEnable & 0x40)) |
2403 | + if (!(eep->baseEepHeader.miscConfiguration & 0x40)) |
2404 | return; |
2405 | |
2406 | if (!AR_SREV_9300(ah)) |
2407 | diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c |
2408 | index dd30452df966..7fe6b5923a9c 100644 |
2409 | --- a/drivers/net/wireless/ath/ath9k/xmit.c |
2410 | +++ b/drivers/net/wireless/ath/ath9k/xmit.c |
2411 | @@ -1275,6 +1275,10 @@ static void ath_tx_fill_desc(struct ath_softc *sc, struct ath_buf *bf, |
2412 | if (!rts_thresh || (len > rts_thresh)) |
2413 | rts = true; |
2414 | } |
2415 | + |
2416 | + if (!aggr) |
2417 | + len = fi->framelen; |
2418 | + |
2419 | ath_buf_set_rate(sc, bf, &info, len, rts); |
2420 | } |
2421 | |
2422 | diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c |
2423 | index 76e14c046d94..200f0d98471a 100644 |
2424 | --- a/drivers/net/wireless/iwlwifi/iwl-7000.c |
2425 | +++ b/drivers/net/wireless/iwlwifi/iwl-7000.c |
2426 | @@ -125,6 +125,7 @@ const struct iwl_cfg iwl7260_2ac_cfg = { |
2427 | .ht_params = &iwl7000_ht_params, |
2428 | .nvm_ver = IWL7260_NVM_VERSION, |
2429 | .nvm_calib_ver = IWL7260_TX_POWER_VERSION, |
2430 | + .host_interrupt_operation_mode = true, |
2431 | }; |
2432 | |
2433 | const struct iwl_cfg iwl7260_2ac_cfg_high_temp = { |
2434 | @@ -135,6 +136,7 @@ const struct iwl_cfg iwl7260_2ac_cfg_high_temp = { |
2435 | .nvm_ver = IWL7260_NVM_VERSION, |
2436 | .nvm_calib_ver = IWL7260_TX_POWER_VERSION, |
2437 | .high_temp = true, |
2438 | + .host_interrupt_operation_mode = true, |
2439 | }; |
2440 | |
2441 | const struct iwl_cfg iwl7260_2n_cfg = { |
2442 | @@ -144,6 +146,7 @@ const struct iwl_cfg iwl7260_2n_cfg = { |
2443 | .ht_params = &iwl7000_ht_params, |
2444 | .nvm_ver = IWL7260_NVM_VERSION, |
2445 | .nvm_calib_ver = IWL7260_TX_POWER_VERSION, |
2446 | + .host_interrupt_operation_mode = true, |
2447 | }; |
2448 | |
2449 | const struct iwl_cfg iwl7260_n_cfg = { |
2450 | @@ -153,6 +156,7 @@ const struct iwl_cfg iwl7260_n_cfg = { |
2451 | .ht_params = &iwl7000_ht_params, |
2452 | .nvm_ver = IWL7260_NVM_VERSION, |
2453 | .nvm_calib_ver = IWL7260_TX_POWER_VERSION, |
2454 | + .host_interrupt_operation_mode = true, |
2455 | }; |
2456 | |
2457 | const struct iwl_cfg iwl3160_2ac_cfg = { |
2458 | @@ -162,6 +166,7 @@ const struct iwl_cfg iwl3160_2ac_cfg = { |
2459 | .ht_params = &iwl7000_ht_params, |
2460 | .nvm_ver = IWL3160_NVM_VERSION, |
2461 | .nvm_calib_ver = IWL3160_TX_POWER_VERSION, |
2462 | + .host_interrupt_operation_mode = true, |
2463 | }; |
2464 | |
2465 | const struct iwl_cfg iwl3160_2n_cfg = { |
2466 | @@ -171,6 +176,7 @@ const struct iwl_cfg iwl3160_2n_cfg = { |
2467 | .ht_params = &iwl7000_ht_params, |
2468 | .nvm_ver = IWL3160_NVM_VERSION, |
2469 | .nvm_calib_ver = IWL3160_TX_POWER_VERSION, |
2470 | + .host_interrupt_operation_mode = true, |
2471 | }; |
2472 | |
2473 | const struct iwl_cfg iwl3160_n_cfg = { |
2474 | @@ -180,6 +186,7 @@ const struct iwl_cfg iwl3160_n_cfg = { |
2475 | .ht_params = &iwl7000_ht_params, |
2476 | .nvm_ver = IWL3160_NVM_VERSION, |
2477 | .nvm_calib_ver = IWL3160_TX_POWER_VERSION, |
2478 | + .host_interrupt_operation_mode = true, |
2479 | }; |
2480 | |
2481 | MODULE_FIRMWARE(IWL7260_MODULE_FIRMWARE(IWL7260_UCODE_API_OK)); |
2482 | diff --git a/drivers/net/wireless/iwlwifi/iwl-config.h b/drivers/net/wireless/iwlwifi/iwl-config.h |
2483 | index b03c25e14903..028ae91edf55 100644 |
2484 | --- a/drivers/net/wireless/iwlwifi/iwl-config.h |
2485 | +++ b/drivers/net/wireless/iwlwifi/iwl-config.h |
2486 | @@ -207,6 +207,8 @@ struct iwl_eeprom_params { |
2487 | * @rx_with_siso_diversity: 1x1 device with rx antenna diversity |
2488 | * @internal_wimax_coex: internal wifi/wimax combo device |
2489 | * @high_temp: Is this NIC is designated to be in high temperature. |
2490 | + * @host_interrupt_operation_mode: device needs host interrupt operation |
2491 | + * mode set |
2492 | * |
2493 | * We enable the driver to be backward compatible wrt. hardware features. |
2494 | * API differences in uCode shouldn't be handled here but through TLVs |
2495 | @@ -235,6 +237,7 @@ struct iwl_cfg { |
2496 | enum iwl_led_mode led_mode; |
2497 | const bool rx_with_siso_diversity; |
2498 | const bool internal_wimax_coex; |
2499 | + const bool host_interrupt_operation_mode; |
2500 | bool high_temp; |
2501 | }; |
2502 | |
2503 | diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h |
2504 | index a276af476e2d..641420528771 100644 |
2505 | --- a/drivers/net/wireless/iwlwifi/iwl-csr.h |
2506 | +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h |
2507 | @@ -463,14 +463,11 @@ |
2508 | * the CSR_INT_COALESCING is an 8 bit register in 32-usec unit |
2509 | * |
2510 | * default interrupt coalescing timer is 64 x 32 = 2048 usecs |
2511 | - * default interrupt coalescing calibration timer is 16 x 32 = 512 usecs |
2512 | */ |
2513 | #define IWL_HOST_INT_TIMEOUT_MAX (0xFF) |
2514 | #define IWL_HOST_INT_TIMEOUT_DEF (0x40) |
2515 | #define IWL_HOST_INT_TIMEOUT_MIN (0x0) |
2516 | -#define IWL_HOST_INT_CALIB_TIMEOUT_MAX (0xFF) |
2517 | -#define IWL_HOST_INT_CALIB_TIMEOUT_DEF (0x10) |
2518 | -#define IWL_HOST_INT_CALIB_TIMEOUT_MIN (0x0) |
2519 | +#define IWL_HOST_INT_OPER_MODE BIT(31) |
2520 | |
2521 | /***************************************************************************** |
2522 | * 7000/3000 series SHR DTS addresses * |
2523 | diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c |
2524 | index aac81b8984b0..c196425a6723 100644 |
2525 | --- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c |
2526 | +++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c |
2527 | @@ -119,6 +119,10 @@ static ssize_t iwl_dbgfs_sta_drain_write(struct file *file, |
2528 | |
2529 | if (sscanf(buf, "%d %d", &sta_id, &drain) != 2) |
2530 | return -EINVAL; |
2531 | + if (sta_id < 0 || sta_id >= IWL_MVM_STATION_COUNT) |
2532 | + return -EINVAL; |
2533 | + if (drain < 0 || drain > 1) |
2534 | + return -EINVAL; |
2535 | |
2536 | mutex_lock(&mvm->mutex); |
2537 | |
2538 | diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c |
2539 | index 3f237b42eb36..83d28bcf0d48 100644 |
2540 | --- a/drivers/net/wireless/iwlwifi/pcie/rx.c |
2541 | +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c |
2542 | @@ -489,6 +489,10 @@ static void iwl_pcie_rx_hw_init(struct iwl_trans *trans, struct iwl_rxq *rxq) |
2543 | |
2544 | /* Set interrupt coalescing timer to default (2048 usecs) */ |
2545 | iwl_write8(trans, CSR_INT_COALESCING, IWL_HOST_INT_TIMEOUT_DEF); |
2546 | + |
2547 | + /* W/A for interrupt coalescing bug in 7260 and 3160 */ |
2548 | + if (trans->cfg->host_interrupt_operation_mode) |
2549 | + iwl_set_bit(trans, CSR_INT_COALESCING, IWL_HOST_INT_OPER_MODE); |
2550 | } |
2551 | |
2552 | static void iwl_pcie_rx_init_rxb_lists(struct iwl_rxq *rxq) |
2553 | diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c |
2554 | index c3f904d422b0..6bc31003a32c 100644 |
2555 | --- a/drivers/net/wireless/iwlwifi/pcie/trans.c |
2556 | +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c |
2557 | @@ -276,9 +276,6 @@ static int iwl_pcie_nic_init(struct iwl_trans *trans) |
2558 | spin_lock_irqsave(&trans_pcie->irq_lock, flags); |
2559 | iwl_pcie_apm_init(trans); |
2560 | |
2561 | - /* Set interrupt coalescing calibration timer to default (512 usecs) */ |
2562 | - iwl_write8(trans, CSR_INT_COALESCING, IWL_HOST_INT_CALIB_TIMEOUT_DEF); |
2563 | - |
2564 | spin_unlock_irqrestore(&trans_pcie->irq_lock, flags); |
2565 | |
2566 | iwl_pcie_set_pwr(trans, false); |
2567 | diff --git a/drivers/net/wireless/mwifiex/sta_ioctl.c b/drivers/net/wireless/mwifiex/sta_ioctl.c |
2568 | index f084412eee0b..bf63e13d14c9 100644 |
2569 | --- a/drivers/net/wireless/mwifiex/sta_ioctl.c |
2570 | +++ b/drivers/net/wireless/mwifiex/sta_ioctl.c |
2571 | @@ -319,8 +319,8 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss, |
2572 | if (bss_desc && bss_desc->ssid.ssid_len && |
2573 | (!mwifiex_ssid_cmp(&priv->curr_bss_params.bss_descriptor. |
2574 | ssid, &bss_desc->ssid))) { |
2575 | - kfree(bss_desc); |
2576 | - return 0; |
2577 | + ret = 0; |
2578 | + goto done; |
2579 | } |
2580 | |
2581 | /* Exit Adhoc mode first */ |
2582 | diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c |
2583 | index 98f7b9b89507..53dc57127ca3 100644 |
2584 | --- a/drivers/pci/pci-driver.c |
2585 | +++ b/drivers/pci/pci-driver.c |
2586 | @@ -19,6 +19,7 @@ |
2587 | #include <linux/cpu.h> |
2588 | #include <linux/pm_runtime.h> |
2589 | #include <linux/suspend.h> |
2590 | +#include <linux/kexec.h> |
2591 | #include "pci.h" |
2592 | |
2593 | struct pci_dynid { |
2594 | @@ -388,12 +389,17 @@ static void pci_device_shutdown(struct device *dev) |
2595 | pci_msi_shutdown(pci_dev); |
2596 | pci_msix_shutdown(pci_dev); |
2597 | |
2598 | +#ifdef CONFIG_KEXEC |
2599 | /* |
2600 | - * Turn off Bus Master bit on the device to tell it to not |
2601 | - * continue to do DMA. Don't touch devices in D3cold or unknown states. |
2602 | + * If this is a kexec reboot, turn off Bus Master bit on the |
2603 | + * device to tell it to not continue to do DMA. Don't touch |
2604 | + * devices in D3cold or unknown states. |
2605 | + * If it is not a kexec reboot, firmware will hit the PCI |
2606 | + * devices with big hammer and stop their DMA any way. |
2607 | */ |
2608 | - if (pci_dev->current_state <= PCI_D3hot) |
2609 | + if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot)) |
2610 | pci_clear_master(pci_dev); |
2611 | +#endif |
2612 | } |
2613 | |
2614 | #ifdef CONFIG_PM |
2615 | diff --git a/drivers/regulator/pfuze100-regulator.c b/drivers/regulator/pfuze100-regulator.c |
2616 | index 032df3799efb..8b5e4c712a01 100644 |
2617 | --- a/drivers/regulator/pfuze100-regulator.c |
2618 | +++ b/drivers/regulator/pfuze100-regulator.c |
2619 | @@ -38,7 +38,7 @@ |
2620 | |
2621 | #define PFUZE100_DEVICEID 0x0 |
2622 | #define PFUZE100_REVID 0x3 |
2623 | -#define PFUZE100_FABID 0x3 |
2624 | +#define PFUZE100_FABID 0x4 |
2625 | |
2626 | #define PFUZE100_SW1ABVOL 0x20 |
2627 | #define PFUZE100_SW1CVOL 0x2e |
2628 | diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c |
2629 | index 741892632ae0..b86eec3ffba8 100644 |
2630 | --- a/drivers/rtc/rtc-at91rm9200.c |
2631 | +++ b/drivers/rtc/rtc-at91rm9200.c |
2632 | @@ -220,6 +220,8 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm) |
2633 | |
2634 | at91_alarm_year = tm.tm_year; |
2635 | |
2636 | + tm.tm_mon = alrm->time.tm_mon; |
2637 | + tm.tm_mday = alrm->time.tm_mday; |
2638 | tm.tm_hour = alrm->time.tm_hour; |
2639 | tm.tm_min = alrm->time.tm_min; |
2640 | tm.tm_sec = alrm->time.tm_sec; |
2641 | diff --git a/drivers/staging/comedi/drivers/amplc_pc263.c b/drivers/staging/comedi/drivers/amplc_pc263.c |
2642 | index e7108045f553..d13c532b68cd 100644 |
2643 | --- a/drivers/staging/comedi/drivers/amplc_pc263.c |
2644 | +++ b/drivers/staging/comedi/drivers/amplc_pc263.c |
2645 | @@ -68,6 +68,9 @@ static int pc263_do_insn_bits(struct comedi_device *dev, |
2646 | outb(s->state & 0xFF, dev->iobase); |
2647 | outb(s->state >> 8, dev->iobase + 1); |
2648 | } |
2649 | + |
2650 | + data[1] = s->state; |
2651 | + |
2652 | return insn->n; |
2653 | } |
2654 | |
2655 | diff --git a/drivers/staging/comedi/drivers/amplc_pci263.c b/drivers/staging/comedi/drivers/amplc_pci263.c |
2656 | index 145bb48f618e..a9c77af3b76d 100644 |
2657 | --- a/drivers/staging/comedi/drivers/amplc_pci263.c |
2658 | +++ b/drivers/staging/comedi/drivers/amplc_pci263.c |
2659 | @@ -55,6 +55,9 @@ static int pci263_do_insn_bits(struct comedi_device *dev, |
2660 | outb(s->state & 0xFF, dev->iobase); |
2661 | outb(s->state >> 8, dev->iobase + 1); |
2662 | } |
2663 | + |
2664 | + data[1] = s->state; |
2665 | + |
2666 | return insn->n; |
2667 | } |
2668 | |
2669 | diff --git a/drivers/staging/comedi/drivers/ssv_dnp.c b/drivers/staging/comedi/drivers/ssv_dnp.c |
2670 | index 11758a515c1b..0e687de7848f 100644 |
2671 | --- a/drivers/staging/comedi/drivers/ssv_dnp.c |
2672 | +++ b/drivers/staging/comedi/drivers/ssv_dnp.c |
2673 | @@ -83,11 +83,11 @@ static int dnp_dio_insn_bits(struct comedi_device *dev, |
2674 | |
2675 | /* on return, data[1] contains the value of the digital input lines. */ |
2676 | outb(PADR, CSCIR); |
2677 | - data[0] = inb(CSCDR); |
2678 | + data[1] = inb(CSCDR); |
2679 | outb(PBDR, CSCIR); |
2680 | - data[0] += inb(CSCDR) << 8; |
2681 | + data[1] += inb(CSCDR) << 8; |
2682 | outb(PCDR, CSCIR); |
2683 | - data[0] += ((inb(CSCDR) & 0xF0) << 12); |
2684 | + data[1] += ((inb(CSCDR) & 0xF0) << 12); |
2685 | |
2686 | return insn->n; |
2687 | |
2688 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
2689 | index 243c6729c320..c5c366790e6a 100644 |
2690 | --- a/drivers/usb/core/hub.c |
2691 | +++ b/drivers/usb/core/hub.c |
2692 | @@ -4836,8 +4836,9 @@ static void hub_events(void) |
2693 | hub->ports[i - 1]->child; |
2694 | |
2695 | dev_dbg(hub_dev, "warm reset port %d\n", i); |
2696 | - if (!udev || !(portstatus & |
2697 | - USB_PORT_STAT_CONNECTION)) { |
2698 | + if (!udev || |
2699 | + !(portstatus & USB_PORT_STAT_CONNECTION) || |
2700 | + udev->state == USB_STATE_NOTATTACHED) { |
2701 | status = hub_port_reset(hub, i, |
2702 | NULL, HUB_BH_RESET_TIME, |
2703 | true); |
2704 | diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c |
2705 | index 7fa93f4bc507..056da977ebdf 100644 |
2706 | --- a/drivers/usb/dwc3/ep0.c |
2707 | +++ b/drivers/usb/dwc3/ep0.c |
2708 | @@ -459,6 +459,8 @@ static int dwc3_ep0_handle_feature(struct dwc3 *dwc, |
2709 | dep = dwc3_wIndex_to_dep(dwc, wIndex); |
2710 | if (!dep) |
2711 | return -EINVAL; |
2712 | + if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) |
2713 | + break; |
2714 | ret = __dwc3_gadget_ep_set_halt(dep, set); |
2715 | if (ret) |
2716 | return -EINVAL; |
2717 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c |
2718 | index 5452c0fce360..02e44fcaf205 100644 |
2719 | --- a/drivers/usb/dwc3/gadget.c |
2720 | +++ b/drivers/usb/dwc3/gadget.c |
2721 | @@ -1200,9 +1200,6 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value) |
2722 | else |
2723 | dep->flags |= DWC3_EP_STALL; |
2724 | } else { |
2725 | - if (dep->flags & DWC3_EP_WEDGE) |
2726 | - return 0; |
2727 | - |
2728 | ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, |
2729 | DWC3_DEPCMD_CLEARSTALL, ¶ms); |
2730 | if (ret) |
2731 | @@ -1210,7 +1207,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value) |
2732 | value ? "set" : "clear", |
2733 | dep->name); |
2734 | else |
2735 | - dep->flags &= ~DWC3_EP_STALL; |
2736 | + dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); |
2737 | } |
2738 | |
2739 | return ret; |
2740 | diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c |
2741 | index d4f0f3305759..7c0adb9812aa 100644 |
2742 | --- a/drivers/usb/gadget/composite.c |
2743 | +++ b/drivers/usb/gadget/composite.c |
2744 | @@ -593,6 +593,7 @@ static void reset_config(struct usb_composite_dev *cdev) |
2745 | bitmap_zero(f->endpoints, 32); |
2746 | } |
2747 | cdev->config = NULL; |
2748 | + cdev->delayed_status = 0; |
2749 | } |
2750 | |
2751 | static int set_config(struct usb_composite_dev *cdev, |
2752 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
2753 | index 6bfbd80ec2b9..55fc0c39b7e1 100644 |
2754 | --- a/drivers/usb/host/xhci-ring.c |
2755 | +++ b/drivers/usb/host/xhci-ring.c |
2756 | @@ -2929,8 +2929,58 @@ static int prepare_ring(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, |
2757 | } |
2758 | |
2759 | while (1) { |
2760 | - if (room_on_ring(xhci, ep_ring, num_trbs)) |
2761 | - break; |
2762 | + if (room_on_ring(xhci, ep_ring, num_trbs)) { |
2763 | + union xhci_trb *trb = ep_ring->enqueue; |
2764 | + unsigned int usable = ep_ring->enq_seg->trbs + |
2765 | + TRBS_PER_SEGMENT - 1 - trb; |
2766 | + u32 nop_cmd; |
2767 | + |
2768 | + /* |
2769 | + * Section 4.11.7.1 TD Fragments states that a link |
2770 | + * TRB must only occur at the boundary between |
2771 | + * data bursts (eg 512 bytes for 480M). |
2772 | + * While it is possible to split a large fragment |
2773 | + * we don't know the size yet. |
2774 | + * Simplest solution is to fill the trb before the |
2775 | + * LINK with nop commands. |
2776 | + */ |
2777 | + if (num_trbs == 1 || num_trbs <= usable || usable == 0) |
2778 | + break; |
2779 | + |
2780 | + if (ep_ring->type != TYPE_BULK) |
2781 | + /* |
2782 | + * While isoc transfers might have a buffer that |
2783 | + * crosses a 64k boundary it is unlikely. |
2784 | + * Since we can't add NOPs without generating |
2785 | + * gaps in the traffic just hope it never |
2786 | + * happens at the end of the ring. |
2787 | + * This could be fixed by writing a LINK TRB |
2788 | + * instead of the first NOP - however the |
2789 | + * TRB_TYPE_LINK_LE32() calls would all need |
2790 | + * changing to check the ring length. |
2791 | + */ |
2792 | + break; |
2793 | + |
2794 | + if (num_trbs >= TRBS_PER_SEGMENT) { |
2795 | + xhci_err(xhci, "Too many fragments %d, max %d\n", |
2796 | + num_trbs, TRBS_PER_SEGMENT - 1); |
2797 | + return -ENOMEM; |
2798 | + } |
2799 | + |
2800 | + nop_cmd = cpu_to_le32(TRB_TYPE(TRB_TR_NOOP) | |
2801 | + ep_ring->cycle_state); |
2802 | + ep_ring->num_trbs_free -= usable; |
2803 | + do { |
2804 | + trb->generic.field[0] = 0; |
2805 | + trb->generic.field[1] = 0; |
2806 | + trb->generic.field[2] = 0; |
2807 | + trb->generic.field[3] = nop_cmd; |
2808 | + trb++; |
2809 | + } while (--usable); |
2810 | + ep_ring->enqueue = trb; |
2811 | + if (room_on_ring(xhci, ep_ring, num_trbs)) |
2812 | + break; |
2813 | + } |
2814 | |
2815 | if (ep_ring == xhci->cmd_ring) { |
2816 | xhci_err(xhci, "Do not support expand command ring\n"); |
2817 | diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c |
2818 | index ae959746f77f..0c593afc3185 100644 |
2819 | --- a/drivers/usb/musb/musb_cppi41.c |
2820 | +++ b/drivers/usb/musb/musb_cppi41.c |
2821 | @@ -38,6 +38,7 @@ struct cppi41_dma_channel { |
2822 | u32 prog_len; |
2823 | u32 transferred; |
2824 | u32 packet_sz; |
2825 | + struct list_head tx_check; |
2826 | }; |
2827 | |
2828 | #define MUSB_DMA_NUM_CHANNELS 15 |
2829 | @@ -47,6 +48,8 @@ struct cppi41_dma_controller { |
2830 | struct cppi41_dma_channel rx_channel[MUSB_DMA_NUM_CHANNELS]; |
2831 | struct cppi41_dma_channel tx_channel[MUSB_DMA_NUM_CHANNELS]; |
2832 | struct musb *musb; |
2833 | + struct hrtimer early_tx; |
2834 | + struct list_head early_tx_list; |
2835 | u32 rx_mode; |
2836 | u32 tx_mode; |
2837 | u32 auto_req; |
2838 | @@ -96,31 +99,27 @@ static void update_rx_toggle(struct cppi41_dma_channel *cppi41_channel) |
2839 | cppi41_channel->usb_toggle = toggle; |
2840 | } |
2841 | |
2842 | -static void cppi41_dma_callback(void *private_data) |
2843 | +static bool musb_is_tx_fifo_empty(struct musb_hw_ep *hw_ep) |
2844 | { |
2845 | - struct dma_channel *channel = private_data; |
2846 | - struct cppi41_dma_channel *cppi41_channel = channel->private_data; |
2847 | - struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; |
2848 | - struct musb *musb = hw_ep->musb; |
2849 | - unsigned long flags; |
2850 | - struct dma_tx_state txstate; |
2851 | - u32 transferred; |
2852 | + u8 epnum = hw_ep->epnum; |
2853 | + struct musb *musb = hw_ep->musb; |
2854 | + void __iomem *epio = musb->endpoints[epnum].regs; |
2855 | + u16 csr; |
2856 | |
2857 | - spin_lock_irqsave(&musb->lock, flags); |
2858 | + csr = musb_readw(epio, MUSB_TXCSR); |
2859 | + if (csr & MUSB_TXCSR_TXPKTRDY) |
2860 | + return false; |
2861 | + return true; |
2862 | +} |
2863 | |
2864 | - dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, |
2865 | - &txstate); |
2866 | - transferred = cppi41_channel->prog_len - txstate.residue; |
2867 | - cppi41_channel->transferred += transferred; |
2868 | +static void cppi41_dma_callback(void *private_data); |
2869 | |
2870 | - dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", |
2871 | - hw_ep->epnum, cppi41_channel->transferred, |
2872 | - cppi41_channel->total_len); |
2873 | +static void cppi41_trans_done(struct cppi41_dma_channel *cppi41_channel) |
2874 | +{ |
2875 | + struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; |
2876 | + struct musb *musb = hw_ep->musb; |
2877 | |
2878 | - update_rx_toggle(cppi41_channel); |
2879 | - |
2880 | - if (cppi41_channel->transferred == cppi41_channel->total_len || |
2881 | - transferred < cppi41_channel->packet_sz) { |
2882 | + if (!cppi41_channel->prog_len) { |
2883 | |
2884 | /* done, complete */ |
2885 | cppi41_channel->channel.actual_len = |
2886 | @@ -150,13 +149,11 @@ static void cppi41_dma_callback(void *private_data) |
2887 | remain_bytes, |
2888 | direction, |
2889 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); |
2890 | - if (WARN_ON(!dma_desc)) { |
2891 | - spin_unlock_irqrestore(&musb->lock, flags); |
2892 | + if (WARN_ON(!dma_desc)) |
2893 | return; |
2894 | - } |
2895 | |
2896 | dma_desc->callback = cppi41_dma_callback; |
2897 | - dma_desc->callback_param = channel; |
2898 | + dma_desc->callback_param = &cppi41_channel->channel; |
2899 | cppi41_channel->cookie = dma_desc->tx_submit(dma_desc); |
2900 | dma_async_issue_pending(dc); |
2901 | |
2902 | @@ -166,6 +163,117 @@ static void cppi41_dma_callback(void *private_data) |
2903 | musb_writew(epio, MUSB_RXCSR, csr); |
2904 | } |
2905 | } |
2906 | +} |
2907 | + |
2908 | +static enum hrtimer_restart cppi41_recheck_tx_req(struct hrtimer *timer) |
2909 | +{ |
2910 | + struct cppi41_dma_controller *controller; |
2911 | + struct cppi41_dma_channel *cppi41_channel, *n; |
2912 | + struct musb *musb; |
2913 | + unsigned long flags; |
2914 | + enum hrtimer_restart ret = HRTIMER_NORESTART; |
2915 | + |
2916 | + controller = container_of(timer, struct cppi41_dma_controller, |
2917 | + early_tx); |
2918 | + musb = controller->musb; |
2919 | + |
2920 | + spin_lock_irqsave(&musb->lock, flags); |
2921 | + list_for_each_entry_safe(cppi41_channel, n, &controller->early_tx_list, |
2922 | + tx_check) { |
2923 | + bool empty; |
2924 | + struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; |
2925 | + |
2926 | + empty = musb_is_tx_fifo_empty(hw_ep); |
2927 | + if (empty) { |
2928 | + list_del_init(&cppi41_channel->tx_check); |
2929 | + cppi41_trans_done(cppi41_channel); |
2930 | + } |
2931 | + } |
2932 | + |
2933 | + if (!list_empty(&controller->early_tx_list)) { |
2934 | + ret = HRTIMER_RESTART; |
2935 | + hrtimer_forward_now(&controller->early_tx, |
2936 | + ktime_set(0, 150 * NSEC_PER_USEC)); |
2937 | + } |
2938 | + |
2939 | + spin_unlock_irqrestore(&musb->lock, flags); |
2940 | + return ret; |
2941 | +} |
2942 | + |
2943 | +static void cppi41_dma_callback(void *private_data) |
2944 | +{ |
2945 | + struct dma_channel *channel = private_data; |
2946 | + struct cppi41_dma_channel *cppi41_channel = channel->private_data; |
2947 | + struct musb_hw_ep *hw_ep = cppi41_channel->hw_ep; |
2948 | + struct musb *musb = hw_ep->musb; |
2949 | + unsigned long flags; |
2950 | + struct dma_tx_state txstate; |
2951 | + u32 transferred; |
2952 | + bool empty; |
2953 | + |
2954 | + spin_lock_irqsave(&musb->lock, flags); |
2955 | + |
2956 | + dmaengine_tx_status(cppi41_channel->dc, cppi41_channel->cookie, |
2957 | + &txstate); |
2958 | + transferred = cppi41_channel->prog_len - txstate.residue; |
2959 | + cppi41_channel->transferred += transferred; |
2960 | + |
2961 | + dev_dbg(musb->controller, "DMA transfer done on hw_ep=%d bytes=%d/%d\n", |
2962 | + hw_ep->epnum, cppi41_channel->transferred, |
2963 | + cppi41_channel->total_len); |
2964 | + |
2965 | + update_rx_toggle(cppi41_channel); |
2966 | + |
2967 | + if (cppi41_channel->transferred == cppi41_channel->total_len || |
2968 | + transferred < cppi41_channel->packet_sz) |
2969 | + cppi41_channel->prog_len = 0; |
2970 | + |
2971 | + empty = musb_is_tx_fifo_empty(hw_ep); |
2972 | + if (empty) { |
2973 | + cppi41_trans_done(cppi41_channel); |
2974 | + } else { |
2975 | + struct cppi41_dma_controller *controller; |
2976 | + /* |
2977 | + * On AM335x it has been observed that the TX interrupt fires |
2978 | + * too early that means the TXFIFO is not yet empty but the DMA |
2979 | + * engine says that it is done with the transfer. We don't |
2980 | + * receive a FIFO empty interrupt so the only thing we can do is |
2981 | + * to poll for the bit. On HS it usually takes 2us, on FS around |
2982 | + * 110us - 150us depending on the transfer size. |
2983 | + * We spin on HS (no longer than than 25us and setup a timer on |
2984 | + * FS to check for the bit and complete the transfer. |
2985 | + */ |
2986 | + controller = cppi41_channel->controller; |
2987 | + |
2988 | + if (musb->g.speed == USB_SPEED_HIGH) { |
2989 | + unsigned wait = 25; |
2990 | + |
2991 | + do { |
2992 | + empty = musb_is_tx_fifo_empty(hw_ep); |
2993 | + if (empty) |
2994 | + break; |
2995 | + wait--; |
2996 | + if (!wait) |
2997 | + break; |
2998 | + udelay(1); |
2999 | + } while (1); |
3000 | + |
3001 | + empty = musb_is_tx_fifo_empty(hw_ep); |
3002 | + if (empty) { |
3003 | + cppi41_trans_done(cppi41_channel); |
3004 | + goto out; |
3005 | + } |
3006 | + } |
3007 | + list_add_tail(&cppi41_channel->tx_check, |
3008 | + &controller->early_tx_list); |
3009 | + if (!hrtimer_active(&controller->early_tx)) { |
3010 | + hrtimer_start_range_ns(&controller->early_tx, |
3011 | + ktime_set(0, 140 * NSEC_PER_USEC), |
3012 | + 40 * NSEC_PER_USEC, |
3013 | + HRTIMER_MODE_REL); |
3014 | + } |
3015 | + } |
3016 | +out: |
3017 | spin_unlock_irqrestore(&musb->lock, flags); |
3018 | } |
3019 | |
3020 | @@ -364,6 +472,8 @@ static int cppi41_is_compatible(struct dma_channel *channel, u16 maxpacket, |
3021 | WARN_ON(1); |
3022 | return 1; |
3023 | } |
3024 | + if (cppi41_channel->hw_ep->ep_in.type != USB_ENDPOINT_XFER_BULK) |
3025 | + return 0; |
3026 | if (cppi41_channel->is_tx) |
3027 | return 1; |
3028 | /* AM335x Advisory 1.0.13. No workaround for device RX mode */ |
3029 | @@ -388,6 +498,7 @@ static int cppi41_dma_channel_abort(struct dma_channel *channel) |
3030 | if (cppi41_channel->channel.status == MUSB_DMA_STATUS_FREE) |
3031 | return 0; |
3032 | |
3033 | + list_del_init(&cppi41_channel->tx_check); |
3034 | if (is_tx) { |
3035 | csr = musb_readw(epio, MUSB_TXCSR); |
3036 | csr &= ~MUSB_TXCSR_DMAENAB; |
3037 | @@ -494,6 +605,7 @@ static int cppi41_dma_controller_start(struct cppi41_dma_controller *controller) |
3038 | cppi41_channel->controller = controller; |
3039 | cppi41_channel->port_num = port; |
3040 | cppi41_channel->is_tx = is_tx; |
3041 | + INIT_LIST_HEAD(&cppi41_channel->tx_check); |
3042 | |
3043 | musb_dma = &cppi41_channel->channel; |
3044 | musb_dma->private_data = cppi41_channel; |
3045 | @@ -518,6 +630,7 @@ void dma_controller_destroy(struct dma_controller *c) |
3046 | struct cppi41_dma_controller *controller = container_of(c, |
3047 | struct cppi41_dma_controller, controller); |
3048 | |
3049 | + hrtimer_cancel(&controller->early_tx); |
3050 | cppi41_dma_controller_stop(controller); |
3051 | kfree(controller); |
3052 | } |
3053 | @@ -537,6 +650,9 @@ struct dma_controller *dma_controller_create(struct musb *musb, |
3054 | if (!controller) |
3055 | goto kzalloc_fail; |
3056 | |
3057 | + hrtimer_init(&controller->early_tx, CLOCK_MONOTONIC, HRTIMER_MODE_REL); |
3058 | + controller->early_tx.function = cppi41_recheck_tx_req; |
3059 | + INIT_LIST_HEAD(&controller->early_tx_list); |
3060 | controller->musb = musb; |
3061 | |
3062 | controller->controller.channel_alloc = cppi41_dma_channel_allocate; |
3063 | diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c |
3064 | index c3d94853b4ab..496b7e39d5be 100644 |
3065 | --- a/drivers/usb/serial/option.c |
3066 | +++ b/drivers/usb/serial/option.c |
3067 | @@ -85,6 +85,7 @@ static void option_instat_callback(struct urb *urb); |
3068 | #define HUAWEI_PRODUCT_K4505 0x1464 |
3069 | #define HUAWEI_PRODUCT_K3765 0x1465 |
3070 | #define HUAWEI_PRODUCT_K4605 0x14C6 |
3071 | +#define HUAWEI_PRODUCT_E173S6 0x1C07 |
3072 | |
3073 | #define QUANTA_VENDOR_ID 0x0408 |
3074 | #define QUANTA_PRODUCT_Q101 0xEA02 |
3075 | @@ -572,6 +573,8 @@ static const struct usb_device_id option_ids[] = { |
3076 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, |
3077 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), |
3078 | .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
3079 | + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S6, 0xff, 0xff, 0xff), |
3080 | + .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, |
3081 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff), |
3082 | .driver_info = (kernel_ulong_t) &net_intf2_blacklist }, |
3083 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) }, |
3084 | @@ -634,6 +637,10 @@ static const struct usb_device_id option_ids[] = { |
3085 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) }, |
3086 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) }, |
3087 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) }, |
3088 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x72) }, |
3089 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x73) }, |
3090 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x74) }, |
3091 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x75) }, |
3092 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) }, |
3093 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) }, |
3094 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) }, |
3095 | @@ -688,6 +695,10 @@ static const struct usb_device_id option_ids[] = { |
3096 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) }, |
3097 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) }, |
3098 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) }, |
3099 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x72) }, |
3100 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x73) }, |
3101 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x74) }, |
3102 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x75) }, |
3103 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) }, |
3104 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) }, |
3105 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, |
3106 | @@ -742,6 +753,10 @@ static const struct usb_device_id option_ids[] = { |
3107 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) }, |
3108 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) }, |
3109 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) }, |
3110 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x72) }, |
3111 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x73) }, |
3112 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x74) }, |
3113 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x75) }, |
3114 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) }, |
3115 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) }, |
3116 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) }, |
3117 | @@ -796,6 +811,10 @@ static const struct usb_device_id option_ids[] = { |
3118 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) }, |
3119 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) }, |
3120 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) }, |
3121 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x72) }, |
3122 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x73) }, |
3123 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x74) }, |
3124 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x75) }, |
3125 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) }, |
3126 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) }, |
3127 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) }, |
3128 | @@ -850,6 +869,10 @@ static const struct usb_device_id option_ids[] = { |
3129 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) }, |
3130 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) }, |
3131 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) }, |
3132 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x72) }, |
3133 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x73) }, |
3134 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x74) }, |
3135 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x75) }, |
3136 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) }, |
3137 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) }, |
3138 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) }, |
3139 | @@ -904,6 +927,10 @@ static const struct usb_device_id option_ids[] = { |
3140 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) }, |
3141 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) }, |
3142 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) }, |
3143 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x72) }, |
3144 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x73) }, |
3145 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x74) }, |
3146 | + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x75) }, |
3147 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) }, |
3148 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) }, |
3149 | { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) }, |
3150 | diff --git a/drivers/watchdog/sc1200wdt.c b/drivers/watchdog/sc1200wdt.c |
3151 | index 3fb83b0c28c2..ab6d3f56cbca 100644 |
3152 | --- a/drivers/watchdog/sc1200wdt.c |
3153 | +++ b/drivers/watchdog/sc1200wdt.c |
3154 | @@ -409,8 +409,9 @@ static int __init sc1200wdt_init(void) |
3155 | #if defined CONFIG_PNP |
3156 | /* now that the user has specified an IO port and we haven't detected |
3157 | * any devices, disable pnp support */ |
3158 | + if (isapnp) |
3159 | + pnp_unregister_driver(&scl200wdt_pnp_driver); |
3160 | isapnp = 0; |
3161 | - pnp_unregister_driver(&scl200wdt_pnp_driver); |
3162 | #endif |
3163 | |
3164 | if (!request_region(io, io_len, SC1200_MODULE_NAME)) { |
3165 | diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c |
3166 | index e15d2b0d8d3b..0890c83643e9 100644 |
3167 | --- a/fs/btrfs/acl.c |
3168 | +++ b/fs/btrfs/acl.c |
3169 | @@ -229,7 +229,7 @@ int btrfs_init_acl(struct btrfs_trans_handle *trans, |
3170 | if (ret > 0) { |
3171 | /* we need an acl */ |
3172 | ret = btrfs_set_acl(trans, inode, acl, ACL_TYPE_ACCESS); |
3173 | - } else { |
3174 | + } else if (ret < 0) { |
3175 | cache_no_acl(inode); |
3176 | } |
3177 | } else { |
3178 | diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c |
3179 | index 0552a599b28f..5eb50b5df777 100644 |
3180 | --- a/fs/btrfs/backref.c |
3181 | +++ b/fs/btrfs/backref.c |
3182 | @@ -185,6 +185,9 @@ static int __add_prelim_ref(struct list_head *head, u64 root_id, |
3183 | { |
3184 | struct __prelim_ref *ref; |
3185 | |
3186 | + if (root_id == BTRFS_DATA_RELOC_TREE_OBJECTID) |
3187 | + return 0; |
3188 | + |
3189 | ref = kmem_cache_alloc(btrfs_prelim_ref_cache, gfp_mask); |
3190 | if (!ref) |
3191 | return -ENOMEM; |
3192 | diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c |
3193 | index 61b5bcd57b7e..b544a44d696e 100644 |
3194 | --- a/fs/btrfs/ctree.c |
3195 | +++ b/fs/btrfs/ctree.c |
3196 | @@ -2758,7 +2758,7 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, |
3197 | int level; |
3198 | int lowest_unlock = 1; |
3199 | u8 lowest_level = 0; |
3200 | - int prev_cmp; |
3201 | + int prev_cmp = -1; |
3202 | |
3203 | lowest_level = p->lowest_level; |
3204 | WARN_ON(p->nodes[0] != NULL); |
3205 | @@ -2769,7 +2769,6 @@ int btrfs_search_old_slot(struct btrfs_root *root, struct btrfs_key *key, |
3206 | } |
3207 | |
3208 | again: |
3209 | - prev_cmp = -1; |
3210 | b = get_old_root(root, time_seq); |
3211 | level = btrfs_header_level(b); |
3212 | p->locks[level] = BTRFS_READ_LOCK; |
3213 | @@ -2787,6 +2786,11 @@ again: |
3214 | */ |
3215 | btrfs_unlock_up_safe(p, level + 1); |
3216 | |
3217 | + /* |
3218 | + * Since we can unwind eb's we want to do a real search every |
3219 | + * time. |
3220 | + */ |
3221 | + prev_cmp = -1; |
3222 | ret = key_search(b, key, level, &prev_cmp, &slot); |
3223 | |
3224 | if (level != 0) { |
3225 | diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c |
3226 | index 51e3afa78354..8b8eff051493 100644 |
3227 | --- a/fs/btrfs/inode.c |
3228 | +++ b/fs/btrfs/inode.c |
3229 | @@ -2367,10 +2367,23 @@ out_unlock: |
3230 | return ret; |
3231 | } |
3232 | |
3233 | +static void free_sa_defrag_extent(struct new_sa_defrag_extent *new) |
3234 | +{ |
3235 | + struct old_sa_defrag_extent *old, *tmp; |
3236 | + |
3237 | + if (!new) |
3238 | + return; |
3239 | + |
3240 | + list_for_each_entry_safe(old, tmp, &new->head, list) { |
3241 | + list_del(&old->list); |
3242 | + kfree(old); |
3243 | + } |
3244 | + kfree(new); |
3245 | +} |
3246 | + |
3247 | static void relink_file_extents(struct new_sa_defrag_extent *new) |
3248 | { |
3249 | struct btrfs_path *path; |
3250 | - struct old_sa_defrag_extent *old, *tmp; |
3251 | struct sa_defrag_extent_backref *backref; |
3252 | struct sa_defrag_extent_backref *prev = NULL; |
3253 | struct inode *inode; |
3254 | @@ -2413,16 +2426,11 @@ static void relink_file_extents(struct new_sa_defrag_extent *new) |
3255 | kfree(prev); |
3256 | |
3257 | btrfs_free_path(path); |
3258 | - |
3259 | - list_for_each_entry_safe(old, tmp, &new->head, list) { |
3260 | - list_del(&old->list); |
3261 | - kfree(old); |
3262 | - } |
3263 | out: |
3264 | + free_sa_defrag_extent(new); |
3265 | + |
3266 | atomic_dec(&root->fs_info->defrag_running); |
3267 | wake_up(&root->fs_info->transaction_wait); |
3268 | - |
3269 | - kfree(new); |
3270 | } |
3271 | |
3272 | static struct new_sa_defrag_extent * |
3273 | @@ -2432,7 +2440,7 @@ record_old_file_extents(struct inode *inode, |
3274 | struct btrfs_root *root = BTRFS_I(inode)->root; |
3275 | struct btrfs_path *path; |
3276 | struct btrfs_key key; |
3277 | - struct old_sa_defrag_extent *old, *tmp; |
3278 | + struct old_sa_defrag_extent *old; |
3279 | struct new_sa_defrag_extent *new; |
3280 | int ret; |
3281 | |
3282 | @@ -2480,7 +2488,7 @@ record_old_file_extents(struct inode *inode, |
3283 | if (slot >= btrfs_header_nritems(l)) { |
3284 | ret = btrfs_next_leaf(root, path); |
3285 | if (ret < 0) |
3286 | - goto out_free_list; |
3287 | + goto out_free_path; |
3288 | else if (ret > 0) |
3289 | break; |
3290 | continue; |
3291 | @@ -2509,7 +2517,7 @@ record_old_file_extents(struct inode *inode, |
3292 | |
3293 | old = kmalloc(sizeof(*old), GFP_NOFS); |
3294 | if (!old) |
3295 | - goto out_free_list; |
3296 | + goto out_free_path; |
3297 | |
3298 | offset = max(new->file_pos, key.offset); |
3299 | end = min(new->file_pos + new->len, key.offset + num_bytes); |
3300 | @@ -2531,15 +2539,10 @@ next: |
3301 | |
3302 | return new; |
3303 | |
3304 | -out_free_list: |
3305 | - list_for_each_entry_safe(old, tmp, &new->head, list) { |
3306 | - list_del(&old->list); |
3307 | - kfree(old); |
3308 | - } |
3309 | out_free_path: |
3310 | btrfs_free_path(path); |
3311 | out_kfree: |
3312 | - kfree(new); |
3313 | + free_sa_defrag_extent(new); |
3314 | return NULL; |
3315 | } |
3316 | |
3317 | @@ -2710,8 +2713,14 @@ out: |
3318 | btrfs_remove_ordered_extent(inode, ordered_extent); |
3319 | |
3320 | /* for snapshot-aware defrag */ |
3321 | - if (new) |
3322 | - relink_file_extents(new); |
3323 | + if (new) { |
3324 | + if (ret) { |
3325 | + free_sa_defrag_extent(new); |
3326 | + atomic_dec(&root->fs_info->defrag_running); |
3327 | + } else { |
3328 | + relink_file_extents(new); |
3329 | + } |
3330 | + } |
3331 | |
3332 | /* once for us */ |
3333 | btrfs_put_ordered_extent(ordered_extent); |
3334 | diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c |
3335 | index 9d46f60cb943..8747feb77ec9 100644 |
3336 | --- a/fs/btrfs/ioctl.c |
3337 | +++ b/fs/btrfs/ioctl.c |
3338 | @@ -2130,7 +2130,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, |
3339 | |
3340 | err = mutex_lock_killable_nested(&dir->i_mutex, I_MUTEX_PARENT); |
3341 | if (err == -EINTR) |
3342 | - goto out; |
3343 | + goto out_drop_write; |
3344 | dentry = lookup_one_len(vol_args->name, parent, namelen); |
3345 | if (IS_ERR(dentry)) { |
3346 | err = PTR_ERR(dentry); |
3347 | @@ -2293,6 +2293,7 @@ out_dput: |
3348 | dput(dentry); |
3349 | out_unlock_dir: |
3350 | mutex_unlock(&dir->i_mutex); |
3351 | +out_drop_write: |
3352 | mnt_drop_write_file(file); |
3353 | out: |
3354 | kfree(vol_args); |
3355 | diff --git a/fs/btrfs/ordered-data.c b/fs/btrfs/ordered-data.c |
3356 | index c702cb62f78a..bda1cd84ee5f 100644 |
3357 | --- a/fs/btrfs/ordered-data.c |
3358 | +++ b/fs/btrfs/ordered-data.c |
3359 | @@ -537,7 +537,9 @@ void btrfs_remove_ordered_extent(struct inode *inode, |
3360 | */ |
3361 | if (RB_EMPTY_ROOT(&tree->tree) && |
3362 | !mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) { |
3363 | + spin_lock(&root->fs_info->ordered_root_lock); |
3364 | list_del_init(&BTRFS_I(inode)->ordered_operations); |
3365 | + spin_unlock(&root->fs_info->ordered_root_lock); |
3366 | } |
3367 | |
3368 | if (!root->nr_ordered_extents) { |
3369 | diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c |
3370 | index e46e0ed74925..741c839fa46a 100644 |
3371 | --- a/fs/btrfs/send.c |
3372 | +++ b/fs/btrfs/send.c |
3373 | @@ -121,7 +121,6 @@ struct send_ctx { |
3374 | struct list_head name_cache_list; |
3375 | int name_cache_size; |
3376 | |
3377 | - struct file *cur_inode_filp; |
3378 | char *read_buf; |
3379 | }; |
3380 | |
3381 | @@ -2120,77 +2119,6 @@ out: |
3382 | } |
3383 | |
3384 | /* |
3385 | - * Called for regular files when sending extents data. Opens a struct file |
3386 | - * to read from the file. |
3387 | - */ |
3388 | -static int open_cur_inode_file(struct send_ctx *sctx) |
3389 | -{ |
3390 | - int ret = 0; |
3391 | - struct btrfs_key key; |
3392 | - struct path path; |
3393 | - struct inode *inode; |
3394 | - struct dentry *dentry; |
3395 | - struct file *filp; |
3396 | - int new = 0; |
3397 | - |
3398 | - if (sctx->cur_inode_filp) |
3399 | - goto out; |
3400 | - |
3401 | - key.objectid = sctx->cur_ino; |
3402 | - key.type = BTRFS_INODE_ITEM_KEY; |
3403 | - key.offset = 0; |
3404 | - |
3405 | - inode = btrfs_iget(sctx->send_root->fs_info->sb, &key, sctx->send_root, |
3406 | - &new); |
3407 | - if (IS_ERR(inode)) { |
3408 | - ret = PTR_ERR(inode); |
3409 | - goto out; |
3410 | - } |
3411 | - |
3412 | - dentry = d_obtain_alias(inode); |
3413 | - inode = NULL; |
3414 | - if (IS_ERR(dentry)) { |
3415 | - ret = PTR_ERR(dentry); |
3416 | - goto out; |
3417 | - } |
3418 | - |
3419 | - path.mnt = sctx->mnt; |
3420 | - path.dentry = dentry; |
3421 | - filp = dentry_open(&path, O_RDONLY | O_LARGEFILE, current_cred()); |
3422 | - dput(dentry); |
3423 | - dentry = NULL; |
3424 | - if (IS_ERR(filp)) { |
3425 | - ret = PTR_ERR(filp); |
3426 | - goto out; |
3427 | - } |
3428 | - sctx->cur_inode_filp = filp; |
3429 | - |
3430 | -out: |
3431 | - /* |
3432 | - * no xxxput required here as every vfs op |
3433 | - * does it by itself on failure |
3434 | - */ |
3435 | - return ret; |
3436 | -} |
3437 | - |
3438 | -/* |
3439 | - * Closes the struct file that was created in open_cur_inode_file |
3440 | - */ |
3441 | -static int close_cur_inode_file(struct send_ctx *sctx) |
3442 | -{ |
3443 | - int ret = 0; |
3444 | - |
3445 | - if (!sctx->cur_inode_filp) |
3446 | - goto out; |
3447 | - |
3448 | - ret = filp_close(sctx->cur_inode_filp, NULL); |
3449 | - sctx->cur_inode_filp = NULL; |
3450 | - |
3451 | -out: |
3452 | - return ret; |
3453 | -} |
3454 | - |
3455 | -/* |
3456 | * Sends a BTRFS_SEND_C_SUBVOL command/item to userspace |
3457 | */ |
3458 | static int send_subvol_begin(struct send_ctx *sctx) |
3459 | @@ -3622,6 +3550,72 @@ out: |
3460 | return ret; |
3461 | } |
3462 | |
3463 | +static ssize_t fill_read_buf(struct send_ctx *sctx, u64 offset, u32 len) |
3464 | +{ |
3465 | + struct btrfs_root *root = sctx->send_root; |
3466 | + struct btrfs_fs_info *fs_info = root->fs_info; |
3467 | + struct inode *inode; |
3468 | + struct page *page; |
3469 | + char *addr; |
3470 | + struct btrfs_key key; |
3471 | + pgoff_t index = offset >> PAGE_CACHE_SHIFT; |
3472 | + pgoff_t last_index; |
3473 | + unsigned pg_offset = offset & ~PAGE_CACHE_MASK; |
3474 | + ssize_t ret = 0; |
3475 | + |
3476 | + key.objectid = sctx->cur_ino; |
3477 | + key.type = BTRFS_INODE_ITEM_KEY; |
3478 | + key.offset = 0; |
3479 | + |
3480 | + inode = btrfs_iget(fs_info->sb, &key, root, NULL); |
3481 | + if (IS_ERR(inode)) |
3482 | + return PTR_ERR(inode); |
3483 | + |
3484 | + if (offset + len > i_size_read(inode)) { |
3485 | + if (offset > i_size_read(inode)) |
3486 | + len = 0; |
3487 | + else |
3488 | + len = offset - i_size_read(inode); |
3489 | + } |
3490 | + if (len == 0) |
3491 | + goto out; |
3492 | + |
3493 | + last_index = (offset + len - 1) >> PAGE_CACHE_SHIFT; |
3494 | + while (index <= last_index) { |
3495 | + unsigned cur_len = min_t(unsigned, len, |
3496 | + PAGE_CACHE_SIZE - pg_offset); |
3497 | + page = find_or_create_page(inode->i_mapping, index, GFP_NOFS); |
3498 | + if (!page) { |
3499 | + ret = -ENOMEM; |
3500 | + break; |
3501 | + } |
3502 | + |
3503 | + if (!PageUptodate(page)) { |
3504 | + btrfs_readpage(NULL, page); |
3505 | + lock_page(page); |
3506 | + if (!PageUptodate(page)) { |
3507 | + unlock_page(page); |
3508 | + page_cache_release(page); |
3509 | + ret = -EIO; |
3510 | + break; |
3511 | + } |
3512 | + } |
3513 | + |
3514 | + addr = kmap(page); |
3515 | + memcpy(sctx->read_buf + ret, addr + pg_offset, cur_len); |
3516 | + kunmap(page); |
3517 | + unlock_page(page); |
3518 | + page_cache_release(page); |
3519 | + index++; |
3520 | + pg_offset = 0; |
3521 | + len -= cur_len; |
3522 | + ret += cur_len; |
3523 | + } |
3524 | +out: |
3525 | + iput(inode); |
3526 | + return ret; |
3527 | +} |
3528 | + |
3529 | /* |
3530 | * Read some bytes from the current inode/file and send a write command to |
3531 | * user space. |
3532 | @@ -3630,35 +3624,20 @@ static int send_write(struct send_ctx *sctx, u64 offset, u32 len) |
3533 | { |
3534 | int ret = 0; |
3535 | struct fs_path *p; |
3536 | - loff_t pos = offset; |
3537 | - int num_read = 0; |
3538 | - mm_segment_t old_fs; |
3539 | + ssize_t num_read = 0; |
3540 | |
3541 | p = fs_path_alloc(); |
3542 | if (!p) |
3543 | return -ENOMEM; |
3544 | |
3545 | - /* |
3546 | - * vfs normally only accepts user space buffers for security reasons. |
3547 | - * we only read from the file and also only provide the read_buf buffer |
3548 | - * to vfs. As this buffer does not come from a user space call, it's |
3549 | - * ok to temporary allow kernel space buffers. |
3550 | - */ |
3551 | - old_fs = get_fs(); |
3552 | - set_fs(KERNEL_DS); |
3553 | - |
3554 | verbose_printk("btrfs: send_write offset=%llu, len=%d\n", offset, len); |
3555 | |
3556 | - ret = open_cur_inode_file(sctx); |
3557 | - if (ret < 0) |
3558 | - goto out; |
3559 | - |
3560 | - ret = vfs_read(sctx->cur_inode_filp, sctx->read_buf, len, &pos); |
3561 | - if (ret < 0) |
3562 | - goto out; |
3563 | - num_read = ret; |
3564 | - if (!num_read) |
3565 | + num_read = fill_read_buf(sctx, offset, len); |
3566 | + if (num_read <= 0) { |
3567 | + if (num_read < 0) |
3568 | + ret = num_read; |
3569 | goto out; |
3570 | + } |
3571 | |
3572 | ret = begin_cmd(sctx, BTRFS_SEND_C_WRITE); |
3573 | if (ret < 0) |
3574 | @@ -3677,7 +3656,6 @@ verbose_printk("btrfs: send_write offset=%llu, len=%d\n", offset, len); |
3575 | tlv_put_failure: |
3576 | out: |
3577 | fs_path_free(p); |
3578 | - set_fs(old_fs); |
3579 | if (ret < 0) |
3580 | return ret; |
3581 | return num_read; |
3582 | @@ -4222,10 +4200,6 @@ static int changed_inode(struct send_ctx *sctx, |
3583 | u64 left_gen = 0; |
3584 | u64 right_gen = 0; |
3585 | |
3586 | - ret = close_cur_inode_file(sctx); |
3587 | - if (ret < 0) |
3588 | - goto out; |
3589 | - |
3590 | sctx->cur_ino = key->objectid; |
3591 | sctx->cur_inode_new_gen = 0; |
3592 | |
3593 | @@ -4686,11 +4660,6 @@ static int send_subvol(struct send_ctx *sctx) |
3594 | } |
3595 | |
3596 | out: |
3597 | - if (!ret) |
3598 | - ret = close_cur_inode_file(sctx); |
3599 | - else |
3600 | - close_cur_inode_file(sctx); |
3601 | - |
3602 | free_recorded_refs(sctx); |
3603 | return ret; |
3604 | } |
3605 | @@ -4756,8 +4725,8 @@ long btrfs_ioctl_send(struct file *mnt_file, void __user *arg_) |
3606 | } |
3607 | |
3608 | if (!access_ok(VERIFY_READ, arg->clone_sources, |
3609 | - sizeof(*arg->clone_sources * |
3610 | - arg->clone_sources_count))) { |
3611 | + sizeof(*arg->clone_sources) * |
3612 | + arg->clone_sources_count)) { |
3613 | ret = -EFAULT; |
3614 | goto out; |
3615 | } |
3616 | diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c |
3617 | index 8c81bdc1ef9b..b791cfb9a050 100644 |
3618 | --- a/fs/btrfs/transaction.c |
3619 | +++ b/fs/btrfs/transaction.c |
3620 | @@ -1453,7 +1453,7 @@ static void do_async_commit(struct work_struct *work) |
3621 | * We've got freeze protection passed with the transaction. |
3622 | * Tell lockdep about it. |
3623 | */ |
3624 | - if (ac->newtrans->type < TRANS_JOIN_NOLOCK) |
3625 | + if (ac->newtrans->type & __TRANS_FREEZABLE) |
3626 | rwsem_acquire_read( |
3627 | &ac->root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], |
3628 | 0, 1, _THIS_IP_); |
3629 | @@ -1494,7 +1494,7 @@ int btrfs_commit_transaction_async(struct btrfs_trans_handle *trans, |
3630 | * Tell lockdep we've released the freeze rwsem, since the |
3631 | * async commit thread will be the one to unlock it. |
3632 | */ |
3633 | - if (trans->type < TRANS_JOIN_NOLOCK) |
3634 | + if (ac->newtrans->type & __TRANS_FREEZABLE) |
3635 | rwsem_release( |
3636 | &root->fs_info->sb->s_writers.lock_map[SB_FREEZE_FS-1], |
3637 | 1, _THIS_IP_); |
3638 | @@ -1552,6 +1552,8 @@ static void cleanup_transaction(struct btrfs_trans_handle *trans, |
3639 | root->fs_info->running_transaction = NULL; |
3640 | spin_unlock(&root->fs_info->trans_lock); |
3641 | |
3642 | + if (trans->type & __TRANS_FREEZABLE) |
3643 | + sb_end_intwrite(root->fs_info->sb); |
3644 | put_transaction(cur_trans); |
3645 | put_transaction(cur_trans); |
3646 | |
3647 | diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c |
3648 | index 79f057c0619a..e14e1f7748e5 100644 |
3649 | --- a/fs/btrfs/tree-log.c |
3650 | +++ b/fs/btrfs/tree-log.c |
3651 | @@ -3375,7 +3375,7 @@ static int log_one_extent(struct btrfs_trans_handle *trans, |
3652 | btrfs_set_token_file_extent_type(leaf, fi, |
3653 | BTRFS_FILE_EXTENT_REG, |
3654 | &token); |
3655 | - if (em->block_start == 0) |
3656 | + if (em->block_start == EXTENT_MAP_HOLE) |
3657 | skip_csum = true; |
3658 | } |
3659 | |
3660 | diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c |
3661 | index 043b215769c2..b691f375d837 100644 |
3662 | --- a/fs/btrfs/volumes.c |
3663 | +++ b/fs/btrfs/volumes.c |
3664 | @@ -4488,6 +4488,7 @@ int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len) |
3665 | btrfs_crit(fs_info, "Invalid mapping for %Lu-%Lu, got " |
3666 | "%Lu-%Lu\n", logical, logical+len, em->start, |
3667 | em->start + em->len); |
3668 | + free_extent_map(em); |
3669 | return 1; |
3670 | } |
3671 | |
3672 | @@ -4668,6 +4669,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, |
3673 | btrfs_crit(fs_info, "found a bad mapping, wanted %Lu, " |
3674 | "found %Lu-%Lu\n", logical, em->start, |
3675 | em->start + em->len); |
3676 | + free_extent_map(em); |
3677 | return -EINVAL; |
3678 | } |
3679 | |
3680 | diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c |
3681 | index a235f0016889..c43fe9b39ff2 100644 |
3682 | --- a/fs/exportfs/expfs.c |
3683 | +++ b/fs/exportfs/expfs.c |
3684 | @@ -215,7 +215,7 @@ struct getdents_callback { |
3685 | struct dir_context ctx; |
3686 | char *name; /* name that was found. It already points to a |
3687 | buffer NAME_MAX+1 is size */ |
3688 | - unsigned long ino; /* the inum we are looking for */ |
3689 | + u64 ino; /* the inum we are looking for */ |
3690 | int found; /* inode matched? */ |
3691 | int sequence; /* sequence counter */ |
3692 | }; |
3693 | @@ -255,10 +255,14 @@ static int get_name(const struct path *path, char *name, struct dentry *child) |
3694 | struct inode *dir = path->dentry->d_inode; |
3695 | int error; |
3696 | struct file *file; |
3697 | + struct kstat stat; |
3698 | + struct path child_path = { |
3699 | + .mnt = path->mnt, |
3700 | + .dentry = child, |
3701 | + }; |
3702 | struct getdents_callback buffer = { |
3703 | .ctx.actor = filldir_one, |
3704 | .name = name, |
3705 | - .ino = child->d_inode->i_ino |
3706 | }; |
3707 | |
3708 | error = -ENOTDIR; |
3709 | @@ -268,6 +272,16 @@ static int get_name(const struct path *path, char *name, struct dentry *child) |
3710 | if (!dir->i_fop) |
3711 | goto out; |
3712 | /* |
3713 | + * inode->i_ino is unsigned long, kstat->ino is u64, so the |
3714 | + * former would be insufficient on 32-bit hosts when the |
3715 | + * filesystem supports 64-bit inode numbers. So we need to |
3716 | + * actually call ->getattr, not just read i_ino: |
3717 | + */ |
3718 | + error = vfs_getattr_nosec(&child_path, &stat); |
3719 | + if (error) |
3720 | + return error; |
3721 | + buffer.ino = stat.ino; |
3722 | + /* |
3723 | * Open the directory ... |
3724 | */ |
3725 | file = dentry_open(path, O_RDONLY, cred); |
3726 | diff --git a/fs/nfs/blocklayout/extents.c b/fs/nfs/blocklayout/extents.c |
3727 | index 9c3e117c3ed1..4d0161442565 100644 |
3728 | --- a/fs/nfs/blocklayout/extents.c |
3729 | +++ b/fs/nfs/blocklayout/extents.c |
3730 | @@ -44,7 +44,7 @@ |
3731 | static inline sector_t normalize(sector_t s, int base) |
3732 | { |
3733 | sector_t tmp = s; /* Since do_div modifies its argument */ |
3734 | - return s - do_div(tmp, base); |
3735 | + return s - sector_div(tmp, base); |
3736 | } |
3737 | |
3738 | static inline sector_t normalize_up(sector_t s, int base) |
3739 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
3740 | index 9be8021c70d8..dacb2979e8ac 100644 |
3741 | --- a/fs/nfs/nfs4proc.c |
3742 | +++ b/fs/nfs/nfs4proc.c |
3743 | @@ -4752,8 +4752,7 @@ nfs4_async_handle_error(struct rpc_task *task, const struct nfs_server *server, |
3744 | dprintk("%s ERROR %d, Reset session\n", __func__, |
3745 | task->tk_status); |
3746 | nfs4_schedule_session_recovery(clp->cl_session, task->tk_status); |
3747 | - task->tk_status = 0; |
3748 | - return -EAGAIN; |
3749 | + goto wait_on_recovery; |
3750 | #endif /* CONFIG_NFS_V4_1 */ |
3751 | case -NFS4ERR_DELAY: |
3752 | nfs_inc_server_stats(server, NFSIOS_DELAY); |
3753 | diff --git a/fs/nfsd/nfscache.c b/fs/nfsd/nfscache.c |
3754 | index 9186c7ce0b14..b6af150c96b8 100644 |
3755 | --- a/fs/nfsd/nfscache.c |
3756 | +++ b/fs/nfsd/nfscache.c |
3757 | @@ -132,6 +132,13 @@ nfsd_reply_cache_alloc(void) |
3758 | } |
3759 | |
3760 | static void |
3761 | +nfsd_reply_cache_unhash(struct svc_cacherep *rp) |
3762 | +{ |
3763 | + hlist_del_init(&rp->c_hash); |
3764 | + list_del_init(&rp->c_lru); |
3765 | +} |
3766 | + |
3767 | +static void |
3768 | nfsd_reply_cache_free_locked(struct svc_cacherep *rp) |
3769 | { |
3770 | if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) { |
3771 | @@ -417,7 +424,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp) |
3772 | rp = list_first_entry(&lru_head, struct svc_cacherep, c_lru); |
3773 | if (nfsd_cache_entry_expired(rp) || |
3774 | num_drc_entries >= max_drc_entries) { |
3775 | - lru_put_end(rp); |
3776 | + nfsd_reply_cache_unhash(rp); |
3777 | prune_cache_entries(); |
3778 | goto search_cache; |
3779 | } |
3780 | diff --git a/fs/stat.c b/fs/stat.c |
3781 | index d0ea7ef75e26..ae0c3cef9927 100644 |
3782 | --- a/fs/stat.c |
3783 | +++ b/fs/stat.c |
3784 | @@ -37,14 +37,21 @@ void generic_fillattr(struct inode *inode, struct kstat *stat) |
3785 | |
3786 | EXPORT_SYMBOL(generic_fillattr); |
3787 | |
3788 | -int vfs_getattr(struct path *path, struct kstat *stat) |
3789 | +/** |
3790 | + * vfs_getattr_nosec - getattr without security checks |
3791 | + * @path: file to get attributes from |
3792 | + * @stat: structure to return attributes in |
3793 | + * |
3794 | + * Get attributes without calling security_inode_getattr. |
3795 | + * |
3796 | + * Currently the only caller other than vfs_getattr is internal to the |
3797 | + * filehandle lookup code, which uses only the inode number and returns |
3798 | + * no attributes to any user. Any other code probably wants |
3799 | + * vfs_getattr. |
3800 | + */ |
3801 | +int vfs_getattr_nosec(struct path *path, struct kstat *stat) |
3802 | { |
3803 | struct inode *inode = path->dentry->d_inode; |
3804 | - int retval; |
3805 | - |
3806 | - retval = security_inode_getattr(path->mnt, path->dentry); |
3807 | - if (retval) |
3808 | - return retval; |
3809 | |
3810 | if (inode->i_op->getattr) |
3811 | return inode->i_op->getattr(path->mnt, path->dentry, stat); |
3812 | @@ -53,6 +60,18 @@ int vfs_getattr(struct path *path, struct kstat *stat) |
3813 | return 0; |
3814 | } |
3815 | |
3816 | +EXPORT_SYMBOL(vfs_getattr_nosec); |
3817 | + |
3818 | +int vfs_getattr(struct path *path, struct kstat *stat) |
3819 | +{ |
3820 | + int retval; |
3821 | + |
3822 | + retval = security_inode_getattr(path->mnt, path->dentry); |
3823 | + if (retval) |
3824 | + return retval; |
3825 | + return vfs_getattr_nosec(path, stat); |
3826 | +} |
3827 | + |
3828 | EXPORT_SYMBOL(vfs_getattr); |
3829 | |
3830 | int vfs_fstat(unsigned int fd, struct kstat *stat) |
3831 | diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c |
3832 | index e64ee5288b86..c888040a1e93 100644 |
3833 | --- a/fs/xfs/xfs_fsops.c |
3834 | +++ b/fs/xfs/xfs_fsops.c |
3835 | @@ -217,6 +217,8 @@ xfs_growfs_data_private( |
3836 | */ |
3837 | nfree = 0; |
3838 | for (agno = nagcount - 1; agno >= oagcount; agno--, new -= agsize) { |
3839 | + __be32 *agfl_bno; |
3840 | + |
3841 | /* |
3842 | * AG freespace header block |
3843 | */ |
3844 | @@ -276,8 +278,10 @@ xfs_growfs_data_private( |
3845 | agfl->agfl_seqno = cpu_to_be32(agno); |
3846 | uuid_copy(&agfl->agfl_uuid, &mp->m_sb.sb_uuid); |
3847 | } |
3848 | + |
3849 | + agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, bp); |
3850 | for (bucket = 0; bucket < XFS_AGFL_SIZE(mp); bucket++) |
3851 | - agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); |
3852 | + agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); |
3853 | |
3854 | error = xfs_bwrite(bp); |
3855 | xfs_buf_relse(bp); |
3856 | diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c |
3857 | index 2e1e6c33841d..8c8ef246c6b4 100644 |
3858 | --- a/fs/xfs/xfs_ioctl.c |
3859 | +++ b/fs/xfs/xfs_ioctl.c |
3860 | @@ -443,7 +443,8 @@ xfs_attrlist_by_handle( |
3861 | return -XFS_ERROR(EPERM); |
3862 | if (copy_from_user(&al_hreq, arg, sizeof(xfs_fsop_attrlist_handlereq_t))) |
3863 | return -XFS_ERROR(EFAULT); |
3864 | - if (al_hreq.buflen > XATTR_LIST_MAX) |
3865 | + if (al_hreq.buflen < sizeof(struct attrlist) || |
3866 | + al_hreq.buflen > XATTR_LIST_MAX) |
3867 | return -XFS_ERROR(EINVAL); |
3868 | |
3869 | /* |
3870 | diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c |
3871 | index f671f7e472ac..53365c6db2c2 100644 |
3872 | --- a/fs/xfs/xfs_ioctl32.c |
3873 | +++ b/fs/xfs/xfs_ioctl32.c |
3874 | @@ -357,7 +357,8 @@ xfs_compat_attrlist_by_handle( |
3875 | if (copy_from_user(&al_hreq, arg, |
3876 | sizeof(compat_xfs_fsop_attrlist_handlereq_t))) |
3877 | return -XFS_ERROR(EFAULT); |
3878 | - if (al_hreq.buflen > XATTR_LIST_MAX) |
3879 | + if (al_hreq.buflen < sizeof(struct attrlist) || |
3880 | + al_hreq.buflen > XATTR_LIST_MAX) |
3881 | return -XFS_ERROR(EINVAL); |
3882 | |
3883 | /* |
3884 | diff --git a/include/linux/compiler-intel.h b/include/linux/compiler-intel.h |
3885 | index 973ce10c40b6..dc1bd3dcf11f 100644 |
3886 | --- a/include/linux/compiler-intel.h |
3887 | +++ b/include/linux/compiler-intel.h |
3888 | @@ -28,8 +28,6 @@ |
3889 | |
3890 | #endif |
3891 | |
3892 | -#define uninitialized_var(x) x |
3893 | - |
3894 | #ifndef __HAVE_BUILTIN_BSWAP16__ |
3895 | /* icc has this, but it's called _bswap16 */ |
3896 | #define __HAVE_BUILTIN_BSWAP16__ |
3897 | diff --git a/include/linux/fs.h b/include/linux/fs.h |
3898 | index fefa7b00ba42..164d2a91667f 100644 |
3899 | --- a/include/linux/fs.h |
3900 | +++ b/include/linux/fs.h |
3901 | @@ -2504,6 +2504,7 @@ extern int page_symlink(struct inode *inode, const char *symname, int len); |
3902 | extern const struct inode_operations page_symlink_inode_operations; |
3903 | extern int generic_readlink(struct dentry *, char __user *, int); |
3904 | extern void generic_fillattr(struct inode *, struct kstat *); |
3905 | +int vfs_getattr_nosec(struct path *path, struct kstat *stat); |
3906 | extern int vfs_getattr(struct path *, struct kstat *); |
3907 | void __inode_add_bytes(struct inode *inode, loff_t bytes); |
3908 | void inode_add_bytes(struct inode *inode, loff_t bytes); |
3909 | diff --git a/include/linux/kexec.h b/include/linux/kexec.h |
3910 | index d78d28a733b1..5fd33dc1fe3a 100644 |
3911 | --- a/include/linux/kexec.h |
3912 | +++ b/include/linux/kexec.h |
3913 | @@ -198,6 +198,9 @@ extern u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; |
3914 | extern size_t vmcoreinfo_size; |
3915 | extern size_t vmcoreinfo_max_size; |
3916 | |
3917 | +/* flag to track if kexec reboot is in progress */ |
3918 | +extern bool kexec_in_progress; |
3919 | + |
3920 | int __init parse_crashkernel(char *cmdline, unsigned long long system_ram, |
3921 | unsigned long long *crash_size, unsigned long long *crash_base); |
3922 | int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, |
3923 | diff --git a/include/linux/usb.h b/include/linux/usb.h |
3924 | index 39cfa0aca91f..6b02370256e4 100644 |
3925 | --- a/include/linux/usb.h |
3926 | +++ b/include/linux/usb.h |
3927 | @@ -1262,6 +1262,8 @@ typedef void (*usb_complete_t)(struct urb *); |
3928 | * @sg: scatter gather buffer list, the buffer size of each element in |
3929 | * the list (except the last) must be divisible by the endpoint's |
3930 | * max packet size if no_sg_constraint isn't set in 'struct usb_bus' |
3931 | + * (FIXME: scatter-gather under xHCI is broken for periodic transfers. |
3932 | + * Do not use urb->sg for interrupt endpoints for now, only bulk.) |
3933 | * @num_mapped_sgs: (internal) number of mapped sg entries |
3934 | * @num_sgs: number of entries in the sg list |
3935 | * @transfer_buffer_length: How big is transfer_buffer. The transfer may |
3936 | diff --git a/include/sound/memalloc.h b/include/sound/memalloc.h |
3937 | index cf15b8213df7..54aff2d73150 100644 |
3938 | --- a/include/sound/memalloc.h |
3939 | +++ b/include/sound/memalloc.h |
3940 | @@ -103,7 +103,7 @@ static inline dma_addr_t snd_sgbuf_get_addr(struct snd_dma_buffer *dmab, |
3941 | { |
3942 | struct snd_sg_buf *sgbuf = dmab->private_data; |
3943 | dma_addr_t addr = sgbuf->table[offset >> PAGE_SHIFT].addr; |
3944 | - addr &= PAGE_MASK; |
3945 | + addr &= ~((dma_addr_t)PAGE_SIZE - 1); |
3946 | return addr + offset % PAGE_SIZE; |
3947 | } |
3948 | |
3949 | diff --git a/include/uapi/sound/compress_offload.h b/include/uapi/sound/compress_offload.h |
3950 | index d630163b9a2e..5759810e1c1b 100644 |
3951 | --- a/include/uapi/sound/compress_offload.h |
3952 | +++ b/include/uapi/sound/compress_offload.h |
3953 | @@ -30,7 +30,7 @@ |
3954 | #include <sound/compress_params.h> |
3955 | |
3956 | |
3957 | -#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 1) |
3958 | +#define SNDRV_COMPRESS_VERSION SNDRV_PROTOCOL_VERSION(0, 1, 2) |
3959 | /** |
3960 | * struct snd_compressed_buffer: compressed buffer |
3961 | * @fragment_size: size of buffer fragment in bytes |
3962 | @@ -67,8 +67,8 @@ struct snd_compr_params { |
3963 | struct snd_compr_tstamp { |
3964 | __u32 byte_offset; |
3965 | __u32 copied_total; |
3966 | - snd_pcm_uframes_t pcm_frames; |
3967 | - snd_pcm_uframes_t pcm_io_frames; |
3968 | + __u32 pcm_frames; |
3969 | + __u32 pcm_io_frames; |
3970 | __u32 sampling_rate; |
3971 | }; |
3972 | |
3973 | diff --git a/kernel/futex.c b/kernel/futex.c |
3974 | index c3a1a55a5214..221a58fc62f7 100644 |
3975 | --- a/kernel/futex.c |
3976 | +++ b/kernel/futex.c |
3977 | @@ -288,7 +288,7 @@ again: |
3978 | put_page(page); |
3979 | /* serialize against __split_huge_page_splitting() */ |
3980 | local_irq_disable(); |
3981 | - if (likely(__get_user_pages_fast(address, 1, 1, &page) == 1)) { |
3982 | + if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) { |
3983 | page_head = compound_head(page); |
3984 | /* |
3985 | * page_head is valid pointer but we must pin |
3986 | diff --git a/kernel/kexec.c b/kernel/kexec.c |
3987 | index 2a74f307c5ec..ecd783dda9ae 100644 |
3988 | --- a/kernel/kexec.c |
3989 | +++ b/kernel/kexec.c |
3990 | @@ -47,6 +47,9 @@ u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4]; |
3991 | size_t vmcoreinfo_size; |
3992 | size_t vmcoreinfo_max_size = sizeof(vmcoreinfo_data); |
3993 | |
3994 | +/* Flag to indicate we are going to kexec a new kernel */ |
3995 | +bool kexec_in_progress = false; |
3996 | + |
3997 | /* Location of the reserved area for the crash kernel */ |
3998 | struct resource crashk_res = { |
3999 | .name = "Crash kernel", |
4000 | @@ -1675,6 +1678,7 @@ int kernel_kexec(void) |
4001 | } else |
4002 | #endif |
4003 | { |
4004 | + kexec_in_progress = true; |
4005 | kernel_restart_prepare(NULL); |
4006 | printk(KERN_EMERG "Starting new kernel\n"); |
4007 | machine_shutdown(); |
4008 | diff --git a/kernel/sched/debug.c b/kernel/sched/debug.c |
4009 | index 196559994f7c..fd9ca1de7559 100644 |
4010 | --- a/kernel/sched/debug.c |
4011 | +++ b/kernel/sched/debug.c |
4012 | @@ -225,6 +225,14 @@ void print_cfs_rq(struct seq_file *m, int cpu, struct cfs_rq *cfs_rq) |
4013 | atomic_read(&cfs_rq->tg->runnable_avg)); |
4014 | #endif |
4015 | #endif |
4016 | +#ifdef CONFIG_CFS_BANDWIDTH |
4017 | + SEQ_printf(m, " .%-30s: %d\n", "tg->cfs_bandwidth.timer_active", |
4018 | + cfs_rq->tg->cfs_bandwidth.timer_active); |
4019 | + SEQ_printf(m, " .%-30s: %d\n", "throttled", |
4020 | + cfs_rq->throttled); |
4021 | + SEQ_printf(m, " .%-30s: %d\n", "throttle_count", |
4022 | + cfs_rq->throttle_count); |
4023 | +#endif |
4024 | |
4025 | #ifdef CONFIG_FAIR_GROUP_SCHED |
4026 | print_cfs_group_stats(m, cpu, cfs_rq->tg); |
4027 | diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c |
4028 | index 7c70201fbc61..513fc2fd5109 100644 |
4029 | --- a/kernel/sched/fair.c |
4030 | +++ b/kernel/sched/fair.c |
4031 | @@ -2335,6 +2335,8 @@ static void throttle_cfs_rq(struct cfs_rq *cfs_rq) |
4032 | cfs_rq->throttled_clock = rq_clock(rq); |
4033 | raw_spin_lock(&cfs_b->lock); |
4034 | list_add_tail_rcu(&cfs_rq->throttled_list, &cfs_b->throttled_cfs_rq); |
4035 | + if (!cfs_b->timer_active) |
4036 | + __start_cfs_bandwidth(cfs_b); |
4037 | raw_spin_unlock(&cfs_b->lock); |
4038 | } |
4039 | |
4040 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c |
4041 | index 13b9d0f221b8..36cc2d0570ab 100644 |
4042 | --- a/mm/memcontrol.c |
4043 | +++ b/mm/memcontrol.c |
4044 | @@ -2675,7 +2675,10 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm, |
4045 | goto bypass; |
4046 | |
4047 | if (unlikely(task_in_memcg_oom(current))) |
4048 | - goto bypass; |
4049 | + goto nomem; |
4050 | + |
4051 | + if (gfp_mask & __GFP_NOFAIL) |
4052 | + oom = false; |
4053 | |
4054 | /* |
4055 | * We always charge the cgroup the mm_struct belongs to. |
4056 | @@ -6338,6 +6341,42 @@ static void mem_cgroup_css_offline(struct cgroup_subsys_state *css) |
4057 | static void mem_cgroup_css_free(struct cgroup_subsys_state *css) |
4058 | { |
4059 | struct mem_cgroup *memcg = mem_cgroup_from_css(css); |
4060 | + /* |
4061 | + * XXX: css_offline() would be where we should reparent all |
4062 | + * memory to prepare the cgroup for destruction. However, |
4063 | + * memcg does not do css_tryget() and res_counter charging |
4064 | + * under the same RCU lock region, which means that charging |
4065 | + * could race with offlining. Offlining only happens to |
4066 | + * cgroups with no tasks in them but charges can show up |
4067 | + * without any tasks from the swapin path when the target |
4068 | + * memcg is looked up from the swapout record and not from the |
4069 | + * current task as it usually is. A race like this can leak |
4070 | + * charges and put pages with stale cgroup pointers into |
4071 | + * circulation: |
4072 | + * |
4073 | + * #0 #1 |
4074 | + * lookup_swap_cgroup_id() |
4075 | + * rcu_read_lock() |
4076 | + * mem_cgroup_lookup() |
4077 | + * css_tryget() |
4078 | + * rcu_read_unlock() |
4079 | + * disable css_tryget() |
4080 | + * call_rcu() |
4081 | + * offline_css() |
4082 | + * reparent_charges() |
4083 | + * res_counter_charge() |
4084 | + * css_put() |
4085 | + * css_free() |
4086 | + * pc->mem_cgroup = dead memcg |
4087 | + * add page to lru |
4088 | + * |
4089 | + * The bulk of the charges are still moved in offline_css() to |
4090 | + * avoid pinning a lot of pages in case a long-term reference |
4091 | + * like a swapout record is deferring the css_free() to long |
4092 | + * after offlining. But this makes sure we catch any charges |
4093 | + * made after offlining: |
4094 | + */ |
4095 | + mem_cgroup_reparent_charges(memcg); |
4096 | |
4097 | memcg_destroy_kmem(memcg); |
4098 | __mem_cgroup_free(memcg); |
4099 | diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c |
4100 | index f60b1eec3f87..5e2c2f1a075d 100644 |
4101 | --- a/net/ipv4/udp.c |
4102 | +++ b/net/ipv4/udp.c |
4103 | @@ -1075,9 +1075,6 @@ int udp_sendpage(struct sock *sk, struct page *page, int offset, |
4104 | if (flags & MSG_SENDPAGE_NOTLAST) |
4105 | flags |= MSG_MORE; |
4106 | |
4107 | - if (flags & MSG_SENDPAGE_NOTLAST) |
4108 | - flags |= MSG_MORE; |
4109 | - |
4110 | if (!up->pending) { |
4111 | struct msghdr msg = { .msg_flags = flags|MSG_MORE }; |
4112 | |
4113 | diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c |
4114 | index 629dee7ec9bf..9903ee585561 100644 |
4115 | --- a/net/mac80211/cfg.c |
4116 | +++ b/net/mac80211/cfg.c |
4117 | @@ -2386,8 +2386,7 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, |
4118 | struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
4119 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); |
4120 | |
4121 | - if (sdata->vif.type != NL80211_IFTYPE_STATION && |
4122 | - sdata->vif.type != NL80211_IFTYPE_MESH_POINT) |
4123 | + if (sdata->vif.type != NL80211_IFTYPE_STATION) |
4124 | return -EOPNOTSUPP; |
4125 | |
4126 | if (!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS)) |
4127 | diff --git a/net/mac80211/main.c b/net/mac80211/main.c |
4128 | index 21d5d44444d0..e765f77bb97a 100644 |
4129 | --- a/net/mac80211/main.c |
4130 | +++ b/net/mac80211/main.c |
4131 | @@ -1047,6 +1047,7 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) |
4132 | |
4133 | cancel_work_sync(&local->restart_work); |
4134 | cancel_work_sync(&local->reconfig_filter); |
4135 | + flush_work(&local->sched_scan_stopped_work); |
4136 | |
4137 | ieee80211_clear_tx_pending(local); |
4138 | rate_control_deinitialize(local); |
4139 | diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c |
4140 | index 674eac1f996c..1e5bd0d75732 100644 |
4141 | --- a/net/mac80211/rx.c |
4142 | +++ b/net/mac80211/rx.c |
4143 | @@ -911,7 +911,8 @@ static void ieee80211_rx_reorder_ampdu(struct ieee80211_rx_data *rx, |
4144 | u16 sc; |
4145 | u8 tid, ack_policy; |
4146 | |
4147 | - if (!ieee80211_is_data_qos(hdr->frame_control)) |
4148 | + if (!ieee80211_is_data_qos(hdr->frame_control) || |
4149 | + is_multicast_ether_addr(hdr->addr1)) |
4150 | goto dont_reorder; |
4151 | |
4152 | /* |
4153 | diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c |
4154 | index d2d17a449224..8f2f003afbb8 100644 |
4155 | --- a/net/mac80211/scan.c |
4156 | +++ b/net/mac80211/scan.c |
4157 | @@ -1089,6 +1089,6 @@ void ieee80211_sched_scan_stopped(struct ieee80211_hw *hw) |
4158 | |
4159 | trace_api_sched_scan_stopped(local); |
4160 | |
4161 | - ieee80211_queue_work(&local->hw, &local->sched_scan_stopped_work); |
4162 | + schedule_work(&local->sched_scan_stopped_work); |
4163 | } |
4164 | EXPORT_SYMBOL(ieee80211_sched_scan_stopped); |
4165 | diff --git a/net/wireless/core.c b/net/wireless/core.c |
4166 | index aff959e5a1b3..00a65ba3aeaa 100644 |
4167 | --- a/net/wireless/core.c |
4168 | +++ b/net/wireless/core.c |
4169 | @@ -451,6 +451,9 @@ int wiphy_register(struct wiphy *wiphy) |
4170 | int i; |
4171 | u16 ifmodes = wiphy->interface_modes; |
4172 | |
4173 | + /* support for 5/10 MHz is broken due to nl80211 API mess - disable */ |
4174 | + wiphy->flags &= ~WIPHY_FLAG_SUPPORTS_5_10_MHZ; |
4175 | + |
4176 | #ifdef CONFIG_PM |
4177 | if (WARN_ON(wiphy->wowlan && |
4178 | (wiphy->wowlan->flags & WIPHY_WOWLAN_GTK_REKEY_FAILURE) && |
4179 | diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c |
4180 | index 5b5231068516..d9a78fd8a2e1 100644 |
4181 | --- a/security/selinux/hooks.c |
4182 | +++ b/security/selinux/hooks.c |
4183 | @@ -53,6 +53,7 @@ |
4184 | #include <net/ip.h> /* for local_port_range[] */ |
4185 | #include <net/sock.h> |
4186 | #include <net/tcp.h> /* struct or_callable used in sock_rcv_skb */ |
4187 | +#include <net/inet_connection_sock.h> |
4188 | #include <net/net_namespace.h> |
4189 | #include <net/netlabel.h> |
4190 | #include <linux/uaccess.h> |
4191 | @@ -3805,6 +3806,30 @@ static int selinux_skb_peerlbl_sid(struct sk_buff *skb, u16 family, u32 *sid) |
4192 | return 0; |
4193 | } |
4194 | |
4195 | +/** |
4196 | + * selinux_conn_sid - Determine the child socket label for a connection |
4197 | + * @sk_sid: the parent socket's SID |
4198 | + * @skb_sid: the packet's SID |
4199 | + * @conn_sid: the resulting connection SID |
4200 | + * |
4201 | + * If @skb_sid is valid then the user:role:type information from @sk_sid is |
4202 | + * combined with the MLS information from @skb_sid in order to create |
4203 | + * @conn_sid. If @skb_sid is not valid then then @conn_sid is simply a copy |
4204 | + * of @sk_sid. Returns zero on success, negative values on failure. |
4205 | + * |
4206 | + */ |
4207 | +static int selinux_conn_sid(u32 sk_sid, u32 skb_sid, u32 *conn_sid) |
4208 | +{ |
4209 | + int err = 0; |
4210 | + |
4211 | + if (skb_sid != SECSID_NULL) |
4212 | + err = security_sid_mls_copy(sk_sid, skb_sid, conn_sid); |
4213 | + else |
4214 | + *conn_sid = sk_sid; |
4215 | + |
4216 | + return err; |
4217 | +} |
4218 | + |
4219 | /* socket security operations */ |
4220 | |
4221 | static int socket_sockcreate_sid(const struct task_security_struct *tsec, |
4222 | @@ -4411,7 +4436,7 @@ static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb, |
4223 | struct sk_security_struct *sksec = sk->sk_security; |
4224 | int err; |
4225 | u16 family = sk->sk_family; |
4226 | - u32 newsid; |
4227 | + u32 connsid; |
4228 | u32 peersid; |
4229 | |
4230 | /* handle mapped IPv4 packets arriving via IPv6 sockets */ |
4231 | @@ -4421,16 +4446,11 @@ static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb, |
4232 | err = selinux_skb_peerlbl_sid(skb, family, &peersid); |
4233 | if (err) |
4234 | return err; |
4235 | - if (peersid == SECSID_NULL) { |
4236 | - req->secid = sksec->sid; |
4237 | - req->peer_secid = SECSID_NULL; |
4238 | - } else { |
4239 | - err = security_sid_mls_copy(sksec->sid, peersid, &newsid); |
4240 | - if (err) |
4241 | - return err; |
4242 | - req->secid = newsid; |
4243 | - req->peer_secid = peersid; |
4244 | - } |
4245 | + err = selinux_conn_sid(sksec->sid, peersid, &connsid); |
4246 | + if (err) |
4247 | + return err; |
4248 | + req->secid = connsid; |
4249 | + req->peer_secid = peersid; |
4250 | |
4251 | return selinux_netlbl_inet_conn_request(req, family); |
4252 | } |
4253 | @@ -4690,6 +4710,7 @@ static unsigned int selinux_ipv6_forward(unsigned int hooknum, |
4254 | static unsigned int selinux_ip_output(struct sk_buff *skb, |
4255 | u16 family) |
4256 | { |
4257 | + struct sock *sk; |
4258 | u32 sid; |
4259 | |
4260 | if (!netlbl_enabled()) |
4261 | @@ -4698,8 +4719,27 @@ static unsigned int selinux_ip_output(struct sk_buff *skb, |
4262 | /* we do this in the LOCAL_OUT path and not the POST_ROUTING path |
4263 | * because we want to make sure we apply the necessary labeling |
4264 | * before IPsec is applied so we can leverage AH protection */ |
4265 | - if (skb->sk) { |
4266 | - struct sk_security_struct *sksec = skb->sk->sk_security; |
4267 | + sk = skb->sk; |
4268 | + if (sk) { |
4269 | + struct sk_security_struct *sksec; |
4270 | + |
4271 | + if (sk->sk_state == TCP_LISTEN) |
4272 | + /* if the socket is the listening state then this |
4273 | + * packet is a SYN-ACK packet which means it needs to |
4274 | + * be labeled based on the connection/request_sock and |
4275 | + * not the parent socket. unfortunately, we can't |
4276 | + * lookup the request_sock yet as it isn't queued on |
4277 | + * the parent socket until after the SYN-ACK is sent. |
4278 | + * the "solution" is to simply pass the packet as-is |
4279 | + * as any IP option based labeling should be copied |
4280 | + * from the initial connection request (in the IP |
4281 | + * layer). it is far from ideal, but until we get a |
4282 | + * security label in the packet itself this is the |
4283 | + * best we can do. */ |
4284 | + return NF_ACCEPT; |
4285 | + |
4286 | + /* standard practice, label using the parent socket */ |
4287 | + sksec = sk->sk_security; |
4288 | sid = sksec->sid; |
4289 | } else |
4290 | sid = SECINITSID_KERNEL; |
4291 | @@ -4784,12 +4824,12 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex, |
4292 | if (!secmark_active && !peerlbl_active) |
4293 | return NF_ACCEPT; |
4294 | |
4295 | - /* if the packet is being forwarded then get the peer label from the |
4296 | - * packet itself; otherwise check to see if it is from a local |
4297 | - * application or the kernel, if from an application get the peer label |
4298 | - * from the sending socket, otherwise use the kernel's sid */ |
4299 | sk = skb->sk; |
4300 | if (sk == NULL) { |
4301 | + /* Without an associated socket the packet is either coming |
4302 | + * from the kernel or it is being forwarded; check the packet |
4303 | + * to determine which and if the packet is being forwarded |
4304 | + * query the packet directly to determine the security label. */ |
4305 | if (skb->skb_iif) { |
4306 | secmark_perm = PACKET__FORWARD_OUT; |
4307 | if (selinux_skb_peerlbl_sid(skb, family, &peer_sid)) |
4308 | @@ -4798,7 +4838,26 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex, |
4309 | secmark_perm = PACKET__SEND; |
4310 | peer_sid = SECINITSID_KERNEL; |
4311 | } |
4312 | + } else if (sk->sk_state == TCP_LISTEN) { |
4313 | + /* Locally generated packet but the associated socket is in the |
4314 | + * listening state which means this is a SYN-ACK packet. In |
4315 | + * this particular case the correct security label is assigned |
4316 | + * to the connection/request_sock but unfortunately we can't |
4317 | + * query the request_sock as it isn't queued on the parent |
4318 | + * socket until after the SYN-ACK packet is sent; the only |
4319 | + * viable choice is to regenerate the label like we do in |
4320 | + * selinux_inet_conn_request(). See also selinux_ip_output() |
4321 | + * for similar problems. */ |
4322 | + u32 skb_sid; |
4323 | + struct sk_security_struct *sksec = sk->sk_security; |
4324 | + if (selinux_skb_peerlbl_sid(skb, family, &skb_sid)) |
4325 | + return NF_DROP; |
4326 | + if (selinux_conn_sid(sksec->sid, skb_sid, &peer_sid)) |
4327 | + return NF_DROP; |
4328 | + secmark_perm = PACKET__SEND; |
4329 | } else { |
4330 | + /* Locally generated packet, fetch the security label from the |
4331 | + * associated socket. */ |
4332 | struct sk_security_struct *sksec = sk->sk_security; |
4333 | peer_sid = sksec->sid; |
4334 | secmark_perm = PACKET__SEND; |
4335 | diff --git a/sound/pci/hda/hda_generic.c b/sound/pci/hda/hda_generic.c |
4336 | index c4671d00babd..c7f6d1cab606 100644 |
4337 | --- a/sound/pci/hda/hda_generic.c |
4338 | +++ b/sound/pci/hda/hda_generic.c |
4339 | @@ -474,6 +474,20 @@ static void invalidate_nid_path(struct hda_codec *codec, int idx) |
4340 | memset(path, 0, sizeof(*path)); |
4341 | } |
4342 | |
4343 | +/* return a DAC if paired to the given pin by codec driver */ |
4344 | +static hda_nid_t get_preferred_dac(struct hda_codec *codec, hda_nid_t pin) |
4345 | +{ |
4346 | + struct hda_gen_spec *spec = codec->spec; |
4347 | + const hda_nid_t *list = spec->preferred_dacs; |
4348 | + |
4349 | + if (!list) |
4350 | + return 0; |
4351 | + for (; *list; list += 2) |
4352 | + if (*list == pin) |
4353 | + return list[1]; |
4354 | + return 0; |
4355 | +} |
4356 | + |
4357 | /* look for an empty DAC slot */ |
4358 | static hda_nid_t look_for_dac(struct hda_codec *codec, hda_nid_t pin, |
4359 | bool is_digital) |
4360 | @@ -1192,7 +1206,14 @@ static int try_assign_dacs(struct hda_codec *codec, int num_outs, |
4361 | continue; |
4362 | } |
4363 | |
4364 | - dacs[i] = look_for_dac(codec, pin, false); |
4365 | + dacs[i] = get_preferred_dac(codec, pin); |
4366 | + if (dacs[i]) { |
4367 | + if (is_dac_already_used(codec, dacs[i])) |
4368 | + badness += bad->shared_primary; |
4369 | + } |
4370 | + |
4371 | + if (!dacs[i]) |
4372 | + dacs[i] = look_for_dac(codec, pin, false); |
4373 | if (!dacs[i] && !i) { |
4374 | /* try to steal the DAC of surrounds for the front */ |
4375 | for (j = 1; j < num_outs; j++) { |
4376 | @@ -4297,6 +4318,26 @@ static unsigned int snd_hda_gen_path_power_filter(struct hda_codec *codec, |
4377 | return AC_PWRST_D3; |
4378 | } |
4379 | |
4380 | +/* mute all aamix inputs initially; parse up to the first leaves */ |
4381 | +static void mute_all_mixer_nid(struct hda_codec *codec, hda_nid_t mix) |
4382 | +{ |
4383 | + int i, nums; |
4384 | + const hda_nid_t *conn; |
4385 | + bool has_amp; |
4386 | + |
4387 | + nums = snd_hda_get_conn_list(codec, mix, &conn); |
4388 | + has_amp = nid_has_mute(codec, mix, HDA_INPUT); |
4389 | + for (i = 0; i < nums; i++) { |
4390 | + if (has_amp) |
4391 | + snd_hda_codec_amp_stereo(codec, mix, |
4392 | + HDA_INPUT, i, |
4393 | + 0xff, HDA_AMP_MUTE); |
4394 | + else if (nid_has_volume(codec, conn[i], HDA_OUTPUT)) |
4395 | + snd_hda_codec_amp_stereo(codec, conn[i], |
4396 | + HDA_OUTPUT, 0, |
4397 | + 0xff, HDA_AMP_MUTE); |
4398 | + } |
4399 | +} |
4400 | |
4401 | /* |
4402 | * Parse the given BIOS configuration and set up the hda_gen_spec |
4403 | @@ -4435,6 +4476,10 @@ int snd_hda_gen_parse_auto_config(struct hda_codec *codec, |
4404 | } |
4405 | } |
4406 | |
4407 | + /* mute all aamix input initially */ |
4408 | + if (spec->mixer_nid) |
4409 | + mute_all_mixer_nid(codec, spec->mixer_nid); |
4410 | + |
4411 | dig_only: |
4412 | parse_digital(codec); |
4413 | |
4414 | diff --git a/sound/pci/hda/hda_generic.h b/sound/pci/hda/hda_generic.h |
4415 | index 7e45cb44d151..0929a06df812 100644 |
4416 | --- a/sound/pci/hda/hda_generic.h |
4417 | +++ b/sound/pci/hda/hda_generic.h |
4418 | @@ -249,6 +249,9 @@ struct hda_gen_spec { |
4419 | const struct badness_table *main_out_badness; |
4420 | const struct badness_table *extra_out_badness; |
4421 | |
4422 | + /* preferred pin/DAC pairs; an array of paired NIDs */ |
4423 | + const hda_nid_t *preferred_dacs; |
4424 | + |
4425 | /* loopback mixing mode */ |
4426 | bool aamix_mode; |
4427 | |
4428 | diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c |
4429 | index f684a4f8c797..38aa080681a3 100644 |
4430 | --- a/sound/pci/hda/patch_analog.c |
4431 | +++ b/sound/pci/hda/patch_analog.c |
4432 | @@ -324,6 +324,14 @@ static int patch_ad1986a(struct hda_codec *codec) |
4433 | { |
4434 | int err; |
4435 | struct ad198x_spec *spec; |
4436 | + static hda_nid_t preferred_pairs[] = { |
4437 | + 0x1a, 0x03, |
4438 | + 0x1b, 0x03, |
4439 | + 0x1c, 0x04, |
4440 | + 0x1d, 0x05, |
4441 | + 0x1e, 0x03, |
4442 | + 0 |
4443 | + }; |
4444 | |
4445 | err = alloc_ad_spec(codec); |
4446 | if (err < 0) |
4447 | @@ -344,6 +352,8 @@ static int patch_ad1986a(struct hda_codec *codec) |
4448 | * So, let's disable the shared stream. |
4449 | */ |
4450 | spec->gen.multiout.no_share_stream = 1; |
4451 | + /* give fixed DAC/pin pairs */ |
4452 | + spec->gen.preferred_dacs = preferred_pairs; |
4453 | |
4454 | /* AD1986A can't manage the dynamic pin on/off smoothly */ |
4455 | spec->gen.auto_mute_via_amp = 1; |
4456 | diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c |
4457 | index 8d2d01b0cf86..f26c42c92db7 100644 |
4458 | --- a/sound/pci/hda/patch_hdmi.c |
4459 | +++ b/sound/pci/hda/patch_hdmi.c |
4460 | @@ -2085,8 +2085,9 @@ static int simple_playback_build_controls(struct hda_codec *codec) |
4461 | int err; |
4462 | |
4463 | per_cvt = get_cvt(spec, 0); |
4464 | - err = snd_hda_create_spdif_out_ctls(codec, per_cvt->cvt_nid, |
4465 | - per_cvt->cvt_nid); |
4466 | + err = snd_hda_create_dig_out_ctls(codec, per_cvt->cvt_nid, |
4467 | + per_cvt->cvt_nid, |
4468 | + HDA_PCM_TYPE_HDMI); |
4469 | if (err < 0) |
4470 | return err; |
4471 | return simple_hdmi_build_jack(codec, 0); |
4472 | diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c |
4473 | index 1cf9ccb01013..aac732d17c17 100644 |
4474 | --- a/virt/kvm/kvm_main.c |
4475 | +++ b/virt/kvm/kvm_main.c |
4476 | @@ -1893,6 +1893,9 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, u32 id) |
4477 | int r; |
4478 | struct kvm_vcpu *vcpu, *v; |
4479 | |
4480 | + if (id >= KVM_MAX_VCPUS) |
4481 | + return -EINVAL; |
4482 | + |
4483 | vcpu = kvm_arch_vcpu_create(kvm, id); |
4484 | if (IS_ERR(vcpu)) |
4485 | return PTR_ERR(vcpu); |