Annotation of /trunk/kernel26-alx/patches-3.10/0165-3.10.66-all-fixes.patch
Parent Directory | Revision Log
Revision 2672 -
(hide annotations)
(download)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 50783 byte(s)
Tue Jul 21 16:46:35 2015 UTC (9 years, 2 months ago) by niro
File size: 50783 byte(s)
-3.10.84-alx-r1
1 | niro | 2672 | diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt |
2 | index 1311a48a7367..98da831a14ba 100644 | ||
3 | --- a/Documentation/kernel-parameters.txt | ||
4 | +++ b/Documentation/kernel-parameters.txt | ||
5 | @@ -1061,6 +1061,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | ||
6 | i8042.notimeout [HW] Ignore timeout condition signalled by controller | ||
7 | i8042.reset [HW] Reset the controller during init and cleanup | ||
8 | i8042.unlock [HW] Unlock (ignore) the keylock | ||
9 | + i8042.kbdreset [HW] Reset device connected to KBD port | ||
10 | |||
11 | i810= [HW,DRM] | ||
12 | |||
13 | diff --git a/Makefile b/Makefile | ||
14 | index 7889b38766db..12ae1ef5437a 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,6 +1,6 @@ | ||
18 | VERSION = 3 | ||
19 | PATCHLEVEL = 10 | ||
20 | -SUBLEVEL = 65 | ||
21 | +SUBLEVEL = 66 | ||
22 | EXTRAVERSION = | ||
23 | NAME = TOSSUG Baby Fish | ||
24 | |||
25 | diff --git a/arch/arc/boot/dts/nsimosci.dts b/arch/arc/boot/dts/nsimosci.dts | ||
26 | index 398064cef746..4c169d825415 100644 | ||
27 | --- a/arch/arc/boot/dts/nsimosci.dts | ||
28 | +++ b/arch/arc/boot/dts/nsimosci.dts | ||
29 | @@ -20,7 +20,7 @@ | ||
30 | /* this is for console on PGU */ | ||
31 | /* bootargs = "console=tty0 consoleblank=0"; */ | ||
32 | /* this is for console on serial */ | ||
33 | - bootargs = "earlycon=uart8250,mmio32,0xc0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; | ||
34 | + bootargs = "earlycon=uart8250,mmio32,0xf0000000,115200n8 console=tty0 console=ttyS0,115200n8 consoleblank=0 debug"; | ||
35 | }; | ||
36 | |||
37 | aliases { | ||
38 | @@ -46,9 +46,9 @@ | ||
39 | #interrupt-cells = <1>; | ||
40 | }; | ||
41 | |||
42 | - uart0: serial@c0000000 { | ||
43 | + uart0: serial@f0000000 { | ||
44 | compatible = "ns8250"; | ||
45 | - reg = <0xc0000000 0x2000>; | ||
46 | + reg = <0xf0000000 0x2000>; | ||
47 | interrupts = <11>; | ||
48 | clock-frequency = <3686400>; | ||
49 | baud = <115200>; | ||
50 | @@ -57,21 +57,21 @@ | ||
51 | no-loopback-test = <1>; | ||
52 | }; | ||
53 | |||
54 | - pgu0: pgu@c9000000 { | ||
55 | + pgu0: pgu@f9000000 { | ||
56 | compatible = "snps,arcpgufb"; | ||
57 | - reg = <0xc9000000 0x400>; | ||
58 | + reg = <0xf9000000 0x400>; | ||
59 | }; | ||
60 | |||
61 | - ps2: ps2@c9001000 { | ||
62 | + ps2: ps2@f9001000 { | ||
63 | compatible = "snps,arc_ps2"; | ||
64 | - reg = <0xc9000400 0x14>; | ||
65 | + reg = <0xf9000400 0x14>; | ||
66 | interrupts = <13>; | ||
67 | interrupt-names = "arc_ps2_irq"; | ||
68 | }; | ||
69 | |||
70 | - eth0: ethernet@c0003000 { | ||
71 | + eth0: ethernet@f0003000 { | ||
72 | compatible = "snps,oscilan"; | ||
73 | - reg = <0xc0003000 0x44>; | ||
74 | + reg = <0xf0003000 0x44>; | ||
75 | interrupts = <7>, <8>; | ||
76 | interrupt-names = "rx", "tx"; | ||
77 | }; | ||
78 | diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi | ||
79 | index 701153992c69..82897e2d8d5a 100644 | ||
80 | --- a/arch/arm/boot/dts/imx25.dtsi | ||
81 | +++ b/arch/arm/boot/dts/imx25.dtsi | ||
82 | @@ -141,7 +141,7 @@ | ||
83 | #size-cells = <0>; | ||
84 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | ||
85 | reg = <0x43fa4000 0x4000>; | ||
86 | - clocks = <&clks 62>, <&clks 62>; | ||
87 | + clocks = <&clks 78>, <&clks 78>; | ||
88 | clock-names = "ipg", "per"; | ||
89 | interrupts = <14>; | ||
90 | status = "disabled"; | ||
91 | diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c | ||
92 | index 0b9e437719bd..2acaded8025d 100644 | ||
93 | --- a/arch/arm/mach-imx/clk-imx6q.c | ||
94 | +++ b/arch/arm/mach-imx/clk-imx6q.c | ||
95 | @@ -301,8 +301,8 @@ int __init mx6q_clocks_init(void) | ||
96 | post_div_table[1].div = 1; | ||
97 | post_div_table[2].div = 1; | ||
98 | video_div_table[1].div = 1; | ||
99 | - video_div_table[2].div = 1; | ||
100 | - }; | ||
101 | + video_div_table[3].div = 1; | ||
102 | + } | ||
103 | |||
104 | /* type name parent_name base div_mask */ | ||
105 | clk[pll1_sys] = imx_clk_pllv3(IMX_PLLV3_SYS, "pll1_sys", "osc", base, 0x7f); | ||
106 | diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c | ||
107 | index f8b23b8040d9..3f3259e74fd3 100644 | ||
108 | --- a/arch/arm/mach-omap2/timer.c | ||
109 | +++ b/arch/arm/mach-omap2/timer.c | ||
110 | @@ -503,11 +503,11 @@ static void __init realtime_counter_init(void) | ||
111 | rate = clk_get_rate(sys_clk); | ||
112 | /* Numerator/denumerator values refer TRM Realtime Counter section */ | ||
113 | switch (rate) { | ||
114 | - case 1200000: | ||
115 | + case 12000000: | ||
116 | num = 64; | ||
117 | den = 125; | ||
118 | break; | ||
119 | - case 1300000: | ||
120 | + case 13000000: | ||
121 | num = 768; | ||
122 | den = 1625; | ||
123 | break; | ||
124 | @@ -515,11 +515,11 @@ static void __init realtime_counter_init(void) | ||
125 | num = 8; | ||
126 | den = 25; | ||
127 | break; | ||
128 | - case 2600000: | ||
129 | + case 26000000: | ||
130 | num = 384; | ||
131 | den = 1625; | ||
132 | break; | ||
133 | - case 2700000: | ||
134 | + case 27000000: | ||
135 | num = 256; | ||
136 | den = 1125; | ||
137 | break; | ||
138 | diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c | ||
139 | index 9696f3646864..ea788c8e32e8 100644 | ||
140 | --- a/arch/arm/mach-shmobile/setup-sh73a0.c | ||
141 | +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | ||
142 | @@ -814,6 +814,7 @@ static struct platform_device ipmmu_device = { | ||
143 | |||
144 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { | ||
145 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ | ||
146 | + .control_parent = true, | ||
147 | }; | ||
148 | |||
149 | static struct resource irqpin0_resources[] = { | ||
150 | @@ -875,6 +876,7 @@ static struct platform_device irqpin1_device = { | ||
151 | |||
152 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { | ||
153 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ | ||
154 | + .control_parent = true, | ||
155 | }; | ||
156 | |||
157 | static struct resource irqpin2_resources[] = { | ||
158 | @@ -905,6 +907,7 @@ static struct platform_device irqpin2_device = { | ||
159 | |||
160 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { | ||
161 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ | ||
162 | + .control_parent = true, | ||
163 | }; | ||
164 | |||
165 | static struct resource irqpin3_resources[] = { | ||
166 | diff --git a/arch/um/Kconfig.common b/arch/um/Kconfig.common | ||
167 | index bceee6623b00..d1ff46c0559b 100644 | ||
168 | --- a/arch/um/Kconfig.common | ||
169 | +++ b/arch/um/Kconfig.common | ||
170 | @@ -8,6 +8,7 @@ config UML | ||
171 | default y | ||
172 | select HAVE_GENERIC_HARDIRQS | ||
173 | select HAVE_UID16 | ||
174 | + select HAVE_FUTEX_CMPXCHG if FUTEX | ||
175 | select GENERIC_IRQ_SHOW | ||
176 | select GENERIC_CPU_DEVICES | ||
177 | select GENERIC_IO | ||
178 | diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c | ||
179 | index 211bce445522..0c6c07cea3f7 100644 | ||
180 | --- a/arch/x86/kernel/kprobes/core.c | ||
181 | +++ b/arch/x86/kernel/kprobes/core.c | ||
182 | @@ -1017,6 +1017,15 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | ||
183 | regs->flags &= ~X86_EFLAGS_IF; | ||
184 | trace_hardirqs_off(); | ||
185 | regs->ip = (unsigned long)(jp->entry); | ||
186 | + | ||
187 | + /* | ||
188 | + * jprobes use jprobe_return() which skips the normal return | ||
189 | + * path of the function, and this messes up the accounting of the | ||
190 | + * function graph tracer to get messed up. | ||
191 | + * | ||
192 | + * Pause function graph tracing while performing the jprobe function. | ||
193 | + */ | ||
194 | + pause_graph_tracing(); | ||
195 | return 1; | ||
196 | } | ||
197 | |||
198 | @@ -1042,24 +1051,25 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | ||
199 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | ||
200 | u8 *addr = (u8 *) (regs->ip - 1); | ||
201 | struct jprobe *jp = container_of(p, struct jprobe, kp); | ||
202 | + void *saved_sp = kcb->jprobe_saved_sp; | ||
203 | |||
204 | if ((addr > (u8 *) jprobe_return) && | ||
205 | (addr < (u8 *) jprobe_return_end)) { | ||
206 | - if (stack_addr(regs) != kcb->jprobe_saved_sp) { | ||
207 | + if (stack_addr(regs) != saved_sp) { | ||
208 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | ||
209 | printk(KERN_ERR | ||
210 | "current sp %p does not match saved sp %p\n", | ||
211 | - stack_addr(regs), kcb->jprobe_saved_sp); | ||
212 | + stack_addr(regs), saved_sp); | ||
213 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | ||
214 | show_regs(saved_regs); | ||
215 | printk(KERN_ERR "Current registers\n"); | ||
216 | show_regs(regs); | ||
217 | BUG(); | ||
218 | } | ||
219 | + /* It's OK to start function graph tracing again */ | ||
220 | + unpause_graph_tracing(); | ||
221 | *regs = kcb->jprobe_saved_regs; | ||
222 | - memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | ||
223 | - kcb->jprobes_stack, | ||
224 | - MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
225 | + memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); | ||
226 | preempt_enable_no_resched(); | ||
227 | return 1; | ||
228 | } | ||
229 | diff --git a/arch/x86/um/sys_call_table_32.c b/arch/x86/um/sys_call_table_32.c | ||
230 | index 531d4269e2e3..bd16d6c370ec 100644 | ||
231 | --- a/arch/x86/um/sys_call_table_32.c | ||
232 | +++ b/arch/x86/um/sys_call_table_32.c | ||
233 | @@ -34,7 +34,7 @@ typedef asmlinkage void (*sys_call_ptr_t)(void); | ||
234 | |||
235 | extern asmlinkage void sys_ni_syscall(void); | ||
236 | |||
237 | -const sys_call_ptr_t sys_call_table[] __cacheline_aligned = { | ||
238 | +const sys_call_ptr_t sys_call_table[] ____cacheline_aligned = { | ||
239 | /* | ||
240 | * Smells like a compiler bug -- it doesn't work | ||
241 | * when the & below is removed. | ||
242 | diff --git a/arch/x86/um/sys_call_table_64.c b/arch/x86/um/sys_call_table_64.c | ||
243 | index f2f0723070ca..95783087f0d3 100644 | ||
244 | --- a/arch/x86/um/sys_call_table_64.c | ||
245 | +++ b/arch/x86/um/sys_call_table_64.c | ||
246 | @@ -46,7 +46,7 @@ typedef void (*sys_call_ptr_t)(void); | ||
247 | |||
248 | extern void sys_ni_syscall(void); | ||
249 | |||
250 | -const sys_call_ptr_t sys_call_table[] __cacheline_aligned = { | ||
251 | +const sys_call_ptr_t sys_call_table[] ____cacheline_aligned = { | ||
252 | /* | ||
253 | * Smells like a compiler bug -- it doesn't work | ||
254 | * when the & below is removed. | ||
255 | diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c | ||
256 | index 665f9530c950..af909a20dd70 100644 | ||
257 | --- a/drivers/gpio/gpiolib-of.c | ||
258 | +++ b/drivers/gpio/gpiolib-of.c | ||
259 | @@ -12,6 +12,7 @@ | ||
260 | */ | ||
261 | |||
262 | #include <linux/device.h> | ||
263 | +#include <linux/err.h> | ||
264 | #include <linux/errno.h> | ||
265 | #include <linux/module.h> | ||
266 | #include <linux/io.h> | ||
267 | @@ -42,8 +43,14 @@ static int of_gpiochip_find_and_xlate(struct gpio_chip *gc, void *data) | ||
268 | return false; | ||
269 | |||
270 | ret = gc->of_xlate(gc, &gg_data->gpiospec, gg_data->flags); | ||
271 | - if (ret < 0) | ||
272 | - return false; | ||
273 | + if (ret < 0) { | ||
274 | + /* We've found the gpio chip, but the translation failed. | ||
275 | + * Return true to stop looking and return the translation | ||
276 | + * error via out_gpio | ||
277 | + */ | ||
278 | + gg_data->out_gpio = ERR_PTR(ret); | ||
279 | + return true; | ||
280 | + } | ||
281 | |||
282 | gg_data->out_gpio = ret + gc->base; | ||
283 | return true; | ||
284 | diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h | ||
285 | index 2d90f96c19d0..7695b5dd9d2d 100644 | ||
286 | --- a/drivers/gpu/drm/i915/i915_reg.h | ||
287 | +++ b/drivers/gpu/drm/i915/i915_reg.h | ||
288 | @@ -317,6 +317,7 @@ | ||
289 | #define PIPE_CONTROL_GLOBAL_GTT_IVB (1<<24) /* gen7+ */ | ||
290 | #define PIPE_CONTROL_CS_STALL (1<<20) | ||
291 | #define PIPE_CONTROL_TLB_INVALIDATE (1<<18) | ||
292 | +#define PIPE_CONTROL_MEDIA_STATE_CLEAR (1<<16) | ||
293 | #define PIPE_CONTROL_QW_WRITE (1<<14) | ||
294 | #define PIPE_CONTROL_DEPTH_STALL (1<<13) | ||
295 | #define PIPE_CONTROL_WRITE_FLUSH (1<<12) | ||
296 | diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
297 | index 4605c3877c95..ef4cde15c15c 100644 | ||
298 | --- a/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
299 | +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | ||
300 | @@ -314,12 +314,15 @@ gen7_render_ring_flush(struct intel_ring_buffer *ring, | ||
301 | flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE; | ||
302 | flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE; | ||
303 | flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE; | ||
304 | + flags |= PIPE_CONTROL_MEDIA_STATE_CLEAR; | ||
305 | /* | ||
306 | * TLB invalidate requires a post-sync write. | ||
307 | */ | ||
308 | flags |= PIPE_CONTROL_QW_WRITE; | ||
309 | flags |= PIPE_CONTROL_GLOBAL_GTT_IVB; | ||
310 | |||
311 | + flags |= PIPE_CONTROL_STALL_AT_SCOREBOARD; | ||
312 | + | ||
313 | /* Workaround: we must issue a pipe_control with CS-stall bit | ||
314 | * set before a pipe_control command that has the state cache | ||
315 | * invalidate bit set. */ | ||
316 | diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c | ||
317 | index 4c05f2b015cf..d4a5118911fd 100644 | ||
318 | --- a/drivers/gpu/drm/radeon/atombios_dp.c | ||
319 | +++ b/drivers/gpu/drm/radeon/atombios_dp.c | ||
320 | @@ -574,6 +574,10 @@ int radeon_dp_mode_valid_helper(struct drm_connector *connector, | ||
321 | struct radeon_connector_atom_dig *dig_connector; | ||
322 | int dp_clock; | ||
323 | |||
324 | + if ((mode->clock > 340000) && | ||
325 | + (!radeon_connector_is_dp12_capable(connector))) | ||
326 | + return MODE_CLOCK_HIGH; | ||
327 | + | ||
328 | if (!radeon_connector->con_priv) | ||
329 | return MODE_CLOCK_HIGH; | ||
330 | dig_connector = radeon_connector->con_priv; | ||
331 | diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c | ||
332 | index 6c0ce8915fac..4a14e113369d 100644 | ||
333 | --- a/drivers/gpu/drm/radeon/radeon_ttm.c | ||
334 | +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | ||
335 | @@ -189,7 +189,7 @@ static void radeon_evict_flags(struct ttm_buffer_object *bo, | ||
336 | rbo = container_of(bo, struct radeon_bo, tbo); | ||
337 | switch (bo->mem.mem_type) { | ||
338 | case TTM_PL_VRAM: | ||
339 | - if (rbo->rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ready == false) | ||
340 | + if (rbo->rdev->ring[radeon_copy_ring_index(rbo->rdev)].ready == false) | ||
341 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_CPU); | ||
342 | else | ||
343 | radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT); | ||
344 | diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
345 | index c62d20e8a6f1..ee742f14ddc2 100644 | ||
346 | --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
347 | +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | ||
348 | @@ -1049,6 +1049,8 @@ int vmw_event_fence_action_create(struct drm_file *file_priv, | ||
349 | if (ret != 0) | ||
350 | goto out_no_queue; | ||
351 | |||
352 | + return 0; | ||
353 | + | ||
354 | out_no_queue: | ||
355 | event->base.destroy(&event->base); | ||
356 | out_no_event: | ||
357 | @@ -1123,17 +1125,10 @@ int vmw_fence_event_ioctl(struct drm_device *dev, void *data, | ||
358 | |||
359 | BUG_ON(fence == NULL); | ||
360 | |||
361 | - if (arg->flags & DRM_VMW_FE_FLAG_REQ_TIME) | ||
362 | - ret = vmw_event_fence_action_create(file_priv, fence, | ||
363 | - arg->flags, | ||
364 | - arg->user_data, | ||
365 | - true); | ||
366 | - else | ||
367 | - ret = vmw_event_fence_action_create(file_priv, fence, | ||
368 | - arg->flags, | ||
369 | - arg->user_data, | ||
370 | - true); | ||
371 | - | ||
372 | + ret = vmw_event_fence_action_create(file_priv, fence, | ||
373 | + arg->flags, | ||
374 | + arg->user_data, | ||
375 | + true); | ||
376 | if (unlikely(ret != 0)) { | ||
377 | if (ret != -ERESTARTSYS) | ||
378 | DRM_ERROR("Failed to attach event to fence.\n"); | ||
379 | diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h | ||
380 | index ce715b1bee46..78227f32d6fa 100644 | ||
381 | --- a/drivers/input/serio/i8042-x86ia64io.h | ||
382 | +++ b/drivers/input/serio/i8042-x86ia64io.h | ||
383 | @@ -408,6 +408,13 @@ static const struct dmi_system_id __initconst i8042_dmi_nomux_table[] = { | ||
384 | }, | ||
385 | }, | ||
386 | { | ||
387 | + /* Acer Aspire 7738 */ | ||
388 | + .matches = { | ||
389 | + DMI_MATCH(DMI_SYS_VENDOR, "Acer"), | ||
390 | + DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 7738"), | ||
391 | + }, | ||
392 | + }, | ||
393 | + { | ||
394 | /* Gericom Bellagio */ | ||
395 | .matches = { | ||
396 | DMI_MATCH(DMI_SYS_VENDOR, "Gericom"), | ||
397 | @@ -721,6 +728,35 @@ static const struct dmi_system_id __initconst i8042_dmi_dritek_table[] = { | ||
398 | { } | ||
399 | }; | ||
400 | |||
401 | +/* | ||
402 | + * Some laptops need keyboard reset before probing for the trackpad to get | ||
403 | + * it detected, initialised & finally work. | ||
404 | + */ | ||
405 | +static const struct dmi_system_id __initconst i8042_dmi_kbdreset_table[] = { | ||
406 | + { | ||
407 | + /* Gigabyte P35 v2 - Elantech touchpad */ | ||
408 | + .matches = { | ||
409 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
410 | + DMI_MATCH(DMI_PRODUCT_NAME, "P35V2"), | ||
411 | + }, | ||
412 | + }, | ||
413 | + { | ||
414 | + /* Aorus branded Gigabyte X3 Plus - Elantech touchpad */ | ||
415 | + .matches = { | ||
416 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
417 | + DMI_MATCH(DMI_PRODUCT_NAME, "X3"), | ||
418 | + }, | ||
419 | + }, | ||
420 | + { | ||
421 | + /* Gigabyte P34 - Elantech touchpad */ | ||
422 | + .matches = { | ||
423 | + DMI_MATCH(DMI_SYS_VENDOR, "GIGABYTE"), | ||
424 | + DMI_MATCH(DMI_PRODUCT_NAME, "P34"), | ||
425 | + }, | ||
426 | + }, | ||
427 | + { } | ||
428 | +}; | ||
429 | + | ||
430 | #endif /* CONFIG_X86 */ | ||
431 | |||
432 | #ifdef CONFIG_PNP | ||
433 | @@ -1001,6 +1037,9 @@ static int __init i8042_platform_init(void) | ||
434 | if (dmi_check_system(i8042_dmi_dritek_table)) | ||
435 | i8042_dritek = true; | ||
436 | |||
437 | + if (dmi_check_system(i8042_dmi_kbdreset_table)) | ||
438 | + i8042_kbdreset = true; | ||
439 | + | ||
440 | /* | ||
441 | * A20 was already enabled during early kernel init. But some buggy | ||
442 | * BIOSes (in MSI Laptops) require A20 to be enabled using 8042 to | ||
443 | diff --git a/drivers/input/serio/i8042.c b/drivers/input/serio/i8042.c | ||
444 | index 78e4de42efaa..9870c540e6fb 100644 | ||
445 | --- a/drivers/input/serio/i8042.c | ||
446 | +++ b/drivers/input/serio/i8042.c | ||
447 | @@ -67,6 +67,10 @@ static bool i8042_notimeout; | ||
448 | module_param_named(notimeout, i8042_notimeout, bool, 0); | ||
449 | MODULE_PARM_DESC(notimeout, "Ignore timeouts signalled by i8042"); | ||
450 | |||
451 | +static bool i8042_kbdreset; | ||
452 | +module_param_named(kbdreset, i8042_kbdreset, bool, 0); | ||
453 | +MODULE_PARM_DESC(kbdreset, "Reset device connected to KBD port"); | ||
454 | + | ||
455 | #ifdef CONFIG_X86 | ||
456 | static bool i8042_dritek; | ||
457 | module_param_named(dritek, i8042_dritek, bool, 0); | ||
458 | @@ -783,6 +787,16 @@ static int __init i8042_check_aux(void) | ||
459 | return -1; | ||
460 | |||
461 | /* | ||
462 | + * Reset keyboard (needed on some laptops to successfully detect | ||
463 | + * touchpad, e.g., some Gigabyte laptop models with Elantech | ||
464 | + * touchpads). | ||
465 | + */ | ||
466 | + if (i8042_kbdreset) { | ||
467 | + pr_warn("Attempting to reset device connected to KBD port\n"); | ||
468 | + i8042_kbd_write(NULL, (unsigned char) 0xff); | ||
469 | + } | ||
470 | + | ||
471 | +/* | ||
472 | * Test AUX IRQ delivery to make sure BIOS did not grab the IRQ and | ||
473 | * used it for a PCI card or somethig else. | ||
474 | */ | ||
475 | diff --git a/drivers/media/i2c/smiapp-pll.c b/drivers/media/i2c/smiapp-pll.c | ||
476 | index d8d5da7c52db..942305129e15 100644 | ||
477 | --- a/drivers/media/i2c/smiapp-pll.c | ||
478 | +++ b/drivers/media/i2c/smiapp-pll.c | ||
479 | @@ -67,7 +67,7 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | ||
480 | { | ||
481 | dev_dbg(dev, "pre_pll_clk_div\t%d\n", pll->pre_pll_clk_div); | ||
482 | dev_dbg(dev, "pll_multiplier \t%d\n", pll->pll_multiplier); | ||
483 | - if (pll->flags != SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { | ||
484 | + if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | ||
485 | dev_dbg(dev, "op_sys_clk_div \t%d\n", pll->op_sys_clk_div); | ||
486 | dev_dbg(dev, "op_pix_clk_div \t%d\n", pll->op_pix_clk_div); | ||
487 | } | ||
488 | @@ -77,7 +77,7 @@ static void print_pll(struct device *dev, struct smiapp_pll *pll) | ||
489 | dev_dbg(dev, "ext_clk_freq_hz \t%d\n", pll->ext_clk_freq_hz); | ||
490 | dev_dbg(dev, "pll_ip_clk_freq_hz \t%d\n", pll->pll_ip_clk_freq_hz); | ||
491 | dev_dbg(dev, "pll_op_clk_freq_hz \t%d\n", pll->pll_op_clk_freq_hz); | ||
492 | - if (pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS) { | ||
493 | + if (!(pll->flags & SMIAPP_PLL_FLAG_NO_OP_CLOCKS)) { | ||
494 | dev_dbg(dev, "op_sys_clk_freq_hz \t%d\n", | ||
495 | pll->op_sys_clk_freq_hz); | ||
496 | dev_dbg(dev, "op_pix_clk_freq_hz \t%d\n", | ||
497 | diff --git a/drivers/media/i2c/smiapp/smiapp-core.c b/drivers/media/i2c/smiapp/smiapp-core.c | ||
498 | index b280216de31b..de8bc35d8b0b 100644 | ||
499 | --- a/drivers/media/i2c/smiapp/smiapp-core.c | ||
500 | +++ b/drivers/media/i2c/smiapp/smiapp-core.c | ||
501 | @@ -2629,7 +2629,9 @@ static int smiapp_registered(struct v4l2_subdev *subdev) | ||
502 | pll->flags |= SMIAPP_PLL_FLAG_OP_PIX_CLOCK_PER_LANE; | ||
503 | pll->scale_n = sensor->limits[SMIAPP_LIMIT_SCALER_N_MIN]; | ||
504 | |||
505 | + mutex_lock(&sensor->mutex); | ||
506 | rval = smiapp_update_mode(sensor); | ||
507 | + mutex_unlock(&sensor->mutex); | ||
508 | if (rval) { | ||
509 | dev_err(&client->dev, "update mode failed\n"); | ||
510 | goto out_nvm_release; | ||
511 | diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c | ||
512 | index af176b6ce738..e6d3561eea47 100644 | ||
513 | --- a/drivers/media/usb/dvb-usb/af9005.c | ||
514 | +++ b/drivers/media/usb/dvb-usb/af9005.c | ||
515 | @@ -1081,9 +1081,12 @@ static int __init af9005_usb_module_init(void) | ||
516 | err("usb_register failed. (%d)", result); | ||
517 | return result; | ||
518 | } | ||
519 | +#if IS_MODULE(CONFIG_DVB_USB_AF9005) || defined(CONFIG_DVB_USB_AF9005_REMOTE) | ||
520 | + /* FIXME: convert to todays kernel IR infrastructure */ | ||
521 | rc_decode = symbol_request(af9005_rc_decode); | ||
522 | rc_keys = symbol_request(rc_map_af9005_table); | ||
523 | rc_keys_size = symbol_request(rc_map_af9005_table_size); | ||
524 | +#endif | ||
525 | if (rc_decode == NULL || rc_keys == NULL || rc_keys_size == NULL) { | ||
526 | err("af9005_rc_decode function not found, disabling remote"); | ||
527 | af9005_properties.rc.legacy.rc_query = NULL; | ||
528 | diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c | ||
529 | index 5dbefa68b1d2..363cdbf4ac8d 100644 | ||
530 | --- a/drivers/media/usb/uvc/uvc_driver.c | ||
531 | +++ b/drivers/media/usb/uvc/uvc_driver.c | ||
532 | @@ -1603,12 +1603,12 @@ static void uvc_delete(struct uvc_device *dev) | ||
533 | { | ||
534 | struct list_head *p, *n; | ||
535 | |||
536 | - usb_put_intf(dev->intf); | ||
537 | - usb_put_dev(dev->udev); | ||
538 | - | ||
539 | uvc_status_cleanup(dev); | ||
540 | uvc_ctrl_cleanup_device(dev); | ||
541 | |||
542 | + usb_put_intf(dev->intf); | ||
543 | + usb_put_dev(dev->udev); | ||
544 | + | ||
545 | if (dev->vdev.dev) | ||
546 | v4l2_device_unregister(&dev->vdev); | ||
547 | #ifdef CONFIG_MEDIA_CONTROLLER | ||
548 | diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c | ||
549 | index 2ea429c27714..836e2ac36a0d 100644 | ||
550 | --- a/drivers/mmc/host/sdhci.c | ||
551 | +++ b/drivers/mmc/host/sdhci.c | ||
552 | @@ -1316,6 +1316,8 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | ||
553 | |||
554 | sdhci_runtime_pm_get(host); | ||
555 | |||
556 | + present = mmc_gpio_get_cd(host->mmc); | ||
557 | + | ||
558 | spin_lock_irqsave(&host->lock, flags); | ||
559 | |||
560 | WARN_ON(host->mrq != NULL); | ||
561 | @@ -1344,7 +1346,6 @@ static void sdhci_request(struct mmc_host *mmc, struct mmc_request *mrq) | ||
562 | * zero: cd-gpio is used, and card is removed | ||
563 | * one: cd-gpio is used, and card is present | ||
564 | */ | ||
565 | - present = mmc_gpio_get_cd(host->mmc); | ||
566 | if (present < 0) { | ||
567 | /* If polling, assume that the card is always present. */ | ||
568 | if (host->quirks & SDHCI_QUIRK_BROKEN_CARD_DETECTION) | ||
569 | diff --git a/drivers/net/can/usb/kvaser_usb.c b/drivers/net/can/usb/kvaser_usb.c | ||
570 | index cc3df8aebb87..63fb90b006ba 100644 | ||
571 | --- a/drivers/net/can/usb/kvaser_usb.c | ||
572 | +++ b/drivers/net/can/usb/kvaser_usb.c | ||
573 | @@ -1238,6 +1238,9 @@ static int kvaser_usb_close(struct net_device *netdev) | ||
574 | if (err) | ||
575 | netdev_warn(netdev, "Cannot stop device, error %d\n", err); | ||
576 | |||
577 | + /* reset tx contexts */ | ||
578 | + kvaser_usb_unlink_tx_urbs(priv); | ||
579 | + | ||
580 | priv->can.state = CAN_STATE_STOPPED; | ||
581 | close_candev(priv->netdev); | ||
582 | |||
583 | @@ -1286,12 +1289,14 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
584 | if (!urb) { | ||
585 | netdev_err(netdev, "No memory left for URBs\n"); | ||
586 | stats->tx_dropped++; | ||
587 | - goto nourbmem; | ||
588 | + dev_kfree_skb(skb); | ||
589 | + return NETDEV_TX_OK; | ||
590 | } | ||
591 | |||
592 | buf = kmalloc(sizeof(struct kvaser_msg), GFP_ATOMIC); | ||
593 | if (!buf) { | ||
594 | stats->tx_dropped++; | ||
595 | + dev_kfree_skb(skb); | ||
596 | goto nobufmem; | ||
597 | } | ||
598 | |||
599 | @@ -1326,6 +1331,7 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
600 | } | ||
601 | } | ||
602 | |||
603 | + /* This should never happen; it implies a flow control bug */ | ||
604 | if (!context) { | ||
605 | netdev_warn(netdev, "cannot find free context\n"); | ||
606 | ret = NETDEV_TX_BUSY; | ||
607 | @@ -1356,9 +1362,6 @@ static netdev_tx_t kvaser_usb_start_xmit(struct sk_buff *skb, | ||
608 | if (unlikely(err)) { | ||
609 | can_free_echo_skb(netdev, context->echo_index); | ||
610 | |||
611 | - skb = NULL; /* set to NULL to avoid double free in | ||
612 | - * dev_kfree_skb(skb) */ | ||
613 | - | ||
614 | atomic_dec(&priv->active_tx_urbs); | ||
615 | usb_unanchor_urb(urb); | ||
616 | |||
617 | @@ -1380,8 +1383,6 @@ releasebuf: | ||
618 | kfree(buf); | ||
619 | nobufmem: | ||
620 | usb_free_urb(urb); | ||
621 | -nourbmem: | ||
622 | - dev_kfree_skb(skb); | ||
623 | return ret; | ||
624 | } | ||
625 | |||
626 | @@ -1493,6 +1494,10 @@ static int kvaser_usb_init_one(struct usb_interface *intf, | ||
627 | struct kvaser_usb_net_priv *priv; | ||
628 | int i, err; | ||
629 | |||
630 | + err = kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, channel); | ||
631 | + if (err) | ||
632 | + return err; | ||
633 | + | ||
634 | netdev = alloc_candev(sizeof(*priv), MAX_TX_URBS); | ||
635 | if (!netdev) { | ||
636 | dev_err(&intf->dev, "Cannot alloc candev\n"); | ||
637 | @@ -1596,9 +1601,6 @@ static int kvaser_usb_probe(struct usb_interface *intf, | ||
638 | |||
639 | usb_set_intfdata(intf, dev); | ||
640 | |||
641 | - for (i = 0; i < MAX_NET_DEVICES; i++) | ||
642 | - kvaser_usb_send_simple_msg(dev, CMD_RESET_CHIP, i); | ||
643 | - | ||
644 | err = kvaser_usb_get_software_info(dev); | ||
645 | if (err) { | ||
646 | dev_err(&intf->dev, | ||
647 | diff --git a/drivers/net/ethernet/atheros/alx/main.c b/drivers/net/ethernet/atheros/alx/main.c | ||
648 | index d30085c2b454..a85a9c2f1385 100644 | ||
649 | --- a/drivers/net/ethernet/atheros/alx/main.c | ||
650 | +++ b/drivers/net/ethernet/atheros/alx/main.c | ||
651 | @@ -184,15 +184,16 @@ static void alx_schedule_reset(struct alx_priv *alx) | ||
652 | schedule_work(&alx->reset_wk); | ||
653 | } | ||
654 | |||
655 | -static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
656 | +static int alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
657 | { | ||
658 | struct alx_rx_queue *rxq = &alx->rxq; | ||
659 | struct alx_rrd *rrd; | ||
660 | struct alx_buffer *rxb; | ||
661 | struct sk_buff *skb; | ||
662 | u16 length, rfd_cleaned = 0; | ||
663 | + int work = 0; | ||
664 | |||
665 | - while (budget > 0) { | ||
666 | + while (work < budget) { | ||
667 | rrd = &rxq->rrd[rxq->rrd_read_idx]; | ||
668 | if (!(rrd->word3 & cpu_to_le32(1 << RRD_UPDATED_SHIFT))) | ||
669 | break; | ||
670 | @@ -203,7 +204,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
671 | ALX_GET_FIELD(le32_to_cpu(rrd->word0), | ||
672 | RRD_NOR) != 1) { | ||
673 | alx_schedule_reset(alx); | ||
674 | - return 0; | ||
675 | + return work; | ||
676 | } | ||
677 | |||
678 | rxb = &rxq->bufs[rxq->read_idx]; | ||
679 | @@ -243,7 +244,7 @@ static bool alx_clean_rx_irq(struct alx_priv *alx, int budget) | ||
680 | } | ||
681 | |||
682 | napi_gro_receive(&alx->napi, skb); | ||
683 | - budget--; | ||
684 | + work++; | ||
685 | |||
686 | next_pkt: | ||
687 | if (++rxq->read_idx == alx->rx_ringsz) | ||
688 | @@ -258,21 +259,22 @@ next_pkt: | ||
689 | if (rfd_cleaned) | ||
690 | alx_refill_rx_ring(alx, GFP_ATOMIC); | ||
691 | |||
692 | - return budget > 0; | ||
693 | + return work; | ||
694 | } | ||
695 | |||
696 | static int alx_poll(struct napi_struct *napi, int budget) | ||
697 | { | ||
698 | struct alx_priv *alx = container_of(napi, struct alx_priv, napi); | ||
699 | struct alx_hw *hw = &alx->hw; | ||
700 | - bool complete = true; | ||
701 | unsigned long flags; | ||
702 | + bool tx_complete; | ||
703 | + int work; | ||
704 | |||
705 | - complete = alx_clean_tx_irq(alx) && | ||
706 | - alx_clean_rx_irq(alx, budget); | ||
707 | + tx_complete = alx_clean_tx_irq(alx); | ||
708 | + work = alx_clean_rx_irq(alx, budget); | ||
709 | |||
710 | - if (!complete) | ||
711 | - return 1; | ||
712 | + if (!tx_complete || work == budget) | ||
713 | + return budget; | ||
714 | |||
715 | napi_complete(&alx->napi); | ||
716 | |||
717 | @@ -284,7 +286,7 @@ static int alx_poll(struct napi_struct *napi, int budget) | ||
718 | |||
719 | alx_post_write(hw); | ||
720 | |||
721 | - return 0; | ||
722 | + return work; | ||
723 | } | ||
724 | |||
725 | static irqreturn_t alx_intr_handle(struct alx_priv *alx, u32 intr) | ||
726 | diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c | ||
727 | index 5501cad30cfa..8c1eab1151b8 100644 | ||
728 | --- a/drivers/net/ethernet/broadcom/tg3.c | ||
729 | +++ b/drivers/net/ethernet/broadcom/tg3.c | ||
730 | @@ -17389,23 +17389,6 @@ static int tg3_init_one(struct pci_dev *pdev, | ||
731 | goto err_out_apeunmap; | ||
732 | } | ||
733 | |||
734 | - /* | ||
735 | - * Reset chip in case UNDI or EFI driver did not shutdown | ||
736 | - * DMA self test will enable WDMAC and we'll see (spurious) | ||
737 | - * pending DMA on the PCI bus at that point. | ||
738 | - */ | ||
739 | - if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) || | ||
740 | - (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { | ||
741 | - tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | ||
742 | - tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | ||
743 | - } | ||
744 | - | ||
745 | - err = tg3_test_dma(tp); | ||
746 | - if (err) { | ||
747 | - dev_err(&pdev->dev, "DMA engine test failed, aborting\n"); | ||
748 | - goto err_out_apeunmap; | ||
749 | - } | ||
750 | - | ||
751 | intmbx = MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW; | ||
752 | rcvmbx = MAILBOX_RCVRET_CON_IDX_0 + TG3_64BIT_REG_LOW; | ||
753 | sndmbx = MAILBOX_SNDHOST_PROD_IDX_0 + TG3_64BIT_REG_LOW; | ||
754 | @@ -17450,6 +17433,23 @@ static int tg3_init_one(struct pci_dev *pdev, | ||
755 | sndmbx += 0xc; | ||
756 | } | ||
757 | |||
758 | + /* | ||
759 | + * Reset chip in case UNDI or EFI driver did not shutdown | ||
760 | + * DMA self test will enable WDMAC and we'll see (spurious) | ||
761 | + * pending DMA on the PCI bus at that point. | ||
762 | + */ | ||
763 | + if ((tr32(HOSTCC_MODE) & HOSTCC_MODE_ENABLE) || | ||
764 | + (tr32(WDMAC_MODE) & WDMAC_MODE_ENABLE)) { | ||
765 | + tw32(MEMARB_MODE, MEMARB_MODE_ENABLE); | ||
766 | + tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); | ||
767 | + } | ||
768 | + | ||
769 | + err = tg3_test_dma(tp); | ||
770 | + if (err) { | ||
771 | + dev_err(&pdev->dev, "DMA engine test failed, aborting\n"); | ||
772 | + goto err_out_apeunmap; | ||
773 | + } | ||
774 | + | ||
775 | tg3_init_coal(tp); | ||
776 | |||
777 | pci_set_drvdata(pdev, dev); | ||
778 | diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
779 | index 635f55992d7e..8cc0eaa9d6f1 100644 | ||
780 | --- a/drivers/net/ethernet/cisco/enic/enic_main.c | ||
781 | +++ b/drivers/net/ethernet/cisco/enic/enic_main.c | ||
782 | @@ -1294,10 +1294,14 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq, | ||
783 | skb_put(skb, bytes_written); | ||
784 | skb->protocol = eth_type_trans(skb, netdev); | ||
785 | |||
786 | - if ((netdev->features & NETIF_F_RXCSUM) && !csum_not_calc) { | ||
787 | - skb->csum = htons(checksum); | ||
788 | - skb->ip_summed = CHECKSUM_COMPLETE; | ||
789 | - } | ||
790 | + /* Hardware does not provide whole packet checksum. It only | ||
791 | + * provides pseudo checksum. Since hw validates the packet | ||
792 | + * checksum but not provide us the checksum value. use | ||
793 | + * CHECSUM_UNNECESSARY. | ||
794 | + */ | ||
795 | + if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok && | ||
796 | + ipv4_csum_ok) | ||
797 | + skb->ip_summed = CHECKSUM_UNNECESSARY; | ||
798 | |||
799 | if (vlan_stripped) | ||
800 | __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vlan_tci); | ||
801 | diff --git a/drivers/platform/x86/hp_accel.c b/drivers/platform/x86/hp_accel.c | ||
802 | index 0ed96df20162..3458eb6fd491 100644 | ||
803 | --- a/drivers/platform/x86/hp_accel.c | ||
804 | +++ b/drivers/platform/x86/hp_accel.c | ||
805 | @@ -237,6 +237,7 @@ static struct dmi_system_id lis3lv02d_dmi_ids[] = { | ||
806 | AXIS_DMI_MATCH("HPB64xx", "HP ProBook 64", xy_swap), | ||
807 | AXIS_DMI_MATCH("HPB64xx", "HP EliteBook 84", xy_swap), | ||
808 | AXIS_DMI_MATCH("HPB65xx", "HP ProBook 65", x_inverted), | ||
809 | + AXIS_DMI_MATCH("HPZBook15", "HP ZBook 15", x_inverted), | ||
810 | { NULL, } | ||
811 | /* Laptop models without axis info (yet): | ||
812 | * "NC6910" "HP Compaq 6910" | ||
813 | diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c | ||
814 | index bb86494e2b7b..19915c5b256f 100644 | ||
815 | --- a/drivers/s390/char/con3215.c | ||
816 | +++ b/drivers/s390/char/con3215.c | ||
817 | @@ -288,12 +288,16 @@ static void raw3215_timeout(unsigned long __data) | ||
818 | unsigned long flags; | ||
819 | |||
820 | spin_lock_irqsave(get_ccwdev_lock(raw->cdev), flags); | ||
821 | - if (raw->flags & RAW3215_TIMER_RUNS) { | ||
822 | - del_timer(&raw->timer); | ||
823 | - raw->flags &= ~RAW3215_TIMER_RUNS; | ||
824 | - if (!(raw->port.flags & ASYNC_SUSPENDED)) { | ||
825 | - raw3215_mk_write_req(raw); | ||
826 | - raw3215_start_io(raw); | ||
827 | + raw->flags &= ~RAW3215_TIMER_RUNS; | ||
828 | + if (!(raw->port.flags & ASYNC_SUSPENDED)) { | ||
829 | + raw3215_mk_write_req(raw); | ||
830 | + raw3215_start_io(raw); | ||
831 | + if ((raw->queued_read || raw->queued_write) && | ||
832 | + !(raw->flags & RAW3215_WORKING) && | ||
833 | + !(raw->flags & RAW3215_TIMER_RUNS)) { | ||
834 | + raw->timer.expires = RAW3215_TIMEOUT + jiffies; | ||
835 | + add_timer(&raw->timer); | ||
836 | + raw->flags |= RAW3215_TIMER_RUNS; | ||
837 | } | ||
838 | } | ||
839 | spin_unlock_irqrestore(get_ccwdev_lock(raw->cdev), flags); | ||
840 | @@ -317,17 +321,15 @@ static inline void raw3215_try_io(struct raw3215_info *raw) | ||
841 | (raw->flags & RAW3215_FLUSHING)) { | ||
842 | /* execute write requests bigger than minimum size */ | ||
843 | raw3215_start_io(raw); | ||
844 | - if (raw->flags & RAW3215_TIMER_RUNS) { | ||
845 | - del_timer(&raw->timer); | ||
846 | - raw->flags &= ~RAW3215_TIMER_RUNS; | ||
847 | - } | ||
848 | - } else if (!(raw->flags & RAW3215_TIMER_RUNS)) { | ||
849 | - /* delay small writes */ | ||
850 | - raw->timer.expires = RAW3215_TIMEOUT + jiffies; | ||
851 | - add_timer(&raw->timer); | ||
852 | - raw->flags |= RAW3215_TIMER_RUNS; | ||
853 | } | ||
854 | } | ||
855 | + if ((raw->queued_read || raw->queued_write) && | ||
856 | + !(raw->flags & RAW3215_WORKING) && | ||
857 | + !(raw->flags & RAW3215_TIMER_RUNS)) { | ||
858 | + raw->timer.expires = RAW3215_TIMEOUT + jiffies; | ||
859 | + add_timer(&raw->timer); | ||
860 | + raw->flags |= RAW3215_TIMER_RUNS; | ||
861 | + } | ||
862 | } | ||
863 | |||
864 | /* | ||
865 | @@ -1027,12 +1029,26 @@ static int tty3215_write(struct tty_struct * tty, | ||
866 | const unsigned char *buf, int count) | ||
867 | { | ||
868 | struct raw3215_info *raw; | ||
869 | + int i, written; | ||
870 | |||
871 | if (!tty) | ||
872 | return 0; | ||
873 | raw = (struct raw3215_info *) tty->driver_data; | ||
874 | - raw3215_write(raw, buf, count); | ||
875 | - return count; | ||
876 | + written = count; | ||
877 | + while (count > 0) { | ||
878 | + for (i = 0; i < count; i++) | ||
879 | + if (buf[i] == '\t' || buf[i] == '\n') | ||
880 | + break; | ||
881 | + raw3215_write(raw, buf, i); | ||
882 | + count -= i; | ||
883 | + buf += i; | ||
884 | + if (count > 0) { | ||
885 | + raw3215_putchar(raw, *buf); | ||
886 | + count--; | ||
887 | + buf++; | ||
888 | + } | ||
889 | + } | ||
890 | + return written; | ||
891 | } | ||
892 | |||
893 | /* | ||
894 | @@ -1180,7 +1196,7 @@ static int __init tty3215_init(void) | ||
895 | driver->subtype = SYSTEM_TYPE_TTY; | ||
896 | driver->init_termios = tty_std_termios; | ||
897 | driver->init_termios.c_iflag = IGNBRK | IGNPAR; | ||
898 | - driver->init_termios.c_oflag = ONLCR | XTABS; | ||
899 | + driver->init_termios.c_oflag = ONLCR; | ||
900 | driver->init_termios.c_lflag = ISIG; | ||
901 | driver->flags = TTY_DRIVER_REAL_RAW; | ||
902 | tty_set_operations(driver, &tty3215_ops); | ||
903 | diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c | ||
904 | index 87ca72d36d5b..a8990783ba66 100644 | ||
905 | --- a/drivers/scsi/storvsc_drv.c | ||
906 | +++ b/drivers/scsi/storvsc_drv.c | ||
907 | @@ -1439,13 +1439,12 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd) | ||
908 | if (ret == -EAGAIN) { | ||
909 | /* no more space */ | ||
910 | |||
911 | - if (cmd_request->bounce_sgl_count) { | ||
912 | + if (cmd_request->bounce_sgl_count) | ||
913 | destroy_bounce_buffer(cmd_request->bounce_sgl, | ||
914 | cmd_request->bounce_sgl_count); | ||
915 | |||
916 | - ret = SCSI_MLQUEUE_DEVICE_BUSY; | ||
917 | - goto queue_error; | ||
918 | - } | ||
919 | + ret = SCSI_MLQUEUE_DEVICE_BUSY; | ||
920 | + goto queue_error; | ||
921 | } | ||
922 | |||
923 | return 0; | ||
924 | diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c | ||
925 | index c9790f6fdd89..016e882356d6 100644 | ||
926 | --- a/drivers/target/iscsi/iscsi_target_util.c | ||
927 | +++ b/drivers/target/iscsi/iscsi_target_util.c | ||
928 | @@ -1349,15 +1349,15 @@ static int iscsit_do_tx_data( | ||
929 | struct iscsi_conn *conn, | ||
930 | struct iscsi_data_count *count) | ||
931 | { | ||
932 | - int data = count->data_length, total_tx = 0, tx_loop = 0, iov_len; | ||
933 | + int ret, iov_len; | ||
934 | struct kvec *iov_p; | ||
935 | struct msghdr msg; | ||
936 | |||
937 | if (!conn || !conn->sock || !conn->conn_ops) | ||
938 | return -1; | ||
939 | |||
940 | - if (data <= 0) { | ||
941 | - pr_err("Data length is: %d\n", data); | ||
942 | + if (count->data_length <= 0) { | ||
943 | + pr_err("Data length is: %d\n", count->data_length); | ||
944 | return -1; | ||
945 | } | ||
946 | |||
947 | @@ -1366,20 +1366,16 @@ static int iscsit_do_tx_data( | ||
948 | iov_p = count->iov; | ||
949 | iov_len = count->iov_count; | ||
950 | |||
951 | - while (total_tx < data) { | ||
952 | - tx_loop = kernel_sendmsg(conn->sock, &msg, iov_p, iov_len, | ||
953 | - (data - total_tx)); | ||
954 | - if (tx_loop <= 0) { | ||
955 | - pr_debug("tx_loop: %d total_tx %d\n", | ||
956 | - tx_loop, total_tx); | ||
957 | - return tx_loop; | ||
958 | - } | ||
959 | - total_tx += tx_loop; | ||
960 | - pr_debug("tx_loop: %d, total_tx: %d, data: %d\n", | ||
961 | - tx_loop, total_tx, data); | ||
962 | + ret = kernel_sendmsg(conn->sock, &msg, iov_p, iov_len, | ||
963 | + count->data_length); | ||
964 | + if (ret != count->data_length) { | ||
965 | + pr_err("Unexpected ret: %d send data %d\n", | ||
966 | + ret, count->data_length); | ||
967 | + return -EPIPE; | ||
968 | } | ||
969 | + pr_debug("ret: %d, sent data: %d\n", ret, count->data_length); | ||
970 | |||
971 | - return total_tx; | ||
972 | + return ret; | ||
973 | } | ||
974 | |||
975 | int rx_data( | ||
976 | diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c | ||
977 | index 8f8e75e392de..87f8fc63b3e1 100644 | ||
978 | --- a/drivers/usb/dwc3/gadget.c | ||
979 | +++ b/drivers/usb/dwc3/gadget.c | ||
980 | @@ -907,8 +907,7 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | ||
981 | |||
982 | if (i == (request->num_mapped_sgs - 1) || | ||
983 | sg_is_last(s)) { | ||
984 | - if (list_is_last(&req->list, | ||
985 | - &dep->request_list)) | ||
986 | + if (list_empty(&dep->request_list)) | ||
987 | last_one = true; | ||
988 | chain = false; | ||
989 | } | ||
990 | @@ -926,6 +925,9 @@ static void dwc3_prepare_trbs(struct dwc3_ep *dep, bool starting) | ||
991 | if (last_one) | ||
992 | break; | ||
993 | } | ||
994 | + | ||
995 | + if (last_one) | ||
996 | + break; | ||
997 | } else { | ||
998 | dma = req->request.dma; | ||
999 | length = req->request.length; | ||
1000 | diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c | ||
1001 | index 9cfe3af3101a..66c905884496 100644 | ||
1002 | --- a/drivers/usb/host/pci-quirks.c | ||
1003 | +++ b/drivers/usb/host/pci-quirks.c | ||
1004 | @@ -470,7 +470,8 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
1005 | { | ||
1006 | void __iomem *base; | ||
1007 | u32 control; | ||
1008 | - u32 fminterval; | ||
1009 | + u32 fminterval = 0; | ||
1010 | + bool no_fminterval = false; | ||
1011 | int cnt; | ||
1012 | |||
1013 | if (!mmio_resource_enabled(pdev, 0)) | ||
1014 | @@ -480,6 +481,13 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
1015 | if (base == NULL) | ||
1016 | return; | ||
1017 | |||
1018 | + /* | ||
1019 | + * ULi M5237 OHCI controller locks the whole system when accessing | ||
1020 | + * the OHCI_FMINTERVAL offset. | ||
1021 | + */ | ||
1022 | + if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237) | ||
1023 | + no_fminterval = true; | ||
1024 | + | ||
1025 | control = readl(base + OHCI_CONTROL); | ||
1026 | |||
1027 | /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ | ||
1028 | @@ -518,7 +526,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
1029 | } | ||
1030 | |||
1031 | /* software reset of the controller, preserving HcFmInterval */ | ||
1032 | - fminterval = readl(base + OHCI_FMINTERVAL); | ||
1033 | + if (!no_fminterval) | ||
1034 | + fminterval = readl(base + OHCI_FMINTERVAL); | ||
1035 | + | ||
1036 | writel(OHCI_HCR, base + OHCI_CMDSTATUS); | ||
1037 | |||
1038 | /* reset requires max 10 us delay */ | ||
1039 | @@ -527,7 +537,9 @@ static void quirk_usb_handoff_ohci(struct pci_dev *pdev) | ||
1040 | break; | ||
1041 | udelay(1); | ||
1042 | } | ||
1043 | - writel(fminterval, base + OHCI_FMINTERVAL); | ||
1044 | + | ||
1045 | + if (!no_fminterval) | ||
1046 | + writel(fminterval, base + OHCI_FMINTERVAL); | ||
1047 | |||
1048 | /* Now the controller is safely in SUSPEND and nothing can wake it up */ | ||
1049 | iounmap(base); | ||
1050 | diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c | ||
1051 | index a24714f6f88f..8e15acd204ef 100644 | ||
1052 | --- a/drivers/usb/serial/cp210x.c | ||
1053 | +++ b/drivers/usb/serial/cp210x.c | ||
1054 | @@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = { | ||
1055 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | ||
1056 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | ||
1057 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | ||
1058 | - { USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */ | ||
1059 | + { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */ | ||
1060 | + { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | ||
1061 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | ||
1062 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | ||
1063 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | ||
1064 | + { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ | ||
1065 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | ||
1066 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | ||
1067 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | ||
1068 | diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c | ||
1069 | index f0e65c970d35..cec377b8bb8b 100644 | ||
1070 | --- a/drivers/usb/serial/keyspan.c | ||
1071 | +++ b/drivers/usb/serial/keyspan.c | ||
1072 | @@ -418,6 +418,8 @@ static void usa26_instat_callback(struct urb *urb) | ||
1073 | } | ||
1074 | port = serial->port[msg->port]; | ||
1075 | p_priv = usb_get_serial_port_data(port); | ||
1076 | + if (!p_priv) | ||
1077 | + goto resubmit; | ||
1078 | |||
1079 | /* Update handshaking pin state information */ | ||
1080 | old_dcd_state = p_priv->dcd_state; | ||
1081 | @@ -428,7 +430,7 @@ static void usa26_instat_callback(struct urb *urb) | ||
1082 | |||
1083 | if (old_dcd_state != p_priv->dcd_state) | ||
1084 | tty_port_tty_hangup(&port->port, true); | ||
1085 | - | ||
1086 | +resubmit: | ||
1087 | /* Resubmit urb so we continue receiving */ | ||
1088 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1089 | if (err != 0) | ||
1090 | @@ -543,6 +545,8 @@ static void usa28_instat_callback(struct urb *urb) | ||
1091 | } | ||
1092 | port = serial->port[msg->port]; | ||
1093 | p_priv = usb_get_serial_port_data(port); | ||
1094 | + if (!p_priv) | ||
1095 | + goto resubmit; | ||
1096 | |||
1097 | /* Update handshaking pin state information */ | ||
1098 | old_dcd_state = p_priv->dcd_state; | ||
1099 | @@ -553,7 +557,7 @@ static void usa28_instat_callback(struct urb *urb) | ||
1100 | |||
1101 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
1102 | tty_port_tty_hangup(&port->port, true); | ||
1103 | - | ||
1104 | +resubmit: | ||
1105 | /* Resubmit urb so we continue receiving */ | ||
1106 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1107 | if (err != 0) | ||
1108 | @@ -630,6 +634,8 @@ static void usa49_instat_callback(struct urb *urb) | ||
1109 | } | ||
1110 | port = serial->port[msg->portNumber]; | ||
1111 | p_priv = usb_get_serial_port_data(port); | ||
1112 | + if (!p_priv) | ||
1113 | + goto resubmit; | ||
1114 | |||
1115 | /* Update handshaking pin state information */ | ||
1116 | old_dcd_state = p_priv->dcd_state; | ||
1117 | @@ -640,7 +646,7 @@ static void usa49_instat_callback(struct urb *urb) | ||
1118 | |||
1119 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
1120 | tty_port_tty_hangup(&port->port, true); | ||
1121 | - | ||
1122 | +resubmit: | ||
1123 | /* Resubmit urb so we continue receiving */ | ||
1124 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1125 | if (err != 0) | ||
1126 | @@ -878,6 +884,8 @@ static void usa90_instat_callback(struct urb *urb) | ||
1127 | |||
1128 | port = serial->port[0]; | ||
1129 | p_priv = usb_get_serial_port_data(port); | ||
1130 | + if (!p_priv) | ||
1131 | + goto resubmit; | ||
1132 | |||
1133 | /* Update handshaking pin state information */ | ||
1134 | old_dcd_state = p_priv->dcd_state; | ||
1135 | @@ -888,7 +896,7 @@ static void usa90_instat_callback(struct urb *urb) | ||
1136 | |||
1137 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
1138 | tty_port_tty_hangup(&port->port, true); | ||
1139 | - | ||
1140 | +resubmit: | ||
1141 | /* Resubmit urb so we continue receiving */ | ||
1142 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1143 | if (err != 0) | ||
1144 | @@ -949,6 +957,8 @@ static void usa67_instat_callback(struct urb *urb) | ||
1145 | |||
1146 | port = serial->port[msg->port]; | ||
1147 | p_priv = usb_get_serial_port_data(port); | ||
1148 | + if (!p_priv) | ||
1149 | + goto resubmit; | ||
1150 | |||
1151 | /* Update handshaking pin state information */ | ||
1152 | old_dcd_state = p_priv->dcd_state; | ||
1153 | @@ -957,7 +967,7 @@ static void usa67_instat_callback(struct urb *urb) | ||
1154 | |||
1155 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | ||
1156 | tty_port_tty_hangup(&port->port, true); | ||
1157 | - | ||
1158 | +resubmit: | ||
1159 | /* Resubmit urb so we continue receiving */ | ||
1160 | err = usb_submit_urb(urb, GFP_ATOMIC); | ||
1161 | if (err != 0) | ||
1162 | diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c | ||
1163 | index ac3725440d64..dc55bc254c5c 100644 | ||
1164 | --- a/drivers/vfio/pci/vfio_pci.c | ||
1165 | +++ b/drivers/vfio/pci/vfio_pci.c | ||
1166 | @@ -519,13 +519,11 @@ static const struct vfio_device_ops vfio_pci_ops = { | ||
1167 | |||
1168 | static int vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) | ||
1169 | { | ||
1170 | - u8 type; | ||
1171 | struct vfio_pci_device *vdev; | ||
1172 | struct iommu_group *group; | ||
1173 | int ret; | ||
1174 | |||
1175 | - pci_read_config_byte(pdev, PCI_HEADER_TYPE, &type); | ||
1176 | - if ((type & PCI_HEADER_TYPE) != PCI_HEADER_TYPE_NORMAL) | ||
1177 | + if (pdev->hdr_type != PCI_HEADER_TYPE_NORMAL) | ||
1178 | return -EINVAL; | ||
1179 | |||
1180 | group = iommu_group_get(&pdev->dev); | ||
1181 | diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c | ||
1182 | index 080c35b34bbb..cc5dbb5b2f71 100644 | ||
1183 | --- a/drivers/video/logo/logo.c | ||
1184 | +++ b/drivers/video/logo/logo.c | ||
1185 | @@ -25,6 +25,21 @@ static bool nologo; | ||
1186 | module_param(nologo, bool, 0); | ||
1187 | MODULE_PARM_DESC(nologo, "Disables startup logo"); | ||
1188 | |||
1189 | +/* | ||
1190 | + * Logos are located in the initdata, and will be freed in kernel_init. | ||
1191 | + * Use late_init to mark the logos as freed to prevent any further use. | ||
1192 | + */ | ||
1193 | + | ||
1194 | +static bool logos_freed; | ||
1195 | + | ||
1196 | +static int __init fb_logo_late_init(void) | ||
1197 | +{ | ||
1198 | + logos_freed = true; | ||
1199 | + return 0; | ||
1200 | +} | ||
1201 | + | ||
1202 | +late_initcall(fb_logo_late_init); | ||
1203 | + | ||
1204 | /* logo's are marked __initdata. Use __init_refok to tell | ||
1205 | * modpost that it is intended that this function uses data | ||
1206 | * marked __initdata. | ||
1207 | @@ -33,7 +48,7 @@ const struct linux_logo * __init_refok fb_find_logo(int depth) | ||
1208 | { | ||
1209 | const struct linux_logo *logo = NULL; | ||
1210 | |||
1211 | - if (nologo) | ||
1212 | + if (nologo || logos_freed) | ||
1213 | return NULL; | ||
1214 | |||
1215 | if (depth >= 1) { | ||
1216 | diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c | ||
1217 | index 9c8a5a6d33df..7a318480ab7a 100644 | ||
1218 | --- a/fs/lockd/svc.c | ||
1219 | +++ b/fs/lockd/svc.c | ||
1220 | @@ -137,10 +137,6 @@ lockd(void *vrqstp) | ||
1221 | |||
1222 | dprintk("NFS locking service started (ver " LOCKD_VERSION ").\n"); | ||
1223 | |||
1224 | - if (!nlm_timeout) | ||
1225 | - nlm_timeout = LOCKD_DFLT_TIMEO; | ||
1226 | - nlmsvc_timeout = nlm_timeout * HZ; | ||
1227 | - | ||
1228 | /* | ||
1229 | * The main request loop. We don't terminate until the last | ||
1230 | * NFS mount or NFS daemon has gone away. | ||
1231 | @@ -346,6 +342,10 @@ static struct svc_serv *lockd_create_svc(void) | ||
1232 | printk(KERN_WARNING | ||
1233 | "lockd_up: no pid, %d users??\n", nlmsvc_users); | ||
1234 | |||
1235 | + if (!nlm_timeout) | ||
1236 | + nlm_timeout = LOCKD_DFLT_TIMEO; | ||
1237 | + nlmsvc_timeout = nlm_timeout * HZ; | ||
1238 | + | ||
1239 | serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, NULL); | ||
1240 | if (!serv) { | ||
1241 | printk(KERN_WARNING "lockd_up: create service failed\n"); | ||
1242 | diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c | ||
1243 | index cc143ee7a56e..519833d0457e 100644 | ||
1244 | --- a/fs/nfs/nfs4client.c | ||
1245 | +++ b/fs/nfs/nfs4client.c | ||
1246 | @@ -394,20 +394,14 @@ static bool nfs4_match_clientids(struct nfs_client *a, struct nfs_client *b) | ||
1247 | } | ||
1248 | |||
1249 | /* | ||
1250 | - * Returns true if the server owners match | ||
1251 | + * Returns true if the server major ids match | ||
1252 | */ | ||
1253 | static bool | ||
1254 | -nfs4_match_serverowners(struct nfs_client *a, struct nfs_client *b) | ||
1255 | +nfs4_check_clientid_trunking(struct nfs_client *a, struct nfs_client *b) | ||
1256 | { | ||
1257 | struct nfs41_server_owner *o1 = a->cl_serverowner; | ||
1258 | struct nfs41_server_owner *o2 = b->cl_serverowner; | ||
1259 | |||
1260 | - if (o1->minor_id != o2->minor_id) { | ||
1261 | - dprintk("NFS: --> %s server owner minor IDs do not match\n", | ||
1262 | - __func__); | ||
1263 | - return false; | ||
1264 | - } | ||
1265 | - | ||
1266 | if (o1->major_id_sz != o2->major_id_sz) | ||
1267 | goto out_major_mismatch; | ||
1268 | if (memcmp(o1->major_id, o2->major_id, o1->major_id_sz) != 0) | ||
1269 | @@ -483,7 +477,12 @@ int nfs41_walk_client_list(struct nfs_client *new, | ||
1270 | if (!nfs4_match_clientids(pos, new)) | ||
1271 | continue; | ||
1272 | |||
1273 | - if (!nfs4_match_serverowners(pos, new)) | ||
1274 | + /* | ||
1275 | + * Note that session trunking is just a special subcase of | ||
1276 | + * client id trunking. In either case, we want to fall back | ||
1277 | + * to using the existing nfs_client. | ||
1278 | + */ | ||
1279 | + if (!nfs4_check_clientid_trunking(pos, new)) | ||
1280 | continue; | ||
1281 | |||
1282 | atomic_inc(&pos->cl_count); | ||
1283 | diff --git a/fs/notify/inode_mark.c b/fs/notify/inode_mark.c | ||
1284 | index 74825be65b7b..fbb9dfb7b1d2 100644 | ||
1285 | --- a/fs/notify/inode_mark.c | ||
1286 | +++ b/fs/notify/inode_mark.c | ||
1287 | @@ -288,20 +288,25 @@ void fsnotify_unmount_inodes(struct list_head *list) | ||
1288 | spin_unlock(&inode->i_lock); | ||
1289 | |||
1290 | /* In case the dropping of a reference would nuke next_i. */ | ||
1291 | - if ((&next_i->i_sb_list != list) && | ||
1292 | - atomic_read(&next_i->i_count)) { | ||
1293 | + while (&next_i->i_sb_list != list) { | ||
1294 | spin_lock(&next_i->i_lock); | ||
1295 | - if (!(next_i->i_state & (I_FREEING | I_WILL_FREE))) { | ||
1296 | + if (!(next_i->i_state & (I_FREEING | I_WILL_FREE)) && | ||
1297 | + atomic_read(&next_i->i_count)) { | ||
1298 | __iget(next_i); | ||
1299 | need_iput = next_i; | ||
1300 | + spin_unlock(&next_i->i_lock); | ||
1301 | + break; | ||
1302 | } | ||
1303 | spin_unlock(&next_i->i_lock); | ||
1304 | + next_i = list_entry(next_i->i_sb_list.next, | ||
1305 | + struct inode, i_sb_list); | ||
1306 | } | ||
1307 | |||
1308 | /* | ||
1309 | - * We can safely drop inode_sb_list_lock here because we hold | ||
1310 | - * references on both inode and next_i. Also no new inodes | ||
1311 | - * will be added since the umount has begun. | ||
1312 | + * We can safely drop inode_sb_list_lock here because either | ||
1313 | + * we actually hold references on both inode and next_i or | ||
1314 | + * end of list. Also no new inodes will be added since the | ||
1315 | + * umount has begun. | ||
1316 | */ | ||
1317 | spin_unlock(&inode_sb_list_lock); | ||
1318 | |||
1319 | diff --git a/lib/decompress_bunzip2.c b/lib/decompress_bunzip2.c | ||
1320 | index 31c5f7675fbf..f504027d66a8 100644 | ||
1321 | --- a/lib/decompress_bunzip2.c | ||
1322 | +++ b/lib/decompress_bunzip2.c | ||
1323 | @@ -184,7 +184,7 @@ static int INIT get_next_block(struct bunzip_data *bd) | ||
1324 | if (get_bits(bd, 1)) | ||
1325 | return RETVAL_OBSOLETE_INPUT; | ||
1326 | origPtr = get_bits(bd, 24); | ||
1327 | - if (origPtr > dbufSize) | ||
1328 | + if (origPtr >= dbufSize) | ||
1329 | return RETVAL_DATA_ERROR; | ||
1330 | /* mapping table: if some byte values are never used (encoding things | ||
1331 | like ascii text), the compression code removes the gaps to have fewer | ||
1332 | diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c | ||
1333 | index 11ef25c9cf43..923146c4f007 100644 | ||
1334 | --- a/net/ipv4/tcp_output.c | ||
1335 | +++ b/net/ipv4/tcp_output.c | ||
1336 | @@ -1862,7 +1862,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1337 | if (unlikely(!tcp_snd_wnd_test(tp, skb, mss_now))) | ||
1338 | break; | ||
1339 | |||
1340 | - if (tso_segs == 1) { | ||
1341 | + if (tso_segs == 1 || !sk->sk_gso_max_segs) { | ||
1342 | if (unlikely(!tcp_nagle_test(tp, skb, mss_now, | ||
1343 | (tcp_skb_is_last(sk, skb) ? | ||
1344 | nonagle : TCP_NAGLE_PUSH)))) | ||
1345 | @@ -1899,7 +1899,7 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | ||
1346 | } | ||
1347 | |||
1348 | limit = mss_now; | ||
1349 | - if (tso_segs > 1 && !tcp_urg_mode(tp)) | ||
1350 | + if (tso_segs > 1 && sk->sk_gso_max_segs && !tcp_urg_mode(tp)) | ||
1351 | limit = tcp_mss_split_point(sk, skb, mss_now, | ||
1352 | min_t(unsigned int, | ||
1353 | cwnd_quota, | ||
1354 | diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c | ||
1355 | index f77139007983..3b04dfd34554 100644 | ||
1356 | --- a/net/netfilter/ipset/ip_set_core.c | ||
1357 | +++ b/net/netfilter/ipset/ip_set_core.c | ||
1358 | @@ -1754,6 +1754,12 @@ ip_set_sockfn_get(struct sock *sk, int optval, void __user *user, int *len) | ||
1359 | if (*op < IP_SET_OP_VERSION) { | ||
1360 | /* Check the version at the beginning of operations */ | ||
1361 | struct ip_set_req_version *req_version = data; | ||
1362 | + | ||
1363 | + if (*len < sizeof(struct ip_set_req_version)) { | ||
1364 | + ret = -EINVAL; | ||
1365 | + goto done; | ||
1366 | + } | ||
1367 | + | ||
1368 | if (req_version->version != IPSET_PROTOCOL) { | ||
1369 | ret = -EPROTO; | ||
1370 | goto done; | ||
1371 | diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c | ||
1372 | index afe41178c9fb..f7ad5c630b65 100644 | ||
1373 | --- a/net/netlink/af_netlink.c | ||
1374 | +++ b/net/netlink/af_netlink.c | ||
1375 | @@ -374,14 +374,14 @@ out: | ||
1376 | return err; | ||
1377 | } | ||
1378 | |||
1379 | -static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr) | ||
1380 | +static void netlink_frame_flush_dcache(const struct nl_mmap_hdr *hdr, unsigned int nm_len) | ||
1381 | { | ||
1382 | #if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE == 1 | ||
1383 | struct page *p_start, *p_end; | ||
1384 | |||
1385 | /* First page is flushed through netlink_{get,set}_status */ | ||
1386 | p_start = pgvec_to_page(hdr + PAGE_SIZE); | ||
1387 | - p_end = pgvec_to_page((void *)hdr + NL_MMAP_HDRLEN + hdr->nm_len - 1); | ||
1388 | + p_end = pgvec_to_page((void *)hdr + NL_MMAP_HDRLEN + nm_len - 1); | ||
1389 | while (p_start <= p_end) { | ||
1390 | flush_dcache_page(p_start); | ||
1391 | p_start++; | ||
1392 | @@ -399,9 +399,9 @@ static enum nl_mmap_status netlink_get_status(const struct nl_mmap_hdr *hdr) | ||
1393 | static void netlink_set_status(struct nl_mmap_hdr *hdr, | ||
1394 | enum nl_mmap_status status) | ||
1395 | { | ||
1396 | + smp_mb(); | ||
1397 | hdr->nm_status = status; | ||
1398 | flush_dcache_page(pgvec_to_page(hdr)); | ||
1399 | - smp_wmb(); | ||
1400 | } | ||
1401 | |||
1402 | static struct nl_mmap_hdr * | ||
1403 | @@ -563,24 +563,16 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg, | ||
1404 | struct nl_mmap_hdr *hdr; | ||
1405 | struct sk_buff *skb; | ||
1406 | unsigned int maxlen; | ||
1407 | - bool excl = true; | ||
1408 | int err = 0, len = 0; | ||
1409 | |||
1410 | - /* Netlink messages are validated by the receiver before processing. | ||
1411 | - * In order to avoid userspace changing the contents of the message | ||
1412 | - * after validation, the socket and the ring may only be used by a | ||
1413 | - * single process, otherwise we fall back to copying. | ||
1414 | - */ | ||
1415 | - if (atomic_long_read(&sk->sk_socket->file->f_count) > 1 || | ||
1416 | - atomic_read(&nlk->mapped) > 1) | ||
1417 | - excl = false; | ||
1418 | - | ||
1419 | mutex_lock(&nlk->pg_vec_lock); | ||
1420 | |||
1421 | ring = &nlk->tx_ring; | ||
1422 | maxlen = ring->frame_size - NL_MMAP_HDRLEN; | ||
1423 | |||
1424 | do { | ||
1425 | + unsigned int nm_len; | ||
1426 | + | ||
1427 | hdr = netlink_current_frame(ring, NL_MMAP_STATUS_VALID); | ||
1428 | if (hdr == NULL) { | ||
1429 | if (!(msg->msg_flags & MSG_DONTWAIT) && | ||
1430 | @@ -588,35 +580,23 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg, | ||
1431 | schedule(); | ||
1432 | continue; | ||
1433 | } | ||
1434 | - if (hdr->nm_len > maxlen) { | ||
1435 | + | ||
1436 | + nm_len = ACCESS_ONCE(hdr->nm_len); | ||
1437 | + if (nm_len > maxlen) { | ||
1438 | err = -EINVAL; | ||
1439 | goto out; | ||
1440 | } | ||
1441 | |||
1442 | - netlink_frame_flush_dcache(hdr); | ||
1443 | + netlink_frame_flush_dcache(hdr, nm_len); | ||
1444 | |||
1445 | - if (likely(dst_portid == 0 && dst_group == 0 && excl)) { | ||
1446 | - skb = alloc_skb_head(GFP_KERNEL); | ||
1447 | - if (skb == NULL) { | ||
1448 | - err = -ENOBUFS; | ||
1449 | - goto out; | ||
1450 | - } | ||
1451 | - sock_hold(sk); | ||
1452 | - netlink_ring_setup_skb(skb, sk, ring, hdr); | ||
1453 | - NETLINK_CB(skb).flags |= NETLINK_SKB_TX; | ||
1454 | - __skb_put(skb, hdr->nm_len); | ||
1455 | - netlink_set_status(hdr, NL_MMAP_STATUS_RESERVED); | ||
1456 | - atomic_inc(&ring->pending); | ||
1457 | - } else { | ||
1458 | - skb = alloc_skb(hdr->nm_len, GFP_KERNEL); | ||
1459 | - if (skb == NULL) { | ||
1460 | - err = -ENOBUFS; | ||
1461 | - goto out; | ||
1462 | - } | ||
1463 | - __skb_put(skb, hdr->nm_len); | ||
1464 | - memcpy(skb->data, (void *)hdr + NL_MMAP_HDRLEN, hdr->nm_len); | ||
1465 | - netlink_set_status(hdr, NL_MMAP_STATUS_UNUSED); | ||
1466 | + skb = alloc_skb(nm_len, GFP_KERNEL); | ||
1467 | + if (skb == NULL) { | ||
1468 | + err = -ENOBUFS; | ||
1469 | + goto out; | ||
1470 | } | ||
1471 | + __skb_put(skb, nm_len); | ||
1472 | + memcpy(skb->data, (void *)hdr + NL_MMAP_HDRLEN, nm_len); | ||
1473 | + netlink_set_status(hdr, NL_MMAP_STATUS_UNUSED); | ||
1474 | |||
1475 | netlink_increment_head(ring); | ||
1476 | |||
1477 | @@ -662,7 +642,7 @@ static void netlink_queue_mmaped_skb(struct sock *sk, struct sk_buff *skb) | ||
1478 | hdr->nm_pid = NETLINK_CB(skb).creds.pid; | ||
1479 | hdr->nm_uid = from_kuid(sk_user_ns(sk), NETLINK_CB(skb).creds.uid); | ||
1480 | hdr->nm_gid = from_kgid(sk_user_ns(sk), NETLINK_CB(skb).creds.gid); | ||
1481 | - netlink_frame_flush_dcache(hdr); | ||
1482 | + netlink_frame_flush_dcache(hdr, hdr->nm_len); | ||
1483 | netlink_set_status(hdr, NL_MMAP_STATUS_VALID); | ||
1484 | |||
1485 | NETLINK_CB(skb).flags |= NETLINK_SKB_DELIVERED; | ||
1486 | diff --git a/net/wireless/chan.c b/net/wireless/chan.c | ||
1487 | index fd556ac05fdb..e69a17da1e84 100644 | ||
1488 | --- a/net/wireless/chan.c | ||
1489 | +++ b/net/wireless/chan.c | ||
1490 | @@ -338,7 +338,7 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
1491 | { | ||
1492 | struct ieee80211_sta_ht_cap *ht_cap; | ||
1493 | struct ieee80211_sta_vht_cap *vht_cap; | ||
1494 | - u32 width, control_freq; | ||
1495 | + u32 width, control_freq, cap; | ||
1496 | |||
1497 | if (WARN_ON(!cfg80211_chandef_valid(chandef))) | ||
1498 | return false; | ||
1499 | @@ -370,7 +370,8 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
1500 | return false; | ||
1501 | break; | ||
1502 | case NL80211_CHAN_WIDTH_80P80: | ||
1503 | - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)) | ||
1504 | + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; | ||
1505 | + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) | ||
1506 | return false; | ||
1507 | case NL80211_CHAN_WIDTH_80: | ||
1508 | if (!vht_cap->vht_supported) | ||
1509 | @@ -381,7 +382,9 @@ bool cfg80211_chandef_usable(struct wiphy *wiphy, | ||
1510 | case NL80211_CHAN_WIDTH_160: | ||
1511 | if (!vht_cap->vht_supported) | ||
1512 | return false; | ||
1513 | - if (!(vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ)) | ||
1514 | + cap = vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK; | ||
1515 | + if (cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ && | ||
1516 | + cap != IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) | ||
1517 | return false; | ||
1518 | prohibited_flags |= IEEE80211_CHAN_NO_160MHZ; | ||
1519 | width = 160; |