Contents of /trunk/kernel-magellan/patches-3.14/0102-3.14.3-all-fixes.patch
Parent Directory | Revision Log
Revision 2437 -
(show annotations)
(download)
Thu Jun 5 08:04:56 2014 UTC (10 years, 3 months ago) by niro
File size: 201774 byte(s)
Thu Jun 5 08:04:56 2014 UTC (10 years, 3 months ago) by niro
File size: 201774 byte(s)
-linux-3.14.5
1 | diff --git a/Documentation/devicetree/bindings/spi/efm32-spi.txt b/Documentation/devicetree/bindings/spi/efm32-spi.txt |
2 | index a590ca51be75..f762e11bfe11 100644 |
3 | --- a/Documentation/devicetree/bindings/spi/efm32-spi.txt |
4 | +++ b/Documentation/devicetree/bindings/spi/efm32-spi.txt |
5 | @@ -3,7 +3,7 @@ |
6 | Required properties: |
7 | - #address-cells: see spi-bus.txt |
8 | - #size-cells: see spi-bus.txt |
9 | -- compatible: should be "efm32,spi" |
10 | +- compatible: should be "energymicro,efm32-spi" |
11 | - reg: Offset and length of the register set for the controller |
12 | - interrupts: pair specifying rx and tx irq |
13 | - clocks: phandle to the spi clock |
14 | @@ -15,7 +15,7 @@ Example: |
15 | spi1: spi@0x4000c400 { /* USART1 */ |
16 | #address-cells = <1>; |
17 | #size-cells = <0>; |
18 | - compatible = "efm32,spi"; |
19 | + compatible = "energymicro,efm32-spi"; |
20 | reg = <0x4000c400 0x400>; |
21 | interrupts = <15 16>; |
22 | clocks = <&cmu 20>; |
23 | diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt |
24 | index e55124e7c40c..855d9b37bf76 100644 |
25 | --- a/Documentation/sysctl/kernel.txt |
26 | +++ b/Documentation/sysctl/kernel.txt |
27 | @@ -317,6 +317,7 @@ for more than this value report a warning. |
28 | This file shows up if CONFIG_DETECT_HUNG_TASK is enabled. |
29 | |
30 | 0: means infinite timeout - no checking done. |
31 | +Possible values to set are in range {0..LONG_MAX/HZ}. |
32 | |
33 | ============================================================== |
34 | |
35 | diff --git a/Documentation/video4linux/gspca.txt b/Documentation/video4linux/gspca.txt |
36 | index 1e6b6531bbcc..d2ba80bb7af5 100644 |
37 | --- a/Documentation/video4linux/gspca.txt |
38 | +++ b/Documentation/video4linux/gspca.txt |
39 | @@ -55,6 +55,7 @@ zc3xx 0458:700f Genius VideoCam Web V2 |
40 | sonixj 0458:7025 Genius Eye 311Q |
41 | sn9c20x 0458:7029 Genius Look 320s |
42 | sonixj 0458:702e Genius Slim 310 NB |
43 | +sn9c20x 0458:7045 Genius Look 1320 V2 |
44 | sn9c20x 0458:704a Genius Slim 1320 |
45 | sn9c20x 0458:704c Genius i-Look 1321 |
46 | sn9c20x 045e:00f4 LifeCam VX-6000 (SN9C20x + OV9650) |
47 | diff --git a/Makefile b/Makefile |
48 | index b2f7de81e9a2..eed07f3f9308 100644 |
49 | --- a/Makefile |
50 | +++ b/Makefile |
51 | @@ -1,6 +1,6 @@ |
52 | VERSION = 3 |
53 | PATCHLEVEL = 14 |
54 | -SUBLEVEL = 2 |
55 | +SUBLEVEL = 3 |
56 | EXTRAVERSION = |
57 | NAME = Shuffling Zombie Juror |
58 | |
59 | diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig |
60 | index 15949459611f..44298add8a48 100644 |
61 | --- a/arch/arm/Kconfig |
62 | +++ b/arch/arm/Kconfig |
63 | @@ -898,7 +898,7 @@ config ARCH_MULTI_V5 |
64 | bool "ARMv5 based platforms (ARM926T, XSCALE, PJ1, ...)" |
65 | depends on !ARCH_MULTI_V6_V7 |
66 | select ARCH_MULTI_V4_V5 |
67 | - select CPU_ARM926T if (!CPU_ARM946E || CPU_ARM1020 || \ |
68 | + select CPU_ARM926T if !(CPU_ARM946E || CPU_ARM1020 || \ |
69 | CPU_ARM1020E || CPU_ARM1022 || CPU_ARM1026 || \ |
70 | CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_FEROCEON) |
71 | |
72 | diff --git a/arch/arm/boot/dts/am335x-bone-common.dtsi b/arch/arm/boot/dts/am335x-bone-common.dtsi |
73 | index e3f27ec31718..2e7d932887b5 100644 |
74 | --- a/arch/arm/boot/dts/am335x-bone-common.dtsi |
75 | +++ b/arch/arm/boot/dts/am335x-bone-common.dtsi |
76 | @@ -183,7 +183,7 @@ |
77 | &usb { |
78 | status = "okay"; |
79 | |
80 | - control@44e10000 { |
81 | + control@44e10620 { |
82 | status = "okay"; |
83 | }; |
84 | |
85 | @@ -204,7 +204,7 @@ |
86 | dr_mode = "host"; |
87 | }; |
88 | |
89 | - dma-controller@07402000 { |
90 | + dma-controller@47402000 { |
91 | status = "okay"; |
92 | }; |
93 | }; |
94 | diff --git a/arch/arm/boot/dts/am335x-evm.dts b/arch/arm/boot/dts/am335x-evm.dts |
95 | index 7e6c64ed966d..801055a42998 100644 |
96 | --- a/arch/arm/boot/dts/am335x-evm.dts |
97 | +++ b/arch/arm/boot/dts/am335x-evm.dts |
98 | @@ -325,7 +325,7 @@ |
99 | &usb { |
100 | status = "okay"; |
101 | |
102 | - control@44e10000 { |
103 | + control@44e10620 { |
104 | status = "okay"; |
105 | }; |
106 | |
107 | @@ -346,7 +346,7 @@ |
108 | dr_mode = "host"; |
109 | }; |
110 | |
111 | - dma-controller@07402000 { |
112 | + dma-controller@47402000 { |
113 | status = "okay"; |
114 | }; |
115 | }; |
116 | diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts |
117 | index 486880b74831..dd142bc677ca 100644 |
118 | --- a/arch/arm/boot/dts/am335x-evmsk.dts |
119 | +++ b/arch/arm/boot/dts/am335x-evmsk.dts |
120 | @@ -334,7 +334,7 @@ |
121 | &usb { |
122 | status = "okay"; |
123 | |
124 | - control@44e10000 { |
125 | + control@44e10620 { |
126 | status = "okay"; |
127 | }; |
128 | |
129 | diff --git a/arch/arm/boot/dts/am335x-igep0033.dtsi b/arch/arm/boot/dts/am335x-igep0033.dtsi |
130 | index 7063311a58d9..5942e7dab94f 100644 |
131 | --- a/arch/arm/boot/dts/am335x-igep0033.dtsi |
132 | +++ b/arch/arm/boot/dts/am335x-igep0033.dtsi |
133 | @@ -202,7 +202,7 @@ |
134 | &usb { |
135 | status = "okay"; |
136 | |
137 | - control@44e10000 { |
138 | + control@44e10620 { |
139 | status = "okay"; |
140 | }; |
141 | |
142 | @@ -223,7 +223,7 @@ |
143 | dr_mode = "host"; |
144 | }; |
145 | |
146 | - dma-controller@07402000 { |
147 | + dma-controller@47402000 { |
148 | status = "okay"; |
149 | }; |
150 | }; |
151 | diff --git a/arch/arm/boot/dts/am33xx.dtsi b/arch/arm/boot/dts/am33xx.dtsi |
152 | index 6d95d3df33c7..79087ccf64bc 100644 |
153 | --- a/arch/arm/boot/dts/am33xx.dtsi |
154 | +++ b/arch/arm/boot/dts/am33xx.dtsi |
155 | @@ -448,7 +448,7 @@ |
156 | ti,hwmods = "usb_otg_hs"; |
157 | status = "disabled"; |
158 | |
159 | - usb_ctrl_mod: control@44e10000 { |
160 | + usb_ctrl_mod: control@44e10620 { |
161 | compatible = "ti,am335x-usb-ctrl-module"; |
162 | reg = <0x44e10620 0x10 |
163 | 0x44e10648 0x4>; |
164 | @@ -551,7 +551,7 @@ |
165 | "tx14", "tx15"; |
166 | }; |
167 | |
168 | - cppi41dma: dma-controller@07402000 { |
169 | + cppi41dma: dma-controller@47402000 { |
170 | compatible = "ti,am3359-cppi41"; |
171 | reg = <0x47400000 0x1000 |
172 | 0x47402000 0x1000 |
173 | diff --git a/arch/arm/boot/dts/armada-370-xp.dtsi b/arch/arm/boot/dts/armada-370-xp.dtsi |
174 | index 74b5964430ac..e5d4902c630f 100644 |
175 | --- a/arch/arm/boot/dts/armada-370-xp.dtsi |
176 | +++ b/arch/arm/boot/dts/armada-370-xp.dtsi |
177 | @@ -226,6 +226,7 @@ |
178 | #size-cells = <0>; |
179 | compatible = "marvell,orion-mdio"; |
180 | reg = <0x72004 0x4>; |
181 | + clocks = <&gateclk 4>; |
182 | }; |
183 | |
184 | eth1: ethernet@74000 { |
185 | diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts |
186 | index b42e658876e5..457112d659ea 100644 |
187 | --- a/arch/arm/boot/dts/exynos5250-arndale.dts |
188 | +++ b/arch/arm/boot/dts/exynos5250-arndale.dts |
189 | @@ -287,6 +287,7 @@ |
190 | regulator-name = "vdd_g3d"; |
191 | regulator-min-microvolt = <1000000>; |
192 | regulator-max-microvolt = <1000000>; |
193 | + regulator-always-on; |
194 | regulator-boot-on; |
195 | op_mode = <1>; |
196 | }; |
197 | diff --git a/arch/arm/boot/dts/omap4.dtsi b/arch/arm/boot/dts/omap4.dtsi |
198 | index d3f8a6e8ca20..69409f7e05dc 100644 |
199 | --- a/arch/arm/boot/dts/omap4.dtsi |
200 | +++ b/arch/arm/boot/dts/omap4.dtsi |
201 | @@ -275,6 +275,8 @@ |
202 | gpmc,num-waitpins = <4>; |
203 | ti,hwmods = "gpmc"; |
204 | ti,no-idle-on-init; |
205 | + clocks = <&l3_div_ck>; |
206 | + clock-names = "fck"; |
207 | }; |
208 | |
209 | uart1: serial@4806a000 { |
210 | diff --git a/arch/arm/boot/dts/omap5.dtsi b/arch/arm/boot/dts/omap5.dtsi |
211 | index a72813a9663e..7a16647c76f4 100644 |
212 | --- a/arch/arm/boot/dts/omap5.dtsi |
213 | +++ b/arch/arm/boot/dts/omap5.dtsi |
214 | @@ -302,6 +302,8 @@ |
215 | gpmc,num-cs = <8>; |
216 | gpmc,num-waitpins = <4>; |
217 | ti,hwmods = "gpmc"; |
218 | + clocks = <&l3_iclk_div>; |
219 | + clock-names = "fck"; |
220 | }; |
221 | |
222 | i2c1: i2c@48070000 { |
223 | diff --git a/arch/arm/boot/dts/tegra124.dtsi b/arch/arm/boot/dts/tegra124.dtsi |
224 | index ec0698a8354a..9c2ba74a8b60 100644 |
225 | --- a/arch/arm/boot/dts/tegra124.dtsi |
226 | +++ b/arch/arm/boot/dts/tegra124.dtsi |
227 | @@ -164,19 +164,6 @@ |
228 | status = "disabled"; |
229 | }; |
230 | |
231 | - serial@70006400 { |
232 | - compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; |
233 | - reg = <0x70006400 0x40>; |
234 | - reg-shift = <2>; |
235 | - interrupts = <GIC_SPI 91 IRQ_TYPE_LEVEL_HIGH>; |
236 | - clocks = <&tegra_car TEGRA124_CLK_UARTE>; |
237 | - resets = <&tegra_car 66>; |
238 | - reset-names = "serial"; |
239 | - dmas = <&apbdma 20>, <&apbdma 20>; |
240 | - dma-names = "rx", "tx"; |
241 | - status = "disabled"; |
242 | - }; |
243 | - |
244 | pwm@7000a000 { |
245 | compatible = "nvidia,tegra124-pwm", "nvidia,tegra20-pwm"; |
246 | reg = <0x7000a000 0x100>; |
247 | diff --git a/arch/arm/include/asm/div64.h b/arch/arm/include/asm/div64.h |
248 | index 191ada6e4d2d..662c7bd06108 100644 |
249 | --- a/arch/arm/include/asm/div64.h |
250 | +++ b/arch/arm/include/asm/div64.h |
251 | @@ -156,7 +156,7 @@ |
252 | /* Select the best insn combination to perform the */ \ |
253 | /* actual __m * __n / (__p << 64) operation. */ \ |
254 | if (!__c) { \ |
255 | - asm ( "umull %Q0, %R0, %1, %Q2\n\t" \ |
256 | + asm ( "umull %Q0, %R0, %Q1, %Q2\n\t" \ |
257 | "mov %Q0, #0" \ |
258 | : "=&r" (__res) \ |
259 | : "r" (__m), "r" (__n) \ |
260 | diff --git a/arch/arm/include/asm/futex.h b/arch/arm/include/asm/futex.h |
261 | index e42cf597f6e6..2aff798fbef4 100644 |
262 | --- a/arch/arm/include/asm/futex.h |
263 | +++ b/arch/arm/include/asm/futex.h |
264 | @@ -3,11 +3,6 @@ |
265 | |
266 | #ifdef __KERNEL__ |
267 | |
268 | -#if defined(CONFIG_CPU_USE_DOMAINS) && defined(CONFIG_SMP) |
269 | -/* ARM doesn't provide unprivileged exclusive memory accessors */ |
270 | -#include <asm-generic/futex.h> |
271 | -#else |
272 | - |
273 | #include <linux/futex.h> |
274 | #include <linux/uaccess.h> |
275 | #include <asm/errno.h> |
276 | @@ -164,6 +159,5 @@ futex_atomic_op_inuser (int encoded_op, u32 __user *uaddr) |
277 | return ret; |
278 | } |
279 | |
280 | -#endif /* !(CPU_USE_DOMAINS && SMP) */ |
281 | #endif /* __KERNEL__ */ |
282 | #endif /* _ASM_ARM_FUTEX_H */ |
283 | diff --git a/arch/arm/include/asm/pgtable-2level.h b/arch/arm/include/asm/pgtable-2level.h |
284 | index dfff709fda3c..219ac88a9542 100644 |
285 | --- a/arch/arm/include/asm/pgtable-2level.h |
286 | +++ b/arch/arm/include/asm/pgtable-2level.h |
287 | @@ -140,6 +140,7 @@ |
288 | #define L_PTE_MT_DEV_NONSHARED (_AT(pteval_t, 0x0c) << 2) /* 1100 */ |
289 | #define L_PTE_MT_DEV_WC (_AT(pteval_t, 0x09) << 2) /* 1001 */ |
290 | #define L_PTE_MT_DEV_CACHED (_AT(pteval_t, 0x0b) << 2) /* 1011 */ |
291 | +#define L_PTE_MT_VECTORS (_AT(pteval_t, 0x0f) << 2) /* 1111 */ |
292 | #define L_PTE_MT_MASK (_AT(pteval_t, 0x0f) << 2) |
293 | |
294 | #ifndef __ASSEMBLY__ |
295 | diff --git a/arch/arm/include/asm/unistd.h b/arch/arm/include/asm/unistd.h |
296 | index acabef1a75df..43876245fc57 100644 |
297 | --- a/arch/arm/include/asm/unistd.h |
298 | +++ b/arch/arm/include/asm/unistd.h |
299 | @@ -48,6 +48,5 @@ |
300 | */ |
301 | #define __IGNORE_fadvise64_64 |
302 | #define __IGNORE_migrate_pages |
303 | -#define __IGNORE_kcmp |
304 | |
305 | #endif /* __ASM_ARM_UNISTD_H */ |
306 | diff --git a/arch/arm/kernel/machine_kexec.c b/arch/arm/kernel/machine_kexec.c |
307 | index f0d180d8b29f..8cf0996aa1a8 100644 |
308 | --- a/arch/arm/kernel/machine_kexec.c |
309 | +++ b/arch/arm/kernel/machine_kexec.c |
310 | @@ -184,3 +184,10 @@ void machine_kexec(struct kimage *image) |
311 | |
312 | soft_restart(reboot_entry_phys); |
313 | } |
314 | + |
315 | +void arch_crash_save_vmcoreinfo(void) |
316 | +{ |
317 | +#ifdef CONFIG_ARM_LPAE |
318 | + VMCOREINFO_CONFIG(ARM_LPAE); |
319 | +#endif |
320 | +} |
321 | diff --git a/arch/arm/mach-omap2/irq.c b/arch/arm/mach-omap2/irq.c |
322 | index e022a869bff2..6037a9a01ed5 100644 |
323 | --- a/arch/arm/mach-omap2/irq.c |
324 | +++ b/arch/arm/mach-omap2/irq.c |
325 | @@ -222,6 +222,7 @@ void __init ti81xx_init_irq(void) |
326 | static inline void omap_intc_handle_irq(void __iomem *base_addr, struct pt_regs *regs) |
327 | { |
328 | u32 irqnr; |
329 | + int handled_irq = 0; |
330 | |
331 | do { |
332 | irqnr = readl_relaxed(base_addr + 0x98); |
333 | @@ -249,8 +250,15 @@ out: |
334 | if (irqnr) { |
335 | irqnr = irq_find_mapping(domain, irqnr); |
336 | handle_IRQ(irqnr, regs); |
337 | + handled_irq = 1; |
338 | } |
339 | } while (irqnr); |
340 | + |
341 | + /* If an irq is masked or deasserted while active, we will |
342 | + * keep ending up here with no irq handled. So remove it from |
343 | + * the INTC with an ack.*/ |
344 | + if (!handled_irq) |
345 | + omap_ack_irq(NULL); |
346 | } |
347 | |
348 | asmlinkage void __exception_irq_entry omap2_intc_handle_irq(struct pt_regs *regs) |
349 | diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c |
350 | index 1f33f5db10d5..66c60fe1104c 100644 |
351 | --- a/arch/arm/mach-omap2/omap_hwmod.c |
352 | +++ b/arch/arm/mach-omap2/omap_hwmod.c |
353 | @@ -2546,11 +2546,12 @@ static int __init _init(struct omap_hwmod *oh, void *data) |
354 | return -EINVAL; |
355 | } |
356 | |
357 | - if (np) |
358 | + if (np) { |
359 | if (of_find_property(np, "ti,no-reset-on-init", NULL)) |
360 | oh->flags |= HWMOD_INIT_NO_RESET; |
361 | if (of_find_property(np, "ti,no-idle-on-init", NULL)) |
362 | oh->flags |= HWMOD_INIT_NO_IDLE; |
363 | + } |
364 | |
365 | oh->_state = _HWMOD_STATE_INITIALIZED; |
366 | |
367 | diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
368 | index 4c3b1e6df508..ea4643abbe61 100644 |
369 | --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
370 | +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |
371 | @@ -1968,7 +1968,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_host_hs_irqs[] = { |
372 | static struct omap_hwmod omap3xxx_usb_host_hs_hwmod = { |
373 | .name = "usb_host_hs", |
374 | .class = &omap3xxx_usb_host_hs_hwmod_class, |
375 | - .clkdm_name = "l3_init_clkdm", |
376 | + .clkdm_name = "usbhost_clkdm", |
377 | .mpu_irqs = omap3xxx_usb_host_hs_irqs, |
378 | .main_clk = "usbhost_48m_fck", |
379 | .prcm = { |
380 | @@ -2053,7 +2053,7 @@ static struct omap_hwmod_irq_info omap3xxx_usb_tll_hs_irqs[] = { |
381 | static struct omap_hwmod omap3xxx_usb_tll_hs_hwmod = { |
382 | .name = "usb_tll_hs", |
383 | .class = &omap3xxx_usb_tll_hs_hwmod_class, |
384 | - .clkdm_name = "l3_init_clkdm", |
385 | + .clkdm_name = "core_l4_clkdm", |
386 | .mpu_irqs = omap3xxx_usb_tll_hs_irqs, |
387 | .main_clk = "usbtll_fck", |
388 | .prcm = { |
389 | diff --git a/arch/arm/mach-omap2/pm.h b/arch/arm/mach-omap2/pm.h |
390 | index 7bdd22afce69..d4d0fce325c7 100644 |
391 | --- a/arch/arm/mach-omap2/pm.h |
392 | +++ b/arch/arm/mach-omap2/pm.h |
393 | @@ -103,7 +103,7 @@ static inline void enable_omap3630_toggle_l2_on_restore(void) { } |
394 | |
395 | #define PM_OMAP4_ROM_SMP_BOOT_ERRATUM_GICD (1 << 0) |
396 | |
397 | -#if defined(CONFIG_ARCH_OMAP4) |
398 | +#if defined(CONFIG_PM) && defined(CONFIG_ARCH_OMAP4) |
399 | extern u16 pm44xx_errata; |
400 | #define IS_PM44XX_ERRATUM(id) (pm44xx_errata & (id)) |
401 | #else |
402 | diff --git a/arch/arm/mach-pxa/include/mach/hx4700.h b/arch/arm/mach-pxa/include/mach/hx4700.h |
403 | index 8bc02913517c..0e1bb46264f9 100644 |
404 | --- a/arch/arm/mach-pxa/include/mach/hx4700.h |
405 | +++ b/arch/arm/mach-pxa/include/mach/hx4700.h |
406 | @@ -14,6 +14,7 @@ |
407 | |
408 | #include <linux/gpio.h> |
409 | #include <linux/mfd/asic3.h> |
410 | +#include "irqs.h" /* PXA_NR_BUILTIN_GPIO */ |
411 | |
412 | #define HX4700_ASIC3_GPIO_BASE PXA_NR_BUILTIN_GPIO |
413 | #define HX4700_EGPIO_BASE (HX4700_ASIC3_GPIO_BASE + ASIC3_NUM_GPIOS) |
414 | diff --git a/arch/arm/mm/Kconfig b/arch/arm/mm/Kconfig |
415 | index 1f8fed94c2a4..ca8ecdee47d8 100644 |
416 | --- a/arch/arm/mm/Kconfig |
417 | +++ b/arch/arm/mm/Kconfig |
418 | @@ -446,7 +446,6 @@ config CPU_32v5 |
419 | |
420 | config CPU_32v6 |
421 | bool |
422 | - select CPU_USE_DOMAINS if CPU_V6 && MMU |
423 | select TLS_REG_EMUL if !CPU_32v6K && !MMU |
424 | |
425 | config CPU_32v6K |
426 | @@ -671,7 +670,7 @@ config ARM_VIRT_EXT |
427 | |
428 | config SWP_EMULATE |
429 | bool "Emulate SWP/SWPB instructions" |
430 | - depends on !CPU_USE_DOMAINS && CPU_V7 |
431 | + depends on CPU_V7 |
432 | default y if SMP |
433 | select HAVE_PROC_CPU if PROC_FS |
434 | help |
435 | diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c |
436 | index a623cb3ad012..b68c6b22e1c8 100644 |
437 | --- a/arch/arm/mm/mmu.c |
438 | +++ b/arch/arm/mm/mmu.c |
439 | @@ -516,6 +516,16 @@ static void __init build_mem_type_table(void) |
440 | s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2; |
441 | |
442 | /* |
443 | + * We don't use domains on ARMv6 (since this causes problems with |
444 | + * v6/v7 kernels), so we must use a separate memory type for user |
445 | + * r/o, kernel r/w to map the vectors page. |
446 | + */ |
447 | +#ifndef CONFIG_ARM_LPAE |
448 | + if (cpu_arch == CPU_ARCH_ARMv6) |
449 | + vecs_pgprot |= L_PTE_MT_VECTORS; |
450 | +#endif |
451 | + |
452 | + /* |
453 | * ARMv6 and above have extended page tables. |
454 | */ |
455 | if (cpu_arch >= CPU_ARCH_ARMv6 && (cr & CR_XP)) { |
456 | diff --git a/arch/arm/mm/proc-macros.S b/arch/arm/mm/proc-macros.S |
457 | index e3c48a3fe063..ee1d80593958 100644 |
458 | --- a/arch/arm/mm/proc-macros.S |
459 | +++ b/arch/arm/mm/proc-macros.S |
460 | @@ -112,13 +112,9 @@ |
461 | * 100x 1 0 1 r/o no acc |
462 | * 10x0 1 0 1 r/o no acc |
463 | * 1011 0 0 1 r/w no acc |
464 | - * 110x 0 1 0 r/w r/o |
465 | - * 11x0 0 1 0 r/w r/o |
466 | - * 1111 0 1 1 r/w r/w |
467 | - * |
468 | - * If !CONFIG_CPU_USE_DOMAINS, the following permissions are changed: |
469 | * 110x 1 1 1 r/o r/o |
470 | * 11x0 1 1 1 r/o r/o |
471 | + * 1111 0 1 1 r/w r/w |
472 | */ |
473 | .macro armv6_mt_table pfx |
474 | \pfx\()_mt_table: |
475 | @@ -137,7 +133,7 @@ |
476 | .long PTE_EXT_TEX(2) @ L_PTE_MT_DEV_NONSHARED |
477 | .long 0x00 @ unused |
478 | .long 0x00 @ unused |
479 | - .long 0x00 @ unused |
480 | + .long PTE_CACHEABLE | PTE_BUFFERABLE | PTE_EXT_APX @ L_PTE_MT_VECTORS |
481 | .endm |
482 | |
483 | .macro armv6_set_pte_ext pfx |
484 | @@ -158,24 +154,21 @@ |
485 | |
486 | tst r1, #L_PTE_USER |
487 | orrne r3, r3, #PTE_EXT_AP1 |
488 | -#ifdef CONFIG_CPU_USE_DOMAINS |
489 | - @ allow kernel read/write access to read-only user pages |
490 | tstne r3, #PTE_EXT_APX |
491 | - bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 |
492 | -#endif |
493 | + |
494 | + @ user read-only -> kernel read-only |
495 | + bicne r3, r3, #PTE_EXT_AP0 |
496 | |
497 | tst r1, #L_PTE_XN |
498 | orrne r3, r3, #PTE_EXT_XN |
499 | |
500 | - orr r3, r3, r2 |
501 | + eor r3, r3, r2 |
502 | |
503 | tst r1, #L_PTE_YOUNG |
504 | tstne r1, #L_PTE_PRESENT |
505 | moveq r3, #0 |
506 | -#ifndef CONFIG_CPU_USE_DOMAINS |
507 | tstne r1, #L_PTE_NONE |
508 | movne r3, #0 |
509 | -#endif |
510 | |
511 | str r3, [r0] |
512 | mcr p15, 0, r0, c7, c10, 1 @ flush_pte |
513 | diff --git a/arch/arm/mm/proc-v7-2level.S b/arch/arm/mm/proc-v7-2level.S |
514 | index bdd3be4be77a..1f52915f2b28 100644 |
515 | --- a/arch/arm/mm/proc-v7-2level.S |
516 | +++ b/arch/arm/mm/proc-v7-2level.S |
517 | @@ -90,21 +90,14 @@ ENTRY(cpu_v7_set_pte_ext) |
518 | |
519 | tst r1, #L_PTE_USER |
520 | orrne r3, r3, #PTE_EXT_AP1 |
521 | -#ifdef CONFIG_CPU_USE_DOMAINS |
522 | - @ allow kernel read/write access to read-only user pages |
523 | - tstne r3, #PTE_EXT_APX |
524 | - bicne r3, r3, #PTE_EXT_APX | PTE_EXT_AP0 |
525 | -#endif |
526 | |
527 | tst r1, #L_PTE_XN |
528 | orrne r3, r3, #PTE_EXT_XN |
529 | |
530 | tst r1, #L_PTE_YOUNG |
531 | tstne r1, #L_PTE_VALID |
532 | -#ifndef CONFIG_CPU_USE_DOMAINS |
533 | eorne r1, r1, #L_PTE_NONE |
534 | tstne r1, #L_PTE_NONE |
535 | -#endif |
536 | moveq r3, #0 |
537 | |
538 | ARM( str r3, [r0, #2048]! ) |
539 | diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h |
540 | index aa3917c8b623..acb17e0d5e24 100644 |
541 | --- a/arch/arm64/include/asm/pgtable.h |
542 | +++ b/arch/arm64/include/asm/pgtable.h |
543 | @@ -199,7 +199,7 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
544 | pte_t *ptep, pte_t pte) |
545 | { |
546 | if (pte_valid_user(pte)) { |
547 | - if (pte_exec(pte)) |
548 | + if (!pte_special(pte) && pte_exec(pte)) |
549 | __sync_icache_dcache(pte, addr); |
550 | if (pte_dirty(pte) && pte_write(pte)) |
551 | pte_val(pte) &= ~PTE_RDONLY; |
552 | @@ -286,11 +286,11 @@ static inline int has_transparent_hugepage(void) |
553 | * Mark the prot value as uncacheable and unbufferable. |
554 | */ |
555 | #define pgprot_noncached(prot) \ |
556 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE)) |
557 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_DEVICE_nGnRnE) | PTE_PXN | PTE_UXN) |
558 | #define pgprot_writecombine(prot) \ |
559 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
560 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN) |
561 | #define pgprot_dmacoherent(prot) \ |
562 | - __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC)) |
563 | + __pgprot_modify(prot, PTE_ATTRINDX_MASK, PTE_ATTRINDX(MT_NORMAL_NC) | PTE_PXN | PTE_UXN) |
564 | #define __HAVE_PHYS_MEM_ACCESS_PROT |
565 | struct file; |
566 | extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn, |
567 | diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h |
568 | index bb8eb8a78e67..faa0e1ce59df 100644 |
569 | --- a/arch/arm64/include/asm/unistd32.h |
570 | +++ b/arch/arm64/include/asm/unistd32.h |
571 | @@ -404,7 +404,7 @@ __SYSCALL(379, sys_finit_module) |
572 | __SYSCALL(380, sys_sched_setattr) |
573 | __SYSCALL(381, sys_sched_getattr) |
574 | |
575 | -#define __NR_compat_syscalls 379 |
576 | +#define __NR_compat_syscalls 382 |
577 | |
578 | /* |
579 | * Compat syscall numbers used by the AArch64 kernel. |
580 | diff --git a/arch/s390/include/asm/atomic.h b/arch/s390/include/asm/atomic.h |
581 | index fa9aaf7144b7..1d4706114a45 100644 |
582 | --- a/arch/s390/include/asm/atomic.h |
583 | +++ b/arch/s390/include/asm/atomic.h |
584 | @@ -15,23 +15,29 @@ |
585 | |
586 | #include <linux/compiler.h> |
587 | #include <linux/types.h> |
588 | +#include <asm/barrier.h> |
589 | #include <asm/cmpxchg.h> |
590 | |
591 | #define ATOMIC_INIT(i) { (i) } |
592 | |
593 | +#define __ATOMIC_NO_BARRIER "\n" |
594 | + |
595 | #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES |
596 | |
597 | #define __ATOMIC_OR "lao" |
598 | #define __ATOMIC_AND "lan" |
599 | #define __ATOMIC_ADD "laa" |
600 | +#define __ATOMIC_BARRIER "bcr 14,0\n" |
601 | |
602 | -#define __ATOMIC_LOOP(ptr, op_val, op_string) \ |
603 | +#define __ATOMIC_LOOP(ptr, op_val, op_string, __barrier) \ |
604 | ({ \ |
605 | int old_val; \ |
606 | \ |
607 | typecheck(atomic_t *, ptr); \ |
608 | asm volatile( \ |
609 | + __barrier \ |
610 | op_string " %0,%2,%1\n" \ |
611 | + __barrier \ |
612 | : "=d" (old_val), "+Q" ((ptr)->counter) \ |
613 | : "d" (op_val) \ |
614 | : "cc", "memory"); \ |
615 | @@ -43,8 +49,9 @@ |
616 | #define __ATOMIC_OR "or" |
617 | #define __ATOMIC_AND "nr" |
618 | #define __ATOMIC_ADD "ar" |
619 | +#define __ATOMIC_BARRIER "\n" |
620 | |
621 | -#define __ATOMIC_LOOP(ptr, op_val, op_string) \ |
622 | +#define __ATOMIC_LOOP(ptr, op_val, op_string, __barrier) \ |
623 | ({ \ |
624 | int old_val, new_val; \ |
625 | \ |
626 | @@ -82,7 +89,7 @@ static inline void atomic_set(atomic_t *v, int i) |
627 | |
628 | static inline int atomic_add_return(int i, atomic_t *v) |
629 | { |
630 | - return __ATOMIC_LOOP(v, i, __ATOMIC_ADD) + i; |
631 | + return __ATOMIC_LOOP(v, i, __ATOMIC_ADD, __ATOMIC_BARRIER) + i; |
632 | } |
633 | |
634 | static inline void atomic_add(int i, atomic_t *v) |
635 | @@ -94,12 +101,10 @@ static inline void atomic_add(int i, atomic_t *v) |
636 | : "+Q" (v->counter) |
637 | : "i" (i) |
638 | : "cc", "memory"); |
639 | - } else { |
640 | - atomic_add_return(i, v); |
641 | + return; |
642 | } |
643 | -#else |
644 | - atomic_add_return(i, v); |
645 | #endif |
646 | + __ATOMIC_LOOP(v, i, __ATOMIC_ADD, __ATOMIC_NO_BARRIER); |
647 | } |
648 | |
649 | #define atomic_add_negative(_i, _v) (atomic_add_return(_i, _v) < 0) |
650 | @@ -115,12 +120,12 @@ static inline void atomic_add(int i, atomic_t *v) |
651 | |
652 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) |
653 | { |
654 | - __ATOMIC_LOOP(v, ~mask, __ATOMIC_AND); |
655 | + __ATOMIC_LOOP(v, ~mask, __ATOMIC_AND, __ATOMIC_NO_BARRIER); |
656 | } |
657 | |
658 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) |
659 | { |
660 | - __ATOMIC_LOOP(v, mask, __ATOMIC_OR); |
661 | + __ATOMIC_LOOP(v, mask, __ATOMIC_OR, __ATOMIC_NO_BARRIER); |
662 | } |
663 | |
664 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
665 | @@ -157,19 +162,24 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) |
666 | |
667 | #ifdef CONFIG_64BIT |
668 | |
669 | +#define __ATOMIC64_NO_BARRIER "\n" |
670 | + |
671 | #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES |
672 | |
673 | #define __ATOMIC64_OR "laog" |
674 | #define __ATOMIC64_AND "lang" |
675 | #define __ATOMIC64_ADD "laag" |
676 | +#define __ATOMIC64_BARRIER "bcr 14,0\n" |
677 | |
678 | -#define __ATOMIC64_LOOP(ptr, op_val, op_string) \ |
679 | +#define __ATOMIC64_LOOP(ptr, op_val, op_string, __barrier) \ |
680 | ({ \ |
681 | long long old_val; \ |
682 | \ |
683 | typecheck(atomic64_t *, ptr); \ |
684 | asm volatile( \ |
685 | + __barrier \ |
686 | op_string " %0,%2,%1\n" \ |
687 | + __barrier \ |
688 | : "=d" (old_val), "+Q" ((ptr)->counter) \ |
689 | : "d" (op_val) \ |
690 | : "cc", "memory"); \ |
691 | @@ -181,8 +191,9 @@ static inline int __atomic_add_unless(atomic_t *v, int a, int u) |
692 | #define __ATOMIC64_OR "ogr" |
693 | #define __ATOMIC64_AND "ngr" |
694 | #define __ATOMIC64_ADD "agr" |
695 | +#define __ATOMIC64_BARRIER "\n" |
696 | |
697 | -#define __ATOMIC64_LOOP(ptr, op_val, op_string) \ |
698 | +#define __ATOMIC64_LOOP(ptr, op_val, op_string, __barrier) \ |
699 | ({ \ |
700 | long long old_val, new_val; \ |
701 | \ |
702 | @@ -220,17 +231,32 @@ static inline void atomic64_set(atomic64_t *v, long long i) |
703 | |
704 | static inline long long atomic64_add_return(long long i, atomic64_t *v) |
705 | { |
706 | - return __ATOMIC64_LOOP(v, i, __ATOMIC64_ADD) + i; |
707 | + return __ATOMIC64_LOOP(v, i, __ATOMIC64_ADD, __ATOMIC64_BARRIER) + i; |
708 | +} |
709 | + |
710 | +static inline void atomic64_add(long long i, atomic64_t *v) |
711 | +{ |
712 | +#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES |
713 | + if (__builtin_constant_p(i) && (i > -129) && (i < 128)) { |
714 | + asm volatile( |
715 | + "agsi %0,%1\n" |
716 | + : "+Q" (v->counter) |
717 | + : "i" (i) |
718 | + : "cc", "memory"); |
719 | + return; |
720 | + } |
721 | +#endif |
722 | + __ATOMIC64_LOOP(v, i, __ATOMIC64_ADD, __ATOMIC64_NO_BARRIER); |
723 | } |
724 | |
725 | static inline void atomic64_clear_mask(unsigned long mask, atomic64_t *v) |
726 | { |
727 | - __ATOMIC64_LOOP(v, ~mask, __ATOMIC64_AND); |
728 | + __ATOMIC64_LOOP(v, ~mask, __ATOMIC64_AND, __ATOMIC64_NO_BARRIER); |
729 | } |
730 | |
731 | static inline void atomic64_set_mask(unsigned long mask, atomic64_t *v) |
732 | { |
733 | - __ATOMIC64_LOOP(v, mask, __ATOMIC64_OR); |
734 | + __ATOMIC64_LOOP(v, mask, __ATOMIC64_OR, __ATOMIC64_NO_BARRIER); |
735 | } |
736 | |
737 | #define atomic64_xchg(v, new) (xchg(&((v)->counter), new)) |
738 | @@ -334,25 +360,13 @@ static inline void atomic64_clear_mask(unsigned long long mask, atomic64_t *v) |
739 | } while (atomic64_cmpxchg(v, old, new) != old); |
740 | } |
741 | |
742 | -#endif /* CONFIG_64BIT */ |
743 | - |
744 | static inline void atomic64_add(long long i, atomic64_t *v) |
745 | { |
746 | -#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES |
747 | - if (__builtin_constant_p(i) && (i > -129) && (i < 128)) { |
748 | - asm volatile( |
749 | - "agsi %0,%1\n" |
750 | - : "+Q" (v->counter) |
751 | - : "i" (i) |
752 | - : "cc", "memory"); |
753 | - } else { |
754 | - atomic64_add_return(i, v); |
755 | - } |
756 | -#else |
757 | atomic64_add_return(i, v); |
758 | -#endif |
759 | } |
760 | |
761 | +#endif /* CONFIG_64BIT */ |
762 | + |
763 | static inline int atomic64_add_unless(atomic64_t *v, long long i, long long u) |
764 | { |
765 | long long c, old; |
766 | diff --git a/arch/s390/include/asm/bitops.h b/arch/s390/include/asm/bitops.h |
767 | index 6e6ad0680829..4e206123b439 100644 |
768 | --- a/arch/s390/include/asm/bitops.h |
769 | +++ b/arch/s390/include/asm/bitops.h |
770 | @@ -47,14 +47,18 @@ |
771 | |
772 | #include <linux/typecheck.h> |
773 | #include <linux/compiler.h> |
774 | +#include <asm/barrier.h> |
775 | + |
776 | +#define __BITOPS_NO_BARRIER "\n" |
777 | |
778 | #ifndef CONFIG_64BIT |
779 | |
780 | #define __BITOPS_OR "or" |
781 | #define __BITOPS_AND "nr" |
782 | #define __BITOPS_XOR "xr" |
783 | +#define __BITOPS_BARRIER "\n" |
784 | |
785 | -#define __BITOPS_LOOP(__addr, __val, __op_string) \ |
786 | +#define __BITOPS_LOOP(__addr, __val, __op_string, __barrier) \ |
787 | ({ \ |
788 | unsigned long __old, __new; \ |
789 | \ |
790 | @@ -67,7 +71,7 @@ |
791 | " jl 0b" \ |
792 | : "=&d" (__old), "=&d" (__new), "+Q" (*(__addr))\ |
793 | : "d" (__val) \ |
794 | - : "cc"); \ |
795 | + : "cc", "memory"); \ |
796 | __old; \ |
797 | }) |
798 | |
799 | @@ -78,17 +82,20 @@ |
800 | #define __BITOPS_OR "laog" |
801 | #define __BITOPS_AND "lang" |
802 | #define __BITOPS_XOR "laxg" |
803 | +#define __BITOPS_BARRIER "bcr 14,0\n" |
804 | |
805 | -#define __BITOPS_LOOP(__addr, __val, __op_string) \ |
806 | +#define __BITOPS_LOOP(__addr, __val, __op_string, __barrier) \ |
807 | ({ \ |
808 | unsigned long __old; \ |
809 | \ |
810 | typecheck(unsigned long *, (__addr)); \ |
811 | asm volatile( \ |
812 | + __barrier \ |
813 | __op_string " %0,%2,%1\n" \ |
814 | + __barrier \ |
815 | : "=d" (__old), "+Q" (*(__addr)) \ |
816 | : "d" (__val) \ |
817 | - : "cc"); \ |
818 | + : "cc", "memory"); \ |
819 | __old; \ |
820 | }) |
821 | |
822 | @@ -97,8 +104,9 @@ |
823 | #define __BITOPS_OR "ogr" |
824 | #define __BITOPS_AND "ngr" |
825 | #define __BITOPS_XOR "xgr" |
826 | +#define __BITOPS_BARRIER "\n" |
827 | |
828 | -#define __BITOPS_LOOP(__addr, __val, __op_string) \ |
829 | +#define __BITOPS_LOOP(__addr, __val, __op_string, __barrier) \ |
830 | ({ \ |
831 | unsigned long __old, __new; \ |
832 | \ |
833 | @@ -111,7 +119,7 @@ |
834 | " jl 0b" \ |
835 | : "=&d" (__old), "=&d" (__new), "+Q" (*(__addr))\ |
836 | : "d" (__val) \ |
837 | - : "cc"); \ |
838 | + : "cc", "memory"); \ |
839 | __old; \ |
840 | }) |
841 | |
842 | @@ -149,12 +157,12 @@ static inline void set_bit(unsigned long nr, volatile unsigned long *ptr) |
843 | "oi %0,%b1\n" |
844 | : "+Q" (*caddr) |
845 | : "i" (1 << (nr & 7)) |
846 | - : "cc"); |
847 | + : "cc", "memory"); |
848 | return; |
849 | } |
850 | #endif |
851 | mask = 1UL << (nr & (BITS_PER_LONG - 1)); |
852 | - __BITOPS_LOOP(addr, mask, __BITOPS_OR); |
853 | + __BITOPS_LOOP(addr, mask, __BITOPS_OR, __BITOPS_NO_BARRIER); |
854 | } |
855 | |
856 | static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr) |
857 | @@ -170,12 +178,12 @@ static inline void clear_bit(unsigned long nr, volatile unsigned long *ptr) |
858 | "ni %0,%b1\n" |
859 | : "+Q" (*caddr) |
860 | : "i" (~(1 << (nr & 7))) |
861 | - : "cc"); |
862 | + : "cc", "memory"); |
863 | return; |
864 | } |
865 | #endif |
866 | mask = ~(1UL << (nr & (BITS_PER_LONG - 1))); |
867 | - __BITOPS_LOOP(addr, mask, __BITOPS_AND); |
868 | + __BITOPS_LOOP(addr, mask, __BITOPS_AND, __BITOPS_NO_BARRIER); |
869 | } |
870 | |
871 | static inline void change_bit(unsigned long nr, volatile unsigned long *ptr) |
872 | @@ -191,12 +199,12 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *ptr) |
873 | "xi %0,%b1\n" |
874 | : "+Q" (*caddr) |
875 | : "i" (1 << (nr & 7)) |
876 | - : "cc"); |
877 | + : "cc", "memory"); |
878 | return; |
879 | } |
880 | #endif |
881 | mask = 1UL << (nr & (BITS_PER_LONG - 1)); |
882 | - __BITOPS_LOOP(addr, mask, __BITOPS_XOR); |
883 | + __BITOPS_LOOP(addr, mask, __BITOPS_XOR, __BITOPS_NO_BARRIER); |
884 | } |
885 | |
886 | static inline int |
887 | @@ -206,8 +214,7 @@ test_and_set_bit(unsigned long nr, volatile unsigned long *ptr) |
888 | unsigned long old, mask; |
889 | |
890 | mask = 1UL << (nr & (BITS_PER_LONG - 1)); |
891 | - old = __BITOPS_LOOP(addr, mask, __BITOPS_OR); |
892 | - barrier(); |
893 | + old = __BITOPS_LOOP(addr, mask, __BITOPS_OR, __BITOPS_BARRIER); |
894 | return (old & mask) != 0; |
895 | } |
896 | |
897 | @@ -218,8 +225,7 @@ test_and_clear_bit(unsigned long nr, volatile unsigned long *ptr) |
898 | unsigned long old, mask; |
899 | |
900 | mask = ~(1UL << (nr & (BITS_PER_LONG - 1))); |
901 | - old = __BITOPS_LOOP(addr, mask, __BITOPS_AND); |
902 | - barrier(); |
903 | + old = __BITOPS_LOOP(addr, mask, __BITOPS_AND, __BITOPS_BARRIER); |
904 | return (old & ~mask) != 0; |
905 | } |
906 | |
907 | @@ -230,8 +236,7 @@ test_and_change_bit(unsigned long nr, volatile unsigned long *ptr) |
908 | unsigned long old, mask; |
909 | |
910 | mask = 1UL << (nr & (BITS_PER_LONG - 1)); |
911 | - old = __BITOPS_LOOP(addr, mask, __BITOPS_XOR); |
912 | - barrier(); |
913 | + old = __BITOPS_LOOP(addr, mask, __BITOPS_XOR, __BITOPS_BARRIER); |
914 | return (old & mask) != 0; |
915 | } |
916 | |
917 | diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h |
918 | index f201af8be580..31b5ca8f8c3d 100644 |
919 | --- a/arch/s390/include/asm/ccwdev.h |
920 | +++ b/arch/s390/include/asm/ccwdev.h |
921 | @@ -219,7 +219,7 @@ extern void ccw_device_get_id(struct ccw_device *, struct ccw_dev_id *); |
922 | #define to_ccwdev(n) container_of(n, struct ccw_device, dev) |
923 | #define to_ccwdrv(n) container_of(n, struct ccw_driver, driver) |
924 | |
925 | -extern struct ccw_device *ccw_device_probe_console(void); |
926 | +extern struct ccw_device *ccw_device_probe_console(struct ccw_driver *); |
927 | extern void ccw_device_wait_idle(struct ccw_device *); |
928 | extern int ccw_device_force_console(struct ccw_device *); |
929 | |
930 | diff --git a/arch/s390/kernel/ptrace.c b/arch/s390/kernel/ptrace.c |
931 | index f6be6087a0e9..a48bc79a111f 100644 |
932 | --- a/arch/s390/kernel/ptrace.c |
933 | +++ b/arch/s390/kernel/ptrace.c |
934 | @@ -64,7 +64,7 @@ void update_cr_regs(struct task_struct *task) |
935 | if (task->thread.per_flags & PER_FLAG_NO_TE) |
936 | cr_new &= ~(1UL << 55); |
937 | if (cr_new != cr) |
938 | - __ctl_load(cr, 0, 0); |
939 | + __ctl_load(cr_new, 0, 0); |
940 | /* Set or clear transaction execution TDC bits 62 and 63. */ |
941 | __ctl_store(cr, 2, 2); |
942 | cr_new = cr & ~3UL; |
943 | diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c |
944 | index e0676f390d57..95f4a976c160 100644 |
945 | --- a/arch/s390/kvm/kvm-s390.c |
946 | +++ b/arch/s390/kvm/kvm-s390.c |
947 | @@ -753,7 +753,8 @@ static int vcpu_post_run(struct kvm_vcpu *vcpu, int exit_reason) |
948 | |
949 | if (rc == 0) { |
950 | if (kvm_is_ucontrol(vcpu->kvm)) |
951 | - rc = -EOPNOTSUPP; |
952 | + /* Don't exit for host interrupts. */ |
953 | + rc = vcpu->arch.sie_block->icptcode ? -EOPNOTSUPP : 0; |
954 | else |
955 | rc = kvm_handle_sie_intercept(vcpu); |
956 | } |
957 | diff --git a/arch/sh/kernel/dumpstack.c b/arch/sh/kernel/dumpstack.c |
958 | index b959f5592604..8dfe645bcc4b 100644 |
959 | --- a/arch/sh/kernel/dumpstack.c |
960 | +++ b/arch/sh/kernel/dumpstack.c |
961 | @@ -115,7 +115,7 @@ static int print_trace_stack(void *data, char *name) |
962 | */ |
963 | static void print_trace_address(void *data, unsigned long addr, int reliable) |
964 | { |
965 | - printk(data); |
966 | + printk("%s", (char *)data); |
967 | printk_address(addr, reliable); |
968 | } |
969 | |
970 | diff --git a/arch/x86/Makefile b/arch/x86/Makefile |
971 | index eeda43abed6e..f8842c444560 100644 |
972 | --- a/arch/x86/Makefile |
973 | +++ b/arch/x86/Makefile |
974 | @@ -152,6 +152,7 @@ cfi-sections := $(call as-instr,.cfi_sections .debug_frame,-DCONFIG_AS_CFI_SECTI |
975 | |
976 | # does binutils support specific instructions? |
977 | asinstr := $(call as-instr,fxsaveq (%rax),-DCONFIG_AS_FXSAVEQ=1) |
978 | +asinstr += $(call as-instr,crc32l %eax$(comma)%eax,-DCONFIG_AS_CRC32=1) |
979 | avx_instr := $(call as-instr,vxorps %ymm0$(comma)%ymm1$(comma)%ymm2,-DCONFIG_AS_AVX=1) |
980 | avx2_instr :=$(call as-instr,vpbroadcastb %xmm0$(comma)%ymm1,-DCONFIG_AS_AVX2=1) |
981 | |
982 | diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c |
983 | index a7677babf946..78cbb2db5a85 100644 |
984 | --- a/arch/x86/boot/compressed/eboot.c |
985 | +++ b/arch/x86/boot/compressed/eboot.c |
986 | @@ -425,6 +425,9 @@ void setup_graphics(struct boot_params *boot_params) |
987 | * Because the x86 boot code expects to be passed a boot_params we |
988 | * need to create one ourselves (usually the bootloader would create |
989 | * one for us). |
990 | + * |
991 | + * The caller is responsible for filling out ->code32_start in the |
992 | + * returned boot_params. |
993 | */ |
994 | struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) |
995 | { |
996 | @@ -483,8 +486,6 @@ struct boot_params *make_boot_params(void *handle, efi_system_table_t *_table) |
997 | hdr->vid_mode = 0xffff; |
998 | hdr->boot_flag = 0xAA55; |
999 | |
1000 | - hdr->code32_start = (__u64)(unsigned long)image->image_base; |
1001 | - |
1002 | hdr->type_of_loader = 0x21; |
1003 | |
1004 | /* Convert unicode cmdline to ascii */ |
1005 | diff --git a/arch/x86/boot/compressed/head_32.S b/arch/x86/boot/compressed/head_32.S |
1006 | index 9116aac232c7..f45ab7a36fb6 100644 |
1007 | --- a/arch/x86/boot/compressed/head_32.S |
1008 | +++ b/arch/x86/boot/compressed/head_32.S |
1009 | @@ -50,6 +50,13 @@ ENTRY(efi_pe_entry) |
1010 | pushl %eax |
1011 | pushl %esi |
1012 | pushl %ecx |
1013 | + |
1014 | + call reloc |
1015 | +reloc: |
1016 | + popl %ecx |
1017 | + subl reloc, %ecx |
1018 | + movl %ecx, BP_code32_start(%eax) |
1019 | + |
1020 | sub $0x4, %esp |
1021 | |
1022 | ENTRY(efi_stub_entry) |
1023 | @@ -63,12 +70,7 @@ ENTRY(efi_stub_entry) |
1024 | hlt |
1025 | jmp 1b |
1026 | 2: |
1027 | - call 3f |
1028 | -3: |
1029 | - popl %eax |
1030 | - subl $3b, %eax |
1031 | - subl BP_pref_address(%esi), %eax |
1032 | - add BP_code32_start(%esi), %eax |
1033 | + movl BP_code32_start(%esi), %eax |
1034 | leal preferred_addr(%eax), %eax |
1035 | jmp *%eax |
1036 | |
1037 | diff --git a/arch/x86/boot/compressed/head_64.S b/arch/x86/boot/compressed/head_64.S |
1038 | index c5c1ae0997e7..b10fa66a2540 100644 |
1039 | --- a/arch/x86/boot/compressed/head_64.S |
1040 | +++ b/arch/x86/boot/compressed/head_64.S |
1041 | @@ -217,6 +217,8 @@ ENTRY(efi_pe_entry) |
1042 | cmpq $0,%rax |
1043 | je 1f |
1044 | mov %rax, %rdx |
1045 | + leaq startup_32(%rip), %rax |
1046 | + movl %eax, BP_code32_start(%rdx) |
1047 | popq %rsi |
1048 | popq %rdi |
1049 | |
1050 | @@ -230,12 +232,7 @@ ENTRY(efi_stub_entry) |
1051 | hlt |
1052 | jmp 1b |
1053 | 2: |
1054 | - call 3f |
1055 | -3: |
1056 | - popq %rax |
1057 | - subq $3b, %rax |
1058 | - subq BP_pref_address(%rsi), %rax |
1059 | - add BP_code32_start(%esi), %eax |
1060 | + movl BP_code32_start(%esi), %eax |
1061 | leaq preferred_addr(%rax), %rax |
1062 | jmp *%rax |
1063 | |
1064 | diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h |
1065 | index e099f9502ace..5f1296872aed 100644 |
1066 | --- a/arch/x86/include/asm/cpufeature.h |
1067 | +++ b/arch/x86/include/asm/cpufeature.h |
1068 | @@ -217,9 +217,13 @@ |
1069 | #define X86_FEATURE_INVPCID (9*32+10) /* Invalidate Processor Context ID */ |
1070 | #define X86_FEATURE_RTM (9*32+11) /* Restricted Transactional Memory */ |
1071 | #define X86_FEATURE_MPX (9*32+14) /* Memory Protection Extension */ |
1072 | +#define X86_FEATURE_AVX512F (9*32+16) /* AVX-512 Foundation */ |
1073 | #define X86_FEATURE_RDSEED (9*32+18) /* The RDSEED instruction */ |
1074 | #define X86_FEATURE_ADX (9*32+19) /* The ADCX and ADOX instructions */ |
1075 | #define X86_FEATURE_SMAP (9*32+20) /* Supervisor Mode Access Prevention */ |
1076 | +#define X86_FEATURE_AVX512PF (9*32+26) /* AVX-512 Prefetch */ |
1077 | +#define X86_FEATURE_AVX512ER (9*32+27) /* AVX-512 Exponential and Reciprocal */ |
1078 | +#define X86_FEATURE_AVX512CD (9*32+28) /* AVX-512 Conflict Detection */ |
1079 | |
1080 | /* |
1081 | * BUG word(s) |
1082 | diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h |
1083 | index 554738963b28..6c1d7411eb00 100644 |
1084 | --- a/arch/x86/include/asm/xsave.h |
1085 | +++ b/arch/x86/include/asm/xsave.h |
1086 | @@ -6,11 +6,14 @@ |
1087 | |
1088 | #define XSTATE_CPUID 0x0000000d |
1089 | |
1090 | -#define XSTATE_FP 0x1 |
1091 | -#define XSTATE_SSE 0x2 |
1092 | -#define XSTATE_YMM 0x4 |
1093 | -#define XSTATE_BNDREGS 0x8 |
1094 | -#define XSTATE_BNDCSR 0x10 |
1095 | +#define XSTATE_FP 0x1 |
1096 | +#define XSTATE_SSE 0x2 |
1097 | +#define XSTATE_YMM 0x4 |
1098 | +#define XSTATE_BNDREGS 0x8 |
1099 | +#define XSTATE_BNDCSR 0x10 |
1100 | +#define XSTATE_OPMASK 0x20 |
1101 | +#define XSTATE_ZMM_Hi256 0x40 |
1102 | +#define XSTATE_Hi16_ZMM 0x80 |
1103 | |
1104 | #define XSTATE_FPSSE (XSTATE_FP | XSTATE_SSE) |
1105 | |
1106 | @@ -23,7 +26,8 @@ |
1107 | #define XSAVE_YMM_OFFSET (XSAVE_HDR_SIZE + XSAVE_HDR_OFFSET) |
1108 | |
1109 | /* Supported features which support lazy state saving */ |
1110 | -#define XSTATE_LAZY (XSTATE_FP | XSTATE_SSE | XSTATE_YMM) |
1111 | +#define XSTATE_LAZY (XSTATE_FP | XSTATE_SSE | XSTATE_YMM \ |
1112 | + | XSTATE_OPMASK | XSTATE_ZMM_Hi256 | XSTATE_Hi16_ZMM) |
1113 | |
1114 | /* Supported features which require eager state saving */ |
1115 | #define XSTATE_EAGER (XSTATE_BNDREGS | XSTATE_BNDCSR) |
1116 | diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c |
1117 | index e6253195a301..1ffc32dbe450 100644 |
1118 | --- a/arch/x86/kernel/ftrace.c |
1119 | +++ b/arch/x86/kernel/ftrace.c |
1120 | @@ -659,8 +659,8 @@ ftrace_modify_code(unsigned long ip, unsigned const char *old_code, |
1121 | ret = -EPERM; |
1122 | goto out; |
1123 | } |
1124 | - run_sync(); |
1125 | out: |
1126 | + run_sync(); |
1127 | return ret; |
1128 | |
1129 | fail_update: |
1130 | diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c |
1131 | index ebc987398923..af1d14a9ebda 100644 |
1132 | --- a/arch/x86/kernel/ldt.c |
1133 | +++ b/arch/x86/kernel/ldt.c |
1134 | @@ -229,6 +229,17 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode) |
1135 | } |
1136 | } |
1137 | |
1138 | + /* |
1139 | + * On x86-64 we do not support 16-bit segments due to |
1140 | + * IRET leaking the high bits of the kernel stack address. |
1141 | + */ |
1142 | +#ifdef CONFIG_X86_64 |
1143 | + if (!ldt_info.seg_32bit) { |
1144 | + error = -EINVAL; |
1145 | + goto out_unlock; |
1146 | + } |
1147 | +#endif |
1148 | + |
1149 | fill_ldt(&ldt, &ldt_info); |
1150 | if (oldmode) |
1151 | ldt.avl = 0; |
1152 | diff --git a/arch/x86/lib/hash.c b/arch/x86/lib/hash.c |
1153 | index 3056702e81fb..060cc4415bd9 100644 |
1154 | --- a/arch/x86/lib/hash.c |
1155 | +++ b/arch/x86/lib/hash.c |
1156 | @@ -39,7 +39,11 @@ |
1157 | |
1158 | static inline u32 crc32_u32(u32 crc, u32 val) |
1159 | { |
1160 | +#ifdef CONFIG_AS_CRC32 |
1161 | asm ("crc32l %1,%0\n" : "+r" (crc) : "rm" (val)); |
1162 | +#else |
1163 | + asm (".byte 0xf2, 0x0f, 0x38, 0xf1, 0xc1" : "+a" (crc) : "c" (val)); |
1164 | +#endif |
1165 | return crc; |
1166 | } |
1167 | |
1168 | diff --git a/drivers/acpi/acpica/nsrepair.c b/drivers/acpi/acpica/nsrepair.c |
1169 | index a05afff50eb9..b6f6863c07f9 100644 |
1170 | --- a/drivers/acpi/acpica/nsrepair.c |
1171 | +++ b/drivers/acpi/acpica/nsrepair.c |
1172 | @@ -207,13 +207,30 @@ acpi_ns_simple_repair(struct acpi_evaluate_info *info, |
1173 | * this predefined name. Either one return value is expected, or none, |
1174 | * for both methods and other objects. |
1175 | * |
1176 | - * Exit now if there is no return object. Warning if one was expected. |
1177 | + * Try to fix if there was no return object. Warning if failed to fix. |
1178 | */ |
1179 | if (!return_object) { |
1180 | if (expected_btypes && (!(expected_btypes & ACPI_RTYPE_NONE))) { |
1181 | - ACPI_WARN_PREDEFINED((AE_INFO, info->full_pathname, |
1182 | - ACPI_WARN_ALWAYS, |
1183 | - "Missing expected return value")); |
1184 | + if (package_index != ACPI_NOT_PACKAGE_ELEMENT) { |
1185 | + ACPI_WARN_PREDEFINED((AE_INFO, |
1186 | + info->full_pathname, |
1187 | + ACPI_WARN_ALWAYS, |
1188 | + "Found unexpected NULL package element")); |
1189 | + |
1190 | + status = |
1191 | + acpi_ns_repair_null_element(info, |
1192 | + expected_btypes, |
1193 | + package_index, |
1194 | + return_object_ptr); |
1195 | + if (ACPI_SUCCESS(status)) { |
1196 | + return (AE_OK); /* Repair was successful */ |
1197 | + } |
1198 | + } else { |
1199 | + ACPI_WARN_PREDEFINED((AE_INFO, |
1200 | + info->full_pathname, |
1201 | + ACPI_WARN_ALWAYS, |
1202 | + "Missing expected return value")); |
1203 | + } |
1204 | |
1205 | return (AE_AML_NO_RETURN_VALUE); |
1206 | } |
1207 | diff --git a/drivers/block/mtip32xx/mtip32xx.c b/drivers/block/mtip32xx/mtip32xx.c |
1208 | index d777bb7cea93..a8939b98f9c3 100644 |
1209 | --- a/drivers/block/mtip32xx/mtip32xx.c |
1210 | +++ b/drivers/block/mtip32xx/mtip32xx.c |
1211 | @@ -252,38 +252,45 @@ static void mtip_async_complete(struct mtip_port *port, |
1212 | void *data, |
1213 | int status) |
1214 | { |
1215 | - struct mtip_cmd *command; |
1216 | + struct mtip_cmd *cmd; |
1217 | struct driver_data *dd = data; |
1218 | - int cb_status = status ? -EIO : 0; |
1219 | + int unaligned, cb_status = status ? -EIO : 0; |
1220 | + void (*func)(void *, int); |
1221 | |
1222 | if (unlikely(!dd) || unlikely(!port)) |
1223 | return; |
1224 | |
1225 | - command = &port->commands[tag]; |
1226 | + cmd = &port->commands[tag]; |
1227 | |
1228 | if (unlikely(status == PORT_IRQ_TF_ERR)) { |
1229 | dev_warn(&port->dd->pdev->dev, |
1230 | "Command tag %d failed due to TFE\n", tag); |
1231 | } |
1232 | |
1233 | + /* Clear the active flag */ |
1234 | + atomic_set(&port->commands[tag].active, 0); |
1235 | + |
1236 | /* Upper layer callback */ |
1237 | - if (likely(command->async_callback)) |
1238 | - command->async_callback(command->async_data, cb_status); |
1239 | + func = cmd->async_callback; |
1240 | + if (likely(func && cmpxchg(&cmd->async_callback, func, 0) == func)) { |
1241 | |
1242 | - command->async_callback = NULL; |
1243 | - command->comp_func = NULL; |
1244 | + /* Unmap the DMA scatter list entries */ |
1245 | + dma_unmap_sg(&dd->pdev->dev, |
1246 | + cmd->sg, |
1247 | + cmd->scatter_ents, |
1248 | + cmd->direction); |
1249 | |
1250 | - /* Unmap the DMA scatter list entries */ |
1251 | - dma_unmap_sg(&dd->pdev->dev, |
1252 | - command->sg, |
1253 | - command->scatter_ents, |
1254 | - command->direction); |
1255 | + func(cmd->async_data, cb_status); |
1256 | + unaligned = cmd->unaligned; |
1257 | |
1258 | - /* Clear the allocated and active bits for the command */ |
1259 | - atomic_set(&port->commands[tag].active, 0); |
1260 | - release_slot(port, tag); |
1261 | + /* Clear the allocated bit for the command */ |
1262 | + release_slot(port, tag); |
1263 | |
1264 | - up(&port->cmd_slot); |
1265 | + if (unlikely(unaligned)) |
1266 | + up(&port->cmd_slot_unal); |
1267 | + else |
1268 | + up(&port->cmd_slot); |
1269 | + } |
1270 | } |
1271 | |
1272 | /* |
1273 | @@ -660,11 +667,12 @@ static void mtip_timeout_function(unsigned long int data) |
1274 | { |
1275 | struct mtip_port *port = (struct mtip_port *) data; |
1276 | struct host_to_dev_fis *fis; |
1277 | - struct mtip_cmd *command; |
1278 | - int tag, cmdto_cnt = 0; |
1279 | + struct mtip_cmd *cmd; |
1280 | + int unaligned, tag, cmdto_cnt = 0; |
1281 | unsigned int bit, group; |
1282 | unsigned int num_command_slots; |
1283 | unsigned long to, tagaccum[SLOTBITS_IN_LONGS]; |
1284 | + void (*func)(void *, int); |
1285 | |
1286 | if (unlikely(!port)) |
1287 | return; |
1288 | @@ -694,8 +702,8 @@ static void mtip_timeout_function(unsigned long int data) |
1289 | group = tag >> 5; |
1290 | bit = tag & 0x1F; |
1291 | |
1292 | - command = &port->commands[tag]; |
1293 | - fis = (struct host_to_dev_fis *) command->command; |
1294 | + cmd = &port->commands[tag]; |
1295 | + fis = (struct host_to_dev_fis *) cmd->command; |
1296 | |
1297 | set_bit(tag, tagaccum); |
1298 | cmdto_cnt++; |
1299 | @@ -709,27 +717,30 @@ static void mtip_timeout_function(unsigned long int data) |
1300 | */ |
1301 | writel(1 << bit, port->completed[group]); |
1302 | |
1303 | - /* Call the async completion callback. */ |
1304 | - if (likely(command->async_callback)) |
1305 | - command->async_callback(command->async_data, |
1306 | - -EIO); |
1307 | - command->async_callback = NULL; |
1308 | - command->comp_func = NULL; |
1309 | + /* Clear the active flag for the command */ |
1310 | + atomic_set(&port->commands[tag].active, 0); |
1311 | |
1312 | - /* Unmap the DMA scatter list entries */ |
1313 | - dma_unmap_sg(&port->dd->pdev->dev, |
1314 | - command->sg, |
1315 | - command->scatter_ents, |
1316 | - command->direction); |
1317 | + func = cmd->async_callback; |
1318 | + if (func && |
1319 | + cmpxchg(&cmd->async_callback, func, 0) == func) { |
1320 | |
1321 | - /* |
1322 | - * Clear the allocated bit and active tag for the |
1323 | - * command. |
1324 | - */ |
1325 | - atomic_set(&port->commands[tag].active, 0); |
1326 | - release_slot(port, tag); |
1327 | + /* Unmap the DMA scatter list entries */ |
1328 | + dma_unmap_sg(&port->dd->pdev->dev, |
1329 | + cmd->sg, |
1330 | + cmd->scatter_ents, |
1331 | + cmd->direction); |
1332 | |
1333 | - up(&port->cmd_slot); |
1334 | + func(cmd->async_data, -EIO); |
1335 | + unaligned = cmd->unaligned; |
1336 | + |
1337 | + /* Clear the allocated bit for the command. */ |
1338 | + release_slot(port, tag); |
1339 | + |
1340 | + if (unaligned) |
1341 | + up(&port->cmd_slot_unal); |
1342 | + else |
1343 | + up(&port->cmd_slot); |
1344 | + } |
1345 | } |
1346 | } |
1347 | |
1348 | @@ -4213,6 +4224,7 @@ skip_create_disk: |
1349 | blk_queue_max_hw_sectors(dd->queue, 0xffff); |
1350 | blk_queue_max_segment_size(dd->queue, 0x400000); |
1351 | blk_queue_io_min(dd->queue, 4096); |
1352 | + blk_queue_bounce_limit(dd->queue, dd->pdev->dma_mask); |
1353 | |
1354 | /* |
1355 | * write back cache is not supported in the device. FUA depends on |
1356 | diff --git a/drivers/block/mtip32xx/mtip32xx.h b/drivers/block/mtip32xx/mtip32xx.h |
1357 | index 54174cb32feb..ffb955e7ccb9 100644 |
1358 | --- a/drivers/block/mtip32xx/mtip32xx.h |
1359 | +++ b/drivers/block/mtip32xx/mtip32xx.h |
1360 | @@ -92,7 +92,7 @@ |
1361 | |
1362 | /* Driver name and version strings */ |
1363 | #define MTIP_DRV_NAME "mtip32xx" |
1364 | -#define MTIP_DRV_VERSION "1.3.0" |
1365 | +#define MTIP_DRV_VERSION "1.3.1" |
1366 | |
1367 | /* Maximum number of minor device numbers per device. */ |
1368 | #define MTIP_MAX_MINORS 16 |
1369 | diff --git a/drivers/clk/clk-s2mps11.c b/drivers/clk/clk-s2mps11.c |
1370 | index 00a3abe103a5..27c83e45eaed 100644 |
1371 | --- a/drivers/clk/clk-s2mps11.c |
1372 | +++ b/drivers/clk/clk-s2mps11.c |
1373 | @@ -130,7 +130,7 @@ static struct device_node *s2mps11_clk_parse_dt(struct platform_device *pdev) |
1374 | int i; |
1375 | |
1376 | if (!iodev->dev->of_node) |
1377 | - return NULL; |
1378 | + return ERR_PTR(-EINVAL); |
1379 | |
1380 | clk_np = of_find_node_by_name(iodev->dev->of_node, "clocks"); |
1381 | if (!clk_np) { |
1382 | diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c |
1383 | index 166e02f16c8a..cc37c342c4cb 100644 |
1384 | --- a/drivers/clk/tegra/clk-tegra124.c |
1385 | +++ b/drivers/clk/tegra/clk-tegra124.c |
1386 | @@ -764,7 +764,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { |
1387 | [tegra_clk_sdmmc2_8] = { .dt_id = TEGRA124_CLK_SDMMC2, .present = true }, |
1388 | [tegra_clk_i2s1] = { .dt_id = TEGRA124_CLK_I2S1, .present = true }, |
1389 | [tegra_clk_i2c1] = { .dt_id = TEGRA124_CLK_I2C1, .present = true }, |
1390 | - [tegra_clk_ndflash] = { .dt_id = TEGRA124_CLK_NDFLASH, .present = true }, |
1391 | [tegra_clk_sdmmc1_8] = { .dt_id = TEGRA124_CLK_SDMMC1, .present = true }, |
1392 | [tegra_clk_sdmmc4_8] = { .dt_id = TEGRA124_CLK_SDMMC4, .present = true }, |
1393 | [tegra_clk_pwm] = { .dt_id = TEGRA124_CLK_PWM, .present = true }, |
1394 | @@ -809,7 +808,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { |
1395 | [tegra_clk_trace] = { .dt_id = TEGRA124_CLK_TRACE, .present = true }, |
1396 | [tegra_clk_soc_therm] = { .dt_id = TEGRA124_CLK_SOC_THERM, .present = true }, |
1397 | [tegra_clk_dtv] = { .dt_id = TEGRA124_CLK_DTV, .present = true }, |
1398 | - [tegra_clk_ndspeed] = { .dt_id = TEGRA124_CLK_NDSPEED, .present = true }, |
1399 | [tegra_clk_i2cslow] = { .dt_id = TEGRA124_CLK_I2CSLOW, .present = true }, |
1400 | [tegra_clk_dsib] = { .dt_id = TEGRA124_CLK_DSIB, .present = true }, |
1401 | [tegra_clk_tsec] = { .dt_id = TEGRA124_CLK_TSEC, .present = true }, |
1402 | @@ -952,7 +950,6 @@ static struct tegra_clk tegra124_clks[tegra_clk_max] __initdata = { |
1403 | [tegra_clk_clk_out_3_mux] = { .dt_id = TEGRA124_CLK_CLK_OUT_3_MUX, .present = true }, |
1404 | [tegra_clk_dsia_mux] = { .dt_id = TEGRA124_CLK_DSIA_MUX, .present = true }, |
1405 | [tegra_clk_dsib_mux] = { .dt_id = TEGRA124_CLK_DSIB_MUX, .present = true }, |
1406 | - [tegra_clk_uarte] = { .dt_id = TEGRA124_CLK_UARTE, .present = true }, |
1407 | }; |
1408 | |
1409 | static struct tegra_devclk devclks[] __initdata = { |
1410 | diff --git a/drivers/clk/ti/clk-44xx.c b/drivers/clk/ti/clk-44xx.c |
1411 | index ae00218b5da3..02517a8206bd 100644 |
1412 | --- a/drivers/clk/ti/clk-44xx.c |
1413 | +++ b/drivers/clk/ti/clk-44xx.c |
1414 | @@ -222,7 +222,6 @@ static struct ti_dt_clk omap44xx_clks[] = { |
1415 | DT_CLK(NULL, "auxclk5_src_ck", "auxclk5_src_ck"), |
1416 | DT_CLK(NULL, "auxclk5_ck", "auxclk5_ck"), |
1417 | DT_CLK(NULL, "auxclkreq5_ck", "auxclkreq5_ck"), |
1418 | - DT_CLK("50000000.gpmc", "fck", "dummy_ck"), |
1419 | DT_CLK("omap_i2c.1", "ick", "dummy_ck"), |
1420 | DT_CLK("omap_i2c.2", "ick", "dummy_ck"), |
1421 | DT_CLK("omap_i2c.3", "ick", "dummy_ck"), |
1422 | diff --git a/drivers/clk/ti/clk-54xx.c b/drivers/clk/ti/clk-54xx.c |
1423 | index 0ef9f581286b..08f3d1b915b3 100644 |
1424 | --- a/drivers/clk/ti/clk-54xx.c |
1425 | +++ b/drivers/clk/ti/clk-54xx.c |
1426 | @@ -182,7 +182,6 @@ static struct ti_dt_clk omap54xx_clks[] = { |
1427 | DT_CLK(NULL, "auxclk3_src_ck", "auxclk3_src_ck"), |
1428 | DT_CLK(NULL, "auxclk3_ck", "auxclk3_ck"), |
1429 | DT_CLK(NULL, "auxclkreq3_ck", "auxclkreq3_ck"), |
1430 | - DT_CLK(NULL, "gpmc_ck", "dummy_ck"), |
1431 | DT_CLK("omap_i2c.1", "ick", "dummy_ck"), |
1432 | DT_CLK("omap_i2c.2", "ick", "dummy_ck"), |
1433 | DT_CLK("omap_i2c.3", "ick", "dummy_ck"), |
1434 | diff --git a/drivers/clk/ti/clk-7xx.c b/drivers/clk/ti/clk-7xx.c |
1435 | index 9977653f2d63..f7e40734c819 100644 |
1436 | --- a/drivers/clk/ti/clk-7xx.c |
1437 | +++ b/drivers/clk/ti/clk-7xx.c |
1438 | @@ -262,7 +262,6 @@ static struct ti_dt_clk dra7xx_clks[] = { |
1439 | DT_CLK(NULL, "vip1_gclk_mux", "vip1_gclk_mux"), |
1440 | DT_CLK(NULL, "vip2_gclk_mux", "vip2_gclk_mux"), |
1441 | DT_CLK(NULL, "vip3_gclk_mux", "vip3_gclk_mux"), |
1442 | - DT_CLK(NULL, "gpmc_ck", "dummy_ck"), |
1443 | DT_CLK("omap_i2c.1", "ick", "dummy_ck"), |
1444 | DT_CLK("omap_i2c.2", "ick", "dummy_ck"), |
1445 | DT_CLK("omap_i2c.3", "ick", "dummy_ck"), |
1446 | diff --git a/drivers/firmware/efi/efi-stub-helper.c b/drivers/firmware/efi/efi-stub-helper.c |
1447 | index b6bffbfd3be7..3a74def216a5 100644 |
1448 | --- a/drivers/firmware/efi/efi-stub-helper.c |
1449 | +++ b/drivers/firmware/efi/efi-stub-helper.c |
1450 | @@ -468,7 +468,7 @@ grow: |
1451 | chunksize = EFI_READ_CHUNK_SIZE; |
1452 | else |
1453 | chunksize = size; |
1454 | - status = efi_call_phys3(fh->read, |
1455 | + status = efi_call_phys3(files[j].handle->read, |
1456 | files[j].handle, |
1457 | &chunksize, |
1458 | (void *)addr); |
1459 | @@ -480,7 +480,7 @@ grow: |
1460 | size -= chunksize; |
1461 | } |
1462 | |
1463 | - efi_call_phys1(fh->close, files[j].handle); |
1464 | + efi_call_phys1(files[j].handle->close, files[j].handle); |
1465 | } |
1466 | |
1467 | } |
1468 | @@ -497,7 +497,7 @@ free_file_total: |
1469 | |
1470 | close_handles: |
1471 | for (k = j; k < i; k++) |
1472 | - efi_call_phys1(fh->close, files[k].handle); |
1473 | + efi_call_phys1(files[k].handle->close, files[k].handle); |
1474 | free_files: |
1475 | efi_call_phys1(sys_table_arg->boottime->free_pool, files); |
1476 | fail: |
1477 | diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c |
1478 | index d8e398275ca8..66a492aa4f1e 100644 |
1479 | --- a/drivers/gpu/drm/armada/armada_crtc.c |
1480 | +++ b/drivers/gpu/drm/armada/armada_crtc.c |
1481 | @@ -678,6 +678,7 @@ static void armada_load_cursor_argb(void __iomem *base, uint32_t *pix, |
1482 | base + LCD_SPU_SRAM_WRDAT); |
1483 | writel_relaxed(addr | SRAM_WRITE, |
1484 | base + LCD_SPU_SRAM_CTRL); |
1485 | + readl_relaxed(base + LCD_SPU_HWC_OVSA_HPXL_VLN); |
1486 | addr += 1; |
1487 | if ((addr & 0x00ff) == 0) |
1488 | addr += 0xf00; |
1489 | diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c |
1490 | index f2d7bf90c9fe..2e7801af466e 100644 |
1491 | --- a/drivers/hv/connection.c |
1492 | +++ b/drivers/hv/connection.c |
1493 | @@ -55,6 +55,9 @@ static __u32 vmbus_get_next_version(__u32 current_version) |
1494 | case (VERSION_WIN8): |
1495 | return VERSION_WIN7; |
1496 | |
1497 | + case (VERSION_WIN8_1): |
1498 | + return VERSION_WIN8; |
1499 | + |
1500 | case (VERSION_WS2008): |
1501 | default: |
1502 | return VERSION_INVAL; |
1503 | @@ -77,7 +80,7 @@ static int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, |
1504 | msg->interrupt_page = virt_to_phys(vmbus_connection.int_page); |
1505 | msg->monitor_page1 = virt_to_phys(vmbus_connection.monitor_pages[0]); |
1506 | msg->monitor_page2 = virt_to_phys(vmbus_connection.monitor_pages[1]); |
1507 | - if (version == VERSION_WIN8) |
1508 | + if (version == VERSION_WIN8_1) |
1509 | msg->target_vcpu = hv_context.vp_index[smp_processor_id()]; |
1510 | |
1511 | /* |
1512 | diff --git a/drivers/iio/adc/at91_adc.c b/drivers/iio/adc/at91_adc.c |
1513 | index 5b1aa027c034..bbba014c9939 100644 |
1514 | --- a/drivers/iio/adc/at91_adc.c |
1515 | +++ b/drivers/iio/adc/at91_adc.c |
1516 | @@ -765,14 +765,17 @@ static int at91_adc_probe_pdata(struct at91_adc_state *st, |
1517 | if (!pdata) |
1518 | return -EINVAL; |
1519 | |
1520 | + st->caps = (struct at91_adc_caps *) |
1521 | + platform_get_device_id(pdev)->driver_data; |
1522 | + |
1523 | st->use_external = pdata->use_external_triggers; |
1524 | st->vref_mv = pdata->vref; |
1525 | st->channels_mask = pdata->channels_used; |
1526 | - st->num_channels = pdata->num_channels; |
1527 | + st->num_channels = st->caps->num_channels; |
1528 | st->startup_time = pdata->startup_time; |
1529 | st->trigger_number = pdata->trigger_number; |
1530 | st->trigger_list = pdata->trigger_list; |
1531 | - st->registers = pdata->registers; |
1532 | + st->registers = &st->caps->registers; |
1533 | |
1534 | return 0; |
1535 | } |
1536 | @@ -1101,7 +1104,6 @@ static int at91_adc_remove(struct platform_device *pdev) |
1537 | return 0; |
1538 | } |
1539 | |
1540 | -#ifdef CONFIG_OF |
1541 | static struct at91_adc_caps at91sam9260_caps = { |
1542 | .calc_startup_ticks = calc_startup_ticks_9260, |
1543 | .num_channels = 4, |
1544 | @@ -1154,11 +1156,27 @@ static const struct of_device_id at91_adc_dt_ids[] = { |
1545 | {}, |
1546 | }; |
1547 | MODULE_DEVICE_TABLE(of, at91_adc_dt_ids); |
1548 | -#endif |
1549 | + |
1550 | +static const struct platform_device_id at91_adc_ids[] = { |
1551 | + { |
1552 | + .name = "at91sam9260-adc", |
1553 | + .driver_data = (unsigned long)&at91sam9260_caps, |
1554 | + }, { |
1555 | + .name = "at91sam9g45-adc", |
1556 | + .driver_data = (unsigned long)&at91sam9g45_caps, |
1557 | + }, { |
1558 | + .name = "at91sam9x5-adc", |
1559 | + .driver_data = (unsigned long)&at91sam9x5_caps, |
1560 | + }, { |
1561 | + /* terminator */ |
1562 | + } |
1563 | +}; |
1564 | +MODULE_DEVICE_TABLE(platform, at91_adc_ids); |
1565 | |
1566 | static struct platform_driver at91_adc_driver = { |
1567 | .probe = at91_adc_probe, |
1568 | .remove = at91_adc_remove, |
1569 | + .id_table = at91_adc_ids, |
1570 | .driver = { |
1571 | .name = DRIVER_NAME, |
1572 | .of_match_table = of_match_ptr(at91_adc_dt_ids), |
1573 | diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c |
1574 | index c67d83bdc8f0..fe25042f056a 100644 |
1575 | --- a/drivers/iio/industrialio-buffer.c |
1576 | +++ b/drivers/iio/industrialio-buffer.c |
1577 | @@ -165,7 +165,8 @@ static ssize_t iio_scan_el_show(struct device *dev, |
1578 | int ret; |
1579 | struct iio_dev *indio_dev = dev_to_iio_dev(dev); |
1580 | |
1581 | - ret = test_bit(to_iio_dev_attr(attr)->address, |
1582 | + /* Ensure ret is 0 or 1. */ |
1583 | + ret = !!test_bit(to_iio_dev_attr(attr)->address, |
1584 | indio_dev->buffer->scan_mask); |
1585 | |
1586 | return sprintf(buf, "%d\n", ret); |
1587 | @@ -866,7 +867,8 @@ int iio_scan_mask_query(struct iio_dev *indio_dev, |
1588 | if (!buffer->scan_mask) |
1589 | return 0; |
1590 | |
1591 | - return test_bit(bit, buffer->scan_mask); |
1592 | + /* Ensure return value is 0 or 1. */ |
1593 | + return !!test_bit(bit, buffer->scan_mask); |
1594 | }; |
1595 | EXPORT_SYMBOL_GPL(iio_scan_mask_query); |
1596 | |
1597 | diff --git a/drivers/iio/light/cm32181.c b/drivers/iio/light/cm32181.c |
1598 | index 47a6dbac2d0c..d976e6ce60db 100644 |
1599 | --- a/drivers/iio/light/cm32181.c |
1600 | +++ b/drivers/iio/light/cm32181.c |
1601 | @@ -221,6 +221,7 @@ static int cm32181_read_raw(struct iio_dev *indio_dev, |
1602 | *val = cm32181->calibscale; |
1603 | return IIO_VAL_INT; |
1604 | case IIO_CHAN_INFO_INT_TIME: |
1605 | + *val = 0; |
1606 | ret = cm32181_read_als_it(cm32181, val2); |
1607 | return ret; |
1608 | } |
1609 | diff --git a/drivers/iio/light/cm36651.c b/drivers/iio/light/cm36651.c |
1610 | index a45e07492db3..39fc67e82138 100644 |
1611 | --- a/drivers/iio/light/cm36651.c |
1612 | +++ b/drivers/iio/light/cm36651.c |
1613 | @@ -652,7 +652,19 @@ static int cm36651_probe(struct i2c_client *client, |
1614 | cm36651->client = client; |
1615 | cm36651->ps_client = i2c_new_dummy(client->adapter, |
1616 | CM36651_I2C_ADDR_PS); |
1617 | + if (!cm36651->ps_client) { |
1618 | + dev_err(&client->dev, "%s: new i2c device failed\n", __func__); |
1619 | + ret = -ENODEV; |
1620 | + goto error_disable_reg; |
1621 | + } |
1622 | + |
1623 | cm36651->ara_client = i2c_new_dummy(client->adapter, CM36651_ARA); |
1624 | + if (!cm36651->ara_client) { |
1625 | + dev_err(&client->dev, "%s: new i2c device failed\n", __func__); |
1626 | + ret = -ENODEV; |
1627 | + goto error_i2c_unregister_ps; |
1628 | + } |
1629 | + |
1630 | mutex_init(&cm36651->lock); |
1631 | indio_dev->dev.parent = &client->dev; |
1632 | indio_dev->channels = cm36651_channels; |
1633 | @@ -664,7 +676,7 @@ static int cm36651_probe(struct i2c_client *client, |
1634 | ret = cm36651_setup_reg(cm36651); |
1635 | if (ret) { |
1636 | dev_err(&client->dev, "%s: register setup failed\n", __func__); |
1637 | - goto error_disable_reg; |
1638 | + goto error_i2c_unregister_ara; |
1639 | } |
1640 | |
1641 | ret = request_threaded_irq(client->irq, NULL, cm36651_irq_handler, |
1642 | @@ -672,7 +684,7 @@ static int cm36651_probe(struct i2c_client *client, |
1643 | "cm36651", indio_dev); |
1644 | if (ret) { |
1645 | dev_err(&client->dev, "%s: request irq failed\n", __func__); |
1646 | - goto error_disable_reg; |
1647 | + goto error_i2c_unregister_ara; |
1648 | } |
1649 | |
1650 | ret = iio_device_register(indio_dev); |
1651 | @@ -685,6 +697,10 @@ static int cm36651_probe(struct i2c_client *client, |
1652 | |
1653 | error_free_irq: |
1654 | free_irq(client->irq, indio_dev); |
1655 | +error_i2c_unregister_ara: |
1656 | + i2c_unregister_device(cm36651->ara_client); |
1657 | +error_i2c_unregister_ps: |
1658 | + i2c_unregister_device(cm36651->ps_client); |
1659 | error_disable_reg: |
1660 | regulator_disable(cm36651->vled_reg); |
1661 | return ret; |
1662 | @@ -698,6 +714,8 @@ static int cm36651_remove(struct i2c_client *client) |
1663 | iio_device_unregister(indio_dev); |
1664 | regulator_disable(cm36651->vled_reg); |
1665 | free_irq(client->irq, indio_dev); |
1666 | + i2c_unregister_device(cm36651->ps_client); |
1667 | + i2c_unregister_device(cm36651->ara_client); |
1668 | |
1669 | return 0; |
1670 | } |
1671 | diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c |
1672 | index 0601b9daf840..c3239170d8b7 100644 |
1673 | --- a/drivers/infiniband/core/cm.c |
1674 | +++ b/drivers/infiniband/core/cm.c |
1675 | @@ -349,23 +349,6 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc, |
1676 | grh, &av->ah_attr); |
1677 | } |
1678 | |
1679 | -int ib_update_cm_av(struct ib_cm_id *id, const u8 *smac, const u8 *alt_smac) |
1680 | -{ |
1681 | - struct cm_id_private *cm_id_priv; |
1682 | - |
1683 | - cm_id_priv = container_of(id, struct cm_id_private, id); |
1684 | - |
1685 | - if (smac != NULL) |
1686 | - memcpy(cm_id_priv->av.smac, smac, sizeof(cm_id_priv->av.smac)); |
1687 | - |
1688 | - if (alt_smac != NULL) |
1689 | - memcpy(cm_id_priv->alt_av.smac, alt_smac, |
1690 | - sizeof(cm_id_priv->alt_av.smac)); |
1691 | - |
1692 | - return 0; |
1693 | -} |
1694 | -EXPORT_SYMBOL(ib_update_cm_av); |
1695 | - |
1696 | static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av) |
1697 | { |
1698 | struct cm_device *cm_dev; |
1699 | diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c |
1700 | index 199958d9ddc8..42c3058e6e9c 100644 |
1701 | --- a/drivers/infiniband/core/cma.c |
1702 | +++ b/drivers/infiniband/core/cma.c |
1703 | @@ -1284,15 +1284,6 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) |
1704 | struct rdma_id_private *listen_id, *conn_id; |
1705 | struct rdma_cm_event event; |
1706 | int offset, ret; |
1707 | - u8 smac[ETH_ALEN]; |
1708 | - u8 alt_smac[ETH_ALEN]; |
1709 | - u8 *psmac = smac; |
1710 | - u8 *palt_smac = alt_smac; |
1711 | - int is_iboe = ((rdma_node_get_transport(cm_id->device->node_type) == |
1712 | - RDMA_TRANSPORT_IB) && |
1713 | - (rdma_port_get_link_layer(cm_id->device, |
1714 | - ib_event->param.req_rcvd.port) == |
1715 | - IB_LINK_LAYER_ETHERNET)); |
1716 | |
1717 | listen_id = cm_id->context; |
1718 | if (!cma_check_req_qp_type(&listen_id->id, ib_event)) |
1719 | @@ -1336,28 +1327,11 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) |
1720 | ret = conn_id->id.event_handler(&conn_id->id, &event); |
1721 | if (ret) |
1722 | goto err3; |
1723 | - |
1724 | - if (is_iboe) { |
1725 | - if (ib_event->param.req_rcvd.primary_path != NULL) |
1726 | - rdma_addr_find_smac_by_sgid( |
1727 | - &ib_event->param.req_rcvd.primary_path->sgid, |
1728 | - psmac, NULL); |
1729 | - else |
1730 | - psmac = NULL; |
1731 | - if (ib_event->param.req_rcvd.alternate_path != NULL) |
1732 | - rdma_addr_find_smac_by_sgid( |
1733 | - &ib_event->param.req_rcvd.alternate_path->sgid, |
1734 | - palt_smac, NULL); |
1735 | - else |
1736 | - palt_smac = NULL; |
1737 | - } |
1738 | /* |
1739 | * Acquire mutex to prevent user executing rdma_destroy_id() |
1740 | * while we're accessing the cm_id. |
1741 | */ |
1742 | mutex_lock(&lock); |
1743 | - if (is_iboe) |
1744 | - ib_update_cm_av(cm_id, psmac, palt_smac); |
1745 | if (cma_comp(conn_id, RDMA_CM_CONNECT) && |
1746 | (conn_id->id.qp_type != IB_QPT_UD)) |
1747 | ib_send_cm_mra(cm_id, CMA_CM_MRA_SETTING, NULL, 0); |
1748 | diff --git a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c |
1749 | index 212150c25ea0..8cc837537768 100644 |
1750 | --- a/drivers/infiniband/hw/ehca/ehca_cq.c |
1751 | +++ b/drivers/infiniband/hw/ehca/ehca_cq.c |
1752 | @@ -283,6 +283,7 @@ struct ib_cq *ehca_create_cq(struct ib_device *device, int cqe, int comp_vector, |
1753 | (my_cq->galpas.user.fw_handle & (PAGE_SIZE - 1)); |
1754 | if (ib_copy_to_udata(udata, &resp, sizeof(resp))) { |
1755 | ehca_err(device, "Copy to udata failed."); |
1756 | + cq = ERR_PTR(-EFAULT); |
1757 | goto create_cq_exit4; |
1758 | } |
1759 | } |
1760 | diff --git a/drivers/infiniband/hw/ipath/ipath_diag.c b/drivers/infiniband/hw/ipath/ipath_diag.c |
1761 | index 714293b78518..e2f9a51f4a38 100644 |
1762 | --- a/drivers/infiniband/hw/ipath/ipath_diag.c |
1763 | +++ b/drivers/infiniband/hw/ipath/ipath_diag.c |
1764 | @@ -326,7 +326,7 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
1765 | size_t count, loff_t *off) |
1766 | { |
1767 | u32 __iomem *piobuf; |
1768 | - u32 plen, clen, pbufn; |
1769 | + u32 plen, pbufn, maxlen_reserve; |
1770 | struct ipath_diag_pkt odp; |
1771 | struct ipath_diag_xpkt dp; |
1772 | u32 *tmpbuf = NULL; |
1773 | @@ -335,51 +335,29 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
1774 | u64 val; |
1775 | u32 l_state, lt_state; /* LinkState, LinkTrainingState */ |
1776 | |
1777 | - if (count < sizeof(odp)) { |
1778 | - ret = -EINVAL; |
1779 | - goto bail; |
1780 | - } |
1781 | |
1782 | if (count == sizeof(dp)) { |
1783 | if (copy_from_user(&dp, data, sizeof(dp))) { |
1784 | ret = -EFAULT; |
1785 | goto bail; |
1786 | } |
1787 | - } else if (copy_from_user(&odp, data, sizeof(odp))) { |
1788 | - ret = -EFAULT; |
1789 | + } else if (count == sizeof(odp)) { |
1790 | + if (copy_from_user(&odp, data, sizeof(odp))) { |
1791 | + ret = -EFAULT; |
1792 | + goto bail; |
1793 | + } |
1794 | + } else { |
1795 | + ret = -EINVAL; |
1796 | goto bail; |
1797 | } |
1798 | |
1799 | - /* |
1800 | - * Due to padding/alignment issues (lessened with new struct) |
1801 | - * the old and new structs are the same length. We need to |
1802 | - * disambiguate them, which we can do because odp.len has never |
1803 | - * been less than the total of LRH+BTH+DETH so far, while |
1804 | - * dp.unit (same offset) unit is unlikely to get that high. |
1805 | - * Similarly, dp.data, the pointer to user at the same offset |
1806 | - * as odp.unit, is almost certainly at least one (512byte)page |
1807 | - * "above" NULL. The if-block below can be omitted if compatibility |
1808 | - * between a new driver and older diagnostic code is unimportant. |
1809 | - * compatibility the other direction (new diags, old driver) is |
1810 | - * handled in the diagnostic code, with a warning. |
1811 | - */ |
1812 | - if (dp.unit >= 20 && dp.data < 512) { |
1813 | - /* very probable version mismatch. Fix it up */ |
1814 | - memcpy(&odp, &dp, sizeof(odp)); |
1815 | - /* We got a legacy dp, copy elements to dp */ |
1816 | - dp.unit = odp.unit; |
1817 | - dp.data = odp.data; |
1818 | - dp.len = odp.len; |
1819 | - dp.pbc_wd = 0; /* Indicate we need to compute PBC wd */ |
1820 | - } |
1821 | - |
1822 | /* send count must be an exact number of dwords */ |
1823 | if (dp.len & 3) { |
1824 | ret = -EINVAL; |
1825 | goto bail; |
1826 | } |
1827 | |
1828 | - clen = dp.len >> 2; |
1829 | + plen = dp.len >> 2; |
1830 | |
1831 | dd = ipath_lookup(dp.unit); |
1832 | if (!dd || !(dd->ipath_flags & IPATH_PRESENT) || |
1833 | @@ -422,16 +400,22 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
1834 | goto bail; |
1835 | } |
1836 | |
1837 | - /* need total length before first word written */ |
1838 | - /* +1 word is for the qword padding */ |
1839 | - plen = sizeof(u32) + dp.len; |
1840 | - |
1841 | - if ((plen + 4) > dd->ipath_ibmaxlen) { |
1842 | + /* |
1843 | + * need total length before first word written, plus 2 Dwords. One Dword |
1844 | + * is for padding so we get the full user data when not aligned on |
1845 | + * a word boundary. The other Dword is to make sure we have room for the |
1846 | + * ICRC which gets tacked on later. |
1847 | + */ |
1848 | + maxlen_reserve = 2 * sizeof(u32); |
1849 | + if (dp.len > dd->ipath_ibmaxlen - maxlen_reserve) { |
1850 | ipath_dbg("Pkt len 0x%x > ibmaxlen %x\n", |
1851 | - plen - 4, dd->ipath_ibmaxlen); |
1852 | + dp.len, dd->ipath_ibmaxlen); |
1853 | ret = -EINVAL; |
1854 | - goto bail; /* before writing pbc */ |
1855 | + goto bail; |
1856 | } |
1857 | + |
1858 | + plen = sizeof(u32) + dp.len; |
1859 | + |
1860 | tmpbuf = vmalloc(plen); |
1861 | if (!tmpbuf) { |
1862 | dev_info(&dd->pcidev->dev, "Unable to allocate tmp buffer, " |
1863 | @@ -473,11 +457,11 @@ static ssize_t ipath_diagpkt_write(struct file *fp, |
1864 | */ |
1865 | if (dd->ipath_flags & IPATH_PIO_FLUSH_WC) { |
1866 | ipath_flush_wc(); |
1867 | - __iowrite32_copy(piobuf + 2, tmpbuf, clen - 1); |
1868 | + __iowrite32_copy(piobuf + 2, tmpbuf, plen - 1); |
1869 | ipath_flush_wc(); |
1870 | - __raw_writel(tmpbuf[clen - 1], piobuf + clen + 1); |
1871 | + __raw_writel(tmpbuf[plen - 1], piobuf + plen + 1); |
1872 | } else |
1873 | - __iowrite32_copy(piobuf + 2, tmpbuf, clen); |
1874 | + __iowrite32_copy(piobuf + 2, tmpbuf, plen); |
1875 | |
1876 | ipath_flush_wc(); |
1877 | |
1878 | diff --git a/drivers/infiniband/hw/mthca/mthca_provider.c b/drivers/infiniband/hw/mthca/mthca_provider.c |
1879 | index 5b71d43bd89c..42dde06fdb91 100644 |
1880 | --- a/drivers/infiniband/hw/mthca/mthca_provider.c |
1881 | +++ b/drivers/infiniband/hw/mthca/mthca_provider.c |
1882 | @@ -695,6 +695,7 @@ static struct ib_cq *mthca_create_cq(struct ib_device *ibdev, int entries, |
1883 | |
1884 | if (context && ib_copy_to_udata(udata, &cq->cqn, sizeof (__u32))) { |
1885 | mthca_free_cq(to_mdev(ibdev), cq); |
1886 | + err = -EFAULT; |
1887 | goto err_free; |
1888 | } |
1889 | |
1890 | diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c |
1891 | index 8308e3634767..eb624611f94b 100644 |
1892 | --- a/drivers/infiniband/hw/nes/nes_verbs.c |
1893 | +++ b/drivers/infiniband/hw/nes/nes_verbs.c |
1894 | @@ -1186,7 +1186,7 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd, |
1895 | nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num); |
1896 | kfree(nesqp->allocated_buffer); |
1897 | nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n"); |
1898 | - return NULL; |
1899 | + return ERR_PTR(-EFAULT); |
1900 | } |
1901 | if (req.user_wqe_buffers) { |
1902 | virt_wqs = 1; |
1903 | diff --git a/drivers/infiniband/hw/qib/qib_file_ops.c b/drivers/infiniband/hw/qib/qib_file_ops.c |
1904 | index 275f247f9fca..2023cd61b897 100644 |
1905 | --- a/drivers/infiniband/hw/qib/qib_file_ops.c |
1906 | +++ b/drivers/infiniband/hw/qib/qib_file_ops.c |
1907 | @@ -1578,7 +1578,7 @@ static int do_qib_user_sdma_queue_create(struct file *fp) |
1908 | struct qib_ctxtdata *rcd = fd->rcd; |
1909 | struct qib_devdata *dd = rcd->dd; |
1910 | |
1911 | - if (dd->flags & QIB_HAS_SEND_DMA) |
1912 | + if (dd->flags & QIB_HAS_SEND_DMA) { |
1913 | |
1914 | fd->pq = qib_user_sdma_queue_create(&dd->pcidev->dev, |
1915 | dd->unit, |
1916 | @@ -1586,6 +1586,7 @@ static int do_qib_user_sdma_queue_create(struct file *fp) |
1917 | fd->subctxt); |
1918 | if (!fd->pq) |
1919 | return -ENOMEM; |
1920 | + } |
1921 | |
1922 | return 0; |
1923 | } |
1924 | diff --git a/drivers/infiniband/hw/qib/qib_init.c b/drivers/infiniband/hw/qib/qib_init.c |
1925 | index 24e802f4ea2f..76c3e177164d 100644 |
1926 | --- a/drivers/infiniband/hw/qib/qib_init.c |
1927 | +++ b/drivers/infiniband/hw/qib/qib_init.c |
1928 | @@ -1097,14 +1097,10 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra) |
1929 | int ret; |
1930 | |
1931 | dd = (struct qib_devdata *) ib_alloc_device(sizeof(*dd) + extra); |
1932 | - if (!dd) { |
1933 | - dd = ERR_PTR(-ENOMEM); |
1934 | - goto bail; |
1935 | - } |
1936 | + if (!dd) |
1937 | + return ERR_PTR(-ENOMEM); |
1938 | |
1939 | -#ifdef CONFIG_DEBUG_FS |
1940 | - qib_dbg_ibdev_init(&dd->verbs_dev); |
1941 | -#endif |
1942 | + INIT_LIST_HEAD(&dd->list); |
1943 | |
1944 | idr_preload(GFP_KERNEL); |
1945 | spin_lock_irqsave(&qib_devs_lock, flags); |
1946 | @@ -1121,11 +1117,6 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra) |
1947 | if (ret < 0) { |
1948 | qib_early_err(&pdev->dev, |
1949 | "Could not allocate unit ID: error %d\n", -ret); |
1950 | -#ifdef CONFIG_DEBUG_FS |
1951 | - qib_dbg_ibdev_exit(&dd->verbs_dev); |
1952 | -#endif |
1953 | - ib_dealloc_device(&dd->verbs_dev.ibdev); |
1954 | - dd = ERR_PTR(ret); |
1955 | goto bail; |
1956 | } |
1957 | |
1958 | @@ -1139,9 +1130,15 @@ struct qib_devdata *qib_alloc_devdata(struct pci_dev *pdev, size_t extra) |
1959 | qib_early_err(&pdev->dev, |
1960 | "Could not alloc cpulist info, cpu affinity might be wrong\n"); |
1961 | } |
1962 | - |
1963 | -bail: |
1964 | +#ifdef CONFIG_DEBUG_FS |
1965 | + qib_dbg_ibdev_init(&dd->verbs_dev); |
1966 | +#endif |
1967 | return dd; |
1968 | +bail: |
1969 | + if (!list_empty(&dd->list)) |
1970 | + list_del_init(&dd->list); |
1971 | + ib_dealloc_device(&dd->verbs_dev.ibdev); |
1972 | + return ERR_PTR(ret);; |
1973 | } |
1974 | |
1975 | /* |
1976 | diff --git a/drivers/infiniband/ulp/isert/ib_isert.c b/drivers/infiniband/ulp/isert/ib_isert.c |
1977 | index 8ee228e9ab5a..f596b413a35b 100644 |
1978 | --- a/drivers/infiniband/ulp/isert/ib_isert.c |
1979 | +++ b/drivers/infiniband/ulp/isert/ib_isert.c |
1980 | @@ -436,11 +436,18 @@ isert_conn_create_fastreg_pool(struct isert_conn *isert_conn) |
1981 | { |
1982 | struct fast_reg_descriptor *fr_desc; |
1983 | struct isert_device *device = isert_conn->conn_device; |
1984 | - int i, ret; |
1985 | + struct se_session *se_sess = isert_conn->conn->sess->se_sess; |
1986 | + struct se_node_acl *se_nacl = se_sess->se_node_acl; |
1987 | + int i, ret, tag_num; |
1988 | + /* |
1989 | + * Setup the number of FRMRs based upon the number of tags |
1990 | + * available to session in iscsi_target_locate_portal(). |
1991 | + */ |
1992 | + tag_num = max_t(u32, ISCSIT_MIN_TAGS, se_nacl->queue_depth); |
1993 | + tag_num = (tag_num * 2) + ISCSIT_EXTRA_TAGS; |
1994 | |
1995 | - INIT_LIST_HEAD(&isert_conn->conn_fr_pool); |
1996 | isert_conn->conn_fr_pool_size = 0; |
1997 | - for (i = 0; i < ISCSI_DEF_XMIT_CMDS_MAX; i++) { |
1998 | + for (i = 0; i < tag_num; i++) { |
1999 | fr_desc = kzalloc(sizeof(*fr_desc), GFP_KERNEL); |
2000 | if (!fr_desc) { |
2001 | pr_err("Failed to allocate fast_reg descriptor\n"); |
2002 | @@ -498,6 +505,7 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
2003 | kref_get(&isert_conn->conn_kref); |
2004 | mutex_init(&isert_conn->conn_mutex); |
2005 | spin_lock_init(&isert_conn->conn_lock); |
2006 | + INIT_LIST_HEAD(&isert_conn->conn_fr_pool); |
2007 | |
2008 | cma_id->context = isert_conn; |
2009 | isert_conn->conn_cm_id = cma_id; |
2010 | @@ -569,15 +577,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
2011 | goto out_mr; |
2012 | } |
2013 | |
2014 | - if (device->use_fastreg) { |
2015 | - ret = isert_conn_create_fastreg_pool(isert_conn); |
2016 | - if (ret) { |
2017 | - pr_err("Conn: %p failed to create fastreg pool\n", |
2018 | - isert_conn); |
2019 | - goto out_fastreg; |
2020 | - } |
2021 | - } |
2022 | - |
2023 | ret = isert_conn_setup_qp(isert_conn, cma_id); |
2024 | if (ret) |
2025 | goto out_conn_dev; |
2026 | @@ -591,9 +590,6 @@ isert_connect_request(struct rdma_cm_id *cma_id, struct rdma_cm_event *event) |
2027 | return 0; |
2028 | |
2029 | out_conn_dev: |
2030 | - if (device->use_fastreg) |
2031 | - isert_conn_free_fastreg_pool(isert_conn); |
2032 | -out_fastreg: |
2033 | ib_dereg_mr(isert_conn->conn_mr); |
2034 | out_mr: |
2035 | ib_dealloc_pd(isert_conn->conn_pd); |
2036 | @@ -967,6 +963,15 @@ isert_put_login_tx(struct iscsi_conn *conn, struct iscsi_login *login, |
2037 | } |
2038 | if (!login->login_failed) { |
2039 | if (login->login_complete) { |
2040 | + if (isert_conn->conn_device->use_fastreg) { |
2041 | + ret = isert_conn_create_fastreg_pool(isert_conn); |
2042 | + if (ret) { |
2043 | + pr_err("Conn: %p failed to create" |
2044 | + " fastreg pool\n", isert_conn); |
2045 | + return ret; |
2046 | + } |
2047 | + } |
2048 | + |
2049 | ret = isert_alloc_rx_descriptors(isert_conn); |
2050 | if (ret) |
2051 | return ret; |
2052 | @@ -1451,7 +1456,7 @@ isert_unreg_rdma(struct isert_cmd *isert_cmd, struct isert_conn *isert_conn) |
2053 | } |
2054 | |
2055 | static void |
2056 | -isert_put_cmd(struct isert_cmd *isert_cmd) |
2057 | +isert_put_cmd(struct isert_cmd *isert_cmd, bool comp_err) |
2058 | { |
2059 | struct iscsi_cmd *cmd = isert_cmd->iscsi_cmd; |
2060 | struct isert_conn *isert_conn = isert_cmd->conn; |
2061 | @@ -1467,8 +1472,21 @@ isert_put_cmd(struct isert_cmd *isert_cmd) |
2062 | list_del_init(&cmd->i_conn_node); |
2063 | spin_unlock_bh(&conn->cmd_lock); |
2064 | |
2065 | - if (cmd->data_direction == DMA_TO_DEVICE) |
2066 | + if (cmd->data_direction == DMA_TO_DEVICE) { |
2067 | iscsit_stop_dataout_timer(cmd); |
2068 | + /* |
2069 | + * Check for special case during comp_err where |
2070 | + * WRITE_PENDING has been handed off from core, |
2071 | + * but requires an extra target_put_sess_cmd() |
2072 | + * before transport_generic_free_cmd() below. |
2073 | + */ |
2074 | + if (comp_err && |
2075 | + cmd->se_cmd.t_state == TRANSPORT_WRITE_PENDING) { |
2076 | + struct se_cmd *se_cmd = &cmd->se_cmd; |
2077 | + |
2078 | + target_put_sess_cmd(se_cmd->se_sess, se_cmd); |
2079 | + } |
2080 | + } |
2081 | |
2082 | device->unreg_rdma_mem(isert_cmd, isert_conn); |
2083 | transport_generic_free_cmd(&cmd->se_cmd, 0); |
2084 | @@ -1523,7 +1541,7 @@ isert_unmap_tx_desc(struct iser_tx_desc *tx_desc, struct ib_device *ib_dev) |
2085 | |
2086 | static void |
2087 | isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, |
2088 | - struct ib_device *ib_dev) |
2089 | + struct ib_device *ib_dev, bool comp_err) |
2090 | { |
2091 | if (isert_cmd->pdu_buf_dma != 0) { |
2092 | pr_debug("Calling ib_dma_unmap_single for isert_cmd->pdu_buf_dma\n"); |
2093 | @@ -1533,7 +1551,7 @@ isert_completion_put(struct iser_tx_desc *tx_desc, struct isert_cmd *isert_cmd, |
2094 | } |
2095 | |
2096 | isert_unmap_tx_desc(tx_desc, ib_dev); |
2097 | - isert_put_cmd(isert_cmd); |
2098 | + isert_put_cmd(isert_cmd, comp_err); |
2099 | } |
2100 | |
2101 | static void |
2102 | @@ -1577,14 +1595,14 @@ isert_do_control_comp(struct work_struct *work) |
2103 | iscsit_tmr_post_handler(cmd, cmd->conn); |
2104 | |
2105 | cmd->i_state = ISTATE_SENT_STATUS; |
2106 | - isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); |
2107 | + isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
2108 | break; |
2109 | case ISTATE_SEND_REJECT: |
2110 | pr_debug("Got isert_do_control_comp ISTATE_SEND_REJECT: >>>\n"); |
2111 | atomic_dec(&isert_conn->post_send_buf_count); |
2112 | |
2113 | cmd->i_state = ISTATE_SENT_STATUS; |
2114 | - isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); |
2115 | + isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
2116 | break; |
2117 | case ISTATE_SEND_LOGOUTRSP: |
2118 | pr_debug("Calling iscsit_logout_post_handler >>>>>>>>>>>>>>\n"); |
2119 | @@ -1598,7 +1616,7 @@ isert_do_control_comp(struct work_struct *work) |
2120 | case ISTATE_SEND_TEXTRSP: |
2121 | atomic_dec(&isert_conn->post_send_buf_count); |
2122 | cmd->i_state = ISTATE_SENT_STATUS; |
2123 | - isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev); |
2124 | + isert_completion_put(&isert_cmd->tx_desc, isert_cmd, ib_dev, false); |
2125 | break; |
2126 | default: |
2127 | pr_err("Unknown do_control_comp i_state %d\n", cmd->i_state); |
2128 | @@ -1629,7 +1647,7 @@ isert_response_completion(struct iser_tx_desc *tx_desc, |
2129 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
2130 | |
2131 | cmd->i_state = ISTATE_SENT_STATUS; |
2132 | - isert_completion_put(tx_desc, isert_cmd, ib_dev); |
2133 | + isert_completion_put(tx_desc, isert_cmd, ib_dev, false); |
2134 | } |
2135 | |
2136 | static void |
2137 | @@ -1710,7 +1728,7 @@ isert_cq_drain_comp_llist(struct isert_conn *isert_conn, struct ib_device *ib_de |
2138 | wr = &t->isert_cmd->rdma_wr; |
2139 | |
2140 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
2141 | - isert_completion_put(t, t->isert_cmd, ib_dev); |
2142 | + isert_completion_put(t, t->isert_cmd, ib_dev, true); |
2143 | } |
2144 | } |
2145 | |
2146 | @@ -1729,14 +1747,14 @@ isert_cq_tx_comp_err(struct iser_tx_desc *tx_desc, struct isert_conn *isert_conn |
2147 | wr = &t->isert_cmd->rdma_wr; |
2148 | |
2149 | atomic_sub(wr->send_wr_num + 1, &isert_conn->post_send_buf_count); |
2150 | - isert_completion_put(t, t->isert_cmd, ib_dev); |
2151 | + isert_completion_put(t, t->isert_cmd, ib_dev, true); |
2152 | } |
2153 | tx_desc->comp_llnode_batch = NULL; |
2154 | |
2155 | if (!isert_cmd) |
2156 | isert_unmap_tx_desc(tx_desc, ib_dev); |
2157 | else |
2158 | - isert_completion_put(tx_desc, isert_cmd, ib_dev); |
2159 | + isert_completion_put(tx_desc, isert_cmd, ib_dev, true); |
2160 | } |
2161 | |
2162 | static void |
2163 | diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c |
2164 | index 0e537d8d0e47..d1078ce73095 100644 |
2165 | --- a/drivers/infiniband/ulp/srpt/ib_srpt.c |
2166 | +++ b/drivers/infiniband/ulp/srpt/ib_srpt.c |
2167 | @@ -1078,6 +1078,7 @@ static void srpt_unmap_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2168 | static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2169 | struct srpt_send_ioctx *ioctx) |
2170 | { |
2171 | + struct ib_device *dev = ch->sport->sdev->device; |
2172 | struct se_cmd *cmd; |
2173 | struct scatterlist *sg, *sg_orig; |
2174 | int sg_cnt; |
2175 | @@ -1124,7 +1125,7 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2176 | |
2177 | db = ioctx->rbufs; |
2178 | tsize = cmd->data_length; |
2179 | - dma_len = sg_dma_len(&sg[0]); |
2180 | + dma_len = ib_sg_dma_len(dev, &sg[0]); |
2181 | riu = ioctx->rdma_ius; |
2182 | |
2183 | /* |
2184 | @@ -1155,7 +1156,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2185 | ++j; |
2186 | if (j < count) { |
2187 | sg = sg_next(sg); |
2188 | - dma_len = sg_dma_len(sg); |
2189 | + dma_len = ib_sg_dma_len( |
2190 | + dev, sg); |
2191 | } |
2192 | } |
2193 | } else { |
2194 | @@ -1192,8 +1194,8 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2195 | tsize = cmd->data_length; |
2196 | riu = ioctx->rdma_ius; |
2197 | sg = sg_orig; |
2198 | - dma_len = sg_dma_len(&sg[0]); |
2199 | - dma_addr = sg_dma_address(&sg[0]); |
2200 | + dma_len = ib_sg_dma_len(dev, &sg[0]); |
2201 | + dma_addr = ib_sg_dma_address(dev, &sg[0]); |
2202 | |
2203 | /* this second loop is really mapped sg_addres to rdma_iu->ib_sge */ |
2204 | for (i = 0, j = 0; |
2205 | @@ -1216,8 +1218,10 @@ static int srpt_map_sg_to_ib_sge(struct srpt_rdma_ch *ch, |
2206 | ++j; |
2207 | if (j < count) { |
2208 | sg = sg_next(sg); |
2209 | - dma_len = sg_dma_len(sg); |
2210 | - dma_addr = sg_dma_address(sg); |
2211 | + dma_len = ib_sg_dma_len( |
2212 | + dev, sg); |
2213 | + dma_addr = ib_sg_dma_address( |
2214 | + dev, sg); |
2215 | } |
2216 | } |
2217 | } else { |
2218 | diff --git a/drivers/media/dvb-frontends/m88rs2000.c b/drivers/media/dvb-frontends/m88rs2000.c |
2219 | index b2351466b0da..32cffca14d0b 100644 |
2220 | --- a/drivers/media/dvb-frontends/m88rs2000.c |
2221 | +++ b/drivers/media/dvb-frontends/m88rs2000.c |
2222 | @@ -715,6 +715,22 @@ static int m88rs2000_get_frontend(struct dvb_frontend *fe) |
2223 | return 0; |
2224 | } |
2225 | |
2226 | +static int m88rs2000_get_tune_settings(struct dvb_frontend *fe, |
2227 | + struct dvb_frontend_tune_settings *tune) |
2228 | +{ |
2229 | + struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
2230 | + |
2231 | + if (c->symbol_rate > 3000000) |
2232 | + tune->min_delay_ms = 2000; |
2233 | + else |
2234 | + tune->min_delay_ms = 3000; |
2235 | + |
2236 | + tune->step_size = c->symbol_rate / 16000; |
2237 | + tune->max_drift = c->symbol_rate / 2000; |
2238 | + |
2239 | + return 0; |
2240 | +} |
2241 | + |
2242 | static int m88rs2000_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
2243 | { |
2244 | struct m88rs2000_state *state = fe->demodulator_priv; |
2245 | @@ -746,7 +762,7 @@ static struct dvb_frontend_ops m88rs2000_ops = { |
2246 | .symbol_rate_tolerance = 500, /* ppm */ |
2247 | .caps = FE_CAN_FEC_1_2 | FE_CAN_FEC_2_3 | FE_CAN_FEC_3_4 | |
2248 | FE_CAN_FEC_5_6 | FE_CAN_FEC_7_8 | |
2249 | - FE_CAN_QPSK | |
2250 | + FE_CAN_QPSK | FE_CAN_INVERSION_AUTO | |
2251 | FE_CAN_FEC_AUTO |
2252 | }, |
2253 | |
2254 | @@ -766,6 +782,7 @@ static struct dvb_frontend_ops m88rs2000_ops = { |
2255 | |
2256 | .set_frontend = m88rs2000_set_frontend, |
2257 | .get_frontend = m88rs2000_get_frontend, |
2258 | + .get_tune_settings = m88rs2000_get_tune_settings, |
2259 | }; |
2260 | |
2261 | struct dvb_frontend *m88rs2000_attach(const struct m88rs2000_config *config, |
2262 | diff --git a/drivers/media/pci/saa7134/saa7134-cards.c b/drivers/media/pci/saa7134/saa7134-cards.c |
2263 | index c9b2350e92c8..6e4bdb90aa92 100644 |
2264 | --- a/drivers/media/pci/saa7134/saa7134-cards.c |
2265 | +++ b/drivers/media/pci/saa7134/saa7134-cards.c |
2266 | @@ -8045,8 +8045,8 @@ int saa7134_board_init2(struct saa7134_dev *dev) |
2267 | break; |
2268 | } /* switch() */ |
2269 | |
2270 | - /* initialize tuner */ |
2271 | - if (TUNER_ABSENT != dev->tuner_type) { |
2272 | + /* initialize tuner (don't do this when resuming) */ |
2273 | + if (!dev->insuspend && TUNER_ABSENT != dev->tuner_type) { |
2274 | int has_demod = (dev->tda9887_conf & TDA9887_PRESENT); |
2275 | |
2276 | /* Note: radio tuner address is always filled in, |
2277 | diff --git a/drivers/media/platform/omap3isp/isppreview.c b/drivers/media/platform/omap3isp/isppreview.c |
2278 | index 1c776c1186f1..1dbff1472809 100644 |
2279 | --- a/drivers/media/platform/omap3isp/isppreview.c |
2280 | +++ b/drivers/media/platform/omap3isp/isppreview.c |
2281 | @@ -1079,6 +1079,7 @@ static void preview_config_input_format(struct isp_prev_device *prev, |
2282 | */ |
2283 | static void preview_config_input_size(struct isp_prev_device *prev, u32 active) |
2284 | { |
2285 | + const struct v4l2_mbus_framefmt *format = &prev->formats[PREV_PAD_SINK]; |
2286 | struct isp_device *isp = to_isp_device(prev); |
2287 | unsigned int sph = prev->crop.left; |
2288 | unsigned int eph = prev->crop.left + prev->crop.width - 1; |
2289 | @@ -1086,6 +1087,14 @@ static void preview_config_input_size(struct isp_prev_device *prev, u32 active) |
2290 | unsigned int elv = prev->crop.top + prev->crop.height - 1; |
2291 | u32 features; |
2292 | |
2293 | + if (format->code != V4L2_MBUS_FMT_Y8_1X8 && |
2294 | + format->code != V4L2_MBUS_FMT_Y10_1X10) { |
2295 | + sph -= 2; |
2296 | + eph += 2; |
2297 | + slv -= 2; |
2298 | + elv += 2; |
2299 | + } |
2300 | + |
2301 | features = (prev->params.params[0].features & active) |
2302 | | (prev->params.params[1].features & ~active); |
2303 | |
2304 | diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c |
2305 | index 05e9bd11a3ff..dfdfa772eb1e 100644 |
2306 | --- a/drivers/media/usb/em28xx/em28xx-audio.c |
2307 | +++ b/drivers/media/usb/em28xx/em28xx-audio.c |
2308 | @@ -252,7 +252,7 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) |
2309 | { |
2310 | struct em28xx *dev = snd_pcm_substream_chip(substream); |
2311 | struct snd_pcm_runtime *runtime = substream->runtime; |
2312 | - int ret = 0; |
2313 | + int nonblock, ret = 0; |
2314 | |
2315 | if (!dev) { |
2316 | em28xx_err("BUG: em28xx can't find device struct." |
2317 | @@ -265,15 +265,15 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) |
2318 | |
2319 | dprintk("opening device and trying to acquire exclusive lock\n"); |
2320 | |
2321 | + nonblock = !!(substream->f_flags & O_NONBLOCK); |
2322 | + if (nonblock) { |
2323 | + if (!mutex_trylock(&dev->lock)) |
2324 | + return -EAGAIN; |
2325 | + } else |
2326 | + mutex_lock(&dev->lock); |
2327 | + |
2328 | runtime->hw = snd_em28xx_hw_capture; |
2329 | if ((dev->alt == 0 || dev->is_audio_only) && dev->adev.users == 0) { |
2330 | - int nonblock = !!(substream->f_flags & O_NONBLOCK); |
2331 | - |
2332 | - if (nonblock) { |
2333 | - if (!mutex_trylock(&dev->lock)) |
2334 | - return -EAGAIN; |
2335 | - } else |
2336 | - mutex_lock(&dev->lock); |
2337 | if (dev->is_audio_only) |
2338 | /* vendor audio is on a separate interface */ |
2339 | dev->alt = 1; |
2340 | @@ -299,11 +299,11 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream) |
2341 | ret = em28xx_audio_analog_set(dev); |
2342 | if (ret < 0) |
2343 | goto err; |
2344 | - |
2345 | - dev->adev.users++; |
2346 | - mutex_unlock(&dev->lock); |
2347 | } |
2348 | |
2349 | + dev->adev.users++; |
2350 | + mutex_unlock(&dev->lock); |
2351 | + |
2352 | /* Dynamically adjust the period size */ |
2353 | snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS); |
2354 | snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_BYTES, |
2355 | diff --git a/drivers/media/usb/em28xx/em28xx-dvb.c b/drivers/media/usb/em28xx/em28xx-dvb.c |
2356 | index a0a669e81362..1373cfa4e974 100644 |
2357 | --- a/drivers/media/usb/em28xx/em28xx-dvb.c |
2358 | +++ b/drivers/media/usb/em28xx/em28xx-dvb.c |
2359 | @@ -693,7 +693,8 @@ static void pctv_520e_init(struct em28xx *dev) |
2360 | static int em28xx_pctv_290e_set_lna(struct dvb_frontend *fe) |
2361 | { |
2362 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
2363 | - struct em28xx *dev = fe->dvb->priv; |
2364 | + struct em28xx_i2c_bus *i2c_bus = fe->dvb->priv; |
2365 | + struct em28xx *dev = i2c_bus->dev; |
2366 | #ifdef CONFIG_GPIOLIB |
2367 | struct em28xx_dvb *dvb = dev->dvb; |
2368 | int ret; |
2369 | diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c |
2370 | index 2a38621cf718..41a9a892f79c 100644 |
2371 | --- a/drivers/media/usb/gspca/sn9c20x.c |
2372 | +++ b/drivers/media/usb/gspca/sn9c20x.c |
2373 | @@ -2359,6 +2359,7 @@ static const struct usb_device_id device_table[] = { |
2374 | {USB_DEVICE(0x045e, 0x00f4), SN9C20X(OV9650, 0x30, 0)}, |
2375 | {USB_DEVICE(0x145f, 0x013d), SN9C20X(OV7660, 0x21, 0)}, |
2376 | {USB_DEVICE(0x0458, 0x7029), SN9C20X(HV7131R, 0x11, 0)}, |
2377 | + {USB_DEVICE(0x0458, 0x7045), SN9C20X(MT9M112, 0x5d, LED_REVERSE)}, |
2378 | {USB_DEVICE(0x0458, 0x704a), SN9C20X(MT9M112, 0x5d, 0)}, |
2379 | {USB_DEVICE(0x0458, 0x704c), SN9C20X(MT9M112, 0x5d, 0)}, |
2380 | {USB_DEVICE(0xa168, 0x0610), SN9C20X(HV7131R, 0x11, 0)}, |
2381 | diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c |
2382 | index 898c208889cd..e32d6a59eaca 100644 |
2383 | --- a/drivers/media/usb/uvc/uvc_video.c |
2384 | +++ b/drivers/media/usb/uvc/uvc_video.c |
2385 | @@ -1847,7 +1847,25 @@ int uvc_video_enable(struct uvc_streaming *stream, int enable) |
2386 | |
2387 | if (!enable) { |
2388 | uvc_uninit_video(stream, 1); |
2389 | - usb_set_interface(stream->dev->udev, stream->intfnum, 0); |
2390 | + if (stream->intf->num_altsetting > 1) { |
2391 | + usb_set_interface(stream->dev->udev, |
2392 | + stream->intfnum, 0); |
2393 | + } else { |
2394 | + /* UVC doesn't specify how to inform a bulk-based device |
2395 | + * when the video stream is stopped. Windows sends a |
2396 | + * CLEAR_FEATURE(HALT) request to the video streaming |
2397 | + * bulk endpoint, mimic the same behaviour. |
2398 | + */ |
2399 | + unsigned int epnum = stream->header.bEndpointAddress |
2400 | + & USB_ENDPOINT_NUMBER_MASK; |
2401 | + unsigned int dir = stream->header.bEndpointAddress |
2402 | + & USB_ENDPOINT_DIR_MASK; |
2403 | + unsigned int pipe; |
2404 | + |
2405 | + pipe = usb_sndbulkpipe(stream->dev->udev, epnum) | dir; |
2406 | + usb_clear_halt(stream->dev->udev, pipe); |
2407 | + } |
2408 | + |
2409 | uvc_queue_enable(&stream->queue, 0); |
2410 | uvc_video_clock_cleanup(stream); |
2411 | return 0; |
2412 | diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
2413 | index 8f7a6a454a4c..b63a5e584aa0 100644 |
2414 | --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
2415 | +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c |
2416 | @@ -787,8 +787,8 @@ static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid *kp, struct v4l2_subde |
2417 | #define VIDIOC_DQBUF32 _IOWR('V', 17, struct v4l2_buffer32) |
2418 | #define VIDIOC_ENUMSTD32 _IOWR('V', 25, struct v4l2_standard32) |
2419 | #define VIDIOC_ENUMINPUT32 _IOWR('V', 26, struct v4l2_input32) |
2420 | -#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 63, struct v4l2_subdev_edid32) |
2421 | -#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 64, struct v4l2_subdev_edid32) |
2422 | +#define VIDIOC_SUBDEV_G_EDID32 _IOWR('V', 40, struct v4l2_subdev_edid32) |
2423 | +#define VIDIOC_SUBDEV_S_EDID32 _IOWR('V', 41, struct v4l2_subdev_edid32) |
2424 | #define VIDIOC_TRY_FMT32 _IOWR('V', 64, struct v4l2_format32) |
2425 | #define VIDIOC_G_EXT_CTRLS32 _IOWR('V', 71, struct v4l2_ext_controls32) |
2426 | #define VIDIOC_S_EXT_CTRLS32 _IOWR('V', 72, struct v4l2_ext_controls32) |
2427 | diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c |
2428 | index f7902fe8a526..a2e257970fec 100644 |
2429 | --- a/drivers/media/v4l2-core/v4l2-dv-timings.c |
2430 | +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c |
2431 | @@ -26,6 +26,10 @@ |
2432 | #include <linux/v4l2-dv-timings.h> |
2433 | #include <media/v4l2-dv-timings.h> |
2434 | |
2435 | +MODULE_AUTHOR("Hans Verkuil"); |
2436 | +MODULE_DESCRIPTION("V4L2 DV Timings Helper Functions"); |
2437 | +MODULE_LICENSE("GPL"); |
2438 | + |
2439 | const struct v4l2_dv_timings v4l2_dv_timings_presets[] = { |
2440 | V4L2_DV_BT_CEA_640X480P59_94, |
2441 | V4L2_DV_BT_CEA_720X480I59_94, |
2442 | diff --git a/drivers/mfd/88pm800.c b/drivers/mfd/88pm800.c |
2443 | index 7dca1e640970..841717a2842c 100644 |
2444 | --- a/drivers/mfd/88pm800.c |
2445 | +++ b/drivers/mfd/88pm800.c |
2446 | @@ -571,7 +571,7 @@ static int pm800_probe(struct i2c_client *client, |
2447 | ret = pm800_pages_init(chip); |
2448 | if (ret) { |
2449 | dev_err(&client->dev, "pm800_pages_init failed!\n"); |
2450 | - goto err_page_init; |
2451 | + goto err_device_init; |
2452 | } |
2453 | |
2454 | ret = device_800_init(chip, pdata); |
2455 | @@ -587,7 +587,6 @@ static int pm800_probe(struct i2c_client *client, |
2456 | |
2457 | err_device_init: |
2458 | pm800_pages_exit(chip); |
2459 | -err_page_init: |
2460 | err_subchip_alloc: |
2461 | pm80x_deinit(); |
2462 | out_init: |
2463 | diff --git a/drivers/mfd/88pm860x-core.c b/drivers/mfd/88pm860x-core.c |
2464 | index c9b1f6422941..bcfc9e85b4a0 100644 |
2465 | --- a/drivers/mfd/88pm860x-core.c |
2466 | +++ b/drivers/mfd/88pm860x-core.c |
2467 | @@ -1179,12 +1179,18 @@ static int pm860x_probe(struct i2c_client *client, |
2468 | chip->companion_addr = pdata->companion_addr; |
2469 | chip->companion = i2c_new_dummy(chip->client->adapter, |
2470 | chip->companion_addr); |
2471 | + if (!chip->companion) { |
2472 | + dev_err(&client->dev, |
2473 | + "Failed to allocate I2C companion device\n"); |
2474 | + return -ENODEV; |
2475 | + } |
2476 | chip->regmap_companion = regmap_init_i2c(chip->companion, |
2477 | &pm860x_regmap_config); |
2478 | if (IS_ERR(chip->regmap_companion)) { |
2479 | ret = PTR_ERR(chip->regmap_companion); |
2480 | dev_err(&chip->companion->dev, |
2481 | "Failed to allocate register map: %d\n", ret); |
2482 | + i2c_unregister_device(chip->companion); |
2483 | return ret; |
2484 | } |
2485 | i2c_set_clientdata(chip->companion, chip); |
2486 | diff --git a/drivers/mfd/kempld-core.c b/drivers/mfd/kempld-core.c |
2487 | index d3e23278d299..38917a822335 100644 |
2488 | --- a/drivers/mfd/kempld-core.c |
2489 | +++ b/drivers/mfd/kempld-core.c |
2490 | @@ -322,9 +322,12 @@ static int kempld_detect_device(struct kempld_device_data *pld) |
2491 | return -ENODEV; |
2492 | } |
2493 | |
2494 | - /* Release hardware mutex if aquired */ |
2495 | - if (!(index_reg & KEMPLD_MUTEX_KEY)) |
2496 | + /* Release hardware mutex if acquired */ |
2497 | + if (!(index_reg & KEMPLD_MUTEX_KEY)) { |
2498 | iowrite8(KEMPLD_MUTEX_KEY, pld->io_index); |
2499 | + /* PXT and COMe-cPC2 boards may require a second release */ |
2500 | + iowrite8(KEMPLD_MUTEX_KEY, pld->io_index); |
2501 | + } |
2502 | |
2503 | mutex_unlock(&pld->lock); |
2504 | |
2505 | diff --git a/drivers/mfd/max77686.c b/drivers/mfd/max77686.c |
2506 | index f53d5823a3f7..e5fce765accb 100644 |
2507 | --- a/drivers/mfd/max77686.c |
2508 | +++ b/drivers/mfd/max77686.c |
2509 | @@ -121,6 +121,10 @@ static int max77686_i2c_probe(struct i2c_client *i2c, |
2510 | dev_info(max77686->dev, "device found\n"); |
2511 | |
2512 | max77686->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC); |
2513 | + if (!max77686->rtc) { |
2514 | + dev_err(max77686->dev, "Failed to allocate I2C device for RTC\n"); |
2515 | + return -ENODEV; |
2516 | + } |
2517 | i2c_set_clientdata(max77686->rtc, max77686); |
2518 | |
2519 | max77686_irq_init(max77686); |
2520 | diff --git a/drivers/mfd/max77693.c b/drivers/mfd/max77693.c |
2521 | index e0859987ab6b..c5535f018466 100644 |
2522 | --- a/drivers/mfd/max77693.c |
2523 | +++ b/drivers/mfd/max77693.c |
2524 | @@ -148,9 +148,18 @@ static int max77693_i2c_probe(struct i2c_client *i2c, |
2525 | dev_info(max77693->dev, "device ID: 0x%x\n", reg_data); |
2526 | |
2527 | max77693->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC); |
2528 | + if (!max77693->muic) { |
2529 | + dev_err(max77693->dev, "Failed to allocate I2C device for MUIC\n"); |
2530 | + return -ENODEV; |
2531 | + } |
2532 | i2c_set_clientdata(max77693->muic, max77693); |
2533 | |
2534 | max77693->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); |
2535 | + if (!max77693->haptic) { |
2536 | + dev_err(max77693->dev, "Failed to allocate I2C device for Haptic\n"); |
2537 | + ret = -ENODEV; |
2538 | + goto err_i2c_haptic; |
2539 | + } |
2540 | i2c_set_clientdata(max77693->haptic, max77693); |
2541 | |
2542 | /* |
2543 | @@ -184,8 +193,9 @@ err_mfd: |
2544 | max77693_irq_exit(max77693); |
2545 | err_irq: |
2546 | err_regmap_muic: |
2547 | - i2c_unregister_device(max77693->muic); |
2548 | i2c_unregister_device(max77693->haptic); |
2549 | +err_i2c_haptic: |
2550 | + i2c_unregister_device(max77693->muic); |
2551 | return ret; |
2552 | } |
2553 | |
2554 | diff --git a/drivers/mfd/max8925-i2c.c b/drivers/mfd/max8925-i2c.c |
2555 | index 176aa26fc787..a83eed5c15ca 100644 |
2556 | --- a/drivers/mfd/max8925-i2c.c |
2557 | +++ b/drivers/mfd/max8925-i2c.c |
2558 | @@ -181,9 +181,18 @@ static int max8925_probe(struct i2c_client *client, |
2559 | mutex_init(&chip->io_lock); |
2560 | |
2561 | chip->rtc = i2c_new_dummy(chip->i2c->adapter, RTC_I2C_ADDR); |
2562 | + if (!chip->rtc) { |
2563 | + dev_err(chip->dev, "Failed to allocate I2C device for RTC\n"); |
2564 | + return -ENODEV; |
2565 | + } |
2566 | i2c_set_clientdata(chip->rtc, chip); |
2567 | |
2568 | chip->adc = i2c_new_dummy(chip->i2c->adapter, ADC_I2C_ADDR); |
2569 | + if (!chip->adc) { |
2570 | + dev_err(chip->dev, "Failed to allocate I2C device for ADC\n"); |
2571 | + i2c_unregister_device(chip->rtc); |
2572 | + return -ENODEV; |
2573 | + } |
2574 | i2c_set_clientdata(chip->adc, chip); |
2575 | |
2576 | device_init_wakeup(&client->dev, 1); |
2577 | diff --git a/drivers/mfd/max8997.c b/drivers/mfd/max8997.c |
2578 | index 5adede0fb04c..8cf7a015cfe5 100644 |
2579 | --- a/drivers/mfd/max8997.c |
2580 | +++ b/drivers/mfd/max8997.c |
2581 | @@ -208,10 +208,26 @@ static int max8997_i2c_probe(struct i2c_client *i2c, |
2582 | mutex_init(&max8997->iolock); |
2583 | |
2584 | max8997->rtc = i2c_new_dummy(i2c->adapter, I2C_ADDR_RTC); |
2585 | + if (!max8997->rtc) { |
2586 | + dev_err(max8997->dev, "Failed to allocate I2C device for RTC\n"); |
2587 | + return -ENODEV; |
2588 | + } |
2589 | i2c_set_clientdata(max8997->rtc, max8997); |
2590 | + |
2591 | max8997->haptic = i2c_new_dummy(i2c->adapter, I2C_ADDR_HAPTIC); |
2592 | + if (!max8997->haptic) { |
2593 | + dev_err(max8997->dev, "Failed to allocate I2C device for Haptic\n"); |
2594 | + ret = -ENODEV; |
2595 | + goto err_i2c_haptic; |
2596 | + } |
2597 | i2c_set_clientdata(max8997->haptic, max8997); |
2598 | + |
2599 | max8997->muic = i2c_new_dummy(i2c->adapter, I2C_ADDR_MUIC); |
2600 | + if (!max8997->muic) { |
2601 | + dev_err(max8997->dev, "Failed to allocate I2C device for MUIC\n"); |
2602 | + ret = -ENODEV; |
2603 | + goto err_i2c_muic; |
2604 | + } |
2605 | i2c_set_clientdata(max8997->muic, max8997); |
2606 | |
2607 | pm_runtime_set_active(max8997->dev); |
2608 | @@ -239,7 +255,9 @@ static int max8997_i2c_probe(struct i2c_client *i2c, |
2609 | err_mfd: |
2610 | mfd_remove_devices(max8997->dev); |
2611 | i2c_unregister_device(max8997->muic); |
2612 | +err_i2c_muic: |
2613 | i2c_unregister_device(max8997->haptic); |
2614 | +err_i2c_haptic: |
2615 | i2c_unregister_device(max8997->rtc); |
2616 | return ret; |
2617 | } |
2618 | diff --git a/drivers/mfd/max8998.c b/drivers/mfd/max8998.c |
2619 | index 5d5e186b5d8b..592db06098e6 100644 |
2620 | --- a/drivers/mfd/max8998.c |
2621 | +++ b/drivers/mfd/max8998.c |
2622 | @@ -215,6 +215,10 @@ static int max8998_i2c_probe(struct i2c_client *i2c, |
2623 | mutex_init(&max8998->iolock); |
2624 | |
2625 | max8998->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
2626 | + if (!max8998->rtc) { |
2627 | + dev_err(&i2c->dev, "Failed to allocate I2C device for RTC\n"); |
2628 | + return -ENODEV; |
2629 | + } |
2630 | i2c_set_clientdata(max8998->rtc, max8998); |
2631 | |
2632 | max8998_irq_init(max8998); |
2633 | diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c |
2634 | index 714e2135210e..a76cd85a2868 100644 |
2635 | --- a/drivers/mfd/sec-core.c |
2636 | +++ b/drivers/mfd/sec-core.c |
2637 | @@ -252,6 +252,10 @@ static int sec_pmic_probe(struct i2c_client *i2c, |
2638 | } |
2639 | |
2640 | sec_pmic->rtc = i2c_new_dummy(i2c->adapter, RTC_I2C_ADDR); |
2641 | + if (!sec_pmic->rtc) { |
2642 | + dev_err(&i2c->dev, "Failed to allocate I2C for RTC\n"); |
2643 | + return -ENODEV; |
2644 | + } |
2645 | i2c_set_clientdata(sec_pmic->rtc, sec_pmic); |
2646 | |
2647 | sec_pmic->regmap_rtc = devm_regmap_init_i2c(sec_pmic->rtc, |
2648 | diff --git a/drivers/mfd/tps65910.c b/drivers/mfd/tps65910.c |
2649 | index 1f142d76cbbc..d6573318977f 100644 |
2650 | --- a/drivers/mfd/tps65910.c |
2651 | +++ b/drivers/mfd/tps65910.c |
2652 | @@ -255,8 +255,10 @@ static int tps65910_irq_init(struct tps65910 *tps65910, int irq, |
2653 | ret = regmap_add_irq_chip(tps65910->regmap, tps65910->chip_irq, |
2654 | IRQF_ONESHOT, pdata->irq_base, |
2655 | tps6591x_irqs_chip, &tps65910->irq_data); |
2656 | - if (ret < 0) |
2657 | + if (ret < 0) { |
2658 | dev_warn(tps65910->dev, "Failed to add irq_chip %d\n", ret); |
2659 | + tps65910->chip_irq = 0; |
2660 | + } |
2661 | return ret; |
2662 | } |
2663 | |
2664 | diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c |
2665 | index ed718328eff1..e87140bef667 100644 |
2666 | --- a/drivers/mfd/twl-core.c |
2667 | +++ b/drivers/mfd/twl-core.c |
2668 | @@ -282,11 +282,11 @@ static struct reg_default twl4030_49_defaults[] = { |
2669 | static bool twl4030_49_nop_reg(struct device *dev, unsigned int reg) |
2670 | { |
2671 | switch (reg) { |
2672 | - case 0: |
2673 | - case 3: |
2674 | - case 40: |
2675 | - case 41: |
2676 | - case 42: |
2677 | + case 0x00: |
2678 | + case 0x03: |
2679 | + case 0x40: |
2680 | + case 0x41: |
2681 | + case 0x42: |
2682 | return false; |
2683 | default: |
2684 | return true; |
2685 | diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c |
2686 | index 89a557972d1b..5a9bfa71df86 100644 |
2687 | --- a/drivers/misc/mei/client.c |
2688 | +++ b/drivers/misc/mei/client.c |
2689 | @@ -74,23 +74,69 @@ int mei_me_cl_by_id(struct mei_device *dev, u8 client_id) |
2690 | |
2691 | |
2692 | /** |
2693 | - * mei_io_list_flush - removes list entry belonging to cl. |
2694 | + * mei_cl_cmp_id - tells if the clients are the same |
2695 | * |
2696 | - * @list: An instance of our list structure |
2697 | - * @cl: host client |
2698 | + * @cl1: host client 1 |
2699 | + * @cl2: host client 2 |
2700 | + * |
2701 | + * returns true - if the clients has same host and me ids |
2702 | + * false - otherwise |
2703 | + */ |
2704 | +static inline bool mei_cl_cmp_id(const struct mei_cl *cl1, |
2705 | + const struct mei_cl *cl2) |
2706 | +{ |
2707 | + return cl1 && cl2 && |
2708 | + (cl1->host_client_id == cl2->host_client_id) && |
2709 | + (cl1->me_client_id == cl2->me_client_id); |
2710 | +} |
2711 | + |
2712 | +/** |
2713 | + * mei_io_list_flush - removes cbs belonging to cl. |
2714 | + * |
2715 | + * @list: an instance of our list structure |
2716 | + * @cl: host client, can be NULL for flushing the whole list |
2717 | + * @free: whether to free the cbs |
2718 | */ |
2719 | -void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl) |
2720 | +static void __mei_io_list_flush(struct mei_cl_cb *list, |
2721 | + struct mei_cl *cl, bool free) |
2722 | { |
2723 | struct mei_cl_cb *cb; |
2724 | struct mei_cl_cb *next; |
2725 | |
2726 | + /* enable removing everything if no cl is specified */ |
2727 | list_for_each_entry_safe(cb, next, &list->list, list) { |
2728 | - if (cb->cl && mei_cl_cmp_id(cl, cb->cl)) |
2729 | + if (!cl || (cb->cl && mei_cl_cmp_id(cl, cb->cl))) { |
2730 | list_del(&cb->list); |
2731 | + if (free) |
2732 | + mei_io_cb_free(cb); |
2733 | + } |
2734 | } |
2735 | } |
2736 | |
2737 | /** |
2738 | + * mei_io_list_flush - removes list entry belonging to cl. |
2739 | + * |
2740 | + * @list: An instance of our list structure |
2741 | + * @cl: host client |
2742 | + */ |
2743 | +static inline void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl) |
2744 | +{ |
2745 | + __mei_io_list_flush(list, cl, false); |
2746 | +} |
2747 | + |
2748 | + |
2749 | +/** |
2750 | + * mei_io_list_free - removes cb belonging to cl and free them |
2751 | + * |
2752 | + * @list: An instance of our list structure |
2753 | + * @cl: host client |
2754 | + */ |
2755 | +static inline void mei_io_list_free(struct mei_cl_cb *list, struct mei_cl *cl) |
2756 | +{ |
2757 | + __mei_io_list_flush(list, cl, true); |
2758 | +} |
2759 | + |
2760 | +/** |
2761 | * mei_io_cb_free - free mei_cb_private related memory |
2762 | * |
2763 | * @cb: mei callback struct |
2764 | @@ -196,8 +242,8 @@ int mei_cl_flush_queues(struct mei_cl *cl) |
2765 | |
2766 | cl_dbg(dev, cl, "remove list entry belonging to cl\n"); |
2767 | mei_io_list_flush(&cl->dev->read_list, cl); |
2768 | - mei_io_list_flush(&cl->dev->write_list, cl); |
2769 | - mei_io_list_flush(&cl->dev->write_waiting_list, cl); |
2770 | + mei_io_list_free(&cl->dev->write_list, cl); |
2771 | + mei_io_list_free(&cl->dev->write_waiting_list, cl); |
2772 | mei_io_list_flush(&cl->dev->ctrl_wr_list, cl); |
2773 | mei_io_list_flush(&cl->dev->ctrl_rd_list, cl); |
2774 | mei_io_list_flush(&cl->dev->amthif_cmd_list, cl); |
2775 | @@ -942,20 +988,8 @@ void mei_cl_all_wakeup(struct mei_device *dev) |
2776 | */ |
2777 | void mei_cl_all_write_clear(struct mei_device *dev) |
2778 | { |
2779 | - struct mei_cl_cb *cb, *next; |
2780 | - struct list_head *list; |
2781 | - |
2782 | - list = &dev->write_list.list; |
2783 | - list_for_each_entry_safe(cb, next, list, list) { |
2784 | - list_del(&cb->list); |
2785 | - mei_io_cb_free(cb); |
2786 | - } |
2787 | - |
2788 | - list = &dev->write_waiting_list.list; |
2789 | - list_for_each_entry_safe(cb, next, list, list) { |
2790 | - list_del(&cb->list); |
2791 | - mei_io_cb_free(cb); |
2792 | - } |
2793 | + mei_io_list_free(&dev->write_list, NULL); |
2794 | + mei_io_list_free(&dev->write_waiting_list, NULL); |
2795 | } |
2796 | |
2797 | |
2798 | diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h |
2799 | index c8396e582f1c..0820e121d137 100644 |
2800 | --- a/drivers/misc/mei/client.h |
2801 | +++ b/drivers/misc/mei/client.h |
2802 | @@ -45,8 +45,6 @@ static inline void mei_io_list_init(struct mei_cl_cb *list) |
2803 | { |
2804 | INIT_LIST_HEAD(&list->list); |
2805 | } |
2806 | -void mei_io_list_flush(struct mei_cl_cb *list, struct mei_cl *cl); |
2807 | - |
2808 | /* |
2809 | * MEI Host Client Functions |
2810 | */ |
2811 | @@ -61,22 +59,6 @@ int mei_cl_unlink(struct mei_cl *cl); |
2812 | int mei_cl_flush_queues(struct mei_cl *cl); |
2813 | struct mei_cl_cb *mei_cl_find_read_cb(struct mei_cl *cl); |
2814 | |
2815 | -/** |
2816 | - * mei_cl_cmp_id - tells if file private data have same id |
2817 | - * |
2818 | - * @fe1: private data of 1. file object |
2819 | - * @fe2: private data of 2. file object |
2820 | - * |
2821 | - * returns true - if ids are the same and not NULL |
2822 | - */ |
2823 | -static inline bool mei_cl_cmp_id(const struct mei_cl *cl1, |
2824 | - const struct mei_cl *cl2) |
2825 | -{ |
2826 | - return cl1 && cl2 && |
2827 | - (cl1->host_client_id == cl2->host_client_id) && |
2828 | - (cl1->me_client_id == cl2->me_client_id); |
2829 | -} |
2830 | - |
2831 | |
2832 | int mei_cl_flow_ctrl_creds(struct mei_cl *cl); |
2833 | |
2834 | diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h |
2835 | index 66f411a6e8ea..cabc04383685 100644 |
2836 | --- a/drivers/misc/mei/hw-me-regs.h |
2837 | +++ b/drivers/misc/mei/hw-me-regs.h |
2838 | @@ -115,6 +115,11 @@ |
2839 | #define MEI_DEV_ID_LPT_HR 0x8CBA /* Lynx Point H Refresh */ |
2840 | |
2841 | #define MEI_DEV_ID_WPT_LP 0x9CBA /* Wildcat Point LP */ |
2842 | + |
2843 | +/* Host Firmware Status Registers in PCI Config Space */ |
2844 | +#define PCI_CFG_HFS_1 0x40 |
2845 | +#define PCI_CFG_HFS_2 0x48 |
2846 | + |
2847 | /* |
2848 | * MEI HW Section |
2849 | */ |
2850 | diff --git a/drivers/misc/mei/interrupt.c b/drivers/misc/mei/interrupt.c |
2851 | index f0fbb5179f80..d36286874946 100644 |
2852 | --- a/drivers/misc/mei/interrupt.c |
2853 | +++ b/drivers/misc/mei/interrupt.c |
2854 | @@ -428,8 +428,7 @@ int mei_irq_write_handler(struct mei_device *dev, struct mei_cl_cb *cmpl_list) |
2855 | |
2856 | cl->status = 0; |
2857 | list_del(&cb->list); |
2858 | - if (MEI_WRITING == cl->writing_state && |
2859 | - cb->fop_type == MEI_FOP_WRITE && |
2860 | + if (cb->fop_type == MEI_FOP_WRITE && |
2861 | cl != &dev->iamthif_cl) { |
2862 | cl_dbg(dev, cl, "MEI WRITE COMPLETE\n"); |
2863 | cl->writing_state = MEI_WRITE_COMPLETE; |
2864 | diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c |
2865 | index 5424f8ff3f7f..cfe1789923a3 100644 |
2866 | --- a/drivers/misc/mei/main.c |
2867 | +++ b/drivers/misc/mei/main.c |
2868 | @@ -653,8 +653,7 @@ static unsigned int mei_poll(struct file *file, poll_table *wait) |
2869 | goto out; |
2870 | } |
2871 | |
2872 | - if (MEI_WRITE_COMPLETE == cl->writing_state) |
2873 | - mask |= (POLLIN | POLLRDNORM); |
2874 | + mask |= (POLLIN | POLLRDNORM); |
2875 | |
2876 | out: |
2877 | mutex_unlock(&dev->device_lock); |
2878 | diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c |
2879 | index ddadd08956f4..bf4bb74c39ff 100644 |
2880 | --- a/drivers/misc/mei/pci-me.c |
2881 | +++ b/drivers/misc/mei/pci-me.c |
2882 | @@ -100,15 +100,31 @@ static bool mei_me_quirk_probe(struct pci_dev *pdev, |
2883 | const struct pci_device_id *ent) |
2884 | { |
2885 | u32 reg; |
2886 | - if (ent->device == MEI_DEV_ID_PBG_1) { |
2887 | - pci_read_config_dword(pdev, 0x48, ®); |
2888 | - /* make sure that bit 9 is up and bit 10 is down */ |
2889 | - if ((reg & 0x600) == 0x200) { |
2890 | - dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n"); |
2891 | - return false; |
2892 | - } |
2893 | + /* Cougar Point || Patsburg */ |
2894 | + if (ent->device == MEI_DEV_ID_CPT_1 || |
2895 | + ent->device == MEI_DEV_ID_PBG_1) { |
2896 | + pci_read_config_dword(pdev, PCI_CFG_HFS_2, ®); |
2897 | + /* make sure that bit 9 (NM) is up and bit 10 (DM) is down */ |
2898 | + if ((reg & 0x600) == 0x200) |
2899 | + goto no_mei; |
2900 | } |
2901 | + |
2902 | + /* Lynx Point */ |
2903 | + if (ent->device == MEI_DEV_ID_LPT_H || |
2904 | + ent->device == MEI_DEV_ID_LPT_W || |
2905 | + ent->device == MEI_DEV_ID_LPT_HR) { |
2906 | + /* Read ME FW Status check for SPS Firmware */ |
2907 | + pci_read_config_dword(pdev, PCI_CFG_HFS_1, ®); |
2908 | + /* if bits [19:16] = 15, running SPS Firmware */ |
2909 | + if ((reg & 0xf0000) == 0xf0000) |
2910 | + goto no_mei; |
2911 | + } |
2912 | + |
2913 | return true; |
2914 | + |
2915 | +no_mei: |
2916 | + dev_info(&pdev->dev, "Device doesn't have valid ME Interface\n"); |
2917 | + return false; |
2918 | } |
2919 | /** |
2920 | * mei_probe - Device Initialization Routine |
2921 | diff --git a/drivers/pci/host/pci-imx6.c b/drivers/pci/host/pci-imx6.c |
2922 | index e8663a8c3406..ee082509b0ba 100644 |
2923 | --- a/drivers/pci/host/pci-imx6.c |
2924 | +++ b/drivers/pci/host/pci-imx6.c |
2925 | @@ -424,20 +424,40 @@ static void imx6_pcie_reset_phy(struct pcie_port *pp) |
2926 | |
2927 | static int imx6_pcie_link_up(struct pcie_port *pp) |
2928 | { |
2929 | - u32 rc, ltssm, rx_valid; |
2930 | + u32 rc, debug_r0, rx_valid; |
2931 | + int count = 5; |
2932 | |
2933 | /* |
2934 | - * Test if the PHY reports that the link is up and also that |
2935 | - * the link training finished. It might happen that the PHY |
2936 | - * reports the link is already up, but the link training bit |
2937 | - * is still set, so make sure to check the training is done |
2938 | - * as well here. |
2939 | + * Test if the PHY reports that the link is up and also that the LTSSM |
2940 | + * training finished. There are three possible states of the link when |
2941 | + * this code is called: |
2942 | + * 1) The link is DOWN (unlikely) |
2943 | + * The link didn't come up yet for some reason. This usually means |
2944 | + * we have a real problem somewhere. Reset the PHY and exit. This |
2945 | + * state calls for inspection of the DEBUG registers. |
2946 | + * 2) The link is UP, but still in LTSSM training |
2947 | + * Wait for the training to finish, which should take a very short |
2948 | + * time. If the training does not finish, we have a problem and we |
2949 | + * need to inspect the DEBUG registers. If the training does finish, |
2950 | + * the link is up and operating correctly. |
2951 | + * 3) The link is UP and no longer in LTSSM training |
2952 | + * The link is up and operating correctly. |
2953 | */ |
2954 | - rc = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1); |
2955 | - if ((rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_UP) && |
2956 | - !(rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING)) |
2957 | - return 1; |
2958 | - |
2959 | + while (1) { |
2960 | + rc = readl(pp->dbi_base + PCIE_PHY_DEBUG_R1); |
2961 | + if (!(rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_UP)) |
2962 | + break; |
2963 | + if (!(rc & PCIE_PHY_DEBUG_R1_XMLH_LINK_IN_TRAINING)) |
2964 | + return 1; |
2965 | + if (!count--) |
2966 | + break; |
2967 | + dev_dbg(pp->dev, "Link is up, but still in training\n"); |
2968 | + /* |
2969 | + * Wait a little bit, then re-check if the link finished |
2970 | + * the training. |
2971 | + */ |
2972 | + usleep_range(1000, 2000); |
2973 | + } |
2974 | /* |
2975 | * From L0, initiate MAC entry to gen2 if EP/RC supports gen2. |
2976 | * Wait 2ms (LTSSM timeout is 24ms, PHY lock is ~5us in gen2). |
2977 | @@ -446,15 +466,16 @@ static int imx6_pcie_link_up(struct pcie_port *pp) |
2978 | * to gen2 is stuck |
2979 | */ |
2980 | pcie_phy_read(pp->dbi_base, PCIE_PHY_RX_ASIC_OUT, &rx_valid); |
2981 | - ltssm = readl(pp->dbi_base + PCIE_PHY_DEBUG_R0) & 0x3F; |
2982 | + debug_r0 = readl(pp->dbi_base + PCIE_PHY_DEBUG_R0); |
2983 | |
2984 | if (rx_valid & 0x01) |
2985 | return 0; |
2986 | |
2987 | - if (ltssm != 0x0d) |
2988 | + if ((debug_r0 & 0x3f) != 0x0d) |
2989 | return 0; |
2990 | |
2991 | dev_err(pp->dev, "transition to gen2 is stuck, reset PHY!\n"); |
2992 | + dev_dbg(pp->dev, "debug_r0=%08x debug_r1=%08x\n", debug_r0, rc); |
2993 | |
2994 | imx6_pcie_reset_phy(pp); |
2995 | |
2996 | diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c |
2997 | index 0e79665afd44..05e352889868 100644 |
2998 | --- a/drivers/pci/host/pci-mvebu.c |
2999 | +++ b/drivers/pci/host/pci-mvebu.c |
3000 | @@ -797,7 +797,7 @@ static int mvebu_get_tgt_attr(struct device_node *np, int devfn, |
3001 | |
3002 | for (i = 0; i < nranges; i++) { |
3003 | u32 flags = of_read_number(range, 1); |
3004 | - u32 slot = of_read_number(range, 2); |
3005 | + u32 slot = of_read_number(range + 1, 1); |
3006 | u64 cpuaddr = of_read_number(range + na, pna); |
3007 | unsigned long rtype; |
3008 | |
3009 | diff --git a/drivers/regulator/arizona-ldo1.c b/drivers/regulator/arizona-ldo1.c |
3010 | index 4f6c2055f6b2..f0ea4fdfde87 100644 |
3011 | --- a/drivers/regulator/arizona-ldo1.c |
3012 | +++ b/drivers/regulator/arizona-ldo1.c |
3013 | @@ -153,11 +153,9 @@ static const struct regulator_desc arizona_ldo1 = { |
3014 | |
3015 | .vsel_reg = ARIZONA_LDO1_CONTROL_1, |
3016 | .vsel_mask = ARIZONA_LDO1_VSEL_MASK, |
3017 | - .bypass_reg = ARIZONA_LDO1_CONTROL_1, |
3018 | - .bypass_mask = ARIZONA_LDO1_BYPASS, |
3019 | .min_uV = 900000, |
3020 | - .uV_step = 50000, |
3021 | - .n_voltages = 7, |
3022 | + .uV_step = 25000, |
3023 | + .n_voltages = 13, |
3024 | .enable_time = 500, |
3025 | |
3026 | .owner = THIS_MODULE, |
3027 | @@ -203,6 +201,7 @@ static int arizona_ldo1_probe(struct platform_device *pdev) |
3028 | */ |
3029 | switch (arizona->type) { |
3030 | case WM5102: |
3031 | + case WM8997: |
3032 | desc = &arizona_ldo1_hc; |
3033 | ldo1->init_data = arizona_ldo1_dvfs; |
3034 | break; |
3035 | diff --git a/drivers/s390/char/con3215.c b/drivers/s390/char/con3215.c |
3036 | index eb5d22795c47..bb86494e2b7b 100644 |
3037 | --- a/drivers/s390/char/con3215.c |
3038 | +++ b/drivers/s390/char/con3215.c |
3039 | @@ -922,7 +922,7 @@ static int __init con3215_init(void) |
3040 | raw3215_freelist = req; |
3041 | } |
3042 | |
3043 | - cdev = ccw_device_probe_console(); |
3044 | + cdev = ccw_device_probe_console(&raw3215_ccw_driver); |
3045 | if (IS_ERR(cdev)) |
3046 | return -ENODEV; |
3047 | |
3048 | diff --git a/drivers/s390/char/con3270.c b/drivers/s390/char/con3270.c |
3049 | index 699fd3e363df..bb6b0df50b33 100644 |
3050 | --- a/drivers/s390/char/con3270.c |
3051 | +++ b/drivers/s390/char/con3270.c |
3052 | @@ -576,7 +576,6 @@ static struct console con3270 = { |
3053 | static int __init |
3054 | con3270_init(void) |
3055 | { |
3056 | - struct ccw_device *cdev; |
3057 | struct raw3270 *rp; |
3058 | void *cbuf; |
3059 | int i; |
3060 | @@ -591,10 +590,7 @@ con3270_init(void) |
3061 | cpcmd("TERM AUTOCR OFF", NULL, 0, NULL); |
3062 | } |
3063 | |
3064 | - cdev = ccw_device_probe_console(); |
3065 | - if (IS_ERR(cdev)) |
3066 | - return -ENODEV; |
3067 | - rp = raw3270_setup_console(cdev); |
3068 | + rp = raw3270_setup_console(); |
3069 | if (IS_ERR(rp)) |
3070 | return PTR_ERR(rp); |
3071 | |
3072 | diff --git a/drivers/s390/char/raw3270.c b/drivers/s390/char/raw3270.c |
3073 | index 2cdec21e8924..de2c0483949f 100644 |
3074 | --- a/drivers/s390/char/raw3270.c |
3075 | +++ b/drivers/s390/char/raw3270.c |
3076 | @@ -776,16 +776,24 @@ raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, char *ascebc) |
3077 | } |
3078 | |
3079 | #ifdef CONFIG_TN3270_CONSOLE |
3080 | +/* Tentative definition - see below for actual definition. */ |
3081 | +static struct ccw_driver raw3270_ccw_driver; |
3082 | + |
3083 | /* |
3084 | * Setup 3270 device configured as console. |
3085 | */ |
3086 | -struct raw3270 __init *raw3270_setup_console(struct ccw_device *cdev) |
3087 | +struct raw3270 __init *raw3270_setup_console(void) |
3088 | { |
3089 | + struct ccw_device *cdev; |
3090 | unsigned long flags; |
3091 | struct raw3270 *rp; |
3092 | char *ascebc; |
3093 | int rc; |
3094 | |
3095 | + cdev = ccw_device_probe_console(&raw3270_ccw_driver); |
3096 | + if (IS_ERR(cdev)) |
3097 | + return ERR_CAST(cdev); |
3098 | + |
3099 | rp = kzalloc(sizeof(struct raw3270), GFP_KERNEL | GFP_DMA); |
3100 | ascebc = kzalloc(256, GFP_KERNEL); |
3101 | rc = raw3270_setup_device(cdev, rp, ascebc); |
3102 | diff --git a/drivers/s390/char/raw3270.h b/drivers/s390/char/raw3270.h |
3103 | index 7b73ff8c1bd7..359276a88396 100644 |
3104 | --- a/drivers/s390/char/raw3270.h |
3105 | +++ b/drivers/s390/char/raw3270.h |
3106 | @@ -190,7 +190,7 @@ raw3270_put_view(struct raw3270_view *view) |
3107 | wake_up(&raw3270_wait_queue); |
3108 | } |
3109 | |
3110 | -struct raw3270 *raw3270_setup_console(struct ccw_device *cdev); |
3111 | +struct raw3270 *raw3270_setup_console(void); |
3112 | void raw3270_wait_cons_dev(struct raw3270 *); |
3113 | |
3114 | /* Notifier for device addition/removal */ |
3115 | diff --git a/drivers/s390/cio/device.c b/drivers/s390/cio/device.c |
3116 | index e9d783563cbb..4283dd3cdd49 100644 |
3117 | --- a/drivers/s390/cio/device.c |
3118 | +++ b/drivers/s390/cio/device.c |
3119 | @@ -1609,7 +1609,7 @@ out_unlock: |
3120 | return rc; |
3121 | } |
3122 | |
3123 | -struct ccw_device *ccw_device_probe_console(void) |
3124 | +struct ccw_device *ccw_device_probe_console(struct ccw_driver *drv) |
3125 | { |
3126 | struct io_subchannel_private *io_priv; |
3127 | struct ccw_device *cdev; |
3128 | @@ -1631,6 +1631,7 @@ struct ccw_device *ccw_device_probe_console(void) |
3129 | kfree(io_priv); |
3130 | return cdev; |
3131 | } |
3132 | + cdev->drv = drv; |
3133 | set_io_private(sch, io_priv); |
3134 | ret = ccw_device_console_enable(cdev, sch); |
3135 | if (ret) { |
3136 | diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c |
3137 | index 4f6a30b8e5f9..652b41b4ddbd 100644 |
3138 | --- a/drivers/scsi/arcmsr/arcmsr_hba.c |
3139 | +++ b/drivers/scsi/arcmsr/arcmsr_hba.c |
3140 | @@ -2500,16 +2500,15 @@ static int arcmsr_polling_ccbdone(struct AdapterControlBlock *acb, |
3141 | static int arcmsr_iop_confirm(struct AdapterControlBlock *acb) |
3142 | { |
3143 | uint32_t cdb_phyaddr, cdb_phyaddr_hi32; |
3144 | - dma_addr_t dma_coherent_handle; |
3145 | + |
3146 | /* |
3147 | ******************************************************************** |
3148 | ** here we need to tell iop 331 our freeccb.HighPart |
3149 | ** if freeccb.HighPart is not zero |
3150 | ******************************************************************** |
3151 | */ |
3152 | - dma_coherent_handle = acb->dma_coherent_handle; |
3153 | - cdb_phyaddr = (uint32_t)(dma_coherent_handle); |
3154 | - cdb_phyaddr_hi32 = (uint32_t)((cdb_phyaddr >> 16) >> 16); |
3155 | + cdb_phyaddr = lower_32_bits(acb->dma_coherent_handle); |
3156 | + cdb_phyaddr_hi32 = upper_32_bits(acb->dma_coherent_handle); |
3157 | acb->cdb_phyaddr_hi32 = cdb_phyaddr_hi32; |
3158 | /* |
3159 | *********************************************************************** |
3160 | diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c |
3161 | index 89a53002b585..83cb61266979 100644 |
3162 | --- a/drivers/scsi/qla2xxx/qla_os.c |
3163 | +++ b/drivers/scsi/qla2xxx/qla_os.c |
3164 | @@ -2536,7 +2536,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) |
3165 | ha->flags.enable_64bit_addressing ? "enable" : |
3166 | "disable"); |
3167 | ret = qla2x00_mem_alloc(ha, req_length, rsp_length, &req, &rsp); |
3168 | - if (!ret) { |
3169 | + if (ret) { |
3170 | ql_log_pci(ql_log_fatal, pdev, 0x0031, |
3171 | "Failed to allocate memory for adapter, aborting.\n"); |
3172 | |
3173 | @@ -3478,10 +3478,10 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, |
3174 | else { |
3175 | qla2x00_set_reserved_loop_ids(ha); |
3176 | ql_dbg_pci(ql_dbg_init, ha->pdev, 0x0123, |
3177 | - "loop_id_map=%p. \n", ha->loop_id_map); |
3178 | + "loop_id_map=%p.\n", ha->loop_id_map); |
3179 | } |
3180 | |
3181 | - return 1; |
3182 | + return 0; |
3183 | |
3184 | fail_async_pd: |
3185 | dma_pool_free(ha->s_dma_pool, ha->ex_init_cb, ha->ex_init_cb_dma); |
3186 | diff --git a/drivers/spi/spi-dw.c b/drivers/spi/spi-dw.c |
3187 | index bf98d63d92b3..e63d27013142 100644 |
3188 | --- a/drivers/spi/spi-dw.c |
3189 | +++ b/drivers/spi/spi-dw.c |
3190 | @@ -671,12 +671,6 @@ static int dw_spi_setup(struct spi_device *spi) |
3191 | return 0; |
3192 | } |
3193 | |
3194 | -static void dw_spi_cleanup(struct spi_device *spi) |
3195 | -{ |
3196 | - struct chip_data *chip = spi_get_ctldata(spi); |
3197 | - kfree(chip); |
3198 | -} |
3199 | - |
3200 | static int init_queue(struct dw_spi *dws) |
3201 | { |
3202 | INIT_LIST_HEAD(&dws->queue); |
3203 | @@ -806,7 +800,6 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws) |
3204 | master->bits_per_word_mask = SPI_BPW_MASK(8) | SPI_BPW_MASK(16); |
3205 | master->bus_num = dws->bus_num; |
3206 | master->num_chipselect = dws->num_cs; |
3207 | - master->cleanup = dw_spi_cleanup; |
3208 | master->setup = dw_spi_setup; |
3209 | master->transfer = dw_spi_transfer; |
3210 | |
3211 | diff --git a/drivers/spi/spi-efm32.c b/drivers/spi/spi-efm32.c |
3212 | index d4d3cc534792..8933eb7ab79b 100644 |
3213 | --- a/drivers/spi/spi-efm32.c |
3214 | +++ b/drivers/spi/spi-efm32.c |
3215 | @@ -487,6 +487,9 @@ static int efm32_spi_remove(struct platform_device *pdev) |
3216 | |
3217 | static const struct of_device_id efm32_spi_dt_ids[] = { |
3218 | { |
3219 | + .compatible = "energymicro,efm32-spi", |
3220 | + }, { |
3221 | + /* doesn't follow the "vendor,device" scheme, don't use */ |
3222 | .compatible = "efm32,spi", |
3223 | }, { |
3224 | /* sentinel */ |
3225 | diff --git a/drivers/staging/comedi/drivers/usbdux.c b/drivers/staging/comedi/drivers/usbdux.c |
3226 | index 71db683098d6..b59af0303581 100644 |
3227 | --- a/drivers/staging/comedi/drivers/usbdux.c |
3228 | +++ b/drivers/staging/comedi/drivers/usbdux.c |
3229 | @@ -493,7 +493,7 @@ static void usbduxsub_ao_isoc_irq(struct urb *urb) |
3230 | /* pointer to the DA */ |
3231 | *datap++ = val & 0xff; |
3232 | *datap++ = (val >> 8) & 0xff; |
3233 | - *datap++ = chan; |
3234 | + *datap++ = chan << 6; |
3235 | devpriv->ao_readback[chan] = val; |
3236 | |
3237 | s->async->events |= COMEDI_CB_BLOCK; |
3238 | @@ -1040,11 +1040,8 @@ static int usbdux_ao_cmd(struct comedi_device *dev, struct comedi_subdevice *s) |
3239 | /* set current channel of the running acquisition to zero */ |
3240 | s->async->cur_chan = 0; |
3241 | |
3242 | - for (i = 0; i < cmd->chanlist_len; ++i) { |
3243 | - unsigned int chan = CR_CHAN(cmd->chanlist[i]); |
3244 | - |
3245 | - devpriv->ao_chanlist[i] = chan << 6; |
3246 | - } |
3247 | + for (i = 0; i < cmd->chanlist_len; ++i) |
3248 | + devpriv->ao_chanlist[i] = CR_CHAN(cmd->chanlist[i]); |
3249 | |
3250 | /* we count in steps of 1ms (125us) */ |
3251 | /* 125us mode not used yet */ |
3252 | diff --git a/drivers/staging/rtl8188eu/core/rtw_recv.c b/drivers/staging/rtl8188eu/core/rtw_recv.c |
3253 | index c9c180649c12..cec3f1628cd8 100644 |
3254 | --- a/drivers/staging/rtl8188eu/core/rtw_recv.c |
3255 | +++ b/drivers/staging/rtl8188eu/core/rtw_recv.c |
3256 | @@ -542,7 +542,7 @@ _func_exit_; |
3257 | /* set the security information in the recv_frame */ |
3258 | static union recv_frame *portctrl(struct adapter *adapter, union recv_frame *precv_frame) |
3259 | { |
3260 | - u8 *psta_addr = NULL, *ptr; |
3261 | + u8 *psta_addr, *ptr; |
3262 | uint auth_alg; |
3263 | struct recv_frame_hdr *pfhdr; |
3264 | struct sta_info *psta; |
3265 | @@ -556,7 +556,6 @@ static union recv_frame *portctrl(struct adapter *adapter, union recv_frame *pre |
3266 | _func_enter_; |
3267 | |
3268 | pstapriv = &adapter->stapriv; |
3269 | - psta = rtw_get_stainfo(pstapriv, psta_addr); |
3270 | |
3271 | auth_alg = adapter->securitypriv.dot11AuthAlgrthm; |
3272 | |
3273 | @@ -564,6 +563,7 @@ _func_enter_; |
3274 | pfhdr = &precv_frame->u.hdr; |
3275 | pattrib = &pfhdr->attrib; |
3276 | psta_addr = pattrib->ta; |
3277 | + psta = rtw_get_stainfo(pstapriv, psta_addr); |
3278 | |
3279 | prtnframe = NULL; |
3280 | |
3281 | diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c |
3282 | index 23ec684b60e1..274c359279ef 100644 |
3283 | --- a/drivers/staging/rtl8712/rtl871x_recv.c |
3284 | +++ b/drivers/staging/rtl8712/rtl871x_recv.c |
3285 | @@ -254,7 +254,7 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, |
3286 | struct sta_info *psta; |
3287 | struct sta_priv *pstapriv; |
3288 | union recv_frame *prtnframe; |
3289 | - u16 ether_type = 0; |
3290 | + u16 ether_type; |
3291 | |
3292 | pstapriv = &adapter->stapriv; |
3293 | ptr = get_recvframe_data(precv_frame); |
3294 | @@ -263,15 +263,14 @@ union recv_frame *r8712_portctrl(struct _adapter *adapter, |
3295 | psta = r8712_get_stainfo(pstapriv, psta_addr); |
3296 | auth_alg = adapter->securitypriv.AuthAlgrthm; |
3297 | if (auth_alg == 2) { |
3298 | + /* get ether_type */ |
3299 | + ptr = ptr + pfhdr->attrib.hdrlen + LLC_HEADER_SIZE; |
3300 | + memcpy(ðer_type, ptr, 2); |
3301 | + ether_type = ntohs((unsigned short)ether_type); |
3302 | + |
3303 | if ((psta != NULL) && (psta->ieee8021x_blocked)) { |
3304 | /* blocked |
3305 | * only accept EAPOL frame */ |
3306 | - prtnframe = precv_frame; |
3307 | - /*get ether_type */ |
3308 | - ptr = ptr + pfhdr->attrib.hdrlen + |
3309 | - pfhdr->attrib.iv_len + LLC_HEADER_SIZE; |
3310 | - memcpy(ðer_type, ptr, 2); |
3311 | - ether_type = ntohs((unsigned short)ether_type); |
3312 | if (ether_type == 0x888e) |
3313 | prtnframe = precv_frame; |
3314 | else { |
3315 | diff --git a/drivers/staging/serqt_usb2/serqt_usb2.c b/drivers/staging/serqt_usb2/serqt_usb2.c |
3316 | index f0fcbf7c7d7f..868226953d5c 100644 |
3317 | --- a/drivers/staging/serqt_usb2/serqt_usb2.c |
3318 | +++ b/drivers/staging/serqt_usb2/serqt_usb2.c |
3319 | @@ -724,7 +724,7 @@ static int qt_startup(struct usb_serial *serial) |
3320 | goto startup_error; |
3321 | } |
3322 | |
3323 | - switch (serial->dev->descriptor.idProduct) { |
3324 | + switch (le16_to_cpu(serial->dev->descriptor.idProduct)) { |
3325 | case QUATECH_DSU100: |
3326 | case QUATECH_QSU100: |
3327 | case QUATECH_ESU100A: |
3328 | diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c |
3329 | index b83ec378d04f..7e5469a80fe3 100644 |
3330 | --- a/drivers/target/iscsi/iscsi_target.c |
3331 | +++ b/drivers/target/iscsi/iscsi_target.c |
3332 | @@ -2468,6 +2468,7 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) |
3333 | { |
3334 | struct iscsi_cmd *cmd; |
3335 | struct iscsi_conn *conn_p; |
3336 | + bool found = false; |
3337 | |
3338 | /* |
3339 | * Only send a Asynchronous Message on connections whos network |
3340 | @@ -2476,11 +2477,12 @@ static void iscsit_build_conn_drop_async_message(struct iscsi_conn *conn) |
3341 | list_for_each_entry(conn_p, &conn->sess->sess_conn_list, conn_list) { |
3342 | if (conn_p->conn_state == TARG_CONN_STATE_LOGGED_IN) { |
3343 | iscsit_inc_conn_usage_count(conn_p); |
3344 | + found = true; |
3345 | break; |
3346 | } |
3347 | } |
3348 | |
3349 | - if (!conn_p) |
3350 | + if (!found) |
3351 | return; |
3352 | |
3353 | cmd = iscsit_allocate_cmd(conn_p, TASK_RUNNING); |
3354 | diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c |
3355 | index 554d4f75a75a..9e0232cca92e 100644 |
3356 | --- a/drivers/target/target_core_iblock.c |
3357 | +++ b/drivers/target/target_core_iblock.c |
3358 | @@ -203,10 +203,9 @@ static void iblock_free_device(struct se_device *dev) |
3359 | |
3360 | if (ib_dev->ibd_bd != NULL) |
3361 | blkdev_put(ib_dev->ibd_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL); |
3362 | - if (ib_dev->ibd_bio_set != NULL) { |
3363 | - bioset_integrity_free(ib_dev->ibd_bio_set); |
3364 | + if (ib_dev->ibd_bio_set != NULL) |
3365 | bioset_free(ib_dev->ibd_bio_set); |
3366 | - } |
3367 | + |
3368 | kfree(ib_dev); |
3369 | } |
3370 | |
3371 | diff --git a/drivers/target/target_core_rd.c b/drivers/target/target_core_rd.c |
3372 | index 66a5aba5a0d9..b920db3388cd 100644 |
3373 | --- a/drivers/target/target_core_rd.c |
3374 | +++ b/drivers/target/target_core_rd.c |
3375 | @@ -242,7 +242,7 @@ static void rd_release_prot_space(struct rd_dev *rd_dev) |
3376 | rd_dev->sg_prot_count = 0; |
3377 | } |
3378 | |
3379 | -static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length) |
3380 | +static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length, int block_size) |
3381 | { |
3382 | struct rd_dev_sg_table *sg_table; |
3383 | u32 total_sg_needed, sg_tables; |
3384 | @@ -252,8 +252,13 @@ static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length) |
3385 | |
3386 | if (rd_dev->rd_flags & RDF_NULLIO) |
3387 | return 0; |
3388 | - |
3389 | - total_sg_needed = rd_dev->rd_page_count / prot_length; |
3390 | + /* |
3391 | + * prot_length=8byte dif data |
3392 | + * tot sg needed = rd_page_count * (PGSZ/block_size) * |
3393 | + * (prot_length/block_size) + pad |
3394 | + * PGSZ canceled each other. |
3395 | + */ |
3396 | + total_sg_needed = (rd_dev->rd_page_count * prot_length / block_size) + 1; |
3397 | |
3398 | sg_tables = (total_sg_needed / max_sg_per_table) + 1; |
3399 | |
3400 | @@ -606,7 +611,8 @@ static int rd_init_prot(struct se_device *dev) |
3401 | if (!dev->dev_attrib.pi_prot_type) |
3402 | return 0; |
3403 | |
3404 | - return rd_build_prot_space(rd_dev, dev->prot_length); |
3405 | + return rd_build_prot_space(rd_dev, dev->prot_length, |
3406 | + dev->dev_attrib.block_size); |
3407 | } |
3408 | |
3409 | static void rd_free_prot(struct se_device *dev) |
3410 | diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c |
3411 | index 77e6531fb0a1..aa064a7bb446 100644 |
3412 | --- a/drivers/target/target_core_sbc.c |
3413 | +++ b/drivers/target/target_core_sbc.c |
3414 | @@ -425,13 +425,14 @@ static sense_reason_t compare_and_write_callback(struct se_cmd *cmd) |
3415 | goto out; |
3416 | } |
3417 | |
3418 | - write_sg = kzalloc(sizeof(struct scatterlist) * cmd->t_data_nents, |
3419 | + write_sg = kmalloc(sizeof(struct scatterlist) * cmd->t_data_nents, |
3420 | GFP_KERNEL); |
3421 | if (!write_sg) { |
3422 | pr_err("Unable to allocate compare_and_write sg\n"); |
3423 | ret = TCM_OUT_OF_RESOURCES; |
3424 | goto out; |
3425 | } |
3426 | + sg_init_table(write_sg, cmd->t_data_nents); |
3427 | /* |
3428 | * Setup verify and write data payloads from total NumberLBAs. |
3429 | */ |
3430 | diff --git a/drivers/target/tcm_fc/tfc_sess.c b/drivers/target/tcm_fc/tfc_sess.c |
3431 | index ae52c08dad09..e9fe60fa7df1 100644 |
3432 | --- a/drivers/target/tcm_fc/tfc_sess.c |
3433 | +++ b/drivers/target/tcm_fc/tfc_sess.c |
3434 | @@ -68,6 +68,7 @@ static struct ft_tport *ft_tport_create(struct fc_lport *lport) |
3435 | |
3436 | if (tport) { |
3437 | tport->tpg = tpg; |
3438 | + tpg->tport = tport; |
3439 | return tport; |
3440 | } |
3441 | |
3442 | diff --git a/drivers/tty/hvc/hvc_console.c b/drivers/tty/hvc/hvc_console.c |
3443 | index 50b46881b6ca..94f9e3a38412 100644 |
3444 | --- a/drivers/tty/hvc/hvc_console.c |
3445 | +++ b/drivers/tty/hvc/hvc_console.c |
3446 | @@ -31,6 +31,7 @@ |
3447 | #include <linux/list.h> |
3448 | #include <linux/module.h> |
3449 | #include <linux/major.h> |
3450 | +#include <linux/atomic.h> |
3451 | #include <linux/sysrq.h> |
3452 | #include <linux/tty.h> |
3453 | #include <linux/tty_flip.h> |
3454 | @@ -70,6 +71,9 @@ static struct task_struct *hvc_task; |
3455 | /* Picks up late kicks after list walk but before schedule() */ |
3456 | static int hvc_kicked; |
3457 | |
3458 | +/* hvc_init is triggered from hvc_alloc, i.e. only when actually used */ |
3459 | +static atomic_t hvc_needs_init __read_mostly = ATOMIC_INIT(-1); |
3460 | + |
3461 | static int hvc_init(void); |
3462 | |
3463 | #ifdef CONFIG_MAGIC_SYSRQ |
3464 | @@ -851,7 +855,7 @@ struct hvc_struct *hvc_alloc(uint32_t vtermno, int data, |
3465 | int i; |
3466 | |
3467 | /* We wait until a driver actually comes along */ |
3468 | - if (!hvc_driver) { |
3469 | + if (atomic_inc_not_zero(&hvc_needs_init)) { |
3470 | int err = hvc_init(); |
3471 | if (err) |
3472 | return ERR_PTR(err); |
3473 | diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c |
3474 | index ab90a0156828..4ebf1b2034e8 100644 |
3475 | --- a/drivers/usb/core/driver.c |
3476 | +++ b/drivers/usb/core/driver.c |
3477 | @@ -990,8 +990,7 @@ EXPORT_SYMBOL_GPL(usb_deregister); |
3478 | * it doesn't support pre_reset/post_reset/reset_resume or |
3479 | * because it doesn't support suspend/resume. |
3480 | * |
3481 | - * The caller must hold @intf's device's lock, but not its pm_mutex |
3482 | - * and not @intf->dev.sem. |
3483 | + * The caller must hold @intf's device's lock, but not @intf's lock. |
3484 | */ |
3485 | void usb_forced_unbind_intf(struct usb_interface *intf) |
3486 | { |
3487 | @@ -1004,16 +1003,37 @@ void usb_forced_unbind_intf(struct usb_interface *intf) |
3488 | intf->needs_binding = 1; |
3489 | } |
3490 | |
3491 | +/* |
3492 | + * Unbind drivers for @udev's marked interfaces. These interfaces have |
3493 | + * the needs_binding flag set, for example by usb_resume_interface(). |
3494 | + * |
3495 | + * The caller must hold @udev's device lock. |
3496 | + */ |
3497 | +static void unbind_marked_interfaces(struct usb_device *udev) |
3498 | +{ |
3499 | + struct usb_host_config *config; |
3500 | + int i; |
3501 | + struct usb_interface *intf; |
3502 | + |
3503 | + config = udev->actconfig; |
3504 | + if (config) { |
3505 | + for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
3506 | + intf = config->interface[i]; |
3507 | + if (intf->dev.driver && intf->needs_binding) |
3508 | + usb_forced_unbind_intf(intf); |
3509 | + } |
3510 | + } |
3511 | +} |
3512 | + |
3513 | /* Delayed forced unbinding of a USB interface driver and scan |
3514 | * for rebinding. |
3515 | * |
3516 | - * The caller must hold @intf's device's lock, but not its pm_mutex |
3517 | - * and not @intf->dev.sem. |
3518 | + * The caller must hold @intf's device's lock, but not @intf's lock. |
3519 | * |
3520 | * Note: Rebinds will be skipped if a system sleep transition is in |
3521 | * progress and the PM "complete" callback hasn't occurred yet. |
3522 | */ |
3523 | -void usb_rebind_intf(struct usb_interface *intf) |
3524 | +static void usb_rebind_intf(struct usb_interface *intf) |
3525 | { |
3526 | int rc; |
3527 | |
3528 | @@ -1030,68 +1050,66 @@ void usb_rebind_intf(struct usb_interface *intf) |
3529 | } |
3530 | } |
3531 | |
3532 | -#ifdef CONFIG_PM |
3533 | - |
3534 | -/* Unbind drivers for @udev's interfaces that don't support suspend/resume |
3535 | - * There is no check for reset_resume here because it can be determined |
3536 | - * only during resume whether reset_resume is needed. |
3537 | +/* |
3538 | + * Rebind drivers to @udev's marked interfaces. These interfaces have |
3539 | + * the needs_binding flag set. |
3540 | * |
3541 | * The caller must hold @udev's device lock. |
3542 | */ |
3543 | -static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) |
3544 | +static void rebind_marked_interfaces(struct usb_device *udev) |
3545 | { |
3546 | struct usb_host_config *config; |
3547 | int i; |
3548 | struct usb_interface *intf; |
3549 | - struct usb_driver *drv; |
3550 | |
3551 | config = udev->actconfig; |
3552 | if (config) { |
3553 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
3554 | intf = config->interface[i]; |
3555 | - |
3556 | - if (intf->dev.driver) { |
3557 | - drv = to_usb_driver(intf->dev.driver); |
3558 | - if (!drv->suspend || !drv->resume) |
3559 | - usb_forced_unbind_intf(intf); |
3560 | - } |
3561 | + if (intf->needs_binding) |
3562 | + usb_rebind_intf(intf); |
3563 | } |
3564 | } |
3565 | } |
3566 | |
3567 | -/* Unbind drivers for @udev's interfaces that failed to support reset-resume. |
3568 | - * These interfaces have the needs_binding flag set by usb_resume_interface(). |
3569 | +/* |
3570 | + * Unbind all of @udev's marked interfaces and then rebind all of them. |
3571 | + * This ordering is necessary because some drivers claim several interfaces |
3572 | + * when they are first probed. |
3573 | * |
3574 | * The caller must hold @udev's device lock. |
3575 | */ |
3576 | -static void unbind_no_reset_resume_drivers_interfaces(struct usb_device *udev) |
3577 | +void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev) |
3578 | { |
3579 | - struct usb_host_config *config; |
3580 | - int i; |
3581 | - struct usb_interface *intf; |
3582 | - |
3583 | - config = udev->actconfig; |
3584 | - if (config) { |
3585 | - for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
3586 | - intf = config->interface[i]; |
3587 | - if (intf->dev.driver && intf->needs_binding) |
3588 | - usb_forced_unbind_intf(intf); |
3589 | - } |
3590 | - } |
3591 | + unbind_marked_interfaces(udev); |
3592 | + rebind_marked_interfaces(udev); |
3593 | } |
3594 | |
3595 | -static void do_rebind_interfaces(struct usb_device *udev) |
3596 | +#ifdef CONFIG_PM |
3597 | + |
3598 | +/* Unbind drivers for @udev's interfaces that don't support suspend/resume |
3599 | + * There is no check for reset_resume here because it can be determined |
3600 | + * only during resume whether reset_resume is needed. |
3601 | + * |
3602 | + * The caller must hold @udev's device lock. |
3603 | + */ |
3604 | +static void unbind_no_pm_drivers_interfaces(struct usb_device *udev) |
3605 | { |
3606 | struct usb_host_config *config; |
3607 | int i; |
3608 | struct usb_interface *intf; |
3609 | + struct usb_driver *drv; |
3610 | |
3611 | config = udev->actconfig; |
3612 | if (config) { |
3613 | for (i = 0; i < config->desc.bNumInterfaces; ++i) { |
3614 | intf = config->interface[i]; |
3615 | - if (intf->needs_binding) |
3616 | - usb_rebind_intf(intf); |
3617 | + |
3618 | + if (intf->dev.driver) { |
3619 | + drv = to_usb_driver(intf->dev.driver); |
3620 | + if (!drv->suspend || !drv->resume) |
3621 | + usb_forced_unbind_intf(intf); |
3622 | + } |
3623 | } |
3624 | } |
3625 | } |
3626 | @@ -1420,7 +1438,7 @@ int usb_resume_complete(struct device *dev) |
3627 | * whose needs_binding flag is set |
3628 | */ |
3629 | if (udev->state != USB_STATE_NOTATTACHED) |
3630 | - do_rebind_interfaces(udev); |
3631 | + rebind_marked_interfaces(udev); |
3632 | return 0; |
3633 | } |
3634 | |
3635 | @@ -1442,7 +1460,7 @@ int usb_resume(struct device *dev, pm_message_t msg) |
3636 | pm_runtime_disable(dev); |
3637 | pm_runtime_set_active(dev); |
3638 | pm_runtime_enable(dev); |
3639 | - unbind_no_reset_resume_drivers_interfaces(udev); |
3640 | + unbind_marked_interfaces(udev); |
3641 | } |
3642 | |
3643 | /* Avoid PM error messages for devices disconnected while suspended |
3644 | diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c |
3645 | index d59d99347d54..1f02e65fe305 100644 |
3646 | --- a/drivers/usb/core/hcd-pci.c |
3647 | +++ b/drivers/usb/core/hcd-pci.c |
3648 | @@ -75,7 +75,7 @@ static void for_each_companion(struct pci_dev *pdev, struct usb_hcd *hcd, |
3649 | PCI_SLOT(companion->devfn) != slot) |
3650 | continue; |
3651 | companion_hcd = pci_get_drvdata(companion); |
3652 | - if (!companion_hcd) |
3653 | + if (!companion_hcd || !companion_hcd->self.root_hub) |
3654 | continue; |
3655 | fn(pdev, hcd, companion, companion_hcd); |
3656 | } |
3657 | diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c |
3658 | index 64ea21971be2..d498d03afdbd 100644 |
3659 | --- a/drivers/usb/core/hub.c |
3660 | +++ b/drivers/usb/core/hub.c |
3661 | @@ -5340,10 +5340,11 @@ int usb_reset_device(struct usb_device *udev) |
3662 | else if (cintf->condition == |
3663 | USB_INTERFACE_BOUND) |
3664 | rebind = 1; |
3665 | + if (rebind) |
3666 | + cintf->needs_binding = 1; |
3667 | } |
3668 | - if (ret == 0 && rebind) |
3669 | - usb_rebind_intf(cintf); |
3670 | } |
3671 | + usb_unbind_and_rebind_marked_interfaces(udev); |
3672 | } |
3673 | |
3674 | usb_autosuspend_device(udev); |
3675 | diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h |
3676 | index 823857767a16..0923add72b59 100644 |
3677 | --- a/drivers/usb/core/usb.h |
3678 | +++ b/drivers/usb/core/usb.h |
3679 | @@ -55,7 +55,7 @@ extern int usb_match_one_id_intf(struct usb_device *dev, |
3680 | extern int usb_match_device(struct usb_device *dev, |
3681 | const struct usb_device_id *id); |
3682 | extern void usb_forced_unbind_intf(struct usb_interface *intf); |
3683 | -extern void usb_rebind_intf(struct usb_interface *intf); |
3684 | +extern void usb_unbind_and_rebind_marked_interfaces(struct usb_device *udev); |
3685 | |
3686 | extern int usb_hub_claim_port(struct usb_device *hdev, unsigned port, |
3687 | struct dev_state *owner); |
3688 | diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h |
3689 | index f8af8d44af85..546e67a2e4cd 100644 |
3690 | --- a/drivers/usb/dwc3/core.h |
3691 | +++ b/drivers/usb/dwc3/core.h |
3692 | @@ -815,15 +815,15 @@ struct dwc3_event_depevt { |
3693 | * 12 - VndrDevTstRcved |
3694 | * @reserved15_12: Reserved, not used |
3695 | * @event_info: Information about this event |
3696 | - * @reserved31_24: Reserved, not used |
3697 | + * @reserved31_25: Reserved, not used |
3698 | */ |
3699 | struct dwc3_event_devt { |
3700 | u32 one_bit:1; |
3701 | u32 device_event:7; |
3702 | u32 type:4; |
3703 | u32 reserved15_12:4; |
3704 | - u32 event_info:8; |
3705 | - u32 reserved31_24:8; |
3706 | + u32 event_info:9; |
3707 | + u32 reserved31_25:7; |
3708 | } __packed; |
3709 | |
3710 | /** |
3711 | @@ -856,6 +856,19 @@ union dwc3_event { |
3712 | struct dwc3_event_gevt gevt; |
3713 | }; |
3714 | |
3715 | +/** |
3716 | + * struct dwc3_gadget_ep_cmd_params - representation of endpoint command |
3717 | + * parameters |
3718 | + * @param2: third parameter |
3719 | + * @param1: second parameter |
3720 | + * @param0: first parameter |
3721 | + */ |
3722 | +struct dwc3_gadget_ep_cmd_params { |
3723 | + u32 param2; |
3724 | + u32 param1; |
3725 | + u32 param0; |
3726 | +}; |
3727 | + |
3728 | /* |
3729 | * DWC3 Features to be used as Driver Data |
3730 | */ |
3731 | @@ -881,11 +894,31 @@ static inline void dwc3_host_exit(struct dwc3 *dwc) |
3732 | #if IS_ENABLED(CONFIG_USB_DWC3_GADGET) || IS_ENABLED(CONFIG_USB_DWC3_DUAL_ROLE) |
3733 | int dwc3_gadget_init(struct dwc3 *dwc); |
3734 | void dwc3_gadget_exit(struct dwc3 *dwc); |
3735 | +int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode); |
3736 | +int dwc3_gadget_get_link_state(struct dwc3 *dwc); |
3737 | +int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state); |
3738 | +int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, |
3739 | + unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); |
3740 | +int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param); |
3741 | #else |
3742 | static inline int dwc3_gadget_init(struct dwc3 *dwc) |
3743 | { return 0; } |
3744 | static inline void dwc3_gadget_exit(struct dwc3 *dwc) |
3745 | { } |
3746 | +static inline int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode) |
3747 | +{ return 0; } |
3748 | +static inline int dwc3_gadget_get_link_state(struct dwc3 *dwc) |
3749 | +{ return 0; } |
3750 | +static inline int dwc3_gadget_set_link_state(struct dwc3 *dwc, |
3751 | + enum dwc3_link_state state) |
3752 | +{ return 0; } |
3753 | + |
3754 | +static inline int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, |
3755 | + unsigned cmd, struct dwc3_gadget_ep_cmd_params *params) |
3756 | +{ return 0; } |
3757 | +static inline int dwc3_send_gadget_generic_command(struct dwc3 *dwc, |
3758 | + int cmd, u32 param) |
3759 | +{ return 0; } |
3760 | #endif |
3761 | |
3762 | /* power management interface */ |
3763 | diff --git a/drivers/usb/dwc3/gadget.h b/drivers/usb/dwc3/gadget.h |
3764 | index febe1aa7b714..a0ee75b68a80 100644 |
3765 | --- a/drivers/usb/dwc3/gadget.h |
3766 | +++ b/drivers/usb/dwc3/gadget.h |
3767 | @@ -56,12 +56,6 @@ struct dwc3; |
3768 | /* DEPXFERCFG parameter 0 */ |
3769 | #define DWC3_DEPXFERCFG_NUM_XFER_RES(n) ((n) & 0xffff) |
3770 | |
3771 | -struct dwc3_gadget_ep_cmd_params { |
3772 | - u32 param2; |
3773 | - u32 param1; |
3774 | - u32 param0; |
3775 | -}; |
3776 | - |
3777 | /* -------------------------------------------------------------------------- */ |
3778 | |
3779 | #define to_dwc3_request(r) (container_of(r, struct dwc3_request, request)) |
3780 | @@ -85,9 +79,6 @@ static inline void dwc3_gadget_move_request_queued(struct dwc3_request *req) |
3781 | void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, |
3782 | int status); |
3783 | |
3784 | -int dwc3_gadget_set_test_mode(struct dwc3 *dwc, int mode); |
3785 | -int dwc3_gadget_set_link_state(struct dwc3 *dwc, enum dwc3_link_state state); |
3786 | - |
3787 | void dwc3_ep0_interrupt(struct dwc3 *dwc, |
3788 | const struct dwc3_event_depevt *event); |
3789 | void dwc3_ep0_out_start(struct dwc3 *dwc); |
3790 | @@ -95,9 +86,6 @@ int dwc3_gadget_ep0_set_halt(struct usb_ep *ep, int value); |
3791 | int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, |
3792 | gfp_t gfp_flags); |
3793 | int __dwc3_gadget_ep_set_halt(struct dwc3_ep *dep, int value); |
3794 | -int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, |
3795 | - unsigned cmd, struct dwc3_gadget_ep_cmd_params *params); |
3796 | -int dwc3_send_gadget_generic_command(struct dwc3 *dwc, int cmd, u32 param); |
3797 | |
3798 | /** |
3799 | * dwc3_gadget_ep_get_transfer_index - Gets transfer index from HW |
3800 | diff --git a/drivers/usb/gadget/atmel_usba_udc.c b/drivers/usb/gadget/atmel_usba_udc.c |
3801 | index 52771d4c44bc..167843de2d8a 100644 |
3802 | --- a/drivers/usb/gadget/atmel_usba_udc.c |
3803 | +++ b/drivers/usb/gadget/atmel_usba_udc.c |
3804 | @@ -1827,12 +1827,12 @@ static int atmel_usba_stop(struct usb_gadget *gadget, |
3805 | toggle_bias(0); |
3806 | usba_writel(udc, CTRL, USBA_DISABLE_MASK); |
3807 | |
3808 | - udc->driver = NULL; |
3809 | - |
3810 | clk_disable_unprepare(udc->hclk); |
3811 | clk_disable_unprepare(udc->pclk); |
3812 | |
3813 | - DBG(DBG_GADGET, "unregistered driver `%s'\n", driver->driver.name); |
3814 | + DBG(DBG_GADGET, "unregistered driver `%s'\n", udc->driver->driver.name); |
3815 | + |
3816 | + udc->driver = NULL; |
3817 | |
3818 | return 0; |
3819 | } |
3820 | diff --git a/drivers/usb/gadget/tcm_usb_gadget.c b/drivers/usb/gadget/tcm_usb_gadget.c |
3821 | index 0f8aad78b54f..460c266b8e24 100644 |
3822 | --- a/drivers/usb/gadget/tcm_usb_gadget.c |
3823 | +++ b/drivers/usb/gadget/tcm_usb_gadget.c |
3824 | @@ -1613,7 +1613,7 @@ static struct se_wwn *usbg_make_tport( |
3825 | return ERR_PTR(-ENOMEM); |
3826 | } |
3827 | tport->tport_wwpn = wwpn; |
3828 | - snprintf(tport->tport_name, sizeof(tport->tport_name), wnn_name); |
3829 | + snprintf(tport->tport_name, sizeof(tport->tport_name), "%s", wnn_name); |
3830 | return &tport->tport_wwn; |
3831 | } |
3832 | |
3833 | diff --git a/drivers/usb/gadget/zero.c b/drivers/usb/gadget/zero.c |
3834 | index 9f170c53e3d9..134f354ede62 100644 |
3835 | --- a/drivers/usb/gadget/zero.c |
3836 | +++ b/drivers/usb/gadget/zero.c |
3837 | @@ -300,7 +300,7 @@ static int __init zero_bind(struct usb_composite_dev *cdev) |
3838 | ss_opts->isoc_interval = gzero_options.isoc_interval; |
3839 | ss_opts->isoc_maxpacket = gzero_options.isoc_maxpacket; |
3840 | ss_opts->isoc_mult = gzero_options.isoc_mult; |
3841 | - ss_opts->isoc_maxburst = gzero_options.isoc_maxpacket; |
3842 | + ss_opts->isoc_maxburst = gzero_options.isoc_maxburst; |
3843 | ss_opts->bulk_buflen = gzero_options.bulk_buflen; |
3844 | |
3845 | func_ss = usb_get_function(func_inst_ss); |
3846 | diff --git a/drivers/usb/host/ehci-tegra.c b/drivers/usb/host/ehci-tegra.c |
3847 | index af28b748e87a..633dbea28f30 100644 |
3848 | --- a/drivers/usb/host/ehci-tegra.c |
3849 | +++ b/drivers/usb/host/ehci-tegra.c |
3850 | @@ -513,8 +513,31 @@ static struct platform_driver tegra_ehci_driver = { |
3851 | } |
3852 | }; |
3853 | |
3854 | +static int tegra_ehci_reset(struct usb_hcd *hcd) |
3855 | +{ |
3856 | + struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
3857 | + int retval; |
3858 | + int txfifothresh; |
3859 | + |
3860 | + retval = ehci_setup(hcd); |
3861 | + if (retval) |
3862 | + return retval; |
3863 | + |
3864 | + /* |
3865 | + * We should really pull this value out of tegra_ehci_soc_config, but |
3866 | + * to avoid needing access to it, make use of the fact that Tegra20 is |
3867 | + * the only one so far that needs a value of 10, and Tegra20 is the |
3868 | + * only one which doesn't set has_hostpc. |
3869 | + */ |
3870 | + txfifothresh = ehci->has_hostpc ? 0x10 : 10; |
3871 | + ehci_writel(ehci, txfifothresh << 16, &ehci->regs->txfill_tuning); |
3872 | + |
3873 | + return 0; |
3874 | +} |
3875 | + |
3876 | static const struct ehci_driver_overrides tegra_overrides __initconst = { |
3877 | .extra_priv_size = sizeof(struct tegra_ehci_hcd), |
3878 | + .reset = tegra_ehci_reset, |
3879 | }; |
3880 | |
3881 | static int __init ehci_tegra_init(void) |
3882 | diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c |
3883 | index 04f986d9234f..08a5f92d6c54 100644 |
3884 | --- a/drivers/usb/host/xhci-pci.c |
3885 | +++ b/drivers/usb/host/xhci-pci.c |
3886 | @@ -134,6 +134,8 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3887 | */ |
3888 | if (pdev->subsystem_vendor == PCI_VENDOR_ID_HP) |
3889 | xhci->quirks |= XHCI_SPURIOUS_WAKEUP; |
3890 | + |
3891 | + xhci->quirks |= XHCI_SPURIOUS_REBOOT; |
3892 | } |
3893 | if (pdev->vendor == PCI_VENDOR_ID_ETRON && |
3894 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
3895 | @@ -143,9 +145,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) |
3896 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
3897 | } |
3898 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
3899 | - pdev->device == 0x0015 && |
3900 | - pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG && |
3901 | - pdev->subsystem_device == 0xc0cd) |
3902 | + pdev->device == 0x0015) |
3903 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
3904 | if (pdev->vendor == PCI_VENDOR_ID_VIA) |
3905 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
3906 | @@ -190,6 +190,10 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
3907 | struct usb_hcd *hcd; |
3908 | |
3909 | driver = (struct hc_driver *)id->driver_data; |
3910 | + |
3911 | + /* Prevent runtime suspending between USB-2 and USB-3 initialization */ |
3912 | + pm_runtime_get_noresume(&dev->dev); |
3913 | + |
3914 | /* Register the USB 2.0 roothub. |
3915 | * FIXME: USB core must know to register the USB 2.0 roothub first. |
3916 | * This is sort of silly, because we could just set the HCD driver flags |
3917 | @@ -199,7 +203,7 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
3918 | retval = usb_hcd_pci_probe(dev, id); |
3919 | |
3920 | if (retval) |
3921 | - return retval; |
3922 | + goto put_runtime_pm; |
3923 | |
3924 | /* USB 2.0 roothub is stored in the PCI device now. */ |
3925 | hcd = dev_get_drvdata(&dev->dev); |
3926 | @@ -228,12 +232,17 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) |
3927 | if (xhci->quirks & XHCI_LPM_SUPPORT) |
3928 | hcd_to_bus(xhci->shared_hcd)->root_hub->lpm_capable = 1; |
3929 | |
3930 | + /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ |
3931 | + pm_runtime_put_noidle(&dev->dev); |
3932 | + |
3933 | return 0; |
3934 | |
3935 | put_usb3_hcd: |
3936 | usb_put_hcd(xhci->shared_hcd); |
3937 | dealloc_usb2_hcd: |
3938 | usb_hcd_pci_remove(dev); |
3939 | +put_runtime_pm: |
3940 | + pm_runtime_put_noidle(&dev->dev); |
3941 | return retval; |
3942 | } |
3943 | |
3944 | diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c |
3945 | index 0ed64eb68e48..dff9b5ead3b3 100644 |
3946 | --- a/drivers/usb/host/xhci-ring.c |
3947 | +++ b/drivers/usb/host/xhci-ring.c |
3948 | @@ -550,6 +550,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, |
3949 | struct xhci_generic_trb *trb; |
3950 | struct xhci_ep_ctx *ep_ctx; |
3951 | dma_addr_t addr; |
3952 | + u64 hw_dequeue; |
3953 | |
3954 | ep_ring = xhci_triad_to_transfer_ring(xhci, slot_id, |
3955 | ep_index, stream_id); |
3956 | @@ -559,56 +560,57 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, |
3957 | stream_id); |
3958 | return; |
3959 | } |
3960 | - state->new_cycle_state = 0; |
3961 | - xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
3962 | - "Finding segment containing stopped TRB."); |
3963 | - state->new_deq_seg = find_trb_seg(cur_td->start_seg, |
3964 | - dev->eps[ep_index].stopped_trb, |
3965 | - &state->new_cycle_state); |
3966 | - if (!state->new_deq_seg) { |
3967 | - WARN_ON(1); |
3968 | - return; |
3969 | - } |
3970 | |
3971 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ |
3972 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
3973 | "Finding endpoint context"); |
3974 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
3975 | - state->new_cycle_state = 0x1 & le64_to_cpu(ep_ctx->deq); |
3976 | + hw_dequeue = le64_to_cpu(ep_ctx->deq); |
3977 | + |
3978 | + /* Find virtual address and segment of hardware dequeue pointer */ |
3979 | + state->new_deq_seg = ep_ring->deq_seg; |
3980 | + state->new_deq_ptr = ep_ring->dequeue; |
3981 | + while (xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr) |
3982 | + != (dma_addr_t)(hw_dequeue & ~0xf)) { |
3983 | + next_trb(xhci, ep_ring, &state->new_deq_seg, |
3984 | + &state->new_deq_ptr); |
3985 | + if (state->new_deq_ptr == ep_ring->dequeue) { |
3986 | + WARN_ON(1); |
3987 | + return; |
3988 | + } |
3989 | + } |
3990 | + /* |
3991 | + * Find cycle state for last_trb, starting at old cycle state of |
3992 | + * hw_dequeue. If there is only one segment ring, find_trb_seg() will |
3993 | + * return immediately and cannot toggle the cycle state if this search |
3994 | + * wraps around, so add one more toggle manually in that case. |
3995 | + */ |
3996 | + state->new_cycle_state = hw_dequeue & 0x1; |
3997 | + if (ep_ring->first_seg == ep_ring->first_seg->next && |
3998 | + cur_td->last_trb < state->new_deq_ptr) |
3999 | + state->new_cycle_state ^= 0x1; |
4000 | |
4001 | state->new_deq_ptr = cur_td->last_trb; |
4002 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
4003 | "Finding segment containing last TRB in TD."); |
4004 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, |
4005 | - state->new_deq_ptr, |
4006 | - &state->new_cycle_state); |
4007 | + state->new_deq_ptr, &state->new_cycle_state); |
4008 | if (!state->new_deq_seg) { |
4009 | WARN_ON(1); |
4010 | return; |
4011 | } |
4012 | |
4013 | + /* Increment to find next TRB after last_trb. Cycle if appropriate. */ |
4014 | trb = &state->new_deq_ptr->generic; |
4015 | if (TRB_TYPE_LINK_LE32(trb->field[3]) && |
4016 | (trb->field[3] & cpu_to_le32(LINK_TOGGLE))) |
4017 | state->new_cycle_state ^= 0x1; |
4018 | next_trb(xhci, ep_ring, &state->new_deq_seg, &state->new_deq_ptr); |
4019 | |
4020 | - /* |
4021 | - * If there is only one segment in a ring, find_trb_seg()'s while loop |
4022 | - * will not run, and it will return before it has a chance to see if it |
4023 | - * needs to toggle the cycle bit. It can't tell if the stalled transfer |
4024 | - * ended just before the link TRB on a one-segment ring, or if the TD |
4025 | - * wrapped around the top of the ring, because it doesn't have the TD in |
4026 | - * question. Look for the one-segment case where stalled TRB's address |
4027 | - * is greater than the new dequeue pointer address. |
4028 | - */ |
4029 | - if (ep_ring->first_seg == ep_ring->first_seg->next && |
4030 | - state->new_deq_ptr < dev->eps[ep_index].stopped_trb) |
4031 | - state->new_cycle_state ^= 0x1; |
4032 | + /* Don't update the ring cycle state for the producer (us). */ |
4033 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
4034 | "Cycle state = 0x%x", state->new_cycle_state); |
4035 | |
4036 | - /* Don't update the ring cycle state for the producer (us). */ |
4037 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
4038 | "New dequeue segment = %p (virtual)", |
4039 | state->new_deq_seg); |
4040 | @@ -791,7 +793,6 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, |
4041 | if (list_empty(&ep->cancelled_td_list)) { |
4042 | xhci_stop_watchdog_timer_in_irq(xhci, ep); |
4043 | ep->stopped_td = NULL; |
4044 | - ep->stopped_trb = NULL; |
4045 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
4046 | return; |
4047 | } |
4048 | @@ -859,11 +860,9 @@ remove_finished_td: |
4049 | ring_doorbell_for_active_rings(xhci, slot_id, ep_index); |
4050 | } |
4051 | |
4052 | - /* Clear stopped_td and stopped_trb if endpoint is not halted */ |
4053 | - if (!(ep->ep_state & EP_HALTED)) { |
4054 | + /* Clear stopped_td if endpoint is not halted */ |
4055 | + if (!(ep->ep_state & EP_HALTED)) |
4056 | ep->stopped_td = NULL; |
4057 | - ep->stopped_trb = NULL; |
4058 | - } |
4059 | |
4060 | /* |
4061 | * Drop the lock and complete the URBs in the cancelled TD list. |
4062 | @@ -1908,14 +1907,12 @@ static void xhci_cleanup_halted_endpoint(struct xhci_hcd *xhci, |
4063 | struct xhci_virt_ep *ep = &xhci->devs[slot_id]->eps[ep_index]; |
4064 | ep->ep_state |= EP_HALTED; |
4065 | ep->stopped_td = td; |
4066 | - ep->stopped_trb = event_trb; |
4067 | ep->stopped_stream = stream_id; |
4068 | |
4069 | xhci_queue_reset_ep(xhci, slot_id, ep_index); |
4070 | xhci_cleanup_stalled_ring(xhci, td->urb->dev, ep_index); |
4071 | |
4072 | ep->stopped_td = NULL; |
4073 | - ep->stopped_trb = NULL; |
4074 | ep->stopped_stream = 0; |
4075 | |
4076 | xhci_ring_cmd_db(xhci); |
4077 | @@ -1997,7 +1994,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, |
4078 | * the ring dequeue pointer or take this TD off any lists yet. |
4079 | */ |
4080 | ep->stopped_td = td; |
4081 | - ep->stopped_trb = event_trb; |
4082 | return 0; |
4083 | } else { |
4084 | if (trb_comp_code == COMP_STALL) { |
4085 | @@ -2009,7 +2005,6 @@ static int finish_td(struct xhci_hcd *xhci, struct xhci_td *td, |
4086 | * USB class driver clear the stall later. |
4087 | */ |
4088 | ep->stopped_td = td; |
4089 | - ep->stopped_trb = event_trb; |
4090 | ep->stopped_stream = ep_ring->stream_id; |
4091 | } else if (xhci_requires_manual_halt_cleanup(xhci, |
4092 | ep_ctx, trb_comp_code)) { |
4093 | @@ -2626,7 +2621,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, |
4094 | * successful event after a short transfer. |
4095 | * Ignore it. |
4096 | */ |
4097 | - if ((xhci->quirks & XHCI_SPURIOUS_SUCCESS) && |
4098 | + if ((xhci->quirks & XHCI_SPURIOUS_SUCCESS) && |
4099 | ep_ring->last_td_was_short) { |
4100 | ep_ring->last_td_was_short = false; |
4101 | ret = 0; |
4102 | diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c |
4103 | index 924a6ccdb622..cca289667cf6 100644 |
4104 | --- a/drivers/usb/host/xhci.c |
4105 | +++ b/drivers/usb/host/xhci.c |
4106 | @@ -404,16 +404,16 @@ static int xhci_try_enable_msi(struct usb_hcd *hcd) |
4107 | |
4108 | #else |
4109 | |
4110 | -static int xhci_try_enable_msi(struct usb_hcd *hcd) |
4111 | +static inline int xhci_try_enable_msi(struct usb_hcd *hcd) |
4112 | { |
4113 | return 0; |
4114 | } |
4115 | |
4116 | -static void xhci_cleanup_msix(struct xhci_hcd *xhci) |
4117 | +static inline void xhci_cleanup_msix(struct xhci_hcd *xhci) |
4118 | { |
4119 | } |
4120 | |
4121 | -static void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
4122 | +static inline void xhci_msix_sync_irqs(struct xhci_hcd *xhci) |
4123 | { |
4124 | } |
4125 | |
4126 | @@ -2933,7 +2933,6 @@ void xhci_endpoint_reset(struct usb_hcd *hcd, |
4127 | xhci_ring_cmd_db(xhci); |
4128 | } |
4129 | virt_ep->stopped_td = NULL; |
4130 | - virt_ep->stopped_trb = NULL; |
4131 | virt_ep->stopped_stream = 0; |
4132 | spin_unlock_irqrestore(&xhci->lock, flags); |
4133 | |
4134 | diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h |
4135 | index 58ed9d088e63..8faef64371c6 100644 |
4136 | --- a/drivers/usb/host/xhci.h |
4137 | +++ b/drivers/usb/host/xhci.h |
4138 | @@ -864,8 +864,6 @@ struct xhci_virt_ep { |
4139 | #define EP_GETTING_NO_STREAMS (1 << 5) |
4140 | /* ---- Related to URB cancellation ---- */ |
4141 | struct list_head cancelled_td_list; |
4142 | - /* The TRB that was last reported in a stopped endpoint ring */ |
4143 | - union xhci_trb *stopped_trb; |
4144 | struct xhci_td *stopped_td; |
4145 | unsigned int stopped_stream; |
4146 | /* Watchdog timer for stop endpoint command to cancel URBs */ |
4147 | diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c |
4148 | index 239ad0b1ceb6..07576907e2c6 100644 |
4149 | --- a/drivers/usb/musb/musb_core.c |
4150 | +++ b/drivers/usb/musb/musb_core.c |
4151 | @@ -438,7 +438,6 @@ void musb_hnp_stop(struct musb *musb) |
4152 | static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
4153 | u8 devctl) |
4154 | { |
4155 | - struct usb_otg *otg = musb->xceiv->otg; |
4156 | irqreturn_t handled = IRQ_NONE; |
4157 | |
4158 | dev_dbg(musb->controller, "<== DevCtl=%02x, int_usb=0x%x\n", devctl, |
4159 | @@ -656,7 +655,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
4160 | break; |
4161 | case OTG_STATE_B_PERIPHERAL: |
4162 | musb_g_suspend(musb); |
4163 | - musb->is_active = otg->gadget->b_hnp_enable; |
4164 | + musb->is_active = musb->g.b_hnp_enable; |
4165 | if (musb->is_active) { |
4166 | musb->xceiv->state = OTG_STATE_B_WAIT_ACON; |
4167 | dev_dbg(musb->controller, "HNP: Setting timer for b_ase0_brst\n"); |
4168 | @@ -672,7 +671,7 @@ static irqreturn_t musb_stage0_irq(struct musb *musb, u8 int_usb, |
4169 | break; |
4170 | case OTG_STATE_A_HOST: |
4171 | musb->xceiv->state = OTG_STATE_A_SUSPEND; |
4172 | - musb->is_active = otg->host->b_hnp_enable; |
4173 | + musb->is_active = musb->hcd->self.b_hnp_enable; |
4174 | break; |
4175 | case OTG_STATE_B_HOST: |
4176 | /* Transition to B_PERIPHERAL, see 6.8.2.6 p 44 */ |
4177 | diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c |
4178 | index 8aa59a2c5eb2..8e90d327e52b 100644 |
4179 | --- a/drivers/usb/musb/omap2430.c |
4180 | +++ b/drivers/usb/musb/omap2430.c |
4181 | @@ -416,6 +416,7 @@ static int omap2430_musb_init(struct musb *musb) |
4182 | omap_musb_set_mailbox(glue); |
4183 | |
4184 | phy_init(musb->phy); |
4185 | + phy_power_on(musb->phy); |
4186 | |
4187 | pm_runtime_put_noidle(musb->controller); |
4188 | return 0; |
4189 | @@ -478,6 +479,7 @@ static int omap2430_musb_exit(struct musb *musb) |
4190 | del_timer_sync(&musb_idle_timer); |
4191 | |
4192 | omap2430_low_level_exit(musb); |
4193 | + phy_power_off(musb->phy); |
4194 | phy_exit(musb->phy); |
4195 | |
4196 | return 0; |
4197 | diff --git a/drivers/usb/phy/phy-am335x-control.c b/drivers/usb/phy/phy-am335x-control.c |
4198 | index d75196ad5f2f..35b6083b7999 100644 |
4199 | --- a/drivers/usb/phy/phy-am335x-control.c |
4200 | +++ b/drivers/usb/phy/phy-am335x-control.c |
4201 | @@ -3,6 +3,7 @@ |
4202 | #include <linux/err.h> |
4203 | #include <linux/of.h> |
4204 | #include <linux/io.h> |
4205 | +#include <linux/delay.h> |
4206 | #include "am35x-phy-control.h" |
4207 | |
4208 | struct am335x_control_usb { |
4209 | @@ -86,6 +87,14 @@ static void am335x_phy_power(struct phy_control *phy_ctrl, u32 id, bool on) |
4210 | } |
4211 | |
4212 | writel(val, usb_ctrl->phy_reg + reg); |
4213 | + |
4214 | + /* |
4215 | + * Give the PHY ~1ms to complete the power up operation. |
4216 | + * Tests have shown unstable behaviour if other USB PHY related |
4217 | + * registers are written too shortly after such a transition. |
4218 | + */ |
4219 | + if (on) |
4220 | + mdelay(1); |
4221 | } |
4222 | |
4223 | static const struct phy_control ctrl_am335x = { |
4224 | diff --git a/drivers/usb/phy/phy-ulpi.c b/drivers/usb/phy/phy-ulpi.c |
4225 | index 217339dd7a90..17ea3f271bd8 100644 |
4226 | --- a/drivers/usb/phy/phy-ulpi.c |
4227 | +++ b/drivers/usb/phy/phy-ulpi.c |
4228 | @@ -47,6 +47,8 @@ struct ulpi_info { |
4229 | static struct ulpi_info ulpi_ids[] = { |
4230 | ULPI_INFO(ULPI_ID(0x04cc, 0x1504), "NXP ISP1504"), |
4231 | ULPI_INFO(ULPI_ID(0x0424, 0x0006), "SMSC USB331x"), |
4232 | + ULPI_INFO(ULPI_ID(0x0424, 0x0007), "SMSC USB3320"), |
4233 | + ULPI_INFO(ULPI_ID(0x0451, 0x1507), "TI TUSB1210"), |
4234 | }; |
4235 | |
4236 | static int ulpi_set_otg_flags(struct usb_phy *phy) |
4237 | diff --git a/drivers/usb/serial/pl2303.c b/drivers/usb/serial/pl2303.c |
4238 | index 2e22fc22c382..b3d5a35c0d4b 100644 |
4239 | --- a/drivers/usb/serial/pl2303.c |
4240 | +++ b/drivers/usb/serial/pl2303.c |
4241 | @@ -83,6 +83,9 @@ static const struct usb_device_id id_table[] = { |
4242 | { USB_DEVICE(YCCABLE_VENDOR_ID, YCCABLE_PRODUCT_ID) }, |
4243 | { USB_DEVICE(SUPERIAL_VENDOR_ID, SUPERIAL_PRODUCT_ID) }, |
4244 | { USB_DEVICE(HP_VENDOR_ID, HP_LD220_PRODUCT_ID) }, |
4245 | + { USB_DEVICE(HP_VENDOR_ID, HP_LD960_PRODUCT_ID) }, |
4246 | + { USB_DEVICE(HP_VENDOR_ID, HP_LCM220_PRODUCT_ID) }, |
4247 | + { USB_DEVICE(HP_VENDOR_ID, HP_LCM960_PRODUCT_ID) }, |
4248 | { USB_DEVICE(CRESSI_VENDOR_ID, CRESSI_EDY_PRODUCT_ID) }, |
4249 | { USB_DEVICE(ZEAGLE_VENDOR_ID, ZEAGLE_N2ITION3_PRODUCT_ID) }, |
4250 | { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) }, |
4251 | diff --git a/drivers/usb/serial/pl2303.h b/drivers/usb/serial/pl2303.h |
4252 | index c38b8c00c06f..42bc082896ac 100644 |
4253 | --- a/drivers/usb/serial/pl2303.h |
4254 | +++ b/drivers/usb/serial/pl2303.h |
4255 | @@ -121,8 +121,11 @@ |
4256 | #define SUPERIAL_VENDOR_ID 0x5372 |
4257 | #define SUPERIAL_PRODUCT_ID 0x2303 |
4258 | |
4259 | -/* Hewlett-Packard LD220-HP POS Pole Display */ |
4260 | +/* Hewlett-Packard POS Pole Displays */ |
4261 | #define HP_VENDOR_ID 0x03f0 |
4262 | +#define HP_LD960_PRODUCT_ID 0x0b39 |
4263 | +#define HP_LCM220_PRODUCT_ID 0x3139 |
4264 | +#define HP_LCM960_PRODUCT_ID 0x3239 |
4265 | #define HP_LD220_PRODUCT_ID 0x3524 |
4266 | |
4267 | /* Cressi Edy (diving computer) PC interface */ |
4268 | diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c |
4269 | index cd961622f9c1..b74e5f5ddac8 100644 |
4270 | --- a/drivers/video/atmel_lcdfb.c |
4271 | +++ b/drivers/video/atmel_lcdfb.c |
4272 | @@ -1298,6 +1298,12 @@ static int __init atmel_lcdfb_probe(struct platform_device *pdev) |
4273 | goto unregister_irqs; |
4274 | } |
4275 | |
4276 | + ret = atmel_lcdfb_set_par(info); |
4277 | + if (ret < 0) { |
4278 | + dev_err(dev, "set par failed: %d\n", ret); |
4279 | + goto unregister_irqs; |
4280 | + } |
4281 | + |
4282 | dev_set_drvdata(dev, info); |
4283 | |
4284 | /* |
4285 | diff --git a/drivers/w1/w1_netlink.c b/drivers/w1/w1_netlink.c |
4286 | index 40788c925d1c..73705aff53cb 100644 |
4287 | --- a/drivers/w1/w1_netlink.c |
4288 | +++ b/drivers/w1/w1_netlink.c |
4289 | @@ -54,28 +54,29 @@ static void w1_send_slave(struct w1_master *dev, u64 rn) |
4290 | struct w1_netlink_msg *hdr = (struct w1_netlink_msg *)(msg + 1); |
4291 | struct w1_netlink_cmd *cmd = (struct w1_netlink_cmd *)(hdr + 1); |
4292 | int avail; |
4293 | + u64 *data; |
4294 | |
4295 | /* update kernel slave list */ |
4296 | w1_slave_found(dev, rn); |
4297 | |
4298 | avail = dev->priv_size - cmd->len; |
4299 | |
4300 | - if (avail > 8) { |
4301 | - u64 *data = (void *)(cmd + 1) + cmd->len; |
4302 | + if (avail < 8) { |
4303 | + msg->ack++; |
4304 | + cn_netlink_send(msg, 0, GFP_KERNEL); |
4305 | |
4306 | - *data = rn; |
4307 | - cmd->len += 8; |
4308 | - hdr->len += 8; |
4309 | - msg->len += 8; |
4310 | - return; |
4311 | + msg->len = sizeof(struct w1_netlink_msg) + |
4312 | + sizeof(struct w1_netlink_cmd); |
4313 | + hdr->len = sizeof(struct w1_netlink_cmd); |
4314 | + cmd->len = 0; |
4315 | } |
4316 | |
4317 | - msg->ack++; |
4318 | - cn_netlink_send(msg, 0, GFP_KERNEL); |
4319 | + data = (void *)(cmd + 1) + cmd->len; |
4320 | |
4321 | - msg->len = sizeof(struct w1_netlink_msg) + sizeof(struct w1_netlink_cmd); |
4322 | - hdr->len = sizeof(struct w1_netlink_cmd); |
4323 | - cmd->len = 0; |
4324 | + *data = rn; |
4325 | + cmd->len += 8; |
4326 | + hdr->len += 8; |
4327 | + msg->len += 8; |
4328 | } |
4329 | |
4330 | static int w1_process_search_command(struct w1_master *dev, struct cn_msg *msg, |
4331 | diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h |
4332 | index d3a534fdc5ff..3a603a8d9f96 100644 |
4333 | --- a/fs/ext4/ext4.h |
4334 | +++ b/fs/ext4/ext4.h |
4335 | @@ -2462,23 +2462,6 @@ static inline void ext4_update_i_disksize(struct inode *inode, loff_t newsize) |
4336 | up_write(&EXT4_I(inode)->i_data_sem); |
4337 | } |
4338 | |
4339 | -/* |
4340 | - * Update i_disksize after writeback has been started. Races with truncate |
4341 | - * are avoided by checking i_size under i_data_sem. |
4342 | - */ |
4343 | -static inline void ext4_wb_update_i_disksize(struct inode *inode, loff_t newsize) |
4344 | -{ |
4345 | - loff_t i_size; |
4346 | - |
4347 | - down_write(&EXT4_I(inode)->i_data_sem); |
4348 | - i_size = i_size_read(inode); |
4349 | - if (newsize > i_size) |
4350 | - newsize = i_size; |
4351 | - if (newsize > EXT4_I(inode)->i_disksize) |
4352 | - EXT4_I(inode)->i_disksize = newsize; |
4353 | - up_write(&EXT4_I(inode)->i_data_sem); |
4354 | -} |
4355 | - |
4356 | struct ext4_group_info { |
4357 | unsigned long bb_state; |
4358 | struct rb_root bb_free_root; |
4359 | diff --git a/fs/ext4/file.c b/fs/ext4/file.c |
4360 | index 1a5073959f32..2a8b2e15dcc4 100644 |
4361 | --- a/fs/ext4/file.c |
4362 | +++ b/fs/ext4/file.c |
4363 | @@ -82,7 +82,7 @@ ext4_unaligned_aio(struct inode *inode, const struct iovec *iov, |
4364 | size_t count = iov_length(iov, nr_segs); |
4365 | loff_t final_size = pos + count; |
4366 | |
4367 | - if (pos >= inode->i_size) |
4368 | + if (pos >= i_size_read(inode)) |
4369 | return 0; |
4370 | |
4371 | if ((pos & blockmask) || (final_size & blockmask)) |
4372 | diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c |
4373 | index 24bfd7ff3049..4e8903d0432e 100644 |
4374 | --- a/fs/ext4/inode.c |
4375 | +++ b/fs/ext4/inode.c |
4376 | @@ -515,6 +515,10 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, |
4377 | "logical block %lu\n", inode->i_ino, flags, map->m_len, |
4378 | (unsigned long) map->m_lblk); |
4379 | |
4380 | + /* We can handle the block number less than EXT_MAX_BLOCKS */ |
4381 | + if (unlikely(map->m_lblk >= EXT_MAX_BLOCKS)) |
4382 | + return -EIO; |
4383 | + |
4384 | /* Lookup extent status tree firstly */ |
4385 | if (ext4_es_lookup_extent(inode, map->m_lblk, &es)) { |
4386 | ext4_es_lru_add(inode); |
4387 | @@ -2232,13 +2236,23 @@ static int mpage_map_and_submit_extent(handle_t *handle, |
4388 | return err; |
4389 | } while (map->m_len); |
4390 | |
4391 | - /* Update on-disk size after IO is submitted */ |
4392 | + /* |
4393 | + * Update on-disk size after IO is submitted. Races with |
4394 | + * truncate are avoided by checking i_size under i_data_sem. |
4395 | + */ |
4396 | disksize = ((loff_t)mpd->first_page) << PAGE_CACHE_SHIFT; |
4397 | if (disksize > EXT4_I(inode)->i_disksize) { |
4398 | int err2; |
4399 | - |
4400 | - ext4_wb_update_i_disksize(inode, disksize); |
4401 | + loff_t i_size; |
4402 | + |
4403 | + down_write(&EXT4_I(inode)->i_data_sem); |
4404 | + i_size = i_size_read(inode); |
4405 | + if (disksize > i_size) |
4406 | + disksize = i_size; |
4407 | + if (disksize > EXT4_I(inode)->i_disksize) |
4408 | + EXT4_I(inode)->i_disksize = disksize; |
4409 | err2 = ext4_mark_inode_dirty(handle, inode); |
4410 | + up_write(&EXT4_I(inode)->i_data_sem); |
4411 | if (err2) |
4412 | ext4_error(inode->i_sb, |
4413 | "Failed to mark inode %lu dirty", |
4414 | diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c |
4415 | index ab95508e3d40..c18d95b50540 100644 |
4416 | --- a/fs/ext4/page-io.c |
4417 | +++ b/fs/ext4/page-io.c |
4418 | @@ -308,13 +308,14 @@ static void ext4_end_bio(struct bio *bio, int error) |
4419 | if (error) { |
4420 | struct inode *inode = io_end->inode; |
4421 | |
4422 | - ext4_warning(inode->i_sb, "I/O error writing to inode %lu " |
4423 | + ext4_warning(inode->i_sb, "I/O error %d writing to inode %lu " |
4424 | "(offset %llu size %ld starting block %llu)", |
4425 | - inode->i_ino, |
4426 | + error, inode->i_ino, |
4427 | (unsigned long long) io_end->offset, |
4428 | (long) io_end->size, |
4429 | (unsigned long long) |
4430 | bi_sector >> (inode->i_blkbits - 9)); |
4431 | + mapping_set_error(inode->i_mapping, error); |
4432 | } |
4433 | |
4434 | if (io_end->flag & EXT4_IO_END_UNWRITTEN) { |
4435 | diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c |
4436 | index e175e94116ac..55e611c1513c 100644 |
4437 | --- a/fs/ext4/xattr.c |
4438 | +++ b/fs/ext4/xattr.c |
4439 | @@ -517,8 +517,8 @@ static void ext4_xattr_update_super_block(handle_t *handle, |
4440 | } |
4441 | |
4442 | /* |
4443 | - * Release the xattr block BH: If the reference count is > 1, decrement |
4444 | - * it; otherwise free the block. |
4445 | + * Release the xattr block BH: If the reference count is > 1, decrement it; |
4446 | + * otherwise free the block. |
4447 | */ |
4448 | static void |
4449 | ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
4450 | @@ -538,16 +538,31 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode, |
4451 | if (ce) |
4452 | mb_cache_entry_free(ce); |
4453 | get_bh(bh); |
4454 | + unlock_buffer(bh); |
4455 | ext4_free_blocks(handle, inode, bh, 0, 1, |
4456 | EXT4_FREE_BLOCKS_METADATA | |
4457 | EXT4_FREE_BLOCKS_FORGET); |
4458 | - unlock_buffer(bh); |
4459 | } else { |
4460 | le32_add_cpu(&BHDR(bh)->h_refcount, -1); |
4461 | if (ce) |
4462 | mb_cache_entry_release(ce); |
4463 | + /* |
4464 | + * Beware of this ugliness: Releasing of xattr block references |
4465 | + * from different inodes can race and so we have to protect |
4466 | + * from a race where someone else frees the block (and releases |
4467 | + * its journal_head) before we are done dirtying the buffer. In |
4468 | + * nojournal mode this race is harmless and we actually cannot |
4469 | + * call ext4_handle_dirty_xattr_block() with locked buffer as |
4470 | + * that function can call sync_dirty_buffer() so for that case |
4471 | + * we handle the dirtying after unlocking the buffer. |
4472 | + */ |
4473 | + if (ext4_handle_valid(handle)) |
4474 | + error = ext4_handle_dirty_xattr_block(handle, inode, |
4475 | + bh); |
4476 | unlock_buffer(bh); |
4477 | - error = ext4_handle_dirty_xattr_block(handle, inode, bh); |
4478 | + if (!ext4_handle_valid(handle)) |
4479 | + error = ext4_handle_dirty_xattr_block(handle, inode, |
4480 | + bh); |
4481 | if (IS_SYNC(inode)) |
4482 | ext4_handle_sync(handle); |
4483 | dquot_free_block(inode, EXT4_C2B(EXT4_SB(inode->i_sb), 1)); |
4484 | diff --git a/fs/namespace.c b/fs/namespace.c |
4485 | index 2ffc5a2905d4..65233a5f390a 100644 |
4486 | --- a/fs/namespace.c |
4487 | +++ b/fs/namespace.c |
4488 | @@ -885,7 +885,7 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, |
4489 | goto out_free; |
4490 | } |
4491 | |
4492 | - mnt->mnt.mnt_flags = old->mnt.mnt_flags & ~MNT_WRITE_HOLD; |
4493 | + mnt->mnt.mnt_flags = old->mnt.mnt_flags & ~(MNT_WRITE_HOLD|MNT_MARKED); |
4494 | /* Don't allow unprivileged users to change mount flags */ |
4495 | if ((flag & CL_UNPRIVILEGED) && (mnt->mnt.mnt_flags & MNT_READONLY)) |
4496 | mnt->mnt.mnt_flags |= MNT_LOCK_READONLY; |
4497 | @@ -1661,9 +1661,9 @@ static int attach_recursive_mnt(struct mount *source_mnt, |
4498 | if (err) |
4499 | goto out; |
4500 | err = propagate_mnt(dest_mnt, dest_mp, source_mnt, &tree_list); |
4501 | + lock_mount_hash(); |
4502 | if (err) |
4503 | goto out_cleanup_ids; |
4504 | - lock_mount_hash(); |
4505 | for (p = source_mnt; p; p = next_mnt(p, source_mnt)) |
4506 | set_mnt_shared(p); |
4507 | } else { |
4508 | @@ -1690,6 +1690,11 @@ static int attach_recursive_mnt(struct mount *source_mnt, |
4509 | return 0; |
4510 | |
4511 | out_cleanup_ids: |
4512 | + while (!hlist_empty(&tree_list)) { |
4513 | + child = hlist_entry(tree_list.first, struct mount, mnt_hash); |
4514 | + umount_tree(child, 0); |
4515 | + } |
4516 | + unlock_mount_hash(); |
4517 | cleanup_group_ids(source_mnt, NULL); |
4518 | out: |
4519 | return err; |
4520 | @@ -2044,7 +2049,7 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags) |
4521 | struct mount *parent; |
4522 | int err; |
4523 | |
4524 | - mnt_flags &= ~(MNT_SHARED | MNT_WRITE_HOLD | MNT_INTERNAL | MNT_DOOMED | MNT_SYNC_UMOUNT); |
4525 | + mnt_flags &= ~MNT_INTERNAL_FLAGS; |
4526 | |
4527 | mp = lock_mount(path); |
4528 | if (IS_ERR(mp)) |
4529 | diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c |
4530 | index 450bfedbe2f4..d5d06e868841 100644 |
4531 | --- a/fs/nfs/nfs4proc.c |
4532 | +++ b/fs/nfs/nfs4proc.c |
4533 | @@ -1068,6 +1068,7 @@ static void nfs4_opendata_free(struct kref *kref) |
4534 | dput(p->dentry); |
4535 | nfs_sb_deactive(sb); |
4536 | nfs_fattr_free_names(&p->f_attr); |
4537 | + kfree(p->f_attr.mdsthreshold); |
4538 | kfree(p); |
4539 | } |
4540 | |
4541 | @@ -2244,10 +2245,12 @@ static int _nfs4_do_open(struct inode *dir, |
4542 | } |
4543 | } |
4544 | |
4545 | - if (ctx_th && server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) { |
4546 | - opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc(); |
4547 | - if (!opendata->f_attr.mdsthreshold) |
4548 | - goto err_free_label; |
4549 | + if (server->attr_bitmask[2] & FATTR4_WORD2_MDSTHRESHOLD) { |
4550 | + if (!opendata->f_attr.mdsthreshold) { |
4551 | + opendata->f_attr.mdsthreshold = pnfs_mdsthreshold_alloc(); |
4552 | + if (!opendata->f_attr.mdsthreshold) |
4553 | + goto err_free_label; |
4554 | + } |
4555 | opendata->o_arg.open_bitmap = &nfs4_pnfs_open_bitmap[0]; |
4556 | } |
4557 | if (dentry->d_inode != NULL) |
4558 | @@ -2275,11 +2278,10 @@ static int _nfs4_do_open(struct inode *dir, |
4559 | if (opendata->file_created) |
4560 | *opened |= FILE_CREATED; |
4561 | |
4562 | - if (pnfs_use_threshold(ctx_th, opendata->f_attr.mdsthreshold, server)) |
4563 | + if (pnfs_use_threshold(ctx_th, opendata->f_attr.mdsthreshold, server)) { |
4564 | *ctx_th = opendata->f_attr.mdsthreshold; |
4565 | - else |
4566 | - kfree(opendata->f_attr.mdsthreshold); |
4567 | - opendata->f_attr.mdsthreshold = NULL; |
4568 | + opendata->f_attr.mdsthreshold = NULL; |
4569 | + } |
4570 | |
4571 | nfs4_label_free(olabel); |
4572 | |
4573 | @@ -2289,7 +2291,6 @@ static int _nfs4_do_open(struct inode *dir, |
4574 | err_free_label: |
4575 | nfs4_label_free(olabel); |
4576 | err_opendata_put: |
4577 | - kfree(opendata->f_attr.mdsthreshold); |
4578 | nfs4_opendata_put(opendata); |
4579 | err_put_state_owner: |
4580 | nfs4_put_state_owner(sp); |
4581 | diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c |
4582 | index 7f05cd140de3..3eaa6e30a2dc 100644 |
4583 | --- a/fs/nfsd/nfs4callback.c |
4584 | +++ b/fs/nfsd/nfs4callback.c |
4585 | @@ -637,9 +637,11 @@ static struct rpc_cred *get_backchannel_cred(struct nfs4_client *clp, struct rpc |
4586 | |
4587 | static int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn, struct nfsd4_session *ses) |
4588 | { |
4589 | + int maxtime = max_cb_time(clp->net); |
4590 | struct rpc_timeout timeparms = { |
4591 | - .to_initval = max_cb_time(clp->net), |
4592 | + .to_initval = maxtime, |
4593 | .to_retries = 0, |
4594 | + .to_maxval = maxtime, |
4595 | }; |
4596 | struct rpc_create_args args = { |
4597 | .net = clp->net, |
4598 | diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c |
4599 | index 82189b208af3..9a914e892bb1 100644 |
4600 | --- a/fs/nfsd/nfs4proc.c |
4601 | +++ b/fs/nfsd/nfs4proc.c |
4602 | @@ -1359,6 +1359,12 @@ nfsd4_proc_compound(struct svc_rqst *rqstp, |
4603 | /* If op is non-idempotent */ |
4604 | if (opdesc->op_flags & OP_MODIFIES_SOMETHING) { |
4605 | plen = opdesc->op_rsize_bop(rqstp, op); |
4606 | + /* |
4607 | + * If there's still another operation, make sure |
4608 | + * we'll have space to at least encode an error: |
4609 | + */ |
4610 | + if (resp->opcnt < args->opcnt) |
4611 | + plen += COMPOUND_ERR_SLACK_SPACE; |
4612 | op->status = nfsd4_check_resp_size(resp, plen); |
4613 | } |
4614 | |
4615 | @@ -1523,7 +1529,8 @@ static inline u32 nfsd4_setattr_rsize(struct svc_rqst *rqstp, struct nfsd4_op *o |
4616 | |
4617 | static inline u32 nfsd4_setclientid_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) |
4618 | { |
4619 | - return (op_encode_hdr_size + 2 + 1024) * sizeof(__be32); |
4620 | + return (op_encode_hdr_size + 2 + XDR_QUADLEN(NFS4_VERIFIER_SIZE)) * |
4621 | + sizeof(__be32); |
4622 | } |
4623 | |
4624 | static inline u32 nfsd4_write_rsize(struct svc_rqst *rqstp, struct nfsd4_op *op) |
4625 | diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c |
4626 | index d5d070fbeb35..7415eac36501 100644 |
4627 | --- a/fs/nfsd/nfs4state.c |
4628 | +++ b/fs/nfsd/nfs4state.c |
4629 | @@ -5062,7 +5062,6 @@ nfs4_state_destroy_net(struct net *net) |
4630 | int i; |
4631 | struct nfs4_client *clp = NULL; |
4632 | struct nfsd_net *nn = net_generic(net, nfsd_net_id); |
4633 | - struct rb_node *node, *tmp; |
4634 | |
4635 | for (i = 0; i < CLIENT_HASH_SIZE; i++) { |
4636 | while (!list_empty(&nn->conf_id_hashtbl[i])) { |
4637 | @@ -5071,13 +5070,11 @@ nfs4_state_destroy_net(struct net *net) |
4638 | } |
4639 | } |
4640 | |
4641 | - node = rb_first(&nn->unconf_name_tree); |
4642 | - while (node != NULL) { |
4643 | - tmp = node; |
4644 | - node = rb_next(tmp); |
4645 | - clp = rb_entry(tmp, struct nfs4_client, cl_namenode); |
4646 | - rb_erase(tmp, &nn->unconf_name_tree); |
4647 | - destroy_client(clp); |
4648 | + for (i = 0; i < CLIENT_HASH_SIZE; i++) { |
4649 | + while (!list_empty(&nn->unconf_id_hashtbl[i])) { |
4650 | + clp = list_entry(nn->unconf_id_hashtbl[i].next, struct nfs4_client, cl_idhash); |
4651 | + destroy_client(clp); |
4652 | + } |
4653 | } |
4654 | |
4655 | kfree(nn->sessionid_hashtbl); |
4656 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c |
4657 | index 63f2395c57ed..16e8fa71eb84 100644 |
4658 | --- a/fs/nfsd/nfs4xdr.c |
4659 | +++ b/fs/nfsd/nfs4xdr.c |
4660 | @@ -2483,6 +2483,8 @@ out_acl: |
4661 | goto out; |
4662 | } |
4663 | if (bmval2 & FATTR4_WORD2_SUPPATTR_EXCLCREAT) { |
4664 | + if ((buflen -= 16) < 0) |
4665 | + goto out_resource; |
4666 | WRITE32(3); |
4667 | WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD0); |
4668 | WRITE32(NFSD_SUPPATTR_EXCLCREAT_WORD1); |
4669 | @@ -2499,8 +2501,10 @@ out: |
4670 | security_release_secctx(context, contextlen); |
4671 | #endif /* CONFIG_NFSD_V4_SECURITY_LABEL */ |
4672 | kfree(acl); |
4673 | - if (tempfh) |
4674 | + if (tempfh) { |
4675 | fh_put(tempfh); |
4676 | + kfree(tempfh); |
4677 | + } |
4678 | return status; |
4679 | out_nfserr: |
4680 | status = nfserrno(err); |
4681 | @@ -3471,6 +3475,9 @@ nfsd4_encode_test_stateid(struct nfsd4_compoundres *resp, __be32 nfserr, |
4682 | struct nfsd4_test_stateid_id *stateid, *next; |
4683 | __be32 *p; |
4684 | |
4685 | + if (nfserr) |
4686 | + return nfserr; |
4687 | + |
4688 | RESERVE_SPACE(4 + (4 * test_stateid->ts_num_ids)); |
4689 | *p++ = htonl(test_stateid->ts_num_ids); |
4690 | |
4691 | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c |
4692 | index 7f555179bf81..f34d9de802ab 100644 |
4693 | --- a/fs/nfsd/nfsctl.c |
4694 | +++ b/fs/nfsd/nfsctl.c |
4695 | @@ -699,6 +699,11 @@ static ssize_t __write_ports_addfd(char *buf, struct net *net) |
4696 | if (err != 0 || fd < 0) |
4697 | return -EINVAL; |
4698 | |
4699 | + if (svc_alien_sock(net, fd)) { |
4700 | + printk(KERN_ERR "%s: socket net is different to NFSd's one\n", __func__); |
4701 | + return -EINVAL; |
4702 | + } |
4703 | + |
4704 | err = nfsd_create_serv(net); |
4705 | if (err != 0) |
4706 | return err; |
4707 | diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h |
4708 | index 30f34ab02137..479eb681c27c 100644 |
4709 | --- a/fs/nfsd/nfsd.h |
4710 | +++ b/fs/nfsd/nfsd.h |
4711 | @@ -282,7 +282,7 @@ void nfsd_lockd_shutdown(void); |
4712 | * reason. |
4713 | */ |
4714 | #define COMPOUND_SLACK_SPACE 140 /* OP_GETFH */ |
4715 | -#define COMPOUND_ERR_SLACK_SPACE 12 /* OP_SETATTR */ |
4716 | +#define COMPOUND_ERR_SLACK_SPACE 16 /* OP_SETATTR */ |
4717 | |
4718 | #define NFSD_LAUNDROMAT_MINTIMEOUT 1 /* seconds */ |
4719 | |
4720 | diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c |
4721 | index b17d93214d01..9c769a47ac5a 100644 |
4722 | --- a/fs/nfsd/nfsxdr.c |
4723 | +++ b/fs/nfsd/nfsxdr.c |
4724 | @@ -152,7 +152,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, |
4725 | type = (stat->mode & S_IFMT); |
4726 | |
4727 | *p++ = htonl(nfs_ftypes[type >> 12]); |
4728 | - *p++ = htonl((u32) (stat->mode & S_IALLUGO)); |
4729 | + *p++ = htonl((u32) stat->mode); |
4730 | *p++ = htonl((u32) stat->nlink); |
4731 | *p++ = htonl((u32) from_kuid(&init_user_ns, stat->uid)); |
4732 | *p++ = htonl((u32) from_kgid(&init_user_ns, stat->gid)); |
4733 | diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c |
4734 | index 6d7be3f80356..eea5ad188984 100644 |
4735 | --- a/fs/nfsd/vfs.c |
4736 | +++ b/fs/nfsd/vfs.c |
4737 | @@ -404,6 +404,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
4738 | umode_t ftype = 0; |
4739 | __be32 err; |
4740 | int host_err; |
4741 | + bool get_write_count; |
4742 | int size_change = 0; |
4743 | |
4744 | if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE)) |
4745 | @@ -411,10 +412,18 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, |
4746 | if (iap->ia_valid & ATTR_SIZE) |
4747 | ftype = S_IFREG; |
4748 | |
4749 | + /* Callers that do fh_verify should do the fh_want_write: */ |
4750 | + get_write_count = !fhp->fh_dentry; |
4751 | + |
4752 | /* Get inode */ |
4753 | err = fh_verify(rqstp, fhp, ftype, accmode); |
4754 | if (err) |
4755 | goto out; |
4756 | + if (get_write_count) { |
4757 | + host_err = fh_want_write(fhp); |
4758 | + if (host_err) |
4759 | + return nfserrno(host_err); |
4760 | + } |
4761 | |
4762 | dentry = fhp->fh_dentry; |
4763 | inode = dentry->d_inode; |
4764 | diff --git a/fs/ocfs2/buffer_head_io.c b/fs/ocfs2/buffer_head_io.c |
4765 | index 5b704c63a103..1edcb141f639 100644 |
4766 | --- a/fs/ocfs2/buffer_head_io.c |
4767 | +++ b/fs/ocfs2/buffer_head_io.c |
4768 | @@ -90,7 +90,6 @@ int ocfs2_write_block(struct ocfs2_super *osb, struct buffer_head *bh, |
4769 | * information for this bh as it's not marked locally |
4770 | * uptodate. */ |
4771 | ret = -EIO; |
4772 | - put_bh(bh); |
4773 | mlog_errno(ret); |
4774 | } |
4775 | |
4776 | @@ -420,7 +419,6 @@ int ocfs2_write_super_or_backup(struct ocfs2_super *osb, |
4777 | |
4778 | if (!buffer_uptodate(bh)) { |
4779 | ret = -EIO; |
4780 | - put_bh(bh); |
4781 | mlog_errno(ret); |
4782 | } |
4783 | |
4784 | diff --git a/fs/ocfs2/dlm/dlmrecovery.c b/fs/ocfs2/dlm/dlmrecovery.c |
4785 | index 7035af09cc03..fe29f7978f81 100644 |
4786 | --- a/fs/ocfs2/dlm/dlmrecovery.c |
4787 | +++ b/fs/ocfs2/dlm/dlmrecovery.c |
4788 | @@ -537,7 +537,10 @@ master_here: |
4789 | /* success! see if any other nodes need recovery */ |
4790 | mlog(0, "DONE mastering recovery of %s:%u here(this=%u)!\n", |
4791 | dlm->name, dlm->reco.dead_node, dlm->node_num); |
4792 | - dlm_reset_recovery(dlm); |
4793 | + spin_lock(&dlm->spinlock); |
4794 | + __dlm_reset_recovery(dlm); |
4795 | + dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; |
4796 | + spin_unlock(&dlm->spinlock); |
4797 | } |
4798 | dlm_end_recovery(dlm); |
4799 | |
4800 | @@ -695,6 +698,14 @@ static int dlm_remaster_locks(struct dlm_ctxt *dlm, u8 dead_node) |
4801 | if (all_nodes_done) { |
4802 | int ret; |
4803 | |
4804 | + /* Set this flag on recovery master to avoid |
4805 | + * a new recovery for another dead node start |
4806 | + * before the recovery is not done. That may |
4807 | + * cause recovery hung.*/ |
4808 | + spin_lock(&dlm->spinlock); |
4809 | + dlm->reco.state |= DLM_RECO_STATE_FINALIZE; |
4810 | + spin_unlock(&dlm->spinlock); |
4811 | + |
4812 | /* all nodes are now in DLM_RECO_NODE_DATA_DONE state |
4813 | * just send a finalize message to everyone and |
4814 | * clean up */ |
4815 | @@ -1750,13 +1761,13 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, |
4816 | struct dlm_migratable_lockres *mres) |
4817 | { |
4818 | struct dlm_migratable_lock *ml; |
4819 | - struct list_head *queue; |
4820 | + struct list_head *queue, *iter; |
4821 | struct list_head *tmpq = NULL; |
4822 | struct dlm_lock *newlock = NULL; |
4823 | struct dlm_lockstatus *lksb = NULL; |
4824 | int ret = 0; |
4825 | int i, j, bad; |
4826 | - struct dlm_lock *lock = NULL; |
4827 | + struct dlm_lock *lock; |
4828 | u8 from = O2NM_MAX_NODES; |
4829 | unsigned int added = 0; |
4830 | __be64 c; |
4831 | @@ -1791,14 +1802,16 @@ static int dlm_process_recovery_data(struct dlm_ctxt *dlm, |
4832 | /* MIGRATION ONLY! */ |
4833 | BUG_ON(!(mres->flags & DLM_MRES_MIGRATION)); |
4834 | |
4835 | + lock = NULL; |
4836 | spin_lock(&res->spinlock); |
4837 | for (j = DLM_GRANTED_LIST; j <= DLM_BLOCKED_LIST; j++) { |
4838 | tmpq = dlm_list_idx_to_ptr(res, j); |
4839 | - list_for_each_entry(lock, tmpq, list) { |
4840 | - if (lock->ml.cookie != ml->cookie) |
4841 | - lock = NULL; |
4842 | - else |
4843 | + list_for_each(iter, tmpq) { |
4844 | + lock = list_entry(iter, |
4845 | + struct dlm_lock, list); |
4846 | + if (lock->ml.cookie == ml->cookie) |
4847 | break; |
4848 | + lock = NULL; |
4849 | } |
4850 | if (lock) |
4851 | break; |
4852 | @@ -2882,8 +2895,8 @@ int dlm_finalize_reco_handler(struct o2net_msg *msg, u32 len, void *data, |
4853 | BUG(); |
4854 | } |
4855 | dlm->reco.state &= ~DLM_RECO_STATE_FINALIZE; |
4856 | + __dlm_reset_recovery(dlm); |
4857 | spin_unlock(&dlm->spinlock); |
4858 | - dlm_reset_recovery(dlm); |
4859 | dlm_kick_recovery_thread(dlm); |
4860 | break; |
4861 | default: |
4862 | diff --git a/fs/ocfs2/namei.c b/fs/ocfs2/namei.c |
4863 | index 3683643f3f0e..feed025fe064 100644 |
4864 | --- a/fs/ocfs2/namei.c |
4865 | +++ b/fs/ocfs2/namei.c |
4866 | @@ -450,7 +450,6 @@ leave: |
4867 | |
4868 | brelse(new_fe_bh); |
4869 | brelse(parent_fe_bh); |
4870 | - kfree(si.name); |
4871 | kfree(si.value); |
4872 | |
4873 | ocfs2_free_dir_lookup_result(&lookup); |
4874 | @@ -1855,7 +1854,6 @@ bail: |
4875 | |
4876 | brelse(new_fe_bh); |
4877 | brelse(parent_fe_bh); |
4878 | - kfree(si.name); |
4879 | kfree(si.value); |
4880 | ocfs2_free_dir_lookup_result(&lookup); |
4881 | if (inode_ac) |
4882 | diff --git a/fs/pnode.c b/fs/pnode.c |
4883 | index 88396df725b4..a364a704333b 100644 |
4884 | --- a/fs/pnode.c |
4885 | +++ b/fs/pnode.c |
4886 | @@ -164,46 +164,94 @@ static struct mount *propagation_next(struct mount *m, |
4887 | } |
4888 | } |
4889 | |
4890 | -/* |
4891 | - * return the source mount to be used for cloning |
4892 | - * |
4893 | - * @dest the current destination mount |
4894 | - * @last_dest the last seen destination mount |
4895 | - * @last_src the last seen source mount |
4896 | - * @type return CL_SLAVE if the new mount has to be |
4897 | - * cloned as a slave. |
4898 | - */ |
4899 | -static struct mount *get_source(struct mount *dest, |
4900 | - struct mount *last_dest, |
4901 | - struct mount *last_src, |
4902 | - int *type) |
4903 | +static struct mount *next_group(struct mount *m, struct mount *origin) |
4904 | { |
4905 | - struct mount *p_last_src = NULL; |
4906 | - struct mount *p_last_dest = NULL; |
4907 | - |
4908 | - while (last_dest != dest->mnt_master) { |
4909 | - p_last_dest = last_dest; |
4910 | - p_last_src = last_src; |
4911 | - last_dest = last_dest->mnt_master; |
4912 | - last_src = last_src->mnt_master; |
4913 | + while (1) { |
4914 | + while (1) { |
4915 | + struct mount *next; |
4916 | + if (!IS_MNT_NEW(m) && !list_empty(&m->mnt_slave_list)) |
4917 | + return first_slave(m); |
4918 | + next = next_peer(m); |
4919 | + if (m->mnt_group_id == origin->mnt_group_id) { |
4920 | + if (next == origin) |
4921 | + return NULL; |
4922 | + } else if (m->mnt_slave.next != &next->mnt_slave) |
4923 | + break; |
4924 | + m = next; |
4925 | + } |
4926 | + /* m is the last peer */ |
4927 | + while (1) { |
4928 | + struct mount *master = m->mnt_master; |
4929 | + if (m->mnt_slave.next != &master->mnt_slave_list) |
4930 | + return next_slave(m); |
4931 | + m = next_peer(master); |
4932 | + if (master->mnt_group_id == origin->mnt_group_id) |
4933 | + break; |
4934 | + if (master->mnt_slave.next == &m->mnt_slave) |
4935 | + break; |
4936 | + m = master; |
4937 | + } |
4938 | + if (m == origin) |
4939 | + return NULL; |
4940 | } |
4941 | +} |
4942 | |
4943 | - if (p_last_dest) { |
4944 | - do { |
4945 | - p_last_dest = next_peer(p_last_dest); |
4946 | - } while (IS_MNT_NEW(p_last_dest)); |
4947 | - /* is that a peer of the earlier? */ |
4948 | - if (dest == p_last_dest) { |
4949 | - *type = CL_MAKE_SHARED; |
4950 | - return p_last_src; |
4951 | +/* all accesses are serialized by namespace_sem */ |
4952 | +static struct user_namespace *user_ns; |
4953 | +static struct mount *last_dest, *last_source, *dest_master; |
4954 | +static struct mountpoint *mp; |
4955 | +static struct hlist_head *list; |
4956 | + |
4957 | +static int propagate_one(struct mount *m) |
4958 | +{ |
4959 | + struct mount *child; |
4960 | + int type; |
4961 | + /* skip ones added by this propagate_mnt() */ |
4962 | + if (IS_MNT_NEW(m)) |
4963 | + return 0; |
4964 | + /* skip if mountpoint isn't covered by it */ |
4965 | + if (!is_subdir(mp->m_dentry, m->mnt.mnt_root)) |
4966 | + return 0; |
4967 | + if (m->mnt_group_id == last_dest->mnt_group_id) { |
4968 | + type = CL_MAKE_SHARED; |
4969 | + } else { |
4970 | + struct mount *n, *p; |
4971 | + for (n = m; ; n = p) { |
4972 | + p = n->mnt_master; |
4973 | + if (p == dest_master || IS_MNT_MARKED(p)) { |
4974 | + while (last_dest->mnt_master != p) { |
4975 | + last_source = last_source->mnt_master; |
4976 | + last_dest = last_source->mnt_parent; |
4977 | + } |
4978 | + if (n->mnt_group_id != last_dest->mnt_group_id) { |
4979 | + last_source = last_source->mnt_master; |
4980 | + last_dest = last_source->mnt_parent; |
4981 | + } |
4982 | + break; |
4983 | + } |
4984 | } |
4985 | + type = CL_SLAVE; |
4986 | + /* beginning of peer group among the slaves? */ |
4987 | + if (IS_MNT_SHARED(m)) |
4988 | + type |= CL_MAKE_SHARED; |
4989 | } |
4990 | - /* slave of the earlier, then */ |
4991 | - *type = CL_SLAVE; |
4992 | - /* beginning of peer group among the slaves? */ |
4993 | - if (IS_MNT_SHARED(dest)) |
4994 | - *type |= CL_MAKE_SHARED; |
4995 | - return last_src; |
4996 | + |
4997 | + /* Notice when we are propagating across user namespaces */ |
4998 | + if (m->mnt_ns->user_ns != user_ns) |
4999 | + type |= CL_UNPRIVILEGED; |
5000 | + child = copy_tree(last_source, last_source->mnt.mnt_root, type); |
5001 | + if (IS_ERR(child)) |
5002 | + return PTR_ERR(child); |
5003 | + mnt_set_mountpoint(m, mp, child); |
5004 | + last_dest = m; |
5005 | + last_source = child; |
5006 | + if (m->mnt_master != dest_master) { |
5007 | + read_seqlock_excl(&mount_lock); |
5008 | + SET_MNT_MARK(m->mnt_master); |
5009 | + read_sequnlock_excl(&mount_lock); |
5010 | + } |
5011 | + hlist_add_head(&child->mnt_hash, list); |
5012 | + return 0; |
5013 | } |
5014 | |
5015 | /* |
5016 | @@ -222,56 +270,48 @@ static struct mount *get_source(struct mount *dest, |
5017 | int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp, |
5018 | struct mount *source_mnt, struct hlist_head *tree_list) |
5019 | { |
5020 | - struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns; |
5021 | - struct mount *m, *child; |
5022 | + struct mount *m, *n; |
5023 | int ret = 0; |
5024 | - struct mount *prev_dest_mnt = dest_mnt; |
5025 | - struct mount *prev_src_mnt = source_mnt; |
5026 | - HLIST_HEAD(tmp_list); |
5027 | - |
5028 | - for (m = propagation_next(dest_mnt, dest_mnt); m; |
5029 | - m = propagation_next(m, dest_mnt)) { |
5030 | - int type; |
5031 | - struct mount *source; |
5032 | - |
5033 | - if (IS_MNT_NEW(m)) |
5034 | - continue; |
5035 | - |
5036 | - source = get_source(m, prev_dest_mnt, prev_src_mnt, &type); |
5037 | - |
5038 | - /* Notice when we are propagating across user namespaces */ |
5039 | - if (m->mnt_ns->user_ns != user_ns) |
5040 | - type |= CL_UNPRIVILEGED; |
5041 | - |
5042 | - child = copy_tree(source, source->mnt.mnt_root, type); |
5043 | - if (IS_ERR(child)) { |
5044 | - ret = PTR_ERR(child); |
5045 | - tmp_list = *tree_list; |
5046 | - tmp_list.first->pprev = &tmp_list.first; |
5047 | - INIT_HLIST_HEAD(tree_list); |
5048 | + |
5049 | + /* |
5050 | + * we don't want to bother passing tons of arguments to |
5051 | + * propagate_one(); everything is serialized by namespace_sem, |
5052 | + * so globals will do just fine. |
5053 | + */ |
5054 | + user_ns = current->nsproxy->mnt_ns->user_ns; |
5055 | + last_dest = dest_mnt; |
5056 | + last_source = source_mnt; |
5057 | + mp = dest_mp; |
5058 | + list = tree_list; |
5059 | + dest_master = dest_mnt->mnt_master; |
5060 | + |
5061 | + /* all peers of dest_mnt, except dest_mnt itself */ |
5062 | + for (n = next_peer(dest_mnt); n != dest_mnt; n = next_peer(n)) { |
5063 | + ret = propagate_one(n); |
5064 | + if (ret) |
5065 | goto out; |
5066 | - } |
5067 | + } |
5068 | |
5069 | - if (is_subdir(dest_mp->m_dentry, m->mnt.mnt_root)) { |
5070 | - mnt_set_mountpoint(m, dest_mp, child); |
5071 | - hlist_add_head(&child->mnt_hash, tree_list); |
5072 | - } else { |
5073 | - /* |
5074 | - * This can happen if the parent mount was bind mounted |
5075 | - * on some subdirectory of a shared/slave mount. |
5076 | - */ |
5077 | - hlist_add_head(&child->mnt_hash, &tmp_list); |
5078 | - } |
5079 | - prev_dest_mnt = m; |
5080 | - prev_src_mnt = child; |
5081 | + /* all slave groups */ |
5082 | + for (m = next_group(dest_mnt, dest_mnt); m; |
5083 | + m = next_group(m, dest_mnt)) { |
5084 | + /* everything in that slave group */ |
5085 | + n = m; |
5086 | + do { |
5087 | + ret = propagate_one(n); |
5088 | + if (ret) |
5089 | + goto out; |
5090 | + n = next_peer(n); |
5091 | + } while (n != m); |
5092 | } |
5093 | out: |
5094 | - lock_mount_hash(); |
5095 | - while (!hlist_empty(&tmp_list)) { |
5096 | - child = hlist_entry(tmp_list.first, struct mount, mnt_hash); |
5097 | - umount_tree(child, 0); |
5098 | + read_seqlock_excl(&mount_lock); |
5099 | + hlist_for_each_entry(n, tree_list, mnt_hash) { |
5100 | + m = n->mnt_parent; |
5101 | + if (m->mnt_master != dest_mnt->mnt_master) |
5102 | + CLEAR_MNT_MARK(m->mnt_master); |
5103 | } |
5104 | - unlock_mount_hash(); |
5105 | + read_sequnlock_excl(&mount_lock); |
5106 | return ret; |
5107 | } |
5108 | |
5109 | diff --git a/fs/pnode.h b/fs/pnode.h |
5110 | index fc28a27fa892..4a246358b031 100644 |
5111 | --- a/fs/pnode.h |
5112 | +++ b/fs/pnode.h |
5113 | @@ -16,6 +16,9 @@ |
5114 | #define IS_MNT_NEW(m) (!(m)->mnt_ns) |
5115 | #define CLEAR_MNT_SHARED(m) ((m)->mnt.mnt_flags &= ~MNT_SHARED) |
5116 | #define IS_MNT_UNBINDABLE(m) ((m)->mnt.mnt_flags & MNT_UNBINDABLE) |
5117 | +#define IS_MNT_MARKED(m) ((m)->mnt.mnt_flags & MNT_MARKED) |
5118 | +#define SET_MNT_MARK(m) ((m)->mnt.mnt_flags |= MNT_MARKED) |
5119 | +#define CLEAR_MNT_MARK(m) ((m)->mnt.mnt_flags &= ~MNT_MARKED) |
5120 | |
5121 | #define CL_EXPIRE 0x01 |
5122 | #define CL_SLAVE 0x02 |
5123 | diff --git a/fs/reiserfs/dir.c b/fs/reiserfs/dir.c |
5124 | index 1fd2051109a3..af677353a3f5 100644 |
5125 | --- a/fs/reiserfs/dir.c |
5126 | +++ b/fs/reiserfs/dir.c |
5127 | @@ -125,6 +125,7 @@ int reiserfs_readdir_inode(struct inode *inode, struct dir_context *ctx) |
5128 | int d_reclen; |
5129 | char *d_name; |
5130 | ino_t d_ino; |
5131 | + loff_t cur_pos = deh_offset(deh); |
5132 | |
5133 | if (!de_visible(deh)) |
5134 | /* it is hidden entry */ |
5135 | @@ -196,8 +197,9 @@ int reiserfs_readdir_inode(struct inode *inode, struct dir_context *ctx) |
5136 | if (local_buf != small_buf) { |
5137 | kfree(local_buf); |
5138 | } |
5139 | - // next entry should be looked for with such offset |
5140 | - next_pos = deh_offset(deh) + 1; |
5141 | + |
5142 | + /* deh_offset(deh) may be invalid now. */ |
5143 | + next_pos = cur_pos + 1; |
5144 | |
5145 | if (item_moved(&tmp_ih, &path_to_entry)) { |
5146 | set_cpu_key_k_offset(&pos_key, |
5147 | diff --git a/include/asm-generic/word-at-a-time.h b/include/asm-generic/word-at-a-time.h |
5148 | index d3909effd725..d96deb443f18 100644 |
5149 | --- a/include/asm-generic/word-at-a-time.h |
5150 | +++ b/include/asm-generic/word-at-a-time.h |
5151 | @@ -50,11 +50,7 @@ static inline bool has_zero(unsigned long val, unsigned long *data, const struct |
5152 | } |
5153 | |
5154 | #ifndef zero_bytemask |
5155 | -#ifdef CONFIG_64BIT |
5156 | -#define zero_bytemask(mask) (~0ul << fls64(mask)) |
5157 | -#else |
5158 | -#define zero_bytemask(mask) (~0ul << fls(mask)) |
5159 | -#endif /* CONFIG_64BIT */ |
5160 | -#endif /* zero_bytemask */ |
5161 | +#define zero_bytemask(mask) (~0ul << __fls(mask) << 1) |
5162 | +#endif |
5163 | |
5164 | #endif /* _ASM_WORD_AT_A_TIME_H */ |
5165 | diff --git a/include/dt-bindings/clock/tegra124-car.h b/include/dt-bindings/clock/tegra124-car.h |
5166 | index 8c1603b10665..433528ab5161 100644 |
5167 | --- a/include/dt-bindings/clock/tegra124-car.h |
5168 | +++ b/include/dt-bindings/clock/tegra124-car.h |
5169 | @@ -29,7 +29,7 @@ |
5170 | /* 10 (register bit affects spdif_in and spdif_out) */ |
5171 | #define TEGRA124_CLK_I2S1 11 |
5172 | #define TEGRA124_CLK_I2C1 12 |
5173 | -#define TEGRA124_CLK_NDFLASH 13 |
5174 | +/* 13 */ |
5175 | #define TEGRA124_CLK_SDMMC1 14 |
5176 | #define TEGRA124_CLK_SDMMC4 15 |
5177 | /* 16 */ |
5178 | @@ -83,7 +83,7 @@ |
5179 | |
5180 | /* 64 */ |
5181 | #define TEGRA124_CLK_UARTD 65 |
5182 | -#define TEGRA124_CLK_UARTE 66 |
5183 | +/* 66 */ |
5184 | #define TEGRA124_CLK_I2C3 67 |
5185 | #define TEGRA124_CLK_SBC4 68 |
5186 | #define TEGRA124_CLK_SDMMC3 69 |
5187 | @@ -97,7 +97,7 @@ |
5188 | #define TEGRA124_CLK_TRACE 77 |
5189 | #define TEGRA124_CLK_SOC_THERM 78 |
5190 | #define TEGRA124_CLK_DTV 79 |
5191 | -#define TEGRA124_CLK_NDSPEED 80 |
5192 | +/* 80 */ |
5193 | #define TEGRA124_CLK_I2CSLOW 81 |
5194 | #define TEGRA124_CLK_DSIB 82 |
5195 | #define TEGRA124_CLK_TSEC 83 |
5196 | diff --git a/include/linux/bio.h b/include/linux/bio.h |
5197 | index 5a4d39b4686b..5aa372a7380c 100644 |
5198 | --- a/include/linux/bio.h |
5199 | +++ b/include/linux/bio.h |
5200 | @@ -216,9 +216,9 @@ static inline void bvec_iter_advance(struct bio_vec *bv, struct bvec_iter *iter, |
5201 | } |
5202 | |
5203 | #define for_each_bvec(bvl, bio_vec, iter, start) \ |
5204 | - for ((iter) = start; \ |
5205 | - (bvl) = bvec_iter_bvec((bio_vec), (iter)), \ |
5206 | - (iter).bi_size; \ |
5207 | + for (iter = (start); \ |
5208 | + (iter).bi_size && \ |
5209 | + ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \ |
5210 | bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len)) |
5211 | |
5212 | |
5213 | diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h |
5214 | index 344883dce584..6088058a3e00 100644 |
5215 | --- a/include/linux/hyperv.h |
5216 | +++ b/include/linux/hyperv.h |
5217 | @@ -464,15 +464,17 @@ hv_get_ringbuffer_availbytes(struct hv_ring_buffer_info *rbi, |
5218 | * 0 . 13 (Windows Server 2008) |
5219 | * 1 . 1 (Windows 7) |
5220 | * 2 . 4 (Windows 8) |
5221 | + * 3 . 0 (Windows 8 R2) |
5222 | */ |
5223 | |
5224 | #define VERSION_WS2008 ((0 << 16) | (13)) |
5225 | #define VERSION_WIN7 ((1 << 16) | (1)) |
5226 | #define VERSION_WIN8 ((2 << 16) | (4)) |
5227 | +#define VERSION_WIN8_1 ((3 << 16) | (0)) |
5228 | |
5229 | #define VERSION_INVAL -1 |
5230 | |
5231 | -#define VERSION_CURRENT VERSION_WIN8 |
5232 | +#define VERSION_CURRENT VERSION_WIN8_1 |
5233 | |
5234 | /* Make maximum size of pipe payload of 16K */ |
5235 | #define MAX_PIPE_DATA_PAYLOAD (sizeof(u8) * 16384) |
5236 | diff --git a/include/linux/mount.h b/include/linux/mount.h |
5237 | index 371d346fa270..839bac270904 100644 |
5238 | --- a/include/linux/mount.h |
5239 | +++ b/include/linux/mount.h |
5240 | @@ -44,6 +44,8 @@ struct mnt_namespace; |
5241 | #define MNT_SHARED_MASK (MNT_UNBINDABLE) |
5242 | #define MNT_PROPAGATION_MASK (MNT_SHARED | MNT_UNBINDABLE) |
5243 | |
5244 | +#define MNT_INTERNAL_FLAGS (MNT_SHARED | MNT_WRITE_HOLD | MNT_INTERNAL | \ |
5245 | + MNT_DOOMED | MNT_SYNC_UMOUNT | MNT_MARKED) |
5246 | |
5247 | #define MNT_INTERNAL 0x4000 |
5248 | |
5249 | @@ -51,6 +53,7 @@ struct mnt_namespace; |
5250 | #define MNT_LOCKED 0x800000 |
5251 | #define MNT_DOOMED 0x1000000 |
5252 | #define MNT_SYNC_UMOUNT 0x2000000 |
5253 | +#define MNT_MARKED 0x4000000 |
5254 | |
5255 | struct vfsmount { |
5256 | struct dentry *mnt_root; /* root of the mounted tree */ |
5257 | diff --git a/include/linux/sunrpc/svcsock.h b/include/linux/sunrpc/svcsock.h |
5258 | index 62fd1b756e99..947009ed5996 100644 |
5259 | --- a/include/linux/sunrpc/svcsock.h |
5260 | +++ b/include/linux/sunrpc/svcsock.h |
5261 | @@ -56,6 +56,7 @@ int svc_recv(struct svc_rqst *, long); |
5262 | int svc_send(struct svc_rqst *); |
5263 | void svc_drop(struct svc_rqst *); |
5264 | void svc_sock_update_bufs(struct svc_serv *serv); |
5265 | +bool svc_alien_sock(struct net *net, int fd); |
5266 | int svc_addsock(struct svc_serv *serv, const int fd, |
5267 | char *name_return, const size_t len); |
5268 | void svc_init_xprt_sock(void); |
5269 | diff --git a/include/rdma/ib_cm.h b/include/rdma/ib_cm.h |
5270 | index f29e3a27c2cc..0e3ff30647d5 100644 |
5271 | --- a/include/rdma/ib_cm.h |
5272 | +++ b/include/rdma/ib_cm.h |
5273 | @@ -601,5 +601,4 @@ struct ib_cm_sidr_rep_param { |
5274 | int ib_send_cm_sidr_rep(struct ib_cm_id *cm_id, |
5275 | struct ib_cm_sidr_rep_param *param); |
5276 | |
5277 | -int ib_update_cm_av(struct ib_cm_id *id, const u8 *smac, const u8 *alt_smac); |
5278 | #endif /* IB_CM_H */ |
5279 | diff --git a/include/uapi/linux/libc-compat.h b/include/uapi/linux/libc-compat.h |
5280 | index 335e8a7cad39..c140620dad92 100644 |
5281 | --- a/include/uapi/linux/libc-compat.h |
5282 | +++ b/include/uapi/linux/libc-compat.h |
5283 | @@ -85,6 +85,12 @@ |
5284 | |
5285 | #endif /* _NETINET_IN_H */ |
5286 | |
5287 | +/* Definitions for xattr.h */ |
5288 | +#if defined(_SYS_XATTR_H) |
5289 | +#define __UAPI_DEF_XATTR 0 |
5290 | +#else |
5291 | +#define __UAPI_DEF_XATTR 1 |
5292 | +#endif |
5293 | |
5294 | /* If we did not see any headers from any supported C libraries, |
5295 | * or we are being included in the kernel, then define everything |
5296 | @@ -98,6 +104,9 @@ |
5297 | #define __UAPI_DEF_IPV6_MREQ 1 |
5298 | #define __UAPI_DEF_IPPROTO_V6 1 |
5299 | |
5300 | +/* Definitions for xattr.h */ |
5301 | +#define __UAPI_DEF_XATTR 1 |
5302 | + |
5303 | #endif /* __GLIBC__ */ |
5304 | |
5305 | #endif /* _UAPI_LIBC_COMPAT_H */ |
5306 | diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h |
5307 | index 6ae7bbe988cc..fe94bb90582e 100644 |
5308 | --- a/include/uapi/linux/videodev2.h |
5309 | +++ b/include/uapi/linux/videodev2.h |
5310 | @@ -1059,14 +1059,14 @@ struct v4l2_bt_timings { |
5311 | |
5312 | /* A few useful defines to calculate the total blanking and frame sizes */ |
5313 | #define V4L2_DV_BT_BLANKING_WIDTH(bt) \ |
5314 | - (bt->hfrontporch + bt->hsync + bt->hbackporch) |
5315 | + ((bt)->hfrontporch + (bt)->hsync + (bt)->hbackporch) |
5316 | #define V4L2_DV_BT_FRAME_WIDTH(bt) \ |
5317 | - (bt->width + V4L2_DV_BT_BLANKING_WIDTH(bt)) |
5318 | + ((bt)->width + V4L2_DV_BT_BLANKING_WIDTH(bt)) |
5319 | #define V4L2_DV_BT_BLANKING_HEIGHT(bt) \ |
5320 | - (bt->vfrontporch + bt->vsync + bt->vbackporch + \ |
5321 | - bt->il_vfrontporch + bt->il_vsync + bt->il_vbackporch) |
5322 | + ((bt)->vfrontporch + (bt)->vsync + (bt)->vbackporch + \ |
5323 | + (bt)->il_vfrontporch + (bt)->il_vsync + (bt)->il_vbackporch) |
5324 | #define V4L2_DV_BT_FRAME_HEIGHT(bt) \ |
5325 | - (bt->height + V4L2_DV_BT_BLANKING_HEIGHT(bt)) |
5326 | + ((bt)->height + V4L2_DV_BT_BLANKING_HEIGHT(bt)) |
5327 | |
5328 | /** struct v4l2_dv_timings - DV timings |
5329 | * @type: the type of the timings |
5330 | diff --git a/include/uapi/linux/xattr.h b/include/uapi/linux/xattr.h |
5331 | index 40bbc04b6f81..c38355c1f3c9 100644 |
5332 | --- a/include/uapi/linux/xattr.h |
5333 | +++ b/include/uapi/linux/xattr.h |
5334 | @@ -7,11 +7,18 @@ |
5335 | Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. |
5336 | Copyright (c) 2004 Red Hat, Inc., James Morris <jmorris@redhat.com> |
5337 | */ |
5338 | + |
5339 | +#include <linux/libc-compat.h> |
5340 | + |
5341 | #ifndef _UAPI_LINUX_XATTR_H |
5342 | #define _UAPI_LINUX_XATTR_H |
5343 | |
5344 | +#ifdef __UAPI_DEF_XATTR |
5345 | +#define __USE_KERNEL_XATTR_DEFS |
5346 | + |
5347 | #define XATTR_CREATE 0x1 /* set value, fail if attr already exists */ |
5348 | #define XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */ |
5349 | +#endif |
5350 | |
5351 | /* Namespaces */ |
5352 | #define XATTR_OS2_PREFIX "os2." |
5353 | diff --git a/kernel/sysctl.c b/kernel/sysctl.c |
5354 | index 49e13e1f8fe6..aae21e842918 100644 |
5355 | --- a/kernel/sysctl.c |
5356 | +++ b/kernel/sysctl.c |
5357 | @@ -144,6 +144,11 @@ static int min_percpu_pagelist_fract = 8; |
5358 | static int ngroups_max = NGROUPS_MAX; |
5359 | static const int cap_last_cap = CAP_LAST_CAP; |
5360 | |
5361 | +/*this is needed for proc_doulongvec_minmax of sysctl_hung_task_timeout_secs */ |
5362 | +#ifdef CONFIG_DETECT_HUNG_TASK |
5363 | +static unsigned long hung_task_timeout_max = (LONG_MAX/HZ); |
5364 | +#endif |
5365 | + |
5366 | #ifdef CONFIG_INOTIFY_USER |
5367 | #include <linux/inotify.h> |
5368 | #endif |
5369 | @@ -995,6 +1000,7 @@ static struct ctl_table kern_table[] = { |
5370 | .maxlen = sizeof(unsigned long), |
5371 | .mode = 0644, |
5372 | .proc_handler = proc_dohung_task_timeout_secs, |
5373 | + .extra2 = &hung_task_timeout_max, |
5374 | }, |
5375 | { |
5376 | .procname = "hung_task_warnings", |
5377 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c |
5378 | index c01cb9fedb18..2de3c845f03a 100644 |
5379 | --- a/mm/hugetlb.c |
5380 | +++ b/mm/hugetlb.c |
5381 | @@ -1509,6 +1509,7 @@ static unsigned long set_max_huge_pages(struct hstate *h, unsigned long count, |
5382 | while (min_count < persistent_huge_pages(h)) { |
5383 | if (!free_pool_huge_page(h, nodes_allowed, 0)) |
5384 | break; |
5385 | + cond_resched_lock(&hugetlb_lock); |
5386 | } |
5387 | while (count < persistent_huge_pages(h)) { |
5388 | if (!adjust_pool_surplus(h, nodes_allowed, 1)) |
5389 | diff --git a/mm/internal.h b/mm/internal.h |
5390 | index 29e1e761f9eb..3e910000fda4 100644 |
5391 | --- a/mm/internal.h |
5392 | +++ b/mm/internal.h |
5393 | @@ -370,5 +370,6 @@ unsigned long reclaim_clean_pages_from_list(struct zone *zone, |
5394 | #define ALLOC_HIGH 0x20 /* __GFP_HIGH set */ |
5395 | #define ALLOC_CPUSET 0x40 /* check for correct cpuset */ |
5396 | #define ALLOC_CMA 0x80 /* allow allocations from CMA areas */ |
5397 | +#define ALLOC_FAIR 0x100 /* fair zone allocation */ |
5398 | |
5399 | #endif /* __MM_INTERNAL_H */ |
5400 | diff --git a/mm/mlock.c b/mm/mlock.c |
5401 | index 4e1a68162285..b1eb53634005 100644 |
5402 | --- a/mm/mlock.c |
5403 | +++ b/mm/mlock.c |
5404 | @@ -79,6 +79,7 @@ void clear_page_mlock(struct page *page) |
5405 | */ |
5406 | void mlock_vma_page(struct page *page) |
5407 | { |
5408 | + /* Serialize with page migration */ |
5409 | BUG_ON(!PageLocked(page)); |
5410 | |
5411 | if (!TestSetPageMlocked(page)) { |
5412 | @@ -174,6 +175,7 @@ unsigned int munlock_vma_page(struct page *page) |
5413 | unsigned int nr_pages; |
5414 | struct zone *zone = page_zone(page); |
5415 | |
5416 | + /* For try_to_munlock() and to serialize with page migration */ |
5417 | BUG_ON(!PageLocked(page)); |
5418 | |
5419 | /* |
5420 | diff --git a/mm/page_alloc.c b/mm/page_alloc.c |
5421 | index 3bac76ae4b30..7387a671234e 100644 |
5422 | --- a/mm/page_alloc.c |
5423 | +++ b/mm/page_alloc.c |
5424 | @@ -1238,15 +1238,6 @@ void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp) |
5425 | } |
5426 | local_irq_restore(flags); |
5427 | } |
5428 | -static bool gfp_thisnode_allocation(gfp_t gfp_mask) |
5429 | -{ |
5430 | - return (gfp_mask & GFP_THISNODE) == GFP_THISNODE; |
5431 | -} |
5432 | -#else |
5433 | -static bool gfp_thisnode_allocation(gfp_t gfp_mask) |
5434 | -{ |
5435 | - return false; |
5436 | -} |
5437 | #endif |
5438 | |
5439 | /* |
5440 | @@ -1583,12 +1574,7 @@ again: |
5441 | get_pageblock_migratetype(page)); |
5442 | } |
5443 | |
5444 | - /* |
5445 | - * NOTE: GFP_THISNODE allocations do not partake in the kswapd |
5446 | - * aging protocol, so they can't be fair. |
5447 | - */ |
5448 | - if (!gfp_thisnode_allocation(gfp_flags)) |
5449 | - __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); |
5450 | + __mod_zone_page_state(zone, NR_ALLOC_BATCH, -(1 << order)); |
5451 | |
5452 | __count_zone_vm_events(PGALLOC, zone, 1 << order); |
5453 | zone_statistics(preferred_zone, zone, gfp_flags); |
5454 | @@ -1954,23 +1940,12 @@ zonelist_scan: |
5455 | * zone size to ensure fair page aging. The zone a |
5456 | * page was allocated in should have no effect on the |
5457 | * time the page has in memory before being reclaimed. |
5458 | - * |
5459 | - * Try to stay in local zones in the fastpath. If |
5460 | - * that fails, the slowpath is entered, which will do |
5461 | - * another pass starting with the local zones, but |
5462 | - * ultimately fall back to remote zones that do not |
5463 | - * partake in the fairness round-robin cycle of this |
5464 | - * zonelist. |
5465 | - * |
5466 | - * NOTE: GFP_THISNODE allocations do not partake in |
5467 | - * the kswapd aging protocol, so they can't be fair. |
5468 | */ |
5469 | - if ((alloc_flags & ALLOC_WMARK_LOW) && |
5470 | - !gfp_thisnode_allocation(gfp_mask)) { |
5471 | - if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) |
5472 | - continue; |
5473 | + if (alloc_flags & ALLOC_FAIR) { |
5474 | if (!zone_local(preferred_zone, zone)) |
5475 | continue; |
5476 | + if (zone_page_state(zone, NR_ALLOC_BATCH) <= 0) |
5477 | + continue; |
5478 | } |
5479 | /* |
5480 | * When allocating a page cache page for writing, we |
5481 | @@ -2408,32 +2383,40 @@ __alloc_pages_high_priority(gfp_t gfp_mask, unsigned int order, |
5482 | return page; |
5483 | } |
5484 | |
5485 | -static void prepare_slowpath(gfp_t gfp_mask, unsigned int order, |
5486 | - struct zonelist *zonelist, |
5487 | - enum zone_type high_zoneidx, |
5488 | - struct zone *preferred_zone) |
5489 | +static void reset_alloc_batches(struct zonelist *zonelist, |
5490 | + enum zone_type high_zoneidx, |
5491 | + struct zone *preferred_zone) |
5492 | { |
5493 | struct zoneref *z; |
5494 | struct zone *zone; |
5495 | |
5496 | for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) { |
5497 | - if (!(gfp_mask & __GFP_NO_KSWAPD)) |
5498 | - wakeup_kswapd(zone, order, zone_idx(preferred_zone)); |
5499 | /* |
5500 | * Only reset the batches of zones that were actually |
5501 | - * considered in the fast path, we don't want to |
5502 | - * thrash fairness information for zones that are not |
5503 | + * considered in the fairness pass, we don't want to |
5504 | + * trash fairness information for zones that are not |
5505 | * actually part of this zonelist's round-robin cycle. |
5506 | */ |
5507 | if (!zone_local(preferred_zone, zone)) |
5508 | continue; |
5509 | mod_zone_page_state(zone, NR_ALLOC_BATCH, |
5510 | - high_wmark_pages(zone) - |
5511 | - low_wmark_pages(zone) - |
5512 | - zone_page_state(zone, NR_ALLOC_BATCH)); |
5513 | + high_wmark_pages(zone) - low_wmark_pages(zone) - |
5514 | + atomic_long_read(&zone->vm_stat[NR_ALLOC_BATCH])); |
5515 | } |
5516 | } |
5517 | |
5518 | +static void wake_all_kswapds(unsigned int order, |
5519 | + struct zonelist *zonelist, |
5520 | + enum zone_type high_zoneidx, |
5521 | + struct zone *preferred_zone) |
5522 | +{ |
5523 | + struct zoneref *z; |
5524 | + struct zone *zone; |
5525 | + |
5526 | + for_each_zone_zonelist(zone, z, zonelist, high_zoneidx) |
5527 | + wakeup_kswapd(zone, order, zone_idx(preferred_zone)); |
5528 | +} |
5529 | + |
5530 | static inline int |
5531 | gfp_to_alloc_flags(gfp_t gfp_mask) |
5532 | { |
5533 | @@ -2522,12 +2505,13 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order, |
5534 | * allowed per node queues are empty and that nodes are |
5535 | * over allocated. |
5536 | */ |
5537 | - if (gfp_thisnode_allocation(gfp_mask)) |
5538 | + if (IS_ENABLED(CONFIG_NUMA) && |
5539 | + (gfp_mask & GFP_THISNODE) == GFP_THISNODE) |
5540 | goto nopage; |
5541 | |
5542 | restart: |
5543 | - prepare_slowpath(gfp_mask, order, zonelist, |
5544 | - high_zoneidx, preferred_zone); |
5545 | + if (!(gfp_mask & __GFP_NO_KSWAPD)) |
5546 | + wake_all_kswapds(order, zonelist, high_zoneidx, preferred_zone); |
5547 | |
5548 | /* |
5549 | * OK, we're below the kswapd watermark and have kicked background |
5550 | @@ -2711,7 +2695,7 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, |
5551 | struct page *page = NULL; |
5552 | int migratetype = allocflags_to_migratetype(gfp_mask); |
5553 | unsigned int cpuset_mems_cookie; |
5554 | - int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET; |
5555 | + int alloc_flags = ALLOC_WMARK_LOW|ALLOC_CPUSET|ALLOC_FAIR; |
5556 | struct mem_cgroup *memcg = NULL; |
5557 | |
5558 | gfp_mask &= gfp_allowed_mask; |
5559 | @@ -2752,12 +2736,29 @@ retry_cpuset: |
5560 | if (allocflags_to_migratetype(gfp_mask) == MIGRATE_MOVABLE) |
5561 | alloc_flags |= ALLOC_CMA; |
5562 | #endif |
5563 | +retry: |
5564 | /* First allocation attempt */ |
5565 | page = get_page_from_freelist(gfp_mask|__GFP_HARDWALL, nodemask, order, |
5566 | zonelist, high_zoneidx, alloc_flags, |
5567 | preferred_zone, migratetype); |
5568 | if (unlikely(!page)) { |
5569 | /* |
5570 | + * The first pass makes sure allocations are spread |
5571 | + * fairly within the local node. However, the local |
5572 | + * node might have free pages left after the fairness |
5573 | + * batches are exhausted, and remote zones haven't |
5574 | + * even been considered yet. Try once more without |
5575 | + * fairness, and include remote zones now, before |
5576 | + * entering the slowpath and waking kswapd: prefer |
5577 | + * spilling to a remote zone over swapping locally. |
5578 | + */ |
5579 | + if (alloc_flags & ALLOC_FAIR) { |
5580 | + reset_alloc_batches(zonelist, high_zoneidx, |
5581 | + preferred_zone); |
5582 | + alloc_flags &= ~ALLOC_FAIR; |
5583 | + goto retry; |
5584 | + } |
5585 | + /* |
5586 | * Runtime PM, block IO and its error handling path |
5587 | * can deadlock because I/O on the device might not |
5588 | * complete. |
5589 | diff --git a/mm/rmap.c b/mm/rmap.c |
5590 | index 8fc049f9a5a6..d3cbac508c2f 100644 |
5591 | --- a/mm/rmap.c |
5592 | +++ b/mm/rmap.c |
5593 | @@ -1322,9 +1322,19 @@ static int try_to_unmap_cluster(unsigned long cursor, unsigned int *mapcount, |
5594 | BUG_ON(!page || PageAnon(page)); |
5595 | |
5596 | if (locked_vma) { |
5597 | - mlock_vma_page(page); /* no-op if already mlocked */ |
5598 | - if (page == check_page) |
5599 | + if (page == check_page) { |
5600 | + /* we know we have check_page locked */ |
5601 | + mlock_vma_page(page); |
5602 | ret = SWAP_MLOCK; |
5603 | + } else if (trylock_page(page)) { |
5604 | + /* |
5605 | + * If we can lock the page, perform mlock. |
5606 | + * Otherwise leave the page alone, it will be |
5607 | + * eventually encountered again later. |
5608 | + */ |
5609 | + mlock_vma_page(page); |
5610 | + unlock_page(page); |
5611 | + } |
5612 | continue; /* don't unmap */ |
5613 | } |
5614 | |
5615 | diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c |
5616 | index b6e59f0a9475..d06cb8752dcd 100644 |
5617 | --- a/net/sunrpc/svcsock.c |
5618 | +++ b/net/sunrpc/svcsock.c |
5619 | @@ -1397,6 +1397,22 @@ static struct svc_sock *svc_setup_socket(struct svc_serv *serv, |
5620 | return svsk; |
5621 | } |
5622 | |
5623 | +bool svc_alien_sock(struct net *net, int fd) |
5624 | +{ |
5625 | + int err; |
5626 | + struct socket *sock = sockfd_lookup(fd, &err); |
5627 | + bool ret = false; |
5628 | + |
5629 | + if (!sock) |
5630 | + goto out; |
5631 | + if (sock_net(sock->sk) != net) |
5632 | + ret = true; |
5633 | + sockfd_put(sock); |
5634 | +out: |
5635 | + return ret; |
5636 | +} |
5637 | +EXPORT_SYMBOL_GPL(svc_alien_sock); |
5638 | + |
5639 | /** |
5640 | * svc_addsock - add a listener socket to an RPC service |
5641 | * @serv: pointer to RPC service to which to add a new listener |
5642 | diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c |
5643 | index 8d0a84436674..41106813a9aa 100644 |
5644 | --- a/sound/pci/hda/patch_realtek.c |
5645 | +++ b/sound/pci/hda/patch_realtek.c |
5646 | @@ -993,6 +993,7 @@ static int alc_codec_rename_from_preset(struct hda_codec *codec) |
5647 | |
5648 | static const struct snd_pci_quirk beep_white_list[] = { |
5649 | SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1), |
5650 | + SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1), |
5651 | SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1), |
5652 | SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1), |
5653 | SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1), |
5654 | @@ -2786,6 +2787,89 @@ static void alc269_shutup(struct hda_codec *codec) |
5655 | snd_hda_shutup_pins(codec); |
5656 | } |
5657 | |
5658 | +static void alc283_restore_default_value(struct hda_codec *codec) |
5659 | +{ |
5660 | + int val; |
5661 | + |
5662 | + /* Power Down Control */ |
5663 | + alc_write_coef_idx(codec, 0x03, 0x0002); |
5664 | + /* FIFO and filter clock */ |
5665 | + alc_write_coef_idx(codec, 0x05, 0x0700); |
5666 | + /* DMIC control */ |
5667 | + alc_write_coef_idx(codec, 0x07, 0x0200); |
5668 | + /* Analog clock */ |
5669 | + val = alc_read_coef_idx(codec, 0x06); |
5670 | + alc_write_coef_idx(codec, 0x06, (val & ~0x00f0) | 0x0); |
5671 | + /* JD */ |
5672 | + val = alc_read_coef_idx(codec, 0x08); |
5673 | + alc_write_coef_idx(codec, 0x08, (val & ~0xfffc) | 0x0c2c); |
5674 | + /* JD offset1 */ |
5675 | + alc_write_coef_idx(codec, 0x0a, 0xcccc); |
5676 | + /* JD offset2 */ |
5677 | + alc_write_coef_idx(codec, 0x0b, 0xcccc); |
5678 | + /* LDO1/2/3, DAC/ADC */ |
5679 | + alc_write_coef_idx(codec, 0x0e, 0x6fc0); |
5680 | + /* JD */ |
5681 | + val = alc_read_coef_idx(codec, 0x0f); |
5682 | + alc_write_coef_idx(codec, 0x0f, (val & ~0xf800) | 0x1000); |
5683 | + /* Capless */ |
5684 | + val = alc_read_coef_idx(codec, 0x10); |
5685 | + alc_write_coef_idx(codec, 0x10, (val & ~0xfc00) | 0x0c00); |
5686 | + /* Class D test 4 */ |
5687 | + alc_write_coef_idx(codec, 0x3a, 0x0); |
5688 | + /* IO power down directly */ |
5689 | + val = alc_read_coef_idx(codec, 0x0c); |
5690 | + alc_write_coef_idx(codec, 0x0c, (val & ~0xfe00) | 0x0); |
5691 | + /* ANC */ |
5692 | + alc_write_coef_idx(codec, 0x22, 0xa0c0); |
5693 | + /* AGC MUX */ |
5694 | + val = alc_read_coefex_idx(codec, 0x53, 0x01); |
5695 | + alc_write_coefex_idx(codec, 0x53, 0x01, (val & ~0x000f) | 0x0008); |
5696 | + /* DAC simple content protection */ |
5697 | + val = alc_read_coef_idx(codec, 0x1d); |
5698 | + alc_write_coef_idx(codec, 0x1d, (val & ~0x00e0) | 0x0); |
5699 | + /* ADC simple content protection */ |
5700 | + val = alc_read_coef_idx(codec, 0x1f); |
5701 | + alc_write_coef_idx(codec, 0x1f, (val & ~0x00e0) | 0x0); |
5702 | + /* DAC ADC Zero Detection */ |
5703 | + alc_write_coef_idx(codec, 0x21, 0x8804); |
5704 | + /* PLL */ |
5705 | + alc_write_coef_idx(codec, 0x2e, 0x2902); |
5706 | + /* capless control 2 */ |
5707 | + alc_write_coef_idx(codec, 0x33, 0xa080); |
5708 | + /* capless control 3 */ |
5709 | + alc_write_coef_idx(codec, 0x34, 0x3400); |
5710 | + /* capless control 4 */ |
5711 | + alc_write_coef_idx(codec, 0x35, 0x2f3e); |
5712 | + /* capless control 5 */ |
5713 | + alc_write_coef_idx(codec, 0x36, 0x0); |
5714 | + /* class D test 2 */ |
5715 | + val = alc_read_coef_idx(codec, 0x38); |
5716 | + alc_write_coef_idx(codec, 0x38, (val & ~0x0fff) | 0x0900); |
5717 | + /* class D test 3 */ |
5718 | + alc_write_coef_idx(codec, 0x39, 0x110a); |
5719 | + /* class D test 5 */ |
5720 | + val = alc_read_coef_idx(codec, 0x3b); |
5721 | + alc_write_coef_idx(codec, 0x3b, (val & ~0x00f8) | 0x00d8); |
5722 | + /* class D test 6 */ |
5723 | + alc_write_coef_idx(codec, 0x3c, 0x0014); |
5724 | + /* classD OCP */ |
5725 | + alc_write_coef_idx(codec, 0x3d, 0xc2ba); |
5726 | + /* classD pure DC test */ |
5727 | + val = alc_read_coef_idx(codec, 0x42); |
5728 | + alc_write_coef_idx(codec, 0x42, (val & ~0x0f80) | 0x0); |
5729 | + /* test mode */ |
5730 | + alc_write_coef_idx(codec, 0x49, 0x0); |
5731 | + /* Class D DC enable */ |
5732 | + val = alc_read_coef_idx(codec, 0x40); |
5733 | + alc_write_coef_idx(codec, 0x40, (val & ~0xf800) | 0x9800); |
5734 | + /* DC offset */ |
5735 | + val = alc_read_coef_idx(codec, 0x42); |
5736 | + alc_write_coef_idx(codec, 0x42, (val & ~0xf000) | 0x2000); |
5737 | + /* Class D amp control */ |
5738 | + alc_write_coef_idx(codec, 0x37, 0xfc06); |
5739 | +} |
5740 | + |
5741 | static void alc283_init(struct hda_codec *codec) |
5742 | { |
5743 | struct alc_spec *spec = codec->spec; |
5744 | @@ -2793,6 +2877,8 @@ static void alc283_init(struct hda_codec *codec) |
5745 | bool hp_pin_sense; |
5746 | int val; |
5747 | |
5748 | + alc283_restore_default_value(codec); |
5749 | + |
5750 | if (!hp_pin) |
5751 | return; |
5752 | hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); |
5753 | @@ -3126,8 +3212,9 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled) |
5754 | |
5755 | if (spec->mute_led_polarity) |
5756 | enabled = !enabled; |
5757 | - pinval = AC_PINCTL_IN_EN | |
5758 | - (enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80); |
5759 | + pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid); |
5760 | + pinval &= ~AC_PINCTL_VREFEN; |
5761 | + pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80; |
5762 | if (spec->mute_led_nid) |
5763 | snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval); |
5764 | } |
5765 | @@ -4319,6 +4406,9 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
5766 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), |
5767 | SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
5768 | SND_PCI_QUIRK(0x1028, 0x0629, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
5769 | + SND_PCI_QUIRK(0x1028, 0x062c, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
5770 | + SND_PCI_QUIRK(0x1028, 0x062e, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
5771 | + SND_PCI_QUIRK(0x1028, 0x0632, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
5772 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), |
5773 | SND_PCI_QUIRK(0x1028, 0x063e, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
5774 | SND_PCI_QUIRK(0x1028, 0x063f, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE), |
5775 | @@ -4618,6 +4708,7 @@ static int patch_alc269(struct hda_codec *codec) |
5776 | spec->codec_variant = ALC269_TYPE_ALC285; |
5777 | break; |
5778 | case 0x10ec0286: |
5779 | + case 0x10ec0288: |
5780 | spec->codec_variant = ALC269_TYPE_ALC286; |
5781 | break; |
5782 | case 0x10ec0255: |
5783 | @@ -5184,6 +5275,8 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { |
5784 | SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
5785 | SND_PCI_QUIRK(0x1028, 0x0628, "Dell", ALC668_FIXUP_AUTO_MUTE), |
5786 | SND_PCI_QUIRK(0x1028, 0x064e, "Dell", ALC668_FIXUP_AUTO_MUTE), |
5787 | + SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
5788 | + SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
5789 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), |
5790 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A_CHMAP), |
5791 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_CHMAP), |
5792 | @@ -5424,6 +5517,7 @@ static const struct hda_codec_preset snd_hda_preset_realtek[] = { |
5793 | { .id = 0x10ec0284, .name = "ALC284", .patch = patch_alc269 }, |
5794 | { .id = 0x10ec0285, .name = "ALC285", .patch = patch_alc269 }, |
5795 | { .id = 0x10ec0286, .name = "ALC286", .patch = patch_alc269 }, |
5796 | + { .id = 0x10ec0288, .name = "ALC288", .patch = patch_alc269 }, |
5797 | { .id = 0x10ec0290, .name = "ALC290", .patch = patch_alc269 }, |
5798 | { .id = 0x10ec0292, .name = "ALC292", .patch = patch_alc269 }, |
5799 | { .id = 0x10ec0293, .name = "ALC293", .patch = patch_alc269 }, |
5800 | diff --git a/sound/pci/ice1712/ice1712.c b/sound/pci/ice1712/ice1712.c |
5801 | index 28ec872e54c0..b6e278fe8f67 100644 |
5802 | --- a/sound/pci/ice1712/ice1712.c |
5803 | +++ b/sound/pci/ice1712/ice1712.c |
5804 | @@ -685,9 +685,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pointer(struct snd_pcm_substream * |
5805 | if (!(snd_ice1712_read(ice, ICE1712_IREG_PBK_CTRL) & 1)) |
5806 | return 0; |
5807 | ptr = runtime->buffer_size - inw(ice->ddma_port + 4); |
5808 | + ptr = bytes_to_frames(substream->runtime, ptr); |
5809 | if (ptr == runtime->buffer_size) |
5810 | ptr = 0; |
5811 | - return bytes_to_frames(substream->runtime, ptr); |
5812 | + return ptr; |
5813 | } |
5814 | |
5815 | static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substream *substream) |
5816 | @@ -704,9 +705,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_ds_pointer(struct snd_pcm_substrea |
5817 | addr = ICE1712_DSC_ADDR0; |
5818 | ptr = snd_ice1712_ds_read(ice, substream->number * 2, addr) - |
5819 | ice->playback_con_virt_addr[substream->number]; |
5820 | + ptr = bytes_to_frames(substream->runtime, ptr); |
5821 | if (ptr == substream->runtime->buffer_size) |
5822 | ptr = 0; |
5823 | - return bytes_to_frames(substream->runtime, ptr); |
5824 | + return ptr; |
5825 | } |
5826 | |
5827 | static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *substream) |
5828 | @@ -717,9 +719,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pointer(struct snd_pcm_substream *s |
5829 | if (!(snd_ice1712_read(ice, ICE1712_IREG_CAP_CTRL) & 1)) |
5830 | return 0; |
5831 | ptr = inl(ICEREG(ice, CONCAP_ADDR)) - ice->capture_con_virt_addr; |
5832 | + ptr = bytes_to_frames(substream->runtime, ptr); |
5833 | if (ptr == substream->runtime->buffer_size) |
5834 | ptr = 0; |
5835 | - return bytes_to_frames(substream->runtime, ptr); |
5836 | + return ptr; |
5837 | } |
5838 | |
5839 | static const struct snd_pcm_hardware snd_ice1712_playback = { |
5840 | @@ -1113,9 +1116,10 @@ static snd_pcm_uframes_t snd_ice1712_playback_pro_pointer(struct snd_pcm_substre |
5841 | if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_PLAYBACK_START)) |
5842 | return 0; |
5843 | ptr = ice->playback_pro_size - (inw(ICEMT(ice, PLAYBACK_SIZE)) << 2); |
5844 | + ptr = bytes_to_frames(substream->runtime, ptr); |
5845 | if (ptr == substream->runtime->buffer_size) |
5846 | ptr = 0; |
5847 | - return bytes_to_frames(substream->runtime, ptr); |
5848 | + return ptr; |
5849 | } |
5850 | |
5851 | static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substream *substream) |
5852 | @@ -1126,9 +1130,10 @@ static snd_pcm_uframes_t snd_ice1712_capture_pro_pointer(struct snd_pcm_substrea |
5853 | if (!(inl(ICEMT(ice, PLAYBACK_CONTROL)) & ICE1712_CAPTURE_START_SHADOW)) |
5854 | return 0; |
5855 | ptr = ice->capture_pro_size - (inw(ICEMT(ice, CAPTURE_SIZE)) << 2); |
5856 | + ptr = bytes_to_frames(substream->runtime, ptr); |
5857 | if (ptr == substream->runtime->buffer_size) |
5858 | ptr = 0; |
5859 | - return bytes_to_frames(substream->runtime, ptr); |
5860 | + return ptr; |
5861 | } |
5862 | |
5863 | static const struct snd_pcm_hardware snd_ice1712_playback_pro = { |
5864 | diff --git a/sound/soc/codecs/cs42l51.c b/sound/soc/codecs/cs42l51.c |
5865 | index 6e9ea8379a91..7a272fa90b39 100644 |
5866 | --- a/sound/soc/codecs/cs42l51.c |
5867 | +++ b/sound/soc/codecs/cs42l51.c |
5868 | @@ -124,9 +124,8 @@ static int cs42l51_set_chan_mix(struct snd_kcontrol *kcontrol, |
5869 | |
5870 | static const DECLARE_TLV_DB_SCALE(adc_pcm_tlv, -5150, 50, 0); |
5871 | static const DECLARE_TLV_DB_SCALE(tone_tlv, -1050, 150, 0); |
5872 | -/* This is a lie. after -102 db, it stays at -102 */ |
5873 | -/* maybe a range would be better */ |
5874 | -static const DECLARE_TLV_DB_SCALE(aout_tlv, -11550, 50, 0); |
5875 | + |
5876 | +static const DECLARE_TLV_DB_SCALE(aout_tlv, -10200, 50, 0); |
5877 | |
5878 | static const DECLARE_TLV_DB_SCALE(boost_tlv, 1600, 1600, 0); |
5879 | static const char *chan_mix[] = { |
5880 | @@ -141,7 +140,7 @@ static const struct soc_enum cs42l51_chan_mix = |
5881 | static const struct snd_kcontrol_new cs42l51_snd_controls[] = { |
5882 | SOC_DOUBLE_R_SX_TLV("PCM Playback Volume", |
5883 | CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, |
5884 | - 6, 0x19, 0x7F, adc_pcm_tlv), |
5885 | + 0, 0x19, 0x7F, adc_pcm_tlv), |
5886 | SOC_DOUBLE_R("PCM Playback Switch", |
5887 | CS42L51_PCMA_VOL, CS42L51_PCMB_VOL, 7, 1, 1), |
5888 | SOC_DOUBLE_R_SX_TLV("Analog Playback Volume", |
5889 | @@ -149,7 +148,7 @@ static const struct snd_kcontrol_new cs42l51_snd_controls[] = { |
5890 | 0, 0x34, 0xE4, aout_tlv), |
5891 | SOC_DOUBLE_R_SX_TLV("ADC Mixer Volume", |
5892 | CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, |
5893 | - 6, 0x19, 0x7F, adc_pcm_tlv), |
5894 | + 0, 0x19, 0x7F, adc_pcm_tlv), |
5895 | SOC_DOUBLE_R("ADC Mixer Switch", |
5896 | CS42L51_ADCA_VOL, CS42L51_ADCB_VOL, 7, 1, 1), |
5897 | SOC_SINGLE("Playback Deemphasis Switch", CS42L51_DAC_CTL, 3, 1, 0), |
5898 | diff --git a/sound/soc/codecs/cs42l52.c b/sound/soc/codecs/cs42l52.c |
5899 | index 0bac6d5a4ac8..1102ced9b20e 100644 |
5900 | --- a/sound/soc/codecs/cs42l52.c |
5901 | +++ b/sound/soc/codecs/cs42l52.c |
5902 | @@ -347,7 +347,7 @@ static const char * const right_swap_text[] = { |
5903 | static const unsigned int swap_values[] = { 0, 1, 3 }; |
5904 | |
5905 | static const struct soc_enum adca_swap_enum = |
5906 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 2, 1, |
5907 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 2, 3, |
5908 | ARRAY_SIZE(left_swap_text), |
5909 | left_swap_text, |
5910 | swap_values); |
5911 | @@ -356,7 +356,7 @@ static const struct snd_kcontrol_new adca_mixer = |
5912 | SOC_DAPM_ENUM("Route", adca_swap_enum); |
5913 | |
5914 | static const struct soc_enum pcma_swap_enum = |
5915 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 6, 1, |
5916 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 6, 3, |
5917 | ARRAY_SIZE(left_swap_text), |
5918 | left_swap_text, |
5919 | swap_values); |
5920 | @@ -365,7 +365,7 @@ static const struct snd_kcontrol_new pcma_mixer = |
5921 | SOC_DAPM_ENUM("Route", pcma_swap_enum); |
5922 | |
5923 | static const struct soc_enum adcb_swap_enum = |
5924 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 0, 1, |
5925 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 0, 3, |
5926 | ARRAY_SIZE(right_swap_text), |
5927 | right_swap_text, |
5928 | swap_values); |
5929 | @@ -374,7 +374,7 @@ static const struct snd_kcontrol_new adcb_mixer = |
5930 | SOC_DAPM_ENUM("Route", adcb_swap_enum); |
5931 | |
5932 | static const struct soc_enum pcmb_swap_enum = |
5933 | - SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 4, 1, |
5934 | + SOC_VALUE_ENUM_SINGLE(CS42L52_ADC_PCM_MIXER, 4, 3, |
5935 | ARRAY_SIZE(right_swap_text), |
5936 | right_swap_text, |
5937 | swap_values); |
5938 | diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c |
5939 | index 549d5d6a3fef..7b95f7cbc515 100644 |
5940 | --- a/sound/soc/codecs/cs42l73.c |
5941 | +++ b/sound/soc/codecs/cs42l73.c |
5942 | @@ -319,7 +319,7 @@ static const char * const cs42l73_mono_mix_texts[] = { |
5943 | static const unsigned int cs42l73_mono_mix_values[] = { 0, 1, 2 }; |
5944 | |
5945 | static const struct soc_enum spk_asp_enum = |
5946 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 6, 1, |
5947 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 6, 3, |
5948 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
5949 | cs42l73_mono_mix_texts, |
5950 | cs42l73_mono_mix_values); |
5951 | @@ -337,7 +337,7 @@ static const struct snd_kcontrol_new spk_xsp_mixer = |
5952 | SOC_DAPM_ENUM("Route", spk_xsp_enum); |
5953 | |
5954 | static const struct soc_enum esl_asp_enum = |
5955 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 2, 5, |
5956 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 2, 3, |
5957 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
5958 | cs42l73_mono_mix_texts, |
5959 | cs42l73_mono_mix_values); |
5960 | @@ -346,7 +346,7 @@ static const struct snd_kcontrol_new esl_asp_mixer = |
5961 | SOC_DAPM_ENUM("Route", esl_asp_enum); |
5962 | |
5963 | static const struct soc_enum esl_xsp_enum = |
5964 | - SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 0, 7, |
5965 | + SOC_VALUE_ENUM_SINGLE(CS42L73_MMIXCTL, 0, 3, |
5966 | ARRAY_SIZE(cs42l73_mono_mix_texts), |
5967 | cs42l73_mono_mix_texts, |
5968 | cs42l73_mono_mix_values); |
5969 | diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c |
5970 | index 28522bd03b8e..47e1ce771e65 100644 |
5971 | --- a/sound/soc/soc-pcm.c |
5972 | +++ b/sound/soc/soc-pcm.c |
5973 | @@ -1989,7 +1989,6 @@ int soc_dpcm_runtime_update(struct snd_soc_card *card) |
5974 | |
5975 | paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_PLAYBACK, &list); |
5976 | if (paths < 0) { |
5977 | - dpcm_path_put(&list); |
5978 | dev_warn(fe->dev, "ASoC: %s no valid %s path\n", |
5979 | fe->dai_link->name, "playback"); |
5980 | mutex_unlock(&card->mutex); |
5981 | @@ -2019,7 +2018,6 @@ capture: |
5982 | |
5983 | paths = dpcm_path_get(fe, SNDRV_PCM_STREAM_CAPTURE, &list); |
5984 | if (paths < 0) { |
5985 | - dpcm_path_put(&list); |
5986 | dev_warn(fe->dev, "ASoC: %s no valid %s path\n", |
5987 | fe->dai_link->name, "capture"); |
5988 | mutex_unlock(&card->mutex); |
5989 | @@ -2084,7 +2082,6 @@ static int dpcm_fe_dai_open(struct snd_pcm_substream *fe_substream) |
5990 | fe->dpcm[stream].runtime = fe_substream->runtime; |
5991 | |
5992 | if (dpcm_path_get(fe, stream, &list) <= 0) { |
5993 | - dpcm_path_put(&list); |
5994 | dev_dbg(fe->dev, "ASoC: %s no valid %s route\n", |
5995 | fe->dai_link->name, stream ? "capture" : "playback"); |
5996 | } |